/*       
_________________________________________________________________________________________________________
|                                                                                                       |
| LiveSplit Auto Splitter script for Golden Axe (SEGA Mega Drive/Genesis Version).                      |
| Supported Emulators:                                                                                  |
|   - Kega Fusion v3.64                                                                                 |
|                                                                                                       |
| Made by l1ndblum                                                                                      |                                 
|   Note: Finding variables to split with that align with the timing rules were diffucult.              |
|    Therefore, each category will not have the timer start at 0                                        |
|    This is so that your end time should be the same time given by frame counting                      |
|    Beginner: Starts at -1.329                                                                         |
|    Arcade: Starts at -6.268                                                                           |              
|    Duel: Starts at 2.752                                                                              | 
|_______________________________________________________________________________________________________|

*/


// Define memory addresses
state("Fusion")
{
    int gameState : 0x174CD4;           // General game state
    int arcadeSplit : 0x1A1460;         // Arcade split logic
    int gameState2 : 0x174C44;          // Additional split logic for Duel mode
    int reset : 0x174BD8;               // Reset condition at Sega screen
    int live : 0x174C24;                // Live game status: 2048 when live, 0 when not
    int extraSplit : 0x174E88;          // Extra split condition for Arcade mode
    int extraIndicator : 0x174B78;      // Extra split indicator for Arcade mode
    int lvl6extraIndicator : 0x174BD8;  // Level 6 indicator for Beginner mode
    int gameOver : 0x398AE8;            // Game Over: 320 when live, 288 when game ends
    int flag : 0x174ECC;                // Flag indicator
    int gameState3: 0x174ea0;           // needed for duel
   
}

startup
{
    // Define the mode selection options in the LiveSplit settings
    settings.Add("ModeSelection.", false, "==Choose one option below or it defaults to Arcade==");
    settings.Add("arcadeMode", true, "Arcade Mode");
    settings.SetToolTip("arcadeMode", "Main version of the game with 8 stages.");

    settings.Add("duelMode", false, "Duel Mode");
    settings.SetToolTip("duelMode", "12 rounds of enemies to clear.");

    settings.Add("beginnerMode", false, "Beginner Mode");
    settings.SetToolTip("beginnerMode", "Contains three stages.");
}

init
{
    vars.DebugMessage = (Action<string>)((message) =>
    {
        print("[Debug] " + message);
    });

    // Default mode
    vars.selectedMode = "Arcade";

    // Check which mode is selected
    if (settings["arcadeMode"])
    {
        vars.selectedMode = "Arcade";
    }
    else if (settings["duelMode"])
    {
        vars.selectedMode = "Duel";
    }
    else if (settings["beginnerMode"])
    {
        vars.selectedMode = "Beginner";
    }

    vars.DebugMessage("Init: Selected Mode - " + vars.selectedMode);

    // Initial variable setup
    vars.timerStarted = false;
    vars.inGame = false;
    vars.finalTimeRecorded = false;
    vars.splitState = 1;
    vars.extraSplitTriggered = false;
    vars.gameState2Triggered = false;
    vars.currentStage = 1;
    vars.selectedMode = "Arcade";
    vars.inBattle = false;
    vars.gameState = 0;
    vars.arcadeSplit = 0;
}

update
{
}

start
{
    if (settings["arcadeMode"])
    {
        vars.selectedMode = "Arcade";
    }
    else if (settings["duelMode"])
    {
        vars.selectedMode = "Duel";
    }
    else if (settings["beginnerMode"])
    {
        vars.selectedMode = "Beginner";
    }
    else
    {
        vars.selectedMode = "Arcade";
    }
    // Start timer based on selected mode
    if (!vars.timerStarted)
    {
        if (vars.selectedMode == "Arcade" && current.arcadeSplit == 40 && current.gameState == 176)
        {
            vars.timerStarted = true;
            vars.DebugMessage("Starting Arcade Mode.");
            return true;
        }
        else if (vars.selectedMode == "Duel" && current.gameState == 112)
        {
            vars.timerStarted = true;
            vars.DebugMessage("Starting Duel Mode.");
            return true;
        }
        else if (vars.selectedMode == "Beginner" && current.arcadeSplit == 40 && current.gameState == 176)
        {
            vars.timerStarted = true;
            vars.DebugMessage("Starting Beginner Mode.");
            return true;
        }
    }
    return false;
}

split
{
    // Only split if the timer has started
    if (vars.timerStarted)
    {
        int currentTime = (int)(DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond);

        // Arcade Mode Logic
        if (vars.selectedMode == "Arcade")
        {
            if (vars.currentStage == 1 && current.gameState == 96 && current.extraIndicator == 280)  // Thief Round 1
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 2 && current.gameState == 80)  // Round 2
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 3 && current.gameState == 96 && current.extraIndicator == 280)  // Thief Round 2
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 4 && current.gameState == 80)  // Round 3
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 5 && current.gameState == 96 && current.extraIndicator == 280)  // Thief Round 3
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 6 && current.gameState == 64)  // Round 4
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 7 && current.gameState == 96 && current.extraIndicator == 280)  // Thief Round 4
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 8 && current.gameState == 112 && current.arcadeSplit == 40 && current.extraIndicator == 240)  // Round 5
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 9 && current.gameState == 184 && current.arcadeSplit == 40 && current.extraIndicator == 168)  // Round 6
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 10 && current.gameState == 264 && current.extraIndicator == 160 && current.arcadeSplit == 40)  // Round 7 260 40 160
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 11 && current.gameState == 80 && current.extraIndicator == 216)  // Round 8
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 12 && current.gameState == 264)  // RunFinish
            {
                vars.DebugMessage("Split: Arcade run finished.");
                return true;
            }
        }

 
        // Duel Mode Logic
        else if (vars.selectedMode == "Duel")
        {
            vars.DebugMessage("Duel Mode Logic");
            if (current.gameState2 == 328 && !vars.inBattle)
            {
                vars.inBattle = true;
                vars.inLoadingScreen = false;
                return false;
            }
            else if (current.gameState2 == 0 && vars.inBattle && !vars.inLoadingScreen)
            {
                vars.inBattle = false;
                vars.inLoadingScreen = true;
                return true;
            }
            else if (current.gameState3 == 64 && !vars.finalTimeRecorded)
            {
                vars.DebugMessage("End of Duel Run.");
                vars.finalTimeRecorded = true;
                return true;
            }
        }

        // Beginner Mode Logic
        else if (vars.selectedMode == "Beginner")
        {
            if (current.lvl6extraIndicator == 144 && current.gameState == 80 && current.flag == 104 && vars.currentStage == 1)
            {
                vars.currentStage++;
                return true;
            }
            else if (current.lvl6extraIndicator == 232 && current.gameState == 80 && current.flag == 232 && vars.currentStage == 2)
            {
                vars.currentStage++;
                return true;
            }
            else if (vars.currentStage == 3 && current.gameOver == 288)
            {
                vars.DebugMessage("Split: Beginner run finished.");
                return true;
            }
        }
    }
    return false;
}

reset
{
    if (current.reset == 1016 && current.live == 0)
    {
        vars.DebugMessage("Game Reset Detected at Sega screen.");
        vars.timerStarted = false;
        vars.inGame = false;
        vars.finalRunTime = 0;
        vars.finalTimeRecorded = false;
        vars.splitState = 1;
        vars.extraSplitTriggered = false;
        vars.gameState2Triggered = false;
        vars.currentStage = 1;
        return true;
    }
    return false;
}