mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-09 15:39:55 +00:00
configurable colors in Prairie/Mountain/Ivory/Freefall/Yendorian stripes
This commit is contained in:
parent
f47f37ffd8
commit
f731fa88fb
@ -82,6 +82,26 @@ inline void drawcell(cell *c, const shiftmatrix& V) {
|
||||
static constexpr int trapcol[4] = {0x904040, 0xA02020, 0xD00000, 0x303030};
|
||||
static constexpr int terracol[8] = {0xD000, 0xE25050, 0xD0D0D0, 0x606060, 0x303030, 0x181818, 0x0080, 0x8080};
|
||||
|
||||
EX colortable prairie_colors = { 0x402000, 0x503000 };
|
||||
EX colortable mountain_colors = { 0x181008*2, 0x181008*4 };
|
||||
EX colortable tower_colors = { 0x202010, 0x404030 };
|
||||
EX colortable westwall_colors = { 0x211F6F, 0x413F8F };
|
||||
EX colortable endorian_colors = { 0x202010, 0x404030, 0x0000D0 };
|
||||
EX colortable canopy_colors = { 0x60C060, 0x489048 };
|
||||
EX colortable camelot_cheat_colors = { 0x606060, 0xC0C0C0 };
|
||||
|
||||
/** return the special colortable for the given cell -- color menu uses this to know that a colortable should be edited */
|
||||
EX colortable* special_colortable_for(cell *c) {
|
||||
if(c->land == laPrairie && prairie::isriver(c)) return &prairie_colors;
|
||||
if(c->land == laMountain && !c->wall && (eubinary || sphere || c->master->alt)) return &mountain_colors;
|
||||
if(c->land == laIvoryTower && !c->wall) return &tower_colors;
|
||||
if(c->land == laWestWall) return &westwall_colors;
|
||||
if(c->land == laEndorian && !c->wall) return &endorian_colors;
|
||||
if(c->land == laEndorian && c->wall == waCanopy) return &canopy_colors;
|
||||
if(c->land == laCamelot && camelotcheat) return &camelot_cheat_colors;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void celldrawer::addaura() {
|
||||
hr::addaura(tC0(V), darkened(aura_color), fd);
|
||||
}
|
||||
@ -259,7 +279,7 @@ void celldrawer::setcolors() {
|
||||
break;
|
||||
case laMountain:
|
||||
if(eubinary || sphere || c->master->alt)
|
||||
fcol = 0x181008 * flip_dark(celldistAlt(c), 2, 4);
|
||||
fcol = get_color_auto3(celldistAlt(c), mountain_colors);
|
||||
else fcol = 0;
|
||||
if(c->wall == waPlatform) wcol = 0xF0F0A0;
|
||||
break;
|
||||
@ -328,11 +348,11 @@ void celldrawer::setcolors() {
|
||||
break;
|
||||
|
||||
case laIvoryTower:
|
||||
fcol = 0x10101 * flip_dark(c->landparam, 32, 64) - 0x000010;
|
||||
fcol = get_color_auto3(c->landparam, tower_colors);
|
||||
break;
|
||||
|
||||
case laWestWall:
|
||||
fcol = 0x10101 * flip_dark(c->landparam, 0, 32) + floorcolors[c->land];
|
||||
fcol = get_color_auto3(c->landparam, westwall_colors);
|
||||
break;
|
||||
|
||||
case laDungeon: {
|
||||
@ -352,23 +372,21 @@ void celldrawer::setcolors() {
|
||||
case laEndorian: {
|
||||
int clev = pd_from->land == laEndorian ? edgeDepth(pd_from) : 0;
|
||||
// xcol = (c->landparam&1) ? 0xD00000 : 0x00D000;
|
||||
fcol = 0x10101 * flip_dark(c->landparam, 32, 64) - 0x000010;
|
||||
fcol = get_color_auto3(c->landparam, endorian_colors, 1);
|
||||
int ed = edgeDepth(c);
|
||||
int sr = get_sightrange_ambush();
|
||||
|
||||
if(clev == UNKNOWN || ed == UNKNOWN)
|
||||
fcol = 0x0000D0;
|
||||
fcol = endorian_colors.back();
|
||||
else {
|
||||
while(ed > clev + sr) ed -= 2;
|
||||
while(ed < clev - sr) ed += 2;
|
||||
fcol = gradient(fcol, 0x0000D0, clev-sr, ed, clev+sr);
|
||||
fcol = gradient(fcol, endorian_colors.back(), clev-sr, ed, clev+sr);
|
||||
}
|
||||
if(c->wall == waTrunk) fcol = winf[waTrunk].color;
|
||||
|
||||
if(c->wall == waCanopy || c->wall == waSolidBranch || c->wall == waWeakBranch) {
|
||||
fcol = winf[waCanopy].color;
|
||||
int f = flip_dark(c->landparam, 0, 2);
|
||||
if(f) fcol = gradient(0, fcol, 8, f, 0);
|
||||
fcol = get_color_auto3(c->landparam, canopy_colors);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -376,7 +394,7 @@ void celldrawer::setcolors() {
|
||||
#if CAP_FIELD
|
||||
case laPrairie:
|
||||
if(prairie::isriver(c)) {
|
||||
fcol = flip_dark(prairie::get_val(c), 0x402000, 0x503000);
|
||||
fcol = get_color_auto3(prairie::get_val(c), prairie_colors);
|
||||
}
|
||||
else {
|
||||
fcol = 0x004000 + 0x001000 * c->LHU.fi.walldist;
|
||||
@ -392,7 +410,7 @@ void celldrawer::setcolors() {
|
||||
#if CAP_TOUR
|
||||
if(!tour::on) camelotcheat = false;
|
||||
if(camelotcheat)
|
||||
fcol = 0x10101 * flip_dark(d, 0x60, 0xC0);
|
||||
fcol = get_color_auto3(d, camelot_cheat_colors);
|
||||
else
|
||||
#endif
|
||||
if(d < 0) {
|
||||
|
@ -1383,6 +1383,14 @@ EX void initConfig() {
|
||||
param_colortable(brownian::colors, "color:brown");
|
||||
#endif
|
||||
|
||||
param_colortable(prairie_colors, "color:prairie");
|
||||
param_colortable(mountain_colors, "color:mountain");
|
||||
param_colortable(tower_colors, "color:tower");
|
||||
param_colortable(westwall_colors, "color:freefall");
|
||||
param_colortable(endorian_colors, "color:endorian");
|
||||
param_colortable(canopy_colors, "color:canopy");
|
||||
param_colortable(camelot_cheat_colors, "color:camelotcheat");
|
||||
|
||||
for(int i=0; i<motypes; i++)
|
||||
param_color(minf[i].color, "color:monster:" + its(i), false);
|
||||
for(int i=0; i<ittypes; i++)
|
||||
@ -3653,6 +3661,7 @@ EX void show_color_dialog() {
|
||||
dialog::openColorDialog(minf[c->monst].color);
|
||||
else if(c->item)
|
||||
dialog::openColorDialog(iinf[c->item].color);
|
||||
else if(auto tab = special_colortable_for(c)) { pushScreen([tab] { edit_color_table(*tab); }); return; }
|
||||
else if(c->wall)
|
||||
dialog::openColorDialog(winf[c->wall == waMineMine ? waMineUnknown : c->wall].color);
|
||||
#if CAP_COMPLEX2
|
||||
|
17
graph.cpp
17
graph.cpp
@ -140,15 +140,20 @@ ld spina(cell *c, int dir) {
|
||||
return TAU * dir / c->type;
|
||||
}
|
||||
|
||||
/** @brief used to alternate colors depending on distance to something. In chessboard-patterned geometries, also use a third step */
|
||||
|
||||
EX int flip_dark(int f, int a0, int a1) {
|
||||
if(geosupport_chessboard()) {
|
||||
/** @brief used to alternate colors depending on distance to something. In chessboard-patterned geometries, automatically a third step.
|
||||
* In some cases, we want to avoid a number of colors in the table -- set @param subtract to the number of such colors.
|
||||
*/
|
||||
EX color_t get_color_auto3(int f, const colortable& ctab, int subtract IS(0)) {
|
||||
int size = ctab.size() - subtract;
|
||||
if(size < 1) return 0;
|
||||
if(geosupport_chessboard() && size == 2) {
|
||||
f = gmod(f, 3);
|
||||
return a0 + (a1-a0) * f / 2;
|
||||
if(f == 1)
|
||||
return gradient(ctab[0], ctab[1], 0, 1, 2);
|
||||
return ctab[f/2];
|
||||
}
|
||||
else
|
||||
return (f&1) ? a1 : a0;
|
||||
return ctab[gmod(f, size)];
|
||||
}
|
||||
|
||||
color_t fc(int ph, color_t col, int z) {
|
||||
|
Loading…
Reference in New Issue
Block a user