mirror of
https://github.com/zenorogue/hyperrogue.git
synced 2024-11-23 21:07:17 +00:00
some rearranging, and NOWALL barriers now work in weirdhyperbolic
This commit is contained in:
parent
f4d134a692
commit
00d61aae1c
72
barriers.cpp
72
barriers.cpp
@ -1,12 +1,8 @@
|
||||
// This file implements routines related to barriers (Great Walls and similar).
|
||||
|
||||
bool buildBarrierNowall(cell *c, eLand l2, bool force = false);
|
||||
bool checkBarriersFront(cellwalker bb, int q, bool cross) {
|
||||
|
||||
bool checkBarriersBack(cellwalker bb, int q=5, bool cross = false);
|
||||
|
||||
bool checkBarriersFront(cellwalker bb, int q=5, bool cross = false) {
|
||||
|
||||
if(bb.c->type == 6)
|
||||
if(!ctof(bb.c))
|
||||
return false;
|
||||
|
||||
if(bb.c->mpdist < BARLEV) return false;
|
||||
@ -65,12 +61,11 @@ bool checkBarriersBack(cellwalker bb, int q, bool cross) {
|
||||
return checkBarriersFront(bb, q);
|
||||
}
|
||||
|
||||
const eLand NOWALLSEP = laNone;
|
||||
const eLand NOWALLSEP_USED = laWhirlpool;
|
||||
|
||||
bool checkBarriersNowall(cellwalker bb, int q, int dir, eLand l1=laNone, eLand l2=laNone) {
|
||||
if(bb.c->mpdist < BARLEV && l1 == laNone) return false;
|
||||
if(bb.c->bardir != NODIR && l1 == laNone) return false;
|
||||
// if(bb.c->mov[dir] && bb.c->mov[dir]->bardir != NODIR && l1 == laNone) return false;
|
||||
// if(bb.c->mov[dir] && bb.c->mov[dir]->mpdist < BARLEV && l1 == laNone) return false;
|
||||
|
||||
if(l1 != laNone) {
|
||||
bb.c->bardir = bb.spin; bb.c->barright = l2; bb.c->barleft = NOWALLSEP;
|
||||
@ -92,7 +87,12 @@ bool checkBarriersNowall(cellwalker bb, int q, int dir, eLand l1=laNone, eLand l
|
||||
}
|
||||
}
|
||||
|
||||
if(purehepta) {
|
||||
if(purehepta && S3==4) {
|
||||
cwspin(bb, dir);
|
||||
cwstep(bb);
|
||||
cwspin(bb, dir);
|
||||
}
|
||||
else if(purehepta) {
|
||||
cwspin(bb, 3*dir);
|
||||
cwstep(bb);
|
||||
cwspin(bb, -3*dir);
|
||||
@ -116,7 +116,7 @@ eWall getElementalWall(eLand l) {
|
||||
|
||||
void setbarrier(cell *c) {
|
||||
if(isSealand(c->barleft) && isSealand(c->barright)) {
|
||||
bool setbar = c->type == 7;
|
||||
bool setbar = ctof(c);
|
||||
if(c->barleft == laKraken || c->barright == laKraken)
|
||||
if(c->barleft != laWarpSea && c->barright != laWarpSea)
|
||||
setbar = !setbar;
|
||||
@ -260,8 +260,22 @@ void extendNowall(cell *c) {
|
||||
setland(cw.c, c->barright);
|
||||
}
|
||||
|
||||
if(purehepta && S3 == 4) {
|
||||
cwstep(cw);
|
||||
setland(cw.c, c->barright);
|
||||
cw.c->barleft = NOWALLSEP_USED;
|
||||
cw.c->barright = c->land;
|
||||
cw.c->bardir = cw.spin;
|
||||
cwstep(cw);
|
||||
}
|
||||
|
||||
for(int i=-1; i<2; i+=2) {
|
||||
if(purehepta) {
|
||||
if(purehepta && S3==4) {
|
||||
cwspin(cw, i);
|
||||
cwstep(cw);
|
||||
cwspin(cw, i);
|
||||
}
|
||||
else if(purehepta) {
|
||||
cwspin(cw, 3*i);
|
||||
cwstep(cw);
|
||||
cwspin(cw, -3*i);
|
||||
@ -270,21 +284,33 @@ void extendNowall(cell *c) {
|
||||
cwspin(cw, 2*i);
|
||||
cwstep(cw);
|
||||
}
|
||||
setland(cw.c, c->barright);
|
||||
if(cw.c->barleft != NOWALLSEP_USED) {
|
||||
cw.c->barleft = NOWALLSEP;
|
||||
cw.c->barright = c->land;
|
||||
if(c->barright == laNone) {
|
||||
printf("barright\n");
|
||||
}// NONEDEBUG
|
||||
setland(cw.c, c->barright);
|
||||
if(!purehepta) cwspin(cw, i);
|
||||
cw.c->bardir = cw.spin;
|
||||
if(!purehepta) cwspin(cw, -i);
|
||||
if(S3 == 4 && purehepta) {
|
||||
cw.c->barright = c->barright;
|
||||
cw.c->bardir = cw.spin;
|
||||
setland(cw.c, c->land);
|
||||
}
|
||||
else {
|
||||
setland(cw.c, c->barright);
|
||||
cw.c->barright = c->land;
|
||||
if(c->barright == laNone) {
|
||||
printf("barright\n");
|
||||
}// NONEDEBUG
|
||||
setland(cw.c, c->barright);
|
||||
if(!purehepta) cwspin(cw, i);
|
||||
cw.c->bardir = cw.spin;
|
||||
if(!purehepta) cwspin(cw, -i);
|
||||
}
|
||||
extendcheck(cw.c);
|
||||
extendBarrier(cw.c);
|
||||
}
|
||||
if(purehepta) {
|
||||
if(purehepta && S3==4) {
|
||||
cwspin(cw, -i);
|
||||
cwstep(cw);
|
||||
cwspin(cw, -i);
|
||||
}
|
||||
else if(purehepta) {
|
||||
cwspin(cw, 3*i);
|
||||
cwstep(cw);
|
||||
cwspin(cw, -3*i);
|
||||
@ -754,7 +780,7 @@ bool buildBarrierNowall(cell *c, eLand l2, bool force) {
|
||||
}
|
||||
|
||||
for(int i=0; i<3; i++) {
|
||||
int d = dtab[i];
|
||||
int d = (S3>3 && purehepta) ? (2+(i&1)) : dtab[i];
|
||||
if(force) d=1;
|
||||
cellwalker cw(c, d);
|
||||
|
||||
|
33
bigstuff.cpp
33
bigstuff.cpp
@ -4,8 +4,6 @@
|
||||
// * 'setland' routines for other geometries
|
||||
// * the buildBigStuff function which calls equidistant/(horo)cycle/barrier generators.
|
||||
|
||||
#define UNKNOWN 65535
|
||||
|
||||
// horocycles
|
||||
|
||||
int newRoundTableRadius() {
|
||||
@ -176,7 +174,7 @@ heptagon *createAlternateMap(cell *c, int rad, hstate firststate, int special) {
|
||||
}
|
||||
|
||||
heptagon *alt = new heptagon;
|
||||
allmaps.push_back(new hrmap_alternate(alt));
|
||||
allmaps.push_back(newAltMap(alt));
|
||||
//printf("new alt {%p}\n", alt);
|
||||
alt->s = firststate;
|
||||
alt->emeraldval = 0;
|
||||
@ -282,7 +280,6 @@ void generateTreasureIsland(cell *c) {
|
||||
|
||||
// equidistants
|
||||
|
||||
#define HAUNTED_RADIUS (purehepta?5:7)
|
||||
extern bool generatingEquidistant;
|
||||
|
||||
bool generatingEquidistant = false;
|
||||
@ -317,7 +314,7 @@ cell *buildAnotherEquidistant(cell *c, int radius) {
|
||||
return NULL;
|
||||
}
|
||||
cwstep(cw); cwspin(cw, 3);
|
||||
if(cw.c->type == 7 && hrand(2) == 0) cwspin(cw, 1);
|
||||
if(ctof(cw.c) && hrand(2) == 0) cwspin(cw, 1);
|
||||
}
|
||||
coastpath.push_back(cw.c);
|
||||
// printf("setdists\n");
|
||||
@ -354,8 +351,8 @@ cell *buildAnotherEquidistant(cell *c, int radius) {
|
||||
// prevent gravity anomalies
|
||||
if(c2->land != c->land) return NULL;
|
||||
|
||||
// else if(c->type == 7 && hrand(10000) < 20 && !isCrossroads(c->land) && gold() >= 200)
|
||||
if(c2->type == 7 && gold() >= R200 && hrand(10) < 2 && buildBarrierNowall(c2, laCrossroads4, true)) {
|
||||
// else if(ctof(c) && hrand(10000) < 20 && !isCrossroads(c->land) && gold() >= 200)
|
||||
if(ctof(c2) && gold() >= R200 && hrand(10) < 2 && buildBarrierNowall(c2, laCrossroads4, true)) {
|
||||
nowall = true;
|
||||
// raiseBuggyGeneration(c2, "check");
|
||||
// return;
|
||||
@ -557,7 +554,7 @@ void buildEquidistant(cell *c) {
|
||||
c->landflags = 1;
|
||||
}
|
||||
}
|
||||
if(c2 && c2->landparam < c->landparam && c2->landflags == 1 && c->type == 7) {
|
||||
if(c2 && c2->landparam < c->landparam && c2->landflags == 1 && ctof(c)) {
|
||||
cell *c3 = c->mov[(i+1)%7];
|
||||
if(c3 && c3->landparam < c->landparam && c3->landflags == 1) {
|
||||
c->wall = waTrunk;
|
||||
@ -882,24 +879,24 @@ void buildBigStuff(cell *c, cell *from) {
|
||||
|
||||
// buildgreatwalls
|
||||
|
||||
if(weirdhyperbolic) ; // barriers not implemented yet in weird hyperbolic
|
||||
if(celldist(c) < 3) ;
|
||||
|
||||
else if(chaosmode) {
|
||||
if(c->type == 7 && hrand(10000) < 9000 && c->land && !inmirror(c) && buildBarrierNowall(c, getNewLand(c->land)))
|
||||
if(ctof(c) && hrand(10000) < 9000 && c->land && !inmirror(c) && buildBarrierNowall(c, getNewLand(c->land)))
|
||||
{}
|
||||
else if(c->type == 7 && c->land == laMirror && hrand(10000) < 2000) {
|
||||
else if(ctof(c) && c->land == laMirror && hrand(10000) < 2000 && !weirdhyperbolic) {
|
||||
int bd = 2 + hrand(2) * 3;
|
||||
buildBarrier(c, bd, laMirrored);
|
||||
}
|
||||
}
|
||||
|
||||
else if(c->type == 7 && isWarped(c->land) && hrand(10000) < 3000 && c->land &&
|
||||
else if(ctof(c) && isWarped(c->land) && hrand(10000) < 3000 && c->land &&
|
||||
buildBarrierNowall(c, eLand(c->land ^ laWarpSea ^ laWarpCoast))) ;
|
||||
|
||||
else if(c->type == 7 && c->land == laCrossroads4 && hrand(10000) < 7000 && c->land &&
|
||||
else if(ctof(c) && c->land == laCrossroads4 && hrand(10000) < 7000 && c->land &&
|
||||
buildBarrierNowall(c, getNewLand(laCrossroads4))) ;
|
||||
|
||||
else if(c->type == 7 && hrand(I10000) < 20 && !generatingEquidistant && !yendor::on && !tactic::on && !isCrossroads(c->land) && gold() >= R200 &&
|
||||
else if(ctof(c) && hrand(I10000) < 20 && !generatingEquidistant && !yendor::on && !tactic::on && !isCrossroads(c->land) && gold() >= R200 &&
|
||||
!inmirror(c) && !isSealand(c->land) && !isHaunted(c->land) && !isGravityLand(c->land) &&
|
||||
(c->land != laRlyeh || rlyehComplete()) &&
|
||||
c->land != laTortoise && c->land != laPrairie && c->land &&
|
||||
@ -909,21 +906,23 @@ void buildBigStuff(cell *c, cell *from) {
|
||||
buildBarrierNowall(c, laCrossroads4) ;
|
||||
}
|
||||
|
||||
else if(weirdhyperbolic) ; // non-Nowall barriers not implemented yet in weird hyperbolic
|
||||
|
||||
else if(c->land == laCrossroads2 && !purehepta)
|
||||
buildCrossroads2(c);
|
||||
|
||||
else if(c->land == laPrairie && c->LHU.fi.walldist == 0) {
|
||||
for(int bd=0; bd<7; bd++) {
|
||||
int fval2 = createStep(c->master, bd)->fieldval;
|
||||
int wd = currfp.gmul(fval2, currfp.inverses[c->fval-1]);
|
||||
if(currfp.distwall[wd] == 0) {
|
||||
int wd = currfp_gmul(fval2, currfp_inverses(c->fval-1));
|
||||
if(currfp_distwall(wd) == 0) {
|
||||
buildBarrier(c, bd);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if(c->type == 7 && c->land && hrand(I10000) < (
|
||||
else if(ctof(c) && c->land && hrand(I10000) < (
|
||||
showoff ? (cwt.c->mpdist > 7 ? 0 : 10000) :
|
||||
inmirror(c) ? 0 :
|
||||
isGravityLand(c->land) ? 0 :
|
||||
|
Loading…
Reference in New Issue
Block a user