From e2ba308c6624b1bd7ee1643c3a6541dcec8181dd Mon Sep 17 00:00:00 2001 From: Dan Doel Date: Wed, 28 Jul 2021 22:19:06 -0400 Subject: [PATCH] Implement most of Implosion --- tpdata/tpmes/help_extensions.tab | 1 + .../co8infra/rules/spells/242 - Implosion.txt | 18 +++ tpdatasrc/co8infra/tpmes/help_extensions.tab | 1 + tpdatasrc/kotbfixes/tpmes/help_extensions.tab | 1 + .../rules/d20_actions/action0901_implode.py | 28 ++++ .../tpgamefiles/scr/Spell242 - Implosion.py | 53 +++++++ .../scr/tpModifiers/sp_implosion.py | 148 ++++++++++++++++++ .../sound/spells/sp_implosion_hit.mp3 | Bin 0 -> 5538 bytes .../sound/spells/sp_implosion_miss.mp3 | Bin 0 -> 7698 bytes .../sound/user_sounds/tpsounds.mes | 4 + 10 files changed, 254 insertions(+) create mode 100644 tpdatasrc/co8infra/rules/spells/242 - Implosion.txt create mode 100644 tpdatasrc/tpgamefiles/rules/d20_actions/action0901_implode.py create mode 100644 tpdatasrc/tpgamefiles/scr/Spell242 - Implosion.py create mode 100644 tpdatasrc/tpgamefiles/scr/tpModifiers/sp_implosion.py create mode 100644 tpdatasrc/tpgamefiles/sound/spells/sp_implosion_hit.mp3 create mode 100644 tpdatasrc/tpgamefiles/sound/spells/sp_implosion_miss.mp3 diff --git a/tpdata/tpmes/help_extensions.tab b/tpdata/tpmes/help_extensions.tab index a575f56fa..81770be5a 100644 --- a/tpdata/tpmes/help_extensions.tab +++ b/tpdata/tpmes/help_extensions.tab @@ -103,4 +103,5 @@ TAG_SPELLS_ENERGY_DRAIN TAG_SPELLS TAG_CLERIC_9 TAG_SORCERER_9 TAG_WIZARD_9 Ene TAG_SPELLS_ENERVATION TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 Enervation ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Sorcerer~[TAG_SORCERERS] 4, ~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous You point your finger and utter the incantation, releasing a black ray of crackling negative energy that suppresses the life force of any living creature it strikes. You must make a ranged touch attack to hit. If the attack succeeds, the subject gains 1d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit). It regains the lost levels after a number of hours equal to your caster level (maximum 15 hours). Usually negative levels have a chance of permanently draining the victim's levels, but the negative levels from enervation don't last long enough to do so. An undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for every negative level that would be bestowed. TAG_SPELLS_ENERGY_DRAIN TAG_SPELLS TAG_CLERIC_9 TAG_SORCERER_9 TAG_WIZARD_9 Energy Drain ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Cleric~[TAG_CLERICS] 9, ~Sorcerer~[TAG_SORCERERS] 9, ~Wizard~[TAG_WIZARDS] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous This spell functions like ~enervation~[TAG_SPELLS_ENERVATION], except that the creature gains 2d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit), and the negative levels last longer. There is no ~saving throw~[TAG_SAVING_THROW_DESC] to avoid gaining the negative levels, but 24 hours after gaining them, the subject must make a ~Fortitude~[TAG_FORTITUDE] saving throw (DC = the spell's save DC) for each negative level. If the save succeeds, that negative level is removed. If it fails, the negative level instead becomes a permanent negative level. A separate save must be made for each negative level. Like enervation, an undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for each negative level that would be bestowed. TAG_SPELLS_DISRUPTING_WEAPON TAG_SPELLS TAG_CLERIC_5 Disrupting Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] ~Cleric~[TAG_CLERICS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: One melee weapon Duration: 1 round/level Saving Throw: No Spell Resistance: No This spell makes a melee weapon deadly to undead. When struck with the weapon, an undead creature with ~hit dice~[TAG_HIT_DICE] equal to or less than the caster level must succeed on a ~Will~[TAG_WILL] save or be destroyed. Spell resistance does not apply against the destruction effect. +TAG_SPELLS_IMPLOSION TAG_SPELLS TAG_CLERIC_9 TAG_DESTRUCTION_D Implosion ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] ~Cleric~[TAG_CLERICS] 9, ~Domain: Destruction~[TAG_DESTRUCTION_D] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft/2 levels) Target: One corporeal creature/round Duration: Concentration (up to 4 rounds) Saving Throw: Fortitude Spell Resistance: Yes You create a destructive resonance in a corporeal creature's body. For each round you concentrate, you cause one creature to collapse in on itself, killing it. You can target a particular creature only once with each casting of the spell. Implosion has no effect on creatures in gaseous form or incorporeal creatures. Concentration requires a standard action each round. Choosing the Implode action counts as concentration for the round. You may choose not to Implode a target on a given round, but to maintain concentration, you must end your turn with enough time to perform a standard action. Some other actions, such as spell casting, break concentration even if they allow enough time to concentrate. diff --git a/tpdatasrc/co8infra/rules/spells/242 - Implosion.txt b/tpdatasrc/co8infra/rules/spells/242 - Implosion.txt new file mode 100644 index 000000000..9e519fa0e --- /dev/null +++ b/tpdatasrc/co8infra/rules/spells/242 - Implosion.txt @@ -0,0 +1,18 @@ +School: Evocation +Level: Clr 9 +Level: Destruction 9 +Component: V +Component: S +Casting Time: 1 action +Range: Close +Saving Throw: Fortitude +Spell Resistance: No +Projectile: No +flags_Target: Range +inc_flags_Target: Other +exc_flags_Target: Self +exc_flags_Target: Dead +exc_flags_Target: Non-critter +mode_Target: Single +radius_Target: 0 +ai_type: ai_action_offensive diff --git a/tpdatasrc/co8infra/tpmes/help_extensions.tab b/tpdatasrc/co8infra/tpmes/help_extensions.tab index 2cf8b314b..524b5dd08 100644 --- a/tpdatasrc/co8infra/tpmes/help_extensions.tab +++ b/tpdatasrc/co8infra/tpmes/help_extensions.tab @@ -110,6 +110,7 @@ TAG_CRAFT_MAA_PRECISE TAG_DUMMY Precise This property can only be placed on a TAG_SPELLS_ENERVATION TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 Enervation ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Sorcerer~[TAG_SORCERERS] 4, ~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous You point your finger and utter the incantation, releasing a black ray of crackling negative energy that suppresses the life force of any living creature it strikes. You must make a ranged touch attack to hit. If the attack succeeds, the subject gains 1d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit). It regains the lost levels after a number of hours equal to your caster level (maximum 15 hours). Usually negative levels have a chance of permanently draining the victim's levels, but the negative levels from enervation don't last long enough to do so. An undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for every negative level that would be bestowed. TAG_SPELLS_ENERGY_DRAIN TAG_SPELLS TAG_CLERIC_9 TAG_SORCERER_9 TAG_WIZARD_9 Energy Drain ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Cleric~[TAG_CLERICS] 9, ~Sorcerer~[TAG_SORCERERS] 9, ~Wizard~[TAG_WIZARDS] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous This spell functions like ~enervation~[TAG_SPELLS_ENERVATION], except that the creature gains 2d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit), and the negative levels last longer. There is no ~saving throw~[TAG_SAVING_THROW_DESC] to avoid gaining the negative levels, but 24 hours after gaining them, the subject must make a ~Fortitude~[TAG_FORTITUDE] saving throw (DC = the spell's save DC) for each negative level. If the save succeeds, that negative level is removed. If it fails, the negative level instead becomes a permanent negative level. A separate save must be made for each negative level. Like enervation, an undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for each negative level that would be bestowed. TAG_SPELLS_DISRUPTING_WEAPON TAG_SPELLS TAG_CLERIC_5 Disrupting Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] ~Cleric~[TAG_CLERICS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: One melee weapon Duration: 1 round/level Saving Throw: No Spell Resistance: No This spell makes a melee weapon deadly to undead. When struck with the weapon, an undead creature with ~hit dice~[TAG_HIT_DICE] equal to or less than the caster level must succeed on a ~Will~[TAG_WILL] save or be destroyed. Spell resistance does not apply against the destruction effect. +TAG_SPELLS_IMPLOSION TAG_SPELLS TAG_CLERIC_9 TAG_DESTRUCTION_D Implosion ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] ~Cleric~[TAG_CLERICS] 9, ~Domain: Destruction~[TAG_DESTRUCTION_D] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft/2 levels) Target: One corporeal creature/round Duration: Concentration (up to 4 rounds) Saving Throw: Fortitude Spell Resistance: Yes You create a destructive resonance in a corporeal creature's body. For each round you concentrate, you cause one creature to collapse in on itself, killing it. You can target a particular creature only once with each casting of the spell. Implosion has no effect on creatures in gaseous form or incorporeal creatures. Concentration requires a standard action each round. Choosing the Implode action counts as concentration for the round. You may choose not to Implode a target on a given round, but to maintain concentration, you must end your turn with enough time to perform a standard action. Some other actions, such as spell casting, break concentration even if they allow enough time to concentrate. TAG_ABJURANT_CHAMPION TAG_PRESTIGE_CLASSES Abjurant Champion The abjurant champion focuses his arcane abilities both to augment his personal defense and to hinder enemy spellcasters. Perfectly suited for martial stalwarts who dabble in magic, this class offers characters the ability to improve their combat skills in ways neither soldiers nor spellcasters can. Hit Die: d10 Requirements: To qualify to become a abjurant champion, a character must fulfill all the following criteria. Base Attack Bonus: +5 Feats: Combat Casting Spellcasting: Must be able to cast 1st-level arcane spells, including at least one abjuration spell. Special: Must be proficient with at least one martial weapon. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_ABJURANT_CHAMPION]. Class Skills:~Concentration~[TAG_CONCENTRATION], ~Intimidate~[TAG_INTIMIDATE] and ~Spellcraft~[TAG_SPELLCRAFT] Skill Points at Each Level: 2 + Int modifier Class Features: Weapon and Armor Proficiency: Abjurant Champions gain no proficiency with any weapon or armor. At each level, you gain new spells per day and an increase in caster level (and spells known, if applicable) as if you had also gained a level in an arcane spellcasting class to which you belonged before adding the prestige class level. You do not, however, gain any other benefit a character of that class would have gained. If you had more than one arcane spellcasting class before becoming an abjurant champion, you must decide to which class to add each level for the purpose of determining spells per day, caster level, and spells known. Abjurant Armor (Su): Any time you cast an abjuration spell that grants you an armor bonus or shield bonus to AC, you can increase the value of the bonus by your abjurant champion class level. Abjurant champions rely on shield and similar spells instead of actual armor. Extended Abjuration (Su): You depend on your abjuration spells to protect you in combat. Double the duration of abjuration spells you cast, as if you had applied the Extend Spell feat to them (but without any change in level or casting time). Swift Abjuration (Su): Beginning at 2nd level, you can cast abjuration spells as a swift action, as if you had applied the Quicken Spell feat to them (but without any change in level). The maximum level of spell you can quicken in this way is equal to 1/2 your class level (rounded up). Arcane Boost (Su): Beginning at 4th level, you gain the ability to burn arcane energy to empower your martial abilities. As a swift action, you can spend one of your uncast spells or spell slots to grant yourself one of the following insight bonuses for 1 round. * Bonus on attack rolls equal to the spell's level. * Bonus on weapon damage rolls equal to twice the spell's level. * Bonus to AC equal to the spell's level. * Bonus on saving throws equal to the spell's level. * Resistance to acid, cold, electricity, fire, and sonic equal to 5 × the spell's level. Martial Arcanist (Ex): At 5th level, you master the art of combining your militant and mystical training. From this point on, your caster level in a chosen arcane spellcasting class is equal to your base attack bonus (unless it would otherwise be higher). For example, a 7th-level fighter/1st-level wizard/5th-level abjurant champion has a base attack bonus of +12 (and thus a caster level of 12th). You can apply this benefit to only one arcane class to which you have added spellcasting levels by your advancement as an abjurant champion. TAG_CLASS_FEATURES_ABJURANT_CHAMPION TAG_DUMMY Abjurant Champion Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+1 @t+0 @t+0 @t+2 2 @t+2 @t+0 @t+0 @t+3 3 @t+3 @t+1 @t+1 @t+3 4 @t+4 @t+1 @t+1 @t+4 5 @t+5 @t+1 @t+1 @t+4 diff --git a/tpdatasrc/kotbfixes/tpmes/help_extensions.tab b/tpdatasrc/kotbfixes/tpmes/help_extensions.tab index 2cf8b314b..524b5dd08 100644 --- a/tpdatasrc/kotbfixes/tpmes/help_extensions.tab +++ b/tpdatasrc/kotbfixes/tpmes/help_extensions.tab @@ -110,6 +110,7 @@ TAG_CRAFT_MAA_PRECISE TAG_DUMMY Precise This property can only be placed on a TAG_SPELLS_ENERVATION TAG_SPELLS TAG_SORCERER_4 TAG_WIZARD_4 Enervation ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Sorcerer~[TAG_SORCERERS] 4, ~Wizard~[TAG_WIZARDS] 4 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous You point your finger and utter the incantation, releasing a black ray of crackling negative energy that suppresses the life force of any living creature it strikes. You must make a ranged touch attack to hit. If the attack succeeds, the subject gains 1d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit). It regains the lost levels after a number of hours equal to your caster level (maximum 15 hours). Usually negative levels have a chance of permanently draining the victim's levels, but the negative levels from enervation don't last long enough to do so. An undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for every negative level that would be bestowed. TAG_SPELLS_ENERGY_DRAIN TAG_SPELLS TAG_CLERIC_9 TAG_SORCERER_9 TAG_WIZARD_9 Energy Drain ~Necromancy~[TAG_MAGIC_SCHOOLS_NECROMANCY] ~Cleric~[TAG_CLERICS] 9, ~Sorcerer~[TAG_SORCERERS] 9, ~Wizard~[TAG_WIZARDS] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft./2 levels) Duration: Instantaneous This spell functions like ~enervation~[TAG_SPELLS_ENERVATION], except that the creature gains 2d4 ~negative levels~[TAG_SPECIAL_ABILITIES_ENERGY_DRAIN_AND_NEGATIVE_LEVELS] (double on a critical hit), and the negative levels last longer. There is no ~saving throw~[TAG_SAVING_THROW_DESC] to avoid gaining the negative levels, but 24 hours after gaining them, the subject must make a ~Fortitude~[TAG_FORTITUDE] saving throw (DC = the spell's save DC) for each negative level. If the save succeeds, that negative level is removed. If it fails, the negative level instead becomes a permanent negative level. A separate save must be made for each negative level. Like enervation, an undead creature struck by the ray instead gains 5 ~temporary hit points~[TAG_TEMPORARY_HIT_POINTS] for each negative level that would be bestowed. TAG_SPELLS_DISRUPTING_WEAPON TAG_SPELLS TAG_CLERIC_5 Disrupting Weapon ~Transmutation~[TAG_MAGIC_SCHOOLS_TRANSMUTATION] ~Cleric~[TAG_CLERICS] 5 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Touch Target: One melee weapon Duration: 1 round/level Saving Throw: No Spell Resistance: No This spell makes a melee weapon deadly to undead. When struck with the weapon, an undead creature with ~hit dice~[TAG_HIT_DICE] equal to or less than the caster level must succeed on a ~Will~[TAG_WILL] save or be destroyed. Spell resistance does not apply against the destruction effect. +TAG_SPELLS_IMPLOSION TAG_SPELLS TAG_CLERIC_9 TAG_DESTRUCTION_D Implosion ~Evocation~[TAG_MAGIC_SCHOOLS_EVOCATION] ~Cleric~[TAG_CLERICS] 9, ~Domain: Destruction~[TAG_DESTRUCTION_D] 9 Components: V, S Casting Time: 1 ~standard action~[TAG_STANDARD_ACTION] Range: Close (25 ft. + 5 ft/2 levels) Target: One corporeal creature/round Duration: Concentration (up to 4 rounds) Saving Throw: Fortitude Spell Resistance: Yes You create a destructive resonance in a corporeal creature's body. For each round you concentrate, you cause one creature to collapse in on itself, killing it. You can target a particular creature only once with each casting of the spell. Implosion has no effect on creatures in gaseous form or incorporeal creatures. Concentration requires a standard action each round. Choosing the Implode action counts as concentration for the round. You may choose not to Implode a target on a given round, but to maintain concentration, you must end your turn with enough time to perform a standard action. Some other actions, such as spell casting, break concentration even if they allow enough time to concentrate. TAG_ABJURANT_CHAMPION TAG_PRESTIGE_CLASSES Abjurant Champion The abjurant champion focuses his arcane abilities both to augment his personal defense and to hinder enemy spellcasters. Perfectly suited for martial stalwarts who dabble in magic, this class offers characters the ability to improve their combat skills in ways neither soldiers nor spellcasters can. Hit Die: d10 Requirements: To qualify to become a abjurant champion, a character must fulfill all the following criteria. Base Attack Bonus: +5 Feats: Combat Casting Spellcasting: Must be able to cast 1st-level arcane spells, including at least one abjuration spell. Special: Must be proficient with at least one martial weapon. Base Attack and Base Save Bonuses: see ~table~[TAG_CLASS_FEATURES_ABJURANT_CHAMPION]. Class Skills:~Concentration~[TAG_CONCENTRATION], ~Intimidate~[TAG_INTIMIDATE] and ~Spellcraft~[TAG_SPELLCRAFT] Skill Points at Each Level: 2 + Int modifier Class Features: Weapon and Armor Proficiency: Abjurant Champions gain no proficiency with any weapon or armor. At each level, you gain new spells per day and an increase in caster level (and spells known, if applicable) as if you had also gained a level in an arcane spellcasting class to which you belonged before adding the prestige class level. You do not, however, gain any other benefit a character of that class would have gained. If you had more than one arcane spellcasting class before becoming an abjurant champion, you must decide to which class to add each level for the purpose of determining spells per day, caster level, and spells known. Abjurant Armor (Su): Any time you cast an abjuration spell that grants you an armor bonus or shield bonus to AC, you can increase the value of the bonus by your abjurant champion class level. Abjurant champions rely on shield and similar spells instead of actual armor. Extended Abjuration (Su): You depend on your abjuration spells to protect you in combat. Double the duration of abjuration spells you cast, as if you had applied the Extend Spell feat to them (but without any change in level or casting time). Swift Abjuration (Su): Beginning at 2nd level, you can cast abjuration spells as a swift action, as if you had applied the Quicken Spell feat to them (but without any change in level). The maximum level of spell you can quicken in this way is equal to 1/2 your class level (rounded up). Arcane Boost (Su): Beginning at 4th level, you gain the ability to burn arcane energy to empower your martial abilities. As a swift action, you can spend one of your uncast spells or spell slots to grant yourself one of the following insight bonuses for 1 round. * Bonus on attack rolls equal to the spell's level. * Bonus on weapon damage rolls equal to twice the spell's level. * Bonus to AC equal to the spell's level. * Bonus on saving throws equal to the spell's level. * Resistance to acid, cold, electricity, fire, and sonic equal to 5 × the spell's level. Martial Arcanist (Ex): At 5th level, you master the art of combining your militant and mystical training. From this point on, your caster level in a chosen arcane spellcasting class is equal to your base attack bonus (unless it would otherwise be higher). For example, a 7th-level fighter/1st-level wizard/5th-level abjurant champion has a base attack bonus of +12 (and thus a caster level of 12th). You can apply this benefit to only one arcane class to which you have added spellcasting levels by your advancement as an abjurant champion. TAG_CLASS_FEATURES_ABJURANT_CHAMPION TAG_DUMMY Abjurant Champion Base Attack & Base Save Bonuses Level ~Base Attack Bonus~[TAG_LEVEL_BONUSES] ~Fortitude~[TAG_FORTITUDE] ~Save~[TAG_LEVEL_BONUSES] ~Reflex~[TAG_REFLEX] ~Save~[TAG_LEVEL_BONUSES] ~Will~[TAG_WILL] ~Save~[TAG_LEVEL_BONUSES] 1 @t+1 @t+0 @t+0 @t+2 2 @t+2 @t+0 @t+0 @t+3 3 @t+3 @t+1 @t+1 @t+3 4 @t+4 @t+1 @t+1 @t+4 5 @t+5 @t+1 @t+1 @t+4 diff --git a/tpdatasrc/tpgamefiles/rules/d20_actions/action0901_implode.py b/tpdatasrc/tpgamefiles/rules/d20_actions/action0901_implode.py new file mode 100644 index 000000000..272dff99c --- /dev/null +++ b/tpdatasrc/tpgamefiles/rules/d20_actions/action0901_implode.py @@ -0,0 +1,28 @@ +from toee import * +import tpactions +import tpdp + + +def GetActionName(): + return "Implode" + +def GetActionDefinitionFlags(): + return D20ADF_TargetSingleExcSelf | D20ADF_TriggersCombat + +def GetTargetingClassification(): + return D20TC_SingleExcSelf + +def GetActionCostType(): + return D20ACT_Standard_Action + +def AddToSequence(d20action, action_seq, tb_status): + packet = tpdp.SpellPacket(d20action.data1) + + for i in range(0, packet.target_count): + if packet.get_target(i) == d20action.target: + d20action.target.float_text_line('Already targeted',tf_red) + return AEC_TARGET_INVALID + + packet.add_target(d20action.target, 0) + action_seq.add_action(d20action) + return AEC_OK diff --git a/tpdatasrc/tpgamefiles/scr/Spell242 - Implosion.py b/tpdatasrc/tpgamefiles/scr/Spell242 - Implosion.py new file mode 100644 index 000000000..fee6fc427 --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/Spell242 - Implosion.py @@ -0,0 +1,53 @@ +from toee import * +from tpdp import SpellPacket + +def OnBeginSpellCast(spell): + game.particles('sp-evocation-conjure', spell.caster) + +def OnBeginRound(spell): + print "Implosion OnBeginRound" + return + +def dropItems(target): + if target.type != obj_t_npc and target.type != obj_t_pc: + return 0 + + s + +def OnSpellEffect(spell): + spell.duration = 3 + + packet = SpellPacket(spell.id) + # concentration condition + spell.caster.condition_add_with_args( + 'sp-Implosion', spell.id, spell.duration, spell.dc, 1, 0) + + target_item = spell.target_list[0] + target = target_item.obj + + if packet.check_spell_resistance_force(target): + game.particles('Fizzle', target) + game.sound(17122,1) + return + + if target.stat_level_get(stat_size) > STAT_SIZE_MEDIUM: + game.particles('sp-Implosion-large', target) + else: + game.particles('sp-Implosion', target) + + saved = target.saving_throw_spell( + spell.dc, D20_Save_Fortitude, D20STD_F_NONE, spell.caster, spell.id) + if saved: + game.sound(10849) + return + + game.sound(10847) + + if target.type == obj_t_npc: + target.obj_set_obj(obj_f_last_hit_by, spell.caster) + spell.target_list.remove_target(target) + target.critter_kill() + target.object_flag_set(OF_DESTROYED) + +def OnEndSpellCast(spell): + print "Implosion end: " + str(spell.id) diff --git a/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_implosion.py b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_implosion.py new file mode 100644 index 000000000..f3163457a --- /dev/null +++ b/tpdatasrc/tpgamefiles/scr/tpModifiers/sp_implosion.py @@ -0,0 +1,148 @@ +from templeplus.pymod import PythonModifier +from toee import * +import tpdp +import tpactions +from utilities import * +from spell_utils import * + +implodeEnum = 901 + +# Seems rather unnecessary since spell casting already removes +# concentration, but the original has it. +def PreAdd(char, args, evt_obj): + if evt_obj.is_modifier('sp-Concentrating'): + args.remove_spell() + args.remove_spell_mod() + return 0 + +def Yes(char, args, evt_obj): + evt_obj.return_val = 1 + return 0 + +def IsConcentrating(char, args, evt_obj): + evt_obj.data1 = args.get_arg(0) + evt_obj.data2 = 0 + evt_obj.return_val = 1 + return 0 + +def DmgCheck(char, args, evt_obj): + spell_id = args.get_arg(0) + spacket = tpdp.SpellPacket(spell_id) + dpacket = evt_obj.damage_packet + # Note: this could be wrong for spells <9th level, but it's tricky to + # calculate the right level + dc = 10 + spacket.spell_known_slot_level + dpacket.final_damage + + if not char.skill_roll(skill_concentration, dc, 0): + char.float_mesfile_line('mes\\combat.mes', 5060) + char.d20_send_signal(S_Concentration_Broken, spell_id) + + return 0 + +def Sequence(char, args, evt_obj): + d20a = evt_obj.get_d20_action() + # TODO: check D20ADF_Breaks_Concentration + return 0 + +def Recipient(char, args, evt_obj): + return 0 + +def Stop(char, args, evt_obj): + spell_id = args.get_arg(0) + char.float_mesfile_line('mes\\combat.mes', 5060) + char.d20_send_signal(S_Concentration_Broken, spell_id) + return 0 + +def Remove(char, args, evt_obj): + args.remove_spell() + args.remove_spell_mod() + return 0 + +def TT(char, args, evt_obj): + evt_obj.append('Concentrating [Implosion]') + return 0 + +def Radial(char, args, evt_obj): + spell_id = args.get_arg(0) + implode = tpdp.RadialMenuEntryPythonAction( + 'Implode', D20A_PYTHON_ACTION, + implodeEnum, spell_id, 'TAG_INTERFACE_HELP') + implode.add_child_to_standard(char, tpdp.RadialMenuStandardNode.Spells) + return 0 + +def Perform(char, args, evt_obj): + spell_id = args.get_arg(0) + dc = args.get_arg(2) + + # concentrated this round + args.set_arg(3, 1) + + target = evt_obj.d20a.target + packet = tpdp.SpellPacket(spell_id) + + if packet.check_spell_resistance_force(target): + game.particles('Fizzle', target) + game.sound(17122,1) + return 0 + + caster = packet.caster + + saved = target.saving_throw_spell( + dc, D20_Save_Fortitude, D20STD_F_NONE, caster, spell_id) + + if target.stat_level_get(stat_size) > STAT_SIZE_MEDIUM: + game.particles('sp-Implosion-large', target) + else: + game.particles('sp-Implosion', target) + game.sound(10847) + + if saved: + game.sound(10849) + return 0 + + if target.type == obj_t_npc: + target.obj_set_obj(obj_f_last_hit_by, caster) + packet.remove_target(target) + target.critter_kill() + target.object_flag_set(OF_DESTROYED) + + return 0 + +def Frame(char, args, evt_obj): + print "Frame" + print dir(evt_obj) + return 0 + +def EndTurn(char, args, evt_obj): + if args.get_arg(3): + args.set_arg(3, 0) + return 0 + + tb_status = tpactions.get_cur_seq().tb_status + + # Not enough time left to concentrate + if tb_status.hourglass_state < 2: + char.float_mesfile_line('mes\\combat.mes', 5060) + #char.d20_send_signal(S_Concentration_Broken, spell_id) + args.condition_remove() + args.remove_spell_mod() + + return 0 + +# spell_id, duration, dc, concentrated, spare +cast = PythonModifier('sp-Implosion', 5, 0) +cast.AddHook(ET_OnConditionAddPre, EK_NONE, PreAdd, ()) +cast.AddHook(ET_OnD20Query, EK_Q_Critter_Is_Concentrating, IsConcentrating, ()) +cast.AddHook(ET_OnTakingDamage2, EK_NONE, DmgCheck, ()) +cast.AddHook(ET_OnD20Signal, EK_S_Sequence, Sequence, ()) +#cast.AddHook(ET_OnD20Signal, EK_S_Action_Recipient, Recipient, ()) +cast.AddHook(ET_OnD20Signal, EK_S_Remove_Concentration, Stop, ()) +cast.AddHook(ET_OnD20Signal, EK_S_Concentration_Broken, Remove, ()) +cast.AddHook(ET_OnD20Signal, EK_S_Killed, Remove, ()) +cast.AddHook(ET_OnD20Signal, EK_S_EndTurn, EndTurn, ()) +cast.AddHook(ET_OnGetTooltip, EK_NONE, spellTooltip, ()) +cast.AddHook(ET_OnBuildRadialMenuEntry, EK_NONE, Radial, ()) +cast.AddHook(ET_OnD20PythonActionPerform, implodeEnum, Perform, ()) +#cast.AddHook(ET_OnD20PythonActionFrame, implodeEnum, Frame, ()) +cast.AddSpellCountdownStandardHook() + diff --git a/tpdatasrc/tpgamefiles/sound/spells/sp_implosion_hit.mp3 b/tpdatasrc/tpgamefiles/sound/spells/sp_implosion_hit.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..b3bee141344d3a741cb379b04b241503981c86cd GIT binary patch literal 5538 zcma*rhdv;h`QGFn?Rfs=3NCOnD*|`Fo(f`L$#7HB}*LWRK{O=&+ zXQ9JCvhF!R^iBE2<7eom$6dfbO)f$XuSH=LC~%DvsSf?wyhD=U_#?!QN`*>gIm@3S zCotmynCeNO%0qqLf3W&~X;$E;N}m{<6!P$!69y}eEW$Z5`b<0*X0#CVA2@XeCp*a{ z3o(RyrtJNGTHV!G4He2-SOrJtx==^w#QWL&a&#$=E){CL zlgIQ1QSWXbTp;q_=n$A=-wy)ZfNrx(Bs{(zp=e_?awKO*<>YW7CUmQ`akEBRO}KJR z%jMX(oHkE4W_oJE1Pv_vYtk$V3Gy;V73%ukWgVEx*7%s$Wt`GEQW*fi*%(ejhy)5z zy!v#u*-bodwR=+&)XSZQ2eC3oWnoRH2MWmgK0HjIjTQQw>B{Sd_)MKGWX#CQn@cTE zplGXr5HZB6hPkm$G~QpLn=T~3lb~owlv#T=9OQ`pLo3%oV)A^aU`5T}9kpC4BnHgB z@U%(y0ig@EXG>Mdw&8dX75&-~&OQ`#Otn;ZCt*pkP@lgJZS%MEk^NvBv3=v&_6faNx4TpQOUEN21LB7K@K}oWJ2vDtY z5b(7N)McwId$;2?9z;nWrZIEv*mphZ^uAiyxX!QK`zy<&7&|hJODpQc6Hy!)DdIZC z!cx$Z8w+(C2xC&0)6~aCUBm>ULw)uY7^CmJ@%?tBX`df_8C*G-3rBqZatzE9Rr`;$ zfsH}T@MMHYO%WbM&0u0ObFHQMOdsY1!G1<*ElTl|8s`_F8wJoN###f#=MGQamoBKwse1~x`p3@?_xr^1^8bX+f9|)}cN!>bw`zCbDrkLKO5&sm<*;Pa^Up;@y5Ii} z;<89~UniT#gDB`}B>T?8^b*O)eWbm64j_p?>mQsb@G3AOPtB=|Xv>V7D57o?lBtcv zV=7Xb&(U&)$E|gu8O8A*d5r+-F{m4=eU9o5{hH3MEQ&lJs|G8!-E=3FM| ztKmR1)6B*XLPG~!2iNMCX3{c*{rS|&Lb8gr5E$v6_q_M3w)G~ze+2MZ76$?FFK5HE za*AL)h@3vapzl_%MtX5PPZ(Qiu$qXL6-~cUNt}e>`iQ;ahaW?9rAdz|ccz@&VT=6v zdCGBBtt6v~69N9CNk#rfp z{F9}5HL@q9Zkv zGzf_K!Yy21R|*&Cg{{0l{=O=~x|a6Jv1I$)U*Qqx71{N~UJK>oL5%R+ z{V#JNeO)gY)d_f31J%se-x=fv$k*=ulco--XUY~HyL#R`w`;v}_ID+{T=9*lMMo#@ zlPL@qY4I8W+N~|!WX$UR5K@tGS)0F_bpCYq7bdY_!{%ox$)LA2kx#8y>1c`vanf2= zubQ(A&|<4Vug$rMVm2|E&bc8!_A#vDvAb6#StZchB5On|6##JTj1qhhM5gTCy$Mt2 z6NLYD6N8xFI~sOe5GIqxCTg7;CFw8HjK}`xE?D6-)u-uRUHrM0kxr=#50XT1uCJbl z#y-C+L921+<_sztc0}yA4?k?gK)+Mh(EIDbXd8TQs$32HwW|BAMwhj-{bJ*LiqZ5* z&e(%Pi}&&8JJio&VY?M1H1tpxsM9pLt+a`TFu)azo_e2#UTGP+Ji>$I5jqB|<~Li8 z>!kSFTrGi$Gdd@x`T4_!^ImM?MQ4P_!`vCBL{kw@a0r&H-Eh~{ZZO^Pwx;l1!J~_YnP2Vtj zKk};zv72iD9YbYeY^jG$`B}}x7|@a-d9ksKY;5F|dUZ?e^3P2^p!$^H665st+L}aZ zkEH29^2PTXT1G%i&_}?#S_9pX5(1B!T0a}%j{%sDE14NnM%tFxVPj{#S^c2l87pGT z!glFE`4g~i{qajjs84PRD4?EYbcCG&N4BUR1$}6tAcmT zKhCWlC$Xo99nb%^na{-n$wnwAzJUYp{xrJSp6Z{bY+Q>#KyYUq5p*yh%(b8vA=tUI`qY4$ZxuSv#O|iX5wzO z1C3P^QMH|WyNewaXnQG9n(we(cg&et_XkD(0uQo7w6**z)E#waVx<{XT}25I8-lo$ zpNV0abJQ#SZuhVSTD#}i(|x@kq$MkuXn8AGeQV-< z)KlswK~oTLB&RsTjl%`RhN`GCk;X50k(Qj`LC&;|CKu*fedFn$O4&m(YXy1px5Mui zZ5We9X0E9~R@dI~?Fv{LIjR_GmP{Sj4nyOnpLAc86xdkT8|=FS0xjVXOqrWq42kLayWR=0#Gf;6T7?yM9Zr{fL1CZgi@r zkPRxSa#62yT36fW(l=!>-tKkfW=)W8E?Ulh-44{fuQl)fgMuF37wRvO_eW+B9^sta z8|=ne!g}Glz0uM|eeqkdU++O5Xmz0RpisK{xifPoOgVhji2Dm&=ot|&zoj@zdRc#` za}Oz>EXtR4_(p|@JQ9TzP9DntlCJCFn1)h39aT%;+*|7~GrHI`*RN7F)o8$6P$V}W z_TJ*p`P!PfahvC@@*6XoTa2n0TRbR^4!3<_9!^C6;X!dLw76e61|pL$`4x<-Pr@>J zDQM1nvpKVi@S{r?7hhk#3O8(f>1)0k*+EKva=WDA?Sm?Qs=`DV|~r;P5S>Q>JsvbQ%mZvhc=gERaOFRYP6`7J`LKGm!p|f z)#S5FR2`gwHuuTakt*a_Z8#qEoG$hG#jP+sDne+Bgcc>Zl_N=K{zLNPUi#`k1jMA) zpLOVj1swC7exC7UYn^D?XwWQ|_nwiqzk`fn@9C0g7%u9I1$Gw{#$}GjJ+_ioJt*}* z+gcHAFsgTS;Tegqb1Ex9-yBv{Up`%B-YWgaDOfg(1pxe>g?L{+qZAyZMK)-}KJpbB`r^@Vwu1~U(334PfE-5&AB`R?EjV{KAtXSEUIQpeKM zSnpNyb;m3sIS{w$#i0iDqa|(&chfKfG0Y zr*T1U$W`IIm)B5az=@HMA*7%)Q!GvchDIf}UIsK30ZvAmVq3YZ zb62b53|@vus*D{7c)VBi1S8+J^E43(@>!eKZq#Y#8Mo+5jtCUIos+_zaU0V2S**Sb!lU)D_Vm@MJ>!Ec|NI)A=fR_9LzP-=p8?U=mRFAPr317=!YU%*!oDc_dxc_s8g^1{8q=9^gpv zpj9}N5Mf~`=C-3pJUd1!nj$WFa>^lAF^G^-vQS3A+JY(uIc5TPAN!cA^V=*wsd;fQpWhl;C$XO;Ij5WZzH%xkiBK)dU4FtP6ZD- zU^xxgRkCCR)6g-JgH_dIdN{;$g)4kho@8=?g}Hp2c~_=k^dT^#s+r+$3l#KxFC8&t z^bSezPGJ&g%+;aHk1oEUiECEE51O>)@z_^}t<2=xf+aQlqLW8~{4@euS02lF&>U|V z(Wp>f2x!h$Ry8?U$f{86ZKZ;u{1_FX5JW1LM0%EYrai7QWz8YHQ%YFyTL>azv(!_@ zOTWfjuIu`DUc@WA`x^&J7f~P_hlDp^MB%mVs3!j3w^ujMVzT;Zt>J9R+y86u3V3>v zGvM41koW{sf|OdX^Cu>vrt^YBrTwlx6ISmx-F0V$&&4g%`8AqLdSh(L6IiufQ+Z-6 z5S_mQtun>x5@na7XDMR+6-Cb`OfCsI*E+`kP!@3Nv{WoQCmjiN2!|2+;z6#Q`;s%1 zi&~(Ez83<|Yj{Z?w(OHofqTIIkE(vO+K$GJs^G3;4q!Y+xK(C4p}r%UdQ)LKPorth zZ9~c}B{6hJGqm&Ce?@!jWBO7UvQgCEQU|j3Bbt>+wUOf^ndkSo!Od*^3dynSAU8!U zQ6OnI`Ak!#r<*6=iBK182m`%0?@i}cdY>FbG-@h@*;-y@T71i5Hx_7((ab59o7#wP zxU!2;9SeLefg+ikI3OOLg(ZCgM>F^jA~SREV2LwTX)BJXk_MP5#PJ{|=1J>AaE>D= zHsj)h+)Hp{$GbD*nT)0;&tP+_S%$BT)6HTg*;^@7EL<6vN;VGN7QSrZPwu*JNs==e zF|BW_lte{hSxJWC8z+#T(xT$;LRGX!o*o}N$&(?(Hs$Q}d(!m=@gP##HG?Z~iWcaT zQ-7@1^iiO!a>BbZHI(X@xDzs9v`C7^I(u+EOXY^{QK^%iJT%9H7@3Px2s3Z$@EJF7 z)Chkbxu=84_J|u0`1^efGMO=z$i(8%Y?9nDGhd;-QB;FYa%)XDcun2q@YtVMV*W+6 z=&J~3RKBhvkNLEkI%TsXB-`LHiPmBwZ8PK->&GV`7$K*q&Hq4f?c4tY-KBHiqX{C| z4g5S>q%7qc>$ohs_!_B-W{Y3(p7 zyLY9h3@!T%K*itiASA@MWfB@9t?55X4#_7H9Ka0WL9~o}(N`lWC{XNdYL^5qkUW8w zms+pr7vmisgSCZ|piDIJP4<>4PA{80(u)!Gx;%ElTz)Vy{P<`_SiN#cdZu&m%kMlD zA^|N3B^ipxN4@RCPD@!CCHK5KQBOUbC5lUM;uH@eqmTE7f|F37q#Wm@&2t2wHuyER zSHMwIJ*`q%<@Kv|VP}}+z8i<%W0|nu=(eqIQ(m7s{?w@JY*D<6JUOtBC=;@ILCH%5 z|4LdfRh;i&v1&1SlT3fdkl+g6^aI~k#|ZZS)q#7gusaMef=YE+svAt=>Clvi-!oK& zrxp}St-kA2C08Q?T*aGI)NG?;40+64v?^1LU8d%Xmg5uQ1>oj!&WNCwHox9)EJx^M z`T+@V#z1_V0XC0VX(AoBfFw)5qB$H#zrUSpBQ2K4ZT z>tcMNc)84TR$RH<)ECS8_c){oQ6y4VO?8yB1T#vOo~EGTYOLKc)3^cvUJw#kG=WhR zp~^>7U={p$R|4=$I5vyuAtTnZqjAN9*cp({9}xK-ptcioV}yek)g(@5-y&||g~#PHMnV@R=?ANA~_^7Dm{~~ zUwv`__DyEWMqTvoZA(OC49ws`tTYE~tKfbZxKsD_CyT#~D^|54_wTot2i m%fx`12tbu7bs$tFKBW9YXgxnwM^9N_T}o6!T)g`KZ~PxxI*%s+ literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/sound/spells/sp_implosion_miss.mp3 b/tpdatasrc/tpgamefiles/sound/spells/sp_implosion_miss.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..0960361347bf41e2446cecec9bded23f0f3690c0 GIT binary patch literal 7698 zcmc(kRZyHk)9)8|g6l#S-^D#ZfGq9=cMt9o0wEA2xCNKs?qt#6Zdu$dKnU(3iv-;h z-c#>ab*|3k*Hu%`RL#Zwru#qDPfsHeK?8vQnt_9>-M{&>e*+8v(31dgammSnKp+zn zJ3BisuZW0y2?+`5={Y$$MMdT1 zgMMD{{HFd#l^+#E%M3!?WLhAr6wo9&Bx1&?)qO8 za%^UFbOr#*&nFJdZ$5YbUHJcek%;^O0D&T^x;Yd8h|3qxFfC3aa)0g%(%3_%Fu8F@ zVof5k`hUwjnj+yqBoa(jvWfgHbN}kTEJgIb`$mECS!IxoSDISs!gpph0FAUH^*A28 zM=E(%)ZPWSW128{sP77#7cW9F6{>v|1=S)A?$=US&A^ zr4;US;1e6I#S zTd5RYWSOVmIK8q?@2cJ02%PY_-O@Rq#Ry$k@zV2u|7#%GDzKX?xP^M96ZSbzxECsZ zh@-CJU@s+ukz?Uqx4 zS$7Izmr16-vQ4%JWt{&)BUH7fEoGlgbU>?euLA8b_-Fzp#6?%%(+6}|iAvYKxrLiWH#U}xK z<0oty$chg|q1RJlQ>g)V(59cxGtbGN79=@4mLn8dR;^aHcZLTn+R8-oH)LXsdf@Oh$ zoilq>!@P4FJL&N!$==ri+b+wA#CF&b?AKl{S

p-`#wstZC0&+GFoKCGoOd%(%eF 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 literal 0 HcmV?d00001 diff --git a/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes b/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes index cd2a17d99..3917d2286 100644 --- a/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes +++ b/tpdatasrc/tpgamefiles/sound/user_sounds/tpsounds.mes @@ -42,6 +42,10 @@ {9006}{} // spell projectile in-flight {9007}{spells\sp_enervation_hit.wav} // spell hit +// [242] *[Implosion] +{10847}{spells\sp_implosion_hit.mp3} // hit +{10849}{spells\sp_implosion_miss.mp3} // miss + // 590: Disrupting Weapon {17800} {} // begin {17801} {} // end