redone the canvas coloring system

This commit is contained in:
Zeno Rogue 2024-05-05 20:15:53 +02:00
parent b8a7e6e093
commit ce825db2c0
11 changed files with 515 additions and 513 deletions

View File

@ -220,8 +220,7 @@ void ensure_geometry(eGeometryClass c) {
if(specialland != laCanvas) {
canvas_default_wall = waInvisibleFloor;
patterns::whichCanvas = 'g';
patterns::canvasback = 0xFFFFFF;
ccolor::set_plain(0xFFFFFF);
enable_canvas();
}
start_game();
@ -1283,7 +1282,7 @@ void connection_debugger() {
curvepoint(sh[0]);
color_t col = colortables['A'][id];
color_t col = ccolor::shape.ctab[id];
col = darkena(col, 0, 0xFF);
if(&p == &last) {

View File

@ -1340,11 +1340,12 @@ EX void enable(archimedean_tiling& arct) {
start_game();
}
function<void()> setcanvas(char c) {
return [c] () {
function<void()> setcanvas(ccolor::data& c) {
auto pc = &c;
return [pc] () {
stop_game();
enable_canvas();
patterns::whichCanvas = c;
ccolor::which = pc;
start_game();
};
}
@ -1467,9 +1468,9 @@ EX void show() {
dialog::addSelItem(XLAT("edge length"), current.get_class() == gcEuclid ? (fts(current.edgelength) + XLAT(" (arbitrary)")) : fts(current.edgelength), 0);
dialog::addItem(XLAT("color by symmetries"), 't');
dialog::add_action(setcanvas('A'));
dialog::add_action(setcanvas(ccolor::shape));
dialog::addItem(XLAT("color by symmetries (reversed tiles marked)"), 'r');
dialog::add_action(setcanvas('R'));
dialog::add_action(setcanvas(ccolor::shape_mirror));
}
else {
dialog::addBreak(100);
@ -1479,20 +1480,20 @@ EX void show() {
if(true) {
dialog::addItem(XLAT("color by sides"), 'u');
dialog::add_action(setcanvas('B'));
dialog::add_action(setcanvas(ccolor::sides));
}
if(geosupport_threecolor() == 2) {
dialog::addItem(XLAT("three colors"), 'w');
dialog::add_action(setcanvas('T'));
dialog::add_action(setcanvas(ccolor::threecolor));
}
else if(geosupport_football() == 2) {
dialog::addItem(XLAT("football"), 'w');
dialog::add_action(setcanvas('F'));
dialog::add_action(setcanvas(ccolor::football));
}
else if(geosupport_chessboard()) {
dialog::addItem(XLAT("chessboard"), 'w');
dialog::add_action(setcanvas('c'));
dialog::add_action(setcanvas(ccolor::chessboard));
}
else dialog::addBreak(100);

View File

@ -1050,8 +1050,8 @@ EX void initConfig() {
param_f(linepatterns::tree_starter, "tree_starter")
-> editable(0, 1, 0.05, "tree-drawing parameter", "How much of edges to draw for tree patterns (to show how the tree edges are oriented).", 't');
param_char(patterns::whichCanvas, "whichCanvas", 0);
param_i(patterns::rwalls, "randomwalls");
// param_char(patterns::whichCanvas, "whichCanvas", 0); %TODO
param_i(ccolor::rwalls, "randomwalls");
param_b(vid.grid, "grid");
param_b(models::desitter_projections, "desitter_projections", false);
@ -1347,7 +1347,7 @@ EX void initConfig() {
->set_extra(draw_crosshair);
param_b(mapeditor::drawplayer, "drawplayer");
param_color((color_t&) patterns::canvasback, "color:canvasback", false);
param_color((color_t&) ccolor::plain.ctab[0], "color:canvasback", false);
param_color(backcolor, "color:background", false);
param_color(forecolor, "color:foreground", false);
@ -1359,8 +1359,8 @@ EX void initConfig() {
param_color(stdgridcolor, "color:stdgrid", true);
param_f(vid.multiplier_grid, "mgrid", "mult:grid", 1);
param_color(dialog::dialogcolor, "color:dialog", false);
for(auto& p: colortables)
savecolortable(p.second, s0+"canvas"+p.first);
for(auto p: ccolor::all)
savecolortable(p->ctab, s0+"canvas:"+p->name);
savecolortable(distcolors, "distance");
savecolortable(minecolors, "mines");
#if CAP_COMPLEX2
@ -3456,7 +3456,7 @@ EX void refresh_canvas() {
int at = 0;
while(at < isize(cl.lst)) {
cell *c2 = cl.lst[at];
c2->landparam = patterns::generateCanvas(c2);
c2->landparam = ccolor::generateCanvas(c2);
at++;
forCellEx(c3, c2) cl.add(c3);
@ -3547,13 +3547,13 @@ EX void show_color_dialog() {
dialog::add_action([] () { dialog::openColorDialog(dialog::dialogcolor); dialog::colorAlpha = false; dialog::get_di().dialogflags |= sm::SIDE; });
dialog::addBreak(50);
if(specialland == laCanvas && colortables.count(patterns::whichCanvas)) {
if(specialland == laCanvas && ccolor::which->ctab.size()) {
dialog::addItem(XLAT("pattern colors"), 'P');
dialog::add_action_push([] { edit_color_table(colortables[patterns::whichCanvas], refresh_canvas, true); });
dialog::add_action_push([] { edit_color_table(ccolor::which->ctab, refresh_canvas, true); });
if(patterns::whichCanvas == 'R') {
if(ccolor::which == &ccolor::shape_mirror) {
dialog::addItem(XLAT("unreversed colors"), 'U');
dialog::add_action_push([] { edit_color_table(colortables['A'], refresh_canvas, true); });
dialog::add_action_push([] { edit_color_table(ccolor::shape.ctab, refresh_canvas, true); });
}
}
@ -3970,7 +3970,7 @@ EX int read_color_args() {
PHASEFROM(2); shift(); modelcolor = argcolor(32);
}
else if(argis("-apeirocolor")) {
PHASEFROM(2); shift(); patterns::apeirogonal_color = argcolor(32);
PHASEFROM(2); shift(); ccolor::apeirogonal_color = argcolor(32);
}
else if(argis("-ring")) {
PHASEFROM(2); shift(); ringcolor = argcolor(32);

View File

@ -1113,7 +1113,7 @@ EX void showEuclideanMenu() {
}
dialog::addBoolItem(XLAT("pattern"), specialland == laCanvas, 'p');
if(specialland == laCanvas) dialog::lastItem().value = patterns::whichCanvas;
if(specialland == laCanvas) dialog::lastItem().value = ccolor::which->name;
dialog::add_action_push(patterns::showPrePattern);
validity_info();
if(WDIM == 3) {

View File

@ -3066,7 +3066,7 @@ EX void setdist(cell *c, int d, cell *from) {
}
if(d == BARLEV && c->land == laCanvas) {
color_t col = patterns::generateCanvas(c);
color_t col = ccolor::generateCanvas(c);
c->landparam = col;
c->wall = canvas_default_wall;
if((GDIM == 3 || geom3::flipped) && (col & 0x1000000)) c->wall = waWaxWall;

View File

@ -746,14 +746,16 @@ EX namespace mapstream {
f.write(gen_wandering);
f.write(reptilecheat);
f.write(timerghost);
f.write(patterns::canvasback);
f.write(ccolor::plain.ctab[0]);
f.write(patterns::whichShape);
f.write(patterns::subpattern_flags);
f.write(patterns::whichCanvas);
char wc = '*';
f.write(wc);
f.write(ccolor::which->name);
f.write(patterns::displaycodes);
f.write(canvas_default_wall);
f.write(mapeditor::drawplayer);
if(patterns::whichCanvas == 'f') f.write(patterns::color_formula);
if(ccolor::which == &ccolor::formula) f.write(ccolor::color_formula);
f.write(canvasfloor);
f.write(canvasdark);
@ -946,15 +948,21 @@ EX namespace mapstream {
f.read(gen_wandering);
f.read(reptilecheat);
f.read(timerghost);
f.read(patterns::canvasback);
f.read(ccolor::plain.ctab[0]);
f.read(patterns::whichShape);
f.read(patterns::subpattern_flags);
f.read(patterns::whichCanvas);
char wc;
f.read(wc);
if(wc == '*') {
string name;
f.read(name);
for(auto& p: ccolor::all) if(p->name == name) ccolor::which = p;
}
f.read(patterns::displaycodes);
if(f.vernum >= 0xA816)
f.read(canvas_default_wall);
f.read(mapeditor::drawplayer);
if(patterns::whichCanvas == 'f') f.read(patterns::color_formula);
if(wc == 'f') f.read(ccolor::color_formula);
if(f.vernum >= 0xA90D) {
f.read(canvasfloor);
f.read(canvasdark);
@ -2744,8 +2752,7 @@ EX namespace mapeditor {
stop_game();
enable_canvas();
canvas_default_wall = waInvisibleFloor;
patterns::whichCanvas = 'g';
patterns::canvasback = 0xFFFFFF;
ccolor::set_plain(0xFFFFFF);
dtcolor = (forecolor << 8) | 255;
drawplayer = false;
vid.use_smart_range = 2;

View File

@ -1012,7 +1012,7 @@ EX void showStartMenu() {
stop_game();
enable_canvas();
cheater = true;
patterns::canvasback = 0xFFFFFF;
ccolor::set_plain(0xFFFFFF);
mapeditor::drawplayer = false;
start_game();
clearMessages();

View File

@ -78,7 +78,7 @@ void gamedata_all(gamedata& gd) {
gd.store(genrange_bonus);
gd.store(gamerange_bonus);
gd.store(targets);
gd.store(patterns::rwalls);
gd.store(ccolor::rwalls);
if(GOLDBERG) gd.store(gp::param);
callhooks(hooks_gamedata, &gd);
}

File diff suppressed because it is too large Load Diff

View File

@ -1329,14 +1329,13 @@ EX void showMenu() {
dialog::addBoolItem(XLATN("Canvas"), specialland == laCanvas, 'X');
dialog::add_action([] () {
bool inwhite = specialland == laCanvas && patterns::whichCanvas == 'g' && patterns::canvasback == 0xFFFFFF;
bool inwhite = specialland == laCanvas && ccolor::which == &ccolor::plain && ccolor::plain.ctab.size() == 1 && ccolor::plain.ctab[0] == 0xFFFFFF;
if(inwhite)
pushScreen(patterns::showPrePattern);
else {
stop_game();
enable_canvas();
patterns::whichCanvas = 'g';
patterns::canvasback = 0xFFFFFF;
ccolor::set_plain(0xFFFFFF);
start_game();
}
});

View File

@ -110,8 +110,8 @@ EX void slide_action(presmode mode, char key, string text, reaction_t act) {
help_extensions.push_back(help_extension{key, text, act});
}
EX void enable_canvas_backup(char canv) {
slide_backup(patterns::whichCanvas, canv);
EX void enable_canvas_backup(ccolor::data *canv) {
slide_backup(ccolor::which, canv);
slide_backup(firstland, laCanvas);
slide_backup(specialland, laCanvas);
slide_backup(land_structure);
@ -120,7 +120,7 @@ EX void enable_canvas_backup(char canv) {
}
/** \brief an auxiliary function to enable a visualization in the Canvas land */
EX void setCanvas(presmode mode, char canv) {
EX void setCanvas(presmode mode, ccolor::data *canv) {
if(mode == pmStart) {
gamestack::push();
enable_canvas_backup(canv);
@ -133,6 +133,10 @@ EX void setCanvas(presmode mode, char canv) {
}
}
EX void setCanvas(presmode mode, char c) {
setCanvas(mode, ccolor::legacy(c));
}
/** \brief static mode: we get Orbs of Teleport to use them instead of movement */
bool sickmode;
@ -638,7 +642,7 @@ EX slide default_slides[] = {
"The world of HyperRogue is tiled with hexagons "
"and heptagons; heptagons give extra space!\n\n",
[] (presmode mode) {
setCanvas(mode, 'F');
setCanvas(mode, &ccolor::football);
if(mode == 5) {
cwt.at->move(0)->monst = moRunDog;
cwt.at->move(1)->monst = moGoblin;
@ -700,7 +704,7 @@ EX slide default_slides[] = {
"running away in a straight line. "
"Press '2' to try the same in the Euclidean world -- it is impossible.",
[] (presmode mode) {
setCanvas(mode, 'F');
setCanvas(mode, &ccolor::football);
if(mode == 5) {
cwt.at->move(0)->monst = moRunDog;
cwt.at->move(1)->monst = moGoblin;
@ -861,7 +865,7 @@ EX slide default_slides[] = {
"Hyperbolic geometry yields much more interesting periodic patterns "
"than Euclidean.",
[] (presmode mode) {
setCanvas(mode, 't');
setCanvas(mode, &ccolor::zebra_stripes);
if(mode == 1)
patterns::displaycodes = true,
patterns::whichPattern = patterns::PAT_ZEBRA;
@ -895,7 +899,7 @@ EX slide default_slides[] = {
"On the following slide, the colors change smoothly in the whole infinite world. "
"Again, this works better than in Euclidean geometry.",
[] (presmode mode) {
setCanvas(mode, 'l');
setCanvas(mode, &ccolor::landscape);
SHOWLAND ( l == laCanvas );
}
},