1
0
mirror of https://github.com/zenorogue/hyperrogue.git synced 2024-06-17 18:59:59 +00:00

in 3D geometries, patterns may create walls

This commit is contained in:
Zeno Rogue 2019-10-06 13:03:21 +02:00
parent f0ca277b10
commit 9850dd557e
3 changed files with 29 additions and 15 deletions

View File

@ -1872,14 +1872,24 @@ EX void refresh_canvas() {
} }
} }
EX void edit_color_table(colortable& ct, const reaction_t& r IS(reaction_t())) { EX void edit_color_table(colortable& ct, const reaction_t& r IS(reaction_t()), bool has_bit IS(false)) {
cmode = sm::SIDE; cmode = sm::SIDE;
gamescreen(0); gamescreen(0);
dialog::init(XLAT("colors & aura")); dialog::init(XLAT("colors & aura"));
for(int i=0; i<isize(ct); i++) { for(int i=0; i<isize(ct); i++) {
dialog::addColorItem(its(i), ct[i] << 8, 'a'+i); dialog::addColorItem(its(i), ct[i] << 8, 'a'+i);
dialog::add_action([i, &ct, r] () { dialog::openColorDialog(ct[i]); dialog::reaction = r; dialog::colorAlpha = false; dialog::dialogflags |= sm::SIDE; }); if(WDIM == 3 && has_bit && !(ct[i] & 0x1000000)) dialog::lastItem().value = XLAT("(no wall)");
dialog::add_action([i, &ct, r, has_bit] () {
if(WDIM == 3 && has_bit) {
ct[i] ^= 0x1000000;
if(!(ct[i] & 0x1000000)) return;
}
dialog::openColorDialog(ct[i]);
dialog::reaction = r;
dialog::colorAlpha = false;
dialog::dialogflags |= sm::SIDE;
});
} }
dialog::addBack(); dialog::addBack();
@ -1929,7 +1939,7 @@ EX void show_color_dialog() {
dialog::addBreak(50); dialog::addBreak(50);
if(specialland == laCanvas && colortables.count(patterns::whichCanvas)) { if(specialland == laCanvas && colortables.count(patterns::whichCanvas)) {
dialog::addItem(XLAT("pattern colors"), 'P'); dialog::addItem(XLAT("pattern colors"), 'P');
dialog::add_action_push([] { edit_color_table(colortables[patterns::whichCanvas], refresh_canvas); }); dialog::add_action_push([] { edit_color_table(colortables[patterns::whichCanvas], refresh_canvas, true); });
} }
if(cwt.at->land == laMinefield) { if(cwt.at->land == laMinefield) {

View File

@ -2663,9 +2663,11 @@ EX void setdist(cell *c, int d, cell *from) {
} }
if(d == BARLEV && c->land == laCanvas) { if(d == BARLEV && c->land == laCanvas) {
c->landparam = patterns::generateCanvas(c); color_t col = patterns::generateCanvas(c);
c->landparam = col;
if(canvas_invisible) if(canvas_invisible)
c->wall = waInvisibleFloor; c->wall = waInvisibleFloor;
if(WDIM == 3 && (col & 0x1000000)) c->wall = waWaxWall;
} }
#if CAP_FIELD #if CAP_FIELD

View File

@ -1451,14 +1451,14 @@ EX map<char, colortable> colortables = {
0x404040, 0x606060, 0x808080 0x404040, 0x606060, 0x808080
}}, }},
{'a', {0x800000, 0x503000, 0x206000, 0x007010, 0x004040, 0x001070, 0x200060, 0x500030}}, {'a', {0x800000, 0x503000, 0x206000, 0x007010, 0x004040, 0x001070, 0x200060, 0x500030}},
{'e', {0x404040, 0x800000, 0x008000, 0x000080 }}, {'e', {0x404040, 0x1800000, 0x1008000, 0x000080 }},
{'b', {0x404040, 0x800000, 0x008000, 0x000080 }}, {'b', {0x404040, 0x1800000, 0x1008000, 0x000080 }},
{'z', {0xC0C0C0, 0xE0E0E0, 0x404040, 0x606060 }}, {'z', {0x1C0C0C0, 0x1E0E0E0, 0x404040, 0x606060 }},
{'x', {0xC0C0C0, 0x800000, 0x008000, 0x000080 }}, {'x', {0xC0C0C0, 0x1800000, 0x1008000, 0x000080 }},
{'t', {0x804040, 0x408040, 0x404080, 0x808040 }}, {'t', {0x804040, 0x1408040, 0x404080, 0x1808040 }},
{'c', {0x202020, 0xC0C0C0}}, {'c', {0x202020, 0x1C0C0C0}},
{'F', {0xC0C0C0, 0x202020}}, {'F', {0x1C0C0C0, 0x202020}},
{'w', {0x303030, 0xC0C0C0}}, {'w', {0x303030, 0x1C0C0C0}},
{'v', {0xC00000, 0xC08000, 0xC0C000, 0x00C000, 0xC0C0, 0x00C0, 0xC000C0}}, {'v', {0xC00000, 0xC08000, 0xC0C000, 0x00C000, 0xC0C0, 0x00C0, 0xC000C0}},
}; };
@ -1475,7 +1475,9 @@ color_t random_landscape(cell *c, int mul, int div, int step, color_t base) {
col[1] /= div; col[1] /= div;
col[2] /= div; col[2] /= div;
if(ISWEB) for(int a=0; a<3; a++) col[a] = (col[a] + step/2) / step * step; if(ISWEB) for(int a=0; a<3; a++) col[a] = (col[a] + step/2) / step * step;
return (base + col[0] + (col[1] << 8) + (col[2] << 16)); color_t res = base + col[0] + (col[1] << 8) + (col[2] << 16);
if(WDIM == 3 && (getBits(c) & 1)) res |= 0x1000000;
return res;
} }
EX namespace patterns { EX namespace patterns {
@ -1579,7 +1581,7 @@ EX namespace patterns {
case 'g': case 'g':
return canvasback; return canvasback;
case 'r': case 'r':
return hrand(0xFFFFFF + 1); return hrand(0x1FFFFFF + 1);
case 'e': case 'e':
return colortables['e'][emeraldval(c)]; return colortables['e'][emeraldval(c)];
case 'a': { case 'a': {
@ -1637,7 +1639,7 @@ EX namespace patterns {
gamescreen(0); gamescreen(0);
dialog::init("predesigned patterns"); dialog::init("predesigned patterns");
dialog::addItem(XLAT("single color"), 'g'); dialog::addItem(WDIM == 3 ? XLAT("empty") : XLAT("single color"), 'g');
dialog::addItem(XLAT("random colors"), 'r'); dialog::addItem(XLAT("random colors"), 'r');
dialog::addItem(XLAT("distance from origin"), 'M'); dialog::addItem(XLAT("distance from origin"), 'M');