mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-27 14:37:16 +00:00
'remove faraway cells from the memory' option
This commit is contained in:
parent
91a07dd856
commit
8713d34d19
@ -142,6 +142,7 @@ void generateAlts(heptagon *h, int levs) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ho->alt = hm;
|
ho->alt = hm;
|
||||||
|
hm->cdata = (cdata*) ho;
|
||||||
if(levs) generateAlts(ho, levs-1);
|
if(levs) generateAlts(ho, levs-1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -199,6 +200,7 @@ heptagon *createAlternateMap(cell *c, int rad, hstate firststate, int special) {
|
|||||||
alt->c7 = NULL;
|
alt->c7 = NULL;
|
||||||
alt->alt = alt;
|
alt->alt = alt;
|
||||||
h->alt = alt;
|
h->alt = alt;
|
||||||
|
alt->cdata = (cdata*) h;
|
||||||
|
|
||||||
for(int d=rad; d>=0; d--) {
|
for(int d=rad; d>=0; d--) {
|
||||||
generateAlts(cx[d]->master);
|
generateAlts(cx[d]->master);
|
||||||
|
25
cell.cpp
25
cell.cpp
@ -839,6 +839,10 @@ void clearcell(cell *c) {
|
|||||||
heptagon deletion_marker;
|
heptagon deletion_marker;
|
||||||
|
|
||||||
void clearHexes(heptagon *at) {
|
void clearHexes(heptagon *at) {
|
||||||
|
if(at->c7 && at->cdata) {
|
||||||
|
delete at->cdata;
|
||||||
|
at->cdata = NULL;
|
||||||
|
}
|
||||||
if(at->c7) {
|
if(at->c7) {
|
||||||
if(!nonbitrunc) for(int i=0; i<S7; i++)
|
if(!nonbitrunc) for(int i=0; i<S7; i++)
|
||||||
clearcell(at->c7->mov[i]);
|
clearcell(at->c7->mov[i]);
|
||||||
@ -849,6 +853,10 @@ void clearHexes(heptagon *at) {
|
|||||||
void clearfrom(heptagon *at) {
|
void clearfrom(heptagon *at) {
|
||||||
queue<heptagon*> q;
|
queue<heptagon*> q;
|
||||||
q.push(at);
|
q.push(at);
|
||||||
|
if(at->alt && at->c7) {
|
||||||
|
printf("disconnect %p -> %p (from real)\n", at, at->alt);
|
||||||
|
at->alt->cdata = NULL;
|
||||||
|
}
|
||||||
at->alt = &deletion_marker;
|
at->alt = &deletion_marker;
|
||||||
//int maxq = 0;
|
//int maxq = 0;
|
||||||
while(!q.empty()) {
|
while(!q.empty()) {
|
||||||
@ -856,9 +864,21 @@ void clearfrom(heptagon *at) {
|
|||||||
// if(q.size() > maxq) maxq = q.size();
|
// if(q.size() > maxq) maxq = q.size();
|
||||||
q.pop();
|
q.pop();
|
||||||
DEBMEM ( printf("from %p\n", at); )
|
DEBMEM ( printf("from %p\n", at); )
|
||||||
|
if(!at->c7) {
|
||||||
|
heptagon *h = (heptagon*) at->cdata;
|
||||||
|
if(h) {
|
||||||
|
if(h->alt != at) printf("alt error :: h->alt = %p\n", h->alt);
|
||||||
|
cell *c = h->c7;
|
||||||
|
destroycellcontents(c);
|
||||||
|
forCellEx(c2, c) destroycellcontents(c2);
|
||||||
|
h->alt = NULL;
|
||||||
|
at->cdata = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
for(int i=0; i<S7; i++) if(at->move[i]) {
|
for(int i=0; i<S7; i++) if(at->move[i]) {
|
||||||
if(at->move[i]->alt != &deletion_marker)
|
if(at->move[i]->alt != &deletion_marker)
|
||||||
q.push(at->move[i]);
|
q.push(at->move[i]);
|
||||||
|
if(at->move[i]->alt && at->move[i]->c7) at->move[i]->alt->cdata = NULL;
|
||||||
at->move[i]->alt = &deletion_marker;
|
at->move[i]->alt = &deletion_marker;
|
||||||
DEBMEM ( printf("!mov %p [%p]\n", at->move[i], at->move[i]->move[at->spin(i)]); )
|
DEBMEM ( printf("!mov %p [%p]\n", at->move[i], at->move[i]->move[at->spin(i)]); )
|
||||||
if(at->move[i]->move[at->spin(i)] != NULL &&
|
if(at->move[i]->move[at->spin(i)] != NULL &&
|
||||||
@ -1381,8 +1401,11 @@ int celldistance(cell *c1, cell *c2) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void clearCellMemory() {
|
void clearCellMemory() {
|
||||||
for(int i=0; i<size(allmaps); i++) delete allmaps[i];
|
for(int i=0; i<size(allmaps); i++)
|
||||||
|
if(allmaps[i])
|
||||||
|
delete allmaps[i];
|
||||||
allmaps.clear();
|
allmaps.clear();
|
||||||
|
last_cleared = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto cellhooks = addHook(clearmemory, 500, clearCellMemory);
|
auto cellhooks = addHook(clearmemory, 500, clearCellMemory);
|
||||||
|
@ -1604,6 +1604,12 @@ const landtype linf[landtypes] = {
|
|||||||
{ 0x306030, "Ruined City", ruindesc},
|
{ 0x306030, "Ruined City", ruindesc},
|
||||||
{ 0x306030, "Magnetosphere", NODESCYET},
|
{ 0x306030, "Magnetosphere", NODESCYET},
|
||||||
{ 0x306030, "Jelly Kingdom", jellydesc},
|
{ 0x306030, "Jelly Kingdom", jellydesc},
|
||||||
|
{ 0xFF00FF, "Lost Memory",
|
||||||
|
"Because of the properties of hyperbolic geometry, it is extremely unlikely to randomly "
|
||||||
|
"get back to a faraway place you have been to. However, you have managed to get there "
|
||||||
|
"somehow. In the meantime, its memory has been cleared, since the 'remove faraway cells from the memory'"
|
||||||
|
" option was on."
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
struct landtacinfo { eLand l; int tries, multiplier; };
|
struct landtacinfo { eLand l; int tries, multiplier; };
|
||||||
|
@ -164,7 +164,7 @@ enum eWall { waNone, waIcewall, waBarrier, waFloorA, waFloorB, waCavewall, waCav
|
|||||||
waDock, waBurningDock, waRuinWall
|
waDock, waBurningDock, waRuinWall
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int landtypes = 83;
|
static const int landtypes = 84;
|
||||||
|
|
||||||
struct landtype {
|
struct landtype {
|
||||||
int color;
|
int color;
|
||||||
@ -191,7 +191,7 @@ enum eLand { laNone, laBarrier, laCrossroads, laDesert, laIce, laCaves, laJungle
|
|||||||
laMirrorOld,
|
laMirrorOld,
|
||||||
laVolcano, laBlizzard, laHunting, laTerracotta, laMercuryRiver,
|
laVolcano, laBlizzard, laHunting, laTerracotta, laMercuryRiver,
|
||||||
laDual, laSnakeNest, laDocks, laRuins, laMagnetic,
|
laDual, laSnakeNest, laDocks, laRuins, laMagnetic,
|
||||||
laSwitch
|
laSwitch, laMemory
|
||||||
};
|
};
|
||||||
|
|
||||||
enum eGeometry {gNormal, gEuclid, gSphere, gElliptic, gQuotient, gQuotient2, gTorus, gOctagon, g45, g46, g47, gSmallSphere, gTinySphere, gEuclidSquare, gGUARD};
|
enum eGeometry {gNormal, gEuclid, gSphere, gElliptic, gQuotient, gQuotient2, gTorus, gOctagon, g45, g46, g47, gSmallSphere, gTinySphere, gEuclidSquare, gGUARD};
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
#include "flags.cpp"
|
#include "flags.cpp"
|
||||||
#include "yendor.cpp"
|
#include "yendor.cpp"
|
||||||
#include "complex.cpp"
|
#include "complex.cpp"
|
||||||
|
#include "savemem.cpp"
|
||||||
#include "game.cpp"
|
#include "game.cpp"
|
||||||
#include "orbgen.cpp"
|
#include "orbgen.cpp"
|
||||||
#include "monstergen.cpp"
|
#include "monstergen.cpp"
|
||||||
|
@ -269,6 +269,8 @@ void initConfig() {
|
|||||||
addsaver(geom3::highdetail, "3D highdetail");
|
addsaver(geom3::highdetail, "3D highdetail");
|
||||||
addsaver(geom3::middetail, "3D middetail");
|
addsaver(geom3::middetail, "3D middetail");
|
||||||
|
|
||||||
|
addsaver(memory_saving_mode, "memory_saving_mode", (ISMOBILE || ISPANDORA) ? 1 : 0);
|
||||||
|
|
||||||
addsaver(rug::renderonce, "rug-renderonce");
|
addsaver(rug::renderonce, "rug-renderonce");
|
||||||
addsaver(rug::rendernogl, "rug-rendernogl");
|
addsaver(rug::rendernogl, "rug-rendernogl");
|
||||||
addsaver(rug::texturesize, "rug-texturesize");
|
addsaver(rug::texturesize, "rug-texturesize");
|
||||||
@ -665,6 +667,7 @@ void showGraphConfig() {
|
|||||||
dialog::addSelItem(XLAT("font scale"), its(fontscale), 'b');
|
dialog::addSelItem(XLAT("font scale"), its(fontscale), 'b');
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("sight range"), its(sightrange), 'r');
|
dialog::addSelItem(XLAT("sight range"), its(sightrange), 'r');
|
||||||
|
dialog::addSelItem(XLAT("remove faraway cells from memory"), its(memory_saving_mode), 'y');
|
||||||
|
|
||||||
dialog::addSelItem(XLAT("compass size"), its(vid.mobilecompasssize), 'c');
|
dialog::addSelItem(XLAT("compass size"), its(vid.mobilecompasssize), 'c');
|
||||||
|
|
||||||
@ -684,6 +687,8 @@ void showGraphConfig() {
|
|||||||
if(xuni == 'u') vid.particles = !vid.particles;
|
if(xuni == 'u') vid.particles = !vid.particles;
|
||||||
if(xuni == 'd') vid.graphglyph = (1+vid.graphglyph)%3;
|
if(xuni == 'd') vid.graphglyph = (1+vid.graphglyph)%3;
|
||||||
|
|
||||||
|
if(xuni == 'y') memory_saving_mode = !memory_saving_mode;
|
||||||
|
|
||||||
if(xuni == 'j') {
|
if(xuni == 'j') {
|
||||||
dialog::editNumber(whatever, -10, 10, 1, 0, XLAT("whatever"),
|
dialog::editNumber(whatever, -10, 10, 1, 0, XLAT("whatever"),
|
||||||
XLAT("Whatever."));
|
XLAT("Whatever."));
|
||||||
|
2
game.cpp
2
game.cpp
@ -7784,6 +7784,8 @@ bool movepcto(int d, int subdir, bool checkonly) {
|
|||||||
|
|
||||||
if(multi::players == 1) monstersTurn();
|
if(multi::players == 1) monstersTurn();
|
||||||
|
|
||||||
|
save_memory();
|
||||||
|
|
||||||
check_total_victory();
|
check_total_victory();
|
||||||
|
|
||||||
if(items[itWhirlpool] && cwt.c->land != laWhirlpool && !whirlpool::escaped) {
|
if(items[itWhirlpool] && cwt.c->land != laWhirlpool && !whirlpool::escaped) {
|
||||||
|
1
help.cpp
1
help.cpp
@ -715,6 +715,7 @@ void describeMouseover() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(c->wall && !(c->wall == waChasm && c->land == laDual && ctof(c)) &&
|
if(c->wall && !(c->wall == waChasm && c->land == laDual && ctof(c)) &&
|
||||||
|
!(c->land == laMemory) &&
|
||||||
!((c->wall == waFloorA || c->wall == waFloorB) && c->item)) {
|
!((c->wall == waFloorA || c->wall == waFloorB) && c->item)) {
|
||||||
out += ", "; out += XLAT1(winf[c->wall].name);
|
out += ", "; out += XLAT1(winf[c->wall].name);
|
||||||
|
|
||||||
|
@ -89,6 +89,7 @@ heptagon *buildHeptagon(heptagon *parent, int d, hstate s, int pard = 0, int fix
|
|||||||
h->c7 = NULL;
|
h->c7 = NULL;
|
||||||
h->emeraldval = 0;
|
h->emeraldval = 0;
|
||||||
h->fiftyval = 0;
|
h->fiftyval = 0;
|
||||||
|
h->cdata = NULL;
|
||||||
}
|
}
|
||||||
//generateEmeraldval(parent);
|
//generateEmeraldval(parent);
|
||||||
//generateEmeraldval(h);
|
//generateEmeraldval(h);
|
||||||
|
5
hyper.h
5
hyper.h
@ -165,7 +165,7 @@ struct heptagon {
|
|||||||
int fieldval;
|
int fieldval;
|
||||||
// evolution data
|
// evolution data
|
||||||
short rval0, rval1;
|
short rval0, rval1;
|
||||||
struct cdata *cdata;
|
struct cdata *cdata; // for alts, this contains the pointer to the original
|
||||||
// central cell
|
// central cell
|
||||||
cell *c7;
|
cell *c7;
|
||||||
// associated generator of alternate structure, for Camelot and horocycles
|
// associated generator of alternate structure, for Camelot and horocycles
|
||||||
@ -2492,3 +2492,6 @@ void mainloop();
|
|||||||
void clearAnimations();
|
void clearAnimations();
|
||||||
|
|
||||||
transmatrix rotmatrix(double rotation, int c0, int c1);
|
transmatrix rotmatrix(double rotation, int c0, int c1);
|
||||||
|
|
||||||
|
void destroycellcontents(cell *c);
|
||||||
|
extern heptagon *last_cleared;
|
||||||
|
@ -2142,6 +2142,12 @@ void giantLandSwitch(cell *c, int d, cell *from) {
|
|||||||
c->monst = moRatling;
|
c->monst = moRatling;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case laMemory:
|
||||||
|
c->wall = waChasm;
|
||||||
|
if(d == 7 && !c->monst && hrand(2000) < 4)
|
||||||
|
c->monst = moGhost;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +58,8 @@ int isNative(eLand l, eMonster m) {
|
|||||||
|
|
||||||
case laCrossroads: case laCrossroads2: case laCrossroads3: case laCrossroads4:
|
case laCrossroads: case laCrossroads2: case laCrossroads3: case laCrossroads4:
|
||||||
case laCrossroads5:
|
case laCrossroads5:
|
||||||
case laNone: case laBarrier: case laOceanWall: case laCanvas: return 0;
|
case laNone: case laBarrier: case laOceanWall: case laCanvas: case laMemory:
|
||||||
|
return 0;
|
||||||
|
|
||||||
case laEmerald:
|
case laEmerald:
|
||||||
return (m == moFlailer || m == moLancer || m == moMiner) ? 2 :
|
return (m == moFlailer || m == moLancer || m == moMiner) ? 2 :
|
||||||
@ -253,6 +254,7 @@ eItem treasureType(eLand l) {
|
|||||||
case laBarrier: return itNone;
|
case laBarrier: return itNone;
|
||||||
case laOceanWall: return itNone;
|
case laOceanWall: return itNone;
|
||||||
case laCanvas: return itNone;
|
case laCanvas: return itNone;
|
||||||
|
case laMemory: return itNone;
|
||||||
|
|
||||||
case laEmerald: return itEmerald;
|
case laEmerald: return itEmerald;
|
||||||
case laWineyard: return itWine;
|
case laWineyard: return itWine;
|
||||||
@ -478,7 +480,7 @@ bool landUnlocked(eLand l) {
|
|||||||
case laEAir: case laEEarth: case laEWater: case laEFire: case laElementalWall:
|
case laEAir: case laEEarth: case laEWater: case laEFire: case laElementalWall:
|
||||||
return elementalUnlocked();
|
return elementalUnlocked();
|
||||||
|
|
||||||
case laBarrier: case laNone: case laOceanWall: case laCanvas: case laCA:
|
case laBarrier: case laNone: case laOceanWall: case laCanvas: case laCA: case laMemory:
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
case laMirrorOld:
|
case laMirrorOld:
|
||||||
|
Loading…
Reference in New Issue
Block a user