1
0
Fork 0
mirror of https://codeberg.org/noisytoot/notnotdnethack.git synced 2025-07-30 01:12:25 +01:00

Merge pull request #65 from NeroOneTrueKing/patch-m-twoweapon

Monster Twoweapon-ing
This commit is contained in:
Chris-plus-alphanumericgibberish 2018-01-04 22:16:10 -05:00 committed by GitHub
commit 38dc633ab6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 500 additions and 267 deletions

View file

@ -39,7 +39,8 @@
#define AT_DEVA 29 /* million-arm weapon attack */
#define AT_5SQR 30 /* five square reach touch */
#define AT_WEAP 254 /* uses weapon */
#define AT_WEAP 253 /* uses weapon */
#define AT_XWEP 254 /* uses offhanded weapon */
#define AT_MAGC 255 /* uses magic spell(s) */
/* Add new damage types below.

View file

@ -346,7 +346,7 @@
#define can_breathe(ptr) attacktype(ptr, AT_BREA)
#define cantwield(ptr) (nohands(ptr))
#define could_twoweap(ptr) ((ptr)->mattk[1].aatyp == AT_WEAP)
#define could_twoweap(ptr) attacktype(ptr, AT_XWEP)
// define cantweararm(ptr) (breakarm(ptr) || sliparm(ptr))
#define arm_match(ptr,obj) (Is_dragon_scales(obj) || \
(obj->otyp == ELVEN_TOGA && ((ptr->mflagsb&MB_HUMANOID) && (obj->bodytypeflag&MB_HUMANOID))) ||\

View file

@ -177,6 +177,7 @@ struct monst {
struct obj *minvent;
struct obj *mw;
struct obj *msw;
long misc_worn_check;
xchar weapon_check;
xchar combat_mode;
@ -235,6 +236,8 @@ struct monst {
#define MON_WEP(mon) ((mon)->mw)
#define MON_NOWEP(mon) ((mon)->mw = (struct obj *)0)
#define MON_SWEP(mon) ((mon)->msw)
#define MON_NOSWEP(mon) ((mon)->msw = (struct obj *)0)
#define DEADMONSTER(mon) ((mon)->mhp < 1)

View file

@ -3682,7 +3682,7 @@ char *title;
#else
if (do_all ? (mon->minvent != 0)
#endif
: (mon->misc_worn_check || MON_WEP(mon))) {
: (mon->misc_worn_check || MON_WEP(mon) || MON_SWEP(mon))) {
/* Fool the 'weapon in hand' routine into
* displaying 'weapon in claw', etc. properly.
*/

View file

@ -347,7 +347,7 @@ mattackm(magr, mdef)
|| mattk->aatyp == AT_MAGC
|| (mattk->aatyp == AT_TENT && magr->mfaction == SKELIFIED)
|| (i == 0 &&
(mattk->aatyp == AT_CLAW || mattk->aatyp == AT_WEAP) &&
(mattk->aatyp == AT_CLAW || mattk->aatyp == AT_WEAP || mattk->aatyp == AT_XWEP) &&
mattk->adtyp == AD_PHYS &&
mattk->damn*mattk->damd/2 < (magr->m_lev/10+1)*max(magr->data->msize*2, 4)/2
)
@ -389,31 +389,14 @@ mattackm(magr, mdef)
switch (mattk->aatyp) {
case AT_DEVA:
case AT_WEAP: /* weapon attacks */
case AT_WEAP:
case AT_XWEP: /* weapon attacks */
#define MAINHAND (mattk->aatyp != AT_XWEP)
#ifdef TAME_RANGED_ATTACKS
if (dist2(magr->mx,magr->my,mdef->mx,mdef->my) > 2)
{
thrwmm(magr, mdef);
if (tmphp > mdef->mhp){
res[i] = MM_HIT;
if(magr->mtame && canseemon(magr)) u.petattacked = TRUE;
} else res[i] = MM_MISS;
if (mdef->mhp < 1) res[i] = MM_DEF_DIED;
if (magr->mhp < 1) res[i] = MM_AGR_DIED;
break;
}
#endif /*TAME_RANGED_ATTACKS*/
if (magr->weapon_check == NEED_WEAPON || !MON_WEP(magr)) {
magr->weapon_check = NEED_HTH_WEAPON;
if (mon_wield_item(magr) != 0) return 0;
}
#ifdef TAME_RANGED_ATTACKS
if (!MON_WEP(magr) ||
is_launcher(MON_WEP(magr))) {
/* implies no melee weapon found */
if(thrwmm(magr, mdef)){
if (MAINHAND) {
if (dist2(magr->mx,magr->my,mdef->mx,mdef->my) > 2)
{
thrwmm(magr, mdef);
if (tmphp > mdef->mhp){
res[i] = MM_HIT;
if(magr->mtame && canseemon(magr)) u.petattacked = TRUE;
@ -423,10 +406,33 @@ mattackm(magr, mdef)
break;
}
}
#endif /*TAME_RANGED_ATTACKS*/
if (magr->weapon_check == NEED_WEAPON || (MAINHAND ? (!MON_WEP(magr)) : (!MON_SWEP(magr)))) {
magr->weapon_check = NEED_HTH_WEAPON;
if (mon_wield_item(magr) != 0) return 0;
}
#ifdef TAME_RANGED_ATTACKS
if (MAINHAND) {
if (!MON_WEP(magr) ||
is_launcher(MON_WEP(magr))) {
/* implies no melee weapon found */
if(thrwmm(magr, mdef)){
if (tmphp > mdef->mhp){
res[i] = MM_HIT;
if(magr->mtame && canseemon(magr)) u.petattacked = TRUE;
} else res[i] = MM_MISS;
if (mdef->mhp < 1) res[i] = MM_DEF_DIED;
if (magr->mhp < 1) res[i] = MM_AGR_DIED;
break;
}
}
}
#endif
possibly_unwield(magr, FALSE);
otmp = MON_WEP(magr);
otmp = (MAINHAND ? MON_WEP(magr) : MON_SWEP(magr));
#undef MAINHAND
if (otmp) {
if (vis) mswingsm(magr, mdef, otmp);
tmp += hitval(otmp, mdef);
@ -489,7 +495,7 @@ meleeattack:
* players, or under conflict or confusion.
*/
if (!magr->mconf && !Conflict && otmp &&
mattk->aatyp != AT_WEAP && mattk->aatyp != AT_DEVA && mattk->aatyp != AT_BEAM &&
mattk->aatyp != AT_WEAP && mattk->aatyp != AT_XWEP && mattk->aatyp != AT_DEVA && mattk->aatyp != AT_BEAM &&
mattk->adtyp != AD_STAR && mattk->adtyp != AD_BLUD && mattk->adtyp != AD_SHDW &&
touch_petrifies(mdef->data)
) {
@ -1295,7 +1301,7 @@ physical:{
oarm = which_armor(magr, W_ARMG);
if (mattk->aatyp == AT_KICK && thick_skinned(pd)) {
tmp = 0;
} else if(mattk->aatyp == AT_WEAP || mattk->aatyp == AT_DEVA) {
} else if(mattk->aatyp == AT_WEAP || mattk->aatyp == AT_DEVA || mattk->aatyp == AT_XWEP) {
if(otmp) {
if (otmp->otyp == CORPSE &&
touch_petrifies(&mons[otmp->corpsenm]))
@ -1449,7 +1455,7 @@ physical:{
/////////////////////////////////////////////////
case AD_STDY:
if(canseemon(magr) && mattk->aatyp == AT_GAZE){
Sprintf(buf,"%s studies ", Monnam(magr));
Sprintf(buf,"%s studies", Monnam(magr));
pline("%s %s intently.", buf, mon_nam(mdef));
}
if (!magr->mcan && !is_blind(magr)) {
@ -2638,6 +2644,7 @@ int aatyp;
case AT_TUCH:
case AT_5SQR:
case AT_WEAP:
case AT_XWEP:
case AT_DEVA:
w_mask = W_ARMG; /* caller needs to check for weapon */
break;

View file

@ -150,7 +150,7 @@ mpoisons_subj(mtmp, mattk)
struct monst *mtmp;
struct attack *mattk;
{
if (mattk->aatyp == AT_WEAP) {
if (mattk->aatyp == AT_WEAP || mattk->aatyp == AT_XWEP) {
struct obj *mwep = (mtmp == &youmonst) ? uwep : MON_WEP(mtmp);
/* "Foo's attack was poisoned." is pretty lame, but at least
it's better than "sting" when not a stinging attack... */
@ -340,7 +340,22 @@ struct attack *alt_attk_buf;
return attk;
} else subout = 0;
}
/* twoweapon symmetry -- if the previous attack missed, do not make an offhand attack */
if (indx > 0 && prev_result[indx - 1] <= 0 && attk->aatyp == AT_XWEP)
{
subout = 1;
*alt_attk_buf = *attk;
attk = alt_attk_buf;
attk->aatyp = AT_NONE;
attk->adtyp = AD_PHYS;
attk->damn = 0;
attk->damd = 0;
return attk;
}
else
subout = 0;
if(subout){
*alt_attk_buf = *attk;
attk = alt_attk_buf;
@ -350,7 +365,7 @@ struct attack *alt_attk_buf;
attk->damd = 0;
return attk;
}
/* prevent a monster with two consecutive disease or hunger attacks
from hitting with both of them on the same turn; if the first has
already hit, switch to a stun attack for the second */
@ -716,7 +731,7 @@ mattacku(mtmp)
|| mattk->aatyp == AT_MAGC
|| (mattk->aatyp == AT_TENT && mtmp->mfaction == SKELIFIED)
|| (i == 0 &&
(mattk->aatyp == AT_CLAW || mattk->aatyp == AT_WEAP) &&
(mattk->aatyp == AT_CLAW || mattk->aatyp == AT_WEAP || mattk->aatyp == AT_XWEP) &&
mattk->adtyp == AD_PHYS &&
mattk->damn*mattk->damd/2 < (mtmp->m_lev/10+1)*max(mtmp->data->msize*2, 4)/2
)
@ -1109,6 +1124,57 @@ mattacku(mtmp)
wildmiss(mtmp, mattk);
}
break;
case AT_XWEP:
if(range2) {
// Offhand ranged attacks disallowed. This is inconsistent for gun usage -- players can, monsters can't. Oh well.
break;
} else {
int hittmp = 0;
/* Rare but not impossible. Normally the monster
* wields when 2 spaces away, but it can be
* teleported or whatever....
*/
if (mtmp->weapon_check == NEED_WEAPON || !MON_SWEP(mtmp)) {
mtmp->weapon_check = NEED_HTH_WEAPON;
/* mon_wield_item resets weapon_check as
* appropriate */
if (mon_wield_item(mtmp) != 0) break;
}
if (foundyou) {
otmp = MON_SWEP(mtmp);
if(otmp) {
hittmp = hitval(otmp, &youmonst);
tmp += hittmp;
tchtmp += hittmp;
if(otmp->objsize - mtmp->data->msize > 0){
tmp += -4*(otmp->objsize - mtmp->data->msize);
tchtmp += -2*(otmp->objsize - mtmp->data->msize);
}
mswings(mtmp, otmp);
}
if(otmp && ((is_lightsaber(otmp) && litsaber(otmp)) || arti_shining(otmp))){
if(tchtmp > (j = dieroll = rnd(20+i*2))){
sum[i] = hitmu(mtmp, mattk);
} else missmu(mtmp, (tchtmp == j), mattk);
} else {
if(tmp > (j = dieroll = rnd(20+i*2))){
sum[i] = hitmu(mtmp, mattk);
} else missmu(mtmp, (tmp == j), mattk);
}
/* KMH -- Don't accumulate to-hit bonuses */
if (otmp){
tmp -= hittmp;
tchtmp -= hittmp;
if(otmp->objsize - mtmp->data->msize > 0){
tmp += 4*(otmp->objsize - mtmp->data->msize);
tchtmp += 2*(otmp->objsize - mtmp->data->msize);
}
}
} else
wildmiss(mtmp, mattk);
}
break;
case AT_HODS:
if(!range2){
int hittmp = 0;
@ -1630,7 +1696,7 @@ hitmu(mtmp, mattk)
}
if(oarm && dmg && oarm->otyp == GAUNTLETS_OF_POWER) dmg += 16;
} else { /* hand to hand weapon */
if(mattk->aatyp == AT_WEAP && otmp) {
if((mattk->aatyp == AT_WEAP || mattk->aatyp == AT_XWEP) && otmp) {
if (otmp->otyp == CORPSE &&
touch_petrifies(&mons[otmp->corpsenm])) {
dmg = 1;
@ -3020,6 +3086,7 @@ dopois:
pline("%s's shrapnel hits your armor!", Monnam(mtmp));
break;
case AT_WEAP:
case AT_XWEP:
pline("%s's weapon strikes your armor!", Monnam(mtmp));
break;
default:

View file

@ -689,7 +689,7 @@ NEARDATA struct permonst mons[] = {
MA_ORC /*MA*/, MV_LOWLIGHT2 /*MV*/, CLR_BROWN),
MON("dwarf lord", S_HUMANOID,//6
LVL(4, 6, 10, 10, 5), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_DWARF, CN_DWARF, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
MM_TUNNEL|MM_NEEDPICK /*MM*/, MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_OMNIVORE /*MT*/,
@ -713,7 +713,7 @@ NEARDATA struct permonst mons[] = {
MA_HUMAN|MA_ELF|MA_DROW|MA_DWARF|MA_GNOME|MA_ORC|MA_DEMIHUMAN /*MA*/, MV_LIFESENSE|MV_NORMAL /*MV*/, CLR_ORANGE),
MON("dwarf king", S_HUMANOID,//8
LVL(6, 6, 10, 20, 6), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_XWEP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_DWARF, CN_DWARF, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
MM_TUNNEL|MM_NEEDPICK /*MM*/, MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_OMNIVORE /*MT*/,
@ -729,7 +729,7 @@ NEARDATA struct permonst mons[] = {
MA_DWARF /*MA*/, MV_INFRAVISION|MV_NORMAL /*MV*/, HI_LORD),
MON("deep one", S_HUMANOID, //10
LVL(7, 9, 5, 10, 0), (G_LGROUP|G_NOHELL|2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
ATTK(AT_KICK, AD_PHYS, 2, 4), ATTK(AT_NONE, AD_SOUL, 0, 0), NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, CN_HUMAN, 0, MS_GURGLE, MZ_HUMAN), MR_COLD|MR_POISON|MR_SLEEP, MR_SLEEP,
MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_OMNIVORE|MT_HOSTILE|MT_STALK|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_MAGIC|MT_TRAITOR /*MT*/,
@ -754,7 +754,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMIHUMAN|MA_PRIMORDIAL /*MA*/, MV_TELEPATHIC|MV_DARKSIGHT|MV_RLYEHIAN|MV_SEE_INVIS /*MV*/, CLR_MAGENTA),
MON("master mind flayer", S_HUMANOID,//17
LVL(13, 12, 0, 90, 0), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_TENT, AD_DRIN, 1, 4),
ATTK(AT_TENT, AD_DRIN, 1, 2), ATTK(AT_TENT, AD_DRIN, 1, 2),
NO_ATTK),
@ -764,7 +764,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMIHUMAN|MA_PRIMORDIAL /*MA*/, MV_DARKSIGHT|MV_RLYEHIAN|MV_SEE_INVIS|MV_TELEPATHIC /*MV*/, CLR_MAGENTA),
MON("gnoll", S_HUMANOID,//16
LVL(14, 12, 5, 10, -5), (G_GENO|G_SGROUP|G_HELL|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_BITE, AD_PHYS, 2, 2), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1600, CN_HUMAN, 0, MS_LAUGH, MZ_MEDIUM), 0, 0,
0 /*MM*/, MT_HOSTILE|MT_COLLECT|MT_MAGIC|MT_GREEDY|MT_JEWELS|MT_TRAITOR|MT_CARNIVORE /*MT*/,
@ -781,7 +781,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMIHUMAN|MA_REPTILIAN /*MA*/, MV_TELEPATHIC|MV_INFRAVISION|MV_NORMAL /*MV*/, CLR_WHITE),
MON("deeper one", S_HUMANOID,//20
LVL(15,12, 0, 30, 0), (G_SGROUP|G_NOHELL|2),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_XWEP, AD_PHYS, 3, 4),
ATTK(AT_KICK, AD_PHYS, 4, 6), ATTK(AT_NONE, AD_SOUL, 3, 4), NO_ATTK, NO_ATTK),
SIZ(2000, 500, 0, MS_GURGLE, MZ_HUMAN), MR_COLD|MR_POISON|MR_SLEEP, MR_SLEEP,
MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_OMNIVORE|MT_HOSTILE|MT_STALK|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_MAGIC|MT_TRAITOR /*MT*/,
@ -789,7 +789,7 @@ NEARDATA struct permonst mons[] = {
MA_HUMAN|MA_DEMIHUMAN|MA_AQUATIC /*MA*/, MV_INFRAVISION|MV_NORMAL /*MV*/, CLR_BRIGHT_GREEN),
MON("anubite", S_HUMANOID,//20
LVL(18, 14, 5, 10, -10), (G_GENO|G_SGROUP|G_HELL|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 2, 8),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_XWEP, AD_PHYS, 2, 8),
ATTK(AT_BITE, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1800, CN_HUMAN, 0, MS_ORC, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_HOSTILE|MT_COLLECT|MT_MAGIC|MT_TRAITOR|MT_CARNIVORE /*MT*/,
@ -843,7 +843,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION /*MV*/, CLR_BLUE),
MON("nupperibo", S_IMP,//
LVL(4, 4, 6, 4, 8), (G_GENO|G_LGROUP|G_NOCORPSE|G_HELL|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 2), ATTK(AT_WEAP, AD_PHYS, 1, 2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 2), ATTK(AT_XWEP, AD_PHYS, 1, 2),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(150, 100, 0, MS_SILENT, MZ_SMALL),
MR_POISON, 0,
@ -894,7 +894,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMON /*MA*/, MV_EXTRAMISSION /*MV*/, CLR_GRAY),
MON("legion devil sergeant", S_IMP,//14
LVL(10, 18, 1, 60, 12), (G_NOGEN|G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_XWEP, AD_PHYS, 3, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, CN_HUMAN, 0, MS_SOLDIER, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
0 /*MM*/, MT_WAITFORU|MT_STALK|MT_HOSTILE|MT_OMNIVORE|MT_COLLECT|MT_BOLD /*MT*/,
@ -902,7 +902,7 @@ NEARDATA struct permonst mons[] = {
MA_DEMON /*MA*/, MV_EXTRAMISSION /*MV*/, CLR_GREEN),
MON("legion devil captain", S_IMP,//16
LVL(12, 20, -2, 70, 14), (G_NOGEN|G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, CN_HUMAN, 0, MS_SOLDIER, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
0 /*MM*/, MT_WAITFORU|MT_STALK|MT_HOSTILE|MT_OMNIVORE|MT_COLLECT|MT_BOLD /*MT*/,
@ -1111,7 +1111,7 @@ NEARDATA struct permonst mons[] = {
MA_FEY /*MA*/, MV_LOWLIGHT3|MV_INFRAVISION /*MV*/, CLR_BRIGHT_CYAN),
MON("deminymph", S_NYMPH,//?? /*Needs tile*/
LVL(10, 12, 10, 10, -5), (G_GENO|G_NOHELL|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_CLAW, AD_SEDU, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0),
NO_ATTK, NO_ATTK),
SIZ((WT_HUMAN+WT_ELF)/2, 350, 0, MS_SEDUCE, MZ_HUMAN), 0, 0,
@ -1130,7 +1130,7 @@ NEARDATA struct permonst mons[] = {
MA_UNDEAD|MA_DEMON|MA_UNLIVING|MA_ET /*MA*/, MV_BLOODSENSE|MV_DARKSIGHT /*MV*/, CLR_RED),
MON("intoner", S_NYMPH,//?? /*Needs tile*/
LVL(30, 18, 0, 30, -10), (G_HELL|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_CLAW, AD_SEDU, 0, 0), ATTK(AT_CLAW, AD_SEDU, 0, 0),
ATTK(AT_MAGC, AD_SPEL, 0, 8), NO_ATTK),
SIZ(WT_HUMAN, CN_HUMAN, 0, MS_INTONE, MZ_HUMAN),
@ -1212,7 +1212,7 @@ NEARDATA struct permonst mons[] = {
MA_ORC /*MA*/, MV_LOWLIGHT2 /*MV*/, HI_ZAP),
MON("orc-captain", S_ORC,//7
LVL(5, 9, 10, 0, -5), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
ATTK(AT_GAZE, AD_STDY, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1350, 350, 0, MS_ORC, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_TRAITOR /*MT*/,
@ -1220,7 +1220,7 @@ NEARDATA struct permonst mons[] = {
MA_ORC /*MA*/, MV_LOWLIGHT2 /*MV*/, HI_LORD),
MON("Uruk-captain", S_ORC,//7
LVL(5, 12, 10, 0, 4), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_WEAP, AD_PHYS, 1, 10),
A(ATTK(AT_WEAP, AD_PHYS, 1, 10), ATTK(AT_XWEP, AD_PHYS, 1, 10),
ATTK(AT_GAZE, AD_STDY, 5, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1350, 350, 0, MS_ORC, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_TRAITOR /*MT*/,
@ -1228,7 +1228,7 @@ NEARDATA struct permonst mons[] = {
MA_ORC|MA_HUMAN /*MA*/, MV_LOWLIGHT2 /*MV*/, CLR_WHITE),
MON("Angband orc", S_ORC,//
LVL(20, 18, 5, 25, -10), (G_GENO|G_LGROUP|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_XWEP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1200, 200, 0, MS_ORC, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_TRAITOR /*MT*/,
@ -1236,7 +1236,7 @@ NEARDATA struct permonst mons[] = {
MA_ORC /*MA*/, MV_LOWLIGHT2|MV_SEE_INVIS /*MV*/, CLR_CYAN),
MON("orc of the ages of stars", S_ORC,//
LVL(30, 24, -5, 45, -15), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_WEAP, AD_PHYS, 4, 8),
A(ATTK(AT_WEAP, AD_PHYS, 4, 8), ATTK(AT_XWEP, AD_PHYS, 4, 8),
ATTK(AT_GAZE, AD_STDY, 5, 8), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_ORC, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_TRAITOR /*MT*/,
@ -2178,7 +2178,7 @@ then fill new spaces with our spawn!
MON("lillend", S_CHA_ANGEL,//11 /*Needs tile*/
LVL(14, 10, 5, 33, -12), (G_PLANES|G_NOHELL|G_SGROUP|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
ATTK(AT_HUGS, AD_WRAP, 2, 4), NO_ATTK,
NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SONG, MZ_HUMAN), MR_POISON, 0,
@ -2222,7 +2222,7 @@ then fill new spaces with our spawn!
MA_MINION|MA_FEY /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_LOWLIGHT3 /*MV*/, CLR_BROWN),
MON("Firre Eladrin", S_CHA_ANGEL,//12 /*Needs tile*/
LVL(10, 12, 6, 30, -7), (G_PLANES|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
ATTK(AT_GAZE, AD_FIRE, 1,10), ATTK(AT_NONE, AD_FIRE, 0, 4),
NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_FIRE|MR_SLEEP|MR_POISON, MR_SLEEP,
@ -2259,8 +2259,8 @@ then fill new spaces with our spawn!
/*Eladrin Lords and Ladies*/
MON("Gwynharwyf", S_CHA_ANGEL,// /*Needs encyc entry*//*Needs tile*/
LVL(63, 24, -6, 30, -20), (G_PLANES|G_NOCORPSE|G_NOGEN|G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
NO_ATTK, NO_ATTK),
SIZ(WT_DWARF, 350, 0, MS_HUMANOID, MZ_HUMAN),
MR_FIRE|MR_ELEC|MR_COLD|MR_SLEEP|MR_POISON|MR_STONE, MR_SLEEP,
@ -2269,8 +2269,8 @@ then fill new spaces with our spawn!
MA_MINION|MA_FEY /*MA*/, MV_CATSIGHT|MV_SEE_INVIS|MV_LOWLIGHT3 /*MV*/, HI_LORD),
MON("furious whirlwind", S_ELEMENTAL,// /*Needs encyc entry*/
LVL(63, 42, -6, 30, -20), (G_PLANES|G_NOCORPSE|G_NOGEN|G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
ATTK(AT_ENGL, AD_PHYS, 1, 20), NO_ATTK),
SIZ(0, 0, 0, MS_SILENT, MZ_HUGE),
MR_FIRE|MR_ELEC|MR_COLD|MR_SLEEP|MR_POISON|MR_STONE, MR_SLEEP,
@ -2516,7 +2516,7 @@ then fill new spaces with our spawn!
MA_ARACHNID|MA_DROW|MA_ELF /*MA*/, MV_DARKSIGHT /*MV*/, CLR_BLACK),
MON("drider", S_CENTAUR,
LVL(16, 15, 2, 10, -18), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 1,10), ATTK(AT_WEAP, AD_PHYS, 1,10),
A(ATTK(AT_WEAP, AD_PHYS, 1,10), ATTK(AT_XWEP, AD_PHYS, 1,10),
ATTK(AT_BITE, AD_DRST, 1, 1), ATTK(AT_KICK, AD_WEBS, 1, 1),
ATTK(AT_SPIT, AD_WEBS, 2, 4), NO_ATTK),
SIZ(2550, 500, 0, MS_HUMANOID, MZ_MEDIUM), MR_SLEEP, MR_SLEEP,
@ -2525,7 +2525,7 @@ then fill new spaces with our spawn!
MA_ARACHNID|MA_DROW|MA_ELF /*MA*/, MV_DARKSIGHT /*MV*/, CLR_WHITE),
MON("priestess of Ghaunadaur", S_CENTAUR, /*Needs tile*/
LVL(18, 15, 2, 10, 15), (G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 1,10), ATTK(AT_WEAP, AD_PHYS, 1,10),
A(ATTK(AT_WEAP, AD_PHYS, 1,10), ATTK(AT_XWEP, AD_PHYS, 1,10),
ATTK(AT_BITE, AD_CORR, 3, 8), ATTK(AT_KICK, AD_WEBS, 1, 1),
ATTK(AT_MAGC, AD_CLRC, 0, 8), ATTK(AT_NONE, AD_ACID, 2, 12)),
SIZ(2550, 500, 0, MS_HUMANOID, MZ_MEDIUM), MR_SLEEP, MR_SLEEP,
@ -2900,7 +2900,7 @@ then fill new spaces with our spawn!
MA_ELEMENTAL /*MA*/, MV_NORMAL /*MV*/, CLR_GREEN),
MON("terracotta soldier", S_ELEMENTAL,//10 /*Needs encyc entry*//*Needs tile*/
LVL(10, 12, 2, 30, 0), (G_NOCORPSE|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 6, 6), ATTK(AT_WEAP, AD_PHYS, 6, 6),
A(ATTK(AT_WEAP, AD_PHYS, 6, 6), ATTK(AT_XWEP, AD_PHYS, 6, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_LARGE /*Hollow*/, 0, 0, MS_SILENT, MZ_HUGE),
MR_FIRE|MR_COLD|MR_POISON|MR_STONE, 0,
@ -3080,7 +3080,7 @@ then fill new spaces with our spawn!
MA_GNOME /*MA*/, MV_LOWLIGHT2|MV_INFRAVISION /*MV*/, CLR_BLUE),
MON("gnome lady", S_GNOME,//4
LVL(3, 8, 10, 4, 0), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_WEAP, AD_PHYS, 1, 1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_XWEP, AD_PHYS, 1, 1),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(700, 120, 0, MS_HUMANOID, MZ_SMALL), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -3112,7 +3112,7 @@ then fill new spaces with our spawn!
MA_GNOME /*MA*/, MV_LOWLIGHT2|MV_INFRAVISION /*MV*/, HI_LORD),
MON("gnome queen", S_GNOME,//6
LVL(5, 10, 10, 20, 0), (G_GENO|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_WEAP, AD_PHYS, 1, 3),
A(ATTK(AT_WEAP, AD_PHYS, 1, 3), ATTK(AT_XWEP, AD_PHYS, 1, 3),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(750, 150, 0, MS_HUMANOID, MZ_SMALL), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -3179,7 +3179,7 @@ then fill new spaces with our spawn!
MA_CLOCK|MA_UNLIVING|MA_DEMON /*MA*/, MV_NORMAL /*MV*/, CLR_RED),
MON("clockwork automaton", S_GNOME,// /*Needs tile*/
LVL(20, 12, 7, 30, 0), (G_GENO|G_NOCORPSE|G_NOGEN),
A( ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
A( ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_XWEP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 0, 0, MS_HUMANOID, MZ_HUMAN),
MR_STONE|MR_POISON|MR_SICK, 0,
@ -3258,7 +3258,7 @@ struct permonst _mons2[] = {
MA_GIANT|MA_DEMIHUMAN /*MA*/, MV_NORMAL|MV_SEE_INVIS|MV_INFRAVISION /*MV*/, CLR_GRAY),
MON("ettin", S_GIANT,//13
LVL(10, 12, 3, 0, 0), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 3, 6),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_XWEP, AD_PHYS, 3, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUGE, CN_HUGE, 0, MS_GRUNT, MZ_HUGE), 0, 0,
0 /*MM*/, MT_HOSTILE|MT_ANIMAL|MT_CARNIVORE|MT_COLLECT /*MT*/,
@ -3307,7 +3307,7 @@ struct permonst _mons2[] = {
MA_GIANT|MA_DEMIHUMAN /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_WHITE),
MON("deepest one", S_GIANT,
LVL(30, 15, -5, 70, 0), (1|G_NOHELL),//36
A(ATTK(AT_WEAP, AD_PHYS, 3, 8), ATTK(AT_WEAP, AD_PHYS, 3, 8),
A(ATTK(AT_WEAP, AD_PHYS, 3, 8), ATTK(AT_XWEP, AD_PHYS, 3, 8),
ATTK(AT_KICK, AD_PHYS, 5, 6), ATTK(AT_NONE, AD_SOUL, 0, 0), NO_ATTK, NO_ATTK),
SIZ(WT_HUGE, CN_HUGE, 0, MS_GURGLE, MZ_HUGE), MR_COLD|MR_POISON|MR_SLEEP, MR_SLEEP,
MM_SWIM|MM_AMPHIBIOUS /*MM*/, MT_OMNIVORE|MT_HOSTILE|MT_STALK|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_MAGIC|MT_TRAITOR /*MT*/,
@ -3468,7 +3468,7 @@ struct permonst _mons2[] = {
MA_UNDEAD|MA_ELF /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_BRIGHT_GREEN),
MON("death knight", S_LICH,//21 /*Needs (better) encyc entry*/
LVL(17, 18, -4, 45, -15), (G_HELL|G_GENO|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 8, 8), ATTK(AT_WEAP, AD_PHYS, 8, 8),
A(ATTK(AT_WEAP, AD_PHYS, 8, 8), ATTK(AT_XWEP, AD_PHYS, 8, 8),
ATTK(AT_TUCH, AD_COLD, 4, 6), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1200, 100, 0, MS_MUMBLE, MZ_HUMAN),
MR_FIRE|MR_COLD|MR_SLEEP|MR_POISON, MR_FIRE|MR_COLD,
@ -3685,7 +3685,7 @@ struct permonst _mons2[] = {
MA_REPTILIAN|MA_DEMIHUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_GREEN),
MON("ancient naga", S_NAGA,//16
LVL(20, 18, -10, 10, 10), (G_NOHELL|G_SGROUP|G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_WEAP, AD_PHYS, 4, 6),
A(ATTK(AT_WEAP, AD_PHYS, 4, 6), ATTK(AT_XWEP, AD_PHYS, 4, 6),
ATTK(AT_HUGS, AD_PHYS, 4, 20), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(3500, CN_HUGE, 0, MS_MUMBLE, MZ_HUGE), MR_ELEC|MR_FIRE|MR_POISON|MR_STONE|MR_POISON, MR_ELEC|MR_FIRE|MR_POISON|MR_STONE,
0 /*MM*/, MT_OMNIVORE /*MT*/,
@ -3728,8 +3728,8 @@ struct permonst _mons2[] = {
MA_ORC /*MA*/, MV_LOWLIGHT2 /*MV*/, HI_LORD),
MON("siege ogre", S_OGRE,//26
LVL(20, 6, 0, 80, -7), (G_GENO|2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_WEAP, AD_PHYS, 1, 12),
ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_WEAP, AD_PHYS, 1, 12),
A(ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_XWEP, AD_PHYS, 1, 12),
ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_XWEP, AD_PHYS, 1, 12),
ATTK(AT_ARRW, AD_PHYS, 1, 12), ATTK(AT_NONE, AD_ACID, 1, 12)),
SIZ(WT_HUGE, CN_HUGE, 0, MS_GRUNT, MZ_HUGE), 0, 0,
0 /*MM*/, MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_CARNIVORE /*MT*/,
@ -4107,7 +4107,7 @@ struct permonst _mons2[] = {
MA_UNDEAD|MA_DEMON /*MA*/, MV_LIFESENSE /*MV*/, CLR_RED),
MON("Nazgul", S_WRAITH,//22 //Can't be permanently killed
LVL(13, 14, 0, 45, -17), (1|G_SGROUP|G_NOCORPSE),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_BREA, AD_SLEE, 2,25), ATTK(AT_TUCH, AD_DRLI, 1, 4),
ATTK(AT_MAGC, AD_SPEL, 2, 6), ATTK(AT_GAZE, AD_DRLI, 2, 6)),
SIZ(WT_HUMAN, 0, 0, MS_SPELL, MZ_HUMAN),
@ -4550,7 +4550,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_GRAY),
MON("prison guard", S_HUMAN,//14 /*Needs encyc entry*/
LVL(12, 10, 10, 15, -6), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_BRIBE, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_STALK|MT_HOSTILE|MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -4631,7 +4631,7 @@ struct permonst _mons2[] = {
MA_ELF /*MA*/, MV_LOWLIGHT3|MV_SEE_INVIS /*MV*/, CLR_GRAY),
MON("hedrow warrior", S_HUMAN,//10 /*Needs encyc entry*/
LVL(6, 12, 10, 60, -9), (G_GENO|G_SGROUP|2),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_XWEP, AD_PHYS, 1, 4),
ATTK(AT_MMGC, AD_SPEL, 0, 3), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
0 /*MM*/, MT_TRAITOR|MT_COLLECT|MT_HOSTILE|MT_OMNIVORE /*MT*/,
@ -4639,7 +4639,7 @@ struct permonst _mons2[] = {
MA_ELF|MA_DROW /*MA*/, MV_DARKSIGHT /*MV*/, CLR_BLACK),
MON("elf-lord", S_HUMAN,//11
LVL(9, 12, 10, 20, -9), (G_GENO|G_SGROUP|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -4679,7 +4679,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("maid", S_HUMAN,//13 /*Needs encyc entry*/
LVL(11, 12, 0, 0, 5), (G_GENO|3),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_MAID /*MT*/,
@ -4687,7 +4687,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("Elvenking", S_HUMAN,//14
LVL(12, 12, 10, 25, -10), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -4720,7 +4720,7 @@ struct permonst _mons2[] = {
MA_ELF|MA_DROW /*MA*/, MV_DARKSIGHT /*MV*/, CLR_BLACK),
MON("hedrow blademaster", S_HUMAN,//18 /*Needs encyc entry*//*Needs better tile?*/
LVL(14, 14, 10, 60, -6), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_XWEP, AD_PHYS, 3, 4),
ATTK(AT_MMGC, AD_SPEL, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP, MR_SLEEP,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT|MT_HOSTILE|MT_TRAITOR /*MT*/,
@ -4736,7 +4736,7 @@ struct permonst _mons2[] = {
MA_ELF|MA_DROW /*MA*/, MV_DARKSIGHT /*MV*/, CLR_GRAY),
MON("shopkeeper", S_HUMAN,//18
LVL(15, 18, 0, 50, 0), G_NOGEN, /*level raised so as to avoid being attacked by horses*/
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, sizeof(struct eshk), MS_SELL, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT|MT_MAGIC /*MT*/,
@ -4839,7 +4839,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_RED),
MON("lieutenant", S_HUMAN,//12
LVL(10, 10, 10, 15, 4), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_XWEP, AD_PHYS, 3, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_STALK|MT_HOSTILE|MT_COLLECT /*MT*/,
@ -4847,7 +4847,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_GREEN),
MON("captain", S_HUMAN,//14
LVL(12, 10, 10, 15, 5), (G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_STALK|MT_HOSTILE|MT_COLLECT /*MT*/,
@ -4866,7 +4866,7 @@ struct permonst _mons2[] = {
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, CLR_GRAY),
MON("watch captain", S_HUMAN,//12
LVL(10, 10, 10, 15, -4), (G_NOGEN|G_GENO|1),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_WEAP, AD_PHYS, 3, 4),
A(ATTK(AT_WEAP, AD_PHYS, 3, 4), ATTK(AT_XWEP, AD_PHYS, 3, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SOLDIER, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_STALK|MT_PEACEFUL|MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -4952,7 +4952,7 @@ is a red right hand
*/
MON("garo", S_GHOST,//6
LVL(4, 14, 5, 4, 4), (G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_WEAP, AD_PHYS, 1, 1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_XWEP, AD_PHYS, 1, 1),
ATTK(AT_BOOM, AD_GARO, 4, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_TINY, 0, 0, MS_SILENT, MZ_SMALL),
MR_COLD|MR_DISINT|MR_SLEEP|MR_POISON|MR_SICK|MR_DRAIN, 0,
@ -4970,7 +4970,7 @@ is a red right hand
MA_UNDEAD /*MA*/, MV_INFRAVISION|MV_OMNI /*MV*/, CLR_GRAY),
MON("garo master", S_GHOST,//22
LVL(18, 18, -5, 18, 18), (G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
ATTK(AT_BOOM, AD_GARO_MASTER, 4, 8), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_SMALL, 0, 0, MS_SILENT, MZ_HUMAN),
MR_COLD|MR_DISINT|MR_SLEEP|MR_POISON|MR_SICK|MR_DRAIN, 0,
@ -5058,7 +5058,7 @@ is a red right hand
/* and spelled this way */
MON("erinys", S_DEMON,//12
LVL(7, 12, -3, 33, 10), (G_HELL|G_NOCORPSE|G_SGROUP|2),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 1, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_SILENT, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
MM_FLY /*MM*/, MT_STALK|MT_HOSTILE|MT_COLLECT|MT_BOLD /*MT*/,
@ -5127,7 +5127,7 @@ is a red right hand
MA_DEMON /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_RED),
MON("ice devil", S_DEMON,//14
LVL(11, 6, -4, 55, 12), (G_HELL|G_NOCORPSE|2),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_WEAP, AD_PHYS, 4, 4),
A(ATTK(AT_WEAP, AD_PHYS, 4, 4), ATTK(AT_XWEP, AD_PHYS, 4, 4),
ATTK(AT_BITE, AD_PHYS, 2, 4), ATTK(AT_STNG, AD_ECLD, 5, 4),
NO_ATTK, NO_ATTK),
SIZ(WT_LARGE, 400, 0, MS_SILENT, MZ_LARGE),
@ -5146,9 +5146,9 @@ is a red right hand
MA_DEMON /*MA*/, MV_CATSIGHT|MV_INFRAVISION /*MV*/, HI_ZAP),
MON("marilith", S_DEMON,//15
LVL(11, 12, -3, 80, -12), (G_HELL|G_NOCORPSE|2), /* -33 if armed */
A(ATTK(AT_WEAP, AD_PHYS, 1, 20), ATTK(AT_WEAP, AD_PHYS, 1, 20),
ATTK(AT_WEAP, AD_PHYS, 1, 20), ATTK(AT_HUGS, AD_WRAP, 4, 6),
NO_ATTK, NO_ATTK),
A(ATTK(AT_WEAP, AD_PHYS, 1, 15), ATTK(AT_XWEP, AD_PHYS, 1, 15),
ATTK(AT_WEAP, AD_PHYS, 1, 15), ATTK(AT_XWEP, AD_PHYS, 1, 15),
ATTK(AT_HUGS, AD_WRAP, 4, 6), NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_CUSS, MZ_HUMAN), MR_FIRE|MR_POISON, 0,
0 /*MM*/, MT_STALK|MT_HOSTILE|MT_COLLECT|MT_TRAITOR /*MT*/,
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_INFRAVISIBLE|MG_NASTY|MG_HATESSILVER /*MG*/,
@ -5616,7 +5616,7 @@ is a red right hand
MA_ELEMENTAL /*MA*/, MV_NORMAL /*MV*/, CLR_YELLOW),
MON("sandestin", S_DEMON,//15
LVL(13, 12, 4, 60, -5), (G_HELL|G_NOCORPSE|1),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_WEAP, AD_PHYS, 2, 6),
A(ATTK(AT_WEAP, AD_PHYS, 2, 6), ATTK(AT_XWEP, AD_PHYS, 2, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(1500, 400, 0, MS_CUSS, MZ_HUMAN), MR_STONE, 0,
0 /*MM*/, MT_STALK|MT_COLLECT /*MT*/,
@ -5983,7 +5983,7 @@ is a red right hand
*/
MON("archeologist", S_HUMAN,//12
LVL(10, 12, 10, 1, 3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
MM_TUNNEL|MM_NEEDPICK /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -5991,7 +5991,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("anachrononaut", S_HUMAN,//12 /*Needs encyc entry*//*Needs tile*/
LVL(10, 12, 10, 1, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -5999,7 +5999,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("barbarian", S_HUMAN,//13
LVL(10, 12, 10, 1, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_STUN, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_STUN, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6007,7 +6007,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("half-dragon", S_DRAGON,//13 /*Needs encyc entry*//*Needs tile*/
LVL(10, 8, 10, 1, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_STUN, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_STUN, 1, 6),
ATTK(AT_BREA, AD_HDRG, 1, 6), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), MR_POISON, 0,
0 /*MM*/, MT_CARNIVORE|MT_HOSTILE|MT_GREEDY|MT_JEWELS /*MT*/,
@ -6050,7 +6050,7 @@ is a red right hand
#ifdef CONVICT
MON("convict", S_HUMAN,//12
LVL(10, 12, 10, 1, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6067,7 +6067,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("knight", S_HUMAN,//12
LVL(10, 12, 10, 1, 3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6116,7 +6116,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("pirate", S_HUMAN,//12
LVL(10, 12, 10, 1, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
MM_SWIM /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT /*MT*/,
@ -6125,7 +6125,7 @@ is a red right hand
MON("ranger", S_HUMAN,//12
LVL(10, 12, 10, 2, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 4),
ATTK(AT_WEAP, AD_PHYS, 1, 4),
ATTK(AT_XWEP, AD_PHYS, 1, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6133,7 +6133,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("rogue", S_HUMAN,//12
LVL(10, 12, 10, 1, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT /*MT*/,
@ -6141,7 +6141,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("samurai", S_HUMAN,//12
LVL(10, 12, 10, 1, 3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6150,7 +6150,7 @@ is a red right hand
#ifdef TOURIST
MON("tourist", S_HUMAN,//12
LVL(10, 12, 10, 1, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT /*MT*/,
@ -6176,7 +6176,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("worm that walks", S_WORM,//
LVL(20, 12, 10, 0, 0), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_WEAP, AD_PHYS, 1, 12),
A(ATTK(AT_WEAP, AD_PHYS, 1, 12), ATTK(AT_XWEP, AD_PHYS, 1, 12),
ATTK(AT_MAGC, AD_SPEL, 0, 6),
NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
@ -6330,7 +6330,7 @@ is a red right hand
MA_ELF|MA_DROW /*MA*/, MV_DARKSIGHT|MV_SEE_INVIS /*MV*/, HI_LORD),
MON("drow novice", S_HUMAN, /*Needs encyc entry*//*Needs tile*/
LVL(0, 10, 10, 5, -2), (G_NOGEN|G_UNIQ),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_XWEP, AD_PHYS, 1, 4),
ATTK(AT_MMGC, AD_CLRC, 0, 4), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF/2, 175, 0, MS_LEADER, MZ_HUMAN), 0, MR_SLEEP,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_CLOSE|MT_COLLECT|MT_MAGIC /*MT*/,
@ -6818,9 +6818,9 @@ is a red right hand
MA_UNDEAD /*MA*/, MV_NORMAL|MV_INFRAVISION /*MV*/, CLR_BROWN),
MON("Kary, the Fiend of Fire", S_DEMON,//15 /*Needs encyc entry*//*Needs tile*/
LVL(12, 12, -1, 50, -12), (G_NOCORPSE|G_UNIQ), /* -11 if armed */
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),//Attack routine sometimes replaced by ATTK(AT_MAGC, AD_SPEL, 0, 0)
ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4)),
A(ATTK(AT_WEAP, AD_PHYS, 1,15), ATTK(AT_XWEP, AD_PHYS, 1, 15),//Attack routine sometimes replaced by ATTK(AT_MAGC, AD_SPEL, 0, 0)
ATTK(AT_WEAP, AD_PHYS, 1,15), ATTK(AT_XWEP, AD_PHYS, 1, 15),
ATTK(AT_HUGS, AD_WRAP, 4, 6), NO_ATTK),
SIZ(WT_GIGANTIC, 400, 0, MS_CUSS, MZ_GIGANTIC), MR_FIRE|MR_COLD|MR_POISON, 0,//37% Firaga->blind->firaga->blind->firaga->stun->firaga->stun
0 /*MM*/, MT_TRAITOR|MT_WAITFORU|MT_COLLECT|MT_STALK|MT_HOSTILE /*MT*/,
MB_HUMANOID|MB_SLITHY|MB_POIS|MB_FEMALE /*MB*/, MG_NOTAME|MG_NOPOLY|MG_NASTY|MG_PNAME|MG_INFRAVISIBLE|MG_NOSPELLCOOLDOWN /*MG*/,
@ -6909,7 +6909,7 @@ is a red right hand
MA_PRIMORDIAL|MA_ET /*MA*/, MV_TELEPATHIC|MV_EXTRAMISSION|MV_RLYEHIAN|MV_SEE_INVIS /*MV*/, CLR_GREEN),
MON("arcadian avenger", S_LAW_ANGEL,//11 /*Needs tile*/
LVL(6, 12, 1, 0, 5), (G_SGROUP|G_NOCORPSE|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_WEAP, AD_PHYS, 1, 1),
A(ATTK(AT_WEAP, AD_PHYS, 1, 1), ATTK(AT_XWEP, AD_PHYS, 1, 1),
ATTK(AT_CLAW, AD_PHYS, 1, 8), ATTK(AT_CLAW, AD_PHYS, 1, 8),
ATTK(AT_GAZE, AD_STDY, 2, 6), ATTK(AT_NONE, AD_SOUL, 0, 0)
),
@ -6978,7 +6978,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("trooper", S_HUMAN,//7 /*Needs encyc entry*//*Needs tile*/
LVL(15, 12, 8, 10, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_WEAP, AD_PHYS, 2, 8),
A(ATTK(AT_WEAP, AD_PHYS, 2, 8), ATTK(AT_XWEP, AD_PHYS, 2, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), MR_POISON, 0,
0 /*MM*/, MT_OMNIVORE|MT_COLLECT|MT_PEACEFUL /*MT*/,
@ -6994,7 +6994,7 @@ is a red right hand
MA_ELF /*MA*/, MV_CATSIGHT /*MV*/, CLR_BLACK),
MON("myrkalfar warrior", S_HUMAN,//10 /*Needs encyc entry*/
LVL(15, 12, 8, 60, -9), (G_GENO|G_SGROUP|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_WEAP, AD_PHYS, 1, 4),
A(ATTK(AT_WEAP, AD_PHYS, 1, 4), ATTK(AT_XWEP, AD_PHYS, 1, 4),
ATTK(AT_MMGC, AD_SPEL, 0, 3), NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_HUMANOID, MZ_HUMAN), MR_SLEEP|MR_POISON, MR_SLEEP,
0 /*MM*/, MT_COLLECT|MT_OMNIVORE|MT_PEACEFUL /*MT*/,
@ -7010,7 +7010,7 @@ is a red right hand
MA_ELF /*MA*/, MV_CATSIGHT /*MV*/, CLR_BLACK),
MON("alider", S_CENTAUR,
LVL(32, 15, -8, 10, -18), (G_GENO|G_NOGEN),
A(ATTK(AT_WEAP, AD_PHYS, 2,10), ATTK(AT_WEAP, AD_PHYS, 2,10),
A(ATTK(AT_WEAP, AD_PHYS, 2,10), ATTK(AT_XWEP, AD_PHYS, 2,10),
ATTK(AT_TUCH, AD_SHDW, 8, 8), ATTK(AT_KICK, AD_WEBS, 1, 1),
ATTK(AT_MMGC, AD_SPEL, 0, 0), NO_ATTK),
SIZ(2550, 500, 0, MS_HUMANOID, MZ_MEDIUM), MR_SLEEP|MR_POISON|MR_FIRE, MR_SLEEP,
@ -7028,7 +7028,7 @@ is a red right hand
#ifdef BARD
MON("rhymer", S_HUMAN,/*Needs tile*/
LVL(5, 12, 10, 10, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT /*MT*/,
@ -7038,7 +7038,7 @@ is a red right hand
MON("neanderthal", S_HUMAN,//7
LVL(5, 8, 10, 10, 1), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 2, 4),
ATTK(AT_WEAP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
ATTK(AT_XWEP, AD_PHYS, 2, 4), NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT /*MT*/,
MB_HUMANOID|MB_STRONG /*MB*/, MG_NOWISH|MG_NOPOLY|MG_INFRAVISIBLE|MG_TRACKER /*MG*/,
@ -7071,7 +7071,7 @@ is a red right hand
MA_ELF|MA_DROW /*MA*/, MV_DARKSIGHT|MV_SEE_INVIS /*MV*/, CLR_GRAY),
MON("drow alienist", S_HUMAN, /*Needs encyc entry*//*Needs tile*/
LVL(16, 12, 10, 80, 20), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
ATTK(AT_LRCH, AD_DRIN, 1, 1), ATTK(AT_MAGC, AD_SPEL, 0, 6),
NO_ATTK, NO_ATTK),
SIZ(WT_ELF, 350, 0, MS_CUSS, MZ_HUMAN), MR_SLEEP, MR_SLEEP, /*Set to MS_GUARDIAN by init code*/
@ -7128,7 +7128,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("page", S_HUMAN,//8
LVL(6, 12, 10, 10, 6), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT /*MT*/,
@ -7152,7 +7152,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("dwarf warrior", S_HUMANOID, /*Needs encyc entry*//*Needs tile*/
LVL(5, 10, 10, 10, 5), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_WEAP, AD_PHYS, 2, 4),
A(ATTK(AT_WEAP, AD_PHYS, 2, 4), ATTK(AT_XWEP, AD_PHYS, 2, 4),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(900, 300, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
MM_TUNNEL|MM_NEEDPICK /*MM*/, MT_OMNIVORE|MT_GREEDY|MT_JEWELS|MT_COLLECT|MT_PEACEFUL /*MT*/,
@ -7176,7 +7176,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("pirate brother", S_HUMAN,//11
LVL(9, 12, 10, 10, -3), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_GREEDY|MT_COLLECT /*MT*/,
@ -7208,7 +7208,7 @@ is a red right hand
MA_ORC /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("thug", S_HUMAN,//7
LVL(5, 12, 10, 10, -5), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_WEAP, AD_PHYS, 1, 6),
A(ATTK(AT_WEAP, AD_PHYS, 1, 6), ATTK(AT_XWEP, AD_PHYS, 1, 6),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_GREEDY|MT_COLLECT /*MT*/,
@ -7216,7 +7216,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("ninja", S_HUMAN,//13
LVL(11, 12, 10, 10, 5), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_HUMANOID, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_HOSTILE|MT_COLLECT /*MT*/,
@ -7224,7 +7224,7 @@ is a red right hand
MA_HUMAN /*MA*/, MV_NORMAL /*MV*/, HI_DOMESTIC),
MON("roshi", S_HUMAN,//10
LVL(8, 12, 10, 10, 10), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), 0, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT /*MT*/,
@ -7242,7 +7242,7 @@ is a red right hand
#endif
MON("warrior", S_HUMAN,//12
LVL(10, 12, 10, 10, -1), G_NOGEN,
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_WEAP, AD_PHYS, 1, 8),
A(ATTK(AT_WEAP, AD_PHYS, 1, 8), ATTK(AT_XWEP, AD_PHYS, 1, 8),
NO_ATTK, NO_ATTK, NO_ATTK, NO_ATTK),
SIZ(WT_HUMAN, 400, 0, MS_GUARDIAN, MZ_HUMAN), MR_COLD, 0,
0 /*MM*/, MT_OMNIVORE|MT_PEACEFUL|MT_COLLECT /*MT*/,

View file

@ -485,6 +485,10 @@ m_throw(mon, x, y, dx, dy, range, obj, verbose)
setmnotwielded(mon,obj);
MON_NOWEP(mon);
}
if (MON_SWEP(mon) == obj) {
setmnotwielded(mon, obj);
MON_NOSWEP(mon);
}
obj_extract_self(obj);
singleobj = obj;
obj = (struct obj *) 0;

View file

@ -1398,7 +1398,7 @@ ring:
}
}
if(obj->owornmask & W_SWAPWEP) {
if (u.twoweap && !(uwep && uwep->otyp == STILETTOS))
if (mcarried(obj) || (u.twoweap && !(uwep && uwep->otyp == STILETTOS))) // Monsters twoweaponing stilettos would give a bad message, but they can't even wield stilettos right now...
Sprintf(eos(bp), " (wielded in other %s)",
body_part(HAND));
else

View file

@ -1662,6 +1662,7 @@ get_description_of_attack_type(uchar id)
case AT_BEAM: return "ranged beam";
case AT_DEVA: return "million-arm weapon";
case AT_5SQR: return "long reach touch";
case AT_XWEP: return "offhand weapon";
case AT_WEAP: return "weapon";
case AT_MAGC: return "uses magic spell(s)";
default:

View file

@ -1880,8 +1880,11 @@ boolean *prev_loot;
obj_extract_self(otmp);
if ((unwornmask = otmp->owornmask) != 0L) {
mtmp->misc_worn_check &= ~unwornmask;
if (otmp->owornmask & W_WEP)
setmnotwielded(mtmp,otmp);
if (otmp->owornmask & W_WEP || otmp->owornmask & W_SWAPWEP)
{
setmnotwielded(mtmp, otmp);
mtmp->weapon_check = NEED_WEAPON;
}
otmp->owornmask = 0L;
update_mon_intrinsics(mtmp, otmp, FALSE, FALSE);
}

View file

@ -2719,7 +2719,7 @@ register struct attack *mattk;
case AD_HEAL: /* likewise */
case AD_PHYS:
physical:
if(mattk->aatyp == AT_WEAP) {
if(mattk->aatyp == AT_WEAP || mattk->aatyp == AT_XWEP) {
if(uwep) tmp = 0;
} else if(mattk->aatyp == AT_KICK) {
if(thick_skinned(mdef->data)) tmp = 0;
@ -3829,6 +3829,10 @@ register int tmp, weptmp, tchtmp;
) continue;
switch(mattk->aatyp) {
case AT_XWEP:
/* general-case two-weaponing is covered in AT_WEAP */
/* special case: marilith? */
break;
case AT_WEAP:
use_weapon:
/* Certain monsters don't use weapons when encountered as enemies,
@ -4085,6 +4089,10 @@ int nattk;
mattk = &attacklist[i];
sum[i] = 0;
switch(mattk->aatyp) {
case AT_XWEP:
/* general-case two-weaponing is covered in AT_WEAP */
/* special case: marilith? */
break;
case AT_WEAP:
use_weapon:
/* Certain monsters don't use weapons when encountered as enemies,
@ -4389,7 +4397,7 @@ uchar aatyp, adtyp;
if (aatyp == AT_KICK) {
if (uarmf && !rn2(6))
(void)rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst);
} else if (aatyp == AT_WEAP || aatyp == AT_CLAW ||
} else if (aatyp == AT_WEAP || aatyp == AT_XWEP || aatyp == AT_CLAW ||
aatyp == AT_MAGC || aatyp == AT_TUCH || aatyp == AT_5SQR)
passive_obj(mon, (struct obj*)0, &(ptr->mattk[i]));
}
@ -4438,7 +4446,7 @@ uchar aatyp, adtyp;
if (aatyp == AT_KICK) {
if (uarmf)
(void)rust_dmg(uarmf, xname(uarmf), 1, TRUE, &youmonst);
} else if (aatyp == AT_WEAP || aatyp == AT_CLAW ||
} else if (aatyp == AT_WEAP || aatyp == AT_XWEP || aatyp == AT_CLAW ||
aatyp == AT_MAGC || aatyp == AT_TUCH || aatyp == AT_5SQR)
passive_obj(mon, (struct obj*)0, &(ptr->mattk[i]));
}
@ -4448,7 +4456,8 @@ uchar aatyp, adtyp;
if (aatyp == AT_KICK) {
if (uarmf)
(void)rust_dmg(uarmf, xname(uarmf), 3, TRUE, &youmonst);
} else if (aatyp == AT_WEAP || aatyp == AT_CLAW ||
}
else if (aatyp == AT_WEAP || aatyp == AT_XWEP || aatyp == AT_CLAW ||
aatyp == AT_MAGC || aatyp == AT_TUCH || aatyp == AT_5SQR)
passive_obj(mon, (struct obj*)0, &(ptr->mattk[i]));
}

View file

@ -1147,14 +1147,15 @@ struct monst *mon;
#endif /* OVLB */
#ifdef OVL0
STATIC_DCL struct obj *FDECL(oselect, (struct monst *,int));
STATIC_DCL struct obj *FDECL(oselect, (struct monst *,int,int));
STATIC_DCL struct obj *FDECL(oselectBoulder, (struct monst *));
#define Oselect(x) if ((otmp = oselect(mtmp, x)) != 0) return(otmp);
#define Oselect(x, spot) if ((otmp = oselect(mtmp, x, spot)) != 0) return(otmp);
STATIC_OVL struct obj *
oselect(mtmp, x)
oselect(mtmp, x, spot)
struct monst *mtmp;
int x;
int spot;
{
struct obj *otmp, *obest = 0;
@ -1164,17 +1165,19 @@ int x;
!((x == CORPSE || x == EGG) &&
!touch_petrifies(&mons[otmp->corpsenm])) &&
/* never uncharged lightsabers */
(!is_lightsaber(otmp) || otmp->age
|| otmp->oartifact == ART_INFINITY_S_MIRRORED_ARC
) &&
(!is_lightsaber(otmp) || otmp->age || otmp->oartifact == ART_INFINITY_S_MIRRORED_ARC) &&
/* never offhand artifacts */
(!otmp->oartifact || spot != W_SWAPWEP) &&
/* never untouchable artifacts */
(!otmp->oartifact || touch_artifact(otmp, mtmp, FALSE)) &&
/* never too-large for available hands */
(!bimanual(otmp, mtmp->data) || ((mtmp->misc_worn_check & W_ARMS) == 0 && strongmonst(mtmp->data))) &&
/* never unsuitable for mainhand wielding */
(spot!=W_WEP || (!bimanual(otmp, mtmp->data) || ((mtmp->misc_worn_check & W_ARMS) == 0 && !MON_SWEP(mtmp) && strongmonst(mtmp->data)))) &&
/* never unsuitable for offhand wielding */
(spot!=W_SWAPWEP || (!(otmp->owornmask & (W_WEP)) && !otmp->cursed && !bimanual(otmp, mtmp->data) && (mtmp->misc_worn_check & W_ARMS) == 0 && (otmp->owt <= (30 + (mtmp->m_lev/5)*5)))) &&
/* never a hated weapon */
(!hates_silver(mtmp->data) || otmp->obj_material != SILVER) &&
(!hates_iron(mtmp->data) || otmp->obj_material != IRON) &&
(!hates_unholy(mtmp->data) || !is_unholy(otmp))
(mtmp->misc_worn_check & W_ARMG || !hates_silver(mtmp->data) || otmp->obj_material != SILVER) &&
(mtmp->misc_worn_check & W_ARMG || !hates_iron(mtmp->data) || otmp->obj_material != IRON) &&
(mtmp->misc_worn_check & W_ARMG || !hates_unholy(mtmp->data) || !is_unholy(otmp))
){
if (!obest ||
(dmgval(otmp, 0 /*zeromonst*/, 0) > dmgval(obest, 0 /*zeromonst*/,0))
@ -1280,14 +1283,10 @@ struct obj *otmp;
if(wep->otyp == otmp->otyp) return dmgval(otmp, 0 /*zeromonst*/, 0) > dmgval(wep, 0 /*zeromonst*/, 0);
}
if (((strongmonst(mtmp->data) && (mtmp->misc_worn_check & W_ARMS) == 0)
|| !bimanual(otmp,mtmp->data))
&& (otmp->obj_material != SILVER
|| !hates_silver(mtmp->data))
&& (otmp->obj_material != IRON
|| !hates_iron(mtmp->data))
&& (is_unholy(otmp)
|| !hates_unholy(mtmp->data))
if (((strongmonst(mtmp->data) && (mtmp->misc_worn_check & W_ARMS) == 0) || !bimanual(otmp,mtmp->data)) &&
(mtmp->misc_worn_check & W_ARMG || otmp->obj_material != SILVER || !hates_silver(mtmp->data)) &&
(mtmp->misc_worn_check & W_ARMG || otmp->obj_material != IRON || !hates_iron(mtmp->data)) &&
(mtmp->misc_worn_check & W_ARMG || is_unholy(otmp) || !hates_unholy(mtmp->data))
){
for (i = 0; i < SIZE(pwep); i++)
{
@ -1328,7 +1327,7 @@ register struct monst *mtmp;
char mlet = mtmp->data->mlet;
propellor = &zeroobj;
Oselect(EGG); /* cockatrice egg */
Oselect(EGG, W_QUIVER); /* cockatrice egg */
if(throws_rocks(mtmp->data)) /* ...boulders for giants */
oselectBoulder(mtmp);
@ -1343,7 +1342,7 @@ register struct monst *mtmp;
/* if (dist2(mtmp->mx, mtmp->my, mtmp->mux, mtmp->muy) <= 13 && couldsee(mtmp->mx, mtmp->my)) */
{
for (i = 0; i < SIZE(pwep); i++) {
if ((otmp = oselect(mtmp, pwep[i])) != 0) {
if ((otmp = oselect(mtmp, pwep[i], W_WEP)) != 0) {
propellor = otmp; /* force the monster to wield it */
return otmp;
}
@ -1386,42 +1385,42 @@ register struct monst *mtmp;
if (prop < 0) {
switch (-prop) {
case P_BOW:
propellor = (oselect(mtmp, YUMI));
if (!propellor) propellor = (oselect(mtmp, ELVEN_BOW));
if (!propellor) propellor = (oselect(mtmp, BOW));
if (!propellor) propellor = (oselect(mtmp, ORCISH_BOW));
propellor = (oselect(mtmp, YUMI, W_WEP));
if (!propellor) propellor = (oselect(mtmp, ELVEN_BOW, W_WEP));
if (!propellor) propellor = (oselect(mtmp, BOW, W_WEP));
if (!propellor) propellor = (oselect(mtmp, ORCISH_BOW, W_WEP));
break;
case P_SLING:
propellor = (oselect(mtmp, SLING));
propellor = (oselect(mtmp, SLING, W_WEP));
break;
//ifdef FIREARMS
case P_FIREARM:
if ((objects[rwep[i]].w_ammotyp) == WP_BULLET) {
propellor = (oselect(mtmp, BFG));
if (!propellor) propellor = (oselect(mtmp, HEAVY_MACHINE_GUN));
if (!propellor) propellor = (oselect(mtmp, ASSAULT_RIFLE));
if (!propellor) propellor = (oselect(mtmp, SUBMACHINE_GUN));
if (!propellor) propellor = (oselect(mtmp, SNIPER_RIFLE));
if (!propellor) propellor = (oselect(mtmp, RIFLE));
if (!propellor) propellor = (oselect(mtmp, PISTOL));
if (!propellor) propellor = (oselect(mtmp, FLINTLOCK));
propellor = (oselect(mtmp, BFG, W_WEP));
if (!propellor) propellor = (oselect(mtmp, HEAVY_MACHINE_GUN, W_WEP));
if (!propellor) propellor = (oselect(mtmp, ASSAULT_RIFLE, W_WEP));
if (!propellor) propellor = (oselect(mtmp, SUBMACHINE_GUN, W_WEP));
if (!propellor) propellor = (oselect(mtmp, SNIPER_RIFLE, W_WEP));
if (!propellor) propellor = (oselect(mtmp, RIFLE, W_WEP));
if (!propellor) propellor = (oselect(mtmp, PISTOL, W_WEP));
if (!propellor) propellor = (oselect(mtmp, FLINTLOCK, W_WEP));
} else if ((objects[rwep[i]].w_ammotyp) == WP_SHELL) {
propellor = (oselect(mtmp, BFG));
if (!propellor) propellor = (oselect(mtmp, AUTO_SHOTGUN));
if (!propellor) propellor = (oselect(mtmp, SHOTGUN));
propellor = (oselect(mtmp, BFG, W_WEP));
if (!propellor) propellor = (oselect(mtmp, AUTO_SHOTGUN, W_WEP));
if (!propellor) propellor = (oselect(mtmp, SHOTGUN, W_WEP));
} else if ((objects[rwep[i]].w_ammotyp) == WP_ROCKET) {
propellor = (oselect(mtmp, BFG));
if (!propellor) propellor = (oselect(mtmp, ROCKET_LAUNCHER));
propellor = (oselect(mtmp, BFG, W_WEP));
if (!propellor) propellor = (oselect(mtmp, ROCKET_LAUNCHER, W_WEP));
} else if ((objects[rwep[i]].w_ammotyp) == WP_GRENADE) {
propellor = (oselect(mtmp, BFG));
if (!propellor) propellor = (oselect(mtmp, GRENADE_LAUNCHER));
propellor = (oselect(mtmp, BFG, W_WEP));
if (!propellor) propellor = (oselect(mtmp, GRENADE_LAUNCHER, W_WEP));
if (!propellor) propellor = &zeroobj; /* can toss grenades */
}
break;
//endif
case P_CROSSBOW:
propellor = (oselect(mtmp, DROVEN_CROSSBOW));
if(!propellor) propellor = (oselect(mtmp, CROSSBOW));
propellor = (oselect(mtmp, DROVEN_CROSSBOW, W_WEP));
if (!propellor) propellor = (oselect(mtmp, CROSSBOW, W_WEP));
}
if (!tmpprop) tmpprop = propellor;
if (((otmp = MON_WEP(mtmp)) && otmp->cursed && otmp != propellor
@ -1439,7 +1438,7 @@ register struct monst *mtmp;
*/
if (rwep[i] != LOADSTONE) {
/* Don't throw a cursed weapon-in-hand or an artifact */
if ((otmp = oselect(mtmp, rwep[i])) && !otmp->oartifact
if ((otmp = oselect(mtmp, rwep[i], W_QUIVER)) && !otmp->oartifact
&& (!otmp->cursed || otmp != MON_WEP(mtmp)))
return(otmp);
} else for(otmp=mtmp->minvent; otmp; otmp=otmp->nobj) {
@ -1575,19 +1574,41 @@ register struct monst *mtmp;
/* never too-large for available hands */
(!bimanual(otmp, mtmp->data) || ((mtmp->misc_worn_check & W_ARMS) == 0 && strongmonst(mtmp->data))) &&
/* never a hated weapon */
(!hates_silver(mtmp->data) || otmp->obj_material != SILVER) &&
(!hates_iron(mtmp->data) || otmp->obj_material != IRON) &&
(!hates_unholy(mtmp->data) || !is_unholy(otmp))
(mtmp->misc_worn_check & W_ARMG || !hates_silver(mtmp->data) || otmp->obj_material != SILVER) &&
(mtmp->misc_worn_check & W_ARMG || !hates_iron(mtmp->data) || otmp->obj_material != IRON) &&
(mtmp->misc_worn_check & W_ARMG || !hates_unholy(mtmp->data) || !is_unholy(otmp))
) return otmp;
}
if(is_giant(mtmp->data)) /* giants just love to use clubs */
Oselect(CLUB);
Oselect(CLUB, W_WEP);
for (i = 0; i < SIZE(hwep); i++) {
if (hwep[i] == CORPSE && !(mtmp->misc_worn_check & W_ARMG))
continue;
Oselect(hwep[i]);
Oselect(hwep[i], W_WEP);
}
/* failure */
return (struct obj *)0;
}
struct obj *
select_shwep(mtmp) /* select an offhand hand to hand weapon for the monster */
register struct monst *mtmp;
{
register struct obj *otmp;
register int i;
boolean strong = strongmonst(mtmp->data);
boolean wearing_shield = (mtmp->misc_worn_check & W_ARMS) != 0;
if(is_giant(mtmp->data)) /* giants just love to use clubs */
Oselect(CLUB, W_SWAPWEP);
for (i = 0; i < SIZE(hwep); i++) {
if (hwep[i] == CORPSE && !(mtmp->misc_worn_check & W_ARMG))
continue;
Oselect(hwep[i], W_SWAPWEP);
}
/* failure */
@ -1603,34 +1624,75 @@ struct monst *mon;
boolean polyspot;
{
struct obj *obj, *mw_tmp;
if (!(mw_tmp = MON_WEP(mon)))
struct obj *sobj, *msw_tmp;
boolean doreturn = FALSE;
mw_tmp = MON_WEP(mon);
msw_tmp = MON_SWEP(mon);
if (!(mw_tmp || msw_tmp))
return;
for (obj = mon->minvent; obj; obj = obj->nobj)
if (obj == mw_tmp) break;
if (!obj) { /* The weapon was stolen or destroyed */
for (sobj = mon->minvent; sobj; sobj = sobj->nobj)
if (sobj == msw_tmp) break;
if (mw_tmp && !obj) { /* The mainhand weapon was stolen or destroyed */
MON_NOWEP(mon);
mon->weapon_check = NEED_WEAPON;
return;
doreturn = TRUE;
}
if (msw_tmp && !sobj) { /* The offhand weapon was stolen or destroyed */
MON_NOSWEP(mon);
mon->weapon_check = NEED_WEAPON;
doreturn = TRUE;
}
if (doreturn)
return;
if (!attacktype(mon->data, AT_WEAP)) {
setmnotwielded(mon, mw_tmp);
MON_NOWEP(mon);
if (mw_tmp) {
setmnotwielded(mon, mw_tmp);
MON_NOWEP(mon);
if (obj)
obj_extract_self(obj);
if (cansee(mon->mx, mon->my)) {
pline("%s drops %s.", Monnam(mon),
distant_name(obj, doname));
newsym(mon->mx, mon->my);
}
/* might be dropping object into water or lava */
if (!flooreffects(obj, mon->mx, mon->my, "drop")) {
if (polyspot) bypass_obj(obj);
place_object(obj, mon->mx, mon->my);
stackobj(obj);
}
}
mon->weapon_check = NO_WEAPON_WANTED;
obj_extract_self(obj);
if (cansee(mon->mx, mon->my)) {
pline("%s drops %s.", Monnam(mon),
distant_name(obj, doname));
newsym(mon->mx, mon->my);
}
/* might be dropping object into water or lava */
if (!flooreffects(obj, mon->mx, mon->my, "drop")) {
if (polyspot) bypass_obj(obj);
place_object(obj, mon->mx, mon->my);
stackobj(obj);
}
return;
doreturn = TRUE;
}
if (!could_twoweap(mon->data))
{
if (msw_tmp) {
setmnotwielded(mon, msw_tmp);
MON_NOSWEP(mon);
if (sobj)
obj_extract_self(sobj);
if (cansee(mon->mx, mon->my)) {
pline("%s drops %s.", Monnam(mon),
distant_name(sobj, doname));
newsym(mon->mx, mon->my);
}
/* might be dropping object into water or lava */
if (!flooreffects(sobj, mon->mx, mon->my, "drop")) {
if (polyspot) bypass_obj(sobj);
place_object(sobj, mon->mx, mon->my);
stackobj(sobj);
}
}
mon->weapon_check = NO_WEAPON_WANTED;
doreturn = TRUE;
}
if (doreturn)
return;
/* The remaining case where there is a change is where a monster
* is polymorphed into a stronger/weaker monster with a different
* choice of weapons. This has no parallel for players. It can
@ -1656,8 +1718,13 @@ int
mon_wield_item(mon)
register struct monst *mon;
{
struct obj *obj;
struct obj *obj = 0;
struct obj *sobj = 0;
struct obj *mw_tmp = MON_WEP(mon);
struct obj *msw_tmp = MON_SWEP(mon);
xchar old_weapon_check = mon->weapon_check;
boolean time_taken = FALSE;
boolean toreturn = FALSE;
/* This case actually should never happen */
if (mon->weapon_check == NO_WEAPON_WANTED) return 0;
@ -1667,7 +1734,7 @@ register struct monst *mon;
mon->weapon_check = NO_WEAPON_WANTED;
return 0;
}
/* Pick weapon to attempt to wield */
switch(mon->weapon_check) {
case NEED_HTH_WEAPON:
obj = select_hwep(mon);
@ -1677,17 +1744,16 @@ register struct monst *mon;
obj = propellor;
break;
case NEED_PICK_AXE:
obj = m_carrying(mon, PICK_AXE);
/* KMH -- allow other picks */
if (!obj && !which_armor(mon, W_ARMS))
obj = m_carrying(mon, DWARVISH_MATTOCK);
obj = m_carrying(mon, DWARVISH_MATTOCK);
if (!obj || bimanual(obj, mon->data))
obj = m_carrying(mon, PICK_AXE);
break;
case NEED_AXE:
/* currently, only 3 types of axe */
obj = m_carrying(mon, MOON_AXE);
if (!obj)
obj = m_carrying(mon, BATTLE_AXE);
if (!obj || which_armor(mon, W_ARMS))
if (!obj || bimanual(obj, mon->data))
obj = m_carrying(mon, AXE);
break;
case NEED_PICK_OR_AXE:
@ -1695,7 +1761,7 @@ register struct monst *mon;
obj = m_carrying(mon, DWARVISH_MATTOCK);
if (!obj) obj = m_carrying(mon, MOON_AXE);
if (!obj) obj = m_carrying(mon, BATTLE_AXE);
if (!obj || which_armor(mon, W_ARMS)) {
if (!obj || bimanual(obj, mon->data)) {
obj = m_carrying(mon, PICK_AXE);
if (!obj) obj = m_carrying(mon, AXE);
}
@ -1704,75 +1770,126 @@ register struct monst *mon;
mon->weapon_check, mon_nam(mon));
return 0;
}
/* attempt to wield weapon */
if (obj && obj != &zeroobj) {
if (mw_tmp && mw_tmp->otyp == obj->otyp) {
/* already wielding one similar to it */
/* already wielding one similar to it */
if (is_lightsaber(obj))
mon_ignite_lightsaber(obj, mon);
mon_ignite_lightsaber(obj, mon);
mon->weapon_check = NEED_WEAPON;
return 0;
toreturn = TRUE;
}
/* Actually, this isn't necessary--as soon as the monster
* wields the weapon, the weapon welds itself, so the monster
* can know it's cursed and needn't even bother trying.
* Still....
*/
if (mw_tmp && mw_tmp->cursed && mw_tmp->otyp != CORPSE) {
if (canseemon(mon)) {
char welded_buf[BUFSZ];
const char *mon_hand = mbodypart(mon, HAND);
else {
/* Actually, this isn't necessary--as soon as the monster
* wields the weapon, the weapon welds itself, so the monster
* can know it's cursed and needn't even bother trying.
* Still....
*/
if (mw_tmp && mw_tmp->cursed && mw_tmp->otyp != CORPSE) {
if (canseemon(mon)) {
char welded_buf[BUFSZ];
const char *mon_hand = mbodypart(mon, HAND);
if (bimanual(mw_tmp,mon->data)) mon_hand = makeplural(mon_hand);
Sprintf(welded_buf, "%s welded to %s %s",
otense(mw_tmp, "are"),
mhis(mon), mon_hand);
if (obj->otyp == PICK_AXE) {
pline("Since %s weapon%s %s,",
s_suffix(mon_nam(mon)),
plur(mw_tmp->quan), welded_buf);
pline("%s cannot wield that %s.",
mon_nam(mon), xname(obj));
} else {
pline("%s tries to wield %s.", Monnam(mon),
doname(obj));
pline("%s %s %s!",
s_suffix(Monnam(mon)),
xname(mw_tmp), welded_buf);
if (bimanual(mw_tmp,mon->data)) mon_hand = makeplural(mon_hand);
Sprintf(welded_buf, "%s welded to %s %s",
otense(mw_tmp, "are"),
mhis(mon), mon_hand);
if (obj->otyp == PICK_AXE) {
pline("Since %s weapon%s %s,",
s_suffix(mon_nam(mon)),
plur(mw_tmp->quan), welded_buf);
pline("%s cannot wield that %s.",
mon_nam(mon), xname(obj));
} else {
pline("%s tries to wield %s.", Monnam(mon),
doname(obj));
pline("%s %s %s!",
s_suffix(Monnam(mon)),
xname(mw_tmp), welded_buf);
}
mw_tmp->bknown = 1;
}
mon->weapon_check = NO_WEAPON_WANTED;
time_taken = TRUE;
toreturn = TRUE;
}
mw_tmp->bknown = 1;
}
mon->weapon_check = NO_WEAPON_WANTED;
return 1;
}
mon->mw = obj; /* wield obj */
setmnotwielded(mon, mw_tmp);
mon->weapon_check = NEED_WEAPON;
if (canseemon(mon)) {
pline("%s wields %s%s", Monnam(mon), doname(obj),
mon->mtame ? "." : "!");
if (obj->cursed && obj->otyp != CORPSE) {
pline("%s %s to %s %s!",
Tobjnam(obj, "weld"),
is_plural(obj) ? "themselves" : "itself",
s_suffix(mon_nam(mon)), mbodypart(mon,HAND));
obj->bknown = 1;
}
}
if (artifact_light(obj) && !obj->lamplit) {
begin_burn(obj, FALSE);
if (canseemon(mon))
pline("%s %s%s in %s %s!",
Tobjnam(obj, (obj->blessed ? "shine" : "glow")),
mon->mw = obj; /* wield obj */
setmnotwielded(mon, mw_tmp);
mon->weapon_check = NEED_WEAPON;
if (canseemon(mon)) {
pline("%s wields %s%s", Monnam(mon), doname(obj),
mon->mtame ? "." : "!");
if (obj->cursed && obj->otyp != CORPSE) {
pline("%s %s to %s %s!",
Tobjnam(obj, "weld"),
is_plural(obj) ? "themselves" : "itself",
s_suffix(mon_nam(mon)), mbodypart(mon, HAND));
obj->bknown = 1;
}
}
if (artifact_light(obj) && !obj->lamplit) {
begin_burn(obj, FALSE);
if (canseemon(mon))
pline("%s %s%s in %s %s!",
Tobjnam(obj, (obj->blessed ? "shine" : "glow")),
(obj->blessed ? " very" : ""),
(obj->cursed ? "" : " brilliantly"),
s_suffix(mon_nam(mon)), mbodypart(mon,HAND));
s_suffix(mon_nam(mon)), mbodypart(mon, HAND));
}
obj->owornmask = W_WEP;
if (is_lightsaber(obj))
mon_ignite_lightsaber(obj, mon);
time_taken = TRUE;
toreturn = TRUE;
}
obj->owornmask = W_WEP;
if (is_lightsaber(obj))
mon_ignite_lightsaber(obj, mon);
return 1;
}
/* possibly wield an off-hand weapon */
if (old_weapon_check == NEED_HTH_WEAPON)
{
if (could_twoweap(mon->data) && !which_armor(mon, W_ARMS) && !bimanual(obj, mon->data))
{
sobj = select_shwep(mon);
if (sobj && sobj != &zeroobj) {
if (msw_tmp && msw_tmp->otyp == sobj->otyp) {
/* already wielding one similar to it */
if (is_lightsaber(sobj))
mon_ignite_lightsaber(sobj, mon);
mon->weapon_check = NEED_WEAPON;
toreturn = TRUE;
}
else {
/* already-wielding-a-cursed-item check unnecessary here */
mon->msw = sobj; /* wield sobj */
setmnotwielded(mon, msw_tmp);
mon->weapon_check = NEED_WEAPON;
if (canseemon(mon)) {
pline("%s offhands %s%s", Monnam(mon), doname(sobj),
mon->mtame ? "." : "!");
}
if (artifact_light(sobj) && !sobj->lamplit) {
begin_burn(sobj, FALSE);
if (canseemon(mon))
pline("%s %s%s in %s %s!",
Tobjnam(sobj, (obj->blessed ? "shine" : "glow")),
(sobj->blessed ? " very" : ""),
(sobj->cursed ? "" : " brilliantly"),
s_suffix(mon_nam(mon)), mbodypart(mon, HAND));
}
sobj->owornmask = W_SWAPWEP;
if (is_lightsaber(sobj))
mon_ignite_lightsaber(sobj, mon);
time_taken = TRUE;
toreturn = TRUE;
}
}
}
}
if (toreturn)
return time_taken;
mon->weapon_check = NEED_WEAPON;
return 0;
}
@ -1782,15 +1899,17 @@ init_mon_wield_item(mon)
register struct monst *mon;
{
struct obj *obj = 0;
struct obj *sobj = 0;
struct obj *mw_tmp = MON_WEP(mon);
struct obj *msw_tmp = MON_SWEP(mon);
int toreturn = 0;
if(!attacktype(mon->data, AT_WEAP)) return;
if(needspick(mon->data)){
obj = m_carrying(mon, PICK_AXE);
/* KMH -- allow other picks */
if (!obj && !which_armor(mon, W_ARMS))
obj = m_carrying(mon, DWARVISH_MATTOCK);
obj = m_carrying(mon, DWARVISH_MATTOCK);
if (!obj || bimanual(obj, mon->data))
obj = m_carrying(mon, PICK_AXE);
}
if(!obj){
(void)select_rwep(mon);
@ -1809,8 +1928,26 @@ register struct monst *mon;
obj->owornmask = W_WEP;
if (is_lightsaber(obj))
mon_ignite_lightsaber(obj, mon);
return;
toreturn = 1;
}
if (could_twoweap(mon->data) && !which_armor(mon, W_ARMS) && !bimanual(obj, mon->data))
{
sobj = select_shwep(mon);
if (sobj && sobj != &zeroobj) {
mon->msw = sobj; /* wield sobj */
setmnotwielded(mon, msw_tmp);
mon->weapon_check = NEED_WEAPON;
if (artifact_light(sobj) && !sobj->lamplit) {
begin_burn(sobj, FALSE);
}
sobj->owornmask = W_SWAPWEP;
if (is_lightsaber(sobj))
mon_ignite_lightsaber(sobj, mon);
toreturn = 1;
}
}
if (toreturn)
return;
mon->weapon_check = NEED_WEAPON;
return;
}
@ -3092,6 +3229,7 @@ register struct obj *obj;
otense(obj, "stop"));
}
obj->owornmask &= ~W_WEP;
obj->owornmask &= ~W_SWAPWEP;
}
#endif /* OVLB */