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:
commit
38dc633ab6
13 changed files with 500 additions and 267 deletions
|
@ -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.
|
||||
|
|
|
@ -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))) ||\
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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.
|
||||
*/
|
||||
|
|
67
src/mhitm.c
67
src/mhitm.c
|
@ -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;
|
||||
|
|
77
src/mhitu.c
77
src/mhitu.c
|
@ -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:
|
||||
|
|
166
src/monst.c
166
src/monst.c
|
@ -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*/,
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
17
src/uhitm.c
17
src/uhitm.c
|
@ -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]));
|
||||
}
|
||||
|
|
416
src/weapon.c
416
src/weapon.c
|
@ -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 */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue