diff options
-rw-r--r-- | crawl-ref/source/abl-show.cc | 24 | ||||
-rw-r--r-- | crawl-ref/source/acr.cc | 2 | ||||
-rw-r--r-- | crawl-ref/source/dat/descript/ability.txt | 9 | ||||
-rw-r--r-- | crawl-ref/source/enum.h | 1 | ||||
-rw-r--r-- | crawl-ref/source/religion.cc | 21 | ||||
-rw-r--r-- | crawl-ref/source/spells1.cc | 408 | ||||
-rw-r--r-- | crawl-ref/source/spells1.h | 4 |
7 files changed, 111 insertions, 358 deletions
diff --git a/crawl-ref/source/abl-show.cc b/crawl-ref/source/abl-show.cc index 85e255784c..0c04c4a3a5 100644 --- a/crawl-ref/source/abl-show.cc +++ b/crawl-ref/source/abl-show.cc @@ -82,13 +82,12 @@ enum ability_flag_type ABFLAG_NONE = 0x00000000, ABFLAG_BREATH = 0x00000001, // ability uses DUR_BREATH_WEAPON ABFLAG_DELAY = 0x00000002, // ability has its own delay (ie recite) - ABFLAG_PIETY = 0x00000004, // ability has its own piety (ie vitalise) - ABFLAG_PAIN = 0x00000008, // ability must hurt player (ie torment) - ABFLAG_EXHAUSTION = 0x00000010, // fails if you.exhausted - ABFLAG_INSTANT = 0x00000020, // doesn't take time to use - ABFLAG_PERMANENT_HP = 0x00000040, // costs permanent HPs - ABFLAG_PERMANENT_MP = 0x00000080, // costs permanent MPs - ABFLAG_CONF_OK = 0x00000100 // can use even if confused + ABFLAG_PAIN = 0x00000004, // ability must hurt player (ie torment) + ABFLAG_EXHAUSTION = 0x00000008, // fails if you.exhausted + ABFLAG_INSTANT = 0x00000010, // doesn't take time to use + ABFLAG_PERMANENT_HP = 0x00000020, // costs permanent HPs + ABFLAG_PERMANENT_MP = 0x00000040, // costs permanent MPs + ABFLAG_CONF_OK = 0x00000080 // can use even if confused }; static void _lugonu_bends_space(); @@ -236,7 +235,7 @@ static const ability_def Ability_List[] = // INVOCATIONS: // Zin { ABIL_ZIN_RECITE, "Recite", 3, 0, 120, 0, ABFLAG_DELAY }, - { ABIL_ZIN_VITALISATION, "Vitalisation", 0, 0, 100, 0, ABFLAG_PIETY | ABFLAG_CONF_OK }, + { ABIL_ZIN_VITALISATION, "Vitalisation", 0, 0, 100, 2, ABFLAG_CONF_OK }, { ABIL_ZIN_SANCTUARY, "Sanctuary", 7, 0, 150, 15, ABFLAG_NONE }, // The Shining One @@ -388,7 +387,7 @@ const std::string make_cost_description( ability_type ability ) ret << "Food"; // randomized and amount hidden from player } - if (abil.piety_cost || abil.flags & ABFLAG_PIETY) + if (abil.piety_cost) { if (!ret.str().empty()) ret << ", "; @@ -1456,12 +1455,9 @@ static bool _do_ability(const ability_def& abil) } case ABIL_ZIN_VITALISATION: - { - int result = cast_vitalisation(1 + (you.skills[SK_INVOCATIONS] / 4)); - if (result > 0) - exercise(SK_INVOCATIONS, 2 + random2(result)); + if (cast_vitalisation()) + exercise(SK_INVOCATIONS, (coinflip() ? 3 : 2)); break; - } case ABIL_ZIN_SANCTUARY: if (cast_sanctuary(you.skills[SK_INVOCATIONS] * 4)) diff --git a/crawl-ref/source/acr.cc b/crawl-ref/source/acr.cc index cb9454e8c8..f7baf679fa 100644 --- a/crawl-ref/source/acr.cc +++ b/crawl-ref/source/acr.cc @@ -3022,8 +3022,6 @@ static void _decrement_durations() } } - reduce_vitalisation_chain(1); - if (_decrement_a_duration(DUR_DIVINE_ROBUSTNESS)) remove_divine_robustness(); diff --git a/crawl-ref/source/dat/descript/ability.txt b/crawl-ref/source/dat/descript/ability.txt index a0969f8cf1..91a0b0a0fa 100644 --- a/crawl-ref/source/dat/descript/ability.txt +++ b/crawl-ref/source/dat/descript/ability.txt @@ -178,11 +178,10 @@ works best on humanoids, worse on demons and not at all on beasts. %%%% Vitalisation -If Zin is most pleased with you, you can Vitalise yourself. This will -restore Health, Magic, attribute points, or unrot you. In case none of -these is necessary, you gain temporary boosts to your attributes -instead. It is possible to Vitalise several times in succession for -greater effect. +If Zin is most pleased with you, you can Vitalise yourself. This will +remove a negative affliction from you, or restore one of your +attributes. In case neither of these is necessary, it will give you +temporary boosts to your attributes instead. %%%% Sanctuary diff --git a/crawl-ref/source/enum.h b/crawl-ref/source/enum.h index d9015d07f7..70e7ca616f 100644 --- a/crawl-ref/source/enum.h +++ b/crawl-ref/source/enum.h @@ -1144,7 +1144,6 @@ enum duration_type DUR_SLEEP, DUR_SAGE, DUR_TELEPATHY, - DUR_VITALISATION_CHAIN, DUR_PETRIFIED, NUM_DURATIONS diff --git a/crawl-ref/source/religion.cc b/crawl-ref/source/religion.cc index e80b7ec868..bbf6fc2972 100644 --- a/crawl-ref/source/religion.cc +++ b/crawl-ref/source/religion.cc @@ -768,19 +768,9 @@ static void _inc_penance(god_type god, int val) // Orcish bonuses don't apply under penance. if (god == GOD_BEOGH) you.redraw_armour_class = true; - // Neither does Zin's vitalisation chaining, divine robustness, - // or divine stamina. + // Neither does Zin's divine stamina. else if (god == GOD_ZIN) { - if (you.duration[DUR_VITALISATION_CHAIN]) - { - mpr("Your power of vitalisation disappears!"); - you.duration[DUR_VITALISATION_CHAIN] = 0; - } - - if (you.duration[DUR_DIVINE_ROBUSTNESS]) - remove_divine_robustness(); - if (you.duration[DUR_DIVINE_STAMINA]) remove_divine_stamina(); } @@ -4863,15 +4853,6 @@ void excommunication(god_type new_god) break; case GOD_ZIN: - if (you.duration[DUR_VITALISATION_CHAIN]) - { - mpr("Your power of vitalisation disappears!"); - you.duration[DUR_VITALISATION_CHAIN] = 0; - } - - if (you.duration[DUR_DIVINE_ROBUSTNESS]) - remove_divine_robustness(); - if (you.duration[DUR_DIVINE_STAMINA]) remove_divine_stamina(); diff --git a/crawl-ref/source/spells1.cc b/crawl-ref/source/spells1.cc index b286417d6d..f045fd14ee 100644 --- a/crawl-ref/source/spells1.cc +++ b/crawl-ref/source/spells1.cc @@ -807,35 +807,6 @@ int cast_healing(int pow, const coord_def& where) return (_healing_spell(pow + roll_dice(2, pow) - 2, where)); } -void vitalisation_chain(int amount) -{ - if (amount <= 0) - return; - - const int old_value = you.duration[DUR_VITALISATION_CHAIN]; - you.duration[DUR_VITALISATION_CHAIN] += amount; - - if (you.duration[DUR_VITALISATION_CHAIN] > 30) - you.duration[DUR_VITALISATION_CHAIN] = 30; - - if (old_value == 0) - mpr("Zin amplifies your power of vitalisation!", MSGCH_DURATION); -} - -void reduce_vitalisation_chain(int amount) -{ - if (you.duration[DUR_VITALISATION_CHAIN] == 0 || amount <= 0) - return; - - you.duration[DUR_VITALISATION_CHAIN] -= amount; - - if (you.duration[DUR_VITALISATION_CHAIN] <= 0) - { - you.duration[DUR_VITALISATION_CHAIN] = 0; - mpr("Your power of vitalisation returns to normal.", MSGCH_DURATION); - } -} - void remove_divine_robustness() { mpr("Your divine robustness fades.", MSGCH_DURATION); @@ -856,324 +827,135 @@ void remove_divine_stamina() you.attribute[ATTR_DIVINE_STAMINA] = 0; } -int cast_vitalisation(int pow) +bool cast_vitalisation() { - const int step_max_chain = 6; - const int type_max_chain = 4; - - static int step; - static int step_max; - static int type; - static int hp_amt; - static int mp_amt; - static bool need_chain; - - // If vitalisation chaining is turned off, start from the beginning. - if (you.duration[DUR_VITALISATION_CHAIN] == 0) - { - step = 0; - step_max = std::min(pow, step_max_chain); - type = random2(type_max_chain * 3 / 2); - hp_amt = 3; - mp_amt = 1; - need_chain = false; - } - bool success = false; + int type = 0; - switch (type) + // Remove negative afflictions. + if (you.disease || you.rotting || you.duration[DUR_CONF] + || you.duration[DUR_PARALYSIS] || you.duration[DUR_POISONING] + || you.duration[DUR_PETRIFIED]) { - case 0: - // Restore HP and MP. - if (you.hp < you.hp_max || you.magic_points < you.max_magic_points) - { - success = true; - inc_hp(hp_amt, false); - inc_mp(mp_amt, false); - hp_amt *= 2; - mp_amt *= 2; - need_chain = - (you.hp < you.hp_max - || you.magic_points < you.max_magic_points); - break; - } - - need_chain = false; - step = 0; - type = 1; - // Deliberate fall through, resetting the vitalisation chaining - // indicator and the step counter. - - case 1: - switch (step) + do { - case 0: - case 1: - case 2: - // Restore stats. - if (you.strength < you.max_strength - || you.intel < you.max_intel - || you.dex < you.max_dex) + switch (random2(6)) { - success = true; - restore_stat(STAT_STRENGTH, step + 1, true); - restore_stat(STAT_INTELLIGENCE, step + 1, true); - restore_stat(STAT_DEXTERITY, step + 1, true); - need_chain = - (you.strength < you.max_strength - || you.intel < you.max_intel - || you.dex < you.max_dex); - break; - } - - step = 3; - // Deliberate fall through. - - if (step >= step_max) + case 0: + if (you.disease) + { + success = true; + you.disease = 0; + } break; - - default: - break; - } - - if (success) - break; - - need_chain = false; - step = 0; - type = 2; - // Deliberate fall through, resetting the vitalisation chaining - // indicator and the step counter. - - case 2: - // Remove negative afflictions. - switch (step) - { - // Remove confusion and poisoning. - case 0: - if (you.duration[DUR_CONF] || you.duration[DUR_POISONING]) - { - success = true; - you.duration[DUR_CONF] = 0; - you.duration[DUR_POISONING] = 0; - need_chain = false; + case 1: + if (you.rotting) + { + success = true; + you.rotting = 0; + } break; - } - - step = 1; - // Deliberate fall through. - - if (step >= step_max) + case 2: + if (you.duration[DUR_CONF]) + { + success = true; + you.duration[DUR_CONF] = 0; + } break; - - // Remove sickness and rotting. - case 1: - if (you.disease || you.rotting) - { - success = true; - you.disease = 0; - you.rotting = 0; - need_chain = false; + case 3: + if (you.duration[DUR_PARALYSIS]) + { + success = true; + you.duration[DUR_PARALYSIS] = 0; + } break; - } - - step = 2; - // Deliberate fall through. - - if (step >= step_max) + case 4: + if (you.duration[DUR_POISONING]) + { + success = true; + you.duration[DUR_POISONING] = 0; + } break; - - // Restore rotted HP. - case 2: - if (player_rotted()) - { - success = true; - unrot_hp(3 + random2(9)); - need_chain = false; + case 5: + if (you.duration[DUR_PETRIFIED]) + { + success = true; + you.duration[DUR_PETRIFIED] = 0; + } break; } - - step = 3; - // Deliberate fall through. - - if (step >= step_max) - break; - - default: - break; } - - if (success) - break; - - need_chain = false; - step = 0; - type = 3; - // Deliberate fall through, resetting the vitalisation chaining - // indicator and the step counter. - - case 3: + while (!success); + } + // Restore stats. + else if (you.strength < you.max_strength + || you.intel < you.max_intel + || you.dex < you.max_dex) { -stamina_robustness: - int estep = step / 2; + type = 1; - // Add divine stamina and divine robustness. - switch (step) + do { - // Divine stamina. - case 0: - case 2: - case 4: - if ((estep == 0 || you.duration[DUR_VITALISATION_CHAIN] > 0) - && ((you.attribute[ATTR_DIVINE_STAMINA] + 1) / 2) == estep - && ((player_mutation_level(MUT_STRONG) + 1) / 5) < (3 - estep) - && ((player_mutation_level(MUT_CLEVER) + 1) / 5) < (3 - estep) - && ((player_mutation_level(MUT_AGILE) + 1) / 5) < (3 - estep)) + switch (random2(3)) { - success = true; - mprf(MSGCH_DURATION, "Zin %s divine stamina.", - (estep == 0) ? "grants you" : - (estep == 1) ? "strengthens your" - : "maximises your"); - - const int stamina_amt = step + 1; - you.attribute[ATTR_DIVINE_STAMINA] += stamina_amt; - you.duration[DUR_DIVINE_STAMINA] += - (estep == 0) ? (you.skills[SK_INVOCATIONS] * 2) : - (estep == 1) ? (you.skills[SK_INVOCATIONS]) - : (you.skills[SK_INVOCATIONS] / 2); - - modify_stat(STAT_STRENGTH, stamina_amt, true, ""); - modify_stat(STAT_INTELLIGENCE, stamina_amt, true, ""); - modify_stat(STAT_DEXTERITY, stamina_amt, true, ""); - - // Keep vitalisation chaining on if divine stamina can - // be increased two vitalisation attempts from now, or - // if divine robustness can be increased one - // vitalisation attempt from now. - need_chain = - (((player_mutation_level(MUT_STRONG) + 1) / 5) < (2 - estep) - && ((player_mutation_level(MUT_CLEVER) + 1) / 5) < (2 - estep) - && ((player_mutation_level(MUT_AGILE) + 1) / 5) < (2 - estep)) - || (player_mutation_level(MUT_ROBUST) < (3 - estep)); + case 0: + if (you.strength < you.max_strength) + { + success = true; + restore_stat(STAT_STRENGTH, 0, true); + } break; - } - - step++; - goto stamina_robustness; - // Deliberate fall through. - - // Divine robustness. - case 1: - case 3: - case 5: - if ((estep == 0 || you.duration[DUR_VITALISATION_CHAIN] > 0) - && you.attribute[ATTR_DIVINE_ROBUSTNESS] == estep - && player_mutation_level(MUT_ROBUST) < (3 - estep)) - { - success = true; - mprf(MSGCH_DURATION, "Zin %s divine robustness.", - (estep == 0) ? "grants you" : - (estep == 1) ? "strengthens your" - : "maximises your"); - - you.attribute[ATTR_DIVINE_ROBUSTNESS]++; - you.duration[DUR_DIVINE_ROBUSTNESS] += - (estep == 0) ? (you.skills[SK_INVOCATIONS] * 2) : - (estep == 1) ? (you.skills[SK_INVOCATIONS]) - : (you.skills[SK_INVOCATIONS] / 2); - - const int old_hp_max = you.hp_max; - calc_hp(); - set_hp(you.hp * you.hp_max / old_hp_max, false); - - // Keep vitalisation chaining on if divine robustness - // can be increased two vitalisation attempts from now, - // or if divine stamina can be increased one - // vitalisation attempt from now. - need_chain = - (player_mutation_level(MUT_ROBUST) < (2 - estep)) - || (((player_mutation_level(MUT_STRONG) + 1) / 5) < (3 - estep) - && ((player_mutation_level(MUT_CLEVER) + 1) / 5) < (3 - estep) - && ((player_mutation_level(MUT_AGILE) + 1) / 5) < (3 - estep)); + case 1: + if (you.intel < you.max_intel) + { + success = true; + restore_stat(STAT_INTELLIGENCE, 0, true); + } + break; + case 2: + if (you.dex < you.max_dex) + { + success = true; + restore_stat(STAT_DEXTERITY, 0, true); + } break; } - - step++; - goto stamina_robustness; - // Deliberate fall through. - - default: - break; } + while (!success); + } + else + { + // Add divine stamina. + if (!you.duration[DUR_DIVINE_STAMINA]) + { + success = true; + type = 2; - if (success) - break; + mprf("%s grants you divine stamina.", + god_name(you.religion).c_str()); - need_chain = false; - step = 0; - type = 4; - // Deliberate fall through, resetting the vitalisation chaining - // indicator and the step counter. - } + const int stamina_amt = 3; + you.attribute[ATTR_DIVINE_STAMINA] += stamina_amt; + you.duration[DUR_DIVINE_STAMINA] + = 35 + (you.skills[SK_INVOCATIONS]*5)/3; - default: - // Do nothing. - break; + modify_stat(STAT_STRENGTH, stamina_amt, true, ""); + modify_stat(STAT_INTELLIGENCE, stamina_amt, true, ""); + modify_stat(STAT_DEXTERITY, stamina_amt, true, ""); + } } -#ifdef DEBUG_DIAGNOSTICS - mprf(MSGCH_DIAGNOSTICS, - "vitalising: step = %d, type = %d, step_max = %d", - step, type, step_max); -#endif - // If vitalisation has succeeded, display an appropriate message. if (success) { - mprf("You feel %s %s.", (step == 0) ? "only nominally" : - (step == 1) ? "very slightly" : - (step == 2) ? "slightly" : - (step == 3) ? "somewhat" : - (step == 4) ? "appropriately" - : "impressively", - (type == 0) ? "invigorated" : - (type == 1) ? "renewed" : - (type == 2) ? "better" - : "powerful"); - - // If vitalisation has succeeded, pay the extended piety cost, - // based on how far the step counter has advanced. - int loss_amt = step + 1 + (random2(3) - 1); - - if (loss_amt > 0) - lose_piety(loss_amt); - - // Increment the step counter. - step++; + mprf("You feel %s.", (type == 0) ? "better" : + (type == 1) ? "renewed" + : "powerful"); } else canned_msg(MSG_NOTHING_HAPPENS); - // Whether vitalisation has succeeded or failed, pay the minimum - // piety cost. - lose_piety(2); - - // If there's not enough piety left to vitalise again, turn off - // vitalisation chaining. - if (you.piety < piety_breakpoint(1)) - need_chain = false; - - // If vitalisation has succeeded, it hasn't succeeded as far as - // possible, and vitalisation chaining is needed, turn on - // vitalisation chaining for several turns. - if (success && step < step_max && need_chain) - vitalisation_chain(6); - // Otherwise, turn off vitalisation chaining. - else - reduce_vitalisation_chain(30); - - return (success) ? (step + 1) : 0; + return (success); } bool cast_revivification(int pow) diff --git a/crawl-ref/source/spells1.h b/crawl-ref/source/spells1.h index 8c8a0f6a6c..09040e71f0 100644 --- a/crawl-ref/source/spells1.h +++ b/crawl-ref/source/spells1.h @@ -32,11 +32,9 @@ bool cast_sure_blade(int power); * *********************************************************************** */ int cast_healing(int pow, const coord_def& where = coord_def(0,0)); -void vitalisation_chain(int amount); -void reduce_vitalisation_chain(int amount); void remove_divine_robustness(); void remove_divine_stamina(); -int cast_vitalisation(int pow); +bool cast_vitalisation(); void big_cloud(cloud_type cl_type, kill_category whose, const coord_def& where, int pow, int size, int spread_rate = -1); |