I chose ranges more or less arbitrarily; better suggestions welcome.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@8301 c06c8d41-db1a-0410-9941-cceddc491573
LFPHI3TJK5V4HPJJHCG5XATY23P25OVIZ4ITQVG354DJHPEPKU4AC
POKOLCFPHHPP2CZE62SHPXKPU7ECALS4P2VKJLFOGBN2U66EWEPQC
UADYVV3UD5ERJTZZJGY4EUQ4NJ2JSBG7YYUJ75ZRBIXRQXQKOJPAC
CDFS7Z74W5HKPQIHQICOG442KQFXUSBGGLDDQLE3MG74T44YU6AQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
5LIWCQ5G74WIMISKX3SBMZFPVVYEDNUIREAK55XYR5RTNSHVGDYQC
WXSNNK2RXP3DQFAEQGQUZJHFWXJC7ZKG2WURZGL566UDM4YXFSWQC
SUWIERONPDATHPDMZRYO6GYIXSW6XIS5V5MK5IV23DWQH2LL7VIAC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
KBNY5FWKTEAKABFCLPC3QFKFSVZKAGXINPCIFV6WDSWFO4VCKNTAC
DAVTHXRQBYQKWHKUKJVJ5EJXIFGVWMEHINLM3JE4FMV6AAYIBOVAC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
OYANFNGKCXG2NLQMYW4TNFU3LFK3533XQ3HFGI3LNMY4JGMDMK5QC
BNRY5YIXLFE2TDNU2JQHWWXJQVWNSEWQ52DU7XUWIT5DZWKGBDDAC
5P6MEKBISK6NI4MULM75HHFBQW5MXITSZJDGLLIDKJ7G24F7XYNAC
}
int _calc_breath_ability_range(ability_type ability)
{
// Following monster draconian abilities.
switch (ability)
{
case ABIL_BREATHE_FIRE: return 6;
case ABIL_BREATHE_FROST: return 6;
case ABIL_BREATHE_POISON: return 7;
case ABIL_BREATHE_LIGHTNING: return 8;
case ABIL_SPIT_ACID: return 8;
case ABIL_BREATHE_POWER: return 8;
case ABIL_BREATHE_STICKY_FLAME: return 5;
case ABIL_BREATHE_STEAM: return 7;
default:
ASSERT("Bad breath type!");
break;
}
return (-2);
if (!spell_direction(spd, beam, DIR_NONE, TARG_ENEMY))
return (false);
{
// Note: power level of ball calculated at release -- bwr
const int pow = calc_spell_power(SPELL_DELAYED_FIREBALL, true);
const int fake_range = spell_range(SPELL_FIREBALL, pow, false);
// Note: power level of ball calculated at release -- bwr
fireball(calc_spell_power( SPELL_DELAYED_FIREBALL, true ), beam);
if (!spell_direction(spd, beam, DIR_NONE, TARG_ENEMY, fake_range))
return (false);
beam.range = spell_range(SPELL_FIREBALL, pow, true);
fireball(pow, beam);
}
else if (!spell_direction(abild, beam))
return (false);
else
{
beam.range = _calc_breath_ability_range(abil.ability);
if (!spell_direction(abild, beam, DIR_NONE, TARG_ENEMY, beam.range))
return (false);
}
case 0: zapping( ZAP_FLAME, power, beam ); break;
case 1: zapping( ZAP_PAIN, power, beam ); break;
case 2: zapping( ZAP_STONE_ARROW, power, beam ); break;
case 3: zapping( ZAP_ELECTRICITY, power, beam ); break;
case 4: zapping( ZAP_BREATHE_ACID, power / 2, beam ); break;
case 0: beam.range = 7; zapping(ZAP_FLAME, power, beam); break;
case 1: beam.range = 8; zapping(ZAP_PAIN, power, beam); break;
case 2: beam.range = 5; zapping(ZAP_STONE_ARROW, power, beam); break;
case 3: beam.range = 13; zapping(ZAP_ELECTRICITY, power, beam); break;
case 4: beam.range = 8; zapping(ZAP_BREATHE_ACID, power/2, beam); break;
case 0: zapping( ZAP_FIRE, power, beam ); break;
case 1: zapping( ZAP_FIREBALL, power, beam ); break;
case 2: zapping( ZAP_LIGHTNING, power, beam ); break;
case 3: zapping( ZAP_NEGATIVE_ENERGY, power, beam ); break;
case 4: zapping( ZAP_STICKY_FLAME, power, beam ); break;
case 5: zapping( ZAP_IRON_BOLT, power, beam ); break;
case 6: zapping( ZAP_ORB_OF_ELECTRICITY, power, beam ); break;
zap_type ztype = ZAP_DEBUGGING_RAY;
switch (random2(7))
{
case 0: beam.range = 6; ztype = ZAP_FIRE; break;
case 1: beam.range = 6; ztype = ZAP_FIREBALL; break;
case 2: beam.range = 10; ztype = ZAP_LIGHTNING; break;
case 3: beam.range = 5; ztype = ZAP_STICKY_FLAME; break;
case 4: beam.range = 5; ztype = ZAP_IRON_BOLT; break;
case 5: beam.range = 6; ztype = ZAP_NEGATIVE_ENERGY; break;
case 6: beam.range = 20; ztype = ZAP_ORB_OF_ELECTRICITY; break;
}
zapping(ztype, power, beam);