diff options
author | DracoOmega <draco_omega@live.com> | 2014-02-13 22:01:47 -0330 |
---|---|---|
committer | DracoOmega <draco_omega@live.com> | 2014-02-13 22:01:47 -0330 |
commit | 8b692751aca0bde2d58bdba056c6b94661c3011b (patch) | |
tree | d1bc81cf4af2cd5462fc563525b7d9da8a620e87 /crawl-ref/source | |
parent | 230ef3e62244bdff6adcb585676b0469e80f8b10 (diff) | |
parent | b78098f4675f43661c4eadc0437d3c15462a63e2 (diff) | |
download | crawl-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')
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 Binary files differindex 081370600f..081370600f 100644 --- a/crawl-ref/source/rltiles/dngn/altars/dithmengos.png +++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos.png diff --git a/crawl-ref/source/rltiles/dngn/altars/dithmengos2.png b/crawl-ref/source/rltiles/dngn/altars/dithmenos2.png Binary files differindex 86f724e383..86f724e383 100644 --- a/crawl-ref/source/rltiles/dngn/altars/dithmengos2.png +++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos2.png diff --git a/crawl-ref/source/rltiles/dngn/altars/dithmengos3.png b/crawl-ref/source/rltiles/dngn/altars/dithmenos3.png Binary files differindex 7bd70aede5..7bd70aede5 100644 --- a/crawl-ref/source/rltiles/dngn/altars/dithmengos3.png +++ b/crawl-ref/source/rltiles/dngn/altars/dithmenos3.png diff --git a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_form.png b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_form.png Binary files differindex 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 diff --git a/crawl-ref/source/rltiles/gui/invocations/dithmengos_shadow_step.png b/crawl-ref/source/rltiles/gui/invocations/dithmenos_shadow_step.png Binary files differindex 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 diff --git a/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png b/crawl-ref/source/rltiles/item/armour/artefact/urand_gong.png Binary files differindex 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 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 Binary files differnew file mode 100644 index 0000000000..195f020dbd --- /dev/null +++ b/crawl-ref/source/rltiles/item/weapon/artefact/urand_arc_blade.png diff --git a/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png b/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png Binary files differnew file mode 100644 index 0000000000..851ed1d11c --- /dev/null +++ b/crawl-ref/source/rltiles/item/weapon/artefact/urand_spellbinder.png diff --git a/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png b/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png Binary files differnew file mode 100644 index 0000000000..4a5a3c25d6 --- /dev/null +++ b/crawl-ref/source/rltiles/player/hand1/artefact/arc_blade.png diff --git a/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png b/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png Binary files differnew file mode 100644 index 0000000000..8a93e805ff --- /dev/null +++ b/crawl-ref/source/rltiles/player/hand1/artefact/spellbinder.png diff --git a/crawl-ref/source/rltiles/player/hand2/shield_gong.png b/crawl-ref/source/rltiles/player/hand2/shield_gong.png Binary files differindex ae3cf61a1a..39f58324e2 100644 --- a/crawl-ref/source/rltiles/player/hand2/shield_gong.png +++ b/crawl-ref/source/rltiles/player/hand2/shield_gong.png 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."; |