Skip to content

Commit

Permalink
Main menu: Add Custom Game menu
Browse files Browse the repository at this point in the history
  • Loading branch information
1oom-fork committed Jun 10, 2024
1 parent 18e5a9b commit bdbc44a
Show file tree
Hide file tree
Showing 5 changed files with 126 additions and 11 deletions.
2 changes: 1 addition & 1 deletion src/game/game.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ static bool game_opt_save_quit = false;

static struct game_end_s game_opt_end = { GAME_END_NONE, 0, 0, 0, 0 };
static struct game_new_options_s game_opt_new = GAME_NEW_OPTS_DEFAULT;
static struct game_new_options_s game_opt_custom = GAME_NEW_OPTS_DEFAULT;
struct game_new_options_s game_opt_custom = GAME_NEW_OPTS_DEFAULT;

static int game_opt_new_value = 200;
static int game_opt_custom_race_value = 0xaaaaa0;
Expand Down
1 change: 1 addition & 0 deletions src/game/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -341,5 +341,6 @@ static inline bool IS_HUMAN(const struct game_s *g, player_id_t i)
#define IS_ALIVE(_g_, _i_) ((_g_)->evn.home[(_i_)] != PLANET_NONE)

extern bool game_opt_skip_intro_always;
extern struct game_new_options_s game_opt_custom;

#endif
109 changes: 106 additions & 3 deletions src/ui/classic/uimainmenu.c
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
#include "ui.h"
#include "comp.h"
#include "game.h"
#include "game_ai.h"
#include "game_event.h"
#include "game_misc.h"
#include "game_new.h"
#include "game_num.h"
#include "game_save.h"
#include "game_str.h"
Expand All @@ -17,6 +19,7 @@
#include "lib.h"
#include "log.h"
#include "menu.h"
#include "rnd.h"
#include "types.h"
#include "uicursor.h"
#include "uidelay.h"
Expand Down Expand Up @@ -72,13 +75,50 @@ static bool main_menu_update_sfx_volume(void) {
return true;
}

static const char* mm_get_custom_difficulty_value(int i) {
return game_str_tbl_diffic[i];
}
static const char* mm_get_custom_galaxy_size_value(int i) {
return game_str_tbl_gsize[i];
}

static const char* mm_get_custom_ai_id_value(int i) {
return game_ais[i]->name;
}

static const char* mm_get_custom_galaxy_seed_str(void) {
static char buf[64];
if (game_opt_custom.galaxy_seed == 0) {
lib_sprintf(buf, 64, "Off");
} else {
lib_sprintf(buf, 64, "%d", game_opt_custom.galaxy_seed);
}
return buf;
}

static bool mm_gen_custom_galaxy_seed(void) {
game_opt_custom.galaxy_seed = game_opt_custom.galaxy_seed ? 0 : rnd_get_new_seed();
return true;
}

const char *game_str_tbl_sm_pspecial_mm[PLANET_SPECIAL_NUM] = {
"Ultra Poor", "Poor", "Normal", "Artifacts", "Rich", "Ultra Rich", "4x Tech"
};

static const char* mm_get_custom_special_value(int i) {
return game_str_tbl_sm_pspecial_mm[i];
}

/* -------------------------------------------------------------------------- */

#define MM_PAGE_STACK_SIZE 4

typedef enum {
MAIN_MENU_PAGE_MAIN,
MAIN_MENU_PAGE_GAME,
MAIN_MENU_PAGE_GAME_CUSTOM,
MAIN_MENU_PAGE_GAME_CUSTOM_GALAXY,
MAIN_MENU_PAGE_GAME_CUSTOM_HOMEWORLDS,
MAIN_MENU_PAGE_OPTIONS,
MAIN_MENU_PAGE_OPTIONS_INPUT,
MAIN_MENU_PAGE_OPTIONS_SOUND,
Expand Down Expand Up @@ -261,6 +301,25 @@ static void mm_options_small_set_item_dimensions(struct main_menu_data_s *d, int
}
}

static void mm_custom_set_item_dimensions(struct main_menu_data_s *d, int i)
{
struct main_menu_item_s *it = &d->items[i];
uint16_t step_y;
it->font_i = 5;
main_menu_set_item_wh(d, it);
step_y = 0x40 / ((d->item_count + 1) / 2);
it->x = i%2 ? 0xe0 : 0x60;
it->y = 0x7f + step_y * (i/2);
if (i == d->item_count - 1) {
it->x = 0xe0;
it->y = 0x7f + 0x30;
}
if (i == d->item_count - 2) {
it->x = 0x60;
it->y = 0x7f + 0x30;
}
}

static void main_menu_make_main_page(struct main_menu_data_s *d)
{
d->set_item_dimensions = main_menu_set_item_dimensions;
Expand All @@ -276,7 +335,42 @@ static void main_menu_make_game_page(struct main_menu_data_s *d)
menu_make_action_conditional(menu_allocate_item(), "Continue", MAIN_MENU_ACT_CONTINUE_GAME, main_menu_have_save_continue, MOO_KEY_c);
menu_make_action_conditional(menu_allocate_item(), "Load Game", MAIN_MENU_ACT_LOAD_GAME, main_menu_have_save_any, MOO_KEY_l);
menu_make_action(menu_allocate_item(), "New Game", MAIN_MENU_ACT_NEW_GAME, MOO_KEY_n);
menu_make_action(menu_allocate_item(), "Custom Game", MAIN_MENU_ACT_CUSTOM_GAME, MOO_KEY_u);
menu_make_page(menu_allocate_item(), "Custom Game", MAIN_MENU_PAGE_GAME_CUSTOM, MOO_KEY_u);
menu_make_back(menu_allocate_item());
}

static void main_menu_make_game_custom_page(struct main_menu_data_s *d)
{
d->set_item_dimensions = mm_custom_set_item_dimensions;
menu_make_enum(menu_allocate_item(), "Difficulty", mm_get_custom_difficulty_value, (int*)&game_opt_custom.difficulty, 0, DIFFICULTY_NUM - 1, MOO_KEY_d);
menu_make_enum(menu_allocate_item(), "AI ID", mm_get_custom_ai_id_value, &game_opt_custom.ai_id, 0, GAME_AI_NUM - 1, MOO_KEY_a);
menu_make_page(menu_allocate_item(), "Galaxy", MAIN_MENU_PAGE_GAME_CUSTOM_GALAXY, MOO_KEY_g);
menu_make_page(menu_allocate_item(), "Homeworlds", MAIN_MENU_PAGE_GAME_CUSTOM_HOMEWORLDS, MOO_KEY_h);
menu_make_back(menu_allocate_item());
menu_make_action(menu_allocate_item(), "Next", MAIN_MENU_ACT_CUSTOM_GAME, MOO_KEY_n);
}

static void main_menu_make_game_custom_galaxy_page(struct main_menu_data_s *d)
{
d->set_item_dimensions = mm_options_set_item_dimensions;
menu_make_enum(menu_allocate_item(), "Size", mm_get_custom_galaxy_size_value, (int*)&game_opt_custom.galaxy_size, 0, GALAXY_SIZE_HUGE, MOO_KEY_s);
menu_make_str_func(menu_allocate_item(), "Galaxy Seed", mm_get_custom_galaxy_seed_str, mm_gen_custom_galaxy_seed, MOO_KEY_e);
menu_make_int(menu_allocate_item(), "Players", &game_opt_custom.players, 2, PLAYER_NUM, MOO_KEY_p);
menu_make_bool(menu_allocate_item(), "Improved generator", &game_opt_custom.improved_galaxy_generator, MOO_KEY_g);
menu_make_int(menu_allocate_item(), "Num dist checks", &game_opt_custom.homeworlds.num_dist_checks, 0, PLAYER_NUM, MOO_KEY_d);
menu_make_int(menu_allocate_item(), "Num OK planet checks", &game_opt_custom.homeworlds.num_ok_planet_checks, 0, PLAYER_NUM, MOO_KEY_o);
menu_make_back(menu_allocate_item());
}

static void main_menu_make_game_custom_homeworlds_page(struct main_menu_data_s *d)
{
d->set_item_dimensions = mm_options_set_item_dimensions;
menu_make_int(menu_allocate_item(), "Max population", &game_opt_custom.homeworlds.max_pop, 50, 120, MOO_KEY_p);
menu_make_enum(menu_allocate_item(), "Special", mm_get_custom_special_value, (int*)&game_opt_custom.homeworlds.special, 0, PLANET_SPECIAL_4XTECH, MOO_KEY_e);
menu_make_int(menu_allocate_item(), "Num scouts", &game_opt_custom.homeworlds.num_scouts, 0, 5, MOO_KEY_s);
menu_make_int(menu_allocate_item(), "Num fighters", &game_opt_custom.homeworlds.num_fighters, 0, 10, MOO_KEY_f);
menu_make_int(menu_allocate_item(), "Num colony ships", &game_opt_custom.homeworlds.num_colony_ships, 0, 2, MOO_KEY_c);
menu_make_bool(menu_allocate_item(), "Armed colony ships", &game_opt_custom.homeworlds.armed_colony_ships, MOO_KEY_a);
menu_make_back(menu_allocate_item());
}

Expand Down Expand Up @@ -373,6 +467,15 @@ static struct main_menu_page_s mm_pages[MAIN_MENU_PAGE_NUM] = {
{
main_menu_make_game_page,
},
{
main_menu_make_game_custom_page,
},
{
main_menu_make_game_custom_galaxy_page,
},
{
main_menu_make_game_custom_homeworlds_page,
},
{
main_menu_make_options_page,
},
Expand Down Expand Up @@ -637,11 +740,11 @@ main_menu_action_t ui_main_menu(struct game_new_options_s *newopts, struct game_
ui_draw_finish_mode = 0;
switch (ret) {
case MAIN_MENU_ACT_NEW_GAME:
flag_done = ui_new_game(newopts, false);
flag_done = ui_new_game(newopts);
ui_draw_finish_mode = 1;
break;
case MAIN_MENU_ACT_CUSTOM_GAME:
flag_done = ui_new_game(customopts, true);
flag_done = ui_custom_game(customopts);
ui_draw_finish_mode = 1;
break;
case MAIN_MENU_ACT_LOAD_GAME:
Expand Down
22 changes: 16 additions & 6 deletions src/ui/classic/uinewgame.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ static bool ui_new_game_extra(struct game_new_options_s *newopts, struct new_gam

/* -------------------------------------------------------------------------- */

bool ui_new_game(struct game_new_options_s *newopts, bool flag_custom)
bool ui_new_game(struct game_new_options_s *newopts)
{
struct new_game_data_s d;
bool flag_done = false, flag_fadein = false, flag_ok = false;
Expand Down Expand Up @@ -550,15 +550,25 @@ bool ui_new_game(struct game_new_options_s *newopts, bool flag_custom)
uiobj_unset_callback();

if (flag_ok) {
if (flag_custom) {
flag_ok = ui_new_game_extra(newopts, &d);
} else {
flag_ok = ui_new_game_racebannernames(newopts, &d);
}
flag_ok = ui_new_game_racebannernames(newopts, &d);
}

uiobj_unset_callback();
new_game_free_data(&d);

return flag_ok;
}

bool ui_custom_game(struct game_new_options_s *newopts) {
struct new_game_data_s d;
bool flag_ok = false;

d.newopts = newopts;

new_game_load_data(&d);

flag_ok = ui_new_game_extra(newopts, &d);

new_game_free_data(&d);
return flag_ok;
}
3 changes: 2 additions & 1 deletion src/ui/classic/uinewgame.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

struct game_new_options_s;
/* returns false on cancel */
extern bool ui_new_game(struct game_new_options_s *newopts, bool flag_custom);
extern bool ui_new_game(struct game_new_options_s *newopts);
extern bool ui_custom_game(struct game_new_options_s *newopts);

#endif

0 comments on commit bdbc44a

Please sign in to comment.