git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@5702 c06c8d41-db1a-0410-9941-cceddc491573
KATZLWENEIQMKKWIV4ZLXJ5HFUW6SU5K4ZU6NENBOL4XAAVTDUKAC
U2AV5FJ7UR6QMGMSZBW6MMLBZHWTANK46QOBP42PYHMAXJCBMRBQC
DMN63LCKBTJZN3X2XKYFV2XY3AEKDRJJTKBANH3TT6ZDPELAA3MQC
RSRV6GOBFVU7GA4LEOWMUEOXODWRF6AUCAYTUGAKXNPB6I6ABFOQC
IXJLPPT3ORIZEA6563MAPB6OCTR2PC2UMWFYO6UATHH5LU3PC65QC
VQCEREOVOQYOCAHAO4OTEHN5ROGPBJ44WK4WKRFIYIJI2PF56UHQC
ATIPL5YS7PRHIEEBBLNOJMAZWTQLPBWGWOQZO5SHPZB475GEZK7AC
GSJA56E3ORVIBCBA6T6WU2HE4DCLJ6NZPW76O7L54N4CYPKLJOWQC
NQMXQ6OQVUSC7Y7F7IL252QW4A5JED224EECNHWAM4ZZYVNY745AC
EFS55XWWSC2ARLHL7KI3SZYQB45IUT33RW7JFDGCLUP4A4MBHDYQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
QCIPZ52TOIKLA6O22P7USLEAYI4VAZRLGVXMAASSGEP37KN5PEVAC
FLAGBNUNSIQNFDN53CDWABJRTTFWDL4PG34AI474ZKPXDEPYHOAQC
ZGUJWUFJ4NFFJ6PGXLFGQWCWBCZHPWGWI44NJHJEVPRG5L36PADQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
JM7UAK777RAVDAVLQLEOBRTGNW2B47S5G55XITJXO243IUNZHVYQC
JCWJWGMQIKQGSSFJUQRKNIWW3HBOJSHYDTOPPE5BWOJTIJTDYUTAC
2U47I7M3TKXUM3KHMO3UH7KGMRKOGHJQFVYPC4CTAWBV22T2HTEQC
DDU4A3JGN5IUIPP5IASOODKPR2WBHSDSV4FITZ6HNXNSXXQACWAQC
DH3D44HGNRXTSZLL5HTHKOPKCO4VZQZVBEMFOAPRJGQMLGN2BFQAC
B62ICMDTN5V7R7RBL4JALFVKEMVOOVLRSJASRNYS6CGFWBEEF5JQC
H6ZPCZ7HN5UZTOS6QFAE4WUJR6BCDU4OB7ONQ7ELXIK65ASPJOTAC
LS3DAZVRDCXVN2BKBC6RGCKO3R43Z7HKG4GXJWLBK4AKBL2G6QDQC
MIMVAKQXKJMHYLKXKY2TJEBL4HCOHKLDQYX6J5H4MWCI442NWEHAC
AMFTO4UE74UYQBU3R2EYUU6BJ7SC4O4NOAFICRTLMT3MIFRQ6AKAC
GZMPIDNMBXZ4B2ZWKREHBPAVN53J6WRVY5W5KY52KEBHKU6IW4IQC
C7ZG3QMG2CDCRQFCCC5BAY7Q7EQ2I634BXGVOOTMSR7EYBARJ6MAC
226KYCTMLIXUKD734QATY3JKWUUKC5Q3O75JT5EWIX6BKR7ANZSAC
VBQODM6G5B35WWYGNT36EQDJFVTHMZB6CJWAFP3UQVD6NRUSKJAQC
GP7DDCLYNLI6SDXJJ7MH6XHXS5FGFM4SNL2J7J5DGE2EJOETJPHAC
OJXLFQMDM4XF2WSDVMAC3FXG5HJQB3QAQXLZM35RA34YYLTAP2HQC
WZWOQZCXUB7QX7PGQMIUCH5JM5YME25GE2GMMT2NIJP5OIZUZLBQC
BGJ7P65JV2OFVXMGAJDHV5Y36TR7JOFDWJUZJBHUBD7SCQMDRBEAC
FMSYEPHQUC3RGEOEJ77OZ43JTIFITY56SOOKYPU4CKAVB4VP65FAC
PDOFPXD2X6VI23AHKCGQ5RVDBG74CNP2E3YOHKXLOARHHBXEK3HQC
CGYTZT5QWIEGYKUOLOK7MFXSLJKLYRZONER5ZCDZO5XYWSLG475QC
UHOAWBSBZBPHWMNXZCVB4SBJM4DTZAG3YRNNJNIKJN4CE2DP27JQC
27P4FR22LK2JH5476TDTKBWT4RU72W6A3FOEUC35MLNTLRI2LKOAC
DODCHP2S4I6VZKQAVXX6D76OPNFI2YWZ4XH3HZTMAJZXA2RJ3XRQC
YXNQKP2F4I3PCURJS7RD7SVOWMNPPW3LKMVRRBHHGILWSRKGCKDQC
4JNV6RTRY2UR3PZFMCNPRGCBSUAB7QTXYJCSYBIUAFMCCYVGN6PQC
4NBPZKMZBKB3QYX4FFUAKDXQS43NJCBDLMHKDJFVXHQLX4MQDINAC
HPE7PVDIOJDELSCDLCMFYFSDKOEJN35IZPWT57U3AIAPU45QOP6QC
RDZUMV3A5TREQHLPPJWDWVXBNIOWC3CQJJ35TYFBQQVQNTU7SPXQC
GT7BSR54BVJKHUCLEBTELGBMNBFFDQW52EVC4XKVEMUVG2UGZMDAC
YCL3W2PFE6ILTGBFODCSXNPDIA46KVSZP2TI7HDMYAOEJT65RIEAC
CUB27EJDQG66FF2YCKOV4HU3LAJVJIHUJ5QYLURRDIEVGPK666DQC
PFEJ4LMDNEKLMGRCMWQ7EIRVU4JMYGICI4G7X4WVWOROVXQCBZ7QC
QEEJFAETO6B2J4IWDIDCJ5UNIFNNHHG22IWF2CUJRTJJBNE47CWQC
QKGDOYIYKE6B36ION5O2DRW65DWWPZMYNWJVH7LJJ7FPGGM2MYAQC
LFBNFE3PZBXTR2ROPKYPARUWLJAYWAKGTS7VBWADZWVVSJ5CLX6AC
REVECUB3H65Q6RELFWCJJJXN7EK4FB5JJYZP5VJHDDRCV7GXSQUQC
I2B33Z7NZGC33AMDSSK446AZZYWKPHWLAGULVHKKZU4MVB4BNJOAC
U63Y7KF5BVZFSYK2SCNJSVBSUHSRSDNBDNPAAKTL7NWKT47Q4QIAC
ZI3XDQ75HFW54FG6ZK6ERZYV6FEXUGFY35Z6VZMKMQK3IMDG6XBQC
NFJKJYTT6CBLOKLGT6HIVIDEPWXMGXJV5AAL37SBZTG2HSFMJMKQC
HHKRUVC6WMVKQRUQRYB5VAEDXUS6TMAKO7BSTBGVVL2AUOEBFUJAC
(testbits( flags, SPFLAG_TARGET ) ? DIR_TARGET :
testbits( flags, SPFLAG_GRID ) ? DIR_TARGET :
testbits( flags, SPFLAG_DIR ) ? DIR_DIR
: DIR_NONE);
(testbits( flags, SPFLAG_TARGET ) ? DIR_TARGET :
testbits( flags, SPFLAG_GRID ) ? DIR_TARGET :
testbits( flags, SPFLAG_DIR ) ? DIR_DIR
: DIR_NONE);
case SPELL_CREATE_NOISE: // unused, the player can shout to do this - bwr
noisy(25, you.x_pos, you.y_pos, "You hear a voice calling your name!");
break;
case SPELL_REMOVE_CURSE:
remove_curse(false);
case SPELL_ARC:
if (burn_freeze(powc, BEAM_ELECTRICITY) == -1)
return (SPRET_ABORT);
break;
case SPELL_DELAYED_FIREBALL:
crawl_state.cant_cmd_repeat("You can't repeat delayed fireball.");
// This spell has two main advantages over Fireball:
//
// (1) The release is instantaneous, so monsters will not
// get an action before the player... this allows the
// player to hit monsters with a double fireball (this
// is why we only allow one delayed fireball at a time,
// if you want to allow for more, then the release should
// take at least some amount of time).
//
// The casting of this spell still costs a turn. So
// casting Delayed Fireball and immediately releasing
// the fireball is only slightly different than casting
// a regular Fireball (monsters act in the middle instead
// of at the end). This is why we allow for the spell
// level discount so that Fireball is free with this spell
// (so that it only costs 7 levels instead of 13 to have
// both).
//
// (2) When the fireball is released, it is guaranteed to
// go off... the spell only fails at this point. This can
// be a large advantage for characters who have difficulty
// casting Fireball in their standard equipment. However,
// the power level for the actual fireball is determined at
// release, so if you do swap out your enhancers you'll
// get a less powerful ball when its released. -- bwr
//
if (!you.attribute[ ATTR_DELAYED_FIREBALL ])
{
// okay, this message is weak but functional -- bwr
mpr( "You feel magically charged." );
you.attribute[ ATTR_DELAYED_FIREBALL ] = 1;
}
else
canned_msg( MSG_NOTHING_HAPPENS );
case SPELL_RING_OF_FLAMES:
cast_ring_of_flames(powc);
break;
case SPELL_RESTORE_STRENGTH:
restore_stat(STAT_STRENGTH, 0, false);
case SPELL_LEHUDIBS_CRYSTAL_SPEAR:
if (!zapping(ZAP_CRYSTAL_SPEAR, powc, beam, true))
return (SPRET_ABORT);
case SPELL_TELEPORT_OTHER:
// teleport creature (I think)
if (!zapping(ZAP_TELEPORTATION, powc, beam, true))
case SPELL_THUNDERBOLT:
if (!zapping(ZAP_LIGHTNING, powc, beam, true))
case SPELL_DETECT_CURSE:
detect_curse(false);
break;
case SPELL_ABJURATION_I:
case SPELL_ABJURATION_II:
abjuration(powc);
break;
case SPELL_LEVITATION:
potion_effect( POT_LEVITATION, powc );
case SPELL_REPEL_UNDEAD:
turn_undead(50);
case SPELL_BOLT_OF_DRAINING:
if (!zapping(ZAP_NEGATIVE_ENERGY, powc, beam, true))
case SPELL_HELLFIRE:
// Should only be available from
// staff of Dispater & Sceptre of Asmodeus
if (!zapping(ZAP_HELLFIRE, powc, beam, true))
case SPELL_BOLT_OF_INACCURACY:
if (!zapping(ZAP_BEAM_OF_ENERGY, powc, beam, true))
return (SPRET_ABORT);
case SPELL_EVAPORATE:
if (!cast_evaporate(powc, beam, potion))
return SPRET_ABORT;
case SPELL_POISON_ARROW:
if (!zapping(ZAP_POISON_ARROW, powc, beam, true))
return (SPRET_ABORT);
case SPELL_FREEZING_CLOUD:
cast_big_c(powc, CLOUD_COLD, KC_YOU, beam);
case SPELL_MAGIC_MAPPING:
if (you.level_type == LEVEL_PANDEMONIUM)
case SPELL_DELAYED_FIREBALL:
crawl_state.cant_cmd_repeat("You can't repeat delayed fireball.");
// This spell has two main advantages over Fireball:
//
// (1) The release is instantaneous, so monsters will not
// get an action before the player... this allows the
// player to hit monsters with a double fireball (this
// is why we only allow one delayed fireball at a time,
// if you want to allow for more, then the release should
// take at least some amount of time).
//
// The casting of this spell still costs a turn. So
// casting Delayed Fireball and immediately releasing
// the fireball is only slightly different than casting
// a regular Fireball (monsters act in the middle instead
// of at the end). This is why we allow for the spell
// level discount so that Fireball is free with this spell
// (so that it only costs 7 levels instead of 13 to have
// both).
//
// (2) When the fireball is released, it is guaranteed to
// go off... the spell only fails at this point. This can
// be a large advantage for characters who have difficulty
// casting Fireball in their standard equipment. However,
// the power level for the actual fireball is determined at
// release, so if you do swap out your enhancers you'll
// get a less powerful ball when its released. -- bwr
//
if (!you.attribute[ ATTR_DELAYED_FIREBALL ])
{
powc = stepdown_value( powc, 10, 10, 40, 45 );
magic_mapping( 5 + powc, 50 + random2avg( powc * 2, 2 ), false );
}
canned_msg( MSG_NOTHING_HAPPENS );
case SPELL_PAIN:
if (!zapping(ZAP_PAIN, powc, beam, true))
return (SPRET_ABORT);
dec_hp(1, false);
case SPELL_TWIST:
cast_twist(powc);
break;
case SPELL_AIRSTRIKE:
airstrike(powc, spd);
case SPELL_FREEZE:
if (burn_freeze(powc, BEAM_COLD) == -1)
return (SPRET_ABORT);
case SPELL_SYMBOL_OF_TORMENT:
torment(TORMENT_SPELL, you.x_pos, you.y_pos);
// Spells that create new monsters. If a god is making you cast one
// of these spells, any monsters produced will count as god gifts.
case SPELL_ROTTING:
cast_rotting(powc);
break;
// Summoning spells, and other spells that create new monsters.
// If a god is making you cast one of these spells, any monsters produced
// will count as god gifts.
case SPELL_FLAME_OF_CLEANSING:
if (!zapping(ZAP_CLEANSING_FLAME, powc, beam, true))
case SPELL_TAME_BEASTS:
cast_tame_beasts(powc);
break;
case SPELL_SLEEP:
{
const int sleep_power =
stepdown_value( powc * 9 / 10, 5, 35, 45, 50 );
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Sleep power stepdown: %d -> %d",
powc, sleep_power);
#endif
if (!zapping(ZAP_SLEEP, sleep_power, beam, true))
case SPELL_BONE_SHARDS:
if (!cast_bone_shards(powc, beam))
case SPELL_POLYMORPH_OTHER:
// Trying is already enough, even if it fails.
did_god_conduct(DID_DELIBERATE_MUTATING, 10);
if (!zapping(ZAP_POLYMORPH_OTHER, powc, beam, true))
return (SPRET_ABORT);
break;
case SPELL_TELEPORT_OTHER:
if (!zapping(ZAP_TELEPORTATION, powc, beam, true))
case SPELL_INTOXICATE:
cast_intoxicate(powc);
break;
case SPELL_MASS_CONFUSION:
mass_enchantment(ENCH_CONFUSION, powc, MHITYOU);
break;
case SPELL_MASS_SLEEP:
cast_mass_sleep(powc);
break;
case SPELL_CONTROL_UNDEAD:
mass_enchantment(ENCH_CHARM, powc, MHITYOU);
break;
case SPELL_ABJURATION_I:
case SPELL_ABJURATION_II:
abjuration(powc);
break;
case SPELL_CIGOTUVIS_DEGENERATION:
if (!zapping(ZAP_DEGENERATION, powc, beam, true))
case SPELL_OLGREBS_TOXIC_RADIANCE:
cast_toxic_radiance();
break;
// beneficial enchantments
case SPELL_HASTE:
if (!zapping(ZAP_HASTING, powc, beam, true))
case SPELL_HELLFIRE:
// Should only be available from:
// staff of Dispater & Sceptre of Asmodeus
if (!zapping(ZAP_HELLFIRE, powc, beam, true))
case SPELL_GREATER_HEALING:
if (!cast_healing(25))
case SPELL_RESIST_POISON:
cast_resist_poison(powc);
break;
case SPELL_SEE_INVISIBLE:
cast_see_invisible(powc);
break;
case SPELL_CONTROL_TELEPORT:
cast_teleport_control(powc);
break;
// Healing.
case SPELL_CURE_POISON_I: // Ely version
case SPELL_CURE_POISON_II: // Poison magic version
// both use same function
cast_cure_poison(powc);
break;
case SPELL_PURIFICATION:
purification();
break;
case SPELL_RESTORE_STRENGTH:
restore_stat(STAT_STRENGTH, 0, false);
break;
case SPELL_RESTORE_INTELLIGENCE:
restore_stat(STAT_INTELLIGENCE, 0, false);
break;
case SPELL_RESTORE_DEXTERITY:
restore_stat(STAT_DEXTERITY, 0, false);
break;
// Weapon brands.
case SPELL_SURE_BLADE:
cast_sure_blade(powc);
break;
case SPELL_STONE_ARROW:
if (!zapping(ZAP_STONE_ARROW, powc, beam, true))
return (SPRET_ABORT);
case SPELL_EXCRUCIATING_WOUNDS:
if (!brand_weapon(SPWPN_PAIN, powc))
canned_msg(MSG_SPELL_FIZZLES);
case SPELL_FLY:
cast_fly(powc);
break;
case SPELL_INSULATION:
cast_insulation(powc);
break;
case SPELL_ORB_OF_ELECTROCUTION:
if (!zapping(ZAP_ORB_OF_ELECTRICITY, powc, beam, true))
return (SPRET_ABORT);
case SPELL_SPIDER_FORM:
transform(powc, TRAN_SPIDER);
if (!num_creatures)
mpr("You detect nothing.");
else if (num_creatures == known_plants)
mpr("You detect no further creatures.");
else
mpr("You detect creatures!");
break;
}
case SPELL_CURE_POISON_II: // poison magic version of cure poison
cast_cure_poison(powc);
case SPELL_STATUE_FORM:
transform(powc, TRAN_STATUE);
case SPELL_DEBUGGING_RAY:
if (!zapping(ZAP_DEBUGGING_RAY, powc, beam, true))
return (SPRET_ABORT);
// General enhancement.
case SPELL_BERSERKER_RAGE:
cast_berserk();
case SPELL_RECALL:
recall(0);
break;
case SPELL_PORTAL:
crawl_state.cant_cmd_repeat("You can't repeat create portal.");
if (portal() == -1)
return (SPRET_ABORT);
case SPELL_REGENERATION:
cast_regen(powc);
case SPELL_DISINTEGRATE:
if (!zapping(ZAP_DISINTEGRATION, powc, beam, true))
return (SPRET_ABORT);
case SPELL_LEVITATION:
potion_effect( POT_LEVITATION, powc );
case SPELL_ORB_OF_FRAGMENTATION:
if (!zapping(ZAP_ORB_OF_FRAGMENTATION, powc, beam, true))
return (SPRET_ABORT);
break;
// other
case SPELL_SELECTIVE_AMNESIA:
crawl_state.cant_cmd_repeat("You can't repeat selective amnesia.");
case SPELL_ICE_STORM:
if (!zapping(ZAP_ICE_STORM, powc, beam, true))
return (SPRET_ABORT);
case SPELL_SUBLIMATION_OF_BLOOD:
cast_sublimation_of_blood(powc);
//jmf: new spells 19mar2000
case SPELL_FLAME_TONGUE:
if (!zapping(ZAP_FLAME_TONGUE, powc, beam, true))
return (SPRET_ABORT);
case SPELL_DEATHS_DOOR:
cast_deaths_door(powc);
case SPELL_SLEEP:
{
const int sleep_power =
stepdown_value( powc * 9 / 10, 5, 35, 45, 50 );
#ifdef DEBUG_DIAGNOSTICS
mprf(MSGCH_DIAGNOSTICS, "Sleep power stepdown: %d -> %d",
powc, sleep_power);
#endif
if (!zapping(ZAP_SLEEP, sleep_power, beam, true))
case SPELL_SEMI_CONTROLLED_BLINK:
//jmf: powc is ignored
if (cast_semi_controlled_blink(powc) == -1)
case SPELL_DISPERSAL:
cast_dispersal(powc);
case SPELL_MAGIC_MAPPING:
if (you.level_type == LEVEL_PANDEMONIUM)
{
mpr("Your Earth magic cannot map Pandemonium.");
}
else
{
powc = stepdown_value( powc, 10, 10, 40, 45 );
magic_mapping( 5 + powc, 50 + random2avg( powc * 2, 2 ), false );
}
case SPELL_STONESKIN:
cast_stoneskin(powc);
break;
case SPELL_CHAIN_LIGHTNING:
cast_chain_lightning(powc);
break;
case SPELL_TWIST:
cast_twist(powc);
case SPELL_CORPSE_ROT:
corpse_rot(0);
noisy(30, you.x_pos, you.y_pos);
mprf((sil ? MSGCH_PLAIN : MSGCH_SOUND),
"The dungeon %s!", (sil ? "shakes" : "rumbles"));
if (silence)
mpr("The dungeon shakes!");
else
{
noisy(30, you.x_pos, you.y_pos);
mpr("The dungeon rumbles!", MSGCH_SOUND);
}
for ( unsigned int i = 0; i < ARRAYSZ(types); ++i )
if ( types[i] == type )
return true;
return false;
for (unsigned int i = 0; i < ARRAYSZ(types); ++i)
if (types[i] == type)
return (true);
return (false);
if (mon == NON_MONSTER) return 0;
if (mons_friendly(&menv[mon])) return 0;
if (one_chance_in(4)) return 0;
if (mons_char(menv[mon].type) != 'S') return 0;
if (check_mons_resist_magic(&menv[mon], pow)) return 0;
if (mon == NON_MONSTER
|| one_chance_in(4)
|| mons_friendly(&menv[mon])
|| mons_char(menv[mon].type) != 'S'
|| check_mons_resist_magic(&menv[mon], pow))
{
return 0;
}
case 8: //jmf: changed to red wasp; was wolf spider
mon = MONS_WOLF_SPIDER; //jmf: spiders aren't insects
break; // think: "Kingdom of the Spiders" {dlb}
// not just insects!!! - changed back {dlb}
case 8:
mon = MONS_WOLF_SPIDER; // think: "Kingdom of the Spiders" {dlb}
break;