types/flavors for ugly things. They now use the ghost_demon struct, expanded to account for these characteristics.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@10709 c06c8d41-db1a-0410-9941-cceddc491573
4OKEEU32EGHIDAJ75GH3USSQHQPZBDZVC7TOP7ALMHZRUFPE5WEQC UANJI74DZW4MVGWK53MAZ667HAARWAURFOHKFBPSW4OFZ4C6LPCQC PC6K5OQF3BWPMWTIN5JXAKHTZF453JQOELDWRUOSBZXR256FTUYQC XDACRDVLDEUFUBN4L7ES5WBD3YSLBHMRZ4Q5PXIUMOK44D3TLWSAC JQSFAW5HQ5VVHPEP26VJK3A46W2DT5S3WMRCVY3OGOAFXQZBO6WAC AFSFRZD2DMN5GEARVYPP5G23JTUCX6B5U4YONBP5HWAURBQYOK3AC L3AZ25JHBR3UGYOWQIYSAIMUSTCCI6LLAWQCL7QRMHVXR4NGV7RAC K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC AM7QPHDAWNXHLUEVUHVRHG2RO2DOIEFFU4GV3DCIROW6O5HW7H4AC RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC PSCYVKJ7DGXAL3V5U4O6AJTRV6Q3N3SHQWAZ73VIPRTE4W64F2XAC KZNUAHJQUBM6MEVUSSWG734AXZ3NZYMRJ2XFQLRGXJ3MSTBV7ELQC RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC 7AMQN7MITMXBNVDAK5VOXTQ4TZIAOD6ZLOFJG7GQMBTY23Y2BKSAC T4FNOPMWYYJHJBTTY33PB43HTJPKEC46L62YERTWIX73HYZSELXQC 5WKKONCYM73GBJ6GDYK3OLZ2PB7KJHFDYGEMHQQMPQMFJJHTLWCQC CRCKW7MAFIP2MB6ZNPVZXUHBGSPQNTYHGDVF2TCM2K6XLRUTUW4QC WQLOHSNCA3VOMDJF6IINJYKSYVYZEBPJJWBB33QSNE4RP5HEXPMAC QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC 6GSPAIEMWJXYSCR5EC2WBOGYDEDR6ESIZC6TKN2FVE2CVPSHUHXAC 7KHOKTB2DCRQ5UF6A2VKAWQSAH7O4YOFBL3N3LVQRKVHLU6TOBVAC 47NSOFQMBZCDIBHEAZSENFUGDSQCX3GJHFBUZ65ARDKCYIZ435LAC 7KWDC7XFNMBLSUO2HISIROBINZBX5T67LJEEXTAORXW2YZ7VWFGAC Y4WR4EIOFFXHRQI2PJAZWD4MVL6A7MNBHLN4KOV6BIKGGA7FXQTQC JFDTUUUT6AKIGPBKGYFC7HZKGQUZOMG7EUWU4QYKSDVXXPQBBFHAC LOLAFYU5JORDOHWN3NVKUS7HJQKG2NXADPPVLER3NSW6WX4VUJOAC 3WHI3KM43ZCN4ITJLFQQBQBC4OJPRS7QTBPIQ6QBCUVKRSK476SAC 3RSGUIHINKZQ467SKRG23I7G56OV7NLS72S7FHXTZEGGL2T64UMAC 5UC5TI7B6NWGIGN74QRBZKDBYUMHLM2ZO5ATXEZ6TZOGOLF3JX5QC V7IKAPO5OY7CJTT62GMHQOD3EQW42FTTY3KDBOTJUODPS5WMBCHAC XJRP5MAESWFGYS4CBM7K2ENA3UBPL6N6MDNAHJBH2WRMZ73E5JGQC SG76BPJKTQGDFNP5QFMAVR6H72FMMAYCECVGSWWSCLMAVQX7E3FQC 3AZMOIK3TRC2S3KDUJHBT5W4DQPO7RU6CQ4MK4H2FUTW63EQ2FVAC ASLW3Z5PAVZSWJEMMMVZT226P44EKSAD47QS72JIFJESAI3RPN3AC R22TTMI6WXWULC7ODKFF3QCB7MOTETQQ6IR4BUCUPOCQKQNCTT5AC HHI3OKPP4E6OHJDA4UTMIW7ISHFRIOEZETYTKYU4D3WQW7ZMTNTAC HGBHRHXFVTEWYYV2D5HKTKL4Z6OSNR2ZOIHFQX55CVRCXQUQ7MQAC SIDH2P7NBIG5KEOE27XHD3ZT2NQ2OJZFN6VZXWNWYFFY5YVXSSVQC S6ZETU2X3HBTKBDL2KTAMCNPMPGHEZO2JGMILIWETWC7XXRS5RYQC 4RFKVDJKTCRBZU6WPJ2E5OVI5IRPY3UTRPOBLC5QHY4CQJJTLZKQC I7QLYOTE6DLQZM7YWUWYLKHRJRB2A3STQ42ALSRGQICEWKD2QTEQC Y56C5OMUQ5XF2G6DKDV4R5MED44UOIUPTBBQVWQBUHYIXYA5MOZAC // Initialise pandemonium demons.if (menv[id].type == MONS_PANDEMONIUM_DEMON)
// Initialise (very) ugly things and pandemonium demons.if (menv[id].type == MONS_UGLY_THING|| menv[id].type == MONS_VERY_UGLY_THING){ghost_demon ghost;ghost.init_ugly_thing(menv[id].type == MONS_VERY_UGLY_THING);menv[id].set_ghost(ghost, false);menv[id].uglything_init();}else if (menv[id].type == MONS_PANDEMONIUM_DEMON)
4, 8, MST_NO_SPELLS, CE_MUTAGEN_RANDOM, Z_BIG, S_ROAR, I_ANIMAL,HT_AMPHIBIOUS_LAND, 8, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
4, 10, MST_NO_SPELLS, CE_MUTAGEN_RANDOM, Z_BIG, S_ROAR, I_ANIMAL,HT_AMPHIBIOUS_LAND, 10, DEFAULT_ENERGY, MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
// An ugly thing is the only ghost demon monster that can level up.// If one has leveled up to a very ugly thing, upgrade it properly.//// XXX: There should be a better way to do this!if (type == MONS_VERY_UGLY_THING){ghost->ugly_thing_to_very_ugly_thing();uglything_init();}
}static unsigned char _ugly_thing_random_colour(){const unsigned char colours[] ={CYAN, GREEN, RED, LIGHTGREY, BROWN, MAGENTA};return (colours[random2(sizeof(colours) / sizeof(*colours))]);}static mon_attack_flavour _ugly_thing_colour_to_flavour(unsigned char u_colour){mon_attack_flavour u_att_flav = AF_PLAIN;switch (u_colour){case CYAN:u_att_flav = AF_ELEC;break;case GREEN:u_att_flav = AF_POISON;break;case RED:u_att_flav = AF_FIRE;break;case LIGHTGREY:u_att_flav = AF_COLD;break;case BROWN:u_att_flav = AF_ACID;break;case MAGENTA:u_att_flav = AF_DISEASE;break;default:break;}return (u_att_flav);}static mon_attack_flavour _ugly_thing_flavour_upgrade(mon_attack_flavour u_att_flav){switch (u_att_flav){case AF_POISON:u_att_flav = AF_POISON_MEDIUM;break;case AF_FIRE:u_att_flav = AF_NAPALM;break;case AF_DISEASE:u_att_flav = AF_ROT;break;default:break;}return (u_att_flav);}void ghost_demon::init_ugly_thing(bool very_ugly){// Midpoint: 10, as in mon-data.h.speed = 9 + random2(3);// Midpoint: 10, as in mon-data.h.ev = 9 + random2(3);// Midpoint: 3, as in mon-data.h.ac = 2 + random2(3);// Midpoint: 12, as in mon-data.h.damage = 11 + random2(3);// Experience level: 8, the same as in mon-data.h.xl = 8;// Hit dice: {8, 3, 5, 0}, the same as in mon-data.h.max_hp = hit_points(xl, 3, 5);resists.elec = 0;resists.poison = 0;resists.fire = 0;resists.cold = 0;resists.acid = 0;resists.sticky_flame = false;// An ugly thing gets one random resistance.ugly_thing_add_resistance();const mon_attack_type att_types[] ={AT_BITE, AT_STING, AT_CLAW, AT_PUNCH, AT_KICK, AT_TENTACLE_SLAP,AT_TAIL_SLAP, AT_BUTT};att_type = att_types[random2(sizeof(att_types) / sizeof(*att_types))];// An ugly thing always gets a low-intensity colour.colour = _ugly_thing_random_colour();// Pick a compatible attack flavour for this colour.att_flav = _ugly_thing_colour_to_flavour(colour);// If this is a very ugly thing, upgrade it properly.if (very_ugly)ugly_thing_to_very_ugly_thing();}void ghost_demon::ugly_thing_to_very_ugly_thing(){// Midpoint when added to an ugly thing: 4, as in mon-data.h.ac++;// Midpoint when added to an ugly thing: 17, as in mon-data.h.damage += 5;// Experience level when added to an ugly thing: 12, the same as in// mon-data.h.xl += 4;// Hit dice when added to an ugly thing: {12, 3, 5, 0}, the same as// in mon-data.h.max_hp += hit_points(4, 3, 5);// A very ugly thing always gets a high-intensity colour.colour = make_high_colour(colour);// A very ugly thing sometimes gets a stronger attack flavour.if (one_chance_in(3))att_flav = _ugly_thing_flavour_upgrade(att_flav);// A very ugly thing gets one more random resistance, and another// possible resistance based on its stronger attack flavour.ugly_thing_add_resistance();
void ghost_demon::ugly_thing_add_resistance(){int base_rand = 6;if (resists.sticky_flame)base_rand--;switch (random2(base_rand)){case 0:resists.elec++;break;case 1:resists.poison++;break;case 2:resists.fire++;break;case 3:resists.cold++;break;case 4:resists.acid++;break;case 5:resists.sticky_flame = true;break;}// Guarantee certain resistances for stronger attack flavours.if (att_flav == AF_POISON_MEDIUM && !resists.poison)resists.poison++;else if (att_flav == AF_ACID && !resists.acid)resists.acid++;else if (att_flav == AF_NAPALM && !resists.sticky_flame)resists.sticky_flame = true;}
// This doesn't give anything away since all ghosts can fly, and// for demons it's already mentioned in their flavour description.
// This doesn't give anything away since no (very) ugly things can// fly, all ghosts can fly, and for demons it's already mentioned in// their flavour description.
mprf(MSGCH_DIAGNOSTICS, "Ghost damage: %d; brand: %d",ghost.damage, ghost.brand);
mprf(MSGCH_DIAGNOSTICS, "Ghost damage: %d; brand: %d; att_type: %d; ""att_flav: %d",ghost.damage, ghost.brand, ghost.att_type, ghost.att_flav);