diff options
-rw-r--r-- | crawl-ref/source/abl-show.cc | 11 | ||||
-rw-r--r-- | crawl-ref/source/direct.cc | 102 | ||||
-rw-r--r-- | crawl-ref/source/direct.h | 3 | ||||
-rw-r--r-- | crawl-ref/source/item_use.cc | 1 | ||||
-rw-r--r-- | crawl-ref/source/spells1.cc | 75 | ||||
-rw-r--r-- | crawl-ref/source/spells1.h | 8 | ||||
-rw-r--r-- | crawl-ref/source/spells3.cc | 13 | ||||
-rw-r--r-- | crawl-ref/source/spells3.h | 4 | ||||
-rw-r--r-- | crawl-ref/source/spl-book.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/spl-cast.cc | 262 | ||||
-rw-r--r-- | crawl-ref/source/spl-data.h | 558 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.cc | 10 | ||||
-rw-r--r-- | crawl-ref/source/spl-util.h | 5 | ||||
-rw-r--r-- | crawl-ref/source/tutorial.cc | 5 |
14 files changed, 589 insertions, 470 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc index 4e4dd2ad03..ba15074f49 100644 --- a/crawl-ref/source/abl-show.cc +++ b/crawl-ref/source/abl-show.cc @@ -561,12 +561,17 @@ bool activate_ability(void) } case ABIL_DELAYED_FIREBALL: + { + if (spell_direction(spd, beam, DIR_NONE, TARG_ENEMY) == -1) + return (false); + // Note: power level of ball calculated at release -- bwr - fireball( calc_spell_power( SPELL_DELAYED_FIREBALL, true ) ); + fireball( calc_spell_power( SPELL_DELAYED_FIREBALL, true ), beam ); // only one allowed since this is instantaneous -- bwr you.attribute[ ATTR_DELAYED_FIREBALL ] = 0; break; + } case ABIL_GLAMOUR: if (you.duration[DUR_GLAMOUR]) @@ -784,7 +789,7 @@ bool activate_ability(void) case ABIL_HELLFIRE: if (your_spells(SPELL_HELLFIRE, - 20 + you.experience_level, false) == -1) + 20 + you.experience_level, false) == SPRET_ABORT) return (false); break; @@ -1252,7 +1257,7 @@ bool activate_ability(void) } if (your_spells( SPELL_HELLFIRE, - 20 + you.experience_level, false ) == -1) + 20 + you.experience_level, false ) == SPRET_ABORT) return (false); you.duration[DUR_BREATH_WEAPON] += diff --git a/crawl-ref/source/direct.cc b/crawl-ref/source/direct.cc index a1ead653ea..5c2ef946be 100644 --- a/crawl-ref/source/direct.cc +++ b/crawl-ref/source/direct.cc @@ -92,25 +92,19 @@ static char find_square( unsigned char xps, unsigned char yps, static int targeting_cmd_to_compass( command_type command ); static void describe_oos_square(int x, int y); +static void extend_move_to_edge(dist &moves); static bool is_mapped(int x, int y) { return (is_player_mapped(x, y)); } -static command_type read_direction_key( - bool just_looking = false, - bool target_unshifted = false, - coord_def where = coord_def()) +static command_type read_direction_key(bool just_looking = false) { - const bool unshifted_dir = target_unshifted && where == you.pos(); - flush_input_buffer( FLUSH_BEFORE_COMMAND ); int key = unmangle_direction_keys(getchm(KC_TARGETING),KC_TARGETING); - if (unshifted_dir && strchr("hjklyubn", key)) - key = toupper(key); - + switch ( key ) { case ESCAPE: return CMD_TARGET_CANCEL; @@ -241,6 +235,35 @@ static int targeting_cmd_to_feature( command_type command ) } } +static command_type shift_direction(command_type cmd) +{ + switch (cmd) + { + case CMD_TARGET_DOWN_LEFT: return CMD_TARGET_DIR_DOWN_LEFT; + case CMD_TARGET_LEFT: return CMD_TARGET_DIR_LEFT; + case CMD_TARGET_DOWN: return CMD_TARGET_DIR_DOWN; + case CMD_TARGET_UP: return CMD_TARGET_DIR_UP; + case CMD_TARGET_RIGHT: return CMD_TARGET_DIR_RIGHT; + case CMD_TARGET_DOWN_RIGHT: return CMD_TARGET_DIR_DOWN_RIGHT; + case CMD_TARGET_UP_RIGHT: return CMD_TARGET_DIR_UP_RIGHT; + case CMD_TARGET_UP_LEFT: return CMD_TARGET_DIR_UP_LEFT; + default: return (cmd); + } +} + +static const char *target_mode_help_text(int mode) +{ + switch (mode) + { + case DIR_NONE: + return "? - help, Shift-Dir - shoot in a straight line"; + case DIR_TARGET: + return "? - help, Dir - move target cursor"; + default: + return "? - help"; + } +} + //--------------------------------------------------------------- // // direction @@ -262,7 +285,7 @@ static int targeting_cmd_to_feature( command_type command ) // //--------------------------------------------------------------- void direction(struct dist& moves, targeting_type restricts, - int mode, bool just_looking) + int mode, bool just_looking, const char *prompt) { // NOTE: Even if just_looking is set, moves is still interesting, // because we can travel there! @@ -310,8 +333,8 @@ void direction(struct dist& moves, targeting_type restricts, // Prompts might get scrolled off if you have too few lines available. // We'll live with that. if ( !just_looking ) - mpr("Aim (press '?' for help, Shift-Dir to shoot in a straight line.)", - MSGCH_PROMPT); + mprf(MSGCH_PROMPT, "%s (%s)", prompt? prompt : "Aim", + target_mode_help_text(restricts)); while (1) { @@ -336,10 +359,14 @@ void direction(struct dist& moves, targeting_type restricts, key_command = CMD_TARGET_CYCLE_FORWARD; // find closest enemy } else - key_command = read_direction_key(just_looking, - target_unshifted, - coord_def(moves.tx, moves.ty)); + key_command = read_direction_key(just_looking); + if (target_unshifted && moves.tx == you.x_pos && moves.ty == you.y_pos + && restricts != DIR_TARGET) + { + key_command = shift_direction(key_command); + } + if (target_unshifted && (key_command == CMD_TARGET_CYCLE_FORWARD || key_command == CMD_TARGET_CYCLE_BACK @@ -400,8 +427,16 @@ void direction(struct dist& moves, targeting_type restricts, { // Direction not allowed, so just move in that direction. // Maybe make this a bigger jump? - moves.tx += Compass[i].x; - moves.ty += Compass[i].y; + if (restricts == DIR_TARGET) + { + moves.tx += Compass[i].x * 3; + moves.ty += Compass[i].y * 3; + } + else + { + moves.tx += Compass[i].x; + moves.ty += Compass[i].y; + } } break; @@ -679,6 +714,39 @@ void direction(struct dist& moves, targeting_type restricts, skip_iter = false; // only skip one iteration at most } moves.isMe = (moves.tx == you.x_pos && moves.ty == you.y_pos); + + // We need this for directional explosions, otherwise they'll explode one + // square away from the player. + extend_move_to_edge(moves); +} + +static void extend_move_to_edge(dist &moves) +{ + if (!moves.dx && !moves.dy) + return; + + // now the tricky bit - extend the target x,y out to map edge. + int mx = 0, my = 0; + + if (moves.dx > 0) + mx = (GXM - 1) - you.x_pos; + if (moves.dx < 0) + mx = you.x_pos; + + if (moves.dy > 0) + my = (GYM - 1) - you.y_pos; + if (moves.dy < 0) + my = you.y_pos; + + if (!(mx == 0 || my == 0)) + { + if (mx < my) + my = mx; + else + mx = my; + } + moves.tx = you.x_pos + moves.dx * mx; + moves.ty = you.y_pos + moves.dy * my; } // Attempts to describe a square that's not in line-of-sight. If diff --git a/crawl-ref/source/direct.h b/crawl-ref/source/direct.h index 015654bcac..8522b5d10b 100644 --- a/crawl-ref/source/direct.h +++ b/crawl-ref/source/direct.h @@ -24,7 +24,8 @@ * *********************************************************************** */ void direction( struct dist &moves, targeting_type restricts = DIR_NONE, - int mode = TARG_ANY, bool just_looking = false ); + int mode = TARG_ANY, bool just_looking = false, + const char *prompt = NULL ); bool in_los_bounds(int x, int y); bool in_viewport_bounds(int x, int y); diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc index 9f9bfab85c..2cb6d9f5a0 100644 --- a/crawl-ref/source/item_use.cc +++ b/crawl-ref/source/item_use.cc @@ -2533,7 +2533,6 @@ void zap_wand(void) if (you.inv[item_slot].base_type != OBJ_WANDS) { canned_msg(MSG_NOTHING_HAPPENS); - you.turn_is_over = true; return; } diff --git a/crawl-ref/source/spells1.cc b/crawl-ref/source/spells1.cc index 9ebca41787..127f932915 100644 --- a/crawl-ref/source/spells1.cc +++ b/crawl-ref/source/spells1.cc @@ -172,49 +172,14 @@ void random_blink(bool allow_partial_control) return; } // end random_blink() -int fireball(int power) +int fireball(int power, bolt &beam) { - struct dist fire_ball; - - message_current_target(); - direction( fire_ball, DIR_NONE, TARG_ENEMY ); - - if (!fire_ball.isValid) - { - canned_msg(MSG_OK); - return (-1); - } - else - { - struct bolt beam; - - beam.source_x = you.x_pos; - beam.source_y = you.y_pos; - beam.set_target(fire_ball); - - zapping(ZAP_FIREBALL, power, beam); - } - + zapping(ZAP_FIREBALL, power, beam); return (1); } // end fireball() -int cast_fire_storm(int powc) +int cast_fire_storm(int powc, bolt &beam) { - struct bolt beam; - struct dist targ; - - mpr("Where?"); - - direction( targ, DIR_TARGET, TARG_ENEMY ); - - beam.set_target(targ); - - if (!targ.isValid) - { - canned_msg(MSG_OK); - return (-1); - } - beam.ex_size = 2 + (random2(powc) > 75); beam.flavour = BEAM_LAVA; beam.type = SYM_ZAP; @@ -483,25 +448,8 @@ int conjure_flame(int pow) return (1); } // end cast_conjure_flame() -int stinking_cloud( int pow ) +int stinking_cloud( int pow, bolt &beem ) { - struct dist spelld; - struct bolt beem; - - message_current_target(); - direction( spelld, DIR_NONE, TARG_ENEMY ); - - if (!spelld.isValid) - { - canned_msg(MSG_OK); - return (-1); - } - - beem.set_target(spelld); - - beem.source_x = you.x_pos; - beem.source_y = you.y_pos; - beem.name = "ball of vapour"; beem.colour = GREEN; beem.range = 6; @@ -522,20 +470,9 @@ int stinking_cloud( int pow ) return (1); } // end stinking_cloud() -int cast_big_c(int pow, char cty) +int cast_big_c(int pow, char cty, bolt &beam) { - struct dist cdis; - - mpr("Where do you want to put it?", MSGCH_PROMPT); - direction( cdis, DIR_TARGET, TARG_ENEMY ); - - if (!cdis.isValid) - { - canned_msg(MSG_OK); - return (-1); - } - - big_cloud( cty, cdis.tx, cdis.ty, pow, 8 + random2(3) ); + big_cloud( cty, beam.target_x, beam.target_y, pow, 8 + random2(3) ); return (1); } // end cast_big_c() diff --git a/crawl-ref/source/spells1.h b/crawl-ref/source/spells1.h index 64481d53bb..1f684139c4 100644 --- a/crawl-ref/source/spells1.h +++ b/crawl-ref/source/spells1.h @@ -69,19 +69,19 @@ int blink(void); /* *********************************************************************** * called from: spell * *********************************************************************** */ -int cast_big_c(int pow, char cty); +int cast_big_c(int pow, char cty, bolt &beam); void cast_confusing_touch(int power); void cast_cure_poison(int mabil); int allowed_deaths_door_hp(void); void cast_deaths_door(int pow); -int cast_fire_storm(int powc); +int cast_fire_storm(int powc, bolt &beam); bool cast_revivification(int power); void cast_berserk(void); void cast_ring_of_flames(int power); int conjure_flame(int pow); void extension(int pow); -int fireball(int power); -int stinking_cloud(int pow); +int fireball(int power, bolt &beam); +int stinking_cloud(int pow, bolt &beam); void abjuration(int pow); // last updated 24may2000 {dlb} diff --git a/crawl-ref/source/spells3.cc b/crawl-ref/source/spells3.cc index 77aa6e33c5..7427ea6955 100644 --- a/crawl-ref/source/spells3.cc +++ b/crawl-ref/source/spells3.cc @@ -230,23 +230,12 @@ int cast_smiting(int power) return (success); } // end cast_smiting() -int airstrike(int power) +int airstrike(int power, dist &beam) { bool success = false; - struct dist beam; struct monsters *monster = 0; // NULL {dlb} int hurted = 0; - mpr("Strike whom?", MSGCH_PROMPT); - - direction( beam, DIR_TARGET, TARG_ENEMY ); - - if (!beam.isValid) - { - canned_msg(MSG_OK); - return (-1); - } - if (mgrd[beam.tx][beam.ty] == NON_MONSTER || beam.isMe) { diff --git a/crawl-ref/source/spells3.h b/crawl-ref/source/spells3.h index 9eea54e646..8d8a77e1b0 100644 --- a/crawl-ref/source/spells3.h +++ b/crawl-ref/source/spells3.h @@ -13,6 +13,8 @@ #define SPELLS3_H +struct dist; + // updated 24may2000 {dlb} /* *********************************************************************** * called from: spells1 - spells3 @@ -24,7 +26,7 @@ bool allow_control_teleport( bool silent = false ); /* *********************************************************************** * called from: spell * *********************************************************************** */ -int airstrike(int power); +int airstrike(int power, dist &beam); // updated 24may2000 {dlb} diff --git a/crawl-ref/source/spl-book.cc b/crawl-ref/source/spl-book.cc index 7c78879df0..2f850333c0 100644 --- a/crawl-ref/source/spl-book.cc +++ b/crawl-ref/source/spl-book.cc @@ -1534,7 +1534,7 @@ int staff_spell( int staff ) return (-1); } - if (your_spells(specspell, powc, false) == -1) + if (your_spells(specspell, powc, false) == SPRET_ABORT) return (-1); you.inv[staff].plus -= mana; diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index 4a8dd73ee1..76178e0a5f 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -617,11 +617,11 @@ bool cast_a_spell(void) random_uselessness( 2 + random2(7), 0 ); else { - int cast_result = your_spells( spell ); - if (cast_result == -1) + const int cast_result = your_spells( spell ); + if (cast_result == SPRET_ABORT) return (false); - exercise_spell( spell, true, cast_result ); + exercise_spell( spell, true, cast_result == SPRET_SUCCESS ); did_god_conduct( DID_SPELL_CASTING, 1 + random2(5) ); } @@ -771,9 +771,36 @@ void spellcasting_side_effects(int spc2, bool idonly = false) alert_nearby_monsters(); } -// returns 1 if spell is successfully cast for purposes of exercising and 0 -// otherwise (note: false == less exercise, not none). If the player aborts the -// spell, returns -1. +static bool spell_is_uncastable(int spell) +{ + if (you.is_undead && spell_typematch( spell, SPTYP_HOLY )) + { + mpr( "You can't use this type of magic!" ); + return (true); + } + + // Normally undead can't memorize these spells, so this check is + // to catch those in Lich form. As such, we allow the Lich form + // to be extended here. -- bwr + if (spell != SPELL_NECROMUTATION + && undead_cannot_memorise( spell, you.is_undead )) + { + mpr( "You cannot cast that spell in your current form!" ); + return (true); + } + + if (spell == SPELL_SYMBOL_OF_TORMENT && player_res_torment()) + { + mpr("To torment others, one must first know what torment means. "); + return (true); + } + + return (false); +} + +// returns SPRET_SUCCESS if spell is successfully cast for purposes of +// exercising, SPRET_FAIL otherwise, or SPRET_ABORT if the player canceled +// the casting. int your_spells( int spc2, int powc, bool allow_fail ) { int dem_hor = 0; @@ -784,6 +811,44 @@ int your_spells( int spc2, int powc, bool allow_fail ) // [dshaligram] Any action that depends on the spellcasting attempt to have // succeeded must be performed after the switch() + if (spell_is_uncastable(spc2)) + return (SPRET_ABORT); + + const int flags = get_spell_flags(spc2); + + // XXX: This handles only some of the cases where spells need targeting... + // there are others that do their own that will be missed by this + // (and thus will not properly ESC without cost because of it). + // Hopefully, those will eventually be fixed. -- bwr + if (flags & SPFLAG_TARGETING_MASK) + { + int targ = (testbits(flags, SPFLAG_HELPFUL) ? TARG_FRIEND : TARG_ENEMY); + + targeting_type dir = + (testbits( flags, SPFLAG_TARGET ) ? DIR_TARGET : + testbits( flags, SPFLAG_GRID ) ? DIR_TARGET : + testbits( flags, SPFLAG_DIR ) ? DIR_DIR : DIR_NONE); + + if (spell_direction( spd, beam, dir, targ, + get_spell_target_prompt(spc2) ) == -1) + return (SPRET_ABORT); + + if (testbits( flags, SPFLAG_NOT_SELF ) && spd.isMe) + { + if (spc2 == SPELL_TELEPORT_OTHER || spc2 == SPELL_HEAL_OTHER + || spc2 == SPELL_POLYMORPH_OTHER) + { + mpr( "Sorry, this spell works on others only." ); + } + else + { + canned_msg(MSG_UNTHINKING_ACT); + } + + return (SPRET_ABORT); + } + } + // Added this so that the passed in powc can have meaning -- bwr if (powc == 0) powc = calc_spell_power( spc2, true ); @@ -850,34 +915,15 @@ int your_spells( int spc2, int powc, bool allow_fail ) if (you.religion == GOD_XOM && random2(75) < spell_mana(spc2)) Xom_acts(coinflip(), spell_mana(spc2), false); - return (0); + return (SPRET_FAIL); } } - if (you.is_undead && spell_typematch( spc2, SPTYP_HOLY )) - { - mpr( "You can't use this type of magic!" ); - return (-1); - } - - // Normally undead can't memorize these spells, so this check is - // to catch those in Lich form. As such, we allow the Lich form - // to be extended here. -- bwr - if (spc2 != SPELL_NECROMUTATION - && undead_cannot_memorise( spc2, you.is_undead )) - { - mpr( "You cannot cast that spell in your current form!" ); - return (-1); - } - #if DEBUG_DIAGNOSTICS snprintf( info, INFO_SIZE, "Spell #%d, power=%d", spc2, powc ); mpr( info, MSGCH_DIAGNOSTICS ); #endif -#define SPELL_DIR(s, b) if (spell_direction(spd, beam) == -1) return -1; \ - else - switch (spc2) { case SPELL_IDENTIFY: @@ -905,14 +951,11 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_MAGIC_DART: - SPELL_DIR(spd, beam); - zapping(ZAP_MAGIC_DARTS, powc, beam); break; case SPELL_FIREBALL: - if (fireball(powc) == -1) - return (-1); + fireball(powc, beam); break; case SPELL_DELAYED_FIREBALL: @@ -955,73 +998,51 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_STRIKING: - SPELL_DIR(spd, beam); zapping( ZAP_STRIKING, powc, beam ); break; case SPELL_CONJURE_FLAME: if (conjure_flame(powc) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_DIG: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (false); - } zapping(ZAP_DIGGING, powc, beam); break; case SPELL_BOLT_OF_FIRE: - SPELL_DIR(spd, beam); zapping(ZAP_FIRE, powc, beam); break; case SPELL_BOLT_OF_COLD: - SPELL_DIR(spd, beam); zapping(ZAP_COLD, powc, beam); break; case SPELL_LIGHTNING_BOLT: - SPELL_DIR(spd, beam); zapping(ZAP_LIGHTNING, powc, beam); break; case SPELL_BOLT_OF_MAGMA: - SPELL_DIR(spd, beam); zapping(ZAP_MAGMA, powc, beam); break; case SPELL_POLYMORPH_OTHER: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - mpr("Sorry, it doesn't work like that."); - return (-1); - } zapping(ZAP_POLYMORPH_OTHER, powc, beam); break; case SPELL_SLOW: - SPELL_DIR(spd, beam); zapping(ZAP_SLOWING, powc, beam); break; case SPELL_HASTE: - if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1) - return (-1); zapping(ZAP_HASTING, powc, beam); break; case SPELL_PARALYZE: - SPELL_DIR(spd, beam); zapping(ZAP_PARALYSIS, powc, beam); break; case SPELL_CONFUSE: - SPELL_DIR(spd, beam); zapping(ZAP_CONFUSION, powc, beam); break; @@ -1034,34 +1055,28 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_INVISIBILITY: - if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1) - return (-1); zapping(ZAP_INVISIBILITY, powc, beam); break; case SPELL_THROW_FLAME: - SPELL_DIR(spd, beam); zapping(ZAP_FLAME, powc, beam); break; case SPELL_THROW_FROST: - SPELL_DIR(spd, beam); zapping(ZAP_FROST, powc, beam); break; case SPELL_CONTROLLED_BLINK: if (blink() == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_FREEZING_CLOUD: - if (cast_big_c(powc, CLOUD_COLD) == -1) - return (-1); + cast_big_c(powc, CLOUD_COLD, beam); break; case SPELL_MEPHITIC_CLOUD: - if (stinking_cloud(powc) == -1) - return (-1); + stinking_cloud(powc, beam); break; case SPELL_RING_OF_FLAMES: @@ -1081,7 +1096,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_VENOM_BOLT: - SPELL_DIR(spd, beam); zapping(ZAP_VENOM_BOLT, powc, beam); break; @@ -1090,25 +1104,18 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_TELEPORT_OTHER: - SPELL_DIR(spd, beam); - - if (spd.isMe) - { - mpr("Sorry, it doesn't work like that."); - return (-1); - } // teleport creature (I think) zapping(ZAP_TELEPORTATION, powc, beam); break; case SPELL_LESSER_HEALING: if (!cast_healing(5)) - return (-1); + return (SPRET_ABORT); break; case SPELL_GREATER_HEALING: if (!cast_healing(25)) - return (-1); + return (SPRET_ABORT); break; case SPELL_CURE_POISON_I: //jmf: `healing' version? group w/ S_C_P_II? @@ -1125,7 +1132,7 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_SELECTIVE_AMNESIA: if (!cast_selective_amnesia(false)) - return (-1); + return (SPRET_ABORT); break; // Sif Muna power calls with true case SPELL_MASS_CONFUSION: @@ -1134,7 +1141,7 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_SMITING: if (cast_smiting(powc) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_REPEL_UNDEAD: @@ -1166,34 +1173,27 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_BOLT_OF_DRAINING: - SPELL_DIR(spd, beam); zapping(ZAP_NEGATIVE_ENERGY, powc, beam); break; case SPELL_LEHUDIBS_CRYSTAL_SPEAR: - SPELL_DIR(spd, beam); zapping(ZAP_CRYSTAL_SPEAR, powc, beam); break; case SPELL_BOLT_OF_INACCURACY: - SPELL_DIR(spd, beam); zapping(ZAP_BEAM_OF_ENERGY, powc, beam); break; case SPELL_POISONOUS_CLOUD: - if (cast_big_c(powc, CLOUD_POISON) == -1) - return (-1); + cast_big_c(powc, CLOUD_POISON, beam); break; case SPELL_POISON_ARROW: - SPELL_DIR(spd, beam); - zapping( ZAP_POISON_ARROW, powc, beam ); break; case SPELL_FIRE_STORM: - if (cast_fire_storm(powc) == -1) - return (-1); + cast_fire_storm(powc, beam); break; case SPELL_DETECT_TRAPS: @@ -1207,7 +1207,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_ISKENDERUNS_MYSTIC_BLAST: - SPELL_DIR(spd, beam); zapping( ZAP_MYSTIC_BLAST, powc, beam ); break; @@ -1220,12 +1219,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_ENSLAVEMENT: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_ENSLAVEMENT, powc, beam); break; @@ -1243,14 +1236,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_HEAL_OTHER: - if (spell_direction(spd, beam, DIR_NONE, TARG_FRIEND) == -1) - return (-1); - - if (spd.isMe) - { - mpr("Sorry, it doesn't work like that."); - return (-1); - } zapping(ZAP_HEALING, powc, beam); break; @@ -1260,7 +1245,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_PAIN: - SPELL_DIR(spd, beam); dec_hp(1, false); zapping(ZAP_PAIN, powc, beam); break; @@ -1297,17 +1281,17 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_BURN: if (burn_freeze(powc, BEAM_FIRE) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_FREEZE: if (burn_freeze(powc, BEAM_COLD) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_SUMMON_ELEMENTAL: if (summon_elemental(powc, 0, 2) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_OZOCUBUS_REFRIGERATION: @@ -1315,7 +1299,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_STICKY_FLAME: - SPELL_DIR(spd, beam); zapping(ZAP_STICKY_FLAME, powc, beam); break; @@ -1345,7 +1328,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_DISPEL_UNDEAD: - SPELL_DIR(spd, beam); zapping(ZAP_DISPEL_UNDEAD, powc, beam); break; @@ -1354,12 +1336,10 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_THUNDERBOLT: - SPELL_DIR(spd, beam); zapping(ZAP_LIGHTNING, powc, beam); break; case SPELL_FLAME_OF_CLEANSING: - SPELL_DIR(spd, beam); zapping(ZAP_CLEANSING_FLAME, powc, beam); break; @@ -1383,27 +1363,18 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_BONE_SHARDS: if (cast_bone_shards(powc) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_BANISHMENT: - SPELL_DIR(spd, beam); zapping(ZAP_BANISHMENT, powc, beam); break; case SPELL_CIGOTUVIS_DEGENERATION: - SPELL_DIR(spd, beam); - - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (false); - } zapping(ZAP_DEGENERATION, powc, beam); break; case SPELL_STING: - SPELL_DIR(spd, beam); zapping(ZAP_STING, powc, beam); break; @@ -1418,7 +1389,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_HELLFIRE: // should only be available from: // staff of Dispater & Sceptre of Asmodeus - SPELL_DIR(spd, beam); zapping(ZAP_HELLFIRE, powc, beam); break; @@ -1488,12 +1458,10 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_BOLT_OF_IRON: - SPELL_DIR(spd, beam); zapping(ZAP_IRON_BOLT, powc, beam); break; case SPELL_STONE_ARROW: - SPELL_DIR(spd, beam); zapping(ZAP_STONE_ARROW, powc, beam); break; @@ -1506,7 +1474,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_SHOCK: - SPELL_DIR(spd, beam); zapping(ZAP_ELECTRICITY, powc, beam); break; @@ -1523,7 +1490,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_ORB_OF_ELECTROCUTION: - SPELL_DIR(spd, beam); zapping(ZAP_ORB_OF_ELECTRICITY, powc, beam); break; @@ -1557,7 +1523,7 @@ int your_spells( int spc2, int powc, bool allow_fail ) mpr( "Your body is in too poor a condition " "for this spell to function." ); - return (false); + return (SPRET_FAIL); } mpr("Your body is suffused with transfigurative energy!"); @@ -1569,8 +1535,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_DEBUGGING_RAY: - if (spell_direction(spd, beam, DIR_NONE, TARG_ANY) == -1) - return (false); zapping(ZAP_DEBUGGING_RAY, powc, beam); break; @@ -1580,16 +1544,10 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_PORTAL: if (portal() == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_AGONY: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_AGONY, powc, beam); break; @@ -1598,17 +1556,10 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_DISRUPT: - SPELL_DIR(spd, beam); zapping(ZAP_DISRUPTION, powc, beam); break; case SPELL_DISINTEGRATE: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_DISINTEGRATION, powc, beam); break; @@ -1637,11 +1588,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_SYMBOL_OF_TORMENT: - if (player_res_torment()) - { - mpr("To torment others, one must first know what torment means. "); - return (-1); - } torment(TORMENT_SPELL, you.x_pos, you.y_pos); break; @@ -1650,27 +1596,23 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_ORB_OF_FRAGMENTATION: - SPELL_DIR(spd, beam); zapping(ZAP_ORB_OF_FRAGMENTATION, powc, beam); break; case SPELL_ICE_BOLT: - SPELL_DIR(spd, beam); zapping(ZAP_ICE_BOLT, powc, beam); break; case SPELL_ARC: if (burn_freeze(powc, BEAM_ELECTRICITY) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_AIRSTRIKE: - if (airstrike(powc) == -1) - return (-1); + airstrike(powc, spd); break; case SPELL_ICE_STORM: - SPELL_DIR(spd, beam); zapping(ZAP_ICE_STORM, powc, beam); break; @@ -1682,12 +1624,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) //jmf: new spells 19mar2000 case SPELL_FLAME_TONGUE: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_FLAME_TONGUE, powc, beam); break; @@ -1716,12 +1652,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_SLEEP: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_SLEEP, powc, beam); break; @@ -1780,12 +1710,6 @@ int your_spells( int spc2, int powc, bool allow_fail ) break; case SPELL_BACKLIGHT: - SPELL_DIR(spd, beam); - if (spd.isMe) - { - canned_msg(MSG_UNTHINKING_ACT); - return (-1); - } zapping(ZAP_BACKLIGHT, powc + 10, beam); break; @@ -1828,7 +1752,7 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_SEMI_CONTROLLED_BLINK: //jmf: powc is ignored if (cast_semi_controlled_blink(powc) == -1) - return (-1); + return (SPRET_ABORT); break; case SPELL_STONESKIN: @@ -1861,7 +1785,7 @@ int your_spells( int spc2, int powc, bool allow_fail ) case SPELL_APPORTATION: if (cast_apportation(powc) == -1) - return (-1); + return (SPRET_ABORT); break; default: diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index 84dd322bd1..758514fe91 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -140,373 +140,426 @@ SPELL_IDENTIFY, "Identify", SPTYP_DIVINATION, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_TELEPORT_SELF, "Teleport Self", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_CAUSE_FEAR, "Cause Fear", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_CREATE_NOISE, "Create Noise", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_REMOVE_CURSE, "Remove Curse", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_MAGIC_DART, "Magic Dart", SPTYP_CONJURATION, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_FIREBALL, "Fireball", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET, - 6 + 6, + NULL }, { SPELL_SWAP, "Swap", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_APPORTATION, "Apportation", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_TWIST, "Twist", SPTYP_TRANSLOCATION, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_CONJURE_FLAME, "Conjure Flame", SPTYP_CONJURATION | SPTYP_FIRE, - SPFLAG_GRID | SPFLAG_NOT_SELF, - 3 + SPFLAG_NONE, + 3, + NULL }, { SPELL_DIG, "Dig", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 4 + 4, + NULL }, { SPELL_BOLT_OF_FIRE, "Bolt of Fire", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET, - 5 + 5, + NULL }, { SPELL_BOLT_OF_COLD, "Bolt of Cold", SPTYP_CONJURATION | SPTYP_ICE, SPFLAG_DIR_OR_TARGET, - 5 + 5, + NULL }, { SPELL_LIGHTNING_BOLT, "Lightning Bolt", SPTYP_CONJURATION | SPTYP_AIR, SPFLAG_DIR_OR_TARGET, - 6 + 6, + NULL }, { SPELL_BOLT_OF_MAGMA, "Bolt of Magma", SPTYP_CONJURATION | SPTYP_FIRE | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET, - 5 + 5, + NULL }, { SPELL_POLYMORPH_OTHER, "Polymorph Other", SPTYP_TRANSMIGRATION, // removed enchantment, wasn't needed -- bwr SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 5 + 5, + NULL }, { SPELL_SLOW, "Slow", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET, - 3 + 3, + NULL }, { SPELL_HASTE, "Haste", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET | SPFLAG_HELPFUL, - 6 // lowered to 6 from 8, since its easily available from various items + 6, // lowered to 6 from 8, since its easily available from various items // and Swiftness is level 2 (and gives a similar effect). Its also // not that much better than Invisibility. -- bwr + NULL }, { SPELL_PARALYZE, "Paralyze", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET, - 4 + 4, + NULL }, { SPELL_CONFUSE, "Confuse", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET, - 3 + 3, + NULL }, { SPELL_INVISIBILITY, "Invisibility", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET | SPFLAG_HELPFUL, - 6 + 6, + NULL }, { SPELL_THROW_FLAME, "Throw Flame", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET, - 2 + 2, + NULL }, { SPELL_THROW_FROST, "Throw Frost", SPTYP_CONJURATION | SPTYP_ICE, SPFLAG_DIR_OR_TARGET, - 2 + 2, + NULL }, { SPELL_CONTROLLED_BLINK, "Controlled Blink", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_FREEZING_CLOUD, "Freezing Cloud", SPTYP_CONJURATION | SPTYP_ICE | SPTYP_AIR, SPFLAG_GRID, - 7 + 7, + "Where do you want to put it?" }, { SPELL_MEPHITIC_CLOUD, "Mephitic Cloud", SPTYP_CONJURATION | SPTYP_POISON | SPTYP_AIR, SPFLAG_DIR_OR_TARGET, - 3 + 3, + NULL }, { SPELL_RING_OF_FLAMES, "Ring of Flames", SPTYP_ENCHANTMENT | SPTYP_FIRE, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_RESTORE_STRENGTH, "Restore Strength", SPTYP_HOLY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_RESTORE_INTELLIGENCE, "Restore Intelligence", SPTYP_HOLY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_RESTORE_DEXTERITY, "Restore Dexterity", SPTYP_HOLY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_VENOM_BOLT, "Venom Bolt", SPTYP_CONJURATION | SPTYP_POISON, SPFLAG_DIR_OR_TARGET, - 5 + 5, + NULL }, { SPELL_OLGREBS_TOXIC_RADIANCE, "Olgreb's Toxic Radiance", SPTYP_POISON, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_TELEPORT_OTHER, "Teleport Other", SPTYP_TRANSLOCATION, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 4 + 4, + NULL }, { SPELL_LESSER_HEALING, "Lesser Healing", SPTYP_HOLY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_GREATER_HEALING, "Greater Healing", SPTYP_HOLY, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_CURE_POISON_I, "Cure Poison", SPTYP_HOLY, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_PURIFICATION, "Purification", SPTYP_HOLY, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_DEATHS_DOOR, "Death's Door", SPTYP_ENCHANTMENT | SPTYP_NECROMANCY, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_SELECTIVE_AMNESIA, "Selective Amnesia", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_MASS_CONFUSION, "Mass Confusion", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_SMITING, "Smiting", SPTYP_HOLY, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_REPEL_UNDEAD, "Repel Undead", SPTYP_HOLY, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_HOLY_WORD, "Holy Word", SPTYP_HOLY, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_DETECT_CURSE, "Detect Curse", SPTYP_DIVINATION, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_SUMMON_SMALL_MAMMAL, "Summon Small Mammals", SPTYP_SUMMONING, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_ABJURATION_I, "Abjuration", SPTYP_SUMMONING, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_SUMMON_SCORPIONS, "Summon Scorpions", SPTYP_SUMMONING | SPTYP_POISON, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_LEVITATION, "Levitation", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_BOLT_OF_DRAINING, "Bolt of Draining", SPTYP_CONJURATION | SPTYP_NECROMANCY, SPFLAG_DIR_OR_TARGET, - 6 + 6, + NULL }, { SPELL_LEHUDIBS_CRYSTAL_SPEAR, "Lehudib's Crystal Spear", SPTYP_CONJURATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET, - 8 + 8, + NULL }, { SPELL_BOLT_OF_INACCURACY, "Bolt of Inaccuracy", SPTYP_CONJURATION, SPFLAG_DIR_OR_TARGET, - 2 + 2, + NULL }, { SPELL_POISONOUS_CLOUD, "Poisonous Cloud", SPTYP_CONJURATION | SPTYP_POISON | SPTYP_AIR, SPFLAG_GRID, - 6 + 6, + "Where do you want to put it?" } , @@ -514,21 +567,24 @@ SPELL_FIRE_STORM, "Fire Storm", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_GRID, - 9 + 9, + "Where?" }, { SPELL_DETECT_TRAPS, "Detect Traps", SPTYP_DIVINATION, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_BLINK, "Blink", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 2 + 2, + NULL }, @@ -538,196 +594,224 @@ SPELL_ISKENDERUNS_MYSTIC_BLAST, "Iskenderun's Mystic Blast", SPTYP_CONJURATION, SPFLAG_DIR_OR_TARGET, - 4 + 4, + NULL }, { SPELL_SWARM, "Summon Swarm", SPTYP_SUMMONING, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_SUMMON_HORRIBLE_THINGS, "Summon Horrible Things", SPTYP_SUMMONING, SPFLAG_UNHOLY, - 8 + 8, + NULL }, { SPELL_ENSLAVEMENT, "Enslavement", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 4 + 4, + NULL }, { SPELL_MAGIC_MAPPING, "Magic Mapping", SPTYP_DIVINATION | SPTYP_EARTH, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_HEAL_OTHER, "Heal Other", SPTYP_HOLY, SPFLAG_DIR_OR_TARGET | SPFLAG_HELPFUL | SPFLAG_NOT_SELF, - 3 + 3, + NULL }, { SPELL_ANIMATE_DEAD, "Animate Dead", SPTYP_NECROMANCY, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_PAIN, "Pain", SPTYP_NECROMANCY, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_EXTENSION, "Extension", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_CONTROL_UNDEAD, "Control Undead", SPTYP_ENCHANTMENT | SPTYP_NECROMANCY, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_ANIMATE_SKELETON, "Animate Skeleton", SPTYP_NECROMANCY, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_VAMPIRIC_DRAINING, "Vampiric Draining", SPTYP_NECROMANCY, SPFLAG_DIR | SPFLAG_NOT_SELF, - 3 + 3, + NULL }, { SPELL_SUMMON_WRAITHS, "Summon Wraiths", SPTYP_NECROMANCY | SPTYP_SUMMONING, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_DETECT_ITEMS, "Detect Items", SPTYP_DIVINATION, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_BORGNJORS_REVIVIFICATION, "Borgnjor's Revivification", SPTYP_NECROMANCY, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_BURN, "Burn", // used by wanderers SPTYP_FIRE, - SPFLAG_DIR | SPFLAG_NOT_SELF, - 1 + SPFLAG_NONE, + 1, + NULL }, { SPELL_FREEZE, "Freeze", SPTYP_ICE, - SPFLAG_DIR | SPFLAG_NOT_SELF, - 1 + SPFLAG_NONE, + 1, + NULL }, { SPELL_SUMMON_ELEMENTAL, "Summon Elemental", SPTYP_SUMMONING, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_OZOCUBUS_REFRIGERATION, "Ozocubu's Refrigeration", SPTYP_ICE, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_STICKY_FLAME, "Sticky Flame", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET, - 4 + 4, + NULL }, { SPELL_SUMMON_ICE_BEAST, "Summon Ice Beast", SPTYP_ICE | SPTYP_SUMMONING, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_OZOCUBUS_ARMOUR, "Ozocubu's Armour", SPTYP_ENCHANTMENT | SPTYP_ICE, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_CALL_IMP, "Call Imp", SPTYP_SUMMONING, SPFLAG_UNHOLY, - 3 + 3, + NULL }, { SPELL_REPEL_MISSILES, "Repel Missiles", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_BERSERKER_RAGE, "Berserker Rage", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_DISPEL_UNDEAD, "Dispel Undead", SPTYP_NECROMANCY, SPFLAG_DIR_OR_TARGET, - 4 + 4, + NULL }, { SPELL_GUARDIAN, "Guardian", SPTYP_HOLY, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_PESTILENCE, "Pestilence", SPTYP_HOLY, SPFLAG_NONE, - 4 + 4, + NULL }, { @@ -742,168 +826,192 @@ SPELL_FLAME_OF_CLEANSING, "Flame of Cleansing", SPTYP_HOLY, SPFLAG_DIR_OR_TARGET, - 8 + 8, + NULL }, { SPELL_SHINING_LIGHT, "Shining Light", SPTYP_HOLY, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_SUMMON_DAEVA, "Summon Daeva", SPTYP_HOLY, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_ABJURATION_II, "Abjuration", SPTYP_HOLY, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_TWISTED_RESURRECTION, "Twisted Resurrection", SPTYP_NECROMANCY, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_REGENERATION, "Regeneration", SPTYP_ENCHANTMENT | SPTYP_NECROMANCY, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_BONE_SHARDS, "Bone Shards", SPTYP_NECROMANCY, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_BANISHMENT, "Banishment", SPTYP_TRANSLOCATION, SPFLAG_DIR_OR_TARGET | SPFLAG_UNHOLY, - 5 + 5, + NULL }, { SPELL_CIGOTUVIS_DEGENERATION, "Cigotuvi's Degeneration", SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 5 + 5, + NULL }, { SPELL_STING, "Sting", SPTYP_CONJURATION | SPTYP_POISON, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_SUBLIMATION_OF_BLOOD, "Sublimation of Blood", SPTYP_NECROMANCY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_TUKIMAS_DANCE, "Tukima's Dance", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_HELLFIRE, "Hellfire", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET | SPFLAG_UNHOLY, - 9 + 9, + NULL }, { SPELL_SUMMON_DEMON, "Summon Demon", SPTYP_SUMMONING, SPFLAG_UNHOLY, - 5 + 5, + NULL }, { SPELL_DEMONIC_HORDE, "Demonic Horde", SPTYP_SUMMONING, SPFLAG_UNHOLY, - 6 + 6, + NULL }, { SPELL_SUMMON_GREATER_DEMON, "Summon Greater Demon", SPTYP_SUMMONING, SPFLAG_UNHOLY, - 7 + 7, + NULL }, { SPELL_CORPSE_ROT, "Corpse Rot", SPTYP_NECROMANCY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_TUKIMAS_VORPAL_BLADE, "Tukima's Vorpal Blade", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_FIRE_BRAND, "Fire Brand", SPTYP_ENCHANTMENT | SPTYP_FIRE, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_FREEZING_AURA, "Freezing Aura", SPTYP_ENCHANTMENT | SPTYP_ICE, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_LETHAL_INFUSION, "Lethal Infusion", SPTYP_ENCHANTMENT | SPTYP_NECROMANCY, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_CRUSH, "Crush", SPTYP_EARTH, SPFLAG_DIR | SPFLAG_NOT_SELF, - 1 + 1, + NULL }, { SPELL_BOLT_OF_IRON, "Bolt of Iron", SPTYP_CONJURATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET, - 6 + 6, + NULL }, { SPELL_STONE_ARROW, "Stone Arrow", SPTYP_CONJURATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET, - 3 + 3, + NULL }, { @@ -918,49 +1026,56 @@ SPELL_STONEMAIL, "Stonemail", SPTYP_ENCHANTMENT | SPTYP_EARTH, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_SHOCK, "Shock", SPTYP_CONJURATION | SPTYP_AIR, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_SWIFTNESS, "Swiftness", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_FLY, "Fly", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_INSULATION, "Insulation", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_ORB_OF_ELECTROCUTION, "Orb of Electrocution", SPTYP_CONJURATION | SPTYP_AIR, SPFLAG_DIR_OR_TARGET, - 7 + 7, + NULL }, { SPELL_DETECT_CREATURES, "Detect Creatures", SPTYP_DIVINATION, SPFLAG_NONE, - 2 + 2, + NULL }, { @@ -975,7 +1090,8 @@ SPELL_CONTROL_TELEPORT, "Control Teleport", SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION, SPFLAG_NONE, - 5 + 5, + NULL }, { @@ -990,168 +1106,192 @@ SPELL_POISON_WEAPON, "Poison Weapon", SPTYP_ENCHANTMENT | SPTYP_POISON, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_RESIST_POISON, "Resist Poison", SPTYP_ENCHANTMENT | SPTYP_POISON, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_PROJECTED_NOISE, "Projected Noise", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_ALTER_SELF, "Alter Self", SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_DEBUGGING_RAY, "Debugging Ray", SPTYP_CONJURATION, SPFLAG_DIR_OR_TARGET, - 7 + 7, + NULL }, { SPELL_RECALL, "Recall", SPTYP_SUMMONING | SPTYP_TRANSLOCATION, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_PORTAL, "Portal", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_AGONY, "Agony", SPTYP_NECROMANCY, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 5 + 5, + NULL }, { SPELL_SPIDER_FORM, "Spider Form", SPTYP_TRANSMIGRATION | SPTYP_POISON, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_DISRUPT, "Disrupt", SPTYP_TRANSMIGRATION, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { SPELL_DISINTEGRATE, "Disintegrate", SPTYP_TRANSMIGRATION, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 6 + 6, + NULL }, { SPELL_BLADE_HANDS, "Blade Hands", SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 5 // only removes weapon, so I raised this from 4 -- bwr + 5, // only removes weapon, so I raised this from 4 -- bwr + NULL }, { SPELL_STATUE_FORM, "Statue Form", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_ICE_FORM, "Ice Form", SPTYP_ICE | SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 4 // doesn't allow for equipment, so I lowered this from 5 -- bwr + 4, // doesn't allow for equipment, so I lowered this from 5 -- bwr + NULL }, { SPELL_DRAGON_FORM, "Dragon Form", SPTYP_FIRE | SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_NECROMUTATION, "Necromutation", SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_DEATH_CHANNEL, "Death Channel", SPTYP_NECROMANCY, SPFLAG_NONE, - 9 + 9, + NULL }, { SPELL_SYMBOL_OF_TORMENT, "Symbol of Torment", SPTYP_NECROMANCY, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_DEFLECT_MISSILES, "Deflect Missiles", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_ORB_OF_FRAGMENTATION, "Orb of Fragmentation", SPTYP_CONJURATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET, - 7 + 7, + NULL }, { SPELL_ICE_BOLT, "Ice Bolt", SPTYP_CONJURATION | SPTYP_ICE, SPFLAG_DIR_OR_TARGET, - 4 + 4, + NULL }, { SPELL_ICE_STORM, "Ice Storm", SPTYP_CONJURATION | SPTYP_ICE, SPFLAG_DIR_OR_TARGET, - 9 + 9, + NULL }, { SPELL_ARC, "Arc", SPTYP_AIR, - SPFLAG_DIR | SPFLAG_NOT_SELF, - 1 + SPFLAG_NONE, + 1, + NULL }, { SPELL_AIRSTRIKE, "Airstrike", SPTYP_AIR, SPFLAG_TARGET | SPFLAG_NOT_SELF, - 4 + 4, + NULL }, { @@ -1166,14 +1306,16 @@ SPELL_CONFUSING_TOUCH, "Confusing Touch", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_SURE_BLADE, "Sure Blade", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 2 + 2, + NULL }, @@ -1185,287 +1327,328 @@ SPELL_FLAME_TONGUE, "Flame Tongue", SPTYP_CONJURATION | SPTYP_FIRE, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 1 + 1, + NULL }, { SPELL_PASSWALL, "Passwall", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_IGNITE_POISON, "Ignite Poison", SPTYP_FIRE | SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_STICKS_TO_SNAKES, "Sticks to Snakes", SPTYP_TRANSMIGRATION | SPTYP_SUMMONING, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_SUMMON_LARGE_MAMMAL, "Call Canine Familiar", SPTYP_SUMMONING, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_SUMMON_DRAGON, "Summon Dragon", SPTYP_FIRE | SPTYP_SUMMONING, SPFLAG_NONE, - 9 + 9, + NULL }, { SPELL_TAME_BEASTS, "Tame Beasts", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_SLEEP, "Ensorcelled Hibernation", SPTYP_ENCHANTMENT | SPTYP_ICE, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 2 + 2, + NULL }, { SPELL_MASS_SLEEP, "Metabolic Englaciation", SPTYP_ENCHANTMENT | SPTYP_ICE, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_DETECT_MAGIC, "Detect Magic", SPTYP_DIVINATION, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_DETECT_SECRET_DOORS, "Detect Secret Doors", SPTYP_DIVINATION, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_SEE_INVISIBLE, "See Invisible", SPTYP_ENCHANTMENT | SPTYP_DIVINATION, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_FORESCRY, "Forescry", SPTYP_DIVINATION, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_SUMMON_BUTTERFLIES, "Summon Butterflies", SPTYP_SUMMONING, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_EXCRUCIATING_WOUNDS, "Excruciating Wounds", SPTYP_ENCHANTMENT | SPTYP_NECROMANCY, SPFLAG_NONE, - 5 // fairly high level - potentially one of the best brands + 5, // fairly high level - potentially one of the best brands + NULL }, { SPELL_WARP_BRAND, "Warp Weapon", SPTYP_ENCHANTMENT | SPTYP_TRANSLOCATION, SPFLAG_NONE, - 7 // this is high for a reason - Warp brands are very powerful. + 7, // this is high for a reason - Warp brands are very powerful. + NULL }, { SPELL_SILENCE, "Silence", SPTYP_ENCHANTMENT | SPTYP_AIR, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_SHATTER, "Shatter", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 9 + 9, + NULL }, { SPELL_DISPERSAL, "Dispersal", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_DISCHARGE, "Static Discharge", SPTYP_CONJURATION | SPTYP_AIR, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_BEND, "Bend", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_BACKLIGHT, "Corona", SPTYP_ENCHANTMENT, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 1 + 1, + NULL }, { SPELL_INTOXICATE, "Alistair's Intoxication", SPTYP_TRANSMIGRATION | SPTYP_POISON, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_GLAMOUR, "Glamour", SPTYP_ENCHANTMENT, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_EVAPORATE, "Evaporate", SPTYP_FIRE | SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 2 // XXX: level 2 or 3, what should it be now? -- bwr + 2, // XXX: level 2 or 3, what should it be now? -- bwr + NULL }, { SPELL_ERINGYAS_SURPRISING_BOUQUET, "Eringya's Surprising Bouquet", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_FRAGMENTATION, "Lee's Rapid Deconstruction", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_AIR_WALK, "Air Walk", SPTYP_TRANSMIGRATION | SPTYP_AIR, SPFLAG_NONE, - 9 + 9, + NULL }, { SPELL_SANDBLAST, "Sandblast", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_DIR_OR_TARGET | SPFLAG_NOT_SELF, - 1 + 1, + NULL }, { SPELL_ROTTING, "Rotting", SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY, SPFLAG_NONE, - 5 + 5, + NULL }, { SPELL_MAXWELLS_SILVER_HAMMER, "Maxwell's Silver Hammer", SPTYP_TRANSMIGRATION | SPTYP_EARTH, SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_CONDENSATION_SHIELD, "Condensation Shield", SPTYP_ICE | SPTYP_TRANSMIGRATION, SPFLAG_NONE, - 4 + 4, + NULL }, { SPELL_SEMI_CONTROLLED_BLINK, "Semi-Controlled Blink", SPTYP_TRANSLOCATION, SPFLAG_NONE, - 3 + 3, + NULL }, { SPELL_STONESKIN, "Stoneskin", SPTYP_EARTH | SPTYP_TRANSMIGRATION, // was ench -- bwr SPFLAG_NONE, - 2 + 2, + NULL }, { SPELL_SIMULACRUM, "Simulacrum", SPTYP_ICE | SPTYP_NECROMANCY, SPFLAG_NONE, - 6 + 6, + NULL }, { SPELL_CONJURE_BALL_LIGHTNING, "Conjure Ball Lightning", SPTYP_AIR | SPTYP_CONJURATION, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_CHAIN_LIGHTNING, "Chain Lightning", SPTYP_AIR | SPTYP_CONJURATION, SPFLAG_NONE, - 8 + 8, + NULL }, { SPELL_DELAYED_FIREBALL, "Delayed Fireball", SPTYP_FIRE | SPTYP_CONJURATION, SPFLAG_NONE, - 7 + 7, + NULL }, { SPELL_FULSOME_DISTILLATION, "Fulsome Distillation", SPTYP_TRANSMIGRATION | SPTYP_NECROMANCY, SPFLAG_NONE, - 1 + 1, + NULL }, { SPELL_POISON_ARROW, "Poison Arrow", SPTYP_CONJURATION | SPTYP_POISON, SPFLAG_DIR_OR_TARGET, - 6 + 6, + NULL }, { SPELL_STRIKING, "Striking", 0, SPFLAG_DIR_OR_TARGET, - 1 + 1, + NULL }, { @@ -1473,6 +1656,7 @@ 0, 0, 0, + NULL }, diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index 2892b6b67e..b490d19294 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -211,6 +211,11 @@ unsigned int get_spell_flags( int which_spell ) return (seekspell(which_spell)->flags); } +const char *get_spell_target_prompt( int which_spell ) +{ + return (seekspell(which_spell)->target_prompt); +} + bool spell_typematch(int which_spell, unsigned int which_discipline) { return (seekspell(which_spell)->disciplines & which_discipline); @@ -675,11 +680,12 @@ void apply_area_cloud( int (*func) (int, int, int, int), int x, int y, } // end apply_area_cloud() char spell_direction( struct dist &spelld, struct bolt &pbolt, - targeting_type restrict, int mode ) + targeting_type restrict, int mode, + const char *prompt ) { message_current_target(); - direction( spelld, restrict, mode ); + direction( spelld, restrict, mode, false, prompt ); if (!spelld.isValid) { diff --git a/crawl-ref/source/spl-util.h b/crawl-ref/source/spl-util.h index f81ca07ba5..6afb307431 100644 --- a/crawl-ref/source/spl-util.h +++ b/crawl-ref/source/spl-util.h @@ -25,6 +25,7 @@ struct playerspell unsigned int disciplines; // bitfield unsigned int flags; // bitfield unsigned int level; + const char *target_prompt; }; @@ -46,6 +47,7 @@ int spell_mana(int which_spell); // * called from: chardump - it_use3 - player - spell - spl-book - // * spells0 - spells3 int spell_difficulty(int which_spell); +const char *get_spell_target_prompt( int which_spell ); int spell_levels_required(int which_spell); @@ -83,7 +85,8 @@ int apply_area_within_radius(int (*func) (int, int, int, int), char spell_direction( struct dist &spelld, struct bolt &pbolt, targeting_type restrict = DIR_NONE, - int mode = TARG_ENEMY ); + int mode = TARG_ENEMY, + const char *prompt = NULL ); void apply_area_cloud(int (*func) (int, int, int, int), int x, int y, int pow, int number, int ctype); diff --git a/crawl-ref/source/tutorial.cc b/crawl-ref/source/tutorial.cc index c2d314a78a..8e7edddbcf 100644 --- a/crawl-ref/source/tutorial.cc +++ b/crawl-ref/source/tutorial.cc @@ -54,7 +54,6 @@ void load_tutorial( FILE* fp ) void init_tutorial_options()
{
if (!Options.tutorial_left) {
- mpr("return from tutorial check");
return;
}
@@ -889,6 +888,7 @@ void tutorial_first_item(item_def item) Options.tut_just_triggered = 1;
}
+#if 0
static void tutorial_first_stairs(int x, int y) {
std::string text = "<magenta>The ";
@@ -903,7 +903,8 @@ static void tutorial_first_stairs(int x, int y) { "this level again, press <w><<<magenta> while standing on the "
"upstairs.";
print_formatted_paragraph(text, 80, MSGCH_TUTORIAL);
-}
+}
+#endif
void learned_something_new(unsigned int seen_what, int x, int y)
{
|