Anonymous | Login | 2024-04-26 21:07 CEST |
Main | My View | View Issues | Change Log | Wiki | Tavern | News |
Viewing Issue Simple Details [ Jump to Notes ] [ Wiki ] | [ View Advanced ] [ Issue History ] [ Print ] | |||||||||||
ID | Category | Severity | Reproducibility | Date Submitted | Last Update | |||||||
0008208 | [DCSS] Patches | minor | N/A | 2014-02-24 23:58 | 2014-05-01 17:32 | |||||||
Reporter | argonaut | View Status | public | |||||||||
Assigned To | ||||||||||||
Priority | normal | Resolution | open | |||||||||
Status | new | Product Branch | 0.14 ancient branch | |||||||||
Summary | 0008208: New spell: Wind Wall | |||||||||||
Description |
This replaces the Repel Missiles spell in the early books and I hope is more interesting tactically (although I'm sure it's a net downgrade). While RM is now a lot less tedious it's also much more of a no-brainer. Wind Wall should probably be a level 2 or 3 air-only spell to match Airstrike and Tornado but I kept it the same as RM to avoid too many balance issues. There's also an obvious extension to Ring of Winds but I'll see how this is received first. |
|||||||||||
Additional Information | ||||||||||||
Tags | No tags attached. | |||||||||||
Attached Files |
0001-wind-wall.patch [^] (7,320 bytes) 2014-02-24 23:58 [Show Content] [Hide Content]From 139b1500261948ae7f659f44a9b2af7c90851987 Mon Sep 17 00:00:00 2001 From: olowin <aolowin@gmail.com> Date: Mon, 24 Feb 2014 17:38:19 -0500 Subject: [PATCH] New spell Wind Wall. This replaces Repel Missiles as the low level defensive air spell and should be equally effective against early centaurs while making positioning and tactics a bit more interesting. --- crawl-ref/source/beam.cc | 6 ++++++ crawl-ref/source/book-data.h | 6 +++--- crawl-ref/source/cloud.cc | 6 ++++-- crawl-ref/source/dat/descript/spells.txt | 5 +++++ crawl-ref/source/enum.h | 2 ++ crawl-ref/source/spl-cast.cc | 3 +++ crawl-ref/source/spl-clouds.cc | 16 ++++++++++++++++ crawl-ref/source/spl-clouds.h | 2 ++ crawl-ref/source/spl-data.h | 13 +++++++++++++ crawl-ref/source/spl-util.cc | 1 + 10 files changed, 55 insertions(+), 5 deletions(-) diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index 39664e2..21327e1 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -2868,6 +2868,12 @@ void bolt::affect_place_clouds() delete_cloud(cloudidx); extra_range_used += 5; } + + if (ctype == CLOUD_GUST && was_missile && one_chance_in(3)) + { + mprf("The %s drops to the ground!", (item ? item->name(DESC_PLAIN, true) : "missile").c_str()); + finish_beam(); + } return; } diff --git a/crawl-ref/source/book-data.h b/crawl-ref/source/book-data.h index 0880be6..3cfc560 100644 --- a/crawl-ref/source/book-data.h +++ b/crawl-ref/source/book-data.h @@ -2,7 +2,7 @@ SPELL_MAGIC_DART, SPELL_BLINK, SPELL_CALL_IMP, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_SLOW, SPELL_CONJURE_FLAME, SPELL_MEPHITIC_CLOUD, @@ -167,7 +167,7 @@ SPELL_FIRE_BRAND, SPELL_FREEZING_AURA, SPELL_SHROUD_OF_GOLUBRIA, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_POISON_WEAPON, SPELL_REGENERATION, SPELL_NO_SPELL, @@ -232,7 +232,7 @@ { // Book of Air SPELL_SHOCK, SPELL_SWIFTNESS, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_FLY, SPELL_DISCHARGE, SPELL_LIGHTNING_BOLT, diff --git a/crawl-ref/source/cloud.cc b/crawl-ref/source/cloud.cc index 158aa05..1888c92 100644 --- a/crawl-ref/source/cloud.cc +++ b/crawl-ref/source/cloud.cc @@ -1188,6 +1188,7 @@ bool is_harmless_cloud(cloud_type type) case CLOUD_GLOOM: #endif case CLOUD_INK: + case CLOUD_GUST: case CLOUD_DEBUGGING: return true; default: @@ -1234,7 +1235,7 @@ static const char *_terse_cloud_names[] = "blessed fire", "foul pestilence", "thin mist", "seething chaos", "rain", "mutagenic fog", "magical condensation", "raging winds", - "sparse dust", "ghostly flame" + "sparse dust", "ghostly flame", "gusty winds" }; static const char *_verbose_cloud_names[] = @@ -1251,7 +1252,7 @@ static const char *_verbose_cloud_names[] = "calcifying dust", "blessed fire", "dark miasma", "thin mist", "seething chaos", "the rain", "mutagenic fog", "magical condensation", "raging winds", - "sparse dust", "ghostly flame" + "sparse dust", "ghostly flame", "gusty winds" }; string cloud_type_name(cloud_type type, bool terse) @@ -1452,6 +1453,7 @@ int get_cloud_colour(int cloudno) break; case CLOUD_TORNADO: + case CLOUD_GUST: which_colour = ETC_TORNADO; break; diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt index 8e79912..f5cfd3a 100644 --- a/crawl-ref/source/dat/descript/spells.txt +++ b/crawl-ref/source/dat/descript/spells.txt @@ -1482,6 +1482,11 @@ Wind Blast spell This spell causes a strong gust of wind to push away creatures and clouds in a cone. %%%% +Wind Wall spell + +This spell creates a wall of gusty wind to deflect thrown or launched missiles. +Magically created projectiles move too quickly to be affected. +%%%% Word of Recall spell This spell teleports a bunch of allies from somewhere on the same dungeon level diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index ea86f91..3bf238f 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -663,6 +663,7 @@ enum cloud_type CLOUD_TORNADO, CLOUD_DUST_TRAIL, CLOUD_GHOSTLY_FLAME, + CLOUD_GUST, NUM_CLOUD_TYPES, CLOUD_OPAQUE_FIRST = CLOUD_BLACK_SMOKE, @@ -3884,6 +3885,7 @@ enum spell_type SPELL_SUMMON_FOREST, SPELL_SUMMON_LIGHTNING_SPIRE, SPELL_SUMMON_GUARDIAN_GOLEM, + SPELL_WIND_WALL, NUM_SPELLS }; diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index b2f0fe0..0109354 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1821,6 +1821,9 @@ static spret_type _do_cast(spell_type spell, int powc, case SPELL_CONJURE_FLAME: return conjure_flame(powc, beam.target, fail); + case SPELL_WIND_WALL: + return cast_wind_wall(powc, target, fail); + case SPELL_PASSWALL: return cast_passwall(spd.delta, powc, fail); diff --git a/crawl-ref/source/spl-clouds.cc b/crawl-ref/source/spl-clouds.cc index b99ff49..3aeabd1 100644 --- a/crawl-ref/source/spl-clouds.cc +++ b/crawl-ref/source/spl-clouds.cc @@ -496,3 +496,19 @@ void apply_control_winds(const monster* mon) } } } + +spret_type cast_wind_wall(int pow, const coord_def& target, bool fail) +{ + fail_check(); + + const int duration = min(5 + (random2(pow)/2) + (random2(pow)/2), 23); + + for (adjacent_iterator ai(you.pos()); ai; ++ai) + if (distance2(*ai, target) <= 1 && !cell_is_solid(*ai) + && env.cgrid(*ai) == EMPTY_CLOUD) + { + place_cloud(CLOUD_GUST, *ai, duration, &you); + } + + return SPRET_SUCCESS; +} diff --git a/crawl-ref/source/spl-clouds.h b/crawl-ref/source/spl-clouds.h index d1b7c0c..22af0a6 100644 --- a/crawl-ref/source/spl-clouds.h +++ b/crawl-ref/source/spl-clouds.h @@ -24,4 +24,6 @@ void corpse_rot(actor* caster); int holy_flames(monster* caster, actor* defender); void apply_control_winds(const monster* mon); + +spret_type cast_wind_wall(int power, const coord_def& where, bool fail); #endif diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index f425b4d..b9a723f 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -3641,6 +3641,19 @@ struct spell_desc }, { + SPELL_WIND_WALL, "Wind Wall", + SPTYP_CHARMS | SPTYP_AIR, + SPFLAG_DIR | SPFLAG_NOT_SELF, + 2, + 50, + 1, 1, + 0, + NULL, + false, + false +}, + +{ SPELL_NO_SPELL, "nonexistent spell", 0, SPFLAG_TESTING, diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index c004fa3..2177bfc 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -1228,6 +1228,7 @@ bool spell_no_hostile_in_range(spell_type spell) case SPELL_LRD: case SPELL_FULMINANT_PRISM: case SPELL_SUMMON_LIGHTNING_SPIRE: + case SPELL_WIND_WALL: // Shock and Lightning Bolt are no longer here, as the code below can // account for possible bounces. -- 1.8.3.2 0001-Add-Wind-Shield-spell-and-replace-deflect-missiles-w.patch [^] (8,729 bytes) 2014-04-11 23:31 [Show Content] [Hide Content] From 652848081488a76646386dedb5f66ae353de59d0 Mon Sep 17 00:00:00 2001 From: olowin <aolowin@gmail.com> Date: Fri, 11 Apr 2014 16:47:08 -0400 Subject: [PATCH 1/2] Add Wind Shield spell and replace deflect missiles with it in the Book of the Sky. --- crawl-ref/source/book-data.h | 2 +- crawl-ref/source/dat/descript/spells.txt | 6 ++++ crawl-ref/source/enum.h | 2 ++ crawl-ref/source/main.cc | 3 ++ crawl-ref/source/player.cc | 2 ++ crawl-ref/source/spl-cast.cc | 3 ++ crawl-ref/source/spl-clouds.cc | 49 ++++++++++++++++++++++++++++++++ crawl-ref/source/spl-clouds.h | 3 ++ crawl-ref/source/spl-data.h | 13 +++++++++ crawl-ref/source/spl-tornado.cc | 11 +++++++ crawl-ref/source/status.cc | 2 ++ crawl-ref/source/wiz-you.cc | 1 + 12 files changed, 96 insertions(+), 1 deletion(-) diff --git a/crawl-ref/source/book-data.h b/crawl-ref/source/book-data.h index 86ca131..fc4aa20 100644 --- a/crawl-ref/source/book-data.h +++ b/crawl-ref/source/book-data.h @@ -244,7 +244,7 @@ SPELL_FLY, SPELL_AIRSTRIKE, SPELL_SILENCE, - SPELL_DEFLECT_MISSILES, + SPELL_WIND_SHIELD, SPELL_CONJURE_BALL_LIGHTNING, SPELL_TORNADO, SPELL_NO_SPELL, diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt index f7ca5d9..9a61198 100644 --- a/crawl-ref/source/dat/descript/spells.txt +++ b/crawl-ref/source/dat/descript/spells.txt @@ -1519,6 +1519,12 @@ Wind Blast spell This spell causes a strong gust of wind to push away creatures and clouds in a cone. %%%% +Wind Shield spell + +This spell surrounds the caster with a mobile globe of gusty wind that deflects +thrown or launched missiles. Magically created projectiles move too quickly to +be affected. +%%%% Wind Wall spell This spell creates a wall of gusty wind to deflect thrown or launched missiles. diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index d7d1a24..096f4f7 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1684,6 +1684,7 @@ enum duration_type DUR_DRAGON_CALL_COOLDOWN, DUR_ABJURATION_AURA, DUR_MESMERISE_IMMUNE, + DUR_WIND_SHIELD, NUM_DURATIONS }; @@ -4084,6 +4085,7 @@ enum spell_type SPELL_SUMMON_MANA_VIPER, SPELL_PHANTOM_MIRROR, SPELL_WIND_WALL, + SPELL_WIND_SHIELD, NUM_SPELLS }; diff --git a/crawl-ref/source/main.cc b/crawl-ref/source/main.cc index feec00b..fc0965a 100644 --- a/crawl-ref/source/main.cc +++ b/crawl-ref/source/main.cc @@ -3414,6 +3414,9 @@ static void _player_reacts_to_monsters() if (you.duration[DUR_FIRE_SHIELD] > 0) manage_fire_shield(you.time_taken); + if (you.duration[DUR_WIND_SHIELD] > 0) + manage_wind_shield(you.time_taken); + check_monster_detect(); if ((you_worship(GOD_ASHENZARI) && !player_under_penance()) diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index 606f167..69e9ac3 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -3939,6 +3939,7 @@ int get_expiration_threshold(duration_type dur) return 3 * BASELINE_DELAY; // per client.qc case DUR_FIRE_SHIELD: + case DUR_WIND_SHIELD: case DUR_SILENCE: // no message return 5 * BASELINE_DELAY; @@ -4269,6 +4270,7 @@ void display_char_status() DUR_SAP_MAGIC, STATUS_MAGIC_SAPPED, DUR_PORTAL_PROJECTILE, + DUR_WIND_SHIELD, }; status_info inf; diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index 9182971..d11d6f8 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1859,6 +1859,9 @@ static spret_type _do_cast(spell_type spell, int powc, case SPELL_WIND_WALL: return cast_wind_wall(powc, target, fail); + case SPELL_WIND_SHIELD: + return cast_wind_shield(powc, fail); + case SPELL_PASSWALL: return cast_passwall(spd.delta, powc, fail); diff --git a/crawl-ref/source/spl-clouds.cc b/crawl-ref/source/spl-clouds.cc index d0d7978..612e01a 100644 --- a/crawl-ref/source/spl-clouds.cc +++ b/crawl-ref/source/spl-clouds.cc @@ -252,6 +252,12 @@ spret_type cast_ring_of_flames(int power, bool fail) return SPRET_ABORT; } + if (you.duration[DUR_WIND_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + fail_check(); did_god_conduct(DID_FIRE, min(5 + power/5, 50)); you.increase_duration(DUR_FIRE_SHIELD, @@ -575,3 +581,46 @@ spret_type cast_wind_wall(int pow, const coord_def& target, bool fail) return SPRET_ABORT; } } + +spret_type cast_wind_shield(int power, bool fail) +{ + if (you.duration[DUR_FIRE_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + + fail_check(); + you.increase_duration(DUR_WIND_SHIELD, + 5 + (power / 10) + (random2(power) / 5), 50, + "The air around you churns!"); + manage_wind_shield(1); + return SPRET_SUCCESS; +} + +void manage_wind_shield(int delay) +{ + ASSERT(you.duration[DUR_WIND_SHIELD]); + + int old_dur = you.duration[DUR_WIND_SHIELD]; + + you.duration[DUR_WIND_SHIELD] -= delay; + if (you.duration[DUR_WIND_SHIELD] < 0) + you.duration[DUR_WIND_SHIELD] = 0; + + if (!you.duration[DUR_WIND_SHIELD]) + { + mprf(MSGCH_DURATION, "The winds around you subside."); + return; + } + + int threshold = get_expiration_threshold(DUR_WIND_SHIELD); + + if (old_dur > threshold && you.duration[DUR_WIND_SHIELD] < threshold) + mprf(MSGCH_DURATION, "Your shield of winds is calming down."); + + // Place gust clouds all around you in a + for (radius_iterator ri(you.pos(), 2, C_ROUND, LOS_SOLID); ri; ++ri) + if (!cell_is_solid(*ri) && env.cgrid(*ri) == EMPTY_CLOUD) + place_cloud(CLOUD_GUST, *ri, 1 + random2(6), &you); +} diff --git a/crawl-ref/source/spl-clouds.h b/crawl-ref/source/spl-clouds.h index 28d663b..c53d423 100644 --- a/crawl-ref/source/spl-clouds.h +++ b/crawl-ref/source/spl-clouds.h @@ -30,4 +30,7 @@ spret_type cast_cloud_cone(const actor *caster, int pow, const coord_def &pos, spret_type cast_wind_wall(int power, const coord_def& where, bool fail); +spret_type cast_wind_shield(int power, bool fail); +void manage_wind_shield(int delay); + #endif diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index a3ab5a9..55ee368 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -3766,6 +3766,19 @@ struct spell_desc }, { + SPELL_WIND_SHIELD, "Wind Shield", + SPTYP_CHARMS | SPTYP_AIR, + SPFLAG_AREA, + 5, + 200, + -1, -1, + 0, + NULL, + false, + false +}, + +{ SPELL_NO_SPELL, "nonexistent spell", 0, SPFLAG_TESTING, diff --git a/crawl-ref/source/spl-tornado.cc b/crawl-ref/source/spl-tornado.cc index eb49d25..00a8fbb 100644 --- a/crawl-ref/source/spl-tornado.cc +++ b/crawl-ref/source/spl-tornado.cc @@ -144,6 +144,17 @@ spret_type cast_tornado(int powc, bool fail) if (you.fishtail) merfolk_stop_swimming(); + if (you.duration[DUR_FIRE_SHIELD]) + { + you.duration[DUR_FIRE_SHIELD] = 0; + mprf(MSGCH_DURATION, "Your ring of flames gutters out."); + } + + if (you.duration[DUR_WIND_SHIELD]) + { + you.duration[DUR_WIND_SHIELD] = 0; + } + you.props["tornado_since"].get_int() = you.elapsed_time; _set_tornado_durations(powc); if (you.species == SP_TENGU) diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc index 565aa14..b3b7806 100644 --- a/crawl-ref/source/status.cc +++ b/crawl-ref/source/status.cc @@ -167,6 +167,8 @@ static duration_def duration_data[] = RED, "Dragoncall", "", "" }, { DUR_ABJURATION_AURA, false, BLUE, "Abj", "aura of abjuration", "You are abjuring all hostile summons around you." }, + { DUR_WIND_SHIELD, true, + LIGHTGREY, "Winds", "wind shield", "You are surrounded by blustery winds." }, }; static int duration_index[NUM_DURATIONS]; diff --git a/crawl-ref/source/wiz-you.cc b/crawl-ref/source/wiz-you.cc index 5ff8fc6..2b3b5f5 100644 --- a/crawl-ref/source/wiz-you.cc +++ b/crawl-ref/source/wiz-you.cc @@ -878,6 +878,7 @@ static const char* dur_names[] = "dragon call cooldown", "aura of abjuration", "mesmerisation immunity", + "wind shield", }; void wizard_edit_durations(void) -- 1.8.3.2 0002-missing-new-line.patch [^] (683 bytes) 2014-04-11 23:32 [Show Content] [Hide Content] From 6bc633befd5250bc780c7884ee411d7256c115e0 Mon Sep 17 00:00:00 2001 From: olowin <aolowin@gmail.com> Date: Fri, 11 Apr 2014 11:31:23 -0400 Subject: [PATCH 2/4] missing new line --- crawl-ref/source/spl-clouds.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crawl-ref/source/spl-clouds.cc b/crawl-ref/source/spl-clouds.cc index 4903c93..d0d7978 100644 --- a/crawl-ref/source/spl-clouds.cc +++ b/crawl-ref/source/spl-clouds.cc @@ -574,4 +574,4 @@ spret_type cast_wind_wall(int pow, const coord_def& target, bool fail) mpr("There's no open air in that direction!"); return SPRET_ABORT; } -} \ No newline at end of file +} -- 1.8.3.2 0003-Add-Wind-Shield-spell-and-replace-deflect-missiles-w.patch [^] (8,729 bytes) 2014-04-11 23:32 [Show Content] [Hide Content] From 652848081488a76646386dedb5f66ae353de59d0 Mon Sep 17 00:00:00 2001 From: olowin <aolowin@gmail.com> Date: Fri, 11 Apr 2014 16:47:08 -0400 Subject: [PATCH 3/4] Add Wind Shield spell and replace deflect missiles with it in the Book of the Sky. --- crawl-ref/source/book-data.h | 2 +- crawl-ref/source/dat/descript/spells.txt | 6 ++++ crawl-ref/source/enum.h | 2 ++ crawl-ref/source/main.cc | 3 ++ crawl-ref/source/player.cc | 2 ++ crawl-ref/source/spl-cast.cc | 3 ++ crawl-ref/source/spl-clouds.cc | 49 ++++++++++++++++++++++++++++++++ crawl-ref/source/spl-clouds.h | 3 ++ crawl-ref/source/spl-data.h | 13 +++++++++ crawl-ref/source/spl-tornado.cc | 11 +++++++ crawl-ref/source/status.cc | 2 ++ crawl-ref/source/wiz-you.cc | 1 + 12 files changed, 96 insertions(+), 1 deletion(-) diff --git a/crawl-ref/source/book-data.h b/crawl-ref/source/book-data.h index 86ca131..fc4aa20 100644 --- a/crawl-ref/source/book-data.h +++ b/crawl-ref/source/book-data.h @@ -244,7 +244,7 @@ SPELL_FLY, SPELL_AIRSTRIKE, SPELL_SILENCE, - SPELL_DEFLECT_MISSILES, + SPELL_WIND_SHIELD, SPELL_CONJURE_BALL_LIGHTNING, SPELL_TORNADO, SPELL_NO_SPELL, diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt index f7ca5d9..9a61198 100644 --- a/crawl-ref/source/dat/descript/spells.txt +++ b/crawl-ref/source/dat/descript/spells.txt @@ -1519,6 +1519,12 @@ Wind Blast spell This spell causes a strong gust of wind to push away creatures and clouds in a cone. %%%% +Wind Shield spell + +This spell surrounds the caster with a mobile globe of gusty wind that deflects +thrown or launched missiles. Magically created projectiles move too quickly to +be affected. +%%%% Wind Wall spell This spell creates a wall of gusty wind to deflect thrown or launched missiles. diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index d7d1a24..096f4f7 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1684,6 +1684,7 @@ enum duration_type DUR_DRAGON_CALL_COOLDOWN, DUR_ABJURATION_AURA, DUR_MESMERISE_IMMUNE, + DUR_WIND_SHIELD, NUM_DURATIONS }; @@ -4084,6 +4085,7 @@ enum spell_type SPELL_SUMMON_MANA_VIPER, SPELL_PHANTOM_MIRROR, SPELL_WIND_WALL, + SPELL_WIND_SHIELD, NUM_SPELLS }; diff --git a/crawl-ref/source/main.cc b/crawl-ref/source/main.cc index feec00b..fc0965a 100644 --- a/crawl-ref/source/main.cc +++ b/crawl-ref/source/main.cc @@ -3414,6 +3414,9 @@ static void _player_reacts_to_monsters() if (you.duration[DUR_FIRE_SHIELD] > 0) manage_fire_shield(you.time_taken); + if (you.duration[DUR_WIND_SHIELD] > 0) + manage_wind_shield(you.time_taken); + check_monster_detect(); if ((you_worship(GOD_ASHENZARI) && !player_under_penance()) diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index 606f167..69e9ac3 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -3939,6 +3939,7 @@ int get_expiration_threshold(duration_type dur) return 3 * BASELINE_DELAY; // per client.qc case DUR_FIRE_SHIELD: + case DUR_WIND_SHIELD: case DUR_SILENCE: // no message return 5 * BASELINE_DELAY; @@ -4269,6 +4270,7 @@ void display_char_status() DUR_SAP_MAGIC, STATUS_MAGIC_SAPPED, DUR_PORTAL_PROJECTILE, + DUR_WIND_SHIELD, }; status_info inf; diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index 9182971..d11d6f8 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1859,6 +1859,9 @@ static spret_type _do_cast(spell_type spell, int powc, case SPELL_WIND_WALL: return cast_wind_wall(powc, target, fail); + case SPELL_WIND_SHIELD: + return cast_wind_shield(powc, fail); + case SPELL_PASSWALL: return cast_passwall(spd.delta, powc, fail); diff --git a/crawl-ref/source/spl-clouds.cc b/crawl-ref/source/spl-clouds.cc index d0d7978..612e01a 100644 --- a/crawl-ref/source/spl-clouds.cc +++ b/crawl-ref/source/spl-clouds.cc @@ -252,6 +252,12 @@ spret_type cast_ring_of_flames(int power, bool fail) return SPRET_ABORT; } + if (you.duration[DUR_WIND_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + fail_check(); did_god_conduct(DID_FIRE, min(5 + power/5, 50)); you.increase_duration(DUR_FIRE_SHIELD, @@ -575,3 +581,46 @@ spret_type cast_wind_wall(int pow, const coord_def& target, bool fail) return SPRET_ABORT; } } + +spret_type cast_wind_shield(int power, bool fail) +{ + if (you.duration[DUR_FIRE_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + + fail_check(); + you.increase_duration(DUR_WIND_SHIELD, + 5 + (power / 10) + (random2(power) / 5), 50, + "The air around you churns!"); + manage_wind_shield(1); + return SPRET_SUCCESS; +} + +void manage_wind_shield(int delay) +{ + ASSERT(you.duration[DUR_WIND_SHIELD]); + + int old_dur = you.duration[DUR_WIND_SHIELD]; + + you.duration[DUR_WIND_SHIELD] -= delay; + if (you.duration[DUR_WIND_SHIELD] < 0) + you.duration[DUR_WIND_SHIELD] = 0; + + if (!you.duration[DUR_WIND_SHIELD]) + { + mprf(MSGCH_DURATION, "The winds around you subside."); + return; + } + + int threshold = get_expiration_threshold(DUR_WIND_SHIELD); + + if (old_dur > threshold && you.duration[DUR_WIND_SHIELD] < threshold) + mprf(MSGCH_DURATION, "Your shield of winds is calming down."); + + // Place gust clouds all around you in a + for (radius_iterator ri(you.pos(), 2, C_ROUND, LOS_SOLID); ri; ++ri) + if (!cell_is_solid(*ri) && env.cgrid(*ri) == EMPTY_CLOUD) + place_cloud(CLOUD_GUST, *ri, 1 + random2(6), &you); +} diff --git a/crawl-ref/source/spl-clouds.h b/crawl-ref/source/spl-clouds.h index 28d663b..c53d423 100644 --- a/crawl-ref/source/spl-clouds.h +++ b/crawl-ref/source/spl-clouds.h @@ -30,4 +30,7 @@ spret_type cast_cloud_cone(const actor *caster, int pow, const coord_def &pos, spret_type cast_wind_wall(int power, const coord_def& where, bool fail); +spret_type cast_wind_shield(int power, bool fail); +void manage_wind_shield(int delay); + #endif diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index a3ab5a9..55ee368 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -3766,6 +3766,19 @@ struct spell_desc }, { + SPELL_WIND_SHIELD, "Wind Shield", + SPTYP_CHARMS | SPTYP_AIR, + SPFLAG_AREA, + 5, + 200, + -1, -1, + 0, + NULL, + false, + false +}, + +{ SPELL_NO_SPELL, "nonexistent spell", 0, SPFLAG_TESTING, diff --git a/crawl-ref/source/spl-tornado.cc b/crawl-ref/source/spl-tornado.cc index eb49d25..00a8fbb 100644 --- a/crawl-ref/source/spl-tornado.cc +++ b/crawl-ref/source/spl-tornado.cc @@ -144,6 +144,17 @@ spret_type cast_tornado(int powc, bool fail) if (you.fishtail) merfolk_stop_swimming(); + if (you.duration[DUR_FIRE_SHIELD]) + { + you.duration[DUR_FIRE_SHIELD] = 0; + mprf(MSGCH_DURATION, "Your ring of flames gutters out."); + } + + if (you.duration[DUR_WIND_SHIELD]) + { + you.duration[DUR_WIND_SHIELD] = 0; + } + you.props["tornado_since"].get_int() = you.elapsed_time; _set_tornado_durations(powc); if (you.species == SP_TENGU) diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc index 565aa14..b3b7806 100644 --- a/crawl-ref/source/status.cc +++ b/crawl-ref/source/status.cc @@ -167,6 +167,8 @@ static duration_def duration_data[] = RED, "Dragoncall", "", "" }, { DUR_ABJURATION_AURA, false, BLUE, "Abj", "aura of abjuration", "You are abjuring all hostile summons around you." }, + { DUR_WIND_SHIELD, true, + LIGHTGREY, "Winds", "wind shield", "You are surrounded by blustery winds." }, }; static int duration_index[NUM_DURATIONS]; diff --git a/crawl-ref/source/wiz-you.cc b/crawl-ref/source/wiz-you.cc index 5ff8fc6..2b3b5f5 100644 --- a/crawl-ref/source/wiz-you.cc +++ b/crawl-ref/source/wiz-you.cc @@ -878,6 +878,7 @@ static const char* dur_names[] = "dragon call cooldown", "aura of abjuration", "mesmerisation immunity", + "wind shield", }; void wizard_edit_durations(void) -- 1.8.3.2 0004-Buff-Tornado-to-block-missiles.patch [^] (1,060 bytes) 2014-04-11 23:32 [Show Content] [Hide Content] From 9343a6447a9cdc78a2d1636ec6a04726ca10024a Mon Sep 17 00:00:00 2001 From: olowin <aolowin@gmail.com> Date: Fri, 11 Apr 2014 17:18:35 -0400 Subject: [PATCH 4/4] Buff Tornado to block missiles. --- crawl-ref/source/beam.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index b3db609..99df5c3 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -2857,9 +2857,11 @@ void bolt::affect_place_clouds() extra_range_used += 5; } - if (ctype == CLOUD_GUST && was_missile && x_chance_in_y(5, 10)) + if ((ctype == CLOUD_GUST || ctype == CLOUD_TORNADO) + && was_missile && x_chance_in_y(5, 10)) { - mprf("The %s drops to the ground!", (item ? item->name(DESC_BASENAME, false) : "missile").c_str()); + mprf("The %s drops to the ground!", + (item ? item->name(DESC_BASENAME, false) : "missile").c_str()); finish_beam(); } return; -- 1.8.3.2 0001-Argonaut-s-patches-spells-squashed-rebased-by-blackc.patch [^] (13,494 bytes) 2014-04-15 01:27 [Show Content] [Hide Content] From 918d610eb4f0fd888fce6830a30f30bcbf71de3b Mon Sep 17 00:00:00 2001 From: Peter Wicks Stringfield <peterwicksstringfield@gmail.com> Date: Mon, 14 Apr 2014 18:00:05 -0500 Subject: [PATCH] Argonaut's patches/spells squashed + rebased by blackcustard. EVALUATION ONLY. --- crawl-ref/source/beam.cc | 8 ++++ crawl-ref/source/book-data.h | 8 ++-- crawl-ref/source/cloud.cc | 6 ++- crawl-ref/source/dat/descript/spells.txt | 11 +++++ crawl-ref/source/enum.h | 4 ++ crawl-ref/source/main.cc | 3 ++ crawl-ref/source/player.cc | 2 + crawl-ref/source/spl-cast.cc | 6 +++ crawl-ref/source/spl-clouds.cc | 71 ++++++++++++++++++++++++++++++ crawl-ref/source/spl-clouds.h | 4 ++ crawl-ref/source/spl-data.h | 26 +++++++++++ crawl-ref/source/spl-tornado.cc | 11 +++++ crawl-ref/source/spl-util.cc | 1 + crawl-ref/source/status.cc | 2 + crawl-ref/source/wiz-you.cc | 1 + 15 files changed, 158 insertions(+), 6 deletions(-) diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc index f3408c0..dcd273e 100644 --- a/crawl-ref/source/beam.cc +++ b/crawl-ref/source/beam.cc @@ -2856,6 +2856,14 @@ void bolt::affect_place_clouds() delete_cloud(cloudidx); extra_range_used += 5; } + + if ((ctype == CLOUD_GUST || ctype == CLOUD_TORNADO) + && was_missile && x_chance_in_y(5, 10)) + { + mprf("The %s drops to the ground!", + (item ? item->name(DESC_BASENAME, false) : "missile").c_str()); + finish_beam(); + } return; } diff --git a/crawl-ref/source/book-data.h b/crawl-ref/source/book-data.h index 4b865c6..fc4aa20 100644 --- a/crawl-ref/source/book-data.h +++ b/crawl-ref/source/book-data.h @@ -2,7 +2,7 @@ SPELL_MAGIC_DART, SPELL_BLINK, SPELL_CALL_IMP, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_SLOW, SPELL_CONJURE_FLAME, SPELL_MEPHITIC_CLOUD, @@ -167,7 +167,7 @@ SPELL_FIRE_BRAND, SPELL_FREEZING_AURA, SPELL_SHROUD_OF_GOLUBRIA, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_POISON_WEAPON, SPELL_REGENERATION, SPELL_NO_SPELL, @@ -232,7 +232,7 @@ { // Book of Air SPELL_SHOCK, SPELL_SWIFTNESS, - SPELL_REPEL_MISSILES, + SPELL_WIND_WALL, SPELL_FLY, SPELL_DISCHARGE, SPELL_LIGHTNING_BOLT, @@ -244,7 +244,7 @@ SPELL_FLY, SPELL_AIRSTRIKE, SPELL_SILENCE, - SPELL_DEFLECT_MISSILES, + SPELL_WIND_SHIELD, SPELL_CONJURE_BALL_LIGHTNING, SPELL_TORNADO, SPELL_NO_SPELL, diff --git a/crawl-ref/source/cloud.cc b/crawl-ref/source/cloud.cc index 6323f5f..8619994 100644 --- a/crawl-ref/source/cloud.cc +++ b/crawl-ref/source/cloud.cc @@ -1309,6 +1309,7 @@ bool is_harmless_cloud(cloud_type type) case CLOUD_GLOOM: #endif case CLOUD_INK: + case CLOUD_GUST: case CLOUD_DEBUGGING: return true; default: @@ -1356,7 +1357,7 @@ static const char *_terse_cloud_names[] = "seething chaos", "rain", "mutagenic fog", "magical condensation", "raging winds", "sparse dust", "ghostly flame", - "acidic fog", "thunder", "negative energy" + "acidic fog", "thunder", "negative energy", "gusty winds" }; static const char *_verbose_cloud_names[] = @@ -1374,7 +1375,7 @@ static const char *_verbose_cloud_names[] = "blessed fire", "dark miasma", "thin mist", "seething chaos", "the rain", "mutagenic fog", "magical condensation", "raging winds", "sparse dust", "ghostly flame", - "acidic fog", "a thunderstorm", "negative energy" + "acidic fog", "a thunderstorm", "negative energy", "gusty winds" }; string cloud_type_name(cloud_type type, bool terse) @@ -1576,6 +1577,7 @@ int get_cloud_colour(int cloudno) break; case CLOUD_TORNADO: + case CLOUD_GUST: which_colour = ETC_TORNADO; break; diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt index 6981f4f..9a61198 100644 --- a/crawl-ref/source/dat/descript/spells.txt +++ b/crawl-ref/source/dat/descript/spells.txt @@ -1519,6 +1519,17 @@ Wind Blast spell This spell causes a strong gust of wind to push away creatures and clouds in a cone. %%%% +Wind Shield spell + +This spell surrounds the caster with a mobile globe of gusty wind that deflects +thrown or launched missiles. Magically created projectiles move too quickly to +be affected. +%%%% +Wind Wall spell + +This spell creates a wall of gusty wind to deflect thrown or launched missiles. +Magically created projectiles move too quickly to be affected. +%%%% Word of Recall spell This spell recalls allies from elsewhere on the same dungeon level to the diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index 1ad6a74..7c65485 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -686,6 +686,7 @@ enum cloud_type CLOUD_ACID, CLOUD_STORM, CLOUD_NEGATIVE_ENERGY, + CLOUD_GUST, NUM_CLOUD_TYPES, CLOUD_OPAQUE_FIRST = CLOUD_BLACK_SMOKE, @@ -1687,6 +1688,7 @@ enum duration_type DUR_DRAGON_CALL_COOLDOWN, DUR_ABJURATION_AURA, DUR_MESMERISE_IMMUNE, + DUR_WIND_SHIELD, NUM_DURATIONS }; @@ -4086,6 +4088,8 @@ enum spell_type SPELL_FORCEFUL_DISMISSAL, SPELL_SUMMON_MANA_VIPER, SPELL_PHANTOM_MIRROR, + SPELL_WIND_WALL, + SPELL_WIND_SHIELD, NUM_SPELLS }; diff --git a/crawl-ref/source/main.cc b/crawl-ref/source/main.cc index f8991e3..89c5852 100644 --- a/crawl-ref/source/main.cc +++ b/crawl-ref/source/main.cc @@ -3414,6 +3414,9 @@ static void _player_reacts_to_monsters() if (you.duration[DUR_FIRE_SHIELD] > 0) manage_fire_shield(you.time_taken); + if (you.duration[DUR_WIND_SHIELD] > 0) + manage_wind_shield(you.time_taken); + check_monster_detect(); if ((you_worship(GOD_ASHENZARI) && !player_under_penance()) diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index cdbcf61..1fa50a9 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -3944,6 +3944,7 @@ int get_expiration_threshold(duration_type dur) return 3 * BASELINE_DELAY; // per client.qc case DUR_FIRE_SHIELD: + case DUR_WIND_SHIELD: case DUR_SILENCE: // no message return 5 * BASELINE_DELAY; @@ -4274,6 +4275,7 @@ void display_char_status() DUR_SAP_MAGIC, STATUS_MAGIC_SAPPED, DUR_PORTAL_PROJECTILE, + DUR_WIND_SHIELD, }; status_info inf; diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index c5f7e3f..73d6935 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1851,6 +1851,12 @@ static spret_type _do_cast(spell_type spell, int powc, case SPELL_CONJURE_FLAME: return conjure_flame(powc, beam.target, fail); + case SPELL_WIND_WALL: + return cast_wind_wall(powc, target, fail); + + case SPELL_WIND_SHIELD: + return cast_wind_shield(powc, fail); + case SPELL_PASSWALL: return cast_passwall(spd.delta, powc, fail); diff --git a/crawl-ref/source/spl-clouds.cc b/crawl-ref/source/spl-clouds.cc index 643eed6..71839ab 100644 --- a/crawl-ref/source/spl-clouds.cc +++ b/crawl-ref/source/spl-clouds.cc @@ -252,6 +252,18 @@ spret_type cast_ring_of_flames(int power, bool fail) return SPRET_ABORT; } + if (you.duration[DUR_WIND_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + + if (you.duration[DUR_WIND_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + fail_check(); did_god_conduct(DID_FIRE, min(5 + power/5, 50)); you.increase_duration(DUR_FIRE_SHIELD, @@ -551,3 +563,62 @@ spret_type cast_cloud_cone(const actor *caster, int pow, const coord_def &pos, return SPRET_SUCCESS; } + +spret_type cast_wind_wall(int pow, const coord_def& target, bool fail) +{ + fail_check(); + + const int duration = min(5 + (random2(pow)/2) + (random2(pow)/2), 23); + + for (adjacent_iterator ai(you.pos()); ai; ++ai) + if (distance2(*ai, target) <= 1 && !cell_is_solid(*ai) + && env.cgrid(*ai) == EMPTY_CLOUD) + { + place_cloud(CLOUD_GUST, *ai, duration, &you); + } + + return SPRET_SUCCESS; +} + +spret_type cast_wind_shield(int power, bool fail) +{ + if (you.duration[DUR_FIRE_SHIELD] || you.duration[DUR_TORNADO]) + { + mpr("The air around you is already under your control."); + return SPRET_ABORT; + } + + fail_check(); + you.increase_duration(DUR_WIND_SHIELD, + 5 + (power / 10) + (random2(power) / 5), 50, + "The air around you churns!"); + manage_wind_shield(1); + return SPRET_SUCCESS; +} + +void manage_wind_shield(int delay) +{ + ASSERT(you.duration[DUR_WIND_SHIELD]); + + int old_dur = you.duration[DUR_WIND_SHIELD]; + + you.duration[DUR_WIND_SHIELD] -= delay; + if (you.duration[DUR_WIND_SHIELD] < 0) + you.duration[DUR_WIND_SHIELD] = 0; + + if (!you.duration[DUR_WIND_SHIELD]) + { + mprf(MSGCH_DURATION, "The winds around you subside."); + return; + } + + int threshold = get_expiration_threshold(DUR_WIND_SHIELD); + + if (old_dur > threshold && you.duration[DUR_WIND_SHIELD] < threshold) + mprf(MSGCH_DURATION, "Your shield of winds is calming down."); + + // Place gust clouds all around you in a + for (radius_iterator ri(you.pos(), 2, C_ROUND, LOS_SOLID); ri; ++ri) + if (!cell_is_solid(*ri) && env.cgrid(*ri) == EMPTY_CLOUD) + place_cloud(CLOUD_GUST, *ri, 1 + random2(6), &you); +} diff --git a/crawl-ref/source/spl-clouds.h b/crawl-ref/source/spl-clouds.h index 5028c65..501771e 100644 --- a/crawl-ref/source/spl-clouds.h +++ b/crawl-ref/source/spl-clouds.h @@ -27,4 +27,8 @@ void apply_control_winds(const monster* mon); spret_type cast_cloud_cone(const actor *caster, int pow, const coord_def &pos, bool fail = false); +spret_type cast_wind_wall(int power, const coord_def& where, bool fail); +spret_type cast_wind_shield(int power, bool fail); +void manage_wind_shield(int delay); + #endif diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index 09da985..a4f161b 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -3675,6 +3675,19 @@ struct spell_desc }, { + SPELL_WIND_WALL, "Wind Wall", + SPTYP_CHARMS | SPTYP_AIR, + SPFLAG_DIR | SPFLAG_NOT_SELF, + 2, + 50, + 1, 1, + 0, + NULL, + false, + false +}, + +{ SPELL_WEAVE_SHADOWS, "Weave Shadows", SPTYP_SUMMONING, SPFLAG_NONE, @@ -3753,6 +3766,19 @@ struct spell_desc }, { + SPELL_WIND_SHIELD, "Wind Shield", + SPTYP_CHARMS | SPTYP_AIR, + SPFLAG_AREA, + 5, + 200, + -1, -1, + 0, + NULL, + false, + false +}, + +{ SPELL_NO_SPELL, "nonexistent spell", 0, SPFLAG_TESTING, diff --git a/crawl-ref/source/spl-tornado.cc b/crawl-ref/source/spl-tornado.cc index eb49d25..00a8fbb 100644 --- a/crawl-ref/source/spl-tornado.cc +++ b/crawl-ref/source/spl-tornado.cc @@ -144,6 +144,17 @@ spret_type cast_tornado(int powc, bool fail) if (you.fishtail) merfolk_stop_swimming(); + if (you.duration[DUR_FIRE_SHIELD]) + { + you.duration[DUR_FIRE_SHIELD] = 0; + mprf(MSGCH_DURATION, "Your ring of flames gutters out."); + } + + if (you.duration[DUR_WIND_SHIELD]) + { + you.duration[DUR_WIND_SHIELD] = 0; + } + you.props["tornado_since"].get_int() = you.elapsed_time; _set_tornado_durations(powc); if (you.species == SP_TENGU) diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index 7ae20a3..799e86f 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -1229,6 +1229,7 @@ bool spell_no_hostile_in_range(spell_type spell) case SPELL_LRD: case SPELL_FULMINANT_PRISM: case SPELL_SUMMON_LIGHTNING_SPIRE: + case SPELL_WIND_WALL: // Shock and Lightning Bolt are no longer here, as the code below can // account for possible bounces. diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc index ccdb87e..24d2a3f 100644 --- a/crawl-ref/source/status.cc +++ b/crawl-ref/source/status.cc @@ -167,6 +167,8 @@ static duration_def duration_data[] = RED, "Dragoncall", "", "" }, { DUR_ABJURATION_AURA, false, BLUE, "Abj", "aura of abjuration", "You are abjuring all hostile summons around you." }, + { DUR_WIND_SHIELD, true, + LIGHTGREY, "Winds", "wind shield", "You are surrounded by blustery winds." }, }; static int duration_index[NUM_DURATIONS]; diff --git a/crawl-ref/source/wiz-you.cc b/crawl-ref/source/wiz-you.cc index 7a862b1..a934c2a 100644 --- a/crawl-ref/source/wiz-you.cc +++ b/crawl-ref/source/wiz-you.cc @@ -878,6 +878,7 @@ static const char* dur_names[] = "dragon call cooldown", "aura of abjuration", "mesmerisation immunity", + "wind shield" }; void wizard_edit_durations(void) -- 1.7.9.5 |
|||||||||||
|
Mantis 1.1.8[^] Copyright © 2000 - 2009 Mantis Group |