camelot_monster() and emerald_monster() to prevent wandering monster generating incorrect monsters

This commit is contained in:
Zeno Rogue 2019-10-10 13:10:29 +02:00
parent 43f629e9c4
commit 51ffd708d0
3 changed files with 26 additions and 22 deletions

View File

@ -1571,6 +1571,16 @@ EX bool no_barriers_in_radius(cell *c, int rad) {
return true;
}
EX eMonster camelot_monster() {
eMonster ms[3] = { moHedge, moLancer, moFlailer };
eMonster m = ms[hrand(3)];
if(m == moHedge && VALENCE > 3)
m = moPyroCultist;
if(getDistLimit() <= 2 && m == moLancer) m = moGoblin;
if(getDistLimit() <= 3 && m == moPyroCultist) m = moCultist;
return m;
}
EX void buildCamelot(cell *c) {
int d = celldistAltRelative(c);
if(tactic::on || (d <= 14 && roundTableRadius(c) > 20)) {
@ -1614,14 +1624,8 @@ EX void buildCamelot(cell *c) {
}
if(d == 0) c->wall = waRoundTable;
if(celldistAlt(c) == 0 && !tactic::on) c->item = itHolyGrail;
if(d < 0 && hrand(7000) <= 10 + items[itHolyGrail] * 5) {
eMonster m[3] = { moHedge, moLancer, moFlailer };
c->monst = m[hrand(3)];
if(c->monst == moHedge && VALENCE > 3)
c->monst = moPyroCultist;
if(getDistLimit() <= 2 && c->monst == moLancer) c->monst = moGoblin;
if(getDistLimit() <= 3 && c->monst == moPyroCultist) c->monst = moCultist;
}
if(d < 0 && hrand(7000) <= 10 + items[itHolyGrail] * 5)
c->monst = camelot_monster();
if(d == 1) {
// roughly as many knights as table cells
if(hrand(1000000) < 1000000 / expansion.get_growth() && !reptilecheat)

View File

@ -143,6 +143,14 @@ EX void createArrowTrapAt(cell *c, eLand land) {
}
}
EX eMonster emerald_monster() {
static eMonster emeraldmonsters[4] = { moHedge, moLancer, moFlailer, moMiner };
eMonster m = emeraldmonsters[hrand(4)];
if(m == moHedge && (S3 != 3 || (hybri && !prod)))
m = moFlailer;
return m;
}
EX void build_pool(cell *c, bool with_boat) {
bool vacant = true;
if(c->monst || !among(c->wall, waNone, waSea, waBoat)) vacant = false;
@ -537,12 +545,8 @@ EX void giantLandSwitch(cell *c, int d, cell *from) {
for(int i=0; i<c->type; i++) if(c->move(i)->wall == waCavewall) ok = false;
if(ok) c->item = itEmerald;
}
if(hrand_monster(8000) < 50 + 10 * (items[itEmerald] + yendor::hardness())) {
static eMonster emeraldmonsters[4] = { moHedge, moLancer, moFlailer, moMiner };
c->monst = emeraldmonsters[hrand(4)];
if(c->monst == moHedge && (S3 != 3 || (hybri && !prod)))
c->monst = moFlailer;
}
if(hrand_monster(8000) < 50 + 10 * (items[itEmerald] + yendor::hardness()))
c->monst = emerald_monster();
if(sphere && c->type != 6 && c->master->fiftyval == 5) {
c->monst = moMiner;
c->stuntime = 7;

View File

@ -678,10 +678,8 @@ EX void wandering() {
else if(c->land == laMinefield && wchance(items[itBombEgg]-20, 400))
c->monst = moBomberbird;
else if(c->land == laEmerald && wchance(items[itEmerald], 5)) {
static eMonster m[4] = {moHedge, moLancer, moMiner, moFlailer};
c->monst = m[hrand(4)];
}
else if(c->land == laEmerald && wchance(items[itEmerald], 5))
c->monst = emerald_monster();
else if(c->land == laWineyard && wchance(items[itWine], 10)) {
c->monst = moVineBeast;
@ -710,10 +708,8 @@ EX void wandering() {
c->monst = eMonster(moWitch + hrand(NUMWITCH));
}
else if(c->land == laCamelot && hrand(30) == 0 && (euclid || c->master->alt) && celldistAltRelative(c) < 0) {
eMonster m[3] = { moHedge, moLancer, moFlailer };
c->monst = m[hrand(3)];
}
else if(c->land == laCamelot && hrand(30) == 0 && (euclid || c->master->alt) && celldistAltRelative(c) < 0)
c->monst = camelot_monster();
else if(isCrossroads(c->land) && items[itHyperstone] && wchance(items[itHyperstone], 20)) {
c->monst = wanderingCrossroadsMonster();