#include "GUI_main.h" #include "GUI_common.h" #include "CORE_general.h" #include "CORE_fileio.h" #include "gfx/all_gfx.h" /* Possible actions */ #define PLAY 2 #define CONFIG 3 #define CREDITS 4 #define SAVE 5 /******** PRIVATE ********/ static void priv_load_sprites(u8 screen); static void priv_del_sprites(u8 screen); static u8 priv_touched(u8 app_state); static u8 priv_selected(u8 app_state); static void priv_save_warning(u8 screen); static void priv_save_ok(u8 screen); static void priv_save_swap(u8 screen); /*************************/ /* The main menu process function */ void gui_main(void){ static main_state_t localstate = MAIN_INIT; switch(localstate){ case MAIN_INIT: PA_EasyBgLoad(DSCR, 3, BG_blank); priv_load_sprites(DSCR); localstate = MAIN_FADEIN; break; case MAIN_FADEIN: if(fadein(DSCR)) return; localstate = MAIN_SELECT; commons_move_in(); break; case MAIN_SELECT: if(priv_selected(PLAY)){ Env.next_state = APP_CONNECT; localstate = MAIN_MOVEOUT; } else if(priv_selected(CONFIG)){ Env.next_state = APP_CONFIG; localstate = MAIN_MOVEOUT; } else if(priv_selected(CREDITS)){ Env.next_state = APP_CREDITS; //TODO real credits localstate = MAIN_MOVEOUT; } else if(priv_selected(SAVE)){ if(Env.fat_enabled && Env.has_changed){ Env.has_changed = 0; config_write(); priv_save_swap(DSCR); } } break; case MAIN_MOVEOUT: commons_move_out(); localstate = MAIN_FADEOUT; case MAIN_FADEOUT: if(fadeout(DSCR)) return; localstate = MAIN_CLEAR; break; case MAIN_CLEAR: priv_del_sprites(DSCR); PA_DeleteBg(DSCR, 3); localstate = MAIN_INIT; Env.current_state = Env.next_state; break; } return; } /*------------------------------- Private -------------------------------*/ static void priv_save_ok(u8 screen){ PA_LoadSpritePal(screen, 7, (void*)spr_save_ok_Pal); PA_CreateSprite(screen, (10*SAVE)+1, (void*)SPR_save_ok_0_Sprite, OBJ_SIZE_64X64, 1, 7, 140, 116); PA_CreateSprite(screen, (10*SAVE)+2, (void*)SPR_save_ok_1_Sprite, OBJ_SIZE_32X64, 1, 7, 204, 116); } static void priv_save_warning(u8 screen){ PA_LoadSpritePal(screen, 7, (void*)spr_save_warning_Pal); PA_CreateSprite(screen, (10*SAVE)+1, (void*)SPR_save_warning_0_Sprite, OBJ_SIZE_64X64, 1, 7, 140, 116); PA_CreateSprite(screen, (10*SAVE)+2, (void*)SPR_save_warning_1_Sprite, OBJ_SIZE_32X64, 1, 7, 204, 116); } static void priv_save_swap(u8 screen){ PA_DeleteSprite(screen, (10*SAVE)+1); PA_DeleteSprite(screen, (10*SAVE)+2); priv_save_ok(screen); } /* Private sprite loading */ static void priv_load_sprites(u8 screen){ title_init(TITLE_MAIN); /* PLAY */ PA_LoadSpritePal(screen, 4, (void*)spr_play_Pal); PA_CreateSprite(screen, (10*PLAY)+1, (void*)SPR_play_0_Sprite, OBJ_SIZE_64X64, 1, 4, 20, 40); PA_CreateSprite(screen, (10*PLAY)+2, (void*)SPR_play_1_Sprite, OBJ_SIZE_32X64, 1, 4, 84, 40); /* CONFIG */ PA_LoadSpritePal(screen, 5, (void*)spr_config_Pal); PA_CreateSprite(screen, (10*CONFIG)+1, (void*)SPR_config_0_Sprite, OBJ_SIZE_64X64, 1, 5, 140, 40); PA_CreateSprite(screen, (10*CONFIG)+2, (void*)SPR_config_1_Sprite, OBJ_SIZE_32X64, 1, 5, 204, 40); /* CREDITS */ PA_LoadSpritePal(screen, 6, (void*)spr_credits_Pal); PA_CreateSprite(screen, (10*CREDITS)+1, (void*)SPR_credits_0_Sprite, OBJ_SIZE_64X64, 1, 6, 20, 116); PA_CreateSprite(screen, (10*CREDITS)+2, (void*)SPR_credits_1_Sprite, OBJ_SIZE_32X64, 1, 6, 84, 116); /* SAVE */ if(Env.fat_enabled){ if(!Env.has_changed){ // no need to save priv_save_ok(screen); } else{ priv_save_warning(screen); } } else{ PA_LoadSpritePal(screen, 7, (void*)spr_save_ro_Pal); PA_CreateSprite(screen, (10*SAVE)+1, (void*)SPR_save_ro_0_Sprite, OBJ_SIZE_64X64, 1, 7, 140, 116); PA_CreateSprite(screen, (10*SAVE)+2, (void*)SPR_save_ro_1_Sprite, OBJ_SIZE_32X64, 1, 7, 204, 116); } return; } /* Private sprite deletting */ static void priv_del_sprites(u8 screen){ title_delete(); PA_DeleteSprite(screen, (10*PLAY)+1); PA_DeleteSprite(screen, (10*PLAY)+2); PA_DeleteSprite(screen, (10*CONFIG)+1); PA_DeleteSprite(screen, (10*CONFIG)+2); PA_DeleteSprite(screen, (10*CREDITS)+1); PA_DeleteSprite(screen, (10*CREDITS)+2); PA_DeleteSprite(screen, (10*SAVE)+1); PA_DeleteSprite(screen, (10*SAVE)+2); return; } /* Private sprite touch Return 1 touched 0 not touched */ static u8 priv_touched(u8 icon){ u8 i = 0; switch(icon){ case PLAY: for(i=(10*PLAY)+1; i<(10*PLAY)+3; i++){ if(PA_SpriteTouched(i) && Stylus.Newpress) return 1; } break; case CONFIG: for(i=(10*CONFIG)+1; i<(10*CONFIG)+3; i++){ if(PA_SpriteTouched(i) && Stylus.Newpress) return 1; } break; case CREDITS: for(i=(10*CREDITS)+1; i<(10*CREDITS)+3; i++){ if(PA_SpriteTouched(i) && Stylus.Newpress) return 1; } break; case SAVE: for(i=(10*SAVE)+1; i<(10*SAVE)+3; i++){ if(PA_SpriteTouched(i) && Stylus.Newpress) return 1; } break; } return 0; } /* Is the item selected? Return 1 selected 0 not selected */ static u8 priv_selected(u8 app_state){ /* TODO (if asked for): Add keypad selection (not only stylus) */ return priv_touched(app_state); }