better. This will only happen if the armour will fit the monster (correct size) and if the new armour has a better AC, or both items have the same AC but the new armour has a higher value (uses shopping values). Matching racial type (orcish for orcs, elven for elves) doubles an item's value, so between two plain +0 ring mails, one orcish one not, an orc will always prefer the former.
Friendly monsters now may pick up items dropped by other friendlies. This means that they can re-collect their own thrown missiles, and that they can upgrade from stuff dropped by their fallen comrades. Hey, that's monster AI in action! :) They still won't pick up stuff randomly lying around, and neutrals or enslaved monsters never will pick up anything. And of course, friendly jellies (should that be possible) won't ever devour items.
Cleanup of mstuff2.cc, and reduce chances for Beogh orcs' chattiness (again).
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@4632 c06c8d41-db1a-0410-9941-cceddc491573
Y2NYY7HWFZ2LQDK3ACSLGS37F2J2IJ5LRGCIMZYXLEOSVPD3A4DAC
LLTZGFJBS2CSAYJKP24Q5PGMUXT2X65G6SJXNP7XUHUIDDZT25VAC
E6NTYF4PVIESKDOXXSDV6DFBAGOLBHE66HAJIGG76ZWPNHURKIIAC
YTD7HEJR2V4IGCOSMV6VX7SF4CZLYGPG7QXSDWWLV5N3BPOD6SXAC
LLZHW4VOAUL4WFQHJP4SJGIGHEOI6FDRDI5FUN66NTWIHCX4FQRQC
2ILR4SBFXZDMIOMZ6RPUR5I4OKON2QHBSO23TDD5KI77NTOI4OWQC
TTCA2KKE56DAAKEVUGAP7ZRNF5KDLOWRVO37E3D6KDNMLDBVL7MAC
5OEVFYM62MOO5TE2HLSKC53QE65NF47R3TLYEPHE7O46FN2P6N5QC
LDEDXOOK67NHP44PDRL2TAS47SOTYIIWSNXAFIPTWA72GGBDIHSAC
PMCHUVWMCDXOWGXB4SWMBXFGHJYZG7KZ34SE33HFUGHPQYP3LYEAC
7GJR755MBM55KIOP3DGSZIIAEQ5E2PRBHLEXZOU2ZMXHHZ5JI3GQC
36DYXIWAQTBOCZBCUPYWDKAXVWDU3TRMSM3OCQZGGMWE2KPERJMAC
QVVC7AYGVA6U64PTNA7L27422NLMO327P22BQKXEVIMPZHIHO7MQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
3ZWALZFSTSIVYXY4BAY6ANGINTDACZC6RSSJTEMQSTSUIE66YOBQC
VQZEJTCSRZ5RVLCCKUCIS3IVZPFYRC26I74X4WIJAPEY7NYID2UQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
LFRMK2FWZEWOABNM3T36YKBSUTNUA6DDTSBEFEMHM5KOFJBL5M7QC
FA2V3G4NYTWJWUT7EWH75L3YOUX6YVOZ5LNRSFLO2XF273JKSUTAC
W74555HMPXUQ72AGKBXC5P3STMMX5DZAW6ZESUDLNVJBCAG43PLAC
UZ5623MOLKBTGBSRBJ4OBOEI4IEZSPV3NCV2DRMUZ3CHHJQVHIIAC
5V47S4NNTHWTSAHV3YLO2VGH7JTUIYJ3GBPDN5ZM4UQALT2ZEXDQC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
D4A2TDSEJ7H6NYORPBZYLAWXUM55MIDMKQR67ODNZM334KWCUAAQC
PR42BCP5BPRFD2MP5H6CIJP7E57Q6TKL6SOXZWFKMFVR2OZWHT7AC
WBAFNYODKTL3YSG3UOJITBJSTFYGJLIWKRNK6NMGIIP5TPC2BDGQC
TV3ZC6WOZKSQQJQN26JIVKCHK6UK7WMDBYZDUYRWEAZ4JB4YVNAAC
NW74NALMBEWIKEOBIXA65RQULHS6M4GZ4S5IWDMEGWUAAAY7CQNQC
UW4XQAAAV3S2ZVBLMSK6VQG6AMYR6DRKXFP64HHBC6Z3QIUWPVXQC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
6GT5JAWOIIL4SQ5MWIID6ZVO3KKQFWDQDZNVFHZ6DNK5QCBXJ4UAC
FCZSQBKDNMJZRJS2LWQQWLUFGOXSKXDJZQIHC7L5S7HXCXQPOMMAC
FBKPAWAUTA2CEAKFYJ7O3B3LU7N4JOVZBGEDFUUCCRXT5N7PJ22AC
RISMOCQM6BKK4XSIRKYLOBB2UPDYJNDAL6OGIIR5GGNZQAK5YSZAC
Y46M2XO74VYDTBTFFUUCI275UGELTXUXS4GEIBBXCY5USQKJ5O6AC
7PRZJ6KZLG26YVTAMXT7YOTQLWZHGWGRTKXZZ52P4XYCQD4GT5WQC
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
3CMMAOYW3XCVFBCT2RT6YH5BLVAWQT62QXXWWCMWIZKDFZBY4M2QC
M6J5C74JDM5ZYIDPN7QXUCP6L44S2Z5XTRJMZBBRYOHA62IGYXKAC
X7PZS2I6D2GCZVNUDZTSQ7WNI7MIFHVLRJ4FB7WRUHD6UZZEUGHAC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
SDLKLUNFGVKDS55DDJZCBAVIB7NL3RRYPTACAY65SCUQKV6APFSAC
C5VA63WAQRWPENIMXRPUPZLZJMC77PL2B3A77HYFWDCZU5QDG7VQC
C5U3HSOOQ7BKXKXIDS7MLVXUKDTHAWJ5NXNX6YDXTM3GWY5UWX4QC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
NNG27Y5ZQAZX6UD7F7M4F6KEZBEDFXPEEC3LFUSX4ESKT7K6UJQAC
DODCHP2S4I6VZKQAVXX6D76OPNFI2YWZ4XH3HZTMAJZXA2RJ3XRQC
WKJIIZMCJLMWUIIXBVXBU2G4UJONM46JIEWK7U6XIPFZUOIFFBMAC
PAAJWLYMSL5R2NS73EU5AMVTSGQKSK7AZ4P4DWEIVHYYFB3AWEQQC
X4OCLD5YEXCYVQNMOQORLIO72AKUEMT3BT6FB3TW2HARKN5X7MEQC
RKFHYYANUZQHOWOE6YHVFFJNCZU7X67FWUQPQFF6KJKMNIKXFWEAC
DS2GZKISEP2DM2VU6EJ525Q7W3WVOKJXG5PY2OY4VNFCLBHVVOTAC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
4HATGRJJE7Q6LXHJ3ZGYTNBLG542KAUEK6ERKARIYRKRWY6VTDKQC
EFWEYIB2R3DPD3JWIPU6LS6SFLPMYN7J7X4GBZR7DJWKHJ3UELSAC
S7KC3IFKCUNBO3XO4TV3KEQEIDZWSRJSKXY65DPONKMG54VHU3UQC
JDZCDMUCQ7VENYVLB62KQWUIRGABID37OKATOKCBUPCDL7W75NPAC
33ZMPQC6OXTESW7SRW765GRNJUEJRSYONRVZVIEUDAUEJ2PPMB4AC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
PKHOZG6TIUP2NZZIP6CW5OIPZ3O6PCGWXXW5MH4I6P2WVM24HZEQC
LC2XZTUD56PLARIGBTDXDPJIYJNMJU446GFDGLRIFD2I4F66L6TAC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
OWERGKLVPNPGIIS23FZ7ZDOBWUIXCKYAFG3URXU75JAUDX3N5ENAC
NVK2OISSU4XF2CGSK2BAWZE2OPCLTXYHNSE6UDJ5M54EHY2I7BLAC
YX2LDGNQNB6AQRKAVXNYQ473X6EVPQEBT5AJKBIIWFIMS3U2BNQQC
6MGA75GVQUUYGF64YT4BPPYY2ZE7SKL44H3H66LIFMRT2VAONT7QC
ASH5CK6CPBKMLGGIRJ5GKTWMS5W3OBVHTL66RTYZIPFM6KFBYA3QC
B5TFKLGGDYXUG26E2J3DVR4RD2XHPV5CNDDKFAIZ3YBNAWO7V6QQC
6BCD3B7SZ4T2VPOGO562767LMFCVMKBAUMF4PQ7T5XNKSXVY7F6QC
XDPCRL76ZFW4BYFIMIRYQZIX2XJB5546KJB65VTHCPAGIARORBYQC
G5WLU3B4MR3ZDJLGR6OHNIMLZXGQS2EWBJ5YYY5J2GWM6DTD44BAC
BMHUBADDGIOZRVN4P3O5QKIDUYD4RFWBS7MP5X6LZWAYHUBRVD2QC
O6ZMFKDI3XO2SWPNEYHIPYFDWJR4TVDP5BAATK6LVCVETQID6E7AC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
bool returning = (get_weapon_brand(mitm[hand_used]) == SPWPN_RETURNING ||
get_ammo_brand(mitm[hand_used]) == SPMSL_RETURNING);
bool returning = (get_weapon_brand(mitm[hand_used]) == SPWPN_RETURNING
|| get_ammo_brand(mitm[hand_used]) == SPMSL_RETURNING);
pbolt.type = dchar_glyph(DCHAR_FIRED_MISSILE);
pbolt.colour = item.colour;
pbolt.flavour = BEAM_MISSILE;
pbolt.thrower = KILL_MON_MISSILE;
pbolt.type = dchar_glyph(DCHAR_FIRED_MISSILE);
pbolt.colour = item.colour;
pbolt.flavour = BEAM_MISSILE;
pbolt.thrower = KILL_MON_MISSILE;
pbolt.name += "flame";
pbolt.colour = RED;
pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP);
pbolt.name += "flame";
pbolt.colour = RED;
pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP);
pbolt.name += "frost";
pbolt.colour = WHITE;
pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP);
pbolt.name += "frost";
pbolt.colour = WHITE;
pbolt.type = dchar_glyph(DCHAR_FIRED_ZAP);
if ( !really_returns )
if (dec_mitm_item_quantity( hand_used, 1 ))
monster->inv[returning ? MSLOT_WEAPON : MSLOT_MISSILE] = NON_ITEM;
else if (dec_mitm_item_quantity( hand_used, 1 ))
monster->inv[returning ? MSLOT_WEAPON : MSLOT_MISSILE] = NON_ITEM;
bool destroyed = ((item->base_type == OBJ_MISSILES &&
item->sub_type != MI_THROWING_NET) && coinflip());
bool destroyed = (item->base_type == OBJ_MISSILES
&& item->sub_type != MI_THROWING_NET && coinflip());
beam.beam_source = monster_index(monster);
beam.type = dchar_glyph(DCHAR_FIRED_BURST);
beam.target_x = monster->x;
beam.target_y = monster->y;
beam.thrower = KILL_MON; // someone else's explosion
beam.beam_source = monster_index(monster);
beam.type = dchar_glyph(DCHAR_FIRED_BURST);
beam.target_x = monster->x;
beam.target_y = monster->y;
beam.thrower = KILL_MON; // someone else's explosion
beam.name = "explosion of spores";
beam.colour = LIGHTGREY;
beam.damage = dice_def( 3, 15 );
beam.name = "explosion of spores";
beam.colour = LIGHTGREY;
beam.damage = dice_def( 3, 15 );
beam.name = "blast of lightning";
beam.colour = LIGHTCYAN;
beam.damage = dice_def( 3, 20 );
beam.name = "blast of lightning";
beam.colour = LIGHTCYAN;
beam.damage = dice_def( 3, 20 );
beam.name = "****"; // initialize to some bogus values so we can catch problems
beam.colour = 1000;
beam.range = beam.rangeMax = 8;
beam.hit = -1;
beam.damage = dice_def( 1, 0 );
beam.ench_power = -1;
beam.type = 0;
beam.flavour = BEAM_NONE;
beam.thrower = KILL_MISC;
beam.is_beam = false;
// Initialize to some bogus values so we can catch problems.
beam.name = "****";
beam.colour = 1000;
beam.range = beam.rangeMax = 8;
beam.hit = -1;
beam.damage = dice_def( 1, 0 );
beam.ench_power = -1;
beam.type = 0;
beam.flavour = BEAM_NONE;
beam.thrower = KILL_MISC;
beam.is_beam = false;
beam.colour = LIGHTMAGENTA; //inv_colour [throw_2];
beam.name = "magic dart"; // inv_name [throw_2]);
beam.range = 6;
beam.colour = LIGHTMAGENTA; // inv_colour [throw_2];
beam.name = "magic dart"; // inv_name [throw_2]);
beam.range = 6;
beam.damage = dice_def( 3, 4 + (power / 100) );
beam.hit = AUTOMATIC_HIT;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.damage = dice_def( 3, 4 + (power / 100) );
beam.hit = AUTOMATIC_HIT;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.hit = 25 + power / 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_FIRE;
beam.is_beam = false;
beam.hit = 25 + power / 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_FIRE;
beam.is_beam = false;
beam.hit = 25 + power / 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_COLD;
beam.is_beam = false;
beam.hit = 25 + power / 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_COLD;
beam.is_beam = false;
beam.type = 0;
beam.flavour = BEAM_PARALYSIS;
beam.thrower = KILL_MON_MISSILE;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_PARALYSIS;
beam.thrower = KILL_MON_MISSILE;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_SLEEP;
beam.thrower = KILL_MON_MISSILE;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_SLEEP;
beam.thrower = KILL_MON_MISSILE;
beam.is_beam = true;
beam.damage = dice_def( 3, 6 + power / 13 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 19 + power / 20;
beam.is_beam = true;
beam.damage = dice_def( 3, 6 + power / 13 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 19 + power / 20;
beam.is_beam = true;
beam.name = "poison arrow";
beam.damage = dice_def( 3, 7 + power / 12 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON_ARROW;
beam.hit = 20 + power / 25;
beam.range = beam.rangeMax = 8;
beam.name = "poison arrow";
beam.damage = dice_def( 3, 7 + power / 12 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON_ARROW;
beam.hit = 20 + power / 25;
beam.range = beam.rangeMax = 8;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = RED;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_LAVA;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = RED;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_LAVA;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = RED;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FIRE;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = RED;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FIRE;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ICE;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ICE;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_COLD;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 8 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_COLD;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 2, 9 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_COLD;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 2, 9 + power / 11 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_COLD;
beam.hit = 17 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 1, 8 + (power / 20) );
beam.colour = LIGHTCYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ELECTRICITY;
beam.hit = 17 + power / 20;
beam.is_beam = true;
beam.damage = dice_def( 1, 8 + (power / 20) );
beam.colour = LIGHTCYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ELECTRICITY;
beam.hit = 17 + power / 20;
beam.is_beam = true;
beam.damage = dice_def( 3, 10 + power / 17 );
beam.colour = LIGHTCYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ELECTRICITY;
beam.hit = 16 + power / 40;
beam.is_beam = true;
beam.damage = dice_def( 3, 10 + power / 17 );
beam.colour = LIGHTCYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_ELECTRICITY;
beam.hit = 16 + power / 40;
beam.is_beam = true;
beam.damage = dice_def( 3, 7 + power / 10 );
beam.hit = 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FIRE; // why not BEAM_FIRE? {dlb}
beam.is_beam = false;
beam.damage = dice_def( 3, 7 + power / 10 );
beam.hit = 40;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FIRE; // why not BEAM_FIRE? {dlb}
beam.is_beam = false;
beam.type = 0;
beam.flavour = BEAM_HEALING;
beam.thrower = KILL_MON;
beam.hit = 25 + (power / 5);
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_HEALING;
beam.thrower = KILL_MON;
beam.hit = 25 + (power / 5);
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_TELEPORT; // 6 is used by digging
beam.thrower = KILL_MON;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_TELEPORT; // 6 is used by digging
beam.thrower = KILL_MON;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_TELEPORT; // 6 is used by digging
beam.thrower = KILL_MON;
beam.is_beam = true;
beam.type = 0;
beam.flavour = BEAM_TELEPORT; // 6 is used by digging
beam.thrower = KILL_MON;
beam.is_beam = true;
beam.damage = dice_def( 3, 16 + power / 10 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON;
beam.flavour = BEAM_MMISSILE;
beam.hit = 22 + power / 20;
beam.is_beam = false;
beam.damage = dice_def( 3, 16 + power / 10 );
beam.colour = WHITE;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON;
beam.flavour = BEAM_MMISSILE;
beam.hit = 22 + power / 20;
beam.is_beam = false;
beam.damage = dice_def( 3, 6 + power / 13 );
beam.colour = DARKGREY;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_NEG;
beam.hit = 16 + power / 35;
beam.is_beam = true;
beam.damage = dice_def( 3, 6 + power / 13 );
beam.colour = DARKGREY;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_NEG;
beam.hit = 16 + power / 35;
beam.is_beam = true;
beam.damage = dice_def( 3, 7 + (power / 14) );
beam.hit = 20 + (power / 20);
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.damage = dice_def( 3, 7 + (power / 14) );
beam.hit = 20 + (power / 20);
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.damage = dice_def( 3, 7 + (power / 15) );
beam.hit = 20 + power / 20;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_STEAM;
beam.is_beam = false;
beam.damage = dice_def( 3, 7 + (power / 15) );
beam.hit = 20 + power / 20;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_STEAM;
beam.is_beam = false;
beam.name = "0";
beam.range = 7;
beam.rangeMax = 14;
beam.type = 0;
beam.flavour = BEAM_PAIN; // pain
beam.thrower = KILL_MON;
beam.name = "0";
beam.range = 7;
beam.rangeMax = 14;
beam.type = 0;
beam.flavour = BEAM_PAIN; // pain
beam.thrower = KILL_MON;
beam.damage = dice_def( 3, 3 + power / 50 );
beam.hit = 18 + power / 15;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_FIRE;
beam.is_beam = false;
beam.damage = dice_def( 3, 3 + power / 50 );
beam.hit = 18 + power / 15;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_FIRE;
beam.is_beam = false;
beam.damage = dice_def( 3, 3 + power / 25 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 18 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 3 + power / 25 );
beam.colour = LIGHTGREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 18 + power / 25;
beam.is_beam = true;
beam.damage = dice_def( 3, 20 );
beam.hit = 15 + power / 30;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_NUKE; // a magical missile which destroys walls
beam.is_beam = true;
beam.damage = dice_def( 3, 20 );
beam.hit = 15 + power / 30;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_NUKE; // a magical missile which destroys walls
beam.is_beam = true;
beam.damage = dice_def( 1, 6 + power / 25 );
beam.hit = 60;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_POISON;
beam.is_beam = false;
beam.damage = dice_def( 1, 6 + power / 25 );
beam.hit = 60;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_POISON;
beam.is_beam = false;
beam.damage = dice_def( 3, 8 + (power / 9) );
beam.hit = 20 + (power / 25);
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE; // similarly unresisted thing
beam.is_beam = false;
beam.damage = dice_def( 3, 8 + (power / 9) );
beam.hit = 20 + (power / 25);
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE; // similarly unresisted thing
beam.is_beam = false;
beam.damage = dice_def( 3, 5 + (power / 10) );
beam.hit = 14 + power / 35;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE; // similarly unresisted thing
beam.is_beam = false;
beam.damage = dice_def( 3, 5 + (power / 10) );
beam.hit = 14 + power / 35;
beam.type = dchar_glyph(DCHAR_FIRED_MISSILE);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE; // similarly unresisted thing
beam.is_beam = false;
beam.damage = dice_def( 1, 4 + power / 10 );
beam.hit = 16 + power / 20;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_POISON;
beam.is_beam = false;
beam.damage = dice_def( 1, 4 + power / 10 );
beam.hit = 16 + power / 20;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_POISON;
beam.is_beam = false;
beam.name = "0";
beam.range = 7;
beam.rangeMax = 14;
beam.type = 0;
beam.flavour = BEAM_DISINTEGRATION;
beam.thrower = KILL_MON;
beam.name = "0";
beam.range = 7;
beam.rangeMax = 14;
beam.type = 0;
beam.flavour = BEAM_DISINTEGRATION;
beam.thrower = KILL_MON;
beam.damage = dice_def( 3, 2 + power / 25 );
beam.colour = GREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 14 + power / 30;
beam.is_beam = true;
beam.damage = dice_def( 3, 2 + power / 25 );
beam.colour = GREEN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_POISON;
beam.hit = 14 + power / 30;
beam.is_beam = true;
beam.name = "foul vapour";
beam.damage = dice_def( 3, 5 + power / 24 );
beam.colour = DARKGREY;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_MIASMA;
beam.hit = 17 + power / 20;
beam.is_beam = true;
beam.name = "foul vapour";
beam.range = beam.rangeMax = 8;
beam.damage = dice_def( 3, 5 + power / 24 );
beam.colour = DARKGREY;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_MIASMA;
beam.hit = 17 + power / 20;
beam.is_beam = true;
beam.damage = dice_def( 3, 25 );
beam.hit = 16 + power / 25;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.damage = dice_def( 3, 25 );
beam.hit = 16 + power / 25;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON_MISSILE;
beam.flavour = BEAM_MMISSILE;
beam.is_beam = false;
beam.name = "hellfire";
beam.aux_source = "blast of hellfire";
beam.colour = RED;
beam.range = 4;
beam.rangeMax = 13;
beam.damage = dice_def( 3, 25 );
beam.hit = 24;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_HELLFIRE;
beam.is_beam = true;
beam.name = "hellfire";
beam.aux_source = "blast of hellfire";
beam.colour = RED;
beam.range = 4;
beam.rangeMax = 13;
beam.damage = dice_def( 3, 25 );
beam.hit = 24;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_HELLFIRE;
beam.is_beam = true;
beam.damage = dice_def( 3, 20 + power / 20 );
beam.colour = CYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FRAG;
beam.hit = 19 + power / 30;
beam.is_beam = true;
beam.damage = dice_def( 3, 20 + power / 20 );
beam.colour = CYAN;
beam.type = dchar_glyph(DCHAR_FIRED_ZAP);
beam.thrower = KILL_MON;
beam.flavour = BEAM_FRAG;
beam.hit = 19 + power / 30;
beam.is_beam = true;
beam.name = "0";
beam.type = 0;
beam.flavour = BEAM_BLINK;
beam.thrower = KILL_MON;
beam.is_beam = true;
beam.name = "0";
beam.type = 0;
beam.flavour = BEAM_BLINK;
beam.thrower = KILL_MON;
beam.is_beam = true;
static int apply_radius_around_square(
const coord_def &c, int radius,
int (*fn)(const coord_def &, int, int, int),
int pow, int par1, int par2)
static int _apply_radius_around_square( const coord_def &c, int radius,
int (*fn)(const coord_def &, int, int, int),
int pow, int par1, int par2)
apply_radius_around_square(
caster->pos(), rad, monster_abjure_square,
pow, test, wont_attack);
_apply_radius_around_square( caster->pos(), rad,
_monster_abjure_square,
pow, test, wont_attack);
bool death_message
= !silent && mons_near(monster) && player_monster_visible(monster);
bool in_transit = false;
const bool hard_reset = testbits(monster->flags, MF_HARD_RESET);
bool drop_items = !hard_reset;
const bool gives_xp = !monster->has_ench(ENCH_ABJ);
const bool hard_reset = testbits(monster->flags, MF_HARD_RESET);
const bool gives_xp = !monster->has_ench(ENCH_ABJ);
bool death_message = !silent && mons_near(monster)
&& player_monster_visible(monster);
bool in_transit = false;
bool drop_items = !hard_reset;
&& (beem.target_x == you.x_pos && beem.target_y == you.y_pos
&& you.caught()))
&& ( beem.target_x == you.x_pos && beem.target_y == you.y_pos
&& you.caught()
|| mgrd[beem.target_x][beem.target_y] != NON_MONSTER
&& mons_is_caught(&menv[mgrd[beem.target_x][beem.target_y]]) ))
// FIXME: Need monster body-size handling. For now, never attempt to
// change armour.
return (!mslot_item(MSLOT_ARMOUR));
// Returns whether this armour is the monster's size.
return (check_armour_size(item, mons_size(this)));
// For now, never attempt to change armour.
// return (!mslot_item(MSLOT_ARMOUR));
// XXX: Very simplistic armour evaluation for the moment.
// Because of the way wants_armour() is handled above, this armour exchange
// currently only takes place if forced by wizard mode.
int newAC = item.armour_rating();
// no armour yet -> get this one
if (!mslot_item(mslot) && newAC > 0)
return pickup(item, mslot, near);
// XXX: Very simplistic armour evaluation (AC comparison) for the moment.
// This should take resistances into account.
if (!force && existing_armour->armour_rating() >= item.armour_rating())
return (false);
if (!force)
{
int oldAC = existing_armour->armour_rating();
if (oldAC > newAC)
return (false);
if (oldAC == newAC)
{
// compare item value (uses resistances and such)
int oldval = item_value(*existing_armour);
int newval = item_value(item);
// vastly prefer matching racial type
if (_item_race_matches_monster(*existing_armour, this))
oldval *= 2;
if (_item_race_matches_monster(item, this))
newval *= 2;
if (oldval >= newval)
return (false);
}
}
ISFLAG_BEEN_IN_INV = 0x20000000, // Item has been in inventory
ISFLAG_SUMMONED = 0x40000000 // Item generated on a summon
ISFLAG_BEEN_IN_INV = 0x20000000, // Item has been in inventory
ISFLAG_SUMMONED = 0x40000000, // Item generated on a summon
ISFLAG_DROPPED_BY_ALLY = 0x80000000 // Item was dropped by an ally