Rewrite some code to use actor methods instead of calling things directly. In theory, attacker_as_monster() and defender_as_monster() are hacks; any calls to them that can be replaced by calls to actor methods should be. Fix some inconsistencies with monster bleeding and summoned creatures. (This should probably go into actor::can_bleed().)
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8444 c06c8d41-db1a-0410-9941-cceddc491573
2Z6IWKMEWE4OIFVWFSZBA2SIXMBJNV6H6LNEPOXTJZW433ABU4EQC
5VZV44DOSCYGG4CRBZ6BARRUTCXJ2AFIDYNJ75JCSBHTDL3HFKZAC
3BPQZKGANWDRNWJETOBGQVT4E5S3SC7Q3TUIRVEVBTOPAVKUCFCQC
L6RNMJ4AGWWA5FRQW5QRCFY5OD5NUB5QF7H36TNIKQYRTR2KPYPAC
2V37VGP44HYXDD57F36STCDYUU3ATMG2IM7OMUT3TJ7ORUAKOSOQC
SPELY2CWWXU73ZMKMOSKGBFRP6BMXEHF4YPZ3EOLMDMC6UTZNKCAC
JMSKD53OB2M34RFVJASMIODY673MVZHPPJYQDT6F4KV7MYQYZWNQC
XGHM5AJS3XIA4TI2OES3ZRDAY42BBK5JTCTEMTQK3A3FBYM2MIOQC
ZQ5J3CGMU4MSUNVPPBC3NDXV3K5CRZBK4IVUI4JRI2J2CVGL7XLQC
C6SU6CPHYLFEJTVDX4Q5VBL4GCCKZNTI3TEB3YSFG2RYELSQGA2QC
QXI6JLO5RGDKUG5H7RBMQTTT3234L2NGHJTMWAF6UJEBJDBDMMNAC
N6F35CMZALDQR4LD3HP2JQZGQ4JNBATAICO7ZUCF5M2ZW5E4QYVAC
XZTGZ7MOPX7ZOHQ4IQPXOHGUH5WPRNOYAQ6IQOMZDZYNVSAYFTNAC
KOVRG7IPNFPXQNBFVMYEY7T6WM55CHJ37I4E763S6EJ6IZH32FYAC
CQKH4FU2BZOMP5VWWOH2CEWDAYOV7FV53VOFQRF7R64DCQMP73LAC
S3AAI5UNOZ72DWBQ4QZQ2IODUI6ZC5X2RIPAPNZ7CPQCIAAT7EKQC
ZYBZFZJRHBI7IMLOY7S4BXLJAMOXPK6GWLD2SKWT7S6O26OIYQPQC
4LNX57GAARCBHAHC6JY73VFHAHV6B5DYUBPSF7RM6USDEAAMUR3QC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
6ECDSRJ6V3FSIAQC6FZK5SV4NGXXR6PW5S4KADSPISPP36CXLTYQC
ACKNLTFL2RI3PMRWLNRVLRWGQAMLRFKNGNS5LED6NFE5GVGFIHFAC
C5WZ62XDFNON4HCJOXC6IL6SQYLE6TKX7DDSJX3MTWAZ4HHM27GQC
Z6Q7JVMFQ32SC7FRGOB7CE7JS2HEOPAO3B2VLU3YR3UCUDZFIPFQC
EQDLV5OMIFO5ZPYNE27VQLLZEIRMSALGNEFWVSCFXJN22A43GCWQC
KBNY5FWKTEAKABFCLPC3QFKFSVZKAGXINPCIFV6WDSWFO4VCKNTAC
Q3XHNSHW6FI4JCXSEABATRFBJPMCF7PXNG2K6ZQTRRPVMIZFHUBQC
MJWFTUS66PTCNEYXEJA3CUJFXNWXIKDD6H3V24PW7HK64NSVOFSAC
T7CUIVICB74342RA32BR37T36FOX4RBSQIB5PNOHTGTGUYGDKSTQC
4IYLLCZVA4PPEHF2XINH2OOATKNK7LCZNG6DA7OEK52QL5O4J6ZQC
JGTKZP6HCXDHEJLAONL3FNLNIZ7MUBYKXZ4CRTL46YC53TW7CBEAC
TO43FWKHNIA5MVDOFXYHQODTLBQYEZKX5UIUGID57436UF7G2EXQC
S26C7QFN3OBMIHF5XRB5PKRCQVBY22OLUIJKTD4CEMHKWCWE457AC
TGJZXTUIAKCFZQJ54ZQEBGFBVZSJCAX6AWDRSH3TP7UJRLGUM5SAC
HBRUWIHAOFRF57K4D7TNGLVAFWP3SLH6UUMQCSVKBFOKG3KYTRVQC
IGN3Q5YCLHXKWFZQRSRABCHW2JFW5TFVU7TM5EXE2EW7PDBBSQWAC
5HGMULU7IWTFJJH35S6XTCW3YZEMCORXHQL6NVY2TO4DUMVITNJAC
R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
DKRSOHZXL6EPSLKOKHF7GJXSZEJVY7CXGACSHWLM5B5FTRETWWCAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
PKHOZG6TIUP2NZZIP6CW5OIPZ3O6PCGWXXW5MH4I6P2WVM24HZEQC
OMTU7OMVWDVAGJCQGQJDZ3YU252T6IM2LPS2ZMPWB7MIXCJK62AQC
SOCJXX6MMOXLBEWBID4QN5FW2YNYULNNN7K3IRL7RSWK5EUNAZLQC
AS2IQQJNNCEQNXXKTGYHLB7RO3ZKCF4F7GK6FJH66BOOKDDRGNIQC
JFDTUUUT6AKIGPBKGYFC7HZKGQUZOMG7EUWU4QYKSDVXXPQBBFHAC
XJBNF2N35THJC2KYGCMPLC3CDCJP25CEDKHUI3P55V6H5YWXBUKAC
JBMC2XNV3DNWMMLKUDRKBPDCPVRITY6L3WRQSD2SJMWNZUSIBMRQC
2WVP47RBNL5OVYMAZH7TKRYD7F2TGSZ5X74PWVGAYCQP26G3JUHQC
YT23TCUEE6A3I7EX6WIZYHCPRYJDE74IZKR5YKPHKOFSYJCKFUCQC
MG6LLF3XYCOEBQRX7TJ4MUTKM3IROYWUMZGCMYVW4TGDG36CJMJQC
BX6P2BQYNZH2FM4ADLPULHK5FCWEAVXFEUYNHYLCUTSQCOWGNWAQC
F5BDG7A5AN62J42Q4WLWZB6O6GQBQG2HVY74V56WGPACNBNYNCIQC
TMOWALST5KULWZF2UE6Y6UMCZOVSIUZDJUKBSE3OYA7TMTMPKZYQC
PFDWNTN3NEZCP6NKPIM2FK3KRVDBQUCGIAWWOU2DJVS4KWWJLYYAC
ADIVVYTV2MJ3XVRYDNBLPTAEACCNF27XZDCRVZFQEHRHPMZGNITQC
7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC
P2ZCF3BBG523ZEOD6XQA4X5YEHBTWH3IM33YVHXP2SQ5POXZIH4QC
EOJPYR3QD5GGS7GB2P7SBLMOP7YC57YMIVR7VKCOMWNCKNBPESBQC
5FHWTG7M6FW4B3I33YI7QSM3OZIB6ZGC6TI6JISSLY5Y43HI56VAC
CRCKW7MAFIP2MB6ZNPVZXUHBGSPQNTYHGDVF2TCM2K6XLRUTUW4QC
ISUJEAPPWKP2UIYPT6BJUUNSVH52NEXWGXNUATL7I3IO7TPO32HAC
IT3NSSLR756K7TZ7S7DOMS7DZUVGIFS5EAR22PEERAF5ZRBICV4AC
DMRXDEKHHBQNY37NPGZFAGUQPALWFANGGK4CUWIOQUPSLM2JBNFQC
4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC
JYEEOUYQ7ZPKOGWUV7VCORBVSOLF2UCBFBH3TR75RGOSS6PNKYUAC
E5DMZFW6WCFAKTKKOQPYTQXZ2CGLWMVH64LRXDUI2UIG4VYUHIVQC
RSIUBEQUGNU4LO6KH4PKVROWQS33DAKSY4XFVGN7T3CEKSXABCSAC
XXUOHQJZC3ODB7UMS5FMYAOXEAJK5TRYPVFRQYHK4OZ2DZVP6ARAC
MS2DCUFQ7Y4BZB6SEXFF4N4JOVU2HQS5EO6J6HZOC4SZHQYGMPRQC
O4ALQTGKFDGHEHBP3JGBKDY6KYDJZSVKGDX5WXR4IDWGUYYA263AC
JI4NDSOXGGZ7QHXXFB3ZTHAKHABXYBZXPDGLUFV5SKYEOL5FT7JQC
52FEQPZJXSIC2RBEQDRP4CW56AQTFKQ434GI6PBMEOUGM6KUMHMAC
CDKRLJIGVWQE2PMHCSLJBLYQEK7JYC4LQM7H2X3O6NMJMCCDRVIAC
D4KP4ZQPOESRZJJHAEWFVZFQEUJU4VYNDADKDG252MKDUM5WYI4QC
FZY4HSWWVXB4KNVLUVCBDKU4Z5IIP6V6WIJ3QVPQDWACNVH5DT6QC
ITA3XNJBFNQONTIPJYRSVAOY55PUWSYYEZXZTVBQBH5XA3A5MNJAC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
L254F6ZIU2HWGLFFGPIORTN4C3TDQ3E5JZ7Z7GQA5AEDIKL6PKDAC
QX6BW6RP7EVCKNQRF3ZL4377XVNS4AM3KWU3W7HPFUWWJJQZORLQC
L4PKJZERR7WADKWHY3MR6J6OZFREVPL3CB43I6MLJ2BVKWCUTE7AC
J4CLLL5AUB264TTFGM66PFWF4KL6LXCQ4TWATOXHNLDQ7OIVTMDQC
43ZYZLF7JFSCKTLQMBYIHNGGDMN3OBDX4X4PLXLIUFD5DPYSDCXQC
32PXX2XJVV7YSLLYNAVS7RYKYRAOQ565TZMTITSEPSSXOYPB5M2AC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
UADYVV3UD5ERJTZZJGY4EUQ4NJ2JSBG7YYUJ75ZRBIXRQXQKOJPAC
ZNMUUTINYIFCCBFSQDKTTXWXEGAXLDCGPX47NK3Q7NUHRH7S4GXQC
AY3CBJCAR4XMZODH5N4DVJXXJF3B5HUKICRGO7KCTCFACAYVGN4QC
GPEJOT73KMACP33IPAKFR5ROGHCOIP22VXZMQNYTGLEA2OSZUM2AC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
EYHC4V76YSCWY22DQIXLVTAP5SKZLBSBQWYFPDVEXF6IW552HR5QC
HH3HFWVXABJ4IRMN22PPJCREMULZSN6DA7VYKOGECGMNUQTZ5QNQC
VERPUJ3PIWGEVLXJJ5KYJJ3DGOWSOWBS4JOJ4PDISYGQLPQOZXIAC
O3VTFHATCIAAJ4HQF2VJIEXHDZ6RJYJKXJ4ST65WWV26BSGW4YWQC
GBCLP4O23XSCRFH3DY5EEPBFEQVQR7BH7EI6AQGDCLFMFKA7PLJAC
7IL4I245EE3WRZ56AJPLOGZPE6LAS5YQWMJSBOPY2VBLH5EJEKXQC
SBTVKHKZRMVDBYLGQNMZMJXPAYJG43UWBBD7HQJWIPN3BMMHUBJAC
6TYCKF4JX27PXCMWXDWKMZPQNF7EF5RF6MAPS573TW6VDTPBK3CAC
P5TRGRH7XMQSPCZKM5IEEO34TY6WMLGHHX7BU6Y453JFRXLUR2VQC
33ZMPQC6OXTESW7SRW765GRNJUEJRSYONRVZVIEUDAUEJ2PPMB4AC
OP6CTAKWCAU64JXQ3USQYR5E5IFHQHNCACII5UMVRXUTZXJQOAZAC
BUSA7O6EFBZVAG2RL5T7MD2WTWKOEKKIAAZ2VS4Y3L6ECT4HQR6QC
46I36AWFYIFDOUPKFEMJSJTPQ27CQP7FNKOLT3ZOBUI6SF4EL7RQC
MINMR3UAVXGVNIGZKS3SRYFCYDMCVEJZN7AGDWJNHQLR36FDXU7QC
PFMHSDAXQN4VDSDA6QBDIK2DPJKGYX5HYLTSZNTKMRJYXYLIKGOQC
N3BRDQWPEHQZWIX2CDM2O2VLD6DJONGILDXVCSCAVWOGIOUU5IGAC
4C6O4H7IO3LDZPBDGRST3QUFKMNQRB4Y6JXUV3NKIJVVPLAA2AWQC
3PBG6FJ6WGSR4UM3I7UQUYYCSYU3UBCKCIKYKUEEANIK72TUL4XAC
QS3ZRS3E6KL3YJHPKYEWCWJYRBJSXD5OOYF6Y25HZVECGPJRDB5QC
OSGS3PH2L5CBTDVZCZS6OCFQNA4A7RMEXBYJQB7DDZBYYJW7QSSAC
TVC7W7C2XKBQSD2IJFMWFVGXZAOD4EUOW43NAQTOF5KFMAUOJABQC
DIY6I5TK7SSDULLLPKGT4LUS7IAL25NOJW7BM7WS542NYQPJ2K2AC
FUEEIUKGHHFPIRZCN3N753GONWAZTWQ2ZWR53IBJAAZ6FZUNGOMAC
E335DPK7M5WBYKN5C3KG75KY75CVXLN3XTLK55MADVZMHW74AHGQC
C4CGYUPRJPDPAF6E65Y3MGAK45PNDPF2CNT276V7P37PPLX3AR5QC
FEKJYPRNH6AA7UO5L6QYRMKSZDC7NZZDTVDO7E7D3DHT7LP6IX5QC
}
bool player::can_bleed() const
{
if (you.is_undead && (you.species != SP_VAMPIRE
|| you.hunger_state <= HS_SATIATED))
{
return (false);
}
const int tran = you.attribute[ATTR_TRANSFORMATION];
if (tran == TRAN_STATUE || tran == TRAN_ICE_BEAST
|| tran == TRAN_AIR || tran == TRAN_LICH
|| tran == TRAN_SPIDER) // Monster spiders don't bleed either.
{
return (false);
}
return (true);
}
// Checks whether the player or a monster is capable of bleeding.
bool victim_can_bleed(int montype)
{
if (montype == -1) // player
{
if (you.is_undead && (you.species != SP_VAMPIRE
|| you.hunger_state <= HS_SATIATED))
{
return (false);
}
int tran = you.attribute[ATTR_TRANSFORMATION];
if (tran == TRAN_STATUE || tran == TRAN_ICE_BEAST
|| tran == TRAN_AIR || tran == TRAN_LICH
|| tran == TRAN_SPIDER) // Monster spiders don't bleed either.
{
return (false);
}
return (true);
}
// Now check monsters.
return (mons_has_blood(montype));
if (attacker->atype() == ACT_MONSTER)
atk = dynamic_cast<monsters*>(attacker);
if (defender && defender->atype() == ACT_MONSTER)
def = dynamic_cast<monsters*>(defender);
if (you.religion == GOD_BEOGH && mons_species(def->type) == MONS_ORC
&& mons_is_sleeping(def) && !player_under_penance()
&& you.piety >= piety_breakpoint(2) && mons_near(def))
if (you.religion == GOD_BEOGH && defender->mons_species() == MONS_ORC
&& defender->asleep() && !player_under_penance()
&& you.piety >= piety_breakpoint(2)
&& mons_near(defender_as_monster()))
if (you.religion != GOD_ELYVILON && you.penance[GOD_ELYVILON]
&& to_hit >= def->ev && one_chance_in(20))
const int evasion = defender->melee_evasion(attacker);
if (you.religion != GOD_ELYVILON
&& you.penance[GOD_ELYVILON]
&& to_hit >= evasion
&& one_chance_in(20))
const int ac = def->ac
- random2( you.skills[SK_STABBING] / stab_bonus );
const int ac = defender->armour_class()
- random2(you.skills[SK_STABBING] / stab_bonus);
const bool immune = mon && mons_immune_magic(def);
const bool is_shifter = mon && mons_is_shapeshifter(def);
const bool can_clone = mon && !mons_is_holy(def)
&& mons_clonable(def, true);
const bool immune = mon && mons_immune_magic(defender_as_monster());
const bool is_shifter = mon && mons_is_shapeshifter(defender_as_monster());
const bool can_clone = mon && !mons_is_holy(defender_as_monster())
&& mons_clonable(defender_as_monster(), true);
beam.thrower = (attacker->atype() == ACT_PLAYER) ? KILL_YOU
: atk->confused_by_you() ? KILL_YOU_CONF
: KILL_MON;
beam.beam_source =
(attacker->atype() == ACT_PLAYER) ? MHITYOU : monster_index(atk);
beam.thrower =
(attacker->atype() == ACT_PLAYER) ? KILL_YOU
: attacker_as_monster()->confused_by_you() ? KILL_YOU_CONF
: KILL_MON;
beam.beam_source = attacker->mindex();
beam_temp.beam_source =
(attacker->atype() == ACT_PLAYER) ? MHITYOU
: monster_index(atk);
beam_temp.apply_enchantment_to_monster(def);
beam_temp.beam_source = attacker->mindex();
beam_temp.apply_enchantment_to_monster(defender_as_monster());
coord_def pos = defender->pos();
if (!mons_is_summoned(def))
bleed_onto_floor(pos, defender->id(), def->hit_points, true);
if (!defender->is_summoned())
bleed_onto_floor(defender->pos(), defender->id(),
defender_as_monster()->hit_points, true);
simple_monster_message( def, " grows two more!" );
def->number += 2;
heal_monster( def, 8 + random2(8), true );
simple_monster_message(defender_as_monster(),
" grows two more!" );
defender_as_monster()->number += 2;
heal_monster(defender_as_monster(), 8 + random2(8), true);
if (perceived_attack && (def->foe == MHITNOT || one_chance_in(3))
&& atk->alive() && def->alive())
if (perceived_attack
&& (defender_as_monster()->foe == MHITNOT || one_chance_in(3))
&& attacker->alive() && defender->alive())
if (perceived_attack && atk->alive() && mons_friendly(def)
&& !mons_wont_attack(atk) && you.pet_target == MHITNOT
if (perceived_attack && attacker->alive()
&& mons_friendly(defender_as_monster())
&& !mons_wont_attack(attacker_as_monster())
&& you.pet_target == MHITNOT
napalm_monster(def, mons_friendly_real(atk) ? KC_FRIENDLY
: KC_OTHER,
std::min(4, 1 + random2(atk->hit_dice) / 2));
napalm_monster(defender_as_monster(),
mons_friendly_real(attacker_as_monster()) ?
KC_FRIENDLY : KC_OTHER,
std::min(4, 1 + random2(attacker->get_experience_level())/2));
const int hd_mult = mons_class_flag(atk->type, M_FIGHTER)? 25 : 15;
int mhit = 18 + atk->hit_dice * hd_mult / 10;
const int hd_mult = mons_class_flag(attacker->id(), M_FIGHTER)? 25 : 15;
int mhit = 18 + attacker->get_experience_level() * hd_mult / 10;