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);