1
0
Fork 0
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:
chris 2022-08-01 18:36:04 -04:00
parent 0e473859ec
commit 63dcc92dd4
18 changed files with 563 additions and 163 deletions

View file

@ -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

View file

@ -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
),

View file

@ -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 *));

View file

@ -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 \

View file

@ -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)

View file

@ -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)

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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);
}

View file

@ -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.

View file

@ -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*/

View file

@ -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) && (

View file

@ -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];
}

View file

@ -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;

View file

@ -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)

View file

@ -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;

View file

@ -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){