kettek2/wiki/games/newsboy/Newsboy_0x00/engine/State_Menu.c

182 lines
5.6 KiB
C

/*
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
MenuState - Main Menu State
````````````````````````````````
This state controls and draws the main menu.
Transitions:
TravelState
QuitState (?)
*/
#include <stdlib.h>
#include <SDL2/SDL_ttf.h>
#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));
}
}