diff --git a/game.cpp b/game.cpp index 46f3d586..10fd924b 100644 --- a/game.cpp +++ b/game.cpp @@ -7,7 +7,7 @@ int lastsafety; int mutantphase; int turncount; int rosewave, rosephase; -int avengers, mirrorspirits; +int avengers, mirrorspirits, wandering_jiangshi, jiangshi_on_screen; cell *lastmove; enum eLastmovetype {lmSkip, lmMove, lmAttack, lmSpecial, lmPush, lmTree}; @@ -2796,7 +2796,7 @@ void bfs() { hexsnakes.clear(); hadwhat = havewhat; - havewhat = 0; + havewhat = 0; jiangshi_on_screen = 0; snaketypes.clear(); if(!(hadwhat & HF_WARP)) { avengers = 0; } if(!(hadwhat & HF_MIRROR)) { mirrorspirits = 0; } @@ -2950,6 +2950,8 @@ void bfs() { havewhat |= HF_FAST; else if(c2->monst == moMutant) havewhat |= HF_MUTANT; + else if(c2->monst == moJiangshi) + jiangshi_on_screen++; else if(c2->monst == moOutlaw) havewhat |= HF_OUTLAW; else if(isGhostMover(c2->monst)) @@ -7555,6 +7557,10 @@ bool movepcto(int d, int subdir, bool checkonly) { if(m) { if((attackflags & AF_CRUSH) && !canAttack(cwt.c, moPlayer, c2, c2->monst, attackflags ^ AF_CRUSH ^ AF_MUSTKILL)) markOrb(itOrbSlaying); + if(c2->monst == moTerraWarrior && hrand(100) > 2 * items[itTerra]) { + if(hrand(2 + jiangshi_on_screen) < 2) + wandering_jiangshi++; + } attackMonster(c2, attackflags | AF_MSG, moPlayer); // salamanders are stunned for longer time when pushed into a wall if(c2->monst == moSalamander && (pushto == c2 || !pushto)) c2->stuntime = 10; diff --git a/landgen.cpp b/landgen.cpp index ca1b96b9..aa1a3b57 100644 --- a/landgen.cpp +++ b/landgen.cpp @@ -932,7 +932,9 @@ void giantLandSwitch(cell *c, int d, cell *from) { forCellEx(c2, c) if(c2->wall == waTerraWarrior) nearwarrior = true; if(nearwarrior && hrand(5000) < PT(130 + 2 * kills[moJiangshi], 260) && notDippingFor(itTerra)) c->item = itTerra; - if(hrand(20000) < 2 * (items[itTerra] + yendor::hardness())) + int t = 2 * (items[itTerra] + yendor::hardness()); + if(t < 60) t += (60-t) * (60 - t) / 120; + if(hrand(20000) < t) c->monst = moJiangshi; } break; diff --git a/monstergen.cpp b/monstergen.cpp index aee0b83e..f5d40dda 100644 --- a/monstergen.cpp +++ b/monstergen.cpp @@ -302,6 +302,7 @@ void wandering() { int seepcount = getSeepcount(); int ghostcount = getGhostcount(); if(cwt.c->land == laCA) ghostcount = 0; + bool genturn = hrand(100) < 30; if(cwt.c->land == laZebra && cwt.c->wall == waNone && wchance(items[itZebra], 20)) wanderingZebra(cwt.c); @@ -548,6 +549,9 @@ void wandering() { else if(c->land == laTerracotta && wchance(items[itTerra], 40)) c->monst = moJiangshi; + else if(c->land == laTerracotta && wandering_jiangshi && genturn) + wandering_jiangshi--, c->monst = moJiangshi; + else if(c->land == laSwitch && wchance(items[itSwitch], 80)) c->monst = active_switch();