1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2025-04-08 03:36:43 +00:00

geometry selection and better startup

This commit is contained in:
Zeno Rogue 2025-03-08 11:07:01 +01:00
parent ef54e0df82
commit 2da7e11fd8

View File

@ -977,6 +977,8 @@ struct seuphgeom {
reaction_t launcher;
};
int current_seuphgeom = -1;
vector<seuphgeom> seuphgeoms = {
{"Infinite Board", []{
set_geometry(gEuclidSquare);
@ -1070,6 +1072,44 @@ vector<seuphgeom> seuphgeoms = {
}},
};
void reset_seuphorica_screen() {
popScreenAll();
pushScreen(seuphorica_screen);
centermap();
clearMessages();
addMessage("Welcome to Seuphorica!");
}
void enable();
void seuphorica_setgeom() {
cmode = sm::DARKEN;
gamescreen();
stillscreen = !anims::any_on();
dialog::init("Seuphorica geometries", 0xFFFF80);
char let = 'a';
for(int i=0; i<isize(seuphgeoms); i++) {
dialog::addBoolItem(seuphgeoms[i].name, i == current_seuphgeom, let++);
dialog::add_action([i] {
current_seuphgeom = i;
stop_game();
seuphgeoms[i].launcher();
start_game();
reset_rv();
new_game();
enable();
reset_seuphorica_screen();
});
}
dialog::addBreak(100);
dialog::addBoolItem("words both ways", bidirectional, 'w');
dialog::add_action([] {
bidirectional = !bidirectional;
reset_rv(); new_game(); reset_seuphorica_screen();
});
dialog::addBack();
dialog::display();
}
void seuphorica_newgame() {
cmode = sm::DARKEN;
@ -1078,11 +1118,15 @@ void seuphorica_newgame() {
dialog::init("Seuphorica: new game", 0xFFFF80);
dialog::addSelItem("language", next_language->name, 'l');
lang_to_edit = &next_language; dialog::add_action_push(pick_language);
dialog::addSelItem("geometry", current_seuphgeom == -1 ? "custom" : seuphgeoms[current_seuphgeom].name, 'g');
dialog::add_action_push(seuphorica_setgeom);
dialog::addItem("start new standard game", 's');
dialog::add_action([] {
reset_rv();
restart("", "", "");
popScreen(); popScreen();
reset_seuphorica_screen();
});
if(!is_daily) {
check_daily_time();
@ -1090,7 +1134,7 @@ void seuphorica_newgame() {
dialog::add_action([] {
reset_rv();
restart((its(daily) + "9").c_str(), "D", "8");
popScreen(); popScreen();
reset_seuphorica_screen();
});
}
dialog::addBreak(100);
@ -1164,7 +1208,7 @@ void seuphorica_newgame() {
is_daily = false; game_restricted = false;
for(int i=0; i<qty; i++) if(!special_allowed[i]) game_restricted = true;
new_game();
popScreen(); popScreen();
reset_seuphorica_screen();
});
dialog::addBack();
@ -1200,34 +1244,41 @@ void seuphorica_menu() {
dialog::display();
}
void enable() {
rogueviz::rv_hook(hooks_build_help, 100, [] { help = fix(seuphorica::rules); return true; });
rogueviz::rv_hook(hooks_drawcell, 100, draw);
rogueviz::rv_change(showstartmenu, false);
rogueviz::rv_change(mapeditor::drawplayer, false);
}
local_parameter_set lps_seuphorica("seuphorica:");
void default_config() {
lps_add(lps_seuphorica, menu_darkening, 3);
lps_add(lps_seuphorica, mine_adjacency_rule, true);
}
void launch() {
// change the settings from JS Seuphorica
specials[int(sp::english)].text_color = 0xFFC8102E;
color_descs = false;
init_special_setting();
stop_game();
enable_canvas();
ccolor::set_plain_nowall(0x202020);
specials[int(sp::english)].text_color = 0xFFC8102E; /* looks better in RV Seuphorica */
lps_enable(&lps_seuphorica);
start_game();
reset_rv();
init_special_setting();
restart("", "", "");
menu_darkening = 3; /* needs more darkening than HyperRogue due to higher contrast */
mine_adjacency_rule = true;
showstartmenu = false;
mapeditor::drawplayer = false;
color_descs = false;
rogueviz::rv_hook(hooks_build_help, 100, [] { help = fix(seuphorica::rules); return true; });
clearMessages();
addMessage("Welcome to Seuphorica!");
}
void enable() {
rogueviz::rv_hook(hooks_drawcell, 100, draw);
enable();
reset_seuphorica_screen();
}
auto seuphorica_hook =
arg::add3("-seuphorica", [] { launch(); enable(); pushScreen(seuphorica_screen); })
arg::add3("-seuphorica", [] { launch(); pushScreen(seuphorica_screen); })
+ addHook(hooks_configfile, 300, default_config)
+ arg::add3("-seuphorica-geo", [] {
arg::shift();
int which = -1;
@ -1235,8 +1286,9 @@ auto seuphorica_hook =
for(int i=0; i<isize(seuphgeoms); i++) if(appears(seuphgeoms[i].name, s)) which = i;
if(which == -1 && s[0] >= '0' && s[0] <= '9') which = atoi(s.c_str());
if(which == -1) throw hr_exception("unknown seuphorica-geo geometry");
current_seuphgeom = which;
seuphgeoms[which].launcher();
launch(); enable(); pushScreen(seuphorica_screen);
launch();
});
}