// GPC Online Library
// ffx-fortune-spheres.gpc
// =============================================================================
//
// SYSTEM: Playstation 3
// CONTROLLER: DualShock 3
// GAME: Final Fantasy X HD
// TASK: Collect Fortune Spheres
//
// DESCRIPTION:
//
// * Harvesting Fortune Spheres is a time-consuming pain in the ass. The Earth
// Eater - an Original Species in the Monster Arena - will drop 1 or 2 Fortune
// Spheres upon defeat (or, rarely, Dark Matters). This script automates the
// menu and combat process so that Fortune Spheres can easily be accrued.
//
// ASSUMPTIONS:
//
// * Before starting the combo, the player must travel to the Calm Lands Monster
// Arena and position Tidus so that he is adjacent to and facing the Keeper.
//
// * The player must manually speak to the Keeper and set the cursor to
// "Fight monsters.", then start the combo.
//
// * The battle party must be sufficiently leveled & equipped to survive
// multiple consecutive fights against the Earth Eater.
//
// * Each character in the active party must reliably inflict 99,999 points of
// damage on every normal Attack strike, regardless of their current HP.
//
// * The first strike against an Earth Eater will result in a fatal
// counterattack, unless the targeted character is wearing armor with the
// Deathproof ability.
//
// * The second strike against an Earth Eater will knock it down.
//
// * All subsequent strikes against an Earth Eater will result in a Flare
// counterattack that deals roughly 2,500 points of damage.
//
// * All party members must have armor equipped with the Auto-Phoenix ability so
// that fallen members will automatically be revived.
//
// * 99 Phoenix Downs must be available in the player's item inventory.
//
// =============================================================================
// INPUTS
// -----------------------------------------------------------------------------
define START = PS3_L3;
define STOP = PS3_R3;
define CONFIRM = PS3_CROSS;
define CANCEL = PS3_CIRCLE;
define UP = PS3_UP;
define RIGHT = PS3_RIGHT;
define DOWN = PS3_DOWN;
define LEFT = PS3_LEFT;
// DURATIONS (values in milliseconds; 1 second = 1000)
define TAP = 20; // Minimum duration to register a button tap.
// CONSTANTS
define MAXCYCLES = 24; // Maximum number of battle cycles to perform.
// GLOBALS
// -----------------------------------------------------------------------------
int running = 0;
int cycles = 0;
// MAIN
// -----------------------------------------------------------------------------
main {
// When the start combo button is pressed, initialize the number of cycles
// and flag the combo to start running.
if (get_val(START)) {
cycles = 0;
running = 1;
}
// When the stop button is pressed, or when the maximum number of cycles
// has been reached, flag the combo to stop running.
if (get_val(STOP) || cycles >= MAXCYCLES) {
running = 0;
}
// Continue running the combo until flagged otherwise.
if (running == 1) {
combo_run(fightEarthEater);
cycles = cycles + 1;
}
}
// COMBOS
// -----------------------------------------------------------------------------
// Fight and defeat an Earth Eater. Defeating the Earth Eater requires 14
// strikes of 99,999 damage each.
combo fightEarthEater {
// Select fiend and enter combat.
call(pressConfirm); call(waitForAreaMenu);
call(pressUp); call(waitForCursor);
call(pressRight); call(waitForCursor);
call(pressConfirm); call(waitForFiendMenu);
call(pressConfirm); call(waitForAreYouSure);
call(pressConfirm); call(waitForBattlePrompt);
// Fight!
call(attack); call(waitForCounterPunch);
call(attack); call(waitForKnockdown);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForCounterFlare);
call(attack); call(waitForVictory);
// Item get!
call(pressConfirm); call(waitForItemResults);
call(pressConfirm); call(waitForReset);
}
// HELPER COMBOS
// -----------------------------------------------------------------------------
// When this combo is called, it is assumed the player is in combat and the
// cursor is currently targeting the "Attack" command.
combo attack {
call(pressConfirm);
call(waitForCursor);
call(pressConfirm);
}
// Time between menu cursor movements.
combo waitForCursor {
wait(500);
}
// Time between the Keeper dialog and the area menu.
combo waitForAreaMenu {
wait(4000);
wait(1000);
}
// Time between the area menu and the fiend menu.
combo waitForFiendMenu {
wait(1000);
}
// Time before fiend's confirmation dialog appears.
combo waitForAreYouSure {
wait(1000);
}
// Time between confirming fiend and Attack prompt.
combo waitForBattlePrompt {
wait(4000);
wait(4000);
wait(2000);
}
// Time between confirming fiend and Attack prompt with 2-punch ambush.
combo waitForAmbushBattlePrompt {
wait(4000);
wait(4000);
wait(4000);
wait(4000);
}
// Time for the Megaton Punch and phoenix down.
combo waitForCounterPunch {
wait(4000);
wait(4000);
wait(4000);
wait(4000);
}
// Time to knock down the Earth Eater.
combo waitForKnockdown {
wait(2000);
}
// Time for flare and, potentially, phoenix down.
combo waitForCounterFlare {
wait(4000);
wait(4000);
wait(4000);
wait(4000);
}
// The fiend's death animation, time to AP screen.
combo waitForVictory {
wait(4000);
wait(4000);
wait(4000);
wait(4000);
wait(4000);
}
// Time between AP results and item results.
combo waitForItemResults {
wait(2000);
}
// Time between item results and Keeper dialog.
combo waitForReset {
wait(3000);
}
// Press the confirm button.
combo pressConfirm {
set_val(CONFIRM, 100);
wait(TAP);
set_val(CONFIRM, 0);
}
// Press up on the directional pad.
combo pressUp {
set_val(UP, 100);
wait(TAP);
set_val(UP, 0);
}
// Press up on the directional pad.
combo pressRight {
set_val(RIGHT, 100);
wait(TAP);
set_val(RIGHT, 0);
}