182 lines
5.6 KiB
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));
|
|
}
|
|
}
|