From b3329208c45ae93563e6edd7e3042397ff191580 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sun, 29 Mar 2020 13:31:22 +0200 Subject: [PATCH] redesigned multiple slideshows in HyperRogue, and how rvslides is generated in RogueViz --- rogueviz/rogueviz.cpp | 47 +++++++++++++++++++++++++++++-------------- tour.cpp | 33 +++++++++++++++--------------- 2 files changed, 48 insertions(+), 32 deletions(-) diff --git a/rogueviz/rogueviz.cpp b/rogueviz/rogueviz.cpp index f9dffc0d..5fb4d7b2 100644 --- a/rogueviz/rogueviz.cpp +++ b/rogueviz/rogueviz.cpp @@ -1155,7 +1155,7 @@ int readArgs() { } #if CAP_RVSLIDES else if(argis("-rvpres")) { - tour::slides = rvtour::rvslides; + tour::slides = rvtour::gen_rvtour(); } #endif else if(argis("-nolegend")) { @@ -1367,7 +1367,26 @@ function roguevizslide_action(char c, const T& t, const U& act) #define RVPATH HYPERPATH "rogueviz/" -slide rvslides[] = { +vector rvslides; +extern vector rvslides_default; + +purehookset hooks_build_rvtour; + +slide *gen_rvtour() { + rvslides = rvslides_default; + callhooks(hooks_build_rvtour); + rvslides.push_back( + {"THE END", 99, LEGAL::ANY | FINALSLIDE, + "Press '5' to leave the presentation.", + [] (presmode mode) { + firstland = specialland = laIce; + if(mode == 4) restart_game(rg::tour); + } + }); + return &rvslides[0]; + } + +vector rvslides_default = { {"RogueViz", 999, LEGAL::ANY, "This is a presentation of RogueViz, which " "is an adaptation of HyperRogue as a visualization tool " @@ -1562,13 +1581,6 @@ slide rvslides[] = { start_game(); } }}, - {"THE END", 99, LEGAL::ANY | FINALSLIDE, - "Press '5' to leave the presentation.", - [] (presmode mode) { - firstland = specialland = laIce; - if(mode == 4) restart_game(rg::tour); - } - } }; int rvtour_hooks = @@ -1582,7 +1594,7 @@ int rvtour_hooks = "common HyperRogue tutorial first is useful too, " "as an introduction to hyperbolic geometry."; if(mode == 4) { - slides = rogueviz::rvtour::rvslides; + slides = gen_rvtour(); while(tour::on) restart_game(rg::tour); tour::start(); } @@ -1625,9 +1637,6 @@ auto hooks = addHook(hooks_frame, 0, drawExtra) + #if CAP_COMMANDLINE addHook(hooks_args, 100, readArgs) + -#endif -#if CAP_RVSLIDES - addHook(hooks_config, 0, [] () { tour::ss::list(rogueviz::rvtour::rvslides); }) + #endif addHook(clearmemory, 0, close) + addHook(hooks_prestats, 100, rogueviz_hud) + @@ -1635,6 +1644,14 @@ auto hooks = addHook(shmup::hooks_describe, 100, describe_monster) + addHook(shmup::hooks_kill, 100, activate) + addHook(hooks_o_key, 100, o_key) + + + addHook(tour::ss::extra_slideshows, 100, [] (bool view) { + if(!view) return 1; + dialog::addBoolItem(XLAT("RogueViz Tour"), tour::ss::wts == &rvtour::rvslides[0], 'r'); + dialog::add_action([] { tour::ss::wts = rvtour::gen_rvtour(); popScreen(); }); + return 0; + }) + + addHook(dialog::hooks_display_dialog, 100, [] () { if(current_screen_cfunction() == showMainMenu) { dialog::addItem(XLAT("rogueviz menu"), 'u'); @@ -1644,8 +1661,8 @@ auto hooks = if(current_screen_cfunction() == showStartMenu) { dialog::addBreak(100); dialog::addBigItem(XLAT("RogueViz"), 'r'); - dialog::add_action([] () { - tour::slides = rogueviz::rvtour::rvslides; + dialog::add_action([] () { + tour::slides = rogueviz::rvtour::gen_rvtour(); popScreenAll(); tour::start(); printf("tour start\n"); diff --git a/tour.cpp b/tour.cpp index a42436d5..e93c5bb0 100644 --- a/tour.cpp +++ b/tour.cpp @@ -326,16 +326,21 @@ EX void checkGoodLand(eLand l) { } EX namespace ss { - vector slideshows; - slide *wts; - - EX void list(slide *ss) { - for(auto s: slideshows) if (s == ss) return; - slideshows.push_back(ss); - } + EX slide *wts; string slidechars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ23456789!@#$%^&*("; - + + EX hookset *extra_slideshows; + + EX void slideshow_menu() { + dialog::init(XLAT("slideshows"), forecolor, 150, 100); + dialog::addBoolItem(XLAT("Guided Tour"), wts == default_slides, 't'); + dialog::add_action([] { wts = default_slides; popScreen(); }); + callhooks(extra_slideshows, true); + dialog::addBack(); + dialog::display(); + } + EX void showMenu() { if(!wts) wts = slides; @@ -362,15 +367,10 @@ EX namespace ss { if(wts[i].flags & FINALSLIDE) break; } dialog::addBreak(50); - if(isize(slideshows) > 1) { + bool b = false; + if(callhandlers(0, extra_slideshows, b)) { dialog::addItem(XLAT("change slideshow"), '1'); - dialog::add_action([] { - list(wts); - for(int i=0; i