git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@7409 c06c8d41-db1a-0410-9941-cceddc491573
46I36AWFYIFDOUPKFEMJSJTPQ27CQP7FNKOLT3ZOBUI6SF4EL7RQC
SDDALWEPMKK7JFJBVBMFUOH4LKE3XSWYLQFBWH23PAKF2AZPGGBAC
7X5YDPAU34LOFKEGJYE6GC7EOEDKGT3O6CUGZBYJI45L3FQOAKHQC
ISUJEAPPWKP2UIYPT6BJUUNSVH52NEXWGXNUATL7I3IO7TPO32HAC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
TGPVUXV5JRLW4FHYUHOUIPFXDVVMYN36WQHMNXCOXWMGZKWEAG2QC
QDTVLBRGHDTRUVT7I3O72K6TMOYAUSAJBZUHGOEFU2RKJNUPWZSQC
PWY4VZVHDLYL7UVNCCOW7BM7LYK2BOGTL23P75HXUJ33MHJPEJPQC
EV6BXXAN3VYUHYVFSOQFOD3YRGYY6EVC6I2LFYFLO3ATK6BSD6AQC
BKZ4VTEO2CJN7S6MMZSPDIBDRRNZNC5EN6T5CLMWMFK6KVRCK3DAC
UAJN2CFA2QHYDHW2UFAVPPHDQFCD54RKM6V2UC4AMEDJUBBLNWIQC
X5WLJCJVW55SXZVP7IKP7ADCJIGNKN4PKAXFECVR6TNK7XSMZR7QC
RBAGQ2PB7V5YAM5KSHSZR2E3MLKDSRVM5XYGI2TIXP5QMVBOQHDQC
PI5BATR2SER3RFE76IUGHM2AGXVFOUM3PLU7WC2K2Q2BA5K2E73QC
XGHRLF5KASEHD5UTAT7XBQFET3EXXFBYNT5KM6VGWVW4URJNKAYQC
5BJPWUPLJFS34FUTFJVKA4A52YMIGV6EWDXLNSDCWBJWBGVSQFGQC
5ZTUKFQSIU3NVZGNX7MPQQ3IZVXRCWB5EZSQSYEXXA4G5UFCFPTQC
FCZSQBKDNMJZRJS2LWQQWLUFGOXSKXDJZQIHC7L5S7HXCXQPOMMAC
4FQAKUKUO6PCAZ3N4HUR5XL6E4VA5UQUZ3AEDGRBLVY7W2LMWI7QC
QEX3OFNT4IDUY3FNCPNKXB2RWHXRGEXTQQXB63GMVOTGQQ3IO5TAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
RWCCZ64BG3HSOTM54ANIGENC3F3AIR42LJFRYSAKMCPCIUSOZY5QC
NVSFIV2ZKP44XHCSCXG6OZVGL67OIFINC34J2EMKTA4KULCERUEAC
}
bool napalm_player(int amount)
{
if (player_res_sticky_flame() || amount <= 0)
return (false);
const int old_value = you.duration[DUR_LIQUID_FLAMES];
you.duration[DUR_LIQUID_FLAMES] += amount;
if (you.duration[DUR_LIQUID_FLAMES] > 40)
you.duration[DUR_LIQUID_FLAMES] = 40;
if (you.duration[DUR_LIQUID_FLAMES] > old_value)
mpr("You are covered in liquid flames!", MSGCH_WARN);
return (true);
expose_player_to_element(BEAM_NAPALM, 12);
const int res_fire = player_res_fire();
if (res_fire > 0)
{
ouch((((random2avg(9, 2) + 1) * you.time_taken) /
(1 + (res_fire * res_fire))) / 10, NON_MONSTER,
KILLED_BY_BURNING);
}
if (res_fire <= 0)
{
ouch(((random2avg(9, 2) + 1) * you.time_taken) / 10, 0,
KILLED_BY_BURNING);
}
if (res_fire < 0)
{
ouch(((random2avg(9, 2) + 1) * you.time_taken) / 10, 0,
KILLED_BY_BURNING);
}
if (you.duration[DUR_CONDENSATION_SHIELD] > 0)
remove_condensation_shield();
}
else if (you.duration[DUR_LIQUID_FLAMES] == 1)
you.duration[DUR_LIQUID_FLAMES] = 0;
}
}
}
void melee_attack::mons_do_napalm()
{
if (defender->res_sticky_flame() > 0)
return;
if (one_chance_in(20) || (damage_done > 2 && one_chance_in(3)))
{
if (needs_message)
{
mprf("%s %s covered in liquid flames%s",
def_name(DESC_CAP_THE).c_str(),
defender->conj_verb("are").c_str(),
special_attack_punctuation().c_str());
}
if (defender->atype() == ACT_PLAYER)
napalm_player(random2avg(7, 3) + 1);
else
{
napalm_monster(def, mons_friendly(atk) ? KC_FRIENDLY : KC_OTHER,
std::min(4, 1 + random2(atk->hit_dice) / 2));
}
if (defender->res_sticky_flame() > 0)
break;
if (one_chance_in(20) || (damage_done > 2 && one_chance_in(3)))
{
if (needs_message)
{
mprf("%s %s covered in liquid flames%s",
def_name(DESC_CAP_THE).c_str(),
defender->conj_verb("are").c_str(),
special_attack_punctuation().c_str());
}
if (defender->atype() == ACT_PLAYER)
sticky_flame_player();
else
{
sticky_flame_monster(monster_index(def),
mons_friendly(atk) ? KC_FRIENDLY : KC_OTHER,
std::min(4, 1 + random2(atk->hit_dice) / 2));
}
}
mons_do_napalm();
if (mons_res_sticky_flame(monster))
return;
const mon_enchant old_flame = monster->get_ench(ENCH_STICKY_FLAME);
monster->add_ench(mon_enchant(ENCH_STICKY_FLAME, levels, who));
const mon_enchant new_flame = monster->get_ench(ENCH_STICKY_FLAME);
// Paradox: It both lasts longer & does more damage overall if you're
// moving slower.
// Rationalisation: I guess it gets rubbed off/falls off/etc if you
// move around more.
if (you.duration[DUR_LIQUID_FLAMES] > 0)
you.duration[DUR_LIQUID_FLAMES]--;
if (you.duration[DUR_LIQUID_FLAMES] != 0)
{
const int res_fire = player_res_fire();
mpr("You are covered in liquid flames!", MSGCH_WARN);
expose_player_to_element(BEAM_NAPALM, 12);
if (res_fire > 0)
{
ouch((((random2avg(9, 2) + 1) * you.time_taken) /
(1 + (res_fire * res_fire))) / 10, NON_MONSTER,
KILLED_BY_BURNING);
}
if (res_fire <= 0)
{
ouch(((random2avg(9, 2) + 1) * you.time_taken) / 10, 0,
KILLED_BY_BURNING);
}
// Sticky flame paradox: It both lasts longer and does more damage
// overall if you're moving more slowly.
//
// Rationalisation: I guess it gets rubbed off/falls off/etc. if you
// move around more.
dec_napalm_player();
if (res_fire < 0)
{
ouch(((random2avg(9, 2) + 1) * you.time_taken) / 10, 0,
KILLED_BY_BURNING);
}
if (you.duration[DUR_CONDENSATION_SHIELD] > 0)
remove_condensation_shield();
}