From e83d38e26768f2a3749356555d6bf7f718bdaeb4 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 6 Apr 2024 10:36:51 +0200 Subject: [PATCH] new land structure: excessive crossing walls --- barriers.cpp | 1 + landgen.cpp | 7 ++++--- landlock.cpp | 25 ++++++++++++++++++++++--- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/barriers.cpp b/barriers.cpp index 9e1e9692..4a10dea4 100644 --- a/barriers.cpp +++ b/barriers.cpp @@ -560,6 +560,7 @@ EX bool isbar4(cell *c) { EX bool barrier_cross(eLand l, eLand r) { if(l == laCrossroads3 || r == laCrossroads3) return hrand(100) < 66; + if(land_structure == lsCrossWalls) return hrand(100) < 90; if(isElemental(l) && isElemental(r)) return hrand(100) < 75; return false; } diff --git a/landgen.cpp b/landgen.cpp index a6aae266..d4bad54a 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -288,6 +288,7 @@ EX void gen_baby_tortoise(cell *c) { EX int rebalance_treasure(int x, int y, eLand l) { int res = ((tactic::on || quotient == 2 || daily::on) ? (y) : inv::on ? min(2*(y),x) : (x)); if(use_custom_land_list) res = (res * custom_land_treasure[l] + 50) / 100; + res *= ls::ls_mul(); return res; } @@ -1280,7 +1281,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { if(d == 8) { bool ok = c->landparam == 0; forCellEx(c2, c) if(c2->landparam) ok = false; - if(ok && hrand(doCross ?450:15000) < 20 + (2 * items[itMutant] + yendor::hardness()) && !safety) { + if(ok && hrand(doCross ?450:15000) < (20 + (2 * items[itMutant] + yendor::hardness())) * ls::ls_mul_big() && !safety) { if(!peace::on) c->item = itMutant; c->landparam = items[itMutant] + 5 + hrand(11); c->wall = waNone; @@ -2065,7 +2066,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { case laHunting: if(d == 7 && c->land == laHunting && !racing::on && !safety && !reptilecheat) { - if(hrand(1000) < 20) { + if(hrand(1000) < 20 * ls::ls_mul_big()) { if(openplains(c)) { if(hrand(2) == 0) { if(!items[itHunting]) { @@ -2273,7 +2274,7 @@ EX void giantLandSwitch(cell *c, int d, cell *from) { c->monst = moMonkey; else if(hrand_monster(80000) < 5 + items[itRuby] + yendor::hardness()) c->monst = moEagle; - else if(pseudohept_r(c) && c != currentmap->gamestart() && hrand_monster(4000) < 300 + items[itRuby] && !c->monst) { + else if(pseudohept_r(c) && c != currentmap->gamestart() && hrand_monster(4000) < (300 + items[itRuby]) * ls::ls_mul_big() && !c->monst) { int hardchance = items[itRuby] + yendor::hardness(); if(hardchance > 25) hardchance = 25; bool hardivy = hrand(100) < hardchance; diff --git a/landlock.cpp b/landlock.cpp index b087b364..d1b3b016 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, lsGUARD }; +enum eLandStructure { lsNiceWalls, lsChaos, lsPatchedChaos, lsTotalChaos, lsChaosRW, lsWallChaos, lsSingle, lsNoWalls, lsHorodisks, lsVoronoi, lsLandscape, lsCrossWalls, 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, lsLandscape); } +EX bool any_chaos() { return among(land_structure, lsChaos, lsPatchedChaos, lsWallChaos, lsTotalChaos, lsChaosRW, lsCrossWalls, lsLandscape); } EX bool std_chaos() { return land_structure == lsChaos; } -EX bool wall_chaos() { return land_structure == lsWallChaos; } +EX bool wall_chaos() { return among(land_structure, lsWallChaos, lsCrossWalls); } EX bool patched_chaos() { return land_structure == lsPatchedChaos; } EX bool any_order() { return among(land_structure, lsNiceWalls, lsNoWalls, lsHorodisks, lsVoronoi); } @@ -112,11 +112,26 @@ EX int chaoticity() { if(land_structure == lsChaos) return 40; if(land_structure == lsLandscape) return 35; if(land_structure == lsWallChaos) return 30; + if(land_structure == lsCrossWalls) return 32; if(land_structure == lsVoronoi) return 20; if(land_structure == lsSingle) return 0; return 10; } +/** a multiplier to make stuff more frequent in Wall Chaos and Cross Wall Chaos: treasure */ +EX int ls_mul() { + if(land_structure == lsWallChaos) return 2; + if(land_structure == lsCrossWalls) return 3; + return 1; + } + +/** a multiplier to make stuff more frequent in Wall Chaos and Cross Wall Chaos: even bigger */ +EX int ls_mul_big() { + if(land_structure == lsWallChaos) return 5; + if(land_structure == lsCrossWalls) return 10; + return 1; + } + EX bool tame_chaos() { return any_chaos() && chaoticity() < 35; } EX } @@ -144,6 +159,8 @@ EX string land_structure_name(bool which) { return XLAT("landscape"); case lsNoWalls: return XLAT("wall-less"); + case lsCrossWalls: + return XLAT("excessive crossing walls"); default: return "error structure"; } @@ -164,6 +181,8 @@ EX void fix_land_structure_choice() { land_structure = lsNoWalls; if(!nice_walls_available() && land_structure == lsWallChaos) land_structure = lsChaos; + if(!nice_walls_available() && land_structure == lsCrossWalls) + land_structure = lsChaos; if(ls::hv_structure() && (!hyperbolic || bt::in() || quotient)) land_structure = lsSingle; if(walls_not_implemented() && among(land_structure, lsChaos, lsNoWalls))