mirror of
https://codeberg.org/noisytoot/notnotdnethack.git
synced 2025-08-06 12:45:25 +01:00
"Light" Chaos 1 improvements
Add doom knights instead of named "black knight" player mons. -Starting equip pending <_<' -Doom knights cast spells on 25% of moves --Inflict blindness --Vulnerability --Flare --Drain life (ought to be death touch, but...) -rarely spawn in Tiamat's area. Add special intrinsics to the crystals -Each crystal grants knowledge of a spell --Air: Lightning bolt --Fire: Fireball --Water: Cone of cold --Earth: Digging --Black: Hast self, extra healing, reduced spell failure -Each crystal grants skills (+1 cur and max (capped at expert or grand master)) --Air: Axe, healing, attack, dagger --Fire: Long sword, bow, wand, matter --Water: Hammer, spear, broad, cleric, music --Earth: Attack, healing, cleric, dagger --Black: Two-handed sword The fiends buff Chaos if not killed before confronting Chaos -Lich --Weaken stats replaced with death touch --Ice storm replaced with spacewarp --Earthquake replaced with a second casting of flare -Kary --Chaos gets +3 speed --Chaos spawns with weapons (this bonus is not lost if Kary is later killed!) --Claw attacks (3rd and 4th) become marilith hands --Fire pillar replaced with stun -Kraken --Passive attacks (from Chaos's extra faces. Unholy bite, study gaze, bad luck or curse items, blinding spit. ---Kraken also gets passive tentacle attacks (up to 8x, stay out of melee!) --Geyser replaced with ice storm -Tiamat -- -6 AC and +4 DR --Most ranged weapons are blown back at attacker ---Ditto for Tiamat herself --Poison gas replaced with plague Set fiend HP to fixed values (they varried wildly before) -Lich: 500 -Kary: 700 -Kraken: 900 -Tiamat: 1100 -Chaos: 2000 --Chaos's healing spell is very significant now (999), so PCs without good DPR will no longer be able to gradually whittle Chaos down, and should therefore retreat. ---Because of the spell rotation, he will cast this no more frequently than once per seven turns Chaos and Kary don't gate in help. All fiends are marked "Lord" or "Prince" as applicable. -Other demon lord summoning also shouldn't pull Chaos and Kary Switched all fiends to extramission -Kraken's derpy movement may be because he can't see you. -Kraken and krakens get scent. Quest monster gen checks G_GONE instead of just G_GENOD
This commit is contained in:
parent
0e473859ec
commit
63dcc92dd4
18 changed files with 563 additions and 163 deletions
|
@ -661,15 +661,11 @@ DOOR:locked,(35,14)
|
|||
DOOR:closed,(35,16)
|
||||
DOOR:locked,(54,10)
|
||||
|
||||
MONSTER: '@', "knight", (15,9), hostile, "Black Knight"
|
||||
OBJECT: '[', "plate mail", (15,9)
|
||||
MONSTER: '@', "knight", (15,11), hostile, "Black Knight"
|
||||
OBJECT: '[', "plate mail", (15,11)
|
||||
MONSTER: '@', "doom knight", (15,9), hostile
|
||||
MONSTER: '@', "doom knight", (15,11), hostile
|
||||
|
||||
MONSTER: '@', "knight", (55,9), hostile, "Black Knight"
|
||||
OBJECT: '[', "plate mail", (55,09)
|
||||
MONSTER: '@', "knight", (55,11), hostile, "Black Knight"
|
||||
OBJECT: '[', "plate mail", (55,11)
|
||||
MONSTER: '@', "doom knight", (55,9), hostile
|
||||
MONSTER: '@', "doom knight", (55,11), hostile
|
||||
|
||||
MAZE:"chaosfrh",' '
|
||||
FLAGS: nommap,hardfloor, shortsighted
|
||||
|
|
|
@ -1412,7 +1412,7 @@ A("The Black Crystal", CRYSTAL_BALL, (const char *)0,
|
|||
NO_MONS(),
|
||||
ATTK(AD_PHYS, 3, 0), (ARTA_HATES|ARTA_CROSSA),
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(ANTIMAGIC, WARNING), NOFLAG,
|
||||
PROPS(ANTIMAGIC, WARNING, BLACK_CRYSTAL), NOFLAG,
|
||||
SHADOW_FLARE, NOFLAG
|
||||
),
|
||||
A("The Water Crystal", CRYSTAL_BALL, (const char *)0,
|
||||
|
@ -1421,7 +1421,7 @@ A("The Water Crystal", CRYSTAL_BALL, (const char *)0,
|
|||
NO_MONS(),
|
||||
NO_ATTK(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(COLD_RES), NOFLAG,
|
||||
PROPS(COLD_RES, WATER_CRYSTAL), NOFLAG,
|
||||
BLIZAGA, NOFLAG
|
||||
),
|
||||
A("The Fire Crystal", CRYSTAL_BALL, (const char *)0,
|
||||
|
@ -1430,7 +1430,7 @@ A("The Fire Crystal", CRYSTAL_BALL, (const char *)0,
|
|||
NO_MONS(),
|
||||
NO_ATTK(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(FIRE_RES), NOFLAG,
|
||||
PROPS(FIRE_RES, FIRE_CRYSTAL), NOFLAG,
|
||||
FIRAGA, NOFLAG
|
||||
),
|
||||
A("The Earth Crystal", CRYSTAL_BALL, (const char *)0,
|
||||
|
@ -1439,7 +1439,7 @@ A("The Earth Crystal", CRYSTAL_BALL, (const char *)0,
|
|||
NO_MONS(),
|
||||
NO_ATTK(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(HALF_PHDAM), NOFLAG,
|
||||
PROPS(HALF_PHDAM, EARTH_CRYSTAL), NOFLAG,
|
||||
QUAKE, NOFLAG
|
||||
),
|
||||
A("The Air Crystal", CRYSTAL_BALL, (const char *)0,
|
||||
|
@ -1448,7 +1448,7 @@ A("The Air Crystal", CRYSTAL_BALL, (const char *)0,
|
|||
NO_MONS(),
|
||||
NO_ATTK(), NOFLAG,
|
||||
PROPS(), NOFLAG,
|
||||
PROPS(SHOCK_RES), NOFLAG,
|
||||
PROPS(SHOCK_RES, AIR_CRYSTAL), NOFLAG,
|
||||
THUNDAGA, NOFLAG
|
||||
),
|
||||
|
||||
|
|
|
@ -31,8 +31,10 @@ E time_t NDECL(get_realtime);
|
|||
#endif
|
||||
E void NDECL(dogoat);
|
||||
E void FDECL(dogoat_mon, (struct monst *));
|
||||
E void FDECL(dochaos_mon, (struct monst *));
|
||||
E void FDECL(dohost_mon, (struct monst *));
|
||||
E void FDECL(dosnake, (struct monst *));
|
||||
E void FDECL(dokraken_mon, (struct monst *));
|
||||
E void FDECL(dotailslap, (struct monst *));
|
||||
E void FDECL(dovines, (struct monst *));
|
||||
E void FDECL(dostarblades, (struct monst *));
|
||||
|
|
|
@ -614,6 +614,8 @@
|
|||
#define gates_in_help(ptr) ((is_demon((ptr)) || is_minion((ptr))) \
|
||||
&& !is_auton(ptr) \
|
||||
&& (ptr)->mtyp != PM_OONA \
|
||||
&& (ptr)->mtyp != PM_CHAOS \
|
||||
&& (ptr)->mtyp != PM_KARY__THE_FIEND_OF_FIRE \
|
||||
&& (ptr)->mtyp != PM_BALROG \
|
||||
&& (ptr)->mtyp != PM_DURIN_S_BANE \
|
||||
&& (ptr)->mtyp != PM_SUCCUBUS \
|
||||
|
|
|
@ -129,7 +129,12 @@
|
|||
#define SHATTERING 1 + DARKVISION_ONLY
|
||||
#define DIMENSION_LOCK 1 + SHATTERING
|
||||
#define WALKING_NIGHTMARE 1 + DIMENSION_LOCK
|
||||
#define LAST_PROP (WALKING_NIGHTMARE)
|
||||
#define FIRE_CRYSTAL 1 + WALKING_NIGHTMARE
|
||||
#define WATER_CRYSTAL 1 + FIRE_CRYSTAL
|
||||
#define EARTH_CRYSTAL 1 + WATER_CRYSTAL
|
||||
#define AIR_CRYSTAL 1 + EARTH_CRYSTAL
|
||||
#define BLACK_CRYSTAL 1 + AIR_CRYSTAL
|
||||
#define LAST_PROP (BLACK_CRYSTAL)
|
||||
|
||||
#define MPROP_SIZE (LAST_PROP/32 + 1)
|
||||
|
||||
|
|
|
@ -590,6 +590,26 @@
|
|||
#define ESpellboost u.uprops[SPELLBOOST].extrinsic
|
||||
#define Spellboost (HSpellboost || ESpellboost)
|
||||
|
||||
#define HFire_crystal u.uprops[FIRE_CRYSTAL].intrinsic
|
||||
#define EFire_crystal u.uprops[FIRE_CRYSTAL].extrinsic
|
||||
#define Fire_crystal (HFire_crystal || EFire_crystal)
|
||||
|
||||
#define HWater_crystal u.uprops[WATER_CRYSTAL].intrinsic
|
||||
#define EWater_crystal u.uprops[WATER_CRYSTAL].extrinsic
|
||||
#define Water_crystal (HWater_crystal || EWater_crystal)
|
||||
|
||||
#define HAir_crystal u.uprops[AIR_CRYSTAL].intrinsic
|
||||
#define EAir_crystal u.uprops[AIR_CRYSTAL].extrinsic
|
||||
#define Air_crystal (HAir_crystal || EAir_crystal)
|
||||
|
||||
#define HEarth_crystal u.uprops[EARTH_CRYSTAL].intrinsic
|
||||
#define EEarth_crystal u.uprops[EARTH_CRYSTAL].extrinsic
|
||||
#define Earth_crystal (HEarth_crystal || EEarth_crystal)
|
||||
|
||||
#define HBlack_crystal u.uprops[BLACK_CRYSTAL].intrinsic
|
||||
#define EBlack_crystal u.uprops[BLACK_CRYSTAL].extrinsic
|
||||
#define Black_crystal (HBlack_crystal || EBlack_crystal)
|
||||
|
||||
#define HSterile u.uprops[STERILE].intrinsic
|
||||
#define ESterile u.uprops[STERILE].extrinsic
|
||||
#define Sterile ((HSterile || ESterile) && !GoodHealth)
|
||||
|
|
161
src/allmain.c
161
src/allmain.c
|
@ -5186,6 +5186,93 @@ struct monst *magr;
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
dochaos_mon(magr)
|
||||
struct monst *magr;
|
||||
{
|
||||
struct monst *mdef;
|
||||
extern const int clockwisex[8];
|
||||
extern const int clockwisey[8];
|
||||
int i = rnd(8),j;
|
||||
int ax, ay;
|
||||
struct attack symbiote = { AT_BITE, AD_UNHY, 5, 4 };
|
||||
boolean youagr = (magr == &youmonst);
|
||||
boolean youdef;
|
||||
struct permonst *pa;
|
||||
|
||||
pa = youagr ? youracedata : magr->data;
|
||||
|
||||
//mostly uses default 5d4 damage dice
|
||||
switch(rnd(4)){
|
||||
//1: Bite
|
||||
case 2:
|
||||
symbiote.aatyp = AT_GAZE;
|
||||
symbiote.adtyp = AD_STDY;
|
||||
break;
|
||||
case 3:
|
||||
//Bad luck, curse items
|
||||
symbiote.aatyp = AT_MAGC;
|
||||
symbiote.adtyp = AD_CLRC;
|
||||
break;
|
||||
case 4:
|
||||
symbiote.aatyp = AT_SPIT;
|
||||
symbiote.adtyp = AD_BLND;
|
||||
symbiote.damn = 0;
|
||||
symbiote.damd = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
//Attack all surrounding foes
|
||||
for(j=8;j>=1;j--){
|
||||
ax = x(magr)+clockwisex[(i+j)%8];
|
||||
ay = y(magr)+clockwisey[(i+j)%8];
|
||||
if(youagr && u.ustuck && u.uswallow)
|
||||
mdef = u.ustuck;
|
||||
else if(!isok(ax, ay))
|
||||
continue;
|
||||
else if(onscary(ax, ay, magr))
|
||||
continue;
|
||||
else mdef = m_at(ax, ay);
|
||||
|
||||
if(u.ux == ax && u.uy == ay)
|
||||
mdef = &youmonst;
|
||||
|
||||
if(!mdef)
|
||||
continue;
|
||||
|
||||
youdef = (mdef == &youmonst);
|
||||
|
||||
if(youagr && (mdef->mpeaceful))
|
||||
continue;
|
||||
if(youdef && (magr->mpeaceful))
|
||||
continue;
|
||||
if(!youagr && !youdef && ((mdef->mpeaceful == magr->mpeaceful) || (!!mdef->mtame == !!magr->mtame)))
|
||||
continue;
|
||||
|
||||
if(!youdef && imprisoned(mdef))
|
||||
continue;
|
||||
|
||||
if(symbiote.aatyp != AT_MAGC && symbiote.aatyp != AT_GAZE && symbiote.aatyp != AT_SPIT){
|
||||
if((touch_petrifies(mdef->data)
|
||||
|| mdef->mtyp == PM_MEDUSA)
|
||||
&& (youagr ? !Stone_resistance : !resists_ston(magr))
|
||||
) continue;
|
||||
|
||||
if(mdef->mtyp == PM_PALE_NIGHT)
|
||||
continue;
|
||||
}
|
||||
|
||||
if(symbiote.aatyp == AT_MAGC)
|
||||
cast_spell(magr, mdef, &symbiote, rn2(2) ? EVIL_EYE : CURSE_ITEMS, x(mdef), y(mdef));
|
||||
else if(symbiote.aatyp == AT_GAZE)
|
||||
xgazey(magr, mdef, &symbiote, -1);
|
||||
else if(symbiote.aatyp == AT_SPIT)
|
||||
xspity(magr, &symbiote, ax, ay);
|
||||
else
|
||||
xmeleehity(magr, mdef, &symbiote, (struct obj **)0, -1, 0, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
dohost_mon(magr)
|
||||
struct monst *magr;
|
||||
|
@ -5541,6 +5628,80 @@ struct monst *magr;
|
|||
}
|
||||
}
|
||||
|
||||
void
|
||||
dokraken_mon(magr)
|
||||
struct monst *magr;
|
||||
{
|
||||
struct monst *mdef;
|
||||
extern const int clockwisex[8];
|
||||
extern const int clockwisey[8];
|
||||
int i = rnd(8),j;
|
||||
int mult = 1;
|
||||
int ax, ay;
|
||||
struct attack * attk;
|
||||
struct attack attkbuff = {0};
|
||||
boolean youagr = (magr == &youmonst);
|
||||
boolean youdef;
|
||||
struct permonst *pa;
|
||||
int max = 8;
|
||||
|
||||
pa = youagr ? youracedata : magr->data;
|
||||
|
||||
// get attack from statblock
|
||||
attk = mon_get_attacktype(magr, AT_TENT, &attkbuff);
|
||||
if(!attk)
|
||||
return;
|
||||
|
||||
//1-8 tentacles attack, up to all of which can be vs. one target
|
||||
max = mult = rnd(8);
|
||||
|
||||
//Attack all surrounding foes
|
||||
for(j=8*mult;j>=1;j--){
|
||||
ax = x(magr)+clockwisex[(i+j)%8];
|
||||
ay = y(magr)+clockwisey[(i+j)%8];
|
||||
if(youagr && u.ustuck && u.uswallow)
|
||||
mdef = u.ustuck;
|
||||
else if(!isok(ax, ay))
|
||||
continue;
|
||||
else if(onscary(ax, ay, magr))
|
||||
continue;
|
||||
else mdef = m_at(ax, ay);
|
||||
|
||||
if(u.ux == ax && u.uy == ay)
|
||||
mdef = &youmonst;
|
||||
|
||||
if(!mdef)
|
||||
continue;
|
||||
|
||||
youdef = (mdef == &youmonst);
|
||||
|
||||
if(youagr && (mdef->mpeaceful))
|
||||
continue;
|
||||
if(youdef && (magr->mpeaceful))
|
||||
continue;
|
||||
if(!youagr && !youdef && ((mdef->mpeaceful == magr->mpeaceful) || (!!mdef->mtame == !!magr->mtame)))
|
||||
continue;
|
||||
|
||||
if(!youdef && imprisoned(mdef))
|
||||
continue;
|
||||
|
||||
if(attk->aatyp != AT_MAGC && attk->aatyp != AT_GAZE){
|
||||
if((touch_petrifies(mdef->data)
|
||||
|| mdef->mtyp == PM_MEDUSA)
|
||||
&& (youagr ? !Stone_resistance : !resists_ston(magr))
|
||||
) continue;
|
||||
|
||||
if(mdef->mtyp == PM_PALE_NIGHT)
|
||||
continue;
|
||||
}
|
||||
|
||||
xmeleehity(magr, mdef, attk, (struct obj **)0, -1, 0, FALSE);
|
||||
// 1-8 tentacles attack
|
||||
if(--max <= 0)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
dotailslap(magr)
|
||||
struct monst *magr;
|
||||
|
|
|
@ -11658,6 +11658,10 @@ do_passive_attacks()
|
|||
dohost_mon(mtmp);
|
||||
if(is_storm_mon(mtmp))
|
||||
dostorm(mtmp);
|
||||
if(mtmp->mtyp == PM_KRAKEN__THE_FIEND_OF_WATER)
|
||||
dokraken_mon(mtmp);
|
||||
if(mtmp->mtyp == PM_CHAOS && !PURIFIED_WATER)
|
||||
dochaos_mon(mtmp);
|
||||
}
|
||||
if(mtmp->mtyp == PM_NACHASH_TANNIN){
|
||||
donachash(mtmp);
|
||||
|
|
|
@ -10512,7 +10512,14 @@ boolean goodequip;
|
|||
otmp->blessed = FALSE;
|
||||
otmp->cursed = FALSE;
|
||||
(void) mpickobj(mtmp,otmp);
|
||||
|
||||
|
||||
if(!PURIFIED_FIRE){
|
||||
mongets(mtmp, LONG_SWORD, mkobjflags);
|
||||
mongets(mtmp, SCIMITAR, mkobjflags);
|
||||
mongets(mtmp, SCIMITAR, mkobjflags);
|
||||
mongets(mtmp, SCIMITAR, mkobjflags);
|
||||
}
|
||||
|
||||
// mlocal = makemon(&mons[PM_KRAKEN], mtmp->mx, mtmp->my, MM_ADJACENTOK);
|
||||
// otmp = mksobj(CRYSTAL_BALL, mkobjflags);
|
||||
// otmp = oname(otmp, artiname(ART_WATER_CRYSTAL));
|
||||
|
@ -11466,6 +11473,16 @@ int faction;
|
|||
} else if (rider_hp(ptr)) {
|
||||
/* We want low HP, but a high mlevel so they can attack well */
|
||||
mtmp->mhpmax = mtmp->mhp = d(10,8);
|
||||
} else if (ptr->mtyp == PM_LICH__THE_FIEND_OF_EARTH) {
|
||||
mtmp->mhpmax = mtmp->mhp = 500;
|
||||
} else if (ptr->mtyp == PM_KARY__THE_FIEND_OF_FIRE) {
|
||||
mtmp->mhpmax = mtmp->mhp = 700;
|
||||
} else if (ptr->mtyp == PM_KRAKEN__THE_FIEND_OF_WATER) {
|
||||
mtmp->mhpmax = mtmp->mhp = 900;
|
||||
} else if (ptr->mtyp == PM_TIAMAT__THE_FIEND_OF_WIND) {
|
||||
mtmp->mhpmax = mtmp->mhp = 1100;
|
||||
} else if (ptr->mtyp == PM_CHAOS) {
|
||||
mtmp->mhpmax = mtmp->mhp = 2000;
|
||||
} else if (ptr->mlevel > 49 || ptr->geno & G_UNIQ) {
|
||||
/* "special" fixed hp monster
|
||||
* the hit points are encoded in the mlevel in a somewhat strange
|
||||
|
@ -11575,21 +11592,6 @@ int faction;
|
|||
|
||||
if(mtmp->mfaction <= 0)
|
||||
makemon_set_monster_faction(mtmp);
|
||||
if(mndx == PM_CHAOS){
|
||||
mtmp->mhpmax = 15*mtmp->mhpmax;
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
} else if(mndx == PM_KARY__THE_FIEND_OF_FIRE){
|
||||
mtmp->mhpmax = 10*mtmp->mhpmax;
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
} else if(mndx == PM_LICH__THE_FIEND_OF_EARTH){
|
||||
mtmp->mhpmax = 10*mtmp->mhpmax;
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
} else if(mndx == PM_KRAKEN__THE_FIEND_OF_WATER){
|
||||
mtmp->mhpmax = 10*mtmp->mhpmax;
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
} else if(mndx == PM_TIAMAT__THE_FIEND_OF_WIND){
|
||||
mtmp->mhpmax = 10*mtmp->mhpmax;
|
||||
mtmp->mhp = mtmp->mhpmax;
|
||||
}
|
||||
|
||||
switch(ptr->mlet) {
|
||||
|
@ -13706,11 +13708,11 @@ struct monst *mtmp, *victim;
|
|||
ptr->mtyp == PM_SHOGGOTH
|
||||
) hp_threshold *= 3;
|
||||
else if (ptr->mtyp == PM_RAZORVINE) hp_threshold *= .5;
|
||||
else if(ptr->mtyp == PM_CHAOS) hp_threshold *= 15;
|
||||
else if(ptr->mtyp == PM_KARY__THE_FIEND_OF_FIRE) hp_threshold *= 10;
|
||||
else if(ptr->mtyp == PM_LICH__THE_FIEND_OF_EARTH) hp_threshold *= 10;
|
||||
else if(ptr->mtyp == PM_KRAKEN__THE_FIEND_OF_WATER) hp_threshold *= 10;
|
||||
else if(ptr->mtyp == PM_TIAMAT__THE_FIEND_OF_WIND) hp_threshold *= 10;
|
||||
else if(ptr->mtyp == PM_CHAOS) hp_threshold = mtmp->m_lev * 2200/16;
|
||||
else if(ptr->mtyp == PM_KARY__THE_FIEND_OF_FIRE) hp_threshold = mtmp->m_lev * 770/12;
|
||||
else if(ptr->mtyp == PM_LICH__THE_FIEND_OF_EARTH) hp_threshold = mtmp->m_lev * 550/11;
|
||||
else if(ptr->mtyp == PM_KRAKEN__THE_FIEND_OF_WATER) hp_threshold = mtmp->m_lev * 990/20;
|
||||
else if(ptr->mtyp == PM_TIAMAT__THE_FIEND_OF_WIND) hp_threshold = mtmp->m_lev * 1210/13;
|
||||
else if(ptr->mtyp == PM_CHOKHMAH_SEPHIRAH) hp_threshold *= u.chokhmah;
|
||||
|
||||
lev_limit = mon_max_lev(mtmp);
|
||||
|
|
28
src/mcastu.c
28
src/mcastu.c
|
@ -1121,6 +1121,14 @@ unsigned int type;
|
|||
break;
|
||||
case PM_GREAT_HIGH_SHAMAN_OF_KURTULMAK:
|
||||
return SUMMON_DEVIL;
|
||||
case PM_DOOM_KNIGHT:
|
||||
switch(rn2(4)){
|
||||
case 0: return BLIND_YOU;
|
||||
case 1: return VULNERABILITY;
|
||||
case 2: return MON_FLARE;
|
||||
case 3: return DRAIN_LIFE;
|
||||
}
|
||||
break;
|
||||
case PM_LICH__THE_FIEND_OF_EARTH:
|
||||
if(mtmp->mvar_spList_1 > 3) mtmp->mvar_spList_1 = 0;
|
||||
switch(mtmp->mvar_spList_1++){
|
||||
|
@ -1171,21 +1179,21 @@ unsigned int type;
|
|||
if(mtmp->mvar_spList_1 > 7) mtmp->mvar_spList_1 = 0;
|
||||
switch(mtmp->mvar_spList_1++){
|
||||
case 0: return MON_BLIZZAGA;
|
||||
case 1: return WEAKEN_STATS;
|
||||
case 1: return !PURIFIED_EARTH ? DEATH_TOUCH : WEAKEN_STATS;
|
||||
case 2: return MON_THUNDAGA;
|
||||
case 3: return CURE_SELF;
|
||||
case 4: return HASTE_SELF;
|
||||
case 5: return MON_FIRAGA;
|
||||
case 6: return ICE_STORM;
|
||||
case 6: return !PURIFIED_EARTH ? MON_WARP : ICE_STORM;
|
||||
case 7: return MON_FLARE;
|
||||
}
|
||||
} else {
|
||||
if(mtmp->mvar_spList_2 > 3) mtmp->mvar_spList_2 = 0;
|
||||
switch(mtmp->mvar_spList_2++){
|
||||
case 0: return FIRE_PILLAR;
|
||||
case 1: return GEYSER;
|
||||
case 2: return MON_POISON_GAS;
|
||||
case 3: return EARTHQUAKE;
|
||||
case 0: return !PURIFIED_FIRE ? STUN_YOU : FIRE_PILLAR;
|
||||
case 1: return !PURIFIED_WATER ? ICE_STORM : GEYSER;
|
||||
case 2: return !PURIFIED_WIND ? PLAGUE : MON_POISON_GAS;
|
||||
case 3: return !PURIFIED_EARTH ? MON_FLARE : EARTHQUAKE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -3909,7 +3917,13 @@ int tary;
|
|||
else {
|
||||
if (canseemon(magr))
|
||||
pline("%s looks better.", Monnam(magr));
|
||||
*hp(magr) += d(dmn, 8);
|
||||
if(magr->mtyp == PM_CHAOS){
|
||||
//Chaos could heal himself fully, but lets not do that.
|
||||
*hp(magr) += 999;
|
||||
}
|
||||
else {
|
||||
*hp(magr) += d(dmn, 8);
|
||||
}
|
||||
if (*hp(magr) > *hpmax(magr))
|
||||
*hp(magr) = *hpmax(magr);
|
||||
}
|
||||
|
|
|
@ -1562,6 +1562,8 @@ struct monst *mon;
|
|||
mmove += 12;
|
||||
if(mon->mtyp == PM_UVUUDAUM && mon->mpeaceful)
|
||||
mmove /= 4;
|
||||
if(mon->mtyp == PM_CHAOS && !PURIFIED_FIRE)
|
||||
mmove += 3;
|
||||
/* Note: MSLOW's `+ 1' prevents slowed speed 1 getting reduced to 0;
|
||||
* MFAST's `+ 2' prevents hasted speed 1 from becoming a no-op;
|
||||
* both adjustments have negligible effect on higher speeds.
|
||||
|
|
32
src/monst.c
32
src/monst.c
|
@ -7036,7 +7036,7 @@ is a red right hand
|
|||
SIZ(WT_HUGE, CN_HUGE, MS_SILENT, MZ_HUGE), 0, 0,
|
||||
MM_SWIM|MM_AMPHIBIOUS|MM_WEBRIP /*MM*/, MT_ANIMAL|MT_CARNIVORE|MT_HOSTILE /*MT*/, 0 /*MF*/,
|
||||
MB_SLITHY|MB_LONGHEAD|MB_NOHANDS|MB_STRONG /*MB*/, MG_NOPOLY /*MG*/,
|
||||
MA_AQUATIC /*MA*/, MV_NORMAL /*MV*/, CLR_GREEN),
|
||||
MA_AQUATIC /*MA*/, MV_NORMAL|MV_SCENT /*MV*/, CLR_GREEN),
|
||||
/*
|
||||
* lizards, &c
|
||||
*/
|
||||
|
@ -8448,6 +8448,16 @@ is a red right hand
|
|||
/*
|
||||
* alignment quest nemeses
|
||||
*/
|
||||
MON("doom knight", S_HUMAN,//12
|
||||
LVL(10, 12, 1, -3), G_NOGEN|G_SGROUP,
|
||||
DEF(NAT_AC(0)),
|
||||
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
|
||||
ATTK(AT_MAGC, AD_SPEL, 0, 4)
|
||||
),
|
||||
SIZ(WT_HUMAN, 400, MS_HUMANOID, MZ_HUMAN), 0, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/, MF_MARTIAL_E|MF_BAB_FULL /*MF*/,
|
||||
MB_HUMANOID|MB_STRONG /*MB*/, MG_NOWISH|MG_NOPOLY|MG_INFRAVISIBLE /*MG*/,
|
||||
MA_HUMAN /*MA*/, MV_CATSIGHT /*MV*/, CLR_BLACK),
|
||||
MON("Lich, the Fiend of Earth", S_LICH,//16 /*Needs encyc entry*//*Needs tile*/
|
||||
LVL(11, 6, 30, -9), (G_NOCORPSE|G_UNIQ),
|
||||
DEF(NAT_AC(10), NAT_DR(5)),
|
||||
|
@ -8456,8 +8466,8 @@ is a red right hand
|
|||
SIZ(WT_GIGANTIC, 100, MS_MUMBLE, MZ_GIGANTIC),//75% Flare -> paralize -> warp -> death touch
|
||||
MR_COLD|MR_SLEEP|MR_POISON, MR_COLD|MR_STONE,
|
||||
MM_BREATHLESS|MM_WEBRIP|MM_DOORBUST /*MM*/, MT_HOSTILE|MT_MAGIC|MT_WAITFORU /*MT*/, MF_LEVEL_30 /*MF*/,
|
||||
MB_HUMANOID|MB_POIS|MB_MALE /*MB*/, MG_NOTAME|MG_NOPOLY|MG_VBLUNT|MG_PNAME|MG_REGEN|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_UNDEAD /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_BROWN),
|
||||
MB_HUMANOID|MB_POIS|MB_MALE /*MB*/, MG_LORD|MG_NOTAME|MG_NOPOLY|MG_VBLUNT|MG_PNAME|MG_REGEN|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_UNDEAD /*MA*/, MV_EXTRAMISSION|MV_INFRAVISION /*MV*/, CLR_BROWN),
|
||||
MON("Kary, the Fiend of Fire", S_DEMON,//19 /*Needs encyc entry*//*Needs tile*/
|
||||
LVL(12, 12, 50, -12), (G_NOCORPSE|G_UNIQ), /* -11 if armed */
|
||||
DEF(NAT_AC(11), NAT_DR_LEGS(6), NAT_DR_FEET(6)),
|
||||
|
@ -8467,8 +8477,8 @@ is a red right hand
|
|||
ATTK(AT_HUGS, AD_WRAP, 4, 6), ATTK(AT_MAGC, AD_SPEL, 0, 0)),
|
||||
SIZ(WT_GIGANTIC, 400, MS_CUSS, MZ_GIGANTIC), MR_FIRE|MR_COLD|MR_POISON|MR_STONE, 0,//37% Firaga->blind->firaga->blind->firaga->stun->firaga->stun
|
||||
MM_WEBRIP|MM_DOORBUST /*MM*/, MT_TRAITOR|MT_WAITFORU|MT_COLLECT|MT_STALK|MT_HOSTILE /*MT*/, MF_MARTIAL_S|MF_BAB_FULL|MF_LEVEL_30 /*MF*/,
|
||||
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_INFRAVISIBLE|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION|MV_SEE_INVIS /*MV*/, CLR_RED),
|
||||
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_LORD|MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_INFRAVISIBLE|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_DEMON /*MA*/, MV_EXTRAMISSION|MV_INFRAVISION|MV_SEE_INVIS /*MV*/, CLR_RED),
|
||||
MON("Kraken, the Fiend of Water", S_EEL,//25 /*Needs encyc entry*//*Needs tile*/
|
||||
LVL(20, 9, 70, -10), (G_NOCORPSE|G_UNIQ),
|
||||
DEF(NAT_AC(4), NAT_DR(4)),
|
||||
|
@ -8477,8 +8487,8 @@ is a red right hand
|
|||
ATTK(AT_SPIT, AD_BLND, 0, 0), ATTK(AT_MAGC, AD_SPEL, 0, 0)),
|
||||
SIZ(WT_GIGANTIC, 1000, MS_SILENT, MZ_GIGANTIC), MR_POISON|MR_ELEC|MR_STONE, 0,//37% Thundara or 15% blind
|
||||
MM_SWIM|MM_AMPHIBIOUS|MM_WEBRIP|MM_DOORBUST /*MM*/, MT_WAITFORU|MT_HOSTILE|MT_CARNIVORE /*MT*/, MF_LEVEL_30 /*MF*/,
|
||||
MB_HUMANOID|MB_NOGLOVES|MB_STRONG|MB_MALE /*MB*/, MG_VSLASH|MG_NOTAME|MG_NOPOLY|MG_INFRAVISIBLE|MG_PNAME|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_AQUATIC /*MA*/, MV_NORMAL /*MV*/, CLR_GREEN),
|
||||
MB_HUMANOID|MB_NOGLOVES|MB_STRONG|MB_MALE /*MB*/, MG_LORD|MG_VSLASH|MG_NOTAME|MG_NOPOLY|MG_INFRAVISIBLE|MG_PNAME|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_AQUATIC /*MA*/, MV_EXTRAMISSION|MV_SCENT /*MV*/, CLR_GREEN),
|
||||
MON("Tiamat, the Fiend of Wind", S_DRAGON,//20 /*Needs better tile*/
|
||||
LVL(13, 9, 90, -10), (G_NOCORPSE|G_UNIQ),
|
||||
DEF(NAT_AC(16), NAT_DR(5)),
|
||||
|
@ -8487,8 +8497,8 @@ is a red right hand
|
|||
ATTK(AT_MAGC, AD_SPEL, 0, 0)),//25% Thunderbolt->poison gas->Ice storm->Flame strike
|
||||
SIZ(WT_GIGANTIC, 1500, MS_ROAR, MZ_GIGANTIC), MR_POISON|MR_ELEC|MR_FIRE|MR_COLD|MR_STONE, MR_POISON,
|
||||
MM_FLY|MM_WEBRIP|MM_DOORBUST /*MM*/, MT_HOSTILE|MT_CARNIVORE|MT_WAITFORU|MT_GREEDY|MT_JEWELS|MT_MAGIC /*MT*/, MF_LEVEL_30 /*MF*/,
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_STRONG|MB_FEMALE|MB_THICK_HIDE|MB_NOHANDS|MB_POIS /*MB*/, MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_NORMAL|MV_SEE_INVIS /*MV*/, CLR_GREEN),
|
||||
MB_ANIMAL|MB_LONGHEAD|MB_WINGS|MB_STRONG|MB_FEMALE|MB_THICK_HIDE|MB_NOHANDS|MB_POIS /*MB*/, MG_LORD|MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_DRAGON /*MA*/, MV_EXTRAMISSION|MV_SEE_INVIS /*MV*/, CLR_GREEN),
|
||||
|
||||
MON("Sir Garland", S_HUMAN,//8
|
||||
LVL(6, 12, 6, -3), G_UNIQ|G_NOCORPSE|G_NOGEN,
|
||||
|
@ -8506,7 +8516,7 @@ is a red right hand
|
|||
ATTK(AT_NONE, AD_KAOS, 0, 0)),
|
||||
SIZ(WT_HUMAN, 400, MS_CUSS, MZ_HUMAN), MR_STONE, 0,
|
||||
0 /*MM*/, MT_HOSTILE|MT_OMNIVORE|MT_COLLECT|MT_WAITFORU|MT_TRAITOR /*MT*/, MF_MARTIAL_E|MF_BAB_FULL|MF_LEVEL_30 /*MF*/,
|
||||
MB_HUMANOID|MB_MALE|MB_STRONG /*MB*/, MG_NOTAME|MG_NOPOLY|MG_PNAME|MG_INFRAVISIBLE /*MG*/,
|
||||
MB_HUMANOID|MB_MALE|MB_STRONG /*MB*/, MG_PRINCE|MG_NOTAME|MG_NOPOLY|MG_PNAME|MG_INFRAVISIBLE /*MG*/,
|
||||
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
|
||||
|
||||
MON("Chaos", S_DEMON,//22
|
||||
|
@ -8517,7 +8527,7 @@ is a red right hand
|
|||
ATTK(AT_MAGC, AD_SPEL, 0, 0)), //33% Flame Strike -> Geyser -> Cyclone -> Earthquake
|
||||
SIZ(WT_HUGE, 400, MS_CUSS, MZ_HUGE), MR_ALL, 0,
|
||||
MM_BREATHLESS|MM_FLY|MM_WEBRIP|MM_DOORBUST /*MM*/, MT_WANTSARTI|MT_HOSTILE|MT_COLLECT /*MT*/, MF_MARTIAL_B|MF_BAB_FULL|MF_LEVEL_30 /*MF*/,
|
||||
MB_HUMANOID|MB_WINGS|MB_MALE|MB_POIS /*MB*/, MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_INFRAVISIBLE|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MB_HUMANOID|MB_WINGS|MB_MALE|MB_POIS /*MB*/, MG_PRINCE|MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_INFRAVISIBLE|MG_NOSPELLCOOLDOWN /*MG*/,
|
||||
MA_DEMON|MA_HUMAN /*MA*/, MV_SEE_INVIS|MV_EXTRAMISSION /*MV*/, CLR_BROWN),
|
||||
|
||||
MON("Alabaster elf", S_HUMAN,//11 /*Needs encyc entry*/
|
||||
|
|
|
@ -1111,6 +1111,24 @@ boolean forcedestroy; /* TRUE if projectile should be forced to be destroyed a
|
|||
}
|
||||
return MM_REFLECT;
|
||||
}
|
||||
/* Non-future (and rockets) protectiles are blown back by Tiamat's winds (somehow!) */
|
||||
/* And also not a rock from a sling. It's pretty arbitrary, but the idea is aerodynamic stuff gets blown back. */
|
||||
else if (!(thrownobj->otyp == LASER_BEAM || thrownobj->otyp == BLASTER_BOLT || thrownobj->otyp == HEAVY_BLASTER_BOLT || thrownobj->otyp == BULLET
|
||||
|| (launcher && (launcher->otyp == SLING || launcher->otyp == GRENADE_LAUNCHER))
|
||||
)
|
||||
&& !trap
|
||||
&& (mdef->mtyp == PM_TIAMAT__THE_FIEND_OF_WIND || (mdef->mtyp == PM_CHAOS && !PURIFIED_WIND)))
|
||||
{
|
||||
*pdx *= -1;
|
||||
*pdy *= -1;
|
||||
pline("%s path is curved by the wind!", s_suffix(The(doname(thrownobj))));
|
||||
/* spends some range */
|
||||
if (range2 > range) {
|
||||
*prange = *prange2;
|
||||
*prange2 -= range2 - range;
|
||||
}
|
||||
return MM_REFLECT;
|
||||
}
|
||||
/* the player has a chance to burn some projectiles (not blaster bolts or laser beams) out of the air with a lightsaber */
|
||||
else if (!(thrownobj->otyp == LASER_BEAM || thrownobj->otyp == BLASTER_BOLT || thrownobj->otyp == HEAVY_BLASTER_BOLT)
|
||||
&& youdef && uwep && is_lightsaber(uwep) && litsaber(uwep) && (
|
||||
|
|
171
src/questpgr.c
171
src/questpgr.c
|
@ -542,12 +542,12 @@ qt_montype()
|
|||
int qpm;
|
||||
if(rn2(5)){
|
||||
qpm = PM_QUASIT;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(S_IMP, G_HELL));
|
||||
}
|
||||
qpm = PM_DAUGHTER_OF_BEDLAM;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(S_DEMON, G_HELL));
|
||||
} else if(Role_if(PM_NOBLEMAN) && Race_if(PM_HALF_DRAGON) && flags.initgend
|
||||
|
@ -556,22 +556,22 @@ qt_montype()
|
|||
int qpm;
|
||||
if(rn2(5)){
|
||||
qpm = PM_WOLF;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(S_DOG, G_NOHELL));
|
||||
}
|
||||
qpm = PM_CANDLE_TREE;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(S_DOG, G_NOHELL));
|
||||
} else {
|
||||
int qpm;
|
||||
if(Race_if(PM_DROW) && !flags.initgend && Role_if(PM_NOBLEMAN) && on_level(&u.uz, &qstart_level)) return &mons[PM_LONG_WORM_TAIL];
|
||||
else if(Race_if(PM_DROW) && flags.initgend && Role_if(PM_NOBLEMAN) && Is_nemesis(&u.uz) && !rn2(4))
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GENOD && !In_quest(&u.uz)) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GONE && !In_quest(&u.uz)) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
else if(In_quest(&u.uz) && Race_if(PM_DWARF) &&
|
||||
urole.neminum == PM_BOLG && Is_qlocate(&u.uz) &&
|
||||
!((mvitals[PM_SMAUG].mvflags & G_GENOD && !In_quest(&u.uz)) || mvitals[PM_SMAUG].died > 0)
|
||||
!((mvitals[PM_SMAUG].mvflags & G_GONE && !In_quest(&u.uz)) || mvitals[PM_SMAUG].died > 0)
|
||||
) return &mons[PM_LONG_WORM_TAIL];
|
||||
|
||||
if(rn2(5)){
|
||||
|
@ -590,12 +590,12 @@ qt_montype()
|
|||
qpm = urole.enemy1num;
|
||||
break;
|
||||
}
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(urole.enemy1sym, G_NOHELL|G_HELL));
|
||||
} else {
|
||||
qpm = urole.enemy1num;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(urole.enemy1sym, G_NOHELL|G_HELL));
|
||||
}
|
||||
|
@ -621,12 +621,12 @@ qt_montype()
|
|||
qpm = urole.enemy1num;
|
||||
break;
|
||||
}
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(urole.enemy1sym, G_NOHELL|G_HELL));
|
||||
} else {
|
||||
qpm = urole.enemy2num;
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GENOD && !In_quest(&u.uz)))
|
||||
if (qpm != NON_PM && rn2(5) && !(mvitals[qpm].mvflags & G_GONE && !In_quest(&u.uz)))
|
||||
return (&mons[qpm]);
|
||||
return (mkclass(urole.enemy2sym, G_NOHELL|G_HELL));
|
||||
}
|
||||
|
@ -643,89 +643,89 @@ chaos_montype()
|
|||
return mkclass(S_ZOMBIE, G_NOHELL);
|
||||
}
|
||||
else if(chance < 50){
|
||||
return !(mvitals[PM_HOBGOBLIN].mvflags & G_GENOD) ? &mons[PM_HOBGOBLIN] : mkclass(S_ORC, G_NOHELL);
|
||||
return !(mvitals[PM_HOBGOBLIN].mvflags & G_GONE) ? &mons[PM_HOBGOBLIN] : mkclass(S_ORC, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_GOBLIN].mvflags & G_GENOD) ? &mons[PM_GOBLIN] : mkclass(S_ORC, G_NOHELL);
|
||||
return !(mvitals[PM_GOBLIN].mvflags & G_GONE) ? &mons[PM_GOBLIN] : mkclass(S_ORC, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaosm_level,&u.uz)){
|
||||
//Mordor orcs, orc shaman, orc-captain, ogre, rock troll, stone golem, clay golem
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_STONE_GOLEM].mvflags & G_GENOD) ? &mons[PM_STONE_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
return !(mvitals[PM_STONE_GOLEM].mvflags & G_GONE) ? &mons[PM_STONE_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return !(mvitals[PM_CLAY_GOLEM].mvflags & G_GENOD) ? &mons[PM_CLAY_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
return !(mvitals[PM_CLAY_GOLEM].mvflags & G_GONE) ? &mons[PM_CLAY_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
}
|
||||
else if(chance < 40){
|
||||
return !(mvitals[PM_ROCK_TROLL].mvflags & G_GENOD) ? &mons[PM_ROCK_TROLL] : mkclass(S_TROLL, G_NOHELL);
|
||||
return !(mvitals[PM_ROCK_TROLL].mvflags & G_GONE) ? &mons[PM_ROCK_TROLL] : mkclass(S_TROLL, G_NOHELL);
|
||||
}
|
||||
else if(chance < 50){
|
||||
return !(mvitals[PM_ORC_CAPTAIN].mvflags & G_GENOD) ? &mons[PM_ORC_CAPTAIN] : mkclass(S_ORC, G_NOHELL);
|
||||
return !(mvitals[PM_ORC_CAPTAIN].mvflags & G_GONE) ? &mons[PM_ORC_CAPTAIN] : mkclass(S_ORC, G_NOHELL);
|
||||
}
|
||||
else if(chance < 60){
|
||||
return !(mvitals[PM_ORC_SHAMAN].mvflags & G_GENOD) ? &mons[PM_ORC_SHAMAN] : mkclass(S_ORC, G_NOHELL);
|
||||
return !(mvitals[PM_ORC_SHAMAN].mvflags & G_GONE) ? &mons[PM_ORC_SHAMAN] : mkclass(S_ORC, G_NOHELL);
|
||||
}
|
||||
else if(chance < 70){
|
||||
return !(mvitals[PM_OGRE].mvflags & G_GENOD) ? &mons[PM_OGRE] : mkclass(S_OGRE, G_NOHELL);
|
||||
return !(mvitals[PM_OGRE].mvflags & G_GONE) ? &mons[PM_OGRE] : mkclass(S_OGRE, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_MORDOR_ORC].mvflags & G_GENOD) ? &mons[PM_MORDOR_ORC] : mkclass(S_ORC, G_NOHELL);
|
||||
return !(mvitals[PM_MORDOR_ORC].mvflags & G_GONE) ? &mons[PM_MORDOR_ORC] : mkclass(S_ORC, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaost_level,&u.uz)){
|
||||
// purple worm, mind flayer, white dragon, black light, beholders
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_WHITE_DRAGON].mvflags & G_GENOD) ? &mons[PM_WHITE_DRAGON] : mkclass(S_DRAGON, G_NOHELL);
|
||||
return !(mvitals[PM_WHITE_DRAGON].mvflags & G_GONE) ? &mons[PM_WHITE_DRAGON] : mkclass(S_DRAGON, G_NOHELL);
|
||||
}
|
||||
else if(chance < 20){
|
||||
return !(mvitals[PM_PURPLE_WORM].mvflags & G_GENOD) ? &mons[PM_PURPLE_WORM] : mkclass(S_WORM, G_NOHELL);
|
||||
return !(mvitals[PM_PURPLE_WORM].mvflags & G_GONE) ? &mons[PM_PURPLE_WORM] : mkclass(S_WORM, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return !(mvitals[PM_BEHOLDER].mvflags & G_GENOD) ? &mons[PM_BEHOLDER] : mkclass(S_UMBER, G_NOHELL);
|
||||
return !(mvitals[PM_BEHOLDER].mvflags & G_GONE) ? &mons[PM_BEHOLDER] : mkclass(S_UMBER, G_NOHELL);
|
||||
}
|
||||
else if(chance < 65){
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GENOD) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GONE) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_BLACK_LIGHT].mvflags & G_GENOD) ? &mons[PM_BLACK_LIGHT] : mkclass(S_LIGHT, G_NOHELL);
|
||||
return !(mvitals[PM_BLACK_LIGHT].mvflags & G_GONE) ? &mons[PM_BLACK_LIGHT] : mkclass(S_LIGHT, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaoss_level,&u.uz)){
|
||||
// purple worm, mind flayer, GREEN dragon, black light, beholders
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_GREEN_DRAGON].mvflags & G_GENOD) ? &mons[PM_GREEN_DRAGON] : mkclass(S_DRAGON, G_NOHELL);
|
||||
return !(mvitals[PM_GREEN_DRAGON].mvflags & G_GONE) ? &mons[PM_GREEN_DRAGON] : mkclass(S_DRAGON, G_NOHELL);
|
||||
}
|
||||
else if(chance < 20){
|
||||
return !(mvitals[PM_PURPLE_WORM].mvflags & G_GENOD) ? &mons[PM_PURPLE_WORM] : mkclass(S_WORM, G_NOHELL);
|
||||
return !(mvitals[PM_PURPLE_WORM].mvflags & G_GONE) ? &mons[PM_PURPLE_WORM] : mkclass(S_WORM, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return !(mvitals[PM_BEHOLDER].mvflags & G_GENOD) ? &mons[PM_BEHOLDER] : mkclass(S_UMBER, G_NOHELL);
|
||||
return !(mvitals[PM_BEHOLDER].mvflags & G_GONE) ? &mons[PM_BEHOLDER] : mkclass(S_UMBER, G_NOHELL);
|
||||
}
|
||||
else if(chance < 65){
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GENOD) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
return !(mvitals[PM_MIND_FLAYER].mvflags & G_GONE) ? &mons[PM_MIND_FLAYER] : mkclass(S_UMBER, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_BLACK_LIGHT].mvflags & G_GENOD) ? &mons[PM_BLACK_LIGHT] : mkclass(S_LIGHT, G_NOHELL);
|
||||
return !(mvitals[PM_BLACK_LIGHT].mvflags & G_GONE) ? &mons[PM_BLACK_LIGHT] : mkclass(S_LIGHT, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaosfrh_level,&u.uz)){
|
||||
//vampire lord, vampire, earth elemental, zombie
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_VAMPIRE_LORD].mvflags & G_GENOD) ? &mons[PM_VAMPIRE_LORD] : mkclass(S_VAMPIRE, G_NOHELL);
|
||||
return !(mvitals[PM_VAMPIRE_LORD].mvflags & G_GONE) ? &mons[PM_VAMPIRE_LORD] : mkclass(S_VAMPIRE, G_NOHELL);
|
||||
}
|
||||
else if(chance < 20){
|
||||
return !(mvitals[PM_EARTH_ELEMENTAL].mvflags & G_GENOD) ? &mons[PM_EARTH_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
return !(mvitals[PM_EARTH_ELEMENTAL].mvflags & G_GONE) ? &mons[PM_EARTH_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return mkclass(S_ZOMBIE, G_NOHELL);
|
||||
}
|
||||
else if(chance < 65){
|
||||
return !(mvitals[PM_VAMPIRE].mvflags & G_GENOD) ? &mons[PM_VAMPIRE] : mkclass(S_VAMPIRE, G_NOHELL);
|
||||
return !(mvitals[PM_VAMPIRE].mvflags & G_GONE) ? &mons[PM_VAMPIRE] : mkclass(S_VAMPIRE, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return mkclass(S_ZOMBIE, G_NOHELL);
|
||||
|
@ -735,45 +735,48 @@ chaos_montype()
|
|||
//fire giant, salamander, imps, fire elemtal
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_FIRE_GIANT].mvflags & G_GENOD) ? &mons[PM_FIRE_GIANT] : mkclass(S_GIANT, G_NOHELL);
|
||||
return !(mvitals[PM_FIRE_GIANT].mvflags & G_GONE) ? &mons[PM_FIRE_GIANT] : mkclass(S_GIANT, G_NOHELL);
|
||||
}
|
||||
else if(chance < 20){
|
||||
return !(mvitals[PM_FIRE_ELEMENTAL].mvflags & G_GENOD) ? &mons[PM_FIRE_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
return !(mvitals[PM_FIRE_ELEMENTAL].mvflags & G_GONE) ? &mons[PM_FIRE_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return !(mvitals[PM_SALAMANDER].mvflags & G_GENOD) ? &mons[PM_SALAMANDER] : mkclass(S_LIZARD, G_NOHELL);
|
||||
return !(mvitals[PM_SALAMANDER].mvflags & G_GONE) ? &mons[PM_SALAMANDER] : mkclass(S_LIZARD, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_IMP].mvflags & G_GENOD) ? &mons[PM_IMP] : mkclass(S_IMP, G_NOHELL);
|
||||
return !(mvitals[PM_IMP].mvflags & G_GONE) ? &mons[PM_IMP] : mkclass(S_IMP, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaossth_level,&u.uz)){
|
||||
//winter wolf, water troll, python, water moccasin, water elemental
|
||||
int chance = d(1,100);
|
||||
if(chance < 10){
|
||||
return !(mvitals[PM_WATER_ELEMENTAL].mvflags & G_GENOD) ? &mons[PM_WATER_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
return !(mvitals[PM_WATER_ELEMENTAL].mvflags & G_GONE) ? &mons[PM_WATER_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
}
|
||||
else if(chance < 30){
|
||||
return !(mvitals[PM_WINTER_WOLF].mvflags & G_GENOD) ? &mons[PM_WINTER_WOLF] : mkclass(S_DOG, G_NOHELL);
|
||||
return !(mvitals[PM_WINTER_WOLF].mvflags & G_GONE) ? &mons[PM_WINTER_WOLF] : mkclass(S_DOG, G_NOHELL);
|
||||
}
|
||||
else if(chance < 50){
|
||||
return !(mvitals[PM_PYTHON].mvflags & G_GENOD) ? &mons[PM_PYTHON] : mkclass(S_SNAKE, G_NOHELL);
|
||||
return !(mvitals[PM_PYTHON].mvflags & G_GONE) ? &mons[PM_PYTHON] : mkclass(S_SNAKE, G_NOHELL);
|
||||
}
|
||||
else if(chance < 70){
|
||||
return !(mvitals[PM_WATER_TROLL].mvflags & G_GENOD) ? &mons[PM_WATER_TROLL] : mkclass(S_TROLL, G_NOHELL);
|
||||
return !(mvitals[PM_WATER_TROLL].mvflags & G_GONE) ? &mons[PM_WATER_TROLL] : mkclass(S_TROLL, G_NOHELL);
|
||||
}
|
||||
else{
|
||||
return !(mvitals[PM_WATER_MOCCASIN].mvflags & G_GENOD) ? &mons[PM_WATER_MOCCASIN] : mkclass(S_SNAKE, G_NOHELL);
|
||||
return !(mvitals[PM_WATER_MOCCASIN].mvflags & G_GONE) ? &mons[PM_WATER_MOCCASIN] : mkclass(S_SNAKE, G_NOHELL);
|
||||
}
|
||||
}
|
||||
else if(on_level(&chaosvth_level,&u.uz)){
|
||||
//iron golem, air elemental
|
||||
int chance = d(1,8);
|
||||
if(chance == 1){
|
||||
return !(mvitals[PM_AIR_ELEMENTAL].mvflags & G_GENOD) ? &mons[PM_AIR_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
return !(mvitals[PM_AIR_ELEMENTAL].mvflags & G_GONE) ? &mons[PM_AIR_ELEMENTAL] : mkclass(S_ELEMENTAL, G_NOHELL);
|
||||
}
|
||||
else if(chance == 2){
|
||||
return !(mvitals[PM_IRON_GOLEM].mvflags & G_GENOD) ? &mons[PM_IRON_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
return !(mvitals[PM_IRON_GOLEM].mvflags & G_GONE) ? &mons[PM_IRON_GOLEM] : mkclass(S_GOLEM, G_NOHELL);
|
||||
}
|
||||
else if(chance == 3 && !rn2(10)){
|
||||
return !(mvitals[PM_DOOM_KNIGHT].mvflags & G_GONE) ? &mons[PM_DOOM_KNIGHT] : (struct permonst *)0;
|
||||
}
|
||||
else{
|
||||
return (struct permonst *)0;
|
||||
|
@ -790,30 +793,30 @@ chaos2_montype()
|
|||
{
|
||||
if(on_level(&elshava_level,&u.uz)){
|
||||
if(rn2(3))
|
||||
return !(mvitals[PM_FOG_CLOUD].mvflags & G_GENOD) ? &mons[PM_FOG_CLOUD] : mkclass(S_VORTEX, G_NOHELL);
|
||||
return !(mvitals[PM_FOG_CLOUD].mvflags & G_GONE) ? &mons[PM_FOG_CLOUD] : mkclass(S_VORTEX, G_NOHELL);
|
||||
else if(!rn2(2))
|
||||
return !(mvitals[PM_PIRANHA].mvflags & G_GENOD) ? &mons[PM_PIRANHA] : mkclass(S_EEL, G_NOHELL);
|
||||
return !(mvitals[PM_PIRANHA].mvflags & G_GONE) ? &mons[PM_PIRANHA] : mkclass(S_EEL, G_NOHELL);
|
||||
else if(rn2(3))
|
||||
return mkclass(S_EEL, G_NOHELL);
|
||||
else if(rn2(2))
|
||||
return !(mvitals[PM_COURE_ELADRIN].mvflags & G_GENOD) ? &mons[PM_COURE_ELADRIN] : mkclass(S_CHA_ANGEL, G_NOHELL);
|
||||
return !(mvitals[PM_COURE_ELADRIN].mvflags & G_GONE) ? &mons[PM_COURE_ELADRIN] : mkclass(S_CHA_ANGEL, G_NOHELL);
|
||||
else
|
||||
return !(mvitals[PM_NOVIERE_ELADRIN].mvflags & G_GENOD) ? &mons[PM_NOVIERE_ELADRIN] : mkclass(S_CHA_ANGEL, G_NOHELL);
|
||||
return !(mvitals[PM_NOVIERE_ELADRIN].mvflags & G_GONE) ? &mons[PM_NOVIERE_ELADRIN] : mkclass(S_CHA_ANGEL, G_NOHELL);
|
||||
} else if(In_mithardir_desert(&u.uz)){
|
||||
if(rn2(3))
|
||||
return !(mvitals[PM_DUST_VORTEX].mvflags & G_GENOD) ? &mons[PM_DUST_VORTEX] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
return !(mvitals[PM_DUST_VORTEX].mvflags & G_GONE) ? &mons[PM_DUST_VORTEX] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
else if(rn2(2))
|
||||
return !(mvitals[PM_ALABASTER_ELF].mvflags & G_GENOD) ? &mons[PM_ALABASTER_ELF] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
return !(mvitals[PM_ALABASTER_ELF].mvflags & G_GONE) ? &mons[PM_ALABASTER_ELF] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
else if(rn2(2))
|
||||
return !(mvitals[PM_WEREWOLF].mvflags & G_GENOD) ? &mons[PM_WEREWOLF] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
return !(mvitals[PM_WEREWOLF].mvflags & G_GONE) ? &mons[PM_WEREWOLF] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
else if(rn2(3))
|
||||
return !(mvitals[PM_ALABASTER_ELF_ELDER].mvflags & G_GENOD) ? &mons[PM_ALABASTER_ELF_ELDER] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
return !(mvitals[PM_ALABASTER_ELF_ELDER].mvflags & G_GONE) ? &mons[PM_ALABASTER_ELF_ELDER] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
else if(!rn2(3))
|
||||
return !(mvitals[PM_SENTINEL_OF_MITHARDIR].mvflags & G_GENOD) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_GOLEM, G_NOHELL);
|
||||
return !(mvitals[PM_SENTINEL_OF_MITHARDIR].mvflags & G_GONE) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_GOLEM, G_NOHELL);
|
||||
else if(rn2(2))
|
||||
return !(mvitals[PM_WRAITHWORM].mvflags & G_GENOD) ? &mons[PM_WRAITHWORM] : mkclass(S_SNAKE, G_NOHELL);
|
||||
return !(mvitals[PM_WRAITHWORM].mvflags & G_GONE) ? &mons[PM_WRAITHWORM] : mkclass(S_SNAKE, G_NOHELL);
|
||||
else
|
||||
return !(mvitals[PM_LIVING_MIRAGE].mvflags & G_GENOD) ? &mons[PM_LIVING_MIRAGE] : mkclass(S_PUDDING, G_NOHELL);
|
||||
return !(mvitals[PM_LIVING_MIRAGE].mvflags & G_GONE) ? &mons[PM_LIVING_MIRAGE] : mkclass(S_PUDDING, G_NOHELL);
|
||||
} else if(In_mithardir_catacombs(&u.uz)){
|
||||
if(rn2(2))
|
||||
return mkclass(S_BLOB, G_NOHELL);
|
||||
|
@ -822,13 +825,13 @@ chaos2_montype()
|
|||
else if(!rn2(3))
|
||||
return mkclass(S_WRAITH, G_NOHELL);
|
||||
else if(rn2(2))
|
||||
return !(mvitals[PM_WRAITHWORM].mvflags & G_GENOD) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_SNAKE, G_NOHELL);
|
||||
return !(mvitals[PM_WRAITHWORM].mvflags & G_GONE) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_SNAKE, G_NOHELL);
|
||||
else if(rn2(3) || !In_mithardir_terminus(&u.uz))
|
||||
return !(mvitals[PM_SENTINEL_OF_MITHARDIR].mvflags & G_GENOD) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_GOLEM, G_NOHELL);
|
||||
return !(mvitals[PM_SENTINEL_OF_MITHARDIR].mvflags & G_GONE) ? &mons[PM_SENTINEL_OF_MITHARDIR] : mkclass(S_GOLEM, G_NOHELL);
|
||||
else
|
||||
return !(mvitals[PM_ASPECT_OF_THE_SILENCE].mvflags & G_GENOD) ? &mons[PM_ASPECT_OF_THE_SILENCE] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
return !(mvitals[PM_ASPECT_OF_THE_SILENCE].mvflags & G_GONE) ? &mons[PM_ASPECT_OF_THE_SILENCE] : mkclass(S_ZOMBIE, G_NOHELL);
|
||||
}
|
||||
return !(mvitals[PM_FOG_CLOUD].mvflags & G_GENOD) ? &mons[PM_FOG_CLOUD] : mkclass(S_VORTEX, G_NOHELL);
|
||||
return !(mvitals[PM_FOG_CLOUD].mvflags & G_GONE) ? &mons[PM_FOG_CLOUD] : mkclass(S_VORTEX, G_NOHELL);
|
||||
}
|
||||
|
||||
struct permonst *
|
||||
|
@ -1105,7 +1108,7 @@ neutral_montype()
|
|||
if(rn2(20)) return (struct permonst *)0; /*GREATLY reduce monster generation*/
|
||||
if(chance < 2){
|
||||
for (num = d(2,3); num >= 0; num--) {
|
||||
if (!(mvitals[PM_HUNTING_HORROR].mvflags & G_GENOD))
|
||||
if (!(mvitals[PM_HUNTING_HORROR].mvflags & G_GONE))
|
||||
makemon(&mons[PM_HUNTING_HORROR], xupstair, yupstair, MM_ADJACENTOK);
|
||||
else
|
||||
makemon(mkclass(S_UMBER, G_NOHELL|G_HELL), xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -1114,7 +1117,7 @@ neutral_montype()
|
|||
}
|
||||
else if(chance < 6){
|
||||
for (num = d(2,4); num >= 0; num--) {
|
||||
if (!(mvitals[PM_BYAKHEE].mvflags & G_GENOD))
|
||||
if (!(mvitals[PM_BYAKHEE].mvflags & G_GONE))
|
||||
makemon(&mons[PM_BYAKHEE], xupstair, yupstair, MM_ADJACENTOK);
|
||||
else
|
||||
makemon(mkclass(S_UMBER, G_NOHELL|G_HELL), xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -1122,7 +1125,7 @@ neutral_montype()
|
|||
return (struct permonst *)0;
|
||||
}
|
||||
else if(chance < 8){
|
||||
if (!(mvitals[PM_SHOGGOTH].mvflags & G_GENOD))
|
||||
if (!(mvitals[PM_SHOGGOTH].mvflags & G_GONE))
|
||||
makemon(&mons[PM_SHOGGOTH], xupstair, yupstair, MM_ADJACENTOK);
|
||||
else
|
||||
makemon(mkclass(S_BLOB, G_NOHELL|G_HELL), xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -1136,7 +1139,7 @@ neutral_montype()
|
|||
}
|
||||
else if(chance < 30){
|
||||
for (num = rnd(3); num >= 0; num--) {
|
||||
if (!(mvitals[PM_MASTER_MIND_FLAYER].mvflags & G_GENOD))
|
||||
if (!(mvitals[PM_MASTER_MIND_FLAYER].mvflags & G_GONE))
|
||||
makemon(&mons[PM_MASTER_MIND_FLAYER], xupstair, yupstair, MM_ADJACENTOK);
|
||||
else
|
||||
makemon(mkclass(S_UMBER, G_NOHELL|G_HELL), xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -1145,7 +1148,7 @@ neutral_montype()
|
|||
}
|
||||
else if(chance < 50){
|
||||
for (num = rn1(2,2); num >= 0; num--) {
|
||||
if (!(mvitals[PM_MIND_FLAYER].mvflags & G_GENOD))
|
||||
if (!(mvitals[PM_MIND_FLAYER].mvflags & G_GONE))
|
||||
makemon(&mons[PM_MIND_FLAYER], xupstair, yupstair, MM_ADJACENTOK);
|
||||
else
|
||||
makemon(mkclass(S_UMBER, G_NOHELL|G_HELL), xupstair, yupstair, MM_ADJACENTOK);
|
||||
|
@ -1299,18 +1302,18 @@ law_montype()
|
|||
else if(on_level(&arcadia1_level,&u.uz)){
|
||||
int chance = d(1,100);
|
||||
if(chance <= 20){
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GENOD) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 40){
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GENOD) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GONE) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 70){
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GENOD) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GONE) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 90){
|
||||
chance = d(1,6);
|
||||
if(chance <= 5) return !(mvitals[PM_DWARF].mvflags & G_GENOD) ? &mons[PM_DWARF] : mkclass(S_HUMANOID, 0);
|
||||
else if(chance <= 9) return !(mvitals[PM_DWARF_LORD].mvflags & G_GENOD) ? &mons[PM_DWARF_LORD] : mkclass(S_HUMANOID, 0);
|
||||
if(chance <= 5) return !(mvitals[PM_DWARF].mvflags & G_GONE) ? &mons[PM_DWARF] : mkclass(S_HUMANOID, 0);
|
||||
else if(chance <= 9) return !(mvitals[PM_DWARF_LORD].mvflags & G_GONE) ? &mons[PM_DWARF_LORD] : mkclass(S_HUMANOID, 0);
|
||||
}
|
||||
else if(chance <= 99){
|
||||
chance = d(1,31);
|
||||
|
@ -1336,23 +1339,23 @@ law_montype()
|
|||
else if(on_level(&arcadia2_level,&u.uz)){
|
||||
int chance = d(1,100);
|
||||
if(chance <= 20){
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GENOD) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 40){
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GENOD) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GONE) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 70){
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GENOD) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GONE) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 90){
|
||||
chance = d(1,6);
|
||||
if(chance <= 5) return !(mvitals[PM_DWARF].mvflags & G_GENOD) ? &mons[PM_DWARF] : mkclass(S_HUMANOID, 0);
|
||||
else if(chance <= 9) return !(mvitals[PM_DWARF_LORD].mvflags & G_GENOD) ? &mons[PM_DWARF_LORD] : mkclass(S_HUMANOID, 0);
|
||||
if(chance <= 5) return !(mvitals[PM_DWARF].mvflags & G_GONE) ? &mons[PM_DWARF] : mkclass(S_HUMANOID, 0);
|
||||
else if(chance <= 9) return !(mvitals[PM_DWARF_LORD].mvflags & G_GONE) ? &mons[PM_DWARF_LORD] : mkclass(S_HUMANOID, 0);
|
||||
}
|
||||
else if(chance <= 98){
|
||||
chance = d(1,6);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GENOD) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GENOD) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GONE) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GONE) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
} else {
|
||||
return &mons[PM_ARCADIAN_AVENGER];
|
||||
}
|
||||
|
@ -1360,18 +1363,18 @@ law_montype()
|
|||
else if(on_level(&arcadia3_level,&u.uz)){
|
||||
int chance = d(1,100);
|
||||
if(chance <= 20){
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GENOD) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 40){
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GENOD) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GONE) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 70){
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GENOD) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_GIANT_ANT].mvflags & G_GONE) ? &mons[PM_GIANT_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 90){
|
||||
chance = d(1,6);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GENOD) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GENOD) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GONE) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GONE) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
} else {
|
||||
return &mons[PM_ARCADIAN_AVENGER];
|
||||
}
|
||||
|
@ -1379,15 +1382,15 @@ law_montype()
|
|||
else if(on_level(&arcward_level,&u.uz) || on_level(&arcfort_level,&u.uz)){
|
||||
int chance = d(1,100);
|
||||
if(chance <= 20){
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GENOD) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_KILLER_BEE].mvflags & G_GONE) ? &mons[PM_KILLER_BEE] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 50){
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GENOD) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
return !(mvitals[PM_SOLDIER_ANT].mvflags & G_GONE) ? &mons[PM_SOLDIER_ANT] : mkclass(S_ANT, 0);
|
||||
}
|
||||
else if(chance <= 80){
|
||||
chance = d(1,6);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GENOD) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GENOD) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
if(chance <= 5) return !(mvitals[PM_SOLDIER].mvflags & G_GONE) ? &mons[PM_SOLDIER] : mkclass(S_HUMAN, 0);
|
||||
else return !(mvitals[PM_SERGEANT].mvflags & G_GONE) ? &mons[PM_SERGEANT] : mkclass(S_HUMAN, 0);
|
||||
} else {
|
||||
return &mons[PM_ARCADIAN_AVENGER];
|
||||
}
|
||||
|
|
76
src/sounds.c
76
src/sounds.c
|
@ -5715,6 +5715,48 @@ boolean inc_penalties;
|
|||
else maxskill = P_UNSKILLED;
|
||||
}
|
||||
|
||||
if(Air_crystal){
|
||||
if(p_skill == P_AXE
|
||||
|| p_skill == P_HEALING_SPELL
|
||||
|| p_skill == P_ATTACK_SPELL
|
||||
|| p_skill == P_DAGGER
|
||||
)
|
||||
maxskill = min(maxskill + 1, P_EXPERT);
|
||||
if(p_skill == P_BARE_HANDED_COMBAT)
|
||||
maxskill = min(maxskill + 1, P_GRAND_MASTER);
|
||||
}
|
||||
if(Fire_crystal){
|
||||
if(p_skill == P_LONG_SWORD
|
||||
|| p_skill == P_BOW
|
||||
|| p_skill == P_WAND_POWER
|
||||
|| p_skill == P_MATTER_SPELL
|
||||
)
|
||||
maxskill = min(maxskill + 1, P_EXPERT);
|
||||
}
|
||||
if(Water_crystal){
|
||||
if(p_skill == P_HAMMER
|
||||
|| p_skill == P_SPEAR
|
||||
|| p_skill == P_BROAD_SWORD
|
||||
|| p_skill == P_CLERIC_SPELL
|
||||
|| p_skill == P_MUSICALIZE
|
||||
)
|
||||
maxskill = min(maxskill + 1, P_EXPERT);
|
||||
}
|
||||
if(Earth_crystal){
|
||||
if(p_skill == P_ATTACK_SPELL
|
||||
|| p_skill == P_HEALING_SPELL
|
||||
|| p_skill == P_CLERIC_SPELL
|
||||
|| p_skill == P_DAGGER
|
||||
)
|
||||
maxskill = min(maxskill + 1, P_EXPERT);
|
||||
if(p_skill == P_BARE_HANDED_COMBAT)
|
||||
maxskill = min(maxskill + 1, P_GRAND_MASTER);
|
||||
}
|
||||
if(Black_crystal){
|
||||
if(p_skill == P_TWO_HANDED_SWORD)
|
||||
maxskill = min(maxskill + 1, P_EXPERT);
|
||||
}
|
||||
|
||||
if(p_skill == P_NIMAN){
|
||||
if(uwep && uwep->oartifact == ART_INFINITY_S_MIRRORED_ARC)
|
||||
maxskill = min(P_EXPERT, P_SKILL(weapon_type(uwep)));
|
||||
|
@ -5776,6 +5818,40 @@ boolean inc_penalties;
|
|||
if(OLD_P_SKILL(P_SHIEN) >= P_EXPERT) curskill++;
|
||||
}
|
||||
|
||||
if(Air_crystal){
|
||||
if(p_skill == P_BARE_HANDED_COMBAT
|
||||
|| p_skill == P_AXE
|
||||
|| p_skill == P_HEALING_SPELL
|
||||
|| p_skill == P_ATTACK_SPELL
|
||||
|| p_skill == P_DAGGER
|
||||
)
|
||||
curskill += 1;
|
||||
}
|
||||
if(Fire_crystal){
|
||||
if(p_skill == P_LONG_SWORD
|
||||
|| p_skill == P_BOW
|
||||
|| p_skill == P_WAND_POWER
|
||||
|| p_skill == P_MATTER_SPELL
|
||||
)
|
||||
curskill += 1;
|
||||
}
|
||||
if(Water_crystal){
|
||||
if(p_skill == P_HAMMER
|
||||
|| p_skill == P_SPEAR
|
||||
|| p_skill == P_CLERIC_SPELL
|
||||
|| p_skill == P_MUSICALIZE
|
||||
)
|
||||
curskill += 1;
|
||||
}
|
||||
if(Earth_crystal){
|
||||
if(p_skill == P_BARE_HANDED_COMBAT
|
||||
|| p_skill == P_ATTACK_SPELL
|
||||
|| p_skill == P_HEALING_SPELL
|
||||
|| p_skill == P_CLERIC_SPELL
|
||||
|| p_skill == P_DAGGER
|
||||
)
|
||||
curskill += 1;
|
||||
}
|
||||
if(p_skill == P_NIMAN && curskill < P_BASIC){
|
||||
if(uwep && uwep->oartifact == ART_INFINITY_S_MIRRORED_ARC){
|
||||
curskill = P_BASIC;
|
||||
|
|
118
src/spell.c
118
src/spell.c
|
@ -1073,6 +1073,7 @@ int menutype;
|
|||
|| (uwep && uwep->oartifact == ART_DEATH_SPEAR_OF_KEPTOLO)
|
||||
|| (uwep && uwep->oartifact == ART_ANNULUS && uwep->otyp == CHAKRAM)
|
||||
|| (uarmh && check_oprop(uarmh, OPROP_BLAST))
|
||||
|| Fire_crystal || Water_crystal || Air_crystal || Earth_crystal || Black_crystal
|
||||
)){
|
||||
You("don't know any spells right now.");
|
||||
return FALSE;
|
||||
|
@ -1412,33 +1413,99 @@ update_alternate_spells()
|
|||
int i;
|
||||
|
||||
// for artifacts
|
||||
if (uarmh){
|
||||
if(uarmh->oartifact == ART_STORMHELM){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_LIGHTNING_STORM) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_LIGHTNING_STORM;
|
||||
spl_book[i].sp_lev = objects[SPE_LIGHTNING_STORM].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if(uarmh && uarmh->oartifact == ART_STORMHELM){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_LIGHTNING_STORM) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_LIGHTNING_STORM;
|
||||
spl_book[i].sp_lev = objects[SPE_LIGHTNING_STORM].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(check_oprop(uarmh, OPROP_BLAST)){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_FIREBALL) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_FIREBALL;
|
||||
spl_book[i].sp_lev = objects[SPE_FIREBALL].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(Fire_crystal || (uarmh && check_oprop(uarmh, OPROP_BLAST))){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_FIREBALL) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_FIREBALL;
|
||||
spl_book[i].sp_lev = objects[SPE_FIREBALL].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Water_crystal){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_CONE_OF_COLD) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_CONE_OF_COLD;
|
||||
spl_book[i].sp_lev = objects[SPE_CONE_OF_COLD].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Air_crystal){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_LIGHTNING_BOLT) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_LIGHTNING_BOLT;
|
||||
spl_book[i].sp_lev = objects[SPE_LIGHTNING_BOLT].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Earth_crystal){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_DIG) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_DIG;
|
||||
spl_book[i].sp_lev = objects[SPE_DIG].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if(Black_crystal){
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_HASTE_SELF) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_HASTE_SELF;
|
||||
spl_book[i].sp_lev = objects[SPE_HASTE_SELF].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (i = 0; i < MAXSPELL; i++) {
|
||||
if (spellid(i) == SPE_EXTRA_HEALING) {
|
||||
if (spl_book[i].sp_know < 1) spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
if (spellid(i) == NO_SPELL) {
|
||||
spl_book[i].sp_id = SPE_EXTRA_HEALING;
|
||||
spl_book[i].sp_lev = objects[SPE_EXTRA_HEALING].oc_level;
|
||||
spl_book[i].sp_know = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5836,6 +5903,7 @@ int spell;
|
|||
|| uwep->oartifact == ART_PROFANED_GREATSCYTHE
|
||||
|| uwep->oartifact == ART_GARNET_ROD
|
||||
|| (Role_if(PM_KNIGHT) && uwep->oartifact == ART_MAGIC_MIRROR_OF_MERLIN)
|
||||
|| Black_crystal
|
||||
) splcaster -= urole.spelarmr;
|
||||
|
||||
if(uwep->obj_material == MERCURIAL)
|
||||
|
|
14
src/worn.c
14
src/worn.c
|
@ -669,7 +669,10 @@ struct monst *mon;
|
|||
if(mon->mvar2 & 0x4L) base = -125; //Fully Quantum Locked
|
||||
if(mon->mvar2 & 0x2L) base = -20; //Partial Quantum Lock
|
||||
}
|
||||
|
||||
else if(mon->mtyp == PM_CHAOS && !PURIFIED_WIND){
|
||||
base -= 6;
|
||||
}
|
||||
|
||||
if(is_alabaster_mummy(mon->data) && mon->mvar_syllable == SYLLABLE_OF_GRACE__UUR)
|
||||
base -= 10;
|
||||
|
||||
|
@ -866,6 +869,9 @@ struct monst *mon;
|
|||
}
|
||||
}
|
||||
}
|
||||
else if(mon->mtyp == PM_CHAOS && !PURIFIED_WIND){
|
||||
base -= 6;
|
||||
}
|
||||
|
||||
if(is_alabaster_mummy(mon->data) && mon->mvar_syllable == SYLLABLE_OF_GRACE__UUR)
|
||||
base -= 10;
|
||||
|
@ -998,6 +1004,9 @@ struct monst *mon;
|
|||
if(mon->mtyp == PM_CHOKHMAH_SEPHIRAH){
|
||||
base += u.chokhmah;
|
||||
}
|
||||
else if(mon->mtyp == PM_CHAOS && !PURIFIED_WIND){
|
||||
base += 4;
|
||||
}
|
||||
|
||||
if(mon->mtame){
|
||||
if(active_glyph(IMPURITY)) base += 3;
|
||||
|
@ -1022,6 +1031,9 @@ struct monst *mon;
|
|||
if(mon->mtyp == PM_CHOKHMAH_SEPHIRAH){
|
||||
base += u.chokhmah;
|
||||
}
|
||||
else if(mon->mtyp == PM_CHAOS && !PURIFIED_WIND){
|
||||
base += 4;
|
||||
}
|
||||
|
||||
if(mon->mtame){
|
||||
if(active_glyph(IMPURITY)) base += 3;
|
||||
|
|
|
@ -1914,6 +1914,7 @@ int * tohitmod; /* some attacks are made with decreased accuracy */
|
|||
(pa->mtyp == PM_KRAKEN__THE_FIEND_OF_WATER && rn2(100)<52) ||
|
||||
(pa->mtyp == PM_TIAMAT__THE_FIEND_OF_WIND && !rn2(4)) ||
|
||||
(pa->mtyp == PM_CHAOS && rn2(3)) ||
|
||||
(pa->mtyp == PM_DOOM_KNIGHT && !magr->mcan && !magr->mspec_used && !rn2(4)) ||
|
||||
(pa->mtyp == PM_GAE_ELADRIN && !magr->mcan && !magr->mspec_used && !rn2(3)) ||
|
||||
(pa->mtyp == PM_CAILLEA_ELADRIN && !magr->mcan && !magr->mspec_used)
|
||||
){
|
||||
|
@ -1925,6 +1926,10 @@ int * tohitmod; /* some attacks are made with decreased accuracy */
|
|||
/* just get the next attack */
|
||||
GETNEXT
|
||||
}
|
||||
if(pa->mtyp == PM_CHAOS && !PURIFIED_FIRE){
|
||||
if(attk->aatyp == AT_CLAW && attk->adtyp == AD_SQUE)
|
||||
attk->aatyp = AT_MARI;
|
||||
}
|
||||
}
|
||||
/*Lilitus actually skip their spellcasting attack unless the target has their status ailment*/
|
||||
if(!by_the_book && pa->mtyp == PM_LILITU && attk->adtyp == AD_CLRC){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue