added some comments in hr::tour

This commit is contained in:
Zeno Rogue 2020-03-27 20:54:21 +01:00
parent a331779e72
commit 00bbdef12e
2 changed files with 80 additions and 51 deletions

View File

@ -2180,7 +2180,7 @@ function<void(presmode)> roguevizslide_action(char c, const T& t, const U& act)
#define RVPATH HYPERPATH "rogueviz/" #define RVPATH HYPERPATH "rogueviz/"
slide rvslides[] = { slide rvslides[] = {
{"RogueViz", 999, LEGAL_ANY, {"RogueViz", 999, LEGAL::ANY,
"This is a presentation of RogueViz, which " "This is a presentation of RogueViz, which "
"is an adaptation of HyperRogue as a visualization tool " "is an adaptation of HyperRogue as a visualization tool "
"rather than a game. Hyperbolic space is great " "rather than a game. Hyperbolic space is great "
@ -2200,7 +2200,7 @@ slide rvslides[] = {
} }
} }
}, },
{"straight lines in the Palace", 999, LEGAL_ANY, {"straight lines in the Palace", 999, LEGAL::ANY,
"One simple slide about HyperRogue. Press '5' to show some hyperbolic straight lines.", "One simple slide about HyperRogue. Press '5' to show some hyperbolic straight lines.",
[] (presmode mode) { [] (presmode mode) {
using namespace linepatterns; using namespace linepatterns;
@ -2209,7 +2209,7 @@ slide rvslides[] = {
if(mode == 3) patPalace.color = 0xFFD50000; if(mode == 3) patPalace.color = 0xFFD50000;
} }
}, },
{"Collatz conjecture", 51, LEGAL_UNLIMITED | QUICKGEO, {"Collatz conjecture", 51, LEGAL::UNLIMITED | QUICKGEO,
"The following slide is a visualization of the Collatz conjecture. " "The following slide is a visualization of the Collatz conjecture. "
"Press '5' for a spiral rendering of the Collatz conjecture visualization.\n\n" "Press '5' for a spiral rendering of the Collatz conjecture visualization.\n\n"
"Note that this, and many other RogueViz visualizations, have " "Note that this, and many other RogueViz visualizations, have "
@ -2235,7 +2235,7 @@ slide rvslides[] = {
}) })
}, },
{"Roguelikes", 63, LEGAL_UNLIMITED | QUICKGEO, {"Roguelikes", 63, LEGAL::UNLIMITED | QUICKGEO,
"A visualization of roguelikes, based on discussion on /r/reddit. " "A visualization of roguelikes, based on discussion on /r/reddit. "
"See: http://www.roguetemple.com/z/hyper/reddit.php", "See: http://www.roguetemple.com/z/hyper/reddit.php",
roguevizslide('0', [] () { roguevizslide('0', [] () {
@ -2256,7 +2256,7 @@ slide rvslides[] = {
rogueviz::sag::loadsnake(RVPATH "roguelikes/" + cname()); rogueviz::sag::loadsnake(RVPATH "roguelikes/" + cname());
}) })
}, },
{"Programming languages of GitHub", 64, LEGAL_UNLIMITED | QUICKGEO, {"Programming languages of GitHub", 64, LEGAL::UNLIMITED | QUICKGEO,
"A visualization of programming languages.", "A visualization of programming languages.",
roguevizslide('0', [] () { roguevizslide('0', [] () {
rogueviz::dftcolor = 0x282828FF; rogueviz::dftcolor = 0x282828FF;
@ -2277,7 +2277,7 @@ slide rvslides[] = {
if(euclid) rogueviz::legend.clear(); if(euclid) rogueviz::legend.clear();
}) })
}, },
{"Boardgames", 62, LEGAL_UNLIMITED | QUICKGEO, {"Boardgames", 62, LEGAL::UNLIMITED | QUICKGEO,
"A visualization of board games, based on discussions on Reddit.", "A visualization of board games, based on discussions on Reddit.",
roguevizslide('0', [] () { roguevizslide('0', [] () {
rogueviz::dftcolor = 0x282828FF; rogueviz::dftcolor = 0x282828FF;
@ -2297,7 +2297,7 @@ slide rvslides[] = {
rogueviz::sag::loadsnake(RVPATH "boardgames/" + cname()); rogueviz::sag::loadsnake(RVPATH "boardgames/" + cname());
}) })
}, },
{"Tree of Life", 61, LEGAL_UNLIMITED | QUICKGEO, {"Tree of Life", 61, LEGAL::UNLIMITED | QUICKGEO,
"Not described.", "Not described.",
roguevizslide('0', [] () { roguevizslide('0', [] () {
@ -2313,7 +2313,7 @@ slide rvslides[] = {
rogueviz::tree::read(RVPATH "treeoflife/tol.txt"); rogueviz::tree::read(RVPATH "treeoflife/tol.txt");
})}, })},
{"Spiral Staircase", 62, LEGAL_NONE | QUICKGEO, {"Spiral Staircase", 62, LEGAL::NONE | QUICKGEO,
"Spiral Staircase Demo. Press '5' to change the curvature or other parameters.", "Spiral Staircase Demo. Press '5' to change the curvature or other parameters.",
[] (presmode mode) { [] (presmode mode) {
@ -2322,7 +2322,7 @@ slide rvslides[] = {
slidecommand = "staircase menu"; slidecommand = "staircase menu";
if(mode == 4) pushScreen(staircase::showMenu); if(mode == 4) pushScreen(staircase::showMenu);
}}, }},
{"Banach-Tarski-like", 62, LEGAL_NONE, {"Banach-Tarski-like", 62, LEGAL::NONE,
"Banach-Tarski-like decomposition. Break a hyperbolic plane into two hyperbolic planes.\n\n" "Banach-Tarski-like decomposition. Break a hyperbolic plane into two hyperbolic planes.\n\n"
"Press '5' to show the decomposition. Press any key to stop.\n\n" "Press '5' to show the decomposition. Press any key to stop.\n\n"
"You will see a map of the decomposition. Press '5' again to return.", "You will see a map of the decomposition. Press '5' again to return.",
@ -2357,7 +2357,7 @@ slide rvslides[] = {
} }
} }
}}, }},
{"Pentagonal Exploration", 62, LEGAL_NONE | QUICKGEO, {"Pentagonal Exploration", 62, LEGAL::NONE | QUICKGEO,
"Pentagonal Exploration explained at: http://www.roguetemple.com/z/sims/snub/\n\n" "Pentagonal Exploration explained at: http://www.roguetemple.com/z/sims/snub/\n\n"
"Move the mouse nearer and further away from the X.\n\n" "Move the mouse nearer and further away from the X.\n\n"
"Press 3 4 5 6 7 8 9 shift+4 shift+5 shift+6 to change the geometry.", "Press 3 4 5 6 7 8 9 shift+4 shift+5 shift+6 to change the geometry.",
@ -2374,7 +2374,7 @@ slide rvslides[] = {
start_game(); start_game();
} }
}}, }},
{"THE END", 99, LEGAL_ANY | FINALSLIDE, {"THE END", 99, LEGAL::ANY | FINALSLIDE,
"Press '5' to leave the presentation.", "Press '5' to leave the presentation.",
[] (presmode mode) { [] (presmode mode) {
firstland = specialland = laIce; firstland = specialland = laIce;

109
tour.cpp
View File

@ -8,17 +8,23 @@
#include "hyper.h" #include "hyper.h"
namespace hr { namespace hr {
#if CAP_TOUR #if CAP_TOUR
/** Variables and function related to Guided Tour and other presentations. */
EX namespace tour { EX namespace tour {
/** are we currently in a presentation */
EX bool on; EX bool on;
/** should the presentation texts be shown */
EX bool texts = true; EX bool texts = true;
EX string tourhelp; EX string tourhelp;
/** index of the current slide */
EX int currentslide; EX int currentslide;
#if HDR #if HDR
/** a parameter for the slides' action function */
enum presmode { enum presmode {
pmStartAll = 0, pmStartAll = 0,
pmStart = 1, pmFrame = 2, pmStop = 3, pmKey = 4, pmRestart = 5, pmStart = 1, pmFrame = 2, pmStop = 3, pmKey = 4, pmRestart = 5,
@ -26,23 +32,38 @@ enum presmode {
pmGeometry = 11, pmGeometryReset = 13, pmGeometryStart = 15 pmGeometry = 11, pmGeometryReset = 13, pmGeometryStart = 15
}; };
/** slide definition */
struct slide { struct slide {
const char *name; int unused_id; int flags; const char *help; /** title of this slide */
const char *name;
/** ID (currently unused */
int unused_id;
/** various flags */
flagtype flags;
/** the helptext */
const char *help;
/** This function is called while this slide is displayed. Parameter hr::tour::presmode mode says what should be done */
function<void(presmode mode)> action; function<void(presmode mode)> action;
}; };
static const int LEGAL_NONE=0; /** in which geometries does this slide work */
static const int LEGAL_UNLIMITED=1; namespace LEGAL {
static const int LEGAL_HYPERBOLIC=2; enum flagtype { NONE, UNLIMITED, HYPERBOLIC, ANY, NONEUC };
static const int LEGAL_ANY=3; }
static const int LEGAL_NONEUC=4;
static const int QUICKSKIP=8; /** when Enter pressed while showing the text, skip to the next slide immediately */
static const int FINALSLIDE=16; static const flagtype QUICKSKIP=8;
static const int QUICKGEO=32; /** The final slide. Shows where the presentation ends */
static const int SIDESCREEN = 64; static const flagtype FINALSLIDE=16;
static const int USE_SLIDE_NAME = 128; /** Pressing Enter while in another geometry should change slides immediately */
static const flagtype QUICKGEO=32;
/** This slide should be displayed in sidescreen mode */
static const flagtype SIDESCREEN = 64;
/** When changing geometries, show the name of the slide, instead of the current land */
static const flagtype USE_SLIDE_NAME = 128;
#endif #endif
/** an auxiliary function to enable a visualization in the Canvas land */
EX void setCanvas(presmode mode, char canv) { EX void setCanvas(presmode mode, char canv) {
static char wc; static char wc;
static eLand ld; static eLand ld;
@ -62,6 +83,7 @@ EX void setCanvas(presmode mode, char canv) {
} }
} }
/** static mode: we get Orbs of Teleport to use them instead of movement */
bool sickmode; bool sickmode;
EX function<eLand(eLand)> getNext; EX function<eLand(eLand)> getNext;
@ -72,10 +94,13 @@ EX function<bool(eLand)> showland;
#define QUICKFIND quickfind = [](eLand l) #define QUICKFIND quickfind = [](eLand l)
#define SHOWLAND(f) showland = [](eLand l) { return f; } #define SHOWLAND(f) showland = [](eLand l) { return f; }
/** the caption of the special command (executed by pressing '5') in the current slide */
EX string slidecommand; EX string slidecommand;
/** hooks to execute after calling presentation */
EX hookset<void(int)> *hooks_slide; EX hookset<void(int)> *hooks_slide;
/** call action(mode) for the current slide. Also sets up some default stuff */
EX void presentation(presmode mode) { EX void presentation(presmode mode) {
cheater = 0; cheater = 0;
@ -93,6 +118,7 @@ EX void presentation(presmode mode) {
callhooks(hooks_slide, mode); callhooks(hooks_slide, mode);
} }
/** display the help text for the current slide if texts enabled */
EX void slidehelp() { EX void slidehelp() {
if(texts && slides[currentslide].help[0]) if(texts && slides[currentslide].help[0])
gotoHelp( gotoHelp(
@ -102,6 +128,7 @@ EX void slidehelp() {
); );
} }
/** return from a subgame launched while in presentation */
void return_geometry() { void return_geometry() {
gamestack::pop(); gamestack::pop();
vid.scale = 1; vid.alpha = 1; vid.scale = 1; vid.alpha = 1;
@ -143,19 +170,19 @@ bool handleKeyTour(int sym, int uni) {
if(NUMBERKEY == '1' || NUMBERKEY == '2') { if(NUMBERKEY == '1' || NUMBERKEY == '2') {
int legal = slides[currentslide].flags & 7; int legal = slides[currentslide].flags & 7;
if(legal == LEGAL_NONE || legal == LEGAL_HYPERBOLIC) { if(legal == LEGAL::NONE || legal == LEGAL::HYPERBOLIC) {
addMessage(XLAT("You cannot change geometry in this slide.")); addMessage(XLAT("You cannot change geometry in this slide."));
return true; return true;
} }
if(legal == LEGAL_UNLIMITED && NUMBERKEY == '1') { if(legal == LEGAL::UNLIMITED && NUMBERKEY == '1') {
addMessage(XLAT("This does not work in bounded geometries.")); addMessage(XLAT("This does not work in bounded geometries."));
return true; return true;
} }
if(legal == LEGAL_NONEUC && NUMBERKEY == '2') { if(legal == LEGAL::NONEUC && NUMBERKEY == '2') {
addMessage(XLAT("This does not work in Euclidean geometry.")); addMessage(XLAT("This does not work in Euclidean geometry."));
return true; return true;
} }
if(legal == LEGAL_HYPERBOLIC && NUMBERKEY != '3') { if(legal == LEGAL::HYPERBOLIC && NUMBERKEY != '3') {
addMessage(XLAT("This works only in hyperbolic geometry.")); addMessage(XLAT("This works only in hyperbolic geometry."));
return true; return true;
} }
@ -370,9 +397,10 @@ EX void start() {
} }
} }
/** the default presentation (the Guided Tour)
EX slide default_slides[] = { EX slide default_slides[] = {
#if ISMOBILE #if ISMOBILE
{"Note for mobiles", 10, LEGAL_NONE | QUICKSKIP, {"Note for mobiles", 10, LEGAL::NONE | QUICKSKIP,
"This tour is designed for computers, " "This tour is designed for computers, "
"and keys are given for all actions. It will " "and keys are given for all actions. It will "
"work without a keyboard though, although less " "work without a keyboard though, although less "
@ -390,7 +418,7 @@ EX slide default_slides[] = {
} }
}, },
#endif #endif
{"Introduction", 10, LEGAL_NONE | QUICKSKIP, {"Introduction", 10, LEGAL::NONE | QUICKSKIP,
"This tour is mostly aimed to show what is " "This tour is mostly aimed to show what is "
"special about the geometry used by HyperRogue. " "special about the geometry used by HyperRogue. "
"It also shows the basics of gameplay, and " "It also shows the basics of gameplay, and "
@ -408,7 +436,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laIce ); SHOWLAND( l == laIce );
} }
}, },
{"Basics of gameplay", 11, LEGAL_ANY, {"Basics of gameplay", 11, LEGAL::ANY,
"The game starts in the Icy Lands. Collect the Ice Diamonds " "The game starts in the Icy Lands. Collect the Ice Diamonds "
"(press F1 if you do not know how to move). " "(press F1 if you do not know how to move). "
"After you collect many of them, monsters will start to pose a challenge.\n" "After you collect many of them, monsters will start to pose a challenge.\n"
@ -429,7 +457,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laIce ); SHOWLAND( l == laIce );
} }
}, },
{"Hypersian Rug model", 21, LEGAL_HYPERBOLIC, {"Hypersian Rug model", 21, LEGAL::HYPERBOLIC,
"New players think that the action of HyperRogue takes place on a sphere. " "New players think that the action of HyperRogue takes place on a sphere. "
#if CAP_RUG #if CAP_RUG
"This is not true -- the next slide will show the surface HyperRogue " "This is not true -- the next slide will show the surface HyperRogue "
@ -456,7 +484,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laIce ); SHOWLAND( l == laIce );
} }
}, },
{"Expansion", 22, LEGAL_ANY | USE_SLIDE_NAME, {"Expansion", 22, LEGAL::ANY | USE_SLIDE_NAME,
"The next slide shows the number of cells in distance 1, 2, 3, ... from you. " "The next slide shows the number of cells in distance 1, 2, 3, ... from you. "
"It grows exponentially: there are more than 10^100 cells " "It grows exponentially: there are more than 10^100 cells "
"in radius 1000 around you, and you will move further away during the game!\n\n" "in radius 1000 around you, and you will move further away during the game!\n\n"
@ -476,7 +504,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laIce ); SHOWLAND( l == laIce );
} }
}, },
{"Tiling and Tactics", 23, LEGAL_ANY | USE_SLIDE_NAME, {"Tiling and Tactics", 23, LEGAL::ANY | USE_SLIDE_NAME,
"The tactics of fighting simple monsters, such as the Yetis from the Icy Lands, " "The tactics of fighting simple monsters, such as the Yetis from the Icy Lands, "
"might appear shallow, but hyperbolic geometry is essential even there. " "might appear shallow, but hyperbolic geometry is essential even there. "
"In the next slide, you are attacked by two monsters at once. " "In the next slide, you are attacked by two monsters at once. "
@ -492,7 +520,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laCanvas ); SHOWLAND( l == laCanvas );
} }
}, },
{"Straight Lines", 24, LEGAL_ANY, {"Straight Lines", 24, LEGAL::ANY,
"Hyperbolic geometry has been discovered by the 19th century mathematicians who " "Hyperbolic geometry has been discovered by the 19th century mathematicians who "
"wondered about the nature of paralellness. Take a line L and a point A. " "wondered about the nature of paralellness. Take a line L and a point A. "
"Can a world exist where there is more than one line passing through A " "Can a world exist where there is more than one line passing through A "
@ -519,7 +547,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laCrossroads || l == laIce ); SHOWLAND( l == laCrossroads || l == laIce );
} }
}, },
{"Running Dogs", 25, LEGAL_ANY, {"Running Dogs", 25, LEGAL::ANY,
"To learn more about straight lines, " "To learn more about straight lines, "
"wander further, and you should find the Land of Eternal Motion. " "wander further, and you should find the Land of Eternal Motion. "
"Try to run in a straight line, with a Running Dog next to you. " "Try to run in a straight line, with a Running Dog next to you. "
@ -541,7 +569,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laCrossroads || l == laMotion ); SHOWLAND( l == laCrossroads || l == laMotion );
} }
}, },
{"Equidistants", 27, LEGAL_ANY, {"Equidistants", 27, LEGAL::ANY,
"Equidistants are curves which are at some fixed distance from a " "Equidistants are curves which are at some fixed distance from a "
"straight line. Some lands in HyperRogue are based on equidistants; " "straight line. Some lands in HyperRogue are based on equidistants; "
"you should see them after wandering a bit more.\n\n" "you should see them after wandering a bit more.\n\n"
@ -558,7 +586,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laCrossroads || l == laDungeon || l == laOcean || l == laIvoryTower || l == laEndorian ); SHOWLAND( l == laCrossroads || l == laDungeon || l == laOcean || l == laIvoryTower || l == laEndorian );
} }
}, },
{"Circles", 26, LEGAL_ANY, {"Circles", 26, LEGAL::ANY,
"Circles are strange in hyperbolic geometry too. " "Circles are strange in hyperbolic geometry too. "
"Look for the Castle of Camelot in the Crossroads; " "Look for the Castle of Camelot in the Crossroads; "
"the Round Table inside is a circle of radius 28. " "the Round Table inside is a circle of radius 28. "
@ -581,7 +609,7 @@ EX slide default_slides[] = {
SHOWLAND( l == laCrossroads || l == laCamelot ); SHOWLAND( l == laCrossroads || l == laCamelot );
} }
}, },
{"Horocycles", 28, LEGAL_ANY, {"Horocycles", 28, LEGAL::ANY,
"Horocycles are similar to circles, but you cannot reach their center at all -- " "Horocycles are similar to circles, but you cannot reach their center at all -- "
"they can be understood as limit circles of infinite radius centered in some point " "they can be understood as limit circles of infinite radius centered in some point "
"in infinity (also called an ideal point).\n\n" "in infinity (also called an ideal point).\n\n"
@ -600,7 +628,7 @@ EX slide default_slides[] = {
SHOWLAND ( l == laCrossroads || l == laRlyeh || l == laTemple ); SHOWLAND ( l == laCrossroads || l == laRlyeh || l == laTemple );
} }
}, },
{"Half-plane model", 47, LEGAL_HYPERBOLIC, {"Half-plane model", 47, LEGAL::HYPERBOLIC,
"The game is normally displayed in the so called Poincaré disk model, " "The game is normally displayed in the so called Poincaré disk model, "
"which is a kind of a map of the infinite hyperbolic world. " "which is a kind of a map of the infinite hyperbolic world. "
"There are many projections of Earth, but since Earth is curved, " "There are many projections of Earth, but since Earth is curved, "
@ -617,7 +645,7 @@ EX slide default_slides[] = {
if(mode == 3) pmodel = mdDisk, models::rotation = 0, vid.use_smart_range = smart; if(mode == 3) pmodel = mdDisk, models::rotation = 0, vid.use_smart_range = smart;
} }
}, },
{"Curvature", 29, LEGAL_ANY, {"Curvature", 29, LEGAL::ANY,
"Now, go to the Burial Grounds and find an Orb of the Sword. The Sword appears to " "Now, go to the Burial Grounds and find an Orb of the Sword. The Sword appears to "
"always be facing in the same direction whatever you do, and it appears that " "always be facing in the same direction whatever you do, and it appears that "
"you have to rotate the sword to excavate the treasures; " "you have to rotate the sword to excavate the treasures; "
@ -641,7 +669,7 @@ EX slide default_slides[] = {
SHOWLAND ( l == laCrossroads || l == laBurial ); SHOWLAND ( l == laCrossroads || l == laBurial );
} }
}, },
{"Periodic patterns", 30, LEGAL_UNLIMITED | USE_SLIDE_NAME, {"Periodic patterns", 30, LEGAL::UNLIMITED | USE_SLIDE_NAME,
"Hyperbolic geometry yields much more interesting periodic patterns " "Hyperbolic geometry yields much more interesting periodic patterns "
"than Euclidean.", "than Euclidean.",
[] (presmode mode) { [] (presmode mode) {
@ -655,7 +683,7 @@ EX slide default_slides[] = {
SHOWLAND ( l == laCanvas ); SHOWLAND ( l == laCanvas );
} }
}, },
{"Periodic patterns: application", 31, LEGAL_ANY, {"Periodic patterns: application", 31, LEGAL::ANY,
"Many lands in HyperRogue are based around periodic patterns. " "Many lands in HyperRogue are based around periodic patterns. "
"For example, both Zebra and Windy Plains are based on the pattern " "For example, both Zebra and Windy Plains are based on the pattern "
"shown in the previous slide. " "shown in the previous slide. "
@ -675,7 +703,7 @@ EX slide default_slides[] = {
l == laEmerald || l == laWineyard || l == laPower ); l == laEmerald || l == laWineyard || l == laPower );
} }
}, },
{"Fractal landscapes", 32, LEGAL_UNLIMITED | USE_SLIDE_NAME, {"Fractal landscapes", 32, LEGAL::UNLIMITED | USE_SLIDE_NAME,
"On the following slide, the colors change smoothly in the whole infinite world. " "On the following slide, the colors change smoothly in the whole infinite world. "
"Again, this works better than in Euclidean geometry.", "Again, this works better than in Euclidean geometry.",
[] (presmode mode) { [] (presmode mode) {
@ -683,7 +711,7 @@ EX slide default_slides[] = {
SHOWLAND ( l == laCanvas ); SHOWLAND ( l == laCanvas );
} }
}, },
{"Fractal landscapes: application", 33, LEGAL_ANY, {"Fractal landscapes: application", 33, LEGAL::ANY,
"This is applied in HyperRogue to create landscapes, such as the chasms in the " "This is applied in HyperRogue to create landscapes, such as the chasms in the "
"land of Reptiles or the Dragon Chasms, which you should find quickly. " "land of Reptiles or the Dragon Chasms, which you should find quickly. "
"Also in the Dragon Chasms, you can find a Baby Tortoise, and try to find " "Also in the Dragon Chasms, you can find a Baby Tortoise, and try to find "
@ -711,7 +739,7 @@ EX slide default_slides[] = {
SHOWLAND ( l == laCrossroads || l == laReptile || l == laDragon || l == laTortoise ); SHOWLAND ( l == laCrossroads || l == laReptile || l == laDragon || l == laTortoise );
} }
}, },
{"Poincaré Ball model", 41, LEGAL_HYPERBOLIC, {"Poincaré Ball model", 41, LEGAL::HYPERBOLIC,
"The Poincaré disk model is a model of a hyperbolic *plane* -- you " "The Poincaré disk model is a model of a hyperbolic *plane* -- you "
"might wonder why are the walls rendered in 3D then.\n\n" "might wonder why are the walls rendered in 3D then.\n\n"
"HyperRogue actually assumes that the floor level is an equidistant surface " "HyperRogue actually assumes that the floor level is an equidistant surface "
@ -725,7 +753,7 @@ EX slide default_slides[] = {
if(mode == 3) pmodel = mdDisk; if(mode == 3) pmodel = mdDisk;
} }
}, },
{"Hyperboloid model", 42, LEGAL_ANY, {"Hyperboloid model", 42, LEGAL::ANY,
"Let's see more models of the hyperbolic plane. " "Let's see more models of the hyperbolic plane. "
"This model uses a hyperboloid in the Minkowski geometry; " "This model uses a hyperboloid in the Minkowski geometry; "
"it is used internally by HyperRogue.", "it is used internally by HyperRogue.",
@ -734,14 +762,14 @@ EX slide default_slides[] = {
if(mode == 3) pmodel = mdDisk; if(mode == 3) pmodel = mdDisk;
} }
}, },
{"Beltrami-Klein model", 43, LEGAL_ANY | USE_SLIDE_NAME, {"Beltrami-Klein model", 43, LEGAL::ANY | USE_SLIDE_NAME,
"This model renders straight lines as straight, but it distorts angles.", "This model renders straight lines as straight, but it distorts angles.",
[] (presmode mode) { [] (presmode mode) {
if(mode == 1 || mode == pmGeometryReset || mode == pmGeometry) vid.alpha = 0; if(mode == 1 || mode == pmGeometryReset || mode == pmGeometry) vid.alpha = 0;
if(mode == 3) vid.alpha = 1; if(mode == 3) vid.alpha = 1;
} }
}, },
{"Gans model", 44, LEGAL_ANY | USE_SLIDE_NAME, {"Gans model", 44, LEGAL::ANY | USE_SLIDE_NAME,
"Yet another model, which corresponds to orthographic projection of the " "Yet another model, which corresponds to orthographic projection of the "
"sphere. Poincaré disk model, Beltrami-Klein model, and the Gans " "sphere. Poincaré disk model, Beltrami-Klein model, and the Gans "
"model are all obtained by looking at either the hyperboloid model or an " "model are all obtained by looking at either the hyperboloid model or an "
@ -751,7 +779,7 @@ EX slide default_slides[] = {
if(mode == 3) vid.alpha = vid.scale = 1; if(mode == 3) vid.alpha = vid.scale = 1;
} }
}, },
{"Band model", 45, LEGAL_NONEUC | USE_SLIDE_NAME, {"Band model", 45, LEGAL::NONEUC | USE_SLIDE_NAME,
"The band model is the hyperbolic analog of the Mercator projection of the sphere: " "The band model is the hyperbolic analog of the Mercator projection of the sphere: "
"a given straight line is rendered as a straight line, and the rest of the " "a given straight line is rendered as a straight line, and the rest of the "
"world is mapped conformally, that is, angles are not distorted. " "world is mapped conformally, that is, angles are not distorted. "
@ -780,7 +808,7 @@ EX slide default_slides[] = {
#endif #endif
} }
}, },
/*{"Conformal square model", 46, LEGAL_HYPERBOLIC, /*{"Conformal square model", 46, LEGAL::HYPERBOLIC,
"The world can be mapped conformally to a square too.", "The world can be mapped conformally to a square too.",
[] (presmode mode) { [] (presmode mode) {
if(mode == 1) pmodel = mdPolygonal, polygonal::solve(); if(mode == 1) pmodel = mdPolygonal, polygonal::solve();
@ -788,7 +816,7 @@ EX slide default_slides[] = {
} }
}, */ }, */
#if !ISWEB #if !ISWEB
{"Shoot'em up mode", 52, LEGAL_NONE | USE_SLIDE_NAME, {"Shoot'em up mode", 52, LEGAL::NONE | USE_SLIDE_NAME,
"In the shoot'em up mode, space and time is continuous. " "In the shoot'em up mode, space and time is continuous. "
"You attack by throwing knives. " "You attack by throwing knives. "
"Very fun with two players!\n\n" "Very fun with two players!\n\n"
@ -809,7 +837,7 @@ EX slide default_slides[] = {
} }
}, },
#endif #endif
{"THE END", 99, LEGAL_ANY | FINALSLIDE, {"THE END", 99, LEGAL::ANY | FINALSLIDE,
"This tour shows just a small part of what you can see in the world of HyperRogue. " "This tour shows just a small part of what you can see in the world of HyperRogue. "
"For example, " "For example, "
"hyperbolic mazes are much nicer than their Euclidean counterparts. " "hyperbolic mazes are much nicer than their Euclidean counterparts. "
@ -822,6 +850,7 @@ EX slide default_slides[] = {
} }
}; };
/** currently used set of slides */
EX slide *slides = default_slides; EX slide *slides = default_slides;
auto a1 = addHook(hooks_frame, 100, [] () { if(tour::on) tour::presentation(tour::pmFrame); }); auto a1 = addHook(hooks_frame, 100, [] () { if(tour::on) tour::presentation(tour::pmFrame); });