Skip to content

Commit

Permalink
Shift: Tornado (L9 Air) -> Polar Vortex (L9 Ice)
Browse files Browse the repository at this point in the history
Ice, as a school, is intended to be 'diffuse' and 'subtle', With a
few exceptions (i.e. Freeze), it tends to be best at dealing damage
gradually to many enemies. That provides it with a distinctive
playstyle, and Tornado fits that playstyle perfectly.

As such, we'll shift Tornado to be the new level 9 Ice spell.
Subsequent commits will discuss the removal of Absolute Zero and the
new level 9 Air spell further.

Functionally, the main change here is that Polar Vortex does 33% more
damage (3 more dice) but is 40% resistable by rC, as with Hailstorm.
Otherwise, it's the same spell.
  • Loading branch information
PleasingFungus committed Jun 10, 2021
1 parent 4220d81 commit 7141f64
Show file tree
Hide file tree
Showing 54 changed files with 220 additions and 202 deletions.
2 changes: 1 addition & 1 deletion crawl-ref/source/Makefile.obj
Expand Up @@ -222,9 +222,9 @@ spl-other.o \
spl-pick.o \
spl-selfench.o \
spl-summoning.o \
spl-tornado.o \
spl-transloc.o \
spl-util.o \
spl-vortex.o \
spl-wpnench.o \
spl-zap.o \
sprint.o \
Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/actor.h
Expand Up @@ -303,7 +303,7 @@ class actor
virtual int res_holy_energy() const = 0;
virtual int res_negative_energy(bool intrinsic_only = false) const = 0;
virtual bool res_torment() const = 0;
virtual bool res_tornado() const = 0;
virtual bool res_polar_vortex() const = 0;
virtual bool res_petrify(bool temp = true) const = 0;
virtual int res_constrict() const = 0;
virtual int willpower(bool calc_unid = true) const = 0;
Expand Down
4 changes: 2 additions & 2 deletions crawl-ref/source/book-data.h
Expand Up @@ -92,7 +92,7 @@ static const vector<spell_type> spellbook_templates[] =
SPELL_DISCHARGE,
SPELL_LIGHTNING_BOLT,
SPELL_IGNITION,
SPELL_TORNADO,
SPELL_POLAR_VORTEX,
SPELL_SHATTER,
},

Expand Down Expand Up @@ -180,7 +180,6 @@ static const vector<spell_type> spellbook_templates[] =
SPELL_SILENCE,
SPELL_CONJURE_BALL_LIGHTNING,
SPELL_STORM_FORM,
SPELL_TORNADO,
},

{ // Book of the Warp
Expand Down Expand Up @@ -328,6 +327,7 @@ static const vector<spell_type> spellbook_templates[] =
SPELL_CHAIN_LIGHTNING,
SPELL_LEHUDIBS_CRYSTAL_SPEAR,
SPELL_ABSOLUTE_ZERO,
SPELL_POLAR_VORTEX,
SPELL_FIRE_STORM,
},

Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/cloud-type.h
Expand Up @@ -28,7 +28,7 @@ enum cloud_type
CLOUD_RAIN,
CLOUD_MUTAGENIC,
CLOUD_MAGIC_TRAIL,
CLOUD_TORNADO,
CLOUD_VORTEX,
CLOUD_DUST,
CLOUD_SPECTRAL,
CLOUD_ACID,
Expand Down
31 changes: 16 additions & 15 deletions crawl-ref/source/cloud.cc
Expand Up @@ -225,9 +225,9 @@ static const cloud_data clouds[] = {
ETC_MAGIC, // colour
{ TILE_CLOUD_MAGIC_TRAIL, CTVARY_DUR }, // tile
},
// CLOUD_TORNADO,
{ "raging winds", nullptr, // terse, verbose name
ETC_TORNADO, // colour
// CLOUD_VORTEX,
{ "whirling frost", nullptr, // terse, verbose name
ETC_VORTEX, // colour
{ TILE_ERROR }, // tile
},
// CLOUD_DUST,
Expand Down Expand Up @@ -751,7 +751,7 @@ static bool _cloud_is_stronger(cloud_type ct, const cloud_struct& cloud)
return (is_harmless_cloud(cloud.type) &&
(!is_opaque_cloud(cloud.type) || is_opaque_cloud(ct)))
|| cloud.type == CLOUD_STEAM
|| ct == CLOUD_TORNADO; // soon gone
|| ct == CLOUD_VORTEX; // soon gone
}

/*
Expand Down Expand Up @@ -780,7 +780,7 @@ void place_cloud(cloud_type cl_type, const coord_def& ctarget, int cl_range,
return;

if (env.level_state & LSTATE_STILL_WINDS
&& cl_type != CLOUD_TORNADO
&& cl_type != CLOUD_VORTEX
&& cl_type != CLOUD_INK)
{
return;
Expand Down Expand Up @@ -978,8 +978,8 @@ bool actor_cloud_immune(const actor &act, cloud_type type)
return act.res_elec() >= 3;
case CLOUD_NEGATIVE_ENERGY:
return act.res_negative_energy() >= 3;
case CLOUD_TORNADO:
return act.res_tornado();
case CLOUD_VORTEX:
return act.res_polar_vortex();
case CLOUD_RAIN:
return !act.is_fiery();
default:
Expand Down Expand Up @@ -1441,8 +1441,8 @@ bool is_damaging_cloud(cloud_type type, bool accept_temp_resistances, bool yours
return false;

// A nasty hack; map_knowledge doesn't preserve whom the cloud belongs to.
if (type == CLOUD_TORNADO)
return !you.duration[DUR_TORNADO] && !you.duration[DUR_TORNADO_COOLDOWN];
if (type == CLOUD_VORTEX)
return !you.duration[DUR_VORTEX] && !you.duration[DUR_VORTEX_COOLDOWN];

if (accept_temp_resistances)
{
Expand Down Expand Up @@ -1587,7 +1587,7 @@ bool is_harmless_cloud(cloud_type type)
&& clouds[type].damage.base == 0
&& clouds[type].damage.random == 0
&& !_cloud_has_negative_side_effects(type)
&& type != CLOUD_TORNADO;
&& type != CLOUD_VORTEX;
}

string cloud_type_name(cloud_type type, bool terse)
Expand Down Expand Up @@ -1808,23 +1808,24 @@ coord_def get_cloud_originator(const coord_def& pos)
return agent->pos();
}

void remove_tornado_clouds(mid_t whose)
void remove_vortex_clouds(mid_t whose)
{
// Needed to clean up after the end of tornado cooldown, so we can again
// assume all "raging winds" clouds are harmful. This is needed only
// because map_knowledge doesn't preserve the knowledge about whom the
// cloud belongs to. If this changes, please remove this function. For
// example, this approach doesn't work if we ever make Tornado a monster
// spell (excluding immobile and mindless casters).
// XXX: this comment seems impossibly out of date? ^

// We can't iterate over env.cloud directly because delete_cloud
// will remove this cloud and invalidate our iterator.
vector<coord_def> tornados;
vector<coord_def> vortices;
for (auto& entry : env.cloud)
if (entry.second.type == CLOUD_TORNADO && entry.second.source == whose)
tornados.push_back(entry.first);
if (entry.second.type == CLOUD_VORTEX && entry.second.source == whose)
vortices.push_back(entry.first);

for (auto pos : tornados)
for (auto pos : vortices)
delete_cloud(pos);
}

Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/cloud.h
Expand Up @@ -61,7 +61,7 @@ bool cloud_is_yours_at(const coord_def &pos);

void delete_all_clouds();
void delete_cloud(coord_def p);
void remove_tornado_clouds(mid_t whose);
void remove_vortex_clouds(mid_t whose);
void move_cloud(coord_def src, coord_def newpos);
void swap_clouds(coord_def p1, coord_def p2);

Expand Down
8 changes: 4 additions & 4 deletions crawl-ref/source/colour.cc
Expand Up @@ -261,7 +261,7 @@ static int _etc_mangrove(int, const coord_def& loc)
return col == LIGHTGREEN ? BROWN : col;
}

bool get_tornado_phase(const coord_def& loc)
bool get_vortex_phase(const coord_def& loc)
{
coord_def center = get_cloud_originator(loc);
if (center.origin())
Expand All @@ -276,9 +276,9 @@ bool get_tornado_phase(const coord_def& loc)
}
}

static int _etc_tornado(int, const coord_def& loc)
static int _etc_vortex(int, const coord_def& loc)
{
const bool phase = get_tornado_phase(loc);
const bool phase = get_vortex_phase(loc);
switch (env.grid(loc))
{
case DNGN_LAVA:
Expand Down Expand Up @@ -589,7 +589,7 @@ void init_element_colours()
ETC_MANGROVE, "mangrove", _etc_mangrove
));
add_element_colour(new element_colour_calc(
ETC_TORNADO, "tornado", _etc_tornado
ETC_VORTEX, "vortex", _etc_vortex
));
add_element_colour(new element_colour_calc(
ETC_LIQUEFIED, "liquefied", _etc_liquefied
Expand Down
4 changes: 2 additions & 2 deletions crawl-ref/source/colour.h
Expand Up @@ -50,7 +50,7 @@ enum element_type
ETC_WAVES, // cyan, with regularly occurring lightcyan waves
ETC_TREE, // colour of trees on land
ETC_RANDOM, // any colour (except BLACK)
ETC_TORNADO, // twisting swirls of grey
ETC_VORTEX, // twisting swirls of grey
ETC_LIQUEFIED, // ripples of yellow and brown.
ETC_MANGROVE, // colour of trees on water
ETC_ORB_GLOW, // halo coming from the Orb of Zot
Expand Down Expand Up @@ -120,7 +120,7 @@ colour_t make_high_colour(colour_t colour) IMMUTABLE;
int element_colour(int element, bool no_random = false,
const coord_def& loc = coord_def());
int get_disjunct_phase(const coord_def& loc);
bool get_tornado_phase(const coord_def& loc);
bool get_vortex_phase(const coord_def& loc);
bool get_orb_phase(const coord_def& loc);
int dam_colour(const monster_info&);
colour_t rune_colour(int type);
Expand Down
4 changes: 2 additions & 2 deletions crawl-ref/source/dat/des/sprint/arena_sprint.des
Expand Up @@ -578,7 +578,7 @@ function arena_sprint_get_monster_set(round, boss)
-- Aaaarggghhhhh!
"daeva / w:15 angel",
"royal mummy / mummy priest / guardian mummy",
"air elemental name:greater n_adj perm_ench:tornado col:lightcyan / air elemental w:20",
"air elemental name:greater n_adj perm_ench:polar_vortex col:lightcyan / air elemental w:20",
"iron golem hd:20 col:magenta name:orb_golem n_rpl n_des n_spe spells:orb_of_destruction.70.natural",
"brimstone fiend / ice fiend / tzitzimitl / executioner / hell sentinel",
"titan / spriggan air mage / blizzard demon / w:20 sky beast",
Expand Down Expand Up @@ -648,7 +648,7 @@ function arena_sprint_get_monster_set(round, boss)
-- Just die already!
"daeva",
"royal mummy / mummy priest",
"air elemental name:greater n_adj perm_ench:tornado col:lightcyan",
"air elemental name:greater n_adj perm_ench:polar_vortex col:lightcyan",
"iron golem hd:20 col:magenta name:orb_golem n_rpl n_des n_spe spells:orb_of_destruction.70.natural",
"brimstone fiend / ice fiend / tzitzimitl w:5 / hell sentinel",
"titan / spriggan air mage / blizzard demon",
Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/dat/des/variable/ghost.des
Expand Up @@ -1137,7 +1137,7 @@ SUBST: - = pt., S : GV A:1
COLOUR: .pO012345689de|*$ = green
FTILE: tGVA.pO012345689de|*$ = floor_moss
: end
# Don't burn down or tornado down these sacred trees
# Don't burn down or polar vortex down these sacred trees
MARKER: t = lua:props_marker { veto_destroy="veto" }
: ghost_setup(_G)
MAP
Expand Down
5 changes: 3 additions & 2 deletions crawl-ref/source/dat/descript/clouds.txt
Expand Up @@ -122,9 +122,10 @@ magical condensation cloud

The wake of some highly concentrated magical energy, itself entirely harmless.
%%%%
raging winds cloud
whirling frost cloud

The winds of a raging tornado. It will deal severe damage to anyone within it.
The winds of a polar vortex. It will deal severe damage to anyone within it,
only partially mitigated by resistance to cold.
%%%%
sparse dust cloud

Expand Down
24 changes: 12 additions & 12 deletions crawl-ref/source/dat/descript/spells.txt
Expand Up @@ -1100,6 +1100,16 @@ Poisonous Vapours spell
Turns the air around a targeted creature poisonous. Exceedingly little poison
is created, generally just enough to poison the target before dispersing.
%%%%
Polar Vortex spell

Turns the air around the caster into a freezing vortex, doing tremendous damage
to everyone caught in it that can only partially be mitigated by resistance to
cold. Those affected will also be swept up into the air and tossed around.
Only the eye of the storm is a safe place, and it follows the caster. The
vortex is unable to follow the caster through long-distance translocations.
The spell's effectiveness is greatly diminished in closed areas. After the
vortex fades, it cannot be called forth again for a short time.
%%%%
Polymorph spell

Randomly alters the form of a creature. It is especially effective against
Expand Down Expand Up @@ -1344,8 +1354,8 @@ for a short time.
Still Winds spell

Brings the air into unnatural stillness across a huge area, preventing anything
short of a tornado from breaking the calm. The effect takes concentration to
maintain, and only lasts a short time; if the caster is killed, clouds will
short of a polar vortex from breaking the calm. The effect takes concentration
to maintain, and only lasts a short time; if the caster is killed, clouds will
begin to form again as normal.
%%%%
Sting spell
Expand Down Expand Up @@ -1572,16 +1582,6 @@ Entombs the caster within walls of rock. These walls will push away objects in
their way, but their growth is obstructed by the presence of any creature. They
are not permanent, and will expire after a period of time.
%%%%
Tornado spell

Turns the air around the caster into a mighty vortex, doing tremendous damage
to everyone caught in it. Those affected will also be swept up into the air and
tossed around. Only the eye of the storm is a safe place, and it follows the
caster. The vortex is unable to follow the caster through long-distance
translocations. The spell's effectiveness is greatly diminished in closed
areas. After the tornado fades, it cannot be called forth again for a short
time.
%%%%
Trog's Hand spell

<Trog's Hand ability>
Expand Down
8 changes: 4 additions & 4 deletions crawl-ref/source/dat/descript/status.txt
Expand Up @@ -314,14 +314,14 @@ Mirror status
You are reflecting any damage taken to your attackers, reducing piety depending
on the amount of damage dealt.
%%%%
Tornado status
Vortex status

You are in the eye of a mighty hurricane. After the tornado fades, it cannot be
You are in the eye of a mighty ice storm. After the vortex fades, it cannot be
called forth again for a short time.
%%%%
-Tornado status
-Vortex status

You are surrounded by unstable winds, and cannot recast Tornado for a short
You are surrounded by unstable winds, and cannot recast Polar Vortex for a short
duration.
%%%%
Liquid status
Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/dat/vim/syntax/levdes.vim
Expand Up @@ -154,7 +154,7 @@ syn keyword desColour contained death unholy vehumet beogh crystal blood smoke
syn keyword desColour contained slime jewel elven dwarven orcish flash kraken
syn keyword desColour contained floor rock mist shimmer_blue decay silver gold
syn keyword desColour contained iron bone elven_brick waves tree mangrove
syn keyword desColour contained tornado liquefied orb_glow disjunction random
syn keyword desColour contained vortex liquefied orb_glow disjunction random

" TILE
syn keyword desOrientation no_random
Expand Down
2 changes: 1 addition & 1 deletion crawl-ref/source/defines.h
Expand Up @@ -185,7 +185,7 @@ const int UNUSABLE_SKILL = -99;

const int AGILITY_BONUS = 5;

#define TORNADO_RADIUS 5
#define POLAR_VORTEX_RADIUS 5
#define VORTEX_RADIUS 3

#define VAULTS_ENTRY_RUNES 1
Expand Down
8 changes: 4 additions & 4 deletions crawl-ref/source/describe.cc
Expand Up @@ -3697,8 +3697,8 @@ static const char* _get_resist_name(mon_resist_flags res_type)
return "negative energy";
case MR_RES_DAMNATION:
return "damnation";
case MR_RES_TORNADO:
return "tornadoes";
case MR_RES_VORTEX:
return "polar vortexes";
default:
return "buggy resistance";
}
Expand Down Expand Up @@ -4343,7 +4343,7 @@ static string _monster_stat_description(const monster_info& mi)
MR_RES_ELEC, MR_RES_POISON, MR_RES_FIRE,
MR_RES_STEAM, MR_RES_COLD, MR_RES_ACID,
MR_RES_MIASMA, MR_RES_NEG, MR_RES_DAMNATION,
MR_RES_TORNADO,
MR_RES_VORTEX,
};

vector<string> extreme_resists;
Expand All @@ -4358,7 +4358,7 @@ static string _monster_stat_description(const monster_info& mi)
if (level != 0)
{
const char* attackname = _get_resist_name(rflags);
if (rflags == MR_RES_DAMNATION || rflags == MR_RES_TORNADO)
if (rflags == MR_RES_DAMNATION || rflags == MR_RES_VORTEX)
level = 3; // one level is immunity
level = max(level, -1);
level = min(level, 3);
Expand Down
18 changes: 9 additions & 9 deletions crawl-ref/source/duration-data.h
Expand Up @@ -318,10 +318,10 @@ static const duration_def duration_data[] =
"mirroring injuries", "mirror damage",
"You mirror injuries.", D_NO_FLAGS,
{{ "Your dark mirror aura disappears." }}},
{ DUR_TORNADO,
LIGHTGREY, "Tornado",
"in a tornado", "tornado",
"You are in the eye of a mighty hurricane.", D_EXPIRES},
{ DUR_VORTEX,
LIGHTGREY, "Vortex",
"in a vortex", "vortex",
"You are in the eye of a polar vortex.", D_EXPIRES},
{ DUR_LIQUEFYING,
LIGHTBLUE, "Liquid",
"liquefying", "",
Expand All @@ -344,12 +344,12 @@ static const duration_def duration_data[] =
"divinely protected", "lifesaving",
"You are calling for your life to be saved.", D_EXPIRES,
{{ "Your divine protection fades away." }}},
{ DUR_TORNADO_COOLDOWN,
YELLOW, "-Tornado",
"on tornado cooldown", "tornado cooldown",
"You are unable to create a tornado.", D_NO_FLAGS,
{ DUR_VORTEX_COOLDOWN,
YELLOW, "-Vortex",
"on vortex cooldown", "vortex cooldown",
"You are unable to create a polar vortex.", D_NO_FLAGS,
{{ "The winds around you calm down.", []() {
remove_tornado_clouds(MID_PLAYER);
remove_vortex_clouds(MID_PLAYER);
}}}},
{ DUR_DISJUNCTION,
BLUE, "Disjoin",
Expand Down

0 comments on commit 7141f64

Please sign in to comment.