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;