mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2025-01-11 18:00:34 +00:00
RogueViz slides, translating the tutorial
This commit is contained in:
parent
4e0e6a467d
commit
131dfb2b4b
180
rogueviz.cpp
180
rogueviz.cpp
@ -1195,9 +1195,7 @@ void drawExtra() {
|
|||||||
ld x = vid.xres - rad;
|
ld x = vid.xres - rad;
|
||||||
ld y = (vid.radius * (i+.5)) / size(legend) * 2 - vid.radius + vid.yres/2;
|
ld y = (vid.radius * (i+.5)) / size(legend) * 2 - vid.radius + vid.yres/2;
|
||||||
|
|
||||||
transmatrix V = Id;
|
transmatrix V = atscreenpos(x, y, vid.radius/4);
|
||||||
V[0][2] += (x - vid.xcenter) / vid.radius * (1+vid.alphax);
|
|
||||||
V[1][2] += (y - vid.ycenter) / vid.radius * (1+vid.alphax);
|
|
||||||
|
|
||||||
poly_outline = OUTLINE_NONE;
|
poly_outline = OUTLINE_NONE;
|
||||||
queuedisk(V, vd.cp, true);
|
queuedisk(V, vd.cp, true);
|
||||||
@ -1615,6 +1613,9 @@ int readArgs() {
|
|||||||
shift(); int percount = argi();
|
shift(); int percount = argi();
|
||||||
shift(); kohonen::run(fname, percount, argf());
|
shift(); kohonen::run(fname, percount, argf());
|
||||||
}
|
}
|
||||||
|
else if(argis("-rvpres")) {
|
||||||
|
tour::slides = rvtour::rvslides;
|
||||||
|
}
|
||||||
else if(argis("-somsave")) {
|
else if(argis("-somsave")) {
|
||||||
PHASE(3);
|
PHASE(3);
|
||||||
while(!kohonen::finished()) kohonen::step();
|
while(!kohonen::finished()) kohonen::step();
|
||||||
@ -1709,6 +1710,179 @@ string help() {
|
|||||||
ret += "Current visualization: full net\n\n";
|
ret += "Current visualization: full net\n\n";
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace rvtour {
|
||||||
|
|
||||||
|
using namespace tour;
|
||||||
|
|
||||||
|
string cname() {
|
||||||
|
if(euclid) return "coord-6.txt";
|
||||||
|
if(purehepta) return "coord-7.txt";
|
||||||
|
return "coord-67.txt";
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T> function<void(presmode)> roguevizslide(char c, T t) {
|
||||||
|
return [c,t] (presmode mode) {
|
||||||
|
mapeditor::canvasback = 0x101010;
|
||||||
|
setCanvas(mode, c);
|
||||||
|
if(mode == 1 || mode == pmGeometryStart) t();
|
||||||
|
|
||||||
|
if(mode == 3 || mode == pmGeometry || mode == pmGeometryReset) {
|
||||||
|
rogueviz::close();
|
||||||
|
shmup::clearMonsters();
|
||||||
|
if(mode == pmGeometryReset) t();
|
||||||
|
}
|
||||||
|
|
||||||
|
slidecommand = "toggle the player";
|
||||||
|
if(mode == 4)
|
||||||
|
mapeditor::drawplayer = !mapeditor::drawplayer;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
slide rvslides[] = {
|
||||||
|
{"HyperRogue", 999, LEGAL_ANY,
|
||||||
|
"This is a presentation of RogueViz, which "
|
||||||
|
"is an adaptation of HyperRogue as a visualization tool "
|
||||||
|
"rather than a game. Hyperbolic space is great "
|
||||||
|
"for visualizing some kinds of data because of the vast amount "
|
||||||
|
"of space.\n\n"
|
||||||
|
"Press '5' to switch to the standard HyperRogue tutorial. "
|
||||||
|
"Press ESC to look at other functions of this presentation."
|
||||||
|
,
|
||||||
|
[] (presmode mode) {
|
||||||
|
slidecommand = "the standard presentation";
|
||||||
|
if(mode == 4) {
|
||||||
|
tour::slides = default_slides;
|
||||||
|
while(tour::on) restartGame('T', false);
|
||||||
|
firstland = euclidland = laIce;
|
||||||
|
tour::start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{"HyperRogue", 999, LEGAL_ANY,
|
||||||
|
"One simple slide about HyperRogue. Press '5' to show some hyperbolic straight lines.",
|
||||||
|
[] (presmode mode) {
|
||||||
|
using namespace linepatterns;
|
||||||
|
slidecommand = "toggle the Palace lines";
|
||||||
|
if(mode == 4)
|
||||||
|
switchAlpha(patPalace, 0xFF);
|
||||||
|
if(mode == 3)
|
||||||
|
setColor(patPalace, 0xFFD50000);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{"Collatz conjecture", 51, LEGAL_UNLIMITED,
|
||||||
|
"The following slide is a visualization of the Collatz conjecture. "
|
||||||
|
"Press '5' for a spiral rendering of the Collatz conjecture visualization.\n\n"
|
||||||
|
"Note that this, and many other RogueViz visualizations, have "
|
||||||
|
"Euclidean versions (press ESC).\n",
|
||||||
|
roguevizslide('d', [] () {
|
||||||
|
rogueviz::dftcolor = 0x206020FF;
|
||||||
|
|
||||||
|
int fac = euclid ? 2 : 1;
|
||||||
|
|
||||||
|
rogueviz::collatz::s2 = .3;
|
||||||
|
rogueviz::collatz::p2 = .5 * fac;
|
||||||
|
rogueviz::collatz::s3 = -.4;
|
||||||
|
rogueviz::collatz::p3 = .4 * fac;
|
||||||
|
|
||||||
|
rogueviz::showlabels = true;
|
||||||
|
|
||||||
|
rogueviz::on = true;
|
||||||
|
gmatrix.clear();
|
||||||
|
drawthemap();
|
||||||
|
gmatrix0 = gmatrix;
|
||||||
|
|
||||||
|
rogueviz::collatz::start();
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
|
{"Roguelikes", 63, LEGAL_UNLIMITED,
|
||||||
|
"A visualization of roguelikes, based on disccusion on /r/reddit. "
|
||||||
|
"See: http://www.roguetemple.com/z/hyper/reddit.php",
|
||||||
|
roguevizslide('0', [] () {
|
||||||
|
rogueviz::dftcolor = 0x282828FF;
|
||||||
|
|
||||||
|
rogueviz::showlabels = true;
|
||||||
|
rogueviz::ggamma = .5;
|
||||||
|
rogueviz::sag::edgepower = 1;
|
||||||
|
rogueviz::sag::edgemul = 1;
|
||||||
|
|
||||||
|
rogueviz::on = true;
|
||||||
|
gmatrix.clear();
|
||||||
|
drawthemap();
|
||||||
|
gmatrix0 = gmatrix;
|
||||||
|
|
||||||
|
rogueviz::sag::read("rogueviz/roguelikes/edges.csv");
|
||||||
|
rogueviz::readcolor("rogueviz/roguelikes/color.csv");
|
||||||
|
rogueviz::sag::loadsnake("rogueviz/roguelikes/" + cname());
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{"Programming languages of GitHub", 64, LEGAL_UNLIMITED,
|
||||||
|
"A visualization of programming languages.",
|
||||||
|
roguevizslide('0', [] () {
|
||||||
|
rogueviz::dftcolor = 0x282828FF;
|
||||||
|
|
||||||
|
rogueviz::showlabels = true;
|
||||||
|
rogueviz::ggamma = 1;
|
||||||
|
rogueviz::sag::edgepower = .4;
|
||||||
|
rogueviz::sag::edgemul = .02;
|
||||||
|
|
||||||
|
rogueviz::on = true;
|
||||||
|
gmatrix.clear();
|
||||||
|
drawthemap();
|
||||||
|
gmatrix0 = gmatrix;
|
||||||
|
|
||||||
|
rogueviz::sag::read("rogueviz/lang/edges.csv");
|
||||||
|
rogueviz::readcolor("rogueviz/lang/color.csv");
|
||||||
|
rogueviz::sag::loadsnake("rogueviz/lang/" + cname());
|
||||||
|
if(euclid) rogueviz::legend.clear();
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{"Boardgames", 62, LEGAL_UNLIMITED,
|
||||||
|
"A visualization of board games, based on discussions on Reddit.",
|
||||||
|
roguevizslide('0', [] () {
|
||||||
|
rogueviz::dftcolor = 0x282828FF;
|
||||||
|
|
||||||
|
rogueviz::showlabels = true;
|
||||||
|
rogueviz::ggamma = .7;
|
||||||
|
rogueviz::sag::edgepower = 1;
|
||||||
|
rogueviz::sag::edgemul = 1;
|
||||||
|
|
||||||
|
rogueviz::on = true;
|
||||||
|
gmatrix.clear();
|
||||||
|
drawthemap();
|
||||||
|
gmatrix0 = gmatrix;
|
||||||
|
|
||||||
|
rogueviz::sag::read("rogueviz/boardgames/edges.csv");
|
||||||
|
rogueviz::readcolor("rogueviz/boardgames/color.csv");
|
||||||
|
rogueviz::sag::loadsnake("rogueviz/boardgames/" + cname());
|
||||||
|
})
|
||||||
|
},
|
||||||
|
{"Tree of Life", 61, LEGAL_UNLIMITED,
|
||||||
|
"Not described.",
|
||||||
|
|
||||||
|
roguevizslide('0', [] () {
|
||||||
|
|
||||||
|
rogueviz::dftcolor = 0x206020FF;
|
||||||
|
|
||||||
|
rogueviz::showlabels = true;
|
||||||
|
|
||||||
|
rogueviz::on = true;
|
||||||
|
gmatrix.clear();
|
||||||
|
drawthemap();
|
||||||
|
gmatrix0 = gmatrix;
|
||||||
|
|
||||||
|
rogueviz::tree::read("rogueviz/treeoflife/tol.txt");
|
||||||
|
})},
|
||||||
|
{"THE END", 99, LEGAL_ANY | FINALSLIDE,
|
||||||
|
"Press '5' to leave the presentation.",
|
||||||
|
[] (presmode mode) {
|
||||||
|
firstland = euclidland = laIce;
|
||||||
|
if(mode == 4) restartGame('T');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
103
tour.cpp
103
tour.cpp
@ -11,25 +11,10 @@ string tourhelp;
|
|||||||
|
|
||||||
int currentslide;
|
int currentslide;
|
||||||
|
|
||||||
const int LEGAL_NONE=0;
|
|
||||||
const int LEGAL_UNLIMITED=1;
|
|
||||||
const int LEGAL_HYPERBOLIC=2;
|
|
||||||
const int LEGAL_ANY=3;
|
|
||||||
const int LEGAL_NONEUC=4;
|
|
||||||
const int QUICKSKIP=8;
|
|
||||||
const int FINALSLIDE=16;
|
|
||||||
|
|
||||||
// #ifdef PRES
|
// #ifdef PRES
|
||||||
// #include "presentation.cpp"
|
// #include "presentation.cpp"
|
||||||
// #else
|
// #else
|
||||||
|
|
||||||
struct slide {
|
|
||||||
const char *name; int unused_id; int flags; const char *help;
|
|
||||||
function<void(presmode mode)> action;
|
|
||||||
} ;
|
|
||||||
|
|
||||||
extern slide slides[];
|
|
||||||
|
|
||||||
// modes:
|
// modes:
|
||||||
// 1 - enter the slide
|
// 1 - enter the slide
|
||||||
// 2 - each frame
|
// 2 - each frame
|
||||||
@ -74,7 +59,7 @@ void presentation(presmode mode) {
|
|||||||
|
|
||||||
cheater = 0;
|
cheater = 0;
|
||||||
|
|
||||||
if(mode == pmStart) tourhelp = slides[currentslide].name;
|
if(mode == pmStart) tourhelp = XLAT(slides[currentslide].name);
|
||||||
|
|
||||||
if(sickmode && !items[itOrbTeleport]) items[itOrbTeleport] = 1;
|
if(sickmode && !items[itOrbTeleport]) items[itOrbTeleport] = 1;
|
||||||
if(mode == pmStart) slidecommand = "";
|
if(mode == pmStart) slidecommand = "";
|
||||||
@ -89,8 +74,8 @@ void presentation(presmode mode) {
|
|||||||
void slidehelp() {
|
void slidehelp() {
|
||||||
if(texts) {
|
if(texts) {
|
||||||
help =
|
help =
|
||||||
helptitle(slides[currentslide].name, 0xFF8000) +
|
helptitle(XLAT(slides[currentslide].name), 0xFF8000) +
|
||||||
slides[currentslide].help;
|
XLAT(slides[currentslide].help);
|
||||||
if(cmode != emHelp)
|
if(cmode != emHelp)
|
||||||
lastmode = cmode;
|
lastmode = cmode;
|
||||||
cmode = emHelp;
|
cmode = emHelp;
|
||||||
@ -115,8 +100,8 @@ bool handleKeyTour(int sym, int uni) {
|
|||||||
if(currentslide == 0) { slidehelp(); return true; }
|
if(currentslide == 0) { slidehelp(); return true; }
|
||||||
presentation(pmStop);
|
presentation(pmStop);
|
||||||
currentslide--;
|
currentslide--;
|
||||||
presentation(pmStart);
|
|
||||||
if(cmode == emHelp) slidehelp();
|
if(cmode == emHelp) slidehelp();
|
||||||
|
presentation(pmStart);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(sym == '1' || sym == '2' || sym == '3') {
|
if(sym == '1' || sym == '2' || sym == '3') {
|
||||||
@ -188,6 +173,11 @@ bool handleKeyTour(int sym, int uni) {
|
|||||||
canmove = true;
|
canmove = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else addMessage(
|
||||||
|
(vid.shifttarget&1) ?
|
||||||
|
"Shift-click a location to teleport there."
|
||||||
|
: "Click a location to teleport there."
|
||||||
|
);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if(sym == '5') {
|
if(sym == '5') {
|
||||||
@ -243,16 +233,12 @@ void start() {
|
|||||||
presentation(pmStartAll);
|
presentation(pmStartAll);
|
||||||
restartGame('T');
|
restartGame('T');
|
||||||
if(tour::on) {
|
if(tour::on) {
|
||||||
presentation(pmStart);
|
|
||||||
slidehelp();
|
slidehelp();
|
||||||
|
presentation(pmStart);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OTHERSLIDES
|
slide default_slides[] = {
|
||||||
#include "other-slides.cpp"
|
|
||||||
#else
|
|
||||||
|
|
||||||
slide slides[] = {
|
|
||||||
{"Introduction", 10, LEGAL_ANY | QUICKSKIP,
|
{"Introduction", 10, LEGAL_ANY | QUICKSKIP,
|
||||||
"This tutorial is mostly aimed to show what is "
|
"This tutorial is mostly aimed to show what is "
|
||||||
"special about the geometry used by HyperRogue. "
|
"special about the geometry used by HyperRogue. "
|
||||||
@ -266,8 +252,23 @@ slide slides[] = {
|
|||||||
if(mode == 1) {
|
if(mode == 1) {
|
||||||
if(tour::texts) addMessage(XLAT("Welcome to the HyperRogue tutorial!"));
|
if(tour::texts) addMessage(XLAT("Welcome to the HyperRogue tutorial!"));
|
||||||
else clearMessages();
|
else clearMessages();
|
||||||
}
|
}
|
||||||
SHOWLAND( l == laIce );
|
SHOWLAND( l == laIce );
|
||||||
|
#ifdef ROGUEVIZ
|
||||||
|
slidecommand = "RogueViz presentation";
|
||||||
|
if(mode == 1)
|
||||||
|
help +=
|
||||||
|
"\n\nYour version of HyperRogue is compiled with RogueViz. "
|
||||||
|
"Press '5' to switch to the RogueViz slides. Watching the "
|
||||||
|
"common HyperRogue tutorial first is useful too, "
|
||||||
|
"as an introduction to hyperbolic geometry.";
|
||||||
|
if(mode == 4) {
|
||||||
|
slides = rogueviz::rvtour::rvslides;
|
||||||
|
while(tour::on) restartGame('T', false);
|
||||||
|
firstland = euclidland = laPalace;
|
||||||
|
tour::start();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{"Basics of gameplay", 11, LEGAL_ANY,
|
{"Basics of gameplay", 11, LEGAL_ANY,
|
||||||
@ -294,7 +295,7 @@ slide slides[] = {
|
|||||||
{"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. "
|
||||||
#ifdef WEB
|
#ifdef WEB
|
||||||
"This is not true -- try the Tutorial in the native desktop version shows "
|
"This is not true -- the Tutorial in the native desktop version shows "
|
||||||
"the surface HyperRogue actually takes place on.",
|
"the surface HyperRogue actually takes place on.",
|
||||||
#else
|
#else
|
||||||
"This is not true -- the next slide will show the surface HyperRogue "
|
"This is not true -- the next slide will show the surface HyperRogue "
|
||||||
@ -326,7 +327,7 @@ slide slides[] = {
|
|||||||
#endif
|
#endif
|
||||||
SHOWLAND( l == laIce );
|
SHOWLAND( l == laIce );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{"Expansion", 22, LEGAL_ANY,
|
{"Expansion", 22, LEGAL_ANY,
|
||||||
"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 "
|
||||||
@ -649,49 +650,6 @@ slide slides[] = {
|
|||||||
if(mode == 3) pmodel = mdDisk;
|
if(mode == 3) pmodel = mdDisk;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
#ifdef ROGUEVIZ
|
|
||||||
{"Collatz conjecture", 51, LEGAL_NONE,
|
|
||||||
"Your version of HyperRogue includes RogueViz, which "
|
|
||||||
"is an adaptation of HyperRogue as a visualization tool "
|
|
||||||
"rather than a game. Hyperbolic space is great "
|
|
||||||
"for visualizing some kinds of data because of the vast amount "
|
|
||||||
"of space.\n\n"
|
|
||||||
"The following slide is a visualization of the Collatz conjecture. "
|
|
||||||
"Press '5' for a spiral rendering of the Collatz conjecture visualization.",
|
|
||||||
[] (presmode mode) {
|
|
||||||
setCanvas(mode, 'd');
|
|
||||||
if(mode == 1) {
|
|
||||||
rogueviz::dftcolor = 0x206020FF;
|
|
||||||
|
|
||||||
rogueviz::collatz::s2 = .3;
|
|
||||||
rogueviz::collatz::p2 = .5;
|
|
||||||
rogueviz::collatz::s3 = -.4;
|
|
||||||
rogueviz::collatz::p3 = .4;
|
|
||||||
|
|
||||||
rogueviz::showlabels = true;
|
|
||||||
|
|
||||||
rogueviz::on = true;
|
|
||||||
gmatrix.clear();
|
|
||||||
drawthemap();
|
|
||||||
gmatrix0 = gmatrix;
|
|
||||||
|
|
||||||
rogueviz::collatz::start();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(mode == 3) {
|
|
||||||
rogueviz::close();
|
|
||||||
shmup::clearMonsters();
|
|
||||||
}
|
|
||||||
|
|
||||||
slidecommand = "render spiral";
|
|
||||||
if(mode == 4) {
|
|
||||||
pmodel = mdBand, conformal::create(), conformal::rotation = 0,
|
|
||||||
conformal::createImage(true),
|
|
||||||
conformal::clear(), pmodel = mdDisk;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
#endif
|
|
||||||
#ifndef WEB
|
#ifndef WEB
|
||||||
{"Shoot'em up mode", 52, LEGAL_NONE,
|
{"Shoot'em up mode", 52, LEGAL_NONE,
|
||||||
"In the shoot'em up mode, space and time is continuous. "
|
"In the shoot'em up mode, space and time is continuous. "
|
||||||
@ -723,6 +681,7 @@ slide slides[] = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
slide *slides = default_slides;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user