/* ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, MenuState - Main Menu State ```````````````````````````````` This state controls and draws the main menu. Transitions: TravelState QuitState (?) */ #include #include #include "State_Menu.h" #include "State_Travel.h" #include "State_Editor.h" #include "Text.h" #include "Music.h" #include "render.h" #include "string.h" #include "Player.h" #include "game_globals.h" #include "globals.h" #include "state.h" #include "check.h" int openMenuState() { report(DEBUG, "MenuState", "opened"); unfocused_color.r = 64; unfocused_color.g = 64; unfocused_color.b = 64; focused_color.r = 196; focused_color.g = 196; focused_color.b = 196; texts[MENU_TEXT] = newText(g_header_font, "Newsboy"); texts[START_TEXT] = newText(g_large_font, "init(new_game)"); //texts[CONTINUE_TEXT] = newText(g_large_font, "reinit(saved_game)"); texts[EDITOR_TEXT] = newText(g_large_font, "edit(edit_map)"); texts[OPTIONS_TEXT] = newText(g_large_font, "set(options)"); texts[QUIT_TEXT] = newText(g_large_font, "exit(desktop)"); int padding_x = 32; int padding_y = 32; int start_x = texts[MENU_TEXT]->width / 2; int start_y = texts[MENU_TEXT]->height / 2; start_x += padding_x; int music_id = loadResource(g_music, "Arrival"); playMusic(getResourceById(g_music, music_id)); focused = -1; // cleanVector(&menu_mouse); menu_mouse.x = g_v_width/2; menu_mouse.y = g_v_height/2; // load in meta_bit anim stuff meta_bit_anim = loadAnimData_res("cyb_metabit"); struct SetData *set_data = meta_bit_anim->sets[1]; // could break prog struct FaceData *face_data = set_data->faces[0]; char *full_name = malloc(1); full_name = setStringF(full_name, "%s%s/%s/%s", ANIM_DIR, meta_bit_anim->name, set_data->name, face_data->name); face_data->sheet = loadFrameSheet(face_data->name, full_name); printf("sheet: %s\n", full_name); free(full_name); // struct Phys ph; cleanPhys(&ph); ph.direction.y = 1; ph.position.x = g_v_width/2; ph.position.y = g_v_height/2; ph.mass = 2.0f; meta_bit = newMetaBit(TYPE_GENERIC, OWNER_PLAYER, &menu_mouse, ph); setMetaBitAnim(meta_bit, meta_bit_anim); texts_x[MENU_TEXT] = start_x; texts_y[MENU_TEXT] = start_y; int i; for(i = 1;i < 5;i++) { start_y += texts[i-1]->height + padding_y; start_x = texts[i]->width/2 + padding_x; texts_x[i] = start_x; texts_y[i] = start_y; } is_new_game = 1; is_end_game = 0; return 0; } int handleMenuState(SDL_Event event) { int i; switch(event.type) { case SDL_MOUSEMOTION: menu_mouse.x = event.motion.x; menu_mouse.y = event.motion.y; if (focused != -1) { if (checkBox(event.motion.x, event.motion.y, texts_x[focused]-texts[focused]->width/2, texts_y[focused]-texts[focused]->height/2, texts[focused]->width, texts[focused]->height) != 1) { setTextColor(texts[focused], unfocused_color); focused = -1; } } for(i=0;i < 5;i++) { if (checkBox(event.motion.x, event.motion.y, texts_x[i]-texts[i]->width/2, texts_y[i]-texts[i]->height/2, texts[i]->width, texts[i]->height) == 1) { setTextColor(texts[i], focused_color); focused = i; } } break; case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_LEFT) { if (focused != -1) { switch(focused) { case START_TEXT: popState(g_state_manager); action = focused; break; case EDITOR_TEXT: popState(g_state_manager); action = focused; break; case OPTIONS_TEXT: pushState(g_state_manager, newState(STATE_DEFAULT, openOptionsState, closeOptionsState, handleOptionsState, processOptionsState, renderOptionsState)); break; case QUIT_TEXT: { SDL_Event quit_event; quit_event.type = SDL_QUIT; SDL_PushEvent(&quit_event); } break; } } } break; } return 0; } int renderMenuState() { int i; for(i = 0;i < 5;i++) { renderText(texts[i], texts_x[i], texts_y[i]); } renderFrame(meta_bit->animation.sheet, meta_bit->animation.f, meta_bit->phys.position.x, meta_bit->phys.position.y); return 0; } int processMenuState() { // meta bit incAnimFrame(&meta_bit->animation); Vector vector = menu_mouse; vector.x += (-60 + (rand()%120)); vector.y += (-60 + (rand()%120)); turnToVector(&meta_bit->phys, vector, 0.3f); addForce(&meta_bit->phys, 5.0f); //handleMetaBit(meta_bit); doVelocity(&meta_bit->phys); return 0; } void closeMenuState() { int i; for(i=0;i<5;i++) { freeText(texts[i]); } // free meta_bit freeAnimData(meta_bit_anim); freeMetaBit(meta_bit); stopMusic(); report(DEBUG, "MenuState", "closed"); if (action == START_TEXT) { setDefaultPlayerData(&pl_data); // FIXME: use a different method for setting travel_map travel_map = realloc(travel_map, 5); memcpy(travel_map, "s1m1", 5); // TravelState, I think, for Map Loading! pushState(g_state_manager, newState(STATE_DEFAULT, openTravelState, closeTravelState, handleTravelState, processTravelState, renderTravelState)); } else if (action == EDITOR_TEXT) { pushState(g_state_manager, newState(STATE_DEFAULT, openEditorState, closeEditorState, handleEditorState, processEditorState, renderEditorState)); } }