diff --git a/achievement.cpp b/achievement.cpp index 8699ca02..3963daaf 100644 --- a/achievement.cpp +++ b/achievement.cpp @@ -125,7 +125,6 @@ EX bool wrongMode(char flags) { if(yendor::on) return true; if(peace::on) return true; if(tactic::on) return true; - if(dpgen::in) return true; #if CAP_TOUR if(tour::on) return true; #endif diff --git a/hyper.cpp b/hyper.cpp index 5184ce25..d0c988ec 100644 --- a/hyper.cpp +++ b/hyper.cpp @@ -121,7 +121,6 @@ #include "bigstuff.cpp" #include "multigame.cpp" #include "inforder.cpp" -#include "dpgen.cpp" #include "vr.cpp" #include "intra.cpp" diff --git a/monstergen.cpp b/monstergen.cpp index f69dc222..f9538a60 100644 --- a/monstergen.cpp +++ b/monstergen.cpp @@ -327,7 +327,6 @@ EX void wandering() { if(!canmove) return; if(!gen_wandering) return; if(racing::on) return; - if(dpgen::in) return; if(items[itOrbSafety]) return; pathdata pd(moYeti); int seepcount = getSeepcount(); diff --git a/multigame.cpp b/multigame.cpp index 34dfd0c2..6373734a 100644 --- a/multigame.cpp +++ b/multigame.cpp @@ -136,6 +136,8 @@ EX namespace dual { hyperpoint which_dir; + EX purehookset hooks_after_move; + int remap_direction(int d, int cg) { if(WDIM == 2 || cg == currently_loaded) return d; @@ -247,7 +249,7 @@ EX namespace dual { switch_to(1); forcedmovetype = fm; movepcto(0, subdir, false); forcedmovetype = fmSkip; switch_to(cg); reduceOrbPowers(); - dpgen::check(); + callhooks(hooks_after_move); return true; } addMessage(XLAT("Impossible.")); diff --git a/dpgen.cpp b/rogueviz/dpgen.cpp similarity index 87% rename from dpgen.cpp rename to rogueviz/dpgen.cpp index 879c151c..3fd0bb28 100644 --- a/dpgen.cpp +++ b/rogueviz/dpgen.cpp @@ -5,7 +5,7 @@ * \brief dual geometry puzzle generator */ -#include "hyper.h" +#include "rogueviz.h" namespace hr { @@ -58,6 +58,8 @@ void solve(cpos at) { int last_elimit, last_hlimit; +void check(); + void launch(int seed, int elimit, int hlimit) { /* setup */ @@ -159,6 +161,10 @@ void launch(int seed, int elimit, int hlimit) { worst.first->wall = waOpenPlate; worst.second->wall = waOpenPlate; + rogueviz::rv_hook(dual::hooks_after_move, 100, dpgen::check); + bool b = gen_wandering; + rogueviz::on_cleanup_or_next([b] { gen_wandering = b; }); + gen_wandering = false; } struct puzzle { @@ -260,7 +266,21 @@ auto sbhook = addHook(hooks_args, 100, [] { return 0; }) + addHook(hooks_o_key, 91, [] (o_funcs& v) { if(in) v.push_back(named_dialog(XLAT("select a puzzle"), show_menu)); - }); + }) + + addHook_rvslides(205, [] (string s, vector& v) { + if(s != "mixed") return; + v.push_back(tour::slide{ + "dual geometry puzzle", 10, tour::LEGAL::NONE | tour::QUICKSKIP | tour::QUICKGEO, + "Move both characters to marked squares at once!\n" + , + [] (tour::presmode mode) { + slide_action(mode, 'r', "launch the dual geometry puzzle", [] { + pushScreen(show_menu); + }); + } + }); + }) + ; #endif EX } diff --git a/system.cpp b/system.cpp index afbc6f70..edad6f6e 100644 --- a/system.cpp +++ b/system.cpp @@ -376,7 +376,6 @@ EX void initgame() { truelotus = 0; asteroids_generated = 0; asteroid_orbs_generated = 0; - dpgen::in = false; survivalist = true; #if CAP_CRYSTAL crystal::used_compass_inside = false; @@ -1022,7 +1021,6 @@ EX void saveStats(bool emergency IS(false)) { if(randomPatternsMode) return; if(daily::on) return; if(peace::on) return; - if(dpgen::in) return; if(experimental) return; if(!gold() && !racing::on) return;