diff --git a/dpgen.cpp b/dpgen.cpp index 9b4fd183..e69356c3 100644 --- a/dpgen.cpp +++ b/dpgen.cpp @@ -258,9 +258,8 @@ auto sbhook = addHook(hooks_args, 100, [] { } else return 1; return 0; - }) + addHook(hooks_o_key, 91, [] { - if(in) return named_dialog(XLAT("select a puzzle"), show_menu); - else return named_functionality(); + }) + addHook(hooks_o_key, 91, [] (o_funcs& v) { + if(in) v.push_back(named_dialog(XLAT("select a puzzle"), show_menu)); }); #endif diff --git a/menus.cpp b/menus.cpp index 7888a607..344322e0 100644 --- a/menus.cpp +++ b/menus.cpp @@ -970,41 +970,57 @@ struct named_functionality { inline named_functionality named_dialog(string x, reaction_t dialog) { return named_functionality(x, [dialog] () { pushScreen(dialog); }); } #endif -EX hookset hooks_o_key; +#if HDR +using o_funcs = vector; +#endif + +EX hookset hooks_o_key; EX named_functionality get_o_key() { - auto res = callhandlers(named_functionality(), hooks_o_key); - if (res != named_functionality()) return res; + vector res; + callhooks(hooks_o_key, res); + + if(in_full_game()) + res.push_back(named_dialog(XLAT("world overview"), showOverview)); #if CAP_DAILY if(daily::on) - return named_functionality(XLAT("Strange Challenge"), [] () { + res.push_back(named_functionality(XLAT("Strange Challenge"), [] () { achievement_final(false); pushScreen(daily::showMenu); - }); + })); #endif if(viewdists) - return named_functionality(XLAT("experiment with geometry"), runGeometryExperiments); + res.push_back(named_functionality(XLAT("experiment with geometry"), runGeometryExperiments)); if(tactic::on) - return named_dialog(XLAT("Pure Tactics mode"), tactic::showMenu); + res.push_back(named_dialog(XLAT("Pure Tactics mode"), tactic::showMenu)); if(yendor::on) - return named_dialog(XLAT("Yendor Challenge"), yendor::showMenu); + res.push_back(named_dialog(XLAT("Yendor Challenge"), yendor::showMenu)); if(peace::on) - return named_dialog(XLAT("peaceful mode"), peace::showMenu); + res.push_back(named_dialog(XLAT("peaceful mode"), peace::showMenu)); dialog::infix = ""; - if(in_full_game()) - return named_dialog(XLAT("world overview"), showOverview); + if((geometry != gNormal || NONSTDVAR) && !daily::on) + res.push_back(named_functionality(XLAT("experiment with geometry"), runGeometryExperiments)); - if(geometry != gNormal || NONSTDVAR) - return named_functionality(XLAT("experiment with geometry"), runGeometryExperiments); - - return named_dialog(XLAT("world overview"), showOverview); + if(res.empty()) return named_dialog(XLAT("world overview"), showOverview); + + if(isize(res) == 1) return res[0]; + + return named_dialog(res[0].first + "/...", [res] { + dialog::init(); + char id = 'o'; + for(auto& r: res) { + dialog::addItem(r.first, id++); + dialog::add_action([r] { popScreen(); r.second(); }); + } + dialog::display(); + }); } EX int messagelogpos; diff --git a/racing.cpp b/racing.cpp index 78e08e52..e02a1558 100644 --- a/racing.cpp +++ b/racing.cpp @@ -1228,9 +1228,8 @@ EX void configure_race() { } auto hooks1 = - addHook(hooks_o_key, 90, [] { - if(racing::on) { set_race_configurer(); return named_dialog(XLAT("racing menu"), raceconfigurer); } - else return named_functionality(); + addHook(hooks_o_key, 90, [] (o_funcs& v) { + if(racing::on) { set_race_configurer(); v.push_back(named_dialog(XLAT("racing menu"), raceconfigurer)); } }); map > scoreboard; diff --git a/rogueviz/flocking.cpp b/rogueviz/flocking.cpp index 4dd625d9..5ffbb089 100644 --- a/rogueviz/flocking.cpp +++ b/rogueviz/flocking.cpp @@ -499,9 +499,8 @@ namespace flocking { dialog::display(); } - named_functionality o_key() { - if(vizid == &flock_id) return named_dialog("flocking", show); - return named_functionality(); + void o_key(o_funcs& v) { + if(vizid == &flock_id) v.push_back(named_dialog("flocking", show)); } auto hooks = diff --git a/rogueviz/impossible-ring.cpp b/rogueviz/impossible-ring.cpp index e0242091..2e694a0b 100644 --- a/rogueviz/impossible-ring.cpp +++ b/rogueviz/impossible-ring.cpp @@ -230,12 +230,11 @@ bool draw_ptriangle(cell *c, const transmatrix& V) { bool cylanim = false; -named_functionality o_key() { - if(on) return named_functionality("ring size", [] { +void o_key(o_funcs& v) { + if(on) v.push_back(named_functionality("ring size", [] { dialog::editNumber(cscale, 0, 1, .01, .1, "", ""); dialog::reaction = reset; - }); - return named_functionality(); + })); } auto hchook = addHook(hooks_drawcell, 100, draw_ptriangle) diff --git a/rogueviz/rogueviz.cpp b/rogueviz/rogueviz.cpp index 2ebba69f..97753618 100644 --- a/rogueviz/rogueviz.cpp +++ b/rogueviz/rogueviz.cpp @@ -1219,9 +1219,8 @@ bool default_help() { return true; } -named_functionality o_key() { - if(vizid) return named_dialog(XLAT("rogueviz menu"), rogueviz::showMenu); - return named_functionality(); +void o_key(o_funcs& v) { + if(vizid) v.push_back(named_dialog(XLAT("rogueviz menu"), rogueviz::showMenu)); } auto hooks = diff --git a/rogueviz/snow.cpp b/rogueviz/snow.cpp index 9ce17c8d..ace1463a 100644 --- a/rogueviz/snow.cpp +++ b/rogueviz/snow.cpp @@ -193,9 +193,8 @@ void show() { dialog::display(); } -named_functionality o_key() { - if(snow_lambda) return named_dialog("snowballs", show); - return named_functionality(); +void o_key(o_funcs& v) { + if(snow_lambda) v.push_back(named_dialog("snowballs", show)); } auto hchook = addHook(hooks_drawcell, 100, draw_snow) diff --git a/rogueviz/sunflower.cpp b/rogueviz/sunflower.cpp index 11852abd..4d4b8f78 100644 --- a/rogueviz/sunflower.cpp +++ b/rogueviz/sunflower.cpp @@ -259,9 +259,8 @@ void show() { dialog::display(); } -named_functionality o_key() { - if(on) return named_dialog("sunflowers", show); - return named_functionality(); +void o_key(o_funcs& v) { + if(on) v.push_back(named_dialog("sunflowers", show)); } auto hook = 0