#include "mainmenu.h"
 
#include "brender/brender.h"
 
#include "controls.h"
 
#include "flicplay.h"
 
#include "globvars.h"
 
#include "globvrpb.h"
 
#include "grafdata.h"
 
#include "graphics.h"
 
#include "harness/config.h"
 
#include "harness/trace.h"
 
#include "intrface.h"
 
#include "loading.h"
 
#include "loadsave.h"
 
#include "network.h"
 
#include "newgame.h"
 
#include "options.h"
 
#include "pd/sys.h"
 
#include "sound.h"
 
#include "structur.h"
 
#include "utility.h"
 
#include <stdlib.h>
 
 
 
char* gPalette_copy__mainmenu;    // suffix added to avoid duplicate symbol
 
int gPixel_buffer_size__mainmenu; // suffix added to avoid duplicate symbol
 
tInterface_spec* gMain_menu_spec;
 
int gMouse_was_started__mainmenu; // suffix added to avoid duplicate symbol
 
int gReplace_background;
 
char* gPixels_copy__mainmenu; // suffix added to avoid duplicate symbol
 
 
 
// IDA: int __usercall MainMenuDone1@<EAX>(int pCurrent_choice@<EAX>, int pCurrent_mode@<EDX>, int pGo_ahead@<EBX>, int pEscaped@<ECX>, int pTimed_out)
 
int MainMenuDone1(int pCurrent_choice, int pCurrent_mode, int pGo_ahead, int pEscaped, int pTimed_out) {
 
    LOG_TRACE("(%d, %d, %d, %d, %d)", pCurrent_choice, pCurrent_mode, pGo_ahead, pEscaped, pTimed_out);
 
 
 
    if (harness_game_info.mode == eGame_carmageddon_demo || harness_game_info.mode == eGame_splatpack_demo || harness_game_info.mode == eGame_splatpack_xmas_demo) {
 
        if (pCurrent_mode == 0) {
 
            if (pCurrent_choice == 7) {
 
                PreloadBunchOfFlics(7);
 
            }
 
        } else {
 
            return -1;
 
        }
 
        return pCurrent_choice;
 
    }
 
 
 
    if (pTimed_out) {
 
        return -1;
 
    }
 
    switch (pCurrent_choice) {
 
    case 1:
 
        PreloadBunchOfFlics(4);
 
        break;
 
    case 2:
 
        PreloadBunchOfFlics(5);
 
        break;
 
    case 3:
 
        PreloadBunchOfFlics(1);
 
        break;
 
    case 4:
 
        PreloadBunchOfFlics(3);
 
        break;
 
    case 5:
 
        PreloadBunchOfFlics(2);
 
        break;
 
    case 7:
 
        PreloadBunchOfFlics(7);
 
        break;
 
    default:
 
        return pCurrent_choice;
 
    }
 
    return pCurrent_choice;
 
}
 
 
 
// IDA: int __usercall MainMenuDone2@<EAX>(int pCurrent_choice@<EAX>, int pCurrent_mode@<EDX>, int pGo_ahead@<EBX>, int pEscaped@<ECX>, int pTimed_out)
 
int MainMenuDone2(int pCurrent_choice, int pCurrent_mode, int pGo_ahead, int pEscaped, int pTimed_out) {
 
    LOG_TRACE("(%d, %d, %d, %d, %d)", pCurrent_choice, pCurrent_mode, pGo_ahead, pEscaped, pTimed_out);
 
 
 
    if (harness_game_info.mode == eGame_carmageddon_demo || harness_game_info.mode == eGame_splatpack_demo || harness_game_info.mode == eGame_splatpack_xmas_demo) {
 
        if (pCurrent_mode == 0) {
 
            if (pCurrent_choice == 4) {
 
                PreloadBunchOfFlics(7);
 
            }
 
        } else {
 
            return -1;
 
        }
 
        return pCurrent_choice;
 
    }
 
 
 
    if (pTimed_out) {
 
        return -1;
 
    }
 
    switch (pCurrent_choice) {
 
    case 0:
 
        PreloadBunchOfFlics(4);
 
        break;
 
    case 1:
 
        PreloadBunchOfFlics(5);
 
        break;
 
    case 2:
 
        PreloadBunchOfFlics(1);
 
        break;
 
    case 3:
 
        PreloadBunchOfFlics(3);
 
        break;
 
    case 4:
 
        PreloadBunchOfFlics(7);
 
        break;
 
    }
 
    return pCurrent_choice;
 
}
 
 
 
// IDA: void __cdecl StartMainMenu()
 
void StartMainMenu(void) {
 
    LOG_TRACE("()");
 
 
 
    if (gFaded_palette) {
 
        PlayFlicsInDarkness();
 
        RunFlic(10);
 
    } else {
 
        RunFlic(11);
 
    }
 
    DontLetFlicFuckWithPalettes();
 
    TurnFlicTransparencyOn();
 
    if (!gProgram_state.racing) {
 
        DisableChoice(1);
 
        RunFlicAt(
 
            35,
 
            gMain_menu_spec->flicker_on_flics[1].x[gGraf_data_index],
 
            gMain_menu_spec->flicker_on_flics[1].y[gGraf_data_index]);
 
    }
 
    if (gDisallow_abandon_race) {
 
        DisableChoice(2);
 
        RunFlicAt(
 
            36,
 
            gMain_menu_spec->flicker_on_flics[2].x[gGraf_data_index],
 
            gMain_menu_spec->flicker_on_flics[2].y[gGraf_data_index]);
 
    }
 
    TurnFlicTransparencyOff();
 
    LetFlicFuckWithPalettes();
 
    ReilluminateFlics();
 
}
 
 
 
// IDA: int __usercall DoMainMenuInterface@<EAX>(tU32 pTime_out@<EAX>, int pContinue_allowed@<EDX>)
 
int DoMainMenuInterface(tU32 pTime_out, int pContinue_allowed) {
 
    static tFlicette flicker_on1[8] = {
 
        { 14, { 64, 128 }, { 37, 89 } },
 
        { 25, { 59, 118 }, { 54, 130 } },
 
        { 27, { 55, 110 }, { 71, 170 } },
 
        { 29, { 52, 104 }, { 88, 211 } },
 
        { 23, { 53, 106 }, { 105, 252 } },
 
        { 21, { 54, 108 }, { 122, 293 } },
 
        { 17, { 58, 116 }, { 139, 334 } },
 
        { 19, { 64, 128 }, { 155, 372 } }
 
    };
 
    static tFlicette flicker_off1[8] = {
 
        { 13, { 64, 128 }, { 37, 89 } },
 
        { 24, { 59, 118 }, { 54, 130 } },
 
        { 26, { 55, 110 }, { 71, 170 } },
 
        { 28, { 52, 104 }, { 88, 211 } },
 
        { 22, { 53, 106 }, { 105, 252 } },
 
        { 20, { 54, 108 }, { 122, 293 } },
 
        { 16, { 58, 116 }, { 139, 334 } },
 
        { 18, { 64, 128 }, { 155, 372 } }
 
    };
 
 
 
    static tFlicette push1[8] = {
 
        { 15, { 63, 126 }, { 36, 86 } },
 
        { 15, { 58, 116 }, { 53, 127 } },
 
        { 15, { 54, 108 }, { 70, 168 } },
 
        { 15, { 51, 102 }, { 87, 209 } },
 
        { 15, { 52, 104 }, { 104, 250 } },
 
        { 15, { 53, 106 }, { 121, 290 } },
 
        { 15, { 57, 114 }, { 138, 331 } },
 
        { 15, { 63, 126 }, { 154, 370 } }
 
    };
 
 
 
    static tMouse_area mouse_areas1[8] = {
 
        { { 64, 128 }, { 37, 89 }, { 265, 530 }, { 47, 113 }, 0, 0, 0, NULL },
 
        { { 59, 118 }, { 54, 130 }, { 265, 530 }, { 64, 154 }, 1, 0, 0, NULL },
 
        { { 55, 110 }, { 71, 170 }, { 265, 530 }, { 81, 194 }, 2, 0, 0, NULL },
 
        { { 52, 104 }, { 88, 211 }, { 265, 530 }, { 98, 235 }, 3, 0, 0, NULL },
 
        { { 53, 106 }, { 105, 252 }, { 265, 530 }, { 115, 276 }, 4, 0, 0, NULL },
 
        { { 54, 108 }, { 122, 293 }, { 265, 530 }, { 132, 317 }, 5, 0, 0, NULL },
 
        { { 58, 116 }, { 139, 334 }, { 265, 530 }, { 149, 358 }, 6, 0, 0, NULL },
 
        { { 64, 128 }, { 155, 372 }, { 265, 530 }, { 165, 396 }, 7, 0, 0, NULL }
 
    };
 
    static tInterface_spec interface_spec1 = {
 
        0,                      // initial_imode
 
        0,                      // first_opening_flic
 
        0,                      // second_opening_flic
 
        0,                      // end_flic_go_ahead
 
        0,                      // end_flic_escaped
 
        0,                      // end_flic_otherwise
 
        0,                      // flic_bunch_to_load
 
        { -1, 0 },              // move_left_new_mode
 
        { 0, 0 },               // move_left_delta
 
        { 0, 0 },               // move_left_min
 
        { 0, 0 },               // move_left_max
 
        { NULL, NULL },         // move_left_proc
 
        { -1, 0 },              // move_right_new_mode
 
        { 0, 0 },               // move_right_delta
 
        { 0, 0 },               // move_right_min
 
        { 0, 0 },               // move_right_max
 
        { NULL, NULL },         // move_right_proc
 
        { -1, 0 },              // move_up_new_mode
 
        { -1, 0 },              // move_up_delta
 
        { 0, 0 },               // move_up_min
 
        { 7, 0 },               // move_up_max
 
        { NULL, NULL },         // move_up_proc
 
        { -1, 0 },              // move_down_new_mode
 
        { 1, 0 },               // move_down_delta
 
        { 0, 0 },               // move_down_min
 
        { 7, 0 },               // move_down_max
 
        { NULL, NULL },         // move_down_proc
 
        { 1, 1 },               // go_ahead_allowed
 
        { NULL, NULL },         // go_ahead_proc
 
        { 1, 1 },               // escape_allowed
 
        { NULL, NULL },         // escape_proc
 
        NULL,                   // exit_proc
 
        NULL,                   // draw_proc
 
        0u,                     // time_out
 
        StartMainMenu,          // start_proc1
 
        NULL,                   // start_proc2
 
        MainMenuDone1,          // done_proc
 
        0,                      // font_needed
 
        { 0, 0 },               // typeable
 
        NULL,                   // get_original_string
 
        0,                      // escape_code
 
        0,                      // dont_save_or_load
 
        COUNT_OF(flicker_on1),  // number_of_button_flics
 
        flicker_on1,            // flicker_on_flics
 
        flicker_off1,           // flicker_off_flics
 
        push1,                  // pushed_flics
 
        COUNT_OF(mouse_areas1), // number_of_mouse_areas
 
        mouse_areas1,           // mouse_areas
 
        0,                      // number_of_recopy_areas
 
        NULL                    // recopy_areas
 
    };
 
 
 
    static tFlicette flicker_on2[5] = {
 
        { 335, { 58, 116 }, { 51, 122 } },
 
        { 337, { 53, 106 }, { 74, 178 } },
 
        { 339, { 51, 102 }, { 96, 230 } },
 
        { 333, { 52, 104 }, { 119, 286 } },
 
        { 331, { 58, 116 }, { 142, 341 } }
 
    };
 
    static tFlicette flicker_off2[5] = {
 
        { 334, { 58, 116 }, { 51, 122 } },
 
        { 336, { 53, 106 }, { 74, 178 } },
 
        { 338, { 51, 102 }, { 96, 230 } },
 
        { 332, { 52, 104 }, { 119, 286 } },
 
        { 330, { 58, 116 }, { 142, 341 } }
 
    };
 
    static tFlicette push2[5] = {
 
        { 15, { 56, 112 }, { 50, 120 } },
 
        { 15, { 51, 102 }, { 73, 175 } },
 
        { 15, { 50, 100 }, { 95, 228 } },
 
        { 15, { 51, 102 }, { 118, 283 } },
 
        { 15, { 57, 114 }, { 141, 338 } }
 
    };
 
    static tMouse_area mouse_areas2[5] = {
 
        { { 57, 114 }, { 51, 122 }, { 265, 530 }, { 61, 146 }, 0, 0, 0, NULL },
 
        { { 52, 104 }, { 74, 178 }, { 265, 530 }, { 84, 202 }, 1, 0, 0, NULL },
 
        { { 51, 102 }, { 96, 230 }, { 265, 530 }, { 106, 254 }, 2, 0, 0, NULL },
 
        { { 52, 104 }, { 119, 286 }, { 265, 530 }, { 129, 310 }, 3, 0, 0, NULL },
 
        { { 58, 116 }, { 142, 341 }, { 265, 530 }, { 152, 365 }, 4, 0, 0, NULL }
 
    };
 
    static tInterface_spec interface_spec2 = {
 
        0,                      // initial_imode
 
        31,                     // first_opening_flic
 
        30,                     // second_opening_flic
 
        0,                      // end_flic_go_ahead
 
        0,                      // end_flic_escaped
 
        0,                      // end_flic_otherwise
 
        0,                      // flic_bunch_to_load
 
        { -1, 0 },              // move_left_new_mode
 
        { 0, 0 },               // move_left_delta
 
        { 0, 0 },               // move_left_min
 
        { 0, 0 },               // move_left_max
 
        { NULL, NULL },         // move_left_proc
 
        { -1, 0 },              // move_right_new_mode
 
        { 0, 0 },               // move_right_delta
 
        { 0, 0 },               // move_right_min
 
        { 0, 0 },               // move_right_max
 
        { NULL, NULL },         // move_right_proc
 
        { -1, 0 },              // move_up_new_mode
 
        { -1, 0 },              // move_up_delta
 
        { 0, 0 },               // move_up_min
 
        { 4, 0 },               // move_up_max
 
        { NULL, NULL },         // move_up_proc
 
        { -1, 0 },              // move_down_new_mode
 
        { 1, 0 },               // move_down_delta
 
        { 0, 0 },               // move_down_min
 
        { 4, 0 },               // move_down_max
 
        { NULL, NULL },         // move_down_proc
 
        { 1, 1 },               // go_ahead_allowed
 
        { NULL, NULL },         // go_ahead_proc
 
        { 1, 1 },               // escape_allowed
 
        { NULL, NULL },         // escape_proc
 
        NULL,                   // exit_proc
 
        NULL,                   // draw_proc
 
        0u,                     // time_out
 
        NULL,                   // start_proc1
 
        NULL,                   // start_proc2
 
        &MainMenuDone2,         // done_proc
 
        0,                      // font_needed
 
        { 0, 0 },               // typeable
 
        NULL,                   // get_original_string
 
        4,                      // escape_code
 
        0,                      // dont_save_or_load
 
        COUNT_OF(flicker_on2),  // number_of_button_flics
 
        flicker_on2,            // flicker_on_flics
 
        flicker_off2,           // flicker_off_flics
 
        push2,                  // pushed_flics
 
        COUNT_OF(mouse_areas2), // number_of_mouse_areas
 
        mouse_areas2,           // mouse_areas
 
        0,                      // number_of_recopy_areas
 
        NULL                    // recopy_areas
 
    };
 
 
 
    int result;
 
    LOG_TRACE("(%d, %d)", pTime_out, pContinue_allowed);
 
 
 
    if (pContinue_allowed) {
 
        gMain_menu_spec = &interface_spec1;
 
        result = DoInterfaceScreen(&interface_spec1, gFaded_palette | 2, 0);
 
        if (result == 0 || result == 1 || result == 2 || result == 7) {
 
            FadePaletteDown();
 
        } else {
 
            RunFlic(12);
 
        }
 
        switch (result) {
 
        case 0:
 
            return 0;
 
        case 1:
 
            return 8;
 
        case 2:
 
            return 9;
 
        case 3:
 
            return 6;
 
        case 4:
 
            return 3;
 
        case 5:
 
            return 2;
 
        case 6:
 
            return 1;
 
        case 7:
 
            return 7;
 
        default:
 
            break;
 
        }
 
        result = -1;
 
    } else {
 
        interface_spec2.time_out = pTime_out;
 
        result = DoInterfaceScreen(&interface_spec2, gFaded_palette, 0);
 
        if (result == -1 || result == 4) {
 
            FadePaletteDown();
 
        } else {
 
            RunFlic(32);
 
        }
 
        switch (result) {
 
        case 0:
 
            result = 4;
 
            break;
 
        case 1:
 
            result = 5;
 
            break;
 
        case 2:
 
            result = 6;
 
            break;
 
        case 3:
 
            result = 3;
 
            break;
 
        case 4:
 
            result = 7;
 
            break;
 
        default:
 
            result = -1;
 
            break;
 
        }
 
    }
 
    return result;
 
}
 
 
 
// IDA: tMM_result __usercall GetMainMenuOption@<EAX>(tU32 pTime_out@<EAX>, int pContinue_allowed@<EDX>)
 
tMM_result GetMainMenuOption(tU32 pTime_out, int pContinue_allowed) {
 
    int result;
 
 
 
    result = DoMainMenuInterface(pTime_out, pContinue_allowed);
 
    if (result < 0) {
 
        return eMM_timeout;
 
    }
 
    if (gProgram_state.prog_status == eProg_game_starting) {
 
        return eMM_continue;
 
    }
 
    switch (result) {
 
    case 1:
 
        return eMM_end_game;
 
    case 2:
 
        return eMM_save;
 
    case 3:
 
        return eMM_loaded;
 
    case 4:
 
        return eMM_1_start;
 
    case 5:
 
        return eMM_n_start;
 
    case 6:
 
        return eMM_options;
 
    case 7:
 
        return eMM_quit;
 
    case 8:
 
        return eMM_recover;
 
    case 9:
 
        return eMM_abort_race;
 
    default:
 
        return eMM_continue;
 
    }
 
}
 
 
 
// IDA: void __cdecl QuitVerifyStart()
 
void QuitVerifyStart(void) {
 
    gPixel_buffer_size__mainmenu = gBack_screen->height * gBack_screen->row_bytes;
 
    gPixels_copy__mainmenu = BrMemAllocate(gPixel_buffer_size__mainmenu, kMem_quit_vfy_pixels);
 
    gPalette_copy__mainmenu = BrMemAllocate(0x400u, kMem_quit_vfy_pal);
 
    memcpy(gPixels_copy__mainmenu
, gBack_screen
->pixels
, gPixel_buffer_size__mainmenu
);  
    memcpy(gPalette_copy__mainmenu
, gCurrent_palette_pixels
, 0x400u
);  
    FadePaletteDown();
 
}
 
 
 
// IDA: int __usercall QuitVerifyDone@<EAX>(int pCurrent_choice@<EAX>, int pCurrent_mode@<EDX>, int pGo_ahead@<EBX>, int pEscaped@<ECX>, int pTimed_out)
 
int QuitVerifyDone(int pCurrent_choice, int pCurrent_mode, int pGo_ahead, int pEscaped, int pTimed_out) {
 
    FadePaletteDown();
 
    TurnOnPanelFlics();
 
    if (gMouse_was_started__mainmenu) {
 
        RemoveTransientBitmaps(1);
 
    }
 
    if (gReplace_background) {
 
        if (pCurrent_choice) {
 
            memcpy(gBack_screen
->pixels
, gPixels_copy__mainmenu
, gPixel_buffer_size__mainmenu
);  
            memcpy(gCurrent_palette_pixels
, gPalette_copy__mainmenu
, 0x400u
);  
        } else {
 
            ClearEntireScreen();
 
        }
 
        PDScreenBufferSwap(0);
 
        FadePaletteUp();
 
    }
 
    BrMemFree(gPixels_copy__mainmenu);
 
    BrMemFree(gPalette_copy__mainmenu);
 
    return pCurrent_choice == 0;
 
}
 
 
 
// IDA: int __usercall DoVerifyQuit@<EAX>(int pReplace_background@<EAX>)
 
int DoVerifyQuit(int pReplace_background) {
 
    static tFlicette flicker_on[2] = { { 43, { 181, 362 }, { 124, 298 } }, { 43, { 84, 168 }, { 124, 298 } } };
 
    static tFlicette flicker_off[2] = { { 42, { 181, 362 }, { 124, 298 } }, { 42, { 84, 168 }, { 124, 298 } } };
 
    static tFlicette push[2] = { { 135, { 181, 362 }, { 124, 298 } }, { 45, { 84, 168 }, { 124, 298 } } };
 
    static tMouse_area mouse_areas[2] = {
 
        { { 181, 362 }, { 124, 298 }, { 244, 488 }, { 144, 346 }, 0, 0, 0, NULL },
 
        { { 84, 168 }, { 124, 298 }, { 147, 294 }, { 144, 346 }, 1, 0, 0, NULL }
 
    };
 
    static tInterface_spec interface_spec = {
 
        0,                 // initial_imode
 
        0,                 // first_opening_flic
 
        0,                 // second_opening_flic
 
        0,                 // end_flic_go_ahead
 
        0,                 // end_flic_escaped
 
        0,                 // end_flic_otherwise
 
        0,                 // flic_bunch_to_load
 
        { 0xFFFFFFFF, 0 }, // move_left_new_mode
 
        { 0xFFFFFFFF, 0 }, // move_left_delta
 
        { 0, 0 },          // move_left_min
 
        { 1, 0 },          // move_left_max
 
        { NULL, NULL },    // move_left_proc
 
        { 0xFFFFFFFF, 0 }, // move_right_new_mode
 
        { 1, 0 },          // move_right_delta
 
        { 0, 0 },          // move_right_min
 
        { 1, 0 },          // move_right_max
 
        { NULL, NULL },    // move_right_proc
 
        { 0xFFFFFFFF, 0 }, // move_up_new_mode
 
        { 0, 0 },          // move_up_delta
 
        { 0, 0 },          // move_up_min
 
        { 0, 0 },          // move_up_max
 
        { NULL, NULL },    // move_up_proc
 
        { 0xFFFFFFFF, 0 }, // move_down_new_mode
 
        { 0, 0 },          // move_down_delta
 
        { 0, 0 },          // move_down_min
 
        { 0, 0 },          // move_down_max
 
        { NULL, NULL },    // move_down_proc
 
        { 1, 1 },          // go_ahead_allowed
 
        { NULL, NULL },    // go_ahead_proc
 
        { 1, 1 },          // escape_allowed
 
        { NULL, NULL },    // escape_proc
 
        NULL,              // exit_proc
 
        NULL,              // draw_proc
 
        0u,                // time_out
 
        QuitVerifyStart,   // start_proc1
 
        NULL,              // start_proc2
 
        QuitVerifyDone,    // done_proc
 
        0,                 // font_needed
 
        { 0, 0 },          // typeable
 
        NULL,              // get_original_string
 
        1,                 // escape_code
 
        1,                 // dont_save_or_load
 
        2,                 // number_of_button_flics
 
        flicker_on,        // flicker_on_flics
 
        flicker_off,       // flicker_off_flics
 
        push,              // pushed_flics
 
        2,                 // number_of_mouse_areas
 
        mouse_areas,       // mouse_areas
 
        0,                 // number_of_recopy_areas
 
        NULL               // recopy_areas
 
    };
 
    int result;
 
    //int switched_res; // Pierre-Marie Baty -- unused variable
 
    int woz_in_race;
 
 
 
    woz_in_race = 0;
 
    if (gAusterity_mode) {
 
        return 1;
 
    }
 
    if (gProgram_state.racing) {
 
        FadePaletteDown();
 
        ClearEntireScreen();
 
        GoingToInterfaceFromRace();
 
        woz_in_race = 1;
 
        gProgram_state.racing = 0;
 
    }
 
    result = IRandomBetween(1, 3);
 
    switch (result) {
 
    case 1:
 
        interface_spec.first_opening_flic = 130;
 
        break;
 
    case 2:
 
        interface_spec.first_opening_flic = 131;
 
        break;
 
    case 3:
 
        interface_spec.first_opening_flic = 132;
 
        break;
 
    }
 
    gMouse_was_started__mainmenu = gMouse_started;
 
    if (gMouse_started) {
 
        RemoveTransientBitmaps(1);
 
        EndMouseCursor();
 
    }
 
    TurnOffPanelFlics();
 
    gReplace_background = pReplace_background;
 
 
 
    DRS3StopOutletSound(gEffects_outlet);
 
    LoadInterfaceStuff(woz_in_race);
 
    result = DoInterfaceScreen(&interface_spec, 0, 0);
 
    if (gMouse_was_started__mainmenu) {
 
        LoadInterfaceStuff(woz_in_race);
 
        StartMouseCursor();
 
    }
 
    if (woz_in_race) {
 
        GoingBackToRaceFromInterface();
 
        gProgram_state.racing = 1;
 
    }
 
    return result;
 
}
 
 
 
// IDA: tMM_result __usercall DoMainMenu@<EAX>(tU32 pTime_out@<EAX>, int pSave_allowed@<EDX>, int pContinue_allowed@<EBX>)
 
tMM_result DoMainMenu(tU32 pTime_out, int pSave_allowed, int pContinue_allowed) {
 
    tMM_result the_result;
 
    LOG_TRACE("(%d, %d, %d)", pTime_out, pSave_allowed, pContinue_allowed);
 
 
 
    if (gProgram_state.racing) {
 
        FadePaletteDown();
 
    }
 
    the_result = GetMainMenuOption(pTime_out, pContinue_allowed);
 
    switch (the_result) {
 
    case eMM_end_game:
 
        if (gNet_mode) {
 
            gProgram_state.prog_status = eProg_idling;
 
        }
 
        break;
 
    case eMM_1_start:
 
        if (pContinue_allowed || gAusterity_mode) {
 
            PlayFlicsFromMemory();
 
        }
 
        if (!DoOnePlayerStart()) {
 
            the_result = eMM_none;
 
        }
 
        if (pContinue_allowed || gAusterity_mode) {
 
            PlayFlicsFromDisk();
 
        }
 
        break;
 
    case eMM_n_start:
 
        if (!DoMultiPlayerStart()) {
 
            LoadRaces(gRace_list, &gNumber_of_races, -1);
 
            the_result = eMM_none;
 
        }
 
        break;
 
    case eMM_loaded:
 
        if (!DoLoadGame()) {
 
            the_result = eMM_none;
 
        }
 
        break;
 
    case eMM_save:
 
        DoSaveGame(pSave_allowed);
 
        the_result = eMM_none;
 
        break;
 
    case eMM_options:
 
        LoadSoundOptionsData();
 
        DoOptions();
 
        FreeSoundOptionsData();
 
        break;
 
    case eMM_quit:
 
        if (!DoVerifyQuit(0)) {
 
            the_result = eMM_none;
 
        }
 
        break;
 
    case eMM_recover:
 
        SetRecovery();
 
        break;
 
    case eMM_abort_race:
 
        gAbandon_game = 1;
 
        break;
 
    default:
 
        return the_result;
 
    }
 
    return the_result;
 
}
 
 
 
// IDA: void __usercall DoMainMenuScreen(tU32 pTime_out@<EAX>, int pSave_allowed@<EDX>, int pContinue_allowed@<EBX>)
 
void DoMainMenuScreen(tU32 pTime_out, int pSave_allowed, int pContinue_allowed) {
 
    tPlayer_status old_status;
 
    LOG_TRACE("(%d, %d, %d)", pTime_out, pSave_allowed, pContinue_allowed);
 
 
 
    if (pContinue_allowed || gAusterity_mode) {
 
        PlayFlicsFromDisk();
 
    }
 
    old_status = gNet_players[gThis_net_player_index].player_status;
 
    NetPlayerStatusChanged(ePlayer_status_main_menu);
 
    PreloadBunchOfFlics(0);
 
    switch (DoMainMenu(pTime_out, pSave_allowed, pContinue_allowed)) {
 
    case eMM_end_game:
 
        gProgram_state.prog_status = eProg_idling;
 
        break;
 
    case eMM_1_start:
 
    case eMM_n_start:
 
        gProgram_state.prog_status = eProg_game_starting;
 
        break;
 
    case eMM_loaded:
 
        if (gGame_to_load < 0) {
 
            gProgram_state.prog_status = eProg_game_starting;
 
        }
 
        break;
 
    case eMM_quit:
 
        gProgram_state.prog_status = eProg_quit;
 
        break;
 
    case eMM_timeout:
 
        gProgram_state.prog_status = eProg_demo;
 
        break;
 
    default:
 
        break;
 
    }
 
    UnlockBunchOfFlics(0);
 
    if (gNet_players[gThis_net_player_index].player_status == ePlayer_status_main_menu) {
 
        NetPlayerStatusChanged(old_status);
 
    }
 
    if (pContinue_allowed || gAusterity_mode) {
 
        PlayFlicsFromMemory();
 
    }
 
}