summaryrefslogtreecommitdiffstats
path: root/crawl-ref/source
diff options
context:
space:
mode:
authorDracoOmega <draco_omega@live.com>2014-02-13 22:01:47 -0330
committerDracoOmega <draco_omega@live.com>2014-02-13 22:01:47 -0330
commit8b692751aca0bde2d58bdba056c6b94661c3011b (patch)
treed1bc81cf4af2cd5462fc563525b7d9da8a620e87 /crawl-ref/source
parent230ef3e62244bdff6adcb585676b0469e80f8b10 (diff)
parentb78098f4675f43661c4eadc0437d3c15462a63e2 (diff)
downloadcrawl-ref-8b692751aca0bde2d58bdba056c6b94661c3011b.tar.gz
crawl-ref-8b692751aca0bde2d58bdba056c6b94661c3011b.zip
Merge branch 'master' into summon_spells
Conflicts: crawl-ref/source/enum.h crawl-ref/source/spl-data.h crawl-ref/source/spl-summoning.cc
Diffstat (limited to 'crawl-ref/source')
-rw-r--r--crawl-ref/source/ability.cc44
-rw-r--r--crawl-ref/source/ability.h5
-rw-r--r--crawl-ref/source/areas.cc4
-rw-r--r--crawl-ref/source/art-data.txt20
-rw-r--r--crawl-ref/source/art-func.h64
-rw-r--r--crawl-ref/source/artefact.cc9
-rw-r--r--crawl-ref/source/beam.cc11
-rw-r--r--crawl-ref/source/colour.cc2
-rw-r--r--crawl-ref/source/colour.h2
-rw-r--r--crawl-ref/source/dat/database/godspeak.txt8
-rw-r--r--crawl-ref/source/dat/database/monspeak.txt4
-rw-r--r--crawl-ref/source/dat/des/altar/overflow.des20
-rw-r--r--crawl-ref/source/dat/des/branches/swamp.des1
-rw-r--r--crawl-ref/source/dat/des/branches/vaults.des1555
-rw-r--r--crawl-ref/source/dat/des/builder/layout.des2
-rw-r--r--crawl-ref/source/dat/des/builder/layout_caves.des44
-rw-r--r--crawl-ref/source/dat/des/portals/icecave.des8
-rw-r--r--crawl-ref/source/dat/des/portals/lab.des2
-rw-r--r--crawl-ref/source/dat/des/portals/trove.des18
-rw-r--r--crawl-ref/source/dat/des/sprint/arena_sprint.des2
-rw-r--r--crawl-ref/source/dat/des/sprint/fedhas.des2
-rw-r--r--crawl-ref/source/dat/des/sprint/menkaure.des2
-rw-r--r--crawl-ref/source/dat/des/sprint/pitsprint.des2
-rw-r--r--crawl-ref/source/dat/des/sprint/sprint_mu.des2
-rw-r--r--crawl-ref/source/dat/des/sprint/zigsprint.des2
-rw-r--r--crawl-ref/source/dat/des/variable/cathedral_bats.des14
-rw-r--r--crawl-ref/source/dat/descript/ability.txt2
-rw-r--r--crawl-ref/source/dat/descript/features.txt4
-rw-r--r--crawl-ref/source/dat/descript/gods.txt20
-rw-r--r--crawl-ref/source/dat/descript/spells.txt16
-rw-r--r--crawl-ref/source/dat/descript/unrand.txt11
-rw-r--r--crawl-ref/source/describe.cc96
-rw-r--r--crawl-ref/source/directn.cc4
-rw-r--r--crawl-ref/source/enum.h32
-rw-r--r--crawl-ref/source/exercise.cc4
-rw-r--r--crawl-ref/source/feature.cc2
-rw-r--r--crawl-ref/source/fight.cc4
-rw-r--r--crawl-ref/source/godabil.cc59
-rw-r--r--crawl-ref/source/godabil.h8
-rw-r--r--crawl-ref/source/godconduct.cc18
-rw-r--r--crawl-ref/source/goditem.cc4
-rw-r--r--crawl-ref/source/godwrath.cc16
-rw-r--r--crawl-ref/source/hints.cc6
-rw-r--r--crawl-ref/source/item_use.cc4
-rw-r--r--crawl-ref/source/main.cc14
-rw-r--r--crawl-ref/source/melee_attack.cc2
-rw-r--r--crawl-ref/source/mgen_enum.h2
-rw-r--r--crawl-ref/source/mon-abil.cc60
-rw-r--r--crawl-ref/source/mon-behv.cc84
-rw-r--r--crawl-ref/source/mon-behv.h2
-rw-r--r--crawl-ref/source/mon-cast.cc30
-rw-r--r--crawl-ref/source/mon-data.h78
-rw-r--r--crawl-ref/source/mon-gear.cc7
-rw-r--r--crawl-ref/source/mon-info.cc2
-rw-r--r--crawl-ref/source/mon-info.h1
-rw-r--r--crawl-ref/source/mon-pick-data.h7
-rw-r--r--crawl-ref/source/mon-place.cc7
-rw-r--r--crawl-ref/source/mon-spll.h8
-rw-r--r--crawl-ref/source/mon-stuff.cc4
-rw-r--r--crawl-ref/source/mon-util.cc16
-rw-r--r--crawl-ref/source/mon-util.h13
-rw-r--r--crawl-ref/source/monster.cc7
-rw-r--r--crawl-ref/source/mutation.cc2
-rw-r--r--crawl-ref/source/newgame.cc31
-rw-r--r--crawl-ref/source/ouch.cc2
-rw-r--r--crawl-ref/source/player-equip.cc4
-rw-r--r--crawl-ref/source/player.cc33
-rw-r--r--crawl-ref/source/religion.cc110
-rw-r--r--crawl-ref/source/rltiles/dc-feat.txt6
-rw-r--r--crawl-ref/source/rltiles/dc-invocations.txt4
-rw-r--r--crawl-ref/source/rltiles/dc-player.txt2
-rw-r--r--crawl-ref/source/rltiles/dngn/altars/dithmenos.png (renamed from crawl-ref/source/rltiles/dngn/altars/dithmengos.png)bin354 -> 354 bytes
-rw-r--r--crawl-ref/source/rltiles/dngn/altars/dithmenos2.png (renamed from crawl-ref/source/rltiles/dngn/altars/dithmengos2.png)bin352 -> 352 bytes
-rw-r--r--crawl-ref/source/rltiles/dngn/altars/dithmenos3.png (renamed from crawl-ref/source/rltiles/dngn/altars/dithmengos3.png)bin352 -> 352 bytes
-rw-r--r--crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_form.png (renamed from crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_form.png)bin746 -> 746 bytes
-rw-r--r--crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_step.png (renamed from crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_step.png)bin814 -> 814 bytes
-rw-r--r--crawl-ref/source/rltiles/item/armour/artefact/urand_gong.pngbin537 -> 676 bytes
-rw-r--r--crawl-ref/source/rltiles/item/weapon/artefact/urand_arc_blade.pngbin0 -> 244 bytes
-rw-r--r--crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.pngbin0 -> 687 bytes
-rw-r--r--crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.pngbin0 -> 186 bytes
-rw-r--r--crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.pngbin0 -> 205 bytes
-rw-r--r--crawl-ref/source/rltiles/player/hand2/shield_gong.pngbin213 -> 469 bytes
-rw-r--r--crawl-ref/source/shout.cc4
-rw-r--r--crawl-ref/source/spl-cast.cc7
-rw-r--r--crawl-ref/source/spl-data.h26
-rw-r--r--crawl-ref/source/spl-goditem.cc4
-rw-r--r--crawl-ref/source/spl-miscast.cc2
-rw-r--r--crawl-ref/source/spl-monench.cc3
-rw-r--r--crawl-ref/source/spl-selfench.cc16
-rw-r--r--crawl-ref/source/spl-summoning.cc52
-rw-r--r--crawl-ref/source/spl-summoning.h1
-rw-r--r--crawl-ref/source/status.cc12
-rw-r--r--crawl-ref/source/tag-version.h1
-rw-r--r--crawl-ref/source/tags.cc24
-rw-r--r--crawl-ref/source/target.cc4
-rw-r--r--crawl-ref/source/terrain.cc2
-rw-r--r--crawl-ref/source/throw.cc4
-rw-r--r--crawl-ref/source/tilepick.cc14
-rw-r--r--crawl-ref/source/tileweb.cc2
-rw-r--r--crawl-ref/source/webserver/static/scripts/client.js5
100 files changed, 1679 insertions, 1201 deletions
diff --git a/crawl-ref/source/ability.cc b/crawl-ref/source/ability.cc
index b8186e24fa..2cd0e36865 100644
--- a/crawl-ref/source/ability.cc
+++ b/crawl-ref/source/ability.cc
@@ -191,9 +191,9 @@ ability_type god_abilities[NUM_GODS][MAX_GOD_ABILITIES] =
// Ashenzari
{ ABIL_NON_ABILITY, ABIL_NON_ABILITY, ABIL_NON_ABILITY,
ABIL_ASHENZARI_SCRYING, ABIL_ASHENZARI_TRANSFER_KNOWLEDGE },
- // Dithmengos
- { ABIL_NON_ABILITY, ABIL_DITHMENGOS_SHADOW_STEP, ABIL_NON_ABILITY,
- ABIL_NON_ABILITY, ABIL_DITHMENGOS_SHADOW_FORM },
+ // Dithmenos
+ { ABIL_NON_ABILITY, ABIL_DITHMENOS_SHADOW_STEP, ABIL_NON_ABILITY,
+ ABIL_NON_ABILITY, ABIL_DITHMENOS_SHADOW_FORM },
};
// The description screen was way out of date with the actual costs.
@@ -401,10 +401,10 @@ static const ability_def Ability_List[] =
{ ABIL_ASHENZARI_END_TRANSFER, "End Transfer Knowledge",
0, 0, 0, 0, 0, ABFLAG_NONE},
- // Dithmengos
- { ABIL_DITHMENGOS_SHADOW_STEP, "Shadow Step",
+ // Dithmenos
+ { ABIL_DITHMENOS_SHADOW_STEP, "Shadow Step",
4, 0, 0, 4, 0, ABFLAG_NONE },
- { ABIL_DITHMENGOS_SHADOW_FORM, "Shadow Form",
+ { ABIL_DITHMENOS_SHADOW_FORM, "Shadow Form",
9, 0, 0, 10, 0, ABFLAG_SKILL_DRAIN },
{ ABIL_STOP_RECALL, "Stop Recall", 0, 0, 0, 0, 0, ABFLAG_NONE},
@@ -865,7 +865,7 @@ static ability_type _fixup_ability(ability_type ability)
else
return ability;
- case ABIL_DITHMENGOS_SHADOW_FORM:
+ case ABIL_DITHMENOS_SHADOW_FORM:
if (you.species == SP_MUMMY || you.species == SP_GHOUL)
return ABIL_NON_ABILITY;
else
@@ -1076,6 +1076,7 @@ talent get_talent(ability_type ability, bool check_confused)
case ABIL_LUGONU_ABYSS_EXIT:
case ABIL_FEDHAS_SUNLIGHT:
case ABIL_FEDHAS_EVOLUTION:
+ case ABIL_DITHMENOS_SHADOW_STEP:
invoc = true;
failure = 30 - (you.piety / 20) - you.skill(SK_INVOCATIONS, 6);
break;
@@ -1090,8 +1091,6 @@ talent get_talent(ability_type ability, bool check_confused)
case ABIL_JIYVA_CALL_JELLY:
case ABIL_JIYVA_CURE_BAD_MUTATION:
case ABIL_JIYVA_JELLY_PARALYSE:
- case ABIL_DITHMENGOS_SHADOW_STEP:
- case ABIL_DITHMENGOS_SHADOW_FORM:
case ABIL_STOP_RECALL:
invoc = true;
failure = 0;
@@ -1194,6 +1193,7 @@ talent get_talent(ability_type ability, bool check_confused)
case ABIL_ELYVILON_DIVINE_VIGOUR:
case ABIL_LUGONU_ABYSS_ENTER:
case ABIL_CHEIBRIADOS_TIME_STEP:
+ case ABIL_DITHMENOS_SHADOW_FORM:
invoc = true;
failure = 80 - (you.piety / 25) - you.skill(SK_INVOCATIONS, 4);
break;
@@ -2870,16 +2870,16 @@ static bool _do_ability(const ability_def& abil)
ashenzari_end_transfer();
break;
- case ABIL_DITHMENGOS_SHADOW_STEP:
- if (!dithmengos_shadow_step())
+ case ABIL_DITHMENOS_SHADOW_STEP:
+ if (!dithmenos_shadow_step())
{
canned_msg(MSG_OK);
return false;
}
break;
- case ABIL_DITHMENGOS_SHADOW_FORM:
- if (!transform(50, TRAN_SHADOW))
+ case ABIL_DITHMENOS_SHADOW_FORM:
+ if (!transform(you.skill(SK_INVOCATIONS, 2), TRAN_SHADOW))
{
crawl_state.zero_turns_taken();
return false;
@@ -3624,7 +3624,7 @@ static int _find_ability_slot(const ability_def &abil)
return -1;
}
-vector<ability_type> get_god_abilities(bool include_unusable)
+vector<ability_type> get_god_abilities(bool include_unusable, bool ignore_piety)
{
vector<ability_type> abilities;
if (you_worship(GOD_TROG) && (include_unusable || !silenced(you.pos())))
@@ -3650,7 +3650,7 @@ vector<ability_type> get_god_abilities(bool include_unusable)
for (int i = 0; i < MAX_GOD_ABILITIES; ++i)
{
- if (you.piety < piety_breakpoint(i))
+ if (you.piety < piety_breakpoint(i) && !ignore_piety)
continue;
const ability_type abil =
@@ -3685,20 +3685,6 @@ vector<ability_type> get_god_abilities(bool include_unusable)
return abilities;
}
-void gain_god_ability(int i)
-{
- you.start_train.insert(abil_skill(god_abilities[you.religion][i]));
- if (god_abilities[you.religion][i] == ABIL_TSO_DIVINE_SHIELD)
- you.start_train.insert(SK_SHIELDS);
-}
-
-void lose_god_ability(int i)
-{
- you.stop_train.insert(abil_skill(god_abilities[you.religion][i]));
- if (god_abilities[you.religion][i] == ABIL_TSO_DIVINE_SHIELD)
- you.stop_train.insert(SK_SHIELDS);
-}
-
////////////////////////////////////////////////////////////////////////
// generic_cost
diff --git a/crawl-ref/source/ability.h b/crawl-ref/source/ability.h
index 7058bdd2fa..a07ba12f4e 100644
--- a/crawl-ref/source/ability.h
+++ b/crawl-ref/source/ability.h
@@ -94,8 +94,7 @@ bool string_matches_ability_name(const string& key);
string print_abilities(void);
void set_god_ability_slots(void);
-vector<ability_type> get_god_abilities(bool include_unusable = false);
-void gain_god_ability(int i);
-void lose_god_ability(int i);
+vector<ability_type> get_god_abilities(bool include_unusable = false,
+ bool ignore_piety = false);
#endif
diff --git a/crawl-ref/source/areas.cc b/crawl-ref/source/areas.cc
index e41e5af161..5f954caf72 100644
--- a/crawl-ref/source/areas.cc
+++ b/crawl-ref/source/areas.cc
@@ -711,8 +711,8 @@ int player::umbra_radius2() const
{
int size = -1;
- if (religion == GOD_DITHMENGOS && piety >= piety_breakpoint(0)
- && !penance[GOD_DITHMENGOS])
+ if (religion == GOD_DITHMENOS && piety >= piety_breakpoint(0)
+ && !penance[GOD_DITHMENOS])
{
// Preserve the middle of old radii.
const int r = piety - 10;
diff --git a/crawl-ref/source/art-data.txt b/crawl-ref/source/art-data.txt
index 5cfe72e473..f2abf7ede4 100644
--- a/crawl-ref/source/art-data.txt
+++ b/crawl-ref/source/art-data.txt
@@ -1119,6 +1119,26 @@ PLUS: +2
BRAND: SPARM_ARCHMAGI
STEALTH: -20
+NAME: arc blade
+INSCRIP: discharge,
+OBJ: OBJ_WEAPONS/WPN_CUTLASS
+PLUS: +3/+5
+COLOUR: ETC_ELECTRICITY
+TILE: urand_arc_blade
+TILE_EQ: arc_blade
+BOOL: elec
+
+ENUM: SPELLBINDER
+NAME: demon whip "Spellbinder"
+OBJ: OBJ_WEAPONS/WPN_DEMON_WHIP
+BRAND: SPWPN_ANTIMAGIC
+PLUS: +3/+6
+COLOUR: ETC_ENCHANT
+TILE: urand_spellbinder
+TILE_EQ: spellbinder
+MAGIC: 30
+BOOL: evil
+
# This is the first of two amulets used to test suppression aura.
# Together, they confer every randart effect except for a few that are
# determined explicitly by checking whether a certain amulet is worn
diff --git a/crawl-ref/source/art-func.h b/crawl-ref/source/art-func.h
index b72151e43c..99a7ee7fef 100644
--- a/crawl-ref/source/art-func.h
+++ b/crawl-ref/source/art-func.h
@@ -940,3 +940,67 @@ static void _ELEMENTAL_STAFF_melee_effects(item_def* item, actor* attacker,
defender->name(DESC_THE).c_str());
defender->hurt(attacker, d);
}
+
+///////////////////////////////////////////////////
+
+static void _ARC_BLADE_equip(item_def *item, bool *show_msgs, bool unmeld)
+{
+ _equip_mpr(show_msgs, "The arc blade crackles to life.");
+}
+
+static void _ARC_BLADE_unequip(item_def *item, bool *show_msgs)
+{
+ _equip_mpr(show_msgs, "The arc blade stops crackling.");
+}
+
+static void _ARC_BLADE_melee_effects(item_def* weapon, actor* attacker,
+ actor* defender, bool mondied,
+ int dam)
+{
+ if (!mondied && one_chance_in(3))
+ cast_discharge(75 + random2avg(75, 2), false);
+}
+
+///////////////////////////////////////////////////
+
+static void _SPELLBINDER_melee_effects(item_def* weapon, actor* attacker,
+ actor* defender, bool mondied,
+ int dam)
+{
+ // Only cause miscasts if the target has magic to disrupt.
+ if ((defender->is_player()
+ || (defender->as_monster()->can_use_spells()
+ && !defender->as_monster()->is_priest()
+ && !mons_class_flag(defender->type, M_FAKE_SPELLS)))
+ && !mondied)
+ {
+ int school = SPTYP_NONE;
+ if (defender->is_player())
+ {
+ for (int i = 0; i < you.spell_no; i++)
+ school |= get_spell_disciplines(you.spells[i]);
+ }
+ else
+ {
+ const monster* mons = defender->as_monster();
+ for (int i = 0; i < NUM_MONSTER_SPELL_SLOTS; i++)
+ school |= get_spell_disciplines(mons->spells[i]);
+ }
+ if (school != SPTYP_NONE)
+ {
+ vector<spschool_flag_type> schools;
+ for (int i = 0; i <= SPTYP_LAST_EXPONENT; i++)
+ {
+ if (testbits(school, 1 << i))
+ schools.push_back(
+ static_cast<spschool_flag_type>(1 << i));
+ }
+ ASSERT(schools.size() > 0);
+ MiscastEffect(defender, attacker->mindex(),
+ schools[random2(schools.size())],
+ random2(9),
+ random2(70), "the demon whip \"Spellbinder\"",
+ NH_NEVER);
+ }
+ }
+}
diff --git a/crawl-ref/source/artefact.cc b/crawl-ref/source/artefact.cc
index 04f3cf90ae..54f4bf3293 100644
--- a/crawl-ref/source/artefact.cc
+++ b/crawl-ref/source/artefact.cc
@@ -215,6 +215,15 @@ static bool _god_fits_artefact(const god_type which_god, const item_def &item,
return false;
break;
+ case GOD_DITHMENOS:
+ // No fiery weapons.
+ if (item.base_type == OBJ_WEAPONS
+ && (brand == SPWPN_FLAME || brand == SPWPN_FLAMING))
+ {
+ return false;
+ }
+ break;
+
default:
break;
}
diff --git a/crawl-ref/source/beam.cc b/crawl-ref/source/beam.cc
index 39a4f86c0c..de9de27922 100644
--- a/crawl-ref/source/beam.cc
+++ b/crawl-ref/source/beam.cc
@@ -2436,7 +2436,12 @@ static void _explosive_bolt_explode(bolt *parent, coord_def pos)
beam.source = pos;
beam.target = pos;
beam.is_tracer = parent->is_tracer;
- beam.fire();
+ beam.is_targeting = parent->is_targeting;
+ beam.friend_info.dont_stop = parent->friend_info.dont_stop;
+ beam.foe_info.dont_stop = parent->foe_info.dont_stop;
+ beam.dont_stop_player = parent->dont_stop_player;
+ beam.refine_for_explosion();
+ beam.explode();
parent->friend_info += beam.friend_info;
parent->foe_info += beam.foe_info;
if (beam.is_tracer && beam.beam_cancelled)
@@ -5568,9 +5573,13 @@ mon_resist_type bolt::apply_enchantment_to_monster(monster* mon)
{
_malign_offering_effect(mon, agent(), dam);
obvious_effect = true;
+ return MON_AFFECTED;
}
else
+ {
simple_monster_message(mon, " is unaffected.");
+ return MON_UNAFFECTED;
+ }
}
case BEAM_VIRULENCE:
diff --git a/crawl-ref/source/colour.cc b/crawl-ref/source/colour.cc
index bd4846fd5f..c3cae9a7d8 100644
--- a/crawl-ref/source/colour.cc
+++ b/crawl-ref/source/colour.cc
@@ -633,7 +633,7 @@ void init_element_colours()
ETC_RANDOM, "random", _etc_random
));
add_element_colour(_create_random_element_colour_calc(
- ETC_DITHMENGOS, "dithmengos",
+ ETC_DITHMENOS, "dithmenos",
40, DARKGREY,
40, MAGENTA,
40, BLUE,
diff --git a/crawl-ref/source/colour.h b/crawl-ref/source/colour.h
index df5da2582e..b13322123e 100644
--- a/crawl-ref/source/colour.h
+++ b/crawl-ref/source/colour.h
@@ -55,7 +55,7 @@ enum element_type
ETC_MANGROVE, // colour of trees on water
ETC_ORB_GLOW, // halo coming from the Orb of Zot
ETC_DISJUNCTION, // halo from Disjunction
- ETC_DITHMENGOS, // Dithmengos altar colours
+ ETC_DITHMENOS, // Dithmenos altar colours
ETC_DISCO = 96,
ETC_FIRST_LUA = ETC_DISCO, // colour indices have to be <128
diff --git a/crawl-ref/source/dat/database/godspeak.txt b/crawl-ref/source/dat/database/godspeak.txt
index 4835c483bd..f9041a7849 100644
--- a/crawl-ref/source/dat/database/godspeak.txt
+++ b/crawl-ref/source/dat/database/godspeak.txt
@@ -643,13 +643,13 @@ Cheibriados welcome
Cheibriados says: Take it easy.
%%%%
-Dithmengos penance
+Dithmenos penance
-Dithmengos says: Return to the darkness!
+Dithmenos says: Return to the darkness!
%%%%
-Dithmengos welcome
+Dithmenos welcome
-Dithmengos says: Spread the eternal night.
+Dithmenos says: Spread the eternal night.
%%%%
Elyvilon penance
diff --git a/crawl-ref/source/dat/database/monspeak.txt b/crawl-ref/source/dat/database/monspeak.txt
index 6cdca9ab58..8a5afa100c 100644
--- a/crawl-ref/source/dat/database/monspeak.txt
+++ b/crawl-ref/source/dat/database/monspeak.txt
@@ -1409,7 +1409,7 @@ Cheibriados player ghost
@The_monster@ says @to_foe@, "You can run, but you can't hide!"
%%%%
-Dithmengos player ghost
+Dithmenos player ghost
@The_monster@ says @to_foe@, "I shall send you to the shadows!"
@@ -3494,7 +3494,7 @@ w:50
@The_monster@ says, "What does a god have to do to get cursed, anyway?"
%%%%
-Dithmengos Donald
+Dithmenos Donald
w:50
@_generic_Donald_@
diff --git a/crawl-ref/source/dat/des/altar/overflow.des b/crawl-ref/source/dat/des/altar/overflow.des
index d59f10d9a0..5aa3713c06 100644
--- a/crawl-ref/source/dat/des/altar/overflow.des
+++ b/crawl-ref/source/dat/des/altar/overflow.des
@@ -287,12 +287,12 @@ MAP
......@......
ENDMAP
-### Dithmengos overflow altars ################################################
+### Dithmenos overflow altars ################################################
-NAME: grunt_dithmengos_smoke
-TAGS: uniq_altar_dithmengos temple_overflow_1 temple_overflow_dithmengos decor
+NAME: grunt_dithmenos_smoke
+TAGS: uniq_altar_dithmenos temple_overflow_1 temple_overflow_dithmenos decor
DEPTH: D:2-
-KFEAT: C = altar_dithmengos
+KFEAT: C = altar_dithmenos
MARKER: C = lua:fog_machine { cloud_type = "black smoke", \
pow_min = 10, pow_max = 20, \
delay = 100, size = 1, walk_dist = 1 }
@@ -304,10 +304,10 @@ MAP
ENDMAP
# Reflect upon the darkness, mortal.
-NAME: grunt_dithmengos_smoke_and_mirrors
-TAGS: uniq_altar_dithmengos temple_overflow_1 temple_overflow_dithmengos decor
+NAME: grunt_dithmenos_smoke_and_mirrors
+TAGS: uniq_altar_dithmenos temple_overflow_1 temple_overflow_dithmenos decor
DEPTH: D:2-
-KFEAT: C = altar_dithmengos
+KFEAT: C = altar_dithmenos
KFEAT: O = .
MARKER: O = lua:fog_machine { cloud_type = "black smoke", \
pow_min = 25, pow_max = 25, \
@@ -323,10 +323,10 @@ b.b.b.b
b.b
ENDMAP
-NAME: grunt_dithmengos_shadows
-TAGS: uniq_altar_dithmengos temple_overflow_1 temple_overflow_dithmengos decor
+NAME: grunt_dithmenos_shadows
+TAGS: uniq_altar_dithmenos temple_overflow_1 temple_overflow_dithmenos decor
DEPTH: D:4-
-KFEAT: C = altar_dithmengos
+KFEAT: C = altar_dithmenos
{{
if you.absdepth() >= 14 then
mons("shadow")
diff --git a/crawl-ref/source/dat/des/branches/swamp.des b/crawl-ref/source/dat/des/branches/swamp.des
index de03c265e6..025b85a40e 100644
--- a/crawl-ref/source/dat/des/branches/swamp.des
+++ b/crawl-ref/source/dat/des/branches/swamp.des
@@ -741,6 +741,7 @@ MAP
ENDMAP
NAME: nicolae_swamp_alligator_family
+TAGS: layout_swamp
DEPTH: Swamp
NSUBST: T = 2:W / *:t
KMONS: 1 = alligator
diff --git a/crawl-ref/source/dat/des/branches/vaults.des b/crawl-ref/source/dat/des/branches/vaults.des
index 0c307fe1fb..28f986e4d1 100644
--- a/crawl-ref/source/dat/des/branches/vaults.des
+++ b/crawl-ref/source/dat/des/branches/vaults.des
@@ -386,63 +386,66 @@ MONS: vault guard
set_feature_name("green_crystal_wall", "heavily etched wall of green crystal")
}}
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAAxxxxBBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA.xx.BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAAA.11.BBBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAAA.1111.BBBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxAAAAAAAAAAAAAAAAAAAAAAAAA.1....1.BBBBBBBBBBBBBBBBBBBBBBBBBxx
-xxx........................1..(<..1........................xxx
-xxxx......................11.[..{.11......................xxxx
-xxxx.......................1..<<..1.......................xxxx
-xxx.........................1....1.........................xxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCC..1111..DDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCC..11..DDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCC.xx.DDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxCCCCCCCCCCCCCCCCCCCCCCCCCCCxxxxDDDDDDDDDDDDDDDDDDDDDDDDDDDxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx9..............................0.............................9xx
+xx..............................................................xx
+xx....AAAAAAAAAAAAAAAAAAAAAAA........BBBBBBBBBBBBBBBBBBBBBBB....xx
+xx...AAAAAAAAAAAAAAAAAAAAAAAAA......BBBBBBBBBBBBBBBBBBBBBBBBB...xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA....BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx..AAAAAAAAAAAAAAAAAAAAAAAAAAA.11.BBBBBBBBBBBBBBBBBBBBBBBBBBB..xx
+xx...AAAAAAAAAAAAAAAAAAAAAAAA..1111..BBBBBBBBBBBBBBBBBBBBBBBB...xx
+xx....AAAAAAAAAAAAAAAAAAAAAAA.1....1.BBBBBBBBBBBBBBBBBBBBBBB....xx
+xx...........................1..(<..1...........................xx
+xx0.........................11.[..{.11..........................xx
+xx...........................1..<<..1..........................0xx
+xx............................1....1............................xx
+xx....CCCCCCCCCCCCCCCCCCCCCCC..1111..DDDDDDDDDDDDDDDDDDDDDDD....xx
+xx...CCCCCCCCCCCCCCCCCCCCCCCC...11...DDDDDDDDDDDDDDDDDDDDDDDD...xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx..CCCCCCCCCCCCCCCCCCCCCCCCCCC....DDDDDDDDDDDDDDDDDDDDDDDDDDD..xx
+xx...CCCCCCCCCCCCCCCCCCCCCCCCC......DDDDDDDDDDDDDDDDDDDDDDDDD...xx
+xx....CCCCCCCCCCCCCCCCCCCCCCC........DDDDDDDDDDDDDDDDDDDDDDD....xx
+xx..............................................................xx
+xx9.............................0..............................9xx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
-
############################################################
# Vaults:$ - the subvault used to place the rune.
#
@@ -502,9 +505,9 @@ SUBST: - = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxx.................xxxxx
+ ..xxxxxxxxxxxxxxxxxxx..
+ ...xxxxxxxxxxxxxxxxxxx..
+....xx...............xx....
xxx.......-.....-.......xxx
xxx...-.............-...xxx
xx.......................xx
@@ -522,9 +525,9 @@ xx......x.........x......xx
xx......xxxxxxxxxxx.-....xx
xxx...-.................xxx
xxx........-....-.......xxx
-....xx................xxxxx
- ...xxxxxxxxxxxxxxxxxxxxxxx
- ..xxxxxxxxxxxxxxxxxxxxxxx
+....xx...............xx....
+ ...xxxxxxxxxxxxxxxxxxx...
+ ..xxxxxxxxxxxxxxxxxxx..
ENDMAP
############################################################
@@ -538,10 +541,10 @@ SUBST: a : x .
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxx.a
-xx!x.x.x!x.x.x.x.x.x.x.x.a
-x.x.x.x.x.x.x.x!x.x.x_x.x.a
-xx.x!x.x.x.x.x.x.x.x!x.x.x.
+ a.xxxxxxxxxxxxxxxxxxx.a
+ a!x.x.x!x.x.x.x.x.x.x.x.
+a.x.x.x.x.x.x.x!x.x.x_x.x.a
+.x.x!x.x.x.x.x.x.x.x!x.x.x.
x.x.x.x.x_x.x.x_x.x.x.x.x.x
xx.x.x.x.x.x.x.x.x.x.x.x_xx
x.x.x!x.x.x.x.x.x.x!x.x.x.x
@@ -549,7 +552,7 @@ xx.x_x.x.x!x.x.x.x.x.x.x.xx
x.x.x.x.x_x.x.x.x.x.x.x.x.x
xx.x.x.x.x.x.x.x.x.x.x.x!xx
x_x.x!x.x.x.x.x.x!x.x_x.x.x
-xx.x.x.x.x.x.x.x.x.x.x.x.xx
+xx.x.x.x.x.x.O.x.x.x.x.x.xx
x.x.x_x.x.x.x.x.x.x.x.x_x.x
xx.x.x.x.x.x.x_x.x.x.x.x.xx
x!x.x.x.x!x.x.x.x.x.x.x.x.x
@@ -557,10 +560,10 @@ xx.x.x.x.x.x.x!x.x.x.x.x.xx
x.x.x.x.x.x.x.x.x.x_x.x.x.x
xx.x_x.x.x.x.x.x.x.x.x.x_xx
x.x!x.x.x.x.x.x.x!x.x.x.x.x
-xx.x.x.x.x.x.x_x.x.x.x.x.xx
-x.x.x.x.x.x_x.x.x.x.x.x.x.x
-xO.x.x_x.x.x!x.x.x.x.x!x_xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+.x.x.x.x.x.x.x_x.x.x.x.x.x.
+a.x.x.x.x.x_x.x.x.x.x.x.x.a
+ a.x.x_x.x.x!x.x.x.x.x!x_a
+ a.xxxxxxxxxxxxxxxxxxx.a
ENDMAP
############################################################
@@ -568,37 +571,36 @@ ENDMAP
NAME: vaults_end_classical_stripes
TAGS: vaults_end_quadrant
# double use of Y=Y. and Z=Z. for decreasing variance
-SUBST: Y = Y ., Z = Z .
-SUBST: Y = Y ., Z = Z .
+SUBST: Y = Y ., Z = Z ., Y = Y ., Z = Z .
SUBST: Y = 9:30 8:10 .:40
SUBST: Z = 9:10 8:30 .:40
-SUBST: a : x .
+SUBST: a : x ., b : x ., c : x .
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
- axaxxaaxaxxxxxxxxxxxxxxxx
- .......................??x
-a................Y..Z...??x
-x..Y..Y..Y..Y..Y..Z..Y..Y.x
+ axaxxaaxaxxxxxxxxxxxxbx
+ ........................
+a................Y..Z.....x
+x..Y..Y..Y..Y..Y..Z..Y..Y.b
a...Y..Y..Y..Z..Y..Y..Z...x
x.Y..Y..Y..Y..Z..Y..Z..Y..x
x..Y..Y..Z..Z..Y..Y..Y..Z.x
a...Y..Z..Y..Y..Z..Y..Y...x
-a.Y..Y..Z..Z..Y..Y..Y..Z..x
-x..Z..Y..Y..Y..Z..Y..Y..Y.x
-x...Y..Y..Z..Y..Z..Z..Y...x
-x.Z..Z..Y..Y..Z..Y..Z..Z..x
-x..Y..Z..Y..Z..Z..Y..Z..Z.x
-x...Z..Z..Z..Y..Z..Z..Y...x
-x.Y..Z..Y..Z..Z..Z..Z..Z..x
-x..Z..Y..Z..Y.............x
-x...Y..Z..Z..Z...ZZZZZZZZ.x
-x....Z..Y..Z..Y..Z........x
-x..Z..Z..Y..Z....Z..??????x
-x...Z..Y..Z..Z...Z..??????x
-x??..Y..Z..Z..Z..Z..??????x
-x??.................?????Ox
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+a.Y..Y..Z..Z??Y..Y..Y..Z..x
+x..Z..Y..Y??Y??Z..Y..Y..Y.x
+x...Y..Y??Z??Y??Z..Z..Y...x
+x.Z..Z..Y??YO?Z??Y..Z..Z..x
+x..Y..Z..Y??Z??Z?.Y..Z..Z.x
+x...Z..Z..Z??Y?.Z..Z..Y...x
+x.Y..Z..Y..Z?.Z..Z..Z..Z..x
+x..Z..Y..Z..Y..Z..Z..Z..Z.x
+x...Y..Z..Z..Z..Z..Z..Z...x
+x....Z..Y..Z..Y..Z..Z..Z..x
+x..Z..Z..Y..Z..Z..........x
+b...Z..Y..Z..Z............c
+x....Y..Z..Z..Z..Z........x
+ .........................
+ xbxxxxxxxxxxxxxxxxxxxcx
ENDMAP
############################################################
@@ -611,8 +613,8 @@ NSUBST: " = 1:. / *:x
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
- xxxxxxxxxxxxxxxxxxxxxxxxx
- .........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.........................x
x..xxxxxxxxx999xxxxxxxxx..x
x..x?**....x...x....**?x..x
@@ -632,8 +634,8 @@ x..x**..9..x...x..9..**x..x
x..x?**....x...x....**?x..x
x..xxxxxxxxx999xxxxxxxxx..x
x.........................x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -644,8 +646,8 @@ SUBST: 9 = 8 9 *:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xx.x9x.x.x.x.x.x.x.x.x.x..
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..x9x.x.x.x.x.x.x.x.x.x.
x.x.x.x.x.x.x.x.x.x.x.x9x.x
xx.x.x.x.x9x.x.x9x.x.x.x.xx
x.x.xxxxxxxxx.xxxxxxxxx.x.x
@@ -665,8 +667,8 @@ xx9xxxxxxxxx.x.xxxxxxxxx9xx
x.x.xxxxxxxxx.xxxxxxxxx.x.x
xx.x.x.x.x9x.x.x9x.x.x.x.xx
x.x.x.x.x.x.x.x.x.x.x.x.x.x
-xx.x9x.x.x.x.x.x.x.x.x9x.xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ ..x9x.x.x.x.x.x.x.x.x9x..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -690,8 +692,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x..........xxbxx..........x
x..........xBBBx..........x
x..xxaxx...bBBBb...xxcxx..x
@@ -711,8 +713,8 @@ x..xFFFx...xEEEx...xGGGx..x
x..xxfxx...eEEEe...xxgxx..x
x..........xEEEx..........x
x..........xxexx..........x
- .........................x
- xxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -726,9 +728,9 @@ SUBST: a = x.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxa
-x.........................
-x.........................a
+ axxxxxxxxxxxxxxxxxxxxxa
+ ........................
+a.........................a
x.........................x
x..xxxxxxxxxxxxxxxxxxxxx..x
x....999............$$$x..x
@@ -746,9 +748,9 @@ x..xxxxxxxxxxxxxxxxxxxxx..x
x....999............$$$x..x
x....999............$$$x..x
x..xxxxxxxxxxxxxxxxxxxxx..x
-x.........................x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+a.........................a
+ .......................
+ axxxxxxxxxxxxxxxxxxxxxa
ENDMAP
############################################################
@@ -761,9 +763,9 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxx9..9xxxx9...9xxxx9.....
-xx......xx.......xx.......x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..9..9xxxx9...9xxxx9....
+x.......xx.......xx.......x
x9..xx......xbx......xx...x
x..xxxx....xx*xx....xxxx..x
x..xxxx....b*O*b....xxxx..x
@@ -781,9 +783,9 @@ x9..xx9....xx*xx....9xx..9x
x..xxxx....d*O*d....xxxx..x
x..xxxx....xx*xx....xxxx..x
x9..xx......xdx......xx..9x
-xx......xx.......xx......xx
-xxx9..9xxxx9...9xxxx9..9xxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.......xx.......xx.......x
+ ..9..9xxxx9...9xxxx9..9..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -794,15 +796,15 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxx9............9.....
-xxxxxx....................x
-xxxxx...xxxxx.xxxxx.......x
-xxxx...xx9.......9xx......x
-xxxx..xx...........xx.....x
-xxx...x...xxx.xxx...x.....x
-xx...xx..xx9...9xx..xx....x
-xx..xx...x.......x...xx...x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ....xx9...........9xx...
+x.........................x
+x..xx...xxxxx.xxxxx.......x
+x..x...xx9.......9xx......x
+x..x..xx...........xx.....x
+xx....x...xxx.xxx...x....xx
+xx...xx..xx9...9xx..xx...xx
+xx..xx...x.......x...xx..xx
x9..x9..xx..***..xx..9x..9x
x..xx..xx9.*****.9xx..xx..x
x..........**O**..........x
@@ -810,25 +812,25 @@ x..xx..xx9.*****.9xx..xx..x
x9..x9..xx..***..xx..9x..9x
xx..xx...x.......x...xx..xx
xx...xx..xx9...9xx..xx...xx
-xxx...x...xxx.xxx...x...xxx
-xxxx..xx...........xx..xxxx
-xxxx...xx9.......9xx...xxxx
-xxxxx...xxxxx.xxxxx...xxxxx
-xxxxxx...............xxxxxx
-xxxxxxx9...........9xxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx....x...xxx.xxx...x....xx
+x..x..xx...........xx..x..x
+x..x...xx9.......9xx...x..x
+x..xx...xxxxx.xxxxx...xx..x
+x.........................x
+ ....xx9...........9xx....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
-# 15 *, 10 monsters
+# 16 *, 10 monsters
NAME: vaults_end_minmay_subdivision
TAGS: vaults_end_quadrant
SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x*....x....*xxx*....x.....
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .....x....*xxx*....x....
x.....x.....xxx.....x.....x
x.....x.....xxx.....x.....x
x....9x9....xxx....9x9....x
@@ -837,9 +839,9 @@ x....9x9....xxx....9x9....x
x.....x.....xxx.....x.....x
x.....x.....xxx.....x.....x
x*....x....*xxx*....x....*x
-xxxxxx.xxxxx9.9xxxxx.xxxxxx
-xxxxxx.xxxxx.O.xxxxx.xxxxxx
-xxxxxx.xxxxx9.9xxxxx.xxxxxx
+xxxxxx.xxxxx9*9xxxxx.xxxxxx
+xxxxxx.xxxxx*O*xxxxx.xxxxxx
+xxxxxx.xxxxx9*9xxxxx.xxxxxx
x*....x....*xxx*....x....*x
x.....x.....xxx.....x.....x
x.....x.....xxx.....x.....x
@@ -848,8 +850,8 @@ xxxxxx.xxxxx...xxxxx.xxxxxx
x....9x9....xxx....9x9....x
x.....x.....xxx.....x.....x
x.....x.....xxx.....x.....x
-x*....x....*xxx*....x....*x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .....x....*xxx*....x.....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -857,32 +859,33 @@ ENDMAP
NAME: vaults_end_minmay_triangle_fans
TAGS: vaults_end_quadrant
SUBST: 9 = 8 9 .:20
+NSUBST: O = 1:O / *:*
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxx.....9xxxx.....9xxxx.
-xxxx..x....xxx..x....xxx..x
-xxx...xx...xx...xx...xx...x
-xx....xxx..x....xxx..x....x
+ ...xxxxxxxxxxxxxxxxxxxx
+ xxxx.....9xxxx.....9xxxx
+.xxx..x....xxx..x....xxx..x
+.xx...xx...xx...xx...xx...x
+.x....xxx..x....xxx..x....x
x....9xxxx.....9xxxx......x
x.xxxx9.....xxxx9.....xxxxx
-x..xxx....x..xxx....x..xxxx
-x...xx...xx...xx...xx...xxx
-x....x..xxx....x..xxx....xx
+x..xxx...*x.*xxx...*x..xxxx
+x...xx...xx..Oxx...xx...xxx
+x....x.*xxx...*x.*xxx....xx
x......xxxx9.....xxxx9....x
x.........................x
xxxxx.....9xxxx.....9xxxx.x
-xxxx..x....xxx..x....xxx..x
-xxx...xx...xx...xx...xx...x
-xx....xxx..x....xxx..x....x
+xxxx..x*...xxx*.x*...xxx..x
+xxx...xx...xxO..xx...xx...x
+xx....xxx*.x*...xxx*.x....x
x....9xxxx.....9xxxx......x
-x*xxxx9.....xxxx9.....xxxxx
-x**xxx....x..xxx....x..xxxx
-x***xx...xx...xx...xx...xxx
-x****x..xxx....x..xxx....xx
-xO****.xxxx9.....xxxx9....x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.xxxx9.....xxxx9.....xxxxx
+x..xxx....x..xxx....x..xxxx
+x...xx...xx...xx...xx...xxx
+x....x..xxx....x..xxx....xx
+ ......xxxx9.....xxxx9....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -893,8 +896,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.x.x.x.x.x.x.x.x.x.x.x.x.x
x.........................x
x.x.xx9xx..xx9xx..xx9xx.x.x
@@ -914,8 +917,8 @@ x...xx.xx..xx.xx..xx.xx...x
x.x.xx9xx..xx9xx..xx9xx.x.x
x.........................x
x.x.x.x.x.x.x.x.x.x.x.x.x.x
-x.........................
-xxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -926,8 +929,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .........................
x.........................x
x..x99xxxxxxxxxxxxxxxxxx..x
x..x................9..9..x
@@ -947,21 +950,21 @@ x..9...................x..x
x..9...................x..x
x..xxxxxxxxxxxxxxxxxx99x..x
x.........................x
-x.........................
-xxxxxxxxxxxxxxxxxxxxxxxxx
+ ........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
-# 2 |, 18 *, 16 monsters
+# 2 |, 19 *, 16 monsters
NAME: vaults_end_minmay_grid2
TAGS: vaults_end_quadrant
SUBST: 9 = 8 9 .:20
-NSUBST: O = 1:O / *:|
+NSUBST: O = 1:O / 1:* / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xO.xx**xx**xx**xx**xx**xxOx
+ .xxxxxxxxxxxxxxxxxxxxxx
+ ..xx**xx**xx**xx**xx**xx.
xxx..xx..xx..xx..xx..xx..xx
xxx.9xx9.xx..xx..xx.9xx9.xx
x..xx..xx..xx..xx..xx..xx*x
@@ -970,8 +973,8 @@ xxx.9xx9.xx..xx..xx.9xx9.xx
xxx..xx.9xx9.xx.9xx9.xx..xx
x..xx..xx..xx..xx..xx..xx*x
x..xx..xx..xx..xx..xx..xx*x
-xxx..xx.9xx9.xx.9xx9.xx..xx
-xxx..xx.9xx9.xx.9xx9.xx..xx
+xxx..xx.9xx9OxxO9xx9.xx..xx
+xxx..xx.9xx9OxxO9xx9.xx..xx
x..xx..xx..xx..xx..xx..xx*x
x..xx..xx..xx..xx..xx..xx*x
xxx..xx.9xx9.xx.9xx9.xx..xx
@@ -980,9 +983,9 @@ x..xx..xx..xx..xx..xx..xx*x
x..xx..xx..xx..xx..xx..xx*x
xxx.9xx9.xx..xx..xx.9xx9.xx
xxx..xx..xx..xx..xx..xx..xx
-x..xx..xx..xx..xx..xx..xx.x
- ..xx..xx..xx..xx..xx..xxOx
- xxxxxxxxxxxxxxxxxxxxxxxxx
+x..xx..xx..xx..xx..xx..xx..
+ .xx..xx..xx..xx..xx..xx.
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -994,8 +997,8 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.....x......x......x.....
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .....x......x......x....
x.........................x
x.........................x
x.....x......x......x.....x
@@ -1015,8 +1018,8 @@ xx...xxx9999xxx9999xxx...xx
x.....x......x......x.....x
x.........................x
x.........................x
-x.....x......x......x.....x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .....x......x......x.....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1024,32 +1027,33 @@ ENDMAP
NAME: vaults_end_minmay_broken_diamonds
TAGS: vaults_end_quadrant
SUBST: 9 = 8 9 .:20
+NSUBST: * = 1:O / 14:* / *:.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x..xx....9xx...xx9....xx..
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xx....9xx...xx9....xx..
x........xx.....xx........x
xx......xx...x...xx......xx
xxx....xx....xx...xx....xxx
x9xx...x......xx...x...xx9x
-x..xx..........xx.....xx..x
-x...xx...xx....9xx........x
-x.........xx..9xx...x....xx
+x..xx........**xx.....xx..x
+x...xx...xx.***9xx........x
+x.........xx**9xx...x....xx
x......x...xx9xx...xxx...xx
xx....xxx...xxx...xx9xx...x
-xx...xx9xx...x...xx9..xx..x
-x...xx..9xx.......xx......x
-x..xx....9xx...x...xx....xx
-x9.......xx....xx...x...xxx
-xx......xx......xx.....xx9x
-xxx....xx...xx..9xx...xx..x
-x*xx...x.....xx9xx........x
-x**xx.....x...xxx...x....xx
-x***xx...xx....x....xx...xx
-x****...xx...........xx...x
-xO****.xx9..xx...xx..9xx..x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx...xx9xx...x...xx9**xx..x
+x...xx**9xx.......xx**....x
+x..xx.***9xx...x...xx....xx
+x9.....**xx....xx...x...xxx
+xx......xx....**xx.....xx9x
+xxx....xx...xx**9xx...xx..x
+x.xx...x.....xx9xx........x
+x..xx.....x...xxx...x....xx
+x...xx...xx....x....xx...xx
+x.......xx...........xx...x
+ ......xx9..xx...xx..9xx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1057,33 +1061,33 @@ ENDMAP
NAME: vaults_end_minmay_smooth_crossroads
TAGS: vaults_end_quadrant
SUBST: 9 = 8 9 .:20
-NSUBST: O = 1:O / *:*
+NSUBST: O = 1:O / *:.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9...*Ox9.....9x9........9
-x....**x.......x...x......x
-x....*xx...x...x...xx.....x
-x....*x....x...x....x.....x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ 9.....x9.....9x9........
+x......x.......x...x....9.x
+x.....xx...x...x...xx.....x
+x.....x....x...x....x.....x
x....xx....x...x....xx....x
x..xxx....xx...xx....xxx..x
-x.xx......x.....x......xxxx
-x........xx.....xx.......9x
-x9.....xxx.......xxx......x
-xxxxxxxx.....9.....xxxx...x
+x.xx......x*...*x......xxxx
+x........xx*...*xx.......9x
+x9.....xxxO.....Oxxx......x
+xxxxxxxx**...9...**xxxx...x
x9..........9x9..........9x
-x...xxxx.....9.....xxxxxxxx
-x......xxx.......xxx.....9x
-x9.......xx.....xx........x
-xxxx......x.....x......xx.x
-xO*xxx....xx...xx....xxx..x
-x****xx....x...x....xx....x
-x.....x....x...x....x*....x
-x.....xx...x...x...xx*....x
-x......x...x.......x**....x
-x9........9x9.....9xO*...9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x...xxxx**...9...**xxxxxxxx
+x......xxxO.....Oxxx.....9x
+x9.......xx*...*xx........x
+xxxx......x*...*x......xx.x
+x..xxx....xx...xx....xxx..x
+x....xx....x...x....xx....x
+x.....x....x...x....x.....x
+x.....xx...x...x...xx.....x
+x......x...x.......x......x
+ 9........9x9.....9x.....9
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1094,29 +1098,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9xxx9.......x9...........
+ xxxxxxxxxxxxxxxxxxxxxxx
+ 9xxx9.......x9..........
x..xxx...xx...x...........x
x...xxx..9xx...x..........x
x....xxx...xx...x9........x
x.x9..xxx...xx...x........x
-x.xx...xxx...xx...x.......x
-x..xx...xxx...xx...x......x
-x...xx...xxx...xx...x.....x
-xx...xx...xxx...xx...x9...x
-x9x...xx...xxx9..xx...x...x
-x..x...xx...9.9...xx...x..x
-x...x...xx..9xxx...xx...x9x
-x...9x...xx...xxx...xx...xx
-x.....x...xx...xxx...xx...x
-x......x...xx...xxx...xx..x
-x.......x...xx...xxx...xx.x
-x*.......x...xx...xxx..9x.x
-x**......9x...xx...xxx....x
-x***.......x...xx9..xxx...x
-x****.......x...xx...xxx..x
-xO****......9x.......9xxx9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.xx...xxx..*xx...x.......x
+x..xx...xxx..*xx...x......x
+x...xx...xxx..*xx...x.....x
+xx...xx...xxx..*xx...x9...x
+x9x...xx*..xxx9.*xx...x...x
+x..x...xx*..9O9..*xx...x..x
+x...x...xx*.9xxx..*xx...x9x
+x...9x...xx*..xxx...xx...xx
+x.....x...xx*..xxx...xx...x
+x......x...xx*..xxx...xx..x
+x.......x...xx*..xxx...xx.x
+x........x...xx...xxx..9x.x
+x........9x...xx...xxx....x
+x..........x...xx9..xxx...x
+x...........x...xx...xxx..x
+ ...........9x.......9xxx9
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1129,9 +1133,9 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxx$$$$$$$$$xxxxx...
-xxx....xxx$$$$$$$xxx......x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xxxxxx$$$$$$$$$xxxxx..
+x......xxx$$$$$$$xxx......x
xx.9xx9.xxx$$$$$xxx.9xx9.xx
xx.xxxx.xxxx$$$xxxx.xxxx.xx
xx.xxxx.xxxxx$xxxxx.xxxx.xx
@@ -1149,9 +1153,9 @@ xx.9xx9..xxxx+xxxx..9xx9.xx
xx.xxxx.xxxxx$xxxxx.xxxx.xx
xx.xxxx.xxxx$$$xxxx.xxxx.xx
xx.9xx9.xxx$$$$$xxx.9xx9.xx
-xxx....xxx$$$$$$$xxx....xxx
-xxxxxxxxx$$$$$$$$$xxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x......xxx$$$$$$$xxx......x
+ ..xxxxxx$$$$$$$$$xxxxxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1169,29 +1173,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxx.....xxxx....
-xxxxxxxxx.................x
-xxxxx.....................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xxxxxxxxxx.....xxxx...
+x...xxxxx.................x
+xx........................x
+xxx......................xx
xxxx.....................xx
xxxx.....................xx
-xxx......................xx
-xxx.......xxxxxxx........xx
-xx.......xxxxxxxxx.......xx
-xx......xxx.999.xxx.......x
+xxx......9xxxxxxx........xx
+xx......9xxxxxxxxx.......xx
+xx......xxx$999$xxx.......x
xx......xC.9$$$9.xx.......x
-x.......CC.9$S$9.xx.......x
+x.......CC.9$S$9Oxx.......x
x.......xC.9$$$9.xx......xx
-x.......xAa.999.xxx......xx
-xx.......xAxDDDxxx.......xx
-xx........xxxDxxx.......xxx
+x.......xAa$999$xxx......xx
+xx.......xAxDDDxxx9......xx
+xx........xxxDxxx9......xxx
+xx.....................xxxx
+xx.....................xxxx
xx......................xxx
-xx9....................xxxx
-xx$9...................xxxx
-xx$O9.................xxxxx
-xxx$$9............xxxxxxxxx
-xxxxxxxxx.....xxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x........................xx
+x.................xxxxx...x
+ ....xxxx.....xxxxxxxxxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1210,8 +1214,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .........................
x.........................x
x...xxxxx..xxxxx..xxxxx...x
x...x'S'x..x'S'x..x'S'x...x
@@ -1231,8 +1235,8 @@ x...x'''x..x'''x..x'''x...x
x...x'S'x..x'S'x..x'S'x...x
x...xxxxx..xxxxx..xxxxx...x
x.........................x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1244,10 +1248,10 @@ SUBST: * = 9 8 *:20 .
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxx.x.*.x.xxx.x.*.x.xxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
+ xxx.x.*.x.xxx.x.*.x.xxx.
x.x.*.x.xxx.x.*.x.xxx.x...x
-x*.x.xxx.x.*.x.xxx.x.*.x.xx
+.*.x.xxx.x.*.x.xxx.x.*.x.xx
x.xxx.x.*.x.xxx.x.*.x.xxx.x
xx.x.*.x.xxx.x.*.x.xxx.x.*x
x.*.x.xxx.x.*.x.xxx.x.*.x.x
@@ -1264,9 +1268,9 @@ x.*.x.xxx.x.*.x.xxx.x.*.x.x
xx.xxx.x.*.x.xxx.x.*.x.xxxx
xxx.x.*.x.xxx.x.*.x.xxx.x.x
xx.*.x.xxx.x.*.x.xxx.x.*.xx
-x.x.xxx.x.*.x.xxx.x.*.x.xxx
-xxxx.x.*.x.xxx.x.*.x.xxx.xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+..x.xxx.x.*.x.xxx.x.*.x.xxx
+ xxx.x.*.x.xxx.x.*.x.xxx.x
+ xxxxxxxxxxxxxxxxxxxxx..
ENDMAP
############################################################
@@ -1278,29 +1282,29 @@ NSUBST: O = 1:O / *:*
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.................xxxxxx..
+ x.x.xxxxxxxxxxxxxxxxxxx
+ .................xxxxxx.
x.xxxx....xxxx.......xx...x
-x...9xxx....9xxx.........xx
+....9xxx....9xxx.........xx
x.....9xx.....9xx.......xxx
x......9x......9x.......xxx
x.......xx......xx.......xx
x.......9x......9x.......xx
x........x.......x9......xx
-x.xxxx...xxxxx.**xx.......x
-x...9xxx..xxxxxxO*x9......x
+x.xxxx...xxxxx***xx.......x
+x...9xxx.*xxxxxxO*x9......x
x.....9xx*xxxxxxx*xx9.....x
-x......9x*Oxxxxxx..xxx9...x
-x.......xx**.xxxxx...xxxx.x
+x......9x*Oxxxxxx*.xxx9...x
+x.......xx***xxxxx...xxxx.x
xx......9x.......x........x
xx.......x9......x9.......x
xx.......xx......xx.......x
-xxx*......x9......x9......x
-xxx*O.....xx9.....xx9.....x
-xxxx**.....xxx9....xxx9...x
-xxxxxx.......xxxx....xxxx.x
-xxxxxxxxx.................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxx.......x9......x9......x
+xxx.......xx9.....xx9.....x
+xx.........xxx9....xxx9....
+x...xx.......xxxx....xxxx.x
+ ..xxxxxx.................
+ xxxxxxxxxxxxxxxxxxx.x.x
ENDMAP
############################################################
@@ -1311,29 +1315,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.9.x.x.x.x.x.x.x.9.x.x...
-x*x.x.x.x.x.x.x.x.x.x.x...x
-x*x.x.x.9.x.9.x.x.x.9.x.x.x
-x*x.9.x.x.x.x.x.x.x.x.x.x.x
-x*x.x.x.x.9.x.x.9.x.x.9.x.x
-x*x.x.9.x.x.x.x.x.x.x.x.x.x
-x*x.x.x.x.x.x.9.x.x.x.9.x.x
-x*x.x.x.9.x.x.x.x.9.9.x.x.x
-x*x.x.x.x.x.9.x.x.x.x.x.x.x
-x*x.x.x.x.x.x.x.x.x.x.x.9.x
-xOx.x.x.x.x.x.9.x.x.x.x.x.x
-x*x.9.x.x.9.x.x.x.9.x.x.x.x
-x*x.x.x.x.x.x.x.x.x.x.9.x.x
-x*x.x.x.9.x.x.9.x.x.x.x.x.x
-x*x.x.x.x.x.x.x.x.x.x.x.9.x
-x*x.x.9.x.9.x.x.9.x.9.x.x.x
-x*x.9.x.x.x.9.x.x.x.x.9.x.x
-x*x.x.x.x.x.x.9.x.x.x.x.x.x
-x*x.x.9.x.x.x.x.x.x.x.x.x.x
-x*x.x.x.x.x.x.x.x.9.x.x.9.x
-x.9.x.x.x.9.9.x.x.x.9.x.x.x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .9.x.x.x.x.x.x.x.9.x.x...
+x.x.x.x.x.x.x*x.x.x.x.x...x
+x.x.x.x.9.x.9*x.x.x.9.x.x.x
+x.x.9.x.x.x.x*x.x.x.x.x.x.x
+x.x.x.x.x.9.x*x.9.x.x.9.x.x
+x.x.x.9.x.x.x*x.x.x.x.x.x.x
+x.x.x.x.x.x.x*9.x.x.x.9.x.x
+x.x.x.x.9.x.x*x.x.9.9.x.x.x
+x.x.x.x.x.x.9*x.x.x.x.x.x.x
+x.x.x.x.x.x.x*x.x.x.x.x.9.x
+x.x.x.x.x.x.xO9.x.x.x.x.x.x
+x.x.9.x.x.9.x*x.x.9.x.x.x.x
+x.x.x.x.x.x.x*x.x.x.x.9.x.x
+x.x.x.x.9.x.x*9.x.x.x.x.x.x
+x.x.x.x.x.x.x*x.x.x.x.x.9.x
+x.x.x.9.x.9.x*x.9.x.9.x.x.x
+x.x.9.x.x.x.9*x.x.x.x.9.x.x
+x.x.x.x.x.x.x*9.x.x.x.x.x.x
+x.x.x.9.x.x.x*x.x.x.x.x.x.x
+x.x.x.x.x.x.x*x.x.9.x.x.9.x
+ .9.x.x.x.9.9.x.x.x.9.x...
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1346,9 +1350,9 @@ SUBST: A = ., B = x
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9.......................9
-x.9xx.xxx.xxx.xxx.xxx.xx9.x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ 9......................9
+x.9xx.xxx.xxx.xxx.xxx.xx.9x
x.xxx.xxx.xxx.xxx.xxx.xxx.x
x.xxx.xxx.xxx.xxx.xxx.xxx.x
x.........................x
@@ -1367,8 +1371,8 @@ x.........................x
x.xxx.xxx.xxx.xxx.xxx.xxx.x
x.xxx.xxx.xxx.xxx.xxx.xxx.x
x.9xx.xxx.xxx.xxx.xxx.xx9.x
-x9.......................9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ 9.......................9
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1379,8 +1383,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .......................
x.........................x
x..xxxx999xxxxxxx999xxxx..x
x..9..xxx..xxOxx..xxx..9..x
@@ -1392,16 +1396,16 @@ x..9xx..x..xx*xx..x..xx9..x
x..9....xx.xx*xx.xx....9..x
x..xxxx....xx*xx....xxxx..x
x..9..xxx...x*x...xxx..9..x
-x..9....xx..x*x..xx....9..x
+x..9....xx...*...xx....9..x
x..xxxx..xx.x*x.xx..xxxx..x
x..9..xx..x|x*x|x..xx..9..x
x..xx..xx.xxx*xxx.xx..xx..x
x..9xx..x..xx*xx..x..xx9..x
x..9.xx.x..xx*xx..x.xx.9..x
-x..x99x9x99xx*xx99x9x99x..x
-x.........................x
+x..x99x9x99xxxxx99x9x99x..x
x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1413,9 +1417,9 @@ NSUBST: O = 1:O / *:*
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxx9xxx9xxx9xxx9xxx9xxx..
-xxx...x...x...x...x...x...x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..x9xxx9xxx9xxx9xxx9xxx.
+x.....x...x...x...x...x...x
xx.......................xx
x9....x.................xxx
xx...xxx.................xx
@@ -1432,10 +1436,10 @@ xx.....xxx....xxx..xxx...xx
x9......x......x..xxxxx.xxx
xx.................xxx...xx
xxx.................x....9x
-xx.......................xx
-x...x...x...x...x...x...xxx
-x9.xxx9xxx9xxx9xxx9xxx9xxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx.9.....................xx
+x...x...x...x...x...x.....x
+ ..xxx9xxx9xxx9xxx9xxx9x..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1446,8 +1450,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x...x.x.x..x.x.x..x.x.x...x
x....9.9....9.9....9.9....x
x...x.x.....x.x.....x.x...x
@@ -1467,8 +1471,8 @@ x....9.......9.......9....x
x...x.x.....x.x.....x.x...x
x....9.9....9.9....9.9....x
x...x.x.x..x.x.x..x.x.x...x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1479,29 +1483,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.........................x
x..xxxxxxxxxx......xxxxx..x
x..xxxxxxx9..........xxx..x
x..xxxxx9.............xx..x
x..xxxx9...............x..x
-x..xxx9................x..x
-x..xx9..........9xx.......x
-x..xx.........9xxxx.......x
+x..xxx9..........***...x..x
+x..xx9..........9xx*......x
+x..xx.........9xxxx*......x
x..x9......9xxxxxx9....x..x
x..x.....9xxxxxxx9.....x..x
x..x....9xxxxxx9......9x..x
-x.......xxxx9.........xx..x
-x.......xx9..........9xx..x
-x..x****............9xxx..x
-x..x****...........9xxxx..x
-x..xxO**..........9xxxxx..x
-x..xxx**........9xxxxxxx..x
+x......*xxxx9.*.......xx..x
+x......*xx9..........9xx..x
+x..x...O**..........9xxx..x
+x..x*..............9xxxx..x
+x..xx*............9xxxxx..x
+x..xxx..........9xxxxxxx..x
x..xxxxx......xxxxxxxxxx..x
x.........................x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1513,29 +1517,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.........................x
x..xxx..x.x.x9x.x.x..xxx..x
x..x9.................9x..x
x..x...................x..x
x.......x.x.x9x.x.x.......x
x......9x.........x9......x
-x..x..xxx.........xxx..x..x
+x..x..xxx...*.*...xxx..x..x
x..........xxAxx..........x
-x..x..x....x.9.x....x..x..x
-x..9..9....A9O9A....9..9..x
-x..x..x....x.9.x....x..x..x
+x..x..x...*x*9*x*...x..x..x
+x..9..9...*A9O9A....9..9..x
+x..x..x....x*9*x*...x..x..x
x..........xxAxx..........x
-x..x..xxx.........xxx..x..x
+x..x..xxx...*.*...xxx..x..x
x......9x.........x9......x
x99.....x.x.x9x.x.x.......x
xBBx...................x..x
-x**B9.................9x..x
-x**xBx..x.x.x9x.x.x..xxx..x
-x****B9...................x
-x****B9...................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x..B9.................9x..x
+x..xBx..x.x.x9x.x.x..xxx..x
+x....B9...................x
+ ....B9...................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1547,9 +1551,9 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9........................
-x9........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ............9...........
+x............9............x
xxxxx9999xx.....xx9999xxxxx
x**xx....xx.....xx....xx**x
x***xx....xx...xx....xx***x
@@ -1557,19 +1561,19 @@ x...xx....xx...xx....xx...x
x....xx....xx.xx....xx....x
x....xx....xx.xx....xx....x
x.....xx....x.x....xx.....x
-x.....xx....x.x....xx.....x
-x.....Oxx...9.9...xxO.....x
-x.....xx....xxx....xx.....x
+x|....xx....x.x....xx.....x
+xO....99....9*9....99....Ox
+x.....xx....xxx....xx....|x
x.....xx....xxx....xx.....x
-x....xx....xxOxx....xx....x
-x....xx....xx*xx....xx....x
-x...xx....xx***xx....xx...x
-x...xx....xx***xx....xx...x
-x..xx....xx.....xx....xx..x
-x99xx9999xx.....xx9999xx99x
-x........9.......9........x
+x....xx....xx.xx....xx....x
+x....xx....xx.xx....xx....x
+x...xx....xx...xx....xx...x
+x*..xx....xx...xx....xx..*x
+x**xx....xx.....xx....xx**x
+xxxxx9999xx.....xx9999xxxxx
x........9.......9........x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ ........9.......9........
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1581,8 +1585,8 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.xx........xx.......xx...x
x......xx...9....xx...9...x
x..xx..9.....xx.....xx.9x.x
@@ -1590,53 +1594,53 @@ x........xx..9...xx.9.x.x.x
x....xx.......xx.....9x...x
xxx...9....xx.9..xx.......x
x.......xx.....xx9.x.x.x..x
-x....xx.9....xx...9x.x.x..x
-x.xx.......xx9....x.......x
-x........xx...xx..x.x.....x
-x......xx9...xxx.x.9x.x...x
-x....xx.....xxx.9x...9x.x.x
-x..xx9....9xxx..x..x...9x.x
+x....xx.9...xxx...9x.x.x..x
+x.xx......xxx9....x.......x
+x.......xxx...xx..x.x.....x
+x*****xxx9...xxx.x.9x.x...x
+x***xxx.....xxx.9x...9x.x.x
+xOxxx9....9xxx..x..x...9x.x
xxx.......xxx...x..x......x
x.......9xxx9..x.....x....x
x.......xxx...9x..x..x....x
-x*.....xxx9...x..9x....x..x
-x**...xxx*....x.......9x..x
-x***.xxx***..x...x.9x.....x
-xO**xxxO****9x...x..x.....x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x......xxx9...x..9x....x..x
+x.....xxx*....x.......9x..x
+x....xxx***..x...x.9x.....x
+ ...xxxO****9x...x..x.....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 19 *, 12 monsters
NAME: vaults_end_grunt_pinched
TAGS: vaults_end_quadrant
-NSUBST: O = 1:O / *:*
+NSUBST: O = 1:O / *:.
SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x......*Ox................
-x......*xx...9............x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........x...............
+x.......xx...9............x
x...9...xx...x............x
x......xx....xx....9......x
-x.....xx9.....x...........x
-x...xxxxx.....xx..........x
-x9xxxx.xxx.....xx......9..x
-x.......xx..9.9xxxx.......x
-x...9....9....xx.9xxx.....x
-x.9.x........xx....xxxx...x
-x...xxxx....xx........x.9.x
-x.....xxx.9xx.....9.......x
-x.....*Oxxxx..............x
-x..9..**xxx9..............x
-x......xxxxx...9.xx..9.xx9x
-x.....xx.*Oxx....xxxxxxxx.x
-x....xx..**.x.....xxxx....x
+x.....xx9....*x...........x
+x...xxxxx....*xx..........x
+x9xxxx.xxx....9xx......9..x
+x.......xx..9.*xxxx.......x
+x...9....9..**xx.9xxx.....x
+x.9.x**....*Oxx*...xxxx...x
+x...xxxx...*xx*.....**x.9.x
+x.....xxx9*xxO*...9.......x
+x.......xxxx**............x
+x..9....xxx*..............x
+x......xxxxx9..9.xx..9.xx9x
+x.....xx...xx*...xxxxxxxx.x
+x....xx.....x*....xxxx....x
x...xx......xx....xx......x
-x**xx....9...x.9..x....9..x
-xOxx*........9...xx*......x
-xxxO*............xO*......x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x..xx....9...x.9..x....9..x
+x.xx.........9...xx.......x
+ ................x........
+ .xxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 18 *, 12 monsters
@@ -1653,9 +1657,9 @@ SUBST: 9 = 8 9 .:30
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxx+
-xx..........xxx..........xx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ +xxxxxxxxxxxxxxxxxxxxxxx
+xx..........xxx.........+xx
x.9..+xx+..9.+.9..+xx+..9.x
x....x11x....x....x22x....x
x....x11x....x....x22x....x
@@ -1673,42 +1677,41 @@ xx..........xxx..........xx
x.9..+xx+..9.+.9..+xx+..9.x
x....x55x....x....x66x....x
x....x55x....x....x66x....x
-x.9..+xx+..9.+.9..+xx+..9.x
-xx..........xxx..........xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx9..+xx+..9.+.9..+xx+..9xx
+ +x.........xxx.........x+
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 17 *, 12 monsters
NAME: vaults_end_grunt_cloverleaf
TAGS: vaults_end_quadrant
-NSUBST: O = 1:O / *:*
SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxx+...
-xxxxx**..xxxxxxxxx....xxx.x
-xxxO*..9...xxxxx...9....x+x
-xx*..9.....xxxxx.....9...xx
-xx*.........xxx..........xx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ...+xxxxxxxxxxxxxxxxx+..
+x.xxx....xxxxxxxxx....xxx.x
+x+x....9..*xxxxx*..9....x+x
+xx...9.....xxxxx.....9...xx
+xx.........*xxx*.........xx
xx.9........xxx........9.xx
xx........9..x..9........xx
-xxx..........+..........xxx
-xxxxx....9.+xxx+.9....xxxxx
-xxxxxxxx...x.9.x...xxxxxxxx
-xxxxxxxxx+xx9.9xx+xxxxxxxxx
+xxx*.........+.........*xxx
+xxxxx*...9.+xxx+.9...*xxxxx
xxxxxxxx...x.9.x...xxxxxxxx
-xxxxx....9.+xxx+.9....xxxxx
-xxx..........+..........xxx
+xxxxxxxxx+xx9O9xx+xxxxxxxxx
+xxxxxxxx...x*9.x...xxxxxxxx
+xxxxx*...9.+xxx+.9...*xxxxx
+xxx*.........+.........*xxx
xx........9..x..9........xx
xx.9........xxx........9.xx
-xx*.........xxx.........*xx
-xx*..9......xxx......9..*xx
-xxxO*..9...xxxxx...9..*Oxxx
-xxxxx**..xxxxxxxxx..**xxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx..........xxx..........xx
+xx...9.....*xxx*.....9...xx
+x+x....9..*xxxxx*..9....x+x
+x.xxx....xxxxxxxxx....xxx.x
+ ...+xxxxxxxxxxxxxxxxx+...
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 20 *, 14 monsters
@@ -1718,15 +1721,15 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxx........9............
-xxxx....xxxxxxxxxxxxx.....x
-xxx...9xx....9......9.....x
-xxx.x9.x..xxxxxxxxxx.9....x
-xx..x.xx.xx..9.....xxx....x
-xx..x.x..x..xxxxxx...xx...x
-xx..x.x.xx.xx9...xxx..x...x
-xx..x.x.x..xx*xx...xx.x...x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xx........9........xx.
+x..x....xxxxxxxxxxxxx..x..x
+xx....9xx....9......9....xx
+xxx.x9.x..xxxxxxxxxx.9..xxx
+xx..x.xx.xx..9.....xxx...xx
+xx..x.x..x..xxxxxx...xx..xx
+xx..x.x.xx.xx9...xxx..x..xx
+xx..x.x.x..xx*xx...xx.x..xx
x...x.x.x.xx***xxx..x.x...x
x...x.x.x.x*9*9*xxx.x.x...x
x..9x9x9x9***O***9x9x9x9..x
@@ -1737,10 +1740,10 @@ xx..x..xxx...9xx.xx.x.x..xx
xx..xx...xxxxxx..x..x.x..xx
xx...xxx.....9..xx.xx.x..xx
xxx..9.xxxxxxxxxx..x.9x.xxx
-xxx...9......9....xx9...xxx
-xxxx..xxxxxxxxxxxxx....xxxx
-xxxxx........9........xxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx....9......9....xx9....xx
+x..x..xxxxxxxxxxxxx....x..x
+ ..xx........9........xx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 18 *, 12 monsters
@@ -1751,8 +1754,8 @@ NSUBST: O = 1:O / *:*
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x*.9.........+.........9..
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..9.........+.........9.
x...........xxx...........x
x9.........xxOxx.........9x
x....9....xx***xx.....9...x
@@ -1761,9 +1764,9 @@ x......+x.........x+......x
x.....x+...........+x.....x
x...xxx.............xxx...x
x..xx........9........xx..x
-x.xx*9...............9*xx.x
-x+xO*......9...9......*Ox+x
-x.xx*9...............9*xx.x
+x.xx*9......*........9*xx.x
+x+xO*......9.*.9......*Ox+x
+x.xx*9........*......9*xx.x
x..xx........9........xx..x
x...xxx.............xxx...x
x.....x+...........+x.....x
@@ -1772,8 +1775,8 @@ x.......xxx.9.9.xxx.......x
x....9....xx***xx.....9...x
x9.........xxOxx.........9x
x...........xxx...........x
-xO.9.........+.........9.*x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ ..9.........+.........9..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 20 *, 14 monsters
@@ -1784,29 +1787,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxx.
-xxxxxx*9..................
-xxxxxx*....9..........xx...
-xxxxxx*9...........9xxxxx.x
-xxxxxxx.........xxx.xxxxx.x
-x**O*xxxx....xxxxxx+xxxx..x
+ xxxxxxxxxxxxxxxxxxxxxx.
+ ..xxx.9.................
+x..xxx.....9..........xx...
+x..xxx.9...........9xxxxx.x
+x..xxxx.........xxx.xxxxx.x
+x....xxxx....xxxxxx+xxxx..x
x.....xxxx9.xxxxx....+.9..x
-x..9..*xxxxxxx....9..xx...x
-x9...9.Oxxxxx.......xxx...x
-x......xxxx....9...xxx....x
-x.....*xxx..9......xx.....x
-x.....xxx.........xxx.....x
-x..9.xxx......9..xxx....9.x
-x....xxx...9....xxx9......x
-x....xx........xxxx.......x
-x.9.xx..9....xxxxxxx......x
-x....+.....xxxxOxxxxx.9..9x
-x..xxxx+xxxxxx*..*xxxx****x
-x.xxxxx.xxx.....9...xxxxxxx
-x.xxxxx...........9.*xxxxxx
-x9Oxx.......9...9...Oxxxxxx
-x.9.....9...........*xxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x..9...xxxxxxx**..9..xx...x
+x9...9..xxxxx*.....*xxx...x
+x......xxxxO*..9..*xxx....x
+x......xxx*.9.....*xx.....x
+x.....xxx*.......*xxx.....x
+x..9.xxx*.....9.*xxx....9.x
+x....xxx*..9...Oxxx9......x
+x....xx*.....**xxxx.......x
+x.9.xx..9..**xxxxxxx......x
+x....+.....xxxx.xxxxx.....x
+x..xxxx+xxxxxx....xxxx....x
+x.xxxxx.xxx.....9...xxxx..x
+x.xxxxx...........9..xxx..x
+x9.xx.......9...9....xxx..x
+ .9.....9............xxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 18 *, 12 monsters
@@ -1816,29 +1819,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxx.
-xxx9***9xxx9***9xxx....9..
-xx...9.xxx......xx..xxxx9..
+ xxxxxxxxxxxxxxxxxxxxxx.
+ ..9...9xxx9***9xxx....9..
+x....9.xxx.....*xx..xxxx9..
x.....xx...xx..xx..xx*Ox.9x
x....xx..xxx..xx..xx***x..x
x.x.xx..xx...xx..xx9**xx..x
x.x....xx..xxx..xx.9xxx...x
x.x9.xxx..xx...xx..xx...xxx
x.x.xx...xx..xxx..xx..xxx9x
-x.xxx..xxx..xx...xx..xx..*x
+x.xxx..xxx..xx...xx..xx.**x
x.xx..xx...xx..xxx..xx...*x
x.x..xx..xxx9.xx...xx..x.*x
x.x.xx..xx...xx..xxx..xx.9x
x.x....xx..xxx..xx...xx..xx
x.x.9.xx..xx...xx..xxx..xxx
-x.xx.xx..xx..xxx..xx...xxxx
-x9.xxx..xx..xx...xx..xxx.9x
-x...x..xx..xx..xxx..xx...*x
-x...9.xx..xx..xx...xx...9*x
-xx.9..xx.9...xx..9....xx.*x
-xxx....xxxxxxxxxxxxxxxx..9x
-xxxx..9..................xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.xx...9.xx..xxx..xx...xxxx
+x9*xxx...x..xx...xx..xxx.9x
+x..*xxxx...xx..xxx..xx....x
+xx..9xxx..xx..xx...xx...9.x
+xx...*xx.9...xx..9....xx..x
+x.....*xxxxxxxxxxxxxxxx..9x
+ ..xx.9...................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
###############################################################################
@@ -1854,9 +1857,9 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x......x|**.....9xxx......
-x......xO|*.....xx9.......x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ......x|****...9xxx......
+x......xO|*||...xx9.......x
x......xx|*....9x........xx
x...x...xxx....xx........xx
x...x..........x9......9xxx
@@ -1864,19 +1867,19 @@ x...x9........9x.....9xxx9x
x...xx........xx...xxxx9..x
x....x9......9x..xxx9.....x
x....xx9....9xx.xx9.......x
-x.....xxx99xxx..x9........x
-x.......xxxx...xx.........x
+x.....xxx99xxx..x9.......|*x
+x.......xxxx...xx.......|*x
x..............x9.....x***x
x...xxxx.......x9.....x||*x
x.....9xxx.....xx.....xxO|x
x.......9xx.....x9.....xxxx
xxxx.....9x.....xx9.......x
-x|Oxx.....xx.....xxx9.....x
-x*||x.....9x.......xxxx...x
-x***x.....9x..............x
+x..xx.....xx.....xxx9.....x
+x...x.....9x.......xxxx...x
+x...x.....9x..............x
x.........xx..............x
-x........9x...............x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ ........9x...............
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1888,29 +1891,29 @@ NSUBST: * = 1:O / *:*
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xx$9$xxxxxx.9xxxxxxxxxxxx.
-x$.$.$xxxx9...xxxxxxxxxx.xx
-x9$.$9xxxx...9xxxxxxxxx.xxx
-x$.$.$xxx.x9.xxxxxxxxx.xxxx
-xx$9$xxx.xxxx.xxx.9.x.xxxxx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ x.9.xxxxxx*9xxxxxxxxxxxx
+x.....xxxx9..*xxxxxxxxxx.xx
+x9.$.9xxxx*..9xxxxxxxxx.xxx
+x.....xxx.x9*xxxxxxxxx.xxxx
+xx.9.xxx.xxxx.xxx.9.x.xxxxx
xxx.xxx.xx$9xx.x.....xxxxxx
-xxxx.x.xx$.$9xx.9...9xxxxxx
-xxx.9.xxx9$.$xxx.....xxxxxx
-xx.....x.x9$xxxxx.9.x.xxxxx
-xx9...9.xxxxxxxxxx.xxx.xxxx
-xx.....x.xxxxxxxx.xxxxx.9xx
-xxx.9.xxx.xxxxxx.xxxxx9...x
-xxxxxxxxxx.xxxx.xxxxx....9x
-xxx9*.*xxxx.9x.xxxxx.xx9.xx
-xx.*.*.*xx9...xxxxx.xxxxxxx
-x.*.*.*.*x...9xxxx.xxx*9xxx
-x*.*.*.*9xx9.xx.9.xxx*.*9xx
-x9*.*.*.*x.xxx.....xx9*.*xx
-x*.*.*.*..xxxx9...9x.x9*xxx
-xx*.*.*.xxxxxx......xxxxxxx
-xxx*.*9xxxxxxxx.9.xxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xxxx.x.xx$*$9xx.9.$.9xxxxxx
+xxx.9.xxx9$*$xxx.....xxxxxx
+xx.$.$.x.x9$*$xxx.9.x.xxxxx
+xx9.$.9.xxxx$*$xxx.xxx.xxxx
+xx.$.$.x.xxxx$x.x.xxxxx*9xx
+xxx.9.xxx.xxxxxx.xxxxx9..*x
+xxxxxxxxxx.xxxx.xxxxx.*..9x
+xxx9*.*xxxx*9x.xxxxx.xx9*xx
+xx.*.*.*xx9..*xxxxx.xxxxxxx
+x........x*..9xxxx.xxx.9xxx
+x.......9xx9*xx*9*xxx.$.9xx
+x9.......x.xxx*.*.*xx9...xx
+x.........xxxx9*.*9x.x9..xx
+x.......xxxxxx*.*.*.xxx...x
+ x....9xxxxxxxx*9*xxxxxx.x
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1922,8 +1925,8 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
- xxxxxxxxxxxxxxxxxxxxxxxxx
- .........................x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x..xx9...............9xx..x
x..xxx...............xxx..x
x..9xxx.............xxx9..x
@@ -1943,8 +1946,8 @@ x....xxx...........xxx....x
x..9xxx.............xxx9..x
x..xxx...............xxx..x
x..xx9...............9xx..x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1955,8 +1958,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xx9......9xxxxxxx9........
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .9......9xxxxxxx9.......
x9.........xxxxx..........x
x..xxxxx....xxx....xxxxx..x
x..xxx..x...9x9...x..xxx..x
@@ -1976,8 +1979,8 @@ x..xx|...x.......x...|xx..x
x..xxx..x...9x9...x..xxx..x
x..xxxxx....xxx....xxxxx..x
x9.........xxxxx.........9x
-xx9......9xxxxxxx9......9xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .9......9xxxxxxx9......9.
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -1985,32 +1988,33 @@ ENDMAP
NAME: vaults_end_minmay_slanted
TAGS: vaults_end_quadrant_prize
SUBST: 9 = 8 9 .:20
+NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xO|||||||||.....9.....xxxxx
-x||||||xxxx..9..9..xxxx***x
-x|||xxxx..9..9..xxxx......x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ...............9..**|xxxx
+x......xxxx..9..9..xxxx....
+x...xxxx..9..9..xxxx......x
xxxxx.....9..xxxx.........x
x.........xxxx..9.........x
x......xxxx..9..9..xxxx999x
x999xxxx..9..9..xxxx......x
x.........9..xxxx.........x
-x.........xxxx..9.....xxxxx
-x......xxxx..9..9..xxxx***x
-x***xxxx..9..9..xxxx......x
-xxxxx.....9..xxxx.........x
+x.........xxxx||......xxxxx
+x|.....xxxx||O||999xxxx***x
+x***xxxx999||O||xxxx.....|x
+xxxxx......||xxxx.........x
x.........xxxx..9.........x
x......xxxx..9..9..xxxx999x
x999xxxx..9..9..xxxx......x
x.........9..xxxx.........x
-x.........xxxx..9.....xxxxx
-x......xxxx..9..9..xxxxxxxx
-x***xxxx..9..9..xxxxxxxxxxx
-xxxxx.....9..xxxxxxxxxxxxxx
- .........xxxxxxxxxxxxxxxxx
- xxxxxxxxxxxxxxxxxxxxxxxxx
+x.........xxxx..9.....xxx.x
+x|.....xxxx..9..9..xxxx...x
+x***xxxx..9..9..xxxx......x
+xxxxx.....9..xxxx.........x
+ .........xxxx|**.........
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2023,65 +2027,65 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
- xxxxxxxxxxxxxxxxxxxxxxxxx
- .................xxxxxxxxx
-x...................9xxxxxx
-x.....................9xxxx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ................xxxxxx..
+x...................9xx...x
+x.....................9..xx
x.......9xxcccccxx.....9xxx
x....9xxxx9.....9xxxx...xxx
x...9xx9...........9xx..9xx
x...xx...............xx..xx
x..9x9...xxaaaaaxx...9x..xx
-x..xx..xxx9.....9xxx..xx.*x
-x..d9.xx9..|||||..9xx.9b.*x
-x..d..b...|||O|||...d..b.*x
-x..d9.xx9..|||||..9xx.9b.*x
-x..xx..xxx9.....9xxx..xx.*x
+x..xx..xxx9.*.*.9xxx..xx..x
+x..d9.xx9**|||||**9xx.9b..x
+x..d..b..*|||O|||*..d..b.*x
+x..d9.xx9**|||||**9xx.9b.*x
+x..xx..xxx9.*.*.9xxx..xx.*x
xx..x9...xxcccccxx...9x..xx
xx..xx...............xx..xx
xx9..xx9...........9xx..9xx
xxx...xxxx9.....9xxxx...xxx
xxx9.....xxaaaaaxx.....9xxx
-xxxx9.................9xxxx
-xxxxxx9.............9xxxxxx
-xxxxxxxxx*********xxxxxxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+xx..9.................9..xx
+x...xx9.............9xx...x
+ ..xxxxxx**......*xxxxxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
-# about 25 |
+# about 21 |, 29 *
NAME: vaults_end_mu_corners
TAGS: vaults_end_quadrant_prize
-SUBST: 9 = 8 9 .:10
+SUBST: 9 = 8 9 .
NSUBST: $ = 1:O / *:$
-SUBST: $ = | *:20 $
+SUBST: $ = | *:15 $:5
SUBST: a = x.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x$$$$x.......x99...x..$$$$x
-x$$$$x.......x99...x.x$$$$x
-x$$$$x..xxx..x..x..x.x$$$$x
-x$$$$x..xxx..x..x..x.x$$$$x
-x.xxxx..xxx..x..x..x.xxxxxx
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ....x.......x99...x......
+x....x.......x99...x..x...x
+x....x..xxx..x..x..x..x...x
+x.xxxx..xxx..x..x..x..x...x
+x.......xxx..x..x..x..xxxxx
x.......xxx.....x99.......x
xxxxxx..xxx.....x99.......x
-x.......xxxxxxxxxxxxxxxx..x
-x.......x99...$$$$x99.....x
-x..xxxxxx99xxx$$$$x99.....x
-x99.....x..xxx$$$$x..xxxxxx
-x99.....x..xxx$$$$x.....99x
-xxxxxx..x..xxxxxxxx.....99x
+x.......xxxxx+xxxxxxxxxx..x
+x.......x99x$$$$$$x99.....x
+x..xxxxxx99x$$$$$$x99.....x
+x99........x$$$$$$x..xxxxxx
+x99........x$$$$$$x.......x
+xxxxxx..x..x$$$$$$x.......x
x.......x..xxxxxxxxxxxxx..x
-x.......x.................x
-x..xxxxxx.................x
-x99.....x..xxxxxxxxx.xxxxxx
-x99.....x..xxx$$$$xx.x$$$$x
-xxxxxx..x..xxx$$$$xx.x$$$$x
-a.......x99xxx$$$$xx.x$$$$x
- .......x99...$$$$xx..$$$$x
- axxxxxxxxxxxxxxxxxxxxxxxx
+x.......x...............99x
+x..xxxxxx...............99x
+x99.....x..xxxx+xxxx..xxxxx
+x99.....x..x$$$$$$$x..x...x
+xxxxxx..x..x$$$$$$$x..x...x
+a.......x99x$$$$$$$x..x...x
+ .......x99x$$$$$$$x......
+ axxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2099,12 +2103,12 @@ SUBST: a = x.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x999......................x
-x999xxxxxxxxxxxxxxxxxxxxs.x
-x999....................x.x
-x.x.xxxxxxxxxxxxxxxxxxs.x.x
-x.x.x999..............x.x.x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
+x.99xxxxxxxxxxxxxxxxxxxxs.x
+x.9999..................x.x
+x.x9xxxxxxxxxxxxxxxxxxs.x.x
+x.x9x999..............x.x.x
x.x.x999xxxxxxxxxxxxs.x.x.x
x.x.x999;;;;;;;;$$$$x.x.x.x
x.x.x.x;;;;;;;;;$$$$x.x.x.x
@@ -2120,8 +2124,8 @@ x.x.x................999x.x
x.x.sxxxxxxxxxxxxxxxx999x.x
x.x..................999x.x
x.sxxxxxxxxxxxxxxxxxxxxxx.a
-x.........................
-xxxxxxxxxxxxxxxxxxxxxxxxa
+ ........................
+ xxxxxxxxxxxxxxxxxxxxxxa
ENDMAP
############################################################
@@ -2133,33 +2137,36 @@ SUBST: $ = |*$.
SUBST: c = xn9.
SUBST: 9 = 8 9 .
NSUBST: D = 1:+ / *:x
+NSUBST: E = 1:+ / *:x
+NSUBST: F = 1:+ / *:x
+NSUBST: G = 1:+ / *:x
SUBST: a = xn..
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
- axxxxxxxxxxxxxxxxxxxxxxxx
- ..c.c.c.c.c.c.c.c.c.c.c.cx
-a.c.c.c.c.c.c.c.c.c.c.c.c.x
-xc.c.c.c.c.c.c.c.c.c.c.c.cx
-x.c.c.c.c.c.c.c.c.c.c.c.c.x
-xc.c.c.c.c.c.c.c.c.c.c.c.cx
-x.c.c.c.c.c.c.c.c.c.c.c.c.x
-xc.c.c.c.c.c.c.c.c.c.c.c.cx
-x.c.c.c.c.c.c.c.c.c.c.c.c.x
-xc.c.c.c.c.c.c.c.c.c.c.c.cx
-x.c.c.c.c.c.c.c.c.c.c.c.c.x
-xDxDxDxDxDxDxDxDxDxDxDxDxDx
-x.........................x
-x.........................x
-x.9x..x..x..x9x..x..x..x9.x
-x.........................x
-x.........................x
-xxx+xxxx+xxxx+xxxx+xxxx+xxx
-x$$$$x$$$$$x$$$x$$$$$x$$$$x
-x$$$$x$$$$$x$$$x$$$$$x$$$$x
-x$$$$x$$$$$x$$$x$$$$$x$$$$x
-x$$$$x$$$$$x$$$x$$$$$x$$$$x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ axxxxxxxxxxxxxxxxxxxxxa
+ .c.c.c..x$$$$$x..c.c.c..
+a.c.c.c.c.+$$$$$+.c.c.c.c.a
+xc.c.c.c..x$$$$$x..c.c.c.cx
+x.c.c.c.c.xxxxxxx.c.c.c.c.x
+xc.c.c.c.cx$$$$$xc.c.c.c.cx
+x.c.c.c.c.x$$$$$x.c.c.c.c.x
+xc.c.c.c.cx$$$$$xc.c.c.c.cx
+x.c.c.c.c.x$$$$$x.c.c.c.c.x
+xDxDxDxDxDxxx+xxxExExExExEx
+x.........x$$$$$x.........x
+x.x9.x..x.+$$9$$+.x..x.9x.x
+x.........x$$$$$x.........x
+xFxFxFxFxFxxx+xxxGxGxGxGxGx
+x.c.c.c.c.x$$$$$x.c.c.c.c.x
+xc.c.c.c.cx$$$$$xc.c.c.c.cx
+x.c.c.c.c.x$$$$$x.c.c.c.c.x
+xc.c.c.c.cx$$$$$xc.c.c.c.cx
+x.c.c.c.c.xxxxxxx.c.c.c.c.x
+xc.c.c.c..x$$$$$x..c.c.c.cx
+a.c.c.c.c.+$$$$$+.c.c.c.c.a
+ ..c.c.c..x$$$$$x..c.c.c..
+ axxxxxxxxxxxxxxxxxxxxxa
ENDMAP
############################################################
@@ -2173,10 +2180,10 @@ SUBST: ! = x:20 .
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................x
+ x.xxxxxxxxxxxxxxxxxxxxx
+ .........................
x.!x..9..xx............x!.x
-x..xx.....xx.9...9..9.xx..x
+...xx.....xx.9...9..9.xx..x
x...xx..9..xx........xx.9.x
x....xx.....xx.9..9.xx....x
x..9..xx..9..xx****xx.9...x
@@ -2194,8 +2201,8 @@ x....xx..9.....9.xx.....xxx
x...xx............xx..9..xx
x..xx..9....9....9.xx.....x
x.!x...............|xx....x
-x..................|?xx...
-xxxxxxxxxxxxxxxxxxxxxxxxx
+ ..................|?xx...
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2216,33 +2223,33 @@ SUBST: a : x.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxxxxxxxx'''x...........x
-xxxxxxx'''D'S'x...........x
-x'''''B'S'D'''x...........x
-x''S''B'''x+++x....xxx....x
-x'''''x+++x........xxx....x
-xxAAAxx............xxx....x
-xx'''+....................x
-xx'S'+...T................x
-xx'''+....................x
-xxCCxx....................x
-x'''+.....................x
-x'S'+.....................x
-x'''+.....................x
-xxxxx.....................x
-x.........................x
-x.........................x
-x...xxx...................x
-x...xxx...................x
-x...xxx...................a
-x.........................a
-x.........................
-xxxxxxxxxxxxxxxxxxxxxxxaa
-ENDMAP
-
-############################################################
-# 27 *, 1 |, 16 monsters
+ aaxxxxxxxxxxxxxxxxxxxaa
+ .........................
+a.........................a
+a..................xxx....a
+x..............x+++xxx....x
+x..........x+++x'''xxx....x
+x..........x'''D'S'xx.....x
+x..........x'S'D'''xx.....x
+x........xxx'''xxxxxx.....x
+x........xxxBBBxxxxxx.....x
+x........xx''''xx.........x
+x......T.xx'ST'xx.T.......x
+x........xx''''xx.........x
+x....xxxxxxAAAxxx.........x
+x....xxxxxx'''xxx.........x
+x....xx'''C'S'x...........x
+x....xx'S'C'''x...........x
+x...xxx'''x+++x...........x
+x...xxx+++x...............x
+a...xxx...................a
+a.........................a
+ ........................
+ aaxxxxxxxxxxxxxxxxxxxaa
+ENDMAP
+
+############################################################
+# 26 *, 16 monsters
NAME: vaults_end_minmay_bent_boxes
TAGS: vaults_end_quadrant_prize
SUBST: 9 = 8 9 .:20
@@ -2250,29 +2257,29 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.....9............9......
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .....9............9.....
x.....9............9......x
x.....xxxxxxxxxxxxxx......x
x................9.xx.....x
x................9..xx....x
x99x.....xxxxxxxxx...xx...x
x..x....xx.9..........xx99x
-x..x...xx..9...........x..x
-x..x..xx...xxxxxxx..x99x..x
-x..x..x....******x..x..x..x
+x..x...xx*.9...........x..x
+x..x..xx**.xxxxxxx..x99x..x
+x..x..x...*******x..x..x..x
x..x..x99x***O***x99x..x..x
-x..x..x..x******....x..x..x
-x..x99x..xxxxxxx...xx..x..x
-x..x...........9..xx...x..x
+x..x..x..x*******...x..x..x
+x..x99x..xxxxxxx.**xx..x..x
+x..x...........9.*xx...x..x
x99xx..........9.xx....x..x
x...xx...xxxxxxxxx.....x99x
x....xx..9................x
-x*....xx.9................x
-x**....xxxxxxxxxxxxxx.....x
-x***...9............9.....x
-xO***..9............9.....x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.....xx.9................x
+x......xxxxxxxxxxxxxx.....x
+x......9............9.....x
+ ......9............9.....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2284,8 +2291,8 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.........................x
x..xxxx..xxxxxxxxx..xxxx..x
x.....x..9..*x*..9..x.....x
@@ -2298,15 +2305,15 @@ x........x.......x........x
x........x.......x........x
x..xxxx99xx99x99xx99xxxx..x
x..xxxx..xx..x..xx..xxxx..x
-x..9.*x..x.......x..x*.9..x
-x..9.*x**x.......x**x*.9..x
-x..xxxxxxxx..x..xxxxxxxx..x
-x..x**x**x.......x**x**x..x
-x..x..x..x.......x..x..x..x
-x..x99x99xx99x99xx99x99x..x
+x..9.*x......x......x*.9..x
+x..9.*x**....x....**x*.9..x
+x..xxxxxxxx99x99xxxxxxxx..x
+x..x**x**x*..x..*x**x**x..x
+x..x..x..x*..x..*x..x..x..x
+x..x99x99xxxxxxxxx99x99x..x
x.........................x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2318,8 +2325,8 @@ NSUBST: | = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9...9...9...9...9...9....
+ xxxxxxxxxxxxxxxxxxxxxxx
+ 9...9...9...9...9...9...
x.x.x.xxx.x.x.xxx.x.x.xxx.x
x.x*x..*..x*x..*..x*x..*..x
x.x.x.xxx.x.x.xxx.x.x.xxx.x
@@ -2339,8 +2346,8 @@ x9...9...9...9...9...9...9x
x.x.x.xxx.x.x.xxx.x.x.xxx.x
x.x*x..*..x*x..*..x*x..*..x
x.x.x.xxx.x.x.xxx.x.x.xxx.x
-x....9...9...9...9...9...9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ ....9...9...9...9...9...9
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2352,8 +2359,8 @@ NSUBST: | = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........................
x.xx9..9xx.......xx9..9xx.x
x.xxx**xxx.......xxx**xxx.x
x.9xxxxxx9.xxxxx.9xxxxxx9.x
@@ -2373,8 +2380,8 @@ x..*xxxx*..x|||x..*xxxx*..x
x.9xxxxxx9.xxxxx.9xxxxxx9.x
x.xxx**xxx.......xxx**xxx.x
x.xx9..9xx.......xx9..9xx.x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2386,9 +2393,9 @@ NSUBST: | = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxxxx.....8x8.......8x8...
-xxx........x.........x....x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xx.....8x8.......8x8..
+x..........x.........x....x
xx....x.........x.........x
xx...9x9.......9x9.......8x
x...xxxxx..x..xxxxx..x..xxx
@@ -2406,9 +2413,9 @@ x....9x9.......9x9.......8x
x.....x.........x.........x
xx.......................xx
xx....xxxxx.....xxxxx....xx
-xxx...*|x|*.....*|x|*...xxx
-xxxxx.*|x|*.....*|x|*.xxxxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.......x||**.**||x.......x
+ ..xx...x||**.**||x...xx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2420,8 +2427,8 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .........................
x..xx9..9xx.....xx9..9xx..x
x.xxxx..xxxx...xxxx..xxxx.x
x.xxxx..xxxx...xxxx..xxxx.x
@@ -2441,8 +2448,8 @@ x..9..**..9.....9..**..9..x
x..xx....xx.....xx....xx..x
x..xx9xx9xx.....xx9xx9xx..x
x.....xx...........xx.....x
-x.........................x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+ .........................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2453,29 +2460,29 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x9999x......xx......xx....
+ xxxxxxxxxxxxxxxxxxxxxxx
+ .999x......xx......xx...
x....x......xx......xx....x
x....9..xx...9..xx....9...x
x....9..xx...9..xx.....9..x
x....x......xx..........xxx
x....x......xx..9.......xxx
x.99.x..xx.......9..xx....x
-x....x..xx..........xx....x
-x....x....9.....xx..9...xxx
-x....x.....9....xx..9...xxx
-x....x......xx......xx....x
-x....x......xx......xx....x
-x...9x99xx......xx......xxx
-x..9.x*.xx......xx......xxx
-x.9..x|*.9......9........9x
-x9...x||*9......9........9x
+x....x*.xx..........xx....x
+x....x*...9.....xx..9...xxx
+x....x|....9....xx..9...xxx
+x...9x|.....xx......xx....x
+x..9.x|99...xx......xx....x
+x.9..x|9xx......xx......xxx
+x9...x||xx9.....xx......xxx
+x....x|*|99.....9........9x
+x....xO||||||**.9........9x
xxxx.xxxxxxxxxxxxxxxxx..xxx
-x||*.....9...............9x
-x||**x..9............9...9x
-x||||x.9.............9...9x
-xO|||x9..................9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x..........9.............9x
+x....x....9..........9...9x
+x....x...9...........9...9x
+ ....x..9.................
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2487,29 +2494,29 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x**|Ox9...9x9....x9.......
-x.**|x.9.9.x.9...x.9......x
-x..**x..x..x..x..x..xxxx..x
-x...*x..x..x..x..x.....x..x
-x9xxxx..x..x..x..x.....x..x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ....x9***9x9....x9.......
+x....x.9.9.x.9...x.9......x
+x....x..x..x..x..x..xxxx..x
+x....x..x..x..x..x...**x..x
+x9xxxx..x..x..x..x...**x..x
x...9x..x..x..x..x..x..x..x
x..9.x..x..x..x...9.....9.x
x.9..x..x..x..x....9.....9x
-x9...x..x..x..xxxx..xxxxxxx
-x....x..x..x9....x........x
-x....x..x..x.9...x........x
-x....x..x..x..x..xxxxxxx..x
-x....x..x9.....9........9.x
-x....x..x.9.....9........9x
+x....x..x..x..xxxx..xxxxxxx
+x....x..x..x9..|Ox........x
+x....x..x..x.9..|x.......*x
+x....x..x..x..x..xxxxxxx.*x
+x....x..x|.....9........9*x
+x....x..xO|.....9........9x
x....x..xxxx..xxxxxxxxxxxxx
-x....x....9x9............9x
-x....x...9.x.9..........9.x
+x....x*...9x9............9x
+x....x**.9.x.9..........9.x
x....xxxx..xxxxxxxxxxxxx..x
-x...9......x.**|OxO|**.x..x
-x..9.......x..**|x|**..x..x
-x.9........9...**x**...9..x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.9.9......x.**|Ox.....x..x
+x..9.......x..**|x.....x..x
+ .9........9...**x.....9..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2522,29 +2529,29 @@ SUBST: X : x., Y : x.
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xx*O*x.9.x.9.x.9.x.9.x.9.x
-x*x*x.x.x.x.x.x.x.x.x.x.x.x
-xO*x.9.x.9.x...x.9.x.9.x.9x
-x*x.x.x.x.xYx.xYx.x.x.x.x.x
+ .xxxxxxxxxxxxxxxxxxxxxxx
+.....x.9.x.9.x.9.x.9.x.9.
+x.x.x.x.x.x.x*x.x.x.x.x.x.x
+x..x.9.x.9.x*O*x.9.x.9.x.9x
+x.x.x.x.x.xYx*xYx.x.x.x.x.x
xx.9.x.9.xYYYxYYYx.9.x.9.xx
-x.x.x.x.xXxYxYxYxXx.x.x.x.x
-x9.x.9.xXXXxYYYxXXXx.9.x.9x
+x.x.x.x|xXxYxYxYxXx*x.x.x.x
+x9.x.9|xXXXxYYYxXXXx.9.x.9x
x.x.x.xYxXxXxYxXxXxYx.x.x.x
xx.9.xYYYxXXXxXXXxYYYx.9.xx
-x.x.xXxYxYxXxXxXxYxYxXx.x.x
-x9.xXXXxYYYxXXXxYYYxXXXx.9x
-x.x.xXxYxYxXxXxXxYxYxXx.x.x
+x*x*xXxYxYxXxXxXxYxYxXx*x*x
+x9OxXXXxYYYxXXXxYYYxXXXxO9x
+x*x*xXxYxYxXxXxXxYxYxXx*x*x
xx.9.xYYYxXXXxXXXxYYYx.9.xx
x.x.x.xYxXxXxYxXxXxYx.x.x.x
-x9.x.9.xXXXxYYYxXXXx.9.x.9x
-x.x.x.x.xXxYxYxYxXx.x.x.x.x
+x9.x.9.xXXXxYYYxXXXx|9.x.9x
+x.x.x.x*xXxYxYxYxXx|x.x.x.x
xx.9.x.9.xYYYxYYYx.9.x.9.xx
-x*x.x.x.x.xYx.xYx.x.x.x.x*x
-xO*x.9.x.9.x...x.9.x.9.x*Ox
-x*x*x.x.x.x.x.x.x.x.x.x*x*x
-xx*O*x.9.x.9.x.9.x.9.x*O*xx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.x.x.x.x.xYx*xYx.x.x.x.x.x
+x..x.9.x.9.x*O*x.9.x.9.x..x
+x.x.x.x.x.x.x*x.x.x.x.x.x.x
+ ....x.9.x.9.x.9.x.9.x....
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2555,8 +2562,8 @@ SUBST: 9 = 8 9 .:20
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-x....9x.................x.
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ....9x.................x
x....x.x...............x9xx
x....xx9x.............x.xxx
x...x.xx.x...........x9xx.x
@@ -2572,12 +2579,12 @@ x...9......xxxxxxxxxO||**.x
x...x.....xx9x...x.xx||**.x
x........xx.x.....x9xx|**.x
x...x...xx9x.......x.xx**.x
-x...9..xx.x.........x9xx*.x
+x...9..xx.x.........x9xx*9x
x...x.xx9x...........x.xx9x
-x....xx.x.............x9x9x
-x....x9x...............x..x
-x.....x.................x9x
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x....xx.x.............x9xxx
+x....x9x...............x.xx
+ .....x.................x9
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2590,29 +2597,29 @@ SUBST: * = * $:4
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xO***$...9...xx..xx.......
-x*||*$...xx..xx...9....9..x
-x****xx..xx...x.......xxxxx
-xxx$$xx.......x.9.xx..xx..x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ........9...xx..xx.......
+x........xx..xx...9....9..x
+x....xx..xx...x.......xxxxx
+xxx..xx.......x.9.xx..xx..x
xxx.......9...xx..xx......x
x.9.......xxxxxx...x.9....x
-x.....xx..xx.9.....x...xx.x
-x.xx..xx...........xxxxxx.x
-xxxx...x.9.....xx..xx.9...x
-x....9.x...xxxxxx.........x
-x......xxxxxx...x.......xxx
-x..xxxxxx....9..x...xx..xxx
-x9.xx....9......xxxxxx...9x
-x...9.......xx..xx..9.....x
-x.......xxxxxx...x.......xx
-x...xx..xx...9...x...xx$$xx
-xx..xx..9x.......xx..xx***x
-x*$......x...xxxxxx...$*|*x
-x|*$.....xx..xx..9....$*|*x
-x$|*$xx..xx...........xx|*x
-xO$|*xx9..x9......xx..xx*Ox
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.....xx|.xx.9.....x...xx.x
+x.xx..xx|..........xxxxxx.x
+xxxx..*x|9..$$$xx*.xx.9...x
+x....9*xO||xxxxxx*........x
+x..$***xxxxxx||Ox*......xxx
+x..xxxxxx$$$..9|x***xx..xxx
+x9.xx$$..9.....|xxxxxx...9x
+x...9.......xx.*xx***$....x
+x.......xxxxxx..*x*9.....xx
+x...xx..xx...9..*x*..xx..xx
+xx..xx..9x...$***xx..xx...x
+x........x...xxxxxx.......x
+x........xx..xx$$9........x
+x....xx..xx...........xx..x
+ ....xx9..x9......xx..xx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
# 21 |, 20 monsters
@@ -2623,9 +2630,9 @@ NSUBST: O = 1:O / *:|
: vaults_end_loot(_G)
: vaults_end_rune(_G)
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxx
-xxOxxx|xxx|xxx|xxx|xxx|x..
-xO9.x.9.x.9.x.9.x.9.x.9.x.x
+ xxxxxxxxxxxxxxxxxxxxxxx
+ ..xxx|xxx|xxx|xxx|xxx|x.
+x.9.x.9.x.9.x.9.x.9.x.9.x.x
xx.x.x.x.x.x.x.x.x.x.x.x.xx
xxx.9.x.9.x.9.x.9.x.9.x.9|x
xx.x.x.x.x.x.x.x.x.x.x.x.xx
@@ -2634,18 +2641,18 @@ xx.x.x.x.x.x.x.x.x.x.x.x.xx
xxx.9.x.9.x.9.x.9.x.9.x.9|x
xx.x.x.x.x.x.x.x.x.x.x.x.xx
x|9.x.9.x.9.x.9.x.9.x.9.xxx
-xx.x.x.x.x.x.x.x.x.x.x.x.xx
-xxx.9.x.9.x.9.x.9.x.9.x.9|x
-xx.x.x.x.x.x.x.x.x.x.x.x.xx
+xx.x.x.x.x.xOx.x.x.x.x.x.xx
+xxx|9.x.9.x.9Ox.9.x.9.x.9|x
+xx.x.x.x.x.x.xOx.x.x.x.x.xx
x|9.x.9.x.9.x.9.x.9.x.9.xxx
xx.x.x.x.x.x.x.x.x.x.x.x.xx
xxx.9.x.9.x.9.x.9.x.9.x.9|x
xx.x.x.x.x.x.x.x.x.x.x.x.xx
-xO9.x.9.x.9.x.9.x.9.x.9.xxx
+x|9.x.9.x.9.x.9.x.9.x.9.xxx
xx.x.x.x.x.x.x.x.x.x.x.x.xx
-xxx.9.x.9.x.9.x.9.x.9.x.9Ox
-xxxxOxxx|xxx|xxx|xxx|xxxOxx
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
+x.x.9.x.9.x.9.x.9.x.9.x.9.x
+ ..x|xxx|xxx|xxx|xxx|xxx..
+ xxxxxxxxxxxxxxxxxxxxxxx
ENDMAP
############################################################
@@ -2670,29 +2677,29 @@ SUBVAULT: Y : vaults_end_room
SUBVAULT: Z : vaults_end_room
SUBST: VXYZ = .
MAP
-xxxxxxxxxxxxxxxxxxxxxxxxxxx
-x.........................x
-x.xxxxxxxxxxx..xxxxxxxxJxIx
+ axxxxxxxxxxxxxxxxxxxxxa
+ ............99...........
+a.xxxxxxxxxxx..xxxxxxxxJxIa
x.xVVVVVVVVVx..xXXXXXXXXx.x
x.xVVVVVVVVVx..xXXXXXXXXx.x
x.xVVVVVVVVVx..xXXXXXXXXx.x
x.xVVVVVVVVVx..xXXXXXXXXx.x
x.xVVVVVVVVVx..xXXXXXXXXx.x
x.xVVVVVVVVVx..xXXXXXXXXx.x
-x.xVVVVVVVVVL..KXXXXXXXXx.x
-x.NVVVVVVVVVxxxxxxxxxxxxx.x
-xMxxxxxxxxxxx99988......A.x
-x...........G99xxxxxxxxDx.x
-x.xxxxxxxxxFx99xZZZZZZZZx.x
-x.xYYYYYYYYYx88xZZZZZZZZx.x
+x.NVVVVVVVVVL..KXXXXXXXXx.x
+xMxxxxxxxxxxxxxxxxxxxxxxx.x
+x.9.........G998........A.x
+x.9.........G998........x.x
+x.xxxxxxxxxFx88xxxxxxxxDx.x
+x.xYYYYYYYYYx..xZZZZZZZZx.x
x.xYYYYYYYYYx..xZZZZZZZZx.x
x.xYYYYYYYYYx..xZZZZZZZZx.x
x.xYYYYYYYYYx..xZZZZZZZZx.x
x.xYYYYYYYYYx..xZZZZZZZZx.x
x.xYYYYYYYYYx..CZZZZZZZZx.x
-x.xxxxxxxxxEx..xxxxxxxxxx.a
-x...........H..B..........
-xxxxxxxxxxxxxxxxxxxxxxxxa
+a.xxxxxxxxxEx..xxxxxxxxxx.a
+ ...........H..B.........
+ axxxxxxxxxxxxxxxxxxxxxa
ENDMAP
# Vaults:$ - Rooms Quadrant - Traps and Loot Subvault
diff --git a/crawl-ref/source/dat/des/builder/layout.des b/crawl-ref/source/dat/des/builder/layout.des
index 24ae4e7dda..bfcbd5f919 100644
--- a/crawl-ref/source/dat/des/builder/layout.des
+++ b/crawl-ref/source/dat/des/builder/layout.des
@@ -1592,7 +1592,7 @@ ENDMAP
NAME: layout_swamp
DEPTH: Swamp
-CHANCE: 100%
+WEIGHT: 25
ORIENT: encompass
TAGS: overwritable layout allow_dup unrand layout_type_swamp
{{
diff --git a/crawl-ref/source/dat/des/builder/layout_caves.des b/crawl-ref/source/dat/des/builder/layout_caves.des
index de31cf89d1..4839a199a6 100644
--- a/crawl-ref/source/dat/des/builder/layout_caves.des
+++ b/crawl-ref/source/dat/des/builder/layout_caves.des
@@ -247,6 +247,50 @@ TAGS: overwritable layout allow_dup unrand layout_type_caverns
theme.D.caves(_G)
}}
+# A mash-up of layout_waterfall and layout_pools for Swamp,
+# with dripping splatters in a more enclosed layout.
+# TODO: Somebody with greater noise manipulation prowress than I
+# should widen the occasional thin corridor at the end of each drip.
+NAME: layout_falls_marsh
+DEPTH: Swamp:1-4
+ORIENT: encompass
+TAGS: overwritable layout allow_dup unrand layout_type_caverns no_pool_fixup
+KFEAT: t = mangrove
+{{
+ if is_validating() then return end
+
+ local gxm,gym = dgn.max_bounds()
+ local limit,border,margin = 0.35,8,8
+ local reps = crawl.random_range(0.7,0.85)
+
+ local fcaves = procedural.worley_diff { scale = .075/reps }
+ fcaves = procedural.transform.polar_inverse(fcaves,gym/1.8,gxm/reps,gym/2)
+ fcaves = procedural.add(fcaves,procedural.mul(limit,procedural.border{padding=border,margin=margin}))
+
+ procedural.render_map(_G,fcaves,function(value) return value < limit and '.' or 't' end)
+ zonify.map_fill_zones(_G, 1)
+
+ local pool_contents = {}
+ pool_contents["w"] = 75 + you.depth() * 10
+ pool_contents["W"] = 60 - you.depth() * 10
+ pool_contents["c"] = 5 + you.depth() * 5
+ pool_contents["t"] = 10
+ add_pools { replace = ".",
+ pool_size = 8 + crawl.random2(8),
+ contents = pool_contents,
+ frequency = pool_frequency }
+
+ subst('W = W:75 t')
+ subst('w = w:75 t')
+ subst('c = .:570 w W t')
+ subst('. = .:' .. 71 - you.depth() * 4 .. ' W:' .. 29 + you.depth() * 4)
+ subst('x = t')
+
+ remove_isolated_glyphs { find = "w", percent = 80 }
+ remove_isolated_glyphs { find = "W", percent = 80 }
+ zonify.grid_fill_water_zones(1,"t")
+}}
+
# Intended as a series of interconnected roughly geometrically-shaped rooms
# for e.g. Dis/Zot, came out much more organic like a burrow of caves.
NAME: layout_cave_pods
diff --git a/crawl-ref/source/dat/des/portals/icecave.des b/crawl-ref/source/dat/des/portals/icecave.des
index cc2c3956ea..e65af46927 100644
--- a/crawl-ref/source/dat/des/portals/icecave.des
+++ b/crawl-ref/source/dat/des/portals/icecave.des
@@ -670,11 +670,11 @@ MAP
xxwwwwxxx...xxx..xx
xxwwwwxxx...xxx..xx
xxxxxxxxxwwwxxxx3..xxx...x
- xx.G...G.xxwwxx..33xxxx..xx xxxxx
+ xx.G...G.xxwwxx...3xxxx..xx xxxxx
xxxx.........xwwx....xxxxx...xxx xxx...xxxx
xdx....2_424.xwwx..xxxxxxxx....xxx...2....xx
x*+.....44..2xxwx...xxxxxxxx.......2.1.2...xx
-xdx....423.342xwxx.33xxxxxxxxxx...1.....1...x
+xdx....423.342xwxx.3.xxxxxxxxxx...1.....1...x
xxxx..4...324xxwwxxx3..xxxxxxxxx............x
xxxG4.2G...xxwwwxxx...xxxxwwxx2........2xx
xxxxxx....xxxxxxxx....xxxwwxx1x....x1xx
@@ -684,8 +684,8 @@ xxxx..4...324xxwwxxx3..xxxxxxxxx............x
xxxx+xxxx.....xxx.....xxx..xxwxx..xx
xx444544xxx...xxxxx........xxxwwx...xx
xx.444444.xxxxxxxxx..3..3...xxwwwxx...xx
-xx..xgdegx..xxxxxx*%...3.....xxwwwxxx.66x
-x...xxffxx...xxxxx*%....3.3..xwwwwwxx6.6x
+xx..xgdegx..xxxxxx*%...1.....xxwwwxxx.66x
+x...xxffxx...xxxxx*%....3....xwwwwwxx6.6x
x....xxxx...xxxxxxxxx.......xxxwwwxx...xx
xxx.........xxxxxxxxxxx...xxxxwwwxxx...xx
x...7....xxxxxxxxxxxxx..xxxwwwxxx.....xx
diff --git a/crawl-ref/source/dat/des/portals/lab.des b/crawl-ref/source/dat/des/portals/lab.des
index 1eabaffec6..19e4ce58d2 100644
--- a/crawl-ref/source/dat/des/portals/lab.des
+++ b/crawl-ref/source/dat/des/portals/lab.des
@@ -31,7 +31,7 @@ end
function lab_intruders(e)
e.tags("patrolling")
- e.mons("catoblepas never_corpse / minotaur skeleton / shadow wraith")
+ e.mons("catoblepas never_corpse / minotaur skeleton")
e.mons("trapdoor spider never_corpse")
e.mons("shadow")
e.mons("unseen horror")
diff --git a/crawl-ref/source/dat/des/portals/trove.des b/crawl-ref/source/dat/des/portals/trove.des
index fe1fdfb914..02501c2e96 100644
--- a/crawl-ref/source/dat/des/portals/trove.des
+++ b/crawl-ref/source/dat/des/portals/trove.des
@@ -164,7 +164,6 @@ function trove.portal(e)
}
end
e.tags("uniq_trove no_monster_gen chance_trove")
- e.chance(500)
e.lua_marker("O", stair)
e.kfeat("O = enter_trove")
e.colour(". = blue")
@@ -233,12 +232,14 @@ default-depth: D:10-, Depths, Elf, Vaults
##############################################################################
NAME: enter_trove_0
+CHANCE: 5%
: trove.portal(_G)
MAP
O
ENDMAP
NAME: enter_trove_1
+CHANCE: 5%
: trove.portal(_G)
MAP
...
@@ -247,6 +248,7 @@ MAP
ENDMAP
NAME: enter_trove_2
+CHANCE: 5%
: trove.portal(_G)
MAP
@G@
@@ -258,6 +260,7 @@ ENDMAP
NAME: enter_trove_3
TAGS: uniq_trove no_monster_gen no_wall_fixup
+CHANCE: 5%
: trove.portal(_G)
COLOUR: .c = blue
FTILE: .cO = floor_marble
@@ -271,14 +274,14 @@ ENDMAP
# Of course, not everyone is willing for you to take their treasure...
NAME: enter_trove_5
+CHANCE: 5%
: trove.portal(_G)
: if you.absdepth() <= 15 then
# Got drafted in from Vaults:$, while the mages try and close the portal down.
KMONS: e = vault guard
: else
# And this time he brought some friends...
-KMONS: e = vault guard
-KMONS: l = vault guard
+KMONS: el = vault guard
: end
MAP
ccccc
@@ -295,6 +298,7 @@ ENDMAP
# Someone left some gold behind for you!
NAME: enter_trove_6
+CHANCE: 5%
: trove.portal(_G)
KFEAT: X = +
MARKER: X = lua: props_marker { connected_exclude="true" }
@@ -311,6 +315,7 @@ ccc+ccc
ENDMAP
NAME: nicolae_trove_entry_columns
+CHANCE: 5%
: trove.portal(_G)
MAP
cccccccccccc
@@ -325,6 +330,7 @@ ENDMAP
NAME: nicolae_trove_entry_crossroad
TAGS: transparent
+CHANCE: 5%
: trove.portal(_G)
COLOUR: @ = blue
FTILE: @ = floor_marble
@@ -337,6 +343,7 @@ cc@cc
ENDMAP
NAME: nicolae_trove_entry_crystal
+CHANCE: 5%
: trove.portal(_G)
FTILE: b = floor_marble
MAP
@@ -350,6 +357,7 @@ ccccccccccc
ENDMAP
NAME: nicolae_trove_entry_diagonal
+CHANCE: 5%
: trove.portal(_G)
MAP
c
@@ -367,6 +375,7 @@ cccO.cc
ENDMAP
NAME: nicolae_trove_entry_free_sample
+CHANCE: 5%
: trove.portal(_G)
COLOUR: % = blue
FTILE: % = floor_marble
@@ -378,6 +387,7 @@ ENDMAP
NAME: nicolae_trove_entry_isolated
TAGS: no_pool_fixup
+CHANCE: 5%
KPROP: .O = no_rtele_into
KFEAT: ' = .
: trove.portal(_G)
@@ -392,6 +402,7 @@ MAP
ENDMAP
NAME: nicolae_trove_entry_path_of_doom
+CHANCE: 5%
KMONS: O = patrolling guardian mummy
KMONS: m = patrolling guardian mummy / nothing w:20
: trove.portal(_G)
@@ -410,6 +421,7 @@ cc.....cc
ENDMAP
NAME: trove_entry_hex_spiral
+CHANCE: 5%
: trove.portal(_G)
MAP
@cc
diff --git a/crawl-ref/source/dat/des/sprint/arena_sprint.des b/crawl-ref/source/dat/des/sprint/arena_sprint.des
index adbe4d5226..7bdbd1d4c9 100644
--- a/crawl-ref/source/dat/des/sprint/arena_sprint.des
+++ b/crawl-ref/source/dat/des/sprint/arena_sprint.des
@@ -1015,7 +1015,7 @@ KFEAT: j = altar_elyvilon
KFEAT: k = altar_cheibriados
KFEAT: l = altar_jiyva
KFEAT: n = altar_fedhas
-KFEAT: o = altar_dithmengos
+KFEAT: o = altar_dithmenos
KITEM: { = scroll of blinking q:3, scroll of fog q:3 ident:all, \
potion of heal wounds q:3, potion of speed q:3, \
wand of fire charges:5 ident:all, \
diff --git a/crawl-ref/source/dat/des/sprint/fedhas.des b/crawl-ref/source/dat/des/sprint/fedhas.des
index a9b59aeed7..cf38a93d43 100644
--- a/crawl-ref/source/dat/des/sprint/fedhas.des
+++ b/crawl-ref/source/dat/des/sprint/fedhas.des
@@ -103,7 +103,7 @@ KFEAT: M = altar_jiyva
KFEAT: N = altar_vehumet
KFEAT: O = altar_sif_muna
KFEAT: P = altar_makhleb
-KFEAT: Q = altar_dithmengos
+KFEAT: Q = altar_dithmenos
KMONS: X = oklob sapling name:priest n_suf spells:cantrip;.;cantrip;smiting priest_spells
MAP
diff --git a/crawl-ref/source/dat/des/sprint/menkaure.des b/crawl-ref/source/dat/des/sprint/menkaure.des
index 81fc7e0347..eefd360893 100644
--- a/crawl-ref/source/dat/des/sprint/menkaure.des
+++ b/crawl-ref/source/dat/des/sprint/menkaure.des
@@ -228,7 +228,7 @@ KFEAT: o = altar_beogh
KFEAT: p = altar_jiyva
KFEAT: q = altar_fedhas
KFEAT: r = altar_cheibriados
-KFEAT: s = altar_dithmengos
+KFEAT: s = altar_dithmenos
MAP
....d...
...g.h..
diff --git a/crawl-ref/source/dat/des/sprint/pitsprint.des b/crawl-ref/source/dat/des/sprint/pitsprint.des
index 4c8489d44b..d104badad1 100644
--- a/crawl-ref/source/dat/des/sprint/pitsprint.des
+++ b/crawl-ref/source/dat/des/sprint/pitsprint.des
@@ -1032,7 +1032,7 @@ KFEAT: o = altar_beogh
KFEAT: p = altar_jiyva
KFEAT: q = altar_fedhas
KFEAT: r = altar_cheibriados
-KFEAT: s = altar_dithmengos
+KFEAT: s = altar_dithmenos
: general_setup(_G)
: general_item_setup(_G)
: base_monster_setup(_G)
diff --git a/crawl-ref/source/dat/des/sprint/sprint_mu.des b/crawl-ref/source/dat/des/sprint/sprint_mu.des
index f02b019d89..1e582c0596 100644
--- a/crawl-ref/source/dat/des/sprint/sprint_mu.des
+++ b/crawl-ref/source/dat/des/sprint/sprint_mu.des
@@ -260,7 +260,7 @@ KFEAT: N = altar_nemelex_xobeh
KITEM: N = any misc
KFEAT: X = altar_xom
KFEAT: M = altar_makhleb
-KFEAT: D = altar_dithmengos
+KFEAT: D = altar_dithmenos
KMONS: l = patrolling spatial vortex
KFEAT: ? = altar_jiyva / w:5 altar_lugonu / w:25 floor
KMONS: m = demigod
diff --git a/crawl-ref/source/dat/des/sprint/zigsprint.des b/crawl-ref/source/dat/des/sprint/zigsprint.des
index c24a7459a7..86a026b7bc 100644
--- a/crawl-ref/source/dat/des/sprint/zigsprint.des
+++ b/crawl-ref/source/dat/des/sprint/zigsprint.des
@@ -708,7 +708,7 @@ KFEAT: o = altar_beogh
KFEAT: p = altar_jiyva
KFEAT: q = altar_fedhas
KFEAT: r = altar_cheibriados
-KFEAT: s = altar_dithmengos
+KFEAT: s = altar_dithmenos
KITEM: B = plate armour race:none mundane not_cursed ident:all plus:5, \
fire dragon armour mundane not_cursed ident:all plus:5, \
ice dragon armour mundane not_cursed ident:all plus:5, \
diff --git a/crawl-ref/source/dat/des/variable/cathedral_bats.des b/crawl-ref/source/dat/des/variable/cathedral_bats.des
index 5b2342fc55..0817b09c3e 100644
--- a/crawl-ref/source/dat/des/variable/cathedral_bats.des
+++ b/crawl-ref/source/dat/des/variable/cathedral_bats.des
@@ -34,8 +34,8 @@ end
NAME: due_megacathedral
ORIENT: float
DEPTH: D:8-14
-MONS: wraith / freezing wraith w:2
-MONS: eidolon
+MONS: wraith / shadow w:2
+MONS: flayed ghost
TAGS: no_rotate no_vmirror no_hmirror
NSUBST: C = 5:C / *:.
SUBST: X = C
@@ -62,17 +62,17 @@ MAP
ccc...cc+cc1..ccc
ccccc..C..c.c..D..ccccc
ccc.ccc...cc.cc...ccc.ccc
- cc1..ccc+cc...cc=ccc...cc
+ cc1..ccc+cc...cc+ccc...cc
ccccc.D.ccc.........ccc.C.ccccc
- cccccc...=c..ccc+ccc..c+...cccccc
+ cccccc...+c..ccc+ccc..c+...cccccc
cc...cc.cc..ccc...ccc..cc.cc..1cc
cc.....ccc..cc.......cc..ccc.....cc
-cc..C...+....+...X...+....=...D..cc
+cc..C...+....+...X...+....+...D..cc
cc.....ccc..cc.......cc..ccc.....cc
cc...cc.cc..ccc...ccc..cc.cc...cc
- cccccc...=c..ccc+ccc..c+...cccccc
+ cccccc...+c..ccc+ccc..c+...cccccc
ccccc.D.ccc.........ccc.C.ccccc
- cc1..ccc=ccG.Gcc+ccc...cc
+ cc1..ccc+ccG.Gcc+ccc...cc
ccc.ccc...cc=cc...ccc.ccc
ccccc..D..c.c..C..ccccc
ccc..1cc2cc...ccc
diff --git a/crawl-ref/source/dat/descript/ability.txt b/crawl-ref/source/dat/descript/ability.txt
index 87b065ad00..499c880d74 100644
--- a/crawl-ref/source/dat/descript/ability.txt
+++ b/crawl-ref/source/dat/descript/ability.txt
@@ -592,7 +592,7 @@ End Transfer Knowledge ability
Abort an ongoing skill transfer.
%%%%
-# Dithmengos
+# Dithmenos
Shadow Step ability
If a creature within your umbra is still enough for you to focus on its shadow,
diff --git a/crawl-ref/source/dat/descript/features.txt b/crawl-ref/source/dat/descript/features.txt
index 343ad0d40e..a41bf97bd5 100644
--- a/crawl-ref/source/dat/descript/features.txt
+++ b/crawl-ref/source/dat/descript/features.txt
@@ -308,9 +308,9 @@ A shaft
A deep hole. Who knows where you might end up if you were to fall through it?
%%%%
-A shadowy altar of Dithmengos
+A shadowy altar of Dithmenos
-This altar to Dithmengos the Shadowed seems to absorb light from its
+This altar to Dithmenos the Shadowed seems to absorb light from its
surroundings.
%%%%
A shattered altar of Ashenzari
diff --git a/crawl-ref/source/dat/descript/gods.txt b/crawl-ref/source/dat/descript/gods.txt
index 82b3ca7397..1ad95e6cb0 100644
--- a/crawl-ref/source/dat/descript/gods.txt
+++ b/crawl-ref/source/dat/descript/gods.txt
@@ -147,13 +147,13 @@ occasionally consume items left elsewhere in the Dungeon by followers.
Especially favoured followers will become as shapeless as their god, as their
attributes and mutations shift around under Jiyva's influence.
%%%%
-Dithmengos
+Dithmenos
-Dithmengos the Shadowed desires all to be darkness. In exchange for their life
-essence and that of the inhabitants of the dungeon, followers of Dithmengos
+Dithmenos the Shadowed desires all to be darkness. In exchange for their life
+essence and that of the inhabitants of the dungeon, followers of Dithmenos
gain a strange and otherwordly affinity to the shadows of their environment.
-Dithmengos despises fire, the ancient enemy of the shadows, and forbids its use
-by worshippers; Dithmengos favours those who would instead destroy sources of
+Dithmenos despises fire, the ancient enemy of the shadows, and forbids its use
+by worshippers; Dithmenos favours those who would instead destroy sources of
light.
%%%%
Zin powers
@@ -311,14 +311,14 @@ ultimate desire, however, is not for devotion but the knowledge of all things.
Pious worshippers willing to part with a portion of their knowledge will
receive a great portion of Ashenzari's in return.
%%%%
-Dithmengos powers
+Dithmenos powers
-Followers of Dithmengos are constantly surrounded in an aura of shadow, the
-extent of which is reflective of their level of devotion. Dithmengos grants
+Followers of Dithmenos are constantly surrounded in an aura of shadow, the
+extent of which is reflective of their level of devotion. Dithmenos grants
followers the ability to instantly step into the shadow of nearby creatures,
-provided their shadow is still enough to do so. Dithmengos protects followers
+provided their shadow is still enough to do so. Dithmenos protects followers
by occasionally shrouding those struck by attacks in dark smoke. Sufficiently
-pious followers of Dithmengos will find their own shadow will begin to attack
+pious followers of Dithmenos will find their own shadow will begin to attack
on its own, and eventually gain the ability to assume the form of a shadow
themself.
%%%%
diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt
index 05712f8096..93295b30b4 100644
--- a/crawl-ref/source/dat/descript/spells.txt
+++ b/crawl-ref/source/dat/descript/spells.txt
@@ -346,12 +346,10 @@ A ray which does massive damage (1500 hp) and always hits.
%%%%
Deflect Missiles spell
-This spell protects the caster from all kinds of projectile attacks, by slowing
-them and somewhat diverting their path. Successfully deflecting an incoming
-projectile still requires a reflexive action (your ability to do so is measured
-by the Evasion stat), but unlike lesser spells like Repel Missiles, Deflect
-Missiles typically makes this so easy that even a drunk plate-clad orc can do
-it.
+This spell protects the caster from all kinds of projectile attacks, making
+them significantly easier to dodge. It is highly effective against both
+single-target and penetrating attacks. Each time a missile is deflected the
+spell has a chance of expiring, with a lower chance of expiry at high power.
%%%%
Delayed Fireball spell
@@ -993,8 +991,10 @@ while also increasing the rate of food consumption.
%%%%
Repel Missiles spell
-This spell reduces the chance of projectile attacks striking the caster, by
-making them significantly easier to dodge.
+This spell reduces the chance of projectile attacks striking the caster, making
+them easier to dodge. Single-target attacks are much easier to repel than
+penetrating attacks. Each time a missile is repelled the spell has a chance of
+expiring, with a lower chance of expiry at high power.
%%%%
Ring of Flames spell
diff --git a/crawl-ref/source/dat/descript/unrand.txt b/crawl-ref/source/dat/descript/unrand.txt
index ad837fb16f..49bddc9d72 100644
--- a/crawl-ref/source/dat/descript/unrand.txt
+++ b/crawl-ref/source/dat/descript/unrand.txt
@@ -518,6 +518,17 @@ effects from the residual hexes and magical energies it was once subjected to
on a daily basis; spellcasters able to get a handle on its power, however, will
find it enhances their spell power.
%%%%
+arc blade
+
+A cutlass somehow crafted from pure electricity. Striking an enemy with it
+occasionally unleashes a static discharge.
+%%%%
+demon whip "Spellbinder"
+
+A weapon said to have once been used to keep unruly imprisoned wizards in
+line; it violently disrupts their ability to use magic, inflicting wild and
+unpredictable residual magical effects on those it strikes.
+%%%%
milk chocolate
This item is a debugging aid, granting a vast array of mostly beneficial
diff --git a/crawl-ref/source/describe.cc b/crawl-ref/source/describe.cc
index fa528474d6..9689091960 100644
--- a/crawl-ref/source/describe.cc
+++ b/crawl-ref/source/describe.cc
@@ -3290,6 +3290,39 @@ static string _monster_spells_description(const monster_info& mi)
return result.str();
}
+static const char *_speed_description(int speed)
+{
+ // These thresholds correspond to the player mutations for fast and slow.
+ ASSERT(speed != 10);
+ if (speed < 7)
+ return "extremely slowly";
+ else if (speed < 8)
+ return "very slowly";
+ else if (speed < 10)
+ return "slowly";
+ else if (speed > 15)
+ return "extremely quickly";
+ else if (speed > 13)
+ return "very quickly";
+ else if (speed > 10)
+ return "quickly";
+
+ return "buggily";
+}
+
+static void _add_energy_to_string(int speed, int energy, string what,
+ vector<string> &fast, vector<string> &slow)
+{
+ if (energy == 10)
+ return;
+
+ const int act_speed = (speed * 10) / energy;
+ if (act_speed > 10)
+ fast.push_back(what + " " + _speed_description(act_speed));
+ if (act_speed < 10)
+ slow.push_back(what + " " + _speed_description(act_speed));
+}
+
// Describe a monster's (intrinsic) resistances, speed and a few other
// attributes.
static string _monster_stat_description(const monster_info& mi)
@@ -3420,8 +3453,10 @@ static string _monster_stat_description(const monster_info& mi)
// Unusual monster speed.
const int speed = mi.base_speed();
+ bool did_speed = false;
if (speed != 10 && speed != 0)
{
+ did_speed = true;
result << uppercase_first(pronoun) << " is ";
if (speed < 7)
result << "very slow";
@@ -3433,8 +3468,67 @@ static string _monster_stat_description(const monster_info& mi)
result << "very fast";
else if (speed > 10)
result << "fast";
+ }
+ const mon_energy_usage def = DEFAULT_ENERGY;
+ if (!(mi.menergy == def))
+ {
+ const mon_energy_usage me = mi.menergy;
+ vector<string> fast, slow;
+ if (!did_speed)
+ result << uppercase_first(pronoun) << " ";
+ _add_energy_to_string(speed, me.move, "covers ground", fast, slow);
+ // since MOVE_ENERGY also sets me.swim
+ if (me.swim != me.move)
+ _add_energy_to_string(speed, me.swim, "swims", fast, slow);
+ _add_energy_to_string(speed, me.attack, "attacks", fast, slow);
+ _add_energy_to_string(speed, me.missile, "shoots", fast, slow);
+ _add_energy_to_string(
+ speed, me.spell,
+ mi.is_actual_spellcaster() ? "casts spells" :
+ mi.is_priest() ? "uses invocations"
+ : "uses natural abilities", fast, slow);
+ _add_energy_to_string(speed, me.special, "uses special abilities",
+ fast, slow);
+ _add_energy_to_string(speed, me.item, "uses items", fast, slow);
+
+ if (speed >= 10)
+ {
+ if (did_speed && fast.size() == 1)
+ result << " and " << fast[0];
+ else if (!fast.empty())
+ {
+ if (did_speed)
+ result << ", ";
+ result << comma_separated_line(fast.begin(), fast.end());
+ }
+ if (!slow.empty())
+ {
+ if (did_speed || !fast.empty())
+ result << ", but ";
+ result << comma_separated_line(slow.begin(), slow.end());
+ }
+ }
+ else if (speed < 10)
+ {
+ if (did_speed && slow.size() == 1)
+ result << " and " << slow[0];
+ else if (!slow.empty())
+ {
+ if (did_speed)
+ result << ", ";
+ result << comma_separated_line(slow.begin(), slow.end());
+ }
+ if (!fast.empty())
+ {
+ if (did_speed || !slow.empty())
+ result << ", but ";
+ result << comma_separated_line(fast.begin(), fast.end());
+ }
+ }
result << ".\n";
}
+ else if (did_speed)
+ result << ".\n";
// Can the monster fly, and how?
// This doesn't give anything away since no (very) ugly things can
@@ -4249,7 +4343,7 @@ static const char *divine_title[NUM_GODS][8] =
{"Star-crossed", "Cursed", "Initiated", "Seer",
"Soothsayer", "Oracle", "Illuminatus", "Omniscient"},
- // Dithmengos -- darkness theme
+ // Dithmenos -- darkness theme
{"Illuminated", "Gloomy", "Aphotic", "Caliginous",
"Darkened", "Shadowed", "Eclipsing", "Eternal Night"},
};
diff --git a/crawl-ref/source/directn.cc b/crawl-ref/source/directn.cc
index 5f2ffe1edc..9906da52cc 100644
--- a/crawl-ref/source/directn.cc
+++ b/crawl-ref/source/directn.cc
@@ -3244,8 +3244,8 @@ static string _base_feature_desc(dungeon_feature_type grid, trap_type trap)
return "snail-covered altar of Cheibriados";
case DNGN_ALTAR_ASHENZARI:
return "shattered altar of Ashenzari";
- case DNGN_ALTAR_DITHMENGOS:
- return "shadowy altar of Dithmengos";
+ case DNGN_ALTAR_DITHMENOS:
+ return "shadowy altar of Dithmenos";
case DNGN_FOUNTAIN_BLUE:
return "fountain of clear blue water";
diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h
index d0da8ea299..59e6ebaf5b 100644
--- a/crawl-ref/source/enum.h
+++ b/crawl-ref/source/enum.h
@@ -179,9 +179,9 @@ enum ability_type
ABIL_ASHENZARI_SCRYING = 1160,
ABIL_ASHENZARI_TRANSFER_KNOWLEDGE,
ABIL_ASHENZARI_END_TRANSFER,
- // Dithmengos
- ABIL_DITHMENGOS_SHADOW_STEP = 1170,
- ABIL_DITHMENGOS_SHADOW_FORM,
+ // Dithmenos
+ ABIL_DITHMENOS_SHADOW_STEP = 1170,
+ ABIL_DITHMENOS_SHADOW_FORM,
// For both Yred and Beogh
ABIL_STOP_RECALL = 1500,
@@ -313,8 +313,8 @@ enum attribute_type
ATTR_SWIFTNESS, // Duration of future antiswiftness.
ATTR_BARBS_MSG, // Have we already printed a message on move?
ATTR_BARBS_POW, // How badly we are currently skewered
- ATTR_REPEL_MISSILES, // Chance to expire repel missiles
- ATTR_DEFLECT_MISSILES, // Chance to expire deflect missiles
+ ATTR_REPEL_MISSILES, // Repel missiles active
+ ATTR_DEFLECT_MISSILES, // Deflect missiles active
ATTR_PORTAL_PROJECTILE, // Accuracy bonus during portal projectile
ATTR_GOD_WRATH_XP, // How much XP before our next god wrath check?
ATTR_GOD_WRATH_COUNT, // Number of stored retributions
@@ -1038,10 +1038,10 @@ enum conduct_type
DID_EXPLORATION, // Ashenzari, wrath timers
DID_DESECRATE_HOLY_REMAINS, // Zin/Ely/TSO/Yredelemnul
DID_SEE_MONSTER, // TSO
- DID_ILLUMINATE, // Dithmengos
- DID_KILL_ILLUMINATING, // Dithmengos
- DID_FIRE, // Dithmengos
- DID_KILL_FIERY, // Dithmengos
+ DID_ILLUMINATE, // Dithmenos
+ DID_KILL_ILLUMINATING, // Dithmenos
+ DID_FIRE, // Dithmenos
+ DID_KILL_FIERY, // Dithmenos
NUM_CONDUCTS
};
@@ -1434,8 +1434,8 @@ enum dungeon_feature_type
DNGN_ALTAR_FEDHAS,
DNGN_ALTAR_CHEIBRIADOS,
DNGN_ALTAR_ASHENZARI,
- DNGN_ALTAR_DITHMENGOS,
- DNGN_ALTAR_LAST_GOD = DNGN_ALTAR_DITHMENGOS,
+ DNGN_ALTAR_DITHMENOS,
+ DNGN_ALTAR_LAST_GOD = DNGN_ALTAR_DITHMENOS,
DNGN_FOUNTAIN_BLUE,
DNGN_FOUNTAIN_SPARKLING, // aka 'Magic Fountain' {dlb}
@@ -1520,7 +1520,9 @@ enum duration_type
DUR_LIQUID_FLAMES,
DUR_ICY_ARMOUR,
+#if TAG_MAJOR_VERSION == 34
DUR_REPEL_MISSILES,
+#endif
DUR_JELLY_PRAYER,
DUR_PIETY_POOL, // distribute piety over time
DUR_DIVINE_VIGOUR, // duration of Ely's Divine Vigour
@@ -1536,7 +1538,9 @@ enum duration_type
DUR_BREATH_WEAPON,
DUR_TRANSFORMATION,
DUR_DEATH_CHANNEL,
+#if TAG_MAJOR_VERSION == 34
DUR_DEFLECT_MISSILES,
+#endif
DUR_PHASE_SHIFT,
#if TAG_MAJOR_VERSION == 34
DUR_SEE_INVISIBLE,
@@ -1883,7 +1887,7 @@ enum god_type
GOD_FEDHAS,
GOD_CHEIBRIADOS,
GOD_ASHENZARI,
- GOD_DITHMENGOS,
+ GOD_DITHMENOS,
NUM_GODS, // always after last god
GOD_RANDOM = 100,
@@ -2831,7 +2835,7 @@ enum monster_type // menv[].type
MONS_GIANT_LIZARD, // genus
MONS_DRAKE, // genus
#endif
- MONS_PLAYER_SHADOW, // Dithmengos
+ MONS_PLAYER_SHADOW, // Dithmenos
MONS_DEEP_TROLL_EARTH_MAGE,
MONS_DEEP_TROLL_SHAMAN,
@@ -3864,6 +3868,8 @@ enum spell_type
SPELL_SUMMON_FOREST,
SPELL_SUMMON_LIGHTNING_SPIRE,
SPELL_SUMMON_GUARDIAN_GOLEM,
+ SPELL_SHADOW_SHARD,
+ SPELL_SHADOW_BOLT,
NUM_SPELLS
};
diff --git a/crawl-ref/source/exercise.cc b/crawl-ref/source/exercise.cc
index a51f4536d8..b242040e2b 100644
--- a/crawl-ref/source/exercise.cc
+++ b/crawl-ref/source/exercise.cc
@@ -78,6 +78,8 @@ skill_type abil_skill(ability_type abil)
case ABIL_YRED_ENSLAVE_SOUL:
case ABIL_LUGONU_ABYSS_EXIT:
case ABIL_CHEIBRIADOS_DISTORTION:
+ case ABIL_DITHMENOS_SHADOW_STEP:
+ case ABIL_DITHMENOS_SHADOW_FORM:
return SK_INVOCATIONS;
case ABIL_KIKU_RECEIVE_CORPSES:
@@ -122,6 +124,7 @@ static int _abil_degree(ability_type abil)
return 1;
case ABIL_SIF_MUNA_CHANNEL_ENERGY:
case ABIL_OKAWARU_HEROISM:
+ case ABIL_DITHMENOS_SHADOW_STEP:
return 1 + random2(3);
case ABIL_ZIN_RECITE:
@@ -170,6 +173,7 @@ static int _abil_degree(ability_type abil)
return 5 + random2(8);
case ABIL_MAKHLEB_GREATER_SERVANT_OF_MAKHLEB:
+ case ABIL_DITHMENOS_SHADOW_FORM:
return 6 + random2(6);
case ABIL_ELYVILON_DIVINE_VIGOUR:
return 6 + random2(10);
diff --git a/crawl-ref/source/feature.cc b/crawl-ref/source/feature.cc
index d844a0a7ec..f1d18cf071 100644
--- a/crawl-ref/source/feature.cc
+++ b/crawl-ref/source/feature.cc
@@ -134,7 +134,7 @@ static colour_t _feat_colour(dungeon_feature_type feat)
case DNGN_ALTAR_FEDHAS: return GREEN;
case DNGN_ALTAR_CHEIBRIADOS: return LIGHTCYAN;
case DNGN_ALTAR_ASHENZARI: return LIGHTRED;
- case DNGN_ALTAR_DITHMENGOS: return ETC_DITHMENGOS;
+ case DNGN_ALTAR_DITHMENOS: return ETC_DITHMENOS;
default: return 0;
}
}
diff --git a/crawl-ref/source/fight.cc b/crawl-ref/source/fight.cc
index a35b6f21b5..47332439ce 100644
--- a/crawl-ref/source/fight.cc
+++ b/crawl-ref/source/fight.cc
@@ -120,8 +120,8 @@ bool fight_melee(actor *attacker, actor *defender, bool *did_hit, bool simu)
if (!simu && you.props.exists("spectral_weapon"))
trigger_spectral_weapon(&you, defender);
- if (!simu && you_worship(GOD_DITHMENGOS))
- dithmengos_shadow_melee(defender);
+ if (!simu && you_worship(GOD_DITHMENOS))
+ dithmenos_shadow_melee(defender);
return true;
}
diff --git a/crawl-ref/source/godabil.cc b/crawl-ref/source/godabil.cc
index 578816124b..073b35ee1a 100644
--- a/crawl-ref/source/godabil.cc
+++ b/crawl-ref/source/godabil.cc
@@ -3410,7 +3410,7 @@ void spare_beogh_convert()
}
}
-bool dithmengos_shadow_step()
+bool dithmenos_shadow_step()
{
// You can shadow-step anywhere within your umbra.
ASSERT(you.umbra_radius2() > -1);
@@ -3499,9 +3499,9 @@ bool dithmengos_shadow_step()
return true;
}
-static bool _dithmengos_shadow_acts()
+static bool _dithmenos_shadow_acts()
{
- if (!you_worship(GOD_DITHMENGOS) || you.piety < piety_breakpoint(3))
+ if (!you_worship(GOD_DITHMENOS) || you.piety < piety_breakpoint(3))
return false;
// 10% chance at 4* piety; 50% chance at 200 piety.
@@ -3513,7 +3513,7 @@ static bool _dithmengos_shadow_acts()
2 * range);
}
-static monster* _dithmengos_shadow_monster()
+static monster* _dithmenos_shadow_monster()
{
if (monster_at(you.pos()))
return NULL;
@@ -3585,7 +3585,10 @@ static monster* _dithmengos_shadow_monster()
| MF_WAS_IN_VIEW | MF_HARD_RESET
| MF_ACTUAL_SPELLS;
mon->hit_points = you.hp;
- mon->hit_dice = you.experience_level;
+ mon->hit_dice = min(1,
+ you.skill_rdiv(wpn_index != NON_ITEM
+ ? weapon_skill(mitm[wpn_index])
+ : SK_UNARMED_COMBAT, 10, 20));
mon->set_position(you.pos());
mon->mid = MID_PLAYER;
mon->inv[MSLOT_WEAPON] = wpn_index;
@@ -3596,7 +3599,7 @@ static monster* _dithmengos_shadow_monster()
return mon;
}
-static void _dithmengos_shadow_monster_reset(monster *mon)
+static void _dithmenos_shadow_monster_reset(monster *mon)
{
if (mon->inv[MSLOT_WEAPON] != NON_ITEM)
destroy_item(mon->inv[MSLOT_WEAPON]);
@@ -3606,16 +3609,16 @@ static void _dithmengos_shadow_monster_reset(monster *mon)
mon->reset();
}
-void dithmengos_shadow_melee(actor* target)
+void dithmenos_shadow_melee(actor* target)
{
if (!target
|| !target->alive()
- || !_dithmengos_shadow_acts())
+ || !_dithmenos_shadow_acts())
{
return;
}
- monster* mon = _dithmengos_shadow_monster();
+ monster* mon = _dithmenos_shadow_monster();
if (!mon)
return;
@@ -3625,18 +3628,18 @@ void dithmengos_shadow_melee(actor* target)
mprf("%s attacks!", mon->name(DESC_THE).c_str());
fight_melee(mon, target);
- _dithmengos_shadow_monster_reset(mon);
+ _dithmenos_shadow_monster_reset(mon);
}
-void dithmengos_shadow_throw(coord_def target)
+void dithmenos_shadow_throw(coord_def target)
{
if (target.origin()
- || !_dithmengos_shadow_acts())
+ || !_dithmenos_shadow_acts())
{
return;
}
- monster* mon = _dithmengos_shadow_monster();
+ monster* mon = _dithmenos_shadow_monster();
if (!mon)
return;
@@ -3652,34 +3655,46 @@ void dithmengos_shadow_throw(coord_def target)
mons_throw(mon, beem, mon->inv[MSLOT_MISSILE]);
}
- _dithmengos_shadow_monster_reset(mon);
+ _dithmenos_shadow_monster_reset(mon);
}
-void dithmengos_shadow_spell(coord_def target, spell_type spell)
+void dithmenos_shadow_spell(bolt* orig_beam, spell_type spell)
{
- if (target.origin()
- || !is_valid_mon_spell(spell)
- || !_dithmengos_shadow_acts())
+ if (!orig_beam
+ || orig_beam->target.origin()
+ || (orig_beam->is_enchantment() && !is_valid_mon_spell(spell))
+ || !_dithmenos_shadow_acts())
{
return;
}
- monster* mon = _dithmengos_shadow_monster();
+ const coord_def target = orig_beam->target;
+
+ monster* mon = _dithmenos_shadow_monster();
if (!mon)
return;
// Don't let shadow spells get too powerful.
- mon->hit_dice = max(1, mon->hit_dice / 2);
+ mon->hit_dice = max(1,
+ min(3 * spell_difficulty(spell),
+ you.experience_level) / 2);
mon->target = target;
if (actor_at(target))
mon->foe = actor_at(target)->mindex();
+ spell_type shadow_spell = spell;
+ if (!orig_beam->is_enchantment())
+ {
+ shadow_spell = (orig_beam->is_beam) ? SPELL_SHADOW_BOLT
+ : SPELL_SHADOW_SHARD;
+ }
+
bolt beem;
beem.target = target;
mprf(MSGCH_FRIEND_SPELL, "%s mimicks your spell!",
mon->name(DESC_THE).c_str());
- mons_cast(mon, beem, spell, false, false);
+ mons_cast(mon, beem, shadow_spell, false, false);
- _dithmengos_shadow_monster_reset(mon);
+ _dithmenos_shadow_monster_reset(mon);
}
diff --git a/crawl-ref/source/godabil.h b/crawl-ref/source/godabil.h
index c676034293..d4fd222318 100644
--- a/crawl-ref/source/godabil.h
+++ b/crawl-ref/source/godabil.h
@@ -75,8 +75,8 @@ bool ashenzari_end_transfer(bool finished = false, bool force = false);
bool can_convert_to_beogh();
void spare_beogh_convert();
-bool dithmengos_shadow_step();
-void dithmengos_shadow_melee(actor* target);
-void dithmengos_shadow_throw(coord_def target);
-void dithmengos_shadow_spell(coord_def target, spell_type spell);
+bool dithmenos_shadow_step();
+void dithmenos_shadow_melee(actor* target);
+void dithmenos_shadow_throw(coord_def target);
+void dithmenos_shadow_spell(bolt* orig_beam, spell_type spell);
#endif
diff --git a/crawl-ref/source/godconduct.cc b/crawl-ref/source/godconduct.cc
index 2eb073b834..e90906aff6 100644
--- a/crawl-ref/source/godconduct.cc
+++ b/crawl-ref/source/godconduct.cc
@@ -336,7 +336,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
case GOD_TROG:
case GOD_BEOGH:
case GOD_LUGONU:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (god_hates_attacking_friend(you.religion, victim))
break;
@@ -364,7 +364,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
case GOD_MAKHLEB:
case GOD_BEOGH:
case GOD_LUGONU:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (god_hates_attacking_friend(you.religion, victim))
break;
@@ -393,7 +393,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
case GOD_KIKUBAAQUDGHA:
case GOD_BEOGH:
case GOD_LUGONU:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (god_hates_attacking_friend(you.religion, victim))
break;
@@ -524,7 +524,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
case GOD_MAKHLEB:
case GOD_BEOGH:
case GOD_LUGONU:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (god_hates_attacking_friend(you.religion, victim))
break;
@@ -981,7 +981,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
break;
case DID_ILLUMINATE:
- if (you_worship(GOD_DITHMENGOS))
+ if (you_worship(GOD_DITHMENOS))
{
if (!known)
{
@@ -998,7 +998,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
break;
case DID_KILL_ILLUMINATING:
- if (you_worship(GOD_DITHMENGOS)
+ if (you_worship(GOD_DITHMENOS)
&& !god_hates_attacking_friend(you.religion, victim))
{
simple_god_message(" appreciates your extinguishing a source "
@@ -1010,7 +1010,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
break;
case DID_FIRE:
- if (you_worship(GOD_DITHMENGOS))
+ if (you_worship(GOD_DITHMENOS))
{
if (!known)
{
@@ -1027,7 +1027,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
break;
case DID_KILL_FIERY:
- if (you_worship(GOD_DITHMENGOS)
+ if (you_worship(GOD_DITHMENOS)
&& !god_hates_attacking_friend(you.religion, victim))
{
simple_god_message(" appreciates your extinguishing a source "
@@ -1061,7 +1061,7 @@ bool did_god_conduct(conduct_type thing_done, int level, bool known,
simple_god_message(" accepts your kill.");
retval = true;
}
- if (you_worship(GOD_DITHMENGOS))
+ if (you_worship(GOD_DITHMENOS))
{
piety_change *= 2;
piety_denom *= 3;
diff --git a/crawl-ref/source/goditem.cc b/crawl-ref/source/goditem.cc
index 07e837f5ce..913da6fe38 100644
--- a/crawl-ref/source/goditem.cc
+++ b/crawl-ref/source/goditem.cc
@@ -614,7 +614,7 @@ conduct_type god_hates_item_handling(const item_def &item)
}
break;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (item_type_known(item) && is_illuminating_item(item))
return DID_ILLUMINATE;
@@ -727,7 +727,7 @@ bool god_dislikes_spell_discipline(int discipline, god_type god)
case GOD_ELYVILON:
return discipline & (SPTYP_CONJURATION | SPTYP_SUMMONING);
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
return discipline & SPTYP_FIRE;
default:
diff --git a/crawl-ref/source/godwrath.cc b/crawl-ref/source/godwrath.cc
index cb635c8190..15c82b5aca 100644
--- a/crawl-ref/source/godwrath.cc
+++ b/crawl-ref/source/godwrath.cc
@@ -100,7 +100,7 @@ static bool _okawaru_random_servant()
return create_monster(temp, false);
}
-static bool _dithmengos_random_shadow(const int count, const int tier)
+static bool _dithmenos_random_shadow(const int count, const int tier)
{
monster_type mon_type = MONS_SHADOW;
if (tier >= 2 && count == 0 && coinflip())
@@ -109,9 +109,9 @@ static bool _dithmengos_random_shadow(const int count, const int tier)
mon_type = MONS_SHADOW_DEMON;
mgen_data temp = mgen_data::hostile_at(mon_type,
- "the darkness of Dithmengos",
+ "the darkness of Dithmenos",
true, 0, 0, you.pos(), 0,
- GOD_DITHMENGOS);
+ GOD_DITHMENOS);
temp.extra_flags |= (MF_NO_REWARD | MF_HARD_RESET);
@@ -1177,10 +1177,10 @@ static bool _fedhas_retribution()
return true;
}
-static bool _dithmengos_retribution()
+static bool _dithmenos_retribution()
{
// shadow theme
- const god_type god = GOD_DITHMENGOS;
+ const god_type god = GOD_DITHMENOS;
switch(random2(4))
{
@@ -1192,7 +1192,7 @@ static bool _dithmengos_retribution()
const int tier = div_rand_round(you.experience_level, 9);
while (how_many-- > 0)
{
- if (_dithmengos_random_shadow(count, tier))
+ if (_dithmenos_random_shadow(count, tier))
count++;
}
simple_god_message(count ? " calls forth shadows to punish you."
@@ -1209,7 +1209,7 @@ static bool _dithmengos_retribution()
{
if (create_monster(
mgen_data::hostile_at(
- RANDOM_MOBILE_MONSTER, "the darkness of Dithmengos",
+ RANDOM_MOBILE_MONSTER, "the darkness of Dithmenos",
true, 4, MON_SUMM_WRATH, you.pos(), 0, god)))
{
count++;
@@ -1276,7 +1276,7 @@ bool divine_retribution(god_type god, bool no_bonus, bool force)
case GOD_JIYVA: do_more = _jiyva_retribution(); break;
case GOD_FEDHAS: do_more = _fedhas_retribution(); break;
case GOD_CHEIBRIADOS: do_more = _cheibriados_retribution(); break;
- case GOD_DITHMENGOS: do_more = _dithmengos_retribution(); break;
+ case GOD_DITHMENOS: do_more = _dithmenos_retribution(); break;
case GOD_ASHENZARI:
// No reduction with time.
diff --git a/crawl-ref/source/hints.cc b/crawl-ref/source/hints.cc
index 1f154623e6..6ddd9aef67 100644
--- a/crawl-ref/source/hints.cc
+++ b/crawl-ref/source/hints.cc
@@ -217,9 +217,15 @@ void pick_hints(newgame_def* choice)
switch (keyn)
{
CASE_ESCAPE
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
game_ended();
case 'X':
cprintf("\nGoodbye!");
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
end(0);
return;
}
diff --git a/crawl-ref/source/item_use.cc b/crawl-ref/source/item_use.cc
index b0003b9e07..e3fa8c225b 100644
--- a/crawl-ref/source/item_use.cc
+++ b/crawl-ref/source/item_use.cc
@@ -2207,7 +2207,7 @@ static bool _god_hates_brand(const int brand)
return true;
}
- if (you_worship(GOD_DITHMENGOS)
+ if (you_worship(GOD_DITHMENOS)
&& (brand == SPWPN_FLAMING
|| brand == SPWPN_FLAME
|| brand == SPWPN_CHAOS))
@@ -3113,7 +3113,7 @@ void read_scroll(int slot)
case SCR_IMMOLATION:
{
- // Dithmengos hates trying to play with fire, even if it does nothing.
+ // Dithmenos hates trying to play with fire, even if it does nothing.
did_god_conduct(DID_FIRE, 3 + random2(4), item_type_known(scroll));
bool had_effect = false;
diff --git a/crawl-ref/source/main.cc b/crawl-ref/source/main.cc
index c335e0d014..0c50062f3e 100644
--- a/crawl-ref/source/main.cc
+++ b/crawl-ref/source/main.cc
@@ -2442,18 +2442,6 @@ static void _decrement_durations()
_decrement_a_duration(DUR_SILENCE, delay, "Your hearing returns.");
- if (!you.attribute[ATTR_REPEL_MISSILES])
- {
- _decrement_a_duration(DUR_REPEL_MISSILES, delay,
- "You feel less protected from missiles.");
- }
-
- if (!you.attribute[ATTR_DEFLECT_MISSILES])
- {
- _decrement_a_duration(DUR_DEFLECT_MISSILES, delay,
- "You feel less protected from missiles.");
- }
-
if (_decrement_a_duration(DUR_TROGS_HAND, delay,
NULL, coinflip(),
"You feel the effects of Trog's Hand fading."))
@@ -3246,7 +3234,7 @@ static void _update_mold()
// For worn items; weapons do this on melee attacks.
static void _check_equipment_conducts()
{
- if (you_worship(GOD_DITHMENGOS) && one_chance_in(10))
+ if (you_worship(GOD_DITHMENOS) && one_chance_in(10))
{
bool illuminating = false, fiery = false;
const item_def* item;
diff --git a/crawl-ref/source/melee_attack.cc b/crawl-ref/source/melee_attack.cc
index 369dadb15d..4f4dd2d69a 100644
--- a/crawl-ref/source/melee_attack.cc
+++ b/crawl-ref/source/melee_attack.cc
@@ -5269,7 +5269,7 @@ void melee_attack::do_spines()
// Thorn hunters can attack their own brambles without injury
if (defender->type == MONS_BRIAR_PATCH
&& attacker->type == MONS_THORN_HUNTER
- // Dithmengos' shadow can't take damage, don't spam.
+ // Dithmenos' shadow can't take damage, don't spam.
|| attacker->type == MONS_PLAYER_SHADOW)
{
return;
diff --git a/crawl-ref/source/mgen_enum.h b/crawl-ref/source/mgen_enum.h
index 93e090abcb..6f666938b0 100644
--- a/crawl-ref/source/mgen_enum.h
+++ b/crawl-ref/source/mgen_enum.h
@@ -141,7 +141,7 @@ enum mgen_flag_type
MG_PERMIT_BANDS = 0x01,
MG_FORCE_PLACE = 0x02,
MG_FORCE_BEH = 0x04,
- MG_PLAYER_MADE = 0x08,
+ MG_AUTOFOE = 0x08, // will automatically choose in-sight foe (if friendly)
MG_PATROLLING = 0x10,
MG_BAND_MINION = 0x20,
MG_DONT_COME = 0x40, // suppress the "comes into view" spam
diff --git a/crawl-ref/source/mon-abil.cc b/crawl-ref/source/mon-abil.cc
index 2afa890e18..d0e5293211 100644
--- a/crawl-ref/source/mon-abil.cc
+++ b/crawl-ref/source/mon-abil.cc
@@ -3000,44 +3000,48 @@ void move_solo_tentacle(monster* tentacle)
actor::constricting_t::const_iterator it = tentacle->constricting->begin();
constrictee = actor_by_mid(it->first);
- if (retract_found)
+ // Don't drag things that cannot move
+ if (!constrictee->is_stationary())
{
- if (constrictee->is_habitable(old_pos))
+ if (retract_found)
{
- pull_constrictee = true;
- shift_pos = old_pos;
+ if (constrictee->is_habitable(old_pos))
+ {
+ pull_constrictee = true;
+ shift_pos = old_pos;
+ }
}
- }
- else if (tentacle->type == MONS_SNAPLASHER_VINE)
- {
- // Don't shift our victim if they're already next to a tree
- // (To avoid shaking players back and forth constantly)
- bool near_tree = false;
- for (adjacent_iterator ai(constrictee->pos()); ai; ++ai)
+ else if (tentacle->type == MONS_SNAPLASHER_VINE)
{
- if (feat_is_tree(grd(*ai)))
+ // Don't shift our victim if they're already next to a tree
+ // (To avoid shaking players back and forth constantly)
+ bool near_tree = false;
+ for (adjacent_iterator ai(constrictee->pos()); ai; ++ai)
{
- near_tree = true;
- break;
+ if (feat_is_tree(grd(*ai)))
+ {
+ near_tree = true;
+ break;
+ }
}
- }
- if (!near_tree)
- {
- for (adjacent_iterator ai(tentacle->pos()); ai; ++ai)
+ if (!near_tree)
{
- if (adjacent(*ai, constrictee->pos())
- && constrictee->is_habitable(*ai)
- && !actor_at(*ai))
+ for (adjacent_iterator ai(tentacle->pos()); ai; ++ai)
{
- for (adjacent_iterator ai2(*ai); ai2; ++ai2)
+ if (adjacent(*ai, constrictee->pos())
+ && constrictee->is_habitable(*ai)
+ && !actor_at(*ai))
{
- if (feat_is_tree(grd(*ai2)))
+ for (adjacent_iterator ai2(*ai); ai2; ++ai2)
{
- pull_constrictee = true;
- shift_constrictee = true;
- shift_pos = *ai;
- break;
+ if (feat_is_tree(grd(*ai2)))
+ {
+ pull_constrictee = true;
+ shift_constrictee = true;
+ shift_pos = *ai;
+ break;
+ }
}
}
}
@@ -5064,4 +5068,4 @@ void guardian_golem_bond(monster* mons)
mi->add_ench(mon_enchant(ENCH_INJURY_BOND, 1, mons, INFINITE_DURATION));
}
}
-} \ No newline at end of file
+}
diff --git a/crawl-ref/source/mon-behv.cc b/crawl-ref/source/mon-behv.cc
index 55e7b0cc17..b6b119b297 100644
--- a/crawl-ref/source/mon-behv.cc
+++ b/crawl-ref/source/mon-behv.cc
@@ -37,8 +37,6 @@
#include "view.h"
#include "shout.h"
-static void _set_nearest_monster_foe(monster* mons);
-
static void _guess_invis_foe_pos(monster* mon)
{
const actor* foe = mon->get_foe();
@@ -471,7 +469,7 @@ void handle_behaviour(monster* mon)
if (you.pet_target != MHITNOT)
mon->foe = you.pet_target;
else if (mons_class_is_stationary(mon->type))
- _set_nearest_monster_foe(mon);
+ set_nearest_monster_foe(mon);
}
else // Zotdef only
{
@@ -486,7 +484,7 @@ void handle_behaviour(monster* mon)
{
// Zotdef - this is all new, for out-of-sight friendlies to do
// something useful. If no current target, get the closest one.
- _set_nearest_monster_foe(mon);
+ set_nearest_monster_foe(mon);
}
}
}
@@ -510,7 +508,7 @@ void handle_behaviour(monster* mon)
mon->foe = MHITYOU;
}
else
- _set_nearest_monster_foe(mon);
+ set_nearest_monster_foe(mon);
}
// Pacified monsters leaving the level prefer not to attack.
@@ -521,7 +519,7 @@ void handle_behaviour(monster* mon)
&& mon->behaviour != BEH_SLEEP
&& (proxPlayer || one_chance_in(3)))
{
- _set_nearest_monster_foe(mon);
+ set_nearest_monster_foe(mon);
if (mon->foe == MHITNOT && crawl_state.game_is_zotdef())
mon->foe = MHITYOU;
}
@@ -673,7 +671,7 @@ void handle_behaviour(monster* mon)
// Having a seeking mon with a foe who's target is
// (0, 0) can lead to asserts, so lets try to
// avoid that.
- _set_nearest_monster_foe(mon);
+ set_nearest_monster_foe(mon);
if (mon->foe == MHITNOT)
{
new_beh = BEH_WANDER;
@@ -702,6 +700,13 @@ void handle_behaviour(monster* mon)
new_foe = MHITNOT;
new_beh = BEH_WANDER;
}
+ // If the player can see the target location, do not reset
+ // our target, even if this monster cannot (we'll assume
+ // the player passes along this information to allies)
+ else if (!foepos.origin() && you.see_cell(foepos))
+ {
+ mon->target = foepos;
+ }
else
{
new_foe = MHITYOU;
@@ -731,7 +736,9 @@ void handle_behaviour(monster* mon)
else
{
if (x_chance_in_y(50, you.stealth())
- || you.penance[GOD_ASHENZARI] && coinflip())
+ || you.penance[GOD_ASHENZARI] && coinflip()
+ || mons_class_flag(mon->type, M_VIGILANT)
+ && !one_chance_in(3))
{
mon->target = you.pos();
}
@@ -1143,7 +1150,7 @@ void handle_behaviour(monster* mon)
}
static bool _mons_check_foe(monster* mon, const coord_def& p,
- bool friendly, bool neutral)
+ bool friendly, bool neutral, bool ignore_sight)
{
// We don't check for the player here because otherwise wandering
// monsters will always attack you.
@@ -1155,7 +1162,7 @@ static bool _mons_check_foe(monster* mon, const coord_def& p,
&& (mon->has_ench(ENCH_INSANE)
|| foe->friendly() != friendly
|| neutral && !foe->neutral())
- && mon->can_see(foe)
+ && (ignore_sight || mon->can_see(foe))
&& !foe->is_projectile()
&& summon_can_attack(mon, p)
&& (friendly || !is_sanctuary(p))
@@ -1172,7 +1179,7 @@ static bool _mons_check_foe(monster* mon, const coord_def& p,
}
// Choose random nearest monster as a foe.
-static void _set_nearest_monster_foe(monster* mon)
+void set_nearest_monster_foe(monster* mon, bool near_player)
{
// These don't look for foes.
if (mon->good_neutral() || mon->strict_neutral()
@@ -1186,25 +1193,46 @@ static void _set_nearest_monster_foe(monster* mon)
const bool friendly = mon->friendly();
const bool neutral = mon->neutral();
- for (int k = 1; k <= LOS_RADIUS; ++k)
+ coord_def center = mon->pos();
+ bool second_pass = false;
+
+ while (true)
{
- vector<coord_def> monster_pos;
- for (int i = -k; i <= k; ++i)
- for (int j = -k; j <= k; (abs(i) == k ? j++ : j += 2*k))
- {
- const coord_def p = mon->pos() + coord_def(i, j);
- if (_mons_check_foe(mon, p, friendly, neutral))
- monster_pos.push_back(p);
- }
- if (monster_pos.empty())
- continue;
+ for (int k = 1; k <= LOS_RADIUS; ++k)
+ {
+ vector<coord_def> monster_pos;
+ for (int i = -k; i <= k; ++i)
+ for (int j = -k; j <= k; (abs(i) == k ? j++ : j += 2*k))
+ {
+ const coord_def p = center + coord_def(i, j);
- const coord_def mpos = monster_pos[random2(monster_pos.size())];
- if (mpos == you.pos())
- mon->foe = MHITYOU;
+ if (near_player && !you.see_cell(p))
+ continue;
+
+ if (_mons_check_foe(mon, p, friendly, neutral, second_pass))
+ monster_pos.push_back(p);
+ }
+ if (monster_pos.empty())
+ continue;
+
+ const coord_def mpos = monster_pos[random2(monster_pos.size())];
+ if (mpos == you.pos())
+ mon->foe = MHITYOU;
+ else
+ mon->foe = env.mgrid(mpos);
+ return;
+ }
+
+ // If we're selecting a new summon's autofoe and we were unable to
+ // find a foe in los of the monster, try a second pass using the
+ // player's los instead.
+ if (near_player && !second_pass)
+ {
+ center = you.pos();
+ second_pass = true;
+ }
else
- mon->foe = env.mgrid(mpos);
- return;
+ break;
}
}
@@ -1330,7 +1358,7 @@ void behaviour_event(monster* mon, mon_event_type event, const actor *src,
if (you.can_see(mon))
{
mprf("%s attack snaps %s out of its fear.",
- src->name(DESC_ITS).c_str(),
+ src ? src->name(DESC_ITS).c_str() : "the",
mon->name(DESC_THE).c_str());
}
mon->del_ench(ENCH_FEAR, true);
diff --git a/crawl-ref/source/mon-behv.h b/crawl-ref/source/mon-behv.h
index 87114a1c6b..9da719caa7 100644
--- a/crawl-ref/source/mon-behv.h
+++ b/crawl-ref/source/mon-behv.h
@@ -45,6 +45,8 @@ bool summon_can_attack(const monster* mons, const actor* targ);
void shake_off_monsters(const actor* target);
+void set_nearest_monster_foe(monster* mon, bool near_player = false);
+
// For Zotdef: the target position of MHITYOU monsters is
// the orb.
#define PLAYER_POS (crawl_state.game_is_zotdef() ? env.orb_pos : you.pos())
diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc
index e33766dd7e..4a6f85fc04 100644
--- a/crawl-ref/source/mon-cast.cc
+++ b/crawl-ref/source/mon-cast.cc
@@ -882,7 +882,7 @@ bolt mons_spell_beam(monster* mons, spell_type spell_cast, int power,
case SPELL_SUNRAY:
beam.colour = ETC_HOLY;
beam.name = "ray of light";
- beam.damage = dice_def(3, 7 + (power / 12));
+ beam.damage = dice_def(3, 6 + (power / 13));
beam.hit = 10 + power / 25; // lousy accuracy, but ignores RMsl
beam.flavour = BEAM_LIGHT;
break;
@@ -1040,6 +1040,19 @@ bolt mons_spell_beam(monster* mons, spell_type spell_cast, int power,
beam.is_beam = true;
break;
+ case SPELL_SHADOW_BOLT:
+ beam.name = "shadow bolt";
+ beam.is_beam = true;
+ // deliberate fall-through
+ case SPELL_SHADOW_SHARD:
+ if (real_spell == SPELL_SHADOW_SHARD)
+ beam.name = "shadow shard";
+ beam.damage = dice_def(3, 8 + power / 11);
+ beam.colour = MAGENTA;
+ beam.flavour = BEAM_MMISSILE;
+ beam.hit = 17 + power / 25;
+ break;
+
default:
if (check_validity)
{
@@ -2354,10 +2367,13 @@ static void _cast_druids_call(const monster* mon)
mon_list[i]->flags |= MF_WAS_IN_VIEW;
simple_monster_message(mon_list[i], " answers the druid's call!");
- // If this is a low-HD monster, try to summon a second. Otherwise,
- // we're done. (Only normal druids can ever summon two monsters)
- if (!second && mon_list[i]->hit_dice <= 10 && mon->hit_dice > 10)
+ // If this is a low-HD monster, sometimes try to summon a second.
+ // Otherwise, we're done. (Young druids can ever summon one)
+ if (!second && mon_list[i]->hit_dice <= 10 && mon->hit_dice > 10
+ && coinflip())
+ {
second = true;
+ }
else
return;
}
@@ -3400,10 +3416,10 @@ static monster_type _pick_undead_summon()
static monster_type _pick_vermin()
{
- return random_choose_weighted(9, MONS_ORANGE_RAT,
+ return random_choose_weighted(8, MONS_ORANGE_RAT,
5, MONS_REDBACK,
2, MONS_TARANTELLA,
- 1, MONS_JUMPING_SPIDER,
+ 2, MONS_JUMPING_SPIDER,
3, MONS_DEMONIC_CRAWLER,
0);
}
@@ -5397,7 +5413,7 @@ void mons_cast(monster* mons, bolt &pbolt, spell_type spell_cast,
{
mons->add_ench(ENCH_IOOD_CHARGED);
- if (orig_noise || !monsterNearby)
+ if (!monsterNearby)
return;
string msg = getSpeakString("orb spider charge");
if (!msg.empty())
diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h
index 1428dfb47b..99fa5c0e83 100644
--- a/crawl-ref/source/mon-data.h
+++ b/crawl-ref/source/mon-data.h
@@ -722,7 +722,7 @@ static monsterentry mondata[] =
MR_NO_FLAGS,
450, 13, MONS_ELF, MONS_ELF, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 5}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
- { 8, 3, 3, 0 },
+ { 9, 4, 3, 0 },
0, 13, MST_DEEP_ELF_SUMMONER, CE_CONTAMINATED, Z_NOZOMBIE, S_SHOUT,
I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
@@ -1348,7 +1348,7 @@ static monsterentry mondata[] =
{ {AT_BITE, AF_PLAIN, 14}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 4, 5, 5, 0 },
3, 11, MST_NO_SPELLS, CE_POISON_CONTAM, Z_NOZOMBIE, S_ROAR,
- I_ANIMAL, HT_LAND, FL_WINGED, 11, DEFAULT_ENERGY,
+ I_ANIMAL, HT_LAND, FL_WINGED, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
},
@@ -1360,7 +1360,7 @@ static monsterentry mondata[] =
{ {AT_BITE, AF_PLAIN, 14}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 4, 5, 5, 0 },
3, 11, MST_SWAMP_DRAKE, CE_POISON_CONTAM, Z_BIG, S_ROAR,
- I_ANIMAL, HT_LAND, FL_WINGED, 11, DEFAULT_ENERGY,
+ I_ANIMAL, HT_LAND, FL_WINGED, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
},
@@ -1792,7 +1792,7 @@ static monsterentry mondata[] =
M_CANT_SPAWN,
MR_NO_FLAGS,
0, 10, MONS_HUMAN, MONS_HUMAN, MH_NONLIVING, -3,
- { {AT_HIT, AF_PLAIN, 10}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { {AT_HIT, AF_PLAIN, 0}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 0, 0, 0, 1 },
3, 13, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
I_NORMAL, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
@@ -2077,7 +2077,7 @@ static monsterentry mondata[] =
MR_VUL_POISON,
300, 20, MONS_SPIDER, MONS_ORB_SPIDER, MH_NATURAL, -4,
{ {AT_BITE, AF_POISON_MEDIUM, 5}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
- { 5, 4, 5, 0 },
+ { 7, 4, 4, 0 },
3, 10, MST_ORB_SPIDER, CE_POISON_CONTAM, Z_SMALL, S_HISS,
I_INSECT, HT_LAND, FL_NONE, 12, SPELL_ENERGY(20),
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_SMALL
@@ -2154,7 +2154,7 @@ static monsterentry mondata[] =
{ {AT_BITE, AF_FIRE, 15}, {AT_CLAW, AF_FIRE, 15}, AT_NO_ATK, AT_NO_ATK },
{ 8, 4, 5, 0 },
9, 6, MST_NO_SPELLS, CE_POISON_CONTAM, Z_SMALL, S_SILENT,
- I_INSECT, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_INSECT, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_SMALL
},
@@ -2166,7 +2166,7 @@ static monsterentry mondata[] =
{ {AT_BITE, AF_CHAOS, 15}, {AT_CLAW, AF_CHAOS, 15}, AT_NO_ATK, AT_NO_ATK },
{ 8, 4, 5, 0 },
11, 6, MST_NO_SPELLS, CE_MUTAGEN, Z_SMALL, S_SILENT,
- I_INSECT, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_INSECT, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_SMALL
},
@@ -2179,7 +2179,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_PLAIN, 12}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 8, 3, 5, 0 },
3, 10, MST_NO_SPELLS, CE_MUTAGEN, Z_SMALL, S_GURGLE,
- I_ANIMAL, HT_LAND, FL_NONE, 11, ACTION_ENERGY(11),
+ I_ANIMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(9),
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -2191,7 +2191,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_PLAIN, 17}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 12, 3, 5, 0 },
4, 10, MST_NO_SPELLS, CE_MUTAGEN, Z_BIG, S_GURGLE,
- I_ANIMAL, HT_LAND, FL_NONE, 11, ACTION_ENERGY(11),
+ I_ANIMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(9),
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
},
@@ -2632,7 +2632,7 @@ static monsterentry mondata[] =
{ AT_NO_ATK, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 13, 0, 0, 55 },
25, 3, MST_CURSE_SKULL, CE_NOCORPSE, Z_NOZOMBIE, S_MOAN,
- I_HIGH, HT_LAND, FL_LEVITATE, 15, ACTION_ENERGY(15),
+ I_HIGH, HT_LAND, FL_LEVITATE, 10, MOVE_ENERGY(7),
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_TINY
},
@@ -2644,7 +2644,7 @@ static monsterentry mondata[] =
{ AT_NO_ATK, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 14, 0, 0, 100 },
25, 1, MST_CURSE_TOE, CE_NOCORPSE, Z_NOZOMBIE, S_MOAN,
- I_HIGH, HT_LAND, FL_LEVITATE, 7, ACTION_ENERGY(7),
+ I_HIGH, HT_LAND, FL_LEVITATE, 10, MOVE_ENERGY(14),
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_TINY
},
@@ -3273,7 +3273,7 @@ static monsterentry mondata[] =
AT_NO_ATK },
{ 9, 3, 5, 0 },
5, 7, MST_NO_SPELLS, CE_CONTAMINATED, Z_BIG, S_SILENT,
- I_ANIMAL, HT_LAND, FL_WINGED, 8, ACTION_ENERGY(8),
+ I_ANIMAL, HT_LAND, FL_WINGED, 10, MOVE_ENERGY(12),
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3417,7 +3417,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_COLD, 5}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 5, 3, 5, 0 },
5, 10, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
- I_ANIMAL, HT_AMPHIBIOUS, FL_NONE, 10, SWIM_ENERGY(11),
+ I_ANIMAL, HT_AMPHIBIOUS, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3528,7 +3528,7 @@ static monsterentry mondata[] =
{AT_HIT, AF_PLAIN, 12} },
{ 15, 3, 5, 0 },
5, 10, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
- I_PLANT, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_PLANT, HT_LAND, FL_NONE, 12, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_ITEMS, SIZE_SMALL
},
@@ -3701,7 +3701,7 @@ static monsterentry mondata[] =
AT_NO_ATK, AT_NO_ATK },
{ 5, 3, 5, 0 },
6, 10, MST_NAGA, CE_POISONOUS, Z_BIG, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3714,7 +3714,7 @@ static monsterentry mondata[] =
AT_NO_ATK, AT_NO_ATK },
{ 7, 3, 5, 0 },
6, 10, MST_NAGA_MAGE, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3728,20 +3728,20 @@ static monsterentry mondata[] =
{AT_CONSTRICT, AF_CRUSH, 5}, AT_NO_ATK },
{ 9, 6, 4, 0 },
6, 10, MST_NAGA_SNIPER, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
{
MONS_NAGA_RITUALIST, 'N', BROWN, "naga ritualist",
- M_SPELLCASTER | M_SEE_INVIS | M_WARM_BLOOD | M_SPEAKS,
+ M_SPELLCASTER | M_ACTUAL_SPELLS | M_SEE_INVIS | M_WARM_BLOOD | M_SPEAKS,
MR_RES_POISON,
1000, 14, MONS_NAGA, MONS_NAGA, MH_NATURAL, -6,
{ {AT_HIT, AF_PLAIN, 14}, {AT_CONSTRICT, AF_CRUSH, 4},
AT_NO_ATK, AT_NO_ATK },
{ 8, 5, 5, 0 },
6, 10, MST_NAGA_RITUALIST, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3755,7 +3755,7 @@ static monsterentry mondata[] =
AT_NO_ATK, AT_NO_ATK },
{ 10, 9, 2, 0 },
6, 10, MST_NAGA, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -3769,7 +3769,7 @@ static monsterentry mondata[] =
AT_NO_ATK, AT_NO_ATK },
{ 15, 3, 5, 0 },
6, 10, MST_NAGA_MAGE, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_HIGH, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_HIGH, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -4382,7 +4382,7 @@ static monsterentry mondata[] =
M_SEE_INVIS | M_INVIS | M_INSUBSTANTIAL,
MR_NO_FLAGS,
0, 15, MONS_WRAITH, MONS_SHADOW_WRAITH, MH_UNDEAD, -8,
- { {AT_HIT, AF_DRAIN_SPEED, 20}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { {AT_HIT, AF_DRAIN_SPEED, 27}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 3, 5, 0 },
7, 7, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_MOAN,
I_HIGH, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
@@ -4394,10 +4394,10 @@ static monsterentry mondata[] =
M_SEE_INVIS | M_INSUBSTANTIAL,
MR_VUL_FIRE | mrd(MR_RES_COLD, 3),
0, 10, MONS_WRAITH, MONS_FREEZING_WRAITH, MH_UNDEAD, -4,
- { {AT_HIT, AF_COLD, 19}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
+ { {AT_HIT, AF_COLD, 16}, {AT_HIT, AF_DRAIN_SPEED, 13}, AT_NO_ATK, AT_NO_ATK },
{ 8, 3, 5, 0 },
12, 10, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
- I_NORMAL, HT_LAND, FL_LEVITATE, 8, DEFAULT_ENERGY,
+ I_NORMAL, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -4410,7 +4410,7 @@ static monsterentry mondata[] =
AT_NO_ATK },
{ 13, 3, 5, 0 },
12, 10, MST_EIDOLON, CE_NOCORPSE, Z_NOZOMBIE, S_MOAN,
- I_NORMAL, HT_LAND, FL_LEVITATE, 11, DEFAULT_ENERGY,
+ I_NORMAL, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -4514,7 +4514,7 @@ static monsterentry mondata[] =
AT_NO_ATK },
{ 16, 3, 5, 0 },
5, 5, MST_TENTACLED_STARSPAWN, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
- I_NORMAL, HT_LAND, FL_NONE, 9, DEFAULT_ENERGY,
+ I_NORMAL, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_GIANT
},
@@ -4844,8 +4844,8 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_FIRE, 17}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 8, 4, 5, 0 },
5, 7, MST_NO_SPELLS, CE_CLEAN, Z_SMALL, S_SILENT,
- // energy here is ACTION_ENERGY, but includes swimming
- I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 8, {10, 8, 8, 8, 8, 8, 8, 80},
+ // energy here is MOVE_ENERGY, but excludes swimming
+ I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 10, {14, 10, 10, 10, 10, 10, 10, 100},
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -4857,7 +4857,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_FIREBRAND, 27}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 14, 3, 5, 0 },
5, 11, MST_NO_SPELLS, CE_CLEAN, Z_SMALL, S_SILENT,
- I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 10, {9, 7, 10, 10, 10, 10, 10, 100},
+ I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 10, {8, 7, 10, 10, 10, 10, 10, 100},
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -4869,8 +4869,8 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_FIRE, 11}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 9, 3, 4, 0 },
5, 7, MST_SALAMANDER_MYSTIC, CE_CLEAN, Z_SMALL, S_SILENT,
- // energy here is ACTION_ENERGY, but includes swimming
- I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 8, {10, 8, 8, 8, 8, 8, 8, 80},
+ // energy here is MOVE_ENERGY, but excludes swimming
+ I_HIGH, HT_AMPHIBIOUS_LAVA, FL_NONE, 10, {14, 10, 10, 10, 10, 10, 10, 100},
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_MEDIUM
},
@@ -5573,7 +5573,7 @@ static monsterentry mondata[] =
AT_NO_ATK },
{ 7, 3, 5, 0 },
5, 9, MST_SMOKE_DEMON, CE_NOCORPSE, Z_NOZOMBIE, S_ROAR,
- I_NORMAL, HT_LAND, FL_LEVITATE, 9, DEFAULT_ENERGY,
+ I_NORMAL, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_SMALL
},
@@ -5609,7 +5609,7 @@ static monsterentry mondata[] =
{ {AT_RANDOM, AF_CHAOS, 21}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 6, 3, 5, 0 },
7, 12, MST_NO_SPELLS, CE_NOCORPSE, Z_NOZOMBIE, S_RANDOM,
- I_ANIMAL, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_ANIMAL, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_BIG
},
@@ -5623,7 +5623,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_PLAIN, 21}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 3, 5, 0 },
7, 12, MST_SHADOW_DEMON, CE_NOCORPSE, Z_NOZOMBIE, S_CROAK,
- I_HIGH, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_SMALL
},
@@ -5635,7 +5635,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_PLAIN, 32}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 13, 3, 5, 0 },
5, 7, MST_GREEN_DEATH, CE_POISON_CONTAM, Z_NOZOMBIE, S_ROAR,
- I_HIGH, HT_LAND, FL_NONE, 11, DEFAULT_ENERGY,
+ I_HIGH, HT_LAND, FL_NONE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
},
@@ -5647,7 +5647,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_PLAIN, 20}, {AT_HIT, AF_PLAIN, 20}, AT_NO_ATK, AT_NO_ATK },
{ 12, 3, 5, 0 },
10, 10, MST_BLIZZARD_DEMON, CE_NOCORPSE, Z_NOZOMBIE, S_SHOUT,
- I_HIGH, HT_LAND, FL_LEVITATE, 11, DEFAULT_ENERGY,
+ I_HIGH, HT_LAND, FL_LEVITATE, 10, DEFAULT_ENERGY,
MONUSE_OPEN_DOORS, MONEAT_NOTHING, SIZE_LARGE
},
@@ -5659,7 +5659,7 @@ static monsterentry mondata[] =
{ {AT_HIT, AF_FIRE, 25}, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 14, 3, 5, 0 },
5, 12, MST_BALRUG, CE_NOCORPSE, Z_NOZOMBIE, S_SHOUT,
- I_HIGH, HT_LAND, FL_WINGED, 11, DEFAULT_ENERGY,
+ I_HIGH, HT_LAND, FL_WINGED, 12, DEFAULT_ENERGY,
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
@@ -6199,7 +6199,7 @@ static monsterentry mondata[] =
{ AT_NO_ATK, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK },
{ 10, 0, 0, 70 },
10, 10, MST_WRETCHED_STAR, CE_NOCORPSE, Z_NOZOMBIE, S_SILENT,
- I_NORMAL, HT_LAND, FL_LEVITATE, 12, ACTION_ENERGY(12),
+ I_NORMAL, HT_LAND, FL_LEVITATE, 10, MOVE_ENERGY(8),
MONUSE_NOTHING, MONEAT_NOTHING, SIZE_LITTLE
},
@@ -6705,7 +6705,7 @@ static monsterentry mondata[] =
{AT_CONSTRICT, AF_CRUSH, 7}, AT_NO_ATK },
{ 16, 0, 0, 160 },
6, 18, MST_VASHNIA, CE_POISONOUS, Z_NOZOMBIE, S_SHOUT,
- I_NORMAL, HT_LAND, FL_NONE, 8, ACTION_ENERGY(8),
+ I_NORMAL, HT_LAND, FL_NONE, 10, MOVE_ENERGY(14),
MONUSE_WEAPONS_ARMOUR, MONEAT_NOTHING, SIZE_LARGE
},
diff --git a/crawl-ref/source/mon-gear.cc b/crawl-ref/source/mon-gear.cc
index cdcaaf6753..b69655ee4d 100644
--- a/crawl-ref/source/mon-gear.cc
+++ b/crawl-ref/source/mon-gear.cc
@@ -1588,6 +1588,7 @@ static item_make_species_type _give_weapon(monster* mon, int level,
|| item.sub_type == WPN_STAFF
|| item.sub_type == WPN_ROD
|| item.sub_type == WPN_HAMMER
+ || is_giant_club_type(item.sub_type)
|| item.sub_type > WPN_SLING); // the last of these checks for
// blessed base weapon types
if (one_chance_in(100))
@@ -1611,11 +1612,9 @@ static item_make_species_type _give_weapon(monster* mon, int level,
item.sub_type = random_choose_weighted(10, WPN_DEMON_BLADE,
10, WPN_DEMON_WHIP,
10, WPN_DEMON_TRIDENT,
- 5, WPN_BATTLEAXE,
- 2, WPN_EXECUTIONERS_AXE,
+ 7, WPN_BATTLEAXE,
5, WPN_GREAT_SWORD,
- 1, WPN_BASTARD_SWORD,
- 1, WPN_CLAYMORE,
+ 2, WPN_BASTARD_SWORD,
5, WPN_DIRE_FLAIL,
2, WPN_GREAT_MACE,
5, WPN_GLAIVE,
diff --git a/crawl-ref/source/mon-info.cc b/crawl-ref/source/mon-info.cc
index 977b60389a..00fa84d95a 100644
--- a/crawl-ref/source/mon-info.cc
+++ b/crawl-ref/source/mon-info.cc
@@ -361,6 +361,7 @@ monster_info::monster_info(monster_type p_type, monster_type p_base_type)
mitemuse = mons_class_itemuse(type);
mbase_speed = mons_class_base_speed(type);
+ menergy = mons_class_energy(type);
fly = max(mons_class_flies(type), mons_class_flies(base_type));
@@ -585,6 +586,7 @@ monster_info::monster_info(const monster* m, int milev)
mresists = get_mons_resists(m);
mitemuse = mons_itemuse(m);
mbase_speed = mons_base_speed(m);
+ menergy = mons_class_energy(m->type);
fly = mons_flies(m);
if (mons_wields_two_weapons(m))
diff --git a/crawl-ref/source/mon-info.h b/crawl-ref/source/mon-info.h
index 5c29f6db24..3671526dbb 100644
--- a/crawl-ref/source/mon-info.h
+++ b/crawl-ref/source/mon-info.h
@@ -140,6 +140,7 @@ struct monster_info_base
resists_t mresists;
mon_itemuse_type mitemuse;
int mbase_speed;
+ mon_energy_usage menergy;
flight_type fly;
CrawlHashTable props;
string constrictor_name;
diff --git a/crawl-ref/source/mon-pick-data.h b/crawl-ref/source/mon-pick-data.h
index bf1d94d31d..94c0387535 100644
--- a/crawl-ref/source/mon-pick-data.h
+++ b/crawl-ref/source/mon-pick-data.h
@@ -349,10 +349,9 @@ static const pop_entry pop_shoals[] =
{ 1, 5, 735, FLAT, MONS_MERFOLK },
{ 1, 5, 300, FLAT, MONS_MERMAID },
{ -1, 5, 89, SEMI, MONS_CENTAUR },
- { 1, 5, 334, FLAT, MONS_MANTICORE },
+ { 1, 5, 360, FLAT, MONS_MANTICORE },
{ 1, 5, 175, FLAT, MONS_HARPY },
{ 1, 5, 385, FLAT, MONS_SNAPPING_TURTLE },
- { 1, 7, 25, PEAK, MONS_OKLOB_PLANT },
{ 1, 7, 170, SEMI, MONS_SIREN },
{ 1, 7, 110, SEMI, MONS_CYCLOPS },
{ 1, 7, 375, FLAT, MONS_SHARK },
@@ -360,9 +359,9 @@ static const pop_entry pop_shoals[] =
{ 1, 7, 73, SEMI, MONS_KRAKEN },
{ 2, 8, 85, PEAK, MONS_ALLIGATOR_SNAPPING_TURTLE },
{ 1, 8, 265, SEMI, MONS_MERFOLK_IMPALER },
- { 1, 8, 145, SEMI, MONS_MERFOLK_AQUAMANCER },
+ { 1, 8, 125, SEMI, MONS_MERFOLK_AQUAMANCER },
{ 2, 8, 135, PEAK, MONS_MERFOLK_JAVELINEER },
- { 1, 4, 235, SEMI, MONS_FAUN },
+ { 1, 4, 255, SEMI, MONS_FAUN },
{ 3, 5, 190, SEMI, MONS_SATYR },
{ 1, 5, 125, FLAT, MONS_WIND_DRAKE },
{ 1, 5, 195, FLAT, MONS_WATER_ELEMENTAL },
diff --git a/crawl-ref/source/mon-place.cc b/crawl-ref/source/mon-place.cc
index 5eea78deed..1ef9cd468c 100644
--- a/crawl-ref/source/mon-place.cc
+++ b/crawl-ref/source/mon-place.cc
@@ -2510,7 +2510,7 @@ static band_type _choose_band(monster_type mon_type, int &band_size,
case MONS_MERFOLK_AQUAMANCER:
band = BAND_MERFOLK_AQUAMANCER;
- band_size = random_range(3, 6);
+ band_size = random_range(3, 4);
break;
case MONS_MERFOLK_JAVELINEER:
@@ -3093,7 +3093,7 @@ static monster_type _band_member(band_type band, int which)
return MONS_SLAVE;
case BAND_MERFOLK_AQUAMANCER:
- return random_choose_weighted( 5, MONS_MERFOLK,
+ return random_choose_weighted( 4, MONS_MERFOLK,
11, MONS_WATER_ELEMENTAL,
0);
@@ -3507,6 +3507,9 @@ monster* mons_place(mgen_data mg)
behaviour_event(creation, ME_EVAL);
}
+ if (mg.flags & MG_AUTOFOE && creation->attitude == ATT_FRIENDLY)
+ set_nearest_monster_foe(creation, true);
+
return creation;
}
diff --git a/crawl-ref/source/mon-spll.h b/crawl-ref/source/mon-spll.h
index 207420aeb1..135934fb40 100644
--- a/crawl-ref/source/mon-spll.h
+++ b/crawl-ref/source/mon-spll.h
@@ -611,7 +611,7 @@
{
SPELL_BLINK,
SPELL_SUMMON_VERMIN,
- SPELL_NO_SPELL,
+ SPELL_SUMMON_VERMIN,
SPELL_SUMMON_VERMIN,
SPELL_NO_SPELL,
SPELL_NO_SPELL
@@ -1480,9 +1480,9 @@
{
SPELL_SUNRAY,
SPELL_AWAKEN_FOREST,
- SPELL_HASTE_PLANTS,
+ SPELL_NO_SPELL,
SPELL_DRUIDS_CALL,
- SPELL_HASTE_PLANTS,
+ SPELL_NO_SPELL,
SPELL_MINOR_HEALING
}
},
@@ -1800,7 +1800,7 @@
SPELL_MAGIC_DART,
SPELL_SLOW,
SPELL_NO_SPELL,
- SPELL_SUMMON_MINOR_DEMON,
+ SPELL_CALL_IMP,
SPELL_NO_SPELL,
SPELL_MEPHITIC_CLOUD
}
diff --git a/crawl-ref/source/mon-stuff.cc b/crawl-ref/source/mon-stuff.cc
index 7856474544..96c2f893eb 100644
--- a/crawl-ref/source/mon-stuff.cc
+++ b/crawl-ref/source/mon-stuff.cc
@@ -1673,7 +1673,7 @@ int monster_die(monster* mons, killer_type killer,
}
// Kills by the spectral weapon are considered as kills by the player instead
- // Ditto Dithmengos shadow kills.
+ // Ditto Dithmenos shadow kills.
if ((killer == KILL_MON || killer == KILL_MON_MISSILE)
&& !invalid_monster_index(killer_index)
&& ((menv[killer_index].type == MONS_SPECTRAL_WEAPON
@@ -2039,7 +2039,7 @@ int monster_die(monster* mons, killer_type killer,
true, mons);
}
- // Dithmengos hates sources of illumination.
+ // Dithmenos hates sources of illumination.
// (This is *after* the holy so that the right order of
// messages appears.)
if (mons_is_illuminating(mons))
diff --git a/crawl-ref/source/mon-util.cc b/crawl-ref/source/mon-util.cc
index 57e0dc8c80..26e70e0b20 100644
--- a/crawl-ref/source/mon-util.cc
+++ b/crawl-ref/source/mon-util.cc
@@ -701,7 +701,7 @@ bool cheibriados_thinks_mons_is_fast(const monster* mon)
return cheibriados_monster_player_speed_delta(mon) > 0;
}
-// Dithmengos hates halos and spells that cause illumination.
+// Dithmenos hates halos and spells that cause illumination.
bool mons_is_illuminating(const monster* mon)
{
if (mon->halo_radius2() >= 0)
@@ -716,7 +716,7 @@ bool mons_is_illuminating(const monster* mon)
return false;
}
-// Dithmengos also hates fire users and generally fiery beings.
+// Dithmenos also hates fire users and generally fiery beings.
bool mons_is_fiery(const monster* mon)
{
// This chain of checks is for fire breath weapons and special
@@ -1797,6 +1797,12 @@ mon_attack_def mons_attack_spec(const monster* mon, int attk_number)
return mbase->attack[1];
}
+ if (mon->type == MONS_PLAYER_SHADOW && attk_number == 0)
+ {
+ if (!you.weapon())
+ attk.damage = max(1, you.skill_rdiv(SK_UNARMED_COMBAT, 10, 20));
+ }
+
if (attk.type == AT_RANDOM)
attk.type = random_choose(AT_HIT, AT_GORE, -1);
@@ -2890,6 +2896,12 @@ int mons_class_base_speed(monster_type mc)
return smc->speed;
}
+mon_energy_usage mons_class_energy(monster_type mc)
+{
+ ASSERT_smc();
+ return smc->energy_usage;
+}
+
int mons_class_zombie_base_speed(monster_type zombie_base_mc)
{
return max(3, mons_class_base_speed(zombie_base_mc) - 2);
diff --git a/crawl-ref/source/mon-util.h b/crawl-ref/source/mon-util.h
index 02d78cb46a..8304d69c5c 100644
--- a/crawl-ref/source/mon-util.h
+++ b/crawl-ref/source/mon-util.h
@@ -88,6 +88,18 @@ struct mon_energy_usage
me.pickup_percent = combine(pickup_percent, o.pickup_percent, 100);
return me;
}
+
+ bool operator == (const mon_energy_usage &rvalue) const
+ {
+ return move == rvalue.move
+ && swim == rvalue.swim
+ && attack == rvalue.attack
+ && missile == rvalue.missile
+ && spell == rvalue.spell
+ && special == rvalue.special
+ && item == rvalue.item
+ && pickup_percent == rvalue.pickup_percent;
+ }
private:
static uint8_t combine(uint8_t a, uint8_t b, uint8_t def = 10)
{
@@ -262,6 +274,7 @@ bool mons_zombifiable(monster_type mc);
int mons_weight(monster_type mc);
int mons_class_base_speed(monster_type mc);
+mon_energy_usage mons_class_energy(monster_type mc);
int mons_class_zombie_base_speed(monster_type zombie_base_mc);
int mons_base_speed(const monster* mon);
diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc
index 60f3e65b8a..f92d0c3763 100644
--- a/crawl-ref/source/monster.cc
+++ b/crawl-ref/source/monster.cc
@@ -47,6 +47,7 @@
#include "religion.h"
#include "shopping.h"
#include "spl-damage.h"
+#include "spl-monench.h"
#include "spl-util.h"
#include "spl-summoning.h"
#include "state.h"
@@ -3079,7 +3080,7 @@ void monster::expose_to_element(beam_type flavour, int strength,
if (slow_cold_blood && mons_class_flag(type, M_COLD_BLOOD)
&& res_cold() <= 0 && coinflip())
{
- slow_down(this, strength);
+ do_slow_monster(this, this, (strength + random2(5)) * BASELINE_DELAY);
}
break;
case BEAM_WATER:
@@ -6119,12 +6120,12 @@ bool monster::is_web_immune() const
}
// Undead monsters have nightvision, as do all followers of Yredelemnul
-// and Dithmengos.
+// and Dithmenos.
bool monster::nightvision() const
{
return holiness() == MH_UNDEAD
|| god == GOD_YREDELEMNUL
- || god == GOD_DITHMENGOS;
+ || god == GOD_DITHMENOS;
}
bool monster::attempt_escape(int attempts)
diff --git a/crawl-ref/source/mutation.cc b/crawl-ref/source/mutation.cc
index 2bb5a380ce..336c8f6324 100644
--- a/crawl-ref/source/mutation.cc
+++ b/crawl-ref/source/mutation.cc
@@ -172,6 +172,8 @@ mutation_activity_type mutation_activity_level(mutation_type mut)
return MUTACT_FULL;
if (mut == MUT_ACIDIC_BITE && drag == MONS_GOLDEN_DRAGON)
return MUTACT_FULL;
+ if (mut == MUT_STINGER && drag == MONS_SWAMP_DRAGON)
+ return MUTACT_FULL;
}
// Dex and HP changes are kept in all forms.
if (mut == MUT_ROUGH_BLACK_SCALES || mut == MUT_RUGGED_BROWN_SCALES)
diff --git a/crawl-ref/source/newgame.cc b/crawl-ref/source/newgame.cc
index 87de347ad6..a028587278 100644
--- a/crawl-ref/source/newgame.cc
+++ b/crawl-ref/source/newgame.cc
@@ -379,7 +379,12 @@ static bool _reroll_random(newgame_def* ng)
cprintf("\nDo you want to play this combination? (ynq) [y]");
char c = getchm();
if (key_is_escape(c) || toalower(c) == 'q')
+ {
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
game_ended();
+ }
return toalower(c) == 'n';
}
@@ -400,6 +405,9 @@ static void _choose_char(newgame_def* ng, newgame_def* choice,
if (!yesno("Trunk games don't count for the tournament, you want "
TOURNEY ". Play trunk anyway? (Y/N)", false, 'n'))
{
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
game_ended();
}
}
@@ -827,10 +835,16 @@ static void _prompt_species(newgame_def* ng, newgame_def* ng_choice,
{
case 'X':
cprintf("\nGoodbye!");
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
end(0);
return;
CASE_ESCAPE
- game_ended();
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
+ game_ended();
case CK_BKSP:
ng_choice->species = SP_UNKNOWN;
return;
@@ -1225,9 +1239,15 @@ static void _prompt_job(newgame_def* ng, newgame_def* ng_choice,
{
case 'X':
cprintf("\nGoodbye!");
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
end(0);
return;
CASE_ESCAPE
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
game_ended();
case CK_BKSP:
ng_choice->job = JOB_UNKNOWN;
@@ -1540,6 +1560,9 @@ static bool _prompt_weapon(const newgame_def* ng, newgame_def* ng_choice,
{
case 'X':
cprintf("\nGoodbye!");
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
end(0);
break;
case ' ':
@@ -1957,9 +1980,15 @@ static void _prompt_gamemode_map(newgame_def* ng, newgame_def* ng_choice,
{
case 'X':
cprintf("\nGoodbye!");
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
end(0);
break;
CASE_ESCAPE
+#ifdef USE_TILE_WEB
+ tiles.send_exit_reason("cancel");
+#endif
game_ended();
break;
case ' ':
diff --git a/crawl-ref/source/ouch.cc b/crawl-ref/source/ouch.cc
index 383efc962e..2db296efd6 100644
--- a/crawl-ref/source/ouch.cc
+++ b/crawl-ref/source/ouch.cc
@@ -943,7 +943,7 @@ static void _maybe_fog(int dam)
- upper_threshold
* (you.piety - piety_breakpoint(2))
/ (MAX_PIETY - piety_breakpoint(2));
- if (you_worship(GOD_DITHMENGOS)
+ if (you_worship(GOD_DITHMENOS)
&& you.piety >= piety_breakpoint(2)
&& (dam > 0 && you.form == TRAN_SHADOW
|| dam >= lower_threshold
diff --git a/crawl-ref/source/player-equip.cc b/crawl-ref/source/player-equip.cc
index f1062c278f..3761579308 100644
--- a/crawl-ref/source/player-equip.cc
+++ b/crawl-ref/source/player-equip.cc
@@ -455,9 +455,9 @@ static void _equip_use_warning(const item_def& item)
mpr("You really shouldn't be using a hasty item like this.");
else if (is_poisoned_item(item) && you_worship(GOD_SHINING_ONE))
mpr("You really shouldn't be using a poisoned item like this.");
- else if (is_illuminating_item(item) && you_worship(GOD_DITHMENGOS))
+ else if (is_illuminating_item(item) && you_worship(GOD_DITHMENOS))
mpr("You really shouldn't be using an illuminating item like this.");
- else if (is_fiery_item(item) && you_worship(GOD_DITHMENGOS))
+ else if (is_fiery_item(item) && you_worship(GOD_DITHMENOS))
mpr("You really shouldn't be using a fiery item like this.");
}
diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc
index 42a2786cec..9ac4b478e2 100644
--- a/crawl-ref/source/player.cc
+++ b/crawl-ref/source/player.cc
@@ -2260,8 +2260,6 @@ int player_movement_speed(bool ignore_burden)
mv = 8;
else if (you.form == TRAN_JELLY)
mv = 11;
- else if (you.form == TRAN_ICE_BEAST && you.in_liquid())
- mv = 11;
else if (you.fishtail)
mv = 6;
@@ -3970,9 +3968,13 @@ int check_stealth(void)
// makes you extremely unstealthy.
if (you.backlit())
stealth = stealth * 2 / 5;
- // On the other hand, shrouding has the reverse effect:
- if (you.umbra())
- stealth *= 2;
+ // On the other hand, shrouding has the reverse effect, if you know
+ // how to make use of it:
+ if (you.umbra()
+ && (you_worship(GOD_DITHMENOS) || you_worship(GOD_YREDELEMNUL)))
+ {
+ stealth = stealth * (you.piety + MAX_PIETY) / MAX_PIETY;
+ }
// The shifting glow from the Orb, while too unstable to negate invis
// or affect to-hit, affects stealth even more than regular glow.
if (orb_haloed(you.pos()))
@@ -4002,8 +4004,6 @@ int get_expiration_threshold(duration_type dur)
case DUR_SILENCE: // no message
return 5 * BASELINE_DELAY;
- case DUR_DEFLECT_MISSILES:
- case DUR_REPEL_MISSILES:
case DUR_REGENERATION:
case DUR_RESISTANCE:
case DUR_SWIFTNESS:
@@ -6315,9 +6315,9 @@ void player::shield_block_succeeded(actor *foe)
int player::missile_deflection() const
{
- if (duration[DUR_DEFLECT_MISSILES])
+ if (attribute[ATTR_DEFLECT_MISSILES])
return 2;
- if (duration[DUR_REPEL_MISSILES]
+ if (attribute[ATTR_REPEL_MISSILES]
|| player_mutation_level(MUT_DISTORTION_FIELD) == 3
|| scan_artefacts(ARTP_RMSL, true))
{
@@ -6328,20 +6328,23 @@ int player::missile_deflection() const
void player::ablate_deflection()
{
+ int power;
if (attribute[ATTR_DEFLECT_MISSILES])
{
- if (one_chance_in(attribute[ATTR_DEFLECT_MISSILES]))
+ power = calc_spell_power(SPELL_DEFLECT_MISSILES, true);
+ if (one_chance_in(2 + power / 8))
{
attribute[ATTR_DEFLECT_MISSILES] = 0;
- mprf(MSGCH_DURATION, "Your deflect missiles spell is about to expire...");
+ mprf(MSGCH_DURATION, "You feel less protected from missiles.");
}
}
- else if (attribute[ATTR_REPEL_MISSILES] && !duration[DUR_DEFLECT_MISSILES])
+ else if (attribute[ATTR_REPEL_MISSILES])
{
- if (one_chance_in(attribute[ATTR_REPEL_MISSILES]))
+ power = calc_spell_power(SPELL_REPEL_MISSILES, true);
+ if (one_chance_in(2 + power / 8))
{
attribute[ATTR_REPEL_MISSILES] = 0;
- mprf(MSGCH_DURATION, "Your repel missiles spell is about to expire...");
+ mprf(MSGCH_DURATION, "You feel less protected from missiles.");
}
}
}
@@ -7072,7 +7075,7 @@ bool player::tengu_flight() const
bool player::nightvision() const
{
return is_undead
- || (religion == GOD_DITHMENGOS && piety >= piety_breakpoint(0))
+ || (religion == GOD_DITHMENOS && piety >= piety_breakpoint(0))
|| (religion == GOD_YREDELEMNUL && piety >= piety_breakpoint(2));
}
diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc
index 5e2456b07e..791d7836b1 100644
--- a/crawl-ref/source/religion.cc
+++ b/crawl-ref/source/religion.cc
@@ -210,7 +210,7 @@ static const char *_Sacrifice_Messages[NUM_GODS][NUM_PIETY_GAIN] =
" pulsate% black.", // unused
" strongly pulsate% black.", // unused
},
- // Dithmengos
+ // Dithmenos
{
" slowly dissolves into the shadows.",
" dissolves into the shadows.",
@@ -333,7 +333,7 @@ const char* god_gain_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
"scry through walls",
"Ashenzari helps you to reconsider your skills."
},
- // Dithmengos
+ // Dithmenos
{ "",
"step into the shadows of nearby creatures",
"You now sometimes bleed smoke when heavily injured by enemies.",
@@ -457,7 +457,7 @@ const char* god_lose_power_messages[NUM_GODS][MAX_GOD_ABILITIES] =
"scry through walls",
"Ashenzari no longer helps you to reconsider your skills."
},
- // Dithmengos
+ // Dithmenos
{ "",
"step into the shadows of nearby creatures",
"You no longer bleed smoke.",
@@ -677,7 +677,7 @@ string get_god_likes(god_type which_god, bool verbose)
case GOD_OKAWARU:
case GOD_VEHUMET:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
likes.push_back("you kill living beings");
break;
@@ -713,7 +713,7 @@ string get_god_likes(god_type which_god, bool verbose)
case GOD_OKAWARU:
case GOD_VEHUMET:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
likes.push_back("you kill the undead");
break;
@@ -743,7 +743,7 @@ string get_god_likes(god_type which_god, bool verbose)
case GOD_OKAWARU:
case GOD_VEHUMET:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
likes.push_back("you kill demons");
break;
@@ -786,7 +786,7 @@ string get_god_likes(god_type which_god, bool verbose)
case GOD_OKAWARU:
case GOD_VEHUMET:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
likes.push_back("you kill holy beings");
break;
@@ -809,7 +809,7 @@ string get_god_likes(god_type which_god, bool verbose)
really_likes.push_back("you kill wizards and other users of magic");
break;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
really_likes.push_back("you kill beings that bring light to the "
"dungeon, through fire or other means");
break;
@@ -898,7 +898,7 @@ string get_god_dislikes(god_type which_god, bool /*verbose*/)
really_dislikes.push_back("you destroy spellbooks");
break;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
dislikes.push_back("you light up the dungeon through fire magic or "
"other magical means");
break;
@@ -1054,8 +1054,8 @@ void dec_penance(god_type god, int val)
redraw_screen();
notify_stat_change("mollifying Cheibriados");
}
- // Likewise Dithmengos's umbra.
- else if (god == GOD_DITHMENGOS
+ // Likewise Dithmenos's umbra.
+ else if (god == GOD_DITHMENOS
&& you.piety >= piety_breakpoint(0))
{
mprf(MSGCH_GOD, "Your aura of darkness returns!");
@@ -1082,7 +1082,30 @@ void dec_penance(god_type god, int val)
take_note(Note(NOTE_MOLLIFY_GOD, god));
}
else
+ {
you.penance[god] -= val;
+ return;
+ }
+
+ // We only get this far if we just mollified a god.
+ // If we just mollified a god, see if we have any angry gods left.
+ // If we don't, clear the stored wrath / XP counter.
+ int i = GOD_NO_GOD;
+ for (; i < NUM_GODS; ++i)
+ {
+ if (player_under_penance((god_type) i)
+ && (i != GOD_NEMELEX_XOBEH || you.penance[i] > 100)
+ && (i != GOD_ASHENZARI))
+ {
+ break;
+ }
+ }
+
+ if (i != NUM_GODS)
+ return;
+
+ you.attribute[ATTR_GOD_WRATH_COUNT] = 0;
+ you.attribute[ATTR_GOD_WRATH_XP] = 0;
}
void dec_penance(int val)
@@ -1179,7 +1202,7 @@ static void _inc_penance(god_type god, int val)
redraw_screen();
notify_stat_change("falling into Cheibriados' penance");
}
- else if (god == GOD_DITHMENGOS)
+ else if (god == GOD_DITHMENOS)
{
if (you.umbraed())
mprf(MSGCH_GOD, god, "Your aura of darkness fades away.");
@@ -2462,7 +2485,7 @@ string god_name(god_type which_god, bool long_name)
case GOD_CHEIBRIADOS: return "Cheibriados";
case GOD_XOM: return "Xom";
case GOD_ASHENZARI: return "Ashenzari";
- case GOD_DITHMENGOS: return "Dithmengos";
+ case GOD_DITHMENOS: return "Dithmenos";
case GOD_JIYVA: // This is handled at the beginning of the function
case NUM_GODS: return "Buggy";
}
@@ -2790,8 +2813,6 @@ static void _gain_piety_point()
// title.
you.redraw_title = true;
- gain_god_ability(i);
-
if (_abil_chg_message(god_gain_power_messages[you.religion][i],
"You can now %s.", i))
{
@@ -2818,7 +2839,7 @@ static void _gain_piety_point()
auto_id_inventory();
}
- if (you_worship(GOD_DITHMENGOS) && i == 0)
+ if (you_worship(GOD_DITHMENOS) && i == 0)
mprf(MSGCH_GOD, "You are shrouded in an aura of darkness!");
// When you gain a piety level, you get another chance to
@@ -2843,7 +2864,7 @@ static void _gain_piety_point()
notify_stat_change("Cheibriados piety gain");
}
- if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENGOS))
+ if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENOS))
{
// Piety change affects halo / umbra radius.
invalidate_agrid(true);
@@ -2966,7 +2987,6 @@ void lose_piety(int pgn)
// title.
you.redraw_title = true;
- lose_god_ability(i);
_abil_chg_message(god_lose_power_messages[you.religion][i],
"You can no longer %s.", i);
@@ -3000,7 +3020,7 @@ void lose_piety(int pgn)
notify_stat_change("Cheibriados piety loss");
}
- if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENGOS))
+ if (you_worship(GOD_SHINING_ONE) || you_worship(GOD_DITHMENOS))
{
// Piety change affects halo / umbra radius.
invalidate_agrid(true);
@@ -3068,7 +3088,7 @@ void excommunication(god_type new_god)
take_note(Note(NOTE_LOSE_GOD, old_god));
- vector<ability_type> abilities = get_god_abilities(true);
+ vector<ability_type> abilities = get_god_abilities(true, true);
for (unsigned int i = 0; i < abilities.size(); ++i)
{
you.stop_train.insert(abil_skill(abilities[i]));
@@ -3272,7 +3292,7 @@ void excommunication(god_type new_god)
_set_penance(old_god, 50);
break;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (was_umbraed)
mprf(MSGCH_GOD, old_god, "Your aura of darkness fades away.");
_set_penance(old_god, 25);
@@ -3516,8 +3536,8 @@ bool player_can_join_god(god_type which_god)
if (which_god == GOD_SIF_MUNA && !you.spell_no)
return false;
- // Dithmengos hates fiery species.
- if (which_god == GOD_DITHMENGOS
+ // Dithmenos hates fiery species.
+ if (which_god == GOD_DITHMENOS
&& (you.species == SP_DJINNI
|| you.species == SP_LAVA_ORC))
{
@@ -3714,9 +3734,14 @@ void god_pitch(god_type which_god)
you.train[sk] = 0;
}
- // Elyvilon and Cheibriados give you invocations immediately.
- if (you_worship(GOD_ELYVILON) || you_worship(GOD_CHEIBRIADOS))
- you.start_train.insert(SK_INVOCATIONS);
+ // Allow training all divine ability skills immediately.
+ vector<ability_type> abilities = get_god_abilities(true, true);
+ for (unsigned int i = 0; i < abilities.size(); ++i)
+ {
+ you.start_train.insert(abil_skill(abilities[i]));
+ if (abilities[i] == ABIL_TSO_DIVINE_SHIELD)
+ you.start_train.insert(SK_SHIELDS);
+ }
// When you start worshipping a good god, you make all non-hostile
// unholy and evil beings hostile; when you start worshipping Zin,
@@ -3994,7 +4019,7 @@ bool god_hates_spell(spell_type spell, god_type god, bool rod_spell)
if (is_hasty_spell(spell))
return true;
break;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (is_illuminating_spell(spell) || is_fiery_spell(spell))
return true;
break;
@@ -4076,20 +4101,31 @@ void handle_god_time(int time_delta)
{
// Nemelex penance is special: it's only "active"
// when penance > 100, else it's passive.
- if (player_under_penance((god_type) i) && (i != GOD_NEMELEX_XOBEH
- || you.penance[i] > 100))
+ // Ash wrath is not impacted by time.
+ if (player_under_penance((god_type) i)
+ && (i != GOD_NEMELEX_XOBEH || you.penance[i] > 100)
+ && (i != GOD_ASHENZARI))
{
angry_gods.push_back((god_type) i);
}
}
shuffle_array(angry_gods);
- // Now roll to see whether we get retribution and from which god.
- const unsigned int which_penance = random2(10);
- if (which_penance < angry_gods.size())
+ int tries = 10;
+ while (tries-- > 0)
{
- if (divine_retribution(angry_gods[which_penance]))
- you.attribute[ATTR_GOD_WRATH_COUNT]--;
+ // Now roll to see whether we get retribution and from which god.
+ const unsigned int which_penance = random2(10);
+ if (which_penance < angry_gods.size())
+ {
+ // If this *fails*, we rolled a god who doesn't exist or whose
+ // wrath doesn't occur this way, so try again.
+ if (!divine_retribution(angry_gods[which_penance]))
+ continue;
+ }
+ else
+ break;
}
+ you.attribute[ATTR_GOD_WRATH_COUNT]--;
}
// Update the god's opinion of the player.
@@ -4135,7 +4171,7 @@ void handle_god_time(int time_delta)
case GOD_MAKHLEB:
case GOD_BEOGH:
case GOD_LUGONU:
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
if (one_chance_in(16))
lose_piety(1);
break;
@@ -4219,7 +4255,7 @@ int god_colour(god_type god) // mv - added
case GOD_CHEIBRIADOS:
return LIGHTCYAN;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
return MAGENTA;
case GOD_NO_GOD:
@@ -4296,7 +4332,7 @@ colour_t god_message_altar_colour(god_type god)
case GOD_JIYVA:
return coinflip() ? GREEN : LIGHTGREEN;
- case GOD_DITHMENGOS:
+ case GOD_DITHMENOS:
return MAGENTA;
default:
diff --git a/crawl-ref/source/rltiles/dc-feat.txt b/crawl-ref/source/rltiles/dc-feat.txt
index 7c963b363f..979c668e2a 100644
--- a/crawl-ref/source/rltiles/dc-feat.txt
+++ b/crawl-ref/source/rltiles/dc-feat.txt
@@ -609,9 +609,9 @@ jiyva11
fedhas DNGN_ALTAR_FEDHAS
cheibriados DNGN_ALTAR_CHEIBRIADOS
ashenzari DNGN_ALTAR_ASHENZARI
-dithmengos DNGN_ALTAR_DITHMENGOS
-dithmengos2
-dithmengos3
+dithmenos DNGN_ALTAR_DITHMENOS
+dithmenos2
+dithmenos3
unknown DNGN_UNKNOWN_ALTAR
%sdir dngn
diff --git a/crawl-ref/source/rltiles/dc-invocations.txt b/crawl-ref/source/rltiles/dc-invocations.txt
index 27bcd1f35e..2fdd710c94 100644
--- a/crawl-ref/source/rltiles/dc-invocations.txt
+++ b/crawl-ref/source/rltiles/dc-invocations.txt
@@ -9,8 +9,8 @@ cheibriados_bend_time ABILITY_CHEIBRIADOS_BEND_TIME
cheibriados_slouch ABILITY_CHEIBRIADOS_SLOUCH
cheibriados_temporal_distortion ABILITY_CHEIBRIADOS_TEMPORAL_DISTORTION
cheibriados_time_step ABILITY_CHEIBRIADOS_TIME_STEP
-dithmengos_shadow_form ABILITY_DITHMENGOS_SHADOW_FORM
-dithmengos_shadow_step ABILITY_DITHMENGOS_SHADOW_STEP
+dithmenos_shadow_form ABILITY_DITHMENOS_SHADOW_FORM
+dithmenos_shadow_step ABILITY_DITHMENOS_SHADOW_STEP
elyvilon_divine_protection ABILITY_ELYVILON_DIVINE_PROTECTION
elyvilon_divine_vigour ABILITY_ELYVILON_DIVINE_VIGOUR
elyvilon_greater_healing ABILITY_ELYVILON_GREATER_HEALING
diff --git a/crawl-ref/source/rltiles/dc-player.txt b/crawl-ref/source/rltiles/dc-player.txt
index ff6e934de1..dd3832c775 100644
--- a/crawl-ref/source/rltiles/dc-player.txt
+++ b/crawl-ref/source/rltiles/dc-player.txt
@@ -496,6 +496,7 @@ knife_of_accuracy KNIFE_OF_ACCURACY
vampires_tooth VAMPIRES_TOOTH
spriggans_knife SPRIGGANS_KNIFE
capt_cutlass CAPT_CUTLASS
+arc_blade ARC_BLADE
## blunt
wucad_mu WUCAD_MU
mace_of_variability MACE_OF_VARIABILITY
@@ -505,6 +506,7 @@ eos EOS
snakebite SNAKEBITE
shillelagh SHILLELAGH
dark_maul DARK_MAUL
+spellbinder SPELLBINDER
## polearms
trident_octopus_king TRIDENT_OCTOPUS_KING
glaive_of_prune GLAIVE_OF_PRUNE
diff --git a/crawl-ref/source/rltiles/dngn/altars/dithmengos.png b/crawl-ref/source/rltiles/dngn/altars/dithmenos.png
index 081370600f..081370600f 100644
--- a/crawl-ref/source/rltiles/dngn/altars/dithmengos.png
+++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dngn/altars/dithmengos2.png b/crawl-ref/source/rltiles/dngn/altars/dithmenos2.png
index 86f724e383..86f724e383 100644
--- a/crawl-ref/source/rltiles/dngn/altars/dithmengos2.png
+++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos2.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/dngn/altars/dithmengos3.png b/crawl-ref/source/rltiles/dngn/altars/dithmenos3.png
index 7bd70aede5..7bd70aede5 100644
--- a/crawl-ref/source/rltiles/dngn/altars/dithmengos3.png
+++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos3.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_form.png b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_form.png
index 660d188cc2..660d188cc2 100644
--- a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_form.png
+++ b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_form.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_step.png b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_step.png
index a646d019ff..a646d019ff 100644
--- a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_step.png
+++ b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_step.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png b/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png
index 6e4e2caf72..6d166b1f12 100644
--- a/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png
+++ b/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/item/weapon/artefact/urand_arc_blade.png b/crawl-ref/source/rltiles/item/weapon/artefact/urand_arc_blade.png
new file mode 100644
index 0000000000..195f020dbd
--- /dev/null
+++ b/crawl-ref/source/rltiles/item/weapon/artefact/urand_arc_blade.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png b/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png
new file mode 100644
index 0000000000..851ed1d11c
--- /dev/null
+++ b/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png b/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png
new file mode 100644
index 0000000000..4a5a3c25d6
--- /dev/null
+++ b/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png b/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png
new file mode 100644
index 0000000000..8a93e805ff
--- /dev/null
+++ b/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png
Binary files differ
diff --git a/crawl-ref/source/rltiles/player/hand2/shield_gong.png b/crawl-ref/source/rltiles/player/hand2/shield_gong.png
index ae3cf61a1a..39f58324e2 100644
--- a/crawl-ref/source/rltiles/player/hand2/shield_gong.png
+++ b/crawl-ref/source/rltiles/player/hand2/shield_gong.png
Binary files differ
diff --git a/crawl-ref/source/shout.cc b/crawl-ref/source/shout.cc
index 9e83b04eb8..b55550024e 100644
--- a/crawl-ref/source/shout.cc
+++ b/crawl-ref/source/shout.cc
@@ -301,10 +301,6 @@ bool check_awaken(monster* mons)
if (you.berserk())
return true;
- // Vigilant monsters are always alerted
- if (mons_class_flag(mons->type, M_VIGILANT))
- return true;
-
// I assume that creatures who can sense invisible are very perceptive.
int mons_perc = 10 + (mons_intel(mons) * 4) + mons->hit_dice
+ mons_sense_invis(mons) * 5;
diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc
index 7e400b06e2..98d992f2d0 100644
--- a/crawl-ref/source/spl-cast.cc
+++ b/crawl-ref/source/spl-cast.cc
@@ -1352,13 +1352,16 @@ spret_type your_spells(spell_type spell, int powc,
if (you.props.exists("battlesphere") && allow_fail)
trigger_battlesphere(&you, beam);
actor* victim = actor_at(beam.target);
- if (you_worship(GOD_DITHMENGOS)
+ if (you_worship(GOD_DITHMENOS)
&& allow_fail
+ && !god_hates_spell(spell, GOD_DITHMENOS, !allow_fail)
&& (flags & SPFLAG_TARGETING_MASK)
&& !(flags & SPFLAG_NEUTRAL)
+ && (beam.is_enchantment()
+ || battlesphere_can_mirror(spell))
&& (!old_target || (victim && !victim->is_player())))
{
- dithmengos_shadow_spell(beam.target, spell);
+ dithmenos_shadow_spell(&beam, spell);
}
_spellcasting_side_effects(spell, powc, god, allow_fail);
return SPRET_SUCCESS;
diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h
index c50b3364e8..8eb9c57730 100644
--- a/crawl-ref/source/spl-data.h
+++ b/crawl-ref/source/spl-data.h
@@ -1612,7 +1612,7 @@ struct spell_desc
SPELL_ENGLACIATION, "Metabolic Englaciation",
SPTYP_HEXES | SPTYP_ICE,
SPFLAG_AREA,
- 6,
+ 5,
200,
-1, -1,
0,
@@ -3598,6 +3598,30 @@ struct spell_desc
0,
NULL,
false,
+},
+
+{
+ SPELL_SHADOW_SHARD, "Shadow Shard",
+ SPTYP_CONJURATION,
+ SPFLAG_DIR_OR_TARGET | SPFLAG_MONSTER,
+ 5,
+ 200,
+ LOS_RADIUS, LOS_RADIUS,
+ 0,
+ NULL,
+ true,
+},
+
+{
+ SPELL_SHADOW_BOLT, "Shadow Bolt",
+ SPTYP_CONJURATION,
+ SPFLAG_DIR_OR_TARGET | SPFLAG_MONSTER,
+ 5,
+ 200,
+ LOS_RADIUS, LOS_RADIUS,
+ 0,
+ NULL,
+ true,
false
},
diff --git a/crawl-ref/source/spl-goditem.cc b/crawl-ref/source/spl-goditem.cc
index ba55deda5f..4453130441 100644
--- a/crawl-ref/source/spl-goditem.cc
+++ b/crawl-ref/source/spl-goditem.cc
@@ -398,9 +398,9 @@ void antimagic()
{
DUR_INVIS, DUR_CONF, DUR_PARALYSIS, DUR_HASTE, DUR_MIGHT, DUR_AGILITY,
DUR_BRILLIANCE, DUR_CONFUSING_TOUCH, DUR_SURE_BLADE, DUR_CORONA,
- DUR_FIRE_SHIELD, DUR_ICY_ARMOUR, DUR_REPEL_MISSILES,
+ DUR_FIRE_SHIELD, DUR_ICY_ARMOUR,
DUR_SWIFTNESS, DUR_CONTROL_TELEPORT,
- DUR_TRANSFORMATION, DUR_DEATH_CHANNEL, DUR_DEFLECT_MISSILES,
+ DUR_TRANSFORMATION, DUR_DEATH_CHANNEL,
DUR_PHASE_SHIFT, DUR_WEAPON_BRAND, DUR_SILENCE,
DUR_CONDENSATION_SHIELD, DUR_STONESKIN, DUR_RESISTANCE,
DUR_SLAYING, DUR_STEALTH,
diff --git a/crawl-ref/source/spl-miscast.cc b/crawl-ref/source/spl-miscast.cc
index 8b49d8cde2..310ff3a114 100644
--- a/crawl-ref/source/spl-miscast.cc
+++ b/crawl-ref/source/spl-miscast.cc
@@ -153,7 +153,7 @@ void MiscastEffect::init()
kill_source = NON_MONSTER;
}
- if (kill_source == NON_MONSTER)
+ if (kill_source == NON_MONSTER || kill_source == MHITYOU)
{
kc = KC_YOU;
kt = KILL_YOU_MISSILE;
diff --git a/crawl-ref/source/spl-monench.cc b/crawl-ref/source/spl-monench.cc
index 3f8d638257..bc661261da 100644
--- a/crawl-ref/source/spl-monench.cc
+++ b/crawl-ref/source/spl-monench.cc
@@ -102,8 +102,7 @@ bool do_slow_monster(monster* mon, const actor* agent, int dur)
if (mon->check_stasis(false))
return true;
- if (!mon->has_ench(ENCH_SLOW)
- && !mon->is_stationary()
+ if (!mon->is_stationary()
&& mon->add_ench(mon_enchant(ENCH_SLOW, 0, agent, dur)))
{
if (!mon->paralysed() && !mon->petrified()
diff --git a/crawl-ref/source/spl-selfench.cc b/crawl-ref/source/spl-selfench.cc
index 09f0bfdace..5582d5a985 100644
--- a/crawl-ref/source/spl-selfench.cc
+++ b/crawl-ref/source/spl-selfench.cc
@@ -111,18 +111,26 @@ spret_type ice_armour(int pow, bool fail)
spret_type missile_prot(int pow, bool fail)
{
+ if (you.attribute[ATTR_REPEL_MISSILES])
+ {
+ mpr("You are already repelling missiles.");
+ return SPRET_ABORT;
+ }
fail_check();
- you.attribute[ATTR_REPEL_MISSILES] = 1 + pow / 6;
- you.set_duration(DUR_REPEL_MISSILES, 1 + random2(3));
+ you.attribute[ATTR_REPEL_MISSILES] = 1;
mpr("You feel protected from missiles.");
return SPRET_SUCCESS;
}
spret_type deflection(int pow, bool fail)
{
+ if (you.attribute[ATTR_DEFLECT_MISSILES])
+ {
+ mpr("You are already deflecting missiles.");
+ return SPRET_ABORT;
+ }
fail_check();
- you.attribute[ATTR_DEFLECT_MISSILES] = 1 + pow / 6;
- you.set_duration(DUR_DEFLECT_MISSILES, 1 + random2(3));
+ you.attribute[ATTR_DEFLECT_MISSILES] = 1;
mpr("You feel very safe from missiles.");
return SPRET_SUCCESS;
}
diff --git a/crawl-ref/source/spl-summoning.cc b/crawl-ref/source/spl-summoning.cc
index 28d61062a5..6a6c34c6e2 100644
--- a/crawl-ref/source/spl-summoning.cc
+++ b/crawl-ref/source/spl-summoning.cc
@@ -102,7 +102,7 @@ spret_type cast_summon_small_mammal(int pow, god_type god, bool fail)
mgen_data(mon, BEH_FRIENDLY, &you,
3, SPELL_SUMMON_SMALL_MAMMAL,
you.pos(), MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
canned_msg(MSG_NOTHING_HAPPENS);
}
@@ -171,7 +171,7 @@ spret_type cast_sticks_to_snakes(int pow, god_type god, bool fail)
if (monster *snake = create_monster(mgen_data(mon, beha, &you,
0, SPELL_STICKS_TO_SNAKES, you.pos(),
- MHITYOU, 0, god), false))
+ MHITYOU, MG_AUTOFOE, god), false))
{
count++;
snake->add_ench(mon_enchant(ENCH_FAKE_ABJURATION, dur));
@@ -224,7 +224,7 @@ spret_type cast_summon_swarm(int pow, god_type god, bool fail)
dur, SPELL_SUMMON_SWARM,
you.pos(),
MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
success = true;
}
@@ -270,7 +270,7 @@ spret_type cast_call_canine_familiar(int pow, god_type god, bool fail)
dur, SPELL_CALL_CANINE_FAMILIAR,
you.pos(),
MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
canned_msg(MSG_NOTHING_HAPPENS);
}
@@ -448,7 +448,7 @@ spret_type cast_summon_elemental(int pow, god_type god,
dur, SPELL_SUMMON_ELEMENTAL,
targ,
MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
canned_msg(MSG_NOTHING_HAPPENS);
return SPRET_SUCCESS;
@@ -471,7 +471,7 @@ spret_type cast_summon_ice_beast(int pow, god_type god, bool fail)
mgen_data(MONS_ICE_BEAST, BEH_FRIENDLY, &you,
dur, SPELL_SUMMON_ICE_BEAST,
you.pos(), MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
mpr("A chill wind blows around you.");
}
@@ -499,7 +499,7 @@ spret_type cast_summon_ugly_thing(int pow, god_type god, bool fail)
dur, SPELL_SUMMON_UGLY_THING,
you.pos(),
MHITYOU,
- 0, god)))
+ MG_AUTOFOE, god)))
{
mpr((mon == MONS_VERY_UGLY_THING) ? "A very ugly thing appears."
: "An ugly thing appears.");
@@ -532,7 +532,7 @@ spret_type cast_summon_hydra(actor *caster, int pow, god_type god, bool fail)
1, SPELL_SUMMON_HYDRA, caster->pos(),
(caster->is_player()) ?
MHITYOU : caster->as_monster()->foe,
- 0, (god == GOD_NO_GOD) ? caster->deity() : god,
+ MG_AUTOFOE, (god == GOD_NO_GOD) ? caster->deity() : god,
MONS_HYDRA, heads)))
{
if (you.see_cell(hydra->pos()))
@@ -598,7 +598,7 @@ spret_type cast_summon_dragon(actor *caster, int pow, god_type god, bool fail)
caster->pos(),
(caster->is_player()) ? MHITYOU
: caster->as_monster()->foe,
- 0, god)))
+ MG_AUTOFOE, god)))
{
if (you.see_cell(dragon->pos()))
mpr("A dragon appears.");
@@ -679,7 +679,7 @@ bool summon_berserker(int pow, actor *caster, monster_type override_mons)
caster ? caster->pos() : you.pos(),
(caster && caster->is_monster())
? ((monster*)caster)->foe : MHITYOU,
- 0, GOD_TROG);
+ MG_AUTOFOE, GOD_TROG);
if (!caster)
mg.non_actor_summoner = "the rage of " + god_name(GOD_TROG, false);
@@ -701,7 +701,7 @@ bool summon_holy_warrior(int pow, bool punish)
punish ? 0 : &you,
punish ? 0 : min(2 + (random2(pow) / 4), 6),
0, you.pos(), MHITYOU,
- MG_FORCE_BEH, GOD_SHINING_ONE);
+ MG_FORCE_BEH | MG_AUTOFOE, GOD_SHINING_ONE);
if (punish)
{
@@ -766,7 +766,7 @@ spret_type cast_tukimas_dance(int pow, god_type god, bool force_hostile,
dur, SPELL_TUKIMAS_DANCE,
you.pos(),
MHITYOU,
- 0, god);
+ MG_AUTOFOE, god);
mg.props[TUKIMA_WEAPON] = cp;
mg.props[TUKIMA_POWER] = pow;
@@ -936,7 +936,7 @@ spret_type cast_call_imp(int pow, god_type god, bool fail)
if (monster *imp = create_monster(
mgen_data(mon, BEH_FRIENDLY, &you, dur, SPELL_CALL_IMP,
- you.pos(), MHITYOU, MG_FORCE_BEH, god)))
+ you.pos(), MHITYOU, MG_FORCE_BEH | MG_AUTOFOE, god)))
{
mpr((mon == MONS_WHITE_IMP) ? "A beastly little devil appears in a puff of frigid air." :
(mon == MONS_IRON_IMP) ? "A metallic apparition takes form in the air." :
@@ -962,7 +962,7 @@ static bool _summon_demon_wrapper(int pow, god_type god, int spell,
mgen_data(mon,
friendly ? BEH_FRIENDLY :
charmed ? BEH_CHARMED : BEH_HOSTILE, &you,
- dur, spell, you.pos(), MHITYOU, MG_FORCE_BEH, god)))
+ dur, spell, you.pos(), MHITYOU, MG_FORCE_BEH | MG_AUTOFOE, god)))
{
success = true;
@@ -1092,7 +1092,7 @@ spret_type cast_shadow_creatures(bool scroll, god_type god, bool fail)
mgen_data(critter, BEH_FRIENDLY, &you,
(scroll ? 2 : 1), // This duration is only used for band members.
SPELL_SHADOW_CREATURES, you.pos(), MHITYOU,
- MG_FORCE_BEH, god), false))
+ MG_FORCE_BEH | MG_AUTOFOE, god), false))
{
// In the rare cases that a specific spell set of a monster will
// cause anger, even if others do not, try rerolling
@@ -1200,7 +1200,7 @@ spret_type cast_malign_gateway(actor * caster, int pow, god_type god, bool fail)
{
fail_check();
- const int malign_gateway_duration = BASELINE_DELAY * (random2(5) + 5);
+ const int malign_gateway_duration = BASELINE_DELAY * (random2(4) + 4);
env.markers.add(new map_malign_gateway_marker(point,
malign_gateway_duration,
is_player,
@@ -1270,7 +1270,7 @@ spret_type cast_summon_horrible_things(int pow, god_type god, bool fail)
mgen_data(MONS_ABOMINATION_LARGE, BEH_FRIENDLY, &you,
6, SPELL_SUMMON_HORRIBLE_THINGS,
you.pos(), MHITYOU,
- MG_FORCE_BEH, god)))
+ MG_FORCE_BEH | MG_AUTOFOE, god)))
{
count++;
player_angers_monster(mons);
@@ -1283,7 +1283,7 @@ spret_type cast_summon_horrible_things(int pow, god_type god, bool fail)
mgen_data(MONS_TENTACLED_MONSTROSITY, BEH_FRIENDLY, &you,
6, SPELL_SUMMON_HORRIBLE_THINGS,
you.pos(), MHITYOU,
- MG_FORCE_BEH, god)))
+ MG_FORCE_BEH | MG_AUTOFOE, god)))
{
count++;
player_angers_monster(mons);
@@ -1634,7 +1634,8 @@ static bool _raise_remains(const coord_def &pos, int corps, beh_type beha,
// Use the original monster type as the zombified type here, to get
// the proper stats from it.
- mgen_data mg(mon, beha, as, 0, 0, pos, hitting, MG_FORCE_BEH|MG_FORCE_PLACE,
+ mgen_data mg(mon, beha, as, 0, 0, pos, hitting,
+ MG_FORCE_BEH|MG_FORCE_PLACE|MG_AUTOFOE,
god, monnum, number);
// No experience for monsters animated by god wrath or the Sword of
@@ -1962,7 +1963,7 @@ spret_type cast_simulacrum(int pow, god_type god, bool fail)
mgen_data mg(MONS_SIMULACRUM, BEH_FRIENDLY, &you,
0, SPELL_SIMULACRUM,
you.pos(), MHITYOU,
- MG_FORCE_BEH, god,
+ MG_FORCE_BEH | MG_AUTOFOE, god,
flesh->sub_type == FOOD_CHUNK ?
static_cast<monster_type>(flesh->orig_monnum) :
sim_type);
@@ -2283,7 +2284,8 @@ bool twisted_resurrection(actor *caster, int pow, beh_type beha,
else
montype = MONS_CRAWLING_CORPSE;
- mgen_data mg(montype, beha, caster, 0, 0, *ri, foe, MG_FORCE_BEH, god);
+ mgen_data mg(montype, beha, caster, 0, 0, *ri, foe,
+ MG_FORCE_BEH | MG_AUTOFOE, god);
if (monster *mons = create_monster(mg))
{
// Set hit dice, AC, and HP.
@@ -2649,7 +2651,7 @@ void end_battlesphere(monster* mons, bool killed)
}
}
-static bool _battlesphere_can_mirror(spell_type spell)
+bool battlesphere_can_mirror(spell_type spell)
{
return (spell_typematch(spell, SPTYP_CONJURATION)
&& spell_to_zap(spell) != NUM_ZAPS)
@@ -2664,7 +2666,7 @@ static bool _battlesphere_can_mirror(spell_type spell)
bool aim_battlesphere(actor* agent, spell_type spell, int powc, bolt& beam)
{
//Is this spell something that will trigger the battlesphere?
- if (_battlesphere_can_mirror(spell))
+ if (battlesphere_can_mirror(spell))
{
monster* battlesphere = find_battlesphere(agent);
@@ -3262,7 +3264,7 @@ void trigger_grand_avatar(monster* mons, actor* victim, spell_type spell,
if (!victim
|| !victim->alive()
- || (!melee && !_battlesphere_can_mirror(spell))
+ || (!melee && !battlesphere_can_mirror(spell))
|| old_hp - victim->stat_hp() < random2(GRAND_AVATAR_DAMAGE))
{
return;
@@ -3332,7 +3334,7 @@ static const summons_desc summonsdata[] =
{ SPELL_FIRE_SUMMON, 4, 2 },
{ SPELL_SUMMON_MINOR_DEMON, 3, 3 },
{ SPELL_CALL_LOST_SOUL, 3, 2 },
- { SPELL_SUMMON_VERMIN, 3, 2 },
+ { SPELL_SUMMON_VERMIN, 5, 2 },
{ SPELL_FORCEFUL_INVITATION, 3, 1 },
{ SPELL_PLANEREND, 8, 1 },
// Rod specials
diff --git a/crawl-ref/source/spl-summoning.h b/crawl-ref/source/spl-summoning.h
index 5552637f2d..aa8d68c690 100644
--- a/crawl-ref/source/spl-summoning.h
+++ b/crawl-ref/source/spl-summoning.h
@@ -96,6 +96,7 @@ spret_type cast_mass_abjuration(int pow, bool fail = false);
monster* find_battlesphere(const actor* agent);
spret_type cast_battlesphere(actor* agent, int pow, god_type god, bool fail);
void end_battlesphere(monster* mons, bool killed);
+bool battlesphere_can_mirror(spell_type spell);
bool aim_battlesphere(actor* agent, spell_type spell, int powc, bolt& beam);
bool trigger_battlesphere(actor* agent, bolt& beam);
bool fire_battlesphere(monster* mons);
diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc
index 3ebcbfd5d8..4d36a1c0d4 100644
--- a/crawl-ref/source/status.cc
+++ b/crawl-ref/source/status.cc
@@ -1101,30 +1101,22 @@ static void _describe_missiles(status_info* inf)
if (!level)
return;
- bool expiring;
if (level > 1)
{
- inf->light_colour = MAGENTA;
+ inf->light_colour = LIGHTMAGENTA;
inf->light_text = "DMsl";
inf->short_text = "deflect missiles";
inf->long_text = "You deflect missiles.";
- expiring = (you.attribute[ATTR_DEFLECT_MISSILES] == 0
- && dur_expiring(DUR_DEFLECT_MISSILES));
}
else
{
bool perm = player_mutation_level(MUT_DISTORTION_FIELD) == 3
|| you.scan_artefacts(ARTP_RMSL);
- inf->light_colour = perm ? WHITE : BLUE;
+ inf->light_colour = perm ? WHITE : LIGHTBLUE;
inf->light_text = "RMsl";
inf->short_text = "repel missiles";
inf->long_text = "You repel missiles.";
- expiring = (!perm && you.attribute[ATTR_REPEL_MISSILES] == 0
- && dur_expiring(DUR_REPEL_MISSILES));
}
-
- inf->light_colour = _dur_colour(inf->light_colour, expiring);
- _mark_expiring(inf, expiring);
}
static void _describe_invisible(status_info* inf)
diff --git a/crawl-ref/source/tag-version.h b/crawl-ref/source/tag-version.h
index 4dd2a4f86f..c9557362b3 100644
--- a/crawl-ref/source/tag-version.h
+++ b/crawl-ref/source/tag-version.h
@@ -79,6 +79,7 @@ enum tag_minor_version
TAG_MINOR_DEMONSPAWN, // Save compat wrt demonspawn enemies.
TAG_MINOR_EVENT_TIMERS, // "Every 20 turn" effects are less determinstic.
TAG_MINOR_EVENT_TIMER_FIX, // Correct event timers in transferred games
+ TAG_MINOR_MONINFO_ENERGY, // Energy usage in monster_info
#endif
NUM_TAG_MINORS,
TAG_MINOR_VERSION = NUM_TAG_MINORS - 1
diff --git a/crawl-ref/source/tags.cc b/crawl-ref/source/tags.cc
index 1476b3f78d..fed24a968a 100644
--- a/crawl-ref/source/tags.cc
+++ b/crawl-ref/source/tags.cc
@@ -3862,6 +3862,14 @@ void marshallMonsterInfo(writer &th, const monster_info& mi)
marshallInt(th, mi.mresists);
marshallUnsigned(th, mi.mitemuse);
marshallByte(th, mi.mbase_speed);
+ marshallByte(th, mi.menergy.move);
+ marshallByte(th, mi.menergy.swim);
+ marshallByte(th, mi.menergy.attack);
+ marshallByte(th, mi.menergy.missile);
+ marshallByte(th, mi.menergy.spell);
+ marshallByte(th, mi.menergy.special);
+ marshallByte(th, mi.menergy.item);
+ marshallByte(th, mi.menergy.pickup_percent);
marshallUnsigned(th, mi.fly);
for (unsigned int i = 0; i <= MSLOT_LAST_VISIBLE_SLOT; ++i)
{
@@ -4038,6 +4046,22 @@ void unmarshallMonsterInfo(reader &th, monster_info& mi)
ASSERT(mi.base_type != MONS_NO_MONSTER);
}
}
+
+ if (th.getMinorVersion() < TAG_MINOR_MONINFO_ENERGY)
+ mi.menergy = mons_class_energy(mi.type);
+ else
+ {
+#endif
+ mi.menergy.move = unmarshallByte(th);
+ mi.menergy.swim = unmarshallByte(th);
+ mi.menergy.attack = unmarshallByte(th);
+ mi.menergy.missile = unmarshallByte(th);
+ mi.menergy.spell = unmarshallByte(th);
+ mi.menergy.special = unmarshallByte(th);
+ mi.menergy.item = unmarshallByte(th);
+ mi.menergy.pickup_percent = unmarshallByte(th);
+#if TAG_MAJOR_VERSION == 34
+ }
#endif
// Some TAG_MAJOR_VERSION == 34 saves suffered data loss here, beware.
diff --git a/crawl-ref/source/target.cc b/crawl-ref/source/target.cc
index 043dbc1469..de34fc33e6 100644
--- a/crawl-ref/source/target.cc
+++ b/crawl-ref/source/target.cc
@@ -1067,9 +1067,7 @@ void targetter_jump::get_additional_sites(coord_def a)
if (immobile)
{
const actor *victim = actor_at(a);
- if (!victim
- || victim->invisible()
- || victim->mons_species() == MONS_VAMPIRE)
+ if (!victim || victim->invisible())
{
no_landing_reason = BLOCKED_NO_TARGET;
return;
diff --git a/crawl-ref/source/terrain.cc b/crawl-ref/source/terrain.cc
index bd54df794a..45685741db 100644
--- a/crawl-ref/source/terrain.cc
+++ b/crawl-ref/source/terrain.cc
@@ -1629,7 +1629,7 @@ static const char *dngn_feature_names[] =
"altar_okawaru", "altar_makhleb", "altar_sif_muna", "altar_trog",
"altar_nemelex_xobeh", "altar_elyvilon", "altar_lugonu",
"altar_beogh", "altar_jiyva", "altar_fedhas", "altar_cheibriados",
-"altar_ashenzari", "altar_dithmengos",
+"altar_ashenzari", "altar_dithmenos",
"fountain_blue", "fountain_sparkling", "fountain_blood",
#if TAG_MAJOR_VERSION == 34
diff --git a/crawl-ref/source/throw.cc b/crawl-ref/source/throw.cc
index 516866e19a..dabfb87ad0 100644
--- a/crawl-ref/source/throw.cc
+++ b/crawl-ref/source/throw.cc
@@ -2093,11 +2093,11 @@ bool throw_it(bolt &pbolt, int throw_2, bool teleport, int acc_bonus,
delete pbolt.special_explosion;
if (!teleport
- && you_worship(GOD_DITHMENGOS)
+ && you_worship(GOD_DITHMENOS)
&& thrown.base_type == OBJ_MISSILES
&& thrown.sub_type != MI_NEEDLE)
{
- dithmengos_shadow_throw(thr.target);
+ dithmenos_shadow_throw(thr.target);
}
return hit;
diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc
index d874f1e463..ed8634695b 100644
--- a/crawl-ref/source/tilepick.cc
+++ b/crawl-ref/source/tilepick.cc
@@ -447,8 +447,8 @@ static tileidx_t _tileidx_feature_base(dungeon_feature_type feat)
return TILE_DNGN_ALTAR_CHEIBRIADOS;
case DNGN_ALTAR_ASHENZARI:
return TILE_DNGN_ALTAR_ASHENZARI;
- case DNGN_ALTAR_DITHMENGOS:
- return TILE_DNGN_ALTAR_DITHMENGOS;
+ case DNGN_ALTAR_DITHMENOS:
+ return TILE_DNGN_ALTAR_DITHMENOS;
case DNGN_FOUNTAIN_BLUE:
return TILE_DNGN_BLUE_FOUNTAIN;
case DNGN_FOUNTAIN_SPARKLING:
@@ -5650,11 +5650,11 @@ tileidx_t tileidx_ability(const ability_type ability)
return TILEG_ABILITY_ASHENZARI_TRANSFER_KNOWLEDGE;
case ABIL_ASHENZARI_END_TRANSFER:
return TILEG_ABILITY_ASHENZARI_TRANSFER_KNOWLEDGE_END;
- // Dithmengos
- case ABIL_DITHMENGOS_SHADOW_STEP:
- return TILEG_ABILITY_DITHMENGOS_SHADOW_STEP;
- case ABIL_DITHMENGOS_SHADOW_FORM:
- return TILEG_ABILITY_DITHMENGOS_SHADOW_FORM;
+ // Dithmenos
+ case ABIL_DITHMENOS_SHADOW_STEP:
+ return TILEG_ABILITY_DITHMENOS_SHADOW_STEP;
+ case ABIL_DITHMENOS_SHADOW_FORM:
+ return TILEG_ABILITY_DITHMENOS_SHADOW_FORM;
// General divine (pseudo) abilities.
case ABIL_RENOUNCE_RELIGION:
diff --git a/crawl-ref/source/tileweb.cc b/crawl-ref/source/tileweb.cc
index 5e84fd7c9d..3b689f184a 100644
--- a/crawl-ref/source/tileweb.cc
+++ b/crawl-ref/source/tileweb.cc
@@ -868,7 +868,7 @@ void TilesFramework::_send_item(item_info& current, const item_info& next,
const int current_prefcol = menu_colour(current.name(DESC_INVENTORY), current_prefix);
const int prefcol = menu_colour(next.name(DESC_INVENTORY), prefix);
- if (current_prefcol != prefcol)
+ if (force_full || current_prefcol != prefcol)
json_write_int("col", prefcol);
}
diff --git a/crawl-ref/source/webserver/static/scripts/client.js b/crawl-ref/source/webserver/static/scripts/client.js
index c3758cf915..97b2d8ba93 100644
--- a/crawl-ref/source/webserver/static/scripts/client.js
+++ b/crawl-ref/source/webserver/static/scripts/client.js
@@ -22,7 +22,7 @@ function (exports, $, key_conversion, chat, comm) {
var showing_close_message = false;
var current_hash;
var exit_reason, exit_message, exit_dump;
- var normal_exit = ["saved", "quit", "won", "bailed out", "dead"];
+ var normal_exit = ["saved", "cancel", "quit", "won", "bailed out", "dead"];
var send_message = comm.send_message;
@@ -526,6 +526,8 @@ function (exports, $, key_conversion, chat, comm) {
case "bailed out":
case "dead":
return null;
+ case "cancel":
+ return watched_name + " quit before creating a character.";
case "saved":
return watched_name + " stopped playing (saved).";
case "crash":
@@ -547,6 +549,7 @@ function (exports, $, key_conversion, chat, comm) {
case "bailed out":
case "dead":
case "saved":
+ case "cancel":
return null;
case "crash":
return "Unfortunately your game crashed.";