diff --git a/bigstuff.cpp b/bigstuff.cpp index e45550bf..fadc6b94 100644 --- a/bigstuff.cpp +++ b/bigstuff.cpp @@ -1771,6 +1771,21 @@ EX void build_walls(cell *c, cell *from) { else if(good_for_wall(c) && isWarpedType(c->land) && hrand(10000) < 3000 && c->land && buildBarrierNowall(c, eLand(c->land ^ laWarpSea ^ laWarpCoast))) { } + + else if(land_structure == lsVineWalls) { + int ev = emeraldval(c); + if((ev | 11) == 43 && c->bardir == NODIR) { + for(int i=0; itype; i++) if(emeraldval(c->cmove(i)) == ev-4) { + bool oldleft = true; + for(int j=1; j<=3; j++) + if(c->modmove(i+j) && c->modmove(i+j)->mpdist < c->mpdist) + oldleft = false; + buildBarrierStrong(c, i, oldleft, getNewLand(c->land)); + extendBarrier(c); + } + } + return; + } else if(ls::single()) return; diff --git a/landgen.cpp b/landgen.cpp index d4bad54a..9cb62eaf 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -937,7 +937,13 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { case laTrollheim: if(fargen) { - if(hrand(50000) < (ls::tame_chaos() ? 1000: ls::any_chaos() ?50:5) && c->wall != waBarrier && celldist(c) >= 7 && !safety && !peace::on) { + int freq = + land_structure == lsVineWalls ? 10000 : + ls::wall_chaos() ? 2500 : + ls::tame_chaos() ? 1000 : + ls::any_chaos() ? 50 : + 5; + if(hrand(50000) < freq && c->wall != waBarrier && celldist(c) >= 7 && !safety && !peace::on) { bool okay = true; forCellCM(c2, c) forCellCM(c3, c2) forCellCM(c4, c3) forCellCM(c5, c4) { cell *cx = ls::any_chaos() ? c3 : c5; @@ -2278,7 +2284,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { int hardchance = items[itRuby] + yendor::hardness(); if(hardchance > 25) hardchance = 25; bool hardivy = hrand(100) < hardchance; - if((cgflags & qFRACTAL) ? buildIvy(c, 0, 2) : hat::in() ? buildIvy(c, 0, 4) : (hardivy ? buildIvy(c, 1, 9) : buildIvy(c, 0, c->type)) && !peace::on) + if(land_structure == lsVineWalls ? buildIvy(c, 0, 2) : (cgflags & qFRACTAL) ? buildIvy(c, 0, 2) : hat::in() ? buildIvy(c, 0, 4) : (hardivy ? buildIvy(c, 1, 9) : buildIvy(c, 0, c->type)) && !peace::on) c->item = itRuby; } } diff --git a/landlock.cpp b/landlock.cpp index d1b3b016..828897cb 100644 --- a/landlock.cpp +++ b/landlock.cpp @@ -81,7 +81,7 @@ EX eLand firstland = laIce; EX eLand specialland = laIce; #if HDR -enum eLandStructure { lsNiceWalls, lsChaos, lsPatchedChaos, lsTotalChaos, lsChaosRW, lsWallChaos, lsSingle, lsNoWalls, lsHorodisks, lsVoronoi, lsLandscape, lsCrossWalls, lsGUARD }; +enum eLandStructure { lsNiceWalls, lsChaos, lsPatchedChaos, lsTotalChaos, lsChaosRW, lsWallChaos, lsSingle, lsNoWalls, lsHorodisks, lsVoronoi, lsLandscape, lsCrossWalls, lsVineWalls, lsGUARD }; #endif EX eLandStructure land_structure; @@ -90,9 +90,9 @@ EX namespace ls { EX bool single() { return land_structure == lsSingle; } -EX bool any_chaos() { return among(land_structure, lsChaos, lsPatchedChaos, lsWallChaos, lsTotalChaos, lsChaosRW, lsCrossWalls, lsLandscape); } +EX bool any_chaos() { return among(land_structure, lsChaos, lsPatchedChaos, lsWallChaos, lsTotalChaos, lsChaosRW, lsCrossWalls, lsVineWalls, lsLandscape); } EX bool std_chaos() { return land_structure == lsChaos; } -EX bool wall_chaos() { return among(land_structure, lsWallChaos, lsCrossWalls); } +EX bool wall_chaos() { return among(land_structure, lsWallChaos, lsCrossWalls, lsVineWalls); } EX bool patched_chaos() { return land_structure == lsPatchedChaos; } EX bool any_order() { return among(land_structure, lsNiceWalls, lsNoWalls, lsHorodisks, lsVoronoi); } @@ -122,6 +122,7 @@ EX int chaoticity() { EX int ls_mul() { if(land_structure == lsWallChaos) return 2; if(land_structure == lsCrossWalls) return 3; + if(land_structure == lsVineWalls) return 3; return 1; } @@ -129,6 +130,7 @@ EX int ls_mul() { EX int ls_mul_big() { if(land_structure == lsWallChaos) return 5; if(land_structure == lsCrossWalls) return 10; + if(land_structure == lsVineWalls) return 10; return 1; } @@ -161,6 +163,8 @@ EX string land_structure_name(bool which) { return XLAT("wall-less"); case lsCrossWalls: return XLAT("excessive crossing walls"); + case lsVineWalls: + return XLAT("regular walls"); default: return "error structure"; } @@ -183,6 +187,8 @@ EX void fix_land_structure_choice() { land_structure = lsChaos; if(!nice_walls_available() && land_structure == lsCrossWalls) land_structure = lsChaos; + if(land_structure == lsVineWalls && (geometry != gNormal || !BITRUNCATED)) + land_structure = lsNiceWalls; if(ls::hv_structure() && (!hyperbolic || bt::in() || quotient)) land_structure = lsSingle; if(walls_not_implemented() && among(land_structure, lsChaos, lsNoWalls)) @@ -1171,7 +1177,7 @@ EX land_validity_t& land_validity(eLand l) { if(l == laWhirlwind && hyperbolic_not37) return pattern_incompatibility; - bool better_mirror = !geometry && STDVAR && !ls::hv_structure() && !among(land_structure, lsTotalChaos, lsPatchedChaos, lsLandscape); + bool better_mirror = !geometry && STDVAR && !ls::hv_structure() && !among(land_structure, lsTotalChaos, lsPatchedChaos, lsLandscape, lsVineWalls); // available only in non-standard geometries if(l == laMirrorOld && better_mirror)