From: <gi...@cr...> - 2015-06-25 21:50:21
|
via eafbe2f407cd5570bec7f4c781647161f3f372c8 (commit) via fea330ee931d4244afca60dcb29b61984100fab9 (commit) via afc859bc4a67d7978d0c4a5a23fa1be0e948755c (commit) via 34fd0a8ec593bf972e773195be2958c387c21f92 (commit) from 695b0fea962c7379fe6a3ab37cdd8c6b3ae2174b (commit) ----------------------------------------------------------------------- commit eafbe2f407cd5570bec7f4c781647161f3f372c8 Author: Chris Campbell <chr...@gm...> Date: Wed Jun 24 20:03:59 2015 +0100 Remove the Singularity monster spell Since as mentioned in the commit making it monster-only, it's not really an effect that should be kept around just for random pan lords. commit fea330ee931d4244afca60dcb29b61984100fab9 Author: Chris Campbell <chr...@gm...> Date: Tue Jun 23 23:34:50 2015 +0100 Remove Ephemeral Infusion It was a fairly complicated and not very noticeable effect. Blood saints also no longer damage themselves on casting destruction, so the limited synergy there no longer exists. Leaves blood saints with only one spell, but that one spell is actually 6 spells and so still leaves them with plenty of variety. The elixir card now just applies a direct heal to allies instead of the ephemeral infusion effect. commit afc859bc4a67d7978d0c4a5a23fa1be0e948755c Author: Chris Campbell <chr...@gm...> Date: Wed Jun 24 19:30:06 2015 +0100 Make corrosion apply the same reduction to armour and slaying -4 to both, instead of -5/-3. commit 34fd0a8ec593bf972e773195be2958c387c21f92 Author: Chris Campbell <chr...@gm...> Date: Wed Jun 24 19:42:58 2015 +0100 Make very heavy stat drain recover faster To make it a little easier to recover from weird cases of stat drain reaching a long way into the negatives. ----------------------------------------------------------------------- Summary of changes: crawl-ref/source/areas.cc | 12 -- crawl-ref/source/attack.cc | 2 +- crawl-ref/source/dat/database/monspell.txt | 4 - crawl-ref/source/dat/descript/cards.txt | 2 +- crawl-ref/source/dat/descript/monsters.txt | 5 - crawl-ref/source/dat/descript/spells.txt | 11 -- crawl-ref/source/decks.cc | 6 +- crawl-ref/source/enum.h | 7 +- crawl-ref/source/ghost.cc | 1 - crawl-ref/source/mgen_data.h | 3 +- crawl-ref/source/mon-act.cc | 18 --- crawl-ref/source/mon-cast.cc | 139 +------------------- crawl-ref/source/mon-data.h | 15 +-- crawl-ref/source/mon-death.cc | 6 - crawl-ref/source/mon-ench.cc | 41 +----- crawl-ref/source/mon-spell.h | 1 - crawl-ref/source/monster.cc | 5 +- crawl-ref/source/monster.h | 1 - crawl-ref/source/output.cc | 4 +- crawl-ref/source/player.cc | 6 +- .../nonliving => UNUSED/monsters}/singularity1.png | Bin .../nonliving => UNUSED/monsters}/singularity2.png | Bin .../nonliving => UNUSED/monsters}/singularity3.png | Bin .../nonliving => UNUSED/monsters}/singularity4.png | Bin .../spells}/singularity.png | Bin crawl-ref/source/rltiles/dc-mon.txt | 4 - crawl-ref/source/rltiles/dc-spells.txt | 2 - crawl-ref/source/spl-cast.cc | 4 +- crawl-ref/source/spl-data.h | 4 + crawl-ref/source/spl-goditem.cc | 1 - crawl-ref/source/spl-transloc.cc | 143 +-------------------- crawl-ref/source/spl-transloc.h | 5 +- crawl-ref/source/spl-util.cc | 1 - crawl-ref/source/status.cc | 2 +- crawl-ref/source/tilepick.cc | 6 +- crawl-ref/source/timed_effects.cc | 2 +- 36 files changed, 45 insertions(+), 418 deletions(-) rename crawl-ref/source/rltiles/{mon/nonliving => UNUSED/monsters}/singularity1.png (100%) rename crawl-ref/source/rltiles/{mon/nonliving => UNUSED/monsters}/singularity2.png (100%) rename crawl-ref/source/rltiles/{mon/nonliving => UNUSED/monsters}/singularity3.png (100%) rename crawl-ref/source/rltiles/{mon/nonliving => UNUSED/monsters}/singularity4.png (100%) rename crawl-ref/source/rltiles/{gui/spells/translocation => UNUSED/spells}/singularity.png (100%) diff --git a/crawl-ref/source/areas.cc b/crawl-ref/source/areas.cc index 962a1d6..e2c8d57 100644 --- a/crawl-ref/source/areas.cc +++ b/crawl-ref/source/areas.cc @@ -151,18 +151,6 @@ static void _actor_areas(actor *a) no_areas = false; } #endif - - // XXX: make this a proper function - if (a->type == MONS_SINGULARITY) - { - r = isqrt(a->get_experience_level()); - - _agrid_centres.push_back(area_centre(AREA_DISJUNCTION, a->pos(), r)); - - for (radius_iterator ri(a->pos(), r, C_SQUARE, LOS_NO_TRANS); ri; ++ri) - _set_agrid_flag(*ri, APROP_DISJUNCTION); - no_areas = false; - } } /** diff --git a/crawl-ref/source/attack.cc b/crawl-ref/source/attack.cc index 3868558..7d89118 100644 --- a/crawl-ref/source/attack.cc +++ b/crawl-ref/source/attack.cc @@ -1301,7 +1301,7 @@ int attack::player_apply_slaying_bonuses(int damage, bool aux) { damage_plus = get_weapon_plus(); if (you.duration[DUR_CORROSION]) - damage_plus -= 3 * you.props["corrosion_amount"].get_int(); + damage_plus -= 4 * you.props["corrosion_amount"].get_int(); } damage_plus += slaying_bonus(!weapon && wpn_skill == SK_THROWING || (weapon && is_range_weapon(*weapon) diff --git a/crawl-ref/source/dat/database/monspell.txt b/crawl-ref/source/dat/database/monspell.txt index 349fc23..8e316f4 100644 --- a/crawl-ref/source/dat/database/monspell.txt +++ b/crawl-ref/source/dat/database/monspell.txt @@ -173,10 +173,6 @@ Legendary Destruction cast @Major Destruction cast@ %%%% -Ephemeral Infusion cast - -@The_monster@ gestures around itself. -%%%% Phantom Mirror cast @The_monster@ weaves an illusion. diff --git a/crawl-ref/source/dat/descript/cards.txt b/crawl-ref/source/dat/descript/cards.txt index fd3c206..15d5d25 100644 --- a/crawl-ref/source/dat/descript/cards.txt +++ b/crawl-ref/source/dat/descript/cards.txt @@ -75,7 +75,7 @@ the Elixir card The card depicts a smug smile formed out of nine chalices. This card rapidly restores the user's health or magic, or both at high power -levels. It will also grant their allies temporary vitality. +levels. It will also heal their allies. %%%% the Cloud card diff --git a/crawl-ref/source/dat/descript/monsters.txt b/crawl-ref/source/dat/descript/monsters.txt index ad9acc1..68167ed 100644 --- a/crawl-ref/source/dat/descript/monsters.txt +++ b/crawl-ref/source/dat/descript/monsters.txt @@ -2176,11 +2176,6 @@ simulacrum An ice replica of a monster, animated by the powers of necromancy. %%%% -singularity - -A gravitational singularity, which pulls in enemies of its creator and -violently warps them in the process. -%%%% siren A beguiling merfolk whose voice can mesmerize listeners. diff --git a/crawl-ref/source/dat/descript/spells.txt b/crawl-ref/source/dat/descript/spells.txt index 473a9ef..5e82c7d 100644 --- a/crawl-ref/source/dat/descript/spells.txt +++ b/crawl-ref/source/dat/descript/spells.txt @@ -503,11 +503,6 @@ Ensorcelled Hibernation spell Lowers its target's metabolic rate, inducing hibernation. After awakening, the target will be unable to be put to sleep again for some time. %%%% -Ephemeral Infusion spell - -Temporarily heals the caster and nearby allies. Its expiry may leave the -recipients on the brink of death but never outright kills them. -%%%% Excruciating Wounds spell Temporarily infuses the weapon held by the caster with the essence of pain @@ -1132,12 +1127,6 @@ Creates an icy replica from the corpse of the original being. This magic is unstable, so eventually the replica will sublimate into a freezing cloud. Simulacra cannot leave the level they were created on. %%%% -Singularity spell - -Compresses space into a gravitational singularity, pulling nearby enemies of -the caster towards it and warping them violently in the process. The caster -can only maintain one singularity at a time. -%%%% Siren Song spell Sings a haunting song, making nearby victims unwilling to move away from the diff --git a/crawl-ref/source/decks.cc b/crawl-ref/source/decks.cc index 8bb8fa9..97e4bf3 100644 --- a/crawl-ref/source/decks.cc +++ b/crawl-ref/source/decks.cc @@ -1852,7 +1852,6 @@ static void _damaging_card(card_type card, int power, deck_rarity_type rarity, static void _elixir_card(int power, deck_rarity_type rarity) { int power_level = _get_power_level(power, rarity); - const int dur = random2avg(10 * (power_level + 1), 2) * BASELINE_DELAY; you.duration[DUR_ELIXIR_HEALTH] = 0; you.duration[DUR_ELIXIR_MAGIC] = 0; @@ -1883,8 +1882,9 @@ static void _elixir_card(int power, deck_rarity_type rarity) if (mon && mon->wont_attack()) { - mon->add_ench(mon_enchant(ENCH_EPHEMERAL_INFUSION, 50 * (power_level + 1), - &you, dur)); + const int hp = mon->max_hit_points / max(4 - power_level, 1); + if (mon->heal(hp + random2avg(hp, 2))) + simple_monster_message(mon, " is healed."); } } } diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index ce3db68..8ca4df1 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1945,7 +1945,9 @@ enum enchant_type ENCH_ICEMAIL, ENCH_AGILE, ENCH_FROZEN, +#if TAG_MAJOR_VERSION == 34 ENCH_EPHEMERAL_INFUSION, +#endif ENCH_BLACK_MARK, ENCH_GRAND_AVATAR, ENCH_SAP_MAGIC, @@ -3167,7 +3169,6 @@ enum monster_type // menv[].type MONS_ORB_OF_DESTRUCTION, // a projectile, not a real mon #if TAG_MAJOR_VERSION > 34 MONS_FULMINANT_PRISM, - MONS_SINGULARITY, MONS_BATTLESPHERE, #endif MONS_PILLAR_OF_SALT, @@ -4362,7 +4363,9 @@ enum spell_type SPELL_EXPLOSIVE_BOLT, SPELL_FLASH_FREEZE, SPELL_LEGENDARY_DESTRUCTION, +#if TAG_MAJOR_VERSION == 34 SPELL_EPHEMERAL_INFUSION, +#endif SPELL_FORCEFUL_INVITATION, SPELL_PLANEREND, SPELL_CHAIN_OF_CHAOS, @@ -4425,7 +4428,9 @@ enum spell_type SPELL_CLEANSING_FLAME, SPELL_GOBLIN_TOSS, SPELL_CIGOTUVIS_EMBRACE, +#if TAG_MAJOR_VERSION == 34 SPELL_SINGULARITY, +#endif SPELL_GRAVITAS, SPELL_CHANT_FIRE_STORM, SPELL_CHANT_WORD_OF_ENTROPY, diff --git a/crawl-ref/source/ghost.cc b/crawl-ref/source/ghost.cc index e714b64..2a4dd8d 100644 --- a/crawl-ref/source/ghost.cc +++ b/crawl-ref/source/ghost.cc @@ -75,7 +75,6 @@ static spell_type search_order_conj[] = static spell_type search_order_selfench[] = { SPELL_SUMMON_DRAGON, - SPELL_SINGULARITY, SPELL_SUMMON_HORRIBLE_THINGS, SPELL_SUMMON_GREATER_DEMON, SPELL_HAUNT, diff --git a/crawl-ref/source/mgen_data.h b/crawl-ref/source/mgen_data.h index 9fa14ed..ca1d7c5 100644 --- a/crawl-ref/source/mgen_data.h +++ b/crawl-ref/source/mgen_data.h @@ -149,8 +149,7 @@ struct mgen_data || summon_type == SPELL_DEATH_CHANNEL || summon_type == SPELL_SIMULACRUM || summon_type == SPELL_AWAKEN_VINES - || summon_type == SPELL_FULMINANT_PRISM - || summon_type == SPELL_SINGULARITY); + || summon_type == SPELL_FULMINANT_PRISM); } bool permit_bands() const diff --git a/crawl-ref/source/mon-act.cc b/crawl-ref/source/mon-act.cc index c5757bb..057f6df 100644 --- a/crawl-ref/source/mon-act.cc +++ b/crawl-ref/source/mon-act.cc @@ -2072,24 +2072,6 @@ void handle_monster_move(monster* mons) } #endif - if (mons->type == MONS_SINGULARITY) - { - const actor * const summoner = actor_by_mid(mons->summoner); - if (!summoner || !summoner->alive()) - { - mons->suicide(); - return; - } - if (--mons->countdown <= 0) - mons->suicide(); - else - { - singularity_pull(mons); - mons->speed_increment -= 10; - } - return; - } - if (mons->is_projectile()) { if (iood_act(*mons)) diff --git a/crawl-ref/source/mon-cast.cc b/crawl-ref/source/mon-cast.cc index 0a5fe3d..369e210 100644 --- a/crawl-ref/source/mon-cast.cc +++ b/crawl-ref/source/mon-cast.cc @@ -85,7 +85,6 @@ static int _mons_control_undead(monster* mons, bool actual = true); static coord_def _mons_fragment_target(monster *mons); static coord_def _mons_conjure_flame_pos(monster* mon, actor* foe); static coord_def _mons_prism_pos(monster* mon, actor* foe); -static coord_def _mons_singularity_pos(const monster* mon); static bool _mons_consider_tentacle_throwing(const monster &mons); static bool _tentacle_toss(const monster &thrower, actor &victim, int pow); static bool _mons_consider_goblin_tossing(const monster &mons); @@ -385,7 +384,6 @@ static int _mons_power_hd_factor(spell_type spell, bool random) case SPELL_IGNITE_POISON: case SPELL_IOOD: case SPELL_CONJURE_FLAME: - case SPELL_SINGULARITY: return 6; case SPELL_OZOCUBUS_REFRIGERATION: @@ -1108,7 +1106,6 @@ bolt mons_spell_beam(monster* mons, spell_type spell_cast, int power, case SPELL_CONJURE_FLAME: // ditto case SPELL_FULMINANT_PRISM: // ditto case SPELL_SCATTERSHOT: // ditto - case SPELL_SINGULARITY: // ditto beam.flavour = BEAM_DEVASTATION; beam.pierce = true; // Doesn't take distance into account, but this is just a tracer so @@ -1522,7 +1519,9 @@ bool setup_mons_cast(monster* mons, bolt &pbolt, spell_type spell_cast, case SPELL_TORNADO: case SPELL_DISCHARGE: case SPELL_IGNITE_POISON: +#if TAG_MAJOR_VERSION == 34 case SPELL_EPHEMERAL_INFUSION: +#endif case SPELL_FORCEFUL_INVITATION: case SPELL_PLANEREND: case SPELL_CHAIN_OF_CHAOS: @@ -1628,11 +1627,6 @@ bool setup_mons_cast(monster* mons, bolt &pbolt, spell_type spell_cast, pbolt.target = _mons_prism_pos(mons, mons->get_foe()); pbolt.aimed_at_spot = true; // ditto } - else if (spell_cast == SPELL_SINGULARITY) - { - pbolt.target = _mons_singularity_pos(mons); - pbolt.aimed_at_spot = true; // ditto - } } return true; @@ -2438,7 +2432,6 @@ static bool _ms_low_hitpoint_cast(monster* mon, mon_spell_slot slot) case SPELL_BERSERKER_RAGE: case SPELL_MIGHT: case SPELL_WIND_BLAST: - case SPELL_EPHEMERAL_INFUSION: return true; case SPELL_VAMPIRIC_DRAINING: return !targ_sanct && targ_adj && !targ_friendly && !targ_undead; @@ -3036,52 +3029,6 @@ static bool _dummy_vulnerable(actor* victim) return true; } -static bool _should_ephemeral_infusion(monster* agent) -{ - for (actor_near_iterator ai(agent, LOS_NO_TRANS); ai; ++ai) - { - if (agent == *ai || !ai->visible_to(agent) - || ai->is_player() || !mons_aligned(*ai, agent)) - { - continue; - } - monster* mon = ai->as_monster(); - if (!mon->has_ench(ENCH_EPHEMERAL_INFUSION) - && mon->hit_points * 3 <= mon->max_hit_points * 2 - && !mons_is_firewood(mon)) - { - return true; - } - } - return agent->hit_points * 3 <= agent->max_hit_points; -} - -static void _cast_ephemeral_infusion(monster* agent) -{ - for (actor_near_iterator ai(agent, LOS_NO_TRANS); ai; ++ai) - { - if (!ai->visible_to(agent) - || ai->is_player() - || !mons_aligned(*ai, agent)) - { - continue; - } - monster* mon = ai->as_monster(); - if (!mon->has_ench(ENCH_EPHEMERAL_INFUSION) - && mon->hit_points < mon->max_hit_points - && !mons_is_firewood(mon)) - { - const int dur = - random2avg(agent->spell_hd(SPELL_EPHEMERAL_INFUSION), 2) - * BASELINE_DELAY; - mon->add_ench( - mon_enchant(ENCH_EPHEMERAL_INFUSION, - 4 * agent->spell_hd(SPELL_EPHEMERAL_INFUSION), - agent, dur)); - } - } -} - static void _cast_black_mark(monster* agent) { for (actor_near_iterator ai(agent, LOS_NO_TRANS); ai; ++ai) @@ -3346,54 +3293,6 @@ bool scattershot_tracer(monster *caster, int pow, coord_def aim) return enemy > friendly; } -/** - * Pick a target for conjuring a singularity. - * Since a singularity can't harm its caster, this should always - * give a valid target if it can see any enemies. - * - * @param[in] mon The monster casting this. - * @returns The best position for creating a singularity. - */ -static coord_def _mons_singularity_pos(const monster* mon) -{ - ASSERT(mon); // XXX: change to const monster &mon - const int pow = _mons_spellpower(SPELL_SINGULARITY, *mon); - const int rad = singularity_range(pow); - int max_strength = 0, max_count = 0; - coord_def retval; - - for (distance_iterator di(mon->pos(), true, true, LOS_RADIUS); di; ++di) - { - int strength = 0; - - if (cell_is_solid(*di) || actor_at(*di)) - continue; - for (radius_iterator ri(*di, rad, C_SQUARE, LOS_NO_TRANS); ri; ++ri) - { - actor* victim = actor_at(*ri); - if (!victim - || !mon->can_see(*victim) - || mons_aligned(mon, victim)) - { - continue; - } - strength += ((pow / 10) + 1) / (4 + grid_distance(*di, *ri)); - } - if (strength == 0) - continue; - if (strength > max_strength - || (strength == max_strength && one_chance_in(++max_count))) - { - if (strength > max_strength) - max_count = 1; - max_strength = strength; - retval = *di; - } - } - - return retval; -} - /** Chooses a matching spell from this spell list, based on frequency. * * @param[in] spells the monster spell list to search @@ -3706,8 +3605,7 @@ bool handle_mon_spell(monster* mons, bolt &beem) if ((spell_cast == SPELL_LRD || spell_cast == SPELL_CONJURE_FLAME - || spell_cast == SPELL_FULMINANT_PRISM - || spell_cast == SPELL_SINGULARITY) + || spell_cast == SPELL_FULMINANT_PRISM) && !in_bounds(beem.target)) { spell_cast = SPELL_NO_SPELL; @@ -5878,10 +5776,6 @@ void mons_cast(monster* mons, bolt pbolt, spell_type spell_cast, return; } - case SPELL_EPHEMERAL_INFUSION: - _cast_ephemeral_infusion(mons); - return; - case SPELL_SUMMON_HOLIES: // Holy monsters. sumcount2 = 1 + random2(2) + random2(mons->spell_hd(spell_cast) / 4 + 1); @@ -6701,15 +6595,6 @@ void mons_cast(monster* mons, bolt pbolt, spell_type spell_cast, CLEANSING_FLAME_SPELL, mons->pos(), mons); return; - case SPELL_SINGULARITY: - { - if (in_bounds(pbolt.target)) - cast_singularity(mons, splpow, pbolt.target, false); - else if (you.can_see(*mons)) - canned_msg(MSG_NOTHING_HAPPENS); - - return; - } } // If a monster just came into view and immediately cast a spell, @@ -8178,9 +8063,6 @@ static bool _ms_waste_of_time(monster* mon, mon_spell_slot slot) case SPELL_SHATTER: return !mons_shatter(mon, false); - case SPELL_EPHEMERAL_INFUSION: - return !_should_ephemeral_infusion(mon); - case SPELL_SYMBOL_OF_TORMENT: return !_trace_los(mon, _torment_vulnerable) || you.visible_to(mon) @@ -8304,25 +8186,14 @@ static bool _ms_waste_of_time(monster* mon, mon_spell_slot slot) case SPELL_CHANT_WORD_OF_ENTROPY: return mon->has_ench(ENCH_BREATH_WEAPON) || !foe; - case SPELL_SINGULARITY: - { - if (!foe) - return true; - - // If the foe is in range of an existing singularity of our monster, - // don't cast. - for (monster_near_iterator mi(foe->pos(), LOS_NO_TRANS); mi; ++mi) - if (mi->type == MONS_SINGULARITY && mi->summoner == mon->mid) - return grid_distance(foe->pos(), mi->pos()) * grid_distance(foe->pos(), mi->pos()) <= mi->get_hit_dice(); - return false; - } - #if TAG_MAJOR_VERSION == 34 case SPELL_SUMMON_TWISTER: case SPELL_SHAFT_SELF: case SPELL_MISLEAD: case SPELL_SUMMON_SCORPIONS: case SPELL_SUMMON_ELEMENTAL: + case SPELL_EPHEMERAL_INFUSION: + case SPELL_SINGULARITY: #endif case SPELL_NO_SPELL: return true; diff --git a/crawl-ref/source/mon-data.h b/crawl-ref/source/mon-data.h index a66917e..484e58c 100644 --- a/crawl-ref/source/mon-data.h +++ b/crawl-ref/source/mon-data.h @@ -243,6 +243,7 @@ static monsterentry mondata[] = AXED_MON(MONS_BORING_BEETLE) AXED_MON(MONS_CHIMERA) AXED_MON(MONS_RAVEN) + AXED_MON(MONS_SINGULARITY) #endif // Used for genus monsters (which are used for grouping monsters by how they @@ -5682,20 +5683,6 @@ DUMMY(MONS_GOLEM, '8', LIGHTGREY, "golem") MONUSE_NOTHING, SIZE_LITTLE, MON_SHAPE_ORB }, -{ // not an actual monster, used by a spell - MONS_SINGULARITY, '*', ETC_DISJUNCTION, "singularity", - M_NO_POLY_TO | M_STATIONARY | M_CONJURED | M_NO_EXP_GAIN | M_NO_POLY_TO - | M_PROJECTILE | M_INSUBSTANTIAL | M_FLIES, - mrd(MR_RES_FIRE | MR_RES_COLD | MR_RES_ELEC, 3), - 0, MONS_SINGULARITY, MONS_SINGULARITY, - MH_NONLIVING, MAG_IMMUNE, - { AT_NO_ATK, AT_NO_ATK, AT_NO_ATK, AT_NO_ATK }, - { 5, 0, 0, 10000 }, // Invincible in monster::hurt - 3, 0, MST_NO_SPELLS, CE_NOCORPSE, S_SILENT, - I_BRAINLESS, HT_LAND, 10, DEFAULT_ENERGY, - MONUSE_NOTHING, SIZE_LITTLE, MON_SHAPE_ORB -}, - { MONS_WRETCHED_STAR, '*', MAGENTA, "wretched star", M_SEE_INVIS | M_INSUBSTANTIAL | M_GLOWS | M_FLIES, diff --git a/crawl-ref/source/mon-death.cc b/crawl-ref/source/mon-death.cc index 25e1431..a7cc6bf 100644 --- a/crawl-ref/source/mon-death.cc +++ b/crawl-ref/source/mon-death.cc @@ -1905,12 +1905,6 @@ int monster_die(monster* mons, killer_type killer, silent = true; } } - else if (mons->type == MONS_SINGULARITY && mons->countdown <= 0) - { - simple_monster_message(mons, " implodes!"); - invalidate_agrid(); - silent = true; - } else if (mons->type == MONS_FIRE_VORTEX || mons->type == MONS_SPATIAL_VORTEX || mons->type == MONS_TWISTER) diff --git a/crawl-ref/source/mon-ench.cc b/crawl-ref/source/mon-ench.cc index 243fa45..6a34f1c 100644 --- a/crawl-ref/source/mon-ench.cc +++ b/crawl-ref/source/mon-ench.cc @@ -332,21 +332,6 @@ void monster::add_enchantment_effect(const mon_enchant &ench, bool quiet) calc_speed(); break; - case ENCH_EPHEMERAL_INFUSION: - { - if (!props.exists("eph_amount")) - { - int amount = min((ench.degree / 2) + random2avg(ench.degree, 2), - max_hit_points - hit_points); - if (amount > 0 && heal(amount) && !quiet) - simple_monster_message(this, " seems to gain new vigour!"); - else - amount = 0; - props["eph_amount"].get_byte() = amount; - } - break; - } - case ENCH_INVIS: if (testbits(flags, MF_WAS_IN_VIEW)) { @@ -1001,22 +986,6 @@ void monster::remove_enchantment_effect(const mon_enchant &me, bool quiet) calc_speed(); break; - case ENCH_EPHEMERAL_INFUSION: - { - int dam = 0; - if (props.exists("eph_amount")) - { - dam = props["eph_amount"].get_byte(); - props.erase("eph_amount"); - } - dam = min(dam, hit_points - 1); - if (dam > 0) - hurt(nullptr, dam); - if (!quiet) - simple_monster_message(this, " looks less vigorous."); - break; - } - case ENCH_BLACK_MARK: if (!quiet) { @@ -1541,7 +1510,6 @@ void monster::apply_enchantment(const mon_enchant &me) case ENCH_DIMENSION_ANCHOR: case ENCH_AGILE: case ENCH_FROZEN: - case ENCH_EPHEMERAL_INFUSION: case ENCH_SAP_MAGIC: case ENCH_CORROSION: case ENCH_GOLD_LUST: @@ -2295,7 +2263,11 @@ static const char *enchant_names[] = "building_charge", #endif "poison_vuln", "icemail", "agile", - "frozen", "ephemeral_infusion", "black_mark", "grand_avatar", + "frozen", +#if TAG_MAJOR_VERSION == 34 + "ephemeral_infusion", +#endif + "black_mark", "grand_avatar", "sap magic", "shroud", "phantom_mirror", "bribed", "permabribed", "corrosion", "gold_lust", "drained", "repel missiles", "deflect missiles", @@ -2565,9 +2537,6 @@ int mon_enchant::calc_duration(const monster* mons, case ENCH_TORNADO_COOLDOWN: cturn = random_range(25, 35) * 10 / _mod_speed(10, mons->speed); break; - case ENCH_EPHEMERAL_INFUSION: - cturn = 150 / _mod_speed(25, mons->speed); - break; case ENCH_FROZEN: cturn = 3 * BASELINE_DELAY; break; diff --git a/crawl-ref/source/mon-spell.h b/crawl-ref/source/mon-spell.h index a514b0d..138af59 100644 --- a/crawl-ref/source/mon-spell.h +++ b/crawl-ref/source/mon-spell.h @@ -1654,7 +1654,6 @@ static const mon_spellbook mspell_list[] = { MST_DEMONSPAWN_BLOOD_SAINT, { { SPELL_LEGENDARY_DESTRUCTION, 32, MON_SPELL_PRIEST }, - { SPELL_EPHEMERAL_INFUSION, 32, MON_SPELL_PRIEST }, } }, diff --git a/crawl-ref/source/monster.cc b/crawl-ref/source/monster.cc index c85b269..ace9762 100644 --- a/crawl-ref/source/monster.cc +++ b/crawl-ref/source/monster.cc @@ -4537,8 +4537,9 @@ int monster::hurt(const actor *agent, int amount, beam_type flavour, kill_method_type /*kill_type*/, string /*source*/, string /*aux*/, bool cleanup_dead, bool attacker_effects) { - if (mons_is_projectile(type) || mid == MID_ANON_FRIEND - || type == MONS_SINGULARITY || type == MONS_PLAYER_SHADOW) + if (mons_is_projectile(type) + || mid == MID_ANON_FRIEND + || type == MONS_PLAYER_SHADOW) { return 0; } diff --git a/crawl-ref/source/monster.h b/crawl-ref/source/monster.h index 6966a2e..44d9945 100644 --- a/crawl-ref/source/monster.h +++ b/crawl-ref/source/monster.h @@ -73,7 +73,6 @@ public: mid_t tentacle_connect;///< mid of monster this tentacle is // connected to: for segments, this is the // tentacle; for tentacles, the head. - int countdown; ///< Actions till singularity dies. }; int colour; mid_t summoner; diff --git a/crawl-ref/source/output.cc b/crawl-ref/source/output.cc index 308fe34..03142fd 100644 --- a/crawl-ref/source/output.cc +++ b/crawl-ref/source/output.cc @@ -876,9 +876,9 @@ static void _print_stats_wp(int y) if (you.duration[DUR_CORROSION]) { if (wpn.base_type == OBJ_RODS) - wpn.special -= 3 * you.props["corrosion_amount"].get_int(); + wpn.special -= 4 * you.props["corrosion_amount"].get_int(); else - wpn.plus -= 3 * you.props["corrosion_amount"].get_int(); + wpn.plus -= 4 * you.props["corrosion_amount"].get_int(); } text = wpn.name(DESC_PLAIN, true, false, true); } diff --git a/crawl-ref/source/player.cc b/crawl-ref/source/player.cc index 06cec3b..bf2bab4 100644 --- a/crawl-ref/source/player.cc +++ b/crawl-ref/source/player.cc @@ -2527,6 +2527,10 @@ static void _recover_stat() recovered_stats[stat]++; + // Very heavily drained stats recover faster. + if (you.stat(stat, false) < 0) + recovered_stats[stat] += random2(-you.stat(stat, false) / 2); + bool still_drained = false; for (int i = 0; i < NUM_STATS; ++i) if (you.stat_loss[i] - recovered_stats[i] > 0) @@ -6014,7 +6018,7 @@ int player::armour_class(bool /*calc_unid*/) const AC += 300; if (duration[DUR_CORROSION]) - AC -= 500 * you.props["corrosion_amount"].get_int(); + AC -= 400 * you.props["corrosion_amount"].get_int(); AC += _bone_armour_bonus(); diff --git a/crawl-ref/source/rltiles/mon/nonliving/singularity1.png b/crawl-ref/source/rltiles/UNUSED/monsters/singularity1.png similarity index 100% rename from crawl-ref/source/rltiles/mon/nonliving/singularity1.png rename to crawl-ref/source/rltiles/UNUSED/monsters/singularity1.png diff --git a/crawl-ref/source/rltiles/mon/nonliving/singularity2.png b/crawl-ref/source/rltiles/UNUSED/monsters/singularity2.png similarity index 100% rename from crawl-ref/source/rltiles/mon/nonliving/singularity2.png rename to crawl-ref/source/rltiles/UNUSED/monsters/singularity2.png diff --git a/crawl-ref/source/rltiles/mon/nonliving/singularity3.png b/crawl-ref/source/rltiles/UNUSED/monsters/singularity3.png similarity index 100% rename from crawl-ref/source/rltiles/mon/nonliving/singularity3.png rename to crawl-ref/source/rltiles/UNUSED/monsters/singularity3.png diff --git a/crawl-ref/source/rltiles/mon/nonliving/singularity4.png b/crawl-ref/source/rltiles/UNUSED/monsters/singularity4.png similarity index 100% rename from crawl-ref/source/rltiles/mon/nonliving/singularity4.png rename to crawl-ref/source/rltiles/UNUSED/monsters/singularity4.png diff --git a/crawl-ref/source/rltiles/gui/spells/translocation/singularity.png b/crawl-ref/source/rltiles/UNUSED/spells/singularity.png similarity index 100% rename from crawl-ref/source/rltiles/gui/spells/translocation/singularity.png rename to crawl-ref/source/rltiles/UNUSED/spells/singularity.png diff --git a/crawl-ref/source/rltiles/dc-mon.txt b/crawl-ref/source/rltiles/dc-mon.txt index 09deaa5..7404ad8 100644 --- a/crawl-ref/source/rltiles/dc-mon.txt +++ b/crawl-ref/source/rltiles/dc-mon.txt @@ -263,10 +263,6 @@ fulminant_prism1 MONS_FULMINANT_PRISM fulminant_prism2 fulminant_prism3 fulminant_prism4 -singularity1 MONS_SINGULARITY /*'*'*/ -singularity2 -singularity3 -singularity4 %rim 1 ball_lightning MONS_BALL_LIGHTNING /*'*'*/ %sdir mon/undead diff --git a/crawl-ref/source/rltiles/dc-spells.txt b/crawl-ref/source/rltiles/dc-spells.txt index 3ee3932..1816940 100644 --- a/crawl-ref/source/rltiles/dc-spells.txt +++ b/crawl-ref/source/rltiles/dc-spells.txt @@ -150,7 +150,6 @@ portal_projectile PORTAL_PROJECTILE teleport_other TELEPORT_OTHER warp_weapon WARP_WEAPON shroud_of_golubria SHROUD_OF_GOLUBRIA -singularity SINGULARITY gravitas GRAVITAS %sdir gui/spells/transmutation @@ -219,7 +218,6 @@ earth_elementals EARTH_ELEMENTALS %sdir misc error ENERGY_BOLT error ENSNARE -error EPHEMERAL_INFUSION %sdir gui/spells/monster fake_mara_summon FAKE_MARA_SUMMON fake_rakshasa_summon FAKE_RAKSHASA_SUMMON diff --git a/crawl-ref/source/spl-cast.cc b/crawl-ref/source/spl-cast.cc index 6c26341..d43e9c1 100644 --- a/crawl-ref/source/spl-cast.cc +++ b/crawl-ref/source/spl-cast.cc @@ -1074,8 +1074,8 @@ static targetter* _spell_targetter(spell_type spell, int pow, int range) case SPELL_SCATTERSHOT: return new targetter_shotgun(&you, shotgun_beam_count(pow), range); case SPELL_GRAVITAS: - return new targetter_smite(&you, range, singularity_range(pow, 2), - singularity_range(pow)); + return new targetter_smite(&you, range, gravitas_range(pow, 2), + gravitas_range(pow)); case SPELL_MAGIC_DART: case SPELL_FORCE_LANCE: case SPELL_SHOCK: diff --git a/crawl-ref/source/spl-data.h b/crawl-ref/source/spl-data.h index 812e14f..618363a 100644 --- a/crawl-ref/source/spl-data.h +++ b/crawl-ref/source/spl-data.h @@ -1655,6 +1655,7 @@ static const struct spell_desc spelldata[] = nullptr, }, +#if TAG_MAJOR_VERSION == 34 { SPELL_SINGULARITY, "Singularity", SPTYP_TRANSLOCATION, @@ -1665,6 +1666,7 @@ static const struct spell_desc spelldata[] = 20, 0, nullptr, }, +#endif { SPELL_PARALYSE, "Paralyse", @@ -2980,6 +2982,7 @@ static const struct spell_desc spelldata[] = nullptr, }, +#if TAG_MAJOR_VERSION == 34 { SPELL_EPHEMERAL_INFUSION, "Ephemeral Infusion", SPTYP_CHARMS | SPTYP_NECROMANCY, @@ -2990,6 +2993,7 @@ static const struct spell_desc spelldata[] = 5, 0, nullptr, }, +#endif { SPELL_FORCEFUL_INVITATION, "Forceful Invitation", diff --git a/crawl-ref/source/spl-goditem.cc b/crawl-ref/source/spl-goditem.cc index 930ff3f..e2aadf0 100644 --- a/crawl-ref/source/spl-goditem.cc +++ b/crawl-ref/source/spl-goditem.cc @@ -414,7 +414,6 @@ void debuff_monster(monster* mon) ENCH_CONTROL_WINDS, ENCH_TOXIC_RADIANCE, ENCH_AGILE, - ENCH_EPHEMERAL_INFUSION, ENCH_BLACK_MARK, ENCH_SHROUD, ENCH_SAP_MAGIC, diff --git a/crawl-ref/source/spl-transloc.cc b/crawl-ref/source/spl-transloc.cc index a8016c5..85e4b03 100644 --- a/crawl-ref/source/spl-transloc.cc +++ b/crawl-ref/source/spl-transloc.cc @@ -944,91 +944,11 @@ spret_type cast_dispersal(int pow, bool fail) return SPRET_SUCCESS; } -int singularity_range(int pow, int strength) +int gravitas_range(int pow, int strength) { - // XXX: unify some of this functionality. - // A singularity is HD (pow / 10) + 1; its strength is - // (HD / (range^2)) for a given range, so for a given strength the - // range is sqrt(pow/10 + 1) / strength. - return max(0, min(LOS_RADIUS, (int)isqrt((pow/10 + 1) / strength))); } -spret_type cast_singularity(actor* agent, int pow, const coord_def& where, - bool fail) -{ - if (cell_is_solid(where)) - { - if (agent->is_player()) - mpr("You can't place that within a solid object!"); - return SPRET_ABORT; - } - - actor* victim = actor_at(where); - if (victim) - { - if (you.can_see(*victim)) - { - if (agent->is_player()) - mpr("You can't place the singularity on a creature."); - return SPRET_ABORT; - } - - fail_check(); - - if (agent->is_player()) - canned_msg(MSG_GHOSTLY_OUTLINE); - else if (you.can_see(*victim)) - { - mprf("%s %s for a moment.", - victim->name(DESC_THE).c_str(), - victim->conj_verb("distort").c_str()); - } - return SPRET_SUCCESS; - } - - fail_check(); - - for (monster_iterator mi; mi; ++mi) - if (mi->type == MONS_SINGULARITY && mi->summoner == agent->mid) - { - simple_monster_message(*mi, " implodes!"); - monster_die(*mi, KILL_RESET, NON_MONSTER); - } - - monster* singularity = create_monster( - mgen_data(MONS_SINGULARITY, - agent->is_player() - ? BEH_FRIENDLY - : SAME_ATTITUDE(agent->as_monster()), - agent, - // It's summoned, but it uses - // its own mechanic to time out. - 0, SPELL_SINGULARITY, - where, MHITNOT, MG_FORCE_PLACE, - GOD_NO_GOD, MONS_NO_MONSTER, - pow / 20, COLOUR_INHERIT, - PROX_ANYWHERE, - level_id::current(), - (pow / 10) + 1)); - - if (singularity) - { - if (you.can_see(*singularity)) - { - const bool friendly = singularity->wont_attack(); - mprf("Space collapses on itself with a %s crunch%s", - friendly ? "satisfying" : "horrifying", - friendly ? "." : "!"); - } - invalidate_agrid(true); - } - else - canned_msg(MSG_NOTHING_HAPPENS); - - return SPRET_SUCCESS; -} - #define GRAVITY "by gravitational forces" void attract_actor(const actor* agent, actor* victim, const coord_def pos, @@ -1063,11 +983,8 @@ void attract_actor(const actor* agent, actor* victim, const coord_def pos, } else if (actor* act_at_space = actor_at(newpos)) { - if (victim != act_at_space - && act_at_space->type != MONS_SINGULARITY) - { + if (victim != act_at_space) victim->collide(newpos, agent, pow); - } break; } else @@ -1075,62 +992,6 @@ void attract_actor(const actor* agent, actor* victim, const coord_def pos, } } -void singularity_pull(const monster *singularity) -{ - actor *agent = actor_by_mid(singularity->summoner); - - for (actor_near_iterator ai(singularity->pos(), LOS_NO_TRANS); ai; ++ai) - { - if (*ai == singularity - || agent && mons_aligned(*ai, agent)) - { - continue; - } - - if (is_sanctuary(ai->pos())) - continue; - - const int range = (singularity->pos() - ai->pos()).rdist(); - const int strength = - min(4, (singularity->get_hit_dice()) / (range*range)); - if (strength <= 0) - continue; - - static const char *messages[] = - { - "%s pulls at %s.", - "%s crushes %s!", - "%s violently warps %s!", - "%s twists %s apart!", - }; - - if (ai->is_monster()) - behaviour_event(ai->as_monster(), ME_ANNOY, singularity); - - if (you.can_see(**ai)) - { - // Note that we don't care if you see the singularity if - // you can see its impact on the monster; "Something - // violently warps Sigmund!" is perfectly acceptable, - // after all. - mprf(messages[strength - 1], - singularity->name(DESC_THE).c_str(), - ai->name(DESC_THE).c_str()); - } - ai->hurt(singularity, roll_dice(strength, 12), BEAM_MMISSILE, - KILLED_BY_BEAM, "", GRAVITY); - - if (agent->is_player() && is_sanctuary(you.pos())) - remove_sanctuary(true); - - if (ai->alive() && !ai->is_stationary()) - { - attract_actor(singularity, *ai, singularity->pos(), - 10 * singularity->get_hit_dice(), strength); - } - } -} - bool fatal_attraction(actor *victim, actor *agent, int pow) { bool affected = false; diff --git a/crawl-ref/source/spl-transloc.h b/crawl-ref/source/spl-transloc.h index c1a3600..aef1eee 100644 --- a/crawl-ref/source/spl-transloc.h +++ b/crawl-ref/source/spl-transloc.h @@ -25,12 +25,9 @@ spret_type cast_golubrias_passage(const coord_def& where, bool fail); spret_type cast_dispersal(int pow, bool fail = false); -int singularity_range(int pow, int strength = 1); -spret_type cast_singularity(actor* agent, int pow, const coord_def& where, - bool fail); +int gravitas_range(int pow, int strength = 1); void attract_actor(const actor* agent, actor* victim, const coord_def pos, int pow, int strength); -void singularity_pull(const monster *singularity); bool fatal_attraction(actor *victim, actor *agent, int pow); spret_type cast_gravitas(int pow, const coord_def& where, bool fail); #endif diff --git a/crawl-ref/source/spl-util.cc b/crawl-ref/source/spl-util.cc index a08fdd5..e0ad6eb 100644 --- a/crawl-ref/source/spl-util.cc +++ b/crawl-ref/source/spl-util.cc @@ -1363,7 +1363,6 @@ bool spell_no_hostile_in_range(spell_type spell, bool rod) case SPELL_LRD: case SPELL_FULMINANT_PRISM: case SPELL_SUMMON_LIGHTNING_SPIRE: - case SPELL_SINGULARITY: // Shock and Lightning Bolt are no longer here, as the code below can // account for possible bounces. diff --git a/crawl-ref/source/status.cc b/crawl-ref/source/status.cc index d09534e..290a2e1 100644 --- a/crawl-ref/source/status.cc +++ b/crawl-ref/source/status.cc @@ -174,7 +174,7 @@ bool fill_status_info(int status, status_info* inf) case DUR_CORROSION: inf->light_text = make_stringf("Corr (%d)", - (-3 * you.props["corrosion_amount"].get_int())); + (-4 * you.props["corrosion_amount"].get_int())); break; case DUR_NO_POTIONS: diff --git a/crawl-ref/source/tilepick.cc b/crawl-ref/source/tilepick.cc index acf7a1e..8b36c10 100644 --- a/crawl-ref/source/tilepick.cc +++ b/crawl-ref/source/tilepick.cc @@ -1984,8 +1984,6 @@ tileidx_t tileidx_monster_base(int type, bool in_water, int colour, int number, return TILEP_MONS_BATTLESPHERE; case MONS_FULMINANT_PRISM: return _mon_random(TILEP_MONS_FULMINANT_PRISM); - case MONS_SINGULARITY: - return _mon_cycle(TILEP_MONS_SINGULARITY, tile_num_prop); // other symbols case MONS_SHADOW: @@ -4752,8 +4750,7 @@ tileidx_t tileidx_spell(spell_type spell) case SPELL_DISPERSAL: return TILEG_DISPERSAL; case SPELL_GOLUBRIAS_PASSAGE: return TILEG_PASSAGE_OF_GOLUBRIA; case SPELL_SHROUD_OF_GOLUBRIA: return TILEG_SHROUD_OF_GOLUBRIA; - case SPELL_SINGULARITY: return TILEG_SINGULARITY; - case SPELL_GRAVITAS: return TILEG_GRAVITAS; + case SPELL_GRAVITAS: return TILEG_GRAVITAS; // Summoning case SPELL_SUMMON_BUTTERFLIES: return TILEG_SUMMON_BUTTERFLIES; @@ -4891,7 +4888,6 @@ tileidx_t tileidx_spell(spell_type spell) case SPELL_EARTH_ELEMENTALS: return TILEG_EARTH_ELEMENTALS; case SPELL_ENERGY_BOLT: return TILEG_ENERGY_BOLT; case SPELL_ENSNARE: return TILEG_ENSNARE; - case SPELL_EPHEMERAL_INFUSION: return TILEG_EPHEMERAL_INFUSION; case SPELL_FAKE_MARA_SUMMON: return TILEG_FAKE_MARA_SUMMON; #if TAG_MAJOR_VERSION == 34 case SPELL_FAKE_RAKSHASA_SUMMON: return TILEG_FAKE_RAKSHASA_SUMMON; diff --git a/crawl-ref/source/timed_effects.cc b/crawl-ref/source/timed_effects.cc index c8fde6b..4621652 100644 --- a/crawl-ref/source/timed_effects.cc +++ b/crawl-ref/source/timed_effects.cc @@ -1328,7 +1328,7 @@ void monster::timeout_enchantments(int levels) case ENCH_WRETCHED: case ENCH_SCREAMED: case ENCH_BLIND: case ENCH_WORD_OF_RECALL: case ENCH_INJURY_BOND: case ENCH_FLAYED: case ENCH_BARBS: - case ENCH_AGILE: case ENCH_FROZEN: case ENCH_EPHEMERAL_INFUSION: + case ENCH_AGILE: case ENCH_FROZEN: case ENCH_BLACK_MARK: case ENCH_SAP_MAGIC: case ENCH_NEUTRAL_BRIBED: case ENCH_FRIENDLY_BRIBED: case ENCH_CORROSION: case ENCH_GOLD_LUST: case ENCH_RESISTANCE: case ENCH_HEXED: -- Dungeon Crawl Stone Soup |