summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJude Brown <bookofjude@users.sourceforge.net>2010-01-10 17:38:30 +1000
committerJude Brown <bookofjude@users.sourceforge.net>2010-01-10 18:39:03 +1000
commit28adee417435dac7697fb385b13e560084d170db (patch)
tree8f2e68ba101c5d85f37454a9c805a4f94be57d38
parent958627e9c8f506c7183eac5dd05e89d41d62e759 (diff)
downloadcrawl-ref-28adee417435dac7697fb385b13e560084d170db.tar.gz
crawl-ref-28adee417435dac7697fb385b13e560084d170db.zip
New type of cloud: thick gloom.
It's a fast-moving, long-lasting cloud that clumps together. It will dissipate very quickly unless it is near other clouds. It is opaque, and blocks line of sight with two or more clouds, but unlike other clouds, it does not actually use the '#' glyph. Instead, it colours the ground underneath it magenta. It's currently unused, and while it's an interesting visual effect that will have some great potential in portal vaults and specific branches, should probably be used very rarely. Also includes a tile for these, though I'm not too happy with the effect.
-rw-r--r--crawl-ref/source/beam.cc1
-rw-r--r--crawl-ref/source/cloud.cc27
-rw-r--r--crawl-ref/source/enum.h4
-rw-r--r--crawl-ref/source/godabil.cc20
-rw-r--r--crawl-ref/source/mon-act.cc8
-rw-r--r--crawl-ref/source/rltiles/dc-misc.txt2
-rw-r--r--crawl-ref/source/rltiles/effect/cloud_gloom.pngbin0 -> 177 bytes
-rw-r--r--crawl-ref/source/show.cc6
-rw-r--r--crawl-ref/source/tilepick.cc4
9 files changed, 70 insertions, 2 deletions
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 36c47d85b8..49b464b608 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -6396,6 +6396,7 @@ std::string beam_type_name(beam_type type)
case BEAM_VISUAL: return ("visual effects");
case BEAM_TORMENT_DAMAGE: return ("torment damage");
case BEAM_STEAL_FOOD: return ("steal food");
+ case BEAM_GLOOM: return ("gloom");
case NUM_BEAMS: DEBUGSTR("invalid beam type");
return ("INVALID");
diff --git a/crawl-ref/source/cloud.cc b/crawl-ref/source/cloud.cc
index 823164846d..d4c35f363c 100644
--- a/crawl-ref/source/cloud.cc
+++ b/crawl-ref/source/cloud.cc
@@ -41,6 +41,8 @@ static int _actual_spread_rate(cloud_type type, int spread_rate)
switch (type)
{
+ case CLOUD_GLOOM:
+ return 50;
case CLOUD_STEAM:
case CLOUD_GREY_SMOKE:
case CLOUD_BLACK_SMOKE:
@@ -227,6 +229,19 @@ void manage_clouds()
dissipate *= 4;
else if ((cloud.type == CLOUD_COLD || cloud.type == CLOUD_RAIN) && grd(cloud.pos) == DNGN_LAVA)
dissipate *= 4;
+ else if (cloud.type == CLOUD_GLOOM)
+ {
+ int count = 0;
+ for (adjacent_iterator ai(cloud.pos); ai; ++ai)
+ if (env.cgrid(*ai) != EMPTY_CLOUD)
+ if (env.cloud[env.cgrid(*ai)].type == CLOUD_GLOOM)
+ count++;
+
+ if (count < 4)
+ dissipate *= 50;
+ else
+ dissipate /= 20;
+ }
expose_items_to_element(cloud2beam(cloud.type), cloud.pos, 2);
@@ -514,6 +529,8 @@ cloud_type beam2cloud(beam_type flavour)
return CLOUD_RAIN;
case BEAM_POTION_MUTAGENIC:
return CLOUD_MUTAGENIC;
+ case BEAM_GLOOM:
+ return CLOUD_GLOOM;
case BEAM_RANDOM:
return CLOUD_RANDOM;
}
@@ -539,6 +556,7 @@ beam_type cloud2beam(cloud_type flavour)
case CLOUD_CHAOS: return BEAM_CHAOS;
case CLOUD_RAIN: return BEAM_POTION_RAIN;
case CLOUD_MUTAGENIC: return BEAM_POTION_MUTAGENIC;
+ case CLOUD_GLOOM: return BEAM_GLOOM;
case CLOUD_RANDOM: return BEAM_RANDOM;
}
}
@@ -833,6 +851,11 @@ void in_a_cloud()
}
break;
+ case CLOUD_GLOOM:
+ mprf("You are engulfed in %s!", !name.empty() ? name.c_str() : "a thick gloom");
+
+ break;
+
default:
break;
}
@@ -887,6 +910,7 @@ bool is_harmless_cloud(cloud_type type)
case CLOUD_MIST:
case CLOUD_RAIN:
case CLOUD_MAGIC_TRAIL:
+ case CLOUD_GLOOM:
case CLOUD_DEBUGGING:
return (true);
default:
@@ -963,6 +987,8 @@ std::string cloud_name(cloud_type type)
return "mutagenic fog";
case CLOUD_MAGIC_TRAIL:
return "magical condensation";
+ case CLOUD_GLOOM:
+ return "gloom";
default:
return "buggy goodness";
}
@@ -1078,6 +1104,7 @@ int get_cloud_colour(int cloudno)
case CLOUD_PURPLE_SMOKE:
case CLOUD_TLOC_ENERGY:
+ case CLOUD_GLOOM:
which_colour = MAGENTA;
break;
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index 90b38b78ae..622cee97ad 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -254,6 +254,7 @@ enum beam_type // beam[].flavour
BEAM_POTION_BLUE_SMOKE,
BEAM_POTION_PURPLE_SMOKE,
BEAM_POTION_RAIN,
+ BEAM_GLOOM,
BEAM_POTION_RANDOM,
BEAM_LAST_REAL = BEAM_POTION_RANDOM,
@@ -420,9 +421,10 @@ enum cloud_type
CLOUD_TLOC_ENERGY,
CLOUD_FOREST_FIRE,
CLOUD_STEAM,
+ CLOUD_GLOOM,
CLOUD_OPAQUE_FIRST = CLOUD_BLACK_SMOKE,
- CLOUD_OPAQUE_LAST = CLOUD_STEAM,
+ CLOUD_OPAQUE_LAST = CLOUD_GLOOM,
CLOUD_MIASMA,
CLOUD_MIST,
diff --git a/crawl-ref/source/godabil.cc b/crawl-ref/source/godabil.cc
index f6a1d82c1d..07b6fd42aa 100644
--- a/crawl-ref/source/godabil.cc
+++ b/crawl-ref/source/godabil.cc
@@ -536,6 +536,9 @@ bool sunlight()
int plant_count = 0;
int processed_count = 0;
+ // This is dealt with outside of the main loop.
+ int cloud_count = 0;
+
// FIXME: Uncomfortable level of code duplication here but the explosion
// code in bolt subjects the input radius to r*(r+1) for the threshold and
// since r is an integer we can never get just the 4-connected neighbours.
@@ -634,6 +637,20 @@ bool sunlight()
}
}
+ // We damage clousd for a large radius, though.
+ for (radius_iterator ai(base, 7); ai; ++ai)
+ {
+ if (env.cgrid(*ai) != EMPTY_CLOUD)
+ {
+ const int cloudidx = env.cgrid(*ai);
+ if (env.cloud[cloudidx].type == CLOUD_GLOOM)
+ {
+ cloud_count++;
+ delete_cloud(cloudidx);
+ }
+ }
+ }
+
#ifndef USE_TILE
// Move the cursor out of the way (it looks weird).
cgotoxy(base.x, base.y, GOTO_DNGN);
@@ -650,6 +667,9 @@ bool sunlight()
if (evap_count)
mprf("Some water evaporates in the bright sunlight.");
+ if (cloud_count)
+ mprf("Sunlight penetrates the thick gloom.");
+
return (processed_count);
}
diff --git a/crawl-ref/source/mon-act.cc b/crawl-ref/source/mon-act.cc
index 2065414df9..4120508703 100644
--- a/crawl-ref/source/mon-act.cc
+++ b/crawl-ref/source/mon-act.cc
@@ -44,6 +44,7 @@
#include "random.h"
#include "religion.h"
#include "shopping.h" // for item values
+#include "spells1.h"
#include "state.h"
#include "stuff.h"
#include "terrain.h"
@@ -3454,6 +3455,13 @@ static bool _monster_move(monsters *monster)
2 + random2(3), monster->kill_alignment(),
KILL_MON_MISSILE );
}
+
+ // Commented out, but left in as an example of gloom. {due}
+ //if (monster->type == MONS_SHADOW)
+ //{
+ // big_cloud (CLOUD_GLOOM, monster->kill_alignment(), monster->pos(), 10 + random2(5), 2 + random2(8));
+ //}
+
}
else
{
diff --git a/crawl-ref/source/rltiles/dc-misc.txt b/crawl-ref/source/rltiles/dc-misc.txt
index 92329d2dd8..8050483dcd 100644
--- a/crawl-ref/source/rltiles/dc-misc.txt
+++ b/crawl-ref/source/rltiles/dc-misc.txt
@@ -42,6 +42,8 @@ cloud_rain1 CLOUD_RAIN
cloud_rain2
cloud_grey_smoke CLOUD_MIST
+cloud_gloom CLOUD_GLOOM
+
#########MAP
%sdir dc-misc
%corpse 0
diff --git a/crawl-ref/source/rltiles/effect/cloud_gloom.png b/crawl-ref/source/rltiles/effect/cloud_gloom.png
new file mode 100644
index 0000000000..914e500a3c
--- /dev/null
+++ b/crawl-ref/source/rltiles/effect/cloud_gloom.png
Binary files differ
diff --git a/crawl-ref/source/show.cc b/crawl-ref/source/show.cc
index 0148d92438..342c424dcd 100644
--- a/crawl-ref/source/show.cc
+++ b/crawl-ref/source/show.cc
@@ -272,7 +272,11 @@ void show_def::_update_cloud(int cloudno)
const coord_def e = grid2show(env.cloud[cloudno].pos);
int which_colour = get_cloud_colour(cloudno);
_set_backup(e);
- grid(e).cls = SH_CLOUD;
+ if (env.cloud[cloudno].type != CLOUD_GLOOM)
+ {
+ grid(e).cls = SH_CLOUD;
+ }
+
grid(e).colour = which_colour;
#ifdef USE_TILE
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index 9e5b4fd390..913c7855b5 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -2796,6 +2796,10 @@ static int _tileidx_cloud(cloud_struct cl)
ch = TILE_CLOUD_RAIN + random2(tile_main_count(TILE_CLOUD_RAIN));
break;
+ case CLOUD_GLOOM:
+ ch = TILE_CLOUD_GLOOM;
+ break;
+
default:
ch = TILE_CLOUD_GREY_SMOKE;
break;