From 51caa0b663a1d3456057b1206756f64ec9d60eab Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sun, 4 Aug 2024 11:24:09 -0700 Subject: [PATCH 001/162] fix Wrack spell description from 1d8 to 1d6 --- .../Translations/de/Spells/Cantrips-de.txt | 2 +- .../Translations/en/Spells/Cantrips-en.txt | 2 +- .../Translations/es/Spells/Cantrips-es.txt | 2 +- .../Translations/fr/Spells/Cantrips-fr.txt | 2 +- .../Translations/it/Spells/Cantrips-it.txt | 2 +- .../Translations/ja/Spells/Cantrips-ja.txt | 2 +- .../Translations/ko/Spells/Cantrips-ko.txt | 2 +- .../Translations/pt-BR/Spells/Cantrips-pt-BR.txt | 2 +- .../Translations/ru/Spells/Cantrips-ru.txt | 2 +- .../Translations/zh-CN/Spells/Cantrips-zh-CN.txt | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt index 38031815dc..767d83822b 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Erzeuge einen donnernden Lärm, der neben dir st Spell/&ThunderStrikeTitle=Donnerschlag Spell/&TollTheDeadDescription=Du zeigst auf eine Kreatur, die du in Reichweite siehst, und der Klang einer schmerzlichen Glocke erfüllt für einen Moment die Luft um sie herum. Das Ziel muss einen Weisheitsrettungswurf bestehen oder erleidet 1W8 nekrotischen Schaden. Wenn dem Ziel einer seiner Trefferpunkte fehlt, erleidet es stattdessen 1W12 nekrotischen Schaden. Spell/&TollTheDeadTitle=Die Totenglocke -Spell/&WrackDescription=Entfesseln Sie eine Welle lähmenden Schmerzes auf eine Kreatur in Reichweite. Das Ziel muss einen Konstitutionsrettungswurf machen oder erleidet 1W8 nekrotischen Schaden und kann nicht davonstürmen oder sich lösen. +Spell/&WrackDescription=Entfesseln Sie eine Welle lähmenden Schmerzes auf eine Kreatur in Reichweite. Das Ziel muss einen Konstitutionsrettungswurf machen oder erleidet 1W6 nekrotischen Schaden und kann nicht davonstürmen oder sich lösen. Spell/&WrackTitle=Wrack diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt index 53ead10681..13a9cbce25 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Create a burst of thundering sound, forcing crea Spell/&ThunderStrikeTitle=Thunderclap Spell/&TollTheDeadDescription=You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d8 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. Spell/&TollTheDeadTitle=Toll the Dead -Spell/&WrackDescription=Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d8 necrotic damage, and preventing them from dashing or disengaging. +Spell/&WrackDescription=Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d6 necrotic damage, and preventing them from dashing or disengaging. Spell/&WrackTitle=Wrack diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt index 90aaedb007..e994b88d90 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Crea una ráfaga de sonido atronador que obliga Spell/&ThunderStrikeTitle=Tronido Spell/&TollTheDeadDescription=Señalas a una criatura que puedas ver dentro del alcance y el sonido de una campana dolorosa llena el aire a su alrededor por un momento. El objetivo debe superar una tirada de salvación de Sabiduría o sufrirá 1d8 puntos de daño necrótico. Si al objetivo le falta alguno de sus puntos de golpe, sufre 1d12 puntos de daño necrótico. Spell/&TollTheDeadTitle=Cuenta de muertos -Spell/&WrackDescription=Desata una ola de dolor paralizante contra una criatura que se encuentre dentro del alcance. El objetivo debe realizar una tirada de salvación de Constitución o sufrir 1d8 puntos de daño necrótico, lo que le impide correr o retirarse. +Spell/&WrackDescription=Desata una ola de dolor paralizante contra una criatura que se encuentre dentro del alcance. El objetivo debe realizar una tirada de salvación de Constitución o sufrir 1d6 puntos de daño necrótico, lo que le impide correr o retirarse. Spell/&WrackTitle=Estante diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt index dda95bd305..1ca3ba42eb 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Créez une explosion de bruit de tonnerre, forç Spell/&ThunderStrikeTitle=Coup de tonnerre Spell/&TollTheDeadDescription=Vous désignez une créature que vous pouvez voir à portée, et le son d'une cloche douloureuse emplit l'air autour d'elle pendant un moment. La cible doit réussir un jet de sauvegarde de Sagesse ou subir 1d8 dégâts nécrotiques. Si la cible n'a plus aucun point de vie, elle subit à la place 1d12 dégâts nécrotiques. Spell/&TollTheDeadTitle=Faire le bilan des morts -Spell/&WrackDescription=Déchaîne une vague de douleur paralysante sur une créature à portée. La cible doit réussir un jet de sauvegarde de Constitution ou subir 1d8 dégâts nécrotiques, ce qui l'empêche de foncer ou de se désengager. +Spell/&WrackDescription=Déchaîne une vague de douleur paralysante sur une créature à portée. La cible doit réussir un jet de sauvegarde de Constitution ou subir 1d6 dégâts nécrotiques, ce qui l'empêche de foncer ou de se désengager. Spell/&WrackTitle=Varech diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt index f1c9561039..06caafc38b 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Crea un'esplosione di suono fragoroso, costringe Spell/&ThunderStrikeTitle=Tuono Spell/&TollTheDeadDescription=Indichi una creatura che puoi vedere entro il raggio d'azione e il suono di una campana dolorosa riempie l'aria attorno a essa per un momento. Il bersaglio deve superare un tiro salvezza su Saggezza o subire 1d8 danni necrotici. Se il bersaglio perde uno qualsiasi dei suoi punti ferita, subisce invece 1d12 danni necrotici. Spell/&TollTheDeadTitle=Suonare i morti -Spell/&WrackDescription=Scatena un'ondata di dolore paralizzante contro una creatura entro il raggio d'azione. Il bersaglio deve effettuare un tiro salvezza su Costituzione o subire 1d8 danni necrotici, impedendogli di scattare o disimpegnarsi. +Spell/&WrackDescription=Scatena un'ondata di dolore paralizzante contro una creatura entro il raggio d'azione. Il bersaglio deve effettuare un tiro salvezza su Costituzione o subire 1d6 danni necrotici, impedendogli di scattare o disimpegnarsi. Spell/&WrackTitle=Relitto diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt index 0101a1f5da..f672130f96 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=雷鳴のバーストを発生させ、あなた Spell/&ThunderStrikeTitle=雷鳴 Spell/&TollTheDeadDescription=範囲内に見える 1 匹の生き物を指さすと、悲痛な鐘の音が一瞬その周囲の空気を満たします。ターゲットは知恵のセーヴィング・スローに成功するか、1d8の壊死ダメージを受ける必要がある。ターゲットがヒット ポイントを失った場合、代わりに 1d12 の壊死ダメージを受けます。 Spell/&TollTheDeadTitle=トール・ザ・デッド -Spell/&WrackDescription=範囲内のクリーチャーに壊滅的な痛みの波を放ちます。ターゲットは憲法セーヴィングスローを行うか、1d8の壊死ダメージを受け、ダッシュや離脱を阻止しなければならない。 +Spell/&WrackDescription=範囲内のクリーチャーに壊滅的な痛みの波を放ちます。ターゲットは憲法セーヴィングスローを行うか、1d6の壊死ダメージを受け、ダッシュや離脱を阻止しなければならない。 Spell/&WrackTitle=ひび割れ diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt index a56c63dabc..20dd8d7372 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=천둥소리를 터뜨려 주변 생물이 건 Spell/&ThunderStrikeTitle=천둥소리 Spell/&TollTheDeadDescription=범위 내에서 볼 수 있는 생물 하나를 가리키면, 비통한 종소리가 잠시 그 주변 공기를 가득 채웁니다. 대상은 지혜 내성굴림에 성공하거나 1d8의 괴사 피해를 입어야 합니다. 대상의 체력이 하나라도 손실되면 대신 1d12의 괴사 피해를 입습니다. Spell/&TollTheDeadTitle=망자에게 알리다 -Spell/&WrackDescription=범위 내에 있는 생물에게 극심한 고통을 퍼붓습니다. 대상은 건강 내성 굴림을 하거나 1d8의 괴사 피해를 입어야 하며 돌진하거나 이탈하는 것을 방지해야 합니다. +Spell/&WrackDescription=범위 내에 있는 생물에게 극심한 고통을 퍼붓습니다. 대상은 건강 내성 굴림을 하거나 1d6의 괴사 피해를 입어야 하며 돌진하거나 이탈하는 것을 방지해야 합니다. Spell/&WrackTitle=난파선 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt index cf04d2b59d..aa76325ff7 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Cria uma explosão de som trovejante, forçando Spell/&ThunderStrikeTitle=Trovão Spell/&TollTheDeadDescription=Você aponta para uma criatura que você pode ver dentro do alcance, e o som de um sino doloroso preenche o ar ao redor dela por um momento. O alvo deve ter sucesso em um teste de resistência de Sabedoria ou sofrer 1d8 de dano necrótico. Se o alvo estiver sem nenhum de seus pontos de vida, ele sofre 1d12 de dano necrótico. Spell/&TollTheDeadTitle=Tocar o pedágio dos mortos -Spell/&WrackDescription=Desencadeia uma onda de dor paralisante em uma criatura dentro do alcance. O alvo deve fazer um teste de resistência de Constituição ou sofrer 1d8 de dano necrótico, e impedindo-o de correr ou se desvencilhar. +Spell/&WrackDescription=Desencadeia uma onda de dor paralisante em uma criatura dentro do alcance. O alvo deve fazer um teste de resistência de Constituição ou sofrer 1d6 de dano necrótico, e impedindo-o de correr ou se desvencilhar. Spell/&WrackTitle=Destruição diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt index 86fd680323..bc6842b9f1 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=Создайте взрыв громоподоб Spell/&ThunderStrikeTitle=Раскат грома Spell/&TollTheDeadDescription=Вы указываете на одно существо, которое можете видеть в пределах дистанции, и воздух вокруг него на мгновение наполняется скорбным звучанием колокола. Цель должна преуспеть в спасброске Мудрости, иначе получит 1d8 урона некротической энергией. Если хиты цели были не полные, то вместо 1d8 она получает 1d12 урона некротической энергией. Spell/&TollTheDeadTitle=Погребальный звон -Spell/&WrackDescription=Извергните волну мучительной боли на существо в радиусе действия. Цель должна пройти спасбросок Телосложения или получить 1d8 некротического урона и лишиться возможности совершать рывок или отход. +Spell/&WrackDescription=Извергните волну мучительной боли на существо в радиусе действия. Цель должна пройти спасбросок Телосложения или получить 1d6 некротического урона и лишиться возможности совершать рывок или отход. Spell/&WrackTitle=Мучение diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt index 901d87e19c..f8f13f6169 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt @@ -57,5 +57,5 @@ Spell/&ThunderStrikeDescription=发出一阵雷鸣般的声音,迫使与你相 Spell/&ThunderStrikeTitle=鸣雷破 Spell/&TollTheDeadDescription=你指向一个处于距离内、你能看见的生物,一阵哀痛的铃声在空中鸣响。目标必须通过一次感知豁免检定,否则受到 1d8 点黯蚀伤害。若目标失去了任何量的生命值,它改为受到 1d12 点黯蚀伤害。 Spell/&TollTheDeadTitle=亡者丧钟 -Spell/&WrackDescription=对范围内的一个生物释放一波极度痛苦。目标必须进行一次体质豁免检定,否则将受到 1d8 黯蚀伤害,并阻止他们疾走或撤离。 +Spell/&WrackDescription=对范围内的一个生物释放一波极度痛苦。目标必须进行一次体质豁免检定,否则将受到 1d6 黯蚀伤害,并阻止他们疾走或撤离。 Spell/&WrackTitle=折磨术 From 576f04b38eb9993cb33b2470bc94ab04c2482990 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sun, 4 Aug 2024 11:26:11 -0700 Subject: [PATCH 002/162] fix Toll the Dead spell description from 1d8 to 1d6 --- .../Translations/de/Spells/Cantrips-de.txt | 2 +- .../Translations/en/Spells/Cantrips-en.txt | 2 +- .../Translations/es/Spells/Cantrips-es.txt | 2 +- .../Translations/fr/Spells/Cantrips-fr.txt | 2 +- .../Translations/it/Spells/Cantrips-it.txt | 2 +- .../Translations/ja/Spells/Cantrips-ja.txt | 2 +- .../Translations/ko/Spells/Cantrips-ko.txt | 2 +- .../Translations/pt-BR/Spells/Cantrips-pt-BR.txt | 2 +- .../Translations/ru/Spells/Cantrips-ru.txt | 2 +- .../Translations/zh-CN/Spells/Cantrips-zh-CN.txt | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt index 767d83822b..c6bd4c072b 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Cantrips-de.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Du erschaffst eine lange, peitschenartige Ranke, d Spell/&ThornyVinesTitle=Dornenpeitsche Spell/&ThunderStrikeDescription=Erzeuge einen donnernden Lärm, der neben dir stehende Kreaturen zu einem Rettungswurf für Konstitution zwingt oder ihnen 1W6 Donnerschaden zufügt.\nDer Schaden dieses Zaubers erhöht sich um 1W6, wenn du die 5. Stufe (2W6), die 11. Stufe (3W6) und die 17. Stufe (4W6) erreichst. Spell/&ThunderStrikeTitle=Donnerschlag -Spell/&TollTheDeadDescription=Du zeigst auf eine Kreatur, die du in Reichweite siehst, und der Klang einer schmerzlichen Glocke erfüllt für einen Moment die Luft um sie herum. Das Ziel muss einen Weisheitsrettungswurf bestehen oder erleidet 1W8 nekrotischen Schaden. Wenn dem Ziel einer seiner Trefferpunkte fehlt, erleidet es stattdessen 1W12 nekrotischen Schaden. +Spell/&TollTheDeadDescription=Du zeigst auf eine Kreatur, die du in Reichweite siehst, und der Klang einer schmerzlichen Glocke erfüllt für einen Moment die Luft um sie herum. Das Ziel muss einen Weisheitsrettungswurf bestehen oder erleidet 1W6 nekrotischen Schaden. Wenn dem Ziel einer seiner Trefferpunkte fehlt, erleidet es stattdessen 1W12 nekrotischen Schaden. Spell/&TollTheDeadTitle=Die Totenglocke Spell/&WrackDescription=Entfesseln Sie eine Welle lähmenden Schmerzes auf eine Kreatur in Reichweite. Das Ziel muss einen Konstitutionsrettungswurf machen oder erleidet 1W6 nekrotischen Schaden und kann nicht davonstürmen oder sich lösen. Spell/&WrackTitle=Wrack diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt index 13a9cbce25..91bb787b43 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Cantrips-en.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=You create a long, whip-like vine covered in thorn Spell/&ThornyVinesTitle=Thorn Whip Spell/&ThunderStrikeDescription=Create a burst of thundering sound, forcing creatures adjacent to you to make a Constitution saving throw or take 1d6 thunder damage.\nThis spell's damage increases by 1d6 when you reach 5th level (2d6), 11th level (3d6), and 17th level (4d6). Spell/&ThunderStrikeTitle=Thunderclap -Spell/&TollTheDeadDescription=You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d8 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. +Spell/&TollTheDeadDescription=You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d6 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. Spell/&TollTheDeadTitle=Toll the Dead Spell/&WrackDescription=Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d6 necrotic damage, and preventing them from dashing or disengaging. Spell/&WrackTitle=Wrack diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt index e994b88d90..4bf0a60ac9 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Cantrips-es.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Creas una enredadera larga con forma de látigo cu Spell/&ThornyVinesTitle=Látigo de espinas Spell/&ThunderStrikeDescription=Crea una ráfaga de sonido atronador que obliga a las criaturas adyacentes a ti a realizar una tirada de salvación de Constitución o sufrir 1d6 de daño por trueno.\nEl daño de este hechizo aumenta en 1d6 cuando alcanzas el nivel 5 (2d6), el nivel 11 (3d6) y el nivel 17 (4d6). Spell/&ThunderStrikeTitle=Tronido -Spell/&TollTheDeadDescription=Señalas a una criatura que puedas ver dentro del alcance y el sonido de una campana dolorosa llena el aire a su alrededor por un momento. El objetivo debe superar una tirada de salvación de Sabiduría o sufrirá 1d8 puntos de daño necrótico. Si al objetivo le falta alguno de sus puntos de golpe, sufre 1d12 puntos de daño necrótico. +Spell/&TollTheDeadDescription=Señalas a una criatura que puedas ver dentro del alcance y el sonido de una campana dolorosa llena el aire a su alrededor por un momento. El objetivo debe superar una tirada de salvación de Sabiduría o sufrirá 1d6 puntos de daño necrótico. Si al objetivo le falta alguno de sus puntos de golpe, sufre 1d12 puntos de daño necrótico. Spell/&TollTheDeadTitle=Cuenta de muertos Spell/&WrackDescription=Desata una ola de dolor paralizante contra una criatura que se encuentre dentro del alcance. El objetivo debe realizar una tirada de salvación de Constitución o sufrir 1d6 puntos de daño necrótico, lo que le impide correr o retirarse. Spell/&WrackTitle=Estante diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt index 1ca3ba42eb..b95b3204c9 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Cantrips-fr.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Vous créez une longue vigne semblable à un fouet Spell/&ThornyVinesTitle=Fouet d'épine Spell/&ThunderStrikeDescription=Créez une explosion de bruit de tonnerre, forçant les créatures adjacentes à vous à effectuer un jet de sauvegarde de Constitution ou à subir 1d6 dégâts de tonnerre.\nLes dégâts de ce sort augmentent de 1d6 lorsque vous atteignez le niveau 5 (2d6), le niveau 11 (3d6) et le 17e. niveau (4d6). Spell/&ThunderStrikeTitle=Coup de tonnerre -Spell/&TollTheDeadDescription=Vous désignez une créature que vous pouvez voir à portée, et le son d'une cloche douloureuse emplit l'air autour d'elle pendant un moment. La cible doit réussir un jet de sauvegarde de Sagesse ou subir 1d8 dégâts nécrotiques. Si la cible n'a plus aucun point de vie, elle subit à la place 1d12 dégâts nécrotiques. +Spell/&TollTheDeadDescription=Vous désignez une créature que vous pouvez voir à portée, et le son d'une cloche douloureuse emplit l'air autour d'elle pendant un moment. La cible doit réussir un jet de sauvegarde de Sagesse ou subir 1d6 dégâts nécrotiques. Si la cible n'a plus aucun point de vie, elle subit à la place 1d12 dégâts nécrotiques. Spell/&TollTheDeadTitle=Faire le bilan des morts Spell/&WrackDescription=Déchaîne une vague de douleur paralysante sur une créature à portée. La cible doit réussir un jet de sauvegarde de Constitution ou subir 1d6 dégâts nécrotiques, ce qui l'empêche de foncer ou de se désengager. Spell/&WrackTitle=Varech diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt index 06caafc38b..54020fe851 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Cantrips-it.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Crei un lungo tralcio simile a una frusta ricopert Spell/&ThornyVinesTitle=Frusta di spina Spell/&ThunderStrikeDescription=Crea un'esplosione di suono fragoroso, costringendo le creature adiacenti a te a effettuare un tiro salvezza su Costituzione o a subire 1d6 danni da tuono.\nIl danno di questo incantesimo aumenta di 1d6 quando raggiungi il 5° livello (2d6), l'11° livello (3d6) e il 17° livello (4d6). Spell/&ThunderStrikeTitle=Tuono -Spell/&TollTheDeadDescription=Indichi una creatura che puoi vedere entro il raggio d'azione e il suono di una campana dolorosa riempie l'aria attorno a essa per un momento. Il bersaglio deve superare un tiro salvezza su Saggezza o subire 1d8 danni necrotici. Se il bersaglio perde uno qualsiasi dei suoi punti ferita, subisce invece 1d12 danni necrotici. +Spell/&TollTheDeadDescription=Indichi una creatura che puoi vedere entro il raggio d'azione e il suono di una campana dolorosa riempie l'aria attorno a essa per un momento. Il bersaglio deve superare un tiro salvezza su Saggezza o subire 1d6 danni necrotici. Se il bersaglio perde uno qualsiasi dei suoi punti ferita, subisce invece 1d12 danni necrotici. Spell/&TollTheDeadTitle=Suonare i morti Spell/&WrackDescription=Scatena un'ondata di dolore paralizzante contro una creatura entro il raggio d'azione. Il bersaglio deve effettuare un tiro salvezza su Costituzione o subire 1d6 danni necrotici, impedendogli di scattare o disimpegnarsi. Spell/&WrackTitle=Relitto diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt index f672130f96..2a73c978ad 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Cantrips-ja.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=あなたはとげに覆われた長い鞭のよ Spell/&ThornyVinesTitle=とげの鞭 Spell/&ThunderStrikeDescription=雷鳴のバーストを発生させ、あなたに隣接するクリーチャーに憲法セーヴィング・スローをさせるか、1d6 の雷ダメージを受けるように強制します。\nこの呪文のダメージは、あなたが 5 レベル (2d6)、11 レベル (3d6)、17 レベルに達すると 1d6 ずつ増加します。レベル(4d6)。 Spell/&ThunderStrikeTitle=雷鳴 -Spell/&TollTheDeadDescription=範囲内に見える 1 匹の生き物を指さすと、悲痛な鐘の音が一瞬その周囲の空気を満たします。ターゲットは知恵のセーヴィング・スローに成功するか、1d8の壊死ダメージを受ける必要がある。ターゲットがヒット ポイントを失った場合、代わりに 1d12 の壊死ダメージを受けます。 +Spell/&TollTheDeadDescription=範囲内に見える 1 匹の生き物を指さすと、悲痛な鐘の音が一瞬その周囲の空気を満たします。ターゲットは知恵のセーヴィング・スローに成功するか、1d6の壊死ダメージを受ける必要がある。ターゲットがヒット ポイントを失った場合、代わりに 1d12 の壊死ダメージを受けます。 Spell/&TollTheDeadTitle=トール・ザ・デッド Spell/&WrackDescription=範囲内のクリーチャーに壊滅的な痛みの波を放ちます。ターゲットは憲法セーヴィングスローを行うか、1d6の壊死ダメージを受け、ダッシュや離脱を阻止しなければならない。 Spell/&WrackTitle=ひび割れ diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt index 20dd8d7372..ed002b9a54 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Cantrips-ko.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=당신은 가시로 뒤덮인 길고 채찍 같은 Spell/&ThornyVinesTitle=가시채찍 Spell/&ThunderStrikeDescription=천둥소리를 터뜨려 주변 생물이 건강 내성 굴림을 하게 하거나 1d6 천둥 피해를 입게 만듭니다.\n이 주문의 피해는 5레벨(2d6), 11레벨(3d6), 17레벨에 도달하면 1d6씩 증가합니다. 레벨(4d6). Spell/&ThunderStrikeTitle=천둥소리 -Spell/&TollTheDeadDescription=범위 내에서 볼 수 있는 생물 하나를 가리키면, 비통한 종소리가 잠시 그 주변 공기를 가득 채웁니다. 대상은 지혜 내성굴림에 성공하거나 1d8의 괴사 피해를 입어야 합니다. 대상의 체력이 하나라도 손실되면 대신 1d12의 괴사 피해를 입습니다. +Spell/&TollTheDeadDescription=범위 내에서 볼 수 있는 생물 하나를 가리키면, 비통한 종소리가 잠시 그 주변 공기를 가득 채웁니다. 대상은 지혜 내성굴림에 성공하거나 1d6의 괴사 피해를 입어야 합니다. 대상의 체력이 하나라도 손실되면 대신 1d12의 괴사 피해를 입습니다. Spell/&TollTheDeadTitle=망자에게 알리다 Spell/&WrackDescription=범위 내에 있는 생물에게 극심한 고통을 퍼붓습니다. 대상은 건강 내성 굴림을 하거나 1d6의 괴사 피해를 입어야 하며 돌진하거나 이탈하는 것을 방지해야 합니다. Spell/&WrackTitle=난파선 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt index aa76325ff7..e42169570a 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Cantrips-pt-BR.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Você cria uma longa videira em forma de chicote c Spell/&ThornyVinesTitle=Chicote de Espinho Spell/&ThunderStrikeDescription=Cria uma explosão de som trovejante, forçando criaturas adjacentes a você a fazer um teste de resistência de Constituição ou sofrer 1d6 de dano de trovão.\nO dano desta magia aumenta em 1d6 quando você alcança o 5º nível (2d6), 11º nível (3d6) e 17º nível (4d6). Spell/&ThunderStrikeTitle=Trovão -Spell/&TollTheDeadDescription=Você aponta para uma criatura que você pode ver dentro do alcance, e o som de um sino doloroso preenche o ar ao redor dela por um momento. O alvo deve ter sucesso em um teste de resistência de Sabedoria ou sofrer 1d8 de dano necrótico. Se o alvo estiver sem nenhum de seus pontos de vida, ele sofre 1d12 de dano necrótico. +Spell/&TollTheDeadDescription=Você aponta para uma criatura que você pode ver dentro do alcance, e o som de um sino doloroso preenche o ar ao redor dela por um momento. O alvo deve ter sucesso em um teste de resistência de Sabedoria ou sofrer 1d6 de dano necrótico. Se o alvo estiver sem nenhum de seus pontos de vida, ele sofre 1d12 de dano necrótico. Spell/&TollTheDeadTitle=Tocar o pedágio dos mortos Spell/&WrackDescription=Desencadeia uma onda de dor paralisante em uma criatura dentro do alcance. O alvo deve fazer um teste de resistência de Constituição ou sofrer 1d6 de dano necrótico, e impedindo-o de correr ou se desvencilhar. Spell/&WrackTitle=Destruição diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt index bc6842b9f1..c83a4d4c50 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Cantrips-ru.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=Вы создаёте длинный, похожи Spell/&ThornyVinesTitle=Терновый кнут Spell/&ThunderStrikeDescription=Создайте взрыв громоподобного звука, заставляющий существ, находящихся рядом с вами, совершить спасбросок Телосложения или получить 1d6 урона звуком.\nУрон этого заклинания увеличивается на 1d6, когда вы достигаете 5-го уровня (2d6), 11-го уровня (3d6) и 17-го уровня (4d6). Spell/&ThunderStrikeTitle=Раскат грома -Spell/&TollTheDeadDescription=Вы указываете на одно существо, которое можете видеть в пределах дистанции, и воздух вокруг него на мгновение наполняется скорбным звучанием колокола. Цель должна преуспеть в спасброске Мудрости, иначе получит 1d8 урона некротической энергией. Если хиты цели были не полные, то вместо 1d8 она получает 1d12 урона некротической энергией. +Spell/&TollTheDeadDescription=Вы указываете на одно существо, которое можете видеть в пределах дистанции, и воздух вокруг него на мгновение наполняется скорбным звучанием колокола. Цель должна преуспеть в спасброске Мудрости, иначе получит 1d6 урона некротической энергией. Если хиты цели были не полные, то вместо 1d8 она получает 1d12 урона некротической энергией. Spell/&TollTheDeadTitle=Погребальный звон Spell/&WrackDescription=Извергните волну мучительной боли на существо в радиусе действия. Цель должна пройти спасбросок Телосложения или получить 1d6 некротического урона и лишиться возможности совершать рывок или отход. Spell/&WrackTitle=Мучение diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt index f8f13f6169..b308d07576 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Cantrips-zh-CN.txt @@ -55,7 +55,7 @@ Spell/&ThornyVinesDescription=你创造出一根长长的、鞭子般的藤蔓 Spell/&ThornyVinesTitle=荆棘之鞭 Spell/&ThunderStrikeDescription=发出一阵雷鸣般的声音,迫使与你相邻的生物进行体质豁免检定,否则将受到 1d6 雷鸣伤害。\n当你达到第 5 级 (2d6)、第 11 级 (3d6) 和第 17 级(4d6)时,该法术的伤害再增加 1d6。 Spell/&ThunderStrikeTitle=鸣雷破 -Spell/&TollTheDeadDescription=你指向一个处于距离内、你能看见的生物,一阵哀痛的铃声在空中鸣响。目标必须通过一次感知豁免检定,否则受到 1d8 点黯蚀伤害。若目标失去了任何量的生命值,它改为受到 1d12 点黯蚀伤害。 +Spell/&TollTheDeadDescription=你指向一个处于距离内、你能看见的生物,一阵哀痛的铃声在空中鸣响。目标必须通过一次感知豁免检定,否则受到 1d6 点黯蚀伤害。若目标失去了任何量的生命值,它改为受到 1d12 点黯蚀伤害。 Spell/&TollTheDeadTitle=亡者丧钟 Spell/&WrackDescription=对范围内的一个生物释放一波极度痛苦。目标必须进行一次体质豁免检定,否则将受到 1d6 黯蚀伤害,并阻止他们疾走或撤离。 Spell/&WrackTitle=折磨术 From 339ac5f46ae6f3f366b1a70e96a5644d8484d012 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sun, 4 Aug 2024 12:48:38 -0700 Subject: [PATCH 003/162] prefer EmptyContent instead of NoLocalization on conditions that don't require a description --- ...esentation-InvalidSyntaxTranslation-en.txt | 69 +++++++++++++++++++ .../ConditionBladeDancerBladeDance.json | 2 +- .../ConditionBladeDancerDanceOfDefense.json | 2 +- .../ConditionBorrowedKnowledgeAcrobatics.json | 2 +- ...ditionBorrowedKnowledgeAnimalHandling.json | 2 +- .../ConditionBorrowedKnowledgeArcana.json | 2 +- .../ConditionBorrowedKnowledgeAthletics.json | 2 +- .../ConditionBorrowedKnowledgeDeception.json | 2 +- .../ConditionBorrowedKnowledgeHistory.json | 2 +- .../ConditionBorrowedKnowledgeInsight.json | 2 +- ...onditionBorrowedKnowledgeIntimidation.json | 2 +- ...nditionBorrowedKnowledgeInvestigation.json | 2 +- .../ConditionBorrowedKnowledgeMedecine.json | 2 +- .../ConditionBorrowedKnowledgeNature.json | 2 +- .../ConditionBorrowedKnowledgePerception.json | 2 +- ...ConditionBorrowedKnowledgePerformance.json | 2 +- .../ConditionBorrowedKnowledgePersuasion.json | 2 +- .../ConditionBorrowedKnowledgeReligion.json | 2 +- ...nditionBorrowedKnowledgeSleightOfHand.json | 2 +- .../ConditionBorrowedKnowledgeStealth.json | 2 +- .../ConditionBorrowedKnowledgeSurvival.json | 2 +- .../ConditionChaosBoltLeap.json | 2 +- ...onCircleOfTheWildfireSpiritAttackRoll.json | 2 +- ...onCircleOfTheWildfireSpiritDamageRoll.json | 2 +- ...ionCircleOfTheWildfireSpiritHitPoints.json | 2 +- ...ditionCollegeOfAudacityDefensiveWhirl.json | 2 +- ...ditionCollegeOfEleganceAmazingDisplay.json | 2 +- ...ConditionEmpoweredKnowledgeAcrobatics.json | 2 +- ...itionEmpoweredKnowledgeAnimalHandling.json | 2 +- .../ConditionEmpoweredKnowledgeArcana.json | 2 +- .../ConditionEmpoweredKnowledgeAthletics.json | 2 +- .../ConditionEmpoweredKnowledgeDeception.json | 2 +- .../ConditionEmpoweredKnowledgeHistory.json | 2 +- .../ConditionEmpoweredKnowledgeInsight.json | 2 +- ...nditionEmpoweredKnowledgeIntimidation.json | 2 +- ...ditionEmpoweredKnowledgeInvestigation.json | 2 +- .../ConditionEmpoweredKnowledgeMedecine.json | 2 +- .../ConditionEmpoweredKnowledgeNature.json | 2 +- ...ConditionEmpoweredKnowledgePerception.json | 2 +- ...onditionEmpoweredKnowledgePerformance.json | 2 +- ...ConditionEmpoweredKnowledgePersuasion.json | 2 +- .../ConditionEmpoweredKnowledgeReligion.json | 2 +- ...ditionEmpoweredKnowledgeSleightOfHand.json | 2 +- .../ConditionEmpoweredKnowledgeStealth.json | 2 +- .../ConditionEmpoweredKnowledgeSurvival.json | 2 +- .../ConditionFeatDungeonDelver.json | 2 +- .../ConditionFeatMageSlayer.json | 2 +- ...ConditionInnovationVitriolistCorroded.json | 2 +- ...onSummonSteelDefenderProficiencyBonus.json | 2 +- ...nWeaponSummonSteelDefenderSpellAttack.json | 2 +- ...nditionPatronMountainClingingStrength.json | 2 +- ...onditionRangerSkyWarriorGiftOfTheWind.json | 2 +- ...gerWildMasterBeastCompanionArmorClass.json | 2 +- ...gerWildMasterBeastCompanionAttackRoll.json | 2 +- ...gerWildMasterBeastCompanionDamageRoll.json | 2 +- ...ngerWildMasterBeastCompanionHitPoints.json | 2 +- .../ConditionRogueCunningStrikeDisarmed.json | 2 +- .../ConditionRogueDeviousStrikeKnockOut.json | 2 +- .../ConditionShelterFromEnergyDamageAcid.json | 2 +- .../ConditionShelterFromEnergyDamageCold.json | 2 +- .../ConditionShelterFromEnergyDamageFire.json | 2 +- ...itionShelterFromEnergyDamageLightning.json | 2 +- ...ditionShelterFromEnergyDamageNecrotic.json | 2 +- ...nditionShelterFromEnergyDamageRadiant.json | 2 +- ...nditionShelterFromEnergyDamageThunder.json | 2 +- .../ConditionSoulExpulsionCombatAffinity.json | 2 +- ...itionSoulExpulsionSavingThrowAffinity.json | 2 +- .../ConditionStrikeWithTheWindMovement.json | 2 +- .../ConditionSynapticStatic.json | 2 +- .../ConditionThunderousSmite.json | 2 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 4 +- .../Models/CharacterUAContext.cs | 4 +- .../Spells/SpellBuildersLevel01.cs | 8 +-- .../Spells/SpellBuildersLevel02.cs | 4 +- .../Spells/SpellBuildersLevel05.cs | 4 +- .../Spells/SpellBuildersLevel06.cs | 19 ++--- .../Spells/SpellBuildersLevel08.cs | 4 +- .../Subclasses/CircleOfTheWildfire.cs | 6 +- .../Subclasses/CollegeOfAudacity.cs | 2 +- .../Subclasses/CollegeOfElegance.cs | 2 +- .../Subclasses/InnovationVitriolist.cs | 2 +- .../Subclasses/InnovationWeapon.cs | 4 +- .../Subclasses/PatronMountain.cs | 2 +- .../Subclasses/RangerSkyWarrior.cs | 4 +- .../Subclasses/RangerWildMaster.cs | 8 +-- .../Subclasses/WizardBladeDancer.cs | 2 +- 86 files changed, 178 insertions(+), 108 deletions(-) diff --git a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt index db4c84c634..78e91c3b61 100644 --- a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt +++ b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt @@ -116,6 +116,8 @@ ConditionAshardalonStride6 Description='-'. ConditionAshardalonStride7 Description='-'. ConditionAshardalonStride8 Description='-'. ConditionAshardalonStride9 Description='-'. +ConditionBladeDancerBladeDance Description='-'. +ConditionBladeDancerDanceOfDefense Description='-'. ConditionBlindedByCloudKill Title='Blinded by Cloudkill'. ConditionBlindedByDarkness Title='Blinded by Darkness'. ConditionBlindedByFogCloud Title='Blinded by Fog Cloud'. @@ -123,6 +125,25 @@ ConditionBlindedByIncendiaryCloud Title='Blinded by Incendiary Cloud'. ConditionBlindedByPetalStorm Title='Blinded by Petal Storm'. ConditionBlindedBySleetStorm Title='Blinded by Sleet Storm'. ConditionBlindedByStinkingCloud Title='Blinded by Stinking Cloud'. +ConditionBorrowedKnowledgeAcrobatics Description='-'. +ConditionBorrowedKnowledgeAnimalHandling Description='-'. +ConditionBorrowedKnowledgeArcana Description='-'. +ConditionBorrowedKnowledgeAthletics Description='-'. +ConditionBorrowedKnowledgeDeception Description='-'. +ConditionBorrowedKnowledgeHistory Description='-'. +ConditionBorrowedKnowledgeInsight Description='-'. +ConditionBorrowedKnowledgeIntimidation Description='-'. +ConditionBorrowedKnowledgeInvestigation Description='-'. +ConditionBorrowedKnowledgeMedecine Description='-'. +ConditionBorrowedKnowledgeNature Description='-'. +ConditionBorrowedKnowledgePerception Description='-'. +ConditionBorrowedKnowledgePerformance Description='-'. +ConditionBorrowedKnowledgePersuasion Description='-'. +ConditionBorrowedKnowledgeReligion Description='-'. +ConditionBorrowedKnowledgeSleightOfHand Description='-'. +ConditionBorrowedKnowledgeStealth Description='-'. +ConditionBorrowedKnowledgeSurvival Description='-'. +ConditionChaosBoltLeap Description='-'. ConditionCircleOfMagicalNegation Description='-'. ConditionCircleOfTheCosmosArcher Description='-'. ConditionCircleOfTheCosmosArcher14 Description='-'. @@ -131,6 +152,11 @@ ConditionCircleOfTheCosmosDragon10 Description='-'. ConditionCircleOfTheCosmosDragon14 Description='-'. ConditionCircleOfTheCosmosWealCosmosOmen Description='-'. ConditionCircleOfTheCosmosWoeCosmosOmen Description='-'. +ConditionCircleOfTheWildfireSpiritAttackRoll Description='-'. +ConditionCircleOfTheWildfireSpiritDamageRoll Description='-'. +ConditionCircleOfTheWildfireSpiritHitPoints Description='-'. +ConditionCollegeOfAudacityDefensiveWhirl Description='-'. +ConditionCollegeOfEleganceAmazingDisplay Description='-'. ConditionCrownOfStars Description='-'. ConditionDistractedByAlly Description='-'. ConditionDraconicTransformation Description='-'. @@ -181,8 +207,28 @@ ConditionElementalistNormalFire Title='Channeling Fire Plane'. ConditionElementalistNormalFire Description='Deal additional Fire damage equal to your proficiency bonus on a first hit each round.'. ConditionElementalistNormalIce Title='Channeling Ice Plane'. ConditionElementalistNormalIce Description='Deal additional Cold damage equal to your proficiency bonus on a first hit each round.'. +ConditionEmpoweredKnowledgeAcrobatics Description='-'. +ConditionEmpoweredKnowledgeAnimalHandling Description='-'. +ConditionEmpoweredKnowledgeArcana Description='-'. +ConditionEmpoweredKnowledgeAthletics Description='-'. +ConditionEmpoweredKnowledgeDeception Description='-'. +ConditionEmpoweredKnowledgeHistory Description='-'. +ConditionEmpoweredKnowledgeInsight Description='-'. +ConditionEmpoweredKnowledgeIntimidation Description='-'. +ConditionEmpoweredKnowledgeInvestigation Description='-'. +ConditionEmpoweredKnowledgeMedecine Description='-'. +ConditionEmpoweredKnowledgeNature Description='-'. +ConditionEmpoweredKnowledgePerception Description='-'. +ConditionEmpoweredKnowledgePerformance Description='-'. +ConditionEmpoweredKnowledgePersuasion Description='-'. +ConditionEmpoweredKnowledgeReligion Description='-'. +ConditionEmpoweredKnowledgeSleightOfHand Description='-'. +ConditionEmpoweredKnowledgeStealth Description='-'. +ConditionEmpoweredKnowledgeSurvival Description='-'. ConditionFeatAcrobat Description='-'. ConditionFeatCallForCharge Description='-'. +ConditionFeatDungeonDelver Description='-'. +ConditionFeatMageSlayer Description='-'. ConditionFeatSlayTheEnemies1 Description='You have a bonus to attack and damage rolls equal to 1. If your target is a favored enemy, you have advantage instead of attack roll bonus.'. ConditionFeatSlayTheEnemies2 Description='You have a bonus to attack and damage rolls equal to 2. If your target is a favored enemy, you have advantage instead of attack roll bonus.'. ConditionFeatSlayTheEnemies3 Description='You have a bonus to attack and damage rolls equal to 3. If your target is a favored enemy, you have advantage instead of attack roll bonus.'. @@ -193,6 +239,9 @@ ConditionGiftOfTheChromaticDragonDamageFire Description='-'. ConditionGiftOfTheChromaticDragonDamageLightning Description='-'. ConditionGiftOfTheChromaticDragonDamagePoison Description='-'. ConditionHamstringBlow Description='-'. +ConditionInnovationVitriolistCorroded Description='-'. +ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus Description='-'. +ConditionInnovationWeaponSummonSteelDefenderSpellAttack Description='-'. ConditionIntellectFortress Description='-'. ConditionInvocationTombOfFrost Description='-'. ConditionInvulnerability Description='-'. @@ -207,25 +256,45 @@ ConditionMoonlitScionLunarRadianceEnemy Description='-'. ConditionMoonlitScionNewMoon Description='-'. ConditionMoonlitScionNewMoonLunarEmbrace Description='-'. ConditionMoonlitScionNewMoonMidnightBlessing Description='-'. +ConditionPatronMountainClingingStrength Description='-'. ConditionPsionicBlast Description='-'. ConditionRangerGloomStalkerDreadAmbusher Description='-'. +ConditionRangerSkyWarriorGiftOfTheWind Description='-'. +ConditionRangerWildMasterBeastCompanionArmorClass Description='-'. +ConditionRangerWildMasterBeastCompanionAttackRoll Description='-'. +ConditionRangerWildMasterBeastCompanionDamageRoll Description='-'. +ConditionRangerWildMasterBeastCompanionHitPoints Description='-'. ConditionRescueTheDying Description='-'. ConditionResonatingStrike Description='-'. ConditionRingOfBlades Description='-'. +ConditionRogueCunningStrikeDisarmed Description='-'. +ConditionRogueDeviousStrikeKnockOut Description='-'. ConditionShadarKaiTeleport Description='-'. ConditionShelterFromEnergyDamageAcid Title='Acid Damage Resistance'. +ConditionShelterFromEnergyDamageAcid Description='-'. ConditionShelterFromEnergyDamageCold Title='Cold Damage Resistance'. +ConditionShelterFromEnergyDamageCold Description='-'. ConditionShelterFromEnergyDamageFire Title='Fire Damage Resistance'. +ConditionShelterFromEnergyDamageFire Description='-'. ConditionShelterFromEnergyDamageLightning Title='Lightning Damage Resistance'. +ConditionShelterFromEnergyDamageLightning Description='-'. ConditionShelterFromEnergyDamageNecrotic Title='Necrotic Damage Resistance'. +ConditionShelterFromEnergyDamageNecrotic Description='-'. ConditionShelterFromEnergyDamageRadiant Title='Radiant Damage Resistance'. +ConditionShelterFromEnergyDamageRadiant Description='-'. ConditionShelterFromEnergyDamageThunder Title='Thunder Damage Resistance'. +ConditionShelterFromEnergyDamageThunder Description='-'. ConditionSorcerousWildMagicDamageResistance Description='-'. ConditionSorcerousWildMagicLightningStrike Description='-'. ConditionSorcerousWildMagicPiercingVulnerability Description='-'. +ConditionSoulExpulsionCombatAffinity Description='-'. +ConditionSoulExpulsionSavingThrowAffinity Description='-'. ConditionStaggeringBlow Description='-'. ConditionStopMovement Description='-'. +ConditionStrikeWithTheWindMovement Description='-'. +ConditionSynapticStatic Description='-'. ConditionThunderousSmite Title='Thunderous Smite'. +ConditionThunderousSmite Description='-'. ConditionVoidGrasp Description='-'. CraftingManualRecipeEnchantBarbarianClothes_Deflection Title='Enchant Barbarian Clothes of Deflection'. CraftingManualRecipeEnchantBarbarianClothes_FlameDancing Title='Enchant Barbarian Clothes of Flame Dancing'. diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerBladeDance.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerBladeDance.json index 5591e7ef81..42c91203e4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerBladeDance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerBladeDance.json @@ -269,7 +269,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feature/&FeatureSetBladeDancerBladeDanceTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "1a46ee54048826c49a3a039097db1745", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerDanceOfDefense.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerDanceOfDefense.json index ccb9695a05..3be617e083 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerDanceOfDefense.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBladeDancerDanceOfDefense.json @@ -270,7 +270,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feature/&FeatureSetBladeDancerBladeDanceTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "1a46ee54048826c49a3a039097db1745", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAcrobatics.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAcrobatics.json index 80f9bd6d3c..a49bfa04f1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAcrobatics.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAcrobatics.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AcrobaticsTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAnimalHandling.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAnimalHandling.json index 4347c7f618..db99f12d61 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAnimalHandling.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAnimalHandling.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AnimalHandlingTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeArcana.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeArcana.json index c7a88e8731..3d589d9d23 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeArcana.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeArcana.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&ArcanaTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAthletics.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAthletics.json index 750d1b7950..145be0c1f7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAthletics.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeAthletics.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AthleticsTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeDeception.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeDeception.json index 42f13ef07b..46159ed701 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeDeception.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeDeception.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&DeceptionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeHistory.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeHistory.json index 2c3789f6e5..84cdb586a8 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeHistory.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeHistory.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&HistoryTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInsight.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInsight.json index 81e58ba783..0b684d1bf4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInsight.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInsight.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&InsightTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeIntimidation.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeIntimidation.json index 41858649a7..69556f204d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeIntimidation.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeIntimidation.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&IntimidationTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInvestigation.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInvestigation.json index 174ca4a238..65c346367d 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInvestigation.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeInvestigation.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&InvestigationTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeMedecine.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeMedecine.json index c1170c4cfb..d15c12bf62 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeMedecine.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeMedecine.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&MedecineTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeNature.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeNature.json index aecb9234e2..3fa14796ee 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeNature.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeNature.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&NatureTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerception.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerception.json index 96be0676cc..22712f9177 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerception.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerception.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PerceptionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerformance.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerformance.json index 01d7a5f239..a6c9b77ba4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerformance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePerformance.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PerformanceTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePersuasion.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePersuasion.json index 7bab41099d..9256344575 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePersuasion.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgePersuasion.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PersuasionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeReligion.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeReligion.json index 79982117fd..4fb8f3faf3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeReligion.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeReligion.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&ReligionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSleightOfHand.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSleightOfHand.json index 70ac4fc042..ae054f2aab 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSleightOfHand.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSleightOfHand.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&SleightOfHandTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeStealth.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeStealth.json index ccc2debacb..bd47f845e8 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeStealth.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeStealth.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&StealthTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSurvival.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSurvival.json index a218376ed5..6bbb881403 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSurvival.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionBorrowedKnowledgeSurvival.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&SurvivalTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionChaosBoltLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionChaosBoltLeap.json index e076c1a432..deafffe53a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionChaosBoltLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionChaosBoltLeap.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Spell/&ChaosBoltTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritAttackRoll.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritAttackRoll.json index d69de00445..461f02a162 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritAttackRoll.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritAttackRoll.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&SpiritBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritDamageRoll.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritDamageRoll.json index 096336e252..f94313e175 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritDamageRoll.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritDamageRoll.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&SpiritBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritHitPoints.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritHitPoints.json index 69ea51465e..c4a6e97f4b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritHitPoints.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCircleOfTheWildfireSpiritHitPoints.json @@ -135,7 +135,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&SpiritBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfAudacityDefensiveWhirl.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfAudacityDefensiveWhirl.json index a4e927b926..9760187f93 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfAudacityDefensiveWhirl.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfAudacityDefensiveWhirl.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "c0a83f49ec8b47a488c1237bb2c82415", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfEleganceAmazingDisplay.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfEleganceAmazingDisplay.json index 636967b722..6adacd9798 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfEleganceAmazingDisplay.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCollegeOfEleganceAmazingDisplay.json @@ -132,7 +132,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionCollegeOfEleganceAmazingDisplayTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "3b24b98087e888a4584553215450c700", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAcrobatics.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAcrobatics.json index 3ea49c4bd9..7ced312308 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAcrobatics.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAcrobatics.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AcrobaticsTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAnimalHandling.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAnimalHandling.json index ac4f74bd89..c4bc3ae796 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAnimalHandling.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAnimalHandling.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AnimalHandlingTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeArcana.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeArcana.json index e3083e256f..e1e8420652 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeArcana.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeArcana.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&ArcanaTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAthletics.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAthletics.json index 9413bf060a..af683555d0 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAthletics.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeAthletics.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&AthleticsTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeDeception.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeDeception.json index 949d2222e6..ac4ec4e350 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeDeception.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeDeception.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&DeceptionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeHistory.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeHistory.json index c8980c249b..a4d1c3831f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeHistory.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeHistory.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&HistoryTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInsight.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInsight.json index 878b318be2..a68fbe3031 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInsight.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInsight.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&InsightTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeIntimidation.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeIntimidation.json index 5d82a2b90a..c9eace4f60 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeIntimidation.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeIntimidation.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&IntimidationTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInvestigation.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInvestigation.json index b97f481b64..40289b5fa4 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInvestigation.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeInvestigation.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&InvestigationTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeMedecine.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeMedecine.json index 9f37b2b1ff..97b3edb023 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeMedecine.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeMedecine.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&MedecineTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeNature.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeNature.json index 7984625446..74b8c61bc3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeNature.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeNature.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&NatureTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerception.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerception.json index 271bac9566..d0cf48c6d5 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerception.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerception.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PerceptionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerformance.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerformance.json index c99741007f..a5ff59fc32 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerformance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePerformance.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PerformanceTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePersuasion.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePersuasion.json index 0bb953bf51..240e4150b9 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePersuasion.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgePersuasion.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&PersuasionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeReligion.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeReligion.json index f8b13dceb8..bfb30d7513 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeReligion.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeReligion.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&ReligionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSleightOfHand.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSleightOfHand.json index 6b410de6e6..ad42d01b31 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSleightOfHand.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSleightOfHand.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&SleightOfHandTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeStealth.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeStealth.json index 1bb5e93923..4becccfc3c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeStealth.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeStealth.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&StealthTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSurvival.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSurvival.json index 1346ea1222..5fcb698238 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSurvival.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionEmpoweredKnowledgeSurvival.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Skill/&SurvivalTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "7e058de2206b3f74881faf121820130b", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatDungeonDelver.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatDungeonDelver.json index 163d906bb1..f8d167f26b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatDungeonDelver.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatDungeonDelver.json @@ -145,7 +145,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feat/&FeatDungeonDelverTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatMageSlayer.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatMageSlayer.json index e0496b859a..02a89c8d30 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatMageSlayer.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionFeatMageSlayer.json @@ -133,7 +133,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feat/&FeatMageSlayerTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistCorroded.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistCorroded.json index cc89d849aa..9fc75525de 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistCorroded.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationVitriolistCorroded.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionInnovationVitriolistCorrodedTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "194beb1762264e64c9bef59db437cac5", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus.json index a066ac0ae3..fef3022a44 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionInnovationWeaponSummonSteelDefenderProficiencyBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderSpellAttack.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderSpellAttack.json index 14fe0582a3..45365ce524 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderSpellAttack.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInnovationWeaponSummonSteelDefenderSpellAttack.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionInnovationWeaponSummonSteelDefenderSpellAttackTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionPatronMountainClingingStrength.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionPatronMountainClingingStrength.json index 2e0d18daec..818690e6d3 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionPatronMountainClingingStrength.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionPatronMountainClingingStrength.json @@ -267,7 +267,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feature/&PowerPatronMountainClingingStrengthTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "330874c01be3cf6408fc2d0a8e697c0a", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerSkyWarriorGiftOfTheWind.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerSkyWarriorGiftOfTheWind.json index d3915d4546..4e2748c4eb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerSkyWarriorGiftOfTheWind.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerSkyWarriorGiftOfTheWind.json @@ -132,7 +132,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionRangerSkyWarriorGiftOfTheWindAttackedTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionArmorClass.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionArmorClass.json index db6a320d63..097fb17acd 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionArmorClass.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionArmorClass.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&BeastCompanionBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionAttackRoll.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionAttackRoll.json index 4d462f4c6f..0b1b15f64a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionAttackRoll.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionAttackRoll.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&BeastCompanionBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionDamageRoll.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionDamageRoll.json index c3558ecea1..d8342d4afd 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionDamageRoll.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionDamageRoll.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&BeastCompanionBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionHitPoints.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionHitPoints.json index ecafea7e62..237fa64373 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionHitPoints.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRangerWildMasterBeastCompanionHitPoints.json @@ -135,7 +135,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Feedback/&BeastCompanionBonusTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueCunningStrikeDisarmed.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueCunningStrikeDisarmed.json index 312477ed90..357021abce 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueCunningStrikeDisarmed.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueCunningStrikeDisarmed.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionRogueCunningStrikeDisarmedTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "972ed4fda488202498a29dc8a698c8e8", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueDeviousStrikeKnockOut.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueDeviousStrikeKnockOut.json index f3008fa2bd..43d8567913 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueDeviousStrikeKnockOut.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionRogueDeviousStrikeKnockOut.json @@ -266,7 +266,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionRogueDeviousStrikeKnockOutTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "ea73a6110352c3b4db96f64cb84ca709", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageAcid.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageAcid.json index 2199df9707..ca24d6ff37 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageAcid.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageAcid.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Acid Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageCold.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageCold.json index 4d0ffab375..a3f2a950fc 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageCold.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageCold.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Cold Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageFire.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageFire.json index 469aa29c41..0bcc3fce9a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageFire.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageFire.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Fire Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageLightning.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageLightning.json index e8dd0cbfc6..7b768e999b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageLightning.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageLightning.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Lightning Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageNecrotic.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageNecrotic.json index 90ab408be8..bc1326acab 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageNecrotic.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageNecrotic.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Necrotic Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageRadiant.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageRadiant.json index 0fc07da59c..b7b82e51de 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageRadiant.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageRadiant.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Radiant Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageThunder.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageThunder.json index 7355d1656f..ef7df1be29 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageThunder.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionShelterFromEnergyDamageThunder.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Thunder Damage Resistance", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "04f42c446dd0c5143bcc4d3b56edfbb2", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionCombatAffinity.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionCombatAffinity.json index 827fa0db2d..0328c5074e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionCombatAffinity.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionCombatAffinity.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionSoulExpulsionCombatAffinityTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "53a1d33b98088644f8c549fcdb63404f", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionSavingThrowAffinity.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionSavingThrowAffinity.json index 700fa2239d..d8af967338 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionSavingThrowAffinity.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSoulExpulsionSavingThrowAffinity.json @@ -133,7 +133,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Spell/&SoulExpulsionTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json index f6bc32467a..0f37b38454 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionStrikeWithTheWindMovement.json @@ -131,7 +131,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionStrikeWithTheWindMovementTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "0d141b75b2bd30943a5fdde92b747da3", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSynapticStatic.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSynapticStatic.json index 1e723aea1a..938e8c2af1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSynapticStatic.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSynapticStatic.json @@ -132,7 +132,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Condition/&ConditionSynapticStaticTitle", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "3b24b98087e888a4584553215450c700", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json index 69188a6f46..b589817715 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionThunderousSmite.json @@ -133,7 +133,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Thunderous Smite", - "description": "Feature/&NoContentTitle", + "description": "-", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "8440ca8497e8ca64f811d09a9d4679d9", diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 9a62d184d7..9b5086f5d0 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -1025,7 +1025,7 @@ private static FeatDefinition BuildDungeonDelver() new CustomBehaviorDungeonDelver( ConditionDefinitionBuilder .Create($"Condition{Name}") - .SetGuiPresentation(Name, Category.Feat, Gui.NoLocalization) + .SetGuiPresentation(Name, Category.Feat, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .SetFeatures( DamageAffinityAcidResistance, @@ -2277,7 +2277,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( .AddCustomSubFeatures(new CustomBehaviorMageSlayer( ConditionDefinitionBuilder .Create($"Condition{FeatMageSlayerName}") - .SetGuiPresentation(FeatMageSlayerName, Category.Feat, Gui.NoLocalization) + .SetGuiPresentation(FeatMageSlayerName, Category.Feat, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .AddFeatures( FeatureDefinitionMagicAffinityBuilder diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index 5f3b4156ab..09ef28c357 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -1245,7 +1245,7 @@ private static void BuildRogueCunningStrike() var conditionDisarmed = ConditionDefinitionBuilder .Create($"Condition{Cunning}Disarmed") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDefinitions.ConditionBaned) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionBaned) .SetConditionType(ConditionType.Detrimental) .AddFeatures(combatAffinityDisarmed) .AddToDB(); @@ -1399,7 +1399,7 @@ private static void BuildRogueCunningStrike() var conditionKnockOut = ConditionDefinitionBuilder .Create(ConditionDefinitions.ConditionIncapacitated, $"Condition{Devious}KnockOut") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDefinitions.ConditionAsleep) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionAsleep) .SetParentCondition(ConditionDefinitions.ConditionIncapacitated) .SetFeatures() .SetSpecialInterruptions(ConditionInterruption.Damaged) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 54769d3177..b122dfb4d7 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -719,8 +719,8 @@ internal static SpellDefinition BuildThunderousSmite() var conditionThunderousSmite = ConditionDefinitionBuilder .Create($"Condition{NAME}") - .SetGuiPresentation($"{NAME}Title".Formatted(Category.Spell), Gui.NoLocalization, - ConditionBrandingSmite) + .SetGuiPresentation( + $"{NAME}Title".Formatted(Category.Spell), Gui.EmptyContent, ConditionBrandingSmite) .SetPossessive() .SetSpecialInterruptions(ConditionInterruption.AttacksAndDamages) .SetFeatures(powerThunderousSmite) @@ -828,7 +828,7 @@ internal static SpellDefinition BuildChaosBolt() var conditionLeap = ConditionDefinitionBuilder .Create($"Condition{NAME}Leap") - .SetGuiPresentation(NAME, Category.Spell, Gui.NoLocalization) + .SetGuiPresentation(NAME, Category.Spell, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ConditionDefinition.OriginOfAmount.Fixed) .SetFeatures(powerLeap) @@ -1674,7 +1674,7 @@ internal static SpellDefinition BuildGoneWithTheWind() var conditionStrikeWithTheWindAttackMovement = ConditionDefinitionBuilder .Create($"Condition{NAME}Movement") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDefinitions.ConditionDisengaging) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionDisengaging) .SetPossessive() .SetFeatures(movementAffinityStrikeWithTheWind) .SetConditionParticleReference(ConditionSpellbladeArcaneEscape) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs index 14b378055a..737fa11fda 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs @@ -579,8 +579,8 @@ internal static SpellDefinition BuildBorrowedKnowledge() EffectFormBuilder.ConditionForm( ConditionDefinitionBuilder .Create($"Condition{NAME}{skill.Name}") - .SetGuiPresentation(skill.GuiPresentation.Title, Gui.NoLocalization, - ConditionBullsStrength) + .SetGuiPresentation( + skill.GuiPresentation.Title, Gui.EmptyContent, ConditionBullsStrength) .SetPossessive() .SetFeatures( FeatureDefinitionProficiencyBuilder diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs index 58a95ce8d1..c625775ba6 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs @@ -115,7 +115,7 @@ internal static SpellDefinition BuildSynapticStatic() var conditionMuddled = ConditionDefinitionBuilder .Create($"Condition{NAME}") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDazzled) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDazzled) .SetPossessive() .SetConditionType(ConditionType.Detrimental) .SetFeatures( @@ -501,7 +501,7 @@ internal static SpellDefinition BuildEmpoweredKnowledge() ConditionDefinitionBuilder .Create($"Condition{NAME}{skill.Name}") .SetGuiPresentation( - skill.GuiPresentation.Title, Gui.NoLocalization, ConditionBullsStrength) + skill.GuiPresentation.Title, Gui.EmptyContent, ConditionBullsStrength) .SetPossessive() .SetFeatures( FeatureDefinitionProficiencyBuilder diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs index e2a47a83b9..6f857db702 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs @@ -231,15 +231,16 @@ internal static SpellDefinition BuildShelterFromEnergy() .SetTargetingData(Side.Ally, RangeType.Distance, 12, TargetType.IndividualsUnique, 6) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalTargetsPerIncrement: 1) - .SetEffectForms(EffectFormBuilder.ConditionForm(ConditionDefinitionBuilder - .Create($"Condition{NAME}{damageType}") - .SetGuiPresentation( - Gui.Format($"Condition/&Condition{NAME}Title", title), - Gui.NoLocalization, - ConditionAuraOfProtection) - .SetPossessive() - .SetFeatures(damageAffinity) - .AddToDB())) + .SetEffectForms(EffectFormBuilder.ConditionForm( + ConditionDefinitionBuilder + .Create($"Condition{NAME}{damageType}") + .SetGuiPresentation( + Gui.Format($"Condition/&Condition{NAME}Title", title), + Gui.EmptyContent, + ConditionAuraOfProtection) + .SetPossessive() + .SetFeatures(damageAffinity) + .AddToDB())) .SetCasterEffectParameters(casterEffect) .SetImpactEffectParameters(impactEffect) .Build()) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs index 6f212d5b63..b5c0171316 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs @@ -189,7 +189,7 @@ internal static SpellDefinition BuildSoulExpulsion() var conditionSavingThrowAffinity = ConditionDefinitionBuilder .Create($"Condition{NAME}SavingThrowAffinity") - .SetGuiPresentation(NAME, Category.Spell, Gui.NoLocalization) + .SetGuiPresentation(NAME, Category.Spell, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .SetFeatures( FeatureDefinitionSavingThrowAffinityBuilder @@ -203,7 +203,7 @@ internal static SpellDefinition BuildSoulExpulsion() var conditionCombatAffinity = ConditionDefinitionBuilder .Create($"Condition{NAME}CombatAffinity") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDoomLaughter) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDoomLaughter) .SetConditionType(ConditionType.Detrimental) .SetFeatures( FeatureDefinitionCombatAffinityBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index ee93137c25..d62711a996 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -203,7 +203,7 @@ public CircleOfTheWildfire() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}SpiritAttackRoll") - .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ConditionDefinition.OriginOfAmount.SourceSpellAttack) @@ -211,7 +211,7 @@ public CircleOfTheWildfire() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}SpiritDamageRoll") - .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceProficiencyBonus) @@ -219,7 +219,7 @@ public CircleOfTheWildfire() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}SpiritHitPoints") - .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&SpiritBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceClassLevel, DruidClass) diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index 81715e077b..9fe79edb18 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -73,7 +73,7 @@ public CollegeOfAudacity() _ = ConditionDefinitionBuilder .Create(ConditionDefensiveWhirl) - .SetGuiPresentation($"AttributeModifier{Name}DefensiveWhirl", Category.Feature, Gui.NoLocalization, + .SetGuiPresentation($"AttributeModifier{Name}DefensiveWhirl", Category.Feature, Gui.EmptyContent, ConditionDefinitions.ConditionMagicallyArmored.GuiPresentation.SpriteReference) .SetPossessive() .SetFeatures( diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs index 62a37d5d48..44c48dae36 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs @@ -144,7 +144,7 @@ public CollegeOfElegance() var conditionAmazingDisplay = ConditionDefinitionBuilder .Create($"Condition{Name}AmazingDisplay") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDefinitions.ConditionDazzled) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionDazzled) .SetConditionType(ConditionType.Detrimental) .SetFeatures(ActionAffinityConditionRestrained, MovementAffinityConditionRestrained) .SetConditionParticleReference(ConditionDefinitions.ConditionDistracted) diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs index 4ffb1ee038..17e109b4f8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs @@ -78,7 +78,7 @@ public InnovationVitriolist() var conditionCorroded = ConditionDefinitionBuilder .Create($"Condition{Name}Corroded") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization, ConditionDefinitions.ConditionHeatMetal) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent, ConditionDefinitions.ConditionHeatMetal) .SetConditionType(ConditionType.Detrimental) .AddFeatures( FeatureDefinitionAttributeModifierBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs index 0c2b76027f..17a51a3a19 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs @@ -282,7 +282,7 @@ private static FeatureDefinitionSummoningAffinity BuildSteelDefenderAffinity() //Bonuses from Inventor's spell attack ConditionDefinitionBuilder .Create("ConditionInnovationWeaponSummonSteelDefenderSpellAttack") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .SetPossessive() .SetAmountOrigin(ConditionDefinition.OriginOfAmount.SourceSpellAttack) @@ -291,7 +291,7 @@ private static FeatureDefinitionSummoningAffinity BuildSteelDefenderAffinity() //Bonuses from Inventor's Proficiency Bonus ConditionDefinitionBuilder .Create("ConditionInnovationWeaponSummonSteelDefenderProficiencyBonus") - .SetGuiPresentation(Category.Condition, Gui.NoLocalization) + .SetGuiPresentation(Category.Condition, Gui.EmptyContent) .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceProficiencyBonus) .SetFeatures(toDamage) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs index d831d86811..08f7d9e84d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs @@ -123,7 +123,7 @@ public PatronMountain() var conditionClingingStrength = ConditionDefinitionBuilder .Create(ConditionDefinitions.ConditionLongstrider, $"Condition{Name}ClingingStrength") - .SetGuiPresentation($"Power{Name}ClingingStrength", Category.Feature, Gui.NoLocalization, + .SetGuiPresentation($"Power{Name}ClingingStrength", Category.Feature, Gui.EmptyContent, ConditionDefinitions.ConditionLongstrider.GuiPresentation.SpriteReference) .AddFeatures(FeatureDefinitionMovementAffinitys.MovementAffinitySpiderClimb) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs index 0be2417d28..5ef8af2803 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs @@ -76,8 +76,8 @@ public RangerSkyWarrior() var conditionGiftOfTheWind = ConditionDefinitionBuilder .Create($"Condition{Name}GiftOfTheWind") - .SetGuiPresentation($"Condition{Name}GiftOfTheWindAttacked", Category.Condition, - Gui.NoLocalization) + .SetGuiPresentation( + $"Condition{Name}GiftOfTheWindAttacked", Category.Condition, Gui.EmptyContent) .SetPossessive() .AddFeatures(movementAffinityGiftOfTheWind, combatAffinityGiftOfTheWind) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerWildMaster.cs b/SolastaUnfinishedBusiness/Subclasses/RangerWildMaster.cs index 00a7ac334d..d46416c4be 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerWildMaster.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerWildMaster.cs @@ -84,7 +84,7 @@ public RangerWildMaster() .SetAddedConditions( ConditionDefinitionBuilder .Create($"Condition{Name}BeastCompanionArmorClass") - .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceProficiencyAndAbilityBonus, AttributeDefinitions.Wisdom) @@ -92,7 +92,7 @@ public RangerWildMaster() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}BeastCompanionAttackRoll") - .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceProficiencyAndAbilityBonus, AttributeDefinitions.Wisdom) @@ -100,7 +100,7 @@ public RangerWildMaster() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}BeastCompanionDamageRoll") - .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceProficiencyAndAbilityBonus, AttributeDefinitions.Wisdom) @@ -108,7 +108,7 @@ public RangerWildMaster() .AddToDB(), ConditionDefinitionBuilder .Create($"Condition{Name}BeastCompanionHitPoints") - .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.NoLocalization) + .SetGuiPresentation("Feedback/&BeastCompanionBonusTitle", Gui.EmptyContent) .SetPossessive() .SetSilent(Silent.WhenAddedOrRemoved) .SetAmountOrigin(ExtraOriginOfAmount.SourceClassLevel, RangerClass) diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardBladeDancer.cs b/SolastaUnfinishedBusiness/Subclasses/WizardBladeDancer.cs index 9a0c5411e9..b74b2e6317 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardBladeDancer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardBladeDancer.cs @@ -21,7 +21,7 @@ public sealed class WizardBladeDancer : AbstractSubclass private static readonly ConditionDefinition ConditionBladeDancerBladeDance = ConditionDefinitionBuilder .Create($"Condition{Name}BladeDance") - .SetGuiPresentation($"Feature/&FeatureSet{Name}BladeDanceTitle", Gui.NoLocalization, ConditionHeroism) + .SetGuiPresentation($"Feature/&FeatureSet{Name}BladeDanceTitle", Gui.EmptyContent, ConditionHeroism) .SetFeatures( FeatureDefinitionMovementAffinitys.MovementAffinityBarbarianFastMovement, FeatureDefinitionAttributeModifierBuilder From 97a96c9f2264540e8c072d04cf92600dcfddc0ef Mon Sep 17 00:00:00 2001 From: Dovel Date: Mon, 5 Aug 2024 01:36:52 +0300 Subject: [PATCH 004/162] update russian translation --- .../Translations/ru/SubClasses/MartialTactician-ru.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialTactician-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialTactician-ru.txt index c4f9a4668e..64dfabcffc 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialTactician-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialTactician-ru.txt @@ -26,8 +26,8 @@ Feature/&InvocationPoolGambitUnlearnDescription=Вы можете заменит Feature/&InvocationPoolGambitUnlearnTitle=Заменить приём Feature/&PowerPoolTacticianGambitDescription=Вы получаете четыре кости D8, которые называются костью превосходства и которые вы можете потратить на использование различных приёмов. Потраченные кости восстанавливаются во время короткого или длительного отдыха. На определённых уровнях эти кости увеличиваются в размере. Feature/&PowerPoolTacticianGambitTitle=Кость превосходства -Feature/&PowerUseModifierTacticianGambitPool2Description=Вы получаете два дополнительных кубика превосходства. -Feature/&PowerUseModifierTacticianGambitPool2Title=Дополнительные кубики превосходства +Feature/&PowerUseModifierTacticianGambitPool2Description=Вы получаете две дополнительных кости превосходства. +Feature/&PowerUseModifierTacticianGambitPool2Title=Дополнительные кости превосходства Feature/&PowerUseModifierTacticianGambitPoolDescription=Вы получаете дополнительную кость превосходства. Feature/&PowerUseModifierTacticianGambitPoolTitle=Дополнительная кость превосходства Feedback/&AdditionalDamageGambitDieFormat=Приём! From 9c64d992f04913bb12e8959ce08a500e0b183460 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sun, 4 Aug 2024 21:29:05 -0700 Subject: [PATCH 005/162] fix Variant Spell Points rules blocking all slots above or at 6 if any on those levels cast --- .../ChangelogHistory.txt | 21 ++++++------ .../Models/SpellPointsContext.cs | 32 ++++++++++++------- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 101757d948..3472f0df48 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,6 +1,13 @@ -1.5.97.25: +1.5.97.26: + +- fixed Variant Spell Points rules blocking all slots above or at 6 if any on those levels cast + +KNOWN ISSUES: -PATRONS: UB is running low on cash flow. If you can, please donate at github.com/SolastaMods/SolastaUnfinishedBusiness +- Artillerist Force Ballista tiny cannon doesn't force attack DIS within 5 ft +- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses + +1.5.97.25: - added Gameplay > Character > 'Enable Sorcerer quickened action to allow cast leveled main in the end' - added triple camera range to Interface > Game UI > 'Enable elevation camera during battle to stay at position' @@ -21,11 +28,6 @@ PATRONS: UB is running low on cash flow. If you can, please donate at github.com - improved Roguish Umbral Stalker, now Roguish Shadowdancer, to also allow ranged builds - improved Way of Zen Archery flurry of arrows to replace one of your bonus unarmed strikes with a bow attack -KNOWN ISSUES: - -- Artillerist Force Ballista tiny cannon doesn't force attack DIS within 5 ft -- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses - 1.5.97.24: - added Artificer soul of artifice at 20th @@ -343,11 +345,6 @@ all fixes marked with * were introduced with the IsMelee change on v18 - improved invocations that grant spells with balanced usage and standardized descriptions - improved Sorcerer spell list with Fire Shield spell [VANILLA] -known issues: - -- Artillerist Force Ballista tiny cannon doesn't force attack DIS within 5 ft -- Artillerist Fortified Position medium cannon doesn't grant buff to self - 1.5.97.5: - added Aura of Vitality, Mordenkainen's Faithful Hound, and Witch Bolt spells diff --git a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs index fc89572817..8765341117 100644 --- a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs @@ -192,8 +192,9 @@ internal static void GrantPowerSpellPoints(RulesetCharacterHero hero) } internal static void ConsumeSlotsAtLevelsPointsCannotCastAnymore( - RulesetCharacterHero hero, RulesetSpellRepertoire repertoire, int slotLevel, - bool consume = true, bool isMulticaster = false) + RulesetCharacterHero hero, + RulesetSpellRepertoire repertoire, + int slotLevel, bool consume = true, bool isMulticaster = false) { // consume points var usablePower = PowerProvider.Get(PowerSpellPoints, hero); @@ -210,17 +211,28 @@ internal static void ConsumeSlotsAtLevelsPointsCannotCastAnymore( ? SharedSpellsContext.GetSharedSpellLevel(hero) : repertoire.MaxSpellLevelOfSpellCastingLevel; - var warlockLevel = SharedSpellsContext.GetWarlockSpellLevel(hero); - for (var i = level; i > 0; i--) { - if (usablePower.RemainingUses >= SpellCostByLevel[i] && - // handle scenario where spells at level 6 and above can only be cast once per level - slotLevel <= 5) + if (usablePower.RemainingUses >= SpellCostByLevel[i]) { + if (slotLevel > 5) + { + ConsumeSlot(slotLevel); + } + continue; } + ConsumeSlot(i); + } + + repertoire.RepertoireRefreshed?.Invoke(repertoire); + + return; + + void ConsumeSlot(int slot) + { + var warlockLevel = SharedSpellsContext.GetWarlockSpellLevel(hero); var usedWarlockSlots = 0; if (level == warlockLevel && @@ -231,11 +243,9 @@ internal static void ConsumeSlotsAtLevelsPointsCannotCastAnymore( var usedSpellsSlots = repertoire.usedSpellsSlots; - usedSpellsSlots.TryAdd(i, 0); - usedSpellsSlots[i] = usedWarlockSlots + 1; + usedSpellsSlots.TryAdd(slot, 0); + usedSpellsSlots[slot] = usedWarlockSlots + 1; } - - repertoire.RepertoireRefreshed?.Invoke(repertoire); } internal static void ConvertAdditionalSlotsIntoSpellPointsBeforeRefreshSpellRepertoire(RulesetCharacterHero hero) From ab671bcc5bac69b0d40ff6233d4c8092ac1d8d61 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Mon, 5 Aug 2024 07:07:23 -0700 Subject: [PATCH 006/162] fix Martial Guardian not getting the Sentinel feat - fix #4848 --- SolastaUnfinishedBusiness/ChangelogHistory.txt | 3 ++- .../Models/LevelUpContext.cs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 3472f0df48..73c30049dc 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,6 +1,7 @@ 1.5.97.26: -- fixed Variant Spell Points rules blocking all slots above or at 6 if any on those levels cast +- fixed Martial Guardian not getting the Sentinel feat +- fixed Variant Spell Points consumption on slots above 5 KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Models/LevelUpContext.cs b/SolastaUnfinishedBusiness/Models/LevelUpContext.cs index fd128f5ebf..3d2c5e74ee 100644 --- a/SolastaUnfinishedBusiness/Models/LevelUpContext.cs +++ b/SolastaUnfinishedBusiness/Models/LevelUpContext.cs @@ -725,6 +725,15 @@ internal static void RecursiveGrantCustomFeatures( hero.TrainedFightingStyles .Add(DatabaseHelper.GetDefinition(prof))); break; + case FeatureDefinitionProficiency + { + ProficiencyType: ProficiencyType.Feat + } featureDefinitionProficiency: + featureDefinitionProficiency.Proficiencies + .ForEach(prof => + hero.TrainedFeats + .Add(DatabaseHelper.GetDefinition(prof))); + break; } } } @@ -760,6 +769,15 @@ internal static void RecursiveRemoveCustomFeatures( hero.TrainedFightingStyles .Remove(DatabaseHelper.GetDefinition(prof))); break; + case FeatureDefinitionProficiency + { + ProficiencyType: ProficiencyType.Feat + } featureDefinitionProficiency: + featureDefinitionProficiency.Proficiencies + .ForEach(prof => + hero.TrainedFeats + .Remove(DatabaseHelper.GetDefinition(prof))); + break; } } } From 6413ca06553e80674f820ba4a1b80e61bdd73e02 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Mon, 5 Aug 2024 16:01:48 -0700 Subject: [PATCH 007/162] fix Bait and Switch maneuver greyed out on action bar --- .../PowerGambitSwitchActivate.json | 4 ++-- SolastaUnfinishedBusiness/ChangelogHistory.txt | 1 + .../Subclasses/Builders/GambitsBuilders.cs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitSwitchActivate.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitSwitchActivate.json index 514c90872e..7d382e4f32 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitSwitchActivate.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerGambitSwitchActivate.json @@ -2,8 +2,8 @@ "$type": "FeatureDefinitionPowerSharedPool, SolastaUnfinishedBusiness", "effectDescription": { "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Touch", - "rangeParameter": 0, + "rangeType": "Distance", + "rangeParameter": 1, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], "targetType": "IndividualsUnique", diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 73c30049dc..ab701a0a37 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,5 +1,6 @@ 1.5.97.26: +- fixed Bait and Switch maneuver greyed out on action bar - fixed Martial Guardian not getting the Sentinel feat - fixed Variant Spell Points consumption on slots above 5 diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index 471a2d6144..ab782a3829 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -821,7 +821,7 @@ internal static void BuildGambits() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetTargetingData(Side.All, RangeType.Touch, 0, TargetType.IndividualsUnique) + .SetTargetingData(Side.All, RangeType.Distance, 1, TargetType.IndividualsUnique) .ExcludeCaster() .SetSavingThrowData(true, AttributeDefinitions.Dexterity, false, EffectDifficultyClassComputation.AbilityScoreAndProficiency) From 36b5365a2e78cd0b6d12db8a61e1fcbfc57be645 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Mon, 5 Aug 2024 20:11:14 -0700 Subject: [PATCH 008/162] fix Sunlit Blade cantrip condition interruption logic --- .../ConditionDefinition/ConditionSunlightBladeHighlighted.json | 2 +- SolastaUnfinishedBusiness/ChangelogHistory.txt | 1 + SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSunlightBladeHighlighted.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSunlightBladeHighlighted.json index dd916c2d63..cde0851be7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSunlightBladeHighlighted.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionSunlightBladeHighlighted.json @@ -19,7 +19,7 @@ "forceTurnOccurence": false, "turnOccurence": "StartOfTurn", "specialInterruptions": [ - 9000 + "Attacked" ], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index ab701a0a37..fa85cb99c4 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -2,6 +2,7 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Martial Guardian not getting the Sentinel feat +- fixed Sunlit Blade cantrip condition interruption logic - fixed Variant Spell Points consumption on slots above 5 KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs index 84336d9306..64cb999734 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs @@ -675,7 +675,8 @@ internal static SpellDefinition BuildSunlightBlade() ConditionOperationDescription.ConditionOperation.Add, ConditionDefinitionBuilder .Create(ConditionHighlighted, "ConditionSunlightBladeHighlighted") - .SetSpecialInterruptions(ExtraConditionInterruption.AfterWasAttacked) + // don't use AfterWasAttacked here as it gets removed too soon + .SetSpecialInterruptions(ConditionInterruption.Attacked) .SetSpecialDuration(DurationType.Round, 1, TurnOccurenceType.StartOfTurn) .AddToDB()) .SetAddLightSource(true) From 99c7240b2c1db801eee93b611a8f02cebf742328 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Mon, 5 Aug 2024 20:29:40 -0700 Subject: [PATCH 009/162] move ModifyAttributeAndMax to RulesetActorExtensions --- .../GameExtensions/RulesetActorExtensions.cs | 12 ++ .../ChangelogHistory.txt | 3 +- .../Models/CharacterUAContext.cs | 36 +--- .../Models/Level20Context.cs | 174 +++++++----------- 4 files changed, 88 insertions(+), 137 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs index f19c71b2a8..d74d4e95f3 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetActorExtensions.cs @@ -8,6 +8,18 @@ namespace SolastaUnfinishedBusiness.Api.GameExtensions; internal static class RulesetActorExtensions { + internal static void ModifyAttributeAndMax(this RulesetActor hero, string attributeName, int amount) + { + var attribute = hero.GetAttribute(attributeName); + + attribute.BaseValue += amount; + attribute.MaxValue += amount; + attribute.MaxEditableValue += amount; + attribute.Refresh(); + + hero.AbilityScoreIncreased?.Invoke(hero, attributeName, amount, amount); + } + [NotNull] private static List FeaturesByType([CanBeNull] RulesetActor actor) where T : class { diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index fa85cb99c4..0f361f0467 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -2,7 +2,8 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Martial Guardian not getting the Sentinel feat -- fixed Sunlit Blade cantrip condition interruption logic +- fixed Sunlit Blade cantrip highlighted condition duration +- fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index 09ef28c357..aebb9fcca1 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -1043,31 +1043,17 @@ private sealed class CustomLevelUpLogicMonkBodyAndMind : ICustomLevelUpLogic { public void ApplyFeature([NotNull] RulesetCharacterHero hero, string tag) { - ModifyAttributeAndMax(hero, AttributeDefinitions.Dexterity, 4); - ModifyAttributeAndMax(hero, AttributeDefinitions.Wisdom, 4); - + hero.ModifyAttributeAndMax(AttributeDefinitions.Dexterity, 4); + hero.ModifyAttributeAndMax(AttributeDefinitions.Wisdom, 4); hero.RefreshAll(); } public void RemoveFeature([NotNull] RulesetCharacterHero hero, string tag) { - ModifyAttributeAndMax(hero, AttributeDefinitions.Dexterity, -4); - ModifyAttributeAndMax(hero, AttributeDefinitions.Wisdom, -4); - + hero.ModifyAttributeAndMax(AttributeDefinitions.Dexterity, -4); + hero.ModifyAttributeAndMax(AttributeDefinitions.Wisdom, -4); hero.RefreshAll(); } - - private static void ModifyAttributeAndMax([NotNull] RulesetActor hero, string attributeName, int amount) - { - var attribute = hero.GetAttribute(attributeName); - - attribute.BaseValue += amount; - attribute.MaxValue += amount; - attribute.MaxEditableValue += amount; - attribute.Refresh(); - - hero.AbilityScoreIncreased?.Invoke(hero, attributeName, amount, amount); - } } internal sealed class MonkWeaponSpecialization @@ -1118,11 +1104,8 @@ internal static void SwitchRangerHumanoidFavoredEnemy() .AdditionalDamageMarshalFavoredEnemyHumanoid); } - if (Main.Settings.EnableSortingFutureFeatures) - { - AdditionalDamageRangerFavoredEnemyChoice.FeatureSet.Sort((x, y) => - string.Compare(x.FormatTitle(), y.FormatTitle(), StringComparison.CurrentCulture)); - } + AdditionalDamageRangerFavoredEnemyChoice.FeatureSet.Sort((x, y) => + string.Compare(x.FormatTitle(), y.FormatTitle(), StringComparison.CurrentCulture)); } internal static void SwitchRangerNatureShroud() @@ -1196,12 +1179,7 @@ internal static void SwitchRangerNatureShroud() .SetImpactEffectParameters(new AssetReference()) .Build()) .AddCustomSubFeatures( - new ValidatorsValidatePowerUse(character => - { - var gameLocationCharacter = GameLocationCharacter.GetFromActor(character); - - return gameLocationCharacter == null || gameLocationCharacter.UsedTacticalMoves == 0; - })) + new ValidatorsValidatePowerUse(c => GameLocationCharacter.GetFromActor(c) is { UsedTacticalMoves: 0 })) .AddToDB(); internal static readonly ConditionDefinition ConditionReduceSneakDice = ConditionDefinitionBuilder diff --git a/SolastaUnfinishedBusiness/Models/Level20Context.cs b/SolastaUnfinishedBusiness/Models/Level20Context.cs index cdbc711d3b..7eaa53f710 100644 --- a/SolastaUnfinishedBusiness/Models/Level20Context.cs +++ b/SolastaUnfinishedBusiness/Models/Level20Context.cs @@ -11,7 +11,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -186,15 +185,14 @@ private static void BarbarianLoad() .AddCustomSubFeatures(new CustomLevelUpLogicBarbarianPrimalChampion()) .AddToDB(); - Barbarian.FeatureUnlocks.AddRange(new List - { - new(AttributeModifierBarbarianBrutalCriticalAdd, 17), + Barbarian.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(AttributeModifierBarbarianBrutalCriticalAdd, 17), // vanilla already adds this even with top level 16 // new(AttributeModifierBarbarianRagePointsAdd, 17), - new(changeAbilityCheckBarbarianIndomitableMight, 18), - new(FeatureSetAbilityScoreChoice, 19), - new(customCodeBarbarianPrimalChampion, 20) - }); + new FeatureUnlockByLevel(changeAbilityCheckBarbarianIndomitableMight, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(customCodeBarbarianPrimalChampion, 20) + ); } private static void BardLoad() @@ -211,12 +209,11 @@ private static void BardLoad() featureBardSuperiorInspiration.AddCustomSubFeatures( new BattleStartedListenerBardSuperiorInspiration(featureBardSuperiorInspiration)); - Bard.FeatureUnlocks.AddRange(new List - { - new(pointPoolBardMagicalSecrets18, 18), - new(FeatureSetAbilityScoreChoice, 19), - new(featureBardSuperiorInspiration, 20) - }); + Bard.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(pointPoolBardMagicalSecrets18, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(featureBardSuperiorInspiration, 20) + ); EnumerateSlotsPerLevel( CasterProgression.Full, @@ -245,12 +242,11 @@ private static void ClericLoad() .SetEffectDescription(effectPowerClericTurnUndead17) .AddToDB(); - Cleric.FeatureUnlocks.AddRange(new List - { - new(powerClericTurnUndead17, 17), - new(AttributeModifierClericChannelDivinityAdd, 18), - new(FeatureSetAbilityScoreChoice, 19) - }); + Cleric.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(powerClericTurnUndead17, 17), + new FeatureUnlockByLevel(AttributeModifierClericChannelDivinityAdd, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19) + ); EnumerateSlotsPerLevel( CasterProgression.Full, @@ -299,13 +295,12 @@ private static void DruidLoad() magicAffinityArchDruid.AddCustomSubFeatures(new ActionFinishedByMeArchDruid(magicAffinityArchDruid)); - Druid.FeatureUnlocks.AddRange(new List - { - new(summoningAffinity, 2), - new(featureDruidBeastSpells, 18), - new(FeatureSetAbilityScoreChoice, 19), - new(magicAffinityArchDruid, 20) - }); + Druid.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(summoningAffinity, 2), + new FeatureUnlockByLevel(featureDruidBeastSpells, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(magicAffinityArchDruid, 20) + ); EnumerateSlotsPerLevel( CasterProgression.Full, @@ -322,13 +317,12 @@ private static void FighterLoad() .SetOverriddenPower(PowerFighterActionSurge) .AddToDB(); - Fighter.FeatureUnlocks.AddRange(new List - { - new(powerFighterActionSurge2, 17), - new(AttributeModifierFighterIndomitableAdd1, 17), - new(FeatureSetAbilityScoreChoice, 19), - new(AttributeModifierFighterExtraAttack, 20) - }); + Fighter.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(powerFighterActionSurge2, 17), + new FeatureUnlockByLevel(AttributeModifierFighterIndomitableAdd1, 17), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(AttributeModifierFighterExtraAttack, 20) + ); } private static void MonkLoad() @@ -385,10 +379,11 @@ private static void RangerLoad() featureFoeSlayer.AddCustomSubFeatures(new ModifyWeaponAttackModeRangerFoeSlayer(featureFoeSlayer)); - Ranger.FeatureUnlocks.AddRange(new List - { - new(senseRangerFeralSenses, 18), new(FeatureSetAbilityScoreChoice, 19), new(featureFoeSlayer, 20) - }); + Ranger.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(senseRangerFeralSenses, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(featureFoeSlayer, 20) + ); EnumerateSlotsPerLevel( CasterProgression.Half, @@ -423,10 +418,12 @@ private static void RogueLoad() ModifyPowerVisibility.Hidden, new TryAlterOutcomeAttackRogueStrokeOfLuck(powerRogueStrokeOfLuck)); - Rogue.FeatureUnlocks.AddRange(new List - { - new(featureRogueElusive, 18), new(FeatureSetAbilityScoreChoice, 19), new(powerRogueStrokeOfLuck, 20) - }); + Rogue.FeatureUnlocks.AddRange( + [ + new FeatureUnlockByLevel(featureRogueElusive, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(powerRogueStrokeOfLuck, 20) + ]); } private static void SorcererLoad() @@ -470,12 +467,11 @@ private static void SorcererLoad() .AddCustomSubFeatures(ModifyPowerVisibility.Hidden) .AddToDB(); - Sorcerer.FeatureUnlocks.AddRange(new List - { - new(PointPoolSorcererAdditionalMetamagic, 17), - new(FeatureSetAbilityScoreChoice, 19), - new(powerSorcerousRestoration, 20) - }); + Sorcerer.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(PointPoolSorcererAdditionalMetamagic, 17), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(powerSorcerousRestoration, 20) + ); EnumerateSlotsPerLevel( CasterProgression.Full, @@ -515,13 +511,12 @@ private static void WarlockLoad() .SetUsesFixed(ActivationTime.Minute1, RechargeRate.LongRest) .AddToDB(); - Warlock.FeatureUnlocks.AddRange(new List - { - new(pointPoolWarlockMysticArcanum9, 17), - new(pointPoolWarlockInvocation18, 18), - new(FeatureSetAbilityScoreChoice, 19), - new(powerWarlockEldritchMaster, 20) - }); + Warlock.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(pointPoolWarlockMysticArcanum9, 17), + new FeatureUnlockByLevel(pointPoolWarlockInvocation18, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(powerWarlockEldritchMaster, 20) + ); CastSpellWarlock.KnownSpells.SetRange(SharedSpellsContext.WarlockKnownSpells); @@ -536,10 +531,11 @@ private static void WizardLoad() var spellMastery = WizardSpellMastery.BuildWizardSpellMastery(); var signatureSpells = WizardSignatureSpells.BuildWizardSignatureSpells(); - Wizard.FeatureUnlocks.AddRange(new List - { - new(spellMastery, 18), new(FeatureSetAbilityScoreChoice, 19), new(signatureSpells, 20) - }); + Wizard.FeatureUnlocks.AddRange( + new FeatureUnlockByLevel(spellMastery, 18), + new FeatureUnlockByLevel(FeatureSetAbilityScoreChoice, 19), + new FeatureUnlockByLevel(signatureSpells, 20) + ); EnumerateSlotsPerLevel( CasterProgression.Full, @@ -891,9 +887,7 @@ public override IEnumerator Execute( } } - private sealed class ActionFinishedByMeArchDruid( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - FeatureDefinition featureDefinition) : IMagicEffectFinishedByMe + private sealed class ActionFinishedByMeArchDruid(FeatureDefinition featureDefinition) : IMagicEffectFinishedByMe { public IEnumerator OnMagicEffectFinishedByMe( CharacterActionMagicEffect action, @@ -947,31 +941,17 @@ private sealed class CustomLevelUpLogicBarbarianPrimalChampion : ICustomLevelUpL { public void ApplyFeature([NotNull] RulesetCharacterHero hero, string tag) { - ModifyAttributeAndMax(hero, AttributeDefinitions.Strength, 4); - ModifyAttributeAndMax(hero, AttributeDefinitions.Constitution, 4); - + hero.ModifyAttributeAndMax(AttributeDefinitions.Strength, 4); + hero.ModifyAttributeAndMax(AttributeDefinitions.Constitution, 4); hero.RefreshAll(); } public void RemoveFeature([NotNull] RulesetCharacterHero hero, string tag) { - ModifyAttributeAndMax(hero, AttributeDefinitions.Strength, -4); - ModifyAttributeAndMax(hero, AttributeDefinitions.Constitution, -4); - + hero.ModifyAttributeAndMax(AttributeDefinitions.Strength, -4); + hero.ModifyAttributeAndMax(AttributeDefinitions.Constitution, -4); hero.RefreshAll(); } - - private static void ModifyAttributeAndMax([NotNull] RulesetActor hero, string attributeName, int amount) - { - var attribute = hero.GetAttribute(attributeName); - - attribute.BaseValue += amount; - attribute.MaxValue += amount; - attribute.MaxEditableValue += amount; - attribute.Refresh(); - - hero.AbilityScoreIncreased?.Invoke(hero, attributeName, amount, amount); - } } private sealed class BattleStartedListenerMonkPerfectSelf : ICharacterBattleStartedListener @@ -980,12 +960,7 @@ public void OnCharacterBattleStarted(GameLocationCharacter locationCharacter, bo { var character = locationCharacter.RulesetCharacter; - if (character == null) - { - return; - } - - if (character.RemainingKiPoints != 0) + if (character is not { RemainingKiPoints: 0 }) { return; } @@ -1008,11 +983,6 @@ public IEnumerator OnPhysicalAttackInitiatedOnMe( { var rulesetDefender = defender.RulesetActor; - if (rulesetDefender is not { IsDeadOrDyingOrUnconscious: false }) - { - yield break; - } - if (rulesetDefender.HasConditionOfTypeOrSubType(ConditionIncapacitated)) { yield break; @@ -1023,9 +993,7 @@ public IEnumerator OnPhysicalAttackInitiatedOnMe( } } - private sealed class ModifyWeaponAttackModeRangerFoeSlayer( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - FeatureDefinition featureDefinition) + private sealed class ModifyWeaponAttackModeRangerFoeSlayer(FeatureDefinition featureDefinition) : IModifyWeaponAttackMode { public void ModifyAttackMode(RulesetCharacter character, [CanBeNull] RulesetAttackMode attackMode) @@ -1047,8 +1015,7 @@ public void ModifyAttackMode(RulesetCharacter character, [CanBeNull] RulesetAtta } } - private class TryAlterOutcomeAttackRogueStrokeOfLuck(FeatureDefinitionPower power) - : ITryAlterOutcomeAttack + private class TryAlterOutcomeAttackRogueStrokeOfLuck(FeatureDefinitionPower power) : ITryAlterOutcomeAttack { public int HandlerPriority => -10; @@ -1063,10 +1030,11 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(power, rulesetAttacker); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || - rulesetAttacker.GetRemainingPowerUses(power) == 0) + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -1075,7 +1043,6 @@ public IEnumerator OnTryAlterOutcomeAttack( var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetAttacker); var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) { StringParameter = "RogueStrokeOfLuck", @@ -1105,21 +1072,14 @@ public IEnumerator OnTryAlterOutcomeAttack( } } - private sealed class BattleStartedListenerBardSuperiorInspiration( - // ReSharper disable once SuggestBaseTypeForParameterInConstructor - FeatureDefinition featureDefinition) + private sealed class BattleStartedListenerBardSuperiorInspiration(FeatureDefinition featureDefinition) : ICharacterBattleStartedListener { public void OnCharacterBattleStarted(GameLocationCharacter locationCharacter, bool surprise) { var character = locationCharacter.RulesetCharacter; - if (character == null) - { - return; - } - - if (character.RemainingBardicInspirations != 0) + if (character is not { RemainingBardicInspirations: 0 }) { return; } From bbf0b2c400663af6837bb975dc2b20a5b3d3bfe4 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 07:30:56 -0700 Subject: [PATCH 010/162] add GameLocationCharacterExtension.MyExecuteAction --- .../GameLocationCharacterExtensions.cs | 28 ++++++++ .../ChangelogHistory.txt | 4 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 28 ++------ .../Models/Level20SubclassesContext.cs | 15 +--- SolastaUnfinishedBusiness/Races/Malakh.cs | 28 +------- .../Spells/SpellBuildersLevel01.cs | 47 +------------ .../Spells/SpellBuildersLevel03.cs | 68 ++----------------- .../Spells/SpellBuildersLevel08.cs | 24 +------ .../Builders/InvocationsBuilders.cs | 48 ++----------- .../Subclasses/CircleOfTheWildfire.cs | 48 +------------ .../Subclasses/CollegeOfAudacity.cs | 24 +------ .../Subclasses/CollegeOfElegance.cs | 23 +------ .../Subclasses/CollegeOfThespian.cs | 24 +------ .../Subclasses/InnovationArtillerist.cs | 20 +----- .../Subclasses/InnovationVitriolist.cs | 22 +----- .../Subclasses/MartialArcaneArcher.cs | 24 +------ .../Subclasses/OathOfThunder.cs | 22 +----- .../Subclasses/PathOfTheElements.cs | 25 +------ .../Subclasses/PathOfTheYeoman.cs | 30 +------- .../Subclasses/RangerSkyWarrior.cs | 21 +----- .../Subclasses/RoguishArcaneScoundrel.cs | 23 +------ .../Subclasses/SorcerousFieldManipulator.cs | 23 +------ .../Subclasses/SorcerousWildMagic.cs | 27 +------- .../Subclasses/WayOfTheDiscordance.cs | 57 +--------------- .../Subclasses/WayOfTheStormSoul.cs | 22 +----- .../Subclasses/WizardWarMagic.cs | 21 +----- 26 files changed, 78 insertions(+), 668 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 0bb5e183bf..7a2e6c8e6d 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -15,6 +15,34 @@ namespace SolastaUnfinishedBusiness.Api.GameExtensions; public static class GameLocationCharacterExtensions { + internal static void MyExecuteAction( + this GameLocationCharacter character, + Id actionId, + RulesetUsablePower usablePower, + List targets) + { + var actionModifiers = new List(); + var rulesetCharacter = character.RulesetCharacter; + var implementationManager = + ServiceRepository.GetService() as RulesetImplementationManager; + + for (var i = 0; i < targets.Count; i++) + { + actionModifiers.Add(new ActionModifier()); + } + + var actionParams = new CharacterActionParams(character, actionId) + { + ActionModifiers = actionModifiers, + RulesetEffect = implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, false), + UsablePower = usablePower, + targetCharacters = targets + }; + + // must enqueue actions whenever within an attack workflow otherwise game won't consume attack + ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); + } + internal static GameLocationCharacter GetEffectControllerOrSelf(this GameLocationCharacter character) { if (character.RulesetCharacter is not RulesetCharacterEffectProxy effectProxy) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 0f361f0467..ea0bcfb53e 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -8,8 +8,8 @@ KNOWN ISSUES: -- Artillerist Force Ballista tiny cannon doesn't force attack DIS within 5 ft -- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses +- Artillerist Force Ballista tiny cannon doesn't force disadvantage if attack is within 5 ft +- Chaos Bolt spell damage will be of wrong type under multiplayer if twinned and one bolt misses [won't fix] 1.5.97.25: diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 9b5086f5d0..9ebb22a6ed 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2933,42 +2933,22 @@ public IEnumerator HandleReducedToZeroHpByMe( yield break; } - if (!ValidatorsWeapon.IsMelee(attackMode) && !ValidatorsWeapon.IsUnarmed(attackMode)) + if (!ValidatorsWeapon.IsMelee(attackMode) && + !ValidatorsWeapon.IsUnarmed(attackMode)) { yield break; } var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerMerciless, rulesetAttacker); var proficiencyBonus = rulesetAttacker.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); var distance = attacker.UsedSpecialFeatures.TryGetValue(MercilessName, out var value) && value == 1 ? proficiencyBonus : (proficiencyBonus + 1) / 2; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerMerciless, rulesetAttacker); var targets = Gui.Battle.GetContenders( downedCreature, attacker, isOppositeSide: false, hasToPerceivePerceiver: true, withinRange: distance); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 2d6c22c8ef..3bbef0d266 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -1507,22 +1507,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerFortuneFavorTheBold, rulesetCharacter); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { actingCharacter } - }; - ServiceRepository.GetService() - ?.ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, [actingCharacter]); yield break; } diff --git a/SolastaUnfinishedBusiness/Races/Malakh.cs b/SolastaUnfinishedBusiness/Races/Malakh.cs index a78a346287..50f3c0d5a2 100644 --- a/SolastaUnfinishedBusiness/Races/Malakh.cs +++ b/SolastaUnfinishedBusiness/Races/Malakh.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using JetBrains.Annotations; +using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; @@ -328,31 +327,10 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) } var rulesetAttacker = locationCharacter.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 3); - - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var usablePower = PowerProvider.Get(powerAngelicRadianceDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(locationCharacter, ActionDefinitions.Id.SpendPower) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; + var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 3); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + locationCharacter.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index b122dfb4d7..233c22e745 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -1338,13 +1338,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, EffectLevel = actionCastSpell.ActionParams.activeEffect.EffectLevel; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - // need to loop over target characters to support twinned metamagic scenarios foreach (var target in actionCastSpell.ActionParams.TargetCharacters) { - var contenders = Gui.Battle.AllContenders + var targets = Gui.Battle.AllContenders .Where(x => x.RulesetCharacter is { IsDeadOrDyingOrUnconscious: false } && x.IsWithinRange(target, 1)) @@ -1354,24 +1351,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, usablePower.saveDC = 8 + actionCastSpell.ActiveSpell.MagicAttackBonus; - var actionModifiers = new List(); - - for (var i = 0; i < contenders.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(caster, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - targetCharacters = contenders - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + caster.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } @@ -2367,30 +2347,9 @@ public IEnumerator OnPhysicalAttackFinishedByMe( } var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerSpikeBarrage, rulesetAttacker); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index e14ba79d7b..af389d1d5e 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -491,7 +491,7 @@ private sealed class MoveStepFinishedAshardalonStride( public void MoveStepFinished(GameLocationCharacter mover) { var locationCharacterService = ServiceRepository.GetService(); - var contenders = + var targets = (Gui.Battle?.AllContenders ?? locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters)) .Where(x => x.IsWithinRange(mover, 1) && @@ -503,27 +503,7 @@ public void MoveStepFinished(GameLocationCharacter mover) var rulesetAttacker = mover.RulesetCharacter; var usablePower = PowerProvider.Get(powerDamage, rulesetAttacker); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionModifiers = new List(); - - for (var i = 0; i < contenders.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(mover, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = contenders - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + mover.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } @@ -756,30 +736,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - var actionModifiers = new List(); - for (var i = 0; i < _targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - // don't use PowerNoCost here as it breaks the spell under MP - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = _targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, _targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) @@ -1475,30 +1434,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( } // leap damage on enemies within 10 ft from target - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; var usablePower = PowerProvider.Get(powerLightningArrowLeap, rulesetAttacker); var targets = battleManager.Battle .GetContenders(defender, isOppositeSide: false, withinRange: 2); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs index b5c0171316..17d0aed46d 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs @@ -338,33 +338,13 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; + var usablePower = PowerProvider.Get(power, rulesetCharacter); var target = action.actionParams.TargetCharacters[0]; var targets = Gui.Battle.GetContenders( target, actingCharacter, isOppositeSide: false, hasToPerceiveTarget: true, withinRange: 12); - var actionModifiers = new List(); actingCharacter.UsedSpecialFeatures.TryAdd("SoulExpulsion", action.ActionParams.RulesetEffect.EffectLevel); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(power, rulesetCharacter); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService() - ?.ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index 2aa95221e6..7fbaa41369 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -1123,30 +1123,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var defender = action.ActionParams.TargetCharacters[0]; var rulesetAttacker = attacker.RulesetCharacter; - var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerChillingHexDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; + var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } @@ -1328,30 +1308,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var defender = action.ActionParams.TargetCharacters[0]; var rulesetAttacker = attacker.RulesetCharacter; - var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerVexingHexDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; + var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index d62711a996..3edc2d05d6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -659,18 +659,14 @@ private sealed class PowerOrSpellFinishedByMeSummonSpirit(FeatureDefinitionPower { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; var locationCharacterService = ServiceRepository.GetService(); - var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerSummonSpirit, rulesetAttacker); var spirit = GetMySpirit(attacker.Guid); - var contenders = Gui.Battle?.AllContenders ?? locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters); - var targets = contenders .Where(x => attacker != x && @@ -678,25 +674,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, spirit.IsWithinRange(x, 2)) .ToList(); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var usablePower = PowerProvider.Get(powerSummonSpirit, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(Id.PowerNoCost, usablePower, targets); yield break; } @@ -743,29 +721,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - var actionModifiers = new List(); - - for (var i = 0; i < _targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = _targets - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(Id.PowerNoCost, usablePower, _targets); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index 9fe79edb18..e314e4b354 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -280,30 +280,10 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( } var rulesetAttacker = attacker.RulesetCharacter; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - + var usablePower = PowerProvider.Get(powerSlashingWhirlDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker, withinRange: 1).Where(x => x != defender).ToList(); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var usablePower = PowerProvider.Get(powerSlashingWhirlDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); } public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs index 44c48dae36..f863a27868 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs @@ -392,30 +392,9 @@ public IEnumerator OnPhysicalAttackFinishedByMe( usablePower.Consume(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePowerEnemy = PowerProvider.Get(powerAmazingDisplayEnemy, rulesetAttacker); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = - new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePowerEnemy, false), - UsablePower = usablePowerEnemy, - targetCharacters = targets - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerEnemy, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs index 9681fb74e9..e9ed093c10 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Collections.Generic; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; @@ -292,30 +291,9 @@ public IEnumerator HandleReducedToZeroHpByMe( var classLevel = rulesetAttacker.GetClassLevel(CharacterClassDefinitions.Bard); var power = classLevel < 14 ? powerTerrificPerformance : powerImprovedTerrificPerformance; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetAttacker); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs index 1e4af2e14a..e3a0ac019d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api; @@ -1077,25 +1076,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, ServiceRepository.GetService() as RulesetImplementationManager; var usablePower = PowerProvider.Get(powerEldritchDetonation, rulesetTarget); - var effectPower = implementationManager - .MyInstantiateEffectPower(rulesetTarget, usablePower, false); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(selectedTarget, Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = effectPower, - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + selectedTarget.MyExecuteAction(Id.PowerNoCost, usablePower, targets); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs index 17e109b4f8..3f952f2a55 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs @@ -606,29 +606,9 @@ private void DamageReceivedHandler( private void InflictDamage(GameLocationCharacter attacker, List targets) { var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var usablePower = PowerProvider.Get(powerVitriolicInfusion, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs index 83b60e844e..06d1460ff8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs @@ -689,34 +689,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( private void HandleBurstingArrow(GameLocationCharacter attacker, GameLocationCharacter defender) { var rulesetAttacker = attacker.RulesetCharacter; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - + var usablePower = PowerProvider.Get(powerBurstingArrowDamage, rulesetAttacker); var targets = Gui.Battle.AllContenders .Where(x => x.IsWithinRange(defender, 3) && x != defender) .ToList(); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var usablePower = PowerProvider.Get(powerBurstingArrowDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - EffectHelpers .StartVisualEffect(attacker, defender, SpellDefinitions.Shatter, EffectHelpers.EffectType.Zone); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs index c02d33cb9e..20136364b9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfThunder.cs @@ -374,31 +374,11 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerBifrostDamage, rulesetAttacker); var targets = Gui.Battle .GetContenders(attacker, hasToPerceiveTarget: true, withinRange: 2); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs index 8695795454..2d94cf3c08 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Collections.Generic; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; @@ -531,30 +530,10 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) return; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 1); - - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var usablePower = PowerProvider.Get(powerDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(locationCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + locationCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs index 0397943e09..933b2d44b3 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheYeoman.cs @@ -318,14 +318,10 @@ public IEnumerator OnPhysicalAttackFinishedByMe( RollOutcome rollOutcome, int damageAmount) { - if (rollOutcome is RollOutcome.Failure or RollOutcome.CriticalFailure) - { - yield break; - } - var rulesetAttacker = attacker.RulesetCharacter; - if (rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || + if (rollOutcome is RollOutcome.Failure or RollOutcome.CriticalFailure || + rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || !rulesetAttacker.HasConditionOfTypeOrSubType(ConditionRaging) || rulesetAttacker.IsWearingHeavyArmor() || !IsLongBow(attackMode, null, null)) @@ -333,31 +329,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerMightyShot, rulesetAttacker); var targets = battleManager.Battle .GetContenders(defender, isOppositeSide: false, withinRange: 3); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs index 5ef8af2803..5696e8500d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs @@ -423,28 +423,9 @@ private void HandleConditionAndDamage(GameLocationCharacter attacker, bool criti } } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerDeathFromAbove, rulesetAttacker); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs index bfac969889..aa4d152faa 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishArcaneScoundrel.cs @@ -312,31 +312,10 @@ public IEnumerator OnMagicEffectFinishedByMe( } var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerArcaneBackslash, rulesetAttacker); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, false); attacker.UsedSpecialFeatures.TryAdd(AdditionalDamageRogueSneakAttack.Name, 1); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs index ed9d80943c..fc38da91cc 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousFieldManipulator.cs @@ -1,5 +1,4 @@ using System.Collections; -using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; @@ -245,30 +244,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerApply, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker, withinRange: 2); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index d76018250a..342277d3bb 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -1412,35 +1412,12 @@ private static void ApplyWildSurge( private static void ExecutePowerNoCostOnCasterLocation( GameLocationCharacter caster, FeatureDefinitionPower power, int range = 0, bool includeCaster = true) { - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; var rulesetCaster = caster.RulesetCharacter; var usablePower = PowerProvider.Get(power, rulesetCaster); - var actionModifiers = new List(); var targets = new List(); - if (range > 0) - { - EnumerateTargetsWithinRange(caster, range, targets, includeCaster); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - } - - var actionParams = new CharacterActionParams(caster, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - Positions = { caster.LocationPosition }, - targetCharacters = targets - }; - - actionService.ExecuteAction(actionParams, null, true); + EnumerateTargetsWithinRange(caster, range, targets, includeCaster); + caster.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs index c890b67a3c..59935b42dd 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs @@ -497,30 +497,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var actingCharacter = action.ActingCharacter; var rulesetCharacter = actingCharacter.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePowerDiscordance = PowerProvider.Get(powerDiscordance, rulesetCharacter); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParamsDiscordance = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePowerDiscordance, false), - UsablePower = usablePowerDiscordance, - targetCharacters = targets - }; - - // must enqueue actions - ServiceRepository.GetService()? - .ExecuteAction(actionParamsDiscordance, null, true); + actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerDiscordance, targets); // Turmoil var monkLevel = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Monk); @@ -539,26 +518,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, yield break; } - actionModifiers = []; - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var usablePowerTurmoil = PowerProvider.Get(powerTurmoil, rulesetCharacter); - var actionParamsTurmoil = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePowerTurmoil, false), - UsablePower = usablePowerTurmoil, - targetCharacters = targets - }; - // must enqueue actions - ServiceRepository.GetService()? - .ExecuteAction(actionParamsTurmoil, null, true); + actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerTurmoil, targets); } } @@ -627,22 +589,9 @@ public IEnumerator HandleReducedToZeroHpByMeOrAlly( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerTidesOfChaos, rulesetAlly); - var actionParams = new CharacterActionParams(ally, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAlly, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { ally } - }; - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + ally.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, [ally]); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs index a2767506d5..dfa03dd3a6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs @@ -353,10 +353,6 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerEyeOfTheStormLeap, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker) .Where(x => @@ -364,24 +360,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, .Any(y => y.ConditionDefinition == conditionEyeOfTheStorm && y.SourceGuid == rulesetAttacker.Guid)) .ToList(); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index 1e554330c7..023d27b8e2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -324,33 +324,14 @@ private void HandleDeflectionShroud(GameLocationCharacter helper) return; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerDeflectionShroud, rulesetHelper); var targets = Gui.Battle .GetContenders(helper, withinRange: 12) .OrderBy(x => DistanceCalculation.GetDistanceFromCharacters(helper, x)) .Take(3) .ToList(); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(helper, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + helper.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } From 50ea70ba6e46bb00e9dde9b8a62932e500ee5d07 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 16:30:26 -0700 Subject: [PATCH 011/162] fix Cleric domains missing divine intervention improvement at 20 --- .../DomainDefiler.json | 5 ++ .../DomainNature.json | 5 ++ .../DomainSmith.json | 5 ++ .../DomainTempest.json | 5 ++ .../ChangelogHistory.txt | 1 + .../Models/Level20SubclassesContext.cs | 69 ++++++++++--------- .../Subclasses/DomainDefiler.cs | 3 + .../Subclasses/DomainNature.cs | 1 + .../Subclasses/DomainSmith.cs | 2 + .../Subclasses/DomainTempest.cs | 1 + 10 files changed, 64 insertions(+), 33 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainDefiler.json b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainDefiler.json index 12e8c051c7..a5887a44b2 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainDefiler.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainDefiler.json @@ -50,6 +50,11 @@ "$type": "FeatureUnlockByLevel, Assembly-CSharp", "featureDefinition": "Definition:ActionAffinityDyingLightToggle:503a74fe-d34e-5fcf-84a8-d8a323810192", "level": 17 + }, + { + "$type": "FeatureUnlockByLevel, Assembly-CSharp", + "featureDefinition": "Definition:PowerClericDivineInterventionImprovementWizard:e0410025-6a51-589f-9dc3-ecf95d055f7c", + "level": 20 } ], "personalityFlagOccurences": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainNature.json b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainNature.json index 8e913217bd..00932aaefb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainNature.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainNature.json @@ -40,6 +40,11 @@ "$type": "FeatureUnlockByLevel, Assembly-CSharp", "featureDefinition": "Definition:FeatureSetDomainNatureMasterOfNature:00bb2bae-2f33-5351-b3df-e071fd77d075", "level": 17 + }, + { + "$type": "FeatureUnlockByLevel, Assembly-CSharp", + "featureDefinition": "Definition:PowerClericDivineInterventionImprovementCleric:d463d058-27db-559b-bf57-65c39d3150bb", + "level": 20 } ], "personalityFlagOccurences": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainSmith.json b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainSmith.json index a535127496..e61c223f13 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainSmith.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainSmith.json @@ -60,6 +60,11 @@ "$type": "FeatureUnlockByLevel, Assembly-CSharp", "featureDefinition": "Definition:FeatureDomainSmithBlessedMetal:af616884-6e4e-54ea-93ec-6e13d7e5a730", "level": 17 + }, + { + "$type": "FeatureUnlockByLevel, Assembly-CSharp", + "featureDefinition": "Definition:PowerClericDivineInterventionImprovementPaladin:11d90029-4c67-591e-8e69-f6d52b78d522", + "level": 20 } ], "personalityFlagOccurences": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainTempest.json b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainTempest.json index d29aad5816..ef9d9b14a0 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainTempest.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/CharacterSubclassDefinition/DomainTempest.json @@ -40,6 +40,11 @@ "$type": "FeatureUnlockByLevel, Assembly-CSharp", "featureDefinition": "Definition:FeatureSetDomainTempestStormborn:efa2d88f-e805-56e3-924c-e9cae68385e8", "level": 17 + }, + { + "$type": "FeatureUnlockByLevel, Assembly-CSharp", + "featureDefinition": "Definition:PowerClericDivineInterventionImprovementWizard:e0410025-6a51-589f-9dc3-ecf95d055f7c", + "level": 20 } ], "personalityFlagOccurences": [], diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index ea0bcfb53e..f5bd480c10 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -2,6 +2,7 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Martial Guardian not getting the Sentinel feat +- fixed Cleric domains missing divine intervention improvement at 20 - fixed Sunlit Blade cantrip highlighted condition duration - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 3bbef0d266..552fe080c0 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -29,6 +29,32 @@ namespace SolastaUnfinishedBusiness.Models; internal static class Level20SubclassesContext { + private const string Tag = "PowerClericImprovedDivineIntervention"; + + internal static readonly FeatureDefinitionPower PowerClericDivineInterventionImprovementCleric = + FeatureDefinitionPowerBuilder + .Create(PowerClericDivineInterventionCleric, "PowerClericDivineInterventionImprovementCleric") + .SetOrUpdateGuiPresentation(Tag, Category.Feature) + .SetHasCastingFailure(false) + .SetOverriddenPower(PowerClericDivineInterventionCleric) + .AddToDB(); + + internal static readonly FeatureDefinitionPower PowerClericDivineInterventionImprovementPaladin = + FeatureDefinitionPowerBuilder + .Create(PowerClericDivineInterventionPaladin, "PowerClericDivineInterventionImprovementPaladin") + .SetOrUpdateGuiPresentation(Tag, Category.Feature) + .SetHasCastingFailure(false) + .SetOverriddenPower(PowerClericDivineInterventionPaladin) + .AddToDB(); + + internal static readonly FeatureDefinitionPower PowerClericDivineInterventionImprovementWizard = + FeatureDefinitionPowerBuilder + .Create(PowerClericDivineInterventionWizard, "PowerClericDivineInterventionImprovementWizard") + .SetOrUpdateGuiPresentation(Tag, Category.Feature) + .SetHasCastingFailure(false) + .SetOverriddenPower(PowerClericDivineInterventionWizard) + .AddToDB(); + internal static void Load() { ClericLoad(); @@ -392,49 +418,26 @@ private static void ClericLoad() // Divine Intervention [ALL CLERICS] // - const string TAG = "PowerClericImprovedDivineIntervention"; - - var powerClericDivineInterventionImprovementCleric = FeatureDefinitionPowerBuilder - .Create(PowerClericDivineInterventionCleric, "PowerClericDivineInterventionImprovementCleric") - .SetOrUpdateGuiPresentation(TAG, Category.Feature) - .SetHasCastingFailure(false) - .SetOverriddenPower(PowerClericDivineInterventionCleric) - .AddToDB(); - - var powerClericDivineInterventionImprovementPaladin = FeatureDefinitionPowerBuilder - .Create(PowerClericDivineInterventionPaladin, "PowerClericDivineInterventionImprovementPaladin") - .SetOrUpdateGuiPresentation(TAG, Category.Feature) - .SetHasCastingFailure(false) - .SetOverriddenPower(PowerClericDivineInterventionPaladin) - .AddToDB(); - - var powerClericDivineInterventionImprovementWizard = FeatureDefinitionPowerBuilder - .Create(PowerClericDivineInterventionWizard, "PowerClericDivineInterventionImprovementWizard") - .SetOrUpdateGuiPresentation(TAG, Category.Feature) - .SetHasCastingFailure(false) - .SetOverriddenPower(PowerClericDivineInterventionWizard) - .AddToDB(); - DomainBattle.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementPaladin, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementPaladin, 20)); DomainElementalCold.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementWizard, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementWizard, 20)); DomainElementalFire.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementWizard, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementWizard, 20)); DomainElementalLighting.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementWizard, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementWizard, 20)); DomainInsight.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementCleric, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementCleric, 20)); DomainLaw.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementPaladin, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementPaladin, 20)); DomainLife.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementCleric, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementCleric, 20)); DomainMischief.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementWizard, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementWizard, 20)); DomainOblivion.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementCleric, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementCleric, 20)); DomainSun.FeatureUnlocks.Add( - new FeatureUnlockByLevel(powerClericDivineInterventionImprovementWizard, 20)); + new FeatureUnlockByLevel(PowerClericDivineInterventionImprovementWizard, 20)); } private static void FighterLoad() diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs b/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs index e5a1eaaee4..dc94966049 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainDefiler.cs @@ -9,6 +9,7 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Properties; using SolastaUnfinishedBusiness.Validators; using static RuleDefinitions; @@ -193,6 +194,8 @@ public DomainDefiler() powerDyingLight, actionAffinityDyingLightToggle, autoPreparedSpellsDyingLight) + .AddFeaturesAtLevel(20, + Level20SubclassesContext.PowerClericDivineInterventionImprovementWizard) .AddToDB(); } diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs index 9102f5fea2..bb22fe3766 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs @@ -259,6 +259,7 @@ public DomainNature() .AddFeaturesAtLevel(8, additionalDamageDivineStrike) .AddFeaturesAtLevel(10, PowerClericDivineInterventionWizard) .AddFeaturesAtLevel(17, featureSetMasterOfNature) + .AddFeaturesAtLevel(20, Level20SubclassesContext.PowerClericDivineInterventionImprovementCleric) .AddToDB(); Subclass = _domainNature; diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs index ddddadbe32..bed971c102 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainSmith.cs @@ -360,6 +360,8 @@ public DomainSmith() powerReinforceArmor16) .AddFeaturesAtLevel(17, featureBlessedMetal) + .AddFeaturesAtLevel(20, + Level20SubclassesContext.PowerClericDivineInterventionImprovementPaladin) .AddToDB(); return; diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index 109b590263..ea1827c6b9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -269,6 +269,7 @@ public DomainTempest() .AddFeaturesAtLevel(8, additionalDamageDivineStrike) .AddFeaturesAtLevel(10, PowerClericDivineInterventionPaladin) .AddFeaturesAtLevel(17, featureSetStormborn) + .AddFeaturesAtLevel(20, Level20SubclassesContext.PowerClericDivineInterventionImprovementWizard) .AddToDB(); } From ab9f768f6a0a94f480f9d7af268d5bc70d99850f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:38:58 -0700 Subject: [PATCH 012/162] add GameLocationCharacterExtensions.MyReactToUsePower --- .../GameLocationCharacterExtensions.cs | 54 ++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 7a2e6c8e6d..deeaf7c762 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections; +using System.Collections.Generic; using System.Linq; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.ModKit.Utility; @@ -43,6 +45,56 @@ internal static void MyExecuteAction( ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); } + internal static IEnumerator MyReactToUsePower(this GameLocationCharacter character, + Id actionId, + RulesetUsablePower usablePower, + List targets, + GameLocationCharacter waiter, + string stringParameter, + string stringParameter2 = "", + Action reactionValidated = null, + GameLocationBattleManager battleManager = null) + { + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!battleManager) + { + yield break; + } + + var actionService = ServiceRepository.GetService(); + var count = actionService.PendingReactionRequestGroups.Count; + var implementationManager = + ServiceRepository.GetService() as RulesetImplementationManager; + var actionModifiers = new List(); + + for (var i = 0; i < targets.Count; i++) + { + actionModifiers.Add(new ActionModifier()); + } + + var actionParams = new CharacterActionParams(character, actionId) + { + StringParameter = stringParameter, + StringParameter2 = stringParameter2, + ActionModifiers = actionModifiers, + RulesetEffect = + implementationManager.MyInstantiateEffectPower(character.RulesetCharacter, usablePower, false), + UsablePower = usablePower, + targetCharacters = targets, + IsReactionEffect = true + }; + + actionService.ReactToUsePower(actionParams, "UsePower", character); + + yield return battleManager.WaitForReactions(waiter, actionService, count); + + if (actionParams.ReactionValidated) + { + reactionValidated?.Invoke(); + } + } + internal static GameLocationCharacter GetEffectControllerOrSelf(this GameLocationCharacter character) { if (character.RulesetCharacter is not RulesetCharacterEffectProxy effectProxy) From ae2aa7859af9e0b834c19deaf9b044b21d7224ce Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:41:54 -0700 Subject: [PATCH 013/162] change Way of Silhouette shadowy sanctuary to use MyReactToUsePower --- .../Subclasses/WayOfTheSilhouette.cs | 49 +++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs index 0e6e49c0f0..a2f35d7cea 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs @@ -282,46 +282,35 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerShadowSanctuary, rulesetDefender); if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || - helper != defender || + defender != helper || !defender.CanReact() || - rulesetDefender.GetRemainingPowerUses(powerShadowSanctuary) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "ShadowySanctuary", + reactionValidated: ReactionValidated, + battleManager: battleManager); - var usablePower = PowerProvider.Get(powerShadowSanctuary, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "ShadowySanctuary", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); - - if (!actionParams.ReactionValidated) - { - yield break; - } + yield break; - var delta = -action.AttackSuccessDelta - 1; + void ReactionValidated() + { + var delta = -action.AttackSuccessDelta - 1; - action.AttackRollOutcome = RollOutcome.Failure; - action.AttackSuccessDelta = -1; - action.AttackRoll += delta; + action.AttackRollOutcome = RollOutcome.Failure; + action.AttackSuccessDelta = -1; + action.AttackRoll += delta; + } } } } From 7835e4ff6952ca906e40c658a9e67b4bfe415b97 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:43:46 -0700 Subject: [PATCH 014/162] change Way of Dragon reactive hide to use MyReactToUsePower --- .../Subclasses/WayOfTheDragon.cs | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs index 9ad508e9f7..92fa1a6123 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs @@ -846,36 +846,23 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerReactiveHide, rulesetDefender); - if (helper != defender || + if (defender != helper || !defender.CanReact() || - rulesetEffect != null || !ValidatorsWeapon.IsMelee(attackMode) || - rulesetDefender.GetRemainingPowerUses(powerReactiveHide) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerReactiveHide, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "ReactiveHide", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "ReactiveHide", + battleManager: battleManager); } } } From 3e2beb0984c728a4258450555a356588f279c4aa Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:48:40 -0700 Subject: [PATCH 015/162] change Sorcerous Wild Magic bend luck to use MyReactToUsePower --- .../Subclasses/SorcerousWildMagic.cs | 427 ++++++++---------- 1 file changed, 198 insertions(+), 229 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index 342277d3bb..ffabcffdd9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -846,86 +846,77 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = stringParameter, - StringParameter2 = $"Use{stringParameter}Description".Formatted(Category.Reaction, attacker.Name), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { helper } - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield return helper.MyReactToUsePower(ActionDefinitions.Id.PowerReaction, + usablePower, + [helper], + attacker, + stringParameter, + $"Use{stringParameter}Description".Formatted(Category.Reaction, attacker.Name), + ReactionValidated, + battleManager); - actionService.ReactToUsePower(reactionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - EffectHelpers.StartVisualEffect(helper, attacker, - PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); + EffectHelpers.StartVisualEffect(helper, attacker, + PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); - var dieRoll = rulesetHelper.RollDie(DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); + var dieRoll = rulesetHelper.RollDie( + DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); - if (helper.Side == attacker.Side) - { - attackModifier.AttacktoHitTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.AttackSuccessDelta += dieRoll; - attackModifier.AttackRollModifier += dieRoll; - action.AttackRollOutcome = action.AttackSuccessDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckAttackToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.AttackRollOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); - } - else - { - attackModifier.AttacktoHitTrends.Add( - new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.AttackSuccessDelta -= dieRoll; - attackModifier.AttackRollModifier -= dieRoll; - action.AttackRollOutcome = action.AttackSuccessDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckEnemyAttackToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.AttackRollOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); + if (helper.Side == attacker.Side) + { + attackModifier.AttacktoHitTrends.Add( + new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + action.AttackSuccessDelta += dieRoll; + attackModifier.AttackRollModifier += dieRoll; + action.AttackRollOutcome = + action.AttackSuccessDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckAttackToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (action.AttackRollOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } + else + { + attackModifier.AttacktoHitTrends.Add( + new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + action.AttackSuccessDelta -= dieRoll; + attackModifier.AttackRollModifier -= dieRoll; + action.AttackRollOutcome = + action.AttackSuccessDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckEnemyAttackToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (action.AttackRollOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } } } @@ -966,90 +957,79 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return helper.MyReactToUsePower(ActionDefinitions.Id.PowerReaction, + usablePower, + [helper], + defender, + stringParameter, + $"Use{stringParameter}Description".Formatted(Category.Reaction, defender.Name), + ReactionValidated, + battleManager); - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = stringParameter, - StringParameter2 = $"Use{stringParameter}Description".Formatted(Category.Reaction, defender.Name), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { helper } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(defender, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - EffectHelpers.StartVisualEffect(helper, defender, - PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); + EffectHelpers.StartVisualEffect(helper, defender, + PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); - var dieRoll = rulesetHelper.RollDie(DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); + var dieRoll = rulesetHelper.RollDie( + DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); - if (helper.Side == defender.Side) - { - abilityCheckModifier.AbilityCheckAdvantageTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - abilityCheckModifier.AbilityCheckModifier += dieRoll; - abilityCheckData.AbilityCheckSuccessDelta += dieRoll; - abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? RollOutcome.Success - : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckCheckToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (abilityCheckData.AbilityCheckRollOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); - } - else - { - abilityCheckModifier.AbilityCheckAdvantageTrends.Add( - new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - abilityCheckModifier.AbilityCheckModifier -= dieRoll; - abilityCheckData.AbilityCheckSuccessDelta -= dieRoll; - abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? RollOutcome.Success - : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckEnemyCheckToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (abilityCheckData.AbilityCheckRollOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); + if (helper.Side == defender.Side) + { + abilityCheckModifier.AbilityCheckAdvantageTrends.Add( + new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + abilityCheckModifier.AbilityCheckModifier += dieRoll; + abilityCheckData.AbilityCheckSuccessDelta += dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckCheckToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (abilityCheckData.AbilityCheckRollOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } + else + { + abilityCheckModifier.AbilityCheckAdvantageTrends.Add( + new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + abilityCheckModifier.AbilityCheckModifier -= dieRoll; + abilityCheckData.AbilityCheckSuccessDelta -= dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckEnemyCheckToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (abilityCheckData.AbilityCheckRollOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } } } @@ -1093,86 +1073,75 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return helper.MyReactToUsePower(ActionDefinitions.Id.PowerReaction, + usablePower, + [helper], + attacker, + stringParameter, + $"Use{stringParameter}Description".Formatted(Category.Reaction, defender.Name), + ReactionValidated, + battleManager); - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = stringParameter, - StringParameter2 = $"Use{stringParameter}Description".Formatted(Category.Reaction, defender.Name), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - EffectHelpers.StartVisualEffect(helper, defender, - PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); + EffectHelpers.StartVisualEffect(helper, defender, + PowerDomainLawHolyRetribution, EffectHelpers.EffectType.Caster); - var dieRoll = rulesetHelper.RollDie(DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); + var dieRoll = rulesetHelper.RollDie( + DieType.D4, RollContext.None, false, AdvantageType.None, out _, out _); - if (helper.Side == attacker.Side) - { - saveModifier.SavingThrowAdvantageTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.SaveOutcomeDelta += dieRoll; - saveModifier.SavingThrowModifier += dieRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckSavingToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.SaveOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); - } - else - { - saveModifier.SavingThrowAdvantageTrends.Add( - new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) - { - dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None - }); - - action.SaveOutcomeDelta -= dieRoll; - saveModifier.SavingThrowModifier -= dieRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - powerBendLuck.GuiPresentation.Title, - "Feedback/&BendLuckEnemySavingToHitRoll", - tooltipContent: powerBendLuck.Name, - tooltipClass: "PowerDefinition", - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), - (action.SaveOutcome > 0 - ? ConsoleStyleDuplet.ParameterType.Positive - : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); + if (helper.Side == attacker.Side) + { + saveModifier.SavingThrowAdvantageTrends.Add( + new TrendInfo(dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + action.SaveOutcomeDelta += dieRoll; + saveModifier.SavingThrowModifier += dieRoll; + action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckSavingToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (action.SaveOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } + else + { + saveModifier.SavingThrowAdvantageTrends.Add( + new TrendInfo(-dieRoll, FeatureSourceType.Power, powerBendLuck.Name, powerBendLuck) + { + dieType = DieType.D4, dieFlag = TrendInfoDieFlag.None + }); + + action.SaveOutcomeDelta -= dieRoll; + saveModifier.SavingThrowModifier -= dieRoll; + action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + powerBendLuck.GuiPresentation.Title, + "Feedback/&BendLuckEnemySavingToHitRoll", + tooltipContent: powerBendLuck.Name, + tooltipClass: "PowerDefinition", + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(DieType.D4)), + (action.SaveOutcome > 0 + ? ConsoleStyleDuplet.ParameterType.Positive + : ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); + } } } } From fdecaf2d0e20d56e0e503036ffa9ae722abe39ed Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:49:55 -0700 Subject: [PATCH 016/162] change Sorcerous Psion mind over matter to use MyReactToUsePower --- .../Subclasses/SorcerousPsion.cs | 63 ++++++------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs index 3981633d55..c0d18b8b76 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs @@ -346,63 +346,38 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerMindOverMatter, rulesetCharacter); - if (rulesetCharacter.GetRemainingPowerUses(powerMindOverMatter) == 0) + if (Gui.Battle == null || + rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + var targets = Gui.Battle.GetContenders(defender, withinRange: 2); - var usablePower = PowerProvider.Get(powerMindOverMatter, rulesetCharacter); - var targets = battleManager.Battle - .GetContenders(defender, withinRange: 2); - var actionModifiers = new List(); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + targets, + attacker, + "MindOverMatter", + reactionValidated: ReactionValidated); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } + yield break; - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) + void ReactionValidated() { - StringParameter = "MindOverMatter", - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + var tempHitPoints = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Sorcerer) * 3; - yield return battleManager.WaitForReactions(attacker, actionService, count); + rulesetCharacter.StabilizeAndGainHitPoints(1); + rulesetCharacter.ReceiveTemporaryHitPoints( + tempHitPoints, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, rulesetCharacter.Guid); - if (!reactionParams.ReactionValidated) - { - yield break; + ServiceRepository.GetService()? + .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } - - var tempHitPoints = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Sorcerer) * 3; - - rulesetCharacter.StabilizeAndGainHitPoints(1); - rulesetCharacter.ReceiveTemporaryHitPoints( - tempHitPoints, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, rulesetCharacter.Guid); - - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } } From 6d766a2f06ae179f9bc33164eca403cb3cd5931f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:51:04 -0700 Subject: [PATCH 017/162] change Roguish Umbral Stalker umbral soul to use MyReactToUsePower --- .../Subclasses/RoguishUmbralStalker.cs | 54 +++++++------------ 1 file changed, 18 insertions(+), 36 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs index 062cad5151..d39256ee46 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs @@ -428,53 +428,35 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerUmbralSoul, rulesetCharacter); - if (rulesetCharacter.GetRemainingPowerUses(powerUmbralSoul) == 0) + if (rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerUmbralSoul, rulesetCharacter); - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "UmbralSoul", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "UmbralSoul", + reactionValidated: ReactionValidated); - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + yield break; - yield return battleManager.WaitForReactions(attacker, actionService, count); - - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - var hitPoints = 2 * rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Rogue); + var hitPoints = 2 * rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Rogue); - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); + rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - EffectHelpers.StartVisualEffect( - defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + EffectHelpers.StartVisualEffect( + defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); + ServiceRepository.GetService()? + .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + } } } From f5925d0d1072fc2f3ac79bfa347c038a58febafa Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:52:29 -0700 Subject: [PATCH 018/162] change Roguish Blade Caller hail of blades to use MyReactToUsePower --- .../Subclasses/RoguishBladeCaller.cs | 41 ++++++------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs index a996e03dbc..304750634c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs @@ -337,43 +337,26 @@ private IEnumerator HandleHailOfBlades( GameLocationCharacter defender) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerHailOfBlades, rulesetAttacker); - if (!attacker.CanReact() || - rulesetAttacker.GetRemainingPowerUses(powerHailOfBlades) == 0) + if (Gui.Battle == null || + !attacker.CanReact() || + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerHailOfBlades, rulesetAttacker); - var targets = battleManager.Battle + var targets = Gui.Battle .GetContenders(defender, attacker, isOppositeSide: false, excludeSelf: false, hasToPerceiveTarget: true, withinRange: 2); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = - new CharacterActionParams(attacker, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "HailOfBlades", - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", attacker); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + targets, + attacker, + "HailOfBlades", + battleManager: battleManager); } private enum BladeMarkStatus From d3aa4016af1de57a1ed41908770d34a8ce7aa8aa Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:53:38 -0700 Subject: [PATCH 019/162] change Roguish Acrobat heroic uncanny dodge to use MyReactToUsePower --- .../Subclasses/RoguishAcrobat.cs | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs index 9ea83d81de..ac690f9fa6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs @@ -215,36 +215,24 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerHeroicUncannyDodge, rulesetDefender); if (helper != defender || defender.IsMyTurn() || !defender.CanReact() || !defender.CanPerceiveTarget(attacker) || - rulesetDefender.GetRemainingPowerUses(powerHeroicUncannyDodge) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerHeroicUncannyDodge, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "HeroicUncannyDodge", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "HeroicUncannyDodge", + battleManager: battleManager); } } } From 89908eb93eef6a885679de7bed3ef5975b5f09ea Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:54:44 -0700 Subject: [PATCH 020/162] change Ranger Sky Warrior ghostly howl to use MyReactToUsePower --- .../Subclasses/RangerSkyWarrior.cs | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs index 5696e8500d..5bc2ab4afe 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs @@ -311,37 +311,24 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerGhostlyHowl, rulesetHelper); if (helper != defender || !defender.CanReact() || !defender.CanPerceiveTarget(attacker) || !defender.IsWithinRange(attacker, 12) || - rulesetHelper.GetRemainingPowerUses(powerGhostlyHowl) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerGhostlyHowl, rulesetHelper); - var actionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "GhostlyHowl", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [attacker], + attacker, + "GhostlyHowl", + battleManager: battleManager); } } From b7335f1278773a743e797c5fecfa9a645f211b71 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 20:56:30 -0700 Subject: [PATCH 021/162] change Ranger Light Bearer blessed glow to use MyReactToUsePower --- .../Subclasses/RangerLightBearer.cs | 48 +++++-------------- 1 file changed, 11 insertions(+), 37 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs index 7e4a46489c..d1a80a9b65 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs @@ -405,50 +405,24 @@ private sealed class PowerOrSpellFinishedByMeBlessedGlow(FeatureDefinitionPower { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition power) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; - - if (rulesetAttacker.GetRemainingPowerCharges(featureDefinitionPower) <= 0) + var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); + + if (Gui.Battle == null || + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + var targets = Gui.Battle.GetContenders(attacker, withinRange: 5); - var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); - var targets = battleManager.Battle - .GetContenders(attacker, withinRange: 5); - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - - var actionParams = new CharacterActionParams(attacker, Id.PowerNoCost) - { - StringParameter = "BlessedGlow", - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", attacker); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + Id.PowerNoCost, + usablePower, + targets, + attacker, + "BlessedGlow"); } } From 9afd940c16ce05c7829911c8c59e9eea97d91d6b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:01:10 -0700 Subject: [PATCH 022/162] change Patron Mountain barrier of stone to use MyReactToUsePower --- .../Subclasses/PatronMountain.cs | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs index 08f7d9e84d..52162d34bb 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs @@ -246,6 +246,7 @@ public IEnumerator OnTryAlterOutcomeAttack( var rulesetHelper = helper.RulesetCharacter; var levels = rulesetHelper.GetClassLevel(CharacterClassDefinitions.Warlock); var power = levels < 6 ? powerBarrierOfStone : powerEternalGuardian; + var usablePower = PowerProvider.Get(power, rulesetHelper); if (helper == defender || helper.IsOppositeSide(defender.Side) || @@ -253,31 +254,18 @@ public IEnumerator OnTryAlterOutcomeAttack( !helper.CanPerceiveTarget(attacker) || !helper.CanPerceiveTarget(defender) || !helper.IsWithinRange(defender, 7) || - rulesetHelper.GetRemainingPowerUses(power) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(power, rulesetHelper); - var actionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "BarrierOfStone", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "BarrierOfStone", + battleManager: battleManager); } } } From e036486162868df9725cd7d8b9fa7bc051d65c29 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:02:52 -0700 Subject: [PATCH 023/162] change Patron Moonlit moonlight guise to use MyReactToUsePower --- .../Subclasses/PatronMoonlitScion.cs | 32 +++++++------------ 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs index 095e8816c4..131b099e3d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs @@ -585,33 +585,23 @@ private IEnumerator HandleReaction( } var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerMoonlightGuise, rulesetDefender); - if (!defender.CanReact() || - rulesetDefender.GetRemainingPowerUses(powerMoonlightGuise) == 0) + if (actualEffectForms.All(x => x.FormType != EffectForm.EffectFormType.Damage) || + !defender.CanReact() || + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerMoonlightGuise, rulesetDefender); - var reactionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "MoonlightGuise", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "MoonlightGuise", + battleManager: battleManager); } } } From 4772b814a84b84a848de512953ea1e2a956c1c01 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:04:26 -0700 Subject: [PATCH 024/162] change Patron Celestial searing vengeance to use MyReactToUsePower --- .../Subclasses/PatronCelestial.cs | 59 ++++++------------- 1 file changed, 17 insertions(+), 42 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs index ae58f681c3..444d924a57 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs @@ -337,61 +337,36 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerSearingVengeance, rulesetCharacter); - if (rulesetCharacter.GetRemainingPowerUses(powerSearingVengeance) == 0) + if (Gui.Battle == null || + rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + var targets = Gui.Battle.GetContenders(defender, withinRange: 5); - var usablePower = PowerProvider.Get(powerSearingVengeance, rulesetCharacter); - var targets = battleManager.Battle - .GetContenders(defender, withinRange: 5); - var actionModifiers = new List(); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + targets, + attacker, + "SearingVengeance", + reactionValidated: ReactionValidated); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } + yield break; - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) + void ReactionValidated() { - StringParameter = "SearingVengeance", - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + var hitPoints = rulesetCharacter.MissingHitPoints / 2; - yield return battleManager.WaitForReactions(attacker, actionService, count); + rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - if (!reactionParams.ReactionValidated) - { - yield break; + ServiceRepository.GetService() + ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } - - var hitPoints = rulesetCharacter.MissingHitPoints / 2; - - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - ServiceRepository.GetService() - ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } } } From a9f94611d690ba35c78fd2588cf75d3ddaf7279e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:05:17 -0700 Subject: [PATCH 025/162] change Patron Archfey beguiling defense to use MyReactToUsePower --- .../Subclasses/PatronArchfey.cs | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs index 7a80ee6855..7069d9372d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs @@ -555,27 +555,16 @@ private IEnumerator HandleReaction( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var rulesetDefender = defender.RulesetCharacter; var usablePower = PowerProvider.Get(powerBeguilingDefenses, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "BeguilingDefenses", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [attacker], + attacker, + "BeguilingDefenses", + battleManager: battleManager); } } } From 8f1a43b14f86864a268daca86a1b78dfa2526580 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:06:12 -0700 Subject: [PATCH 026/162] change Path of Spirits spirit walker to use MyReactToUsePower --- .../Subclasses/PathOfTheSpirits.cs | 44 ++++++------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheSpirits.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheSpirits.cs index fef798660c..de93467ab9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheSpirits.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheSpirits.cs @@ -444,14 +444,6 @@ public IEnumerator OnMagicEffectFinishedByMe( GameLocationCharacter attacker, List targets) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - if (action is not CharacterActionUsePower characterActionUsePower || (characterActionUsePower.activePower.PowerDefinition != PowerBarbarianRageStart && characterActionUsePower.activePower.PowerDefinition.OverriddenPower != PowerBarbarianRageStart)) @@ -471,34 +463,24 @@ public IEnumerator OnMagicEffectFinishedByMe( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetCharacter); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "SpiritWalker", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [attacker], + attacker, + "SpiritWalker", + reactionValidated: ReactionValidated); - if (!reactionParams.ReactionValidated) - { - yield break; - } + yield break; - if (power == powerRageCost) + void ReactionValidated() { - rulesetCharacter.SpendRagePoint(); + if (power == powerRageCost) + { + rulesetCharacter.SpendRagePoint(); + } } } } From 1b53a945063a06237efa1725391a662a2bbbd3f7 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:07:22 -0700 Subject: [PATCH 027/162] change Path of Reaver bloodbath to use MyReactToUsePower --- .../Subclasses/PathOfTheReaver.cs | 46 ++++++------------- 1 file changed, 13 insertions(+), 33 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs index 79da46922f..6489267779 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs @@ -219,19 +219,12 @@ public IEnumerator HandleReducedToZeroHpByMe( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerBloodBath, rulesetAttacker); if (rulesetAttacker.MissingHitPoints == 0 || !rulesetAttacker.HasConditionOfTypeOrSubType(ConditionRaging) || - rulesetAttacker.GetRemainingPowerUses(powerBloodBath) == 0) + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -244,34 +237,21 @@ public IEnumerator HandleReducedToZeroHpByMe( var classLevel = rulesetAttacker.GetClassLevel(CharacterClassDefinitions.Barbarian); var totalHealing = 2 * classLevel; - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerBloodBath, rulesetAttacker); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "Bloodbath", - StringParameter2 = "UseBloodbathDescription".Formatted( - Category.Reaction, totalHealing.ToString()), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [attacker], + attacker, + "Bloodbath", + "UseBloodbathDescription".Formatted(Category.Reaction, totalHealing.ToString()), + ReactionValidated); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + ReceiveHealing(attacker, totalHealing); } - - ReceiveHealing(attacker, totalHealing); } } From 7b9f47a86e7a4c95d2064f8d44a1e57774333d2f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:08:43 -0700 Subject: [PATCH 028/162] change Path of Ravager intimidating presence to use MyReactToUsePower --- .../Subclasses/PathOfTheRavager.cs | 57 ++++++------------- 1 file changed, 16 insertions(+), 41 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs index fa97599b1e..367a266e14 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheRavager.cs @@ -128,15 +128,8 @@ public IEnumerator OnMagicEffectFinishedByMe( // ReSharper disable once InconsistentNaming List _targets) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - - if (action is not CharacterActionUsePower characterActionUsePower || + if (Gui.Battle == null || + action is not CharacterActionUsePower characterActionUsePower || (characterActionUsePower.activePower.PowerDefinition != PowerBarbarianRageStart && characterActionUsePower.activePower.PowerDefinition.OverriddenPower != PowerBarbarianRageStart)) { @@ -144,7 +137,6 @@ public IEnumerator OnMagicEffectFinishedByMe( } var rulesetCharacter = attacker.RulesetCharacter; - var power = rulesetCharacter.GetRemainingPowerUses(powerLongRest) > 0 ? powerLongRest : rulesetCharacter.GetRemainingPowerUses(powerRageCost) > 0 @@ -156,43 +148,26 @@ public IEnumerator OnMagicEffectFinishedByMe( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetCharacter); - var targets = battleManager.Battle + var targets = Gui.Battle .GetContenders(attacker, null, true, withinRange: 6); - var actionModifiers = new List(); - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + targets, + attacker, + "IntimidatingPresence", + reactionValidated: ReactionValidated); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = actionModifiers, - StringParameter = "IntimidatingPresence", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); - - yield return battleManager.WaitForReactions(attacker, actionService, count); - - if (!reactionParams.ReactionValidated) - { - yield break; - } + yield break; - if (power == powerRageCost) + void ReactionValidated() { - rulesetCharacter.SpendRagePoint(); + if (power == powerRageCost) + { + rulesetCharacter.SpendRagePoint(); + } } } } From 1cf747094fc086ee9d634e5bbcc818400a749315 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:09:24 -0700 Subject: [PATCH 029/162] change Path of Elements elemental conduit to use MyReactToUsePower --- .../Subclasses/PathOfTheElements.cs | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs index 2d94cf3c08..2343d2b82a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheElements.cs @@ -651,27 +651,15 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerElementalConduitWildfire, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "ElementalConduitWildfire", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [attacker], + attacker, + "ElementalConduitWildfire", + battleManager: battleManager); } } } From 6bb13a30ae72c3aa92e2113a9276c2efb8f30fd9 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:10:06 -0700 Subject: [PATCH 030/162] change Path of Beast tail swipe to use MyReactToUsePower --- .../Subclasses/PathOfTheBeast.cs | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index f5037f746e..ee685ad8d0 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -526,26 +526,15 @@ public IEnumerator OnTryAlterOutcomeAttack( defender.UsedSpecialFeatures.Remove(TagBeastTailArmorClass); - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(_powerTailSwipe, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "BeastTailSwipe", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "BeastTailSwipe", + battleManager: battleManager); } protected override AttackModeOrder GetOrder(RulesetCharacter character) From 6654453a37c186ecb5db28a1e2ba6e255e46b6e0 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:11:42 -0700 Subject: [PATCH 031/162] change Oath of Demon Hunter light energy crossbow bolt to use MyReactToUsePower --- .../Subclasses/OathOfDemonHunter.cs | 34 +++++-------------- 1 file changed, 8 insertions(+), 26 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs index caef6c1af3..cbd2d1efb0 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs @@ -207,11 +207,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - if (!battleManager.IsBattleInProgress) - { - yield break; - } - var rulesetDefender = defender.RulesetActor; if (rulesetDefender is not { IsDeadOrDyingOrUnconscious: false } || @@ -221,32 +216,19 @@ public IEnumerator OnPhysicalAttackFinishedByMe( } var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerTrialMark, rulesetAttacker); - if (rulesetAttacker.GetRemainingPowerUses(powerTrialMark) == 0) + if (rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerTrialMark, rulesetAttacker); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "LightEnergyCrossbowBolt", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "LightEnergyCrossbowBolt"); } } From 32f97f98fd7184673253156ceceab081ad91860b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:12:41 -0700 Subject: [PATCH 032/162] change Oath of Altruism spiritual shield to use MyReactToUsePower --- .../Subclasses/OathOfAltruism.cs | 34 ++++++------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfAltruism.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfAltruism.cs index e4de395e5e..c41b362870 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfAltruism.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfAltruism.cs @@ -232,13 +232,14 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerSpiritualShielding, rulesetHelper); if (action.AttackRollOutcome is not RollOutcome.Success || helper == defender || helper.IsOppositeSide(defender.Side) || !helper.CanReact(true) || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(powerSpiritualShielding) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -262,28 +263,15 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerSpiritualShielding, rulesetHelper); - var actionParams = - new CharacterActionParams(helper, Id.PowerReaction) - { - StringParameter = "SpiritualShielding", - StringParameter2 = "UseSpiritualShieldingDescription".Formatted( - Category.Reaction, attacker.Name, defender.Name, chaMod.ToString()), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + Id.PowerReaction, + usablePower, + [defender], + attacker, + "SpiritualShielding", + "UseSpiritualShieldingDescription".Formatted( + Category.Reaction, attacker.Name, defender.Name, chaMod.ToString()), + battleManager: battleManager); } } } From 1d6d14e304f513b607565f38b5668f54268d3ebb Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:13:47 -0700 Subject: [PATCH 033/162] change Martial Psi Warrior kinetic barrier to use MyReactToUsePower --- .../Subclasses/MartialForceKnight.cs | 33 ++++++------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs index 3d194968ec..9dac5dc88a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs @@ -745,12 +745,13 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerKineticBarrier, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || helper.IsOppositeSide(defender.Side) || !helper.CanReact() || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(powerKineticBarrier) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -774,28 +775,14 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerKineticBarrier, rulesetHelper); - var actionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "KineticBarrier", - StringParameter2 = FormatReactionDescription(attacker, defender, helper), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "KineticBarrier", + FormatReactionDescription(attacker, defender, helper), + battleManager: battleManager); } private static string FormatReactionDescription( From 5c05943819d01ff934684c1c2f31e9d37fb10a5c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:15:49 -0700 Subject: [PATCH 034/162] change Circle of Wildfire cauterizing flames and blazing revival to use MyReactToUsePower --- .../Subclasses/CircleOfTheWildfire.cs | 117 ++++++------------ 1 file changed, 38 insertions(+), 79 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index 3edc2d05d6..e2c9afb28c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -511,56 +511,34 @@ u.RulesetActor is RulesetCharacterEffectProxy rulesetCharacterEffectProxy && continue; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = new CharacterActionParams(source, Id.PowerReaction) - { - StringParameter = character.Side == Side.Enemy ? "CauterizingFlamesDamage" : "CauterizingFlamesHeal", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetSource, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", source); - - yield return battleManager.WaitForReactions(character, actionService, count); - - if (!actionParams.ReactionValidated) - { - yield break; - } + yield return source.MyReactToUsePower( + Id.PowerReaction, + usablePower, + [character], + character, + character.Side == Side.Enemy ? "CauterizingFlamesDamage" : "CauterizingFlamesHeal", + reactionValidated: ReactionValidated); - var powerToTerminate = rulesetSource.PowersUsedByMe.FirstOrDefault(x => - x.Guid == rulesetProxy.EffectGuid); + yield break; - if (powerToTerminate != null) + void ReactionValidated() { - rulesetSource.TerminatePower(powerToTerminate); - } + var powerToTerminate = rulesetSource.PowersUsedByMe.FirstOrDefault(x => + x.Guid == rulesetProxy.EffectGuid); - usablePower = PowerProvider.Get( - character.Side == Side.Enemy - ? PowerCauterizingFlamesDamage - : PowerCauterizingFlamesHeal, - rulesetSource); + if (powerToTerminate != null) + { + rulesetSource.TerminatePower(powerToTerminate); + } - actionParams = new CharacterActionParams(source, Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetSource, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; + usablePower = PowerProvider.Get( + character.Side == Side.Enemy + ? PowerCauterizingFlamesDamage + : PowerCauterizingFlamesHeal, + rulesetSource); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + source.MyExecuteAction(Id.PowerNoCost, usablePower, [character]); + } } } @@ -923,14 +901,6 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; var usablePower = PowerProvider.Get(powerBlazingRevival, rulesetCharacter); @@ -939,38 +909,27 @@ public IEnumerator HandleReducedToZeroHpByEnemy( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var reactionParams = new CharacterActionParams(defender, Id.PowerNoCost) - { - StringParameter = "BlazingRevival", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + yield return defender.MyReactToUsePower( + Id.PowerNoCost, + usablePower, + [defender], + attacker, + "BlazingRevival", + reactionValidated: ReactionValidated); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - var hitPoints = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.HitPoints) / 2; + var hitPoints = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.HitPoints) / 2; - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); + rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - EffectHelpers.StartVisualEffect( - defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, Id.StandUp), null, true); + EffectHelpers.StartVisualEffect( + defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); + ServiceRepository.GetService()? + .ExecuteAction(new CharacterActionParams(defender, Id.StandUp), null, true); + } } } } From b414ea661fcd460626ec8a58eed54a62d364daf1 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:16:43 -0700 Subject: [PATCH 035/162] change Artificer soul of artifice to use MyReactToUsePower --- .../Classes/InventorClass.cs | 57 +++++++------------ 1 file changed, 19 insertions(+), 38 deletions(-) diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 12694b8e60..9b05e03883 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -902,55 +902,36 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerSoulOfArtifice, rulesetCharacter); - if (rulesetCharacter.GetRemainingPowerUses(powerSoulOfArtifice) == 0) + if (rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "SoulOfArtifice", + reactionValidated: ReactionValidated); - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield break; - var usablePower = PowerProvider.Get(powerSoulOfArtifice, rulesetCharacter); - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) + void ReactionValidated() { - StringParameter = "SoulOfArtifice", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + var hitPoints = rulesetCharacter.GetClassLevel(Class); - yield return battleManager.WaitForReactions(attacker, actionService, count); + rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - if (!reactionParams.ReactionValidated) - { - yield break; + EffectHelpers.StartVisualEffect( + defender, defender, FeatureDefinitionPowers.PowerPatronTimekeeperTimeShift, + EffectHelpers.EffectType.Caster); + ServiceRepository.GetService()? + .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } - - var hitPoints = rulesetCharacter.GetClassLevel(Class); - - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - EffectHelpers.StartVisualEffect( - defender, defender, FeatureDefinitionPowers.PowerPatronTimekeeperTimeShift, - EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } public void OnSavingThrowInitiated( From 9bdedbd5f508e40ff029cd94e2b44489ad25b9ed Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:17:56 -0700 Subject: [PATCH 036/162] change Oligath stone endurance to use MyReactToUsePower --- SolastaUnfinishedBusiness/Races/Oligath.cs | 29 +++++++--------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/SolastaUnfinishedBusiness/Races/Oligath.cs b/SolastaUnfinishedBusiness/Races/Oligath.cs index c4ccd979b2..cc5418d144 100644 --- a/SolastaUnfinishedBusiness/Races/Oligath.cs +++ b/SolastaUnfinishedBusiness/Races/Oligath.cs @@ -170,6 +170,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerStoneEndurance, rulesetDefender); // don't use CanReact() to allow stone endurance when prone if (helper != defender || @@ -178,30 +179,18 @@ public IEnumerator OnTryAlterOutcomeAttack( rulesetDefender.HasConditionOfTypeOrSubType(ConditionIncapacitated) || rulesetDefender.HasConditionOfTypeOrSubType(ConditionStunned) || rulesetDefender.HasConditionOfTypeOrSubType(ConditionParalyzed) || - rulesetDefender.GetRemainingPowerUses(powerStoneEndurance) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerStoneEndurance, rulesetDefender); - var actionParams = new CharacterActionParams(defender, Id.PowerReaction) - { - StringParameter = "StoneEndurance", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return defender.MyReactToUsePower( + Id.PowerReaction, + usablePower, + [defender], + attacker, + "StoneEndurance", + battleManager: battleManager); } } } From ee6a7b70bd1f69409e7184d3851bac3bffb775eb Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:18:53 -0700 Subject: [PATCH 037/162] change feat Shield Techniques to use MyReactToUsePower --- SolastaUnfinishedBusiness/Feats/ArmorFeats.cs | 65 ++++++++----------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs b/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs index eb3f7f54b9..99e9e1f2dc 100644 --- a/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/ArmorFeats.cs @@ -172,49 +172,40 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerShieldTechniques, rulesetDefender); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "ShieldTechniques", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - actionService.ReactToUsePower(actionParams, "UsePower", defender); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "ShieldTechniques", + reactionValidated: ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; + actionModifier.DefenderDamageMultiplier *= 0.5f; + rulesetDefender.DamageHalved(rulesetDefender, powerShieldTechniques); + + var rulesetAttacker = attacker.RulesetCharacter; + + rulesetDefender.InflictCondition( + conditionMark.Name, + DurationType.Round, + 0, + TurnOccurenceType.EndOfSourceTurn, + AttributeDefinitions.TagEffect, + rulesetAttacker.guid, + rulesetAttacker.CurrentFaction.Name, + 1, + conditionMark.Name, + 0, + 0, + 0); } - - actionModifier.DefenderDamageMultiplier *= 0.5f; - rulesetDefender.DamageHalved(rulesetDefender, powerShieldTechniques); - - var rulesetAttacker = attacker.RulesetCharacter; - - rulesetDefender.InflictCondition( - conditionMark.Name, - DurationType.Round, - 0, - TurnOccurenceType.EndOfSourceTurn, - AttributeDefinitions.TagEffect, - rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, - 1, - conditionMark.Name, - 0, - 0, - 0); } // add +2 on DEX savings From fdf04d8d9f959f2b3d2c752eb53fdd645fd29f4c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:19:33 -0700 Subject: [PATCH 038/162] change feat Defensive Duelist to use MyReactToUsePower --- .../Feats/MeleeCombatFeats.cs | 25 ++++++------------- 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index 0e6c287456..536591ad7c 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -796,26 +796,15 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerDefensiveDuelist, rulesetHelper); - var actionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "DefensiveDuelist", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", helper); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "DefensiveDuelist", + battleManager: battleManager); } } From 16f33b11f0a90074c88bcddc18cea4f3e9e6115f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:20:36 -0700 Subject: [PATCH 039/162] change feat Flames of Phlegethos to use MyReactToUsePower --- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 31 ++++---------------- 1 file changed, 6 insertions(+), 25 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 81672e6b67..17c6406b58 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -1340,40 +1340,21 @@ public IEnumerator OnMagicEffectFinishedByMe( GameLocationCharacter attacker, List targets) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - if (!action.ActionParams.activeEffect.EffectDescription.EffectForms.Any(x => x.FormType == EffectForm.EffectFormType.Damage && x.DamageForm.DamageType is DamageTypeFire)) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var rulesetCharacter = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(power, rulesetCharacter); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - StringParameter = "PowerFeatFlamesOfPhlegethos", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [attacker], + attacker, + "PowerFeatFlamesOfPhlegethos"); } } From 89b44813c80dfccf15a4490c9d11499e7e6b952c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:23:53 -0700 Subject: [PATCH 040/162] change feats Gift of the Chromatic Dragon and Lucky to use MyReactToUsePower --- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 354 ++++++++---------- 1 file changed, 156 insertions(+), 198 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 9ebb22a6ed..67a00e5a67 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -1760,58 +1760,47 @@ private IEnumerator HandleReaction( } var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerReactiveResistance, rulesetDefender); if (!defender.CanReact() || - rulesetDefender.GetRemainingPowerUses(powerReactiveResistance) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var damageType = effectForm.DamageForm.DamageType; var damageTitle = Gui.Localize($"Rules/&{damageType}Title"); - var usablePower = PowerProvider.Get(powerReactiveResistance, rulesetDefender); - var reactionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "ReactiveResistance", - StringParameter2 = "UseReactiveResistanceDescription".Formatted( - Category.Reaction, attacker.Name, damageTitle), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "ReactiveResistance", + "UseReactiveResistanceDescription".Formatted(Category.Reaction, attacker.Name, damageTitle), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var conditionName = $"ConditionGiftOfTheChromaticDragon{damageType}"; - var conditionName = $"ConditionGiftOfTheChromaticDragon{damageType}"; - - rulesetDefender.InflictCondition( - conditionName, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - rulesetDefender.guid, - rulesetDefender.CurrentFaction.Name, - 1, - conditionName, - 0, - 0, - 0); + rulesetDefender.InflictCondition( + conditionName, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + rulesetDefender.guid, + rulesetDefender.CurrentFaction.Name, + 1, + conditionName, + 0, + 0, + 0); + } } } @@ -2015,82 +2004,72 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [helper], + attacker, + stringParameter, + reactionValidated: ReactionValidated, + battleManager: battleManager); - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = stringParameter, - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { helper } - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(reactionParams, "UsePower", helper); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = action.AttackRoll; - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = action.AttackRoll; - - switch (stringParameter) - { - case "LuckyAttack" when dieRoll <= action.AttackRoll: - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatLuckyTitle", - "Feedback/&IsNotLuckyLower", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, action.AttackRoll.ToString()) - ]); - - yield break; - case "LuckyEnemyAttack" when dieRoll >= action.AttackRoll: - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatLuckyTitle", - "Feedback/&IsNotLuckyHigher", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Negative, action.AttackRoll.ToString()) - ]); + switch (stringParameter) + { + case "LuckyAttack" when dieRoll <= action.AttackRoll: + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, action.AttackRoll.ToString()) + ]); + + return; + case "LuckyEnemyAttack" when dieRoll >= action.AttackRoll: + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatLuckyTitle", + "Feedback/&IsNotLuckyHigher", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Negative, action.AttackRoll.ToString()) + ]); + + return; + } - yield break; - } + action.AttackSuccessDelta += dieRoll - action.AttackRoll; + action.AttackRoll = dieRoll; - action.AttackSuccessDelta += dieRoll - action.AttackRoll; - action.AttackRoll = dieRoll; + if (action.AttackSuccessDelta >= 0) + { + action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; + } + else + { + action.AttackRollOutcome = dieRoll == 1 ? RollOutcome.CriticalFailure : RollOutcome.Failure; + } - if (action.AttackSuccessDelta >= 0) - { - action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; - } - else - { - action.AttackRollOutcome = dieRoll == 1 ? RollOutcome.CriticalFailure : RollOutcome.Failure; + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatLuckyTitle", + "Feedback/&LuckyAttackToHitRoll", + extra: + [ + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) + ]); } - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatLuckyTitle", - "Feedback/&LuckyAttackToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } public IEnumerator OnTryAlterAttributeCheck( @@ -2111,64 +2090,54 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [helper], + defender, + "LuckyCheck", + reactionValidated: ReactionValidated, + battleManager: battleManager); - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "LuckyCheck", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { helper } - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield break; - actionService.ReactToUsePower(reactionParams, "UsePower", helper); + void ReactionValidated() + { + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = abilityCheckData.AbilityCheckRoll; - yield return battleManager.WaitForReactions(defender, actionService, count); + if (dieRoll <= abilityCheckData.AbilityCheckRoll) + { + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, abilityCheckData.AbilityCheckRoll.ToString()) + ]); - if (!reactionParams.ReactionValidated) - { - yield break; - } + return; + } - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = abilityCheckData.AbilityCheckRoll; + abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; + abilityCheckData.AbilityCheckRoll = dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; - if (dieRoll <= abilityCheckData.AbilityCheckRoll) - { rulesetHelper.LogCharacterActivatesAbility( "Feat/&FeatLuckyTitle", - "Feedback/&IsNotLuckyLower", + "Feedback/&LuckyCheckToHitRoll", extra: [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, abilityCheckData.AbilityCheckRoll.ToString()) + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) ]); - - yield break; } - - abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; - abilityCheckData.AbilityCheckRoll = dieRoll; - abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? RollOutcome.Success - : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatLuckyTitle", - "Feedback/&LuckyCheckToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -2194,63 +2163,52 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [helper], + attacker, + "LuckySaving", + "UseLuckySavingDescription".Formatted(Category.Reaction, defender.Name, attacker.Name, helper.Name), + ReactionValidated, + battleManager: battleManager); - var reactionParams = - new CharacterActionParams(helper, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "LuckySaving", - StringParameter2 = "UseLuckySavingDescription".Formatted( - Category.Reaction, defender.Name, attacker.Name, helper.Name), - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield break; - actionService.ReactToUsePower(reactionParams, "UsePower", attacker); + void ReactionValidated() + { + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; - yield return battleManager.WaitForReactions(attacker, actionService, count); + if (dieRoll <= savingRoll) + { + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, savingRoll.ToString()) + ]); - if (!reactionParams.ReactionValidated) - { - yield break; - } + return; + } - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; + action.SaveOutcomeDelta += dieRoll - savingRoll; + action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - if (dieRoll <= savingRoll) - { rulesetHelper.LogCharacterActivatesAbility( "Feat/&FeatLuckyTitle", - "Feedback/&IsNotLuckyLower", + "Feedback/&LuckySavingToHitRoll", extra: [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, savingRoll.ToString()) + (dieRoll > savingRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (savingRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + savingRoll.ToString()) ]); - - yield break; } - - action.SaveOutcomeDelta += dieRoll - savingRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatLuckyTitle", - "Feedback/&LuckySavingToHitRoll", - extra: - [ - (dieRoll > savingRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (savingRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - savingRoll.ToString()) - ]); } } From a4705c396bb7763d1b8309330dc8ea6be583dd37 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:25:00 -0700 Subject: [PATCH 041/162] change invocation Tomb of Frost to use MyReactToUsePower --- .../Builders/InvocationsBuilders.cs | 50 +++++++------------ 1 file changed, 17 insertions(+), 33 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index 7fbaa41369..e41b207a8c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -1518,49 +1518,33 @@ private IEnumerator HandleReaction( GameLocationCharacter attacker, GameLocationCharacter defender) { - if (!defender.CanReact()) - { - yield break; - } - var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerTombOfFrost, rulesetDefender); - if (rulesetDefender.GetRemainingPowerCharges(powerTombOfFrost) <= 0) + if (!defender.CanReact() || + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [defender], + attacker, + "TombOfFrost", + reactionValidated: ReactionValidated, + battleManager: battleManager); - var usablePower = PowerProvider.Get(powerTombOfFrost, rulesetDefender); - var actionParams = - new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "TombOfFrost", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToUsePower(actionParams, "UsePower", defender); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var classLevel = rulesetDefender.GetClassLevel(CharacterClassDefinitions.Warlock); - var classLevel = rulesetDefender.GetClassLevel(CharacterClassDefinitions.Warlock); - - rulesetDefender.ReceiveTemporaryHitPoints( - classLevel * 10, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, rulesetDefender.Guid); + rulesetDefender.ReceiveTemporaryHitPoints( + classLevel * 10, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, rulesetDefender.Guid); + } } } From 83e216183d470b1ea75fa47e05e2c58acc8dc648 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Tue, 6 Aug 2024 21:25:33 -0700 Subject: [PATCH 042/162] change Monk physical perfection to use MyReactToUsePower --- .../Models/Level20SubclassesContext.cs | 47 ++++++------------- 1 file changed, 14 insertions(+), 33 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 552fe080c0..1857567107 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -1847,46 +1847,27 @@ public IEnumerator HandleReducedToZeroHpByEnemy( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetCharacter = defender.RulesetCharacter; - - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPhysicalPerfection, rulesetCharacter); - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - StringParameter = "PhysicalPerfection", - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionService.PendingReactionRequestGroups.Count; - actionService.ReactToUsePower(reactionParams, "UsePower", defender); + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "StoneEndurance", + reactionValidated: ReactionValidated); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - rulesetCharacter.ForceKiPointConsumption(1); - rulesetCharacter.StabilizeAndGainHitPoints(1); + rulesetCharacter.ForceKiPointConsumption(1); + rulesetCharacter.StabilizeAndGainHitPoints(1); - ServiceRepository.GetService() - ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + ServiceRepository.GetService() + ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + } } } From df2f62ec7ae7c10e4525a9ae3217090facba7195 Mon Sep 17 00:00:00 2001 From: otearaisu Date: Wed, 7 Aug 2024 20:57:17 +0800 Subject: [PATCH 043/162] path of the wild magic - Reworked spirit blast to avoid instability errors, and scaled damage --- .../Subclasses/PathOfTheWildMagic.cs | 56 ++----------------- .../en/SubClasses/PathOfTheWildMagic-en.txt | 17 +++--- 2 files changed, 13 insertions(+), 60 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 929c42139b..07d999c182 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -292,25 +292,11 @@ private static WildSurgeEffect BuildWildSurgeTeleport() private static WildSurgeEffect BuildWildSurgeSummon() { - var proxySummon = EffectProxyDefinitionBuilder - .Create(EffectProxyDefinitions.ProxyDancingLights, $"Proxy{Name}Summon") - .SetGuiPresentation($"{ConditionWildSurgePrefix}Summon", Category.Condition, - EffectProxyDefinitions.ProxyDelayedBlastFireball) - .SetPortrait(EffectProxyDefinitions.ProxyDancingLights.PortraitSpriteReference) - .SetCanMove(false, false) - .SetAttackMethod(ProxyAttackMethod.ReproduceDamageForms) - .AddToDB(); - - proxySummon.autoTerminateOnTriggerPower = true; - proxySummon.actionId = Id.NoAction; - proxySummon.canTriggerPower = true; - var actionAffinitySummon = FeatureDefinitionActionAffinityBuilder .Create($"ActionAffinity{Name}Summon") .SetGuiPresentationNoContent(true) .SetAllowedActionTypes() .SetAuthorizedActions((Id)ExtraActionId.WildSurgeSummon) - .AddCustomSubFeatures(new WildSurgeSummonOnTurnEnd(proxySummon)) .AddToDB(); var actionAffinitySummonFree = FeatureDefinitionActionAffinityBuilder @@ -321,8 +307,8 @@ private static WildSurgeEffect BuildWildSurgeSummon() .AddToDB(); var effectDescriptionBlast = EffectDescriptionBuilder - .Create(FeatureDefinitionPowers.PowerDelayedBlastFireballDetonate.effectDescription) - .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Cube, 3) + .Create() + .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.Cube, 3) .SetSavingThrowData(false, AttributeDefinitions.Dexterity, true, EffectDifficultyClassComputation.AbilityScoreAndProficiency, AttributeDefinitions.Constitution, 8) .UseQuickAnimations() @@ -331,6 +317,7 @@ private static WildSurgeEffect BuildWildSurgeSummon() .Create() .SetDamageForm(DamageTypeForce, 1, DieType.D6) .HasSavingThrow(EffectSavingThrowType.Negates) + .SetDiceAdvancement(LevelSourceType.ClassLevel, 1, 1, 6, 11) .Build()) .SetImpactEffectParameters(SpellDefinitions.MagicMissile) .Build(); @@ -338,37 +325,11 @@ private static WildSurgeEffect BuildWildSurgeSummon() effectDescriptionBlast.EffectParticleParameters.zoneParticleReference = SpellDefinitions.Shatter.effectDescription.EffectParticleParameters.zoneParticleReference; - var powerSummonBlast = FeatureDefinitionPowerBuilder - .Create(FeatureDefinitionPowers.PowerDelayedBlastFireballDetonate, $"Power{Name}SummonBlast") - .SetGuiPresentation(Category.Feature) - .SetEffectDescription(effectDescriptionBlast) - .AddToDB(); - - proxySummon.attackPower = powerSummonBlast; - - var powerSummonBlastReaction = FeatureDefinitionPowerBuilder - .Create(powerSummonBlast, $"Power{Name}SummonBlastReaction") - .SetEffectDescription(EffectDescriptionBuilder.Create(effectDescriptionBlast) - .SetTargetingData(Side.All, RangeType.Distance, 6, TargetType.Cube, 3) - .Build()) - .AddToDB(); - - var effectDescription = EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Round, 2, TurnOccurenceType.StartOfTurn) - .SetTargetingData(Side.Ally, RangeType.Distance, 6, TargetType.Position) - .SetEffectForms( - EffectFormBuilder - .Create() - .SetSummonEffectProxyForm(proxySummon) - .Build()) - .Build(); - var powerSummon = FeatureDefinitionPowerBuilder .Create($"Power{Name}Summon") .SetGuiPresentation(Category.Feature, SpellDefinitions.DelayedBlastFireball) .SetUsesFixed(ActivationTime.NoCost, RechargeRate.TurnStart) - .SetEffectDescription(effectDescription) + .SetEffectDescription(effectDescriptionBlast) .DelegatedToAction() .AddToDB(); @@ -413,7 +374,7 @@ private static WildSurgeEffect BuildWildSurgeSummon() EffectName = "Summon", Condition = conditionWildSurgeSummon, ConditionFirstTurn = conditionWildSurgeSummonFree, - ReactPower = powerSummonBlastReaction + ReactPower = powerSummon }; } @@ -1028,18 +989,13 @@ private ConditionDefinition GetExistingWildSurgeCondition(RulesetCharacter chara } private sealed class WildSurgeSummonOnTurnEnd(EffectProxyDefinition powerSummon) - : ICharacterBeforeTurnEndListener, ICharacterBeforeTurnStartListener + : ICharacterBeforeTurnEndListener { public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) { ProcessWildSurgeSummon(locationCharacter); } - public void OnCharacterBeforeTurnStarted(GameLocationCharacter locationCharacter) - { - ProcessWildSurgeSummon(locationCharacter); - } - private void ProcessWildSurgeSummon(GameLocationCharacter locationCharacter) { if (locationCharacter?.RulesetCharacter?.controlledEffectProxies == null || diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt index dbd7910564..da00b4ef9d 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=A bolt of light shoots from your chest. Another creature of your choice that you can see within 30 feet of you must succeed on a Constitution saving throw or take 1d6 radiant damage and be blinded until the start of your next turn. Action/&WildSurgeBoltTitle=Bolt -Action/&WildSurgeSummonDescription=An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. -Action/&WildSurgeSummonTitle=Summon +Action/&WildSurgeSummonDescription=Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. +Action/&WildSurgeSummonTitle=Spirit Blast Action/&WildSurgeTeleportDescription=You teleport up to 30 feet to an unoccupied space you can see. Action/&WildSurgeTeleportTitle=Teleport Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 to AC. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Until your rage Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Wild Surge: Growth Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Wild Surge: Retribution -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge: Summon +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge: Spirit Blast Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Wild Surge: Teleport Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=Magic infuses the weapon that you are holding. Until your rage ends, the weapon's damage type changes to force, and it gains the thrown properties, with a normal range of 20 feet and a long range of 60 feet. If the weapon leaves your hand, the weapon reappears in your hand. Your rage damage bonus will also apply on this thrown weapon. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Whenever you roll o Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Controlled Surge Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Immediately after you take damage while raging, you can use your reaction to roll on the Wild Magic table and immediately produce the effect rolled. This effect replaces your current Wild Magic effect. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Unstable Backslash -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=When you enter your rage, roll on the Wild Magic table to determine the magical effect produced. If the effect requires a saving throw, the DC equals 8 + your proficiency bonus + your Constitution modifier.\n\nWild Magic Table:\n- Each creature within 30 feet of you must succeed on a Constitution saving throw or take 1d12 necrotic damage. You also gain 1d12 temporary hit points.\n- You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action.\n- An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action.\n- Magic infuses the weapon that you are holding. Until your rage ends, the weapon's damage type changes to force, and it gains the thrown properties, with a normal range of 20 feet and a long range of 60 feet. If the weapon leaves your hand, the weapon reappears in your hand. Your rage damage bonus will also apply on this thrown weapon.\n- Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage.\n- Until your rage ends, you gain a +1 bonus to AC, and while within 10 feet of you, your allies gain the same bonus.\n- Until your rage ends, at the end of each of your turn, the ground within 15 feet of you becomes difficult terrain until the beginning of your next turn.\n- A bolt of light shoots from your chest. Another creature of your choice that you can see within 30 feet of you must succeed on a Constitution saving throw or take 1d6 radiant damage and be blinded until the start of your next turn. Until your rage ends, you can use this effect again on each of your turns as a bonus action. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=When you enter your rage, roll on the Wild Magic table to determine the magical effect produced. If the effect requires a saving throw, the DC equals 8 + your proficiency bonus + your Constitution modifier.\n\nWild Magic Table:\n- Each creature within 30 feet of you must succeed on a Constitution saving throw or take 1d12 necrotic damage. You also gain 1d12 temporary hit points.\n- You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action.\n- Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action.\n- Magic infuses the weapon that you are holding. Until your rage ends, the weapon's damage type changes to force, and it gains the thrown properties, with a normal range of 20 feet and a long range of 60 feet. If the weapon leaves your hand, the weapon reappears in your hand. Your rage damage bonus will also apply on this thrown weapon.\n- Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage.\n- Until your rage ends, you gain a +1 bonus to AC, and while within 10 feet of you, your allies gain the same bonus.\n- Until your rage ends, at the end of each of your turn, the ground within 15 feet of you becomes difficult terrain until the beginning of your next turn.\n- A bolt of light shoots from your chest. Another creature of your choice that you can see within 30 feet of you must succeed on a Constitution saving throw or take 1d6 radiant damage and be blinded until the start of your next turn. Until your rage ends, you can use this effect again on each of your turns as a bonus action. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Wild Surge Feature/&PowerPathOfTheWildMagicAuraDescription=Until your rage ends, you gain a +1 bonus to AC, and while within 10 feet of you, your allies gain the same bonus. Feature/&PowerPathOfTheWildMagicAuraTitle=Wild Surge: Aura @@ -44,15 +44,12 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=A bolt of light shoots from your Feature/&PowerPathOfTheWildMagicBoltTitle=Wild Surge: Bolt Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=As an action, you can open your awareness to the presence of concentrated magic. Over the next minute, you know the location of any spell or magic item within 60 feet of you. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Magic Awareness -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=The spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wild Surge: Spirit Blast -Feature/&PowerPathOfTheWildMagicSummonDescription=An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action. -Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge: Summon +Feature/&PowerPathOfTheWildMagicSummonDescription=Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action. +Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge: Spirit Blast Feature/&PowerPathOfTheWildMagicTeleportDescription=You teleport up to 30 feet to an unoccupied space you can see. Feature/&PowerPathOfTheWildMagicTeleportTitle=Wild Surge: Teleport Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Use your reaction to roll Wild Surge and replace the active effect. Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Unstable Backlash -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Summoned Spirit Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Select a Wild Surge Effect to activate. If no selection is made, the first effect will be activated by default. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activate Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Controlled Surge From d0c5c851b61e6a893191208f08702e2236371361 Mon Sep 17 00:00:00 2001 From: otearaisu Date: Fri, 21 Jun 2024 19:46:23 +0800 Subject: [PATCH 044/162] path-wildmagic - fixed Retribution triggering on self damage --- SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 07d999c182..05d62d0be7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -1082,7 +1082,9 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( bool firstTarget, bool criticalHit) { - if (attacker.RulesetCharacter.IsDeadOrDying || defender.RulesetCharacter.IsDeadOrDying) + if (defender == attacker + || attacker.RulesetCharacter.IsDeadOrDying + || defender.RulesetCharacter.IsDeadOrDying) { yield break; } From 0b14a2e06a8f828ee12ec0f07d325587ba96e930 Mon Sep 17 00:00:00 2001 From: otearaisu Date: Wed, 7 Aug 2024 21:06:48 +0800 Subject: [PATCH 045/162] path wild magic - removed unused interface --- .../Subclasses/PathOfTheWildMagic.cs | 32 ------------------- 1 file changed, 32 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 05d62d0be7..01b3d2dcb1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -988,38 +988,6 @@ private ConditionDefinition GetExistingWildSurgeCondition(RulesetCharacter chara return null; } - private sealed class WildSurgeSummonOnTurnEnd(EffectProxyDefinition powerSummon) - : ICharacterBeforeTurnEndListener - { - public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) - { - ProcessWildSurgeSummon(locationCharacter); - } - - private void ProcessWildSurgeSummon(GameLocationCharacter locationCharacter) - { - if (locationCharacter?.RulesetCharacter?.controlledEffectProxies == null || - locationCharacter.RulesetCharacter.controlledEffectProxies.Count == 0) - { - return; - } - - foreach (var proxy in locationCharacter.RulesetCharacter.controlledEffectProxies - .Where(proxy => - proxy?.EffectProxyDefinition?.Name == powerSummon?.Name && - proxy?.ControllerGuid != null)) - { - if (!RulesetEntity.TryGetEntity(proxy.ControllerGuid, out var controller)) - { - continue; - } - - var service = ServiceRepository.GetService(); - service.AutoTriggerProxy(proxy, controller); - } - } - } - private sealed class WildSurgeWeaponModifyAttackMode : IModifyWeaponAttackMode { public void ModifyAttackMode(RulesetCharacter character, RulesetAttackMode attackMode) From 3683c686e0cada35b30c0ea20380e5215fc31641 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 13:00:31 -0700 Subject: [PATCH 046/162] fix Bountiful Luck feat triggering on any failure regardless of dice roll --- SolastaUnfinishedBusiness/ChangelogHistory.txt | 1 + SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 18 +++++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index f5bd480c10..6a7e0213ee 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,6 +1,7 @@ 1.5.97.26: - fixed Bait and Switch maneuver greyed out on action bar +- fixed Bountiful Luck feat triggering on any failure regardless of dice roll - fixed Martial Guardian not getting the Sentinel feat - fixed Cleric domains missing divine intervention improvement at 20 - fixed Sunlit Blade cantrip highlighted condition duration diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 17c6406b58..63844cc2a9 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -661,7 +661,7 @@ public IEnumerator OnTryAlterOutcomeAttack( ServiceRepository.GetService() as GameLocationActionManager; if (!actionManager || - action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || + action.AttackRoll != 1 || attacker == helper || attacker.IsOppositeSide(helper.Side) || !helper.CanReact() || @@ -756,7 +756,7 @@ public IEnumerator OnTryAlterAttributeCheck( ServiceRepository.GetService() as GameLocationActionManager; if (!actionManager || - abilityCheckData.AbilityCheckRoll == 0 || + abilityCheckData.AbilityCheckRoll != 1 || abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure || helper == defender || helper.IsOppositeSide(defender.Side) || @@ -866,6 +866,13 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } + var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; + + if (savingRoll != 1) + { + yield break; + } + var reactionParams = new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) { @@ -890,7 +897,6 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( var rulesetHelper = helper.RulesetCharacter; var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var savingRoll = action.SaveOutcomeDelta - modifier + saveDC; if (dieRoll <= savingRoll) { @@ -928,10 +934,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( "Feedback/&BountifulLuckSavingToHitRoll", extra: [ - (dieRoll > savingRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (savingRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - savingRoll.ToString()) + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Negative, savingRoll.ToString()) ]); } } From f92bc932f2999686509b778d1ed21c7d24030673 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 18:22:26 -0700 Subject: [PATCH 047/162] fix HeroicUncannyDodge and FlamesOfPhlegethos after MyReactToUsePower refactor --- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 2 +- SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 63844cc2a9..f35c13bc5e 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -1354,7 +1354,7 @@ public IEnumerator OnMagicEffectFinishedByMe( var usablePower = PowerProvider.Get(power, rulesetCharacter); yield return attacker.MyReactToUsePower( - ActionDefinitions.Id.PowerReaction, + ActionDefinitions.Id.PowerNoCost, usablePower, [attacker], attacker, diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs index ac690f9fa6..2733066956 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs @@ -226,7 +226,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - yield return attacker.MyReactToUsePower( + yield return defender.MyReactToUsePower( ActionDefinitions.Id.PowerReaction, usablePower, [defender], From 768b18ccb7883245a375c939f5225c1cbcc7a545 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 18:33:00 -0700 Subject: [PATCH 048/162] fix Divine Strike description --- .../Translations/de/SubClasses/DomainSmith-de.txt | 2 +- .../Translations/en/SubClasses/DomainSmith-en.txt | 2 +- .../Translations/es/SubClasses/DomainSmith-es.txt | 2 +- .../Translations/fr/SubClasses/DomainSmith-fr.txt | 2 +- .../Translations/it/SubClasses/DomainSmith-it.txt | 2 +- .../Translations/ja/SubClasses/DomainSmith-ja.txt | 2 +- .../Translations/ko/SubClasses/DomainSmith-ko.txt | 2 +- .../Translations/pt-BR/SubClasses/DomainSmith-pt-BR.txt | 2 +- .../Translations/zh-CN/SubClasses/DomainSmith-zh-CN.txt | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/DomainSmith-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/DomainSmith-de.txt index f930608dd1..8796ede0e4 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/DomainSmith-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/DomainSmith-de.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=Ihre Rüstung wird zu Diamant verstärkt, wodurch der kritische Schaden halbiert wird. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Adamantin-Rüstung -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Füge einmal pro Runde +1W8 Feuerschaden bei Waffenangriffen zu. Dieser Schaden erhöht sich auf der 14. Stufe auf 2W8. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Füge einmal während deines Zuges +1W8 Feuerschaden bei Waffenangriffen zu. Dieser Schaden erhöht sich auf der 14. Stufe auf 2W8. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Göttlicher Schlag Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Erlangen Sie Feuerresistenz und, während Sie eine Rüstung tragen, +1 AC. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Schmiedemeister diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/DomainSmith-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/DomainSmith-en.txt index aa79fd7b57..8adbcf9e56 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/DomainSmith-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/DomainSmith-en.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=Your armor strengthens to adamantine, halving critical damage. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Adamantine Armor -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Once per turn, deal +1d8 fire damage on weapon attacks. This damage increases to 2d8 at 14th level. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Once during your turn, deal +1d8 fire damage on weapon attacks. This damage increases to 2d8 at 14th level. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Divine Strike Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Gain fire resistance and while wearing armor gain +1 AC. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Forge Mastery diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/DomainSmith-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/DomainSmith-es.txt index cef2cdacaa..00fccb35cf 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/DomainSmith-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/DomainSmith-es.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=Tu armadura se fortalece hasta convertirse en adamantina, reduciendo a la mitad el daño crítico. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Armadura de adamantina -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Una vez por turno, inflige +1d8 de daño de fuego en ataques con armas. Este daño aumenta a 2d8 en el nivel 14. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Una vez durante tu turno, infliges +1d8 de daño de fuego en ataques con armas. Este daño aumenta a 2d8 en el nivel 14. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Golpe divino Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Gana resistencia al fuego y mientras uses armadura obtienes +1 CA. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Maestría en forja diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/DomainSmith-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/DomainSmith-fr.txt index 5e8d0de613..e3788bd0b7 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/DomainSmith-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/DomainSmith-fr.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=Votre armure se renforce en adamantine, réduisant de moitié les dégâts critiques. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Armure adamantine -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Une fois par tour, inflige +1d8 dégâts de feu aux attaques d'arme. Ces dégâts augmentent à 2d8 au niveau 14. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Une fois pendant votre tour, infligez +1d8 dégâts de feu sur les attaques avec une arme. Ces dégâts augmentent à 2d8 au niveau 14. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Frappe divine Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Gagnez une résistance au feu et lorsque vous portez une armure, gagnez +1 CA. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Maîtrise de la forge diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/DomainSmith-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/DomainSmith-it.txt index fb075c8db1..e979f56be1 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/DomainSmith-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/DomainSmith-it.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=La tua armatura si rinforza fino a diventare adamantina, dimezzando i danni critici. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Armatura Adamantina -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Una volta per turno, infliggi +1d8 danni da fuoco agli attacchi con arma. Questi danni aumentano a 2d8 al 14° livello. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Una volta durante il tuo turno, infliggi +1d8 danni da fuoco agli attacchi con le armi. Questi danni aumentano a 2d8 al 14° livello. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Colpo divino Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Ottieni resistenza al fuoco e mentre indossi l'armatura ottieni +1 CA. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Maestria nella forgia diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/DomainSmith-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/DomainSmith-ja.txt index b430e53f41..467b467890 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/DomainSmith-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/DomainSmith-ja.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=鎧はアダマンタインに強化され、クリティカルダメージが半減します。 Condition/&ConditionDomainSmithAdamantBenedictionTitle=アダマンティンアーマー -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=ターンごとに 1 回、武器攻撃で +1d8 の火炎ダメージを与える。このダメージは 14 レベルで 2d8 に増加します。 +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=あなたのターン中に一度、武器攻撃に +1d8 の火炎ダメージを与えます。このダメージは 14 レベルで 2d8 に増加します。 Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=神の一撃 Feature/&AttributeModifierDomainSmithForgeMasteryDescription=耐火性を獲得し、鎧を着用している間 AC が +1 増加します。 Feature/&AttributeModifierDomainSmithForgeMasteryTitle=フォージマスタリー diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/DomainSmith-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/DomainSmith-ko.txt index bd42b2078e..fb015f0c8f 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/DomainSmith-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/DomainSmith-ko.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=갑옷이 금강으로 강화되어 치명타 피해가 절반으로 줄어듭니다. Condition/&ConditionDomainSmithAdamantBenedictionTitle=금강갑옷 -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=턴당 한 번, 무기 공격 시 +1d8의 화염 피해를 줍니다. 이 피해는 14레벨에서 2d8로 증가합니다. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=턴 중 한 번, 무기 공격에 +1d8의 화염 피해를 입힙니다. 이 피해는 14레벨에서 2d8로 증가합니다. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=신성한 일격 Feature/&AttributeModifierDomainSmithForgeMasteryDescription=화염 저항력을 얻고, 갑옷을 입고 있는 동안 AC가 +1 증가합니다. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=포지 마스터리 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/DomainSmith-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/DomainSmith-pt-BR.txt index 4c2831a96c..aaaf0f8992 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/DomainSmith-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/DomainSmith-pt-BR.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=Sua armadura se fortalece e vira adamantina, reduzindo pela metade o dano crítico. Condition/&ConditionDomainSmithAdamantBenedictionTitle=Armadura Adamantina -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Uma vez por turno, causa +1d8 de dano de fogo em ataques de arma. Esse dano aumenta para 2d8 no 14º nível. +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=Uma vez durante seu turno, cause +1d8 de dano de fogo em ataques de arma. Esse dano aumenta para 2d8 no 14º nível. Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=Ataque divino Feature/&AttributeModifierDomainSmithForgeMasteryDescription=Ganhe resistência ao fogo e enquanto estiver usando armadura ganhe +1 CA. Feature/&AttributeModifierDomainSmithForgeMasteryTitle=Maestria em Forja diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/DomainSmith-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/DomainSmith-zh-CN.txt index 54ce08886f..78223583b2 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/DomainSmith-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/DomainSmith-zh-CN.txt @@ -1,6 +1,6 @@ Condition/&ConditionDomainSmithAdamantBenedictionDescription=你的护甲强化为精金,暴击伤害减半。 Condition/&ConditionDomainSmithAdamantBenedictionTitle=精金护甲 -Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=每回合一次,武器攻击造成 +1d8 火焰伤害。该伤害在 14 级时增加至 2d8。 +Feature/&AdditionalDamageDomainSmithDivineStrikeDescription=在你的回合中,一次武器攻击造成 +1d8 火焰伤害。此伤害在 14 级时增加到 2d8。 Feature/&AdditionalDamageDomainSmithDivineStrikeTitle=神圣打击 Feature/&AttributeModifierDomainSmithForgeMasteryDescription=获得火焰抗性并在穿着护甲时获得 +1 护甲等级。 Feature/&AttributeModifierDomainSmithForgeMasteryTitle=锻造掌握 From 4d65da9825c7af8719af8f310d8d2257889d0d98 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 18:35:19 -0700 Subject: [PATCH 049/162] update Path of the Wild Magic translations and diagnostics --- ...esentation-InvalidSyntaxTranslation-en.txt | 8 +- .../UnfinishedBusinessBlueprints/Assets.txt | 5 - .../PowerPathOfTheWildMagicSummon.json | 168 ++++++++++++++---- ...owerPathOfTheWildMagicWildSurgeSummon.json | 4 +- ...owerPathOfTheWildMagicWildSurgeSummon.json | 4 +- Documentation/Subclasses.md | 46 ++++- .../ChangelogHistory.txt | 3 +- .../de/SubClasses/PathOfTheWildMagic-de.txt | 14 +- .../es/SubClasses/PathOfTheWildMagic-es.txt | 14 +- .../fr/SubClasses/PathOfTheWildMagic-fr.txt | 14 +- .../it/SubClasses/PathOfTheWildMagic-it.txt | 14 +- .../ja/SubClasses/PathOfTheWildMagic-ja.txt | 14 +- .../ko/SubClasses/PathOfTheWildMagic-ko.txt | 14 +- .../SubClasses/PathOfTheWildMagic-pt-BR.txt | 14 +- .../ru/SubClasses/PathOfTheWildMagic-ru.txt | 14 +- .../SubClasses/PathOfTheWildMagic-zh-CN.txt | 14 +- 16 files changed, 247 insertions(+), 117 deletions(-) diff --git a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt index 78e91c3b61..cb5da672db 100644 --- a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt +++ b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt @@ -1457,8 +1457,8 @@ PowerPathOfTheWildMagicWildSurgeGrowth Title='Wild Surge: Growth'. PowerPathOfTheWildMagicWildSurgeGrowth Description='Until your rage ends, at the end of each of your turn, the ground within 15 feet of you becomes difficult terrain until the beginning of your next turn.'. PowerPathOfTheWildMagicWildSurgeRetribution Title='Wild Surge: Retribution'. PowerPathOfTheWildMagicWildSurgeRetribution Description='Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage.'. -PowerPathOfTheWildMagicWildSurgeSummon Title='Wild Surge: Summon'. -PowerPathOfTheWildMagicWildSurgeSummon Description='An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action.'. +PowerPathOfTheWildMagicWildSurgeSummon Title='Wild Surge: Spirit Blast'. +PowerPathOfTheWildMagicWildSurgeSummon Description='Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action.'. PowerPathOfTheWildMagicWildSurgeTeleport Title='Wild Surge: Teleport'. PowerPathOfTheWildMagicWildSurgeTeleport Description='You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action.'. PowerPathOfTheWildMagicWildSurgeWeapon Title='Wild Surge: Weapon'. @@ -1653,8 +1653,8 @@ SpellPowerPathOfTheWildMagicWildSurgeGrowth Title='Wild Surge: Growth'. SpellPowerPathOfTheWildMagicWildSurgeGrowth Description='Until your rage ends, at the end of each of your turn, the ground within 15 feet of you becomes difficult terrain until the beginning of your next turn.'. SpellPowerPathOfTheWildMagicWildSurgeRetribution Title='Wild Surge: Retribution'. SpellPowerPathOfTheWildMagicWildSurgeRetribution Description='Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage.'. -SpellPowerPathOfTheWildMagicWildSurgeSummon Title='Wild Surge: Summon'. -SpellPowerPathOfTheWildMagicWildSurgeSummon Description='An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action.'. +SpellPowerPathOfTheWildMagicWildSurgeSummon Title='Wild Surge: Spirit Blast'. +SpellPowerPathOfTheWildMagicWildSurgeSummon Description='Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action.'. SpellPowerPathOfTheWildMagicWildSurgeTeleport Title='Wild Surge: Teleport'. SpellPowerPathOfTheWildMagicWildSurgeTeleport Description='You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action.'. SpellPowerPathOfTheWildMagicWildSurgeWeapon Title='Wild Surge: Weapon'. diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index ed6879b3e0..898bb46aa7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -1244,7 +1244,6 @@ ProxyPactWeapon1 EffectProxyDefinition EffectProxyDefinition 55354187-cf9d-5ebf- ProxyPactWeapon2 EffectProxyDefinition EffectProxyDefinition 9735ef98-063a-550a-9b2a-11ad53a8629e ProxyPactWeapon3 EffectProxyDefinition EffectProxyDefinition eb8e8fa4-5b7b-59fe-bf21-a43a0f5f25ec ProxyPathOfTheWildMagicGrowth EffectProxyDefinition EffectProxyDefinition 231c2e23-720b-5a56-b0f0-e995ffd02945 -ProxyPathOfTheWildMagicSummon EffectProxyDefinition EffectProxyDefinition a07f1fcc-0bce-523e-b583-83cc9fed1093 ProxyPetalStorm EffectProxyDefinition EffectProxyDefinition 0e6a068f-fadd-5c5a-8737-b2e2723d7f3f ProxyProtectThreshold EffectProxyDefinition EffectProxyDefinition 2636ab53-e62a-53c9-8104-0521b1d84ca0 ProxySickeningRadiance EffectProxyDefinition EffectProxyDefinition 3da14e42-a91a-5895-a8a6-fd1573c65fec @@ -3668,8 +3667,6 @@ PowerPathOfTheWildMagicGrowth FeatureDefinitionPower FeatureDefinition 6b5e5aee- PowerPathOfTheWildMagicMagicAwareness FeatureDefinitionPower FeatureDefinition d0069fcb-15d4-5936-969f-6d08bfb6d6d7 PowerPathOfTheWildMagicRetribution FeatureDefinitionPower FeatureDefinition bb1aeb6a-57bb-5757-aabf-a55ec0de8f8f PowerPathOfTheWildMagicSummon FeatureDefinitionPower FeatureDefinition 72fc941e-2078-53c7-b1f0-83705ac2e84b -PowerPathOfTheWildMagicSummonBlast FeatureDefinitionPower FeatureDefinition 40b99c9c-2ab1-5c44-8afe-8781800bb700 -PowerPathOfTheWildMagicSummonBlastReaction FeatureDefinitionPower FeatureDefinition 59a94050-c705-5d8b-ae5f-040df6707af9 PowerPathOfTheWildMagicTeleport FeatureDefinitionPower FeatureDefinition bbd47537-4116-502b-946b-d75bd1d56523 PowerPathOfTheWildMagicUnstableBacklash FeatureDefinitionPower FeatureDefinition 38b9f53f-65b2-5a92-b994-c294194c95d4 PowerPathOfTheWildMagicWildSurgeAura FeatureDefinitionPowerSharedPool FeatureDefinition 29341b8d-9cec-52fe-bdc5-6b9a053fc59d @@ -6485,8 +6482,6 @@ PowerPathOfTheWildMagicGrowth FeatureDefinitionPower FeatureDefinitionPower 6b5e PowerPathOfTheWildMagicMagicAwareness FeatureDefinitionPower FeatureDefinitionPower d0069fcb-15d4-5936-969f-6d08bfb6d6d7 PowerPathOfTheWildMagicRetribution FeatureDefinitionPower FeatureDefinitionPower bb1aeb6a-57bb-5757-aabf-a55ec0de8f8f PowerPathOfTheWildMagicSummon FeatureDefinitionPower FeatureDefinitionPower 72fc941e-2078-53c7-b1f0-83705ac2e84b -PowerPathOfTheWildMagicSummonBlast FeatureDefinitionPower FeatureDefinitionPower 40b99c9c-2ab1-5c44-8afe-8781800bb700 -PowerPathOfTheWildMagicSummonBlastReaction FeatureDefinitionPower FeatureDefinitionPower 59a94050-c705-5d8b-ae5f-040df6707af9 PowerPathOfTheWildMagicTeleport FeatureDefinitionPower FeatureDefinitionPower bbd47537-4116-502b-946b-d75bd1d56523 PowerPathOfTheWildMagicUnstableBacklash FeatureDefinitionPower FeatureDefinitionPower 38b9f53f-65b2-5a92-b994-c294194c95d4 PowerPathOfTheWildMagicWildSurgeAura FeatureDefinitionPowerSharedPool FeatureDefinitionPower 29341b8d-9cec-52fe-bdc5-6b9a053fc59d diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummon.json index 786195bfaf..8dfe4c078a 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummon.json @@ -6,9 +6,9 @@ "rangeParameter": 6, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], - "targetType": "Position", + "targetType": "Cube", "itemSelectionType": "None", - "targetParameter": 1, + "targetParameter": 3, "targetParameter2": 2, "emissiveBorder": "None", "emissiveParameter": 1, @@ -30,21 +30,21 @@ "trapRangeType": "Triggerer", "targetConditionName": "", "targetConditionAsset": null, - "targetSide": "Ally", - "durationType": "Round", - "durationParameter": 2, - "endOfEffect": "StartOfTurn", - "hasSavingThrow": false, + "targetSide": "All", + "durationType": "Instantaneous", + "durationParameter": 1, + "endOfEffect": "EndOfTurn", + "hasSavingThrow": true, "disableSavingThrowOnAllies": false, "savingThrowAbility": "Dexterity", - "ignoreCover": false, + "ignoreCover": true, "grantedConditionOnSave": null, "rollSaveOnlyIfRelevantForms": false, "hasShoveRoll": false, "createdByCharacter": true, - "difficultyClassComputation": "SpellCastingFeature", - "savingThrowDifficultyAbility": "Wisdom", - "fixedSavingThrowDifficultyClass": 15, + "difficultyClassComputation": "AbilityScoreAndProficiency", + "savingThrowDifficultyAbility": "Constitution", + "fixedSavingThrowDifficultyClass": 8, "savingThrowAffinitiesBySense": [], "savingThrowAffinitiesByFamily": [], "damageAffinitiesByFamily": [], @@ -63,30 +63,136 @@ "effectForms": [ { "$type": "EffectForm, Assembly-CSharp", - "formType": "Summon", + "formType": "Damage", "addBonusMode": "None", - "applyLevel": "No", + "applyLevel": "DiceNumberByLevelTable", "levelType": "ClassLevel", "levelMultiplier": 1, - "diceByLevelTable": [], + "diceByLevelTable": [ + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 1, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 2, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 3, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 4, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 5, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 6, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 7, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 8, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 9, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 10, + "diceNumber": 0 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 11, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 12, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 13, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 14, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 15, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 16, + "diceNumber": 1 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 17, + "diceNumber": 2 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 18, + "diceNumber": 2 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 19, + "diceNumber": 2 + }, + { + "$type": "DiceByRank, Assembly-CSharp", + "rank": 20, + "diceNumber": 2 + } + ], "createdByCharacter": true, "createdByCondition": false, - "hasSavingThrow": false, - "savingThrowAffinity": "None", + "hasSavingThrow": true, + "savingThrowAffinity": "Negates", "dcModifier": 0, "canSaveToCancel": false, "saveOccurence": "EndOfTurn", - "summonForm": { - "$type": "SummonForm, Assembly-CSharp", - "summonType": "EffectProxy", - "itemDefinition": null, - "trackItem": false, - "monsterDefinitionName": "", - "number": 0, - "conditionDefinition": null, - "persistOnConcentrationLoss": true, - "decisionPackage": null, - "effectProxyDefinitionName": "ProxyPathOfTheWildMagicSummon" + "damageForm": { + "$type": "DamageForm, Assembly-CSharp", + "versatile": false, + "diceNumber": 1, + "dieType": "D6", + "overrideWithBardicInspirationDie": false, + "versatileDieType": "D1", + "bonusDamage": 0, + "damageType": "DamageForce", + "ancestryType": "Sorcerer", + "healFromInflictedDamage": "Never", + "hitPointsFloor": 0, + "forceKillOnZeroHp": false, + "specialDeathCondition": null, + "ignoreFlyingCharacters": false, + "ignoreCriticalDoubleDice": false }, "hasFilterId": false, "filterId": 0 @@ -110,7 +216,7 @@ "alteredDuration": "None" }, "speedType": "Instant", - "speedParameter": 10.0, + "speedParameter": -1.0, "offsetImpactTimeBasedOnDistance": false, "offsetImpactTimeBasedOnDistanceFactor": 0.1, "offsetImpactTimePerTarget": 0.0, @@ -130,7 +236,7 @@ }, "casterQuickSpellParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", + "m_AssetGUID": "81560ac3813217d4d9fd281d5e73c234", "m_SubObjectName": "", "m_SubObjectType": "" }, @@ -154,7 +260,7 @@ }, "zoneParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", + "m_AssetGUID": "b6820f3b2273d454c97a4c29dd5e50dd", "m_SubObjectName": "", "m_SubObjectType": "" }, @@ -166,7 +272,7 @@ }, "impactParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", + "m_AssetGUID": "9f1fe10e6ef8c9c43b6b2ef91b2ad38a", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerPathOfTheWildMagicWildSurgeSummon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerPathOfTheWildMagicWildSurgeSummon.json index c267400661..02a6894ea0 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerPathOfTheWildMagicWildSurgeSummon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerPathOfTheWildMagicWildSurgeSummon.json @@ -175,8 +175,8 @@ "guiPresentation": { "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, - "title": "Wild Surge: Summon", - "description": "An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action.", + "title": "Wild Surge: Spirit Blast", + "description": "Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action.", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerPathOfTheWildMagicWildSurgeSummon.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerPathOfTheWildMagicWildSurgeSummon.json index 7c26bddacf..a471ccc9e6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerPathOfTheWildMagicWildSurgeSummon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/SpellPowerPathOfTheWildMagicWildSurgeSummon.json @@ -166,8 +166,8 @@ "guiPresentation": { "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, - "title": "Wild Surge: Summon", - "description": "An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action.", + "title": "Wild Surge: Spirit Blast", + "description": "Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action.", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "", diff --git a/Documentation/Subclasses.md b/Documentation/Subclasses.md index 327fafaa91..3337c9d42b 100644 --- a/Documentation/Subclasses.md +++ b/Documentation/Subclasses.md @@ -864,7 +864,7 @@ When you enter your rage, roll on the Wild Magic table to determine the magical Wild Magic Table: - Each creature within 30 feet of you must succeed on a Constitution saving throw or take 1d12 necrotic damage. You also gain 1d12 temporary hit points. - You teleport up to 30 feet to an unoccupied space you can see. Until your rage ends, you can use this effect again on each of your turns as a bonus action. -- An intangible spirit appears an unoccupied space that you can see within 30 feet of you. At the end of the current turn, the spirit explodes, and each creature within 5 feet of it must succeed on a Dexterity saving throw or take 1d6 force damage. Until your rage ends, you can use this effect again, summoning another spirit, on each of your turns as a bonus action. +- Choose a point you can see within 30 feet of you. A burst of spiritual energy erupts from the point and each creature within a 15-foot cube centered on the point must make a Dexterity saving throw. On a failed save, the creature takes 1d6 force damage. This damage increases to 2d6 at 11th level, and 3d6 at 17th level. Until your rage ends, you can use this effect again on each of your turns as a bonus action. - Magic infuses the weapon that you are holding. Until your rage ends, the weapon's damage type changes to force, and it gains the thrown properties, with a normal range of 20 feet and a long range of 60 feet. If the weapon leaves your hand, the weapon reappears in your hand. Your rage damage bonus will also apply on this thrown weapon. - Whenever a creature hits you with an attack roll before your rage ends, that creature takes 1d6 force damage. - Until your rage ends, you gain a +1 bonus to AC, and while within 10 feet of you, your allies gain the same bonus. @@ -1455,6 +1455,13 @@ You attempt to request the help of your deity, with a success chance of 1% per c You learn Circle of Death and Finger of Death spells, and it is added to the list of spells known. They are always prepared, don't count towards your prepared spells limit, and are treated as cleric spells for you. Whenever you deal necrotic damage, you can deal maximum damage instead of rolling. You can use this feature once per long rest. +### Level 20 + +* Improved Divine Intervention + +You attempt to request the help of your deity, with a 100% chance of success. + + ## 3. Elemental (Fire) [SOL] @@ -1761,6 +1768,13 @@ Your blessed affinity with fire and metal becomes more powerful. While wearing a • You have resistance to bludgeoning, piercing, and slashing damage from non-magical attacks. +### Level 20 + +* Improved Divine Intervention + +You attempt to request the help of your deity, with a 100% chance of success. + + ## 7. Insight [SOL] @@ -2006,7 +2020,7 @@ The Mischief domain is followed by those who pursue joy, pleasure, and wealth th * Borrowed Luck -When you fail a saving throw where you did not have disadvantage, you can use your reaction to roll again. If you succeed, you will have disadvantage on your next saving throw. +When you fail a saving throw where you did not have disadvantage, you can use your reaction to roll again. If you succeed, you will have disadvantage on your next saving throw.​​​​​​​ * Mischief Domain Spells @@ -2040,7 +2054,7 @@ When you hit a creature with a melee or ranged weapon attack, you can Channel Di * Elusive Target -Starting at level 6, you are extremely hard to corner in close combat. When a melee attack hits you, you can use your reaction to gain the benefits of Dodging and Disengaging until the end of your next turn. +Starting at level 6, you are extremely hard to corner in close combat. When a melee attack hits you, you can use your reaction to gain the benefits of Dodging and Disengaging until the end of your next turn.​​​​​​ ### Level 8 @@ -2139,6 +2153,13 @@ You attempt to request the help of your deity, with a success chance of 1% per c As an action, you present your holy symbol and invoke the name of your deity. Each beast or plant creature that can see you within 30 feet of you must make a Wisdom saving throw. If the creature fails its saving throw, it is mind controlled by you for 1 minute. The target can repeat the saving throw at the end of each of its turns, ending the effect on itself on a success. +### Level 20 + +* Improved Divine Intervention + +You attempt to request the help of your deity, with a 100% chance of success. + + ## 12. Oblivion [SOL] @@ -2367,6 +2388,13 @@ You attempt to request the help of your deity, with a success chance of 1% per c You can use your bonus action to gain flying speed equal to your walking speed for one hour. +### Level 20 + +* Improved Divine Intervention + +You attempt to request the help of your deity, with a 100% chance of success. + + # Druid @@ -3025,6 +3053,10 @@ You can replace one maneuver you know with a new one. ### Level 10 +* Additional Superiority Dice + +You gain two additional superiority dice. + * Replace Maneuver You can replace one maneuver you know with a new one. @@ -3033,10 +3065,6 @@ You can replace one maneuver you know with a new one. Your superiority die is upgraded to D10. -* Two Additional Superiority Dice - -You gain two additional superiority dice. - ### Level 15 @@ -3132,14 +3160,14 @@ You can use a bonus action to give all allies within 3 cells of you (including y ### Level 7 -* Coordinated Defense +* Coordinated Defense​​​​​​​ When you use the attack action, you can forego one of your attacks to grant an ally within 3 cells of you (including yourself) Dodge until the start of your next turn. ### Level 10 -* Invigorating Shout +* Invigorating Shout​​​​​​​ Rousing Shout's range increases from 3 to 6 cells. Allies affected by Rousing Shout now also gain temporary hit points equal to your level for 1 minute. diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 6a7e0213ee..3fda7a3e1a 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -2,8 +2,9 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Bountiful Luck feat triggering on any failure regardless of dice roll -- fixed Martial Guardian not getting the Sentinel feat - fixed Cleric domains missing divine intervention improvement at 20 +- fixed Martial Guardian not getting the Sentinel feat +- fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt index ba799e7955..696eacddd9 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Ein Lichtblitz schießt aus deiner Brust. Eine andere Kreatur deiner Wahl, die du innerhalb von 30 Fuß von dir sehen kannst, muss einen Konstitutionsrettungswurf bestehen oder erleidet 1W6 Strahlungsschaden und ist bis zum Beginn deines nächsten Zuges geblendet. Action/&WildSurgeBoltTitle=Bolzen -Action/&WildSurgeSummonDescription=Ein immaterieller Geist erscheint in einem freien Bereich, den Sie innerhalb von 30 Fuß um sich herum sehen können. Am Ende des aktuellen Zuges explodiert der Geist und jede Kreatur innerhalb von 5 Fuß muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W6 Kraftschaden. -Action/&WildSurgeSummonTitle=Beschwörung +Action/&WildSurgeSummonDescription=Wählen Sie einen Punkt, den Sie in einem Umkreis von 30 Fuß sehen können. Ein Ausbruch spiritueller Energie bricht aus dem Punkt hervor und jede Kreatur innerhalb eines 15 Fuß großen Würfels, der auf den Punkt zentriert ist, muss einen Rettungswurf für Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 1W6 Kraftschaden. Dieser Schaden erhöht sich auf 2W6 in der 11. Stufe und 3W6 in der 17. Stufe. +Action/&WildSurgeSummonTitle=Geisterexplosion Action/&WildSurgeTeleportDescription=Sie teleportieren sich bis zu 30 Fuß weit an einen für Sie sichtbaren freien Ort. Action/&WildSurgeTeleportTitle=Teleport Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 auf AC. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Bis Ihre Wut en Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Wild Surge: Wachstum Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Immer wenn eine Kreatur dich mit einem Angriffswurf trifft, bevor deine Wut endet, erleidet die Kreatur 1W6 Kraftschaden. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Wild Surge: Vergeltung -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Ein immaterieller Geist erscheint in einem freien Feld, das Sie innerhalb von 30 Fuß um sich herum sehen können. Am Ende des aktuellen Zuges explodiert der Geist und jede Kreatur innerhalb von 5 Fuß muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W6 Kraftschaden. Bis Ihre Wut endet, können Sie diesen Effekt erneut nutzen und einen weiteren Geist beschwören, und zwar in jedem Ihrer Züge als Bonusaktion. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wilde Woge: Beschwörung +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Wählen Sie einen Punkt, den Sie in einem Umkreis von 30 Fuß sehen können. Ein Ausbruch spiritueller Energie bricht aus dem Punkt hervor und jede Kreatur innerhalb eines 15 Fuß großen Würfels, der auf den Punkt zentriert ist, muss einen Rettungswurf für Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 1W6 Kraftschaden. Dieser Schaden erhöht sich auf 2W6 auf der 11. Stufe und 3W6 auf der 17. Stufe. Bis Ihre Wut endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wilder Anstieg: Geisterexplosion Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Du teleportierst dich bis zu 30 Fuß weit an einen freien Ort, den du sehen kannst. Bis deine Wut endet, kannst du diesen Effekt in jedem deiner Züge erneut als Bonusaktion nutzen. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Wilder Anstieg: Teleportieren Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=Die Waffe, die Sie halten, ist von Magie durchdrungen. Bis Ihre Wut endet, ändert sich der Schadenstyp der Waffe in Kraft und sie erhält die Wurfeigenschaften mit einer normalen Reichweite von 20 Fuß und einer großen Reichweite von 60 Fuß. Wenn die Waffe Ihre Hand verlässt, erscheint sie wieder in Ihrer Hand. Ihr Wutschadensbonus gilt auch für diese Wurfwaffe. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Wann immer Sie auf Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Kontrollierter Anstieg Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Unmittelbar nachdem du im Wutzustand Schaden genommen hast, kannst du deine Reaktion nutzen, um auf der Wild Magic-Tabelle zu würfeln und sofort den gewürfelten Effekt zu erzielen. Dieser Effekt ersetzt deinen aktuellen Wild Magic-Effekt. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Instabiler Backslash -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Wenn Sie in Ihren Zorn geraten, würfeln Sie auf der Tabelle Wilde Magie, um den erzeugten magischen Effekt zu bestimmen. Wenn der Effekt einen Rettungswurf erfordert, entspricht der DC 8 + Ihrem Kompetenzbonus + Ihrem Konstitutionsmodifikator.\n\nTabelle Wilde Magie:\n- Jede Kreatur im Umkreis von 30 Fuß um Sie muss einen Konstitutionsrettungswurf bestehen oder erleidet 1W12 nekrotischen Schaden. Sie erhalten außerdem 1W12 temporäre Trefferpunkte.\n- Sie teleportieren sich bis zu 30 Fuß weit an einen freien Ort, den Sie sehen können. Bis Ihr Zorn endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden.\n- Ein immaterieller Geist erscheint an einem freien Ort, den Sie im Umkreis von 30 Fuß um sich herum sehen können. Am Ende des aktuellen Zuges explodiert der Geist und jede Kreatur im Umkreis von 5 Fuß muss einen Geschicklichkeitsrettungswurf bestehen oder erleidet 1W6 Kraftschaden. Bis deine Wut endet, kannst du diesen Effekt erneut nutzen und einen anderen Geist beschwören, und zwar in jedem deiner Züge als Bonusaktion.\n- Magie durchdringt die Waffe, die du hältst. Bis deine Wut endet, ändert sich der Schadenstyp der Waffe zu Kraft und sie erhält die Wurfeigenschaften mit einer normalen Reichweite von 20 Fuß und einer großen Reichweite von 60 Fuß. Wenn die Waffe deine Hand verlässt, erscheint sie wieder in deiner Hand. Ihr Wutschadensbonus gilt auch für diese Wurfwaffe.\n- Immer wenn eine Kreatur Sie mit einem Angriffswurf trifft, bevor Ihre Wut endet, erleidet diese Kreatur 1W6 Kraftschaden.\n- Bis Ihre Wut endet, erhalten Sie einen Bonus von +1 auf die RK, und Ihre Verbündeten erhalten denselben Bonus, solange sie sich in einem Umkreis von 10 Fuß um Sie befinden.\n- Bis Ihre Wut endet, wird am Ende jedes Ihrer Züge der Boden in einem Umkreis von 15 Fuß um Sie bis zum Beginn Ihres nächsten Zuges zu schwierigem Gelände.\n- Ein Lichtblitz schießt aus Ihrer Brust. Eine andere Kreatur Ihrer Wahl, die Sie in einem Umkreis von 30 Fuß um Sie sehen können, muss einen Rettungswurf für Konstitution bestehen oder erleidet 1W6 Strahlungsschaden und ist bis zum Beginn Ihres nächsten Zuges geblendet. Bis Ihre Wut endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Wenn Sie in Ihren Zorn geraten, würfeln Sie auf der Tabelle Wilde Magie, um den erzeugten magischen Effekt zu bestimmen. Wenn der Effekt einen Rettungswurf erfordert, entspricht der DC 8 + Ihrem Kompetenzbonus + Ihrem Konstitutionsmodifikator.\n\nTabelle Wilde Magie:\n- Jede Kreatur im Umkreis von 30 Fuß um Sie muss einen Konstitutionsrettungswurf bestehen oder erleidet 1W12 nekrotischen Schaden. Sie erhalten außerdem 1W12 temporäre Trefferpunkte.\n- Sie teleportieren sich bis zu 30 Fuß weit an einen freien Ort, den Sie sehen können. Bis Ihr Zorn endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden.\n- Wählen Sie einen Punkt im Umkreis von 30 Fuß, den Sie sehen können. Ein Ausbruch spiritueller Energie bricht aus dem Punkt hervor und jede Kreatur innerhalb eines 15 Fuß großen Würfels mit dem Mittelpunkt des Punkts muss einen Geschicklichkeitsrettungswurf bestehen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 1W6 Kraftschaden. Dieser Schaden erhöht sich auf 2W6 auf Stufe 11 und auf 3W6 auf Stufe 17. Bis deine Wut endet, kannst du diesen Effekt in jedem deiner Züge als Bonusaktion erneut verwenden.\n- Magie durchdringt die Waffe, die du hältst. Bis deine Wut endet, ändert sich der Schadenstyp der Waffe zu Kraft und sie erhält die Wurfeigenschaften mit einer normalen Reichweite von 20 Fuß und einer großen Reichweite von 60 Fuß. Wenn die Waffe deine Hand verlässt, erscheint sie wieder in deiner Hand. Ihr Wutschadensbonus gilt auch für diese Wurfwaffe.\n- Immer wenn eine Kreatur Sie mit einem Angriffswurf trifft, bevor Ihre Wut endet, erleidet diese Kreatur 1W6 Kraftschaden.\n- Bis Ihre Wut endet, erhalten Sie einen Bonus von +1 auf die RK, und Ihre Verbündeten erhalten denselben Bonus, solange sie sich in einem Umkreis von 10 Fuß um Sie befinden.\n- Bis Ihre Wut endet, wird am Ende jedes Ihrer Züge der Boden in einem Umkreis von 15 Fuß um Sie bis zum Beginn Ihres nächsten Zuges zu schwierigem Gelände.\n- Ein Lichtblitz schießt aus Ihrer Brust. Eine andere Kreatur Ihrer Wahl, die Sie in einem Umkreis von 30 Fuß um Sie sehen können, muss einen Rettungswurf für Konstitution bestehen oder erleidet 1W6 Strahlungsschaden und ist bis zum Beginn Ihres nächsten Zuges geblendet. Bis Ihre Wut endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Wilde Welle Feature/&PowerPathOfTheWildMagicAuraDescription=Bis Ihre Wut endet, erhalten Sie einen Bonus von +1 auf die RK. Den gleichen Bonus erhalten Ihre Verbündeten, solange sie sich in einem Umkreis von 10 Fuß um Sie befinden. Feature/&PowerPathOfTheWildMagicAuraTitle=Wilder Schwall: Aura @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Als Aktion können Sie Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Magisches Bewusstsein Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Der Geist explodiert und jedes Wesen im Umkreis von 1,52 m muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W6 Kraftschaden. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wilder Anstieg: Geisterexplosion -Feature/&PowerPathOfTheWildMagicSummonDescription=Ein immaterieller Geist erscheint in einem freien Feld, das Sie innerhalb von 30 Fuß um sich herum sehen können. Am Ende des aktuellen Zuges explodiert der Geist und jede Kreatur innerhalb von 5 Fuß muss einen Rettungswurf für Geschicklichkeit bestehen oder erleidet 1W6 Kraftschaden. Bis Ihre Wut endet, können Sie diesen Effekt erneut nutzen und einen weiteren Geist beschwören, und zwar in jedem Ihrer Züge als Bonusaktion. -Feature/&PowerPathOfTheWildMagicSummonTitle=Wilde Woge: Beschwörung +Feature/&PowerPathOfTheWildMagicSummonDescription=Wählen Sie einen Punkt, den Sie in einem Umkreis von 30 Fuß sehen können. Ein Ausbruch spiritueller Energie bricht aus dem Punkt hervor und jede Kreatur innerhalb eines 15 Fuß großen Würfels, der auf den Punkt zentriert ist, muss einen Rettungswurf für Geschicklichkeit machen. Bei einem misslungenen Rettungswurf erleidet die Kreatur 1W6 Kraftschaden. Dieser Schaden erhöht sich auf 2W6 auf der 11. Stufe und 3W6 auf der 17. Stufe. Bis Ihre Wut endet, können Sie diesen Effekt in jedem Ihrer Züge erneut als Bonusaktion verwenden. +Feature/&PowerPathOfTheWildMagicSummonTitle=Wilder Anstieg: Geisterexplosion Feature/&PowerPathOfTheWildMagicTeleportDescription=Sie teleportieren sich bis zu 30 Fuß weit an einen für Sie sichtbaren freien Ort. Feature/&PowerPathOfTheWildMagicTeleportTitle=Wilder Anstieg: Teleportieren Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Nutzen Sie Ihre Reaktion, um „Wild Surge“ zu würfeln und den aktiven Effekt zu ersetzen. diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt index c1ea04bd02..ec341c654c 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Un rayo de luz sale disparado de tu pecho. Otra criatura de tu elección que puedas ver a 30 pies de ti debe superar una tirada de salvación de Constitución o recibirá 1d6 puntos de daño radiante y quedará cegada hasta el comienzo de tu siguiente turno. Action/&WildSurgeBoltTitle=Tornillo -Action/&WildSurgeSummonDescription=Un espíritu intangible aparece en un espacio desocupado que puedes ver a 30 pies de ti. Al final del turno actual, el espíritu explota y todas las criaturas que se encuentren a 5 pies de él deben superar una tirada de salvación de Destreza o sufrir 1d6 puntos de daño por fuerza. -Action/&WildSurgeSummonTitle=Convocar +Action/&WildSurgeSummonDescription=Elige un punto que puedas ver a 30 pies de ti. Una explosión de energía espiritual brota del punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe realizar una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño por fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. +Action/&WildSurgeSummonTitle=Explosión espiritual Action/&WildSurgeTeleportDescription=Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Action/&WildSurgeTeleportTitle=Teletransportarse Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 a CA. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Hasta que tu ir Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Oleada salvaje: crecimiento Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Siempre que una criatura te golpee con una tirada de ataque antes de que termine tu ira, esa criatura sufre 1d6 puntos de daño por fuerza. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Oleada salvaje: Retribución -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Un espíritu intangible aparece en un espacio desocupado que puedes ver a 30 pies de ti. Al final del turno actual, el espíritu explota y cada criatura que se encuentre a 5 pies de él debe superar una tirada de salvación de Destreza o sufrir 1d6 puntos de daño por fuerza. Hasta que tu furia termine, puedes usar este efecto de nuevo, invocando a otro espíritu, en cada uno de tus turnos como acción adicional. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Oleada salvaje: invocación +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Elija un punto que pueda ver a menos de 30 pies de usted. Una explosión de energía espiritual brota del punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe realizar una tirada de salvación de Destreza. Si falla la salvación, la criatura sufre 1d6 de daño de fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que termine tu ira, puedes volver a utilizar este efecto en cada uno de tus turnos como acción adicional. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Oleada salvaje: explosión espiritual Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Hasta que tu furia termine, puedes volver a usar este efecto en cada uno de tus turnos como acción adicional. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Oleada salvaje: teletransporte Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=La magia impregna el arma que sostienes. Hasta que tu furia termine, el tipo de daño del arma cambia a fuerza y obtiene las propiedades de lanzamiento, con un alcance normal de 20 pies y un alcance largo de 60 pies. Si el arma abandona tu mano, reaparece en ella. Tu bonificación de daño por furia también se aplicará a esta arma arrojadiza. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Siempre que saques Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Aumento controlado Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Inmediatamente después de recibir daño mientras estás en estado de furia, puedes usar tu reacción para tirar en la tabla de Magia Salvaje y producir inmediatamente el efecto que hayas obtenido. Este efecto reemplaza tu efecto de Magia Salvaje actual. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Barra invertida inestable -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Cuando entres en tu furia, tira en la tabla de Magia Salvaje para determinar el efecto mágico producido. Si el efecto requiere una tirada de salvación, la CD es igual a 8 + tu bonificador de competencia + tu modificador de Constitución.\n\nTabla de Magia Salvaje:\n- Cada criatura a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o sufrir 1d12 puntos de daño necrótico. También obtienes 1d12 puntos de golpe temporales.\n- Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Hasta que termine tu furia, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- Un espíritu intangible aparece en un espacio desocupado que puedes ver a 30 pies o menos de ti. Al final del turno actual, el espíritu explota, y cada criatura a 5 pies o menos de él debe tener éxito en una tirada de salvación de Destreza o sufrir 1d6 puntos de daño de fuerza. Hasta que tu furia termine, puedes usar este efecto nuevamente, invocando a otro espíritu, en cada uno de tus turnos como acción adicional.\n- La magia imbuye el arma que estás sosteniendo. Hasta que tu furia termine, el tipo de daño del arma cambia a fuerza y obtiene las propiedades de lanzamiento, con un alcance normal de 20 pies y un alcance largo de 60 pies. Si el arma abandona tu mano, reaparece en tu mano. Tu bonificación por daño de furia también se aplicará a esta arma arrojadiza.\n- Siempre que una criatura te golpee con una tirada de ataque antes de que tu furia termine, esa criatura recibe 1d6 de daño por fuerza.\n- Hasta que tu furia termine, obtienes una bonificación de +1 a la CA, y mientras estés a 10 pies o menos de ti, tus aliados obtienen la misma bonificación.\n- Hasta que tu furia termine, al final de cada uno de tus turnos, el suelo a 15 pies o menos de ti se convierte en terreno difícil hasta el comienzo de tu siguiente turno.\n- Un rayo de luz sale disparado de tu pecho. Otra criatura de tu elección que puedas ver a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o recibirá 1d6 de daño radiante y quedará cegada hasta el comienzo de tu siguiente turno. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como una acción adicional. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Cuando entres en tu furia, tira en la tabla de Magia Salvaje para determinar el efecto mágico producido. Si el efecto requiere una tirada de salvación, la CD es igual a 8 + tu bonificador de competencia + tu modificador de Constitución.\n\nTabla de Magia Salvaje:\n- Cada criatura a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o sufrir 1d12 puntos de daño necrótico. También obtienes 1d12 puntos de golpe temporales.\n- Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- Elige un punto que puedas ver a 30 pies o menos de ti. Una explosión de energía espiritual estalla desde el punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe hacer una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño de fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- La magia impregna el arma que estás sosteniendo. Hasta que tu furia termine, el tipo de daño del arma cambia a fuerza y ​​obtiene las propiedades de lanzamiento, con un alcance normal de 20 pies y un alcance largo de 60 pies. Si el arma abandona tu mano, reaparece en tu mano. Tu bonificación por daño de furia también se aplicará a esta arma arrojadiza.\n- Siempre que una criatura te golpee con una tirada de ataque antes de que tu furia termine, esa criatura recibe 1d6 de daño por fuerza.\n- Hasta que tu furia termine, obtienes una bonificación de +1 a la CA, y mientras estés a 10 pies o menos de ti, tus aliados obtienen la misma bonificación.\n- Hasta que tu furia termine, al final de cada uno de tus turnos, el suelo a 15 pies o menos de ti se convierte en terreno difícil hasta el comienzo de tu siguiente turno.\n- Un rayo de luz sale disparado de tu pecho. Otra criatura de tu elección que puedas ver a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o recibirá 1d6 de daño radiante y quedará cegada hasta el comienzo de tu siguiente turno. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como una acción adicional. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Oleada salvaje Feature/&PowerPathOfTheWildMagicAuraDescription=Hasta que termine tu ira, obtienes una bonificación de +1 a la CA y, mientras estén a 10 pies de ti, tus aliados obtienen la misma bonificación. Feature/&PowerPathOfTheWildMagicAuraTitle=Oleada salvaje: Aura @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Como acción, puedes a Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Conciencia mágica Feature/&PowerPathOfTheWildMagicSummonBlastDescription=El espíritu explota, y cada criatura que se encuentre a 5 pies de él debe tener éxito en una tirada de salvación de Destreza o sufrir 1d6 de daño por fuerza. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Oleada salvaje: Explosión espiritual -Feature/&PowerPathOfTheWildMagicSummonDescription=Un espíritu intangible aparece en un espacio desocupado que puedes ver a 30 pies de ti. Al final del turno actual, el espíritu explota y cada criatura que se encuentre a 5 pies de él debe superar una tirada de salvación de Destreza o sufrir 1d6 puntos de daño por fuerza. Hasta que tu furia termine, puedes usar este efecto de nuevo, invocando a otro espíritu, en cada uno de tus turnos como acción adicional. -Feature/&PowerPathOfTheWildMagicSummonTitle=Oleada salvaje: invocación +Feature/&PowerPathOfTheWildMagicSummonDescription=Elige un punto que puedas ver a 30 pies de ti. Una explosión de energía espiritual brota del punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe realizar una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño por fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que tu furia termine, puedes volver a usar este efecto en cada uno de tus turnos como acción adicional. +Feature/&PowerPathOfTheWildMagicSummonTitle=Oleada salvaje: explosión espiritual Feature/&PowerPathOfTheWildMagicTeleportDescription=Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Feature/&PowerPathOfTheWildMagicTeleportTitle=Oleada salvaje: teletransporte Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa tu reacción para lanzar Wild Surge y reemplazar el efecto activo. diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt index b706330da3..9223ec0bfe 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Un éclair de lumière jaillit de votre poitrine. Une autre créature de votre choix que vous pouvez voir à moins de 9 mètres de vous doit réussir un jet de sauvegarde de Constitution ou subir 1d6 dégâts radiants et être aveuglée jusqu'au début de votre prochain tour. Action/&WildSurgeBoltTitle=Boulon -Action/&WildSurgeSummonDescription=Un esprit intangible apparaît dans un espace inoccupé que vous pouvez voir à 9 mètres de vous. À la fin du tour en cours, l'esprit explose et chaque créature à 1,5 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. -Action/&WildSurgeSummonTitle=Convoquer +Action/&WildSurgeSummonDescription=Choisissez un point que vous pouvez voir à moins de 9 mètres de vous. Une explosion d'énergie spirituelle jaillit du point et chaque créature dans un cube de 4,5 mètres centré sur le point doit effectuer un jet de sauvegarde de Dextérité. En cas d'échec, la créature subit 1d6 dégâts de force. Ces dégâts augmentent à 2d6 au niveau 11 et à 3d6 au niveau 17. +Action/&WildSurgeSummonTitle=Explosion spirituelle Action/&WildSurgeTeleportDescription=Vous vous téléportez jusqu'à 9 mètres dans un espace inoccupé que vous pouvez voir. Action/&WildSurgeTeleportTitle=Téléportation Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 à CA. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Jusqu'à ce que Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Wild Surge : croissance Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=À chaque fois qu'une créature vous touche avec un jet d'attaque avant la fin de votre rage, cette créature subit 1d6 dégâts de force. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Wild Surge : Rétribution -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Un esprit intangible apparaît dans un espace inoccupé que vous pouvez voir à moins de 9 mètres de vous. À la fin du tour en cours, l'esprit explose et chaque créature à moins de 1,50 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. Jusqu'à la fin de votre rage, vous pouvez utiliser à nouveau cet effet, en invoquant un autre esprit, à chacun de vos tours comme une action bonus. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge : Invocation +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Choisissez un point que vous pouvez voir à 9 mètres de vous. Une explosion d'énergie spirituelle jaillit du point et chaque créature dans un cube de 4,5 mètres centré sur le point doit effectuer un jet de sauvegarde de Dextérité. En cas d'échec, la créature subit 1d6 dégâts de force. Ces dégâts augmentent à 2d6 au niveau 11 et à 3d6 au niveau 17. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge : Explosion spirituelle Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Vous vous téléportez jusqu'à 9 mètres dans un espace inoccupé que vous pouvez voir. Jusqu'à la fin de votre rage, vous pouvez réutiliser cet effet à chacun de vos tours comme action bonus. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Wild Surge : Téléportation Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=La magie imprègne l'arme que vous tenez. Jusqu'à ce que votre rage prenne fin, le type de dégâts de l'arme devient force et elle acquiert les propriétés de lancer, avec une portée normale de 6 mètres et une portée longue de 18 mètres. Si l'arme quitte votre main, elle réapparaît dans votre main. Votre bonus de dégâts de rage s'appliquera également sur cette arme lancée. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=À chaque fois que Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Surtension contrôlée Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Immédiatement après avoir subi des dégâts alors que vous êtes enragé, vous pouvez utiliser votre réaction pour lancer un jet sur la table de Magie sauvage et produire immédiatement l'effet obtenu. Cet effet remplace votre effet de Magie sauvage actuel. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Barre oblique inverse instable -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Lorsque vous entrez en rage, lancez un dé sur la table de Magie Sauvage pour déterminer l'effet magique produit. Si l'effet nécessite un jet de sauvegarde, le DD est égal à 8 + votre bonus de maîtrise + votre modificateur de Constitution.\n\nTable de Magie Sauvage :\n- Chaque créature à 9 mètres de vous doit réussir un jet de sauvegarde de Constitution ou subir 1d12 dégâts nécrotiques. Vous gagnez également 1d12 points de vie temporaires.\n- Vous vous téléportez jusqu'à 9 mètres dans un espace inoccupé que vous pouvez voir. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus.\n- Un esprit intangible apparaît dans un espace inoccupé que vous pouvez voir à 9 mètres de vous. À la fin du tour en cours, l'esprit explose et chaque créature à 1,5 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau, en invoquant un autre esprit, à chacun de vos tours en tant qu'action bonus.\n- La magie imprègne l'arme que vous tenez. Jusqu'à ce que votre rage prenne fin, le type de dégâts de l'arme change en force, et elle gagne les propriétés de lancer, avec une portée normale de 20 pieds et une portée longue de 60 pieds. Si l'arme quitte votre main, elle réapparaît dans votre main. Votre bonus de dégâts de rage s'appliquera également sur cette arme lancée.\n- Chaque fois qu'une créature vous touche avec un jet d'attaque avant la fin de votre rage, cette créature subit 1d6 dégâts de force.\n- Jusqu'à ce que votre rage prenne fin, vous obtenez un bonus de +1 à la CA, et tant qu'ils sont à 10 pieds de vous, vos alliés obtiennent le même bonus.\n- Jusqu'à ce que votre rage prenne fin, à la fin de chacun de vos tours, le sol à 15 pieds de vous devient un terrain difficile jusqu'au début de votre prochain tour.\n- Un éclair de lumière jaillit de votre poitrine. Une autre créature de votre choix que vous pouvez voir à moins de 9 mètres de vous doit réussir un jet de sauvegarde de Constitution ou subir 1d6 dégâts radiants et être aveuglée jusqu'au début de votre prochain tour. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Lorsque vous entrez en rage, lancez un dé sur la table de Magie Sauvage pour déterminer l'effet magique produit. Si l'effet nécessite un jet de sauvegarde, le DD est égal à 8 + votre bonus de maîtrise + votre modificateur de Constitution.\n\nTable de Magie Sauvage :\n- Chaque créature à 9 mètres de vous doit réussir un jet de sauvegarde de Constitution ou subir 1d12 dégâts nécrotiques. Vous gagnez également 1d12 points de vie temporaires.\n- Vous vous téléportez jusqu'à 9 mètres dans un espace inoccupé que vous pouvez voir. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus.\n- Choisissez un point que vous pouvez voir à 9 mètres de vous. Une explosion d'énergie spirituelle jaillit du point et chaque créature dans un cube de 4,5 mètres centré sur le point doit effectuer un jet de sauvegarde de Dextérité. En cas d'échec, la créature subit 1d6 dégâts de force. Ces dégâts augmentent à 2d6 au niveau 11 et à 3d6 au niveau 17. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. \n- La magie imprègne l'arme que vous tenez. Jusqu'à ce que votre rage prenne fin, le type de dégâts de l'arme devient force et elle acquiert les propriétés de lancer, avec une portée normale de 6 mètres et une portée longue de 18 mètres. Si l'arme quitte votre main, elle réapparaît dans votre main. Votre bonus de dégâts de rage s'appliquera également sur cette arme de jet.\n- Chaque fois qu'une créature vous touche avec un jet d'attaque avant la fin de votre rage, cette créature subit 1d6 dégâts de force.\n- Jusqu'à la fin de votre rage, vous obtenez un bonus de +1 à la CA, et tant qu'ils sont à 3 mètres de vous, vos alliés obtiennent le même bonus.\n- Jusqu'à la fin de votre rage, à la fin de chacun de vos tours, le sol à 4,5 mètres de vous devient un terrain difficile jusqu'au début de votre prochain tour.\n- Un éclair de lumière jaillit de votre poitrine. Une autre créature de votre choix que vous pouvez voir à 9 mètres de vous doit réussir un jet de sauvegarde de Constitution ou subir 1d6 dégâts radiants et être aveuglée jusqu'au début de votre prochain tour. Jusqu'à la fin de votre rage, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Surtension sauvage Feature/&PowerPathOfTheWildMagicAuraDescription=Jusqu'à ce que votre rage prenne fin, vous obtenez un bonus de +1 à la CA, et tant qu'ils sont à moins de 3 mètres de vous, vos alliés obtiennent le même bonus. Feature/&PowerPathOfTheWildMagicAuraTitle=Surtension sauvage : Aura @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=En tant qu'action, vou Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Conscience magique Feature/&PowerPathOfTheWildMagicSummonBlastDescription=L'esprit explose et chaque créature à moins de 1,50 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wild Surge : Explosion spirituelle -Feature/&PowerPathOfTheWildMagicSummonDescription=Un esprit intangible apparaît dans un espace inoccupé que vous pouvez voir à 9 mètres de vous. À la fin du tour en cours, l'esprit explose et chaque créature à 1,5 mètre de lui doit réussir un jet de sauvegarde de Dextérité ou subir 1d6 dégâts de force. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau, en invoquant un autre esprit, à chacun de vos tours en tant qu'action bonus. -Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge : Invocation +Feature/&PowerPathOfTheWildMagicSummonDescription=Choisissez un point que vous pouvez voir à 9 mètres de vous. Une explosion d'énergie spirituelle jaillit du point et chaque créature dans un cube de 4,5 mètres centré sur le point doit effectuer un jet de sauvegarde de Dextérité. En cas d'échec, la créature subit 1d6 dégâts de force. Ces dégâts augmentent à 2d6 au niveau 11 et à 3d6 au niveau 17. Jusqu'à ce que votre rage prenne fin, vous pouvez utiliser cet effet à nouveau à chacun de vos tours en tant qu'action bonus. +Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge : Explosion spirituelle Feature/&PowerPathOfTheWildMagicTeleportDescription=Vous vous téléportez jusqu'à 30 pieds dans un espace inoccupé que vous pouvez voir. Feature/&PowerPathOfTheWildMagicTeleportTitle=Wild Surge : Téléportation Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Utilisez votre réaction pour lancer Wild Surge et remplacer l'effet actif. diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt index 18e0df67f2..6e460db618 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Un lampo di luce scocca dal tuo petto. Un'altra creatura a tua scelta che puoi vedere entro 30 piedi da te deve superare un tiro salvezza su Costituzione o subire 1d6 danni radianti e rimanere accecata fino all'inizio del tuo prossimo turno. Action/&WildSurgeBoltTitle=Bullone -Action/&WildSurgeSummonDescription=Uno spirito intangibile appare in uno spazio non occupato che puoi vedere entro 30 piedi da te. Alla fine del turno corrente, lo spirito esplode e ogni creatura entro 5 piedi da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. -Action/&WildSurgeSummonTitle=Convocare +Action/&WildSurgeSummonDescription=Scegli un punto che puoi vedere entro 9 metri da te. Un'esplosione di energia spirituale erutta dal punto e ogni creatura all'interno di un cubo di 4,5 metri centrato sul punto deve effettuare un tiro salvezza su Destrezza. Se fallisce il tiro salvezza, la creatura subisce 1d6 danni da forza. Questo danno aumenta a 2d6 all'11° livello e 3d6 al 17° livello. +Action/&WildSurgeSummonTitle=Esplosione spirituale Action/&WildSurgeTeleportDescription=Ti teletrasporti fino a 9 metri in uno spazio non occupato che puoi vedere. Action/&WildSurgeTeleportTitle=Teletrasporto Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 a CA. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Finché la tua Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Wild Surge: Crescita Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Ogni volta che una creatura ti colpisce con un tiro per colpire prima che la tua furia finisca, quella creatura subisce 1d6 danni da forza. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Wild Surge: Retribuzione -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Uno spirito intangibile appare in uno spazio non occupato che puoi vedere entro 30 piedi da te. Alla fine del turno corrente, lo spirito esplode e ogni creatura entro 5 piedi da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. Finché la tua rabbia non finisce, puoi usare di nuovo questo effetto, evocando un altro spirito, in ognuno dei tuoi turni come azione bonus. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge: Evocazione +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Scegli un punto che puoi vedere entro 30 piedi da te. Un'esplosione di energia spirituale erutta dal punto e ogni creatura entro un cubo di 15 piedi centrato sul punto deve effettuare un tiro salvezza su Destrezza. Se fallisce il tiro salvezza, la creatura subisce 1d6 danni da forza. Questi danni aumentano a 2d6 all'11° livello e a 3d6 al 17° livello. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Wild Surge: Esplosione spirituale Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Ti teletrasporti fino a 30 piedi in uno spazio non occupato che puoi vedere. Finché la tua rabbia non finisce, puoi usare questo effetto di nuovo in ognuno dei tuoi turni come azione bonus. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Wild Surge: Teletrasporto Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=La magia infonde l'arma che stai impugnando. Finché la tua furia non finisce, il tipo di danno dell'arma cambia in forza e ottiene le proprietà di lancio, con una gittata normale di 20 piedi e una lunga gittata di 60 piedi. Se l'arma lascia la tua mano, l'arma riappare nella tua mano. Il tuo bonus di danno da furia si applicherà anche a quest'arma lanciata. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Ogni volta che tiri Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Ondata controllata Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Subito dopo aver subito danni mentre sei in preda alla furia, puoi usare la tua reazione per tirare sulla tabella Wild Magic e produrre immediatamente l'effetto tirato. Questo effetto sostituisce il tuo attuale effetto Wild Magic. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Barra rovesciata instabile -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Quando entri nella tua furia, tira sulla tabella Magia selvaggia per determinare l'effetto magico prodotto. Se l'effetto richiede un tiro salvezza, la CD è pari a 8 + il tuo bonus di competenza + il tuo modificatore di Costituzione.\n\nTabella Magia selvaggia:\n- Ogni creatura entro 30 piedi da te deve superare un tiro salvezza su Costituzione o subire 1d12 danni necrotici. Ottieni anche 1d12 punti ferita temporanei.\n- Ti teletrasporti fino a 30 piedi in uno spazio non occupato che puoi vedere. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus.\n- Uno spirito intangibile appare in uno spazio non occupato che puoi vedere entro 30 piedi da te. Alla fine del turno in corso, lo spirito esplode e ogni creatura entro 5 piedi da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. Finché la tua rabbia non finisce, puoi usare di nuovo questo effetto, evocando un altro spirito, in ognuno dei tuoi turni come azione bonus.\n- La magia infonde l'arma che stai impugnando. Finché la tua rabbia non finisce, il tipo di danno dell'arma cambia in forza e ottiene le proprietà di lancio, con una gittata normale di 20 piedi e una lunga gittata di 60 piedi. Se l'arma lascia la tua mano, l'arma riappare nella tua mano. Il tuo bonus di danno da rabbia si applicherà anche a quest'arma lanciata.\n- Ogni volta che una creatura ti colpisce con un tiro per colpire prima che la tua rabbia finisca, quella creatura subisce 1d6 danni da forza.\n- Finché la tua rabbia non finisce, ottieni un bonus di +1 alla CA e, finché si trovano entro 10 piedi da te, i tuoi alleati ottengono lo stesso bonus.\n- Finché la tua rabbia non finisce, alla fine di ogni tuo turno, il terreno entro 15 piedi da te diventa terreno difficile fino all'inizio del tuo turno successivo.\n- Un fulmine di luce spara dal tuo petto. Un'altra creatura a tua scelta che puoi vedere entro 30 piedi da te deve superare un tiro salvezza su Costituzione o subire 1d6 danni radianti e rimanere accecata fino all'inizio del tuo turno successivo. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Quando entri nella tua furia, tira sulla tabella Magia selvaggia per determinare l'effetto magico prodotto. Se l'effetto richiede un tiro salvezza, la CD è pari a 8 + il tuo bonus di competenza + il tuo modificatore di Costituzione.\n\nTabella Magia selvaggia:\n- Ogni creatura entro 30 piedi da te deve superare un tiro salvezza su Costituzione o subire 1d12 danni necrotici. Ottieni anche 1d12 punti ferita temporanei.\n- Ti teletrasporti fino a 30 piedi in uno spazio non occupato che puoi vedere. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus.\n- Scegli un punto che puoi vedere entro 30 piedi da te. Un'esplosione di energia spirituale erutta dal punto e ogni creatura entro un cubo di 15 piedi centrato sul punto deve effettuare un tiro salvezza su Destrezza. In caso di tiro salvezza fallito, la creatura subisce 1d6 danni da forza. Questo danno aumenta a 2d6 all'11° livello e a 3d6 al 17° livello. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus.\n- La magia infonde l'arma che stai impugnando. Finché la tua furia non finisce, il tipo di danno dell'arma cambia in forza e ottiene le proprietà di lancio, con una gittata normale di 20 piedi e una lunga gittata di 60 piedi. Se l'arma lascia la tua mano, l'arma riappare nella tua mano. Il tuo bonus di danno da furia si applicherà anche a quest'arma lanciata.\n- Ogni volta che una creatura ti colpisce con un tiro per colpire prima che la tua furia finisca, quella creatura subisce 1d6 danni da forza.\n- Finché la tua furia non finisce, ottieni un bonus di +1 alla CA e, finché ti trovi entro 10 piedi da te, i tuoi alleati ottengono lo stesso bonus.\n- Finché la tua furia non finisce, alla fine di ogni tuo turno, il terreno entro 15 piedi da te diventa terreno difficile fino all'inizio del tuo turno successivo.\n- Un fulmine di luce scocca dal tuo petto. Un'altra creatura a tua scelta che puoi vedere entro 30 piedi da te deve superare un tiro salvezza su Costituzione o subire 1d6 danni radianti ed essere accecata fino all'inizio del tuo turno successivo. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Ondata selvaggia Feature/&PowerPathOfTheWildMagicAuraDescription=Finché la tua furia non finisce, ottieni un bonus di +1 alla CA e, finché si trovano entro 3 metri da te, i tuoi alleati ottengono lo stesso bonus. Feature/&PowerPathOfTheWildMagicAuraTitle=Ondata selvaggia: Aura @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Come azione, puoi apri Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Consapevolezza magica Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Lo spirito esplode e ogni creatura entro 1,5 metri da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Wild Surge: Esplosione spirituale -Feature/&PowerPathOfTheWildMagicSummonDescription=Uno spirito intangibile appare in uno spazio non occupato che puoi vedere entro 30 piedi da te. Alla fine del turno corrente, lo spirito esplode e ogni creatura entro 5 piedi da esso deve superare un tiro salvezza su Destrezza o subire 1d6 danni da forza. Finché la tua rabbia non finisce, puoi usare di nuovo questo effetto, evocando un altro spirito, in ognuno dei tuoi turni come azione bonus. -Feature/&PowerPathOfTheWildMagicSummonTitle=Impeto Selvaggio: Evoca +Feature/&PowerPathOfTheWildMagicSummonDescription=Scegli un punto che puoi vedere entro 30 piedi da te. Un'esplosione di energia spirituale erutta dal punto e ogni creatura entro un cubo di 15 piedi centrato sul punto deve effettuare un tiro salvezza su Destrezza. Se fallisce il tiro salvezza, la creatura subisce 1d6 danni da forza. Questi danni aumentano a 2d6 all'11° livello e a 3d6 al 17° livello. Finché la tua furia non finisce, puoi usare di nuovo questo effetto in ognuno dei tuoi turni come azione bonus. +Feature/&PowerPathOfTheWildMagicSummonTitle=Wild Surge: Esplosione spirituale Feature/&PowerPathOfTheWildMagicTeleportDescription=Ti teletrasporti fino a 9 metri di distanza in uno spazio libero e visibile. Feature/&PowerPathOfTheWildMagicTeleportTitle=Wild Surge: Teletrasporto Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa la tua reazione per lanciare Impeto Selvaggio e sostituire l'effetto attivo. diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt index 18c3ba5454..1ac929ffc7 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=あなたの胸から光の矢が発射されます。あなたの周囲 30 フィート以内にいる、あなたが選択した別のクリーチャーは、耐久力セーヴィング スローに成功しなければ 1d6 の光輝ダメージを受け、あなたの次のターンの開始時まで盲目になります。 Action/&WildSurgeBoltTitle=ボルト -Action/&WildSurgeSummonDescription=実体のない霊が、あなたの 30 フィート以内の、あなたが見ることができる空いているスペースに現れます。現在のターンの終了時に、霊は爆発し、その 5 フィート以内の各クリーチャーは敏捷性セーヴィング スローに成功しなければ、1d6 の力場ダメージを受けます。 -Action/&WildSurgeSummonTitle=召喚 +Action/&WildSurgeSummonDescription=30 フィート以内で見渡せる地点を選択します。その地点から霊的エネルギーの爆発が噴出し、その地点を中心とした 15 フィートの立方体内の各クリーチャーは敏捷性セーヴィング スローを実行する必要があります。セーヴィングに失敗すると、クリーチャーは 1d6 の力場ダメージを受けます。このダメージは 11 レベルで 2d6、17 レベルで 3d6 に増加します。 +Action/&WildSurgeSummonTitle=スピリットブラスト Action/&WildSurgeTeleportDescription=視界内の空いているスペースまで最大 30 フィートテレポートします。 Action/&WildSurgeTeleportTitle=テレポート Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=AC に +1 のボーナスを得ます。 @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=あなたの激 Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=ワイルドサージ:成長 Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=あなたの激怒が終了する前にクリーチャーが攻撃ロールであなたに命中した場合、そのクリーチャーは 1d6 のフォース ダメージを受けます。 Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=ワイルドサージ:報復 -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=実体のない霊が、あなたの 30 フィート以内の、あなたが見ることができる空いているスペースに現れます。現在のターンの終了時に、霊は爆発し、その 5 フィート以内の各クリーチャーは敏捷セーヴィング スローに成功しなければ 1d6 の力場ダメージを受けます。あなたの激怒が終了するまで、あなたはボーナス アクションとして、各ターンにこの効果を再度使用して別の霊を召喚することができます。 -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=ワイルドサージ:召喚 +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=30 フィート以内の見通せる地点を選択します。その地点から霊的エネルギーの爆発が噴出し、その地点を中心とした 15 フィートの立方体内の各クリーチャーは敏捷セーヴィング スローを行う必要があります。セーヴィングに失敗すると、クリーチャーは 1d6 の力場ダメージを受けます。このダメージは 11 レベルで 2d6、17 レベルで 3d6 に増加します。激怒が終了するまで、ボーナス アクションとして、各ターンにこの効果を再度使用できます。 +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=ワイルドサージ:スピリットブラスト Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=視界内の空いているスペースに最大 30 フィートテレポートします。激怒が終了するまで、ボーナス アクションとして各ターンにこの効果を再度使用できます。 Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=ワイルドサージ:テレポート Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=魔法はあなたが持っている武器に吹き込まれます。あなたの怒りが終わるまで、武器のダメージ タイプはフォースに変わり、投擲特性を獲得します。通常範囲は 20 フィート、長距離範囲は 60 フィートです。武器があなたの手から離れると、武器は再びあなたの手の中に現れます。あなたの怒りダメージ ボーナスは、この投擲武器にも適用されます。 @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=ワイルド マジ Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=制御されたサージ Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=激怒中にダメージを受けた直後、反応を使用してワイルド マジック テーブルをロールし、ロールした効果をすぐに生成できます。この効果は、現在のワイルド マジック効果に置き換わります。 Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=不安定なバックスラッシュ -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=激怒状態に入ると、ワイルドマジック表をロールして、生成される魔法の効果を決定します。効果がセーヴィングスローを必要とする場合、DCは8 + あなたの熟練ボーナス + あなたの【耐久力】修正値に等しくなります。\n\nワイルドマジック表:\n- あなたの30フィート以内にいる各クリーチャーは、【耐久力】セーヴィングスローに成功しなければ、1d12の壊死ダメージを受けます。また、1d12の一時的ヒットポイントを獲得します。\n- あなたは、あなたが見ることができる占有されていないスペースに最大30フィートテレポートします。あなたの激怒が終了するまで、ボーナスアクションとして、各ターンでこの効果を再度使用できます。\n- あなたから30フィート以内のあなたが見ることができる占有されていないスペースに、実体のない精霊が出現します。現在のターンの終了時に、精霊は爆発し、その5フィート以内にいる各クリーチャーは、敏捷性セーヴィングスローに成功しなければ、1d6の力場ダメージを受けます。激怒が終了するまで、あなたはこの効果を再び使用して、ボーナス アクションとして各ターンに別の精霊を召喚することができます。\n- 魔法があなたの持っている武器に吹き込まれます。あなたの激怒が終了するまで、武器のダメージ タイプはフォースに変わり、投擲特性を獲得します。通常範囲は 20 フィート、長距離範囲は 60 フィートです。武器があなたの手から離れると、武器はあなたの手の中に再び現れます。あなたの激怒ダメージ ボーナスもこの投擲武器に適用されます。\n- あなたの激怒が終了する前にクリーチャーが攻撃ロールであなたにヒットすると、そのクリーチャーは 1d6 のフォース ダメージを受けます。\n- あなたの激怒が終了するまで、あなたは AC に +1 のボーナスを獲得し、あなたの 10 フィート以内にいる間、あなたの仲間は同じボーナスを獲得します。\n- あなたの激怒が終了するまで、各ターンの終了時に、あなたの 15 フィート以内の地面は、次のターンの開始時まで移動困難な地形になります。\n- 光のボルトがあなたの胸から発射されます。 30 フィート以内にいる、あなたが選択した別のクリーチャーは、耐久力セーヴィング スローに成功しなければ、1d6 の光輝ダメージを受け、次のターンの開始まで盲目になります。激怒が終了するまで、ボーナス アクションとして、各ターンにこの効果を再度使用できます。 +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=激怒状態に入ると、ワイルドマジック表をロールして、生成される魔法の効果を決定します。効果がセーヴィングスローを必要とする場合、DCは8 + あなたの熟練ボーナス + あなたの【耐久力】修正値に等しくなります。\n\nワイルドマジック表:\n- あなたの30フィート以内にいる各クリーチャーは、【耐久力】セーヴィングスローに成功しなければ、1d12の壊死ダメージを受けます。また、1d12の一時的ヒットポイントを獲得します。\n- あなたは、あなたが見ることができる空いているスペースに最大30フィートテレポートします。激怒が終了するまで、ボーナスアクションとして、各ターンにこの効果を再度使用できます。\n- あなたの30フィート以内で見ることができるポイントを選択します。霊的なエネルギーのバーストがそのポイントから噴出し、そのポイントを中心とした15フィートの立方体内のすべてのクリーチャーは、敏捷性セーヴィングスローを行う必要があります。セーヴィングに失敗すると、クリーチャーは1d6の力場ダメージを受けます。このダメージは 11 レベルで 2d6、17 レベルで 3d6 に増加します。激怒が終了するまで、各ターンにボーナス アクションとしてこの効果を再度使用できます。\n- 魔法があなたの持っている武器に注入されます。激怒が終了するまで、武器のダメージ タイプはフォースに変わり、投擲特性を獲得します。通常範囲は 20 フィート、長距離範囲は 60 フィートです。武器があなたの手から離れると、武器は再びあなたの手の中に現れます。この投擲武器には、激怒ダメージ ボーナスも適用されます。\n- 激怒が終了する前にクリーチャーが攻撃ロールであなたにヒットした場合、そのクリーチャーは 1d6 の力場ダメージを受けます。\n- 激怒が終了するまで、あなたは AC に +1 のボーナスを得、あなたの 10 フィート以内にいる間、あなたの仲間は同じボーナスを得ます。\n- 激怒が終了するまで、あなたの各ターンの終了時に、あなたの次のターンの開始時まで、あなたの 15 フィート以内の地面が移動困難な地形になります。\n- 胸から光の矢が発射されます。あなたの 30 フィート以内にいる、あなたが見ることができる別のクリーチャーは、耐久力セーヴィング スローに成功するか、1d6 の光輝ダメージを受けて、あなたの次のターンの開始時まで盲目になります。激怒が終了するまで、あなたは各ターンにボーナス アクションとしてこの効果を再度使用できます。 Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=ワイルドサージ Feature/&PowerPathOfTheWildMagicAuraDescription=激怒が終了するまで、AC に +1 のボーナスが得られ、あなたの 10 フィート以内にいる仲間も同じボーナスを得ます。 Feature/&PowerPathOfTheWildMagicAuraTitle=ワイルドサージ:オーラ @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=アクションとし Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=魔法の認識 Feature/&PowerPathOfTheWildMagicSummonBlastDescription=精霊は爆発し、その周囲 5 フィート以内の各クリーチャーは敏捷セーヴィング スローに成功しなければ 1d6 の力場ダメージを受けます。 Feature/&PowerPathOfTheWildMagicSummonBlastTitle=ワイルドサージ:スピリットブラスト -Feature/&PowerPathOfTheWildMagicSummonDescription=実体のない霊が、あなたの 30 フィート以内の、あなたが見ることができる空いているスペースに現れます。現在のターンの終了時に、霊は爆発し、その 5 フィート以内の各クリーチャーは敏捷セーヴィング スローに成功しなければ 1d6 の力場ダメージを受けます。あなたの激怒が終了するまで、あなたはボーナス アクションとして、各ターンにこの効果を再度使用して別の霊を召喚することができます。 -Feature/&PowerPathOfTheWildMagicSummonTitle=ワイルドサージ:召喚 +Feature/&PowerPathOfTheWildMagicSummonDescription=30 フィート以内の見通せる地点を選択します。その地点から霊的エネルギーの爆発が噴出し、その地点を中心とした 15 フィートの立方体内の各クリーチャーは敏捷セーヴィング スローを行う必要があります。セーヴィングに失敗すると、クリーチャーは 1d6 の力場ダメージを受けます。このダメージは 11 レベルで 2d6、17 レベルで 3d6 に増加します。激怒が終了するまで、ボーナス アクションとして、各ターンにこの効果を再度使用できます。 +Feature/&PowerPathOfTheWildMagicSummonTitle=ワイルドサージ:スピリットブラスト Feature/&PowerPathOfTheWildMagicTeleportDescription=視界内の空いているスペースまで最大 30 フィートテレポートします。 Feature/&PowerPathOfTheWildMagicTeleportTitle=ワイルドサージ:テレポート Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=反応を使用してワイルドサージをロールし、アクティブな効果を置き換えます。 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt index e937bda9a8..06a3985597 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=가슴에서 빛의 화살이 발사됩니다. 30피트 이내에 볼 수 있는 다른 생물을 선택하면 건강 내성 굴림에 성공해야 합니다. 그렇지 않으면 1d6의 복사 피해를 입고 다음 턴이 시작될 때까지 눈이 멀게 됩니다. Action/&WildSurgeBoltTitle=볼트 -Action/&WildSurgeSummonDescription=무형의 영혼은 30피트 이내에서 볼 수 있는 빈 공간으로 나타납니다. 현재 턴이 끝나면 영혼이 폭발하고 영혼으로부터 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. -Action/&WildSurgeSummonTitle=소환 +Action/&WildSurgeSummonDescription=30피트 이내에서 볼 수 있는 지점을 선택하세요. 영적 에너지의 폭발이 지점에서 분출되고 지점을 중심으로 한 15피트 큐브 내의 각 생물은 민첩 내성 굴림을 해야 합니다. 저장에 실패하면 생물은 1d6의 힘 피해를 입습니다. 이 피해는 11레벨에서 2d6, 17레벨에서 3d6으로 증가합니다. +Action/&WildSurgeSummonTitle=스피릿 블라스트 Action/&WildSurgeTeleportDescription=당신은 당신이 볼 수 있는 비어있는 공간으로 최대 30피트까지 순간이동합니다. Action/&WildSurgeTeleportTitle=텔레포트 Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=당신은 AC에 +1 보너스를 얻습니다. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=분노가 끝 Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=와일드 서지: 성장 Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=당신의 분노가 끝나기 전에 생물이 명중 굴림으로 당신을 때릴 때마다 그 생물은 1d6의 강제 피해를 입습니다. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=와일드 서지: 보복 -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=무형의 영혼은 30피트 이내에서 볼 수 있는 빈 공간으로 나타납니다. 현재 턴이 끝나면 영혼이 폭발하고 영혼으로부터 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. 분노가 끝날 때까지 이 효과를 다시 사용하여 매 턴마다 보너스 액션으로 다른 영혼을 소환할 수 있습니다. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=와일드 서지: 소환 +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=30피트 이내에서 볼 수 있는 지점을 선택하세요. 그 지점에서 영적 에너지가 폭발하고, 그 지점을 중심으로 15피트 큐브 내에 있는 각 생명체는 민첩성 세이빙 스로우를 해야 합니다. 세이브에 실패하면 생명체는 1d6의 포스 데미지를 입습니다. 이 데미지는 11레벨에서 2d6, 17레벨에서 3d6으로 증가합니다. 분노가 끝날 때까지 보너스 액션으로 각 턴에 이 효과를 다시 사용할 수 있습니다. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=와일드 서지: 스피릿 블래스트 Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=당신은 당신이 볼 수 있는 비어있는 공간으로 최대 30피트까지 순간이동합니다. 분노가 끝날 때까지 매 턴마다 보너스 액션으로 이 효과를 다시 사용할 수 있습니다. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=와일드 서지: 텔레포트 Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=마법은 당신이 들고 있는 무기에 주입됩니다. 분노가 끝날 때까지 무기의 피해 유형은 강제로 변경되고 투척 속성을 갖게 되며, 일반 범위는 20피트, 장거리는 60피트입니다. 무기가 손에서 떠나면 무기가 손에 다시 나타납니다. 분노 피해 보너스는 이 투척된 무기에도 적용됩니다. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Wild Magic 테이 Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=제어된 서지 Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=분노 중에 피해를 입은 직후 반응을 사용하여 와일드 매직 테이블에 굴러가는 즉시 효과를 낼 수 있습니다. 이 효과는 현재 Wild Magic 효과를 대체합니다. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=불안정한 백슬래시 -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=분노에 빠졌을 때, 생성된 마법 효과를 결정하기 위해 Wild Magic 테이블을 굴려보세요. 효과에 내성 굴림이 필요한 경우 DC는 8 + 숙련도 보너스 + 체질 수정치입니다.\n\n와일드 매직 테이블:\n- 30피트 내의 각 생물은 체질 내성 굴림에 성공해야 합니다. 1d12의 괴사 피해를 입습니다. 또한 1d12의 임시 체력을 얻습니다.\n- 볼 수 있는 비어 있는 공간으로 최대 30피트까지 순간이동합니다. 분노가 끝날 때까지 매 턴마다 보너스 행동으로 이 효과를 다시 사용할 수 있습니다.\n- 무형의 영혼이 30피트 이내에서 볼 수 있는 빈 공간으로 나타납니다. 현재 턴이 끝나면 영혼이 폭발하고 영혼으로부터 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. 분노가 끝날 때까지 이 효과를 다시 사용하여 매 턴마다 보너스 액션으로 다른 영혼을 소환할 수 있습니다.\n- 마법이 들고 있는 무기에 주입됩니다. 분노가 끝날 때까지 무기의 피해 유형은 강제로 변경되고 투척 속성을 갖게 되며, 일반 범위는 20피트, 장거리는 60피트입니다. 무기가 손에서 떠나면 무기가 손에 다시 나타납니다. 당신의 분노 피해 보너스는 이 던진 무기에도 적용됩니다.\n- 당신의 분노가 끝나기 전에 어떤 생물이 명중 굴림으로 당신을 칠 때마다, 그 생물은 1d6의 강제 피해를 입습니다.\n- 당신의 분노가 끝날 때까지 당신은 +를 얻습니다. AC에 1 보너스, 당신으로부터 10피트 이내에 있는 동안 당신의 동료들은 동일한 보너스를 얻습니다.\n- 당신의 분노가 끝날 때까지, 당신의 턴이 끝날 때마다 당신으로부터 15피트 내의 땅은 어려운 지형이 됩니다. 다음 차례가 시작됩니다.\n- 가슴에서 빛의 화살이 발사됩니다. 30피트 이내에 볼 수 있는 다른 생물을 선택하면 건강 내성 굴림에 성공해야 합니다. 그렇지 않으면 1d6의 복사 피해를 입고 다음 턴이 시작될 때까지 눈이 멀게 됩니다. 분노가 끝날 때까지 매 턴마다 보너스 액션으로 이 효과를 다시 사용할 수 있습니다. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=분노에 돌입하면, 야생 마법 표에서 굴려 생성된 마법 효과를 결정합니다. 효과에 세이빙 스로우가 필요한 경우, DC는 8 + 숙련도 보너스 + 체력 수정치입니다.\n\n야생 마법 표:\n- 30피트 이내의 각 생물은 체력 세이빙 스로우에 성공해야 하며, 실패하면 1d12의 괴사 피해를 입습니다. 또한 1d12의 임시 생명력을 얻습니다.\n- 볼 수 있는 비어 있는 공간으로 최대 30피트까지 순간이동합니다. 분노가 끝날 때까지, 보너스 액션으로 각 턴에 이 효과를 다시 사용할 수 있습니다.\n- 30피트 이내의 볼 수 있는 지점을 선택합니다. 지점에서 영적 에너지가 폭발하고, 지점을 중심으로 15피트 큐브 내의 각 생물은 민첩 세이빙 스로우를 해야 합니다. 세이브에 실패하면, 생물은 1d6의 힘 피해를 입습니다. 이 피해는 11레벨에서 2d6, 17레벨에서 3d6으로 증가합니다. 분노가 끝날 때까지 각 턴에서 보너스 액션으로 이 효과를 다시 사용할 수 있습니다.\n- 마법이 당신이 들고 있는 무기에 주입됩니다. 분노가 끝날 때까지 무기의 피해 유형이 힘으로 바뀌고 던지는 속성을 얻으며 일반 범위는 20피트, 장거리 범위는 60피트입니다. 무기가 손에서 떨어지면 무기가 다시 손에 나타납니다. 분노 피해 보너스는 이 던지는 무기에도 적용됩니다.\n- 분노가 끝나기 전에 생물이 공격 굴림으로 당신을 맞힐 때마다 그 생물은 1d6의 힘 피해를 입습니다.\n- 분노가 끝날 때까지 AC에 +1 보너스를 얻고, 10피트 이내에 있는 아군도 같은 보너스를 얻습니다.\n- 분노가 끝날 때까지, 각 턴이 끝날 때마다, 다음 턴이 시작될 때까지 15피트 이내의 땅은 어려운 지형이 됩니다.\n- 가슴에서 빛줄기가 솟아납니다. 30피트 이내에서 볼 수 있는 다른 생물은 체력 구원 굴림에 성공해야 하며, 그렇지 않으면 1d6의 광채 피해를 입고 다음 턴이 시작될 때까지 실명합니다. 분노가 끝날 때까지, 각 턴에서 보너스 액션으로 이 효과를 다시 사용할 수 있습니다. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=와일드 서지 Feature/&PowerPathOfTheWildMagicAuraDescription=분노가 끝날 때까지 당신은 AC에 +1 보너스를 얻고, 당신으로부터 10피트 이내에 있는 동안 당신의 동료들도 동일한 보너스를 얻습니다. Feature/&PowerPathOfTheWildMagicAuraTitle=와일드 서지: 오라 @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=행동으로, 당신 Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=마법 인식 Feature/&PowerPathOfTheWildMagicSummonBlastDescription=영혼은 폭발하고 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=와일드 서지: 스피릿 블래스트 -Feature/&PowerPathOfTheWildMagicSummonDescription=무형의 영혼은 30피트 이내에서 볼 수 있는 빈 공간으로 나타납니다. 현재 턴이 끝나면 영혼이 폭발하고 영혼으로부터 5피트 내의 각 생물은 민첩 내성 굴림에 성공하거나 1d6의 강제 피해를 입어야 합니다. 분노가 끝날 때까지 이 효과를 다시 사용하여 매 턴마다 보너스 액션으로 다른 영혼을 소환할 수 있습니다. -Feature/&PowerPathOfTheWildMagicSummonTitle=와일드 서지: 소환 +Feature/&PowerPathOfTheWildMagicSummonDescription=30피트 이내에서 볼 수 있는 지점을 선택하세요. 그 지점에서 영적 에너지가 폭발하고, 그 지점을 중심으로 15피트 큐브 내에 있는 각 생명체는 민첩성 세이빙 스로우를 해야 합니다. 세이브에 실패하면 생명체는 1d6의 포스 데미지를 입습니다. 이 데미지는 11레벨에서 2d6, 17레벨에서 3d6으로 증가합니다. 분노가 끝날 때까지 보너스 액션으로 각 턴에 이 효과를 다시 사용할 수 있습니다. +Feature/&PowerPathOfTheWildMagicSummonTitle=와일드 서지: 스피릿 블라스트 Feature/&PowerPathOfTheWildMagicTeleportDescription=당신은 당신이 볼 수 있는 비어있는 공간으로 최대 30피트까지 순간이동합니다. Feature/&PowerPathOfTheWildMagicTeleportTitle=와일드 서지: 순간이동 Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=반응을 사용하여 Wild Surge를 굴리고 활성 효과를 교체하십시오. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt index 02af44135a..b41d45adac 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Um raio de luz dispara do seu peito. Outra criatura de sua escolha que você possa ver a até 30 pés de você deve ter sucesso em um teste de resistência de Constituição ou sofrer 1d6 de dano radiante e ficar cego até o início do seu próximo turno. Action/&WildSurgeBoltTitle=Parafuso -Action/&WildSurgeSummonDescription=Um espírito intangível aparece em um espaço desocupado que você pode ver a até 30 pés de você. No final do turno atual, o espírito explode, e cada criatura a até 5 pés dele deve ter sucesso em um teste de resistência de Destreza ou sofrer 1d6 de dano de força. -Action/&WildSurgeSummonTitle=Convocar +Action/&WildSurgeSummonDescription=Escolha um ponto que você possa ver a até 30 pés de você. Uma explosão de energia espiritual irrompe do ponto e cada criatura dentro de um cubo de 15 pés centrado no ponto deve fazer um teste de resistência de Destreza. Em uma falha, a criatura sofre 1d6 de dano de força. Esse dano aumenta para 2d6 no 11º nível e 3d6 no 17º nível. +Action/&WildSurgeSummonTitle=Explosão Espiritual Action/&WildSurgeTeleportDescription=Você se teletransporta até 9 metros para um espaço desocupado que você pode ver. Action/&WildSurgeTeleportTitle=Teleporte Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 para CA. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Até que sua f Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Wild Surge: Crescimento Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Sempre que uma criatura atingir você com uma jogada de ataque antes que sua fúria termine, aquela criatura sofre 1d6 de dano de força. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Wild Surge: Retribuição -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Um espírito intangível aparece em um espaço desocupado que você pode ver a até 30 pés de você. No final do turno atual, o espírito explode, e cada criatura a até 5 pés dele deve ter sucesso em um teste de resistência de Destreza ou sofrer 1d6 de dano de força. Até que sua fúria termine, você pode usar este efeito novamente, invocando outro espírito, em cada um dos seus turnos como uma ação bônus. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Surto Selvagem: Invocar +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Escolha um ponto que você possa ver a até 9 metros de você. Uma explosão de energia espiritual irrompe do ponto e cada criatura dentro de um cubo de 4,5 metros centrado no ponto deve fazer um teste de resistência de Destreza. Se falhar na resistência, a criatura sofre 1d6 de dano elétrico. Este dano aumenta para 2d6 no 11º nível e 3d6 no 17º nível. Até que sua fúria acabe, você pode usar este efeito novamente em cada um de seus turnos como uma ação bônus. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Surto Selvagem: Explosão Espiritual Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Você se teleporta até 30 pés para um espaço desocupado que você pode ver. Até que sua fúria acabe, você pode usar esse efeito novamente em cada um dos seus turnos como uma ação bônus. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Surto Selvagem: Teletransporte Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=A magia infunde a arma que você está segurando. Até que sua fúria acabe, o tipo de dano da arma muda para força, e ela ganha as propriedades de arremesso, com um alcance normal de 20 pés e um longo alcance de 60 pés. Se a arma deixar sua mão, ela reaparece em sua mão. Seu bônus de dano de fúria também será aplicado a esta arma de arremesso. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Sempre que você ro Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Surto controlado Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Imediatamente após sofrer dano enquanto estiver em fúria, você pode usar sua reação para rolar na tabela de Magia Selvagem e produzir imediatamente o efeito rolado. Este efeito substitui seu efeito de Magia Selvagem atual. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Barra invertida instável -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Ao entrar em fúria, role na tabela de Magia Selvagem para determinar o efeito mágico produzido. Se o efeito exigir um teste de resistência, a CD será igual a 8 + seu bônus de proficiência + seu modificador de Constituição.\n\nTabela de Magia Selvagem:\n- Cada criatura a até 30 pés de você deve ser bem-sucedida em um teste de resistência de Constituição ou sofrer 1d12 de dano necrótico. Você também ganha 1d12 pontos de vida temporários.\n- Você se teletransporta até 30 pés para um espaço desocupado que você possa ver. Até que sua fúria termine, você pode usar este efeito novamente em cada um dos seus turnos como uma ação bônus.\n- Um espírito intangível aparece em um espaço desocupado que você possa ver a até 30 pés de você. No final do turno atual, o espírito explode, e cada criatura a até 5 pés dele deve ser bem-sucedida em um teste de resistência de Destreza ou sofrer 1d6 de dano de força. Até que sua fúria acabe, você pode usar este efeito novamente, invocando outro espírito, em cada um dos seus turnos como uma ação bônus.\n- Magia infunde a arma que você está segurando. Até que sua fúria acabe, o tipo de dano da arma muda para força, e ela ganha as propriedades de arremesso, com um alcance normal de 20 pés e um longo alcance de 60 pés. Se a arma deixar sua mão, ela reaparece em sua mão. Seu bônus de dano de fúria também será aplicado a esta arma de arremesso.\n- Sempre que uma criatura o atingir com uma jogada de ataque antes que sua fúria acabe, aquela criatura sofre 1d6 de dano de força.\n- Até que sua fúria acabe, você ganha um bônus de +1 na CA, e enquanto estiver a 10 pés de você, seus aliados ganham o mesmo bônus.\n- Até que sua fúria acabe, no final de cada um dos seus turnos, o solo a 15 pés de você se torna terreno difícil até o início do seu próximo turno.\n- Um raio de luz dispara do seu peito. Outra criatura de sua escolha que você possa ver a até 30 pés de você deve ter sucesso em um teste de resistência de Constituição ou sofrer 1d6 de dano radiante e ficar cego até o início do seu próximo turno. Até que sua fúria acabe, você pode usar este efeito novamente em cada um dos seus turnos como uma ação bônus. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Ao entrar em fúria, role na tabela de Magia Selvagem para determinar o efeito mágico produzido. Se o efeito exigir um teste de resistência, a CD será igual a 8 + seu bônus de proficiência + seu modificador de Constituição.\n\nTabela de Magia Selvagem:\n- Cada criatura a até 30 pés de você deve ser bem-sucedida em um teste de resistência de Constituição ou sofrer 1d12 de dano necrótico. Você também ganha 1d12 pontos de vida temporários.\n- Você se teletransporta até 30 pés para um espaço desocupado que você possa ver. Até que sua fúria termine, você pode usar este efeito novamente em cada um dos seus turnos como uma ação bônus.\n- Escolha um ponto que você possa ver a até 30 pés de você. Uma explosão de energia espiritual irrompe do ponto e cada criatura dentro de um cubo de 15 pés centralizado no ponto deve fazer um teste de resistência de Destreza. Em uma falha na resistência, a criatura sofre 1d6 de dano de força. Este dano aumenta para 2d6 no 11º nível, e 3d6 no 17º nível. Até que sua fúria acabe, você pode usar este efeito novamente em cada um dos seus turnos como uma ação bônus.\n- Magia infunde a arma que você está segurando. Até que sua fúria acabe, o tipo de dano da arma muda para força, e ela ganha as propriedades de arremesso, com um alcance normal de 20 pés e um longo alcance de 60 pés. Se a arma deixar sua mão, ela reaparece em sua mão. Seu bônus de dano de fúria também será aplicado a esta arma de arremesso.\n- Sempre que uma criatura lhe atingir com uma jogada de ataque antes que sua fúria acabe, essa criatura sofre 1d6 de dano de força.\n- Até que sua fúria acabe, você ganha um bônus de +1 na CA e, enquanto estiver a 10 pés de você, seus aliados ganham o mesmo bônus.\n- Até que sua fúria acabe, no final de cada um dos seus turnos, o solo a 15 pés de você se torna terreno difícil até o início do seu próximo turno.\n- Um raio de luz dispara do seu peito. Outra criatura de sua escolha que você possa ver a 30 pés de você deve ser bem-sucedida em um teste de resistência de Constituição ou sofrer 1d6 de dano radiante e ficar cego até o início do seu próximo turno. Até que sua fúria acabe, você pode usar este efeito novamente em cada um dos seus turnos como uma ação bônus. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Onda Selvagem Feature/&PowerPathOfTheWildMagicAuraDescription=Até que sua fúria termine, você ganha um bônus de +1 na CA e, enquanto estiver a 3 metros de você, seus aliados ganham o mesmo bônus. Feature/&PowerPathOfTheWildMagicAuraTitle=Surto Selvagem: Aura @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Como uma ação, você Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Consciência Mágica Feature/&PowerPathOfTheWildMagicSummonBlastDescription=O espírito explode, e cada criatura a até 1,5 m dele deve ser bem-sucedida em um teste de resistência de Destreza ou sofrerá 1d6 de dano de força. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Surto Selvagem: Explosão Espiritual -Feature/&PowerPathOfTheWildMagicSummonDescription=Um espírito intangível aparece em um espaço desocupado que você pode ver a até 30 pés de você. No final do turno atual, o espírito explode, e cada criatura a até 5 pés dele deve ter sucesso em um teste de resistência de Destreza ou sofrer 1d6 de dano de força. Até que sua fúria termine, você pode usar este efeito novamente, invocando outro espírito, em cada um dos seus turnos como uma ação bônus. -Feature/&PowerPathOfTheWildMagicSummonTitle=Surto Selvagem: Invocar +Feature/&PowerPathOfTheWildMagicSummonDescription=Escolha um ponto que você possa ver a até 30 pés de você. Uma explosão de energia espiritual irrompe do ponto e cada criatura dentro de um cubo de 15 pés centrado no ponto deve fazer um teste de resistência de Destreza. Em uma falha, a criatura sofre 1d6 de dano de força. Esse dano aumenta para 2d6 no 11º nível e 3d6 no 17º nível. Até que sua fúria termine, você pode usar esse efeito novamente em cada um dos seus turnos como uma ação bônus. +Feature/&PowerPathOfTheWildMagicSummonTitle=Surto Selvagem: Explosão Espiritual Feature/&PowerPathOfTheWildMagicTeleportDescription=Você se teletransporta até 9 metros para um espaço desocupado que você pode ver. Feature/&PowerPathOfTheWildMagicTeleportTitle=Surto Selvagem: Teletransporte Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Use sua reação para rolar Surto Selvagem e substituir o efeito ativo. diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt index 7eb5c8a339..8bdf42f645 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Из вашей груди вырывается луч света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов, должно преуспеть в спасброске Телосложения, иначе получит 1d6 урона излучением и станет ослеплённым до начала вашего следующего хода. Action/&WildSurgeBoltTitle=Луч -Action/&WildSurgeSummonDescription=В пределах 30 футов от вас, в незанятом пространстве, которое вы можете видеть, появляется неосязаемый дух. В конце текущего хода дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. -Action/&WildSurgeSummonTitle=Призыв +Action/&WildSurgeSummonDescription=Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается поток духовной энергии, и каждое существо в 15-футовом кубе с центром в точке должно сделать спасбросок по Ловкости. При провале спасброска существо получает урон силой 1d6. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. +Action/&WildSurgeSummonTitle=Духовный взрыв Action/&WildSurgeTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Action/&WildSurgeTeleportTitle=Телепорт Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 к КД. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Вокруг в Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Всплеск дикости: рост Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Пока ваша ярость не закончится, всякий раз, когда существо попадает по вам броском атаки, в ответ на атаку из вас выплёскивается магия, и существо получает 1d6 урона силовым полем. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Всплеск дикости: возмездие -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=В пределах 30 футов от вас, в незанятом пространстве, которое вы можете видеть, появляется неосязаемый дух. В конце текущего хода дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект, вызывая нового духа. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Всплеск дикости: призыв +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается поток духовной энергии, и каждое существо в пределах 15-футового куба с центром в точке должно совершить спасбросок Ловкости. При провале спасброска существо получает 1d6 урона силой. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова на каждом своем ходу в качестве бонусного действия. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Дикая волна: Взрыв духа Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Всплеск дикости: телепорт Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=Оружие в ваших руках наполняет магия. Пока ваша ярость не закончится, оружие приобретает свойство "метательное" (дис. 20/60), и тип его урона изменяется на урон силовым полем. Если оружие покидает вашу руку, то оно снова появляется в вашей руке в конце этого хода. Ваш бонус к урону от ярости также применяется к этому метательному оружию. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Всякий раз Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Контролируемый всплеск Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Когда вы подвергаетесь опасности под действием ярости, магия внутри вас может выплеснуться. Сразу же после того, как вы получаете урон во время ярости, вы можете реакцией совершить бросок по таблице «Дикая магия» и применить соответствующий эффект немедленно. Этот эффект заменяет ваш текущий эффект дикой магии. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Нестабильная отдача -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Когда вы впадаете в ярость, совершите бросок по таблице «Дикая магия», чтобы определить произведённый магический эффект. Если эффект требует спасброска, то он имеет Сл 8 + ваш бонус мастерства + ваш модификатор Телосложения.\n\nТаблица дикой магии:\n• Вокруг вас вьются тёмные щупальца. Каждое существо по вашему выбору, которое вы можете видеть в пределах 30 футов от вас, должно преуспеть в спасброске Телосложения, иначе получит 1d12 урона некротической энергией. Вы также получаете 1d12 временных хитов.\n• Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект.\n• В пределах 30 футов от вас, в незанятом пространстве, которое вы можете видеть, появляется неосязаемый дух. В конце текущего хода дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект, вызывая нового духа.\n• Оружие в ваших руках наполняет магия. Пока ваша ярость не закончится, оружие приобретает свойство "метательное" (дис. 20/60), и тип его урона изменяется на урон силовым полем. Если оружие покидает вашу руку, то оно снова появляется в вашей руке в конце этого хода. Ваш бонус к урону от ярости также применяется к этому метательному оружию.\n• Пока ваша ярость не закончится, всякий раз, когда существо попадает по вам броском атаки, в ответ на атаку из вас выплёскивается магия, и существо получает 1d6 урона силовым полем.\n• Пока ваша ярость не закончится, вас окружают разноцветные защитные огоньки. Вы и все ваши союзники в пределах 10 футов от вас получаете бонус +1 к КД.\n• Вокруг вас временно вырастают цветы и лозы. Пока ваша ярость не закончится, земля в пределах 15 футов от вас является труднопроходимой местностью для ваших врагов.\n• Из вашей груди вырывается луч света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов, должно преуспеть в спасброске Телосложения, иначе получит 1d6 урона излучением и станет ослеплённым до начала вашего следующего хода. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Когда вы входите в ярость, бросьте по таблице Дикой магии, чтобы определить произведенный магический эффект. Если эффект требует спасброска, DC равен 8 + ваш бонус мастерства + ваш модификатор Телосложения.\n\nТаблица Дикой магии:\n- Каждое существо в пределах 30 футов от вас должно преуспеть в спасброске Телосложения или получить 1d12 некротического урона. Вы также получаете 1d12 временных очков здоровья.\n- Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете использовать этот эффект снова в каждом своем ходу в качестве бонусного действия.\n- Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается всплеск духовной энергии, и каждое существо в 15-футовом кубе с центром в точке должно сделать спасбросок Ловкости. При провале спасброска существо получает 1d6 урона силой. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова на каждом своем ходу в качестве бонусного действия.\n- Магия наполняет оружие, которое вы держите. Пока ваша ярость не закончится, тип урона оружия меняется на силу, и оно приобретает метательные свойства с обычной дальностью 20 футов и дальней дальностью 60 футов. Если оружие покидает вашу руку, оно снова появляется в вашей руке. Ваш бонус урона от ярости также будет применяться к этому метательному оружию.\n- Всякий раз, когда существо наносит вам удар броском атаки до того, как закончится ваша ярость, это существо получает 1d6 урона силой.\n- Пока ваша ярость не закончится, вы получаете бонус +1 к AC, и пока вы находитесь в пределах 10 футов от вас, ваши союзники получают такой же бонус.\n- Пока ваша ярость не закончится, в конце каждого вашего хода земля в пределах 15 футов от вас становится труднопроходимой местностью до начала вашего следующего хода.\n- Из вашей груди вылетает молния света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов от вас, должно преуспеть в спасброске Телосложения или получить 1d6 урона от излучения и быть ослепленным до начала вашего следующего хода. Пока ваша ярость не закончится, вы можете снова использовать этот эффект в каждом своем ходу в качестве бонусного действия. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Всплеск дикости Feature/&PowerPathOfTheWildMagicAuraDescription=Пока ваша ярость не закончится, вас окружают разноцветные защитные огоньки. Вы и все ваши союзники в пределах 10 футов от вас получаете бонус +1 к КД. Feature/&PowerPathOfTheWildMagicAuraTitle=Всплеск дикости: аура @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Действием в Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Магическая осведомлённость Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Всплеск дикости: взрыв духа -Feature/&PowerPathOfTheWildMagicSummonDescription=В пределах 30 футов от вас, в незанятом пространстве, которое вы можете видеть, появляется неосязаемый дух. В конце текущего хода дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект, вызывая нового духа. -Feature/&PowerPathOfTheWildMagicSummonTitle=Всплеск дикости: призыв +Feature/&PowerPathOfTheWildMagicSummonDescription=Выберите точку, которую вы можете видеть, в пределах 30 футов от себя. Из этой точки вырывается взрыв духовной энергии, и каждое существо в пределах 15-футового куба с центром в этой точке должно совершить спасбросок Ловкости. При провале существо получает урон силовым полем 1d6. Этот урон увеличивается до 2d6 на 11 уровне и до 3d6 на 17 уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова в каждом своем ходу в качестве бонусного действия. +Feature/&PowerPathOfTheWildMagicSummonTitle=Дикая волна: Взрыв духа Feature/&PowerPathOfTheWildMagicTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Feature/&PowerPathOfTheWildMagicTeleportTitle=Всплеск дикости: телепорт Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Используйте свою реакцию, чтобы совершить бросок по таблице "Дикая магия" и заменить активный эффект. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt index 8a490897dc..2812621de7 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=一道光束从你的胸口射出。你选择的、在你 30 英尺范围内可见的另一个生物必须成功通过体质豁免检定,否则将受到 1d6 光耀伤害,并且会目盲,直到你的下一轮开始。 Action/&WildSurgeBoltTitle=光箭 -Action/&WildSurgeSummonDescription=无形的灵魂出现在你 30 英尺范围内可见的未占用空间中。在当前回合结束时,灵魂会爆炸,其 5 英尺范围内的每个生物都必须成功进行敏捷豁免检定,否则会受到 1d6 力量伤害。 -Action/&WildSurgeSummonTitle=召唤 +Action/&WildSurgeSummonDescription=选择您周围 30 英尺内可见的一个点。一股精神能量从该点喷涌而出,以该点为中心 15 英尺立方体内的每个生物都必须进行敏捷豁免检定。豁免失败时,该生物将受到 1d6 力场伤害。该伤害在 11 级时增加到 2d6,在 17 级时增加到 3d6。 +Action/&WildSurgeSummonTitle=灵魂爆破 Action/&WildSurgeTeleportDescription=你可以传送至最远 30 英尺处你可以看见的空闲空间。 Action/&WildSurgeTeleportTitle=传送 Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=你的 AC 获得 +1 加值。 @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=直到你的怒 Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=狂野浪潮:生长 Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=在你的狂暴结束之前,每当一个生物通过攻击掷骰击中你时,该生物都会受到 1d6 力量伤害。 Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=狂野涌动:惩戒 -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=无形的灵魂出现在你 30 英尺范围内可见的未占用空间中。在当前回合结束时,灵魂会爆炸,其 5 英尺范围内的每个生物都必须成功进行敏捷豁免检定,否则将受到 1d6 力量伤害。在你的愤怒结束之前,你可以在每个回合中再次使用此效果,以附赠动作召唤另一个灵魂。 -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=狂野浪潮:召唤 +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=选择您周围 30 英尺内可见的一个点。一股精神能量从该点喷涌而出,以该点为中心 15 英尺立方体内的每个生物都必须进行敏捷豁免检定。如果豁免失败,该生物将受到 1d6 力场伤害。此伤害在 11 级时增加到 2d6,在 17 级时增加到 3d6。在您的愤怒结束之前,您可以在每个回合中以奖励动作再次使用此效果。 +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=狂野浪潮:灵魂冲击 Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=你传送至你能看见的 30 英尺范围内的空闲空间。直到你的狂暴结束,你都可以在每个回合中以附赠动作再次使用此效果。 Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=狂野浪潮:传送 Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=魔法将注入你手中的武器。在你的狂暴结束之前,武器的伤害类型将变为力量,并获得投掷属性,正常射程为 20 英尺,远射程为 60 英尺。如果武器离开你的手,武器将重新出现在你的手中。你的狂暴伤害加成也将适用于此投掷武器。 @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=每当你在狂野 Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=控制浪涌 Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=在你受到狂暴伤害后,你可以使用你的反应在狂野魔法表上掷骰子并立即产生掷出的效果。此效果将取代你当前的狂野魔法效果。 Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=不稳定的反斜杠 -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=当你进入狂暴状态时,在狂野魔法表上掷骰以确定产生的魔法效果。如果效果需要豁免检定,则 DC 等于 8 + 你的熟练加值 + 你的体质调整值。\n\n狂野魔法表:\n- 你周围 30 英尺内的每个生物都必须成功进行体质豁免检定,否则会受到 1d12 点暗蚀伤害。你还会获得 1d12 点暂时生命值。\n- 你传送到距离你最多 30 英尺的可见空旷空间。在你的狂暴结束之前,你可以在每个回合中以附赠动作再次使用此效果。\n- 一个无形的灵魂出现在你周围 30 英尺内可见的空旷空间中。在当前回合结束时,灵魂会爆炸,它周围 5 英尺内的每个生物都必须成功进行敏捷豁免检定,否则会受到 1d6 点力量伤害。在你的狂暴结束之前,你可以在每个回合中以附赠动作再次使用此效果,召唤另一个灵魂。\n- 魔法注入你持有的武器。在你的狂暴结束之前,武器的伤害类型变为力量,并获得投掷属性,正常射程为 20 英尺,远射程为 60 英尺。如果武器离开你的手,武器会重新出现在你的手中。你的狂暴伤害加值也将适用于此投掷武器。\n- 每当生物在你的狂暴结束之前用攻击掷骰击中你时,该生物将受到 1d6 力量伤害。\n- 在你的狂暴结束之前,你的 AC 获得 +1 奖励,并且当你在 10 英尺范围内时,你的盟友获得相同的奖励。\n- 在你的狂暴结束之前,在你的每个回合结束时,你周围 15 英尺内的地面将变为困难地形,直到你的下一个回合开始。\n- 一道光束从你的胸口射出。你选择的另一个生物,只要你在 30 英尺范围内可见,就必须成功通过体质豁免检定,否则将受到 1d6 光耀伤害,并失明,直到你的下一回合开始。在你的愤怒结束之前,你可以在每个回合中再次使用此效果作为附赠动作。 +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=当你进入狂暴状态时,在狂野魔法表上掷骰子以确定产生的魔法效果。如果效果需要豁免检定,则 DC 等于 8 + 你的熟练加值 + 你的体质调整值。\n\n狂野魔法表:\n- 你周围 30 英尺内的每个生物都必须成功进行体质豁免检定,否则将受到 1d12 点坏死性伤害。你还会获得 1d12 点暂时生命值。\n- 你传送到距离你最多 30 英尺的可见空旷空间。在你的狂暴结束之前,你可以在每个回合中以奖励动作再次使用此效果。\n- 选择你周围 30 英尺内可见的点。一股精神能量从该点喷涌而出,以该点为中心的 15 英尺立方体内的每个生物都必须进行敏捷豁免检定。如果豁免失败,该生物将受到 1d6 点力量伤害。此伤害在 11 级时增加到 2d6,在 17 级时增加到 3d6。在您的愤怒结束之前,您可以在每个回合中以奖励动作再次使用此效果。\n- 魔法注入您持有的武器。在您的愤怒结束之前,武器的伤害类型变为力量,并获得投掷属性,正常范围为 20 英尺,远距离为 60 英尺。如果武器离开您的手,武器会重新出现在您的手中。你的怒气伤害加成也将作用于此投掷武器。\n- 在你的怒气结束之前,每当一个生物通过攻击掷骰击中你时,该生物将受到 1d6 力场伤害。\n- 在你的怒气结束之前,你的 AC 将获得 +1 加成,并且当你在 10 英尺范围内时,你的盟友将获得相同的加成。\n- 在你的怒气结束之前,在你的每个回合结束时,你周围 15 英尺内的地面将变为困难地形,直到你的下一个回合开始。\n- 一道光束从你的胸口射出。你选择的、在你 30 英尺范围内可见的另一个生物必须成功通过体质豁免检定,否则将受到 1d6 辐射伤害并失明,直到你的下一个回合开始。在你的怒气结束之前,你可以在你的每个回合中以奖励动作再次使用此效果。 Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=狂野浪潮 Feature/&PowerPathOfTheWildMagicAuraDescription=直到你的狂暴结束为止,你将获得 +1 AC 加值,并且当你在 10 英尺范围内时,你的盟友也将获得相同的加值。 Feature/&PowerPathOfTheWildMagicAuraTitle=狂野浪潮:光环 @@ -46,8 +46,8 @@ Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=作为一种行动, Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=魔法感知 Feature/&PowerPathOfTheWildMagicSummonBlastDescription=灵魂爆炸,其 5 英尺范围内的每个生物必须成功进行敏捷豁免检定,否则将受到 1d6 力量伤害。 Feature/&PowerPathOfTheWildMagicSummonBlastTitle=狂野浪潮:灵魂冲击 -Feature/&PowerPathOfTheWildMagicSummonDescription=无形的灵魂出现在你 30 英尺范围内可见的未占用空间中。在当前回合结束时,灵魂会爆炸,其 5 英尺范围内的每个生物都必须成功进行敏捷豁免检定,否则将受到 1d6 力量伤害。在你的愤怒结束之前,你可以在每个回合中再次使用此效果,以附赠动作召唤另一个灵魂。 -Feature/&PowerPathOfTheWildMagicSummonTitle=狂野浪潮:召唤 +Feature/&PowerPathOfTheWildMagicSummonDescription=选择您周围 30 英尺内可见的一个点。一股精神能量从该点喷涌而出,以该点为中心 15 英尺立方体内的每个生物都必须进行敏捷豁免检定。如果豁免失败,该生物将受到 1d6 力场伤害。此伤害在 11 级时增加到 2d6,在 17 级时增加到 3d6。在您的愤怒结束之前,您可以在每个回合中以奖励动作再次使用此效果。 +Feature/&PowerPathOfTheWildMagicSummonTitle=狂野浪潮:灵魂冲击 Feature/&PowerPathOfTheWildMagicTeleportDescription=你可以传送至最远 30 英尺处你可以看见的空闲空间。 Feature/&PowerPathOfTheWildMagicTeleportTitle=狂野浪潮:传送 Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=使用你的反应来重骰狂野浪潮并替换效果。 From 24b98a8b83889acc73182d64fdcd542b82b017df Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 18:40:24 -0700 Subject: [PATCH 050/162] update collaterals and docs --- Documentation/Spells.md | 4 ++-- Documentation/Subclasses.md | 10 +++++----- SolastaUnfinishedBusiness/ChangelogHistory.txt | 2 +- .../es/SubClasses/PathOfTheWildMagic-es.txt | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Documentation/Spells.md b/Documentation/Spells.md index fad1c2b15d..aedf104518 100644 --- a/Documentation/Spells.md +++ b/Documentation/Spells.md @@ -164,7 +164,7 @@ This spell's damage increases by 1d6 when you reach 5th level (2d6), 11th level # 40. - *Toll the Dead* © (V,S) level 0 Necromancy [UB] -You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d8 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. +You point at one creature you can see within range, and the sound of a dolorous bell fills the air around it for a moment. The target must succeed on a Wisdom saving throw or take 1d6 necrotic damage. If the target is missing any of its hit points, it instead takes 1d12 necrotic damage. # 41. - True Strike (S) level 0 Divination [Concentration] [SOL] @@ -184,7 +184,7 @@ Create a brilliant flash of shimmering light, damaging all enemies around you. # 45. - Wrack (V,S) level 0 Necromancy [UB] -Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d8 necrotic damage, and preventing them from dashing or disengaging. +Unleash a wave of crippling pain at a creature within range. The target must make a Constitution saving throw or take 1d6 necrotic damage, and preventing them from dashing or disengaging. # 46. - *Absorb Elements* © (S) level 1 Abjuration [UB] diff --git a/Documentation/Subclasses.md b/Documentation/Subclasses.md index 3337c9d42b..e2601409d8 100644 --- a/Documentation/Subclasses.md +++ b/Documentation/Subclasses.md @@ -1735,7 +1735,7 @@ Once per short rest, you may reinforce a non-magical piece of armor or shield. T * Divine Strike -Once per turn, deal +1d8 fire damage on weapon attacks. This damage increases to 2d8 at 14th level. +Once during your turn, deal +1d8 fire damage on weapon attacks. This damage increases to 2d8 at 14th level. ### Level 10 @@ -2020,7 +2020,7 @@ The Mischief domain is followed by those who pursue joy, pleasure, and wealth th * Borrowed Luck -When you fail a saving throw where you did not have disadvantage, you can use your reaction to roll again. If you succeed, you will have disadvantage on your next saving throw.​​​​​​​ +When you fail a saving throw where you did not have disadvantage, you can use your reaction to roll again. If you succeed, you will have disadvantage on your next saving throw. * Mischief Domain Spells @@ -2054,7 +2054,7 @@ When you hit a creature with a melee or ranged weapon attack, you can Channel Di * Elusive Target -Starting at level 6, you are extremely hard to corner in close combat. When a melee attack hits you, you can use your reaction to gain the benefits of Dodging and Disengaging until the end of your next turn.​​​​​​ +Starting at level 6, you are extremely hard to corner in close combat. When a melee attack hits you, you can use your reaction to gain the benefits of Dodging and Disengaging until the end of your next turn. ### Level 8 @@ -3160,14 +3160,14 @@ You can use a bonus action to give all allies within 3 cells of you (including y ### Level 7 -* Coordinated Defense​​​​​​​ +* Coordinated Defense When you use the attack action, you can forego one of your attacks to grant an ally within 3 cells of you (including yourself) Dodge until the start of your next turn. ### Level 10 -* Invigorating Shout​​​​​​​ +* Invigorating Shout Rousing Shout's range increases from 3 to 6 cells. Allies affected by Rousing Shout now also gain temporary hit points equal to your level for 1 minute. diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 3fda7a3e1a..c2ddc18f05 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,7 +1,7 @@ 1.5.97.26: - fixed Bait and Switch maneuver greyed out on action bar -- fixed Bountiful Luck feat triggering on any failure regardless of dice roll +- fixed Bountiful Luck feat triggering on any failure regardless d20 dice roll - fixed Cleric domains missing divine intervention improvement at 20 - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt index ec341c654c..f90d7af9ef 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Siempre que saques Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Aumento controlado Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Inmediatamente después de recibir daño mientras estás en estado de furia, puedes usar tu reacción para tirar en la tabla de Magia Salvaje y producir inmediatamente el efecto que hayas obtenido. Este efecto reemplaza tu efecto de Magia Salvaje actual. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Barra invertida inestable -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Cuando entres en tu furia, tira en la tabla de Magia Salvaje para determinar el efecto mágico producido. Si el efecto requiere una tirada de salvación, la CD es igual a 8 + tu bonificador de competencia + tu modificador de Constitución.\n\nTabla de Magia Salvaje:\n- Cada criatura a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o sufrir 1d12 puntos de daño necrótico. También obtienes 1d12 puntos de golpe temporales.\n- Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- Elige un punto que puedas ver a 30 pies o menos de ti. Una explosión de energía espiritual estalla desde el punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe hacer una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño de fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- La magia impregna el arma que estás sosteniendo. Hasta que tu furia termine, el tipo de daño del arma cambia a fuerza y ​​obtiene las propiedades de lanzamiento, con un alcance normal de 20 pies y un alcance largo de 60 pies. Si el arma abandona tu mano, reaparece en tu mano. Tu bonificación por daño de furia también se aplicará a esta arma arrojadiza.\n- Siempre que una criatura te golpee con una tirada de ataque antes de que tu furia termine, esa criatura recibe 1d6 de daño por fuerza.\n- Hasta que tu furia termine, obtienes una bonificación de +1 a la CA, y mientras estés a 10 pies o menos de ti, tus aliados obtienen la misma bonificación.\n- Hasta que tu furia termine, al final de cada uno de tus turnos, el suelo a 15 pies o menos de ti se convierte en terreno difícil hasta el comienzo de tu siguiente turno.\n- Un rayo de luz sale disparado de tu pecho. Otra criatura de tu elección que puedas ver a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o recibirá 1d6 de daño radiante y quedará cegada hasta el comienzo de tu siguiente turno. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como una acción adicional. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Cuando entres en tu furia, tira en la tabla de Magia Salvaje para determinar el efecto mágico producido. Si el efecto requiere una tirada de salvación, la CD es igual a 8 + tu bonificador de competencia + tu modificador de Constitución.\n\nTabla de Magia Salvaje:\n- Cada criatura a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o sufrir 1d12 puntos de daño necrótico. También obtienes 1d12 puntos de golpe temporales.\n- Te teletransportas hasta 30 pies a un espacio desocupado que puedas ver. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- Elige un punto que puedas ver a 30 pies o menos de ti. Una explosión de energía espiritual estalla desde el punto y cada criatura dentro de un cubo de 15 pies centrado en el punto debe hacer una tirada de salvación de Destreza. Si falla la tirada, la criatura sufre 1d6 puntos de daño de fuerza. Este daño aumenta a 2d6 en el nivel 11 y a 3d6 en el nivel 17. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como acción adicional.\n- La magia impregna el arma que estás sosteniendo. Hasta que tu furia termine, el tipo de daño del arma cambia a fuerza y obtiene las propiedades de lanzamiento, con un alcance normal de 20 pies y un alcance largo de 60 pies. Si el arma abandona tu mano, reaparece en tu mano. Tu bonificación por daño de furia también se aplicará a esta arma arrojadiza.\n- Siempre que una criatura te golpee con una tirada de ataque antes de que tu furia termine, esa criatura recibe 1d6 de daño por fuerza.\n- Hasta que tu furia termine, obtienes una bonificación de +1 a la CA, y mientras estés a 10 pies o menos de ti, tus aliados obtienen la misma bonificación.\n- Hasta que tu furia termine, al final de cada uno de tus turnos, el suelo a 15 pies o menos de ti se convierte en terreno difícil hasta el comienzo de tu siguiente turno.\n- Un rayo de luz sale disparado de tu pecho. Otra criatura de tu elección que puedas ver a 30 pies o menos de ti debe tener éxito en una tirada de salvación de Constitución o recibirá 1d6 de daño radiante y quedará cegada hasta el comienzo de tu siguiente turno. Hasta que tu furia termine, puedes usar este efecto de nuevo en cada uno de tus turnos como una acción adicional. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Oleada salvaje Feature/&PowerPathOfTheWildMagicAuraDescription=Hasta que termine tu ira, obtienes una bonificación de +1 a la CA y, mientras estén a 10 pies de ti, tus aliados obtienen la misma bonificación. Feature/&PowerPathOfTheWildMagicAuraTitle=Oleada salvaje: Aura From 0915e581f010364a7d6b51044749eebc4e0a3e48 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Wed, 7 Aug 2024 18:57:47 -0700 Subject: [PATCH 051/162] rider auto format and clean up --- SolastaUnfinishedBusiness/Classes/InventorClass.cs | 2 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 8 ++++---- SolastaUnfinishedBusiness/Models/SpellPointsContext.cs | 2 +- SolastaUnfinishedBusiness/Races/Oligath.cs | 1 - .../Subclasses/Builders/InvocationsBuilders.cs | 1 - SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs | 1 - SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs | 2 +- SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs | 1 - .../Subclasses/PathOfTheWildMagic.cs | 2 +- SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs | 1 - SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs | 3 +-- SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs | 1 - SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs | 1 - .../Subclasses/RoguishUmbralStalker.cs | 1 - .../Subclasses/WayOfTheSilhouette.cs | 1 - 15 files changed, 9 insertions(+), 19 deletions(-) diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 9b05e03883..a568f5bcad 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -909,7 +909,7 @@ public IEnumerator HandleReducedToZeroHpByEnemy( { yield break; } - + yield return defender.MyReactToUsePower( ActionDefinitions.Id.PowerNoCost, usablePower, diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 67a00e5a67..65e286ed58 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -1779,7 +1779,7 @@ private IEnumerator HandleReaction( "ReactiveResistance", "UseReactiveResistanceDescription".Formatted(Category.Reaction, attacker.Name, damageTitle), ReactionValidated, - battleManager: battleManager); + battleManager); yield break; @@ -2004,7 +2004,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - yield return defender.MyReactToUsePower( + yield return helper.MyReactToUsePower( ActionDefinitions.Id.PowerNoCost, usablePower, [helper], @@ -2090,7 +2090,7 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - yield return defender.MyReactToUsePower( + yield return helper.MyReactToUsePower( ActionDefinitions.Id.PowerNoCost, usablePower, [helper], @@ -2171,7 +2171,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( "LuckySaving", "UseLuckySavingDescription".Formatted(Category.Reaction, defender.Name, attacker.Name, helper.Name), ReactionValidated, - battleManager: battleManager); + battleManager); yield break; diff --git a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs index 8765341117..8b3dd9463d 100644 --- a/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SpellPointsContext.cs @@ -225,7 +225,7 @@ internal static void ConsumeSlotsAtLevelsPointsCannotCastAnymore( ConsumeSlot(i); } - + repertoire.RepertoireRefreshed?.Invoke(repertoire); return; diff --git a/SolastaUnfinishedBusiness/Races/Oligath.cs b/SolastaUnfinishedBusiness/Races/Oligath.cs index cc5418d144..a4f5235ef4 100644 --- a/SolastaUnfinishedBusiness/Races/Oligath.cs +++ b/SolastaUnfinishedBusiness/Races/Oligath.cs @@ -3,7 +3,6 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index e41b207a8c..dfb3b7d684 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -6,7 +6,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs index cbd2d1efb0..0b603da429 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDemonHunter.cs @@ -3,7 +3,6 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index ee685ad8d0..208925df41 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -531,7 +531,7 @@ public IEnumerator OnTryAlterOutcomeAttack( yield return helper.MyReactToUsePower( ActionDefinitions.Id.PowerReaction, usablePower, - [defender], + [helper], attacker, "BeastTailSwipe", battleManager: battleManager); diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs index 6489267779..8ec9250810 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs @@ -6,7 +6,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 01b3d2dcb1..07e88a1fe6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -1051,7 +1051,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( bool criticalHit) { if (defender == attacker - || attacker.RulesetCharacter.IsDeadOrDying + || attacker.RulesetCharacter.IsDeadOrDying || defender.RulesetCharacter.IsDeadOrDying) { yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs index 52162d34bb..207f89092c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMountain.cs @@ -3,7 +3,6 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs index d1a80a9b65..c85b76e273 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerLightBearer.cs @@ -4,7 +4,6 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -408,7 +407,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); - + if (Gui.Battle == null || rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs index 5bc2ab4afe..af4b2cb523 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerSkyWarrior.cs @@ -5,7 +5,6 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs index 2733066956..eb738f5338 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs @@ -2,7 +2,6 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs index d39256ee46..ae6a3a9e4a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs @@ -6,7 +6,6 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs index a2f35d7cea..4a89ea0ee1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs @@ -4,7 +4,6 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; From 221354fa112933c74ff115d55ce9fe2763b3eb41 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:12:28 -0700 Subject: [PATCH 052/162] fix College of Swords flourish melee weapon validator - fix #4852 --- SolastaUnfinishedBusiness/ChangelogHistory.txt | 3 ++- .../Subclasses/CollegeOfAudacity.cs | 13 +++++-------- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index c2ddc18f05..a9e38a0809 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,8 +1,9 @@ 1.5.97.26: - fixed Bait and Switch maneuver greyed out on action bar -- fixed Bountiful Luck feat triggering on any failure regardless d20 dice roll +- fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 +- fixed College of Swords flourish melee weapon validator - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index e314e4b354..c28923f90f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -342,6 +342,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( if (!actionManager || !attacker.OnceInMyTurnIsValid(WhirlMarker) || + !ValidatorsWeapon.IsMelee(attackMode) || !((isAudaciousWhirl && hasAvailablePowerUses) || isMasterfulWhirl)) { yield break; @@ -424,11 +425,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( { var rulesetAttacker = attacker.RulesetCharacter; - if (rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false }) + if (rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || + !attacker.UsedSpecialFeatures.TryGetValue(WhirlSelectedPower, out var value)) { yield break; } + attacker.UsedSpecialFeatures.Remove(WhirlSelectedPower); + if (!rulesetAttacker.HasConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionExtraMovement.Name)) { @@ -447,13 +451,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( 0); } - if (!attacker.UsedSpecialFeatures.TryGetValue(WhirlSelectedPower, out var value)) - { - yield break; - } - - attacker.UsedSpecialFeatures.Remove(WhirlSelectedPower); - switch (value) { case 0 when From 5e28367ac305453d750e537cfc102a9735e4bedd Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:43:19 -0700 Subject: [PATCH 053/162] add GameLocationCharacterExtensions.MyReactToSpendPower --- .../GameLocationCharacterExtensions.cs | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index deeaf7c762..f7b0bfa073 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -45,7 +45,47 @@ internal static void MyExecuteAction( ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); } - internal static IEnumerator MyReactToUsePower(this GameLocationCharacter character, + internal static IEnumerator MyReactToSpendPower( + this GameLocationCharacter character, + RulesetUsablePower usablePower, + GameLocationCharacter waiter, + string stringParameter, + string stringParameter2 = "", + Action reactionValidated = null, + GameLocationBattleManager battleManager = null) + { + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!battleManager) + { + yield break; + } + + var actionService = ServiceRepository.GetService(); + var count = actionService.PendingReactionRequestGroups.Count; + var implementationManager = + ServiceRepository.GetService() as RulesetImplementationManager; + var actionParams = new CharacterActionParams(character, Id.SpendPower) + { + StringParameter = stringParameter, + StringParameter2 = stringParameter2, + RulesetEffect = + implementationManager.MyInstantiateEffectPower(character.RulesetCharacter, usablePower, false), + UsablePower = usablePower + }; + + actionService.ReactToSpendPower(actionParams); + + yield return battleManager.WaitForReactions(waiter, actionService, count); + + if (actionParams.ReactionValidated) + { + reactionValidated?.Invoke(); + } + } + + internal static IEnumerator MyReactToUsePower( + this GameLocationCharacter character, Id actionId, RulesetUsablePower usablePower, List targets, From 9480b84f73fdc064a0f02b7a4293fc964ae4d67b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:44:08 -0700 Subject: [PATCH 054/162] change Rogue struck of luck to use MyReactToSpendPower --- .../Models/Level20Context.cs | 42 +++++++------------ 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/Level20Context.cs b/SolastaUnfinishedBusiness/Models/Level20Context.cs index 7eaa53f710..a37198466c 100644 --- a/SolastaUnfinishedBusiness/Models/Level20Context.cs +++ b/SolastaUnfinishedBusiness/Models/Level20Context.cs @@ -1039,36 +1039,26 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return attacker.MyReactToSpendPower( + usablePower, + attacker, + "RogueStrokeOfLuck", + reactionValidated: ReactionValidated, + battleManager: battleManager); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "RogueStrokeOfLuck", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + var delta = -action.AttackSuccessDelta; + + rulesetAttacker.UsePower(usablePower); + action.AttackRollOutcome = RollOutcome.Success; + action.AttackSuccessDelta += delta; + action.AttackRoll += delta; + attackModifier.AttackRollModifier += delta; + attackModifier.AttacktoHitTrends.Add(new TrendInfo(delta, FeatureSourceType.Power, power.Name, power)); } - - var delta = -action.AttackSuccessDelta; - - rulesetAttacker.UsePower(usablePower); - action.AttackRollOutcome = RollOutcome.Success; - action.AttackSuccessDelta += delta; - action.AttackRoll += delta; - attackModifier.AttackRollModifier += delta; - attackModifier.AttacktoHitTrends.Add(new TrendInfo(delta, FeatureSourceType.Power, power.Name, power)); } } From d49d0068f13a304a33f1cc2b63ff5faa99ab1a70 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:45:17 -0700 Subject: [PATCH 055/162] change Imp draw inspiration to use MyReactToSpendPower --- SolastaUnfinishedBusiness/Races/Imp.cs | 77 ++++++++++---------------- 1 file changed, 29 insertions(+), 48 deletions(-) diff --git a/SolastaUnfinishedBusiness/Races/Imp.cs b/SolastaUnfinishedBusiness/Races/Imp.cs index 2d5880877d..e9f34a43e9 100644 --- a/SolastaUnfinishedBusiness/Races/Imp.cs +++ b/SolastaUnfinishedBusiness/Races/Imp.cs @@ -594,44 +594,34 @@ public IEnumerator OnTryAlterOutcomeAttack(GameLocationBattleManager battleManag RulesetEffect rulesetEffect) { var rulesetHelper = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || action.AttackSuccessDelta < -InspirationValue || - rulesetHelper.GetRemainingPowerUses(powerImpBadlandDrawInspiration) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetHelper); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "DrawInspiration", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(actionParams); + yield return attacker.MyReactToSpendPower( + usablePower, + attacker, + "DrawInspiration", + reactionValidated: ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; + action.AttackSuccessDelta += InspirationValue; + action.AttackRollOutcome = RollOutcome.Success; + actionModifier.AttackRollModifier += InspirationValue; + actionModifier.AttacktoHitTrends.Add(new TrendInfo( + InspirationValue, FeatureSourceType.Power, + powerImpBadlandDrawInspiration.Name, powerImpBadlandDrawInspiration)); } - - action.AttackSuccessDelta += InspirationValue; - action.AttackRollOutcome = RollOutcome.Success; - actionModifier.AttackRollModifier += InspirationValue; - actionModifier.AttacktoHitTrends.Add(new TrendInfo( - InspirationValue, FeatureSourceType.Power, - powerImpBadlandDrawInspiration.Name, powerImpBadlandDrawInspiration)); } public IEnumerator OnTryAlterOutcomeSavingThrow(GameLocationBattleManager battleManager, @@ -643,41 +633,32 @@ public IEnumerator OnTryAlterOutcomeSavingThrow(GameLocationBattleManager battle bool hasHitVisual, [UsedImplicitly] bool hasBorrowedLuck) { var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetDefender); if (helper != defender || !action.RolledSaveThrow || action.SaveOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || - rulesetDefender.GetRemainingPowerUses(powerImpBadlandDrawInspiration) == 0 || + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0 || action.SaveOutcomeDelta < -InspirationValue) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetDefender); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.SpendPower) - { - StringParameter = "DrawInspiration", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield return defender.MyReactToSpendPower( + usablePower, + attacker, + "DrawInspiration", + reactionValidated: ReactionValidated, + battleManager: battleManager); - actionService.ReactToSpendPower(actionParams); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; + action.RolledSaveThrow = true; + action.SaveOutcomeDelta = 0; + action.SaveOutcome = RollOutcome.Success; } - - action.RolledSaveThrow = true; - action.SaveOutcomeDelta = 0; - action.SaveOutcome = RollOutcome.Success; } } From 6d4fbe95082b168f3f41f7d9aa5e4cd22bfc521c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:47:11 -0700 Subject: [PATCH 056/162] change Inventor flash of genius to use MyReactToUsePower --- .../Classes/InventorClass.cs | 138 ++++++++---------- 1 file changed, 61 insertions(+), 77 deletions(-) diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index a568f5bcad..3d83ef7f6d 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -992,6 +992,7 @@ public IEnumerator OnTryAlterAttributeCheck( } var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(power, rulesetHelper); var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); @@ -999,57 +1000,48 @@ public IEnumerator OnTryAlterAttributeCheck( abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure || !helper.CanReact() || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(power) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || abilityCheckData.AbilityCheckSuccessDelta + bonus < 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(power, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "InventorFlashOfGeniusCheck", - StringParameter2 = "SpendPowerInventorFlashOfGeniusCheckDescription".Formatted( + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [helper], + defender, + "InventorFlashOfGeniusCheck", + "SpendPowerInventorFlashOfGeniusCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(defender, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + abilityCheckData.AbilityCheckRoll += bonus; + abilityCheckData.AbilityCheckSuccessDelta += bonus; - abilityCheckData.AbilityCheckRoll += bonus; - abilityCheckData.AbilityCheckSuccessDelta += bonus; + if (abilityCheckData.AbilityCheckSuccessDelta >= 0) + { + abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Success; + } - if (abilityCheckData.AbilityCheckSuccessDelta >= 0) - { - abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Success; + var extra = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") + : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + + helper.RulesetCharacter.LogCharacterUsedPower( + power, + "Feedback/&FlashOfGeniusCheckToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), + extra + ]); } - - var extra = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") - : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); - - helper.RulesetCharacter.LogCharacterUsedPower( - power, - "Feedback/&FlashOfGeniusCheckToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), - extra - ]); } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -1075,6 +1067,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( } var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(power, rulesetHelper); var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); @@ -1082,55 +1075,46 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( action.SaveOutcome != RollOutcome.Failure || !helper.CanReact() || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(power) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || action.SaveOutcomeDelta + bonus < 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(power, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.PowerReaction) - { - StringParameter = "InventorFlashOfGenius", - StringParameter2 = FormatReactionDescription(action, attacker, defender, helper), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + yield return helper.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [helper], + attacker, + "InventorFlashOfGenius", + FormatReactionDescription(action, attacker, defender, helper), + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + action.SaveOutcomeDelta += bonus; - action.SaveOutcomeDelta += bonus; + if (action.SaveOutcomeDelta >= 0) + { + action.SaveOutcome = RollOutcome.Success; + } - if (action.SaveOutcomeDelta >= 0) - { - action.SaveOutcome = RollOutcome.Success; + var extra = action.SaveOutcomeDelta >= 0 + ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") + : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + + helper.RulesetCharacter.LogCharacterUsedPower( + power, + "Feedback/&FlashOfGeniusSavingToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), + extra + ]); } - - var extra = action.SaveOutcomeDelta >= 0 - ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") - : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); - - helper.RulesetCharacter.LogCharacterUsedPower( - power, - "Feedback/&FlashOfGeniusSavingToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), - extra - ]); } private static string FormatReactionDescription( From be7058cfc58a99bc2a3758aaf05b82e44a49de59 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:48:01 -0700 Subject: [PATCH 057/162] change Innovation Vivisectionist organ donation to use MyReactToSpendPower --- .../Subclasses/InnovationVivisectionist.cs | 41 +++++-------------- 1 file changed, 11 insertions(+), 30 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs index e969deb3aa..fce49eb0d8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs @@ -214,19 +214,12 @@ public IEnumerator HandleReducedToZeroHpByMe( RulesetAttackMode attackMode, RulesetEffect activeEffect) { - if (ServiceRepository.GetService() is not GameLocationBattleManager - { - IsBattleInProgress: true - } battleManager) - { - yield break; - } - var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerOrganDonation, rulesetAttacker); var usablePowerEmergencyCure = PowerProvider.Get(powerEmergencyCure, rulesetAttacker); var usablePowerEmergencySurgery = PowerProvider.Get(powerEmergencySurgery, rulesetAttacker); - if (rulesetAttacker.GetRemainingPowerUses(powerOrganDonation) == 0 || + if (rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0 || !attacker.OncePerTurnIsValid(powerOrganDonation.Name) || (usablePowerEmergencyCure.MaxUses == usablePowerEmergencyCure.RemainingUses && usablePowerEmergencySurgery.MaxUses == usablePowerEmergencySurgery.RemainingUses)) @@ -236,31 +229,19 @@ public IEnumerator HandleReducedToZeroHpByMe( attacker.UsedSpecialFeatures.TryAdd(powerOrganDonation.Name, 0); - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; + yield return attacker.MyReactToSpendPower( + usablePower, + attacker, + "OrganDonation", + reactionValidated: ReactionValidated); - var usablePower = PowerProvider.Get(powerOrganDonation, rulesetAttacker); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "OrganDonation", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + rulesetAttacker.RepayPowerUse(usablePowerEmergencyCure); + rulesetAttacker.RepayPowerUse(usablePowerEmergencySurgery); } - - rulesetAttacker.RepayPowerUse(usablePowerEmergencyCure); - rulesetAttacker.RepayPowerUse(usablePowerEmergencySurgery); } } } From daed22d5e17f183fa609067c90b7f332ace592ab Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:49:08 -0700 Subject: [PATCH 058/162] change Martial Royal Knight inspiring protection to use MyReactToSpendPower --- .../Subclasses/MartialRoyalKnight.cs | 72 ++++++++----------- 1 file changed, 30 insertions(+), 42 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs index a295d9b38e..0daa8b6e9d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs @@ -4,7 +4,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -257,60 +256,49 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( RulesetEntity.TryGetEntity(activeCondition.SourceGuid, out var rulesetOriginalHelper); var originalHelper = GameLocationCharacter.GetFromActor(rulesetOriginalHelper); + var usablePower = PowerProvider.Get(powerInspiringProtection, rulesetOriginalHelper); if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || !originalHelper.CanReact() || !originalHelper.CanPerceiveTarget(defender) || - rulesetOriginalHelper.GetRemainingPowerUses(powerInspiringProtection) == 0) + rulesetOriginalHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerInspiringProtection, rulesetOriginalHelper); - var reactionParams = new CharacterActionParams(originalHelper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "RoyalKnightInspiringProtection", - StringParameter2 = FormatReactionDescription(action, attacker, defender, originalHelper), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetOriginalHelper, usablePower, false), - UsablePower = usablePower - }; - - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + yield return originalHelper.MyReactToSpendPower( + usablePower, + attacker, + "RoyalKnightInspiringProtection", + FormatReactionDescription(action, attacker, defender, originalHelper), + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + rulesetOriginalHelper.UsePower(usablePower); + + action.RolledSaveThrow = action.ActionParams.RulesetEffect == null + ? action.ActionParams.AttackMode.TryRollSavingThrow( + attacker.RulesetCharacter, + defender.RulesetActor, + saveModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, + out var saveOutcome, out var saveOutcomeDelta) + : action.ActionParams.RulesetEffect.TryRollSavingThrow( + attacker.RulesetCharacter, + attacker.Side, + defender.RulesetActor, + saveModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, + out saveOutcome, out saveOutcomeDelta); + + action.SaveOutcome = saveOutcome; + action.SaveOutcomeDelta = saveOutcomeDelta; + + rulesetOriginalHelper.LogCharacterUsedPower(powerInspiringProtection, indent: true); } - - rulesetOriginalHelper.UsePower(usablePower); - - action.RolledSaveThrow = action.ActionParams.RulesetEffect == null - ? action.ActionParams.AttackMode.TryRollSavingThrow( - attacker.RulesetCharacter, - defender.RulesetActor, - saveModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, - out var saveOutcome, out var saveOutcomeDelta) - : action.ActionParams.RulesetEffect.TryRollSavingThrow( - attacker.RulesetCharacter, - attacker.Side, - defender.RulesetActor, - saveModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, - out saveOutcome, out saveOutcomeDelta); - - action.SaveOutcome = saveOutcome; - action.SaveOutcomeDelta = saveOutcomeDelta; - - rulesetOriginalHelper.LogCharacterUsedPower(powerInspiringProtection, indent: true); } private static string FormatReactionDescription( From a03e946078db6f373cbea0c19f45372d8fed4922 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:49:45 -0700 Subject: [PATCH 059/162] change Roguish Raven deadly focus to use MyReactToSpendPower --- .../Subclasses/RoguishRavenScion.cs | 111 ++++++++---------- 1 file changed, 50 insertions(+), 61 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs index ab7dba5467..3dc346f3fe 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs @@ -5,7 +5,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -245,78 +244,68 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerDeadlyFocus, rulesetAttacker); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || !ValidatorsWeapon.IsTwoHandedRanged(attackMode) || - rulesetAttacker.GetRemainingPowerUses(powerDeadlyFocus) == 0) + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerDeadlyFocus, rulesetAttacker); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "RavenScionDeadlyFocus", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield return attacker.MyReactToSpendPower( + usablePower, + attacker, + "RavenScionDeadlyFocus", + reactionValidated: ReactionValidated, + battleManager: battleManager); - actionService.ReactToSpendPower(reactionParams); + yield break; - yield return battleManager.WaitForReactions(attacker, actionService, count); - - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + usablePower.Consume(); + + var totalRoll = (action.AttackRoll + attackMode.ToHitBonus).ToString(); + var rollCaption = action.AttackRollOutcome == RollOutcome.CriticalFailure + ? "Feedback/&RollAttackCriticalFailureTitle" + : "Feedback/&RollAttackFailureTitle"; + + rulesetAttacker.LogCharacterUsedPower( + powerDeadlyFocus, + $"Feedback/&Trigger{Name}RerollLine", + false, + (ConsoleStyleDuplet.ParameterType.Base, $"{action.AttackRoll}+{attackMode.ToHitBonus}"), + (ConsoleStyleDuplet.ParameterType.FailedRoll, Gui.Format(rollCaption, totalRoll))); + + var advantageTrends = + new List + { + new(1, FeatureSourceType.CharacterFeature, powerDeadlyFocus.Name, powerDeadlyFocus) + }; + + attackModifier.AttackAdvantageTrends.SetRange(advantageTrends); + + var roll = rulesetAttacker.RollAttack( + attackMode.toHitBonus, + defender.RulesetActor, + attackMode.sourceDefinition, + attackModifier.attackToHitTrends, + false, + attackModifier.AttackAdvantageTrends, + attackMode.ranged, + false, + attackModifier.attackRollModifier, + out var outcome, + out var successDelta, + -1, + true); + + action.AttackRollOutcome = outcome; + action.AttackSuccessDelta = successDelta; + action.AttackRoll = roll; } - - usablePower.Consume(); - - var totalRoll = (action.AttackRoll + attackMode.ToHitBonus).ToString(); - var rollCaption = action.AttackRollOutcome == RollOutcome.CriticalFailure - ? "Feedback/&RollAttackCriticalFailureTitle" - : "Feedback/&RollAttackFailureTitle"; - - rulesetAttacker.LogCharacterUsedPower( - powerDeadlyFocus, - $"Feedback/&Trigger{Name}RerollLine", - false, - (ConsoleStyleDuplet.ParameterType.Base, $"{action.AttackRoll}+{attackMode.ToHitBonus}"), - (ConsoleStyleDuplet.ParameterType.FailedRoll, Gui.Format(rollCaption, totalRoll))); - - var advantageTrends = - new List - { - new(1, FeatureSourceType.CharacterFeature, powerDeadlyFocus.Name, powerDeadlyFocus) - }; - - attackModifier.AttackAdvantageTrends.SetRange(advantageTrends); - - var roll = rulesetAttacker.RollAttack( - attackMode.toHitBonus, - defender.RulesetActor, - attackMode.sourceDefinition, - attackModifier.attackToHitTrends, - false, - attackModifier.AttackAdvantageTrends, - attackMode.ranged, - false, - attackModifier.attackRollModifier, - out var outcome, - out var successDelta, - -1, - true); - - action.AttackRollOutcome = outcome; - action.AttackSuccessDelta = successDelta; - action.AttackRoll = roll; } } } From 35c5c06ef92724287b2be157e4783c71a5d2252b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:50:45 -0700 Subject: [PATCH 060/162] change Sorcerous Wild Magic tides of chaos to use MyReactToSpendPower --- .../Subclasses/SorcerousWildMagic.cs | 226 ++++++++---------- 1 file changed, 102 insertions(+), 124 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index ffabcffdd9..7e6d64a6b7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -634,95 +634,84 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var reactionParams = new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = "TidesOfChaosAttack", - StringParameter2 = "SpendPowerTidesOfChaosAttackDescription" + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "TidesOfChaosAttack", + "SpendPowerTidesOfChaosAttackDescription" .Formatted(Category.Reaction, defender.Name, action.FormatTitle()), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + List advantageTrends = + [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; - List advantageTrends = - [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; + actionModifier.AttackAdvantageTrends.SetRange(advantageTrends); - actionModifier.AttackAdvantageTrends.SetRange(advantageTrends); + RollOutcome outcome; + var attackRoll = action.AttackRoll; + int roll; + int toHitBonus; + int successDelta; - RollOutcome outcome; - var attackRoll = action.AttackRoll; - int roll; - int toHitBonus; - int successDelta; - - if (attackMode != null) - { - toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; - roll = rulesetHelper.RollAttack( - attackMode.ToHitBonus, - defender.RulesetActor, - attackMode.SourceDefinition, - attackMode.ToHitBonusTrends, - false, - actionModifier.AttackAdvantageTrends, - attackMode.ranged, - false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - else if (rulesetEffect != null) - { - toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; - roll = rulesetHelper.RollMagicAttack( - rulesetEffect, - defender.RulesetActor, - rulesetEffect.GetEffectSource(), - actionModifier.AttacktoHitTrends, - actionModifier.AttackAdvantageTrends, - false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - // should never happen - else - { - yield break; - } + if (attackMode != null) + { + toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; + roll = rulesetHelper.RollAttack( + attackMode.ToHitBonus, + defender.RulesetActor, + attackMode.SourceDefinition, + attackMode.ToHitBonusTrends, + false, + actionModifier.AttackAdvantageTrends, + attackMode.ranged, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + else if (rulesetEffect != null) + { + toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; + roll = rulesetHelper.RollMagicAttack( + rulesetEffect, + defender.RulesetActor, + rulesetEffect.GetEffectSource(), + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + // should never happen + else + { + return; + } - action.AttackRollOutcome = outcome; - action.AttackSuccessDelta = successDelta; - action.AttackRoll = roll; + action.AttackRollOutcome = outcome; + action.AttackSuccessDelta = successDelta; + action.AttackRoll = roll; - var sign = toHitBonus > 0 ? "+" : string.Empty; + var sign = toHitBonus > 0 ? "+" : string.Empty; - usablePower.Consume(); - rulesetHelper.LogCharacterUsedFeature( - PowerTidesOfChaos, - "Feedback/&TriggerRerollLine", - false, - (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), - (ConsoleStyleDuplet.ParameterType.FailedRoll, - Gui.Format("Feedback/&RollAttackFailureTitle", $"{attackRoll + toHitBonus}"))); + rulesetHelper.LogCharacterUsedFeature( + PowerTidesOfChaos, + "Feedback/&TriggerRerollLine", + false, + (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), + (ConsoleStyleDuplet.ParameterType.FailedRoll, + Gui.Format("Feedback/&RollAttackFailureTitle", $"{attackRoll + toHitBonus}"))); + } } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -746,56 +735,45 @@ action.SaveOutcome is not RollOutcome.Failure || yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var reactionParams = new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = "TidesOfChaosSave", - StringParameter2 = "SpendPowerTidesOfChaosSaveDescription" + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "TidesOfChaosSave", + "SpendPowerTidesOfChaosSaveDescription" .Formatted(Category.Reaction, attacker.Name, action.FormatTitle()), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + List advantageTrends = + [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; + + actionModifier.SavingThrowAdvantageTrends.SetRange(advantageTrends); + + action.RolledSaveThrow = action.ActionParams.RulesetEffect == null + ? action.ActionParams.AttackMode.TryRollSavingThrow( + attacker.RulesetCharacter, + defender.RulesetActor, + actionModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, + out var saveOutcome, out var saveOutcomeDelta) + : action.ActionParams.RulesetEffect.TryRollSavingThrow( + attacker.RulesetCharacter, + attacker.Side, + defender.RulesetActor, + actionModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, + out saveOutcome, out saveOutcomeDelta); + action.SaveOutcome = saveOutcome; + action.SaveOutcomeDelta = saveOutcomeDelta; + + rulesetHelper.LogCharacterActivatesAbility( + PowerTidesOfChaos.GuiPresentation.Title, + "Feedback/&TidesOfChaosAdvantageSavingThrow", + tooltipContent: PowerTidesOfChaos.Name, + tooltipClass: "PowerDefinition"); } - - List advantageTrends = - [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; - - actionModifier.SavingThrowAdvantageTrends.SetRange(advantageTrends); - - action.RolledSaveThrow = action.ActionParams.RulesetEffect == null - ? action.ActionParams.AttackMode.TryRollSavingThrow( - attacker.RulesetCharacter, - defender.RulesetActor, - actionModifier, action.ActionParams.AttackMode.EffectDescription.EffectForms, - out var saveOutcome, out var saveOutcomeDelta) - : action.ActionParams.RulesetEffect.TryRollSavingThrow( - attacker.RulesetCharacter, - attacker.Side, - defender.RulesetActor, - actionModifier, action.ActionParams.RulesetEffect.EffectDescription.EffectForms, hasHitVisual, - out saveOutcome, out saveOutcomeDelta); - action.SaveOutcome = saveOutcome; - action.SaveOutcomeDelta = saveOutcomeDelta; - - usablePower.Consume(); - rulesetHelper.LogCharacterActivatesAbility( - PowerTidesOfChaos.GuiPresentation.Title, - "Feedback/&TidesOfChaosAdvantageSavingThrow", - tooltipContent: PowerTidesOfChaos.Name, - tooltipClass: "PowerDefinition"); } } From bc115dcb7b8ae5cf25a03f8c327094cc5bde2ee1 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 11:51:45 -0700 Subject: [PATCH 061/162] change Path of the Beast infectious fury to use MyReactToUsePower --- .../Subclasses/PathOfTheBeast.cs | 77 ++++++++----------- .../de/SubClasses/PathOfTheBeast-de.txt | 8 +- .../en/SubClasses/PathOfTheBeast-en.txt | 8 +- .../es/SubClasses/PathOfTheBeast-es.txt | 8 +- .../fr/SubClasses/PathOfTheBeast-fr.txt | 8 +- .../it/SubClasses/PathOfTheBeast-it.txt | 8 +- .../ja/SubClasses/PathOfTheBeast-ja.txt | 8 +- .../ko/SubClasses/PathOfTheBeast-ko.txt | 8 +- .../pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt | 8 +- .../ru/SubClasses/PathOfTheBeast-ru.txt | 8 +- .../zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt | 8 +- 11 files changed, 71 insertions(+), 86 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index 208925df41..d2d6a0b6ff 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -683,10 +683,11 @@ private static FeatureDefinition[] BuildFeatureInfectiousFury() 256, 128)) .SetUsesFixed(ActivationTime.NoCost) .SetShowCasting(false) - .SetEffectDescription(EffectDescriptionBuilder - .Create() - .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.IndividualsUnique, 2) - .Build()) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.IndividualsUnique, 2) + .Build()) .AddToDB(); powerInfectiousFuryCompelledStrike.AddCustomSubFeatures(new CompelledStrikeHandler(conditionInfectiousFury)); @@ -696,14 +697,16 @@ private static FeatureDefinition[] BuildFeatureInfectiousFury() .SetGuiPresentation(Category.Feature, Sprites.GetSprite("PowerInfectiousFuryMindlash", Resources.PowerInfectiousFuryMindlash, 256, 128)) .SetUsesFixed(ActivationTime.NoCost) - .SetEffectDescription(EffectDescriptionBuilder - .Create() - .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.IndividualsUnique) - .SetRequiredCondition(conditionInfectiousFury) - .SetEffectForms( - EffectFormBuilder.DamageForm(DamageTypePsychic, 2, DieType.D12), - EffectFormBuilder.ConditionForm(conditionInfectiousFury, ConditionForm.ConditionOperation.Remove)) - .Build()) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetTargetingData(Side.All, RangeType.Distance, 12, TargetType.IndividualsUnique) + .SetRequiredCondition(conditionInfectiousFury) + .SetEffectForms( + EffectFormBuilder.DamageForm(DamageTypePsychic, 2, DieType.D12), + EffectFormBuilder.ConditionForm(conditionInfectiousFury, + ConditionForm.ConditionOperation.Remove)) + .Build()) .AddToDB(); powerInfectiousFury.AddCustomSubFeatures( @@ -725,46 +728,28 @@ public IEnumerator OnPhysicalAttackFinishedByMe( RollOutcome rollOutcome, int damageAmount) { - if (rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess)) - { - yield break; - } - - if (!attacker.IsMyTurn()) - { - yield break; - } - - if (defender.RulesetCharacter is not { IsDeadOrDyingOrUnconscious: false } || - defender.RulesetCharacter.HasAnyConditionOfType(condition.name) || - attacker.RulesetCharacter.GetRemainingPowerUses(powerInfectiousFury) == 0) - { - yield break; - } + var rulesetAttacker = attacker.RulesetCharacter; + var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerInfectiousFury, attacker.RulesetCharacter); - if (attackMode.SourceDefinition is not ItemDefinition item || + if (rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || + !attacker.IsMyTurn() || + rulesetAttacker.GetRemainingPowerUses(powerInfectiousFury) == 0 || + rulesetDefender is not { IsDeadOrDyingOrUnconscious: false } || + rulesetDefender.HasAnyConditionOfType(condition.name) || + attackMode.SourceDefinition is not ItemDefinition item || !item.ItemTags.Contains(TagBeastWeapon)) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationService = ServiceRepository.GetService(); - var usablePower = PowerProvider.Get(powerInfectiousFury, attacker.RulesetCharacter); - var reactionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "InfectiousFury", - RulesetEffect = - implementationService.InstantiateEffectPower(attacker.RulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = [defender], - actionModifiers = [new ActionModifier()] - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield return attacker.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender], + attacker, + "InfectiousFury", + battleManager: battleManager); } } diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt index 7e069fd09f..b51bcd4b67 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Nutze Kraft, um vorübergehend HP zu Reaction/&SpendPowerCallTheHuntReactDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Ruf zur Jagd -Reaction/&SpendPowerInfectiousFuryDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. -Reaction/&SpendPowerInfectiousFuryReactDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. -Reaction/&SpendPowerInfectiousFuryReactTitle=Ausgeben -Reaction/&SpendPowerInfectiousFuryTitle=Ansteckende Wut +Reaction/&UsePowerInfectiousFuryDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. +Reaction/&UsePowerInfectiousFuryReactDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. +Reaction/&UsePowerInfectiousFuryReactTitle=Ausgeben +Reaction/&UsePowerInfectiousFuryTitle=Ansteckende Wut Reaction/&UseBeastTailSwipeDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. Reaction/&UseBeastTailSwipeReactDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt index 2d437a7ff3..f253267d02 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Use power to gain temporary HP and gr Reaction/&SpendPowerCallTheHuntReactDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Call the Hunt -Reaction/&SpendPowerInfectiousFuryDescription=Spend power to apply Infectious Fury to target. -Reaction/&SpendPowerInfectiousFuryReactDescription=Spend power to apply Infectious Fury to target. -Reaction/&SpendPowerInfectiousFuryReactTitle=Spend -Reaction/&SpendPowerInfectiousFuryTitle=Infectious Fury +Reaction/&UsePowerInfectiousFuryDescription=Spend power to apply Infectious Fury to target. +Reaction/&UsePowerInfectiousFuryReactDescription=Spend power to apply Infectious Fury to target. +Reaction/&UsePowerInfectiousFuryReactTitle=Spend +Reaction/&UsePowerInfectiousFuryTitle=Infectious Fury Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt index c76a0a49ca..cc5d948c6b 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Usa el poder para ganar HP temporalme Reaction/&SpendPowerCallTheHuntReactDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Llama a la caza -Reaction/&SpendPowerInfectiousFuryDescription=Gasta poder para aplicar Furia infecciosa al objetivo. -Reaction/&SpendPowerInfectiousFuryReactDescription=Gasta poder para aplicar Furia infecciosa al objetivo. -Reaction/&SpendPowerInfectiousFuryReactTitle=Gastar -Reaction/&SpendPowerInfectiousFuryTitle=Furia infecciosa +Reaction/&UsePowerInfectiousFuryDescription=Gasta poder para aplicar Furia infecciosa al objetivo. +Reaction/&UsePowerInfectiousFuryReactDescription=Gasta poder para aplicar Furia infecciosa al objetivo. +Reaction/&UsePowerInfectiousFuryReactTitle=Gastar +Reaction/&UsePowerInfectiousFuryTitle=Furia infecciosa Reaction/&UseBeastTailSwipeDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. Reaction/&UseBeastTailSwipeReactDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt index 041529625d..5407fbed49 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Utilisez le pouvoir pour gagner des P Reaction/&SpendPowerCallTheHuntReactDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Appelez la chasse -Reaction/&SpendPowerInfectiousFuryDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. -Reaction/&SpendPowerInfectiousFuryReactDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. -Reaction/&SpendPowerInfectiousFuryReactTitle=Dépenser -Reaction/&SpendPowerInfectiousFuryTitle=Fureur contagieuse +Reaction/&UsePowerInfectiousFuryDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. +Reaction/&UsePowerInfectiousFuryReactDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. +Reaction/&UsePowerInfectiousFuryReactTitle=Dépenser +Reaction/&UsePowerInfectiousFuryTitle=Fureur contagieuse Reaction/&UseBeastTailSwipeDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. Reaction/&UseBeastTailSwipeReactDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt index 66705bc705..627f69b8f6 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Usa il potere per ottenere PV tempora Reaction/&SpendPowerCallTheHuntReactDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Chiama la caccia -Reaction/&SpendPowerInfectiousFuryDescription=Spendi potere per applicare Furia Infettiva al bersaglio. -Reaction/&SpendPowerInfectiousFuryReactDescription=Spendi potere per applicare Furia Infettiva al bersaglio. -Reaction/&SpendPowerInfectiousFuryReactTitle=Trascorrere -Reaction/&SpendPowerInfectiousFuryTitle=Furia infettiva +Reaction/&UsePowerInfectiousFuryDescription=Spendi potere per applicare Furia Infettiva al bersaglio. +Reaction/&UsePowerInfectiousFuryReactDescription=Spendi potere per applicare Furia Infettiva al bersaglio. +Reaction/&UsePowerInfectiousFuryReactTitle=Trascorrere +Reaction/&UsePowerInfectiousFuryTitle=Furia infettiva Reaction/&UseBeastTailSwipeDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. Reaction/&UseBeastTailSwipeReactDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt index 3abc796a1b..4733086a18 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=パワーを使用して一時的に Reaction/&SpendPowerCallTheHuntReactDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=狩りを呼び出せ -Reaction/&SpendPowerInfectiousFuryDescription=パワーを消費してターゲットに感染性の怒りを適用します。 -Reaction/&SpendPowerInfectiousFuryReactDescription=パワーを消費してターゲットに感染性の怒りを適用します。 -Reaction/&SpendPowerInfectiousFuryReactTitle=過ごす -Reaction/&SpendPowerInfectiousFuryTitle=伝染する怒り +Reaction/&UsePowerInfectiousFuryDescription=パワーを消費してターゲットに感染性の怒りを適用します。 +Reaction/&UsePowerInfectiousFuryReactDescription=パワーを消費してターゲットに感染性の怒りを適用します。 +Reaction/&UsePowerInfectiousFuryReactTitle=過ごす +Reaction/&UsePowerInfectiousFuryTitle=伝染する怒り Reaction/&UseBeastTailSwipeDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 Reaction/&UseBeastTailSwipeReactDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt index 8e57962842..bab155d70a 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=분노하는 동안 힘을 사용하 Reaction/&SpendPowerCallTheHuntReactDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=사냥에 전화하세요 -Reaction/&SpendPowerInfectiousFuryDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. -Reaction/&SpendPowerInfectiousFuryReactDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. -Reaction/&SpendPowerInfectiousFuryReactTitle=경비 -Reaction/&SpendPowerInfectiousFuryTitle=전염성 분노 +Reaction/&UsePowerInfectiousFuryDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. +Reaction/&UsePowerInfectiousFuryReactDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. +Reaction/&UsePowerInfectiousFuryReactTitle=경비 +Reaction/&UsePowerInfectiousFuryTitle=전염성 분노 Reaction/&UseBeastTailSwipeDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. Reaction/&UseBeastTailSwipeReactDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt index 4698996094..77e3d6ab73 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Use poder para ganhar HP temporário Reaction/&SpendPowerCallTheHuntReactDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. Reaction/&SpendPowerCallTheHuntReactTitle=Use Reaction/&SpendPowerCallTheHuntTitle=Chame a Caçada -Reaction/&SpendPowerInfectiousFuryDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. -Reaction/&SpendPowerInfectiousFuryReactDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. -Reaction/&SpendPowerInfectiousFuryReactTitle=Gastar -Reaction/&SpendPowerInfectiousFuryTitle=Fúria Infecciosa +Reaction/&UsePowerInfectiousFuryDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. +Reaction/&UsePowerInfectiousFuryReactDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. +Reaction/&UsePowerInfectiousFuryReactTitle=Gastar +Reaction/&UsePowerInfectiousFuryTitle=Fúria Infecciosa Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. Reaction/&UseBeastTailSwipeReactTitle=Use diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt index c3953e18b8..3aa7c33061 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=Используйте умение, Reaction/&SpendPowerCallTheHuntReactDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. Reaction/&SpendPowerCallTheHuntReactTitle=Использовать Reaction/&SpendPowerCallTheHuntTitle=Зов охоты -Reaction/&SpendPowerInfectiousFuryDescription=Используйте умение, чтобы применить к цели Заразную ярость. -Reaction/&SpendPowerInfectiousFuryReactDescription=Используйте умение, чтобы применить к цели Заразную ярость. -Reaction/&SpendPowerInfectiousFuryReactTitle=Использовать -Reaction/&SpendPowerInfectiousFuryTitle=Заразная ярость +Reaction/&UsePowerInfectiousFuryDescription=Используйте умение, чтобы применить к цели Заразную ярость. +Reaction/&UsePowerInfectiousFuryReactDescription=Используйте умение, чтобы применить к цели Заразную ярость. +Reaction/&UsePowerInfectiousFuryReactTitle=Использовать +Reaction/&UsePowerInfectiousFuryTitle=Заразная ярость Reaction/&UseBeastTailSwipeDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. Reaction/&UseBeastTailSwipeReactDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. Reaction/&UseBeastTailSwipeReactTitle=Использовать diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt index 4b747b2582..939802c974 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt @@ -48,10 +48,10 @@ Reaction/&SpendPowerCallTheHuntDescription=使用力量来获得暂时的生命 Reaction/&SpendPowerCallTheHuntReactDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 Reaction/&SpendPowerCallTheHuntReactTitle=使用 Reaction/&SpendPowerCallTheHuntTitle=狩猎呼唤 -Reaction/&SpendPowerInfectiousFuryDescription=花费力量对目标施加传染性狂怒。 -Reaction/&SpendPowerInfectiousFuryReactDescription=花费力量对目标施加传染性狂怒。 -Reaction/&SpendPowerInfectiousFuryReactTitle=花费 -Reaction/&SpendPowerInfectiousFuryTitle=传染之怒 +Reaction/&UsePowerInfectiousFuryDescription=花费力量对目标施加传染性狂怒。 +Reaction/&UsePowerInfectiousFuryReactDescription=花费力量对目标施加传染性狂怒。 +Reaction/&UsePowerInfectiousFuryReactTitle=花费 +Reaction/&UsePowerInfectiousFuryTitle=传染之怒 Reaction/&UseBeastTailSwipeDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 Reaction/&UseBeastTailSwipeReactDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 Reaction/&UseBeastTailSwipeReactTitle=使用 From e896b32f4b07564ff9cfadedf6d4776a89171a38 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:07:49 -0700 Subject: [PATCH 062/162] add GameLocationCharacterExtensions.MyReactToSpendPowerBundle --- .../GameLocationCharacterExtensions.cs | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index f7b0bfa073..de58ef5275 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -7,6 +7,7 @@ using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; +using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Validators; using TA; @@ -84,6 +85,61 @@ internal static IEnumerator MyReactToSpendPower( } } + internal static IEnumerator MyReactToSpendPowerBundle( + this GameLocationCharacter character, + RulesetUsablePower usablePower, + List targets, + GameLocationCharacter waiter, + string stringParameter, + Action reactionValidated = null, + Action reactionNotValidated = null, + GameLocationBattleManager battleManager = null) + { + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!actionManager || !battleManager) + { + yield break; + } + + var count = actionManager.PendingReactionRequestGroups.Count; + var implementationManager = + ServiceRepository.GetService() as RulesetImplementationManager; + var actionModifiers = new List(); + + for (var i = 0; i < targets.Count; i++) + { + actionModifiers.Add(new ActionModifier()); + } + + var actionParams = new CharacterActionParams(character, Id.SpendPower) + { + StringParameter = stringParameter, + ActionModifiers = actionModifiers, + RulesetEffect = + implementationManager.MyInstantiateEffectPower(character.RulesetCharacter, usablePower, false), + UsablePower = usablePower, + targetCharacters = targets, + IsReactionEffect = true + }; + var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); + + actionManager.AddInterruptRequest(reactionRequest); + + yield return battleManager.WaitForReactions(waiter, actionManager, count); + + if (actionParams.ReactionValidated) + { + reactionValidated?.Invoke(reactionRequest); + } + else + { + reactionNotValidated?.Invoke(reactionRequest); + } + } + internal static IEnumerator MyReactToUsePower( this GameLocationCharacter character, Id actionId, From 55c15cc499778c83268437d7d963d8394608b7a6 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:09:55 -0700 Subject: [PATCH 063/162] change Sorcerous Wild Magic to use MyReactToSpendPowerBundle --- .../Subclasses/SorcerousWildMagic.cs | 59 +++++++------------ 1 file changed, 21 insertions(+), 38 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index 7e6d64a6b7..325945ffd3 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -406,16 +406,9 @@ private static IEnumerator HandleWildSurge(GameLocationCharacter attacker, bool private static IEnumerator HandleControlledChaos(GameLocationCharacter attacker, bool avoidOnes = false) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } + var threshold = avoidOnes ? 2 : 1; var wildSurgeDie1 = 0; - var threshold = avoidOnes ? 2 : 1; while (wildSurgeDie1 < threshold) { @@ -456,47 +449,37 @@ private static IEnumerator HandleControlledChaos(GameLocationCharacter attacker, rulesetAttacker.UsablePowers.Add(usablePowerFirst); rulesetAttacker.UsablePowers.Add(usablePowerSecond); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "ControlledChaos", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePowerPool, false), - UsablePower = usablePowerPool, - TargetCharacters = { attacker } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return attacker.MyReactToSpendPowerBundle( + usablePowerPool, + [attacker], + attacker, + "ControlledChaos", + ReactionValidated, + ReactionNotValidated); rulesetAttacker.UsablePowers.Remove(usablePowerFirst); rulesetAttacker.UsablePowers.Remove(usablePowerSecond); - int selectedRoll; - FeatureDefinitionPower selectedPower; + yield break; - if (reactionRequest.Validated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - selectedPower = WildSurgePowers.ElementAt(reactionRequest.SelectedSubOption); - selectedRoll = reactionRequest.SelectedSubOption + 1; + var selectedRoll = reactionRequest.SelectedSubOption + 1; + var selectedPower = WildSurgePowers.ElementAt(reactionRequest.SelectedSubOption); + + ApplyWildSurge( + attacker, selectedRoll, PowerControlledChaos, selectedPower, "Feedback/&ControlledChaosDieChoice"); } - else + + void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) { var choiceRoll = RollDie(DieType.D2, AdvantageType.None, out _, out _); - var choice = choiceRoll == 1 ? wildSurgeDie1 : wildSurgeDie2; + var selectedRoll = choiceRoll == 1 ? wildSurgeDie1 : wildSurgeDie2; + var selectedPower = WildSurgePowers.ElementAt(selectedRoll - 1); - selectedPower = WildSurgePowers.ElementAt(choice - 1); - selectedRoll = choice; + ApplyWildSurge( + attacker, selectedRoll, PowerControlledChaos, selectedPower, "Feedback/&ControlledChaosDieChoice"); } - - ApplyWildSurge( - attacker, selectedRoll, PowerControlledChaos, selectedPower, "Feedback/&ControlledChaosDieChoice"); } // From 6efe5fddb7e5cd3cffdfd0684602a8636a87f7d0 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:11:04 -0700 Subject: [PATCH 064/162] change Ranger Fey Wanderer beguiling twist to use MyReactToSpendPowerBundle --- .../Subclasses/RangerFeyWanderer.cs | 36 ++++++------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs b/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs index 45a8cd539d..0f1da2ce0c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerFeyWanderer.cs @@ -294,10 +294,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - !action.RolledSaveThrow || + if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Success || !HasCharmedOrFrightened( action.ActionParams.activeEffect?.EffectDescription.EffectForms ?? @@ -312,33 +309,22 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( } var rulesetHelper = helper.RulesetCharacter; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerBeguilingTwist, rulesetHelper); - var actionParams = new CharacterActionParams(helper, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { actionModifier }, - StringParameter = powerBeguilingTwist.Name, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToSpendPowerBundle( + usablePower, + [attacker], + attacker, + powerBeguilingTwist.Name, + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionRequest.Validated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; + attacker.SpendActionType(ActionDefinitions.ActionType.Reaction); } - - helper.SpendActionType(ActionDefinitions.ActionType.Reaction); } private static bool HasCharmedOrFrightened(List effectForms) From d012c511418a63ce6af8b534b14db2b6bd3d32c3 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:11:46 -0700 Subject: [PATCH 065/162] change Martial Force Knight psionic adept to use MyReactToSpendPowerBundle --- .../Subclasses/MartialForceKnight.cs | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs index 9dac5dc88a..fc36e21dda 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs @@ -653,12 +653,10 @@ public IEnumerator OnPhysicalAttackFinishedByMe( RollOutcome rollOutcome, int damageAmount) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; var rulesetAttacker = attacker.RulesetCharacter; var levels = rulesetAttacker.GetClassLevel(CharacterClassDefinitions.Fighter); - if (!actionManager || - !attacker.UsedSpecialFeatures.TryGetValue(powerPsionicAdept.Name, out var value) || value == 0 || + if (!attacker.UsedSpecialFeatures.TryGetValue(powerPsionicAdept.Name, out var value) || value == 0 || defender.RulesetActor is not { IsDeadOrDyingOrUnconscious: false } || levels < 7) { @@ -667,26 +665,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( attacker.UsedSpecialFeatures[powerPsionicAdept.Name] = 0; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPsionicAdept, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - StringParameter = "PsionicAdept", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + "PsionicAdept", + battleManager: battleManager); } } From 8c053c2fca9c401670bcc8697f4983d9c3265226 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:13:57 -0700 Subject: [PATCH 066/162] change Martial Arcane Archer arcane shot to use MyReactToSpendPowerBundle --- .../Subclasses/MartialArcaneArcher.cs | 60 ++++++------------- 1 file changed, 19 insertions(+), 41 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs index 06d1460ff8..559b7c28f4 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs @@ -619,52 +619,30 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( yield break; } - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = - new CharacterActionParams(GameLocationCharacter.GetFromActor(rulesetAttacker), - ActionDefinitions.Id.SpendPower) - { - ActionModifiers = { new ActionModifier() }, - StringParameter = "ArcaneShot", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + "ArcaneShot", + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - attacker.UsedSpecialFeatures.TryAdd(powerBurstingArrow.Name, 0); - attacker.UsedSpecialFeatures[powerBurstingArrow.Name] = -1; + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; - } - - attacker.UsedSpecialFeatures.TryAdd(ArcaneShotMarker, 1); + attacker.UsedSpecialFeatures.TryAdd(powerBurstingArrow.Name, 0); + attacker.UsedSpecialFeatures[powerBurstingArrow.Name] = -1; + attacker.UsedSpecialFeatures.TryAdd(ArcaneShotMarker, 1); - var option = reactionRequest.SelectedSubOption; - var subPowers = PowerArcaneShot.GetBundle()?.SubPowers; + var option = reactionRequest.SelectedSubOption; + var subPowers = PowerArcaneShot.GetBundle()?.SubPowers; - if (subPowers != null && - subPowers[option] == powerBurstingArrow) - { - attacker.UsedSpecialFeatures[powerBurstingArrow.Name] = 0; + if (subPowers != null && + subPowers[option] == powerBurstingArrow) + { + attacker.UsedSpecialFeatures[powerBurstingArrow.Name] = 0; + } } } From 322154e5b310a88ac93979b3a9e47badad3a8e74 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:15:00 -0700 Subject: [PATCH 067/162] change College of Swords flourish to use MyReactToSpendPowerBundle --- .../Subclasses/CollegeOfAudacity.cs | 93 ++++++++----------- 1 file changed, 39 insertions(+), 54 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index c28923f90f..e78898f3de 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -331,87 +331,72 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( bool firstTarget, bool criticalHit) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerAudaciousWhirl, rulesetAttacker); var isAudaciousWhirl = rulesetAttacker.IsToggleEnabled(AudaciousWhirlToggle); var hasAvailablePowerUses = rulesetAttacker.GetRemainingUsesOfPower(usablePower) > 0; var isMasterfulWhirl = rulesetAttacker.IsToggleEnabled(MasterfulWhirlToggle); - if (!actionManager || - !attacker.OnceInMyTurnIsValid(WhirlMarker) || + if (!attacker.OnceInMyTurnIsValid(WhirlMarker) || !ValidatorsWeapon.IsMelee(attackMode) || !((isAudaciousWhirl && hasAvailablePowerUses) || isMasterfulWhirl)) { yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = - new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - ActionModifiers = { new ActionModifier() }, - StringParameter = powerAudaciousWhirl.Name, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); + attacker.UsedSpecialFeatures.TryAdd(WhirlSelectedPower, -1); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + powerAudaciousWhirl.Name, + ReactionValidated, + battleManager: battleManager); - attacker.UsedSpecialFeatures.TryAdd(WhirlSelectedPower, -1); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; - } + attacker.UsedSpecialFeatures[WhirlSelectedPower] = reactionRequest.SelectedSubOption; + attacker.UsedSpecialFeatures.TryAdd(WhirlMarker, 1); - attacker.UsedSpecialFeatures[WhirlSelectedPower] = reactionRequest.SelectedSubOption; - attacker.UsedSpecialFeatures.TryAdd(WhirlMarker, 1); + var firstDamageForm = + actualEffectForms.FirstOrDefault(x => x.FormType == EffectForm.EffectFormType.Damage); - var firstDamageForm = actualEffectForms.FirstOrDefault(x => x.FormType == EffectForm.EffectFormType.Damage); + if (firstDamageForm != null) + { + var damageType = firstDamageForm.DamageForm.DamageType; + var effectDamageForm = EffectFormBuilder.DamageForm(damageType, 1, DieType.D6); - if (firstDamageForm != null) - { - var damageType = firstDamageForm.DamageForm.DamageType; - var effectDamageForm = EffectFormBuilder.DamageForm(damageType, 1, DieType.D6); + effectDamageForm.DamageForm.OverrideWithBardicInspirationDie = !isMasterfulWhirl; - effectDamageForm.DamageForm.OverrideWithBardicInspirationDie = !isMasterfulWhirl; + if (reactionRequest.SelectedSubOption == 0) + { + effectDamageForm.DamageForm.AncestryType = + (AncestryType)ExtraAncestryType.CollegeOfAudacityDefensiveWhirl; + } - if (reactionRequest.SelectedSubOption == 0) - { - effectDamageForm.DamageForm.AncestryType = - (AncestryType)ExtraAncestryType.CollegeOfAudacityDefensiveWhirl; - } + var index = actualEffectForms.IndexOf(firstDamageForm); - var index = actualEffectForms.IndexOf(firstDamageForm); + actualEffectForms.Insert(index + 1, effectDamageForm); - actualEffectForms.Insert(index + 1, effectDamageForm); + var damageTypes = DatabaseRepository.GetDatabase().ToList(); + var damageTypeDefinition = damageTypes.FirstOrDefault(x => x.Name == damageType); + var damageIndex = damageTypes.IndexOf(damageTypeDefinition); - var damageTypes = DatabaseRepository.GetDatabase().ToList(); - var damageTypeDefinition = damageTypes.FirstOrDefault(x => x.Name == damageType); - var damageIndex = damageTypes.IndexOf(damageTypeDefinition); + attacker.UsedSpecialFeatures.TryAdd(WhirlDamageType, damageIndex); + } - attacker.UsedSpecialFeatures.TryAdd(WhirlDamageType, damageIndex); - } + if (isMasterfulWhirl) + { + return; + } - if (isMasterfulWhirl) - { - yield break; + rulesetAttacker.UsedBardicInspiration++; + rulesetAttacker.BardicInspirationAltered?.Invoke( + rulesetAttacker, rulesetAttacker.RemainingBardicInspirations); } - - rulesetAttacker.UsedBardicInspiration++; - rulesetAttacker.BardicInspirationAltered?.Invoke( - rulesetAttacker, rulesetAttacker.RemainingBardicInspirations); } public IEnumerator OnPhysicalAttackFinishedByMe( From 0f7e65c1753a91f4306c3b31c4e82a8b29936882 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:16:15 -0700 Subject: [PATCH 068/162] change Barbarian Brutal Strike and Rogue Cunning Strike to use MyReactToSpendPowerBundle --- .../Models/CharacterUAContext.cs | 166 +++++++----------- 1 file changed, 65 insertions(+), 101 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index aebb9fcca1..2c6f868e62 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -328,13 +328,6 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( bool firstTarget, bool criticalHit) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var rulesetAttacker = attacker.RulesetCharacter; if (!attacker.OnceInMyTurnIsValid(BrutalStrike) || @@ -359,58 +352,47 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( 0, 0); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerBarbarianBrutalStrike, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { actionModifier }, - StringParameter = powerBarbarianBrutalStrike.Name, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + powerBarbarianBrutalStrike.Name, + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; - } + // determine selected power to collect cost + var option = reactionRequest.SelectedSubOption; + var subPowers = powerBarbarianBrutalStrike.GetBundle()?.SubPowers; - // determine selected power to collect cost - var option = reactionRequest.SelectedSubOption; - var subPowers = powerBarbarianBrutalStrike.GetBundle()?.SubPowers; - - if (subPowers == null) - { - yield break; - } + if (subPowers == null) + { + return; + } - var selectedPower = subPowers[option]; + var selectedPower = subPowers[option]; - switch (selectedPower.Name) - { - case $"Power{BrutalStrike}ForcefulBlow": - actualEffectForms.Add(ForcefulBlowForm); - break; - case $"Power{BrutalStrike}HamstringBlow": - InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionHamstringBlow.Name); - break; - case $"Power{BrutalStrike}StaggeringBlow": - InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionStaggeringBlow.Name); - InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionStaggeringBlowAoO.Name); - break; - case $"Power{BrutalStrike}SunderingBlow": - InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionSunderingBlow.Name); - break; + switch (selectedPower.Name) + { + case $"Power{BrutalStrike}ForcefulBlow": + actualEffectForms.Add(ForcefulBlowForm); + break; + case $"Power{BrutalStrike}HamstringBlow": + InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionHamstringBlow.Name); + break; + case $"Power{BrutalStrike}StaggeringBlow": + InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionStaggeringBlow.Name); + InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionStaggeringBlowAoO.Name); + break; + case $"Power{BrutalStrike}SunderingBlow": + InflictCondition(rulesetAttacker, defender.RulesetCharacter, _conditionSunderingBlow.Name); + break; + } } } @@ -1527,64 +1509,46 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( yield break; } - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerRogueCunningStrike, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { actionModifier }, - StringParameter = powerRogueCunningStrike.Name, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + powerRogueCunningStrike.Name, + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; - } + // determine selected power to collect cost + var option = reactionRequest.SelectedSubOption; + var subPowers = powerRogueCunningStrike.GetBundle()?.SubPowers; - // determine selected power to collect cost - var option = reactionRequest.SelectedSubOption; - var subPowers = powerRogueCunningStrike.GetBundle()?.SubPowers; + if (subPowers == null) + { + return; + } - if (subPowers == null) - { - yield break; + _selectedPower = subPowers[option]; + + // inflict condition passing power cost on amount to be deducted later on from sneak dice + rulesetAttacker.InflictCondition( + ConditionReduceSneakDice.Name, + DurationType.Round, + 0, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetAttacker.guid, + rulesetAttacker.CurrentFaction.Name, + 1, + ConditionReduceSneakDice.Name, + _selectedPower.CostPerUse, + 0, + 0); } - - _selectedPower = subPowers[option]; - - // inflict condition passing power cost on amount to be deducted later on from sneak dice - rulesetAttacker.InflictCondition( - ConditionReduceSneakDice.Name, - DurationType.Round, - 0, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, - 1, - ConditionReduceSneakDice.Name, - _selectedPower.CostPerUse, - 0, - 0); } // handle Knock Out exception which should apply condition after attack From d9fd12f8f5431151554482904bea70c2cf4813ad Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:16:49 -0700 Subject: [PATCH 069/162] change Charger feat to use MyReactToSpendPowerBundle --- .../Feats/MeleeCombatFeats.cs | 56 ++++++------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index 536591ad7c..8fb2ae2869 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -600,18 +600,9 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( bool firstTarget, bool criticalHit) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var rulesetAttacker = attacker.RulesetCharacter; - var attackerPosition = attacker.LocationPosition; var defenderPosition = defender.LocationPosition; - var attackDirectionX = Math.Sign(attackerPosition.x - defenderPosition.x); var attackDirectionY = Math.Sign(attackerPosition.y - defenderPosition.y); var attackDirectionZ = Math.Sign(attackerPosition.z - defenderPosition.z); @@ -629,42 +620,31 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPool, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { actionModifier }, - StringParameter = powerPool.Name, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + powerPool.Name, + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - yield break; - } + attacker.UsedSpecialFeatures.TryAdd(powerPool.Name, 0); - attacker.UsedSpecialFeatures.TryAdd(powerPool.Name, 0); + // add the shove form direct to the attack + var option = reactionRequest.SelectedSubOption; + var subPowers = powerPool.GetBundle()?.SubPowers; - // add the shove form direct to the attack - var option = reactionRequest.SelectedSubOption; - var subPowers = powerPool.GetBundle()?.SubPowers; - - if (subPowers != null && - subPowers[option].Name == "PowerFeatChargerShove") - { - actualEffectForms.Add(ShoveForm); + if (subPowers != null && + subPowers[option].Name == "PowerFeatChargerShove") + { + actualEffectForms.Add(ShoveForm); + } } } From 687bee386d24260680814a9c1dced6e367d78aba Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:17:40 -0700 Subject: [PATCH 070/162] change Transmuted metamagic to use MyReactToSpendPowerBundle --- .../Subclasses/Builders/MetamagicBuilders.cs | 88 ++++++++----------- 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs index a39842f2fa..da2f10a169 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs @@ -379,68 +379,56 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( yield break; } - if (!rulesetAttacker.HasConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, condition.Name)) + if (rulesetAttacker.HasConditionOfCategoryAndType(AttributeDefinitions.TagEffect, condition.Name)) { - rulesetAttacker.InflictCondition( - condition.Name, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - rulesetAttacker.guid, - rulesetAttacker.CurrentFaction.Name, - 1, - condition.Name, - 0, - 0, - 0); - - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = MetamagicTransmuted, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); + yield break; + } - actionManager.AddInterruptRequest(reactionRequest); + rulesetAttacker.InflictCondition( + condition.Name, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + rulesetAttacker.guid, + rulesetAttacker.CurrentFaction.Name, + 1, + condition.Name, + 0, + 0, + 0); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + var usablePower = PowerProvider.Get(powerPool, rulesetAttacker); - if (!actionParams.ReactionValidated) - { - rulesetAttacker.SpendSorceryPoints(-1); + yield return attacker.MyReactToSpendPowerBundle( + usablePower, + [defender], + attacker, + MetamagicTransmuted, + ReactionValidated, + ReactionNotValidated, + battleManager); - yield break; - } + yield break; + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) + { var option = reactionRequest.SelectedSubOption; _newDamageType = TransmutedDamageTypes[option]; + + foreach (var effectForm in actualEffectForms + .Where(x => + x.FormType == EffectForm.EffectFormType.Damage && + TransmutedDamageTypes.Contains(x.DamageForm.DamageType))) + { + effectForm.DamageForm.damageType = _newDamageType; + } } - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - TransmutedDamageTypes.Contains(x.DamageForm.DamageType))) + void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) { - effectForm.DamageForm.damageType = _newDamageType; + rulesetAttacker.SpendSorceryPoints(-1); } } } From c840e624e8ad13b62b0657d54778717f500ff5e6 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:18:18 -0700 Subject: [PATCH 071/162] change Path of the Beast form of the beast to use MyReactToSpendPowerBundle --- .../Subclasses/PathOfTheBeast.cs | 33 +++---------------- 1 file changed, 5 insertions(+), 28 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index d2d6a0b6ff..dc6e3432da 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -221,38 +221,15 @@ public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) yield break; } - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var character = characterAction.ActingCharacter; var rulesetCharacter = character.RulesetCharacter; var usablePower = PowerProvider.Get(powerPool, rulesetCharacter); - var actionParams = - new CharacterActionParams(GameLocationCharacter.GetFromActor(rulesetCharacter), - ActionDefinitions.Id.SpendPower) - { - StringParameter = "FormOfTheBeast", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = [character] - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(character, actionManager, count); + yield return character.MyReactToSpendPowerBundle( + usablePower, + [character], + character, + "FormOfTheBeast"); } } From 09f97cbba3b8f53b665299b027600945c9991ab8 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:18:53 -0700 Subject: [PATCH 072/162] change Borrowed Knowledge spell to use MyReactToSpendPowerBundle --- .../Spells/SpellBuildersLevel02.cs | 54 +++++++------------ 1 file changed, 20 insertions(+), 34 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs index 737fa11fda..4b99934616 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs @@ -630,11 +630,7 @@ private sealed class PowerOrSpellFinishedByMeBorrowedKnowledge( { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager || action.Countered) + if (action.Countered) { yield break; } @@ -679,45 +675,35 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, rulesetCharacter.UsablePowers.Add(up); } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPool, rulesetCharacter); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.SpendPower) - { - StringParameter = "BorrowedKnowledge", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { actingCharacter } - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(actingCharacter, actionManager, count); rulesetCharacter.UsablePowers.Remove(usablePower); usablePowers.ForEach(x => rulesetCharacter.UsablePowers.Remove(x)); - if (!actionParams.ReactionValidated) - { - yield break; - } + yield return actingCharacter.MyReactToSpendPowerBundle( + usablePower, + [actingCharacter], + actingCharacter, + "BorrowedKnowledge", + ReactionValidated); - var selectedPower = powers[reactionRequest.SelectedSubOption]; + yield break; - foreach (var skill in skillsDb) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - var conditionName = $"ConditionBorrowedKnowledge{skill.Name}"; + var selectedPower = powers[reactionRequest.SelectedSubOption]; - if (rulesetCharacter.TryGetConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && - activeCondition.SourceGuid == actingCharacter.Guid && - !selectedPower.Name.Contains(skill.Name)) + foreach (var skill in skillsDb) { - rulesetCharacter.RemoveCondition(activeCondition); + var conditionName = $"ConditionBorrowedKnowledge{skill.Name}"; + + if (rulesetCharacter.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && + activeCondition.SourceGuid == actingCharacter.Guid && + !selectedPower.Name.Contains(skill.Name)) + { + rulesetCharacter.RemoveCondition(activeCondition); + } } } } From 12407041a0d20ff5617fcf4446114aa67764ea91 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:19:21 -0700 Subject: [PATCH 073/162] change Empowered Knowledge spell to use MyReactToSpendPowerBundle --- .../Spells/SpellBuildersLevel05.cs | 67 ++++++++----------- 1 file changed, 27 insertions(+), 40 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs index c625775ba6..e8587bde16 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel05.cs @@ -567,11 +567,7 @@ private sealed class PowerOrSpellFinishedByMeEmpoweredKnowledge( { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager || action.Countered) + if (action.Countered) { yield break; } @@ -622,53 +618,44 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, rulesetCharacter.UsablePowers.Add(up); } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPool, rulesetCharacter); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.SpendPower) - { - StringParameter = "EmpoweredKnowledge", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { target } - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(actingCharacter, actionManager, count); rulesetCharacter.UsablePowers.Remove(usablePower); usablePowers.ForEach(x => rulesetCharacter.UsablePowers.Remove(x)); - if (!actionParams.ReactionValidated) - { - yield break; - } + yield return actingCharacter.MyReactToSpendPowerBundle( + usablePower, + [target], + actingCharacter, + "EmpoweredKnowledge", + ReactionValidated); - var selectedPower = powers[reactionRequest.SelectedSubOption]; - var locationCharacterService = ServiceRepository.GetService(); - var contenders = - locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters) - .ToList(); + yield break; - foreach (var contender in contenders) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - var rulesetContender = contender.RulesetCharacter; + var selectedPower = powers[reactionRequest.SelectedSubOption]; + var locationCharacterService = ServiceRepository.GetService(); + var contenders = + locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters) + .ToList(); - foreach (var skill in skillsDb) + foreach (var contender in contenders) { - var conditionName = $"ConditionEmpoweredKnowledge{skill.Name}"; + var rulesetContender = contender.RulesetCharacter; - if (rulesetContender.TryGetConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && - activeCondition.SourceGuid == rulesetCharacter.Guid && - (activeCondition.TargetGuid != rulesetTarget.Guid || !selectedPower.Name.Contains(skill.Name))) + foreach (var skill in skillsDb) { - rulesetContender.RemoveCondition(activeCondition); + var conditionName = $"ConditionEmpoweredKnowledge{skill.Name}"; + + if (rulesetContender.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, conditionName, out var activeCondition) && + activeCondition.SourceGuid == rulesetCharacter.Guid && + (activeCondition.TargetGuid != rulesetTarget.Guid || + !selectedPower.Name.Contains(skill.Name))) + { + rulesetContender.RemoveCondition(activeCondition); + } } } } From eab69ae24e8ef2d8de8dfe86a6c1272e05f257a8 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:20:05 -0700 Subject: [PATCH 074/162] remove superfluous yield return null --- SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 07e88a1fe6..70cba9c287 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -959,8 +959,6 @@ private IEnumerator HandleControlledSurge(GameLocationCharacter character, List< { result[0] = firstRoll; } - - yield return null; } private void RemoveExistingWildSurgeCondition(RulesetCharacter character) From f4eeb7bcd473cfc587bf3eb96e19dfcfb29ef8ef Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 14:25:11 -0700 Subject: [PATCH 075/162] change Chaos Bolt spell to use MyReactToSpendPowerBundle --- .../Spells/SpellBuildersLevel01.cs | 78 ++++++++----------- 1 file changed, 32 insertions(+), 46 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 233c22e745..04658dc63c 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -1069,14 +1069,6 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( (ConsoleStyleDuplet.ParameterType.Positive, secondRoll.ToString()) ]); - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var usablePowerPool = PowerProvider.Get(powerPool, rulesetAttacker); var usablePowerFirst = PowerProvider.Get(powers[firstRoll - 1], rulesetAttacker); var usablePowerSecond = PowerProvider.Get(powers[secondRoll - 1], rulesetAttacker); @@ -1085,41 +1077,39 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( rulesetAttacker.UsablePowers.Add(usablePowerFirst); rulesetAttacker.UsablePowers.Add(usablePowerSecond); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - StringParameter = "ChaosBolt", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return attacker.MyReactToSpendPowerBundle( + usablePowerPool, + [defender], + attacker, + "ChaosBolt", + ReactionValidated, + ReactionNotValidated, + battleManager); rulesetAttacker.UsablePowers.Remove(usablePowerPool); rulesetAttacker.UsablePowers.Remove(usablePowerFirst); rulesetAttacker.UsablePowers.Remove(usablePowerSecond); - string damageType; - IMagicEffect effect; - - if (!reactionRequest.Validated) + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { - var choiceRoll = RollDie(DieType.D2, AdvantageType.None, out _, out _); + var (damageType, effect) = ChaosBoltDamagesAndEffects.ElementAt(reactionRequest.SelectedSubOption); - var option = choiceRoll == 1 ? firstRoll : secondRoll; + MagicEffect.Add((defender, effect)); - (damageType, effect) = ChaosBoltDamagesAndEffects.ElementAt(option - 1); + foreach (var effectForm in actualEffectForms + .Where(x => + x.FormType == EffectForm.EffectFormType.Damage && + x.DamageForm.DamageType == DamageTypeBludgeoning)) + { + effectForm.DamageForm.DamageType = damageType; + } + } + void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) + { + var choiceRoll = RollDie(DieType.D2, AdvantageType.None, out _, out _); + var option = choiceRoll == 1 ? firstRoll : secondRoll; + var (damageType, effect) = ChaosBoltDamagesAndEffects.ElementAt(option - 1); var damageTitle = Gui.Localize($"Tooltip/&Tag{damageType}Title"); rulesetAttacker.LogCharacterActivatesAbility( @@ -1128,20 +1118,16 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( [ (ConsoleStyleDuplet.ParameterType.Base, damageTitle) ]); - } - else - { - (damageType, effect) = ChaosBoltDamagesAndEffects.ElementAt(reactionRequest.SelectedSubOption); - } - MagicEffect.Add((defender, effect)); + MagicEffect.Add((defender, effect)); - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - x.DamageForm.DamageType == DamageTypeBludgeoning)) - { - effectForm.DamageForm.DamageType = damageType; + foreach (var effectForm in actualEffectForms + .Where(x => + x.FormType == EffectForm.EffectFormType.Damage && + x.DamageForm.DamageType == DamageTypeBludgeoning)) + { + effectForm.DamageForm.DamageType = damageType; + } } } } From b135166e811168668e2726fef8ec406ee36e921f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 15:14:02 -0700 Subject: [PATCH 076/162] change Circle of the Cosmos weal and woe to use MyReactToSpendPower --- .../Subclasses/CircleOfTheCosmos.cs | 443 ++++++++---------- 1 file changed, 193 insertions(+), 250 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs index 1987264706..65296df205 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs @@ -799,10 +799,11 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (action.AttackRollOutcome != RollOutcome.Failure || action.AttackSuccessDelta + MaxDieTypeValue < 0 || - rulesetHelper.GetRemainingPowerUses(powerWeal) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || !helper.CanReact() || attacker.IsOppositeSide(helper.Side) || !helper.IsWithinRange(attacker, 6) || @@ -811,56 +812,45 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WealCosmosOmenAttack", - StringParameter2 = "SpendPowerWealCosmosOmenAttackDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "WealCosmosOmenAttack", + "SpendPowerWealCosmosOmenAttackDescription".Formatted( Category.Reaction, attacker.Name, defender.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + + attackModifier.AttacktoHitTrends.Add( + new TrendInfo(dieRoll, FeatureSourceType.Power, powerWeal.Name, powerWeal) + { + dieType = DieType, dieFlag = TrendInfoDieFlag.None + }); - var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + action.AttackSuccessDelta += dieRoll; + attackModifier.AttackRollModifier += dieRoll; - attackModifier.AttacktoHitTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerWeal.Name, powerWeal) + if (action.AttackSuccessDelta >= 0) { - dieType = DieType, dieFlag = TrendInfoDieFlag.None - }); + action.AttackRollOutcome = RollOutcome.Success; + } - action.AttackSuccessDelta += dieRoll; - attackModifier.AttackRollModifier += dieRoll; + var rulesetCharacter = helper.RulesetCharacter; - if (action.AttackSuccessDelta >= 0) - { - action.AttackRollOutcome = RollOutcome.Success; + rulesetCharacter.LogCharacterUsedPower( + powerWeal, + "Feedback/&CosmosOmenAttackToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()) + ]); } - - var rulesetCharacter = helper.RulesetCharacter; - - rulesetCharacter.LogCharacterUsedPower( - powerWeal, - "Feedback/&CosmosOmenAttackToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()) - ]); } public IEnumerator OnTryAlterAttributeCheck( @@ -871,11 +861,12 @@ public IEnumerator OnTryAlterAttributeCheck( ActionModifier abilityCheckModifier) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (abilityCheckData.AbilityCheckRoll == 0 || abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure || abilityCheckData.AbilityCheckSuccessDelta + MaxDieTypeValue < 0 || - rulesetHelper.GetRemainingPowerUses(powerWeal) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || !helper.CanReact() || defender.IsOppositeSide(helper.Side) || !helper.IsWithinRange(defender, 6) || @@ -884,56 +875,45 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WealCosmosOmenCheck", - StringParameter2 = "SpendPowerWealCosmosOmenCheckDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + defender, + "WealCosmosOmenCheck", + "SpendPowerWealCosmosOmenCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(defender, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + abilityCheckData.AbilityCheckRoll += dieRoll; + abilityCheckData.AbilityCheckSuccessDelta += dieRoll; - abilityCheckData.AbilityCheckRoll += dieRoll; - abilityCheckData.AbilityCheckSuccessDelta += dieRoll; + (ConsoleStyleDuplet.ParameterType, string) extra; - (ConsoleStyleDuplet.ParameterType, string) extra; + if (abilityCheckData.AbilityCheckSuccessDelta >= 0) + { + abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Success; + extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + } + else + { + extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + } - if (abilityCheckData.AbilityCheckSuccessDelta >= 0) - { - abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Success; - extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); - } - else - { - extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + helper.RulesetCharacter.LogCharacterUsedPower( + powerWeal, + "Feedback/&CosmosOmenCheckToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + extra + ]); } - - helper.RulesetCharacter.LogCharacterUsedPower( - powerWeal, - "Feedback/&CosmosOmenCheckToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - extra - ]); } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -947,6 +927,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasBorrowedLuck) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || @@ -955,61 +936,50 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( helper.IsOppositeSide(defender.Side) || !helper.IsWithinRange(defender, 6) || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(powerWeal) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WealCosmosOmenSaving", - StringParameter2 = "SpendPowerWealCosmosOmenSavingDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "WealCosmosOmenSaving", + "SpendPowerWealCosmosOmenSavingDescription".Formatted( Category.Reaction, defender.Name, attacker.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; + ReactionValidated, + battleManager); - actionService.ReactToSpendPower(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + action.RolledSaveThrow = true; + action.SaveOutcomeDelta += dieRoll; - action.RolledSaveThrow = true; - action.SaveOutcomeDelta += dieRoll; + (ConsoleStyleDuplet.ParameterType, string) extra; - (ConsoleStyleDuplet.ParameterType, string) extra; + if (action.SaveOutcomeDelta >= 0) + { + action.SaveOutcome = RollOutcome.Success; + extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + } + else + { + extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + } - if (action.SaveOutcomeDelta >= 0) - { - action.SaveOutcome = RollOutcome.Success; - extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + helper.RulesetCharacter.LogCharacterUsedPower( + powerWeal, + "Feedback/&CosmosOmenSavingToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + extra + ]); } - else - { - extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); - } - - helper.RulesetCharacter.LogCharacterUsedPower( - powerWeal, - "Feedback/&CosmosOmenSavingToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - extra - ]); } } @@ -1038,6 +1008,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetEffect rulesetEffect) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (action.AttackRollOutcome != RollOutcome.Success || action.AttackSuccessDelta - MaxDieTypeValue >= 0 || @@ -1045,61 +1016,51 @@ public IEnumerator OnTryAlterOutcomeAttack( !helper.IsOppositeSide(attacker.Side) || !helper.IsWithinRange(attacker, 6) || !helper.CanPerceiveTarget(attacker) || - rulesetHelper.GetRemainingPowerUses(powerWoe) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WoeCosmosOmenAttack", - StringParameter2 = "SpendPowerWoeCosmosOmenAttackDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "WoeCosmosOmenAttack", + "SpendPowerWoeCosmosOmenAttackDescription".Formatted( Category.Reaction, attacker.Name, defender.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = + -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + + attackModifier.AttacktoHitTrends.Add( + new TrendInfo(dieRoll, FeatureSourceType.Power, powerWoe.Name, powerWoe) + { + dieType = DieType, dieFlag = TrendInfoDieFlag.None + }); - var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + action.AttackSuccessDelta += dieRoll; + attackModifier.AttackRollModifier += dieRoll; - attackModifier.AttacktoHitTrends.Add( - new TrendInfo(dieRoll, FeatureSourceType.Power, powerWoe.Name, powerWoe) + if (action.AttackSuccessDelta < 0) { - dieType = DieType, dieFlag = TrendInfoDieFlag.None - }); + action.AttackRollOutcome = RollOutcome.Failure; + } - action.AttackSuccessDelta += dieRoll; - attackModifier.AttackRollModifier += dieRoll; + var rulesetCharacter = helper.RulesetCharacter; - if (action.AttackSuccessDelta < 0) - { - action.AttackRollOutcome = RollOutcome.Failure; + rulesetCharacter.LogCharacterUsedPower( + powerWoe, + "Feedback/&CosmosOmenAttackToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) + ]); } - - var rulesetCharacter = helper.RulesetCharacter; - - rulesetCharacter.LogCharacterUsedPower( - powerWoe, - "Feedback/&CosmosOmenAttackToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()) - ]); } public IEnumerator OnTryAlterAttributeCheck( @@ -1110,6 +1071,7 @@ public IEnumerator OnTryAlterAttributeCheck( ActionModifier abilityCheckModifier) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (abilityCheckData.AbilityCheckRoll == 0 || abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Success || @@ -1118,61 +1080,51 @@ public IEnumerator OnTryAlterAttributeCheck( !helper.IsOppositeSide(defender.Side) || !helper.IsWithinRange(defender, 6) || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(powerWoe) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WoeCosmosOmenCheck", - StringParameter2 = "SpendPowerWoeCosmosOmenCheckDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + defender, + "WoeCosmosOmenCheck", + "SpendPowerWoeCosmosOmenCheckDescription".Formatted( Category.Reaction, defender.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendPower(reactionParams); + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(defender, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = + -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + abilityCheckData.AbilityCheckRoll += dieRoll; + abilityCheckData.AbilityCheckSuccessDelta += dieRoll; - abilityCheckData.AbilityCheckRoll += dieRoll; - abilityCheckData.AbilityCheckSuccessDelta += dieRoll; + (ConsoleStyleDuplet.ParameterType, string) extra; - (ConsoleStyleDuplet.ParameterType, string) extra; + if (abilityCheckData.AbilityCheckSuccessDelta < 0) + { + abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Failure; + extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + } + else + { + extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + } - if (abilityCheckData.AbilityCheckSuccessDelta < 0) - { - abilityCheckData.AbilityCheckRollOutcome = RollOutcome.Failure; - extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); - } - else - { - extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + helper.RulesetCharacter.LogCharacterUsedPower( + powerWoe, + "Feedback/&CosmosOmenCheckToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + extra + ]); } - - helper.RulesetCharacter.LogCharacterUsedPower( - powerWoe, - "Feedback/&CosmosOmenCheckToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - extra - ]); } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -1186,6 +1138,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasBorrowedLuck) { var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerPool, rulesetHelper); if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Success || @@ -1194,61 +1147,51 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( !helper.IsOppositeSide(defender.Side) || !helper.IsWithinRange(defender, 6) || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingPowerUses(powerWoe) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionService = ServiceRepository.GetService(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerPool, rulesetHelper); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WoeCosmosOmenSaving", - StringParameter2 = "SpendPowerWoeCosmosOmenSavingDescription".Formatted( + yield return helper.MyReactToSpendPower( + usablePower, + attacker, + "WoeCosmosOmenSaving", + "SpendPowerWoeCosmosOmenSavingDescription".Formatted( Category.Reaction, defender.Name, attacker.Name, helper.Name), - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetHelper, usablePower, false), - UsablePower = usablePower - }; - var count = actionService.PendingReactionRequestGroups.Count; + ReactionValidated, + battleManager); - actionService.ReactToSpendPower(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var dieRoll = + -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); - var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); + action.RolledSaveThrow = true; + action.SaveOutcomeDelta += dieRoll; - action.RolledSaveThrow = true; - action.SaveOutcomeDelta += dieRoll; + (ConsoleStyleDuplet.ParameterType, string) extra; - (ConsoleStyleDuplet.ParameterType, string) extra; + if (action.SaveOutcomeDelta < 0) + { + action.SaveOutcome = RollOutcome.Failure; + extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + } + else + { + extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); + } - if (action.SaveOutcomeDelta < 0) - { - action.SaveOutcome = RollOutcome.Failure; - extra = (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + helper.RulesetCharacter.LogCharacterUsedPower( + powerWoe, + "Feedback/&CosmosOmenSavingToHitRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + extra + ]); } - else - { - extra = (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle"); - } - - helper.RulesetCharacter.LogCharacterUsedPower( - powerWoe, - "Feedback/&CosmosOmenSavingToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - extra - ]); } } From 6c73dd010e41aaf162a235ff82150263769abc70 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 15:16:34 -0700 Subject: [PATCH 077/162] change Domain Tempest wrath of the storm to use SpendPower --- SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index ea1827c6b9..51bc3d4d7a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -390,9 +390,8 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerReaction) + var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.SpendPower) { - ActionModifiers = { new ActionModifier() }, StringParameter = "WrathOfTheStorm", RulesetEffect = implementationManager .MyInstantiateEffectPower(rulesetDefender, usablePower, false), From d0cdfdf3289d175341a51ea64259fd07edd4a5ef Mon Sep 17 00:00:00 2001 From: Dovel Date: Fri, 9 Aug 2024 02:38:23 +0300 Subject: [PATCH 078/162] update russian translation --- .../ru/SubClasses/PathOfTheWildMagic-ru.txt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt index 8bdf42f645..e6de797794 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt @@ -1,7 +1,7 @@ Action/&WildSurgeBoltDescription=Из вашей груди вырывается луч света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов, должно преуспеть в спасброске Телосложения, иначе получит 1d6 урона излучением и станет ослеплённым до начала вашего следующего хода. Action/&WildSurgeBoltTitle=Луч -Action/&WildSurgeSummonDescription=Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается поток духовной энергии, и каждое существо в 15-футовом кубе с центром в точке должно сделать спасбросок по Ловкости. При провале спасброска существо получает урон силой 1d6. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. -Action/&WildSurgeSummonTitle=Духовный взрыв +Action/&WildSurgeSummonDescription=Выберите точку в пределах 30 футов, которую можете видеть. Из этой точки вырывается поток духовной энергии, и каждое существо в кубе с ребром 15 футов и центром в точке, должно совершить спасбросок Ловкости. В случае провала существо получает 1d6 урона силовым полем. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. +Action/&WildSurgeSummonTitle=Взрыв духа Action/&WildSurgeTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Action/&WildSurgeTeleportTitle=Телепорт Condition/&ConditionPathOfTheWildMagicAuraBonusDescription=+1 к КД. @@ -20,8 +20,8 @@ Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthDescription=Вокруг в Condition/&ConditionPathOfTheWildMagicWildSurgeGrowthTitle=Всплеск дикости: рост Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionDescription=Пока ваша ярость не закончится, всякий раз, когда существо попадает по вам броском атаки, в ответ на атаку из вас выплёскивается магия, и существо получает 1d6 урона силовым полем. Condition/&ConditionPathOfTheWildMagicWildSurgeRetributionTitle=Всплеск дикости: возмездие -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается поток духовной энергии, и каждое существо в пределах 15-футового куба с центром в точке должно совершить спасбросок Ловкости. При провале спасброска существо получает 1d6 урона силой. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова на каждом своем ходу в качестве бонусного действия. -Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Дикая волна: Взрыв духа +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription=Выберите точку в пределах 30 футов, которую можете видеть. Из этой точки вырывается поток духовной энергии, и каждое существо в кубе с ребром 15 футов и центром в точке, должно совершить спасбросок Ловкости. В случае провала существо получает 1d6 урона силовым полем. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. +Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle=Всплеск дикости: взрыв духа Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. Condition/&ConditionPathOfTheWildMagicWildSurgeTeleportTitle=Всплеск дикости: телепорт Condition/&ConditionPathOfTheWildMagicWildSurgeWeaponDescription=Оружие в ваших руках наполняет магия. Пока ваша ярость не закончится, оружие приобретает свойство "метательное" (дис. 20/60), и тип его урона изменяется на урон силовым полем. Если оружие покидает вашу руку, то оно снова появляется в вашей руке в конце этого хода. Ваш бонус к урону от ярости также применяется к этому метательному оружию. @@ -30,7 +30,7 @@ Feature/&FeaturePathOfTheWildMagicControlledSurgeDescription=Всякий раз Feature/&FeaturePathOfTheWildMagicControlledSurgeTitle=Контролируемый всплеск Feature/&FeaturePathOfTheWildMagicUnstableBackslashDescription=Когда вы подвергаетесь опасности под действием ярости, магия внутри вас может выплеснуться. Сразу же после того, как вы получаете урон во время ярости, вы можете реакцией совершить бросок по таблице «Дикая магия» и применить соответствующий эффект немедленно. Этот эффект заменяет ваш текущий эффект дикой магии. Feature/&FeaturePathOfTheWildMagicUnstableBackslashTitle=Нестабильная отдача -Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Когда вы входите в ярость, бросьте по таблице Дикой магии, чтобы определить произведенный магический эффект. Если эффект требует спасброска, DC равен 8 + ваш бонус мастерства + ваш модификатор Телосложения.\n\nТаблица Дикой магии:\n- Каждое существо в пределах 30 футов от вас должно преуспеть в спасброске Телосложения или получить 1d12 некротического урона. Вы также получаете 1d12 временных очков здоровья.\n- Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете использовать этот эффект снова в каждом своем ходу в качестве бонусного действия.\n- Выберите точку, которую вы можете видеть в пределах 30 футов от вас. Из точки вырывается всплеск духовной энергии, и каждое существо в 15-футовом кубе с центром в точке должно сделать спасбросок Ловкости. При провале спасброска существо получает 1d6 урона силой. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова на каждом своем ходу в качестве бонусного действия.\n- Магия наполняет оружие, которое вы держите. Пока ваша ярость не закончится, тип урона оружия меняется на силу, и оно приобретает метательные свойства с обычной дальностью 20 футов и дальней дальностью 60 футов. Если оружие покидает вашу руку, оно снова появляется в вашей руке. Ваш бонус урона от ярости также будет применяться к этому метательному оружию.\n- Всякий раз, когда существо наносит вам удар броском атаки до того, как закончится ваша ярость, это существо получает 1d6 урона силой.\n- Пока ваша ярость не закончится, вы получаете бонус +1 к AC, и пока вы находитесь в пределах 10 футов от вас, ваши союзники получают такой же бонус.\n- Пока ваша ярость не закончится, в конце каждого вашего хода земля в пределах 15 футов от вас становится труднопроходимой местностью до начала вашего следующего хода.\n- Из вашей груди вылетает молния света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов от вас, должно преуспеть в спасброске Телосложения или получить 1d6 урона от излучения и быть ослепленным до начала вашего следующего хода. Пока ваша ярость не закончится, вы можете снова использовать этот эффект в каждом своем ходу в качестве бонусного действия. +Feature/&FeaturePathOfTheWildMagicWildSurgeDescription=Когда вы впадаете в ярость, совершите бросок по таблице «Дикая магия», чтобы определить произведённый магический эффект. Если эффект требует спасброска, то он имеет Сл 8 + ваш бонус мастерства + ваш модификатор Телосложения.\n\nТаблица дикой магии:\n• Вокруг вас вьются тёмные щупальца. Каждое существо по вашему выбору, которое вы можете видеть в пределах 30 футов от вас, должно преуспеть в спасброске Телосложения, иначе получит 1d12 урона некротической энергией. Вы также получаете 1d12 временных хитов.\n• Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект.\n• Выберите точку в пределах 30 футов, которую можете видеть. Из этой точки вырывается поток духовной энергии, и каждое существо в кубе с ребром 15 футов и центром в точке, должно совершить спасбросок Ловкости. В случае провала существо получает 1d6 урона силовым полем. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект.\n• Оружие в ваших руках наполняет магия. Пока ваша ярость не закончится, оружие приобретает свойство "метательное" (дис. 20/60), и тип его урона изменяется на урон силовым полем. Если оружие покидает вашу руку, то оно снова появляется в вашей руке в конце этого хода. Ваш бонус к урону от ярости также применяется к этому метательному оружию.\n• Пока ваша ярость не закончится, всякий раз, когда существо попадает по вам броском атаки, в ответ на атаку из вас выплёскивается магия, и существо получает 1d6 урона силовым полем.\n• Пока ваша ярость не закончится, вас окружают разноцветные защитные огоньки. Вы и все ваши союзники в пределах 10 футов от вас получаете бонус +1 к КД.\n• Вокруг вас временно вырастают цветы и лозы. Пока ваша ярость не закончится, земля в пределах 15 футов от вас является труднопроходимой местностью для ваших врагов.\n• Из вашей груди вырывается луч света. Другое существо по вашему выбору, которое вы можете видеть в пределах 30 футов, должно преуспеть в спасброске Телосложения, иначе получит 1d6 урона излучением и станет ослеплённым до начала вашего следующего хода. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. Feature/&FeaturePathOfTheWildMagicWildSurgeTitle=Всплеск дикости Feature/&PowerPathOfTheWildMagicAuraDescription=Пока ваша ярость не закончится, вас окружают разноцветные защитные огоньки. Вы и все ваши союзники в пределах 10 футов от вас получаете бонус +1 к КД. Feature/&PowerPathOfTheWildMagicAuraTitle=Всплеск дикости: аура @@ -44,15 +44,12 @@ Feature/&PowerPathOfTheWildMagicBoltDescription=Из вашей груди вы Feature/&PowerPathOfTheWildMagicBoltTitle=Всплеск дикости: луч Feature/&PowerPathOfTheWildMagicMagicAwarenessDescription=Действием вы можете открыть свое сознание присутствию концентрированной магии. В течение следующей минуты вы знаете местоположение любого заклинания или магического предмета в пределах 60 футов от вас. Feature/&PowerPathOfTheWildMagicMagicAwarenessTitle=Магическая осведомлённость -Feature/&PowerPathOfTheWildMagicSummonBlastDescription=Дух взрывается, и каждое существо в пределах 5 футов от него должно преуспеть в спасброске Ловкости, иначе получит 1d6 урона силовым полем. -Feature/&PowerPathOfTheWildMagicSummonBlastTitle=Всплеск дикости: взрыв духа -Feature/&PowerPathOfTheWildMagicSummonDescription=Выберите точку, которую вы можете видеть, в пределах 30 футов от себя. Из этой точки вырывается взрыв духовной энергии, и каждое существо в пределах 15-футового куба с центром в этой точке должно совершить спасбросок Ловкости. При провале существо получает урон силовым полем 1d6. Этот урон увеличивается до 2d6 на 11 уровне и до 3d6 на 17 уровне. Пока ваша ярость не закончится, вы можете использовать этот эффект снова в каждом своем ходу в качестве бонусного действия. -Feature/&PowerPathOfTheWildMagicSummonTitle=Дикая волна: Взрыв духа +Feature/&PowerPathOfTheWildMagicSummonDescription=Выберите точку в пределах 30 футов, которую можете видеть. Из этой точки вырывается поток духовной энергии, и каждое существо в кубе с ребром 15 футов и центром в точке, должно совершить спасбросок Ловкости. В случае провала существо получает 1d6 урона силовым полем. Этот урон увеличивается до 2d6 на 11-м уровне и до 3d6 на 17-м уровне. Пока ваша ярость не закончится, вы можете каждый свой ход бонусным действием применять этот эффект. +Feature/&PowerPathOfTheWildMagicSummonTitle=Всплеск дикости: взрыв духа Feature/&PowerPathOfTheWildMagicTeleportDescription=Вы телепортируетесь на расстояние до 30 футов в свободное пространство, которое вы можете видеть. Feature/&PowerPathOfTheWildMagicTeleportTitle=Всплеск дикости: телепорт Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Используйте свою реакцию, чтобы совершить бросок по таблице "Дикая магия" и заменить активный эффект. Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Нестабильная отдача -Proxy/&ProxyPathOfTheWildMagicSummonTitle=Всплеск дикости: призванный дух Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Выберите эффект всплеска дикости для активации. Если выбор не совершён, первый эффект будет активирован по умолчанию. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Активировать Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Контролируемый всплеск From 601679bbf62053ca8370bea9bf9a4413d63679fc Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:29:51 -0700 Subject: [PATCH 079/162] add GameLocationCharacterExtensions.MyReactToDoNothing --- .../GameLocationCharacterExtensions.cs | 73 ++++++++++++++----- 1 file changed, 55 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index de58ef5275..5d194aaa35 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -8,6 +8,7 @@ using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.CustomUI; +using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Validators; using TA; @@ -18,22 +19,29 @@ namespace SolastaUnfinishedBusiness.Api.GameExtensions; public static class GameLocationCharacterExtensions { + private static List GetActionModifiers(int count) + { + var actionModifiers = new List(); + + for (var i = 0; i < count; i++) + { + actionModifiers.Add(new ActionModifier()); + } + + return actionModifiers; + } + internal static void MyExecuteAction( this GameLocationCharacter character, Id actionId, RulesetUsablePower usablePower, List targets) { - var actionModifiers = new List(); + var actionModifiers = GetActionModifiers(targets.Count); var rulesetCharacter = character.RulesetCharacter; var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } - var actionParams = new CharacterActionParams(character, actionId) { ActionModifiers = actionModifiers, @@ -46,6 +54,44 @@ internal static void MyExecuteAction( ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); } + internal static IEnumerator MyReactToDoNothing( + this GameLocationCharacter character, + ExtraActionId actionId, + GameLocationCharacter waiter, + string type, + string stringParameter, + Action reactionValidated = null, + Action reactionNotValidated = null, + GameLocationBattleManager battleManager = null, + ICustomReactionResource resource = null) + { + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!actionManager || !battleManager) + { + yield break; + } + + var count = actionManager.PendingReactionRequestGroups.Count; + var actionParams = new CharacterActionParams(character, (Id)actionId) { StringParameter = stringParameter }; + var reactionRequest = new ReactionRequestCustom(type, actionParams) { Resource = resource }; + + actionManager.AddInterruptRequest(reactionRequest); + + yield return battleManager.WaitForReactions(waiter, actionManager, count); + + if (actionParams.ReactionValidated) + { + reactionValidated?.Invoke(); + } + else + { + reactionNotValidated?.Invoke(); + } + } + internal static IEnumerator MyReactToSpendPower( this GameLocationCharacter character, RulesetUsablePower usablePower, @@ -66,6 +112,7 @@ internal static IEnumerator MyReactToSpendPower( var count = actionService.PendingReactionRequestGroups.Count; var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; + var actionParams = new CharacterActionParams(character, Id.SpendPower) { StringParameter = stringParameter, @@ -105,14 +152,9 @@ internal static IEnumerator MyReactToSpendPowerBundle( } var count = actionManager.PendingReactionRequestGroups.Count; + var actionModifiers = GetActionModifiers(targets.Count); var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } var actionParams = new CharacterActionParams(character, Id.SpendPower) { @@ -160,14 +202,9 @@ internal static IEnumerator MyReactToUsePower( var actionService = ServiceRepository.GetService(); var count = actionService.PendingReactionRequestGroups.Count; + var actionModifiers = GetActionModifiers(targets.Count); var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - var actionModifiers = new List(); - - for (var i = 0; i < targets.Count; i++) - { - actionModifiers.Add(new ActionModifier()); - } var actionParams = new CharacterActionParams(character, actionId) { From 359ac41e54d00d730fdd9b0f7264f723012d662d Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:33:59 -0700 Subject: [PATCH 080/162] change Wizard War Magic arcane deflection to use MyReactToDoNothing --- .../Subclasses/WizardWarMagic.cs | 164 +++++++++--------- 1 file changed, 78 insertions(+), 86 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index 023d27b8e2..173bcad81c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -190,55 +190,51 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionArcaneDeflectionAttackDescription".Formatted(Category.Reaction) - }; - var reactionRequest = new ReactionRequestCustom("ArcaneDeflectionAttack", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "ArcaneDeflectionAttack", + "CustomReactionArcaneDeflectionAttackDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + EffectHelpers.StartVisualEffect( + helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); + rulesetCharacter.InflictCondition( + conditionArcaneDeflection.Name, + DurationType.Round, + 0, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetCharacter.guid, + rulesetCharacter.CurrentFaction.Name, + 1, + conditionArcaneDeflection.Name, + 0, + 0, + 0); - EffectHelpers.StartVisualEffect( - helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); - rulesetCharacter.InflictCondition( - conditionArcaneDeflection.Name, - DurationType.Round, - 0, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetCharacter.guid, - rulesetCharacter.CurrentFaction.Name, - 1, - conditionArcaneDeflection.Name, - 0, - 0, - 0); - - attackModifier.attackRollModifier -= bonus; - attackModifier.AttacktoHitTrends.Add( - new TrendInfo(-bonus, FeatureSourceType.CharacterFeature, featureArcaneDeflection.Name, - featureArcaneDeflection)); - action.AttackSuccessDelta -= bonus; - action.AttackRollOutcome = RollOutcome.Failure; - helper.RulesetCharacter.LogCharacterUsedFeature( - featureArcaneDeflection, - "Feedback/&ArcaneDeflectionAttackRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), - (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollAttackFailureTitle") - ]); - - HandleDeflectionShroud(helper); + attackModifier.attackRollModifier -= bonus; + attackModifier.AttacktoHitTrends.Add( + new TrendInfo(-bonus, FeatureSourceType.CharacterFeature, featureArcaneDeflection.Name, + featureArcaneDeflection)); + action.AttackSuccessDelta -= bonus; + action.AttackRollOutcome = RollOutcome.Failure; + helper.RulesetCharacter.LogCharacterUsedFeature( + featureArcaneDeflection, + "Feedback/&ArcaneDeflectionAttackRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), + (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollAttackFailureTitle") + ]); + + HandleDeflectionShroud(helper); + } } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -267,51 +263,47 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionArcaneDeflectionSavingDescription".Formatted(Category.Reaction) - }; - var reactionRequest = new ReactionRequestCustom("ArcaneDeflectionSaving", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "ArcaneDeflectionSaving", + "CustomReactionArcaneDeflectionSavingDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + EffectHelpers.StartVisualEffect( + helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); + rulesetCharacter.InflictCondition( + conditionArcaneDeflection.Name, + DurationType.Round, + 0, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetCharacter.guid, + rulesetCharacter.CurrentFaction.Name, + 1, + conditionArcaneDeflection.Name, + 0, + 0, + 0); - EffectHelpers.StartVisualEffect( - helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); - rulesetCharacter.InflictCondition( - conditionArcaneDeflection.Name, - DurationType.Round, - 0, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetCharacter.guid, - rulesetCharacter.CurrentFaction.Name, - 1, - conditionArcaneDeflection.Name, - 0, - 0, - 0); - - action.SaveOutcomeDelta += bonus; - action.SaveOutcome = RollOutcome.Success; - helper.RulesetCharacter.LogCharacterUsedFeature( - featureArcaneDeflection, - "Feedback/&ArcaneDeflectionSavingRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") - ]); - - HandleDeflectionShroud(helper); + action.SaveOutcomeDelta += bonus; + action.SaveOutcome = RollOutcome.Success; + helper.RulesetCharacter.LogCharacterUsedFeature( + featureArcaneDeflection, + "Feedback/&ArcaneDeflectionSavingRoll", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Positive, bonus.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") + ]); + + HandleDeflectionShroud(helper); + } } private void HandleDeflectionShroud(GameLocationCharacter helper) From e2b49c79b3aade4a4094e070ba1da1e910a6db28 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:34:45 -0700 Subject: [PATCH 081/162] change Ranger Gloom Stalker shadowy dodge to use MyReactToDoNothing --- .../Subclasses/RangerGloomStalker.cs | 154 +++++++++--------- 1 file changed, 75 insertions(+), 79 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs index 036772269b..33e346e4f2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs @@ -354,93 +354,89 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var reactionParams = - new CharacterActionParams(defender, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "Reaction/&CustomReactionShadowyDodgeDescription" - }; - var reactionRequest = new ReactionRequestCustom("ShadowyDodge", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return defender.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "ShadowyDodge", + "CustomReactionShadowyDodgeDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - var attackRoll = action.AttackRoll; - var outcome = action.AttackRollOutcome; - var rollCaption = outcome == RollOutcome.CriticalSuccess - ? "Feedback/&RollAttackCriticalSuccessTitle" - : "Feedback/&RollAttackSuccessTitle"; - var rulesetAttacker = attacker.RulesetCharacter; + var attackRoll = action.AttackRoll; + var outcome = action.AttackRollOutcome; + var rollCaption = outcome == RollOutcome.CriticalSuccess + ? "Feedback/&RollAttackCriticalSuccessTitle" + : "Feedback/&RollAttackSuccessTitle"; + var rulesetAttacker = attacker.RulesetCharacter; + + int roll; + int toHitBonus; + int successDelta; + + actionModifier.AttackAdvantageTrends.SetRange(new List + { + new(-1, FeatureSourceType.CharacterFeature, featureShadowyDodge.Name, featureShadowyDodge) + }); - int roll; - int toHitBonus; - int successDelta; + if (attackMode != null) + { + toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; + roll = rulesetAttacker.RollAttack( + toHitBonus, + defender.RulesetActor, + attackMode.SourceDefinition, + attackMode.ToHitBonusTrends, + false, + actionModifier.AttackAdvantageTrends, + attackMode.ranged, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + else if (rulesetEffect != null) + { + toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; + roll = rulesetAttacker.RollMagicAttack( + rulesetEffect, + defender.RulesetActor, + rulesetEffect.GetEffectSource(), + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + // should never happen + else + { + return; + } - actionModifier.AttackAdvantageTrends.SetRange(new List - { - new(-1, FeatureSourceType.CharacterFeature, featureShadowyDodge.Name, featureShadowyDodge) - }); + var rulesetDefender = defender.RulesetCharacter; + var sign = toHitBonus >= 0 ? "+" : string.Empty; - if (attackMode != null) - { - toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; - roll = rulesetAttacker.RollAttack( - toHitBonus, - defender.RulesetActor, - attackMode.SourceDefinition, - attackMode.ToHitBonusTrends, + rulesetDefender.LogCharacterUsedFeature( + featureShadowyDodge, + "Feedback/&TriggerRerollLine", false, - actionModifier.AttackAdvantageTrends, - attackMode.ranged, - false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - else if (rulesetEffect != null) - { - toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; - roll = rulesetAttacker.RollMagicAttack( - rulesetEffect, - defender.RulesetActor, - rulesetEffect.GetEffectSource(), - actionModifier.AttacktoHitTrends, - actionModifier.AttackAdvantageTrends, - false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - // should never happen - else - { - yield break; - } - - var rulesetDefender = defender.RulesetCharacter; - var sign = toHitBonus >= 0 ? "+" : string.Empty; + (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), + (ConsoleStyleDuplet.ParameterType.FailedRoll, + Gui.Format(rollCaption, $"{attackRoll + toHitBonus}"))); - rulesetDefender.LogCharacterUsedFeature( - featureShadowyDodge, - "Feedback/&TriggerRerollLine", - false, - (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), - (ConsoleStyleDuplet.ParameterType.FailedRoll, - Gui.Format(rollCaption, $"{attackRoll + toHitBonus}"))); - - action.AttackRollOutcome = outcome; - action.AttackSuccessDelta = successDelta; - action.AttackRoll = roll; + action.AttackRollOutcome = outcome; + action.AttackSuccessDelta = successDelta; + action.AttackRoll = roll; + } } } } From 28a13932aa4439f554555fe6e89aa7818f81309e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:35:40 -0700 Subject: [PATCH 082/162] change Patron Archfey misty escape to use MyReactToDoNothing --- .../Subclasses/PatronArchfey.cs | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs index 7069d9372d..c3afb2cf3f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs @@ -3,6 +3,7 @@ using System.Linq; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; @@ -465,41 +466,38 @@ private IEnumerator HandleReaction( yield break; } - var reactionParams = new CharacterActionParams(defender, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = $"Reaction/&CustomReaction{TagMistyEscape}Description" - }; - var reactionRequest = new ReactionRequestCustom(TagMistyEscape, reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return defender.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + attacker, + TagMistyEscape, + $"CustomReaction{TagMistyEscape}Description".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + defender.UsedSpecialFeatures.TryAdd(TagMistyEscape, 0); + + // trick to ensure enemy won't execute any more attack or shove action after teleport + var rulesetAttacker = attacker.RulesetCharacter; + var rulesetDefender = defender.RulesetCharacter; + + rulesetAttacker.InflictCondition( + conditionMistyEscape.Name, + DurationType.Round, + 0, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetDefender.guid, + rulesetDefender.CurrentFaction.Name, + 1, + conditionMistyEscape.Name, + 0, + 0, + 0); } - - defender.UsedSpecialFeatures.TryAdd(TagMistyEscape, 0); - - // trick to ensure enemy won't execute any more attack or shove action after teleport - var rulesetAttacker = attacker.RulesetCharacter; - var rulesetDefender = defender.RulesetCharacter; - - rulesetAttacker.InflictCondition( - conditionMistyEscape.Name, - DurationType.Round, - 0, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetDefender.guid, - rulesetDefender.CurrentFaction.Name, - 1, - conditionMistyEscape.Name, - 0, - 0, - 0); } } From 34a77579d56bd8575b9b081e7e6762ee004b730c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:36:57 -0700 Subject: [PATCH 083/162] change Path of the Beast extra claw attack to use MyReactToDoNothing --- .../Subclasses/PathOfTheBeast.cs | 66 +++++++------------ 1 file changed, 22 insertions(+), 44 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index dc6e3432da..d898d513d4 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -312,63 +312,41 @@ public IEnumerator OnPhysicalAttackFinishedByMe( RollOutcome rollOutcome, int damageAmount) { - if (attackMode.SourceDefinition is not ItemDefinition item || - item != _beastClaws) + if (attackMode.SourceDefinition is not ItemDefinition item || item != _beastClaws || + attacker.UsedSpecialFeatures.ContainsKey(TagBeastClawAttack) || + defender.RulesetCharacter is not { IsDeadOrDyingOrUnconscious: false }) { yield break; } - if (defender.RulesetCharacter is not - { IsDeadOrDyingOrUnconscious: false }) - { - yield break; - } + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "ExtraClawAttack", + "CustomReactionExtraClawAttackDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; + yield break; - if (!actionManager) + void ReactionValidated() { - yield break; - } + attacker.UsedSpecialFeatures.Add(TagBeastClawAttack, 0); - if (attacker.UsedSpecialFeatures.ContainsKey(TagBeastClawAttack)) - { - yield break; - } + var attackModeCopy = attackMode.DeepCopy(); - var reactionParams = - new CharacterActionParams(attacker, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) + attackModeCopy.ActionType = ActionDefinitions.ActionType.NoCost; + + var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.AttackFree) { - StringParameter = Gui.Format("Reaction/&CustomReactionExtraClawAttackDescription") + ActionModifiers = { new ActionModifier() }, + AttackMode = attackModeCopy, + TargetCharacters = { defender } }; - var reactionRequest = new ReactionRequestCustom("ExtraClawAttack", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - if (!reactionParams.reactionValidated) - { - yield break; + ServiceRepository.GetService()? + .ExecuteAction(actionParams, null, true); } - - attacker.UsedSpecialFeatures.Add(TagBeastClawAttack, 0); - - var attackModeCopy = attackMode.DeepCopy(); - - attackModeCopy.ActionType = ActionDefinitions.ActionType.NoCost; - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.AttackFree) - { - ActionModifiers = { new ActionModifier() }, - AttackMode = attackModeCopy, - TargetCharacters = { defender } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); } protected override AttackModeOrder GetOrder(RulesetCharacter character) From aa5f669253dd91642986de7432877a598f6cd2dd Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:37:58 -0700 Subject: [PATCH 084/162] change Oath of Hatred ardent hate to use MyReactToDoNothing --- .../Subclasses/OathOfHatred.cs | 48 ++++++++----------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfHatred.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfHatred.cs index e045de7225..66f12412da 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfHatred.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfHatred.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; @@ -264,7 +265,7 @@ public void ModifyDamageAffinity(RulesetActor defender, RulesetActor attacker, L public int HandlerPriority => -10; public IEnumerator OnTryAlterOutcomeAttack( - GameLocationBattleManager battle, + GameLocationBattleManager battleManager, CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, @@ -273,11 +274,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || + if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || !helper.OncePerTurnIsValid(power.Name)) { @@ -287,32 +284,29 @@ action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFail var guiAttacker = new GuiCharacter(attacker); var guiDefender = new GuiCharacter(defender); - var reactionParams = new CharacterActionParams(attacker, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = Gui.Format( - "Reaction/&CustomReactionHatredArdentHateDescription", guiAttacker.Name, guiDefender.Name) - }; - var reactionRequest = new ReactionRequestCustom("HatredArdentHate", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + attacker, + "HatredArdentHate", + "CustomReactionHatredArdentHateDescription".Formatted( + Category.Reaction, guiAttacker.Name, guiDefender.Name), + ReactionValidated, + battleManager: battleManager); - yield return battle.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + attacker.UsedSpecialFeatures.TryAdd(power.Name, 1); - attacker.UsedSpecialFeatures.TryAdd(power.Name, 1); + var delta = -action.AttackSuccessDelta; - var delta = -action.AttackSuccessDelta; - - action.AttackRollOutcome = RollOutcome.Success; - action.AttackSuccessDelta = 0; - action.AttackRoll += delta; - attackModifier.AttackRollModifier += delta; - attackModifier.AttacktoHitTrends.Add(new TrendInfo(delta, FeatureSourceType.Power, power.Name, power)); + action.AttackRollOutcome = RollOutcome.Success; + action.AttackSuccessDelta = 0; + action.AttackRoll += delta; + attackModifier.AttackRollModifier += delta; + attackModifier.AttacktoHitTrends.Add(new TrendInfo(delta, FeatureSourceType.Power, power.Name, power)); + } } } } From ded15885d390a0f3e78a29891bff4e748d48e00b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:38:56 -0700 Subject: [PATCH 085/162] change Martial Arcane Archer guided shot to use MyReactToDoNothing --- .../Subclasses/MartialArcaneArcher.cs | 97 +++++++++---------- 1 file changed, 45 insertions(+), 52 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs index 559b7c28f4..6506f243b0 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs @@ -4,6 +4,7 @@ using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; @@ -687,7 +688,7 @@ private class TryAlterOutcomeAttackGuidedShot(FeatureDefinition featureDefinitio public int HandlerPriority => -10; public IEnumerator OnTryAlterOutcomeAttack( - GameLocationBattleManager battle, + GameLocationBattleManager battleManager, CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, @@ -696,11 +697,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || + if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || !helper.CanReact() || !IsBow(attackMode, null, null)) @@ -708,56 +705,52 @@ action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFail yield break; } - var reactionParams = - new CharacterActionParams(attacker, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "Reaction/&CustomReactionMartialArcaneArcherGuidedShotDescription" - }; - var reactionRequest = new ReactionRequestCustom("MartialArcaneArcherGuidedShot", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "MartialArcaneArcherGuidedShot", + "CustomReactionMartialArcaneArcherGuidedShotDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battle.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + var toHitBonus = attackMode.ToHitBonus + attackModifier.AttackRollModifier; + var totalRoll = (action.AttackRoll + attackMode.ToHitBonus).ToString(); + var rollCaption = action.AttackRollOutcome == RollOutcome.CriticalFailure + ? "Feedback/&RollAttackCriticalFailureTitle" + : "Feedback/&RollAttackFailureTitle"; + + var rulesetAttacker = attacker.RulesetCharacter; + var sign = toHitBonus > 0 ? "+" : string.Empty; + + rulesetAttacker.LogCharacterUsedFeature(featureDefinition, + "Feedback/&TriggerRerollLine", + false, + (ConsoleStyleDuplet.ParameterType.Base, $"{action.AttackRoll}{sign}{toHitBonus}"), + (ConsoleStyleDuplet.ParameterType.FailedRoll, Gui.Format(rollCaption, totalRoll))); + + var roll = rulesetAttacker.RollAttack( + attackMode.toHitBonus, + defender.RulesetActor, + attackMode.sourceDefinition, + attackModifier.attackToHitTrends, + attackModifier.IgnoreAdvantage, + attackModifier.AttackAdvantageTrends, + attackMode.ranged, + false, + attackModifier.attackRollModifier, + out var outcome, + out var successDelta, + -1, + true); + + action.AttackRollOutcome = outcome; + action.AttackSuccessDelta = successDelta; + action.AttackRoll = roll; } - - var toHitBonus = attackMode.ToHitBonus + attackModifier.AttackRollModifier; - var totalRoll = (action.AttackRoll + attackMode.ToHitBonus).ToString(); - var rollCaption = action.AttackRollOutcome == RollOutcome.CriticalFailure - ? "Feedback/&RollAttackCriticalFailureTitle" - : "Feedback/&RollAttackFailureTitle"; - - var rulesetAttacker = attacker.RulesetCharacter; - var sign = toHitBonus > 0 ? "+" : string.Empty; - - rulesetAttacker.LogCharacterUsedFeature(featureDefinition, - "Feedback/&TriggerRerollLine", - false, - (ConsoleStyleDuplet.ParameterType.Base, $"{action.AttackRoll}{sign}{toHitBonus}"), - (ConsoleStyleDuplet.ParameterType.FailedRoll, Gui.Format(rollCaption, totalRoll))); - - var roll = rulesetAttacker.RollAttack( - attackMode.toHitBonus, - defender.RulesetActor, - attackMode.sourceDefinition, - attackModifier.attackToHitTrends, - attackModifier.IgnoreAdvantage, - attackModifier.AttackAdvantageTrends, - attackMode.ranged, - false, - attackModifier.attackRollModifier, - out var outcome, - out var successDelta, - -1, - true); - - action.AttackRollOutcome = outcome; - action.AttackSuccessDelta = successDelta; - action.AttackRoll = roll; } } From 552d2c2d7e03798dd5fc4d0a8b72027f55eda549 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:40:01 -0700 Subject: [PATCH 086/162] change Domain Nature dampen elements to use MyReactToDoNothing --- .../Subclasses/DomainNature.cs | 66 ++++++++----------- 1 file changed, 27 insertions(+), 39 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs index bb22fe3766..5473222c7a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainNature.cs @@ -349,14 +349,6 @@ private IEnumerator Handler( GameLocationCharacter defender, List actualEffectForms) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var damageTypes = DampenElementsDamageTypes.Intersect( actualEffectForms .Where(x => x.FormType == EffectForm.EffectFormType.Damage) @@ -390,40 +382,36 @@ private IEnumerator Handler( yield break; } - var actionParams = new CharacterActionParams(glc, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionDampenElementsDescription" - .Formatted(Category.Reaction, rulesetDefender.Name) - }; - var reactionRequest = new ReactionRequestCustom("DampenElements", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; + yield return glc.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "DampenElements", + "CustomReactionDampenElementsDescription".Formatted(Category.Reaction, defender.Name), + ReactionValidated, + battleManager: battleManager); - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (!actionParams.ReactionValidated) - { - yield break; - } + yield break; - EffectHelpers.StartVisualEffect(glc, defender, PowerPaladinNeutralizePoison, - EffectHelpers.EffectType.Effect); - foreach (var conditionName in damageTypes.Select(damageType => $"ConditionDomainNature{damageType}")) + void ReactionValidated() { - rulesetDefender.InflictCondition( - conditionName, - DurationType.Round, - 0, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetDefender.guid, - rulesetDefender.CurrentFaction.Name, - 1, - conditionName, - 0, - 0, - 0); + EffectHelpers.StartVisualEffect(glc, defender, PowerPaladinNeutralizePoison, + EffectHelpers.EffectType.Effect); + foreach (var conditionName in damageTypes.Select(damageType => $"ConditionDomainNature{damageType}")) + { + rulesetDefender.InflictCondition( + conditionName, + DurationType.Round, + 0, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetDefender.guid, + rulesetDefender.CurrentFaction.Name, + 1, + conditionName, + 0, + 0, + 0); + } } } } From c6ac6b8c10526ec98c46a830a30fd1c60e32ad65 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:40:49 -0700 Subject: [PATCH 087/162] change College of Elegance evasive footwork to use MyReactToDoNothing --- .../Subclasses/CollegeOfElegance.cs | 75 ++++++++----------- 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs index f863a27868..555e6dc206 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs @@ -5,6 +5,7 @@ using SolastaUnfinishedBusiness.Api; using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; +using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; @@ -251,14 +252,6 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var rulesetHelper = helper.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || @@ -290,44 +283,42 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionParams = new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "Reaction/&CustomReactionEvasiveFootworkDescription" - }; - var reactionRequest = new ReactionRequestCustom("EvasiveFootwork", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "EvasiveFootwork", + "CustomReactionEvasiveFootworkDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; + var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); + + rulesetHelper.InflictCondition( + conditionEvasiveFootwork.Name, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + TagEffect, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, + 1, + conditionEvasiveFootwork.Name, + dieRoll, + 0, + 0); + + EffectHelpers.StartVisualEffect(defender, defender, PowerKnightLeadership, + EffectHelpers.EffectType.Effect); + rulesetHelper.LogCharacterUsedFeature( + featureEvasiveFootwork, + "Feedback/&EvasiveFootworkACIncrease", true, + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString())); } - - var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); - - rulesetHelper.InflictCondition( - conditionEvasiveFootwork.Name, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - TagEffect, - rulesetHelper.guid, - rulesetHelper.CurrentFaction.Name, - 1, - conditionEvasiveFootwork.Name, - dieRoll, - 0, - 0); - - EffectHelpers.StartVisualEffect(defender, defender, PowerKnightLeadership, EffectHelpers.EffectType.Effect); - rulesetHelper.LogCharacterUsedFeature( - featureEvasiveFootwork, - "Feedback/&EvasiveFootworkACIncrease", true, - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString())); } } From a45dca71714ad0470f0cd50ba04095d70eba918f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:44:32 -0700 Subject: [PATCH 088/162] change Switch and Bait, Precise, and Parry maneuvers to use MyReactToDoNothing --- .../Subclasses/Builders/GambitsBuilders.cs | 240 +++++++++--------- 1 file changed, 120 insertions(+), 120 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index ab782a3829..9a1096a899 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1516,6 +1516,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, 0, 0, 0); + caster.InflictCondition( good.Name, DurationType.Round, @@ -1533,49 +1534,65 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, yield break; } - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; + yield return actingCharacter.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + actingCharacter, + "GambitSwitch", + "CustomReactionGambitSwitchDescription".Formatted(Category.Reaction), + ReactionValidated, + ReactionNotValidated); - if (!actionManager || !battleManager) - { - yield break; - } - - var reactionParams = - new CharacterActionParams(actingCharacter, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = "Reaction/&CustomReactionGambitSwitchDescription" - }; - var reactionRequest = new ReactionRequestCustom("GambitSwitch", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; + yield break; - actionManager.AddInterruptRequest(reactionRequest); + void ReactionValidated() + { + dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); + caster.ShowDieRoll(dieType, dieRoll, title: good.GuiPresentation.Title); - yield return battleManager.WaitForReactions(actingCharacter, actionManager, count); + target.InflictCondition( + good.Name, + DurationType.Round, + 1, + (TurnOccurenceType)ExtraTurnOccurenceType.StartOfSourceTurn, + AttributeDefinitions.TagEffect, + caster.Guid, + caster.CurrentFaction.Name, + 1, + good.Name, + dieRoll, + 0, + 0); - dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); - caster.ShowDieRoll(dieType, dieRoll, title: good.GuiPresentation.Title); + caster.LogCharacterUsedPower(powerSwitchActivate, "Feedback/&GambitSwitchACIncrease", true, + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), + (ConsoleStyleDuplet.ParameterType.Player, target.Name), + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString())); + } - var finalTarget = !reactionParams.ReactionValidated ? caster : target; + void ReactionNotValidated() + { + dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); + caster.ShowDieRoll(dieType, dieRoll, title: good.GuiPresentation.Title); - finalTarget.InflictCondition( - good.Name, - DurationType.Round, - 1, - (TurnOccurenceType)ExtraTurnOccurenceType.StartOfSourceTurn, - AttributeDefinitions.TagEffect, - caster.Guid, - caster.CurrentFaction.Name, - 1, - good.Name, - dieRoll, - 0, - 0); + caster.InflictCondition( + good.Name, + DurationType.Round, + 1, + (TurnOccurenceType)ExtraTurnOccurenceType.StartOfSourceTurn, + AttributeDefinitions.TagEffect, + caster.Guid, + caster.CurrentFaction.Name, + 1, + good.Name, + dieRoll, + 0, + 0); - caster.LogCharacterUsedPower(powerSwitchActivate, "Feedback/&GambitSwitchACIncrease", true, - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), - (ConsoleStyleDuplet.ParameterType.Player, finalTarget.Name), - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString())); + caster.LogCharacterUsedPower(powerSwitchActivate, "Feedback/&GambitSwitchACIncrease", true, + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), + (ConsoleStyleDuplet.ParameterType.Player, caster.Name), + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString())); + } } } @@ -1660,13 +1677,12 @@ protected override ReactionRequest MakeReactionRequest(GameLocationCharacter att private sealed class Precise(FeatureDefinitionPower pool, FeatureDefinition feature) : ITryAlterOutcomeAttack { - private const string Format = "Reaction/&CustomReactionGambitPreciseDescription"; private const string Line = "Feedback/&GambitPreciseToHitRoll"; public int HandlerPriority => -10; public IEnumerator OnTryAlterOutcomeAttack( - GameLocationBattleManager battle, + GameLocationBattleManager battleManager, CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, @@ -1675,13 +1691,9 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var rulesetAttacker = attacker.RulesetCharacter; - if (!actionManager || - action.AttackRollOutcome != RollOutcome.Failure || + if (action.AttackRollOutcome != RollOutcome.Failure || helper != attacker || !rulesetAttacker.CanUsePower(pool)) { @@ -1700,60 +1712,54 @@ public IEnumerator OnTryAlterOutcomeAttack( var guiAttacker = new GuiCharacter(attacker); var guiDefender = new GuiCharacter(defender); - var reactionParams = - new CharacterActionParams(attacker, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = Gui.Format( - Format, guiAttacker.Name, guiDefender.Name, delta.ToString(), Gui.FormatDieTitle(dieType)) - }; - var reactionRequest = new ReactionRequestCustom("GambitPrecise", reactionParams) - { - Resource = new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + attacker, + "GambitPrecise", + "CustomReactionGambitPreciseDescription" + .Formatted(Category.Reaction, guiAttacker.Name, guiDefender.Name, delta.ToString(), Gui.FormatDieTitle(dieType)), + ReactionValidated, + battleManager: battleManager, + resource: new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon)); - yield return battle.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + rulesetAttacker.UpdateUsageForPower(pool, 1); - rulesetAttacker.UpdateUsageForPower(pool, 1); + var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); - var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); + attackModifier.AttacktoHitTrends.Add(new TrendInfo(dieRoll, FeatureSourceType.Power, pool.Name, null) + { + dieType = dieType, dieFlag = TrendInfoDieFlag.None + }); - attackModifier.AttacktoHitTrends.Add(new TrendInfo(dieRoll, FeatureSourceType.Power, pool.Name, null) - { - dieType = dieType, dieFlag = TrendInfoDieFlag.None - }); + action.AttackSuccessDelta += dieRoll; + attackModifier.AttackRollModifier += dieRoll; - action.AttackSuccessDelta += dieRoll; - attackModifier.AttackRollModifier += dieRoll; + if (action.AttackSuccessDelta >= 0) + { + action.AttackRollOutcome = RollOutcome.Success; + } - if (action.AttackSuccessDelta >= 0) - { - action.AttackRollOutcome = RollOutcome.Success; + rulesetAttacker.ShowDieRoll( + dieType, + dieRoll, + title: feature.GuiPresentation.Title, + outcome: action.AttackRollOutcome, + displayOutcome: true + ); + + rulesetAttacker.LogCharacterUsedFeature( + feature, + Line, + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()) + ]); } - - rulesetAttacker.ShowDieRoll( - dieType, - dieRoll, - title: feature.GuiPresentation.Title, - outcome: action.AttackRollOutcome, - displayOutcome: true - ); - - rulesetAttacker.LogCharacterUsedFeature( - feature, - Line, - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()) - ]); } } @@ -1802,46 +1808,40 @@ public IEnumerator OnTryAlterOutcomeAttack( var guiMe = new GuiCharacter(defender); var guiTarget = new GuiCharacter(attacker); - var reactionParams = - new CharacterActionParams(defender, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionGambitParryDescription" - .Formatted(Category.Reaction, guiMe.Name, guiTarget.Name, Gui.FormatDieTitle(dieType)) - }; - var reactionRequest = new ReactionRequestCustom("GambitParry", reactionParams) - { - Resource = new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return defender.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "GambitParry", + "CustomReactionGambitParryDescription" + .Formatted(Category.Reaction, guiMe.Name, guiTarget.Name, Gui.FormatDieTitle(dieType)), + ReactionValidated, + battleManager: battleManager, + resource: new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon)); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - rulesetDefender.UpdateUsageForPower(pool, 1); + rulesetDefender.UpdateUsageForPower(pool, 1); - var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); + var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); - var pb = 2 * rulesetDefender.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); - var reduction = dieRoll + pb; + var pb = 2 * rulesetDefender.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); + var reduction = dieRoll + pb; - actionModifier.damageRollReduction += reduction; + actionModifier.damageRollReduction += reduction; - rulesetDefender.ShowDieRoll(dieType, dieRoll, - title: feature.GuiPresentation.Title, - displayModifier: true, modifier: pb); + rulesetDefender.ShowDieRoll(dieType, dieRoll, + title: feature.GuiPresentation.Title, + displayModifier: true, modifier: pb); - rulesetDefender.LogCharacterUsedFeature(feature, Line, - extra: - [ - (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), - (ConsoleStyleDuplet.ParameterType.Positive, reduction.ToString()) - ]); + rulesetDefender.LogCharacterUsedFeature(feature, Line, + extra: + [ + (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), + (ConsoleStyleDuplet.ParameterType.Positive, reduction.ToString()) + ]); + } } } From 27670f8df56c73664671d25e9f8843ad3084d4ac Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:45:24 -0700 Subject: [PATCH 089/162] change Eldritch Aegis and Eldritch Ward to use MyReactToDoNothing --- .../Builders/EldritchVersatility.cs | 105 ++++++++---------- 1 file changed, 44 insertions(+), 61 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs index 8cffbaeb6a..33e5d78e9d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/EldritchVersatility.cs @@ -249,17 +249,6 @@ private static int GetAbilityScoreModifier( supportCondition.IsOverload ? 22 : 0)); } - private static void RequestCustomReaction( - IGameLocationActionService actionService, string type, CharacterActionParams actionParams, int requestPoints) - { - var reactionRequest = new ReactionRequestCustom(type, actionParams) - { - Resource = new ReactionResourceEldritchVersatilityPoints(requestPoints) - }; - - (actionService as GameLocationActionManager)?.AddInterruptRequest(reactionRequest); - } - private static void InflictCondition( BaseDefinition condition, RulesetCharacter sourceCharacter, @@ -1105,32 +1094,28 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var actionService = ServiceRepository.GetService(); - var count = actionService.PendingReactionRequestGroups.Count; - - var actionParams = new CharacterActionParams(helper, (Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionEldritchAegis".Formatted(Category.Reaction, defender.Name) - }; - - RequestCustomReaction(actionService, "EldritchAegis", actionParams, requiredACAddition); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "EldritchAegis", + "CustomReactionEldritchAegis".Formatted(Category.Reaction, defender.Name), + ReactionValidated, + battleManager: battleManager, + resource: new ReactionResourceEldritchVersatilityPoints(requiredACAddition)); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; + supportCondition.TryEarnOrSpendPoints(PointAction.Modify, PointUsage.EldritchAegis, requiredACAddition); + InflictCondition( + EldritchAegisSupportRulesetCondition.BindingDefinition, helperCharacter, defenderCharacter); + EldritchAegisSupportRulesetCondition.GetCustomConditionFromCharacter( + defenderCharacter, out eldritchAegisSupportCondition); + eldritchAegisSupportCondition.ACBonus = requiredACAddition; + defenderCharacter.RefreshArmorClass(true); + console.AddEntry(entry); } - - supportCondition.TryEarnOrSpendPoints( - PointAction.Modify, PointUsage.EldritchAegis, requiredACAddition); - InflictCondition( - EldritchAegisSupportRulesetCondition.BindingDefinition, helperCharacter, defenderCharacter); - EldritchAegisSupportRulesetCondition.GetCustomConditionFromCharacter( - defenderCharacter, out eldritchAegisSupportCondition); - eldritchAegisSupportCondition.ACBonus = requiredACAddition; - defenderCharacter.RefreshArmorClass(true); - console.AddEntry(entry); } private sealed class EldritchAegisSupportRulesetCondition : @@ -1264,41 +1249,39 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var actionService = ServiceRepository.GetService(); - var actionParams = new CharacterActionParams(helper, (Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionEldritchWard".Formatted(Category.Reaction, defender.Name) - }; - var count = actionService.PendingReactionRequestGroups.Count; + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "EldritchWard", + "CustomReactionEldritchWard".Formatted(Category.Reaction, defender.Name), + ReactionValidated, + battleManager: battleManager, + resource: new ReactionResourceEldritchVersatilityPoints(requiredSaveAddition)); - RequestCustomReaction(actionService, "EldritchWard", actionParams, requiredSaveAddition); + yield break; - yield return battleManager.WaitForReactions(attacker, actionService, count); - - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - supportCondition.TryEarnOrSpendPoints( - PointAction.Modify, PointUsage.EldritchWard, requiredSaveAddition); + supportCondition.TryEarnOrSpendPoints( + PointAction.Modify, PointUsage.EldritchWard, requiredSaveAddition); - action.SaveOutcome = RollOutcome.Success; - action.saveOutcomeDelta = 0; + action.SaveOutcome = RollOutcome.Success; + action.saveOutcomeDelta = 0; - var console = Gui.Game.GameConsole; - var entry = - new GameConsoleEntry("Feedback/&EldritchWardGivesSaveBonus", console.consoleTableDefinition) - { - Indent = true - }; + var console = Gui.Game.GameConsole; + var entry = + new GameConsoleEntry("Feedback/&EldritchWardGivesSaveBonus", console.consoleTableDefinition) + { + Indent = true + }; - console.AddCharacterEntry(rulesetHelper, entry); - entry.AddParameter(ConsoleStyleDuplet.ParameterType.Positive, $"{requiredSaveAddition}"); - entry.AddParameter(ConsoleStyleDuplet.ParameterType.SuccessfulRoll, - Gui.Format(GameConsole.SaveSuccessOutcome, action.GetSaveDC().ToString())); + console.AddCharacterEntry(rulesetHelper, entry); + entry.AddParameter(ConsoleStyleDuplet.ParameterType.Positive, $"{requiredSaveAddition}"); + entry.AddParameter(ConsoleStyleDuplet.ParameterType.SuccessfulRoll, + Gui.Format(GameConsole.SaveSuccessOutcome, action.GetSaveDC().ToString())); - console.AddEntry(entry); + console.AddEntry(entry); + } } } From f3fa0fdabbf8a446afab7b814d38f9fbfe2063e1 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:46:10 -0700 Subject: [PATCH 090/162] change Wither and Bloom spell to use MyReactToDoNothing --- .../Spells/SpellBuildersLevel02.cs | 44 +++++++++++-------- 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs index 4b99934616..cd4ce2faa0 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs @@ -1190,6 +1190,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var attacker = action.ActingCharacter; var hasHealed = false; var effectLevel = rulesetEffectSpell.EffectLevel; + var passed = false; rulesetTarget.HitDieRolled += HitDieRolled; @@ -1199,28 +1200,22 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { var maxHitPoints = rulesetTarget.TryGetAttributeValue(AttributeDefinitions.HitPoints); var remainingHitPoints = maxHitPoints - rulesetTarget.MissingHitPoints; - var reactionParams = - new CharacterActionParams(_target, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = Gui.Format( - "Reaction/&CustomReactionWitherAndBloomDescription", - remainingHitPoints.ToString(), maxHitPoints.ToString(), attacker.Name, - _spellCastingAbilityModifier.ToString()) - }; - var reactionRequest = new ReactionRequestCustom("WitherAndBloom", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (!reactionParams.ReactionValidated) + yield return _target.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + attacker, + "WitherAndBloom", + "CustomReactionWitherAndBloomDescription".Formatted(Category.Reaction, + remainingHitPoints.ToString(), maxHitPoints.ToString(), attacker.Name, + _spellCastingAbilityModifier.ToString()), + ReactionValidated, + ReactionNotValidated, + battleManager); + + if (passed) { break; } - - hasHealed = true; - rulesetTarget.RollHitDie(); } rulesetTarget.HitDieRolled -= HitDieRolled; @@ -1229,6 +1224,19 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { EffectHelpers.StartVisualEffect(attacker, _target, CureWounds, EffectHelpers.EffectType.Effect); } + + yield break; + + void ReactionValidated() + { + hasHealed = true; + rulesetTarget.RollHitDie(); + } + + void ReactionNotValidated() + { + passed = true; + } } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) From 2c3112e96fa650706cbecd6621a3ebc84467a517 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:47:10 -0700 Subject: [PATCH 091/162] change Sorcerer magical guidance to use MyReactToDoNothing --- .../Models/CharacterContext.cs | 78 ++++++++----------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/CharacterContext.cs b/SolastaUnfinishedBusiness/Models/CharacterContext.cs index 5cc15b8968..cbe2f04849 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterContext.cs @@ -1242,13 +1242,9 @@ public IEnumerator OnTryAlterAttributeCheck( GameLocationCharacter helper, ActionModifier abilityCheckModifier) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var rulesetHelper = helper.RulesetCharacter; - if (!actionManager || - abilityCheckData.AbilityCheckRoll == 0 || + if (abilityCheckData.AbilityCheckRoll == 0 || abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure || helper != defender || rulesetHelper.RemainingSorceryPoints == 0) @@ -1256,49 +1252,43 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - var reactionParams = - new CharacterActionParams(helper, (Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionMagicalGuidanceCheckDescription".Formatted( - Category.Reaction, defender.Name, helper.Name) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - var reactionRequest = new ReactionRequestCustom("MagicalGuidanceCheck", reactionParams) - { - Resource = ReactionResourceSorceryPoints.Instance - }; + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + defender, + "MagicalGuidanceCheck", + "CustomReactionMagicalGuidanceCheckDescription" + .Formatted(Category.Reaction, defender.Name, helper.Name), + ReactionValidated, + battleManager: battleManager, + resource: ReactionResourceSorceryPoints.Instance); - actionManager.AddInterruptRequest(reactionRequest); + yield break; - yield return battleManager.WaitForReactions(defender, actionManager, count); - - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + rulesetHelper.SpendSorceryPoints(1); + + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = abilityCheckData.AbilityCheckRoll; + + abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; + abilityCheckData.AbilityCheckRoll = dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; + + rulesetHelper.LogCharacterActivatesAbility( + "Feature/&FeatureSorcererMagicalGuidanceTitle", + "Feedback/&MagicalGuidanceCheckToHitRoll", + extra: + [ + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) + ]); } - - rulesetHelper.SpendSorceryPoints(1); - - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = abilityCheckData.AbilityCheckRoll; - - abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; - abilityCheckData.AbilityCheckRoll = dieRoll; - abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? RollOutcome.Success - : RollOutcome.Failure; - - rulesetHelper.LogCharacterActivatesAbility( - "Feature/&FeatureSorcererMagicalGuidanceTitle", - "Feedback/&MagicalGuidanceCheckToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } } From d61a6ac9ef95a204368cf395e12a10ddb3c224bb Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:50:46 -0700 Subject: [PATCH 092/162] change Interception FS to use MyReactToDoNothing --- .../FightingStyles/Interception.cs | 64 ++++++++----------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs index 50c0e406ee..2adf631da9 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs @@ -76,14 +76,6 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - if (helper == defender || helper.IsOppositeSide(defender.Side) || !helper.CanReact() || @@ -101,40 +93,36 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionInterceptionDescription" - .Formatted(Category.Reaction, defender.Name, attacker.Name) - }; - var reactionRequest = new ReactionRequestCustom(Name, reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + Name, + "CustomReactionInterceptionDescription".Formatted(Category.Reaction, defender.Name, attacker.Name), + ReactionValidated, + battleManager: battleManager); - actionManager.AddInterruptRequest(reactionRequest); + yield break; - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + var roll = helperCharacter.RollDie(DieType.D10, RollContext.None, true, AdvantageType.None, out _, + out _); + var reducedDamage = roll + helperCharacter.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); + + defender.RulesetActor.InflictCondition( + conditionDefinition.Name, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + helperCharacter.guid, + helperCharacter.CurrentFaction.Name, + 1, + conditionDefinition.Name, + reducedDamage, + 0, + 0); } - - var roll = helperCharacter.RollDie(DieType.D10, RollContext.None, true, AdvantageType.None, out _, out _); - var reducedDamage = roll + helperCharacter.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); - - defender.RulesetActor.InflictCondition( - conditionDefinition.Name, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - helperCharacter.guid, - helperCharacter.CurrentFaction.Name, - 1, - conditionDefinition.Name, - reducedDamage, - 0, - 0); } } } From 2ceae700dc63b99faaac69210f48697173a553f5 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:51:27 -0700 Subject: [PATCH 093/162] change Bountiful Luck feat to use MyReactToDoNothing --- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 548 +++++++++---------- 1 file changed, 249 insertions(+), 299 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index f35c13bc5e..049a70b485 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -671,78 +671,71 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionBountifulLuckAttackDescription".Formatted( - Category.Reaction, attacker.Name, defender.Name, helper.Name) - }; - var count = actionManager.PendingReactionRequestGroups.Count; + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "BountifulLuckAttack", + "CustomReactionBountifulLuckAttackDescription".Formatted(Category.Reaction, attacker.Name, + defender.Name, helper.Name), + ReactionValidated, + battleManager: battleManager); + + yield break; - var reactionRequest = new ReactionRequestCustom("BountifulLuckAttack", reactionParams) + void ReactionValidated() { - Resource = ReactionResourceChannelDivinity.Instance - }; + var rulesetHelper = helper.RulesetCharacter; + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = action.AttackRoll; - actionManager.AddInterruptRequest(reactionRequest); + if (dieRoll <= action.AttackRoll) + { + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatBountifulLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, action.AttackRoll.ToString()) + ]); + + return; + } - yield return battleManager.WaitForReactions(attacker, actionManager, count); + action.AttackSuccessDelta += dieRoll - action.AttackRoll; + action.AttackRoll = dieRoll; - if (!reactionParams.ReactionValidated) - { - yield break; - } + if (action.AttackSuccessDelta >= 0) + { + action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; + } - var rulesetHelper = helper.RulesetCharacter; - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = action.AttackRoll; + rulesetHelper.InflictCondition( + conditionBountifulLuck.Name, + DurationType.Round, + 1, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, + 1, + conditionBountifulLuck.Name, + 0, + 0, + 0); - if (dieRoll <= action.AttackRoll) - { rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckyTitle", - "Feedback/&IsNotLuckyLower", + "Feat/&FeatBountifulLuckTitle", + "Feedback/&BountifulLuckAttackToHitRoll", extra: [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, action.AttackRoll.ToString()) + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) ]); - - yield break; - } - - action.AttackSuccessDelta += dieRoll - action.AttackRoll; - action.AttackRoll = dieRoll; - - if (action.AttackSuccessDelta >= 0) - { - action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; } - - rulesetHelper.InflictCondition( - conditionBountifulLuck.Name, - DurationType.Round, - 1, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetHelper.guid, - rulesetHelper.CurrentFaction.Name, - 1, - conditionBountifulLuck.Name, - 0, - 0, - 0); - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckTitle", - "Feedback/&BountifulLuckAttackToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } public IEnumerator OnTryAlterAttributeCheck( @@ -767,76 +760,68 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionBountifulLuckCheckDescription".Formatted( - Category.Reaction, defender.Name, helper.Name) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - var reactionRequest = new ReactionRequestCustom("BountifulLuckCheck", reactionParams) - { - Resource = ReactionResourceChannelDivinity.Instance - }; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + defender, + "BountifulLuckCheck", + "CustomReactionBountifulLuckCheckDescription".Formatted(Category.Reaction, defender.Name, helper.Name), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(defender, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var rulesetHelper = helper.RulesetCharacter; + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = abilityCheckData.AbilityCheckRoll; - var rulesetHelper = helper.RulesetCharacter; - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = abilityCheckData.AbilityCheckRoll; + if (dieRoll <= abilityCheckData.AbilityCheckRoll) + { + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatBountifulLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, abilityCheckData.AbilityCheckRoll.ToString()) + ]); + + return; + } + + abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; + abilityCheckData.AbilityCheckRoll = dieRoll; + abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 + ? RollOutcome.Success + : RollOutcome.Failure; + + rulesetHelper.InflictCondition( + conditionBountifulLuck.Name, + DurationType.Round, + 1, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, + 1, + conditionBountifulLuck.Name, + 0, + 0, + 0); - if (dieRoll <= abilityCheckData.AbilityCheckRoll) - { rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckyTitle", - "Feedback/&IsNotLuckyLower", + "Feat/&FeatBountifulLuckTitle", + "Feedback/&BountifulLuckCheckToHitRoll", extra: [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, abilityCheckData.AbilityCheckRoll.ToString()) + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) ]); - - yield break; } - - abilityCheckData.AbilityCheckSuccessDelta += dieRoll - abilityCheckData.AbilityCheckRoll; - abilityCheckData.AbilityCheckRoll = dieRoll; - abilityCheckData.AbilityCheckRollOutcome = abilityCheckData.AbilityCheckSuccessDelta >= 0 - ? RollOutcome.Success - : RollOutcome.Failure; - - rulesetHelper.InflictCondition( - conditionBountifulLuck.Name, - DurationType.Round, - 1, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetHelper.guid, - rulesetHelper.CurrentFaction.Name, - 1, - conditionBountifulLuck.Name, - 0, - 0, - 0); - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckTitle", - "Feedback/&BountifulLuckCheckToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } public IEnumerator OnTryAlterOutcomeSavingThrow( @@ -873,70 +858,63 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionBountifulLuckSavingDescription".Formatted( - Category.Reaction, defender.Name, attacker.Name, helper.Name) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - var reactionRequest = new ReactionRequestCustom("BountifulLuckSaving", reactionParams) - { - Resource = ReactionResourceChannelDivinity.Instance - }; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "BountifulLuckSaving", + "CustomReactionBountifulLuckSavingDescription".Formatted(Category.Reaction, defender.Name, + attacker.Name, helper.Name), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + var rulesetHelper = helper.RulesetCharacter; + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); - var rulesetHelper = helper.RulesetCharacter; - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); + if (dieRoll <= savingRoll) + { + rulesetHelper.LogCharacterActivatesAbility( + "Feat/&FeatBountifulLuckyTitle", + "Feedback/&IsNotLuckyLower", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Positive, savingRoll.ToString()) + ]); + + return; + } + + action.SaveOutcomeDelta += dieRoll - savingRoll; + action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; + + rulesetHelper.InflictCondition( + conditionBountifulLuck.Name, + DurationType.Round, + 1, + TurnOccurenceType.EndOfTurn, + AttributeDefinitions.TagEffect, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, + 1, + conditionBountifulLuck.Name, + 0, + 0, + 0); - if (dieRoll <= savingRoll) - { rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckyTitle", - "Feedback/&IsNotLuckyLower", + "Feat/&FeatBountifulLuckTitle", + "Feedback/&BountifulLuckSavingToHitRoll", extra: [ - (ConsoleStyleDuplet.ParameterType.Negative, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Positive, savingRoll.ToString()) + (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), + (ConsoleStyleDuplet.ParameterType.Negative, savingRoll.ToString()) ]); - - yield break; } - - action.SaveOutcomeDelta += dieRoll - savingRoll; - action.SaveOutcome = action.SaveOutcomeDelta >= 0 ? RollOutcome.Success : RollOutcome.Failure; - - rulesetHelper.InflictCondition( - conditionBountifulLuck.Name, - DurationType.Round, - 1, - TurnOccurenceType.EndOfTurn, - AttributeDefinitions.TagEffect, - rulesetHelper.guid, - rulesetHelper.CurrentFaction.Name, - 1, - conditionBountifulLuck.Name, - 0, - 0, - 0); - - rulesetHelper.LogCharacterActivatesAbility( - "Feat/&FeatBountifulLuckTitle", - "Feedback/&BountifulLuckSavingToHitRoll", - extra: - [ - (ConsoleStyleDuplet.ParameterType.Positive, dieRoll.ToString()), - (ConsoleStyleDuplet.ParameterType.Negative, savingRoll.ToString()) - ]); } } @@ -1176,16 +1154,6 @@ public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) yield break; } - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = - ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } - var attacker = characterAction.ActingCharacter; var rulesetAttacker = attacker.RulesetCharacter; var rulesetHero = rulesetAttacker.GetOriginalHero(); @@ -1195,27 +1163,22 @@ public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) yield break; } - var reactionParams = - new CharacterActionParams(attacker, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = "Reaction/&CustomReactionDwarvenFortitudeDescription" - }; - var reactionRequest = new ReactionRequestCustom("DwarvenFortitude", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "DwarvenFortitude", + "CustomReactionDwarvenFortitudeDescription".Formatted(Category.Reaction), + ReactionValidated); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; + EffectHelpers.StartVisualEffect(attacker, attacker, CureWounds, EffectHelpers.EffectType.Effect); + rulesetHero.HitDieRolled += HitDieRolled; + rulesetHero.RollHitDie(); + rulesetHero.HitDieRolled -= HitDieRolled; } - - EffectHelpers.StartVisualEffect(attacker, attacker, CureWounds, EffectHelpers.EffectType.Effect); - rulesetHero.HitDieRolled += HitDieRolled; - rulesetHero.RollHitDie(); - rulesetHero.HitDieRolled -= HitDieRolled; } private void HitDieRolled( @@ -1920,15 +1883,6 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - - var rulesetDefender = defender.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || @@ -1940,102 +1894,98 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var reactionParams = - new CharacterActionParams(defender, (ActionDefinitions.Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "Reaction/&CustomReactionSecondChanceDescription" - }; - var reactionRequest = new ReactionRequestCustom("SecondChance", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return attacker.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "SecondChance", + "CustomReactionSecondChanceDescription".Formatted(Category.Reaction), + ReactionValidated, + battleManager: battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - rulesetDefender.InflictCondition( - conditionSecondChance.Name, - DurationType.UntilAnyRest, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - rulesetDefender.guid, - rulesetDefender.CurrentFaction.Name, - 1, - conditionSecondChance.Name, - 0, - 0, - 0); - - var attackRoll = action.AttackRoll; - var outcome = action.AttackRollOutcome; - var rollCaption = outcome == RollOutcome.CriticalSuccess - ? "Feedback/&RollAttackCriticalSuccessTitle" - : "Feedback/&RollAttackSuccessTitle"; - - var rulesetAttacker = attacker.RulesetCharacter; + rulesetDefender.InflictCondition( + conditionSecondChance.Name, + DurationType.UntilAnyRest, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + rulesetDefender.guid, + rulesetDefender.CurrentFaction.Name, + 1, + conditionSecondChance.Name, + 0, + 0, + 0); + + var attackRoll = action.AttackRoll; + var outcome = action.AttackRollOutcome; + var rollCaption = outcome == RollOutcome.CriticalSuccess + ? "Feedback/&RollAttackCriticalSuccessTitle" + : "Feedback/&RollAttackSuccessTitle"; + + var rulesetAttacker = attacker.RulesetCharacter; + + int roll; + int toHitBonus; + int successDelta; + + if (attackMode != null) + { + toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; + roll = rulesetAttacker.RollAttack( + toHitBonus, + defender.RulesetActor, + attackMode.SourceDefinition, + attackMode.ToHitBonusTrends, + false, + actionModifier.AttackAdvantageTrends, + attackMode.ranged, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + else if (rulesetEffect != null) + { + toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; + roll = rulesetAttacker.RollMagicAttack( + rulesetEffect, + defender.RulesetActor, + rulesetEffect.GetEffectSource(), + actionModifier.AttacktoHitTrends, + actionModifier.AttackAdvantageTrends, + false, + actionModifier.AttackRollModifier, + out outcome, + out successDelta, + -1, + true); + } + // should never happen + else + { + return; + } - int roll; - int toHitBonus; - int successDelta; + var sign = toHitBonus > 0 ? "+" : string.Empty; - if (attackMode != null) - { - toHitBonus = attackMode.ToHitBonus + actionModifier.AttackRollModifier; - roll = rulesetAttacker.RollAttack( - toHitBonus, - defender.RulesetActor, - attackMode.SourceDefinition, - attackMode.ToHitBonusTrends, - false, - actionModifier.AttackAdvantageTrends, - attackMode.ranged, - false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - else if (rulesetEffect != null) - { - toHitBonus = rulesetEffect.MagicAttackBonus + actionModifier.AttackRollModifier; - roll = rulesetAttacker.RollMagicAttack( - rulesetEffect, - defender.RulesetActor, - rulesetEffect.GetEffectSource(), - actionModifier.AttacktoHitTrends, - actionModifier.AttackAdvantageTrends, + rulesetDefender.LogCharacterUsedFeature( + featureSecondChance, + "Feedback/&TriggerRerollLine", false, - actionModifier.AttackRollModifier, - out outcome, - out successDelta, - -1, - true); - } - // should never happen - else - { - yield break; - } - - var sign = toHitBonus > 0 ? "+" : string.Empty; + (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), + (ConsoleStyleDuplet.ParameterType.FailedRoll, + Gui.Format(rollCaption, $"{attackRoll + toHitBonus}"))); - rulesetDefender.LogCharacterUsedFeature( - featureSecondChance, - "Feedback/&TriggerRerollLine", - false, - (ConsoleStyleDuplet.ParameterType.Base, $"{attackRoll}{sign}{toHitBonus}"), - (ConsoleStyleDuplet.ParameterType.FailedRoll, - Gui.Format(rollCaption, $"{attackRoll + toHitBonus}"))); - - action.AttackRollOutcome = outcome; - action.AttackSuccessDelta = successDelta; - action.AttackRoll = roll; + action.AttackRollOutcome = outcome; + action.AttackSuccessDelta = successDelta; + action.AttackRoll = roll; + } } } From c1abb96b0c8380c4fd7ec01912eff8755e178d68 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:53:53 -0700 Subject: [PATCH 094/162] change Mage Slayer feat to use MyReactToSpendPower --- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 43 ++++++++----------- .../Translations/de/Feats/OtherFeats-de.txt | 8 ++-- .../Translations/en/Feats/OtherFeats-en.txt | 8 ++-- .../Translations/es/Feats/OtherFeats-es.txt | 8 ++-- .../Translations/fr/Feats/OtherFeats-fr.txt | 8 ++-- .../Translations/it/Feats/OtherFeats-it.txt | 10 ++--- .../Translations/ja/Feats/OtherFeats-ja.txt | 8 ++-- .../Translations/ko/Feats/OtherFeats-ko.txt | 8 ++-- .../pt-BR/Feats/OtherFeats-pt-BR.txt | 8 ++-- .../Translations/ru/Feats/OtherFeats-ru.txt | 8 ++-- .../zh-CN/Feats/OtherFeats-zh-CN.txt | 8 ++-- 11 files changed, 58 insertions(+), 67 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 65e286ed58..dc7448f4f2 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2323,48 +2323,39 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(PowerMageSlayerSaving, rulesetDefender); + var effectDescription = action.ActionParams.AttackMode?.EffectDescription ?? action.ActionParams.RulesetEffect?.EffectDescription; - if (!actionManager || - helper != defender || + if (helper != defender || !action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || - rulesetDefender.GetRemainingPowerUses(PowerMageSlayerSaving) == 0 || + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0 || effectDescription?.savingThrowAbility is not (AttributeDefinitions.Intelligence or AttributeDefinitions.Wisdom or AttributeDefinitions.Charisma)) { yield break; } - var usablePower = PowerProvider.Get(PowerMageSlayerSaving, rulesetDefender); - var reactionParams = new CharacterActionParams(defender, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = - "CustomReactionMageSlayerDescription".Formatted(Category.Reaction, attacker.Name), - UsablePower = usablePower - }; - var reactionRequest = new ReactionRequestCustom("MageSlayer", reactionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); + yield return defender.MyReactToSpendPower( + usablePower, + attacker, + "MageSlayer", + "CustomReactionMageSlayerDescription".Formatted(Category.Reaction, attacker.Name), + ReactionValidated, + battleManager); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + action.SaveOutcomeDelta = 0; + action.SaveOutcome = RollOutcome.Success; - action.SaveOutcomeDelta = 0; - action.SaveOutcome = RollOutcome.Success; - - rulesetDefender.UsePower(usablePower); - rulesetDefender.LogCharacterUsedPower(PowerMageSlayerSaving); + rulesetDefender.LogCharacterUsedPower(PowerMageSlayerSaving); + } } internal static IEnumerator HandleEnemyCastSpellWithin5Ft( diff --git a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt index 3e910c4078..ebc5d0b2d0 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} hat {1} verwendet und würfelt eine {2}, um {3 Feedback/&LuckySavingToHitRoll={0} hat {1} verwendet und würfelt beim Rettungswurf eine {2}, um {3} zu ersetzen Item/&ItemFeatChefTreatDescription=Essen Sie diese Leckerei vom Küchenchef und erhalten Sie 5 temporäre Trefferpunkte. Item/&ItemFeatChefTreatTitle=Leckerbissen vom Küchenchef -Reaction/&CustomReactionMageSlayerDescription=Der Rettungswurf gegen {0} ist Ihnen misslungen. Sie können stattdessen dafür sorgen, dass Ihr Wurf erfolgreich ist. -Reaction/&CustomReactionMageSlayerReactDescription=Sorgen Sie stattdessen dafür, dass Sie erfolgreich sind. -Reaction/&CustomReactionMageSlayerReactTitle=Gelingen -Reaction/&CustomReactionMageSlayerTitle=Magiertöter +Reaction/&SpendPowerMageSlayerDescription=Der Rettungswurf gegen {0} ist Ihnen misslungen. Sie können stattdessen dafür sorgen, dass Ihr Wurf erfolgreich ist. +Reaction/&SpendPowerMageSlayerReactDescription=Sorgen Sie stattdessen dafür, dass Sie erfolgreich sind. +Reaction/&SpendPowerMageSlayerReactTitle=Gelingen +Reaction/&SpendPowerMageSlayerTitle=Magiertöter Reaction/&ReactionAttackMageSlayerDescription={0} Wirke einen Zauber in einem Umkreis von 1,5 m um dich herum. Du kannst deine Reaktion zum Angreifen nutzen. Reaction/&ReactionAttackMageSlayerReactDescription=Verwenden Sie die Reaktion, um das Ziel anzugreifen. Reaction/&ReactionAttackMageSlayerReactTitle=Attacke diff --git a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt index 9115f85e0f..7eefb81083 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} used {1} and rolls a {2} to replace {3} on the Feedback/&LuckySavingToHitRoll={0} used {1} and rolls a {2} to replace {3} on the saving roll Item/&ItemFeatChefTreatDescription=Eat this Chef's treat and gain 5 temporary hit points. Item/&ItemFeatChefTreatTitle=Chef's Treat -Reaction/&CustomReactionMageSlayerDescription=You failed a saving throw against {0}. You can cause yourself to succeed instead. -Reaction/&CustomReactionMageSlayerReactDescription=Cause yourself to succeed instead. -Reaction/&CustomReactionMageSlayerReactTitle=Succeed -Reaction/&CustomReactionMageSlayerTitle=Mage Slayer +Reaction/&SpendPowerMageSlayerDescription=You failed a saving throw against {0}. You can cause yourself to succeed instead. +Reaction/&SpendPowerMageSlayerReactDescription=Cause yourself to succeed instead. +Reaction/&SpendPowerMageSlayerReactTitle=Succeed +Reaction/&SpendPowerMageSlayerTitle=Mage Slayer Reaction/&ReactionAttackMageSlayerDescription={0} cast a spell within 5 ft of you. You can use your reaction to attack. Reaction/&ReactionAttackMageSlayerReactDescription=Use reaction to attack target. Reaction/&ReactionAttackMageSlayerReactTitle=Attack diff --git a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt index a6821589a0..e97a9b28f3 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} usó {1} y saca un {2} para reemplazar a {3} e Feedback/&LuckySavingToHitRoll={0} usó {1} y saca un {2} para reemplazar a {3} en la tirada de salvación Item/&ItemFeatChefTreatDescription=Come esta delicia del chef y gana 5 puntos de vida temporales. Item/&ItemFeatChefTreatTitle=Delicia del chef -Reaction/&CustomReactionMageSlayerDescription=Fallaste una tirada de salvación contra {0}. Puedes hacer que tú mismo la superes. -Reaction/&CustomReactionMageSlayerReactDescription=Haz que tú mismo triunfes. -Reaction/&CustomReactionMageSlayerReactTitle=Tener éxito -Reaction/&CustomReactionMageSlayerTitle=Asesino de magos +Reaction/&SpendPowerMageSlayerDescription=Fallaste una tirada de salvación contra {0}. Puedes hacer que tú mismo la superes. +Reaction/&SpendPowerMageSlayerReactDescription=Haz que tú mismo triunfes. +Reaction/&SpendPowerMageSlayerReactTitle=Tener éxito +Reaction/&SpendPowerMageSlayerTitle=Asesino de magos Reaction/&ReactionAttackMageSlayerDescription={0} lanza un hechizo a 5 pies de ti. Puedes usar tu reacción para atacar. Reaction/&ReactionAttackMageSlayerReactDescription=Utilice la reacción para atacar al objetivo. Reaction/&ReactionAttackMageSlayerReactTitle=Ataque diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt index 7db5b72310..ed813a26e0 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} a utilisé {1} et lance un {2} pour remplacer Feedback/&LuckySavingToHitRoll={0} a utilisé {1} et lance un {2} pour remplacer {3} sur le jet de sauvegarde Item/&ItemFeatChefTreatDescription=Mangez cette friandise du chef et gagnez 5 points de vie temporaires. Item/&ItemFeatChefTreatTitle=Régal du chef -Reaction/&CustomReactionMageSlayerDescription=Vous avez raté un jet de sauvegarde contre {0}. Vous pouvez vous forcer à le réussir à la place. -Reaction/&CustomReactionMageSlayerReactDescription=Faites plutôt en sorte que vous réussissiez. -Reaction/&CustomReactionMageSlayerReactTitle=Réussir -Reaction/&CustomReactionMageSlayerTitle=Tueur de mages +Reaction/&SpendPowerMageSlayerDescription=Vous avez raté un jet de sauvegarde contre {0}. Vous pouvez vous forcer à le réussir à la place. +Reaction/&SpendPowerMageSlayerReactDescription=Faites plutôt en sorte que vous réussissiez. +Reaction/&SpendPowerMageSlayerReactTitle=Réussir +Reaction/&SpendPowerMageSlayerTitle=Tueur de mages Reaction/&ReactionAttackMageSlayerDescription={0} lance un sort à 1,50 m de vous. Vous pouvez utiliser votre réaction pour attaquer. Reaction/&ReactionAttackMageSlayerReactDescription=Utilisez la réaction pour attaquer la cible. Reaction/&ReactionAttackMageSlayerReactTitle=Attaque diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt index 3266c408a3..4360592d19 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt @@ -38,7 +38,7 @@ Feat/&FeatFrostAdaptationDescription=Aumenta la tua Costituzione di 1, fino a un Feat/&FeatFrostAdaptationTitle=Adattamento al gelo Feat/&FeatGiftOfTheChromaticDragonDescription=Hai manifestato parte del potere dei draghi cromatici, che ti garantisce i seguenti benefici:\n• Infusione cromatica: come azione bonus, puoi toccare un'arma semplice o da guerra e infonderla con uno dei seguenti tipi di danno: acido, freddo, fuoco, fulmine o veleno. Per il minuto successivo, l'arma infligge 1d4 danni extra del tipo scelto quando colpisce. Dopo aver usato questa azione bonus, non puoi farlo di nuovo finché non hai completato un lungo riposo.\n• Resistenza reattiva: quando subisci danni da acido, freddo, fuoco, fulmine o veleno, puoi usare la tua reazione per darti resistenza a quell'istanza di danno fino alla fine del suo turno. Puoi usare questa reazione un numero di volte pari al tuo bonus di competenza e recuperi tutti gli usi spesi quando completi un lungo riposo. Feat/&FeatGiftOfTheChromaticDragonTitle=Dono del Drago Cromatico -Feat/&FeatGroupSkillExpertDescription=Hai affinato la tua competenza con particolari abilità, garantendoti i seguenti vantaggi:\n• Aumenta un punteggio di caratteristica a tua scelta di 1, fino a un massimo di 20.\n• Ottieni competenza in un'abilità a tua scelta.{ 99}• Acquisisci esperienza in un'abilità a tua scelta. +Feat/&FeatGroupSkillExpertDescription=Hai affinato la tua competenza con particolari abilità, garantendoti i seguenti vantaggi:\n• Aumenta un punteggio di caratteristica a tua scelta di 1, fino a un massimo di 20.\n• Ottieni competenza in un'abilità a tua scelta.{0}• Acquisisci esperienza in un'abilità a tua scelta. Feat/&FeatGroupSkillExpertTitle=Esperto di abilità Feat/&FeatHealerDescription=Ottieni competenza o esperienza nelle prove di Medicina. Ottieni la capacità di stabilizzare una creatura morente una volta per ogni riposo lungo. È possibile utilizzare un'azione per ripristinare 1d6 + 4 + punti ferita a livello del personaggio un numero di volte per riposo lungo pari al proprio modificatore di Saggezza. Feat/&FeatHealerTitle=Guaritore @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} ha usato {1} e tira un {2} per sostituire {3} Feedback/&LuckySavingToHitRoll={0} ha usato {1} e tira un {2} per sostituire {3} nel tiro salvezza Item/&ItemFeatChefTreatDescription=Mangia questa delizia dello Chef e ottieni 5 punti ferita temporanei. Item/&ItemFeatChefTreatTitle=La delizia dello chef -Reaction/&CustomReactionMageSlayerDescription=Hai fallito un tiro salvezza contro {0}. Puoi invece farti superare. -Reaction/&CustomReactionMageSlayerReactDescription=Piuttosto, fai in modo che tu riesca. -Reaction/&CustomReactionMageSlayerReactTitle=Avere successo -Reaction/&CustomReactionMageSlayerTitle=Cacciatore di maghi +Reaction/&SpendPowerMageSlayerDescription=Hai fallito un tiro salvezza contro {0}. Puoi invece farti superare. +Reaction/&SpendPowerMageSlayerReactDescription=Piuttosto, fai in modo che tu riesca. +Reaction/&SpendPowerMageSlayerReactTitle=Avere successo +Reaction/&SpendPowerMageSlayerTitle=Cacciatore di maghi Reaction/&ReactionAttackMageSlayerDescription={0} lancia un incantesimo entro 5 piedi da te. Puoi usare la tua reazione per attaccare. Reaction/&ReactionAttackMageSlayerReactDescription=Usa la reazione per attaccare il bersaglio. Reaction/&ReactionAttackMageSlayerReactTitle=Attacco diff --git a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt index 677fd01987..12706f3e02 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} は {1} を使用し、チェックロール Feedback/&LuckySavingToHitRoll={0} は {1} を使用し、セービング ロールの {3} を置き換えるために {2} をロールしました。 Item/&ItemFeatChefTreatDescription=このシェフのおやつを食べると、一時的に 5 ヒット ポイントを獲得します。 Item/&ItemFeatChefTreatTitle=シェフのごちそう -Reaction/&CustomReactionMageSlayerDescription={0} に対するセーヴィング スローに失敗しました。代わりに自分自身を成功させることもできます。 -Reaction/&CustomReactionMageSlayerReactDescription=代わりに、あなた自身が成功するように努めてください。 -Reaction/&CustomReactionMageSlayerReactTitle=成功する -Reaction/&CustomReactionMageSlayerTitle=メイジスレイヤー +Reaction/&SpendPowerMageSlayerDescription={0} に対するセーヴィング スローに失敗しました。代わりに自分自身を成功させることもできます。 +Reaction/&SpendPowerMageSlayerReactDescription=代わりに、あなた自身が成功するように努めてください。 +Reaction/&SpendPowerMageSlayerReactTitle=成功する +Reaction/&SpendPowerMageSlayerTitle=メイジスレイヤー Reaction/&ReactionAttackMageSlayerDescription={0} はあなたの 5 フィート以内で呪文を唱えます。反応を利用して攻撃することができます。 Reaction/&ReactionAttackMageSlayerReactDescription=リアクションを利用してターゲットを攻撃します。 Reaction/&ReactionAttackMageSlayerReactTitle=攻撃 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt index ce9a2be5ab..482835e9e5 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0}은(는) {1}을(를) 사용했고 수표 판정 Feedback/&LuckySavingToHitRoll={0}은(는) {1}을(를) 사용했고 {2}를 굴려 저장 판정의 {3}을 대체했습니다. Item/&ItemFeatChefTreatDescription=이 요리사의 간식을 먹고 5개의 임시 체력을 얻으십시오. Item/&ItemFeatChefTreatTitle=셰프의 간식 -Reaction/&CustomReactionMageSlayerDescription=당신은 {0}에 대한 내성 굴림에 실패했습니다. 대신에 스스로 성공할 수 있습니다. -Reaction/&CustomReactionMageSlayerReactDescription=대신 자신이 성공하도록 하세요. -Reaction/&CustomReactionMageSlayerReactTitle=성공하다 -Reaction/&CustomReactionMageSlayerTitle=메이지 슬레이어 +Reaction/&SpendPowerMageSlayerDescription=당신은 {0}에 대한 내성 굴림에 실패했습니다. 대신에 스스로 성공할 수 있습니다. +Reaction/&SpendPowerMageSlayerReactDescription=대신 자신이 성공하도록 하세요. +Reaction/&SpendPowerMageSlayerReactTitle=성공하다 +Reaction/&SpendPowerMageSlayerTitle=메이지 슬레이어 Reaction/&ReactionAttackMageSlayerDescription={0}님이 당신으로부터 5피트 이내에 주문을 걸었습니다. 반응을 이용해 공격할 수 있습니다. Reaction/&ReactionAttackMageSlayerReactDescription=반응을 사용하여 대상을 공격합니다. Reaction/&ReactionAttackMageSlayerReactTitle=공격 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt index 17af28de88..6d6c476a21 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} usou {1} e rola um {2} para substituir {3} na Feedback/&LuckySavingToHitRoll={0} usou {1} e rola um {2} para substituir {3} na jogada de salvamento Item/&ItemFeatChefTreatDescription=Coma esta delícia do Chef e ganhe 5 pontos de vida temporários. Item/&ItemFeatChefTreatTitle=Delícia do Chef -Reaction/&CustomReactionMageSlayerDescription=Você falhou em um teste de resistência contra {0}. Em vez disso, você pode ter sucesso. -Reaction/&CustomReactionMageSlayerReactDescription=Em vez disso, faça com que você tenha sucesso. -Reaction/&CustomReactionMageSlayerReactTitle=Ter sucesso -Reaction/&CustomReactionMageSlayerTitle=Matador de Magos +Reaction/&SpendPowerMageSlayerDescription=Você falhou em um teste de resistência contra {0}. Em vez disso, você pode ter sucesso. +Reaction/&SpendPowerMageSlayerReactDescription=Em vez disso, faça com que você tenha sucesso. +Reaction/&SpendPowerMageSlayerReactTitle=Ter sucesso +Reaction/&SpendPowerMageSlayerTitle=Matador de Magos Reaction/&ReactionAttackMageSlayerDescription={0} lança uma magia a até 5 pés de você. Você pode usar sua reação para atacar. Reaction/&ReactionAttackMageSlayerReactDescription=Use a reação para atacar o alvo. Reaction/&ReactionAttackMageSlayerReactTitle=Ataque diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt index 92af46f4f7..a762ed089a 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} использовал {1}, чтобы бро Feedback/&LuckySavingToHitRoll={0} использовал {1}, чтобы бросить {2} и заменить {3} на спасбросок Item/&ItemFeatChefTreatDescription=Съешьте это лакомство от шеф-повара и получите 5 временных хитов. Item/&ItemFeatChefTreatTitle=Лакомство от шеф-повара -Reaction/&CustomReactionMageSlayerDescription=Вы провалили спасбросок против {0}. Вы можете вместо этого обратить его в успех. -Reaction/&CustomReactionMageSlayerReactDescription=Вместо этого обратите спасбросок в успех. -Reaction/&CustomReactionMageSlayerReactTitle=Преуспеть -Reaction/&CustomReactionMageSlayerTitle=Убийца магов +Reaction/&SpendPowerMageSlayerDescription=Вы провалили спасбросок против {0}. Вы можете вместо этого обратить его в успех. +Reaction/&SpendPowerMageSlayerReactDescription=Вместо этого обратите спасбросок в успех. +Reaction/&SpendPowerMageSlayerReactTitle=Преуспеть +Reaction/&SpendPowerMageSlayerTitle=Убийца магов Reaction/&ReactionAttackMageSlayerDescription={0} наложил заклинание в пределах 5 футов от вас. Вы можете использовать свою реакцию для атаки. Reaction/&ReactionAttackMageSlayerReactDescription=Используйте реакцию, чтобы атаковать цель. Reaction/&ReactionAttackMageSlayerReactTitle=Атака diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt index 9994038677..b20ae19eb9 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt @@ -125,10 +125,10 @@ Feedback/&LuckyCheckToHitRoll={0} 使用 {1} 并掷出 {2} 以替换检定结果 Feedback/&LuckySavingToHitRoll={0} 使用 {1} 并掷出 {2} 以替换豁免检定上的 {3} Item/&ItemFeatChefTreatDescription=吃下大厨的美味并获得 5 点临时生命值。 Item/&ItemFeatChefTreatTitle=大厨的美味 -Reaction/&CustomReactionMageSlayerDescription=你对{0}的豁免失败。相反,你可以让自己成功。 -Reaction/&CustomReactionMageSlayerReactDescription=而是让自己成功。 -Reaction/&CustomReactionMageSlayerReactTitle=成功 -Reaction/&CustomReactionMageSlayerTitle=巫师杀手 +Reaction/&SpendPowerMageSlayerDescription=你对{0}的豁免失败。相反,你可以让自己成功。 +Reaction/&SpendPowerMageSlayerReactDescription=而是让自己成功。 +Reaction/&SpendPowerMageSlayerReactTitle=成功 +Reaction/&SpendPowerMageSlayerTitle=巫师杀手 Reaction/&ReactionAttackMageSlayerDescription={0} 在距你 5 尺的范围内施展了法术。你可以利用你的反应来攻击。 Reaction/&ReactionAttackMageSlayerReactDescription=利用反应来攻击目标。 Reaction/&ReactionAttackMageSlayerReactTitle=攻击 From 2a13b2249d2bd78f62a1f40b35c9ceb67dda41fd Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:54:39 -0700 Subject: [PATCH 095/162] fix foreign translations --- .../Translations/es/SubClasses/SorcerousSorrAkkath-es.txt | 2 +- SolastaUnfinishedBusiness/Translations/fr/Feats/Group-fr.txt | 2 +- SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt | 2 +- .../Translations/it/EldritchVersatilities-it.txt | 2 +- .../Translations/it/Feats/MeleeCombat-it.txt | 2 +- SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt | 2 +- .../Translations/it/Races/Battleborn-it.txt | 2 +- SolastaUnfinishedBusiness/Translations/it/Settings-it.txt | 2 +- .../Translations/it/Spells/Spells01-it.txt | 2 +- SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt | 2 +- .../Translations/ko/Feats/MeleeCombat-ko.txt | 2 +- SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousSorrAkkath-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousSorrAkkath-es.txt index 3ab0c34b3d..35eedd892f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousSorrAkkath-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/SorcerousSorrAkkath-es.txt @@ -2,7 +2,7 @@ Feature/&AdditionalDamageSorcerousSorrAkkathSpellSneakAttackDescription=Una vez Feature/&AdditionalDamageSorcerousSorrAkkathSpellSneakAttackTitle=Ataque furtivo con hechizos Feature/&FeatureSetSorcerousSorrAkkathBloodOfSorrAkkathDescription=A partir del nivel 6, te vuelves resistente al daño por veneno y obtienes inmunidad a la condición de envenenado. Además, golpear a una criatura con la característica Ataque furtivo con hechizos impone una tirada de salvación de Constitución a esa criatura. Si la criatura falla, queda envenenada hasta el final de tu siguiente turno. Feature/&FeatureSetSorcerousSorrAkkathBloodOfSorrAkkathTitle=Sangre de Sorr-Akkath -Feature/&FeatureSetSorcerousSorrAkkathDarknessAffinityDescription=A partir del nivel 14, mientras estás en condiciones de poca luz u oscuridad, obtienes lo siguiente:\n• +2 a CA.\n• +2 a las tiradas de ataque.\n• +2 a las tiradas de salvación.{99 }• +2 regeneración de puntos de vida al final de tu turno. +Feature/&FeatureSetSorcerousSorrAkkathDarknessAffinityDescription=A partir del nivel 14, mientras estás en condiciones de poca luz u oscuridad, obtienes lo siguiente:\n• +2 a CA.\n• +2 a las tiradas de ataque.\n• +2 a las tiradas de salvación.{0}• +2 regeneración de puntos de vida al final de tu turno. Feature/&FeatureSetSorcerousSorrAkkathDarknessAffinityTitle=Afinidad con la oscuridad Feature/&FeatureSetSorcerousSorrAkkathDeceptiveHeritageDescription=Te vuelves competente en habilidades de Sigilo y Engaño, aprendes el truco Púa venenosa y obtienes visión en la oscuridad de 60 pies. Feature/&FeatureSetSorcerousSorrAkkathDeceptiveHeritageTitle=Herencia engañosa diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/Group-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/Group-fr.txt index d04bdfdeb8..528defd01e 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/Group-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/Group-fr.txt @@ -6,7 +6,7 @@ Feat/&FeatGroupApothecaryDescription=Augmentez l'un de vos attributs mentaux de Feat/&FeatGroupApothecaryTitle=Apothicaire Feat/&FeatGroupArmorDescription={0} Feat/&FeatGroupArmorTitle=Armure -Feat/&FeatGroupAthleteDescription=Vous avez suivi un entraînement physique approfondi pour bénéficier des avantages suivants :\n• Augmentez votre score de force ou de dextérité de 1, jusqu'à un maximum de 20.\n• Lorsque vous êtes couché, vous lever ne vous coûte pas de mouvement.{ 99}• L'escalade ne vous coûte pas de mouvement supplémentaire.\n• Vous maîtrisez les compétences ou l'expertise en athlétisme si vous les maîtrisez déjà. +Feat/&FeatGroupAthleteDescription=Vous avez suivi un entraînement physique approfondi pour bénéficier des avantages suivants :\n• Augmentez votre score de force ou de dextérité de 1, jusqu'à un maximum de 20.\n• Lorsque vous êtes couché, vous lever ne vous coûte pas de mouvement.{0}• L'escalade ne vous coûte pas de mouvement supplémentaire.\n• Vous maîtrisez les compétences ou l'expertise en athlétisme si vous les maîtrisez déjà. Feat/&FeatGroupAthleteTitle=Athlète Feat/&FeatGroupAwakenTheBeastWithinDescription=Augmentez n'importe quelle caractéristique de 1, jusqu'à un maximum de 20. Chaque fois que vous utilisez votre capacité Forme sauvage pour vous transformer en bête, vous gagnez des points de vie temporaires égaux à deux fois votre niveau de druide. Feat/&FeatGroupAwakenTheBeastWithinTitle=Réveillez la bête diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt index 3b465e7744..764604cde0 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/Races-fr.txt @@ -30,7 +30,7 @@ Feat/&FeatFlamesOfPhlegethosIntDescription=Vous apprenez à invoquer le feu de l Feat/&FeatFlamesOfPhlegethosIntTitle=Flammes de Phlégéthos [Int] Feat/&FeatGrudgeBearerConDescription=Vous éprouvez une haine profonde pour un type particulier de créature. Choisissez vos ennemis, un type de créature qui portera le fardeau de votre colère : aberrations, bêtes, célestes, créatures artificielles, dragons, élémentaires, fées, démons, géants, monstruosités, limons, plantes ou morts-vivants. Vous obtenez les avantages suivants :\n• Augmentez votre Constitution de 1, jusqu'à un maximum de 20.\n• Pendant le premier round de tout combat contre vos ennemis choisis, vos jets d'attaque contre n'importe lequel d'entre eux ont l'avantage.\n• Lorsque l'un de vos ennemis choisis effectue une attaque d'opportunité contre vous, il fait en sorte que le jet d'attaque soit désavantagé. Feat/&FeatGrudgeBearerConTitle=Le rancunier [Con] -Feat/&FeatGrudgeBearerStrDescription=Vous avez une haine profonde pour un type particulier de créature. Choisissez vos ennemis, un type de créature pour supporter le fardeau de votre colère : aberrations, bêtes, célestes, constructions, dragons, élémentaires, fées, démons, géants, monstruosités, limons, plantes ou morts-vivants. Vous bénéficiez des avantages suivants :\n• Augmentez votre force de 1, jusqu'à un maximum de 20.\n• Au cours du premier tour de tout combat contre les ennemis de votre choix, vos jets d'attaque contre l'un d'entre eux ont un avantage.{99 }• Lorsque l'un de vos ennemis choisis effectue une attaque d'opportunité contre vous, il effectue le jet d'attaque avec un désavantage. +Feat/&FeatGrudgeBearerStrDescription=Vous avez une haine profonde pour un type particulier de créature. Choisissez vos ennemis, un type de créature pour supporter le fardeau de votre colère : aberrations, bêtes, célestes, constructions, dragons, élémentaires, fées, démons, géants, monstruosités, limons, plantes ou morts-vivants. Vous bénéficiez des avantages suivants :\n• Augmentez votre force de 1, jusqu'à un maximum de 20.\n• Au cours du premier tour de tout combat contre les ennemis de votre choix, vos jets d'attaque contre l'un d'entre eux ont un avantage.{0}• Lorsque l'un de vos ennemis choisis effectue une attaque d'opportunité contre vous, il effectue le jet d'attaque avec un désavantage. Feat/&FeatGrudgeBearerStrTitle=Rancunier [Str] Feat/&FeatGrudgeBearerWisDescription=Vous éprouvez une haine profonde pour un type particulier de créature. Choisissez vos ennemis, un type de créature qui portera le fardeau de votre colère : aberrations, bêtes, célestes, créatures artificielles, dragons, élémentaires, fées, démons, géants, monstruosités, limons, plantes ou morts-vivants. Vous obtenez les avantages suivants :\n• Augmentez votre Sagesse de 1, jusqu'à un maximum de 20.\n• Pendant le premier round de tout combat contre vos ennemis choisis, vos jets d'attaque contre n'importe lequel d'entre eux ont l'avantage.\n• Lorsque l'un de vos ennemis choisis effectue une attaque d'opportunité contre vous, il fait subir un désavantage au jet d'attaque. Feat/&FeatGrudgeBearerWisTitle=Rancunier [Sag] diff --git a/SolastaUnfinishedBusiness/Translations/it/EldritchVersatilities-it.txt b/SolastaUnfinishedBusiness/Translations/it/EldritchVersatilities-it.txt index d0bc56a02a..c53f33990f 100644 --- a/SolastaUnfinishedBusiness/Translations/it/EldritchVersatilities-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/EldritchVersatilities-it.txt @@ -2,7 +2,7 @@ Action/&EldritchVersatilityDescription=Versatilità Eldritch che hai imparato Action/&EldritchVersatilityTitle=Versatilità Condition/&ConditionEldritchAegisAddACDescription=Bloccato da Eldritch Aegis Condition/&ConditionEldritchAegisAddACTitle=Egida soprannaturale -Feat/&FeatEldritchVersatilityAdeptDescription=Ottieni Versatilità Eldritch, con la dimensione del pool aumentata dal tuo bonus di competenza e Cambio di Versatilità. Impari 1 versatilità.{99Versatilità Eldritch: ottieni un Pool Eldritch, che ha un massimo del tuo livello da stregone. Ottieni 1 Punto Eldritch ogni volta che colpisci un nemico con Esplosione Eldritch. Dopo un lungo riposo, il pool viene ripristinato.{99Cambio di Versatilità: ogni turno, puoi passare da Forza, Intelligenza, Saggezza o Versatile. Se scegli un punteggio di abilità, considera il punteggio di abilità scelto come 10 + 2 * [Bonus di competenza] quando usi le versatilità. Se scegli Versatile, la tua Forza, Intelligenza e Saggezza ottengono un bonus pari alla quantità di versatilità che hai imparato. +Feat/&FeatEldritchVersatilityAdeptDescription=Ottieni Versatilità Eldritch, con la dimensione del pool aumentata dal tuo bonus di competenza e Cambio di Versatilità. Impari 1 versatilità.{0}Versatilità Eldritch: ottieni un Pool Eldritch, che ha un massimo del tuo livello da stregone. Ottieni 1 Punto Eldritch ogni volta che colpisci un nemico con Esplosione Eldritch. Dopo un lungo riposo, il pool viene ripristinato.{0}Cambio di Versatilità: ogni turno, puoi passare da Forza, Intelligenza, Saggezza o Versatile. Se scegli un punteggio di abilità, considera il punteggio di abilità scelto come 10 + 2 * [Bonus di competenza] quando usi le versatilità. Se scegli Versatile, la tua Forza, Intelligenza e Saggezza ottengono un bonus pari alla quantità di versatilità che hai imparato. Feat/&FeatEldritchVersatilityAdeptTitle=Esperto di versatilità Feature/&BattlefieldConversionDescription=Costo: minimo il doppio del tuo livello di slot magico patto e dei punti dimensione pool, metà rimborsati in caso di fallimento.\nIn combattimento, se hai speso degli slot magici patto, puoi usare un'azione bonus per effettuare una prova di Intelligenza (Arcano) con una CD di 8 + il tuo bonus di competenza. Se hai successo, recuperi uno slot magico patto. Quindi, a seconda del successo/fallimento, la CD di questa capacità aumenta/diminuisce del tuo livello di slot magico patto (non inferiore alla CD iniziale). La CD si azzera dopo un lungo riposo. Feature/&BattlefieldConversionTitle=Conversione del campo di battaglia [Int] diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt index b964190cdb..3259bd38e3 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt @@ -32,7 +32,7 @@ Feat/&FeatFellHandedDescription=Padroneggi l'ascia a mano, l'ascia da battaglia, Feat/&FeatFellHandedTitle=Caduto a mano Feat/&FeatFencerDescription=Se esegui l'azione Attacco durante il tuo turno mentre impugni un'arma da mischia a una mano o versatile e nessun'altra arma o scudo, puoi usare un'azione bonus per attaccare con l'arma che stai impugnando, aggiungendo il tuo modificatore di attributo al danno inflitto. Feat/&FeatFencerTitle=Schermidore -Feat/&FeatGreatWeaponDefenseDescription=Combatti strenuamente con armi di grandi dimensioni, ottenendo i seguenti vantaggi:\n• Quando riduci una creatura a 0 punti ferita o sferri un colpo critico con un'arma da mischia, la tua velocità di movimento aumenta di 15 piedi fino alla fine del tuo turno.{99 }• Quando effettui l'azione Attacco mentre impugni un'arma pesante da mischia o versatile con due mani, guadagni +2CA fino all'inizio del tuo turno successivo. Perdi questo beneficio se equipaggi un'arma o uno scudo diversi. +Feat/&FeatGreatWeaponDefenseDescription=Combatti strenuamente con armi di grandi dimensioni, ottenendo i seguenti vantaggi:\n• Quando riduci una creatura a 0 punti ferita o sferri un colpo critico con un'arma da mischia, la tua velocità di movimento aumenta di 15 piedi fino alla fine del tuo turno.{0}• Quando effettui l'azione Attacco mentre impugni un'arma pesante da mischia o versatile con due mani, guadagni +2CA fino all'inizio del tuo turno successivo. Perdi questo beneficio se equipaggi un'arma o uno scudo diversi. Feat/&FeatGreatWeaponDefenseTitle=Fervore di battaglia Feat/&FeatLongswordFinesseDescription=Discendi da un maestro della spada lunga e parte di quella maestria ti è stata trasmessa. Ottieni i seguenti benefici:\n• Aumenta la tua Destrezza di 1, fino a un massimo di 20.\n• Mentre tieni in mano una spada lunga, ottieni un bonus di +1 alla CA.\n• La spada lunga ha la proprietà finezza quando la impugni. Feat/&FeatLongswordFinesseTitle=Finezza della spada lunga diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt index 5972f35acf..a66f5088a1 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/Races-it.txt @@ -32,7 +32,7 @@ Feat/&FeatGrudgeBearerConDescription=Hai un profondo odio per un particolare tip Feat/&FeatGrudgeBearerConTitle=Portatore di rancore [Con] Feat/&FeatGrudgeBearerStrDescription=Hai un profondo odio per un particolare tipo di creatura. Scegli i tuoi nemici, un tipo di creatura che sopporti il peso della tua ira: aberrazioni, bestie, celestiali, costrutti, draghi, elementali, fate, demoni, giganti, mostruosità, melme, piante o non morti. Ottieni i seguenti benefici:\n• Aumenta la tua Forza di 1, fino a un massimo di 20.\n• Durante il primo round di qualsiasi combattimento contro i tuoi nemici scelti, i tuoi tiri per colpire contro uno qualsiasi di loro hanno vantaggio.\n• Quando uno qualsiasi dei tuoi nemici scelti effettua un attacco di opportunità contro di te, effettua il tiro per colpire con svantaggio. Feat/&FeatGrudgeBearerStrTitle=Portatore di rancore [Str] -Feat/&FeatGrudgeBearerWisDescription=Hai un profondo odio per un particolare tipo di creatura. Scegli i tuoi nemici, un tipo di creatura su cui sopportare il peso della tua ira: aberrazioni, bestie, celestiali, costrutti, draghi, elementali, fate, immondi, giganti, mostruosità, melme, piante o non morti. Ottieni i seguenti vantaggi:\n• Aumenta la tua Saggezza di 1, fino a un massimo di 20.\n• Durante il primo round di qualsiasi combattimento contro i nemici scelti, i tuoi tiri per colpire contro uno qualsiasi di loro hanno vantaggio.{99 }• Quando uno qualsiasi dei nemici da te scelti effettua un attacco di opportunità contro di te, effettua il tiro per colpire con svantaggio. +Feat/&FeatGrudgeBearerWisDescription=Hai un profondo odio per un particolare tipo di creatura. Scegli i tuoi nemici, un tipo di creatura su cui sopportare il peso della tua ira: aberrazioni, bestie, celestiali, costrutti, draghi, elementali, fate, immondi, giganti, mostruosità, melme, piante o non morti. Ottieni i seguenti vantaggi:\n• Aumenta la tua Saggezza di 1, fino a un massimo di 20.\n• Durante il primo round di qualsiasi combattimento contro i nemici scelti, i tuoi tiri per colpire contro uno qualsiasi di loro hanno vantaggio.{0}• Quando uno qualsiasi dei nemici da te scelti effettua un attacco di opportunità contro di te, effettua il tiro per colpire con svantaggio. Feat/&FeatGrudgeBearerWisTitle=Portatore di rancore [Sag] Feat/&FeatInfernalConstitutionDescription=Il sangue diabolico scorre forte in te, sbloccando una resilienza simile a quella posseduta da alcuni demoni. Ottieni i seguenti benefici:\n• Aumenta la tua Costituzione di 1, fino a un massimo di 20.\n• Hai resistenza al freddo e ai danni da veleno.\n• Hai vantaggio sui tiri salvezza contro l'avvelenamento. Feat/&FeatInfernalConstitutionTitle=Costituzione Infernale diff --git a/SolastaUnfinishedBusiness/Translations/it/Races/Battleborn-it.txt b/SolastaUnfinishedBusiness/Translations/it/Races/Battleborn-it.txt index 646bd00fae..c1a7a8f271 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Races/Battleborn-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Races/Battleborn-it.txt @@ -1,7 +1,7 @@ Feature/&AttributeModifierBattlebornBonusACTitle=Resilienza Arcana Feature/&FeatureSetBattlebornAbilityScoreIncreaseDescription=Costituzione +2, aumenta 1 altro punteggio di 1 punto. Feature/&FeatureSetBattlebornAbilityScoreIncreaseTitle=Aumento del punteggio di abilità -Feature/&FeatureSetBattlebornArcaneResilienceDescription=Sei stato creato per avere una notevole forza d'animo, rappresentata dai seguenti vantaggi:\n• Ottieni un bonus di +1 alla CA.\n• Hai vantaggio ai tiri salvezza contro l'avvelenamento e hai resistenza ai danni da veleno.{ 99}• Sei immune alle malattie.\n• Non hai bisogno di dormire e la magia non può farti addormentare. +Feature/&FeatureSetBattlebornArcaneResilienceDescription=Sei stato creato per avere una notevole forza d'animo, rappresentata dai seguenti vantaggi:\n• Ottieni un bonus di +1 alla CA.\n• Hai vantaggio ai tiri salvezza contro l'avvelenamento e hai resistenza ai danni da veleno.{0}• Sei immune alle malattie.\n• Non hai bisogno di dormire e la magia non può farti addormentare. Feature/&FeatureSetBattlebornArcaneResilienceTitle=Resilienza Arcana Feature/&FeatureSetBattlebornSpecializedInfusionDescription=Ottieni una competenza in un'abilità e una competenza in uno strumento a tua scelta. Feature/&FeatureSetBattlebornSpecializedInfusionTitle=Infusione specializzata diff --git a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt index 78865803fd..23f1d796ae 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Settings-it.txt @@ -336,4 +336,4 @@ ModUi/&UseOfficialObscurementRules=Utilizza le regole ufficiali di combattimento ModUi/&UseOfficialObscurementRulesHelp=[l'attaccante che percepisce il difensore che non può percepirlo ottiene ADV, e l'attaccante che non percepisce il difensore che può percepirlo ottiene DIS\n le aree fortemente oscurate infliggono una condizione di accecato, dove i tiri di attacco contro la creatura ha ADV e i tiri per colpire della creatura hanno DIS\n tutti gli incantesimi a distanza che hanno come bersaglio individui non possono essere lanciati se l'attaccante non ha vista, ad eccezione di quelli che chiaramente non indicano che la vista è richiesta] ModUi/&UseOfficialSmallRacesDisWithHeavyWeapons=Utilizza le regole ufficiali delle piccole razze quando impugni armi pesanti [i tuoi attacchi hanno svantaggio] ModUi/&Visuals=Immagini: [Richiede il riavvio] -ModUi/&WildSurgeDieRollThreshold=Imposta la soglia di probabilità di dado Magia selvaggia dello stregone:{99[L'ondata selvaggia si attiva se il tiro è inferiore o uguale alla soglia] +ModUi/&WildSurgeDieRollThreshold=Imposta la soglia di probabilità di dado Magia selvaggia dello stregone:{0}[L'ondata selvaggia si attiva se il tiro è inferiore o uguale alla soglia] diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt index 5183c111fa..38450a2f13 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt @@ -93,7 +93,7 @@ Spell/&MuleTitle=Mulo Spell/&RadiantMotesDescription=Scatena uno sciame di 4 proiettili radianti che infliggono 1d4 danni radianti ciascuno.\nQuando lanci questo incantesimo usando uno slot incantesimo di 2° livello o superiore, l'incantesimo crea 1 proiettile in più per ogni slot sopra il 1°. Spell/&RadiantMotesTitle=Granelli radianti Spell/&SanctuaryDescription=Proteggi una creatura entro il raggio d'azione dagli attacchi. Finché l'incantesimo non termina, qualsiasi creatura che bersaglia la creatura protetta con un attacco o un incantesimo dannoso deve prima effettuare un tiro salvezza su Saggezza. Se fallisce il tiro salvezza, la creatura perde l'attacco o l'incantesimo. Questo incantesimo non protegge la creatura protetta dagli effetti ad area. Se la creatura protetta effettua un attacco o lancia un incantesimo, questo incantesimo termina. -Spell/&SearingSmiteDescription=Al tuo prossimo colpo la tua arma si accende con un'intensità incandescente e l'attacco infligge 1d6 danni da fuoco extra al bersaglio, facendolo incendiare.\nAll'inizio di ogni suo turno, il bersaglio deve superare un tiro salvezza su Costituzione per smettere di bruciare, altrimenti subisce 1d6 danni da fuoco.{99Livelli superiori: per ogni livello di slot superiore al 1°, il danno extra iniziale inflitto dall'attacco aumenta di 1d6. +Spell/&SearingSmiteDescription=Al tuo prossimo colpo la tua arma si accende con un'intensità incandescente e l'attacco infligge 1d6 danni da fuoco extra al bersaglio, facendolo incendiare.\nAll'inizio di ogni suo turno, il bersaglio deve superare un tiro salvezza su Costituzione per smettere di bruciare, altrimenti subisce 1d6 danni da fuoco.{0}Livelli superiori: per ogni livello di slot superiore al 1°, il danno extra iniziale inflitto dall'attacco aumenta di 1d6. Spell/&SearingSmiteTitle=Colpo bruciante Spell/&SkinOfRetributionDescription=Una pelle elementale protettiva ti avvolge, coprendo te e il tuo equipaggiamento. Ottieni 5 punti ferita temporanei per livello di incantesimo per la durata. Inoltre, se una creatura ti colpisce con un attacco in mischia mentre hai questi punti ferita temporanei, la creatura subisce 5 danni da freddo per livello di incantesimo. Spell/&SkinOfRetributionTitle=Armatura di Agathys diff --git a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt index 7477f3910f..8077ed5cde 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Settings-ja.txt @@ -336,4 +336,4 @@ ModUi/&UseOfficialObscurementRules=公式の照明、遮蔽、視 ModUi/&UseOfficialObscurementRulesHelp=[それを知覚する攻撃者は ADV を獲得し、それを知覚しない攻撃者は DIS を獲得します。それを知覚できる防御者は DIS を獲得します\n 非常に隠された領域は盲目状態を引き起こし、クリーチャーに対する攻撃ロールには ADV が付与され、クリーチャーの攻撃ロールには DIS が付与されます\n 攻撃者に視力がない場合、個人をターゲットとするすべての遠距離呪文は発動できません。ただし、視力が必要であると明確に述べられていない呪文は除きます] ModUi/&UseOfficialSmallRacesDisWithHeavyWeapons=重火器を使用するときは小種族の公式ルールを使用してください[攻撃には不利] ModUi/&Visuals=ビジュアル: [再起動が必要] -ModUi/&WildSurgeDieRollThreshold=ソーサラー ワイルド マジック の確率ダイスしきい値を設定します:{99>[ロールがしきい値以下であればワイルド サージが発動します] +ModUi/&WildSurgeDieRollThreshold=ソーサラー ワイルド マジック の確率ダイスしきい値を設定します:{0}>[ロールがしきい値以下であればワイルド サージが発動します] diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt index 638d263f50..d72e071d3a 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt @@ -32,7 +32,7 @@ Feat/&FeatFellHandedDescription=당신은 손도끼, 전투도끼, 거대도끼, Feat/&FeatFellHandedTitle=쓰러진 손 Feat/&FeatFencerDescription=근접 한손 또는 다용도 무기를 들고 다른 무기나 방패를 들고 있지 않은 상태에서 자신의 차례에 공격 행동을 취하는 경우, 보너스 행동을 사용하여 들고 있는 무기로 공격할 수 있으며 피해량에 속성 수정치를 추가할 수 있습니다. Feat/&FeatFencerTitle=검객 -Feat/&FeatGreatWeaponDefenseDescription=대형 무기를 사용하여 힘들게 싸우면 다음과 같은 이점을 얻을 수 있습니다.\n• 생명체의 체력을 0으로 줄이거나 근접 무기로 치명타 공격을 가하면 턴이 끝날 때까지 이동 속도가 15피트 증가합니다.{99 }• 양손에 무거운 근접 무기나 다용도 무기를 들고 공격 행동을 취하면 다음 턴이 시작될 때까지 AC가 +2 증가합니다. 다른 무기나 방패를 장착하면 이 혜택을 잃게 됩니다. +Feat/&FeatGreatWeaponDefenseDescription=대형 무기를 사용하여 힘들게 싸우면 다음과 같은 이점을 얻을 수 있습니다.\n• 생명체의 체력을 0으로 줄이거나 근접 무기로 치명타 공격을 가하면 턴이 끝날 때까지 이동 속도가 15피트 증가합니다.{0}• 양손에 무거운 근접 무기나 다용도 무기를 들고 공격 행동을 취하면 다음 턴이 시작될 때까지 AC가 +2 증가합니다. 다른 무기나 방패를 장착하면 이 혜택을 잃게 됩니다. Feat/&FeatGreatWeaponDefenseTitle=전투의 열정 Feat/&FeatLongswordFinesseDescription=당신은 장검의 대가의 후손이며, 그 숙달 중 일부가 당신에게 물려졌습니다. 다음과 같은 이점이 있습니다.\n• 민첩 점수가 1씩 증가하여 최대 20이 됩니다.\n• 롱소드를 들고 있는 동안 갑옷 클래스에 +1 보너스를 얻습니다.\n• 롱소드는 휘두를 때의 기교 속성. Feat/&FeatLongswordFinesseTitle=롱소드 기교 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt index 0f4d6cb61a..489d1632da 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Settings-zh-CN.txt @@ -336,4 +336,4 @@ ModUi/&UseOfficialObscurementRules=使用官方照明、遮蔽和 ModUi/&UseOfficialObscurementRulesHelp=[能感知到防御者但无法感知到攻击者的防御者会获得 ADV,无法感知到攻击者但可以感知到防御者会获得 DIS\n 被严重遮挡的区域会造成致盲状态,对生物的攻击掷骰获得 ADV,而生物的攻击掷骰获得 DIS\n 如果攻击者没有视力,则无法施放针对个人的所有远距离法术,除了那些明确未说明需要视力的法术] ModUi/&UseOfficialSmallRacesDisWithHeavyWeapons=使用重型武器时请使用官方小型体型种族规则[你的攻击处于劣势] ModUi/&Visuals=视觉效果:[需要重启] -ModUi/&WildSurgeDieRollThreshold=设置巫师狂野魔法几率骰子阈值:{99>[如果掷出的骰子小于或等于阈值,则触发狂野涌动] +ModUi/&WildSurgeDieRollThreshold=设置巫师狂野魔法几率骰子阈值:{0}>[如果掷出的骰子小于或等于阈值,则触发狂野涌动] From cbdcbb7296db5681514e5880b042c9f8ca9d94ae Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 18:55:51 -0700 Subject: [PATCH 096/162] change Guardian Aura to use MyReactToDoNothing --- .../Behaviors/Specific/GuardianAura.cs | 108 ++++++++---------- .../Subclasses/Builders/GambitsBuilders.cs | 8 -- .../Subclasses/PatronArchfey.cs | 6 +- .../Subclasses/RangerGloomStalker.cs | 5 +- .../Subclasses/WizardWarMagic.cs | 8 +- 5 files changed, 49 insertions(+), 86 deletions(-) diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/GuardianAura.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/GuardianAura.cs index 65165bedb5..c10d817b86 100644 --- a/SolastaUnfinishedBusiness/Behaviors/Specific/GuardianAura.cs +++ b/SolastaUnfinishedBusiness/Behaviors/Specific/GuardianAura.cs @@ -8,7 +8,6 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using static RuleDefinitions; -using static ActionDefinitions; namespace SolastaUnfinishedBusiness.Behaviors.Specific; @@ -75,77 +74,60 @@ private static IEnumerator ActiveHealthSwap( yield break; } - var actionService = ServiceRepository.GetService(); - var count = actionService.PendingReactionRequestGroups.Count; - var actionParams = new CharacterActionParams(unit, (Id)ExtraActionId.DoNothingReaction) - { - StringParameter = "CustomReactionGuardianAuraDescription" - .Formatted(Category.Reaction, defender.Name, damageAmount) - }; - - RequestCustomReaction("GuardianAura", actionParams); + yield return unit.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + "GuardianAura", + "CustomReactionGuardianAuraDescription".Formatted(Category.Reaction, defender.Name, damageAmount), + ReactionValidated, + battleManager: battleManager, + resource: ReactionResourceChannelDivinity.Instance); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!actionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } - - DamageForm damage = null; - - if (attackerAttackMode != null) - { - damage = attackerAttackMode.EffectDescription.FindFirstDamageForm(); - } - - if (rulesetEffect != null) - { - damage = rulesetEffect.EffectDescription.FindFirstDamageForm(); - } + DamageForm damage = null; - defender.RulesetCharacter.ReceiveHealing(damageAmount, true, unit.Guid); - defender.RulesetCharacter.ForceSetHealth(damageAmount, true); - - if (damage != null) - { - var applyFormsParams = new RulesetImplementationDefinitions.ApplyFormsParams + if (attackerAttackMode != null) { - sourceCharacter = attacker.RulesetCharacter, - targetCharacter = unit.RulesetCharacter, - position = unit.LocationPosition - }; - - RulesetActor.InflictDamage( - damageAmount, - damage, - damage.DamageType, - applyFormsParams, - unit.RulesetCharacter, - false, - attacker.Guid, - false, - [], - new RollInfo(DieType.D1, [], damageAmount), - false, - out _); - } + damage = attackerAttackMode.EffectDescription.FindFirstDamageForm(); + } - unit.RulesetCharacter.LogCharacterUsedPower(DummyAuraGuardianPower, "Feedback/&GuardianAuraHeal"); - } + if (rulesetEffect != null) + { + damage = rulesetEffect.EffectDescription.FindFirstDamageForm(); + } - private static void RequestCustomReaction(string type, CharacterActionParams actionParams) - { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + defender.RulesetCharacter.ReceiveHealing(damageAmount, true, unit.Guid); + defender.RulesetCharacter.ForceSetHealth(damageAmount, true); - if (!actionManager) - { - return; + if (damage != null) + { + var applyFormsParams = new RulesetImplementationDefinitions.ApplyFormsParams + { + sourceCharacter = attacker.RulesetCharacter, + targetCharacter = unit.RulesetCharacter, + position = unit.LocationPosition + }; + + RulesetActor.InflictDamage( + damageAmount, + damage, + damage.DamageType, + applyFormsParams, + unit.RulesetCharacter, + false, + attacker.Guid, + false, + [], + new RollInfo(DieType.D1, [], damageAmount), + false, + out _); + } + + unit.RulesetCharacter.LogCharacterUsedPower(DummyAuraGuardianPower, "Feedback/&GuardianAuraHeal"); } - - var reactionRequest = new ReactionRequestCustom(type, actionParams); - - actionManager.AddInterruptRequest(reactionRequest); } private sealed class GuardianAuraCondition; diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index 9a1096a899..65d07d07f0 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1783,14 +1783,6 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var rulesetDefender = defender.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs index c3afb2cf3f..451db06ef3 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronArchfey.cs @@ -456,11 +456,7 @@ private IEnumerator HandleReaction( GameLocationCharacter attacker, GameLocationCharacter defender) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - defender.RulesetCharacter.GetRemainingPowerUses(powerMistyEscape) == 0 || + if (defender.RulesetCharacter.GetRemainingPowerUses(powerMistyEscape) == 0 || defender.IsMyTurn()) { yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs index 33e346e4f2..6e807c9aa8 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs @@ -343,10 +343,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - action.AttackRollOutcome != RollOutcome.Success || + if (action.AttackRollOutcome != RollOutcome.Success || helper != defender || !helper.CanReact() || !helper.CanPerceiveTarget(attacker)) diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index 173bcad81c..8514174c0d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -175,13 +175,11 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; var rulesetCharacter = helper.RulesetCharacter; var intelligence = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); - if (!actionManager || - action.AttackRollOutcome != RollOutcome.Success || + if (action.AttackRollOutcome != RollOutcome.Success || action.AttackSuccessDelta - bonus >= 0 || helper != defender || !defender.CanReact() || @@ -247,13 +245,11 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; var rulesetCharacter = helper.RulesetCharacter; var intelligence = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); - if (!actionManager || - !action.RolledSaveThrow || + if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || action.SaveOutcomeDelta + bonus < 0 || helper != defender || From d1107acaeb0f4b7a895e725d02f187a33ee83d4a Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 20:07:22 -0700 Subject: [PATCH 097/162] change Path of the Wild Magic controlled surge to use MyReactToSpendPowerBundle --- .../Subclasses/PathOfTheWildMagic.cs | 43 ++++++------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 70cba9c287..15624f0287 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -895,16 +895,6 @@ private void PreventEnemyAction(GameLocationCharacter attacker, RulesetCharacter private IEnumerator HandleControlledSurge(GameLocationCharacter character, List result) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = - ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } - var rulesetAttacker = character.RulesetCharacter; var firstRoll = rulesetAttacker.RollDie(DieType.D8, RollContext.None, false, AdvantageType.None, out _, out _); @@ -929,33 +919,24 @@ private IEnumerator HandleControlledSurge(GameLocationCharacter character, List< rulesetAttacker.usablePowers = myUsablePowers; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(_powerPool, rulesetAttacker); - var actionParams = - new CharacterActionParams(GameLocationCharacter.GetFromActor(rulesetAttacker), Id.SpendPower) - { - StringParameter = "ControlledSurge", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - targetCharacters = [character] - }; - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendBundlePower(actionParams); - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(character, actionManager, count); + yield return character.MyReactToSpendPowerBundle( + usablePowerPool, + [character], + character, + "ControlledSurge", + ReactionValidated, + ReactionNotValidated); rulesetAttacker.usablePowers = usablePowersOrig; - if (reactionRequest.Validated && reactionRequest.SelectedSubOption >= 0) + yield break; + + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) { result[0] = reactionRequest.SelectedSubOption + 1; } - else + + void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) { result[0] = firstRoll; } From 7fca7ab835586b3ef6072b532d499eef3ca3ac9a Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 20:10:22 -0700 Subject: [PATCH 098/162] change Path of the Beast call the hunt to use MyReactToUsePower --- .../Subclasses/PathOfTheBeast.cs | 79 +++++++------------ .../de/SubClasses/PathOfTheBeast-de.txt | 8 +- .../en/SubClasses/PathOfTheBeast-en.txt | 8 +- .../es/SubClasses/PathOfTheBeast-es.txt | 8 +- .../fr/SubClasses/PathOfTheBeast-fr.txt | 8 +- .../it/SubClasses/PathOfTheBeast-it.txt | 8 +- .../ja/SubClasses/PathOfTheBeast-ja.txt | 8 +- .../ko/SubClasses/PathOfTheBeast-ko.txt | 8 +- .../pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt | 8 +- .../ru/SubClasses/PathOfTheBeast-ru.txt | 8 +- .../zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt | 8 +- 11 files changed, 70 insertions(+), 89 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index d898d513d4..e6f92318eb 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -146,16 +146,21 @@ private static FeatureDefinitionPower BuildFeatureCallTheHunt() var powerCallTheHunt = FeatureDefinitionPowerBuilder .Create($"Power{Name}CallTheHunt") .SetGuiPresentation(Category.Feature) - .SetUsesProficiencyBonus(ActivationTime.OnPowerActivatedAuto) + .SetUsesProficiencyBonus(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( - EffectDescriptionBuilder.Create() + EffectDescriptionBuilder + .Create() .SetDurationData(DurationType.Minute, 1) .SetTargetingData(Side.Ally, RangeType.Self, 0, TargetType.Self) .AddEffectForms(EffectFormBuilder.ConditionForm(conditionCallTheHunt)) .Build()) .AddToDB(); + // need to handle custom because OnRageStartChoice doesn't seem to affect allies - powerCallTheHunt.AddCustomSubFeatures(new PowerCallTheHuntHandler(powerCallTheHunt)); + powerCallTheHunt.AddCustomSubFeatures( + ModifyPowerVisibility.Hidden, + new PowerCallTheHuntHandler(powerCallTheHunt)); return powerCallTheHunt; } @@ -827,63 +832,39 @@ internal class PowerCallTheHuntHandler(FeatureDefinitionPower power) : IActionFi { public IEnumerator OnActionFinishedByMe(CharacterAction characterAction) { - if (characterAction is not CharacterActionCombatRageStart) - { - yield break; - } - - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } - var character = characterAction.ActingCharacter; var rulesetCharacter = character.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var locationCharacterService = ServiceRepository.GetService(); - var usablePower = PowerProvider.Get(power, rulesetCharacter); - var actionParams = new CharacterActionParams(character, ActionDefinitions.Id.SpendPower) - { - StringParameter = "CallTheHunt", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = [], - actionModifiers = [] - }; - foreach (var ally in locationCharacterService.AllValidEntities - .Where(x => - x.Side == character.Side && - x.IsWithinRange(character, 6) && - x.CanAct()) - .ToList()) + if (characterAction is not CharacterActionCombatRageStart || + rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { - actionParams.targetCharacters.Add(ally); - actionParams.actionModifiers.Add(new ActionModifier()); + yield break; } - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = new ReactionRequestSpendPower(actionParams); + var locationCharacterService = ServiceRepository.GetService(); + var targets = + locationCharacterService.PartyCharacters + .Union(locationCharacterService.GuestCharacters) + .Where(x => + x.CanAct() && + x.IsWithinRange(character, 6)) + .ToList(); - actionManager.AddInterruptRequest(reactionRequest); + yield return character.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, + usablePower, + targets, + character, + "CallTheHunt", + reactionValidated: ReactionValidated); - yield return battleManager.WaitForReactions(character, actionManager, count); + yield break; - if (!reactionRequest.Validated) + void ReactionValidated() { - yield break; + rulesetCharacter.ReceiveTemporaryHitPoints( + 15, DurationType.UntilAnyRest, 1, TurnOccurenceType.EndOfTurn, rulesetCharacter.Guid); } - - rulesetCharacter.ReceiveTemporaryHitPoints( - 15, DurationType.UntilAnyRest, 1, TurnOccurenceType.EndOfTurn, rulesetCharacter.Guid); } } diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt index b51bcd4b67..a0c1c43ad7 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Wählen Sie eine Tie Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Wählen Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Wählen Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Gestalt des Tieres -Reaction/&SpendPowerCallTheHuntDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. -Reaction/&SpendPowerCallTheHuntReactDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Ruf zur Jagd +Reaction/&UsePowerCallTheHuntDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. +Reaction/&UsePowerCallTheHuntReactDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Ruf zur Jagd Reaction/&UsePowerInfectiousFuryDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. Reaction/&UsePowerInfectiousFuryReactDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. Reaction/&UsePowerInfectiousFuryReactTitle=Ausgeben diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt index f253267d02..dcfc142d11 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Choose a beast form Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Choose Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Choose Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Form of the Beast -Reaction/&SpendPowerCallTheHuntDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. -Reaction/&SpendPowerCallTheHuntReactDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Call the Hunt +Reaction/&UsePowerCallTheHuntDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. +Reaction/&UsePowerCallTheHuntReactDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Call the Hunt Reaction/&UsePowerInfectiousFuryDescription=Spend power to apply Infectious Fury to target. Reaction/&UsePowerInfectiousFuryReactDescription=Spend power to apply Infectious Fury to target. Reaction/&UsePowerInfectiousFuryReactTitle=Spend diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt index cc5d948c6b..b6a1732aa6 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Elige una forma de b Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Elegir Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Elegir Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma de la Bestia -Reaction/&SpendPowerCallTheHuntDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. -Reaction/&SpendPowerCallTheHuntReactDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Llama a la caza +Reaction/&UsePowerCallTheHuntDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. +Reaction/&UsePowerCallTheHuntReactDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Llama a la caza Reaction/&UsePowerInfectiousFuryDescription=Gasta poder para aplicar Furia infecciosa al objetivo. Reaction/&UsePowerInfectiousFuryReactDescription=Gasta poder para aplicar Furia infecciosa al objetivo. Reaction/&UsePowerInfectiousFuryReactTitle=Gastar diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt index 5407fbed49..f4b5aaaf0d 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Choisissez une forme Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Choisir Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Choisir Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forme de la bête -Reaction/&SpendPowerCallTheHuntDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. -Reaction/&SpendPowerCallTheHuntReactDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Appelez la chasse +Reaction/&UsePowerCallTheHuntDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. +Reaction/&UsePowerCallTheHuntReactDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Appelez la chasse Reaction/&UsePowerInfectiousFuryDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. Reaction/&UsePowerInfectiousFuryReactDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. Reaction/&UsePowerInfectiousFuryReactTitle=Dépenser diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt index 627f69b8f6..321bde5cad 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Scegli una forma bes Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Scegliere Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Scegliere Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma della Bestia -Reaction/&SpendPowerCallTheHuntDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. -Reaction/&SpendPowerCallTheHuntReactDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Chiama la caccia +Reaction/&UsePowerCallTheHuntDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. +Reaction/&UsePowerCallTheHuntReactDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Chiama la caccia Reaction/&UsePowerInfectiousFuryDescription=Spendi potere per applicare Furia Infettiva al bersaglio. Reaction/&UsePowerInfectiousFuryReactDescription=Spendi potere per applicare Furia Infettiva al bersaglio. Reaction/&UsePowerInfectiousFuryReactTitle=Trascorrere diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt index 4733086a18..d8a3b2496b 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=激怒中に顕現 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=選ぶ Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=選ぶ Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=獣の姿 -Reaction/&SpendPowerCallTheHuntDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 -Reaction/&SpendPowerCallTheHuntReactDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=狩りを呼び出せ +Reaction/&UsePowerCallTheHuntDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 +Reaction/&UsePowerCallTheHuntReactDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=狩りを呼び出せ Reaction/&UsePowerInfectiousFuryDescription=パワーを消費してターゲットに感染性の怒りを適用します。 Reaction/&UsePowerInfectiousFuryReactDescription=パワーを消費してターゲットに感染性の怒りを適用します。 Reaction/&UsePowerInfectiousFuryReactTitle=過ごす diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt index bab155d70a..45fe174324 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=격노하는 동안 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=선택하다 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=선택하다 Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=야수의 형태 -Reaction/&SpendPowerCallTheHuntDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. -Reaction/&SpendPowerCallTheHuntReactDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=사냥에 전화하세요 +Reaction/&UsePowerCallTheHuntDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. +Reaction/&UsePowerCallTheHuntReactDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=사냥에 전화하세요 Reaction/&UsePowerInfectiousFuryDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. Reaction/&UsePowerInfectiousFuryReactDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. Reaction/&UsePowerInfectiousFuryReactTitle=경비 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt index 77e3d6ab73..5d6d1e5bbd 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Escolha uma forma de Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Escolher Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Escolher Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma da Besta -Reaction/&SpendPowerCallTheHuntDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. -Reaction/&SpendPowerCallTheHuntReactDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. -Reaction/&SpendPowerCallTheHuntReactTitle=Use -Reaction/&SpendPowerCallTheHuntTitle=Chame a Caçada +Reaction/&UsePowerCallTheHuntDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. +Reaction/&UsePowerCallTheHuntReactDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. +Reaction/&UsePowerCallTheHuntReactTitle=Use +Reaction/&UsePowerCallTheHuntTitle=Chame a Caçada Reaction/&UsePowerInfectiousFuryDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. Reaction/&UsePowerInfectiousFuryReactDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. Reaction/&UsePowerInfectiousFuryReactTitle=Gastar diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt index 3aa7c33061..70d72b82b6 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Выберите з Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Выбор Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Выбор Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Форма зверя -Reaction/&SpendPowerCallTheHuntDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. -Reaction/&SpendPowerCallTheHuntReactDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. -Reaction/&SpendPowerCallTheHuntReactTitle=Использовать -Reaction/&SpendPowerCallTheHuntTitle=Зов охоты +Reaction/&UsePowerCallTheHuntDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. +Reaction/&UsePowerCallTheHuntReactDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. +Reaction/&UsePowerCallTheHuntReactTitle=Использовать +Reaction/&UsePowerCallTheHuntTitle=Зов охоты Reaction/&UsePowerInfectiousFuryDescription=Используйте умение, чтобы применить к цели Заразную ярость. Reaction/&UsePowerInfectiousFuryReactDescription=Используйте умение, чтобы применить к цели Заразную ярость. Reaction/&UsePowerInfectiousFuryReactTitle=Использовать diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt index 939802c974..7ae76354f3 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt @@ -44,10 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=选择一种野兽 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=选择 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=选择 Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=野兽形态 -Reaction/&SpendPowerCallTheHuntDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 -Reaction/&SpendPowerCallTheHuntReactDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 -Reaction/&SpendPowerCallTheHuntReactTitle=使用 -Reaction/&SpendPowerCallTheHuntTitle=狩猎呼唤 +Reaction/&UsePowerCallTheHuntDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 +Reaction/&UsePowerCallTheHuntReactDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 +Reaction/&UsePowerCallTheHuntReactTitle=使用 +Reaction/&UsePowerCallTheHuntTitle=狩猎呼唤 Reaction/&UsePowerInfectiousFuryDescription=花费力量对目标施加传染性狂怒。 Reaction/&UsePowerInfectiousFuryReactDescription=花费力量对目标施加传染性狂怒。 Reaction/&UsePowerInfectiousFuryReactTitle=花费 From f9198b00f93979726bee8459ce789fa4dbc26d3f Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Thu, 8 Aug 2024 20:11:56 -0700 Subject: [PATCH 099/162] change Domain Tempest wrath of the storm to use MyReactToUsePower --- .../Subclasses/DomainTempest.cs | 53 ++++--------------- 1 file changed, 10 insertions(+), 43 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index 51bc3d4d7a..7d7cc97d2b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -366,54 +366,21 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc var attacker = action.ActingCharacter; var rulesetDefender = defender.RulesetCharacter; var usablePower = PowerProvider.Get(powerWrathOfTheStorm, rulesetDefender); - var isValid = defender.IsWithinRange(attacker, 1) && - defender.CanReact() && - defender.CanPerceiveTarget(attacker) && - rulesetDefender.GetRemainingUsesOfPower(usablePower) > 0; - if (!isValid) + if (defender.CanReact() || + defender.IsWithinRange(attacker, 1) || + defender.CanPerceiveTarget(attacker) || + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = - ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || - battleManager is not { IsBattleInProgress: true, Battle.InitiativeRollFinished: true }) - { - yield break; - } - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.SpendPower) - { - StringParameter = "WrathOfTheStorm", - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionRequest = - new ReactionRequestSpendBundlePower(actionParams) - { - Resource = ReactionResourceWrathOfTheStorm.Instance - }; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (actionParams.ReactionValidated) - { - attacker.SpendActionType(ActionDefinitions.ActionType.Reaction); - } + yield return defender.MyReactToUsePower( + ActionDefinitions.Id.PowerReaction, + usablePower, + [attacker], + attacker, + "WrathOfTheStorm"); } } From ae6cb9556aee6a630be5daefb334e45118f69cdf Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 08:59:49 -0700 Subject: [PATCH 100/162] add GameLocationCharacterExtensions.MyExecuteActionOpportunityAttack and GameLocationCharacterExtensions.MyReactForOpportunityAttack --- .../GameLocationCharacterExtensions.cs | 91 +++++++++++++++---- 1 file changed, 74 insertions(+), 17 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 5d194aaa35..356e5c283a 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -54,6 +54,23 @@ internal static void MyExecuteAction( ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); } + internal static void MyExecuteActionOpportunityAttack( + this GameLocationCharacter attacker, + GameLocationCharacter defender, + RulesetAttackMode attackMode, + ActionModifier actionModifier) + { + var actionService = ServiceRepository.GetService(); + var actionParams = new CharacterActionParams( + attacker, + Id.AttackOpportunity, + attackMode, + defender, + actionModifier); + + actionService.ExecuteAction(actionParams, null, true); + } + internal static IEnumerator MyReactToDoNothing( this GameLocationCharacter character, ExtraActionId actionId, @@ -92,6 +109,51 @@ internal static IEnumerator MyReactToDoNothing( } } + internal static IEnumerator MyReactForOpportunityAttack( + this GameLocationCharacter attacker, + GameLocationCharacter defender, + GameLocationCharacter waiter, + RulesetAttackMode attackMode, + ActionModifier actionModifier, + string stringParameter2, + Action reactionValidated = null, + GameLocationBattleManager battleManager = null, + ReactionResourcePowerPool resource = null) + { + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!actionManager || !battleManager) + { + yield break; + } + + var count = actionManager.PendingReactionRequestGroups.Count; + var reactionParams = new CharacterActionParams( + attacker, + Id.AttackOpportunity, + attackMode, + defender, + actionModifier) + { + StringParameter2 = stringParameter2 + }; + var reactionRequest = new ReactionRequestReactionAttack(stringParameter2, reactionParams) + { + Resource = resource + }; + + actionManager.AddInterruptRequest(reactionRequest); + + yield return battleManager.WaitForReactions(waiter, actionManager, count); + + if (reactionParams.ReactionValidated) + { + reactionValidated?.Invoke(); + } + } + internal static IEnumerator MyReactToSpendPower( this GameLocationCharacter character, RulesetUsablePower usablePower, @@ -261,8 +323,7 @@ public static bool IsWithinRange( // consolidate all checks if a character can perceive another public static bool CanPerceiveTarget( - this GameLocationCharacter __instance, - GameLocationCharacter target) + this GameLocationCharacter __instance, GameLocationCharacter target) { if (__instance == target) { @@ -286,9 +347,7 @@ public static bool CanPerceiveTarget( } internal static (RulesetAttackMode mode, ActionModifier modifier) GetFirstMeleeModeThatCanAttack( - this GameLocationCharacter instance, - GameLocationCharacter target, - IGameLocationBattleService service) + this GameLocationCharacter instance, GameLocationCharacter target, IGameLocationBattleService service) { foreach (var mode in instance.RulesetCharacter.AttackModes) { @@ -316,9 +375,7 @@ internal static (RulesetAttackMode mode, ActionModifier modifier) GetFirstMeleeM } internal static (RulesetAttackMode mode, ActionModifier modifier) GetFirstRangedModeThatCanAttack( - this GameLocationCharacter instance, - GameLocationCharacter target, - IGameLocationBattleService service) + this GameLocationCharacter instance, GameLocationCharacter target, IGameLocationBattleService service) { foreach (var mode in instance.RulesetCharacter.AttackModes) { @@ -430,17 +487,17 @@ internal static bool CanPerformOpportunityAttackOnCharacter( return false; } - internal static bool CanAct(this GameLocationCharacter instance) + internal static bool CanAct(this GameLocationCharacter character) { - var character = instance.RulesetCharacter; + var rulesetCharacter = character.RulesetCharacter; - return character is { IsDeadOrDyingOrUnconscious: false } && - !instance.IsCharging && - !instance.MoveStepInProgress && - !character.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionProne) && - !character.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionIncapacitated) && - !character.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionStunned) && - !character.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionParalyzed); + return rulesetCharacter is { IsDeadOrDyingOrUnconscious: false } && + !character.IsCharging && + !character.MoveStepInProgress && + !rulesetCharacter.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionProne) && + !rulesetCharacter.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionIncapacitated) && + !rulesetCharacter.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionStunned) && + !rulesetCharacter.HasConditionOfTypeOrSubType(RuleDefinitions.ConditionParalyzed); } internal static bool IsReactionAvailable(this GameLocationCharacter instance, bool ignoreReactionUses = false) From b1fcb772479479f8b430d9a826dad19cf3a4874e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:00:32 -0700 Subject: [PATCH 101/162] change Wyrmkin reactive retribution to use MyReactForOpportunityAttack --- SolastaUnfinishedBusiness/Races/Wyrmkin.cs | 33 +++++++++------------- 1 file changed, 14 insertions(+), 19 deletions(-) diff --git a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs index e457d3c06e..4fab01329c 100644 --- a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs +++ b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs @@ -362,28 +362,23 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( retaliationMode.AddAttackTagAsNeeded(AttacksOfOpportunity.NotAoOTag); - var actionParams = new CharacterActionParams(defender, Id.AttackOpportunity) + yield return defender.MyReactForOpportunityAttack( + attacker, + attacker, + retaliationMode, + retaliationModifier, + "ReactiveRetribution", + ReactionValidated, + battleManager); + + yield break; + + void ReactionValidated() { - StringParameter = defender.Name, - ActionModifiers = { retaliationModifier }, - AttackMode = retaliationMode, - TargetCharacters = { attacker } - }; - var reactionRequest = new ReactionRequestReactionAttack("ReactiveRetribution", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; + var usablePower = PowerProvider.Get(powerHighWyrmkinSwiftRetribution, rulesetDefender); - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (!actionParams.ReactionValidated) - { - yield break; + rulesetDefender.UsePower(usablePower); } - - var usablePower = PowerProvider.Get(powerHighWyrmkinSwiftRetribution, rulesetDefender); - - rulesetDefender.UsePower(usablePower); } } From 7e884030f9f915ce6c0327b3211f0f223842c18c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:01:50 -0700 Subject: [PATCH 102/162] change Path of the Beast compelled strike to use MyExecuteActionOpportunityAttack --- .../Subclasses/PathOfTheBeast.cs | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index e6f92318eb..541d6672de 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -778,7 +778,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, attackModeCopy.ActionType = ActionDefinitions.ActionType.Reaction; attacker.RulesetCharacter.RemoveAllConditionsOfCategoryAndType( AttributeDefinitions.TagEffect, condition.name); - Attack(attacker, defender, attackModeCopy, attackModifier, ActionDefinitions.Id.AttackOpportunity); + + attacker.MyExecuteActionOpportunityAttack(defender, attackModeCopy, attackModifier); } private static bool IsValidAttack( @@ -806,23 +807,6 @@ private static bool IsValidAttack( return __instance.BattleService.CanAttack(attackParams2); } - - private static void Attack( - GameLocationCharacter actingCharacter, - GameLocationCharacter target, - RulesetAttackMode attackMode, - ActionModifier attackModifier, - ActionDefinitions.Id actionId = ActionDefinitions.Id.AttackFree) - { - var actionService = ServiceRepository.GetService(); - var attackActionParams = - new CharacterActionParams(actingCharacter, actionId) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - - actionService.ExecuteAction(attackActionParams, null, true); - } } #endregion From 678c32c13936c8d6ac1c801ae9791fb9f4a6cc13 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:02:43 -0700 Subject: [PATCH 103/162] change Exploiter feat to use MyReactForOpportunityAttack --- SolastaUnfinishedBusiness/Feats/ClassFeats.cs | 33 +++++-------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/ClassFeats.cs b/SolastaUnfinishedBusiness/Feats/ClassFeats.cs index 293afd7d9d..0c2daa0da4 100644 --- a/SolastaUnfinishedBusiness/Feats/ClassFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/ClassFeats.cs @@ -405,11 +405,7 @@ private static IEnumerator HandleReaction( // ReSharper disable once ParameterTypeCanBeEnumerable.Local List targets) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - attackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || + if (attackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || attacker == helper || helper.IsMyTurn() || !helper.CanReact()) @@ -424,29 +420,18 @@ attackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || if (opportunityAttackMode == null || actionModifier == null) { - yield break; + continue; } opportunityAttackMode.AddAttackTagAsNeeded(AttacksOfOpportunity.NotAoOTag); - var actionParams = new CharacterActionParams(helper, ActionDefinitions.Id.AttackOpportunity) - { - StringParameter = helper.Name, - ActionModifiers = { actionModifier }, - AttackMode = opportunityAttackMode, - TargetCharacters = { defender } - }; - var reactionRequest = new ReactionRequestReactionAttack("Exploiter", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (actionParams.ReactionValidated) - { - yield break; - } + yield return helper.MyReactForOpportunityAttack( + defender, + attacker, + opportunityAttackMode, + actionModifier, + "Exploiter", + battleManager: battleManager); } } } From 761a43305396b0d1ef5c42c1893494f06c52e8b4 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:03:13 -0700 Subject: [PATCH 104/162] change Defensive Strike to use MyReactToDoNothing and MyExecuteActionOpportunityAttack --- .../Specific/DefensiveStrikeAttack.cs | 79 +++++++------------ 1 file changed, 28 insertions(+), 51 deletions(-) diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs index 9101ce14eb..285e8bba5c 100644 --- a/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs +++ b/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs @@ -89,65 +89,42 @@ private static IEnumerator ActiveDefensiveStrike( //Calculate bonus var charisma = unitCharacter.TryGetAttributeValue(AttributeDefinitions.Charisma); var bonus = AttributeDefinitions.ComputeAbilityScoreModifier(charisma); - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - if (!actionManager) - { - yield break; - } - - var actionParams = new CharacterActionParams(unit, (Id)ExtraActionId.DoNothingReaction) - { - StringParameter = $"CustomReaction{OathOfAltruism.DefensiveStrike}Description" - .Formatted(Category.Reaction, defender.Name, attacker.Name, bonus) - }; - - var count = actionManager.PendingReactionRequestGroups.Count; - - var reactionRequest = new ReactionRequestCustom(OathOfAltruism.DefensiveStrike, actionParams) - { - Resource = ReactionResourceChannelDivinity.Instance - }; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); - - if (!actionParams.ReactionValidated) + yield return unit.MyReactToDoNothing( + ExtraActionId.DoNothingReaction, + attacker, + OathOfAltruism.DefensiveStrike, + $"CustomReaction{OathOfAltruism.DefensiveStrike}Description" + .Formatted(Category.Reaction, defender.Name, attacker.Name, bonus), + ReactionValidated, + battleManager: battleManager, + resource: ReactionResourceChannelDivinity.Instance); + + yield break; + + void ReactionValidated() { - yield break; - } + //spend resources + unitCharacter.UsedChannelDivinity++; - //spend resources - unitCharacter.UsedChannelDivinity++; + //create attack mode copy so we won't affect real one + var attackMode = RulesetAttackMode.AttackModesPool.Get(); - //create attack mode copy so we won't affect real one - var attackMode = RulesetAttackMode.AttackModesPool.Get(); + attackMode.Copy(opportunityAttackMode); + opportunityAttackMode = attackMode; - attackMode.Copy(opportunityAttackMode); - opportunityAttackMode = attackMode; + //Apply bonus to hit and damage of the attack mode + opportunityAttackMode.EffectDescription.FindFirstDamageForm().BonusDamage += bonus; + opportunityAttackMode.ToHitBonus += bonus; + opportunityAttackMode.ToHitBonusTrends.Add( + new TrendInfo(bonus, FeatureSourceType.CharacterFeature, OathOfAltruism.DefensiveStrike, unit)); - //Apply bonus to hit and damage of the attack mode - opportunityAttackMode.EffectDescription.FindFirstDamageForm().BonusDamage += bonus; - opportunityAttackMode.ToHitBonus += bonus; - opportunityAttackMode.ToHitBonusTrends.Add( - new TrendInfo(bonus, FeatureSourceType.CharacterFeature, OathOfAltruism.DefensiveStrike, unit)); + //Execute attack + defender.MyExecuteActionOpportunityAttack(attacker, opportunityAttackMode, actionModifier); - //Create and execute attack - var enums = new CharacterActionAttack(new CharacterActionParams( - defender, - Id.AttackOpportunity, - opportunityAttackMode, - attacker, - actionModifier)).Execute(); - - while (enums.MoveNext()) - { - yield return enums.Current; + //return our copied attack mode to the pool + RulesetAttackMode.AttackModesPool.Return(opportunityAttackMode); } - - //return our copied attack mode to the pool - RulesetAttackMode.AttackModesPool.Return(opportunityAttackMode); } } From 7f54b202927c1a898af4d451161112267b115dc8 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:04:03 -0700 Subject: [PATCH 105/162] change Riposte / Return Fire maneuver to use MyReactForOpportunityAttack --- .../Subclasses/Builders/GambitsBuilders.cs | 37 ++++++++----------- 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index 65d07d07f0..4ffece7217 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1394,13 +1394,8 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( retaliationMode.AddAttackTagAsNeeded(AttacksOfOpportunity.NotAoOTag); retaliationMode.AddAttackTagAsNeeded(MartialTactician.TacticalAwareness); - var reactionParams = new CharacterActionParams(defender, ActionDefinitions.Id.AttackOpportunity); - - reactionParams.TargetCharacters.Add(attacker); - reactionParams.ActionModifiers.Add(retaliationModifier); - reactionParams.AttackMode = retaliationMode; - var rulesetCharacter = defender.RulesetCharacter; + var tag = melee ? "GambitRiposte" : "GambitReturnFire"; rulesetCharacter.InflictCondition( condition.Name, @@ -1416,23 +1411,22 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( 0, 0); - var tag = melee ? "GambitRiposte" : "GambitReturnFire"; - var reactionRequest = new ReactionRequestReactionAttack(tag, reactionParams) - { - Resource = new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon) - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return defender.MyReactForOpportunityAttack( + attacker, + attacker, + retaliationMode, + retaliationModifier, + tag, + ReactionValidated, + battleManager, + new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon)); - if (!reactionParams.ReactionValidated) + yield break; + + void ReactionValidated() { - yield break; + rulesetCharacter.UpdateUsageForPower(pool, 1); } - - rulesetCharacter.UpdateUsageForPower(pool, 1); } } @@ -1717,7 +1711,8 @@ public IEnumerator OnTryAlterOutcomeAttack( attacker, "GambitPrecise", "CustomReactionGambitPreciseDescription" - .Formatted(Category.Reaction, guiAttacker.Name, guiDefender.Name, delta.ToString(), Gui.FormatDieTitle(dieType)), + .Formatted(Category.Reaction, + guiAttacker.Name, guiDefender.Name, delta.ToString(), Gui.FormatDieTitle(dieType)), ReactionValidated, battleManager: battleManager, resource: new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon)); From a987413e1e805bd318ecf8c5a7ff72280649ea7b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:04:33 -0700 Subject: [PATCH 106/162] change Old Tactics feat to use MyReactForOpportunityAttack --- .../Feats/MeleeCombatFeats.cs | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index 8fb2ae2869..fe1691430c 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -850,19 +850,13 @@ internal static IEnumerator HandleFeatOldTactics(CharacterAction characterAction retaliationMode.AddAttackTagAsNeeded(AttacksOfOpportunity.NotAoOTag); - var actionParams = new CharacterActionParams(target, ActionDefinitions.Id.AttackOpportunity) - { - StringParameter = target.Name, - ActionModifiers = { retaliationModifier }, - AttackMode = retaliationMode, - TargetCharacters = { enemy } - }; - var reactionRequest = new ReactionRequestReactionAttack("OldTactics", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(enemy, actionManager, count); + yield return target.MyReactForOpportunityAttack( + enemy, + enemy, + retaliationMode, + retaliationModifier, + "OldTactics", + battleManager: battleManager); } #endregion From c2c5d1b4ee535987ec3eb6840e940b64fe62c814 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:05:03 -0700 Subject: [PATCH 107/162] change Oath of Dread harrowing crusade to use MyReactForOpportunityAttack --- .../Subclasses/OathOfDread.cs | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs index fc54b40b59..8f95ea747b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs @@ -435,19 +435,13 @@ public IEnumerator OnPhysicalAttackFinishedOnMeOrAlly( retaliationMode.AddAttackTagAsNeeded(AttacksOfOpportunity.NotAoOTag); - var actionParams = new CharacterActionParams(helper, ActionDefinitions.Id.AttackOpportunity) - { - StringParameter = helper.Name, - ActionModifiers = { retaliationModifier }, - AttackMode = retaliationMode, - TargetCharacters = { attacker } - }; - var reactionRequest = new ReactionRequestReactionAttack("HarrowingCrusade", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield return helper.MyReactForOpportunityAttack( + attacker, + attacker, + retaliationMode, + retaliationModifier, + "HarrowingCrusade", + battleManager: battleManager); } } } From a192150f36e55490fa3b4dc33a9fc00a8faf788d Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:05:24 -0700 Subject: [PATCH 108/162] change Mage Slayer feat to use MyReactForOpportunityAttack --- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index dc7448f4f2..bcf91b06c7 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2362,37 +2362,28 @@ internal static IEnumerator HandleEnemyCastSpellWithin5Ft( GameLocationCharacter caster, GameLocationCharacter defender) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; var battleManager = ServiceRepository.GetService() as GameLocationBattleManager; - if (!actionManager || !battleManager) + if (!battleManager) { yield break; } var (attackMode, actionModifier) = defender.GetFirstMeleeModeThatCanAttack(caster, battleManager); - if (attackMode == null || - !defender.CanReact()) + if (attackMode == null || !defender.CanReact()) { yield break; } - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.AttackOpportunity) - { - StringParameter = defender.Name, - ActionModifiers = { actionModifier }, - AttackMode = attackMode, - TargetCharacters = { caster } - }; - var reactionRequest = new ReactionRequestReactionAttack("MageSlayer", actionParams); - var count = actionManager.PendingReactionRequestGroups.Count; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(caster, actionManager, count); + yield return defender.MyReactForOpportunityAttack( + caster, + caster, + attackMode, + actionModifier, + "MageSlayer", + battleManager: battleManager); } } From cbfcc0ccd0c017d676c504f81fc2f4c7fc1dafd1 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:05:56 -0700 Subject: [PATCH 109/162] change Roguish Opportunist seize the chance to use MyReactForOpportunityAttack --- .../Subclasses/RoguishOpportunist.cs | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs index 676c029fe7..423c7d4822 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishOpportunist.cs @@ -439,18 +439,13 @@ private static IEnumerator HandleReaction( yield break; } - var actionService = ServiceRepository.GetService(); - var reactionParams = new CharacterActionParams( - helper, - ActionDefinitions.Id.AttackOpportunity, - attackMode, + yield return helper.MyReactForOpportunityAttack( defender, - actionModifier) { StringParameter2 = "SeizeTheChance" }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactForOpportunityAttack(reactionParams); - - yield return battleManager.WaitForReactions(attacker, actionService, count); + attacker, + attackMode, + actionModifier, + "SeizeTheChance", + battleManager: battleManager); } } } From 5b783262fdcb63d8fbee6b07a50659f5dffa5970 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:07:05 -0700 Subject: [PATCH 110/162] change Booming Step, Martial Arcane Archer Arcane Shot, and Malakh angelic radiance to use PowerNoCost instead of SpendPower --- SolastaUnfinishedBusiness/Races/Malakh.cs | 2 +- SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs | 2 +- SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SolastaUnfinishedBusiness/Races/Malakh.cs b/SolastaUnfinishedBusiness/Races/Malakh.cs index 50f3c0d5a2..32c37871ea 100644 --- a/SolastaUnfinishedBusiness/Races/Malakh.cs +++ b/SolastaUnfinishedBusiness/Races/Malakh.cs @@ -330,7 +330,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) var usablePower = PowerProvider.Get(powerAngelicRadianceDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 3); - locationCharacter.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); + locationCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index af389d1d5e..241d9e18bd 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -738,7 +738,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, _targets); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, _targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs index 6506f243b0..24e91c737a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialArcaneArcher.cs @@ -675,7 +675,7 @@ private void HandleBurstingArrow(GameLocationCharacter attacker, GameLocationCha EffectHelpers .StartVisualEffect(attacker, defender, SpellDefinitions.Shatter, EffectHelpers.EffectType.Zone); - attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); + attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); } } From 716d1a99af932489613c233e155133f9b912c448 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:07:29 -0700 Subject: [PATCH 111/162] remove superfluous code --- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 18 +++--------------- .../Spells/SpellBuildersLevel02.cs | 10 ++-------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 049a70b485..80c5c4f7a7 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -657,11 +657,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - action.AttackRoll != 1 || + if (action.AttackRoll != 1 || attacker == helper || attacker.IsOppositeSide(helper.Side) || !helper.CanReact() || @@ -745,11 +741,7 @@ public IEnumerator OnTryAlterAttributeCheck( GameLocationCharacter helper, ActionModifier abilityCheckModifier) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - abilityCheckData.AbilityCheckRoll != 1 || + if (abilityCheckData.AbilityCheckRoll != 1 || abilityCheckData.AbilityCheckRollOutcome != RollOutcome.Failure || helper == defender || helper.IsOppositeSide(defender.Side) || @@ -834,11 +826,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager || - !action.RolledSaveThrow || + if (!action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || helper == defender || helper.IsOppositeSide(defender.Side) || diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs index cd4ce2faa0..d852ad9914 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel02.cs @@ -1164,12 +1164,7 @@ private sealed class CustomBehaviorWitherAndBloom( public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - var battleManager = - ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager || action.Countered) + if (action.Countered) { yield break; } @@ -1209,8 +1204,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, remainingHitPoints.ToString(), maxHitPoints.ToString(), attacker.Name, _spellCastingAbilityModifier.ToString()), ReactionValidated, - ReactionNotValidated, - battleManager); + ReactionNotValidated); if (passed) { From ad3c5ca67be5a39a6c5bfb63fe3391b859bbd386 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:14:30 -0700 Subject: [PATCH 112/162] change Seeking Spell metamagic to use MyReactToDoNothing --- .../CustomUI/ReactionResourceSorceryPoints.cs | 4 +- .../Subclasses/Builders/MetamagicBuilders.cs | 84 ++++++++----------- 2 files changed, 34 insertions(+), 54 deletions(-) diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs index 0ebcc94361..f4573168e0 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs @@ -13,9 +13,7 @@ private ReactionResourceSorceryPoints() public string GetRequestPoints(CharacterReactionItem item) { - return item.ReactionRequest.ReactionParams.StringParameter2 == string.Empty - ? "1" - : item.ReactionRequest.ReactionParams.StringParameter2; + return item.ReactionRequest.ReactionParams.UsablePower?.PowerDefinition.CostPerUse.ToString() ?? "1"; } public AssetReferenceSprite Icon => Sprites.SorceryPointsResourceIcon; diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs index da2f10a169..0568d02d2b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/MetamagicBuilders.cs @@ -475,17 +475,9 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - if (action is not CharacterActionCastSpell) - { - yield break; - } - - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; var rulesetHelper = helper.RulesetCharacter; - if (!actionManager || - action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || + if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || !helper.IsActionOnGoing(ActionDefinitions.Id.MetamagicToggle) || rulesetHelper.RemainingSorceryPoints < 2) @@ -493,56 +485,46 @@ action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFail yield break; } - var reactionParams = - new CharacterActionParams(helper, (ActionDefinitions.Id)ExtraActionId.DoNothingFree) - { - StringParameter = "CustomReactionMetamagicSeekingSpellDescription".Formatted( - Category.Reaction, defender.Name), - StringParameter2 = "2" - }; - var count = actionManager.PendingReactionRequestGroups.Count; - - var reactionRequest = new ReactionRequestCustom("MetamagicSeekingSpell", reactionParams) - { - Resource = ReactionResourceSorceryPoints.Instance - }; - - actionManager.AddInterruptRequest(reactionRequest); + yield return helper.MyReactToDoNothing( + ExtraActionId.DoNothingFree, + attacker, + "MetamagicSeekingSpell", + "CustomReactionMetamagicSeekingSpellDescription".Formatted(Category.Reaction, defender.Name), + ReactionValidated); - yield return battleManager.WaitForReactions(attacker, actionManager, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated() { - yield break; - } + rulesetHelper.SpendSorceryPoints(2); - rulesetHelper.SpendSorceryPoints(2); + var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, + out _); + var previousRoll = action.AttackRoll; - var dieRoll = rulesetHelper.RollDie(DieType.D20, RollContext.None, false, AdvantageType.None, out _, out _); - var previousRoll = action.AttackRoll; + action.AttackSuccessDelta += dieRoll - previousRoll; + action.AttackRoll = dieRoll; - action.AttackSuccessDelta += dieRoll - previousRoll; - action.AttackRoll = dieRoll; + if (action.AttackSuccessDelta >= 0) + { + action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; + } + else + { + action.AttackRollOutcome = dieRoll == 1 ? RollOutcome.CriticalFailure : RollOutcome.Failure; + } - if (action.AttackSuccessDelta >= 0) - { - action.AttackRollOutcome = dieRoll == 20 ? RollOutcome.CriticalSuccess : RollOutcome.Success; + rulesetHelper.LogCharacterActivatesAbility( + "Feature/&MetamagicSeekingSpellTitle", + "Feedback/&MetamagicSeekingSpellToHitRoll", + extra: + [ + (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + dieRoll.ToString()), + (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, + previousRoll.ToString()) + ]); } - else - { - action.AttackRollOutcome = dieRoll == 1 ? RollOutcome.CriticalFailure : RollOutcome.Failure; - } - - rulesetHelper.LogCharacterActivatesAbility( - "Feature/&MetamagicSeekingSpellTitle", - "Feedback/&MetamagicSeekingSpellToHitRoll", - extra: - [ - (dieRoll > previousRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - dieRoll.ToString()), - (previousRoll > dieRoll ? ConsoleStyleDuplet.ParameterType.Positive : ConsoleStyleDuplet.ParameterType.Negative, - previousRoll.ToString()) - ]); } } From 9a016dcefaaf6c9a6fddf9514ffde464b1ceabca Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 09:33:19 -0700 Subject: [PATCH 113/162] add MyExecuteActionStabilizeAndStandUp --- .../GameLocationCharacterExtensions.cs | 32 +++++++++++++------ .../Classes/InventorClass.cs | 9 ++---- .../Models/Level20SubclassesContext.cs | 5 +-- .../Subclasses/CircleOfTheWildfire.cs | 7 +--- .../Subclasses/PatronCelestial.cs | 5 +-- .../Subclasses/RoguishUmbralStalker.cs | 7 +--- .../Subclasses/SorcerousPsion.cs | 6 ++-- 7 files changed, 30 insertions(+), 41 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 356e5c283a..ee52a611db 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -71,6 +71,22 @@ internal static void MyExecuteActionOpportunityAttack( actionService.ExecuteAction(actionParams, null, true); } + internal static void MyExecuteActionStabilizeAndStandUp( + this GameLocationCharacter character, int hitPoints, IMagicEffect magicEffect = null) + { + var commandService = ServiceRepository.GetService(); + var rulesetCharacter = character.RulesetCharacter; + + rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); + + if (magicEffect != null) + { + EffectHelpers.StartVisualEffect(character, character, magicEffect, EffectHelpers.EffectType.Caster); + } + + commandService.ExecuteInstantSingleAction(new CharacterActionParams(character, Id.StandUp)); + } + internal static IEnumerator MyReactToDoNothing( this GameLocationCharacter character, ExtraActionId actionId, @@ -121,7 +137,7 @@ internal static IEnumerator MyReactForOpportunityAttack( ReactionResourcePowerPool resource = null) { var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; if (!actionManager || !battleManager) @@ -135,14 +151,9 @@ internal static IEnumerator MyReactForOpportunityAttack( Id.AttackOpportunity, attackMode, defender, - actionModifier) - { - StringParameter2 = stringParameter2 - }; - var reactionRequest = new ReactionRequestReactionAttack(stringParameter2, reactionParams) - { - Resource = resource - }; + actionModifier) { StringParameter2 = stringParameter2 }; + var reactionRequest = + new ReactionRequestReactionAttack(stringParameter2, reactionParams) { Resource = resource }; actionManager.AddInterruptRequest(reactionRequest); @@ -181,7 +192,8 @@ internal static IEnumerator MyReactToSpendPower( StringParameter2 = stringParameter2, RulesetEffect = implementationManager.MyInstantiateEffectPower(character.RulesetCharacter, usablePower, false), - UsablePower = usablePower + UsablePower = usablePower, + IsReactionEffect = true }; actionService.ReactToSpendPower(actionParams); diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 3d83ef7f6d..8010557020 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -924,13 +924,8 @@ void ReactionValidated() { var hitPoints = rulesetCharacter.GetClassLevel(Class); - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - EffectHelpers.StartVisualEffect( - defender, defender, FeatureDefinitionPowers.PowerPatronTimekeeperTimeShift, - EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + defender.MyExecuteActionStabilizeAndStandUp( + hitPoints, FeatureDefinitionPowers.PowerPatronTimekeeperTimeShift); } } diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 1857567107..55137363b9 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -1863,10 +1863,7 @@ public IEnumerator HandleReducedToZeroHpByEnemy( void ReactionValidated() { rulesetCharacter.ForceKiPointConsumption(1); - rulesetCharacter.StabilizeAndGainHitPoints(1); - - ServiceRepository.GetService() - ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + defender.MyExecuteActionStabilizeAndStandUp(1); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index e2c9afb28c..bfc7486ba2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -923,12 +923,7 @@ void ReactionValidated() { var hitPoints = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.HitPoints) / 2; - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - EffectHelpers.StartVisualEffect( - defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, Id.StandUp), null, true); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints, PowerDefilerMistyFormEscape); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs index 444d924a57..12c7d4a6b5 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronCelestial.cs @@ -362,10 +362,7 @@ void ReactionValidated() { var hitPoints = rulesetCharacter.MissingHitPoints / 2; - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - ServiceRepository.GetService() - ?.ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs index ae6a3a9e4a..d443881f34 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishUmbralStalker.cs @@ -449,12 +449,7 @@ void ReactionValidated() { var hitPoints = 2 * rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Rogue); - rulesetCharacter.StabilizeAndGainHitPoints(hitPoints); - - EffectHelpers.StartVisualEffect( - defender, defender, PowerDefilerMistyFormEscape, EffectHelpers.EffectType.Caster); - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); + defender.MyExecuteActionStabilizeAndStandUp(hitPoints, PowerDefilerMistyFormEscape); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs index c0d18b8b76..0a3a7ba1b7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousPsion.cs @@ -369,14 +369,12 @@ public IEnumerator HandleReducedToZeroHpByEnemy( void ReactionValidated() { + defender.MyExecuteActionStabilizeAndStandUp(1); + var tempHitPoints = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Sorcerer) * 3; - rulesetCharacter.StabilizeAndGainHitPoints(1); rulesetCharacter.ReceiveTemporaryHitPoints( tempHitPoints, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, rulesetCharacter.Guid); - - ServiceRepository.GetService()? - .ExecuteAction(new CharacterActionParams(defender, ActionDefinitions.Id.StandUp), null, true); } } } From 0fa58b2e71971bf6a4af88327a74fdaaba9a3778 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 10:19:17 -0700 Subject: [PATCH 114/162] update diagnostics --- .../ProxyPathOfTheWildMagicSummon.json | 146 ------- .../PowerPathOfTheBeastCallTheHunt.json | 4 +- .../PowerPathOfTheWildMagicSummonBlast.json | 363 ------------------ ...PathOfTheWildMagicSummonBlastReaction.json | 363 ------------------ 4 files changed, 2 insertions(+), 874 deletions(-) delete mode 100644 Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyPathOfTheWildMagicSummon.json delete mode 100644 Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlast.json delete mode 100644 Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlastReaction.json diff --git a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyPathOfTheWildMagicSummon.json b/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyPathOfTheWildMagicSummon.json deleted file mode 100644 index ca1942b84f..0000000000 --- a/Diagnostics/UnfinishedBusinessBlueprints/EffectProxyDefinition/ProxyPathOfTheWildMagicSummon.json +++ /dev/null @@ -1,146 +0,0 @@ -{ - "$type": "EffectProxyDefinition, Assembly-CSharp", - "canMove": false, - "canRotate": true, - "canMoveOnCharacters": false, - "canAttack": false, - "canTriggerPower": true, - "autoTerminateOnTriggerPower": true, - "incrementalDamageDice": 0, - "actionId": "NoAction", - "freeActionId": "NoAction", - "attackMethod": "ReproduceDamageForms", - "firstAttackIsFree": false, - "constrainedToSpellArea": false, - "damageDie": "D8", - "damageDieNum": 1, - "damageType": "DamageRadiant", - "addAbilityToDamage": false, - "attackPower": "Definition:PowerPathOfTheWildMagicSummonBlast:40b99c9c-2ab1-5c44-8afe-8781800bb700", - "impactsPlacement": false, - "additionalFeatures": [ - "Definition:MoveModeMove2:0127a492ba7a429408b3282dde9374d7", - "Definition:MoveModeFly12:5e70172c8e2a40146b375001ab656a44" - ], - "attackParticle": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "attackImpactParticle": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "addLightSource": true, - "lightSourceForm": { - "$type": "LightSourceForm, Assembly-CSharp", - "lightSourceType": "Basic", - "brightRange": 2, - "dimAdditionalRange": 2, - "color": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 0.933333337, - "g": 0.8428167, - "b": 0.4196078, - "a": 1.0 - }, - "graphicsPrefabReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "b604c9f0be3f29241adbf0c6754b7324", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "applyToSelf": false, - "forceOnSelf": false - }, - "lightSourceOffset": { - "$type": "UnityEngine.Vector3, UnityEngine.CoreModule", - "x": 0.0, - "y": 0.5, - "z": 0.0 - }, - "spellImmunityFromOutside": false, - "maxSpellLevelImmunity": 1, - "hasPresentation": true, - "prefabReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "6c9e02aed79129b4dadb6ea301ee193d", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "isEmptyPresentation": false, - "modelScale": 1.0, - "showWorldLocationFeedbacks": true, - "hasPortrait": true, - "portraitSpriteReference": { - "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", - "m_AssetGUID": "a206bbd84c5d22147a9aa91bb99eeb90", - "m_SubObjectName": "ProxyDancingLights", - "m_SubObjectType": "" - }, - "startEvent": { - "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", - "WwiseObjectReference": null, - "idInternal": 0, - "valueGuidInternal": { - "$type": "System.Byte[], mscorlib", - "$value": "" - } - }, - "stopEvent": { - "$type": "AK.Wwise.Event, AK.Wwise.Unity.API.WwiseTypes", - "WwiseObjectReference": null, - "idInternal": 0, - "valueGuidInternal": { - "$type": "System.Byte[], mscorlib", - "$value": "" - } - }, - "soundEffectOnHitDescription": { - "$type": "SoundEffectOnHitDescription, Assembly-CSharp", - "switchOnHit": { - "$type": "AK.Wwise.Switch, AK.Wwise.Unity.API.WwiseTypes", - "WwiseObjectReference": null, - "groupIdInternal": 0, - "groupGuidInternal": { - "$type": "System.Byte[], mscorlib", - "$value": "" - }, - "idInternal": 0, - "valueGuidInternal": { - "$type": "System.Byte[], mscorlib", - "$value": "" - } - } - }, - "guiPresentation": { - "$type": "GuiPresentation, Assembly-CSharp", - "hidden": false, - "title": "Condition/&ConditionPathOfTheWildMagicWildSurgeSummonTitle", - "description": "Condition/&ConditionPathOfTheWildMagicWildSurgeSummonDescription", - "spriteReference": { - "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", - "m_AssetGUID": "3e3ee87230f7e034ba9f11a757ada669", - "m_SubObjectName": "DelayedBlastFireball", - "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" - }, - "color": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 1.0, - "b": 1.0, - "a": 1.0 - }, - "symbolChar": "221E", - "sortOrder": 0, - "unusedInSolastaCOTM": false, - "usedInValleyDLC": false - }, - "contentCopyright": "UserContent", - "guid": "a07f1fcc-0bce-523e-b583-83cc9fed1093", - "contentPack": 9999, - "name": "ProxyPathOfTheWildMagicSummon" -} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheBeastCallTheHunt.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheBeastCallTheHunt.json index 0bc46fa46b..d80a889c5c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheBeastCallTheHunt.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheBeastCallTheHunt.json @@ -292,7 +292,7 @@ "delegatedToAction": false, "surrogateToSpell": null, "triggeredBySpecialMove": false, - "activationTime": "OnPowerActivatedAuto", + "activationTime": "NoCost", "autoActivationRequiredTargetSenseType": "None", "autoActivationRequiredTargetCreatureTag": "", "autoActivationPowerTag": "", @@ -321,7 +321,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlast.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlast.json deleted file mode 100644 index e1c52958f0..0000000000 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlast.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "$type": "FeatureDefinitionPower, Assembly-CSharp", - "effectDescription": { - "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Self", - "rangeParameter": 0, - "halfDamageOnAMiss": false, - "hitAffinitiesByTargetTag": [], - "targetType": "Cube", - "itemSelectionType": "None", - "targetParameter": 3, - "targetParameter2": 2, - "emissiveBorder": "None", - "emissiveParameter": 1, - "requiresTargetProximity": false, - "targetProximityDistance": 6, - "targetExcludeCaster": false, - "canBePlacedOnCharacter": true, - "affectOnlyGround": false, - "targetFilteringMethod": "AllCharacterAndGadgets", - "targetFilteringTag": "No", - "requiresVisibilityForPosition": true, - "inviteOptionalAlly": false, - "slotTypes": [], - "recurrentEffect": "No", - "retargetAfterDeath": false, - "retargetActionType": "Bonus", - "poolFilterDiceNumber": 5, - "poolFilterDieType": "D8", - "trapRangeType": "Triggerer", - "targetConditionName": "", - "targetConditionAsset": null, - "targetSide": "All", - "durationType": "Instantaneous", - "durationParameter": 1, - "endOfEffect": "EndOfTurn", - "hasSavingThrow": true, - "disableSavingThrowOnAllies": false, - "savingThrowAbility": "Dexterity", - "ignoreCover": true, - "grantedConditionOnSave": null, - "rollSaveOnlyIfRelevantForms": false, - "hasShoveRoll": false, - "createdByCharacter": true, - "difficultyClassComputation": "AbilityScoreAndProficiency", - "savingThrowDifficultyAbility": "Constitution", - "fixedSavingThrowDifficultyClass": 8, - "savingThrowAffinitiesBySense": [], - "savingThrowAffinitiesByFamily": [], - "damageAffinitiesByFamily": [], - "advantageForEnemies": false, - "canBeDispersed": false, - "hasVelocity": false, - "velocityCellsPerRound": 2, - "velocityType": "AwayFromSourceOriginalPosition", - "restrictedCreatureFamilies": [], - "immuneCreatureFamilies": [], - "restrictedCharacterSizes": [], - "hasLimitedEffectPool": false, - "effectPoolAmount": 60, - "effectApplication": "All", - "effectFormFilters": [], - "effectForms": [ - { - "$type": "EffectForm, Assembly-CSharp", - "formType": "Damage", - "addBonusMode": "None", - "applyLevel": "No", - "levelType": "ClassLevel", - "levelMultiplier": 1, - "diceByLevelTable": [], - "createdByCharacter": true, - "createdByCondition": false, - "hasSavingThrow": true, - "savingThrowAffinity": "Negates", - "dcModifier": 0, - "canSaveToCancel": false, - "saveOccurence": "EndOfTurn", - "damageForm": { - "$type": "DamageForm, Assembly-CSharp", - "versatile": false, - "diceNumber": 1, - "dieType": "D6", - "overrideWithBardicInspirationDie": false, - "versatileDieType": "D1", - "bonusDamage": 0, - "damageType": "DamageForce", - "ancestryType": "Sorcerer", - "healFromInflictedDamage": "Never", - "hitPointsFloor": 0, - "forceKillOnZeroHp": false, - "specialDeathCondition": null, - "ignoreFlyingCharacters": false, - "ignoreCriticalDoubleDice": false - }, - "hasFilterId": false, - "filterId": 0 - } - ], - "specialFormsDescription": "", - "effectAdvancement": { - "$type": "EffectAdvancement, Assembly-CSharp", - "effectIncrementMethod": "None", - "incrementMultiplier": 1, - "additionalTargetsPerIncrement": 0, - "additionalSubtargetsPerIncrement": 0, - "additionalDicePerIncrement": 0, - "additionalSpellLevelPerIncrement": 0, - "additionalSummonsPerIncrement": 0, - "additionalHPPerIncrement": 0, - "additionalTempHPPerIncrement": 0, - "additionalTargetCellsPerIncrement": 0, - "additionalItemBonus": 0, - "additionalWeaponDie": 0, - "alteredDuration": "None" - }, - "speedType": "Instant", - "speedParameter": -1.0, - "offsetImpactTimeBasedOnDistance": true, - "offsetImpactTimeBasedOnDistanceFactor": 0.05, - "offsetImpactTimePerTarget": 0.0, - "effectParticleParameters": { - "$type": "EffectParticleParameters, Assembly-CSharp", - "casterParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "casterSelfParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "casterQuickSpellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "targetParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "effectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "effectSubTargetParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "zoneParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "b6820f3b2273d454c97a4c29dd5e50dd", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "beforeImpactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "impactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "9f1fe10e6ef8c9c43b6b2ef91b2ad38a", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectImpactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceParticlePerIndex": "", - "activeEffectSurfaceParticlePerIndexCount": 0, - "emissiveBorderCellStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderCellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderCellEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "forceApplyZoneParticle": true, - "applyEmissionColorOnWeapons": false, - "emissionColor": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 0.0, - "g": 0.0, - "b": 0.0, - "a": 0.0 - }, - "emissionColorFadeInDuration": 0.0, - "emissionColorFadeOutDuration": 0.0 - }, - "effectAIParameters": { - "$type": "EffectAIParameters, Assembly-CSharp", - "aoeScoreMultiplier": 1.0, - "cooldownForCaster": 0, - "cooldownForBattle": 0, - "sortingScoreMultiplier": 1.0, - "dynamicCooldown": false - }, - "animationMagicEffect": "Animation0", - "lightCounterDispellsEffect": false, - "hideSavingThrowAnimation": false - }, - "delegatedToAction": false, - "surrogateToSpell": null, - "triggeredBySpecialMove": false, - "activationTime": "Action", - "autoActivationRequiredTargetSenseType": "None", - "autoActivationRequiredTargetCreatureTag": "", - "autoActivationPowerTag": "", - "triggeringPower": null, - "copyTargetingFromTriggeringPower": false, - "reactionContext": "None", - "damageTypes": [], - "reactionName": "", - "reactionActingCharacterParamIdx": 0, - "reactionAttackerParamIdx": -1, - "hasCastingFailure": false, - "castingSuccessComputation": "CasterLevel", - "canUseInDialog": false, - "disableIfConditionIsOwned": null, - "disableIfTargetConditionIsOwned": null, - "rechargeRate": "AtWill", - "costPerUse": 1, - "spellcastingFeature": null, - "usesDetermination": "Fixed", - "abilityScoreDetermination": "Explicit", - "usesAbilityScoreName": "Charisma", - "fixedUsesPerRecharge": 1, - "abilityScore": "Intelligence", - "attackHitComputation": "AbilityScore", - "fixedAttackHit": 0, - "abilityScoreBonusToAttack": false, - "proficiencyBonusToAttack": false, - "uniqueInstance": false, - "showCasting": false, - "shortTitleOverride": "", - "overriddenPower": null, - "includeBaseDescription": false, - "guiPresentation": { - "$type": "GuiPresentation, Assembly-CSharp", - "hidden": false, - "title": "Feature/&PowerPathOfTheWildMagicSummonBlastTitle", - "description": "Feature/&PowerPathOfTheWildMagicSummonBlastDescription", - "spriteReference": { - "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": null, - "m_SubObjectType": null - }, - "color": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 1.0, - "b": 1.0, - "a": 1.0 - }, - "symbolChar": "221E", - "sortOrder": 0, - "unusedInSolastaCOTM": false, - "usedInValleyDLC": false - }, - "contentCopyright": "UserContent", - "guid": "40b99c9c-2ab1-5c44-8afe-8781800bb700", - "contentPack": 9999, - "name": "PowerPathOfTheWildMagicSummonBlast" -} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlastReaction.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlastReaction.json deleted file mode 100644 index e19265e288..0000000000 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerPathOfTheWildMagicSummonBlastReaction.json +++ /dev/null @@ -1,363 +0,0 @@ -{ - "$type": "FeatureDefinitionPower, Assembly-CSharp", - "effectDescription": { - "$type": "EffectDescription, Assembly-CSharp", - "rangeType": "Distance", - "rangeParameter": 6, - "halfDamageOnAMiss": false, - "hitAffinitiesByTargetTag": [], - "targetType": "Cube", - "itemSelectionType": "None", - "targetParameter": 3, - "targetParameter2": 2, - "emissiveBorder": "None", - "emissiveParameter": 1, - "requiresTargetProximity": false, - "targetProximityDistance": 6, - "targetExcludeCaster": false, - "canBePlacedOnCharacter": true, - "affectOnlyGround": false, - "targetFilteringMethod": "AllCharacterAndGadgets", - "targetFilteringTag": "No", - "requiresVisibilityForPosition": true, - "inviteOptionalAlly": false, - "slotTypes": [], - "recurrentEffect": "No", - "retargetAfterDeath": false, - "retargetActionType": "Bonus", - "poolFilterDiceNumber": 5, - "poolFilterDieType": "D8", - "trapRangeType": "Triggerer", - "targetConditionName": "", - "targetConditionAsset": null, - "targetSide": "All", - "durationType": "Instantaneous", - "durationParameter": 1, - "endOfEffect": "EndOfTurn", - "hasSavingThrow": true, - "disableSavingThrowOnAllies": false, - "savingThrowAbility": "Dexterity", - "ignoreCover": true, - "grantedConditionOnSave": null, - "rollSaveOnlyIfRelevantForms": false, - "hasShoveRoll": false, - "createdByCharacter": true, - "difficultyClassComputation": "AbilityScoreAndProficiency", - "savingThrowDifficultyAbility": "Constitution", - "fixedSavingThrowDifficultyClass": 8, - "savingThrowAffinitiesBySense": [], - "savingThrowAffinitiesByFamily": [], - "damageAffinitiesByFamily": [], - "advantageForEnemies": false, - "canBeDispersed": false, - "hasVelocity": false, - "velocityCellsPerRound": 2, - "velocityType": "AwayFromSourceOriginalPosition", - "restrictedCreatureFamilies": [], - "immuneCreatureFamilies": [], - "restrictedCharacterSizes": [], - "hasLimitedEffectPool": false, - "effectPoolAmount": 60, - "effectApplication": "All", - "effectFormFilters": [], - "effectForms": [ - { - "$type": "EffectForm, Assembly-CSharp", - "formType": "Damage", - "addBonusMode": "None", - "applyLevel": "No", - "levelType": "ClassLevel", - "levelMultiplier": 1, - "diceByLevelTable": [], - "createdByCharacter": true, - "createdByCondition": false, - "hasSavingThrow": true, - "savingThrowAffinity": "Negates", - "dcModifier": 0, - "canSaveToCancel": false, - "saveOccurence": "EndOfTurn", - "damageForm": { - "$type": "DamageForm, Assembly-CSharp", - "versatile": false, - "diceNumber": 1, - "dieType": "D6", - "overrideWithBardicInspirationDie": false, - "versatileDieType": "D1", - "bonusDamage": 0, - "damageType": "DamageForce", - "ancestryType": "Sorcerer", - "healFromInflictedDamage": "Never", - "hitPointsFloor": 0, - "forceKillOnZeroHp": false, - "specialDeathCondition": null, - "ignoreFlyingCharacters": false, - "ignoreCriticalDoubleDice": false - }, - "hasFilterId": false, - "filterId": 0 - } - ], - "specialFormsDescription": "", - "effectAdvancement": { - "$type": "EffectAdvancement, Assembly-CSharp", - "effectIncrementMethod": "None", - "incrementMultiplier": 1, - "additionalTargetsPerIncrement": 0, - "additionalSubtargetsPerIncrement": 0, - "additionalDicePerIncrement": 0, - "additionalSpellLevelPerIncrement": 0, - "additionalSummonsPerIncrement": 0, - "additionalHPPerIncrement": 0, - "additionalTempHPPerIncrement": 0, - "additionalTargetCellsPerIncrement": 0, - "additionalItemBonus": 0, - "additionalWeaponDie": 0, - "alteredDuration": "None" - }, - "speedType": "Instant", - "speedParameter": -1.0, - "offsetImpactTimeBasedOnDistance": true, - "offsetImpactTimeBasedOnDistanceFactor": 0.05, - "offsetImpactTimePerTarget": 0.0, - "effectParticleParameters": { - "$type": "EffectParticleParameters, Assembly-CSharp", - "casterParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "casterSelfParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "casterQuickSpellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "targetParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "effectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "effectSubTargetParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "zoneParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "b6820f3b2273d454c97a4c29dd5e50dd", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "beforeImpactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "impactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "9f1fe10e6ef8c9c43b6b2ef91b2ad38a", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectImpactParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectCellEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "activeEffectSurfaceParticlePerIndex": "", - "activeEffectSurfaceParticlePerIndexCount": 0, - "emissiveBorderCellStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderCellParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderCellEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "emissiveBorderSurfaceEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionStartParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "conditionEndParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "forceApplyZoneParticle": true, - "applyEmissionColorOnWeapons": false, - "emissionColor": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 0.0, - "g": 0.0, - "b": 0.0, - "a": 0.0 - }, - "emissionColorFadeInDuration": 0.0, - "emissionColorFadeOutDuration": 0.0 - }, - "effectAIParameters": { - "$type": "EffectAIParameters, Assembly-CSharp", - "aoeScoreMultiplier": 1.0, - "cooldownForCaster": 0, - "cooldownForBattle": 0, - "sortingScoreMultiplier": 1.0, - "dynamicCooldown": false - }, - "animationMagicEffect": "Animation0", - "lightCounterDispellsEffect": false, - "hideSavingThrowAnimation": false - }, - "delegatedToAction": false, - "surrogateToSpell": null, - "triggeredBySpecialMove": false, - "activationTime": "Action", - "autoActivationRequiredTargetSenseType": "None", - "autoActivationRequiredTargetCreatureTag": "", - "autoActivationPowerTag": "", - "triggeringPower": null, - "copyTargetingFromTriggeringPower": false, - "reactionContext": "None", - "damageTypes": [], - "reactionName": "", - "reactionActingCharacterParamIdx": 0, - "reactionAttackerParamIdx": -1, - "hasCastingFailure": false, - "castingSuccessComputation": "CasterLevel", - "canUseInDialog": false, - "disableIfConditionIsOwned": null, - "disableIfTargetConditionIsOwned": null, - "rechargeRate": "AtWill", - "costPerUse": 1, - "spellcastingFeature": null, - "usesDetermination": "Fixed", - "abilityScoreDetermination": "Explicit", - "usesAbilityScoreName": "Charisma", - "fixedUsesPerRecharge": 1, - "abilityScore": "Intelligence", - "attackHitComputation": "AbilityScore", - "fixedAttackHit": 0, - "abilityScoreBonusToAttack": false, - "proficiencyBonusToAttack": false, - "uniqueInstance": false, - "showCasting": false, - "shortTitleOverride": "", - "overriddenPower": null, - "includeBaseDescription": false, - "guiPresentation": { - "$type": "GuiPresentation, Assembly-CSharp", - "hidden": false, - "title": "Feature/&PowerPathOfTheWildMagicSummonBlastTitle", - "description": "Feature/&PowerPathOfTheWildMagicSummonBlastDescription", - "spriteReference": { - "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "color": { - "$type": "UnityEngine.Color, UnityEngine.CoreModule", - "r": 1.0, - "g": 1.0, - "b": 1.0, - "a": 1.0 - }, - "symbolChar": "221E", - "sortOrder": 0, - "unusedInSolastaCOTM": false, - "usedInValleyDLC": false - }, - "contentCopyright": "UserContent", - "guid": "59a94050-c705-5d8b-ae5f-040df6707af9", - "contentPack": 9999, - "name": "PowerPathOfTheWildMagicSummonBlastReaction" -} \ No newline at end of file From 43db664ac66c2ae6084ac8da25d6bb3cdbb60b6e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 10:46:16 -0700 Subject: [PATCH 115/162] cleanse translations --- .../Translations/de/Feats/OtherFeats-de.txt | 8 ++++---- .../Translations/de/SubClasses/PathOfTheBeast-de.txt | 8 ++++---- .../Translations/en/Feats/OtherFeats-en.txt | 8 ++++---- .../Translations/en/SubClasses/PathOfTheBeast-en.txt | 8 ++++---- .../Translations/es/Feats/OtherFeats-es.txt | 8 ++++---- .../Translations/es/SubClasses/PathOfTheBeast-es.txt | 8 ++++---- .../Translations/fr/Feats/OtherFeats-fr.txt | 8 ++++---- .../Translations/fr/SubClasses/PathOfTheBeast-fr.txt | 8 ++++---- .../Translations/it/Feats/OtherFeats-it.txt | 8 ++++---- .../Translations/it/SubClasses/PathOfTheBeast-it.txt | 8 ++++---- .../Translations/ja/Feats/OtherFeats-ja.txt | 8 ++++---- .../Translations/ja/SubClasses/PathOfTheBeast-ja.txt | 8 ++++---- .../Translations/ko/Feats/OtherFeats-ko.txt | 8 ++++---- .../Translations/ko/SubClasses/PathOfTheBeast-ko.txt | 8 ++++---- .../Translations/pt-BR/Feats/OtherFeats-pt-BR.txt | 8 ++++---- .../pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt | 8 ++++---- .../Translations/ru/Feats/OtherFeats-ru.txt | 8 ++++---- .../Translations/ru/SubClasses/PathOfTheBeast-ru.txt | 8 ++++---- .../Translations/zh-CN/Feats/OtherFeats-zh-CN.txt | 8 ++++---- .../zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt | 8 ++++---- 20 files changed, 80 insertions(+), 80 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt index ebc5d0b2d0..c87b97c3f4 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Feats/OtherFeats-de.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} hat {1} verwendet und würfelt eine {2}, um {3 Feedback/&LuckySavingToHitRoll={0} hat {1} verwendet und würfelt beim Rettungswurf eine {2}, um {3} zu ersetzen Item/&ItemFeatChefTreatDescription=Essen Sie diese Leckerei vom Küchenchef und erhalten Sie 5 temporäre Trefferpunkte. Item/&ItemFeatChefTreatTitle=Leckerbissen vom Küchenchef -Reaction/&SpendPowerMageSlayerDescription=Der Rettungswurf gegen {0} ist Ihnen misslungen. Sie können stattdessen dafür sorgen, dass Ihr Wurf erfolgreich ist. -Reaction/&SpendPowerMageSlayerReactDescription=Sorgen Sie stattdessen dafür, dass Sie erfolgreich sind. -Reaction/&SpendPowerMageSlayerReactTitle=Gelingen -Reaction/&SpendPowerMageSlayerTitle=Magiertöter Reaction/&ReactionAttackMageSlayerDescription={0} Wirke einen Zauber in einem Umkreis von 1,5 m um dich herum. Du kannst deine Reaktion zum Angreifen nutzen. Reaction/&ReactionAttackMageSlayerReactDescription=Verwenden Sie die Reaktion, um das Ziel anzugreifen. Reaction/&ReactionAttackMageSlayerReactTitle=Attacke @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} verlässt einen Bereich, der von eine Reaction/&ReactionWarcasterReactDescription=Verwenden Sie die Reaktion, um das Ziel anzugreifen. Reaction/&ReactionWarcasterReactTitle=Attacke Reaction/&ReactionWarcasterTitle=Gelegenheitsangriff +Reaction/&SpendPowerMageSlayerDescription=Der Rettungswurf gegen {0} ist Ihnen misslungen. Sie können stattdessen dafür sorgen, dass Ihr Wurf erfolgreich ist. +Reaction/&SpendPowerMageSlayerReactDescription=Sorgen Sie stattdessen dafür, dass Sie erfolgreich sind. +Reaction/&SpendPowerMageSlayerReactTitle=Gelingen +Reaction/&SpendPowerMageSlayerTitle=Magiertöter Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Aktion auswählen Reaction/&SubitemSelectReactionAttackSentinelTitle=Aktion auswählen Reaction/&SubitemSelectReactionWarcasterTitle=Aktion auswählen diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt index a0c1c43ad7..c38097aade 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheBeast-de.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Wählen Sie eine Tie Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Wählen Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Wählen Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Gestalt des Tieres +Reaction/&UseBeastTailSwipeDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. +Reaction/&UseBeastTailSwipeReactDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Schwanzschlag Reaction/&UsePowerCallTheHuntDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. Reaction/&UsePowerCallTheHuntReactDescription=Nutze Kraft, um vorübergehend HP zu gewinnen und Verbündeten Bonusschaden zuzufügen, während du wütend bist. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Setzen Sie Kraft ein, um Ansteckende Reaction/&UsePowerInfectiousFuryReactDescription=Setzen Sie Kraft ein, um Ansteckende Wut auf das Ziel anzuwenden. Reaction/&UsePowerInfectiousFuryReactTitle=Ausgeben Reaction/&UsePowerInfectiousFuryTitle=Ansteckende Wut -Reaction/&UseBeastTailSwipeDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. -Reaction/&UseBeastTailSwipeReactDescription=Verwenden Sie Tail Swipe, um bis zum Ende des Zuges des Gegners 1W8 AC hinzuzufügen. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Schwanzschlag Subclass/&PathOfTheBeastDescription=Diese Barbaren sind zu ihren animalischen Wurzeln zurückgekehrt und kanalisieren ihre bestialische Essenz bis zu dem Punkt, an dem sie sich physisch manifestieren. Subclass/&PathOfTheBeastTitle=Pfad des Tieres Tooltip/&TagBeastWeaponTitle=Bestienwaffe diff --git a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt index 7eefb81083..0c21685eb3 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Feats/OtherFeats-en.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} used {1} and rolls a {2} to replace {3} on the Feedback/&LuckySavingToHitRoll={0} used {1} and rolls a {2} to replace {3} on the saving roll Item/&ItemFeatChefTreatDescription=Eat this Chef's treat and gain 5 temporary hit points. Item/&ItemFeatChefTreatTitle=Chef's Treat -Reaction/&SpendPowerMageSlayerDescription=You failed a saving throw against {0}. You can cause yourself to succeed instead. -Reaction/&SpendPowerMageSlayerReactDescription=Cause yourself to succeed instead. -Reaction/&SpendPowerMageSlayerReactTitle=Succeed -Reaction/&SpendPowerMageSlayerTitle=Mage Slayer Reaction/&ReactionAttackMageSlayerDescription={0} cast a spell within 5 ft of you. You can use your reaction to attack. Reaction/&ReactionAttackMageSlayerReactDescription=Use reaction to attack target. Reaction/&ReactionAttackMageSlayerReactTitle=Attack @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} is leaving an area threatened by one Reaction/&ReactionWarcasterReactDescription=Use reaction to attack target. Reaction/&ReactionWarcasterReactTitle=Attack Reaction/&ReactionWarcasterTitle=Attack of Opportunity +Reaction/&SpendPowerMageSlayerDescription=You failed a saving throw against {0}. You can cause yourself to succeed instead. +Reaction/&SpendPowerMageSlayerReactDescription=Cause yourself to succeed instead. +Reaction/&SpendPowerMageSlayerReactTitle=Succeed +Reaction/&SpendPowerMageSlayerTitle=Mage Slayer Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Select action Reaction/&SubitemSelectReactionAttackSentinelTitle=Select action Reaction/&SubitemSelectReactionWarcasterTitle=Select action diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt index dcfc142d11..cd2df030f3 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheBeast-en.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Choose a beast form Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Choose Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Choose Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Form of the Beast +Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. +Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Tail Swipe Reaction/&UsePowerCallTheHuntDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. Reaction/&UsePowerCallTheHuntReactDescription=Use power to gain temporary HP and grant bonus damage to allies while you are raging. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Spend power to apply Infectious Fury Reaction/&UsePowerInfectiousFuryReactDescription=Spend power to apply Infectious Fury to target. Reaction/&UsePowerInfectiousFuryReactTitle=Spend Reaction/&UsePowerInfectiousFuryTitle=Infectious Fury -Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. -Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe to add 1d8 AC until the end of the enemy's turn. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Tail Swipe Subclass/&PathOfTheBeastDescription=These barbarians have returned to their animalistic roots and channel their bestial essence to the point of manifesting them physically. Subclass/&PathOfTheBeastTitle=Path of the Beast Tooltip/&TagBeastWeaponTitle=Beast Weapon diff --git a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt index e97a9b28f3..b73ab1eff2 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Feats/OtherFeats-es.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} usó {1} y saca un {2} para reemplazar a {3} e Feedback/&LuckySavingToHitRoll={0} usó {1} y saca un {2} para reemplazar a {3} en la tirada de salvación Item/&ItemFeatChefTreatDescription=Come esta delicia del chef y gana 5 puntos de vida temporales. Item/&ItemFeatChefTreatTitle=Delicia del chef -Reaction/&SpendPowerMageSlayerDescription=Fallaste una tirada de salvación contra {0}. Puedes hacer que tú mismo la superes. -Reaction/&SpendPowerMageSlayerReactDescription=Haz que tú mismo triunfes. -Reaction/&SpendPowerMageSlayerReactTitle=Tener éxito -Reaction/&SpendPowerMageSlayerTitle=Asesino de magos Reaction/&ReactionAttackMageSlayerDescription={0} lanza un hechizo a 5 pies de ti. Puedes usar tu reacción para atacar. Reaction/&ReactionAttackMageSlayerReactDescription=Utilice la reacción para atacar al objetivo. Reaction/&ReactionAttackMageSlayerReactTitle=Ataque @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} está abandonando un área amenazada Reaction/&ReactionWarcasterReactDescription=Utilice la reacción para atacar al objetivo. Reaction/&ReactionWarcasterReactTitle=Ataque Reaction/&ReactionWarcasterTitle=Ataque de oportunidad +Reaction/&SpendPowerMageSlayerDescription=Fallaste una tirada de salvación contra {0}. Puedes hacer que tú mismo la superes. +Reaction/&SpendPowerMageSlayerReactDescription=Haz que tú mismo triunfes. +Reaction/&SpendPowerMageSlayerReactTitle=Tener éxito +Reaction/&SpendPowerMageSlayerTitle=Asesino de magos Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Seleccione la acción Reaction/&SubitemSelectReactionAttackSentinelTitle=Seleccione la acción Reaction/&SubitemSelectReactionWarcasterTitle=Seleccione la acción diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt index b6a1732aa6..7b112740e0 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheBeast-es.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Elige una forma de b Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Elegir Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Elegir Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma de la Bestia +Reaction/&UseBeastTailSwipeDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. +Reaction/&UseBeastTailSwipeReactDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Golpe de cola Reaction/&UsePowerCallTheHuntDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. Reaction/&UsePowerCallTheHuntReactDescription=Usa el poder para ganar HP temporalmente y otorgar daño adicional a los aliados mientras estás enfurecido. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Gasta poder para aplicar Furia infec Reaction/&UsePowerInfectiousFuryReactDescription=Gasta poder para aplicar Furia infecciosa al objetivo. Reaction/&UsePowerInfectiousFuryReactTitle=Gastar Reaction/&UsePowerInfectiousFuryTitle=Furia infecciosa -Reaction/&UseBeastTailSwipeDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. -Reaction/&UseBeastTailSwipeReactDescription=Usa Golpe de cola para agregar 1d8 CA hasta el final del turno del enemigo. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Golpe de cola Subclass/&PathOfTheBeastDescription=Estos bárbaros han regresado a sus raíces animales y canalizan su esencia bestial hasta el punto de manifestarla físicamente. Subclass/&PathOfTheBeastTitle=Camino de la Bestia Tooltip/&TagBeastWeaponTitle=Arma Bestia diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt index ed813a26e0..0c0ec7ec91 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/OtherFeats-fr.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} a utilisé {1} et lance un {2} pour remplacer Feedback/&LuckySavingToHitRoll={0} a utilisé {1} et lance un {2} pour remplacer {3} sur le jet de sauvegarde Item/&ItemFeatChefTreatDescription=Mangez cette friandise du chef et gagnez 5 points de vie temporaires. Item/&ItemFeatChefTreatTitle=Régal du chef -Reaction/&SpendPowerMageSlayerDescription=Vous avez raté un jet de sauvegarde contre {0}. Vous pouvez vous forcer à le réussir à la place. -Reaction/&SpendPowerMageSlayerReactDescription=Faites plutôt en sorte que vous réussissiez. -Reaction/&SpendPowerMageSlayerReactTitle=Réussir -Reaction/&SpendPowerMageSlayerTitle=Tueur de mages Reaction/&ReactionAttackMageSlayerDescription={0} lance un sort à 1,50 m de vous. Vous pouvez utiliser votre réaction pour attaquer. Reaction/&ReactionAttackMageSlayerReactDescription=Utilisez la réaction pour attaquer la cible. Reaction/&ReactionAttackMageSlayerReactTitle=Attaque @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} quitte une zone menacée par un ou pl Reaction/&ReactionWarcasterReactDescription=Utilisez la réaction pour attaquer la cible. Reaction/&ReactionWarcasterReactTitle=Attaque Reaction/&ReactionWarcasterTitle=Attaque d'opportunité +Reaction/&SpendPowerMageSlayerDescription=Vous avez raté un jet de sauvegarde contre {0}. Vous pouvez vous forcer à le réussir à la place. +Reaction/&SpendPowerMageSlayerReactDescription=Faites plutôt en sorte que vous réussissiez. +Reaction/&SpendPowerMageSlayerReactTitle=Réussir +Reaction/&SpendPowerMageSlayerTitle=Tueur de mages Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Sélectionnez l'action Reaction/&SubitemSelectReactionAttackSentinelTitle=Sélectionnez l'action Reaction/&SubitemSelectReactionWarcasterTitle=Sélectionnez l'action diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt index f4b5aaaf0d..3f5b953154 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheBeast-fr.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Choisissez une forme Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Choisir Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Choisir Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forme de la bête +Reaction/&UseBeastTailSwipeDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. +Reaction/&UseBeastTailSwipeReactDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Coup de queue Reaction/&UsePowerCallTheHuntDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. Reaction/&UsePowerCallTheHuntReactDescription=Utilisez le pouvoir pour gagner des PV temporaires et accorder des dégâts supplémentaires aux alliés pendant que vous êtes enragé. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Dépensez de l'énergie pour appliqu Reaction/&UsePowerInfectiousFuryReactDescription=Dépensez de l'énergie pour appliquer la fureur infectieuse à la cible. Reaction/&UsePowerInfectiousFuryReactTitle=Dépenser Reaction/&UsePowerInfectiousFuryTitle=Fureur contagieuse -Reaction/&UseBeastTailSwipeDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. -Reaction/&UseBeastTailSwipeReactDescription=Utilisez Coup de queue pour ajouter 1d8 CA jusqu'à la fin du tour de l'ennemi. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Coup de queue Subclass/&PathOfTheBeastDescription=Ces barbares sont retournés à leurs racines animales et canalisent leur essence bestiale au point de les manifester physiquement. Subclass/&PathOfTheBeastTitle=Le chemin de la bête Tooltip/&TagBeastWeaponTitle=Arme de la bête diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt index 4360592d19..29b92b6aee 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/OtherFeats-it.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} ha usato {1} e tira un {2} per sostituire {3} Feedback/&LuckySavingToHitRoll={0} ha usato {1} e tira un {2} per sostituire {3} nel tiro salvezza Item/&ItemFeatChefTreatDescription=Mangia questa delizia dello Chef e ottieni 5 punti ferita temporanei. Item/&ItemFeatChefTreatTitle=La delizia dello chef -Reaction/&SpendPowerMageSlayerDescription=Hai fallito un tiro salvezza contro {0}. Puoi invece farti superare. -Reaction/&SpendPowerMageSlayerReactDescription=Piuttosto, fai in modo che tu riesca. -Reaction/&SpendPowerMageSlayerReactTitle=Avere successo -Reaction/&SpendPowerMageSlayerTitle=Cacciatore di maghi Reaction/&ReactionAttackMageSlayerDescription={0} lancia un incantesimo entro 5 piedi da te. Puoi usare la tua reazione per attaccare. Reaction/&ReactionAttackMageSlayerReactDescription=Usa la reazione per attaccare il bersaglio. Reaction/&ReactionAttackMageSlayerReactTitle=Attacco @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} sta lasciando un'area minacciata da u Reaction/&ReactionWarcasterReactDescription=Usa la reazione per attaccare il bersaglio. Reaction/&ReactionWarcasterReactTitle=Attacco Reaction/&ReactionWarcasterTitle=Attacco di opportunità +Reaction/&SpendPowerMageSlayerDescription=Hai fallito un tiro salvezza contro {0}. Puoi invece farti superare. +Reaction/&SpendPowerMageSlayerReactDescription=Piuttosto, fai in modo che tu riesca. +Reaction/&SpendPowerMageSlayerReactTitle=Avere successo +Reaction/&SpendPowerMageSlayerTitle=Cacciatore di maghi Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Seleziona azione Reaction/&SubitemSelectReactionAttackSentinelTitle=Seleziona azione Reaction/&SubitemSelectReactionWarcasterTitle=Seleziona azione diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt index 321bde5cad..40e833b44c 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheBeast-it.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Scegli una forma bes Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Scegliere Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Scegliere Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma della Bestia +Reaction/&UseBeastTailSwipeDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. +Reaction/&UseBeastTailSwipeReactDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Colpo di coda Reaction/&UsePowerCallTheHuntDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. Reaction/&UsePowerCallTheHuntReactDescription=Usa il potere per ottenere PV temporanei e infliggere danni bonus agli alleati mentre sei in preda alla furia. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Spendi potere per applicare Furia In Reaction/&UsePowerInfectiousFuryReactDescription=Spendi potere per applicare Furia Infettiva al bersaglio. Reaction/&UsePowerInfectiousFuryReactTitle=Trascorrere Reaction/&UsePowerInfectiousFuryTitle=Furia infettiva -Reaction/&UseBeastTailSwipeDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. -Reaction/&UseBeastTailSwipeReactDescription=Usa Colpo di Coda per aggiungere 1d8 CA fino alla fine del turno del nemico. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Colpo di coda Subclass/&PathOfTheBeastDescription=Questi barbari sono tornati alle loro radici animalesche e hanno canalizzato la loro essenza bestiale fino al punto di manifestarla fisicamente. Subclass/&PathOfTheBeastTitle=Sentiero della Bestia Tooltip/&TagBeastWeaponTitle=Arma della Bestia diff --git a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt index 12706f3e02..fefa49966e 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Feats/OtherFeats-ja.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} は {1} を使用し、チェックロール Feedback/&LuckySavingToHitRoll={0} は {1} を使用し、セービング ロールの {3} を置き換えるために {2} をロールしました。 Item/&ItemFeatChefTreatDescription=このシェフのおやつを食べると、一時的に 5 ヒット ポイントを獲得します。 Item/&ItemFeatChefTreatTitle=シェフのごちそう -Reaction/&SpendPowerMageSlayerDescription={0} に対するセーヴィング スローに失敗しました。代わりに自分自身を成功させることもできます。 -Reaction/&SpendPowerMageSlayerReactDescription=代わりに、あなた自身が成功するように努めてください。 -Reaction/&SpendPowerMageSlayerReactTitle=成功する -Reaction/&SpendPowerMageSlayerTitle=メイジスレイヤー Reaction/&ReactionAttackMageSlayerDescription={0} はあなたの 5 フィート以内で呪文を唱えます。反応を利用して攻撃することができます。 Reaction/&ReactionAttackMageSlayerReactDescription=リアクションを利用してターゲットを攻撃します。 Reaction/&ReactionAttackMageSlayerReactTitle=攻撃 @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} は 1 人以上のキャラクター Reaction/&ReactionWarcasterReactDescription=リアクションを利用してターゲットを攻撃します。 Reaction/&ReactionWarcasterReactTitle=攻撃 Reaction/&ReactionWarcasterTitle=好機の攻撃 +Reaction/&SpendPowerMageSlayerDescription={0} に対するセーヴィング スローに失敗しました。代わりに自分自身を成功させることもできます。 +Reaction/&SpendPowerMageSlayerReactDescription=代わりに、あなた自身が成功するように努めてください。 +Reaction/&SpendPowerMageSlayerReactTitle=成功する +Reaction/&SpendPowerMageSlayerTitle=メイジスレイヤー Reaction/&SubitemSelectReactionAttackAoOEnterTitle=アクションの選択 Reaction/&SubitemSelectReactionAttackSentinelTitle=アクションの選択 Reaction/&SubitemSelectReactionWarcasterTitle=アクションの選択 diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt index d8a3b2496b..b982db61a8 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheBeast-ja.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=激怒中に顕現 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=選ぶ Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=選ぶ Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=獣の姿 +Reaction/&UseBeastTailSwipeDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 +Reaction/&UseBeastTailSwipeReactDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=尻尾を振る Reaction/&UsePowerCallTheHuntDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 Reaction/&UsePowerCallTheHuntReactDescription=パワーを使用して一時的に HP を獲得し、激怒中に味方にボーナス ダメージを与えます。 Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=パワーを消費してターゲッ Reaction/&UsePowerInfectiousFuryReactDescription=パワーを消費してターゲットに感染性の怒りを適用します。 Reaction/&UsePowerInfectiousFuryReactTitle=過ごす Reaction/&UsePowerInfectiousFuryTitle=伝染する怒り -Reaction/&UseBeastTailSwipeDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 -Reaction/&UseBeastTailSwipeReactDescription=テイルスワイプを使用すると、敵のターン終了時まで 1d8 のアーマー クラスが追加されます。 -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=尻尾を振る Subclass/&PathOfTheBeastDescription=これらの野蛮人は動物的なルーツに戻り、獣の本質を肉体的に顕現させるまでに至っています。 Subclass/&PathOfTheBeastTitle=獣の道 Tooltip/&TagBeastWeaponTitle=獣の武器 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt index 482835e9e5..db7ce9f083 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/OtherFeats-ko.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0}은(는) {1}을(를) 사용했고 수표 판정 Feedback/&LuckySavingToHitRoll={0}은(는) {1}을(를) 사용했고 {2}를 굴려 저장 판정의 {3}을 대체했습니다. Item/&ItemFeatChefTreatDescription=이 요리사의 간식을 먹고 5개의 임시 체력을 얻으십시오. Item/&ItemFeatChefTreatTitle=셰프의 간식 -Reaction/&SpendPowerMageSlayerDescription=당신은 {0}에 대한 내성 굴림에 실패했습니다. 대신에 스스로 성공할 수 있습니다. -Reaction/&SpendPowerMageSlayerReactDescription=대신 자신이 성공하도록 하세요. -Reaction/&SpendPowerMageSlayerReactTitle=성공하다 -Reaction/&SpendPowerMageSlayerTitle=메이지 슬레이어 Reaction/&ReactionAttackMageSlayerDescription={0}님이 당신으로부터 5피트 이내에 주문을 걸었습니다. 반응을 이용해 공격할 수 있습니다. Reaction/&ReactionAttackMageSlayerReactDescription=반응을 사용하여 대상을 공격합니다. Reaction/&ReactionAttackMageSlayerReactTitle=공격 @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0}은(는) 한 명 이상의 캐릭터 Reaction/&ReactionWarcasterReactDescription=반응을 사용하여 대상을 공격합니다. Reaction/&ReactionWarcasterReactTitle=공격 Reaction/&ReactionWarcasterTitle=기회의 공격 +Reaction/&SpendPowerMageSlayerDescription=당신은 {0}에 대한 내성 굴림에 실패했습니다. 대신에 스스로 성공할 수 있습니다. +Reaction/&SpendPowerMageSlayerReactDescription=대신 자신이 성공하도록 하세요. +Reaction/&SpendPowerMageSlayerReactTitle=성공하다 +Reaction/&SpendPowerMageSlayerTitle=메이지 슬레이어 Reaction/&SubitemSelectReactionAttackAoOEnterTitle=작업 선택 Reaction/&SubitemSelectReactionAttackSentinelTitle=작업 선택 Reaction/&SubitemSelectReactionWarcasterTitle=작업 선택 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt index 45fe174324..3896cfe4d4 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheBeast-ko.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=격노하는 동안 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=선택하다 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=선택하다 Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=야수의 형태 +Reaction/&UseBeastTailSwipeDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. +Reaction/&UseBeastTailSwipeReactDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=꼬리 스와이프 Reaction/&UsePowerCallTheHuntDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. Reaction/&UsePowerCallTheHuntReactDescription=분노하는 동안 힘을 사용하여 임시 HP를 얻고 아군에게 추가 피해를 줍니다. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=힘을 소비하여 대상에게 감 Reaction/&UsePowerInfectiousFuryReactDescription=힘을 소비하여 대상에게 감염성 분노를 적용합니다. Reaction/&UsePowerInfectiousFuryReactTitle=경비 Reaction/&UsePowerInfectiousFuryTitle=전염성 분노 -Reaction/&UseBeastTailSwipeDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. -Reaction/&UseBeastTailSwipeReactDescription=꼬리 휘두르기를 사용하여 적의 턴이 끝날 때까지 1d8 갑옷 등급을 추가합니다. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=꼬리 스와이프 Subclass/&PathOfTheBeastDescription=이 야만인들은 동물적인 뿌리로 돌아가서 그들의 야수적 본질을 육체적으로 현현하는 지점까지 전달했습니다. Subclass/&PathOfTheBeastTitle=야수의 길 Tooltip/&TagBeastWeaponTitle=야수 무기 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt index 6d6c476a21..6b8fb3619b 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/OtherFeats-pt-BR.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} usou {1} e rola um {2} para substituir {3} na Feedback/&LuckySavingToHitRoll={0} usou {1} e rola um {2} para substituir {3} na jogada de salvamento Item/&ItemFeatChefTreatDescription=Coma esta delícia do Chef e ganhe 5 pontos de vida temporários. Item/&ItemFeatChefTreatTitle=Delícia do Chef -Reaction/&SpendPowerMageSlayerDescription=Você falhou em um teste de resistência contra {0}. Em vez disso, você pode ter sucesso. -Reaction/&SpendPowerMageSlayerReactDescription=Em vez disso, faça com que você tenha sucesso. -Reaction/&SpendPowerMageSlayerReactTitle=Ter sucesso -Reaction/&SpendPowerMageSlayerTitle=Matador de Magos Reaction/&ReactionAttackMageSlayerDescription={0} lança uma magia a até 5 pés de você. Você pode usar sua reação para atacar. Reaction/&ReactionAttackMageSlayerReactDescription=Use a reação para atacar o alvo. Reaction/&ReactionAttackMageSlayerReactTitle=Ataque @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} está deixando uma área ameaçada po Reaction/&ReactionWarcasterReactDescription=Use a reação para atacar o alvo. Reaction/&ReactionWarcasterReactTitle=Ataque Reaction/&ReactionWarcasterTitle=Ataque de oportunidade +Reaction/&SpendPowerMageSlayerDescription=Você falhou em um teste de resistência contra {0}. Em vez disso, você pode ter sucesso. +Reaction/&SpendPowerMageSlayerReactDescription=Em vez disso, faça com que você tenha sucesso. +Reaction/&SpendPowerMageSlayerReactTitle=Ter sucesso +Reaction/&SpendPowerMageSlayerTitle=Matador de Magos Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Selecionar ação Reaction/&SubitemSelectReactionAttackSentinelTitle=Selecionar ação Reaction/&SubitemSelectReactionWarcasterTitle=Selecionar ação diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt index 5d6d1e5bbd..de3976b380 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheBeast-pt-BR.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Escolha uma forma de Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Escolher Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Escolher Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Forma da Besta +Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. +Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. +Reaction/&UseBeastTailSwipeReactTitle=Use +Reaction/&UseBeastTailSwipeTitle=Deslize de cauda Reaction/&UsePowerCallTheHuntDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. Reaction/&UsePowerCallTheHuntReactDescription=Use poder para ganhar HP temporário e conceder dano adicional aos aliados enquanto estiver em fúria. Reaction/&UsePowerCallTheHuntReactTitle=Use @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Gaste poder para aplicar Fúria Infe Reaction/&UsePowerInfectiousFuryReactDescription=Gaste poder para aplicar Fúria Infecciosa no alvo. Reaction/&UsePowerInfectiousFuryReactTitle=Gastar Reaction/&UsePowerInfectiousFuryTitle=Fúria Infecciosa -Reaction/&UseBeastTailSwipeDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. -Reaction/&UseBeastTailSwipeReactDescription=Use Tail Swipe para adicionar 1d8 CA até o final do turno do inimigo. -Reaction/&UseBeastTailSwipeReactTitle=Use -Reaction/&UseBeastTailSwipeTitle=Deslize de cauda Subclass/&PathOfTheBeastDescription=Esses bárbaros retornaram às suas raízes animalescas e canalizaram sua essência bestial a ponto de manifestá-las fisicamente. Subclass/&PathOfTheBeastTitle=Caminho da Besta Tooltip/&TagBeastWeaponTitle=Arma Bestial diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt index a762ed089a..6df5a3c238 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/OtherFeats-ru.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} использовал {1}, чтобы бро Feedback/&LuckySavingToHitRoll={0} использовал {1}, чтобы бросить {2} и заменить {3} на спасбросок Item/&ItemFeatChefTreatDescription=Съешьте это лакомство от шеф-повара и получите 5 временных хитов. Item/&ItemFeatChefTreatTitle=Лакомство от шеф-повара -Reaction/&SpendPowerMageSlayerDescription=Вы провалили спасбросок против {0}. Вы можете вместо этого обратить его в успех. -Reaction/&SpendPowerMageSlayerReactDescription=Вместо этого обратите спасбросок в успех. -Reaction/&SpendPowerMageSlayerReactTitle=Преуспеть -Reaction/&SpendPowerMageSlayerTitle=Убийца магов Reaction/&ReactionAttackMageSlayerDescription={0} наложил заклинание в пределах 5 футов от вас. Вы можете использовать свою реакцию для атаки. Reaction/&ReactionAttackMageSlayerReactDescription=Используйте реакцию, чтобы атаковать цель. Reaction/&ReactionAttackMageSlayerReactTitle=Атака @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} покидает область до Reaction/&ReactionWarcasterReactDescription=Используйте реакцию для атаки цели. Reaction/&ReactionWarcasterReactTitle=Атака Reaction/&ReactionWarcasterTitle=Атака по возможности +Reaction/&SpendPowerMageSlayerDescription=Вы провалили спасбросок против {0}. Вы можете вместо этого обратить его в успех. +Reaction/&SpendPowerMageSlayerReactDescription=Вместо этого обратите спасбросок в успех. +Reaction/&SpendPowerMageSlayerReactTitle=Преуспеть +Reaction/&SpendPowerMageSlayerTitle=Убийца магов Reaction/&SubitemSelectReactionAttackAoOEnterTitle=Выбрать действие Reaction/&SubitemSelectReactionAttackSentinelTitle=Выбрать действие Reaction/&SubitemSelectReactionWarcasterTitle=Выбрать действие diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt index 70d72b82b6..abfaa3fbc6 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheBeast-ru.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=Выберите з Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=Выбор Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=Выбор Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=Форма зверя +Reaction/&UseBeastTailSwipeDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. +Reaction/&UseBeastTailSwipeReactDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. +Reaction/&UseBeastTailSwipeReactTitle=Использовать +Reaction/&UseBeastTailSwipeTitle=Взмах хвостом Reaction/&UsePowerCallTheHuntDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. Reaction/&UsePowerCallTheHuntReactDescription=Используйте умение, чтобы получить временные хиты и предоставить дополнительный урон союзникам, пока вы в ярости. Reaction/&UsePowerCallTheHuntReactTitle=Использовать @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=Используйте умение, Reaction/&UsePowerInfectiousFuryReactDescription=Используйте умение, чтобы применить к цели Заразную ярость. Reaction/&UsePowerInfectiousFuryReactTitle=Использовать Reaction/&UsePowerInfectiousFuryTitle=Заразная ярость -Reaction/&UseBeastTailSwipeDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. -Reaction/&UseBeastTailSwipeReactDescription=Используйте Взмах хвостом, чтобы добавить бонус к КД, равный 1d8, до конца хода противника. -Reaction/&UseBeastTailSwipeReactTitle=Использовать -Reaction/&UseBeastTailSwipeTitle=Взмах хвостом Subclass/&PathOfTheBeastDescription=Варвары, идущие по пути зверя, черпают свою ярость из звериного огня, горящего в их душах. Этот зверь вырывается наружу в приступе ярости, физически преображая варвара. Subclass/&PathOfTheBeastTitle=Путь зверя Tooltip/&TagBeastWeaponTitle=Звериное оружие diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt index b20ae19eb9..4f5ebfcae8 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/OtherFeats-zh-CN.txt @@ -125,10 +125,6 @@ Feedback/&LuckyCheckToHitRoll={0} 使用 {1} 并掷出 {2} 以替换检定结果 Feedback/&LuckySavingToHitRoll={0} 使用 {1} 并掷出 {2} 以替换豁免检定上的 {3} Item/&ItemFeatChefTreatDescription=吃下大厨的美味并获得 5 点临时生命值。 Item/&ItemFeatChefTreatTitle=大厨的美味 -Reaction/&SpendPowerMageSlayerDescription=你对{0}的豁免失败。相反,你可以让自己成功。 -Reaction/&SpendPowerMageSlayerReactDescription=而是让自己成功。 -Reaction/&SpendPowerMageSlayerReactTitle=成功 -Reaction/&SpendPowerMageSlayerTitle=巫师杀手 Reaction/&ReactionAttackMageSlayerDescription={0} 在距你 5 尺的范围内施展了法术。你可以利用你的反应来攻击。 Reaction/&ReactionAttackMageSlayerReactDescription=利用反应来攻击目标。 Reaction/&ReactionAttackMageSlayerReactTitle=攻击 @@ -137,6 +133,10 @@ Reaction/&ReactionWarcasterDescription={0} 正在离开一个受到一个或多 Reaction/&ReactionWarcasterReactDescription=使用反应来攻击目标。 Reaction/&ReactionWarcasterReactTitle=攻击 Reaction/&ReactionWarcasterTitle=借机攻击 +Reaction/&SpendPowerMageSlayerDescription=你对{0}的豁免失败。相反,你可以让自己成功。 +Reaction/&SpendPowerMageSlayerReactDescription=而是让自己成功。 +Reaction/&SpendPowerMageSlayerReactTitle=成功 +Reaction/&SpendPowerMageSlayerTitle=巫师杀手 Reaction/&SubitemSelectReactionAttackAoOEnterTitle=选择动作 Reaction/&SubitemSelectReactionAttackSentinelTitle=选择动作 Reaction/&SubitemSelectReactionWarcasterTitle=选择动作 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt index 7ae76354f3..c28cd4f2ca 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheBeast-zh-CN.txt @@ -44,6 +44,10 @@ Reaction/&ReactionSpendPowerBundleFormOfTheBeastDescription=选择一种野兽 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactDescription=选择 Reaction/&ReactionSpendPowerBundleFormOfTheBeastReactTitle=选择 Reaction/&ReactionSpendPowerBundleFormOfTheBeastTitle=野兽形态 +Reaction/&UseBeastTailSwipeDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 +Reaction/&UseBeastTailSwipeReactDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 +Reaction/&UseBeastTailSwipeReactTitle=使用 +Reaction/&UseBeastTailSwipeTitle=扫尾 Reaction/&UsePowerCallTheHuntDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 Reaction/&UsePowerCallTheHuntReactDescription=使用力量来获得暂时的生命值,并在你狂暴时对盟友造成额外伤害。 Reaction/&UsePowerCallTheHuntReactTitle=使用 @@ -52,10 +56,6 @@ Reaction/&UsePowerInfectiousFuryDescription=花费力量对目标施加传染性 Reaction/&UsePowerInfectiousFuryReactDescription=花费力量对目标施加传染性狂怒。 Reaction/&UsePowerInfectiousFuryReactTitle=花费 Reaction/&UsePowerInfectiousFuryTitle=传染之怒 -Reaction/&UseBeastTailSwipeDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 -Reaction/&UseBeastTailSwipeReactDescription=使用扫尾增加 1d8 护甲等级,直到敌人回合结束。 -Reaction/&UseBeastTailSwipeReactTitle=使用 -Reaction/&UseBeastTailSwipeTitle=扫尾 Subclass/&PathOfTheBeastDescription=野兽道途的野蛮人唤醒动物本能,将兽性转化为身体能量。 Subclass/&PathOfTheBeastTitle=野兽道途 Tooltip/&TagBeastWeaponTitle=野兽武器 From bffebb99ff0151a181c616b9fc1a6f5627f261b5 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 11:21:47 -0700 Subject: [PATCH 116/162] remove AfterWasHit --- .../Api/GameExtensions/EnumExtensions.cs | 3 +-- .../Patches/CharacterActionAttackPatcher.cs | 7 ------- .../Patches/CharacterActionMagicEffectPatcher.cs | 7 ------- 3 files changed, 1 insertion(+), 16 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs index cff92f3017..b1258f6f6d 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/EnumExtensions.cs @@ -134,8 +134,7 @@ public enum ExtraConditionInterruption AfterWasAttackedNotBySource, AttacksWithWeaponOrUnarmed, SourceRageStop, - UsesBonusAction, - AfterWasHit + UsesBonusAction } internal enum ExtraMotionType diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs index c1f65b195b..c39b1ab796 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionAttackPatcher.cs @@ -842,13 +842,6 @@ internal static IEnumerator ExecuteImpl(CharacterActionAttack __instance) rulesetDefender.ProcessConditionsMatchingInterruption( (ConditionInterruption)ExtraConditionInterruption.AfterWasAttacked); - //PATCH: Allows condition interruption after target was attacked - if (__instance.AttackRollOutcome is RollOutcome.Success or RollOutcome.CriticalSuccess) - { - rulesetDefender.ProcessConditionsMatchingInterruption( - (ConditionInterruption)ExtraConditionInterruption.AfterWasHit); - } - yield return battleManager.HandleCharacterAttackOrMagicEffectFinishedLate( __instance, actingCharacter); } diff --git a/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs b/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs index e0ee2c659d..f7bc4521d7 100644 --- a/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/CharacterActionMagicEffectPatcher.cs @@ -1273,13 +1273,6 @@ private static IEnumerator ExecuteMagicAttack( //PATCH: Allows condition interruption after target was attacked rulesetTarget.ProcessConditionsMatchingInterruption( (ConditionInterruption)ExtraConditionInterruption.AfterWasAttacked); - - //PATCH: Allows condition interruption after target was attacked and hit - if (__instance.AttackRollOutcome is RollOutcome.Success or RollOutcome.CriticalSuccess) - { - rulesetTarget.ProcessConditionsMatchingInterruption( - (ConditionInterruption)ExtraConditionInterruption.AfterWasHit); - } } if (!__instance.RolledSaveThrow && rulesetEffect.EffectDescription.HasShoveRoll) From 3658e43dc98bd07e420f58a8bd169a6cc4a54de6 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 11:22:04 -0700 Subject: [PATCH 117/162] add condition time stop resource --- .../Properties/Resources.Designer.cs | 10 ++++++++++ .../Properties/Resources.resx | 6 ++++++ .../Resources/Conditions/ConditionTimeStop.png | Bin 0 -> 353 bytes 3 files changed, 16 insertions(+) create mode 100644 SolastaUnfinishedBusiness/Resources/Conditions/ConditionTimeStop.png diff --git a/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs b/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs index 8d642d0293..15658d2e3f 100644 --- a/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs +++ b/SolastaUnfinishedBusiness/Properties/Resources.Designer.cs @@ -1099,6 +1099,16 @@ public static byte[] ConditionMirrorImage { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + public static byte[] ConditionTimeStop { + get { + object obj = ResourceManager.GetObject("ConditionTimeStop", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/SolastaUnfinishedBusiness/Properties/Resources.resx b/SolastaUnfinishedBusiness/Properties/Resources.resx index 84245819da..2394fae69b 100644 --- a/SolastaUnfinishedBusiness/Properties/Resources.resx +++ b/SolastaUnfinishedBusiness/Properties/Resources.resx @@ -1361,6 +1361,12 @@ PublicKeyToken=b03f5f7f11d50a3a + + ../Resources/Conditions/ConditionTimeStop.png;System.Byte[], mscorlib, Version=4.0.0.0, + Culture=neutral, + PublicKeyToken=b03f5f7f11d50a3a + + ../Resources/Powers/PowerGuardianMode.png;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/SolastaUnfinishedBusiness/Resources/Conditions/ConditionTimeStop.png b/SolastaUnfinishedBusiness/Resources/Conditions/ConditionTimeStop.png new file mode 100644 index 0000000000000000000000000000000000000000..c4abe7373fa43e4bf88247b76cebbe856472bd80 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0vp^(m<@h!VDw@-Q_rdltF+`h%1m*T9ZpWQuHzZ3e>}2 z666=ma7)EwV(#|V5?lS{3&hJjbM@kYQWrg4977~7_g-}5JLn*C?Bn&oSOG(e112}J zH{=U{+q!Y`72aJXtl?LXq|^M{{A^sa$(ED?eqAZ7JP2iiIxX?j=|H_ K&t;ucLK6Vf#f}>Q literal 0 HcmV?d00001 From b0cda95f7a2999261539a6b589e9984394795965 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 12:13:16 -0700 Subject: [PATCH 118/162] refactor Corrupting Bolt spell to not use AfterWasHit --- .../Spells/SpellBuildersLevel03.cs | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 241d9e18bd..9a439c88f3 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -172,7 +172,6 @@ internal static SpellDefinition BuildCorruptingBolt() .SetDamageAffinityType(DamageAffinityType.Vulnerability) .SetDamageType(damageDefinition.Name) .AddToDB())) - .SetSpecialInterruptions(ExtraConditionInterruption.AfterWasHit) .AddToDB(); var spell = SpellDefinitionBuilder @@ -209,6 +208,43 @@ internal static SpellDefinition BuildCorruptingBolt() return spell; } + private sealed class CustomBehaviorCorruptingBolt : IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe + { + public IEnumerator OnPhysicalAttackFinishedOnMe( + GameLocationBattleManager battleManager, + CharacterAction action, + GameLocationCharacter attacker, + GameLocationCharacter defender, + RulesetAttackMode attackMode, + RollOutcome rollOutcome, + int damageAmount) + { + var rulesetDefender = defender.RulesetCharacter; + + rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); + + yield break; + } + + public IEnumerator OnMagicEffectFinishedOnMe( + CharacterActionMagicEffect action, + GameLocationCharacter attacker, + GameLocationCharacter defender, + List targets) + { + var rulesetEffect = action.ActionParams.RulesetEffect; + + if (rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) + { + yield break; + } + + var rulesetDefender = defender.RulesetCharacter; + + rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); + } + } + #endregion #region Crusaders Mantle From 0e04c996e778413313186ac2bb0e7490c5095484 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 12:13:31 -0700 Subject: [PATCH 119/162] fix Time Stop spell to work as in tabletop --- .../ChangelogHistory.txt | 1 + .../Spells/SpellBuildersLevel09.cs | 128 ++++++++++++++++-- .../Translations/de/Spells/Spells09-de.txt | 3 +- .../Translations/en/Spells/Spells09-en.txt | 5 +- .../Translations/es/Spells/Spells09-es.txt | 3 +- .../Translations/fr/Spells/Spells09-fr.txt | 3 +- .../Translations/it/Spells/Spells09-it.txt | 3 +- .../Translations/ja/Spells/Spells09-ja.txt | 3 +- .../Translations/ko/Spells/Spells09-ko.txt | 3 +- .../pt-BR/Spells/Spells09-pt-BR.txt | 3 +- .../Translations/ru/Spells/Spells09-ru.txt | 1 + .../zh-CN/Spells/Spells09-zh-CN.txt | 3 +- 12 files changed, 137 insertions(+), 22 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index a9e38a0809..c9ae8c05cd 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -7,6 +7,7 @@ - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration +- fixed Time Stop spell to work as in tabletop - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs index 2b95088b04..c739f96345 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs @@ -1,7 +1,10 @@ -using System.Linq; +using System.Collections; +using System.Linq; +using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; +using SolastaUnfinishedBusiness.Interfaces; using SolastaUnfinishedBusiness.Properties; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; @@ -275,13 +278,10 @@ internal static SpellDefinition BuildTimeStop() const string NAME = "TimeStop"; var conditionTimeStop = ConditionDefinitionBuilder - .Create(ConditionDefinitions.ConditionIncapacitated, "ConditionTimeStop") - .SetOrUpdateGuiPresentation(Category.Condition) - .SetParentCondition(ConditionDefinitions.ConditionIncapacitated) - .SetFeatures() - .SetInterruptionDamageThreshold(1) - .SetSpecialInterruptions(ConditionInterruption.Attacked, ConditionInterruption.Damaged) - .CopyParticleReferences(ConditionDefinitions.ConditionPatronTimekeeperCurseOfTime) + .Create("ConditionTimeStop") + .SetGuiPresentation(Category.Condition, Sprites.GetSprite(NAME, Resources.ConditionTimeStop, 27, 32)) + .SetSilent(Silent.WhenAddedOrRemoved) + .AddCustomSubFeatures(new ActionFinishedByMeTimeStop()) .AddToDB(); return SpellDefinitionBuilder @@ -297,16 +297,118 @@ internal static SpellDefinition BuildTimeStop() .SetEffectDescription( EffectDescriptionBuilder .Create() - .SetDurationData(DurationType.Round, 3) - .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Cylinder, 20, 10) - .SetEffectForms( - EffectFormBuilder.ConditionForm(conditionTimeStop)) - .ExcludeCaster() + .SetDurationData(DurationType.Permanent) + .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Self) + .SetEffectForms(EffectFormBuilder.ConditionForm(conditionTimeStop)) .SetParticleEffectParameters(DispelMagic) .Build()) + .AddCustomSubFeatures(new CustomBehaviorTimeStop()) .AddToDB(); } + private sealed class ActionFinishedByMeTimeStop + : IActionFinishedByMe, ICharacterBeforeTurnEndListener, IOnConditionAddedOrRemoved + { + public IEnumerator OnActionFinishedByMe(CharacterAction action) + { + var character = action.ActingCharacter; + var targets = action.ActionParams.TargetCharacters; + var hasNonSelfTarget = targets.Any(x => x != character); + + if (!hasNonSelfTarget) + { + yield break; + } + + var rulesetCharacter = character.RulesetCharacter; + + if (rulesetCharacter.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionTimeStop", out var activeCondition)) + { + rulesetCharacter.RemoveCondition(activeCondition); + } + } + + public void OnConditionAdded(RulesetCharacter target, RulesetCondition rulesetCondition) + { + + } + + public void OnConditionRemoved(RulesetCharacter target, RulesetCondition rulesetCondition) + { + RemoveDuplicateContenders(GameLocationCharacter.GetFromActor(target)); + } + + public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) + { + var battle = Gui.Battle; + + if (battle == null || battle.CurrentRound > 1) + { + return; + } + + var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); + + if (battle.activeContenderIndex != index) + { + return; + } + + RemoveDuplicateContenders(locationCharacter); + } + + private static void RemoveDuplicateContenders(GameLocationCharacter locationCharacter) + { + var battle = Gui.Battle; + + while (battle.InitiativeSortedContenders.Count(x => x == locationCharacter) > 1) + { + var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); + + battle.InitiativeSortedContenders.RemoveAt(index); + } + + var gameLocationScreenBattle = Gui.GuiService.GetScreen(); + + gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, + GameLocationBattle.ContenderModificationMode.Remove, false, false); + } + } + + private sealed class CustomBehaviorTimeStop : IPowerOrSpellFinishedByMe + { + public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + var locationCharacter = action.ActingCharacter; + var rulesetCharacter = locationCharacter.RulesetCharacter; + var initiativeSortedContenders = Gui.Battle.InitiativeSortedContenders; + var positionCharacter = initiativeSortedContenders.FirstOrDefault(x => x == locationCharacter); + var positionCharacterIndex = initiativeSortedContenders.IndexOf(positionCharacter); + var dieRoll = RollDie(DieType.D4, AdvantageType.None, out _, out _); + + rulesetCharacter.LogCharacterActivatesAbility( + string.Empty, + "Feedback/&TimeStop", + extra: + [ + (ConsoleStyleDuplet.ParameterType.Base, dieRoll.ToString()) + ]); + + for (var i = 0; i < dieRoll; i++) + { + initiativeSortedContenders.Insert(positionCharacterIndex + 1, locationCharacter); + } + + var gameLocationScreenBattle = Gui.GuiService.GetScreen(); + + gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, + GameLocationBattle.ContenderModificationMode.Add, false, false); + + yield break; + } + } + #endregion #region Weird diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt index 1358a6bb30..d48b7160ce 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=Für das betroffene Wesen ist die Zeit e Condition/&ConditionTimeStopTitle=Die Zeit ist stehen geblieben Condition/&ConditionWeirdDescription=Verängstigt. Am Ende jeder Runde machst du einen Weisheitsrettungswurf. Bei einem Fehlschlag erleidest du 4W10 psychischen Schaden. Bei einem Erfolg endet dieser Zustand. Condition/&ConditionWeirdTitle=Seltsam +Feedback/&TimeStop={0} erhält {2} zusätzliche Runden Spell/&ForesightDescription=Du berührst eine willige Kreatur und verleihst ihr die begrenzte Fähigkeit, in die unmittelbare Zukunft zu sehen. Während der Wirkungsdauer kann das Ziel nicht überrascht werden und hat einen Vorteil bei Angriffswürfen, Fähigkeitswürfen und Rettungswürfen. Darüber hinaus haben andere Kreaturen während der Wirkungsdauer einen Nachteil bei Angriffswürfen gegen das Ziel. Spell/&ForesightTitle=Voraussicht Spell/&InvulnerabilityDescription=Sie sind gegen jeglichen Schaden immun, bis der Zauber endet. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=Du entfesselst die Macht deines Geistes, um den Spell/&PsychicScreamTitle=Psychischer Schrei Spell/&ShapechangeDescription=Du nimmst für die Dauer die Gestalt einer anderen Kreatur an. Die neue Gestalt kann jede Kreatur mit einem Schwierigkeitsgrad sein, der deinem Level oder niedriger entspricht. Spell/&ShapechangeTitle=Formänderung -Spell/&TimeStopDescription=Du stoppst kurzzeitig den Zeitfluss für alle außer dir selbst. Für andere Kreaturen vergeht keine Zeit, während du 1W4 + 1 Runden am Stück machst, in denen du Aktionen ausführen und dich wie gewohnt bewegen kannst. +Spell/&TimeStopDescription=Du stoppst kurzzeitig den Zeitfluss für alle außer dir selbst. Für andere Kreaturen vergeht keine Zeit, während du 1W4+1 Runden hintereinander ausführst, in denen du Aktionen ausführen und dich normal bewegen kannst. Dieser Zauber endet, wenn eine der Aktionen, die du während dieser Zeit ausführst, oder ein Effekt, den du während dieser Zeit erzeugst, eine andere Kreatur als dich selbst betrifft. Spell/&TimeStopTitle=Zeitstopp Spell/&WeirdDescription=Indem Sie die tiefsten Ängste einer Gruppe von Kreaturen nutzen, erschaffen Sie in ihren Köpfen illusionäre Kreaturen, die nur für sie sichtbar sind. Jeder Feind in einer Kugel mit einem Radius von 30 Fuß, der auf einen Punkt Ihrer Wahl in Reichweite zentriert ist, muss einen Weisheitsrettungswurf machen. Bei einem misslungenen Rettungswurf ist die Kreatur für die Dauer verängstigt. Die Illusion ruft die tiefsten Ängste der Kreatur hervor und manifestiert ihre schlimmsten Albträume als unerbittliche Bedrohung. Am Ende jedes Zuges der verängstigten Kreatur muss diese einen Weisheitsrettungswurf bestehen oder 4W10 psychischen Schaden erleiden. Bei einem erfolgreichen Rettungswurf endet der Zauber für diese Kreatur. Spell/&WeirdTitle=Seltsam diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt index 59fc705b43..aeaf8917a5 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt @@ -1,9 +1,12 @@ Condition/&ConditionForesightDescription=Advantage on all attack rolls, ability checks, and saving throws. Other creatures have disadvantage on attack rolls. Condition/&ConditionForesightTitle=Foresight Condition/&ConditionTimeStopDescription=Time is frozen for the affected creature. +Condition/&ConditionTimeStopDescription=You take 1d4+1 turns in a row. +Condition/&ConditionTimeStopTitle=Time Stop Condition/&ConditionTimeStopTitle=Time Stopped Condition/&ConditionWeirdDescription=Frightened. At the end of each turn, make a Wisdom saving throw. On a failure, take 4d10 psychic damage. On a success, this condition ends. Condition/&ConditionWeirdTitle=Weirded +Feedback/&TimeStop={0} gains {2} additional rounds Spell/&ForesightDescription=You touch a willing creature and bestow a limited ability to see into the immediate future. For the duration, the target can't be surprised and has advantage on attack rolls, ability checks, and saving throws. Additionally, other creatures have disadvantage on attack rolls against the target for the duration. Spell/&ForesightTitle=Foresight Spell/&InvulnerabilityDescription=You are immune to all damage until the spell ends. @@ -20,7 +23,7 @@ Spell/&PsychicScreamDescription=You unleash the power of your mind to blast the Spell/&PsychicScreamTitle=Psychic Scream Spell/&ShapechangeDescription=You assume the form of a different creature for the duration. The new form can be of any creature with a challenge rating equal to your level or lower. Spell/&ShapechangeTitle=Shapechange -Spell/&TimeStopDescription=You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4 + 1 turns in a row, during which you can use actions and move as normal. +Spell/&TimeStopDescription=You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4+1 turns in a row, during which you can use actions and move as normal. This spell ends if one of the actions you use during this period, or any effects that you create during this period, affects a creature other than you. Spell/&TimeStopTitle=Time Stop Spell/&WeirdDescription=Drawing on the deepest fears of a group of creatures, you create illusory creatures in their minds, visible only to them. Each enemy in a 30-foot-radius sphere centered on a point of your choice within range must make a Wisdom saving throw. On a failed save, a creature becomes frightened for the duration. The illusion calls on the creature's deepest fears, manifesting its worst nightmares as an implacable threat. At the end of each of the frightened creature's turns, it must succeed on a Wisdom saving throw or take 4d10 psychic damage. On a successful save, the spell ends for that creature. Spell/&WeirdTitle=Weird diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt index 1c3825da1d..d55ecfff88 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=El tiempo se congela para la criatura af Condition/&ConditionTimeStopTitle=El tiempo se detuvo Condition/&ConditionWeirdDescription=Asustado. Al final de cada turno, realiza una tirada de salvación de Sabiduría. Si falla, sufre 4d10 de daño psíquico. Si tiene éxito, esta condición termina. Condition/&ConditionWeirdTitle=Extraño +Feedback/&TimeStop={0} gana {2} rondas adicionales Spell/&ForesightDescription=Tocas a una criatura voluntaria y le otorgas una capacidad limitada para ver el futuro inmediato. Mientras dure el hechizo, el objetivo no puede ser sorprendido y tiene ventaja en las tiradas de ataque, las comprobaciones de característica y las tiradas de salvación. Además, las demás criaturas tienen desventaja en las tiradas de ataque contra el objetivo mientras dure el hechizo. Spell/&ForesightTitle=Previsión Spell/&InvulnerabilityDescription=Eres inmune a todo daño hasta que termine el hechizo. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=Liberas el poder de tu mente para destruir el in Spell/&PsychicScreamTitle=Grito psíquico Spell/&ShapechangeDescription=Asumes la forma de una criatura diferente mientras dura el juego. La nueva forma puede ser la de cualquier criatura con un índice de desafío igual o inferior a tu nivel. Spell/&ShapechangeTitle=Cambio de forma -Spell/&TimeStopDescription=Detienes brevemente el paso del tiempo para todos, excepto para ti. El tiempo no pasa para las demás criaturas, mientras tú realizas 1d4 + 1 turnos seguidos, durante los cuales puedes usar acciones y moverte con normalidad. +Spell/&TimeStopDescription=Detienes brevemente el paso del tiempo para todos excepto para ti. El tiempo no pasa para las demás criaturas, mientras que tú realizas 1d4+1 turnos seguidos, durante los cuales puedes usar acciones y moverte con normalidad. Este hechizo termina si una de las acciones que uses durante este período, o cualquier efecto que crees durante este período, afecta a una criatura que no seas tú. Spell/&TimeStopTitle=Detener el tiempo Spell/&WeirdDescription=Inspirándote en los miedos más profundos de un grupo de criaturas, creas criaturas ilusorias en sus mentes, visibles solo para ellas. Cada enemigo en una esfera de 30 pies de radio centrada en un punto de tu elección dentro del alcance debe realizar una tirada de salvación de Sabiduría. Si la tirada falla, la criatura queda asustada durante el tiempo que dure la tirada. La ilusión invoca los miedos más profundos de la criatura, manifestando sus peores pesadillas como una amenaza implacable. Al final de cada uno de los turnos de la criatura asustada, debe superar una tirada de salvación de Sabiduría o sufrir 4d10 de daño psíquico. Si la tirada de salvación tiene éxito, el conjuro termina para esa criatura. Spell/&WeirdTitle=Extraño diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt index b2e6d076ca..40356c3453 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=Le temps est figé pour la créature aff Condition/&ConditionTimeStopTitle=Le temps s'est arrêté Condition/&ConditionWeirdDescription=Effrayé. À la fin de chaque tour, effectuez un jet de sauvegarde de Sagesse. En cas d'échec, subissez 4d10 dégâts psychiques. En cas de réussite, cette condition prend fin. Condition/&ConditionWeirdTitle=Bizarre +Feedback/&TimeStop={0} gagne {2} tours supplémentaires Spell/&ForesightDescription=Vous touchez une créature consentante et lui accordez une capacité limitée de voir dans le futur immédiat. Pendant la durée du sort, la cible ne peut pas être surprise et bénéficie d'un avantage aux jets d'attaque, aux tests de caractéristique et aux jets de sauvegarde. De plus, les autres créatures bénéficient d'un désavantage aux jets d'attaque contre la cible pendant la durée du sort. Spell/&ForesightTitle=Prévoyance Spell/&InvulnerabilityDescription=Vous êtes immunisé contre tous les dégâts jusqu'à la fin du sort. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=Vous libérez le pouvoir de votre esprit pour d Spell/&PsychicScreamTitle=Cri psychique Spell/&ShapechangeDescription=Vous prenez la forme d'une créature différente pendant la durée du jeu. La nouvelle forme peut être celle de n'importe quelle créature dont le niveau de difficulté est égal ou inférieur à votre niveau. Spell/&ShapechangeTitle=Changement de forme -Spell/&TimeStopDescription=Vous arrêtez brièvement le cours du temps pour tout le monde sauf vous-même. Le temps ne s'écoule plus pour les autres créatures, tandis que vous effectuez 1d4 + 1 tours consécutifs, pendant lesquels vous pouvez utiliser des actions et vous déplacer normalement. +Spell/&TimeStopDescription=Vous arrêtez brièvement le cours du temps pour tout le monde sauf vous-même. Aucun temps ne s'écoule pour les autres créatures, tandis que vous effectuez 1d4+1 tours consécutifs, pendant lesquels vous pouvez utiliser des actions et vous déplacer normalement. Ce sort prend fin si l'une des actions que vous utilisez pendant cette période, ou l'un des effets que vous créez pendant cette période, affecte une créature autre que vous. Spell/&TimeStopTitle=Arrêt du temps Spell/&WeirdDescription=En puisant dans les peurs les plus profondes d'un groupe de créatures, vous créez des créatures illusoires dans leur esprit, visibles uniquement par elles. Chaque ennemi dans une sphère de 9 mètres de rayon centrée sur un point de votre choix à portée doit réussir un jet de sauvegarde de Sagesse. En cas d'échec, la créature est effrayée pendant toute la durée du sort. L'illusion fait appel aux peurs les plus profondes de la créature, manifestant ses pires cauchemars sous la forme d'une menace implacable. À la fin de chacun des tours de la créature effrayée, elle doit réussir un jet de sauvegarde de Sagesse ou subir 4d10 dégâts psychiques. En cas de réussite, le sort prend fin pour cette créature. Spell/&WeirdTitle=Bizarre diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt index f64aea3e5a..5c9dc4ee7c 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=Per la creatura interessata il tempo è Condition/&ConditionTimeStopTitle=Il tempo si è fermato Condition/&ConditionWeirdDescription=Spaventato. Alla fine di ogni turno, fai un tiro salvezza su Saggezza. In caso di fallimento, subisci 4d10 danni psichici. In caso di successo, questa condizione termina. Condition/&ConditionWeirdTitle=Strano +Feedback/&TimeStop={0} guadagna {2} round aggiuntivi Spell/&ForesightDescription=Tocchi una creatura consenziente e conferisci una capacità limitata di vedere nell'immediato futuro. Per tutta la durata, il bersaglio non può essere sorpreso e dispone di vantaggio ai tiri per colpire, alle prove di caratteristica e ai tiri salvezza. Inoltre, le altre creature hanno svantaggio ai tiri per colpire contro il bersaglio per tutta la durata. Spell/&ForesightTitle=Preveggenza Spell/&InvulnerabilityDescription=Sei immune a tutti i danni finché l'incantesimo non termina. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=Scatena il potere della tua mente per far saltar Spell/&PsychicScreamTitle=Urlo psichico Spell/&ShapechangeDescription=Assumi la forma di una creatura diversa per la durata. La nuova forma può essere quella di qualsiasi creatura con un grado di sfida pari al tuo livello o inferiore. Spell/&ShapechangeTitle=Cambiamento di forma -Spell/&TimeStopDescription=Interrompi brevemente il flusso del tempo per tutti tranne che per te stesso. Non passa tempo per le altre creature, mentre tu prendi 1d4 + 1 turni di fila, durante i quali puoi usare azioni e muoverti normalmente. +Spell/&TimeStopDescription=Interrompi brevemente il flusso del tempo per tutti tranne che per te stesso. Non passa tempo per le altre creature, mentre tu fai 1d4+1 turni di fila, durante i quali puoi usare azioni e muoverti normalmente. Questo incantesimo termina se una delle azioni che usi durante questo periodo, o qualsiasi effetto che crei durante questo periodo, influenza una creatura diversa da te. Spell/&TimeStopTitle=Tempo fermo Spell/&WeirdDescription=Attingendo alle paure più profonde di un gruppo di creature, crei nelle loro menti creature illusorie, visibili solo a loro. Ogni nemico in una sfera di 9 metri di raggio centrata su un punto a tua scelta entro la gittata deve effettuare un tiro salvezza su Saggezza. Se il tiro salvezza fallisce, la creatura diventa spaventata per la durata. L'illusione fa appello alle paure più profonde della creatura, manifestando i suoi peggiori incubi come una minaccia implacabile. Alla fine di ogni turno della creatura spaventata, essa deve riuscire un tiro salvezza su Saggezza o subire 4d10 danni psichici. Se il tiro salvezza riesce, l'incantesimo termina per quella creatura. Spell/&WeirdTitle=Strano diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt index 6c1896494c..7045b2fe84 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=影響を受けたクリーチャーの Condition/&ConditionTimeStopTitle=止まった時間 Condition/&ConditionWeirdDescription=恐ろしかった。各ターンの終了時に、知恵のセーヴィング スローを行います。失敗すると、4d10の精神的ダメージを受ける。成功すると、この状態は終了します。 Condition/&ConditionWeirdTitle=奇妙な +Feedback/&TimeStop={0}は{2}ラウンド追加獲得 Spell/&ForesightDescription=あなたは意欲のある生き物に触れると、近い将来を見通す限定的な能力を与えます。その間、ターゲットは驚かされることがなく、攻撃ロール、能力判定、セーヴィング・スローで有利になります。さらに、持続時間中、他のクリーチャーはターゲットに対する攻撃ロールに不利になります。 Spell/&ForesightTitle=先見の明 Spell/&InvulnerabilityDescription=呪文が終了するまで、すべてのダメージを受けなくなります。 @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=精神の力を解き放ち、範囲内にいる Spell/&PsychicScreamTitle=サイキックスクリーム Spell/&ShapechangeDescription=その間、あなたは別の生き物の姿をとります。新しいフォームは、あなたのレベルと同じかそれ以下のチャレンジレーティングを持つ任意のクリーチャーにすることができます。 Spell/&ShapechangeTitle=形状変化 -Spell/&TimeStopDescription=自分以外の全員の時間の流れを一時的に止めます。あなたは連続して 1d4 + 1 ターンかかり、他のクリーチャーには時間が経過しません。その間、通常どおりアクションを使用したり移動したりできます。 +Spell/&TimeStopDescription=自分以外の全員の時間の流れを一時的に停止します。他のクリーチャーには時間は流れませんが、あなたは 1d4+1 ターン連続でターンを行い、その間は通常通りアクションを使用したり移動したりできます。この期間中に使用したアクションの 1 つ、またはこの期間中に作成した効果が自分以外のクリーチャーに影響を及ぼすと、この呪文は終了します。 Spell/&TimeStopTitle=タイムストップ Spell/&WeirdDescription=クリーチャーの集団の最も深い恐怖を利用して、その心の中に、そのクリーチャーにしか見えない幻影のクリーチャーを作り出す。範囲内の、君が選んだ地点を中心とした半径 30 フィートの球体の中にいる各敵は、【判断力】セーヴィング スローを行わなければならない。セーヴィングに失敗すると、クリーチャーは効果時間中、怯え状態になる。幻影はクリーチャーの最も深い恐怖を呼び起こし、最悪の悪夢を容赦ない脅威として顕現させる。怯えているクリーチャーは、ターンの終了時に【判断力】セーヴィング スローに成功するか、4d10 の精神ダメージを受けるかのどちらかである。セーヴィングに成功すると、そのクリーチャーの呪文は終了する。 Spell/&WeirdTitle=奇妙な diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt index 99eed00700..6655e18784 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=영향을 받은 생물의 시간은 동 Condition/&ConditionTimeStopTitle=정지된 시간 Condition/&ConditionWeirdDescription=겁먹은. 매 턴이 끝날 때마다 지혜 내성 굴림을 합니다. 실패하면 4d10의 정신적 피해를 입습니다. 성공하면 이 조건이 종료됩니다. Condition/&ConditionWeirdTitle=이상해 +Feedback/&TimeStop={0}은 {2}개의 추가 라운드를 얻습니다. Spell/&ForesightDescription=당신은 기꺼이 생물을 만지고 가까운 미래를 볼 수 있는 제한된 능력을 부여합니다. 해당 기간 동안 대상은 놀라지 않으며 공격 굴림, 능력 확인 및 내성 굴림에 유리합니다. 추가적으로, 다른 생물들은 해당 기간 동안 대상에 대한 공격 굴림에 불이익을 받습니다. Spell/&ForesightTitle=선견 Spell/&InvulnerabilityDescription=주문이 끝날 때까지 모든 피해에 면역이 됩니다. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=당신은 당신의 마음의 힘을 풀어서 Spell/&PsychicScreamTitle=사이킥 스크림 Spell/&ShapechangeDescription=당신은 지속 시간 동안 다른 생물의 형태를 취합니다. 새로운 형태는 당신의 레벨과 같거나 낮은 도전 등급을 가진 모든 생물이 될 수 있습니다. Spell/&ShapechangeTitle=변신 -Spell/&TimeStopDescription=당신은 자신을 제외한 모든 사람의 시간의 흐름을 잠시 멈춥니다. 다른 생물에게는 시간이 흐르지 않으며, 연속으로 1d4 + 1턴을 수행하며, 그 동안 평소처럼 행동을 사용하고 이동할 수 있습니다. +Spell/&TimeStopDescription=당신은 자신을 제외한 모든 사람의 시간 흐름을 잠시 멈춥니다. 다른 생명체에게는 시간이 흐르지 않는 반면, 당신은 1d4+1턴을 연속으로 진행하며, 그동안 행동을 사용하고 정상적으로 움직일 수 있습니다. 이 주문은 이 기간 동안 사용하는 행동 중 하나 또는 이 기간 동안 생성하는 효과가 당신이 아닌 다른 생명체에 영향을 미칠 경우 종료됩니다. Spell/&TimeStopTitle=시간 정지 Spell/&WeirdDescription=당신은 생물 집단의 가장 깊은 두려움을 이용하여 그들의 마음 속에 그들에게만 보이는 환상의 생물을 창조합니다. 범위 내에서 당신이 선택한 지점을 중심으로 하는 반경 30피트 구체 안에 있는 각 적은 지혜 내성 굴림을 해야 합니다. 저장에 실패하면 생물은 지속 시간 동안 겁을 먹습니다. 환영은 생명체의 가장 깊은 두려움을 불러일으키고 최악의 악몽을 무자비한 위협으로 드러냅니다. 겁에 질린 생명체의 턴이 끝날 때마다 지혜 내성굴림에 성공하거나 4d10의 정신적 피해를 입어야 합니다. 성공적으로 저장하면 해당 생물에 대한 주문이 종료됩니다. Spell/&WeirdTitle=기이한 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt index 554cb88ca9..70e402b4a4 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=O tempo é congelado para a criatura afe Condition/&ConditionTimeStopTitle=O tempo parou Condition/&ConditionWeirdDescription=Assustado. No final de cada turno, faça um teste de resistência de Sabedoria. Em caso de falha, receba 4d10 de dano psíquico. Em caso de sucesso, essa condição termina. Condition/&ConditionWeirdTitle=Estranho +Feedback/&TimeStop={0} ganha {2} rodadas adicionais Spell/&ForesightDescription=Você toca uma criatura disposta e concede uma habilidade limitada de ver o futuro imediato. Durante a duração, o alvo não pode ser surpreendido e tem vantagem em jogadas de ataque, testes de habilidade e testes de resistência. Além disso, outras criaturas têm desvantagem em jogadas de ataque contra o alvo durante a duração. Spell/&ForesightTitle=Previsão Spell/&InvulnerabilityDescription=Você fica imune a todos os danos até o feitiço terminar. @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=Você libera o poder da sua mente para explodir Spell/&PsychicScreamTitle=Grito psíquico Spell/&ShapechangeDescription=Você assume a forma de uma criatura diferente durante o período. A nova forma pode ser de qualquer criatura com nível de desafio igual ao seu nível ou inferior. Spell/&ShapechangeTitle=Mudança de forma -Spell/&TimeStopDescription=Você interrompe brevemente o fluxo do tempo para todos, exceto para você. Nenhum tempo passa para outras criaturas, enquanto você tem 1d4 + 1 turnos seguidos, durante os quais você pode usar ações e se mover normalmente. +Spell/&TimeStopDescription=Você interrompe brevemente o fluxo do tempo para todos, exceto para você. Nenhum tempo passa para outras criaturas, enquanto você tem 1d4+1 turnos seguidos, durante os quais você pode usar ações e se mover normalmente. Esta magia termina se uma das ações que você usar durante este período, ou quaisquer efeitos que você criar durante este período, afetar uma criatura diferente de você. Spell/&TimeStopTitle=Parar o tempo Spell/&WeirdDescription=Inspirando-se nos medos mais profundos de um grupo de criaturas, você cria criaturas ilusórias em suas mentes, visíveis apenas para elas. Cada inimigo em uma esfera de 30 pés de raio centrada em um ponto de sua escolha dentro do alcance deve fazer um teste de resistência de Sabedoria. Em um teste falho, uma criatura fica assustada pela duração. A ilusão invoca os medos mais profundos da criatura, manifestando seus piores pesadelos como uma ameaça implacável. No final de cada turno da criatura assustada, ela deve ter sucesso em um teste de resistência de Sabedoria ou sofrer 4d10 de dano psíquico. Em um teste bem-sucedido, a magia termina para aquela criatura. Spell/&WeirdTitle=Esquisito diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt index 90b566a3c1..d3b1086046 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=Время остановилось дл Condition/&ConditionTimeStopTitle=Замер во времени Condition/&ConditionWeirdDescription=Испуган. В конце каждого своего хода совершает спасбросок Мудрости. При провале получает 4d10 психического урона. При успехе состояние оканчивается. Condition/&ConditionWeirdTitle=В ужасе +Feedback/&TimeStop={0} получает {2} дополнительных раундов Spell/&ForesightDescription=Вы касаетесь согласного существа, даруя ограниченную способность предвидеть будущее. Пока заклинание активно, цель нельзя застать врасплох, и она совершает с преимуществом броски атаки, проверки характеристик и спасброски. Кроме того, пока заклинание активно, другие существа совершают по цели броски атаки с помехой. Spell/&ForesightTitle=Предвидение Spell/&InvulnerabilityDescription=Вы обладаете иммунитетом ко всему урону, пока заклинание активно. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt index 960e15e815..afde3e5aa6 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt @@ -4,6 +4,7 @@ Condition/&ConditionTimeStopDescription=受影响生物的时间被冻结。 Condition/&ConditionTimeStopTitle=时间被停止 Condition/&ConditionWeirdDescription=受惊。在每个回合结束时,进行一次感知豁免。失败时,受到 4d10 心灵伤害。成功时,此条件结束。 Condition/&ConditionWeirdTitle=怪影杀手 +Feedback/&TimeStop={0} 获得 {2} 个额外回合 Spell/&ForesightDescription=你接触一个自愿的生物并赋予其有限的能力来预见不久的将来。在此期间,目标不会被突袭并且在攻击检定、能力检定和豁免检定上具有优势。此外,其他生物在持续时间内对目标的攻击检定具有劣势。 Spell/&ForesightTitle=预警术 Spell/&InvulnerabilityDescription=在法术结束前,你免疫所有伤害。 @@ -20,7 +21,7 @@ Spell/&PsychicScreamDescription=你释放心灵的力量,摧毁你选择的范 Spell/&PsychicScreamTitle=心灵尖啸 Spell/&ShapechangeDescription=你在持续时间内呈现出不同生物的形态。新形态可以是挑战等级等于或低于你等级的任何生物。 Spell/&ShapechangeTitle=形体变化 -Spell/&TimeStopDescription=你为除了你自己之外的所有人短暂地停止了时间的流动。其他生物没有时间流逝,而你连续进行 1d4 + 1 个回合,在此期间你可以正常使用动作和移动。 +Spell/&TimeStopDescription=你短暂地停止了所有人的时间流动,除了你自己。其他生物的时间不会流逝,而你则连续进行 1d4+1 轮,在此期间你可以正常采取行动和移动。如果你在此期间使用的一个动作或你在此期间创建的任何效果影响到你以外的生物,则此法术结束。 Spell/&TimeStopTitle=时间停止 Spell/&WeirdDescription=利用一群生物最深的恐惧,你在他们的脑海中创造出只有他们才能看到的虚幻生物。以射程内你选择的一点为中心的 30 尺半径球体中的每个生物都必须进行一次感知豁免。豁免失败的生物会在持续时间内变得恐慌。幻象唤起该生物最深的恐惧,将其最糟糕的噩梦表现为无情的威胁。在受惊生物的每个回合结束时,它必须成功进行一次感知豁免,否则将受到 4d10 心灵伤害。豁免成功后,该生物的法术结束。 Spell/&WeirdTitle=怪影杀手 From 6054b2fb71c5e45a02de31515a1337bb5b25125c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 13:13:51 -0700 Subject: [PATCH 120/162] tweak Time Stop SFX and behavior --- .../UnfinishedBusinessBlueprints/Assets.txt | 1 + .../ConditionTimeStop.json | 190 +++--------------- .../ConditionTimeStopEnemy.json | 155 ++++++++++++++ .../SpellDefinition/TimeStop.json | 45 ++++- Documentation/Spells.md | 2 +- .../Spells/SpellBuildersLevel09.cs | 87 +++++--- .../Translations/de/Spells/Spells09-de.txt | 6 +- .../Translations/en/Spells/Spells09-en.txt | 4 +- .../Translations/es/Spells/Spells09-es.txt | 6 +- .../Translations/fr/Spells/Spells09-fr.txt | 6 +- .../Translations/it/Spells/Spells09-it.txt | 6 +- .../Translations/ja/Spells/Spells09-ja.txt | 6 +- .../Translations/ko/Spells/Spells09-ko.txt | 6 +- .../pt-BR/Spells/Spells09-pt-BR.txt | 6 +- .../Translations/ru/Spells/Spells09-ru.txt | 6 +- .../zh-CN/Spells/Spells09-zh-CN.txt | 6 +- 16 files changed, 315 insertions(+), 223 deletions(-) create mode 100644 Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index 898bb46aa7..5ec6f43e18 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -1187,6 +1187,7 @@ ConditionTelekinesisRestrained ConditionDefinition ConditionDefinition 6532394f- ConditionThunderousSmite ConditionDefinition ConditionDefinition f8010331-f4a8-5f86-9ab2-682108bb7943 ConditionTieflingFeralWings ConditionDefinition ConditionDefinition 061f2f99-72c6-5208-aecb-d4661c750c49 ConditionTimeStop ConditionDefinition ConditionDefinition e1d29b24-2799-5edd-a865-dbd2b5fc43b0 +ConditionTimeStopEnemy ConditionDefinition ConditionDefinition 637edef6-8b8b-5244-8157-235b0eaf6411 ConditionTraditionOpenHandQuiveringPalm ConditionDefinition ConditionDefinition fd7fb9c8-b520-585a-afe2-7617cbf3f3b5 ConditionTraditionSurvivalPhysicalPerfection ConditionDefinition ConditionDefinition 8ea61016-4655-5566-8ab4-0091c411dac3 ConditionTreeForestGuardian ConditionDefinition ConditionDefinition 345a53aa-1f78-5f27-b286-8dd263210fda diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json index 78dc81db55..e8f6751070 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json @@ -1,12 +1,12 @@ { "$type": "ConditionDefinition, Assembly-CSharp", "inDungeonEditor": false, - "parentCondition": "Definition:ConditionIncapacitated:24d96cfe3b77b9a4b951bfb0e02fc018", - "conditionType": "Neutral", + "parentCondition": null, + "conditionType": "Beneficial", "features": [], "allowMultipleInstances": false, - "silentWhenAdded": false, - "silentWhenRemoved": false, + "silentWhenAdded": true, + "silentWhenRemoved": true, "silentWhenRefreshed": false, "terminateWhenRemoved": false, "specialDuration": false, @@ -15,14 +15,11 @@ "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", - "specialInterruptions": [ - "Attacked", - "Damaged" - ], + "specialInterruptions": [], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", "interruptionSavingThrowAbility": "", - "interruptionDamageThreshold": 1, + "interruptionDamageThreshold": 0, "keepConditionIfSavingThrowSucceeds": false, "interruptionSavingThrowAffinity": "None", "conditionTags": [], @@ -41,171 +38,36 @@ "additionalConditionTurnOccurenceType": "StartOfTurn", "conditionStartParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "7f0a50ea30efd4649814b6835e355979", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "e8d0757735b7f844c8d98c2057c191a9", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, "conditionEndParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "a9408ae01a2f9424da0625ba252978a6", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "cffbfc5e74b6d334d812b9a32eca7bad", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null }, + "recurrentEffectParticleReference": null, "characterShaderReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" + "m_SubObjectName": null, + "m_SubObjectType": null }, "particlesBasedOnAncestryDamageType": false, "ancestryType": "Sorcerer", - "acidParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "coldParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "fireParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "lightningParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, - "poisonParticleParameters": { - "$type": "ConditionParticleParameters, Assembly-CSharp", - "startParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "particleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "endParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - }, - "recurrentEffectParticleReference": { - "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "", - "m_SubObjectName": "", - "m_SubObjectType": "" - } - }, + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, "overrideCharacterShaderColors": false, "firstCharacterShaderColor": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", @@ -270,9 +132,9 @@ "description": "Condition/&ConditionTimeStopDescription", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", - "m_AssetGUID": "cfdf2152d04bcff41aab30fd13412ad6", - "m_SubObjectName": "ConditionIncapacitated", - "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + "m_AssetGUID": "6eb5f89a-1722-57b5-bc21-d9e9ec17446c", + "m_SubObjectName": null, + "m_SubObjectType": null }, "color": { "$type": "UnityEngine.Color, UnityEngine.CoreModule", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json new file mode 100644 index 0000000000..77cab87f03 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json @@ -0,0 +1,155 @@ +{ + "$type": "ConditionDefinition, Assembly-CSharp", + "inDungeonEditor": false, + "parentCondition": null, + "conditionType": "Detrimental", + "features": [], + "allowMultipleInstances": false, + "silentWhenAdded": false, + "silentWhenRemoved": false, + "silentWhenRefreshed": false, + "terminateWhenRemoved": false, + "specialDuration": false, + "durationType": "Hour", + "durationParameterDie": "D4", + "durationParameter": 1, + "forceTurnOccurence": false, + "turnOccurence": "EndOfTurn", + "specialInterruptions": [], + "interruptionRequiresSavingThrow": false, + "interruptionSavingThrowComputationMethod": "SaveOverride", + "interruptionSavingThrowAbility": "", + "interruptionDamageThreshold": 0, + "keepConditionIfSavingThrowSucceeds": false, + "interruptionSavingThrowAffinity": "None", + "conditionTags": [], + "recurrentEffectForms": [], + "cancellingConditions": [], + "additionalDamageWhenHit": false, + "additionalDamageTypeDetermination": "Specific", + "additionalDamageType": "", + "additionalDamageQuantity": "AbilityBonus", + "additionalDamageDieType": "D1", + "additionalDamageDieNumber": 1, + "additionalConditionWhenHit": false, + "additionalCondition": null, + "additionalConditionDurationType": "Round", + "additionalConditionDurationParameter": 1, + "additionalConditionTurnOccurenceType": "StartOfTurn", + "conditionStartParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "conditionEndParticleReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "recurrentEffectParticleReference": null, + "characterShaderReference": { + "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "particlesBasedOnAncestryDamageType": false, + "ancestryType": "Sorcerer", + "acidParticleParameters": null, + "coldParticleParameters": null, + "fireParticleParameters": null, + "lightningParticleParameters": null, + "poisonParticleParameters": null, + "overrideCharacterShaderColors": false, + "firstCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "secondCharacterShaderColor": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "timeToWaitBeforeApplyingShader": 0.5, + "timeToWaitBeforeRemovingShader": 0.5, + "possessive": false, + "amountOrigin": "None", + "baseAmount": 0, + "additiveAmount": false, + "sourceAbilityBonusMinValue": 1, + "subsequentOnRemoval": null, + "subsequentHasSavingThrow": false, + "subsequentSavingThrowAbilityScore": "Constitution", + "subsequentVariableForDC": "FrenzyExhaustionDC", + "subsequentDCIncrease": 5, + "effectFormsOnRemoved": [], + "forceBehavior": false, + "addBehavior": false, + "fearSource": false, + "battlePackage": null, + "explorationPackage": null, + "removedFromTheGame": false, + "permanentlyRemovedIfExtraPlanar": false, + "refundReceivedDamageWhenRemoved": false, + "followSourcePosition": false, + "disolveCharacterOnDeath": false, + "disolveParameters": { + "$type": "GraphicsCharacterDefinitions+DisolveParameters, Assembly-CSharp", + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 0.0, + "g": 0.0, + "b": 0.0, + "a": 0.0 + }, + "colorWidth": 0.0, + "noiseScale": 5.0, + "hueScale": 0.0, + "vertexOffset": 0.0, + "curve": { + "$type": "UnityEngine.AnimationCurve, UnityEngine.CoreModule" + }, + "startAfterDeathAnimation": false, + "duration": 0.0 + }, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Condition/&ConditionTimeStopEnemyTitle", + "description": "Condition/&ConditionTimeStopEnemyDescription", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "7acad79b4cc3fd649884a5ce979ac17c", + "m_SubObjectName": "CurseOfTime", + "m_SubObjectType": "UnityEngine.Sprite, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "637edef6-8b8b-5244-8157-235b0eaf6411", + "contentPack": 9999, + "name": "ConditionTimeStopEnemy" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json index bba4b17859..e5b0982fd7 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json @@ -18,10 +18,10 @@ "rangeParameter": 0, "halfDamageOnAMiss": false, "hitAffinitiesByTargetTag": [], - "targetType": "Cylinder", + "targetType": "Sphere", "itemSelectionType": "None", - "targetParameter": 20, - "targetParameter2": 10, + "targetParameter": 24, + "targetParameter2": 2, "emissiveBorder": "None", "emissiveParameter": 1, "requiresTargetProximity": false, @@ -43,8 +43,8 @@ "targetConditionName": "", "targetConditionAsset": null, "targetSide": "All", - "durationType": "Round", - "durationParameter": 3, + "durationType": "Permanent", + "durationParameter": 0, "endOfEffect": "EndOfTurn", "hasSavingThrow": false, "disableSavingThrowOnAllies": false, @@ -90,8 +90,8 @@ "saveOccurence": "EndOfTurn", "conditionForm": { "$type": "ConditionForm, Assembly-CSharp", - "conditionDefinitionName": "ConditionTimeStop", - "conditionDefinition": "Definition:ConditionTimeStop:e1d29b24-2799-5edd-a865-dbd2b5fc43b0", + "conditionDefinitionName": "ConditionTimeStopEnemy", + "conditionDefinition": "Definition:ConditionTimeStopEnemy:637edef6-8b8b-5244-8157-235b0eaf6411", "operation": "Add", "conditionsList": [], "applyToSelf": false, @@ -99,6 +99,33 @@ }, "hasFilterId": false, "filterId": 0 + }, + { + "$type": "EffectForm, Assembly-CSharp", + "formType": "Condition", + "addBonusMode": "None", + "applyLevel": "No", + "levelType": "ClassLevel", + "levelMultiplier": 1, + "diceByLevelTable": [], + "createdByCharacter": true, + "createdByCondition": false, + "hasSavingThrow": false, + "savingThrowAffinity": "None", + "dcModifier": 0, + "canSaveToCancel": false, + "saveOccurence": "EndOfTurn", + "conditionForm": { + "$type": "ConditionForm, Assembly-CSharp", + "conditionDefinitionName": "ConditionTimeStop", + "conditionDefinition": "Definition:ConditionTimeStop:e1d29b24-2799-5edd-a865-dbd2b5fc43b0", + "operation": "Add", + "conditionsList": [], + "applyToSelf": true, + "forceOnSelf": true + }, + "hasFilterId": false, + "filterId": 0 } ], "specialFormsDescription": "", @@ -127,13 +154,13 @@ "$type": "EffectParticleParameters, Assembly-CSharp", "casterParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "a6ca7038401125c4096926082f9acb33", + "m_AssetGUID": "7b70493edfd42734b975cf604767e952", "m_SubObjectName": "", "m_SubObjectType": "" }, "casterSelfParticleReference": { "$type": "UnityEngine.AddressableAssets.AssetReference, Unity.Addressables", - "m_AssetGUID": "6a8b8119774067740a6895a72319a60d", + "m_AssetGUID": "", "m_SubObjectName": "", "m_SubObjectType": "" }, diff --git a/Documentation/Spells.md b/Documentation/Spells.md index aedf104518..ebd66aca50 100644 --- a/Documentation/Spells.md +++ b/Documentation/Spells.md @@ -1323,7 +1323,7 @@ You assume the form of a different creature for the duration. The new form can b # 321. - *Time Stop* © (V) level 9 Transmutation [UB] -You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4 + 1 turns in a row, during which you can use actions and move as normal. +You briefly stop the flow of time for everyone but yourself. No time passes for other creatures, while you take 1d4+1 turns in a row, during which you can use actions and move as normal. This spell ends if one of the actions you use during this period, or any effects that you create during this period, affects a creature other than you. # 322. - *Weird* © (V,S) level 9 Illusion [Concentration] [UB] diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs index c739f96345..75e25c5de7 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs @@ -284,6 +284,12 @@ internal static SpellDefinition BuildTimeStop() .AddCustomSubFeatures(new ActionFinishedByMeTimeStop()) .AddToDB(); + var conditionTimeStopEnemy = ConditionDefinitionBuilder + .Create("ConditionTimeStopEnemy") + .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionPatronTimekeeperCurseOfTime) + .SetConditionType(ConditionType.Detrimental) + .AddToDB(); + return SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.TimeStop, 128)) @@ -298,47 +304,38 @@ internal static SpellDefinition BuildTimeStop() EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Permanent) - .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Self) - .SetEffectForms(EffectFormBuilder.ConditionForm(conditionTimeStop)) + .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Sphere, 24) + .ExcludeCaster() + .SetEffectForms( + EffectFormBuilder.ConditionForm(conditionTimeStopEnemy), + EffectFormBuilder.ConditionForm( + conditionTimeStop, + ConditionForm.ConditionOperation.Add, true, true)) .SetParticleEffectParameters(DispelMagic) + .SetCasterEffectParameters(GravitySlam) .Build()) .AddCustomSubFeatures(new CustomBehaviorTimeStop()) .AddToDB(); } - private sealed class ActionFinishedByMeTimeStop - : IActionFinishedByMe, ICharacterBeforeTurnEndListener, IOnConditionAddedOrRemoved + private sealed class ActionFinishedByMeTimeStop : IActionFinishedByMe, ICharacterBeforeTurnEndListener { + // remove time stop if any action has non self target public IEnumerator OnActionFinishedByMe(CharacterAction action) { var character = action.ActingCharacter; var targets = action.ActionParams.TargetCharacters; - var hasNonSelfTarget = targets.Any(x => x != character); + var hasNonSelfTarget = targets == null || targets.Any(x => x != character); if (!hasNonSelfTarget) { yield break; } - - var rulesetCharacter = character.RulesetCharacter; - - if (rulesetCharacter.TryGetConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, "ConditionTimeStop", out var activeCondition)) - { - rulesetCharacter.RemoveCondition(activeCondition); - } - } - - public void OnConditionAdded(RulesetCharacter target, RulesetCondition rulesetCondition) - { - - } - - public void OnConditionRemoved(RulesetCharacter target, RulesetCondition rulesetCondition) - { - RemoveDuplicateContenders(GameLocationCharacter.GetFromActor(target)); + + RemoveTimeStop(character); } + // remove time stop after last instance turn public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) { var battle = Gui.Battle; @@ -355,20 +352,52 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) return; } - RemoveDuplicateContenders(locationCharacter); + RemoveTimeStop(locationCharacter); } - private static void RemoveDuplicateContenders(GameLocationCharacter locationCharacter) + private static void RemoveTimeStop(GameLocationCharacter locationCharacter) { var battle = Gui.Battle; - - while (battle.InitiativeSortedContenders.Count(x => x == locationCharacter) > 1) + + // remove duplicates + if (Gui.Battle != null) { - var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); + while (battle.InitiativeSortedContenders.Count(x => x == locationCharacter) > 1) + { + var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); - battle.InitiativeSortedContenders.RemoveAt(index); + battle.InitiativeSortedContenders.RemoveAt(index); + } + } + + // remove time stop condition from others + var locationCharacterService = ServiceRepository.GetService(); + var contenders = + (Gui.Battle?.AllContenders ?? + locationCharacterService.PartyCharacters.Union(locationCharacterService.GuestCharacters)) + .ToList(); + + foreach (var rulesetContender in contenders + .Select(contender => contender.RulesetCharacter)) + { + if (rulesetContender.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionTimeStopEnemy", out var activeConditionEnemy) && + activeConditionEnemy.SourceGuid == rulesetContender.Guid) + { + rulesetContender.RemoveCondition(activeConditionEnemy); + } + } + + // remove time stop from self + var rulesetCharacter = locationCharacter.RulesetCharacter; + + if (rulesetCharacter.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionTimeStop", out var activeCondition)) + { + rulesetCharacter.RemoveCondition(activeCondition); } + // refresh UI var gameLocationScreenBattle = Gui.GuiService.GetScreen(); gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt index d48b7160ce..b6bec62a32 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells09-de.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Vorteil bei allen Angriffswürfen, Fähigkeitsprüfungen und Rettungswürfen. Andere Kreaturen haben bei Angriffswürfen einen Nachteil. Condition/&ConditionForesightTitle=Voraussicht -Condition/&ConditionTimeStopDescription=Für das betroffene Wesen ist die Zeit eingefroren. -Condition/&ConditionTimeStopTitle=Die Zeit ist stehen geblieben +Condition/&ConditionTimeStopDescription=Sie spielen 1W4+1 Runden hintereinander. +Condition/&ConditionTimeStopEnemyDescription=Die Zeit ist für Sie stehen geblieben. +Condition/&ConditionTimeStopEnemyTitle=Zeitstopp +Condition/&ConditionTimeStopTitle=Zeitstopp Condition/&ConditionWeirdDescription=Verängstigt. Am Ende jeder Runde machst du einen Weisheitsrettungswurf. Bei einem Fehlschlag erleidest du 4W10 psychischen Schaden. Bei einem Erfolg endet dieser Zustand. Condition/&ConditionWeirdTitle=Seltsam Feedback/&TimeStop={0} erhält {2} zusätzliche Runden diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt index aeaf8917a5..3dcebe63a6 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells09-en.txt @@ -1,9 +1,9 @@ Condition/&ConditionForesightDescription=Advantage on all attack rolls, ability checks, and saving throws. Other creatures have disadvantage on attack rolls. Condition/&ConditionForesightTitle=Foresight -Condition/&ConditionTimeStopDescription=Time is frozen for the affected creature. Condition/&ConditionTimeStopDescription=You take 1d4+1 turns in a row. +Condition/&ConditionTimeStopEnemyDescription=The time has stopped for you. +Condition/&ConditionTimeStopEnemyTitle=Time Stop Condition/&ConditionTimeStopTitle=Time Stop -Condition/&ConditionTimeStopTitle=Time Stopped Condition/&ConditionWeirdDescription=Frightened. At the end of each turn, make a Wisdom saving throw. On a failure, take 4d10 psychic damage. On a success, this condition ends. Condition/&ConditionWeirdTitle=Weirded Feedback/&TimeStop={0} gains {2} additional rounds diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt index d55ecfff88..9ccd9c3abc 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells09-es.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Ventaja en todas las tiradas de ataque, comprobaciones de característica y tiradas de salvación. Las demás criaturas tienen desventaja en las tiradas de ataque. Condition/&ConditionForesightTitle=Previsión -Condition/&ConditionTimeStopDescription=El tiempo se congela para la criatura afectada. -Condition/&ConditionTimeStopTitle=El tiempo se detuvo +Condition/&ConditionTimeStopDescription=Realizas 1d4+1 turnos seguidos. +Condition/&ConditionTimeStopEnemyDescription=El tiempo se ha detenido para ti. +Condition/&ConditionTimeStopEnemyTitle=Detener el tiempo +Condition/&ConditionTimeStopTitle=Detener el tiempo Condition/&ConditionWeirdDescription=Asustado. Al final de cada turno, realiza una tirada de salvación de Sabiduría. Si falla, sufre 4d10 de daño psíquico. Si tiene éxito, esta condición termina. Condition/&ConditionWeirdTitle=Extraño Feedback/&TimeStop={0} gana {2} rondas adicionales diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt index 40356c3453..2102f53d1c 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells09-fr.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Avantage sur tous les jets d'attaque, de caractéristique et de sauvegarde. Les autres créatures ont un désavantage sur les jets d'attaque. Condition/&ConditionForesightTitle=Prévoyance -Condition/&ConditionTimeStopDescription=Le temps est figé pour la créature affectée. -Condition/&ConditionTimeStopTitle=Le temps s'est arrêté +Condition/&ConditionTimeStopDescription=Vous jouez 1d4+1 tours d'affilée. +Condition/&ConditionTimeStopEnemyDescription=Le temps s'est arrêté pour vous. +Condition/&ConditionTimeStopEnemyTitle=Arrêt du temps +Condition/&ConditionTimeStopTitle=Arrêt du temps Condition/&ConditionWeirdDescription=Effrayé. À la fin de chaque tour, effectuez un jet de sauvegarde de Sagesse. En cas d'échec, subissez 4d10 dégâts psychiques. En cas de réussite, cette condition prend fin. Condition/&ConditionWeirdTitle=Bizarre Feedback/&TimeStop={0} gagne {2} tours supplémentaires diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt index 5c9dc4ee7c..526646d2d4 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells09-it.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Vantaggio su tutti i tiri per colpire, prove di abilità e tiri salvezza. Le altre creature hanno svantaggio sui tiri per colpire. Condition/&ConditionForesightTitle=Lungimiranza -Condition/&ConditionTimeStopDescription=Per la creatura interessata il tempo è congelato. -Condition/&ConditionTimeStopTitle=Il tempo si è fermato +Condition/&ConditionTimeStopDescription=Si svolgono 1d4+1 turni consecutivi. +Condition/&ConditionTimeStopEnemyDescription=Per te il tempo si è fermato. +Condition/&ConditionTimeStopEnemyTitle=Fermata del tempo +Condition/&ConditionTimeStopTitle=Fermata del tempo Condition/&ConditionWeirdDescription=Spaventato. Alla fine di ogni turno, fai un tiro salvezza su Saggezza. In caso di fallimento, subisci 4d10 danni psichici. In caso di successo, questa condizione termina. Condition/&ConditionWeirdTitle=Strano Feedback/&TimeStop={0} guadagna {2} round aggiuntivi diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt index 7045b2fe84..b0f07fee49 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells09-ja.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=すべての攻撃ロール、能力チェック、セーヴィング スローで有利になります。他のクリーチャーは攻撃ロールで不利になります。 Condition/&ConditionForesightTitle=先見の明 -Condition/&ConditionTimeStopDescription=影響を受けたクリーチャーの時間は停止します。 -Condition/&ConditionTimeStopTitle=止まった時間 +Condition/&ConditionTimeStopDescription=連続して 1d4+1 ターンを実行します。 +Condition/&ConditionTimeStopEnemyDescription=あなたにとって時間は止まっています。 +Condition/&ConditionTimeStopEnemyTitle=時間停止 +Condition/&ConditionTimeStopTitle=時間停止 Condition/&ConditionWeirdDescription=恐ろしかった。各ターンの終了時に、知恵のセーヴィング スローを行います。失敗すると、4d10の精神的ダメージを受ける。成功すると、この状態は終了します。 Condition/&ConditionWeirdTitle=奇妙な Feedback/&TimeStop={0}は{2}ラウンド追加獲得 diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt index 6655e18784..d9d569b55b 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells09-ko.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=모든 공격 굴림, 능력 판정, 내성 굴림에 유리합니다. 다른 생물은 공격 굴림에 불리한 점이 있습니다. Condition/&ConditionForesightTitle=선견 -Condition/&ConditionTimeStopDescription=영향을 받은 생물의 시간은 동결됩니다. -Condition/&ConditionTimeStopTitle=정지된 시간 +Condition/&ConditionTimeStopDescription=연속으로 1d4+1턴을 진행합니다. +Condition/&ConditionTimeStopEnemyDescription=당신의 시간은 멈췄습니다. +Condition/&ConditionTimeStopEnemyTitle=시간 정지 +Condition/&ConditionTimeStopTitle=시간 정지 Condition/&ConditionWeirdDescription=겁먹은. 매 턴이 끝날 때마다 지혜 내성 굴림을 합니다. 실패하면 4d10의 정신적 피해를 입습니다. 성공하면 이 조건이 종료됩니다. Condition/&ConditionWeirdTitle=이상해 Feedback/&TimeStop={0}은 {2}개의 추가 라운드를 얻습니다. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt index 70e402b4a4..c302ef458b 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells09-pt-BR.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Vantagem em todas as jogadas de ataque, testes de habilidade e testes de resistência. Outras criaturas têm desvantagem em jogadas de ataque. Condition/&ConditionForesightTitle=Previsão -Condition/&ConditionTimeStopDescription=O tempo é congelado para a criatura afetada. -Condition/&ConditionTimeStopTitle=O tempo parou +Condition/&ConditionTimeStopDescription=Você joga 1d4+1 turnos seguidos. +Condition/&ConditionTimeStopEnemyDescription=O tempo parou para você. +Condition/&ConditionTimeStopEnemyTitle=Parada do Tempo +Condition/&ConditionTimeStopTitle=Parada do Tempo Condition/&ConditionWeirdDescription=Assustado. No final de cada turno, faça um teste de resistência de Sabedoria. Em caso de falha, receba 4d10 de dano psíquico. Em caso de sucesso, essa condição termina. Condition/&ConditionWeirdTitle=Estranho Feedback/&TimeStop={0} ganha {2} rodadas adicionais diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt index d3b1086046..3bdae58c67 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=Преимущество на все броски атаки, проверки характеристик и спасброски. Остальные существа получают помеху на броски атаки по вам. Condition/&ConditionForesightTitle=Предвидение -Condition/&ConditionTimeStopDescription=Время остановилось для этого существа. -Condition/&ConditionTimeStopTitle=Замер во времени +Condition/&ConditionTimeStopDescription=Вы делаете 1d4+1 ход подряд. +Condition/&ConditionTimeStopEnemyDescription=Время для вас остановилось. +Condition/&ConditionTimeStopEnemyTitle=Остановка времени +Condition/&ConditionTimeStopTitle=Остановка времени Condition/&ConditionWeirdDescription=Испуган. В конце каждого своего хода совершает спасбросок Мудрости. При провале получает 4d10 психического урона. При успехе состояние оканчивается. Condition/&ConditionWeirdTitle=В ужасе Feedback/&TimeStop={0} получает {2} дополнительных раундов diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt index afde3e5aa6..0c7060c352 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells09-zh-CN.txt @@ -1,7 +1,9 @@ Condition/&ConditionForesightDescription=在所有攻击检定、能力检定和豁免检定上具有优势。其他生物在攻击检定上有劣势。 Condition/&ConditionForesightTitle=预警术 -Condition/&ConditionTimeStopDescription=受影响生物的时间被冻结。 -Condition/&ConditionTimeStopTitle=时间被停止 +Condition/&ConditionTimeStopDescription=你连续进行 1d4+1 轮。 +Condition/&ConditionTimeStopEnemyDescription=时间对你来说已停止。 +Condition/&ConditionTimeStopEnemyTitle=時間停止 +Condition/&ConditionTimeStopTitle=時間停止 Condition/&ConditionWeirdDescription=受惊。在每个回合结束时,进行一次感知豁免。失败时,受到 4d10 心灵伤害。成功时,此条件结束。 Condition/&ConditionWeirdTitle=怪影杀手 Feedback/&TimeStop={0} 获得 {2} 个额外回合 From 939b6852405f3808200cf8de678ed1cc87c8fe72 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 13:14:13 -0700 Subject: [PATCH 121/162] tweak absorb elements behavior --- .../ConditionCorruptingBolt.json | 4 +- .../GameLocationBattleManagerPatcher.cs | 14 +++++++ .../Spells/SpellBuildersLevel01.cs | 37 +++++++------------ 3 files changed, 29 insertions(+), 26 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCorruptingBolt.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCorruptingBolt.json index 169a994756..95a0c05695 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCorruptingBolt.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionCorruptingBolt.json @@ -29,9 +29,7 @@ "durationParameter": 1, "forceTurnOccurence": false, "turnOccurence": "EndOfTurn", - "specialInterruptions": [ - 9005 - ], + "specialInterruptions": [], "interruptionRequiresSavingThrow": false, "interruptionSavingThrowComputationMethod": "SaveOverride", "interruptionSavingThrowAbility": "", diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs index 0033eebb0d..2c4239bc21 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationBattleManagerPatcher.cs @@ -378,6 +378,20 @@ public static IEnumerator Postfix( rangedAttack, advantageType, actualEffectForms, firstTarget, criticalHit); } + //PATCH: support for `IMagicEffectBeforeHitConfirmedOnMe` on SPELLS + // should also happen outside battles + if (defender.RulesetCharacter is { IsDeadOrDyingOrUnconscious: false }) + { + foreach (var attackBeforeHitConfirmedOnMe in defender.RulesetCharacter.UsableSpells + .SelectMany(x => x.GetAllSubFeaturesOfType()) + .ToList()) + { + yield return attackBeforeHitConfirmedOnMe.OnPhysicalAttackBeforeHitConfirmedOnMe( + __instance, attacker, defender, attackModifier, attackMode, + rangedAttack, advantageType, actualEffectForms, firstTarget, criticalHit); + } + } + //PATCH: support for `IPhysicalAttackBeforeHitConfirmedOnMe` if (__instance.Battle != null) { diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 04658dc63c..51363fa132 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -1498,7 +1498,7 @@ public void OnConditionRemoved(RulesetCharacter target, RulesetCondition ruleset } private sealed class CustomBehaviorElementalInfusion(SpellDefinition spellDefinition) : - ITryAlterOutcomeAttack, IMagicEffectBeforeHitConfirmedOnMe + IPhysicalAttackBeforeHitConfirmedOnMe, IMagicEffectBeforeHitConfirmedOnMe { private static readonly IEnumerable AllowedDamageTypes = DamagesAndEffects .Where(x => x.Item1 != DamageTypePoison) @@ -1514,36 +1514,22 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnMe( bool firstTarget, bool criticalHit) { - if (rulesetEffect is RulesetEffectSpell && - rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) - { - yield return HandleReaction(battleManager, attacker, defender, actualEffectForms); - } + yield return HandleReaction(battleManager, attacker, defender, actualEffectForms); } - public int HandlerPriority => 10; - - public IEnumerator OnTryAlterOutcomeAttack( + public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnMe( GameLocationBattleManager battleManager, - CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, - GameLocationCharacter helper, ActionModifier actionModifier, RulesetAttackMode attackMode, - RulesetEffect rulesetEffect) + bool rangedAttack, + AdvantageType advantageType, + List actualEffectForms, + bool firstTarget, + bool criticalHit) { - if (helper != defender || - !helper.CanReact() || - !helper.RulesetCharacter.AreSpellComponentsValid(spellDefinition)) - { - yield break; - } - - var actualEffectForms = - attackMode?.EffectDescription.EffectForms ?? rulesetEffect?.EffectDescription.EffectForms ?? []; - - yield return HandleReaction(battleManager, attacker, helper, actualEffectForms); + yield return HandleReaction(battleManager, attacker, defender, actualEffectForms); } private IEnumerator HandleReaction( @@ -1552,6 +1538,11 @@ private IEnumerator HandleReaction( GameLocationCharacter helper, IEnumerable actualEffectForms) { + if (!helper.CanReact()) + { + yield break; + } + var attackDamageTypes = actualEffectForms .Where(x => x.FormType == EffectForm.EffectFormType.Damage) .Select(x => x.DamageForm.DamageType) From dcb7a0e3656e04e933b07cfc2016728823e5020c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 13:19:31 -0700 Subject: [PATCH 122/162] review college of swords descriptions --- SolastaUnfinishedBusiness/ChangelogHistory.txt | 1 - .../Subclasses/CollegeOfAudacity.cs | 18 +++++++++--------- .../de/SubClasses/CollegeOfAudacity-de.txt | 2 +- .../en/SubClasses/CollegeOfAudacity-en.txt | 2 +- .../es/SubClasses/CollegeOfAudacity-es.txt | 2 +- .../fr/SubClasses/CollegeOfAudacity-fr.txt | 2 +- .../it/SubClasses/CollegeOfAudacity-it.txt | 2 +- .../ja/SubClasses/CollegeOfAudacity-ja.txt | 2 +- .../ko/SubClasses/CollegeOfAudacity-ko.txt | 2 +- .../SubClasses/CollegeOfAudacity-pt-BR.txt | 2 +- .../ru/SubClasses/CollegeOfAudacity-ru.txt | 1 + .../SubClasses/CollegeOfAudacity-zh-CN.txt | 2 +- 12 files changed, 19 insertions(+), 19 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index c9ae8c05cd..3d31da9255 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -3,7 +3,6 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 -- fixed College of Swords flourish melee weapon validator - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index e78898f3de..70fade780f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -338,7 +338,7 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( var isMasterfulWhirl = rulesetAttacker.IsToggleEnabled(MasterfulWhirlToggle); if (!attacker.OnceInMyTurnIsValid(WhirlMarker) || - !ValidatorsWeapon.IsMelee(attackMode) || + // !ValidatorsWeapon.IsMelee(attackMode) || !((isAudaciousWhirl && hasAvailablePowerUses) || isMasterfulWhirl)) { yield break; @@ -410,14 +410,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( { var rulesetAttacker = attacker.RulesetCharacter; - if (rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || - !attacker.UsedSpecialFeatures.TryGetValue(WhirlSelectedPower, out var value)) - { - yield break; - } - - attacker.UsedSpecialFeatures.Remove(WhirlSelectedPower); - if (!rulesetAttacker.HasConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionExtraMovement.Name)) { @@ -436,6 +428,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( 0); } + if (rulesetAttacker is not { IsDeadOrDyingOrUnconscious: false } || + !attacker.UsedSpecialFeatures.TryGetValue(WhirlSelectedPower, out var value)) + { + yield break; + } + + attacker.UsedSpecialFeatures.Remove(WhirlSelectedPower); + switch (value) { case 0 when diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt index 011b3a777f..33624a1f5c 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Aktivieren/Deaktivieren von Master's Flo Action/&MasterfulWhirlToggleTitle=Meisterhafte Blüte Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Flourish-Roll zu AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Defensives Gedeihen -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Wann immer Sie in Ihrem Zug die Aktion „Angriff“ ausführen, erhöht sich Ihre Gehgeschwindigkeit bis zum Ende des Zuges um 10 Fuß, und wenn ein Nahkampfangriff, den Sie als Teil dieser Aktion ausführen, eine Kreatur trifft, können Sie eine Anwendung Ihrer Bardischen Inspiration aufwenden, damit die Waffe dem getroffenen Ziel zusätzlichen Schaden zufügt. Der Schaden entspricht der Zahl, die Sie auf dem Bardischen Inspirationswürfel würfeln. Sie wählen außerdem ein bestimmtes Manöver:\n• Defensives Gedeihen: Sie addieren den Würfelwurf der Bardischen Inspiration bis zum Beginn Ihres nächsten Zuges zu Ihrer RK.\n• Schneidendes Gedeihen: Sie fügen allen anderen feindlichen Kreaturen im Umkreis von 5 Fuß um Sie herum den zusätzlichen Schaden zu.\n• Mobiles Gedeihen: Sie erhalten bis zum Ende Ihres Zuges die Vorteile der Rückzugsmöglichkeit. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Wann immer Sie in Ihrem Zug die Aktion „Angriff“ ausführen, erhöht sich Ihre Gehgeschwindigkeit bis zum Ende des Zuges um 10 Fuß, und wenn ein Waffenangriff, den Sie als Teil dieser Aktion ausführen, eine Kreatur trifft, können Sie eine Anwendung Ihrer Bardic Inspiration aufwenden, damit die Waffe dem getroffenen Ziel zusätzlichen Schaden zufügt. Der Schaden entspricht der Zahl, die Sie auf dem Bardic Inspiration-Würfel würfeln. Sie wählen außerdem ein bestimmtes Manöver:\n• Defensive Flourish: Sie addieren den Würfelwurf der Bardic Inspiration bis zum Beginn Ihres nächsten Zuges zu Ihrer AC.\n• Slashing Flourish: Sie fügen allen anderen feindlichen Kreaturen im Umkreis von 5 Fuß um Sie herum den zusätzlichen Schaden zu.\n• Mobile Flourish: Sie erhalten bis zum Ende Ihres Zuges die Vorteile der Rückzugsmöglichkeit. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Klingenschwung Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Du erlangst Kenntnisse im Umgang mit mittlerer Rüstung und dem Krummsäbel. Du kannst deine Waffe auch als Fokus für deine Bardenzauber verwenden. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Bonus-Fertigkeiten diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt index 03810c4d76..ced536c2ad 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activate/deactivate Master's Flourish Action/&MasterfulWhirlToggleTitle=Master's Flourish Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Flourish roll to AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Defensive Flourish -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a melee weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver:\n• Defensive Flourish: You add the Bardic Inspiration die roll to your AC until the start of your next turn.\n• Slashing Flourish: You deal the extra damage to all other enemy creatures within 5 feet of you.\n• Mobile Flourish: You gain benefits of disengage until the end of your turn. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver:\n• Defensive Flourish: You add the Bardic Inspiration die roll to your AC until the start of your next turn.\n• Slashing Flourish: You deal the extra damage to all other enemy creatures within 5 feet of you.\n• Mobile Flourish: You gain benefits of disengage until the end of your turn. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Blade Flourish Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=You gain proficiency with medium armor and the scimitar. You can also use your weapon as a spellcasting focus for your bard spells. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Bonus Proficiencies diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt index a16cef1c10..b90e70e91f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activar/desactivar el Florecimiento del Action/&MasterfulWhirlToggleTitle=El florecimiento del maestro Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Rollo de florituras hacia AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Florecimiento defensivo -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Siempre que realices la acción de Ataque en tu turno, tu velocidad al caminar aumenta en 10 pies hasta el final del turno, y si un ataque con arma cuerpo a cuerpo que realices como parte de esta acción golpea a una criatura, puedes gastar un uso de tu Inspiración bárdica para hacer que el arma inflija daño adicional al objetivo que golpeaste. El daño es igual al número que sacaste en el dado de Inspiración bárdica. También eliges una maniobra particular:\n• Brillo defensivo: sumas la tirada del dado de Inspiración bárdica a tu CA hasta el comienzo de tu siguiente turno.\n• Brillo cortante: infliges daño adicional a todas las demás criaturas enemigas a 5 pies o menos de ti.\n• Brillo móvil: obtienes los beneficios de desengancharte hasta el final de tu turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Siempre que realices la acción de Ataque en tu turno, tu velocidad al caminar aumenta en 10 pies hasta el final del turno, y si un ataque de arma que realices como parte de esta acción golpea a una criatura, puedes gastar un uso de tu Inspiración bárdica para hacer que el arma inflija daño adicional al objetivo que golpeaste. El daño es igual al número que sacaste en el dado de Inspiración bárdica. También eliges una maniobra particular:\n• Brillo defensivo: sumas la tirada del dado de Inspiración bárdica a tu CA hasta el comienzo de tu siguiente turno.\n• Brillo cortante: infliges daño adicional a todas las demás criaturas enemigas a 5 pies o menos de ti.\n• Brillo móvil: obtienes los beneficios de desengancharte hasta el final de tu turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Florecimiento de la hoja Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Obtienes competencia con la armadura intermedia y la cimitarra. También puedes usar tu arma como foco de lanzamiento de conjuros para tus conjuros de bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Competencias adicionales diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt index 4be2945878..8b38bc38df 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activer/désactiver Master's Flourish Action/&MasterfulWhirlToggleTitle=L'épanouissement du Maître Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Lancez un jet de prospérité vers AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Épanouissement défensif -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=À chaque fois que vous effectuez l'action Attaquer pendant votre tour, votre vitesse de marche augmente de 3 mètres jusqu'à la fin du tour, et si une attaque d'arme de mêlée que vous effectuez dans le cadre de cette action touche une créature, vous pouvez dépenser une utilisation de votre Inspiration bardique pour que l'arme inflige des dégâts supplémentaires à la cible que vous touchez. Les dégâts sont égaux au nombre obtenu sur le dé d'Inspiration bardique. Vous choisissez également une manœuvre particulière :\n• Épanouissement défensif : vous ajoutez le jet de dé d'Inspiration bardique à votre CA jusqu'au début de votre prochain tour.\n• Épanouissement tranchant : vous infligez les dégâts supplémentaires à toutes les autres créatures ennemies à 1,5 mètre de vous.\n• Épanouissement mobile : vous bénéficiez des avantages du désengagement jusqu'à la fin de votre tour. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=À chaque fois que vous effectuez l'action Attaquer pendant votre tour, votre vitesse de marche augmente de 3 mètres jusqu'à la fin du tour, et si une attaque d'arme que vous effectuez dans le cadre de cette action touche une créature, vous pouvez dépenser une utilisation de votre Inspiration bardique pour que l'arme inflige des dégâts supplémentaires à la cible que vous touchez. Les dégâts sont égaux au nombre obtenu sur le dé d'Inspiration bardique. Vous choisissez également une manœuvre particulière :\n• Épanouissement défensif : vous ajoutez le jet de dé d'Inspiration bardique à votre CA jusqu'au début de votre prochain tour.\n• Épanouissement tranchant : vous infligez les dégâts supplémentaires à toutes les autres créatures ennemies à 1,5 mètre de vous.\n• Épanouissement mobile : vous bénéficiez des avantages du désengagement jusqu'à la fin de votre tour. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Épanouissement de la lame Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Vous maîtrisez l'armure intermédiaire et le cimeterre. Vous pouvez également utiliser votre arme comme point focal pour vos sorts de barde. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Compétences bonus diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt index 6c8ab6b744..f2e6e99e7b 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Attiva/disattiva Master's Flourish Action/&MasterfulWhirlToggleTitle=Il fiore del maestro Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Passare al rullo AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Fioritura difensiva -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Ogni volta che esegui l'azione Attacco nel tuo turno, la tua velocità di camminata aumenta di 3 metri fino alla fine del turno e se un attacco con arma da mischia effettuato come parte di questa azione colpisce una creatura, puoi spendere un uso della tua abilità Bardica. Ispirazione per far sì che l'arma infligga danni extra al bersaglio colpito. Il danno è pari al numero ottenuto con il dado di Ispirazione Bardica. Scegli anche una manovra particolare:\n• Fioritura difensiva: aggiungi il tiro di dado Ispirazione bardica alla tua AC fino all'inizio del tuo turno successivo.\n• Fioritura tagliente b>: infliggi danni extra a tutte le altre creature nemiche entro 5 piedi da te.\n• Mobile Flourish: ottieni i benefici del disimpegno fino alla fine del tuo turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Ogni volta che esegui l'azione Attacco nel tuo turno, la tua velocità di camminata aumenta di 10 piedi fino alla fine del turno e se un attacco con arma che esegui come parte di questa azione colpisce una creatura, puoi spendere un uso della tua Ispirazione Bardica per far sì che l'arma infligga danni extra al bersaglio colpito. Il danno è pari al numero che tiri sul dado Ispirazione Bardica. Scegli anche una manovra particolare:\n• Prosperare Difensivo: aggiungi il tiro del dado Ispirazione Bardica alla tua CA fino all'inizio del tuo prossimo turno.\n• Prosperare Tagliente: infliggi danni extra a tutte le altre creature nemiche entro 5 piedi da te.\n• Prosperare Mobile: ottieni i benefici del disimpegno fino alla fine del tuo turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Lama prospera Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Ottieni competenza con armature medie e scimitarra. Puoi anche usare la tua arma come focus di lancio di incantesimi per i tuoi incantesimi da bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Competenze bonus diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt index a445647efd..f0017b4557 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=マスターの華麗さを有効化/無 Action/&MasterfulWhirlToggleTitle=マスターの華麗 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=AC にフローリッシュロールします。 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=防御の華麗さ -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=自分のターンに攻撃アクションを行うたびに、そのターンの終了時まで歩行速度が 10 フィート増加し、このアクションの一環として行う近接武器攻撃がクリーチャーに命中した場合、バード インスピレーションの使用回数を 1 回消費して、その武器が命中したターゲットに追加のダメージを与えるようにすることができます。ダメージはバード インスピレーション ダイスの出目と同じです。また、特定の戦技を選択します:\n• 防御的華麗: 次のターンの開始時まで、バード インスピレーション ダイスの出目を AC に追加します。\n• 斬撃的華麗: 5 フィート以内にいる他のすべての敵クリーチャーに追加のダメージを与えます。\n• 機動的華麗: ターンの終了時まで、離脱の利益を得ます。 +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=自分のターンに攻撃アクションを行うたびに、そのターンの終了時まで歩行速度が 10 フィート増加し、このアクションの一環として行う武器攻撃がクリーチャーに命中した場合、バード インスピレーションの使用回数を 1 回消費して、その武器が命中したターゲットに追加のダメージを与えるようにすることができます。ダメージはバード インスピレーション ダイスの出目と同じです。また、特定の戦技を選択します:\n• 防御的華麗: 次のターンの開始時まで、バード インスピレーション ダイスの出目を AC に追加します。\n• 斬撃的華麗: 5 フィート以内にいる他のすべての敵クリーチャーに追加のダメージを与えます。\n• 機動的華麗: ターンの終了時まで、離脱の利益を得ます。 Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=ブレード・フラリッシュ Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=中装鎧とシミターの熟練度を獲得します。また、武器をバード呪文の呪文発動の焦点として使用することもできます。 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=ボーナス熟練度 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt index b751b62542..3a00e73aa0 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=마스터의 번영 활성화/비활성 Action/&MasterfulWhirlToggleTitle=마스터의 번영 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=AC로 플로리쉬 롤을 합니다. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=방어적인 번영 -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=당신의 턴에 공격 행동을 취할 때마다, 당신의 걷는 속도는 턴이 끝날 때까지 10피트 증가하며, 이 행동의 일부로 하는 근접 무기 공격이 생물에 명중하면 Bardic을 한 번 사용할 수 있습니다. 무기가 명중한 대상에게 추가 피해를 주도록 영감을 줍니다. 피해는 Bardic Inspiration 주사위에 굴린 숫자와 같습니다. 다음과 같은 특정 동작도 선택합니다.\n• 방어적 번영: 다음 턴이 시작될 때까지 AC에 음유시인 영감 주사위 굴림을 추가합니다.\n• 번영 베기 b>: 당신은 당신으로부터 5피트 내의 다른 모든 적 생물에게 추가 피해를 줍니다.\n• 이동 번영: 당신은 턴이 끝날 때까지 교전 해제 혜택을 얻습니다. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=턴에 공격 액션을 취할 때마다 턴이 끝날 때까지 걷는 속도가 10피트 증가하고, 이 액션의 일부로 하는 무기 공격이 생물을 맞히면, 바드 영감 한 번을 사용하여 맞힌 대상에게 무기가 추가 피해를 입힐 수 있습니다. 피해는 바드 영감 주사위에서 굴린 숫자와 같습니다. 또한 특정 기동을 선택합니다.\n• 방어적 번영: 다음 턴이 시작될 때까지 바드 영감 주사위 굴림을 AC에 추가합니다.\n• 베기 번영: 5피트 이내의 다른 모든 적 생물에게 추가 피해를 입힙니다.\n• 이동적 번영: 턴이 끝날 때까지 이탈의 혜택을 얻습니다. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=블레이드 플로리쉬 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=당신은 중간 갑옷과 시미터에 능숙해집니다. 무기를 음유시인 주문의 주문 시전 초점으로 사용할 수도 있습니다. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=보너스 숙련도 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt index 30d224d3e5..6b2bf2e9ab 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Ativar/desativar o Florescimento do Mest Action/&MasterfulWhirlToggleTitle=O florescimento do mestre Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Rolo de florescimento para CA. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Florescimento Defensivo -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Sempre que você realiza a ação de Ataque em seu turno, sua velocidade de caminhada aumenta em 3 metros até o final do turno, e se um ataque com arma corpo a corpo que você fizer como parte desta ação atingir uma criatura, você pode gastar um uso de seu Bardo. Inspiração para fazer com que a arma cause dano extra ao alvo atingido. O dano é igual ao número obtido no dado de Inspiração de Bardo. Você também escolhe uma manobra específica:\n• Florescimento Defensivo: você adiciona o teste de Inspiração de Bardo à sua CA até o início do seu próximo turno.\n• Florescimento Cortante: Você causa o dano extra a todas as outras criaturas inimigas a até 1,5 metro de você.\n• Florescimento Móvel: Você ganha benefícios de desengajamento até o final do seu turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Sempre que você realiza a ação Ataque no seu turno, sua velocidade de caminhada aumenta em 10 pés até o final do turno, e se um ataque de arma que você faz como parte desta ação atingir uma criatura, você pode gastar um uso de sua Inspiração Bárdica para fazer com que a arma cause dano extra ao alvo que você atingiu. O dano é igual ao número que você rola no dado de Inspiração Bárdica. Você também escolhe uma manobra específica:\n• Florescimento Defensivo: Você adiciona a rolagem do dado de Inspiração Bárdica à sua CA até o início do seu próximo turno.\n• Florescimento Cortante: Você causa o dano extra a todas as outras criaturas inimigas a até 5 pés de você.\n• Florescimento Móvel: Você ganha os benefícios de desengajar até o final do seu turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Lâmina florescer Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Você ganha proficiência com armadura média e a cimitarra. Você também pode usar sua arma como foco de conjuração para suas magias de bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Proficiências Bônus diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt index dea2a25cbf..87a7f039e2 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt @@ -4,6 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Начать/отменить Масте Action/&MasterfulWhirlToggleTitle=Мастерский росчерк Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Бросок Росчерка прибавляется к КД. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Оборонительный росчерк +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Всякий раз, когда вы совершаете действие Атака в свой ход, ваша скорость ходьбы увеличивается на 10 футов до конца хода, и если атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одно использование своего Вдохновения Барда, чтобы оружие нанесло дополнительный урон цели, по которой вы попали. Урон равен числу, которое вы выбросили на кубике Вдохновения Барда. Вы также выбираете определенный маневр:\n• Защитный росчерк: вы добавляете бросок кубика Вдохновения Барда к своему AC до начала следующего хода.\n• Рубашечный росчерк: вы наносите дополнительный урон всем другим вражеским существам в радиусе 5 футов от вас.\n• Подвижный росчерк: вы получаете преимущества отрыва до конца своего хода. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Каждый раз, когда вы совершаете действие Атака в свой ход, ваша скорость передвижения увеличивается на 10 футов до конца хода, и если рукопашная атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одну кость вашего Бардовского вдохновения, чтобы заставить оружие нанести дополнительный урон цели, по которой вы попали. Урон равен числу, выпавшему на кости Бардовского вдохновения. Вы также можете выбрать определённый манёвр:\n• Оборонительный росчерк: Вы добавляете бросок кости Бардовского вдохновения к вашему КД до начала вашего следующего хода.\n• Режущий росчерк: Вы наносите дополнительный урон всем другим враждебным существам в радиусе 5 футов от вас.\n• Мобильный росчерк: Вы получаете преимущества действия Отход до конца вашего хода. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Росчерк клинка Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Вы получаете владение средними доспехами и скимитарами. Вы также можете использовать ваше оружие в качестве заклинательной фокусировки ваших заклинаний барда. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt index 82fd7cc1a4..810d8aba0a 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=激活/停用大师的繁荣 Action/&MasterfulWhirlToggleTitle=大师的辉煌 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=繁荣昌盛,卷入 AC。 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=防守蓬勃发展 -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=每当您在自己的回合中采取攻击行动时,您的行走速度都会增加 10 英尺,直到回合结束为止。如果您在此行动中进行的近战武器攻击击中了生物,您可以消耗一次吟游诗人灵感,使武器对击中的目标造成额外伤害。伤害等于您在吟游诗人灵感骰子上掷出的数值。您还可以选择一种特定的动作:\n• 防御性华丽:您将吟游诗人灵感骰子掷出的数值添加到您的 AC 中,直到您的下一回合开始为止。\n• 挥砍华丽:您对您 5 英尺范围内的所有其他敌方生物造成额外伤害。\n• 移动华丽:您获得脱离的好处,直到回合结束为止。 +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=每当您在自己的回合中采取攻击行动时,您的行走速度都会增加 10 英尺,直到回合结束为止。如果您在此行动中进行的武器攻击击中了生物,您可以消耗一次吟游诗人灵感,使武器对击中的目标造成额外伤害。伤害等于您在吟游诗人灵感骰子上掷出的数值。您还可以选择一种特定的动作:\n• 防御性华丽:您将吟游诗人灵感骰子掷出的数值添加到您的 AC 中,直到您的下一回合开始为止。\n• 挥砍华丽:您对您 5 英尺范围内的所有其他敌方生物造成额外伤害。\n• 移动华丽:您获得脱离的好处,直到回合结束为止。 Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=剑刃绽放 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=你熟练掌握中型盔甲和弯刀。你还可以使用你的武器作为吟游诗人法术的施法焦点。 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=奖励熟练度 From 26786b804867355b90aae3218b82a1c4a481146a Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 14:16:54 -0700 Subject: [PATCH 123/162] add additional usages of MyExecuteAction --- .../ChangelogHistory.txt | 1 + .../Feats/MeleeCombatFeats.cs | 20 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 18 +- .../Models/CharacterUAContext.cs | 18 +- .../Models/FixesContext.cs | 19 +- .../Models/Level20SubclassesContext.cs | 17 +- .../Spells/SpellBuildersCantrips.cs | 34 +-- .../Spells/SpellBuildersLevel03.cs | 228 ++++++++---------- .../Spells/SpellBuildersLevel04.cs | 17 +- .../Builders/InvocationsBuilders.cs | 20 +- .../Subclasses/CircleOfTheCosmos.cs | 14 +- .../Subclasses/CircleOfTheForestGuardian.cs | 19 +- .../Subclasses/OathOfDread.cs | 19 +- .../Subclasses/PathOfTheReaver.cs | 19 +- .../Subclasses/WayOfTheDiscordance.cs | 21 +- .../Subclasses/WayOfTheDragon.cs | 17 +- .../Subclasses/WayOfTheWealAndWoe.cs | 20 +- 17 files changed, 177 insertions(+), 344 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 3d31da9255..ec1ca4a59f 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -3,6 +3,7 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 +- fixed College of Swords flourish description - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index fe1691430c..e2e5bfacf0 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -1492,9 +1492,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var attackModifier = action.ActionParams.ActionModifiers[0]; var modifier = attackMode.ToHitBonus + attackModifier.AttackRollModifier; var advantageType = ComputeAdvantage(attackModifier.attackAdvantageTrends); @@ -1543,18 +1540,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( } var usablePower = PowerProvider.Get(power, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } } diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index bcf91b06c7..6a58e312ef 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2551,22 +2551,12 @@ private static IEnumerator PoisonTarget(GameLocationCharacter me, GameLocationCh yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(PowerFeatPoisonousSkin, rulesetMe); - var actionParams = new CharacterActionParams(me, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetMe, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { target } - }; - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + me.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [target]); } //Poison character that shoves me diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index 2c6f868e62..03d53ea426 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -1622,22 +1622,12 @@ private IEnumerator HandleKnockOut(GameLocationCharacter attacker, GameLocationC } var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerKnockOutApply, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } } diff --git a/SolastaUnfinishedBusiness/Models/FixesContext.cs b/SolastaUnfinishedBusiness/Models/FixesContext.cs index c3fda886c9..abc61af898 100644 --- a/SolastaUnfinishedBusiness/Models/FixesContext.cs +++ b/SolastaUnfinishedBusiness/Models/FixesContext.cs @@ -728,21 +728,12 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(PowerMonkStunningStrike, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.SpendPower) - { - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 55137363b9..bb802e00e0 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -1983,21 +1983,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, // takes 10d10 Necrotic if (action.SaveOutcome is RollOutcome.Success or RollOutcome.CriticalSuccess) { - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerQuiveringPalmDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { target } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [target]); yield break; } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs index 64cb999734..958abfd8d9 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs @@ -1035,21 +1035,12 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) rulesetDefender.RemoveCondition(activeCondition); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerBoomingBladeDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } } @@ -1287,21 +1278,12 @@ rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess)) yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerResonatingStrikeDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { secondDefender } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [secondDefender]); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 9a439c88f3..d558aaffdb 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -153,100 +153,6 @@ internal static SpellDefinition BuildBlindingSmite() #endregion - #region Corrupting Bolt - - internal static SpellDefinition BuildCorruptingBolt() - { - const string Name = "CorruptingBolt"; - - var conditionCorruptingBolt = ConditionDefinitionBuilder - .Create(ConditionEyebiteSickened, $"Condition{Name}") - .SetGuiPresentation(Category.Condition, ConditionDoomLaughter) - .SetConditionType(ConditionType.Detrimental) - .SetFeatures( - DatabaseRepository.GetDatabase() - .Select(damageDefinition => - FeatureDefinitionDamageAffinityBuilder - .Create($"DamageAffinity{Name}{damageDefinition.Name}") - .SetGuiPresentationNoContent(true) - .SetDamageAffinityType(DamageAffinityType.Vulnerability) - .SetDamageType(damageDefinition.Name) - .AddToDB())) - .AddToDB(); - - var spell = SpellDefinitionBuilder - .Create(Name) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(Name, Resources.CorruptingBolt, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolNecromancy) - .SetSpellLevel(3) - .SetCastingTime(ActivationTime.Action) - .SetMaterialComponent(MaterialComponentType.Mundane) - .SetVerboseComponent(true) - .SetSomaticComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetEffectDescription( - EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) - .SetTargetingData(Side.Enemy, RangeType.RangeHit, 24, TargetType.IndividualsUnique) - .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) - .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, - EffectDifficultyClassComputation.SpellCastingFeature) - .SetEffectForms( - EffectFormBuilder.DamageForm(DamageTypeNecrotic, 4, DieType.D8), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.Negates) - .SetConditionForm(conditionCorruptingBolt, ConditionForm.ConditionOperation.Add) - .Build()) - .SetParticleEffectParameters(FingerOfDeath) - .SetImpactEffectParameters(Disintegrate) - .SetEffectEffectParameters(Disintegrate) - .Build()) - .AddToDB(); - - return spell; - } - - private sealed class CustomBehaviorCorruptingBolt : IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe - { - public IEnumerator OnPhysicalAttackFinishedOnMe( - GameLocationBattleManager battleManager, - CharacterAction action, - GameLocationCharacter attacker, - GameLocationCharacter defender, - RulesetAttackMode attackMode, - RollOutcome rollOutcome, - int damageAmount) - { - var rulesetDefender = defender.RulesetCharacter; - - rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); - - yield break; - } - - public IEnumerator OnMagicEffectFinishedOnMe( - CharacterActionMagicEffect action, - GameLocationCharacter attacker, - GameLocationCharacter defender, - List targets) - { - var rulesetEffect = action.ActionParams.RulesetEffect; - - if (rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) - { - yield break; - } - - var rulesetDefender = defender.RulesetCharacter; - - rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); - } - } - - #endregion - #region Crusaders Mantle internal static SpellDefinition BuildCrusadersMantle() @@ -402,6 +308,102 @@ internal static SpellDefinition BuildWinterBreath() #endregion + #region Corrupting Bolt + + internal static SpellDefinition BuildCorruptingBolt() + { + const string Name = "CorruptingBolt"; + + var conditionCorruptingBolt = ConditionDefinitionBuilder + .Create(ConditionEyebiteSickened, $"Condition{Name}") + .SetGuiPresentation(Category.Condition, ConditionDoomLaughter) + .SetConditionType(ConditionType.Detrimental) + .SetFeatures( + DatabaseRepository.GetDatabase() + .Select(damageDefinition => + FeatureDefinitionDamageAffinityBuilder + .Create($"DamageAffinity{Name}{damageDefinition.Name}") + .SetGuiPresentationNoContent(true) + .SetDamageAffinityType(DamageAffinityType.Vulnerability) + .SetDamageType(damageDefinition.Name) + .AddToDB())) + .AddToDB(); + + var spell = SpellDefinitionBuilder + .Create(Name) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(Name, Resources.CorruptingBolt, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolNecromancy) + .SetSpellLevel(3) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetVerboseComponent(true) + .SetSomaticComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn) + .SetTargetingData(Side.Enemy, RangeType.RangeHit, 24, TargetType.IndividualsUnique) + .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel, additionalDicePerIncrement: 1) + .SetSavingThrowData(false, AttributeDefinitions.Constitution, false, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder.DamageForm(DamageTypeNecrotic, 4, DieType.D8), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates) + .SetConditionForm(conditionCorruptingBolt, ConditionForm.ConditionOperation.Add) + .Build()) + .SetParticleEffectParameters(FingerOfDeath) + .SetImpactEffectParameters(Disintegrate) + .SetEffectEffectParameters(Disintegrate) + .Build()) + .AddToDB(); + + return spell; + } + + private sealed class CustomBehaviorCorruptingBolt : IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe + { + public IEnumerator OnMagicEffectFinishedOnMe( + CharacterActionMagicEffect action, + GameLocationCharacter attacker, + GameLocationCharacter defender, + List targets) + { + var rulesetEffect = action.ActionParams.RulesetEffect; + + if (rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) + { + yield break; + } + + var rulesetDefender = defender.RulesetCharacter; + + rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, + "ConditionCorruptingBolt"); + } + + public IEnumerator OnPhysicalAttackFinishedOnMe( + GameLocationBattleManager battleManager, + CharacterAction action, + GameLocationCharacter attacker, + GameLocationCharacter defender, + RulesetAttackMode attackMode, + RollOutcome rollOutcome, + int damageAmount) + { + var rulesetDefender = defender.RulesetCharacter; + + rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, + "ConditionCorruptingBolt"); + + yield break; + } + } + + #endregion + #region Ashardalon's Stride internal static SpellDefinition BuildAshardalonStride() @@ -1204,25 +1206,14 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter character) var rulesetCaster = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); var caster = GameLocationCharacter.GetFromActor(rulesetCaster); - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerHungerOfTheVoidDamageAcid, rulesetCaster); usablePower.SaveDC = 8 + activeCondition.SourceAbilityBonus + activeCondition.SourceProficiencyBonus; - var actionParams = new CharacterActionParams(caster, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + caster.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [character]); } public void OnCharacterTurnStarted(GameLocationCharacter character) @@ -1237,25 +1228,14 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) var rulesetCaster = EffectHelpers.GetCharacterByGuid(activeCondition.SourceGuid); var caster = GameLocationCharacter.GetFromActor(rulesetCaster); - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerHungerOfTheVoidDamageCold, rulesetCaster); usablePower.SaveDC = 8 + activeCondition.SourceAbilityBonus + activeCondition.SourceProficiencyBonus; - var actionParams = new CharacterActionParams(caster, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + caster.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [character]); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs index 65ae032ab1..db1c50d404 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs @@ -1307,21 +1307,12 @@ private void DamageReceivedHandler( 0, 0); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerElementalBane, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteAction( + Id.PowerNoCost, + usablePower, + [defender]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index dfb3b7d684..9ebcb646d6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -769,22 +769,12 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) } var caster = GameLocationCharacter.GetFromActor(rulesetCaster); - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerPerniciousCloakDamage, rulesetCaster); - var actionParams = new CharacterActionParams(caster, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + caster.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [character]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs index 65296df205..0381d18de6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs @@ -1244,16 +1244,10 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, effectPower.remainingRounds = remainingRounds; - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = effectPower, - UsablePower = usablePower, - TargetCharacters = { actingCharacter } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [actingCharacter]); usablePower.RepayUse(); } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs index 35faebc358..a78a682433 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs @@ -234,21 +234,12 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerImprovedBarkWardDamage, rulesetDefender); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [attacker]); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs index 8f95ea747b..839ea7aa39 100644 --- a/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs +++ b/SolastaUnfinishedBusiness/Subclasses/OathOfDread.cs @@ -333,21 +333,12 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) return; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerAuraOfDominationDamage, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [character]); } public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs index 8ec9250810..02dc2b7bc9 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheReaver.cs @@ -280,21 +280,12 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerCorruptedBlood, rulesetDefender); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [attacker]); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs index 59935b42dd..d02e45c17a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs @@ -426,23 +426,12 @@ private static void UsePower( FeatureDefinitionPower featureDefinitionPower) { var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs index 92fa1a6123..c5d5ddacdf 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs @@ -816,21 +816,12 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( yield break; } - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(powerReactiveHideDamage, rulesetDefender); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetDefender, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { attacker } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [attacker]); } public int HandlerPriority => 10; diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs index 2de9d42b18..993ebfa31c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs @@ -274,22 +274,12 @@ private static void InflictMartialArtDieDamage( } var rulesetAttacker = attacker.RulesetCharacter; - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetAttacker); - var actionParams = new CharacterActionParams(defender, ActionDefinitions.Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetAttacker, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { defender } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + defender.MyExecuteAction( + ActionDefinitions.Id.PowerNoCost, + usablePower, + [defender]); } } From 2d6d4c4a32a431c6c22bae2b12993a3c677c1ef9 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 15:42:27 -0700 Subject: [PATCH 124/162] improve Bladestorm feat with an additional BA attack as PAM --- .../UnfinishedBusinessBlueprints/Assets.txt | 1 + .../FeatWhirlWindAttackDex.json | 1 + ...eatureWhirlWindAttackExtraBonusAttack.json | 30 +++++++ .../Behaviors/AddExtraAttack.cs | 81 ++++++++++++++++--- .../ChangelogHistory.txt | 1 + .../Feats/MeleeCombatFeats.cs | 14 +++- .../Translations/de/Feats/MeleeCombat-de.txt | 2 +- .../Translations/en/Feats/MeleeCombat-en.txt | 2 +- .../Translations/es/Feats/MeleeCombat-es.txt | 2 +- .../Translations/fr/Feats/MeleeCombat-fr.txt | 2 +- .../Translations/it/Feats/MeleeCombat-it.txt | 2 +- .../Translations/ja/Feats/MeleeCombat-ja.txt | 2 +- .../Translations/ko/Feats/MeleeCombat-ko.txt | 2 +- .../pt-BR/Feats/MeleeCombat-pt-BR.txt | 2 +- .../Translations/ru/Feats/MeleeCombat-ru.txt | 2 +- .../zh-CN/Feats/MeleeCombat-zh-CN.txt | 2 +- 16 files changed, 126 insertions(+), 22 deletions(-) create mode 100644 Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinition/FeatureWhirlWindAttackExtraBonusAttack.json diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index 5ec6f43e18..da77ff26e1 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -2662,6 +2662,7 @@ FeatureWayOfZenArcheryFlurryOfArrows FeatureDefinition FeatureDefinition aa39733 FeatureWayOfZenArcheryKiEmpoweredArrows FeatureDefinition FeatureDefinition 37998ef5-a3d4-5e28-ae5d-0a31bdfe6115 FeatureWayOfZenArcheryUnerringPrecision FeatureDefinition FeatureDefinition cc60f69d-f5bd-590f-bf6c-e74f2c1af67f FeatureWendigoNaturalLunger FeatureDefinition FeatureDefinition bd3955cc-4299-54e5-8d3e-0b69fa9dd1dd +FeatureWhirlWindAttackExtraBonusAttack FeatureDefinition FeatureDefinition a88ebaf9-1b2e-5979-90a1-fd8b4ff3feeb FeatureWildlingClaws FeatureDefinition FeatureDefinition fbb8a01e-8eca-57d1-9963-0ccd16a789cc FeatureWizardSpellMastery FeatureDefinition FeatureDefinition 17f73bcd-e536-5b14-9222-7ba2edbf88ab FeatureZenArcher FeatureDefinitionAttackModifier FeatureDefinition e592b0d3-9a0c-56b4-b0ad-9aaca5718ccc diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatWhirlWindAttackDex.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatWhirlWindAttackDex.json index b7e5a1764a..58faf5b075 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatWhirlWindAttackDex.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatDefinition/FeatWhirlWindAttackDex.json @@ -12,6 +12,7 @@ "familyTag": "", "knownFeatsPrerequisite": [], "features": [ + "Definition:FeatureWhirlWindAttackExtraBonusAttack:a88ebaf9-1b2e-5979-90a1-fd8b4ff3feeb", "Definition:PowerWhirlWindAttack:8d198daa-c292-55c4-8ec3-f8a88cceef82" ], "guiPresentation": { diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinition/FeatureWhirlWindAttackExtraBonusAttack.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinition/FeatureWhirlWindAttackExtraBonusAttack.json new file mode 100644 index 0000000000..07586507c3 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinition/FeatureWhirlWindAttackExtraBonusAttack.json @@ -0,0 +1,30 @@ +{ + "$type": "FeatureDefinition, Assembly-CSharp", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "a88ebaf9-1b2e-5979-90a1-fd8b4ff3feeb", + "contentPack": 9999, + "name": "FeatureWhirlWindAttackExtraBonusAttack" +} \ No newline at end of file diff --git a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs index ee3f379055..c558d212ce 100644 --- a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs +++ b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs @@ -325,21 +325,80 @@ protected override List GetAttackModes([NotNull] RulesetChara var effectDamageForm = attackMode.EffectDescription.EffectForms .FirstOrDefault(x => x.FormType == EffectForm.EffectFormType.Damage); - if (effectDamageForm != null) - { + if (effectDamageForm == null || // ensures PAM interacts well with GWM - if (!hero.HasConditionOfCategoryAndType( - AttributeDefinitions.TagEffect, "ConditionFeatCleavingAttackFinish")) - { - effectDamageForm.DamageForm.DamageType = DamageTypeBludgeoning; - effectDamageForm.DamageForm.DieType = DieType.D4; - effectDamageForm.DamageForm.DiceNumber = 1; - } + hero.HasConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionFeatCleavingAttackFinish")) + { + return [attackMode]; + } + + effectDamageForm.DamageForm.DamageType = DamageTypeBludgeoning; + effectDamageForm.DamageForm.DieType = DieType.D4; + effectDamageForm.DamageForm.DiceNumber = 1; + effectDamageForm.DamageForm.versatile = false; + effectDamageForm.DamageForm.versatileDieType = effectDamageForm.DamageForm.DieType; + attackMode.AttackTags.Add(UpgradeWeaponDice.AbortUpgradeWeaponDice); + + return [attackMode]; + } +} + +internal sealed class AddWhirlWindFollowUpAttack : AddExtraAttackBase +{ + private readonly WeaponTypeDefinition _weaponTypeDefinition; - effectDamageForm.DamageForm.versatile = false; - effectDamageForm.DamageForm.versatileDieType = effectDamageForm.DamageForm.DieType; + internal AddWhirlWindFollowUpAttack(WeaponTypeDefinition weaponTypeDefinition) : base( + ActionDefinitions.ActionType.Bonus, + ValidatorsCharacter.HasUsedWeaponType(weaponTypeDefinition), + ValidatorsCharacter.HasMainHandWeaponType(weaponTypeDefinition)) + { + _weaponTypeDefinition = weaponTypeDefinition; + } + + protected override List GetAttackModes([NotNull] RulesetCharacter character) + { + if (character is not RulesetCharacterHero hero) + { + return null; + } + + var item = hero.CharacterInventory.InventorySlotsByName[EquipmentDefinitions.SlotTypeMainHand].EquipedItem; + + if (item == null || + !ValidatorsWeapon.IsWeaponType(item, _weaponTypeDefinition)) + { + return null; + } + + var strikeDefinition = item.ItemDefinition; + var attackMode = hero.RefreshAttackMode( + ActionType, + strikeDefinition, + strikeDefinition.WeaponDescription, + ValidatorsCharacter.IsFreeOffhand(hero), + true, + EquipmentDefinitions.SlotTypeMainHand, + hero.attackModifiers, + hero.FeaturesOrigin, + item + ); + + var effectDamageForm = attackMode.EffectDescription.EffectForms + .FirstOrDefault(x => x.FormType == EffectForm.EffectFormType.Damage); + + if (effectDamageForm == null || + // ensures WhirlWind interacts well with GWM + hero.HasConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionFeatCleavingAttackFinish")) + { + return [attackMode]; } + effectDamageForm.DamageForm.DieType = DieType.D4; + effectDamageForm.DamageForm.DiceNumber = 1; + effectDamageForm.DamageForm.versatile = false; + effectDamageForm.DamageForm.versatileDieType = effectDamageForm.DamageForm.DieType; attackMode.AttackTags.Add(UpgradeWeaponDice.AbortUpgradeWeaponDice); return [attackMode]; diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index ec1ca4a59f..0aeef3aaeb 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -10,6 +10,7 @@ - fixed Time Stop spell to work as in tabletop - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 +- improved Bladestorm feat with an additional BA attack as PAM KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index e2e5bfacf0..5e425c90ce 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -1901,11 +1901,20 @@ private static FeatDefinition BuildWhirlWindAttack() new PowerOrSpellFinishedByMeWhirlWindAttack()) .AddToDB(); + var featureExtraBonusAttack = FeatureDefinitionBuilder + .Create($"Feature{NAME}ExtraBonusAttack") + .SetGuiPresentationNoContent(true) + .AddCustomSubFeatures( + new AddWhirlWindFollowUpAttack(GreatswordType), + new AddWhirlWindFollowUpAttack(MaulType), + new AddWhirlWindFollowUpAttack(GreataxeType)) + .AddToDB(); + // name kept for backward compatibility return FeatDefinitionBuilder .Create("FeatWhirlWindAttackDex") .SetGuiPresentation($"Feat{NAME}", Category.Feat) - .SetFeatures(powerWhirlWindAttack) + .SetFeatures(powerWhirlWindAttack, featureExtraBonusAttack) .AddToDB(); } @@ -1940,7 +1949,9 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, attackMode.ActionType = ActionDefinitions.ActionType.NoCost; //remove additional ability score modifier damage +#if false var damageForm = attackMode.EffectDescription.FindFirstDamageForm(); + var modifier = AttributeDefinitions.ComputeAbilityScoreModifier( actingCharacter.RulesetCharacter.TryGetAttributeValue(attackMode.AbilityScore)); @@ -1948,6 +1959,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { damageForm.BonusDamage -= modifier; } +#endif actingCharacter.BurnOneMainAttack(); actingCharacter.UsedSpecialFeatures.TryAdd("PowerWhirlWindAttack", 0); diff --git a/SolastaUnfinishedBusiness/Translations/de/Feats/MeleeCombat-de.txt b/SolastaUnfinishedBusiness/Translations/de/Feats/MeleeCombat-de.txt index 5569844798..2127493263 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Feats/MeleeCombat-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Feats/MeleeCombat-de.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Sie haben gelernt, wo Sie schneiden müssen, um Feat/&FeatSlasherStrTitle=Schlitzer [Str] Feat/&FeatSpearMasteryDescription=Obwohl der Speer eine leicht zu erlernende Waffe ist, belohnt er Sie für die Zeit, die Sie aufgewendet haben, um ihn zu meistern:\n• Sie erhalten einen Bonus von +1 auf Angriffswürfe, die Sie mit einem Speer machen, und sein Schadenswürfel ändert sich von W6 zu W8 und von W8 zu W10, wenn er mit beiden Händen geführt wird.\n• Als Bonusaktion können Sie Ihren Speer abstützen, um sich nähernde Feinde abzufangen. Sie können eine Reaktion nutzen, um mit einem Speer einen Gelegenheitsangriff auf einen Feind auszuführen, der in Ihre Reichweite kommt, und einen zusätzlichen Schadenswürfel zu verursachen, wenn dieser Angriff trifft.\n• Als Bonusaktion können Sie Ihre Reichweite mit einem Speer für den Rest Ihres Zuges um 1,52 m erhöhen. Feat/&FeatSpearMasteryTitle=Speerbeherrschung -Feat/&FeatWhirlWindAttackDescription=Einmal während deines Zuges, wenn du die Angriffsaktion ausführst, während du ein Großschwert, eine Großaxt oder einen Streithammer schwingst, kannst du einen Angriff ersetzen, indem du stattdessen einen Bladestorm-Angriff startest. Bladestorm führt einen Angriffswurf gegen alle feindlichen Kreaturen innerhalb von 5 Fuß von dir aus, fügt aber deinen Attributmodifikator nicht zum verursachten Schaden hinzu (es sei denn, dieser Modifikator ist negativ). +Feat/&FeatWhirlWindAttackDescription=Sie werden zum Meister des wirbelnden Todes und erhalten die folgenden Vorteile, wenn Sie ein Großschwert, eine Großaxt oder einen Streitkolben tragen:\n• Wenn Sie die Angriffsaktion ausführen und mit der Waffe angreifen, können Sie eine Bonusaktion verwenden, um einen schnellen Nahkampfangriff mit der Waffe auszuführen. Dieser Angriff verwendet denselben Fähigkeitsmodifikator wie der primäre Angriff und verursacht 1W4 Schaden desselben Typs wie die getragene Waffe.\n• Einmal während Ihres Zuges, wenn Sie die Angriffsaktion mit der Waffe ausführen, können Sie einen Angriff ersetzen, um stattdessen alle feindlichen Kreaturen innerhalb eines Umkreises von 1,50 m um Sie herum anzugreifen. Feat/&FeatWhirlWindAttackTitle=Klingensturm Feature/&AttackModifierFeatSpearMasteryDescription=Sie erhalten einen Bonus von +1 auf Angriffswürfe, die Sie mit einem Speer durchführen, und sein Schadenswürfel ändert sich von W6 zu W8 und von W8 zu W10, wenn Sie ihn mit beiden Händen führen. Feature/&AttackModifierFeatSpearMasteryTitle=Speerbeherrschung diff --git a/SolastaUnfinishedBusiness/Translations/en/Feats/MeleeCombat-en.txt b/SolastaUnfinishedBusiness/Translations/en/Feats/MeleeCombat-en.txt index 26c9f77554..63cdecfc47 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Feats/MeleeCombat-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Feats/MeleeCombat-en.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=You've learned where to cut to have the greatest Feat/&FeatSlasherStrTitle=Slasher [Str] Feat/&FeatSpearMasteryDescription=Though the spear is a simple weapon to learn, it rewards you for the time you have taken to master it:\n• You gain a +1 bonus to attack rolls you make with a spear and its damage die changes from a d6 to a d8, and from a d8 to a d10 when wielded with two hands.\n• As a bonus action you can brace your spear to intercept approaching enemies. You can use reaction to perform attack of opportunity with a spear on enemy that enters your reach and deal extra die of damage if that attack hits.\n• As a bonus action, you can increase your reach with a spear by 5 ft for the rest of your turn. Feat/&FeatSpearMasteryTitle=Spear Mastery -Feat/&FeatWhirlWindAttackDescription=Once during your turn when you take the Attack action while wielding a greatsword, greataxe or maul, you can replace one attack to instead launch a Bladestorm attack. Bladestorm makes one attack roll against all enemy creatures within 5ft of you but doesn't add your attribute modifier to damage dealt (unless that modifier is negative). +Feat/&FeatWhirlWindAttackDescription=You become a master of whirling death, gaining the following benefits while wielding a greatsword, greataxe or maul:\n• When you take the Attack action and attack with the weapon, you can use a bonus action to make a quick melee attack with the weapon. This attack uses the same ability modifier as the primary attack and deals 1d4 damage of the same type as the wielded weapon.\n• Once during your turn when you take the Attack action with the weapon, you can replace one attack to instead attack all enemy creatures within 5ft of you. Feat/&FeatWhirlWindAttackTitle=Bladestorm Feature/&AttackModifierFeatSpearMasteryDescription=You gain a +1 bonus to attack rolls you make with a spear and its damage die changes from a d6 to a d8, and from a d8 to a d10 when wielded with two hands. Feature/&AttackModifierFeatSpearMasteryTitle=Spear Mastery diff --git a/SolastaUnfinishedBusiness/Translations/es/Feats/MeleeCombat-es.txt b/SolastaUnfinishedBusiness/Translations/es/Feats/MeleeCombat-es.txt index 6d33976b0d..02eacdd704 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Feats/MeleeCombat-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Feats/MeleeCombat-es.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Has aprendido dónde cortar para obtener los mej Feat/&FeatSlasherStrTitle=Cortador [Fuerza] Feat/&FeatSpearMasteryDescription=Aunque la lanza es un arma sencilla de aprender, te recompensa por el tiempo que te ha llevado dominarla:\n• Obtienes un bonificador de +1 a las tiradas de ataque que hagas con una lanza y su dado de daño cambia de un d6 a un d8, y de un d8 a un d10 cuando se maneja con dos manos.\n• Como acción adicional, puedes apuntalar tu lanza para interceptar a los enemigos que se acerquen. Puedes usar la reacción para realizar un ataque de oportunidad con una lanza a un enemigo que entre en tu alcance y causar un dado de daño adicional si ese ataque impacta.\n• Como acción adicional, puedes aumentar tu alcance con una lanza en 5 pies durante el resto de tu turno. Feat/&FeatSpearMasteryTitle=Maestría en lanza -Feat/&FeatWhirlWindAttackDescription=Una vez durante tu turno, cuando realizas la acción de Ataque mientras empuñas un espadón, un hacha o un mazo, puedes reemplazar un ataque para lanzar en su lugar un ataque de Tormenta de cuchillas. Tormenta de cuchillas realiza una tirada de ataque contra todas las criaturas enemigas a 5 pies o menos de ti, pero no suma tu modificador de atributo al daño infligido (a menos que ese modificador sea negativo). +Feat/&FeatWhirlWindAttackDescription=Te conviertes en un maestro de la muerte giratoria, y obtienes los siguientes beneficios mientras empuñas una espada larga, un hacha larga o un mazo:\n• Cuando realizas la acción de Ataque y atacas con el arma, puedes usar una acción adicional para realizar un ataque cuerpo a cuerpo rápido con el arma. Este ataque usa el mismo modificador de característica que el ataque principal e inflige 1d4 de daño del mismo tipo que el arma empuñada.\n• Una vez durante tu turno, cuando realizas la acción de Ataque con el arma, puedes reemplazar un ataque para atacar en su lugar a todas las criaturas enemigas a 5 pies o menos de ti. Feat/&FeatWhirlWindAttackTitle=Tormenta de cuchillas Feature/&AttackModifierFeatSpearMasteryDescription=Obtienes una bonificación de +1 a las tiradas de ataque que realizas con una lanza y su dado de daño cambia de d6 a d8, y de d8 a d10 cuando se empuña con las dos manos. Feature/&AttackModifierFeatSpearMasteryTitle=Maestría en lanza diff --git a/SolastaUnfinishedBusiness/Translations/fr/Feats/MeleeCombat-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Feats/MeleeCombat-fr.txt index baec087afd..a5d514d8be 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Feats/MeleeCombat-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Feats/MeleeCombat-fr.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Vous avez appris où couper pour obtenir les mei Feat/&FeatSlasherStrTitle=Slasher [Str] Feat/&FeatSpearMasteryDescription=Bien que la lance soit une arme simple à apprendre, elle vous récompense pour le temps que vous avez passé à la maîtriser :\n• Vous obtenez un bonus de +1 aux jets d'attaque que vous effectuez avec une lance et son dé de dégâts passe d'un d6 à un d8, et d'un d8 à un d10 lorsqu'elle est maniée à deux mains.\n• En tant qu'action bonus, vous pouvez tendre votre lance pour intercepter les ennemis qui approchent. Vous pouvez utiliser la réaction pour effectuer une attaque d'opportunité avec une lance sur un ennemi qui entre dans votre portée et infliger un dé de dégâts supplémentaire si cette attaque touche.\n• En tant qu'action bonus, vous pouvez augmenter votre portée avec une lance de 1,50 m pour le reste de votre tour. Feat/&FeatSpearMasteryTitle=Maîtrise de la lance -Feat/&FeatWhirlWindAttackDescription=Une fois pendant votre tour, lorsque vous effectuez l'action Attaquer en brandissant une épée à deux mains, une hache à deux mains ou un maillet, vous pouvez remplacer une attaque par une attaque Tempête de lames. Tempête de lames effectue un jet d'attaque contre toutes les créatures ennemies à 1,5 m de vous mais n'ajoute pas votre modificateur d'attribut aux dégâts infligés (à moins que ce modificateur ne soit négatif). +Feat/&FeatWhirlWindAttackDescription=Vous devenez un maître de la mort tourbillonnante et bénéficiez des avantages suivants lorsque vous maniez une grande épée, une grande hache ou un maul :\n• Lorsque vous effectuez l'action Attaque et attaquez avec l'arme, vous pouvez utiliser une action bonus pour effectuer une attaque rapide au corps à corps avec l'arme. Cette attaque utilise le même modificateur de capacité que l'attaque principale et inflige 1d4 dégâts du même type que l'arme maniée.\n• Une fois pendant votre tour, lorsque vous effectuez l'action d'attaque avec l'arme, vous pouvez remplacer une attaque pour attaquer à la place. toutes les créatures ennemies à moins de 1,50 m de vous. Feat/&FeatWhirlWindAttackTitle=Tempête lame Feature/&AttackModifierFeatSpearMasteryDescription=Vous obtenez un bonus de +1 aux jets d'attaque que vous effectuez avec une lance et son dé de dégâts passe d'un d6 à un d8, et d'un d8 à un d10 lorsqu'elle est maniée à deux mains. Feature/&AttackModifierFeatSpearMasteryTitle=Maîtrise de la lance diff --git a/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt b/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt index 3259bd38e3..44052792b4 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Feats/MeleeCombat-it.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Hai imparato dove tagliare per ottenere i risult Feat/&FeatSlasherStrTitle=Squartatore [Str] Feat/&FeatSpearMasteryDescription=Sebbene la lancia sia un'arma semplice da imparare, ti ricompensa per il tempo che hai impiegato per padroneggiarla:\n• Ottieni un bonus di +1 ai tiri per colpire che effettui con una lancia e il suo dado di danno cambia da d6 a d8 e da d8 a d10 se impugnata con due mani.\n• Come azione bonus puoi armare la tua lancia per intercettare i nemici in avvicinamento. Puoi usare la reazione per eseguire un attacco di opportunità con una lancia su un nemico che entra nella tua portata e infliggere un dado di danno extra se quell'attacco colpisce.\n• Come azione bonus, puoi aumentare la tua portata con una lancia di 5 piedi per il resto del tuo turno. Feat/&FeatSpearMasteryTitle=Padronanza della lancia -Feat/&FeatWhirlWindAttackDescription=Una volta durante il tuo turno, quando esegui l'azione Attacco mentre impugni uno spadone, un'ascia o una mazza, puoi sostituire un attacco per lanciare invece un attacco Bladestorm. Bladestorm esegue un tiro di attacco contro tutte le creature nemiche entro 5 piedi da te, ma non aggiunge il tuo modificatore di attributo al danno inflitto (a meno che quel modificatore non sia negativo). +Feat/&FeatWhirlWindAttackDescription=Diventi un maestro della morte vorticosa, ottenendo i seguenti benefici mentre impugni uno spadone, un'ascia o una mazza:\n• Quando esegui l'azione Attacco e attacchi con l'arma, puoi usare un'azione bonus per effettuare un rapido attacco in mischia con l'arma. Questo attacco usa lo stesso modificatore di abilità dell'attacco primario e infligge 1d4 danni dello stesso tipo dell'arma impugnata.\n• Una volta durante il tuo turno quando esegui l'azione Attacco con l'arma, puoi sostituire un attacco per attaccare invece tutte le creature nemiche entro 5 piedi da te. Feat/&FeatWhirlWindAttackTitle=Tempesta di lame Feature/&AttackModifierFeatSpearMasteryDescription=Ottieni un bonus di +1 ai tiri per colpire effettuati con una lancia e il suo dado di danno cambia da d6 a d8, e da d8 a d10 se impugnata a due mani. Feature/&AttackModifierFeatSpearMasteryTitle=Maestria della lancia diff --git a/SolastaUnfinishedBusiness/Translations/ja/Feats/MeleeCombat-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Feats/MeleeCombat-ja.txt index e81a5520bc..d2c7dafa62 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Feats/MeleeCombat-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Feats/MeleeCombat-ja.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=最大の結果を得るにはどこをカット Feat/&FeatSlasherStrTitle=スラッシャー[Str] Feat/&FeatSpearMasteryDescription=槍は習得するのが簡単な武器ですが、それを習得するのに費やした時間に対して報酬が得られます:\n• 槍を使って行う攻撃ロールに+1のボーナスを獲得し、そのダメージダイスはd6からd6に変わります。 d8、両手で持つと d8 から d10 になります。\n• ボーナス アクションとして、槍を構えて近づいてくる敵を迎撃することができます。リアクションを使用して、リーチに入った敵に槍で機会攻撃を実行し、その攻撃が命中した場合に追加のダイスによるダメージを与えることができます。\n• ボーナス アクションとして、槍のリーチを 5 フィート延長できます。残りのターン。 Feat/&FeatSpearMasteryTitle=槍マスタリー -Feat/&FeatWhirlWindAttackDescription=あなたのターン中に一度、グレートソード、グレートアックス、またはモールを装備して攻撃アクションを行うとき、1 回の攻撃をブレードストーム攻撃に置き換えることができます。ブレードストームは、あなたの 5 フィート以内のすべての敵クリーチャーに対して 1 回の攻撃ロールを行いますが、与えるダメージにあなたの属性修正値を追加しません (その修正値がマイナスでない限り)。 +Feat/&FeatWhirlWindAttackDescription=あなたは死の旋風の達人となり、グレートソード、グレートアックス、またはモールを装備しているときに以下の利益を得ます:\n• 攻撃アクションを取り、武器で攻撃するとき、ボーナスアクションを使用して武器で素早い近接攻撃を行うことができます。この攻撃は、主要攻撃と同じ能力値修正を使用し、装備した武器と同じタイプの 1d4 のダメージを与えます。\n• 自分のターン中に 1 回、武器で攻撃アクションを取るとき、1 つの攻撃を置き換えて、代わりに 5 フィート以内のすべての敵クリーチャーを攻撃することができます。 Feat/&FeatWhirlWindAttackTitle=ブレードストーム Feature/&AttackModifierFeatSpearMasteryDescription=槍で行う攻撃ロールには +1 ボーナスが得られ、両手で使用した場合、ダメージ ダイスは d6 から d8 に、d8 から d10 に変化します。 Feature/&AttackModifierFeatSpearMasteryTitle=槍マスタリー diff --git a/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt index d72e071d3a..cf06233bdd 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Feats/MeleeCombat-ko.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=최고의 결과를 얻으려면 어디를 잘 Feat/&FeatSlasherStrTitle=슬래셔 [Str] Feat/&FeatSpearMasteryDescription=창은 배우기 쉬운 무기이지만 숙달하는 데 들인 시간에 대해 보상을 받습니다.\n• 창으로 하는 공격 굴림에 +1 보너스를 얻고 피해 주사위는 d6에서 d6에서 다음으로 변경됩니다. d8, 두 손으로 휘두르면 d8에서 d10까지.\n• 보너스 액션으로 창을 받쳐 다가오는 적을 요격할 수 있습니다. 반응을 사용하여 손이 닿는 적에게 창으로 기회 공격을 수행하고 해당 공격이 적중하면 추가 피해를 줄 수 있습니다.\n• 보너스 행동으로 창의 도달 범위를 5피트 늘릴 수 있습니다. 남은 차례. Feat/&FeatSpearMasteryTitle=스피어 마스터리 -Feat/&FeatWhirlWindAttackDescription=당신의 차례 중 한 번 대검, 대도끼 또는 망치를 휘두르면서 공격 행동을 취할 때, 한 번의 공격을 대신하여 블레이드스톰 공격을 시작할 수 있습니다. 블레이드스톰은 당신으로부터 5피트 내의 모든 적 생물에 대해 한 번의 공격 굴림을 하지만, 당신의 속성 수정자를 가하는 피해에 추가하지 않습니다(해당 수정자가 음수인 경우는 제외). +Feat/&FeatWhirlWindAttackDescription=당신은 회전하는 죽음의 달인이 되며, 그레이트소드, 그레이트액스 또는 몰을 휘두르는 동안 다음의 이점을 얻습니다:\n• 공격 액션을 취하고 무기로 공격할 때, 보너스 액션을 사용하여 무기로 빠른 근접 공격을 할 수 있습니다. 이 공격은 기본 공격과 동일한 능력 수정치를 사용하고 휘두른 무기와 같은 유형의 1d4 피해를 입힙니다.\n• 당신의 턴 중 한 번, 무기로 공격 액션을 취할 때, 당신은 한 번의 공격을 대체하여 5피트 이내의 모든 적 생물을 공격할 수 있습니다. Feat/&FeatWhirlWindAttackTitle=블레이드스톰 Feature/&AttackModifierFeatSpearMasteryDescription=창으로 하는 공격 굴림에 +1 보너스를 받으며 창의 피해 주사위는 두 손으로 휘두르면 d6에서 d8로, d8에서 d10으로 변경됩니다. Feature/&AttackModifierFeatSpearMasteryTitle=스피어 마스터리 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/MeleeCombat-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/MeleeCombat-pt-BR.txt index ca1d6da8f4..b5743a46dd 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/MeleeCombat-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Feats/MeleeCombat-pt-BR.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Você aprendeu onde cortar para ter os melhores Feat/&FeatSlasherStrTitle=Cortador [Str] Feat/&FeatSpearMasteryDescription=Embora a lança seja uma arma simples de aprender, ela recompensa você pelo tempo que levou para dominá-la:\n• Você ganha um bônus de +1 em jogadas de ataque que fizer com uma lança e seu dado de dano muda de um d6 para um d8, e de um d8 para um d10 quando empunhada com as duas mãos.\n• Como uma ação bônus, você pode preparar sua lança para interceptar inimigos que se aproximam. Você pode usar reação para executar ataque de oportunidade com uma lança em um inimigo que entre em seu alcance e causar um dado extra de dano se esse ataque acertar.\n• Como uma ação bônus, você pode aumentar seu alcance com uma lança em 5 pés pelo resto do seu turno. Feat/&FeatSpearMasteryTitle=Maestria com Lança -Feat/&FeatWhirlWindAttackDescription=Uma vez durante seu turno, quando você realiza a ação de Ataque enquanto empunha uma espada larga, machado grande ou maça, você pode substituir um ataque para lançar um ataque de Tempestade de Lâminas. Tempestade de Lâminas faz uma jogada de ataque contra todas as criaturas inimigas a até 1,5 m de você, mas não adiciona seu modificador de atributo ao dano causado (a menos que esse modificador seja negativo). +Feat/&FeatWhirlWindAttackDescription=Você se torna um mestre da morte giratória, ganhando os seguintes benefícios enquanto empunha uma espada grande, um machado grande ou um malho:\n• Quando você executa a ação de Ataque e ataca com a arma, você pode usar uma ação bônus para fazer um ataque corpo a corpo rápido com a arma. Este ataque usa o mesmo modificador de habilidade do ataque primário e causa 1d4 de dano do mesmo tipo que a arma empunhada.\n• Uma vez durante seu turno, quando você realizar a ação de Ataque com a arma, você pode substituir um ataque por atacar em vez disso. todas as criaturas inimigas a até 1,5 metro de você. Feat/&FeatWhirlWindAttackTitle=Tempestade de espadas Feature/&AttackModifierFeatSpearMasteryDescription=Você ganha um bônus de +1 nas jogadas de ataque que fizer com uma lança e seu dado de dano muda de d6 para d8, e de d8 para d10 quando empunhada com as duas mãos. Feature/&AttackModifierFeatSpearMasteryTitle=Maestria com Lança diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt index eb9607642f..16b7d0367b 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Вы узнали, где необходимо Feat/&FeatSlasherStrTitle=Рубака [СИЛ] Feat/&FeatSpearMasteryDescription=Хотя копье простое оружие, вы овладели им в совершенстве:\n• Вы получаете бонус +1 к броскам атаки, когда используете это оружие, также его урон меняется с 1к6 на 1к8, и с 1к8 на 1к10, если вы держите его двумя руками.\n• Бонусным действием вы можете подготовить своё копьё для перехвата приближающихся противников. Если в свой следующий ход оно приблизится на расстояние удара вашего копья, вы можете реакцией совершить по нему рукопашную атаку копьём и добавить дополнительную кость урона, если эта атака попадает в цель.\n• Бонусным действием в свой ход вы можете увеличить досягаемость удара копьём на 5 футов до окончания этого хода. Feat/&FeatSpearMasteryTitle=Мастер владения копьём -Feat/&FeatWhirlWindAttackDescription=Один раз в свой ход, когда вы совершаете действие Атака, держа в руках двуручный меч, двуручный топор или двуручный молот, вы можете заменить одну из атак на атаку Вихрем. Атака Вихрем производит один бросок атаки по всем враждебным существам в пределах 5 футов от вас, но не добавляет ваш модификатор характеристики к наносимому урону (если только этот модификатор не отрицательный). +Feat/&FeatWhirlWindAttackDescription=Вы становитесь мастером кружащейся смерти, получая следующие преимущества при владении двуручным мечом, двуручным топором или молотом:\n• Когда вы совершаете действие Атака и атакуете оружием, вы можете использовать бонусное действие, чтобы провести быструю атаку ближнего боя оружием. Эта атака использует тот же модификатор способности, что и основная атака, и наносит 1d4 урона того же типа, что и используемое оружие.\n• Один раз во время своего хода, когда вы совершаете действие Атака оружием, вы можете заменить одну атаку, чтобы вместо этого атаковать всех вражеских существ в радиусе 5 футов от вас. Feat/&FeatWhirlWindAttackTitle=Вихрь Feature/&AttackModifierFeatSpearMasteryDescription=Вы получаете бонус +1 к броскам атаки, когда используете это оружие, также его урон меняется с 1к6 на 1к8, и с 1к8 на 1к10, если вы держите его двумя руками. Feature/&AttackModifierFeatSpearMasteryTitle=Мастер владения копьём diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/MeleeCombat-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/MeleeCombat-zh-CN.txt index 7e04993f55..187fb9d123 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/MeleeCombat-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Feats/MeleeCombat-zh-CN.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=你学会了如何挥砍薄弱处。你的力量 Feat/&FeatSlasherStrTitle=劈砍者【力量】 Feat/&FeatSpearMasteryDescription=虽然长矛是一种简单易学的武器,但如果你花时间掌握它,它就会为你带来回报:\n• 你使用长矛进行的攻击检定获得 +1 加值,其伤害骰从 d6 提升至 d8,用双手挥动时从 d8 提升至 d10。\n• 作为附赠动作,你可以竖起长矛拦截接近的敌人。你可以使用反应对进入你触及范围的敌人进行借机攻击,并在攻击命中时造成额外的伤害骰。\n• 作为附赠动作,你可以将长矛的触及范围增加 5 尺,持续到你的下个回合开始。 Feat/&FeatSpearMasteryTitle=长矛精通 -Feat/&FeatWhirlWindAttackDescription=在您的回合中,当您挥舞大剑、巨斧或大锤进行攻击时,您可以替换一次攻击,以发起剑刃风暴攻击。剑刃风暴对您 5 英尺内的所有敌方生物进行一次攻击,但不会在造成的伤害中添加您的属性修正值(除非该修正值为负)。 +Feat/&FeatWhirlWindAttackDescription=您成为旋转死亡大师,在使用大剑、巨斧或大锤时可获得以下好处:\n• 当您采取攻击行动并用武器攻击时,您可以使用奖励行动用武器进行快速近战攻击。此攻击使用与主要攻击相同的能力修正值,并造成与所持武器相同类型的 1d4 伤害。\n• 在您的回合中,当您用武器采取攻击行动时,您可以替换一次攻击,改为攻击您 5 英尺范围内的所有敌方生物。 Feat/&FeatWhirlWindAttackTitle=剑刃风暴 Feature/&AttackModifierFeatSpearMasteryDescription=你用长矛进行的攻击检定获得 +1 加值,它的伤害骰从 d6 变为 d8,当用两只手挥舞时从 d8 变为 d10。 Feature/&AttackModifierFeatSpearMasteryTitle=长矛精通 From 189e525d69265ec68c5c3af67a39e4c4769bafb8 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 15:46:42 -0700 Subject: [PATCH 125/162] change MyExecuteActionOpportunityAttack interface and rename to MyExecuteActionAttack --- .../GameLocationCharacterExtensions.cs | 5 +++-- .../Behaviors/Specific/DefensiveStrikeAttack.cs | 7 ++----- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 15 +++++---------- .../Subclasses/PathOfTheBeast.cs | 3 ++- 4 files changed, 12 insertions(+), 18 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index ee52a611db..8e1e1e7ac4 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -54,8 +54,9 @@ internal static void MyExecuteAction( ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); } - internal static void MyExecuteActionOpportunityAttack( + internal static void MyExecuteActionAttack( this GameLocationCharacter attacker, + Id actionId, GameLocationCharacter defender, RulesetAttackMode attackMode, ActionModifier actionModifier) @@ -63,7 +64,7 @@ internal static void MyExecuteActionOpportunityAttack( var actionService = ServiceRepository.GetService(); var actionParams = new CharacterActionParams( attacker, - Id.AttackOpportunity, + actionId, attackMode, defender, actionModifier); diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs index 285e8bba5c..96b5c99ab0 100644 --- a/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs +++ b/SolastaUnfinishedBusiness/Behaviors/Specific/DefensiveStrikeAttack.cs @@ -101,7 +101,7 @@ private static IEnumerator ActiveDefensiveStrike( resource: ReactionResourceChannelDivinity.Instance); yield break; - + void ReactionValidated() { //spend resources @@ -120,10 +120,7 @@ void ReactionValidated() new TrendInfo(bonus, FeatureSourceType.CharacterFeature, OathOfAltruism.DefensiveStrike, unit)); //Execute attack - defender.MyExecuteActionOpportunityAttack(attacker, opportunityAttackMode, actionModifier); - - //return our copied attack mode to the pool - RulesetAttackMode.AttackModesPool.Return(opportunityAttackMode); + defender.MyExecuteActionAttack(Id.AttackOpportunity, attacker, opportunityAttackMode, actionModifier); } } } diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 80c5c4f7a7..0148e6b00f 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -1773,23 +1773,18 @@ private void HandleKnockOutBehavior(CharacterAction action, GameLocationCharacte return; } - var actionService = ServiceRepository.GetService(); var attackMode = target.FindActionAttackMode(ActionDefinitions.Id.AttackMain); var attackModeCopy = RulesetAttackMode.AttackModesPool.Get(); attackModeCopy.Copy(attackMode); attackModeCopy.ActionType = ActionDefinitions.ActionType.Reaction; - var attackActionParams = - new CharacterActionParams(target, ActionDefinitions.Id.AttackOpportunity) - { - AttackMode = attackModeCopy, - TargetCharacters = { action.ActingCharacter }, - ActionModifiers = { new ActionModifier() } - }; - rulesetTarget.LogCharacterUsedPower(powerOrcishFury); - actionService.ExecuteAction(attackActionParams, null, true); + target.MyExecuteActionAttack( + ActionDefinitions.Id.AttackOpportunity, + action.ActingCharacter, + attackModeCopy, + new ActionModifier()); } #endregion diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index 541d6672de..a9498c9dd4 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -779,7 +779,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, attacker.RulesetCharacter.RemoveAllConditionsOfCategoryAndType( AttributeDefinitions.TagEffect, condition.name); - attacker.MyExecuteActionOpportunityAttack(defender, attackModeCopy, attackModifier); + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackOpportunity, defender, attackModeCopy, attackModifier); } private static bool IsValidAttack( From d9ef7d990c0c14e9229c0dc4cb3cd61296beb1af Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 16:04:04 -0700 Subject: [PATCH 126/162] replace ExecuteAction AttackFree with MyExecuteActionAttack --- .../Feats/MeleeCombatFeats.cs | 11 +++++----- .../Feats/TwoWeaponCombatFeats.cs | 20 ++++++------------- .../Models/Level20SubclassesContext.cs | 11 +++++----- SolastaUnfinishedBusiness/Races/Lizardfolk.cs | 11 +++++----- .../Spells/SpellBuildersLevel04.cs | 19 ++++-------------- .../Subclasses/Builders/GambitsBuilders.cs | 15 ++++++-------- .../Subclasses/PathOfTheBeast.cs | 19 +++++------------- .../Subclasses/RangerGloomStalker.cs | 12 +++++------ .../Subclasses/RoguishDuelist.cs | 12 +++++------ .../Subclasses/WayOfTheSilhouette.cs | 12 +++++------ .../Subclasses/WayOfTheStormSoul.cs | 11 +++++----- .../Subclasses/WayOfTheZenArchery.cs | 11 +++++----- 12 files changed, 63 insertions(+), 101 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index 5e425c90ce..5318bf3f12 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -1968,13 +1968,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, foreach (var target in targets) { var attackModifier = new ActionModifier(); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.AttackFree) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + target, + attackMode, + attackModifier); } } } diff --git a/SolastaUnfinishedBusiness/Feats/TwoWeaponCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/TwoWeaponCombatFeats.cs index ea4a1ac159..44ff6b1dac 100644 --- a/SolastaUnfinishedBusiness/Feats/TwoWeaponCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/TwoWeaponCombatFeats.cs @@ -1,6 +1,7 @@ using System.Collections; using System.Collections.Generic; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; @@ -81,20 +82,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var attackModeCopy = RulesetAttackMode.AttackModesPool.Get(); - - attackModeCopy.Copy(attackMode); - attackModeCopy.ActionType = ActionDefinitions.ActionType.NoCost; - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.AttackFree) - { - AttackMode = attackModeCopy, - TargetCharacters = { defender }, - ActionModifiers = { new ActionModifier() } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + defender, + attackMode, + action.ActionParams.ActionModifiers[0]); } } } diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index bb802e00e0..4d4893f26a 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -2089,13 +2089,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, foreach (var target in targets) { var attackModifier = new ActionModifier(); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.AttackFree) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + target, + attackMode, + attackModifier); } } } diff --git a/SolastaUnfinishedBusiness/Races/Lizardfolk.cs b/SolastaUnfinishedBusiness/Races/Lizardfolk.cs index 2c6d60bed5..100355b0dd 100644 --- a/SolastaUnfinishedBusiness/Races/Lizardfolk.cs +++ b/SolastaUnfinishedBusiness/Races/Lizardfolk.cs @@ -148,13 +148,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, foreach (var target in targets) { var attackModifier = new ActionModifier(); - var actionParams = new CharacterActionParams(actingCharacter, Id.AttackFree) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteActionAttack( + Id.AttackFree, + target, + attackMode, + attackModifier); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs index db1c50d404..491f196306 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs @@ -828,25 +828,14 @@ public void OnConditionRemoved(RulesetCharacter rulesetCharacter, RulesetConditi var rulesetCaster = EffectHelpers.GetCharacterByGuid(rulesetCondition.SourceGuid); var caster = GameLocationCharacter.GetFromActor(rulesetCaster); var character = GameLocationCharacter.GetFromActor(rulesetCharacter); - - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(power, rulesetCaster); usablePower.SaveDC = 8 + rulesetCondition.SourceAbilityBonus + rulesetCondition.SourceProficiencyBonus; - var actionParams = new CharacterActionParams(caster, Id.PowerNoCost) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = implementationManager - .MyInstantiateEffectPower(rulesetCaster, usablePower, false), - UsablePower = usablePower, - TargetCharacters = { character } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + caster.MyExecuteAction( + Id.PowerNoCost, + usablePower, + [character]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index 4ffece7217..ebea29fc41 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1422,7 +1422,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( new ReactionResourcePowerPool(pool, Sprites.GambitResourceIcon)); yield break; - + void ReactionValidated() { rulesetCharacter.UpdateUsageForPower(pool, 1); @@ -2130,14 +2130,11 @@ private static void Attack( ActionModifier attackModifier, ActionDefinitions.Id actionId = ActionDefinitions.Id.AttackFree) { - var actionService = ServiceRepository.GetService(); - var attackActionParams = - new CharacterActionParams(actingCharacter, actionId) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - - actionService.ExecuteAction(attackActionParams, null, true); + actingCharacter.MyExecuteActionAttack( + actionId, + target, + attackMode, + attackModifier); } #endregion diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index a9498c9dd4..c66b6f43a5 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -337,20 +337,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( void ReactionValidated() { attacker.UsedSpecialFeatures.Add(TagBeastClawAttack, 0); - - var attackModeCopy = attackMode.DeepCopy(); - - attackModeCopy.ActionType = ActionDefinitions.ActionType.NoCost; - - var actionParams = new CharacterActionParams(attacker, ActionDefinitions.Id.AttackFree) - { - ActionModifiers = { new ActionModifier() }, - AttackMode = attackModeCopy, - TargetCharacters = { defender } - }; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + defender, + attackMode, + action.ActionParams.ActionModifiers[0]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs index 6e807c9aa8..0d9c28678a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RangerGloomStalker.cs @@ -312,14 +312,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var actionService = ServiceRepository.GetService(); - var actionParams = action.ActionParams.Clone(); - - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.AttackFree]; attacker.UsedSpecialFeatures.TryAdd(featureStalkersFlurry.Name, 1); attacker.RulesetCharacter.LogCharacterUsedFeature(featureStalkersFlurry); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + defender, + attackMode, + action.ActionParams.ActionModifiers[0]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs index abeabe3f14..aa23ef6931 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishDuelist.cs @@ -239,15 +239,13 @@ public IEnumerator OnPhysicalAttackFinishedByMe( rulesetDefender.RemoveCondition(activeCondition); - var actionService = ServiceRepository.GetService(); - var actionParams = action.ActionParams.Clone(); var attackModeMain = attacker.FindActionAttackMode(ActionDefinitions.Id.AttackMain); - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.AttackFree]; - actionParams.AttackMode = attackModeMain; - - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + defender, + attackModeMain, + action.ActionParams.ActionModifiers[0]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs index 4a89ea0ee1..14fe6e8210 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs @@ -250,14 +250,14 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var actionService = ServiceRepository.GetService(); - var actionParams = action.ActionParams.Clone(); - - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.AttackFree]; attacker.UsedSpecialFeatures.TryAdd(featureShadowFlurry.Name, 1); attacker.RulesetCharacter.LogCharacterUsedFeature(featureShadowFlurry); - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + + attacker.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + defender, + attackMode, + action.ActionParams.ActionModifiers[0]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs index dfa03dd3a6..401be97d25 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs @@ -324,13 +324,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, foreach (var target in targets) { var attackModifier = new ActionModifier(); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.AttackFree) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + target, + attackMode, + attackModifier); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs index 58dac64cf5..4ac467226c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheZenArchery.cs @@ -336,13 +336,12 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, foreach (var target in targets) { var attackModifier = new ActionModifier(); - var actionParams = new CharacterActionParams(actingCharacter, ActionDefinitions.Id.AttackFree) - { - AttackMode = attackMode, TargetCharacters = { target }, ActionModifiers = { attackModifier } - }; - ServiceRepository.GetService()? - .ExecuteAction(actionParams, null, true); + actingCharacter.MyExecuteActionAttack( + ActionDefinitions.Id.AttackFree, + target, + attackMode, + attackModifier); } } From e6115857c94d03fafb27d07e2c92d8e043621bda Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 17:52:47 -0700 Subject: [PATCH 127/162] add MyExecuteActionCastNoCost --- .../GameLocationCharacterExtensions.cs | 18 ++++++++++++++++++ SolastaUnfinishedBusiness/ChangelogHistory.txt | 3 ++- .../Spells/SpellBuildersLevel06.cs | 16 +++++----------- .../Subclasses/MartialForceKnight.cs | 11 +---------- .../Subclasses/PatronMoonlitScion.cs | 9 +-------- .../Subclasses/WayOfTheSilhouette.cs | 12 +----------- 6 files changed, 28 insertions(+), 41 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 8e1e1e7ac4..0c10639c12 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -72,6 +72,24 @@ internal static void MyExecuteActionAttack( actionService.ExecuteAction(actionParams, null, true); } + internal static void MyExecuteActionCastNoCost( + this GameLocationCharacter caster, + SpellDefinition spell, + int slotLevel, + CharacterActionParams originalActionParams, + RulesetSpellRepertoire spellRepertoire = null) + { + var actionService = ServiceRepository.GetService(); + var rulesetCaster = caster.RulesetCharacter; + var effectSpell = ServiceRepository.GetService() + .InstantiateEffectSpell(rulesetCaster, spellRepertoire, spell, slotLevel, false); + var actionParams = originalActionParams.Clone(); + + actionParams.ActionDefinition = actionService.AllActionDefinitions[Id.CastNoCost]; + actionParams.RulesetEffect = effectSpell; + actionService.ExecuteAction(actionParams, null, true); + } + internal static void MyExecuteActionStabilizeAndStandUp( this GameLocationCharacter character, int hitPoints, IMagicEffect magicEffect = null) { diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 0aeef3aaeb..b418eb9d44 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -1,5 +1,6 @@ 1.5.97.26: +- fixed Absorb Elements spell triggering behavior - fixed Bait and Switch maneuver greyed out on action bar - fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 @@ -10,7 +11,7 @@ - fixed Time Stop spell to work as in tabletop - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 -- improved Bladestorm feat with an additional BA attack as PAM +- improved Bladestorm feat with an additional 1D4 BA attack, and modifier damage on whirlwind attack KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs index 6f857db702..add91f2723 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel06.cs @@ -10,6 +10,7 @@ using SolastaUnfinishedBusiness.Subclasses; using SolastaUnfinishedBusiness.Validators; using UnityEngine.AddressableAssets; +using static ActionDefinitions; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.ConditionDefinitions; @@ -415,17 +416,11 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, actingCharacter.UsedSpecialFeatures.TryAdd(FizbanPlatinumShieldTag, rulesetSpell.RemainingRounds); var spellRepertoire = rulesetSpell.SpellRepertoire; - var actionService = ServiceRepository.GetService(); - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetCharacter, spellRepertoire, spell, 6, false); - var actionParams = action.ActionParams.Clone(); + // rulesetCharacter.SpellsCastByMe.TryAdd(effectSpell); - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.CastNoCost]; - actionParams.RulesetEffect = effectSpell; + action.ActingCharacter.MyExecuteActionCastNoCost(spell, 6, action.ActionParams, spellRepertoire); - rulesetCharacter.SpellsCastByMe.TryAdd(effectSpell); - actionService.ExecuteAction(actionParams, null, true); break; } case CharacterActionCastSpell @@ -564,9 +559,8 @@ internal static SpellDefinition BuildHeroicInfusion() .SetGuiPresentation($"Condition{NAME}", Category.Condition, Gui.NoLocalization) .SetAuthorizedActions() .SetForbiddenActions( - ActionDefinitions.Id.CastBonus, ActionDefinitions.Id.CastInvocation, - ActionDefinitions.Id.CastMain, ActionDefinitions.Id.CastReaction, - ActionDefinitions.Id.CastReadied, ActionDefinitions.Id.CastRitual, ActionDefinitions.Id.CastNoCost) + Id.CastBonus, Id.CastInvocation, Id.CastMain, Id.CastReaction, Id.CastReadied, Id.CastRitual, + Id.CastNoCost) .AddToDB(); var conditionExhausted = ConditionDefinitionBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs index fc36e21dda..2bb512283d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs @@ -1007,16 +1007,7 @@ private sealed class PowerOrSpellFinishedByMeTelekineticGrasp(SpellDefinition sp { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var actionService = ServiceRepository.GetService(); - var actingCharacter = action.ActingCharacter; - var rulesetCharacter = actingCharacter.RulesetCharacter; - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetCharacter, null, spellTelekineticGrasp, 5, false); - var actionParams = action.ActionParams.Clone(); - - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.CastNoCost]; - actionParams.RulesetEffect = effectSpell; - actionService.ExecuteAction(actionParams, null, true); + action.ActingCharacter.MyExecuteActionCastNoCost(spellTelekineticGrasp, 6, action.ActionParams); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs index 131b099e3d..d5976174d6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs @@ -509,15 +509,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var spellRepertoire = rulesetCharacter.SpellRepertoires.FirstOrDefault(x => x.SpellCastingClass == CharacterClassDefinitions.Warlock); - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetCharacter, spellRepertoire, MoonBeam, slotLevel, false); - var actionParams = action.ActionParams.Clone(); - var actionManager = ServiceRepository.GetService(); - actionParams.ActionDefinition = actionManager.AllActionDefinitions[ActionDefinitions.Id.CastNoCost]; - actionParams.RulesetEffect = effectSpell; - - actionManager.ExecuteAction(actionParams, null, true); + action.ActingCharacter.MyExecuteActionCastNoCost(MoonBeam, slotLevel, action.ActionParams, spellRepertoire); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs index 14fe6e8210..f25c063014 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs @@ -162,17 +162,7 @@ private sealed class PowerOrSpellFinishedByMeDarkness : IPowerOrSpellFinishedByM { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { - var actionService = ServiceRepository.GetService(); - var actingCharacter = action.ActingCharacter; - var rulesetCharacter = actingCharacter.RulesetCharacter; - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetCharacter, null, Darkness, 0, false); - - var actionParams = action.ActionParams.Clone(); - - actionParams.ActionDefinition = actionService.AllActionDefinitions[ActionDefinitions.Id.CastNoCost]; - actionParams.RulesetEffect = effectSpell; - actionService.ExecuteAction(actionParams, null, true); + action.ActingCharacter.MyExecuteActionCastNoCost(Darkness, 0, action.ActionParams); yield break; } From 52f70b72a68e2f8232a43e2330e69fddad4d578c Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 17:53:05 -0700 Subject: [PATCH 128/162] fix missing forbidden action on Irresistible Performance --- SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs index 491f196306..cb6dacf65f 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs @@ -1512,7 +1512,8 @@ internal static SpellDefinition BuildIrresistiblePerformance() .SetGuiPresentationNoContent(true) .SetForbiddenActions( Id.AttackFree, Id.AttackMain, Id.AttackOff, Id.AttackOpportunity, Id.AttackReadied, - Id.CastBonus, Id.CastInvocation, Id.CastMain, Id.CastReaction, Id.CastReadied, Id.CastNoCost) + Id.CastBonus, Id.CastInvocation, Id.CastMain, Id.CastReaction, Id.CastReadied, Id.CastRitual, + Id.CastNoCost) .AddToDB(); var conditionIrresistiblePerformance = ConditionDefinitionBuilder From eb4047d79f33d0692406c490551a8930842fa04e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 18:29:10 -0700 Subject: [PATCH 129/162] update collaterals --- .../ActionAffinityIrresistiblePerformance.json | 1 + .../Translations/de/SubClasses/CollegeOfAudacity-de.txt | 2 +- .../Translations/en/SubClasses/CollegeOfAudacity-en.txt | 2 +- .../Translations/es/SubClasses/CollegeOfAudacity-es.txt | 2 +- .../Translations/fr/SubClasses/CollegeOfAudacity-fr.txt | 2 +- .../Translations/it/SubClasses/CollegeOfAudacity-it.txt | 2 +- .../Translations/ja/SubClasses/CollegeOfAudacity-ja.txt | 2 +- .../Translations/ko/SubClasses/CollegeOfAudacity-ko.txt | 2 +- .../Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt | 2 +- .../Translations/ru/SubClasses/CollegeOfAudacity-ru.txt | 2 +- .../Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt | 2 +- 11 files changed, 11 insertions(+), 10 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityIrresistiblePerformance.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityIrresistiblePerformance.json index 41aa7aa681..9101cfaa3e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityIrresistiblePerformance.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityIrresistiblePerformance.json @@ -19,6 +19,7 @@ "CastReaction", "AttackReadied", "CastReadied", + "CastRitual", "CastNoCost", "AttackFree", "CastInvocation" diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt index 33624a1f5c..1a8e01e789 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/CollegeOfAudacity-de.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Aktivieren/Deaktivieren von Master's Flo Action/&MasterfulWhirlToggleTitle=Meisterhafte Blüte Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Flourish-Roll zu AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Defensives Gedeihen -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Wann immer Sie in Ihrem Zug die Aktion „Angriff“ ausführen, erhöht sich Ihre Gehgeschwindigkeit bis zum Ende des Zuges um 10 Fuß, und wenn ein Waffenangriff, den Sie als Teil dieser Aktion ausführen, eine Kreatur trifft, können Sie eine Anwendung Ihrer Bardic Inspiration aufwenden, damit die Waffe dem getroffenen Ziel zusätzlichen Schaden zufügt. Der Schaden entspricht der Zahl, die Sie auf dem Bardic Inspiration-Würfel würfeln. Sie wählen außerdem ein bestimmtes Manöver:\n• Defensive Flourish: Sie addieren den Würfelwurf der Bardic Inspiration bis zum Beginn Ihres nächsten Zuges zu Ihrer AC.\n• Slashing Flourish: Sie fügen allen anderen feindlichen Kreaturen im Umkreis von 5 Fuß um Sie herum den zusätzlichen Schaden zu.\n• Mobile Flourish: Sie erhalten bis zum Ende Ihres Zuges die Vorteile der Rückzugsmöglichkeit. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Wann immer Sie in Ihrem Zug die Aktion „Angriff“ ausführen, erhöht sich Ihre Gehgeschwindigkeit bis zum Ende des Zuges um 10 Fuß, und wenn ein Waffenangriff, den Sie als Teil dieser Aktion ausführen, eine Kreatur trifft, können Sie eine Anwendung Ihrer Bardic Inspiration aufwenden, damit die Waffe dem getroffenen Ziel zusätzlichen Schaden zufügt. Der Schaden entspricht der Zahl, die Sie auf dem Bardic Inspiration-Würfel würfeln. Sie wählen außerdem ein bestimmtes Manöver:\n• Defensive Flourish: Sie addieren den Würfelwurf der Bardic Inspiration bis zum Beginn Ihres nächsten Zuges zu Ihrer AC.\n• Slashing Flourish: Sie fügen allen anderen feindlichen Kreaturen im Umkreis von 5 Fuß um Sie herum den zusätzlichen Schaden zu.\n• Mobile Flourish: Sie erhalten bis zum Ende Ihres Zuges die Vorteile der Rückzugsmöglichkeit. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Klingenschwung Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Du erlangst Kenntnisse im Umgang mit mittlerer Rüstung und dem Krummsäbel. Du kannst deine Waffe auch als Fokus für deine Bardenzauber verwenden. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Bonus-Fertigkeiten diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt index ced536c2ad..c1d3532625 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/CollegeOfAudacity-en.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activate/deactivate Master's Flourish Action/&MasterfulWhirlToggleTitle=Master's Flourish Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Flourish roll to AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Defensive Flourish -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver:\n• Defensive Flourish: You add the Bardic Inspiration die roll to your AC until the start of your next turn.\n• Slashing Flourish: You deal the extra damage to all other enemy creatures within 5 feet of you.\n• Mobile Flourish: You gain benefits of disengage until the end of your turn. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver:\n• Defensive Flourish: You add the Bardic Inspiration die roll to your AC until the start of your next turn.\n• Slashing Flourish: You deal the extra damage to all other enemy creatures within 5 feet of you.\n• Mobile Flourish: You gain benefits of disengage until the end of your turn. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Blade Flourish Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=You gain proficiency with medium armor and the scimitar. You can also use your weapon as a spellcasting focus for your bard spells. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Bonus Proficiencies diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt index b90e70e91f..553e1aac1f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/CollegeOfAudacity-es.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activar/desactivar el Florecimiento del Action/&MasterfulWhirlToggleTitle=El florecimiento del maestro Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Rollo de florituras hacia AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Florecimiento defensivo -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Siempre que realices la acción de Ataque en tu turno, tu velocidad al caminar aumenta en 10 pies hasta el final del turno, y si un ataque de arma que realices como parte de esta acción golpea a una criatura, puedes gastar un uso de tu Inspiración bárdica para hacer que el arma inflija daño adicional al objetivo que golpeaste. El daño es igual al número que sacaste en el dado de Inspiración bárdica. También eliges una maniobra particular:\n• Brillo defensivo: sumas la tirada del dado de Inspiración bárdica a tu CA hasta el comienzo de tu siguiente turno.\n• Brillo cortante: infliges daño adicional a todas las demás criaturas enemigas a 5 pies o menos de ti.\n• Brillo móvil: obtienes los beneficios de desengancharte hasta el final de tu turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Siempre que realices la acción de Ataque en tu turno, tu velocidad al caminar aumenta en 10 pies hasta el final del turno, y si un ataque de arma que realices como parte de esta acción golpea a una criatura, puedes gastar un uso de tu Inspiración bárdica para hacer que el arma inflija daño adicional al objetivo que golpeaste. El daño es igual al número que sacaste en el dado de Inspiración bárdica. También eliges una maniobra particular:\n• Brillo defensivo: sumas la tirada del dado de Inspiración bárdica a tu CA hasta el comienzo de tu siguiente turno.\n• Brillo cortante: infliges daño adicional a todas las demás criaturas enemigas a 5 pies o menos de ti.\n• Brillo móvil: obtienes los beneficios de desengancharte hasta el final de tu turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Florecimiento de la hoja Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Obtienes competencia con la armadura intermedia y la cimitarra. También puedes usar tu arma como foco de lanzamiento de conjuros para tus conjuros de bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Competencias adicionales diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt index 8b38bc38df..ed65e36d86 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/CollegeOfAudacity-fr.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Activer/désactiver Master's Flourish Action/&MasterfulWhirlToggleTitle=L'épanouissement du Maître Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Lancez un jet de prospérité vers AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Épanouissement défensif -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=À chaque fois que vous effectuez l'action Attaquer pendant votre tour, votre vitesse de marche augmente de 3 mètres jusqu'à la fin du tour, et si une attaque d'arme que vous effectuez dans le cadre de cette action touche une créature, vous pouvez dépenser une utilisation de votre Inspiration bardique pour que l'arme inflige des dégâts supplémentaires à la cible que vous touchez. Les dégâts sont égaux au nombre obtenu sur le dé d'Inspiration bardique. Vous choisissez également une manœuvre particulière :\n• Épanouissement défensif : vous ajoutez le jet de dé d'Inspiration bardique à votre CA jusqu'au début de votre prochain tour.\n• Épanouissement tranchant : vous infligez les dégâts supplémentaires à toutes les autres créatures ennemies à 1,5 mètre de vous.\n• Épanouissement mobile : vous bénéficiez des avantages du désengagement jusqu'à la fin de votre tour. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=À chaque fois que vous effectuez l'action Attaquer pendant votre tour, votre vitesse de marche augmente de 3 mètres jusqu'à la fin du tour, et si une attaque d'arme que vous effectuez dans le cadre de cette action touche une créature, vous pouvez dépenser une utilisation de votre Inspiration bardique pour que l'arme inflige des dégâts supplémentaires à la cible que vous touchez. Les dégâts sont égaux au nombre obtenu sur le dé d'Inspiration bardique. Vous choisissez également une manœuvre particulière :\n• Épanouissement défensif : vous ajoutez le jet de dé d'Inspiration bardique à votre CA jusqu'au début de votre prochain tour.\n• Épanouissement tranchant : vous infligez les dégâts supplémentaires à toutes les autres créatures ennemies à 1,5 mètre de vous.\n• Épanouissement mobile : vous bénéficiez des avantages du désengagement jusqu'à la fin de votre tour. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Épanouissement de la lame Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Vous maîtrisez l'armure intermédiaire et le cimeterre. Vous pouvez également utiliser votre arme comme point focal pour vos sorts de barde. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Compétences bonus diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt index f2e6e99e7b..476ec9eead 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/CollegeOfAudacity-it.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Attiva/disattiva Master's Flourish Action/&MasterfulWhirlToggleTitle=Il fiore del maestro Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Passare al rullo AC. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Fioritura difensiva -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Ogni volta che esegui l'azione Attacco nel tuo turno, la tua velocità di camminata aumenta di 10 piedi fino alla fine del turno e se un attacco con arma che esegui come parte di questa azione colpisce una creatura, puoi spendere un uso della tua Ispirazione Bardica per far sì che l'arma infligga danni extra al bersaglio colpito. Il danno è pari al numero che tiri sul dado Ispirazione Bardica. Scegli anche una manovra particolare:\n• Prosperare Difensivo: aggiungi il tiro del dado Ispirazione Bardica alla tua CA fino all'inizio del tuo prossimo turno.\n• Prosperare Tagliente: infliggi danni extra a tutte le altre creature nemiche entro 5 piedi da te.\n• Prosperare Mobile: ottieni i benefici del disimpegno fino alla fine del tuo turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Ogni volta che esegui l'azione Attacco nel tuo turno, la tua velocità di camminata aumenta di 10 piedi fino alla fine del turno e se un attacco con arma che esegui come parte di questa azione colpisce una creatura, puoi spendere un uso della tua Ispirazione Bardica per far sì che l'arma infligga danni extra al bersaglio colpito. Il danno è pari al numero che tiri sul dado Ispirazione Bardica. Scegli anche una manovra particolare:\n• Prosperare Difensivo: aggiungi il tiro del dado Ispirazione Bardica alla tua CA fino all'inizio del tuo prossimo turno.\n• Prosperare Tagliente: infliggi danni extra a tutte le altre creature nemiche entro 5 piedi da te.\n• Prosperare Mobile: ottieni i benefici del disimpegno fino alla fine del tuo turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Lama prospera Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Ottieni competenza con armature medie e scimitarra. Puoi anche usare la tua arma come focus di lancio di incantesimi per i tuoi incantesimi da bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Competenze bonus diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt index f0017b4557..6af7531ca9 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/CollegeOfAudacity-ja.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=マスターの華麗さを有効化/無 Action/&MasterfulWhirlToggleTitle=マスターの華麗 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=AC にフローリッシュロールします。 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=防御の華麗さ -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=自分のターンに攻撃アクションを行うたびに、そのターンの終了時まで歩行速度が 10 フィート増加し、このアクションの一環として行う武器攻撃がクリーチャーに命中した場合、バード インスピレーションの使用回数を 1 回消費して、その武器が命中したターゲットに追加のダメージを与えるようにすることができます。ダメージはバード インスピレーション ダイスの出目と同じです。また、特定の戦技を選択します:\n• 防御的華麗: 次のターンの開始時まで、バード インスピレーション ダイスの出目を AC に追加します。\n• 斬撃的華麗: 5 フィート以内にいる他のすべての敵クリーチャーに追加のダメージを与えます。\n• 機動的華麗: ターンの終了時まで、離脱の利益を得ます。 +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=自分のターンに攻撃アクションを行うたびに、そのターンの終了時まで歩行速度が 10 フィート増加し、このアクションの一環として行う武器攻撃がクリーチャーに命中した場合、バード インスピレーションの使用回数を 1 回消費して、その武器が命中したターゲットに追加のダメージを与えるようにすることができます。ダメージはバード インスピレーション ダイスの出目と同じです。また、特定の戦技を選択します:\n• 防御的華麗: 次のターンの開始時まで、バード インスピレーション ダイスの出目を AC に追加します。\n• 斬撃的華麗: 5 フィート以内にいる他のすべての敵クリーチャーに追加のダメージを与えます。\n• 機動的華麗: ターンの終了時まで、離脱の利益を得ます。 Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=ブレード・フラリッシュ Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=中装鎧とシミターの熟練度を獲得します。また、武器をバード呪文の呪文発動の焦点として使用することもできます。 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=ボーナス熟練度 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt index 3a00e73aa0..f4787d9744 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/CollegeOfAudacity-ko.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=마스터의 번영 활성화/비활성 Action/&MasterfulWhirlToggleTitle=마스터의 번영 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=AC로 플로리쉬 롤을 합니다. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=방어적인 번영 -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=턴에 공격 액션을 취할 때마다 턴이 끝날 때까지 걷는 속도가 10피트 증가하고, 이 액션의 일부로 하는 무기 공격이 생물을 맞히면, 바드 영감 한 번을 사용하여 맞힌 대상에게 무기가 추가 피해를 입힐 수 있습니다. 피해는 바드 영감 주사위에서 굴린 숫자와 같습니다. 또한 특정 기동을 선택합니다.\n• 방어적 번영: 다음 턴이 시작될 때까지 바드 영감 주사위 굴림을 AC에 추가합니다.\n• 베기 번영: 5피트 이내의 다른 모든 적 생물에게 추가 피해를 입힙니다.\n• 이동적 번영: 턴이 끝날 때까지 이탈의 혜택을 얻습니다. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=턴에 공격 액션을 취할 때마다 턴이 끝날 때까지 걷는 속도가 10피트 증가하고, 이 액션의 일부로 하는 무기 공격이 생물을 맞히면, 바드 영감 한 번을 사용하여 맞힌 대상에게 무기가 추가 피해를 입힐 수 있습니다. 피해는 바드 영감 주사위에서 굴린 숫자와 같습니다. 또한 특정 기동을 선택합니다.\n• 방어적 번영: 다음 턴이 시작될 때까지 바드 영감 주사위 굴림을 AC에 추가합니다.\n• 베기 번영: 5피트 이내의 다른 모든 적 생물에게 추가 피해를 입힙니다.\n• 이동적 번영: 턴이 끝날 때까지 이탈의 혜택을 얻습니다. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=블레이드 플로리쉬 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=당신은 중간 갑옷과 시미터에 능숙해집니다. 무기를 음유시인 주문의 주문 시전 초점으로 사용할 수도 있습니다. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=보너스 숙련도 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt index 6b2bf2e9ab..7ef0b99f09 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/CollegeOfAudacity-pt-BR.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Ativar/desativar o Florescimento do Mest Action/&MasterfulWhirlToggleTitle=O florescimento do mestre Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Rolo de florescimento para CA. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Florescimento Defensivo -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Sempre que você realiza a ação Ataque no seu turno, sua velocidade de caminhada aumenta em 10 pés até o final do turno, e se um ataque de arma que você faz como parte desta ação atingir uma criatura, você pode gastar um uso de sua Inspiração Bárdica para fazer com que a arma cause dano extra ao alvo que você atingiu. O dano é igual ao número que você rola no dado de Inspiração Bárdica. Você também escolhe uma manobra específica:\n• Florescimento Defensivo: Você adiciona a rolagem do dado de Inspiração Bárdica à sua CA até o início do seu próximo turno.\n• Florescimento Cortante: Você causa o dano extra a todas as outras criaturas inimigas a até 5 pés de você.\n• Florescimento Móvel: Você ganha os benefícios de desengajar até o final do seu turno. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Sempre que você realiza a ação Ataque no seu turno, sua velocidade de caminhada aumenta em 10 pés até o final do turno, e se um ataque de arma que você faz como parte desta ação atingir uma criatura, você pode gastar um uso de sua Inspiração Bárdica para fazer com que a arma cause dano extra ao alvo que você atingiu. O dano é igual ao número que você rola no dado de Inspiração Bárdica. Você também escolhe uma manobra específica:\n• Florescimento Defensivo: Você adiciona a rolagem do dado de Inspiração Bárdica à sua CA até o início do seu próximo turno.\n• Florescimento Cortante: Você causa o dano extra a todas as outras criaturas inimigas a até 5 pés de você.\n• Florescimento Móvel: Você ganha os benefícios de desengajar até o final do seu turno. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Lâmina florescer Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Você ganha proficiência com armadura média e a cimitarra. Você também pode usar sua arma como foco de conjuração para suas magias de bardo. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Proficiências Bônus diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt index 87a7f039e2..6c57dee707 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Начать/отменить Масте Action/&MasterfulWhirlToggleTitle=Мастерский росчерк Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Бросок Росчерка прибавляется к КД. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Оборонительный росчерк -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=Всякий раз, когда вы совершаете действие Атака в свой ход, ваша скорость ходьбы увеличивается на 10 футов до конца хода, и если атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одно использование своего Вдохновения Барда, чтобы оружие нанесло дополнительный урон цели, по которой вы попали. Урон равен числу, которое вы выбросили на кубике Вдохновения Барда. Вы также выбираете определенный маневр:\n• Защитный росчерк: вы добавляете бросок кубика Вдохновения Барда к своему AC до начала следующего хода.\n• Рубашечный росчерк: вы наносите дополнительный урон всем другим вражеским существам в радиусе 5 футов от вас.\n• Подвижный росчерк: вы получаете преимущества отрыва до конца своего хода. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Всякий раз, когда вы совершаете действие Атака в свой ход, ваша скорость ходьбы увеличивается на 10 футов до конца хода, и если атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одно использование своего Вдохновения Барда, чтобы оружие нанесло дополнительный урон цели, по которой вы попали. Урон равен числу, которое вы выбросили на кубике Вдохновения Барда. Вы также выбираете определенный маневр:\n• Защитный росчерк: вы добавляете бросок кубика Вдохновения Барда к своему AC до начала следующего хода.\n• Рубашечный росчерк: вы наносите дополнительный урон всем другим вражеским существам в радиусе 5 футов от вас.\n• Подвижный росчерк: вы получаете преимущества отрыва до конца своего хода. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Каждый раз, когда вы совершаете действие Атака в свой ход, ваша скорость передвижения увеличивается на 10 футов до конца хода, и если рукопашная атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одну кость вашего Бардовского вдохновения, чтобы заставить оружие нанести дополнительный урон цели, по которой вы попали. Урон равен числу, выпавшему на кости Бардовского вдохновения. Вы также можете выбрать определённый манёвр:\n• Оборонительный росчерк: Вы добавляете бросок кости Бардовского вдохновения к вашему КД до начала вашего следующего хода.\n• Режущий росчерк: Вы наносите дополнительный урон всем другим враждебным существам в радиусе 5 футов от вас.\n• Мобильный росчерк: Вы получаете преимущества действия Отход до конца вашего хода. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Росчерк клинка Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Вы получаете владение средними доспехами и скимитарами. Вы также можете использовать ваше оружие в качестве заклинательной фокусировки ваших заклинаний барда. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt index 810d8aba0a..376af678d1 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/CollegeOfAudacity-zh-CN.txt @@ -4,7 +4,7 @@ Action/&MasterfulWhirlToggleDescription=激活/停用大师的繁荣 Action/&MasterfulWhirlToggleTitle=大师的辉煌 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=繁荣昌盛,卷入 AC。 Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=防守蓬勃发展 -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription1=每当您在自己的回合中采取攻击行动时,您的行走速度都会增加 10 英尺,直到回合结束为止。如果您在此行动中进行的武器攻击击中了生物,您可以消耗一次吟游诗人灵感,使武器对击中的目标造成额外伤害。伤害等于您在吟游诗人灵感骰子上掷出的数值。您还可以选择一种特定的动作:\n• 防御性华丽:您将吟游诗人灵感骰子掷出的数值添加到您的 AC 中,直到您的下一回合开始为止。\n• 挥砍华丽:您对您 5 英尺范围内的所有其他敌方生物造成额外伤害。\n• 移动华丽:您获得脱离的好处,直到回合结束为止。 +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=每当您在自己的回合中采取攻击行动时,您的行走速度都会增加 10 英尺,直到回合结束为止。如果您在此行动中进行的武器攻击击中了生物,您可以消耗一次吟游诗人灵感,使武器对击中的目标造成额外伤害。伤害等于您在吟游诗人灵感骰子上掷出的数值。您还可以选择一种特定的动作:\n• 防御性华丽:您将吟游诗人灵感骰子掷出的数值添加到您的 AC 中,直到您的下一回合开始为止。\n• 挥砍华丽:您对您 5 英尺范围内的所有其他敌方生物造成额外伤害。\n• 移动华丽:您获得脱离的好处,直到回合结束为止。 Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=剑刃绽放 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=你熟练掌握中型盔甲和弯刀。你还可以使用你的武器作为吟游诗人法术的施法焦点。 Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=奖励熟练度 From 6d63b544c6c842ed188cdecf902bdbd16f972612 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 18:31:02 -0700 Subject: [PATCH 130/162] add MyReactToCastSpell --- .../GameLocationCharacterExtensions.cs | 46 +++++++++++ .../Spells/SpellBuildersLevel01.cs | 80 +++++++------------ .../Spells/SpellBuildersLevel07.cs | 58 +------------- 3 files changed, 79 insertions(+), 105 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 0c10639c12..d479a8b169 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -106,6 +106,52 @@ internal static void MyExecuteActionStabilizeAndStandUp( commandService.ExecuteInstantSingleAction(new CharacterActionParams(character, Id.StandUp)); } + internal static IEnumerator MyReactToCastSpell( + this GameLocationCharacter caster, + SpellDefinition spell, + GameLocationCharacter target, + GameLocationCharacter waiter, + Action reactionValidated = null, + GameLocationBattleManager battleManager = null) + { + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!battleManager) + { + yield break; + } + + var ruleCaster = caster.RulesetCharacter; + var slotLevel = ruleCaster.GetLowestSlotLevelAndRepertoireToCastSpell(spell, out var repertoire); + + if (slotLevel < spell.SpellLevel || repertoire == null) + { + yield break; + } + + var actionService = ServiceRepository.GetService(); + var reactionParams = new CharacterActionParams(caster, Id.CastReaction) + { + ActionModifiers = { new ActionModifier() }, + IntParameter = slotLevel, + RulesetEffect = ServiceRepository.GetService() + .InstantiateEffectSpell(ruleCaster, repertoire, spell, slotLevel, false), + SpellRepertoire = repertoire, + TargetCharacters = { target }, + IsReactionEffect = true + }; + var count = actionService.PendingReactionRequestGroups.Count; + + actionService.ReactToSpendSpellSlot(reactionParams); + + yield return battleManager.WaitForReactions(waiter, actionService, count); + + if (reactionParams.ReactionValidated) + { + reactionValidated?.Invoke(reactionParams); + } + } + internal static IEnumerator MyReactToDoNothing( this GameLocationCharacter character, ExtraActionId actionId, diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 51363fa132..92365bb18a 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -1535,10 +1535,10 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnMe( private IEnumerator HandleReaction( GameLocationBattleManager battleManager, GameLocationCharacter attacker, - GameLocationCharacter helper, + GameLocationCharacter defender, IEnumerable actualEffectForms) { - if (!helper.CanReact()) + if (!defender.CanReact()) { yield break; } @@ -1556,61 +1556,39 @@ private IEnumerator HandleReaction( yield break; } - var rulesetHelper = helper.RulesetCharacter; - var slotLevel = rulesetHelper.GetLowestSlotLevelAndRepertoireToCastSpell( - spellDefinition, out var spellRepertoire); - - if (slotLevel < 1 || - spellRepertoire == null) - { - yield break; - } - - var actionService = ServiceRepository.GetService(); - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetHelper, spellRepertoire, SpellsContext.ElementalInfusion, slotLevel, - false); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.CastReaction) - { - IntParameter = slotLevel, - StringParameter = spellDefinition.Name, - SpellRepertoire = spellRepertoire, - RulesetEffect = effectSpell - }; - var count = actionService.PendingReactionRequestGroups.Count; + var rulesetDefender = defender.RulesetCharacter; - actionService.ReactToSpendSpellSlot(reactionParams); + yield return defender.MyReactToCastSpell( + SpellsContext.ElementalInfusion, defender, attacker, ReactionValidated, battleManager); - yield return battleManager.WaitForReactions(attacker, actionService, count); + yield break; - if (!reactionParams.ReactionValidated) + void ReactionValidated(CharacterActionParams actionParams) { - yield break; - } + var slotUsed = actionParams.IntParameter; - var slotUsed = reactionParams.IntParameter; + EffectHelpers.StartVisualEffect(defender, defender, ShadowArmor, EffectHelpers.EffectType.Caster); + EffectHelpers.StartVisualEffect(defender, defender, ShadowArmor, EffectHelpers.EffectType.Effect); - EffectHelpers.StartVisualEffect(helper, helper, ShadowArmor, EffectHelpers.EffectType.Caster); - EffectHelpers.StartVisualEffect(helper, helper, ShadowArmor, EffectHelpers.EffectType.Effect); - - foreach (var condition in resistanceDamageTypes - .Select(damageType => - GetDefinition( - $"Condition{spellDefinition.Name}{damageType.Substring(6)}Resistance"))) - { - rulesetHelper.InflictCondition( - condition.Name, - DurationType.Round, - 0, - TurnOccurenceType.StartOfTurn, - AttributeDefinitions.TagEffect, - rulesetHelper.guid, - rulesetHelper.CurrentFaction.Name, - 1, - condition.Name, - slotUsed, - 0, - 0); + foreach (var condition in resistanceDamageTypes + .Select(damageType => + GetDefinition( + $"Condition{spellDefinition.Name}{damageType.Substring(6)}Resistance"))) + { + rulesetDefender.InflictCondition( + condition.Name, + DurationType.Round, + 0, + TurnOccurenceType.StartOfTurn, + AttributeDefinitions.TagEffect, + rulesetDefender.guid, + rulesetDefender.CurrentFaction.Name, + 1, + condition.Name, + slotUsed, + 0, + 0); + } } } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs index 4538895f74..5319430703 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs @@ -7,7 +7,6 @@ using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Interfaces; -using SolastaUnfinishedBusiness.Models; using SolastaUnfinishedBusiness.Properties; using static RuleDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper; @@ -274,60 +273,11 @@ internal static IEnumerator HandleRescueTheDyingReaction( foreach (var contender in contenders) { - yield return HandleReaction(battleManager, waiter, defender, contender); + yield return contender + .MyReactToCastSpell(_rescueTheDying, waiter, defender, battleManager: battleManager); } } - private static IEnumerator HandleReaction( - GameLocationBattleManager battleManager, - GameLocationCharacter waiter, - GameLocationCharacter defender, - GameLocationCharacter helper) - { - var rulesetHelper = helper.RulesetCharacter; - var slotLevel = rulesetHelper.GetLowestSlotLevelAndRepertoireToCastSpell( - _rescueTheDying, out var spellRepertoire); - - if (slotLevel < 7 || - spellRepertoire == null || - helper.Side != defender.Side) - { - yield break; - } - - var actionService = ServiceRepository.GetService(); - var effectSpell = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetHelper, spellRepertoire, SpellsContext.RescueTheDying, slotLevel, false); - var reactionParams = new CharacterActionParams(helper, ActionDefinitions.Id.SpendSpellSlot) - { - IntParameter = slotLevel, - StringParameter = _rescueTheDying.Name, - SpellRepertoire = spellRepertoire, - RulesetEffect = effectSpell - }; - var count = actionService.PendingReactionRequestGroups.Count; - - actionService.ReactToSpendSpellSlot(reactionParams); - - yield return battleManager.WaitForReactions(waiter, actionService, count); - - if (!reactionParams.ReactionValidated) - { - yield break; - } - - var slotUsed = reactionParams.IntParameter; - var actionParams = new CharacterActionParams(helper, ActionDefinitions.Id.CastReaction) - { - ActionModifiers = { new ActionModifier() }, - RulesetEffect = ServiceRepository.GetService() - .InstantiateEffectSpell(rulesetHelper, spellRepertoire, _rescueTheDying, slotUsed, false), - TargetCharacters = { defender } - }; - - actionService.ExecuteAction(actionParams, null, true); - } - private static void HealingReceivedHandler( RulesetCharacter character, int healing, @@ -335,8 +285,8 @@ private static void HealingReceivedHandler( HealingCap healingCaps, IHealingModificationProvider healingModificationProvider) { - character.ReceiveTemporaryHitPoints(healing / 2, DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn, - sourceGuid); + character.ReceiveTemporaryHitPoints( + healing / 2, DurationType.Round, 1, TurnOccurenceType.EndOfSourceTurn, sourceGuid); } } From 83e05706b0ecf186aa90d10bcb770a2e3c45c454 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 18:31:23 -0700 Subject: [PATCH 131/162] minor clean up --- .../Api/DatabaseHelper-RELEASE.cs | 6 --- .../Builders/ConditionDefinitionBuilder.cs | 2 +- .../Models/CustomReactionsContext.cs | 51 ------------------- .../Spells/SpellBuildersLevel03.cs | 1 + .../Subclasses/InnovationArtillerist.cs | 6 +-- 5 files changed, 3 insertions(+), 63 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs index 2fa4853486..28a0b0b68b 100644 --- a/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs +++ b/SolastaUnfinishedBusiness/Api/DatabaseHelper-RELEASE.cs @@ -745,9 +745,6 @@ internal static class EffectProxyDefinitions internal static EffectProxyDefinition ProxyIndomitableLight { get; } = GetDefinition("ProxyIndomitableLight"); - internal static EffectProxyDefinition ProxyDelayedBlastFireball { get; } = - GetDefinition("ProxyDelayedBlastFireball"); - internal static EffectProxyDefinition ProxyDancingLights { get; } = GetDefinition("ProxyDancingLights"); @@ -1739,9 +1736,6 @@ internal static class FeatureDefinitionPowers internal static FeatureDefinitionPower PowerMagebaneWarcry { get; } = GetDefinition("PowerMagebaneWarcry"); - internal static FeatureDefinitionPower PowerDelayedBlastFireballDetonate { get; } = - GetDefinition("PowerDelayedBlastFireballDetonate"); - internal static FeatureDefinitionPower PowerOathOfMotherlandFieryWrath { get; } = GetDefinition("PowerOathOfMotherlandFieryWrath"); diff --git a/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs b/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs index b6bd389720..96493b7dae 100644 --- a/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/ConditionDefinitionBuilder.cs @@ -273,13 +273,13 @@ internal ConditionDefinitionBuilder ClearSpecialInterruptions() Definition.SpecialInterruptions.Clear(); return this; } -#endif internal ConditionDefinitionBuilder SetInterruptionDamageThreshold(int value) { Definition.interruptionDamageThreshold = value; return this; } +#endif #region Constructors diff --git a/SolastaUnfinishedBusiness/Models/CustomReactionsContext.cs b/SolastaUnfinishedBusiness/Models/CustomReactionsContext.cs index 4f5e74c9b2..79a843cd0e 100644 --- a/SolastaUnfinishedBusiness/Models/CustomReactionsContext.cs +++ b/SolastaUnfinishedBusiness/Models/CustomReactionsContext.cs @@ -27,57 +27,6 @@ private static void MakeReactDefinition(string name) .AddToDB(); } -#if false - //leaving this in case we need react with spell functionality - private static IEnumerator ReactWithSpell(SpellDefinition spell, GameLocationCharacter caster, - GameLocationCharacter target) - { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - if (actionManager == null) - { - yield break; - } - - var ruleCaster = caster.RulesetCharacter; - var spellSlot = ruleCaster.GetLowestSlotLevelAndRepertoireToCastSpell(spell, out var spellBook); - - if (spellBook == null) - { - yield break; - } - - var ruleset = ServiceRepository.GetService(); - var reactionParams = new CharacterActionParams(caster, Id.CastReaction) - { - IntParameter = 0, - RulesetEffect = - ruleset.InstantiateEffectSpell(ruleCaster, spellBook, spell, spellSlot, false), - IsReactionEffect = true - }; - - reactionParams.TargetCharacters.Add(target); - reactionParams.ActionModifiers.Add(new ActionModifier()); - - var reactions = actionManager.PendingReactionRequestGroups.Count; - var reaction = new ReactionRequestCastDamageSpell(reactionParams, target, spellSlot == 0); - - actionManager.AddInterruptRequest(reaction); - - yield return WaitForReactions(actionManager, reactions); - } - - private static IEnumerator WaitForReactions([CanBeNull] IGameLocationActionService actionService, - int count) - { - while (actionService?.PendingReactionRequestGroups != null && - count < actionService.PendingReactionRequestGroups.Count) - { - yield return null; - } - } -#endif - internal static void SaveReadyActionPreferredCantrip( [CanBeNull] CharacterActionParams actionParams, ReadyActionType readyActionType) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index d558aaffdb..6062aa6122 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -327,6 +327,7 @@ internal static SpellDefinition BuildCorruptingBolt() .SetDamageAffinityType(DamageAffinityType.Vulnerability) .SetDamageType(damageDefinition.Name) .AddToDB())) + .AddCustomSubFeatures(new CustomBehaviorCorruptingBolt()) .AddToDB(); var spell = SpellDefinitionBuilder diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs index e3a0ac019d..39248ee892 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs @@ -1065,6 +1065,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var characterService = ServiceRepository.GetService(); var selectedTarget = action.ActionParams.TargetCharacters[0]; var rulesetTarget = selectedTarget.RulesetCharacter; + var usablePower = PowerProvider.Get(powerEldritchDetonation, rulesetTarget); var targets = characterService.AllValidEntities .Where(x => x != selectedTarget && @@ -1072,11 +1073,6 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, x.IsWithinRange(selectedTarget, 4)) .ToList(); - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var usablePower = PowerProvider.Get(powerEldritchDetonation, rulesetTarget); - selectedTarget.MyExecuteAction(Id.PowerNoCost, usablePower, targets); yield break; From b07832e7b0f68f52d5719342390eaf6ca8922887 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 19:31:27 -0700 Subject: [PATCH 132/162] refactor MyExecuteAction into MyExecuteActionPowerNoCost and remove show casting whenever appropriate --- ...FeatureRangerSkyWarriorDeathFromAbove.json | 2 +- ...rCollegeOfAudacitySlashingWhirlDamage.json | 2 +- ...rCollegeOfEleganceAmazingDisplayEnemy.json | 2 +- ...tionArtilleristEldritchCannonDetonate.json | 2 +- .../PowerLightningArrowLeap.json | 2 +- .../PowerOathOfThunderBifrostDamage.json | 2 +- ...rousFieldManipulatorForcefulStepApply.json | 2 +- .../PowerSorcerousWildMagicFireball.json | 2 +- .../PowerSorcerousWildMagicGrease.json | 2 +- .../PowerSpikeBarrage.json | 2 +- ...werWayOfTheStormSoulEyeOfTheStormLeap.json | 2 +- ...heCosmosSwitchConstellationFormArcher.json | 2 +- ...eCosmosSwitchConstellationFormChalice.json | 2 +- ...heCosmosSwitchConstellationFormDragon.json | 2 +- .../GameLocationCharacterExtensions.cs | 128 +++++++++--------- .../ChangelogHistory.txt | 4 +- .../Feats/MeleeCombatFeats.cs | 5 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 7 +- .../Models/CharacterUAContext.cs | 5 +- .../Models/FixesContext.cs | 9 +- .../Models/Level20SubclassesContext.cs | 7 +- SolastaUnfinishedBusiness/Races/Malakh.cs | 2 +- .../Spells/SpellBuildersCantrips.cs | 10 +- .../Spells/SpellBuildersLevel01.cs | 5 +- .../Spells/SpellBuildersLevel03.cs | 17 +-- .../Spells/SpellBuildersLevel04.cs | 10 +- .../Spells/SpellBuildersLevel08.cs | 2 +- .../Builders/InvocationsBuilders.cs | 8 +- .../Subclasses/CircleOfTheCosmos.cs | 8 +- .../Subclasses/CircleOfTheForestGuardian.cs | 4 +- .../Subclasses/CircleOfTheWildfire.cs | 6 +- .../Subclasses/CollegeOfAudacity.cs | 3 +- .../Subclasses/CollegeOfElegance.cs | 3 +- .../Subclasses/CollegeOfThespian.cs | 2 +- .../Subclasses/InnovationArtillerist.cs | 3 +- .../Subclasses/InnovationVitriolist.cs | 2 +- .../Subclasses/MartialArcaneArcher.cs | 2 +- .../Subclasses/OathOfDread.cs | 5 +- .../Subclasses/OathOfThunder.cs | 3 +- .../Subclasses/PathOfTheElements.cs | 2 +- .../Subclasses/PathOfTheReaver.cs | 5 +- .../Subclasses/PathOfTheYeoman.cs | 2 +- .../Subclasses/RangerSkyWarrior.cs | 3 +- .../Subclasses/RoguishArcaneScoundrel.cs | 2 +- .../Subclasses/SorcerousFieldManipulator.cs | 3 +- .../Subclasses/SorcerousWildMagic.cs | 4 +- .../Subclasses/WayOfTheDiscordance.cs | 10 +- .../Subclasses/WayOfTheDragon.cs | 5 +- .../Subclasses/WayOfTheStormSoul.cs | 3 +- .../Subclasses/WayOfTheWealAndWoe.cs | 5 +- .../Subclasses/WizardWarMagic.cs | 2 +- 51 files changed, 148 insertions(+), 186 deletions(-) diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/FeatureRangerSkyWarriorDeathFromAbove.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/FeatureRangerSkyWarriorDeathFromAbove.json index d0439b8ebf..08dbc84222 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/FeatureRangerSkyWarriorDeathFromAbove.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/FeatureRangerSkyWarriorDeathFromAbove.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfAudacitySlashingWhirlDamage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfAudacitySlashingWhirlDamage.json index 66c32accab..c0060b9e5f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfAudacitySlashingWhirlDamage.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfAudacitySlashingWhirlDamage.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json index 72d971df62..096034a15e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerCollegeOfEleganceAmazingDisplayEnemy.json @@ -348,7 +348,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json index ee24e5309c..018547265e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerInnovationArtilleristEldritchCannonDetonate.json @@ -295,7 +295,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerLightningArrowLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerLightningArrowLeap.json index 4598b654ef..fe17ce93f8 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerLightningArrowLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerLightningArrowLeap.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json index 0084a0e2f4..3000c04aff 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerOathOfThunderBifrostDamage.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json index 304c6321a7..4d0e521cbb 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousFieldManipulatorForcefulStepApply.json @@ -379,7 +379,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicFireball.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicFireball.json index 118fedd38e..500863034b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicFireball.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicFireball.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicGrease.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicGrease.json index 7b8eda1535..bce490e04b 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicGrease.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSorcerousWildMagicGrease.json @@ -372,7 +372,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSpikeBarrage.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSpikeBarrage.json index ebdbbc5f30..2f0509c5b6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSpikeBarrage.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerSpikeBarrage.json @@ -329,7 +329,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json index 7acf366121..c8aac0a854 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerWayOfTheStormSoulEyeOfTheStormLeap.json @@ -356,7 +356,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormArcher.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormArcher.json index ea51499c19..bbfc60eeef 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormArcher.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormArcher.json @@ -168,7 +168,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormChalice.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormChalice.json index 60fe1ee4e5..aa513d0305 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormChalice.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormChalice.json @@ -168,7 +168,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormDragon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormDragon.json index 571ef94309..c6376563b6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormDragon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPowerSharedPool/PowerCircleOfTheCosmosSwitchConstellationFormDragon.json @@ -168,7 +168,7 @@ "abilityScoreBonusToAttack": false, "proficiencyBonusToAttack": false, "uniqueInstance": false, - "showCasting": true, + "showCasting": false, "shortTitleOverride": "", "overriddenPower": null, "includeBaseDescription": false, diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index d479a8b169..8796aef30a 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -31,29 +31,6 @@ private static List GetActionModifiers(int count) return actionModifiers; } - internal static void MyExecuteAction( - this GameLocationCharacter character, - Id actionId, - RulesetUsablePower usablePower, - List targets) - { - var actionModifiers = GetActionModifiers(targets.Count); - var rulesetCharacter = character.RulesetCharacter; - var implementationManager = - ServiceRepository.GetService() as RulesetImplementationManager; - - var actionParams = new CharacterActionParams(character, actionId) - { - ActionModifiers = actionModifiers, - RulesetEffect = implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - UsablePower = usablePower, - targetCharacters = targets - }; - - // must enqueue actions whenever within an attack workflow otherwise game won't consume attack - ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); - } - internal static void MyExecuteActionAttack( this GameLocationCharacter attacker, Id actionId, @@ -90,6 +67,27 @@ internal static void MyExecuteActionCastNoCost( actionService.ExecuteAction(actionParams, null, true); } + internal static void MyExecuteActionPowerNoCost( + this GameLocationCharacter character, + RulesetUsablePower usablePower, + List targets) + { + var actionModifiers = GetActionModifiers(targets.Count); + var rulesetCharacter = character.RulesetCharacter; + var implementationManager = + ServiceRepository.GetService() as RulesetImplementationManager; + + var actionParams = new CharacterActionParams(character, Id.PowerNoCost) + { + ActionModifiers = actionModifiers, + RulesetEffect = implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, false), + UsablePower = usablePower, + targetCharacters = targets + }; + + ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); + } + internal static void MyExecuteActionStabilizeAndStandUp( this GameLocationCharacter character, int hitPoints, IMagicEffect magicEffect = null) { @@ -106,6 +104,50 @@ internal static void MyExecuteActionStabilizeAndStandUp( commandService.ExecuteInstantSingleAction(new CharacterActionParams(character, Id.StandUp)); } + // + // mod custom reactions + // + + internal static IEnumerator MyReactForOpportunityAttack( + this GameLocationCharacter attacker, + GameLocationCharacter defender, + GameLocationCharacter waiter, + RulesetAttackMode attackMode, + ActionModifier actionModifier, + string stringParameter2, + Action reactionValidated = null, + GameLocationBattleManager battleManager = null, + ReactionResourcePowerPool resource = null) + { + var actionManager = ServiceRepository.GetService() as GameLocationActionManager; + + battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; + + if (!actionManager || !battleManager) + { + yield break; + } + + var count = actionManager.PendingReactionRequestGroups.Count; + var reactionParams = new CharacterActionParams( + attacker, + Id.AttackOpportunity, + attackMode, + defender, + actionModifier) { StringParameter2 = stringParameter2 }; + var reactionRequest = + new ReactionRequestReactionAttack(stringParameter2, reactionParams) { Resource = resource }; + + actionManager.AddInterruptRequest(reactionRequest); + + yield return battleManager.WaitForReactions(waiter, actionManager, count); + + if (reactionParams.ReactionValidated) + { + reactionValidated?.Invoke(); + } + } + internal static IEnumerator MyReactToCastSpell( this GameLocationCharacter caster, SpellDefinition spell, @@ -190,46 +232,6 @@ internal static IEnumerator MyReactToDoNothing( } } - internal static IEnumerator MyReactForOpportunityAttack( - this GameLocationCharacter attacker, - GameLocationCharacter defender, - GameLocationCharacter waiter, - RulesetAttackMode attackMode, - ActionModifier actionModifier, - string stringParameter2, - Action reactionValidated = null, - GameLocationBattleManager battleManager = null, - ReactionResourcePowerPool resource = null) - { - var actionManager = ServiceRepository.GetService() as GameLocationActionManager; - - battleManager ??= ServiceRepository.GetService() as GameLocationBattleManager; - - if (!actionManager || !battleManager) - { - yield break; - } - - var count = actionManager.PendingReactionRequestGroups.Count; - var reactionParams = new CharacterActionParams( - attacker, - Id.AttackOpportunity, - attackMode, - defender, - actionModifier) { StringParameter2 = stringParameter2 }; - var reactionRequest = - new ReactionRequestReactionAttack(stringParameter2, reactionParams) { Resource = resource }; - - actionManager.AddInterruptRequest(reactionRequest); - - yield return battleManager.WaitForReactions(waiter, actionManager, count); - - if (reactionParams.ReactionValidated) - { - reactionValidated?.Invoke(); - } - } - internal static IEnumerator MyReactToSpendPower( this GameLocationCharacter character, RulesetUsablePower usablePower, diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index b418eb9d44..0583037a30 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -8,10 +8,10 @@ - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration -- fixed Time Stop spell to work as in tabletop - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 -- improved Bladestorm feat with an additional 1D4 BA attack, and modifier damage on whirlwind attack +- improved Bladestorm feat with an additional 1D4 BA attack, and mod damage on whirlwind attack +- improved Time Stop spell to behave as in tabletop KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs index 5318bf3f12..f20f4e838b 100644 --- a/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/MeleeCombatFeats.cs @@ -1541,10 +1541,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var usablePower = PowerProvider.Get(power, rulesetAttacker); - attacker.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [defender]); + attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } } diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 6a58e312ef..7d06fc60ea 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2553,10 +2553,7 @@ private static IEnumerator PoisonTarget(GameLocationCharacter me, GameLocationCh var usablePower = PowerProvider.Get(PowerFeatPoisonousSkin, rulesetMe); - me.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [target]); + me.MyExecuteActionPowerNoCost(usablePower, [target]); } //Poison character that shoves me @@ -2878,7 +2875,7 @@ public IEnumerator HandleReducedToZeroHpByMe( var targets = Gui.Battle.GetContenders( downedCreature, attacker, isOppositeSide: false, hasToPerceivePerceiver: true, withinRange: distance); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( diff --git a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs index 03d53ea426..afbd94a1ae 100644 --- a/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs +++ b/SolastaUnfinishedBusiness/Models/CharacterUAContext.cs @@ -1624,10 +1624,7 @@ private IEnumerator HandleKnockOut(GameLocationCharacter attacker, GameLocationC var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerKnockOutApply, rulesetAttacker); - attacker.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [defender]); + attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } } diff --git a/SolastaUnfinishedBusiness/Models/FixesContext.cs b/SolastaUnfinishedBusiness/Models/FixesContext.cs index abc61af898..1bb1dcc47d 100644 --- a/SolastaUnfinishedBusiness/Models/FixesContext.cs +++ b/SolastaUnfinishedBusiness/Models/FixesContext.cs @@ -730,10 +730,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var usablePower = PowerProvider.Get(PowerMonkStunningStrike, rulesetAttacker); - attacker.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [defender]); + attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) @@ -741,8 +738,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, if (action.RolledSaveThrow && action.SaveOutcome == RollOutcome.Failure) { - action.ActingCharacter.RulesetCharacter.ToggledPowersOn.Remove( - PowerMonkStunningStrike.AutoActivationPowerTag); + action.ActingCharacter.RulesetCharacter.ToggledPowersOn + .Remove(PowerMonkStunningStrike.AutoActivationPowerTag); } yield break; diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index 4d4893f26a..e64ab6f136 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -1512,7 +1512,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetCharacter = actingCharacter.RulesetCharacter; var usablePower = PowerProvider.Get(powerFortuneFavorTheBold, rulesetCharacter); - actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, [actingCharacter]); + actingCharacter.MyExecuteActionPowerNoCost(usablePower, [actingCharacter]); yield break; } @@ -1985,10 +1985,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, { var usablePower = PowerProvider.Get(powerQuiveringPalmDamage, rulesetAttacker); - attacker.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [target]); + attacker.MyExecuteActionPowerNoCost(usablePower, [target]); yield break; } diff --git a/SolastaUnfinishedBusiness/Races/Malakh.cs b/SolastaUnfinishedBusiness/Races/Malakh.cs index 32c37871ea..77c82b11cd 100644 --- a/SolastaUnfinishedBusiness/Races/Malakh.cs +++ b/SolastaUnfinishedBusiness/Races/Malakh.cs @@ -330,7 +330,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) var usablePower = PowerProvider.Get(powerAngelicRadianceDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(locationCharacter, withinRange: 3); - locationCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + locationCharacter.MyExecuteActionPowerNoCost(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs index 958abfd8d9..832ab90572 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersCantrips.cs @@ -1037,10 +1037,7 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) var usablePower = PowerProvider.Get(powerBoomingBladeDamage, rulesetAttacker); - defender.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [defender]); + defender.MyExecuteActionPowerNoCost(usablePower, [defender]); } } @@ -1280,10 +1277,7 @@ rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess)) var usablePower = PowerProvider.Get(powerResonatingStrikeDamage, rulesetAttacker); - defender.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [secondDefender]); + defender.MyExecuteActionPowerNoCost(usablePower, [secondDefender]); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 92365bb18a..744b33ac75 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -1337,7 +1337,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, usablePower.saveDC = 8 + actionCastSpell.ActiveSpell.MagicAttackBonus; - caster.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + caster.MyExecuteActionPowerNoCost(usablePower, targets); } } } @@ -2184,6 +2184,7 @@ internal static SpellDefinition BuildSpikeBarrage() .Create($"Power{NAME}") .SetGuiPresentation(NAME, Category.Spell, hidden: true) .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -2304,7 +2305,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerSpikeBarrage, rulesetAttacker); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 6062aa6122..26e78bfd90 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -542,7 +542,7 @@ public void MoveStepFinished(GameLocationCharacter mover) var rulesetAttacker = mover.RulesetCharacter; var usablePower = PowerProvider.Get(powerDamage, rulesetAttacker); - mover.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + mover.MyExecuteActionPowerNoCost(usablePower, targets); } } @@ -777,7 +777,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, _targets); + attacker.MyExecuteActionPowerNoCost(usablePower, _targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) @@ -1211,10 +1211,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter character) usablePower.SaveDC = 8 + activeCondition.SourceAbilityBonus + activeCondition.SourceProficiencyBonus; - caster.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [character]); + caster.MyExecuteActionPowerNoCost(usablePower, [character]); } public void OnCharacterTurnStarted(GameLocationCharacter character) @@ -1233,10 +1230,7 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) usablePower.SaveDC = 8 + activeCondition.SourceAbilityBonus + activeCondition.SourceProficiencyBonus; - caster.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [character]); + caster.MyExecuteActionPowerNoCost(usablePower, [character]); } } @@ -1252,6 +1246,7 @@ internal static SpellDefinition BuildLightningArrow() .Create($"Power{Name}Leap") .SetGuiPresentation(Name, Category.Spell, hidden: true) .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -1455,7 +1450,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var targets = battleManager.Battle .GetContenders(defender, isOppositeSide: false, withinRange: 2); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs index cb6dacf65f..d9958986fb 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel04.cs @@ -832,10 +832,7 @@ public void OnConditionRemoved(RulesetCharacter rulesetCharacter, RulesetConditi usablePower.SaveDC = 8 + rulesetCondition.SourceAbilityBonus + rulesetCondition.SourceProficiencyBonus; - caster.MyExecuteAction( - Id.PowerNoCost, - usablePower, - [character]); + caster.MyExecuteActionPowerNoCost(usablePower, [character]); } } @@ -1298,10 +1295,7 @@ private void DamageReceivedHandler( var usablePower = PowerProvider.Get(powerElementalBane, rulesetAttacker); - attacker.MyExecuteAction( - Id.PowerNoCost, - usablePower, - [defender]); + attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs index 17d0aed46d..8ec3a5111b 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel08.cs @@ -344,7 +344,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, target, actingCharacter, isOppositeSide: false, hasToPerceiveTarget: true, withinRange: 12); actingCharacter.UsedSpecialFeatures.TryAdd("SoulExpulsion", action.ActionParams.RulesetEffect.EffectLevel); - actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + actingCharacter.MyExecuteActionPowerNoCost(usablePower, targets); } public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs index 9ebcb646d6..4c5eef6cbd 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/InvocationsBuilders.cs @@ -771,9 +771,7 @@ public void OnCharacterTurnStarted(GameLocationCharacter character) var caster = GameLocationCharacter.GetFromActor(rulesetCaster); var usablePower = PowerProvider.Get(powerPerniciousCloakDamage, rulesetCaster); - caster.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, + caster.MyExecuteActionPowerNoCost(usablePower, [character]); } } @@ -1115,7 +1113,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePower = PowerProvider.Get(powerChillingHexDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } @@ -1300,7 +1298,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePower = PowerProvider.Get(powerVexingHexDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(defender, isOppositeSide: false, withinRange: 1); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs index 0381d18de6..20c024a70c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs @@ -258,6 +258,7 @@ public CircleOfTheCosmos() .Create($"Power{Name}SwitchConstellationFormArcher") .SetGuiPresentation($"Power{Name}ArcherConstellationForm", Category.Feature) .SetSharedPool(ActivationTime.NoCost, powerSwitchConstellationForm) + .SetShowCasting(false) .AddCustomSubFeatures(new PowerOrSpellFinishedByMeTwinklingStars(powerArcherConstellationForm)) .AddToDB(); @@ -265,6 +266,7 @@ public CircleOfTheCosmos() .Create($"Power{Name}SwitchConstellationFormChalice") .SetGuiPresentation($"Power{Name}ChaliceConstellationForm", Category.Feature) .SetSharedPool(ActivationTime.NoCost, powerSwitchConstellationForm) + .SetShowCasting(false) .AddCustomSubFeatures(new PowerOrSpellFinishedByMeTwinklingStars(powerChaliceConstellationForm)) .AddToDB(); @@ -272,6 +274,7 @@ public CircleOfTheCosmos() .Create($"Power{Name}SwitchConstellationFormDragon") .SetGuiPresentation($"Power{Name}DragonConstellationForm", Category.Feature) .SetSharedPool(ActivationTime.NoCost, powerSwitchConstellationForm) + .SetShowCasting(false) .AddCustomSubFeatures(new PowerOrSpellFinishedByMeTwinklingStars(powerDragonConstellationForm)) .AddToDB(); @@ -1244,10 +1247,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, effectPower.remainingRounds = remainingRounds; - actingCharacter.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [actingCharacter]); + actingCharacter.MyExecuteActionPowerNoCost(usablePower, [actingCharacter]); usablePower.RepayUse(); } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs index a78a682433..95ae25823e 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheForestGuardian.cs @@ -236,9 +236,7 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc var usablePower = PowerProvider.Get(powerImprovedBarkWardDamage, rulesetDefender); - defender.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, + defender.MyExecuteActionPowerNoCost(usablePower, [attacker]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index bfc7486ba2..7255ea0a9c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -537,7 +537,7 @@ void ReactionValidated() : PowerCauterizingFlamesHeal, rulesetSource); - source.MyExecuteAction(Id.PowerNoCost, usablePower, [character]); + source.MyExecuteActionPowerNoCost(usablePower, [character]); } } } @@ -652,7 +652,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, spirit.IsWithinRange(x, 2)) .ToList(); - attacker.MyExecuteAction(Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); yield break; } @@ -701,7 +701,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(powerExplode, rulesetAttacker); - attacker.MyExecuteAction(Id.PowerNoCost, usablePower, _targets); + attacker.MyExecuteActionPowerNoCost(usablePower, _targets); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs index 70fade780f..643aa92060 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfAudacity.cs @@ -117,6 +117,7 @@ public CollegeOfAudacity() .Create($"Power{Name}SlashingWhirlDamage") .SetGuiPresentation($"Power{Name}SlashingWhirl", Category.Feature, hidden: true) .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -283,7 +284,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( var usablePower = PowerProvider.Get(powerSlashingWhirlDamage, rulesetAttacker); var targets = Gui.Battle.GetContenders(attacker, withinRange: 1).Where(x => x != defender).ToList(); - attacker.MyExecuteAction(ActionDefinitions.Id.SpendPower, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } public bool IsValid(BaseDefinition definition, RulesetCharacter character, EffectDescription effectDescription) diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs index 555e6dc206..2113bf4d5d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfElegance.cs @@ -162,6 +162,7 @@ public CollegeOfElegance() .Create($"Power{Name}AmazingDisplayEnemy") .SetGuiPresentation(AmazingDisplayName, Category.Feature) .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -385,7 +386,7 @@ public IEnumerator OnPhysicalAttackFinishedByMe( var usablePowerEnemy = PowerProvider.Get(powerAmazingDisplayEnemy, rulesetAttacker); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerEnemy, targets); + attacker.MyExecuteActionPowerNoCost(usablePowerEnemy, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs index e9ed093c10..077ecb1f5f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CollegeOfThespian.cs @@ -293,7 +293,7 @@ public IEnumerator HandleReducedToZeroHpByMe( var power = classLevel < 14 ? powerTerrificPerformance : powerImprovedTerrificPerformance; var usablePower = PowerProvider.Get(power, rulesetAttacker); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs index 39248ee892..07302a2366 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs @@ -591,6 +591,7 @@ public InnovationArtillerist() .Create(ELDRITCH_DETONATION) .SetGuiPresentation(Category.Feature, Fireball) .SetUsesFixed(ActivationTime.Action) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -1073,7 +1074,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, x.IsWithinRange(selectedTarget, 4)) .ToList(); - selectedTarget.MyExecuteAction(Id.PowerNoCost, usablePower, targets); + selectedTarget.MyExecuteActionPowerNoCost(usablePower, targets); yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs index 3f952f2a55..0c8db39a0a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs @@ -608,7 +608,7 @@ private void InflictDamage(GameLocationCharacter attacker, List(); EnumerateTargetsWithinRange(caster, range, targets, includeCaster); - caster.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + caster.MyExecuteActionPowerNoCost(usablePower, targets); } [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs index d02e45c17a..abbd7a59eb 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDiscordance.cs @@ -428,9 +428,7 @@ private static void UsePower( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(featureDefinitionPower, rulesetAttacker); - attacker.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, + attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } } @@ -488,7 +486,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var rulesetCharacter = actingCharacter.RulesetCharacter; var usablePowerDiscordance = PowerProvider.Get(powerDiscordance, rulesetCharacter); - actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerDiscordance, targets); + actingCharacter.MyExecuteActionPowerNoCost(usablePowerDiscordance, targets); // Turmoil var monkLevel = rulesetCharacter.GetClassLevel(CharacterClassDefinitions.Monk); @@ -509,7 +507,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, var usablePowerTurmoil = PowerProvider.Get(powerTurmoil, rulesetCharacter); - actingCharacter.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePowerTurmoil, targets); + actingCharacter.MyExecuteActionPowerNoCost(usablePowerTurmoil, targets); } } @@ -580,7 +578,7 @@ public IEnumerator HandleReducedToZeroHpByMeOrAlly( var usablePower = PowerProvider.Get(powerTidesOfChaos, rulesetAlly); - ally.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, [ally]); + ally.MyExecuteActionPowerNoCost(usablePower, [ally]); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs index c5d5ddacdf..ee62a834c1 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs @@ -818,10 +818,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( var usablePower = PowerProvider.Get(powerReactiveHideDamage, rulesetDefender); - defender.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [attacker]); + defender.MyExecuteActionPowerNoCost(usablePower, [attacker]); } public int HandlerPriority => 10; diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs index 401be97d25..a7e2ac5de3 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheStormSoul.cs @@ -124,6 +124,7 @@ public WayOfTheStormSoul() .Create($"Power{Name}EyeOfTheStormLeap") .SetGuiPresentation($"FeatureSet{Name}EyeOfTheStorm", Category.Feature, hidden: true) .SetUsesFixed(ActivationTime.NoCost) + .SetShowCasting(false) .SetEffectDescription( EffectDescriptionBuilder .Create() @@ -360,7 +361,7 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, y.SourceGuid == rulesetAttacker.Guid)) .ToList(); - attacker.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + attacker.MyExecuteActionPowerNoCost(usablePower, targets); } } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs index 993ebfa31c..8c5e7f6f3b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheWealAndWoe.cs @@ -276,10 +276,7 @@ private static void InflictMartialArtDieDamage( var rulesetAttacker = attacker.RulesetCharacter; var usablePower = PowerProvider.Get(power, rulesetAttacker); - defender.MyExecuteAction( - ActionDefinitions.Id.PowerNoCost, - usablePower, - [defender]); + defender.MyExecuteActionPowerNoCost(usablePower, [defender]); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index 8514174c0d..9423c7b44c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -319,7 +319,7 @@ private void HandleDeflectionShroud(GameLocationCharacter helper) .Take(3) .ToList(); - helper.MyExecuteAction(ActionDefinitions.Id.PowerNoCost, usablePower, targets); + helper.MyExecuteActionPowerNoCost(usablePower, targets); } } From f6f71d6dacc46970d12bd1c199ac70ed208fa856 Mon Sep 17 00:00:00 2001 From: Dovel Date: Sat, 10 Aug 2024 05:56:55 +0300 Subject: [PATCH 133/162] update russian translation --- .../Translations/ru/Feats/MeleeCombat-ru.txt | 2 +- .../Translations/ru/Spells/Spells09-ru.txt | 6 +++--- .../Translations/ru/SubClasses/CollegeOfAudacity-ru.txt | 3 +-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt index 16b7d0367b..fa9fe22af5 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Feats/MeleeCombat-ru.txt @@ -56,7 +56,7 @@ Feat/&FeatSlasherStrDescription=Вы узнали, где необходимо Feat/&FeatSlasherStrTitle=Рубака [СИЛ] Feat/&FeatSpearMasteryDescription=Хотя копье простое оружие, вы овладели им в совершенстве:\n• Вы получаете бонус +1 к броскам атаки, когда используете это оружие, также его урон меняется с 1к6 на 1к8, и с 1к8 на 1к10, если вы держите его двумя руками.\n• Бонусным действием вы можете подготовить своё копьё для перехвата приближающихся противников. Если в свой следующий ход оно приблизится на расстояние удара вашего копья, вы можете реакцией совершить по нему рукопашную атаку копьём и добавить дополнительную кость урона, если эта атака попадает в цель.\n• Бонусным действием в свой ход вы можете увеличить досягаемость удара копьём на 5 футов до окончания этого хода. Feat/&FeatSpearMasteryTitle=Мастер владения копьём -Feat/&FeatWhirlWindAttackDescription=Вы становитесь мастером кружащейся смерти, получая следующие преимущества при владении двуручным мечом, двуручным топором или молотом:\n• Когда вы совершаете действие Атака и атакуете оружием, вы можете использовать бонусное действие, чтобы провести быструю атаку ближнего боя оружием. Эта атака использует тот же модификатор способности, что и основная атака, и наносит 1d4 урона того же типа, что и используемое оружие.\n• Один раз во время своего хода, когда вы совершаете действие Атака оружием, вы можете заменить одну атаку, чтобы вместо этого атаковать всех вражеских существ в радиусе 5 футов от вас. +Feat/&FeatWhirlWindAttackDescription=Вы становитесь мастером кружащей смерти и получаете следующие преимущества при использовании двуручного меча, двуручного топора или двуручного молота:\n• Когда вы совершаете действие Атака при помощи оружия, вы можете бонусным действием совершить быструю рукопашную атаку этим оружием. Эта атака использует тот же модификатор, что и основная атака, и наносит 1d4 урона того же типа, что и используемое оружие.\n• Один раз в свой ход, когда вы совершаете действие Атака при помощи оружия, вы можете заменить одну атаку, чтобы вместо этого атаковать всех враждебных существ в пределах 5 футов от вас. Feat/&FeatWhirlWindAttackTitle=Вихрь Feature/&AttackModifierFeatSpearMasteryDescription=Вы получаете бонус +1 к броскам атаки, когда используете это оружие, также его урон меняется с 1к6 на 1к8, и с 1к8 на 1к10, если вы держите его двумя руками. Feature/&AttackModifierFeatSpearMasteryTitle=Мастер владения копьём diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt index 3bdae58c67..6d0b28bf43 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells09-ru.txt @@ -1,7 +1,7 @@ Condition/&ConditionForesightDescription=Преимущество на все броски атаки, проверки характеристик и спасброски. Остальные существа получают помеху на броски атаки по вам. Condition/&ConditionForesightTitle=Предвидение -Condition/&ConditionTimeStopDescription=Вы делаете 1d4+1 ход подряд. -Condition/&ConditionTimeStopEnemyDescription=Время для вас остановилось. +Condition/&ConditionTimeStopDescription=Вы получаете 1d4+1 ходов подряд. +Condition/&ConditionTimeStopEnemyDescription=Время остановилось для вас. Condition/&ConditionTimeStopEnemyTitle=Остановка времени Condition/&ConditionTimeStopTitle=Остановка времени Condition/&ConditionWeirdDescription=Испуган. В конце каждого своего хода совершает спасбросок Мудрости. При провале получает 4d10 психического урона. При успехе состояние оканчивается. @@ -23,7 +23,7 @@ Spell/&PsychicScreamDescription=Вы высвобождаете силу сво Spell/&PsychicScreamTitle=Психический крик Spell/&ShapechangeDescription=Вы принимаете на время действия заклинания облик другого существа. Новый облик может принадлежать существу с показателем опасности не больше вашего уровня. Spell/&ShapechangeTitle=Полное превращение -Spell/&TimeStopDescription=Вы ненадолго останавливаете поток времени для всех, кроме себя. Для всех остальных существ время перестаёт течь, а вы получаете 1d4 + 1 ходов подряд, во время которых можете совершать действия и перемещаться как обычно. +Spell/&TimeStopDescription=Вы ненадолго останавливаете поток времени для всех, кроме себя. Для всех остальных существ время перестаёт течь, а вы получаете 1d4+1 ходов подряд, во время которых можете совершать действия и перемещаться как обычно. Это заклинание заканчивается, если одно из действий, использованных вами в этот отрезок времени, или любой эффект, созданный вами в этот отрезок времени, воздействует на существо, отличное от вас. Spell/&TimeStopTitle=Остановка времени Spell/&WeirdDescription=Воззвав к сильнейшим страхам группы существ, вы создаёте иллюзорных существ в их сознаниях, видимых только для них. Все противники в сфере с радиусом 30 футов с центром на выбранной точке в пределах дистанции, должны совершить спасбросок Мудрости. При провале существо становится испуганным на время длительности заклинания. Иллюзия взывает к самым потаённым страхам, проявляясь в виде худших кошмаров и неумолимой угрозы. В конце каждого своего хода испуганное существо должно преуспевать в спасброске Мудрости, иначе оно получает урон психической энергией 4d10. При успехе для этого существа заклинание оканчивается. Spell/&WeirdTitle=Смертный ужас diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt index 6c57dee707..f94ac6245d 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/CollegeOfAudacity-ru.txt @@ -4,8 +4,7 @@ Action/&MasterfulWhirlToggleDescription=Начать/отменить Масте Action/&MasterfulWhirlToggleTitle=Мастерский росчерк Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlDescription=Бросок Росчерка прибавляется к КД. Feature/&AttributeModifierCollegeOfAudacityDefensiveWhirlTitle=Оборонительный росчерк -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Всякий раз, когда вы совершаете действие Атака в свой ход, ваша скорость ходьбы увеличивается на 10 футов до конца хода, и если атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одно использование своего Вдохновения Барда, чтобы оружие нанесло дополнительный урон цели, по которой вы попали. Урон равен числу, которое вы выбросили на кубике Вдохновения Барда. Вы также выбираете определенный маневр:\n• Защитный росчерк: вы добавляете бросок кубика Вдохновения Барда к своему AC до начала следующего хода.\n• Рубашечный росчерк: вы наносите дополнительный урон всем другим вражеским существам в радиусе 5 футов от вас.\n• Подвижный росчерк: вы получаете преимущества отрыва до конца своего хода. -Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Каждый раз, когда вы совершаете действие Атака в свой ход, ваша скорость передвижения увеличивается на 10 футов до конца хода, и если рукопашная атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одну кость вашего Бардовского вдохновения, чтобы заставить оружие нанести дополнительный урон цели, по которой вы попали. Урон равен числу, выпавшему на кости Бардовского вдохновения. Вы также можете выбрать определённый манёвр:\n• Оборонительный росчерк: Вы добавляете бросок кости Бардовского вдохновения к вашему КД до начала вашего следующего хода.\n• Режущий росчерк: Вы наносите дополнительный урон всем другим враждебным существам в радиусе 5 футов от вас.\n• Мобильный росчерк: Вы получаете преимущества действия Отход до конца вашего хода. +Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlDescription=Каждый раз, когда вы совершаете действие Атака в свой ход, ваша скорость передвижения увеличивается на 10 футов до конца хода, и если атака оружием, которую вы совершаете в рамках этого действия, попадает по существу, вы можете потратить одну кость вашего Бардовского вдохновения, чтобы заставить оружие нанести дополнительный урон цели, по которой вы попали. Урон равен числу, выпавшему на кости Бардовского вдохновения. Вы также можете выбрать определённый манёвр:\n• Оборонительный росчерк: Вы добавляете бросок кости Бардовского вдохновения к вашему КД до начала вашего следующего хода.\n• Режущий росчерк: Вы наносите дополнительный урон всем другим враждебным существам в радиусе 5 футов от вас.\n• Мобильный росчерк: Вы получаете преимущества действия Отход до конца вашего хода. Feature/&FeatureSetCollegeOfAudacityAudaciousWhirlTitle=Росчерк клинка Feature/&FeatureSetCollegeOfAudacityBonusProficienciesDescription=Вы получаете владение средними доспехами и скимитарами. Вы также можете использовать ваше оружие в качестве заклинательной фокусировки ваших заклинаний барда. Feature/&FeatureSetCollegeOfAudacityBonusProficienciesTitle=Бонусные умения From eb33043ac43ddfb1b0942fa0c4d78dec77dd455e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 20:01:34 -0700 Subject: [PATCH 134/162] prefer MyExecuteActionPowerNoCost --- .../Subclasses/PathOfTheWildMagic.cs | 31 +++++-------------- 1 file changed, 8 insertions(+), 23 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 15624f0287..424dd3c193 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -765,9 +765,9 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation { var actionParams = new CharacterActionParams(character, Id.PowerNoCost) { - RulesetEffect = - implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, false), - IsReactionEffect = true + RulesetEffect = implementationManager.MyInstantiateEffectPower( + rulesetCharacter, usablePower, false) + //IsReactionEffect = true }; if (reactingOutOfTurn) @@ -795,25 +795,15 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation } PreventEnemyAction(attacker, rulesetCharacter); - - var actionParams = new CharacterActionParams(character, Id.PowerNoCost) - { - RulesetEffect = - implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, - false) - }; - - ServiceRepository.GetService() - ?.ExecuteAction(actionParams, null, true); + character.MyExecuteActionPowerNoCost(usablePower, []); } else { var actionParams = new CharacterActionParams(character, Id.PowerNoCost) { - RulesetEffect = - implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, - false), - IsReactionEffect = true + RulesetEffect = implementationManager.MyInstantiateEffectPower( + rulesetCharacter, usablePower, false) + // IsReactionEffect = true }; ServiceRepository.GetService() ?.ExecuteInstantSingleAction(actionParams); @@ -821,12 +811,7 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation } else { - var actionParams = new CharacterActionParams(character, Id.PowerNoCost) - { - RulesetEffect = - implementationManager.MyInstantiateEffectPower(rulesetCharacter, usablePower, false) - }; - ServiceRepository.GetService()?.ExecuteAction(actionParams, null, true); + character.MyExecuteActionPowerNoCost(usablePower, []); } } } From 3dee03c811bd492e8635bf6bc14f3ba528f405c5 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 21:47:36 -0700 Subject: [PATCH 135/162] improve Time Stop spell --- .../UnfinishedBusinessBlueprints/Assets.txt | 2 + .../ConditionTimeStop.json | 6 +- .../ConditionTimeStopEnemy.json | 6 +- .../ActionAffinityTimeStop.json | 48 ++++ .../SpellDefinition/TimeStop.json | 2 +- .../Spells/SpellBuildersLevel09.cs | 255 +++++++++--------- 6 files changed, 191 insertions(+), 128 deletions(-) create mode 100644 Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityTimeStop.json diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index da77ff26e1..1ad449a6f6 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -1651,6 +1651,7 @@ ActionAffinityStaggeringSmite FeatureDefinitionActionAffinity FeatureDefinition ActionAffinitySteelDefenderBasic FeatureDefinitionActionAffinity FeatureDefinition 0a59ab1b-e92e-569b-9e77-3dd9e48890a0 ActionAffinityThunderousStrikeToggle FeatureDefinitionActionAffinity FeatureDefinition 785dba60-504d-5eef-86b3-6ab0464234ff ActionAffinityTidesOfChaosRecharge FeatureDefinitionActionAffinity FeatureDefinition f16f73a8-02e4-56a1-8cb7-2d5a1723d8ff +ActionAffinityTimeStop FeatureDefinitionActionAffinity FeatureDefinition 22249f1f-d131-5221-a79a-3a5070b9699b ActionAffinityTraditionOpenHandQuiveringPalm FeatureDefinitionActionAffinity FeatureDefinition 8960d481-00d8-56c4-8a46-89da6fc7f5ba ActionAffinityVoidGrasp FeatureDefinitionActionAffinity FeatureDefinition 66edfa28-3c47-5b65-867b-ad59f6f83f8d ActionAffinityWayOfZenArcheryHailOfArrows FeatureDefinitionActionAffinity FeatureDefinition 695be6c6-8f66-5be9-9353-a935e0b70d61 @@ -4296,6 +4297,7 @@ ActionAffinityStaggeringSmite FeatureDefinitionActionAffinity FeatureDefinitionA ActionAffinitySteelDefenderBasic FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 0a59ab1b-e92e-569b-9e77-3dd9e48890a0 ActionAffinityThunderousStrikeToggle FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 785dba60-504d-5eef-86b3-6ab0464234ff ActionAffinityTidesOfChaosRecharge FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity f16f73a8-02e4-56a1-8cb7-2d5a1723d8ff +ActionAffinityTimeStop FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 22249f1f-d131-5221-a79a-3a5070b9699b ActionAffinityTraditionOpenHandQuiveringPalm FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 8960d481-00d8-56c4-8a46-89da6fc7f5ba ActionAffinityVoidGrasp FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 66edfa28-3c47-5b65-867b-ad59f6f83f8d ActionAffinityWayOfZenArcheryHailOfArrows FeatureDefinitionActionAffinity FeatureDefinitionActionAffinity 695be6c6-8f66-5be9-9353-a935e0b70d61 diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json index e8f6751070..8ed5c79c7f 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStop.json @@ -5,8 +5,8 @@ "conditionType": "Beneficial", "features": [], "allowMultipleInstances": false, - "silentWhenAdded": true, - "silentWhenRemoved": true, + "silentWhenAdded": false, + "silentWhenRemoved": false, "silentWhenRefreshed": false, "terminateWhenRemoved": false, "specialDuration": false, @@ -85,7 +85,7 @@ }, "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, - "possessive": false, + "possessive": true, "amountOrigin": "None", "baseAmount": 0, "additiveAmount": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json index 77cab87f03..714b36433c 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionTimeStopEnemy.json @@ -3,7 +3,9 @@ "inDungeonEditor": false, "parentCondition": null, "conditionType": "Detrimental", - "features": [], + "features": [ + "Definition:ActionAffinityTimeStop:22249f1f-d131-5221-a79a-3a5070b9699b" + ], "allowMultipleInstances": false, "silentWhenAdded": false, "silentWhenRemoved": false, @@ -85,7 +87,7 @@ }, "timeToWaitBeforeApplyingShader": 0.5, "timeToWaitBeforeRemovingShader": 0.5, - "possessive": false, + "possessive": true, "amountOrigin": "None", "baseAmount": 0, "additiveAmount": false, diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityTimeStop.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityTimeStop.json new file mode 100644 index 0000000000..baff6e2404 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityTimeStop.json @@ -0,0 +1,48 @@ +{ + "$type": "FeatureDefinitionActionAffinity, Assembly-CSharp", + "allowedActionTypes": [ + false, + false, + false, + false, + false, + false + ], + "eitherMainOrBonus": false, + "maxAttacksNumber": -1, + "forbiddenActions": [], + "authorizedActions": [], + "restrictedActions": [], + "actionExecutionModifiers": [], + "specialBehaviour": "None", + "randomBehaviorDie": "D10", + "randomBehaviourOptions": [], + "rechargeReactionsAtEveryTurn": false, + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "22249f1f-d131-5221-a79a-3a5070b9699b", + "contentPack": 9999, + "name": "ActionAffinityTimeStop" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json index e5b0982fd7..3769ad1e82 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/TimeStop.json @@ -20,7 +20,7 @@ "hitAffinitiesByTargetTag": [], "targetType": "Sphere", "itemSelectionType": "None", - "targetParameter": 24, + "targetParameter": 12, "targetParameter2": 2, "emissiveBorder": "None", "emissiveParameter": 1, diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs index 75e25c5de7..dfb1f1eb7f 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs @@ -1,5 +1,6 @@ using System.Collections; using System.Linq; +using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; @@ -271,6 +272,95 @@ internal static SpellDefinition BuildPowerWordKill() #endregion + #region Weird + + internal static SpellDefinition BuildWeird() + { + return SpellDefinitionBuilder + .Create("Weird") + .SetGuiPresentation(Category.Spell, Sprites.GetSprite("Weird", Resources.Weird, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolIllusion) + .SetSpellLevel(9) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.None) + .SetSomaticComponent(true) + .SetVerboseComponent(true) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.Sphere, 6) + .SetSavingThrowData( + false, + AttributeDefinitions.Wisdom, + true, + EffectDifficultyClassComputation.SpellCastingFeature, + AttributeDefinitions.Constitution, + 13) + .SetEffectForms( + EffectFormBuilder + .Create() + .SetConditionForm( + ConditionDefinitionBuilder + .Create(ConditionDefinitions.ConditionFrightenedPhantasmalKiller, "ConditionWeird") + .SetOrUpdateGuiPresentation(Category.Condition) + .AddToDB(), + ConditionForm.ConditionOperation.Add) + .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) + .Build()) + .SetCasterEffectParameters(PhantasmalKiller) + .SetImpactEffectParameters( + PhantasmalKiller.EffectDescription.EffectParticleParameters.effectParticleReference) + .Build()) + .SetRequiresConcentration(true) + .AddToDB(); + } + + #endregion + + #region Psychic Scream + + internal static SpellDefinition BuildPsychicScream() + { + const string NAME = "PsychicScream"; + + return SpellDefinitionBuilder + .Create(NAME) + .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.PsychicScream, 128)) + .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) + .SetSpellLevel(9) + .SetCastingTime(ActivationTime.Action) + .SetMaterialComponent(MaterialComponentType.Mundane) + .SetSomaticComponent(true) + .SetVerboseComponent(false) + .SetVocalSpellSameType(VocalSpellSemeType.Attack) + .SetEffectDescription( + EffectDescriptionBuilder + .Create() + .SetDurationData(DurationType.Minute, 1) + .SetTargetingData(Side.All, RangeType.Distance, 18, TargetType.IndividualsUnique, 10) + .SetSavingThrowData(false, AttributeDefinitions.Intelligence, false, + EffectDifficultyClassComputation.SpellCastingFeature) + .SetEffectForms( + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) + .SetConditionForm(ConditionDefinitions.ConditionStunned, + ConditionForm.ConditionOperation.Add) + .Build(), + EffectFormBuilder + .Create() + .HasSavingThrow(EffectSavingThrowType.HalfDamage) + .SetDamageForm(DamageTypePsychic, 14, DieType.D6) + .Build()) + .SetParticleEffectParameters(PowerWordStun) + .Build()) + .AddToDB(); + } + + #endregion + #region Time Stop internal static SpellDefinition BuildTimeStop() @@ -280,17 +370,23 @@ internal static SpellDefinition BuildTimeStop() var conditionTimeStop = ConditionDefinitionBuilder .Create("ConditionTimeStop") .SetGuiPresentation(Category.Condition, Sprites.GetSprite(NAME, Resources.ConditionTimeStop, 27, 32)) - .SetSilent(Silent.WhenAddedOrRemoved) - .AddCustomSubFeatures(new ActionFinishedByMeTimeStop()) + .SetPossessive() .AddToDB(); var conditionTimeStopEnemy = ConditionDefinitionBuilder .Create("ConditionTimeStopEnemy") .SetGuiPresentation(Category.Condition, ConditionDefinitions.ConditionPatronTimekeeperCurseOfTime) .SetConditionType(ConditionType.Detrimental) + .SetPossessive() + .SetFeatures( + FeatureDefinitionActionAffinityBuilder + .Create($"ActionAffinity{NAME}") + .SetGuiPresentationNoContent(true) + .SetAllowedActionTypes(false, false, false, false, false, false) + .AddToDB()) .AddToDB(); - - return SpellDefinitionBuilder + + var spell = SpellDefinitionBuilder .Create(NAME) .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.TimeStop, 128)) .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolTransmutation) @@ -304,7 +400,7 @@ internal static SpellDefinition BuildTimeStop() EffectDescriptionBuilder .Create() .SetDurationData(DurationType.Permanent) - .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Sphere, 24) + .SetTargetingData(Side.All, RangeType.Self, 0, TargetType.Sphere, 12) .ExcludeCaster() .SetEffectForms( EffectFormBuilder.ConditionForm(conditionTimeStopEnemy), @@ -316,9 +412,14 @@ internal static SpellDefinition BuildTimeStop() .Build()) .AddCustomSubFeatures(new CustomBehaviorTimeStop()) .AddToDB(); + + conditionTimeStop.AddCustomSubFeatures(new ActionFinishedByMeTimeStop(spell)); + + return spell; } - private sealed class ActionFinishedByMeTimeStop : IActionFinishedByMe, ICharacterBeforeTurnEndListener + private sealed class ActionFinishedByMeTimeStop(SpellDefinition spellDefinition) + : IActionFinishedByMe, ICharacterBeforeTurnEndListener { // remove time stop if any action has non self target public IEnumerator OnActionFinishedByMe(CharacterAction action) @@ -327,26 +428,28 @@ public IEnumerator OnActionFinishedByMe(CharacterAction action) var targets = action.ActionParams.TargetCharacters; var hasNonSelfTarget = targets == null || targets.Any(x => x != character); - if (!hasNonSelfTarget) + if (!hasNonSelfTarget || + (action is CharacterActionCastSpell actionCastSpell && + actionCastSpell.ActiveSpell.SpellDefinition == spellDefinition)) { yield break; } - + RemoveTimeStop(character); } - + // remove time stop after last instance turn public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) { var battle = Gui.Battle; - if (battle == null || battle.CurrentRound > 1) + if (battle == null) { return; } var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); - + if (battle.activeContenderIndex != index) { return; @@ -357,6 +460,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) private static void RemoveTimeStop(GameLocationCharacter locationCharacter) { + var rulesetCharacter = locationCharacter.RulesetCharacter; var battle = Gui.Battle; // remove duplicates @@ -365,11 +469,13 @@ private static void RemoveTimeStop(GameLocationCharacter locationCharacter) while (battle.InitiativeSortedContenders.Count(x => x == locationCharacter) > 1) { var index = battle.InitiativeSortedContenders.FindLastIndex(x => x.Guid == locationCharacter.Guid); - + battle.InitiativeSortedContenders.RemoveAt(index); } + + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); } - + // remove time stop condition from others var locationCharacterService = ServiceRepository.GetService(); var contenders = @@ -382,150 +488,55 @@ private static void RemoveTimeStop(GameLocationCharacter locationCharacter) { if (rulesetContender.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, "ConditionTimeStopEnemy", out var activeConditionEnemy) && - activeConditionEnemy.SourceGuid == rulesetContender.Guid) + activeConditionEnemy.SourceGuid == rulesetCharacter.Guid) { rulesetContender.RemoveCondition(activeConditionEnemy); } } - + // remove time stop from self - var rulesetCharacter = locationCharacter.RulesetCharacter; if (rulesetCharacter.TryGetConditionOfCategoryAndType( AttributeDefinitions.TagEffect, "ConditionTimeStop", out var activeCondition)) { rulesetCharacter.RemoveCondition(activeCondition); } - - // refresh UI - var gameLocationScreenBattle = Gui.GuiService.GetScreen(); - - gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, - GameLocationBattle.ContenderModificationMode.Remove, false, false); } } - + private sealed class CustomBehaviorTimeStop : IPowerOrSpellFinishedByMe { public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { + if (Gui.Battle == null) + { + yield break; + } + var locationCharacter = action.ActingCharacter; var rulesetCharacter = locationCharacter.RulesetCharacter; var initiativeSortedContenders = Gui.Battle.InitiativeSortedContenders; var positionCharacter = initiativeSortedContenders.FirstOrDefault(x => x == locationCharacter); var positionCharacterIndex = initiativeSortedContenders.IndexOf(positionCharacter); - var dieRoll = RollDie(DieType.D4, AdvantageType.None, out _, out _); + var rounds = RollDie(DieType.D4, AdvantageType.None, out _, out _) + 1; rulesetCharacter.LogCharacterActivatesAbility( string.Empty, "Feedback/&TimeStop", extra: [ - (ConsoleStyleDuplet.ParameterType.Base, dieRoll.ToString()) + (ConsoleStyleDuplet.ParameterType.Base, rounds.ToString()) ]); - - for (var i = 0; i < dieRoll; i++) + + // add additional contenders to initiative + for (var i = 0; i < rounds; i++) { initiativeSortedContenders.Insert(positionCharacterIndex + 1, locationCharacter); } - - var gameLocationScreenBattle = Gui.GuiService.GetScreen(); - gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, - GameLocationBattle.ContenderModificationMode.Add, false, false); - - yield break; + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); } } - - #endregion - - #region Weird - - internal static SpellDefinition BuildWeird() - { - return SpellDefinitionBuilder - .Create("Weird") - .SetGuiPresentation(Category.Spell, Sprites.GetSprite("Weird", Resources.Weird, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolIllusion) - .SetSpellLevel(9) - .SetCastingTime(ActivationTime.Action) - .SetMaterialComponent(MaterialComponentType.None) - .SetSomaticComponent(true) - .SetVerboseComponent(true) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetEffectDescription( - EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Minute, 1) - .SetTargetingData(Side.Enemy, RangeType.Distance, 12, TargetType.Sphere, 6) - .SetSavingThrowData( - false, - AttributeDefinitions.Wisdom, - true, - EffectDifficultyClassComputation.SpellCastingFeature, - AttributeDefinitions.Constitution, - 13) - .SetEffectForms( - EffectFormBuilder - .Create() - .SetConditionForm( - ConditionDefinitionBuilder - .Create(ConditionDefinitions.ConditionFrightenedPhantasmalKiller, "ConditionWeird") - .SetOrUpdateGuiPresentation(Category.Condition) - .AddToDB(), - ConditionForm.ConditionOperation.Add) - .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) - .Build()) - .SetCasterEffectParameters(PhantasmalKiller) - .SetImpactEffectParameters( - PhantasmalKiller.EffectDescription.EffectParticleParameters.effectParticleReference) - .Build()) - .SetRequiresConcentration(true) - .AddToDB(); - } - - #endregion - - #region Psychic Scream - - internal static SpellDefinition BuildPsychicScream() - { - const string NAME = "PsychicScream"; - - return SpellDefinitionBuilder - .Create(NAME) - .SetGuiPresentation(Category.Spell, Sprites.GetSprite(NAME, Resources.PsychicScream, 128)) - .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEnchantment) - .SetSpellLevel(9) - .SetCastingTime(ActivationTime.Action) - .SetMaterialComponent(MaterialComponentType.Mundane) - .SetSomaticComponent(true) - .SetVerboseComponent(false) - .SetVocalSpellSameType(VocalSpellSemeType.Attack) - .SetEffectDescription( - EffectDescriptionBuilder - .Create() - .SetDurationData(DurationType.Minute, 1) - .SetTargetingData(Side.All, RangeType.Distance, 18, TargetType.IndividualsUnique, 10) - .SetSavingThrowData(false, AttributeDefinitions.Intelligence, false, - EffectDifficultyClassComputation.SpellCastingFeature) - .SetEffectForms( - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.Negates, TurnOccurenceType.EndOfTurn, true) - .SetConditionForm(ConditionDefinitions.ConditionStunned, - ConditionForm.ConditionOperation.Add) - .Build(), - EffectFormBuilder - .Create() - .HasSavingThrow(EffectSavingThrowType.HalfDamage) - .SetDamageForm(DamageTypePsychic, 14, DieType.D6) - .Build()) - .SetParticleEffectParameters(PowerWordStun) - .Build()) - .AddToDB(); - } #endregion From cf8bf6b7e00aee9c1a95d215abaeb142384243fe Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 21:48:12 -0700 Subject: [PATCH 136/162] improve features that touch initiative order --- .../Models/Level20SubclassesContext.cs | 5 +++-- SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs | 8 ++------ 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index e64ab6f136..b7b520a41e 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -2199,8 +2199,7 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) var gameLocationScreenBattle = Gui.GuiService.GetScreen(); - gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, - GameLocationBattle.ContenderModificationMode.Remove, false, false); + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); } public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) @@ -2219,6 +2218,8 @@ public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) var positionCharacterIndex = initiativeSortedContenders.IndexOf(positionCharacter); initiativeSortedContenders.Insert(positionCharacterIndex, locationCharacter); + + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 744b33ac75..29d9dce6ed 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -2155,14 +2155,10 @@ public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) var rulesetCharacter = locationCharacter.RulesetCharacter; var roll = rulesetCharacter.RollDie(DieType.D8, RollContext.None, false, AdvantageType.None, out _, out _); - gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, - GameLocationBattle.ContenderModificationMode.Remove, false, false); - + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); locationCharacter.LastInitiative += roll; Gui.Battle.initiativeSortedContenders.Sort(Gui.Battle); - - gameLocationScreenBattle.initiativeTable.ContenderModified(locationCharacter, - GameLocationBattle.ContenderModificationMode.Add, false, false); + Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); locationCharacter.RulesetCharacter.LogCharacterUsedFeature( featureDefinition, From a0c0f403085b02e513d1de0afd15e881886a9cc2 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 22:24:20 -0700 Subject: [PATCH 137/162] fix Domain Tempest wrath of the storm --- .../ReactionResourceWrathOfTheStorm.cs | 24 --------------- .../Subclasses/DomainTempest.cs | 30 ++++++++++--------- 2 files changed, 16 insertions(+), 38 deletions(-) delete mode 100644 SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs deleted file mode 100644 index 5f808909ba..0000000000 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs +++ /dev/null @@ -1,24 +0,0 @@ -using SolastaUnfinishedBusiness.Api; -using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Interfaces; -using SolastaUnfinishedBusiness.Subclasses; -using UnityEngine.AddressableAssets; - -namespace SolastaUnfinishedBusiness.CustomUI; - -public class ReactionResourceWrathOfTheStorm : ICustomReactionResource -{ - private ReactionResourceWrathOfTheStorm() - { - } - - public static ICustomReactionResource Instance { get; } = new ReactionResourceWrathOfTheStorm(); - public AssetReferenceSprite Icon => DatabaseHelper.ActionDefinitions.ActionSurge.GuiPresentation.SpriteReference; - - public string GetUses(RulesetCharacter character) - { - var usablePower = PowerProvider.Get(DomainTempest.PowerWrathOfTheStorm, character); - - return character.GetRemainingUsesOfPower(usablePower).ToString(); - } -} diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index 7d7cc97d2b..af446098ff 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -79,7 +79,6 @@ public DomainTempest() .AddToDB(); PowerWrathOfTheStorm.AddCustomSubFeatures( - ReactionResourceWrathOfTheStorm.Instance, ModifyPowerVisibility.Hidden, new CustomBehaviorWrathOfTheStorm(PowerWrathOfTheStorm)); @@ -357,30 +356,33 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( private IEnumerator HandleReaction(CharacterAction action, GameLocationCharacter defender) { - if (action.AttackRoll == 0 || - action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess)) - { - yield break; - } - var attacker = action.ActingCharacter; var rulesetDefender = defender.RulesetCharacter; var usablePower = PowerProvider.Get(powerWrathOfTheStorm, rulesetDefender); - if (defender.CanReact() || - defender.IsWithinRange(attacker, 1) || - defender.CanPerceiveTarget(attacker) || + if (action.AttackRoll == 0 || + action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || + !defender.CanReact() || + !defender.IsWithinRange(attacker, 1) || + !defender.CanPerceiveTarget(attacker) || rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { - yield break; + yield break; } - yield return defender.MyReactToUsePower( - ActionDefinitions.Id.PowerReaction, + yield return defender.MyReactToSpendPowerBundle( usablePower, [attacker], attacker, - "WrathOfTheStorm"); + "WrathOfTheStorm", + reactionValidated: ReactionValidated); + + yield break; + + void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) + { + defender.SpendActionType(ActionDefinitions.ActionType.Reaction); + } } } From ab1133b49d49879882949695c2c866de66a38055 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Fri, 9 Aug 2024 22:24:40 -0700 Subject: [PATCH 138/162] minor tweaks --- SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs | 6 ++++-- .../CustomUI/ReactionResourceSorceryPoints.cs | 2 +- .../Models/Level20SubclassesContext.cs | 2 -- SolastaUnfinishedBusiness/Models/SpellsContext.cs | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs b/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs index a8cf95b0df..3160476091 100644 --- a/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs +++ b/SolastaUnfinishedBusiness/Behaviors/Specific/PowerBundle.cs @@ -202,6 +202,10 @@ internal static int GetRemainingPowerUses(this RulesetCharacter character, [NotN return (character.TryGetAttributeValue(AttributeDefinitions.BardicInspirationNumber) - character.UsedBardicInspiration) / power.CostPerUse; + case RechargeRate.BindChain: + return (character.TryGetAttributeValue(AttributeDefinitions.BindChainNumber) - + character.UsedBindChain) / + power.CostPerUse; case RechargeRate.ChannelDivinity: return (character.TryGetAttributeValue(AttributeDefinitions.ChannelDivinityNumber) - character.UsedChannelDivinity) / @@ -240,8 +244,6 @@ internal static int GetRemainingPowerUses(this RulesetCharacter character, [NotN break; case RechargeRate.D6_56: break; - case RechargeRate.BindChain: - break; case RechargeRate.TurnStart: break; #endif diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs index f4573168e0..8ed5ee84c6 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceSorceryPoints.cs @@ -9,7 +9,7 @@ private ReactionResourceSorceryPoints() { } - public static ICustomReactionResource Instance { get; } = new ReactionResourceSorceryPoints(); + public static ReactionResourceSorceryPoints Instance { get; } = new(); public string GetRequestPoints(CharacterReactionItem item) { diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index b7b520a41e..ebafe726be 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -2197,8 +2197,6 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) battle.InitiativeSortedContenders.RemoveAt(index); - var gameLocationScreenBattle = Gui.GuiService.GetScreen(); - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); } diff --git a/SolastaUnfinishedBusiness/Models/SpellsContext.cs b/SolastaUnfinishedBusiness/Models/SpellsContext.cs index cbdc124ca9..a69157d550 100644 --- a/SolastaUnfinishedBusiness/Models/SpellsContext.cs +++ b/SolastaUnfinishedBusiness/Models/SpellsContext.cs @@ -52,7 +52,6 @@ internal static class SpellsContext internal static readonly SpellDefinition PetalStorm = BuildPetalStorm(); internal static readonly SpellDefinition PsychicWhip = BuildPsychicWhip(); internal static readonly SpellDefinition PulseWave = BuildPulseWave(); - internal static readonly SpellDefinition RescueTheDying = BuildRescueTheDying(); internal static readonly SpellDefinition SearingSmite = BuildSearingSmite(); internal static readonly SpellDefinition SonicBoom = BuildSonicBoom(); internal static readonly SpellDefinition StaggeringSmite = BuildStaggeringSmite(); @@ -376,7 +375,7 @@ internal static void LateLoad() // 7th level RegisterSpell(BuildCrownOfStars(), 0, SpellListSorcerer, SpellListWarlock, SpellListWizard); RegisterSpell(BuildDraconicTransformation(), 0, SpellListDruid, SpellListSorcerer, SpellListWizard); - RegisterSpell(RescueTheDying, 0, SpellListCleric, SpellListDruid); + RegisterSpell(BuildRescueTheDying(), 0, SpellListCleric, SpellListDruid); RegisterSpell(BuildReverseGravity(), 0, SpellListDruid, SpellListSorcerer, SpellListWizard); // 8th level From cd5f0719a9a415f7c27e37d84af366e78ec090e3 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 08:28:18 -0700 Subject: [PATCH 139/162] add missing React term --- .../Translations/de/SubClasses/PathOfTheWildMagic-de.txt | 1 + .../Translations/en/SubClasses/PathOfTheWildMagic-en.txt | 3 ++- .../Translations/es/SubClasses/PathOfTheWildMagic-es.txt | 1 + .../Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt | 1 + .../Translations/it/SubClasses/PathOfTheWildMagic-it.txt | 1 + .../Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt | 1 + .../Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt | 1 + .../Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt | 1 + .../Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt | 1 + .../Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt | 1 + 10 files changed, 11 insertions(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt index 696eacddd9..c96ca869c5 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/PathOfTheWildMagic-de.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Nutzen Sie Ihre Reak Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Instabiles Spiel Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Beschworener Geist Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Wählen Sie einen Wild Surge-Effekt zum Aktivieren aus. Wenn keine Auswahl getroffen wird, wird standardmäßig der erste Effekt aktiviert. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Aktiviere einen Wild Surge-Effekt. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Aktivieren Sie Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Kontrollierter Anstieg Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Nutzen Sie Ihre Reaktion, um „Wild Surge“ zu würfeln und den aktiven Effekt zu ersetzen. diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt index da00b4ef9d..4024ffa27f 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/PathOfTheWildMagic-en.txt @@ -50,7 +50,8 @@ Feature/&PowerPathOfTheWildMagicTeleportDescription=You teleport up to 30 feet t Feature/&PowerPathOfTheWildMagicTeleportTitle=Wild Surge: Teleport Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Use your reaction to roll Wild Surge and replace the active effect. Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Unstable Backlash -Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Select a Wild Surge Effect to activate. If no selection is made, the first effect will be activated by default. +Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Select a Wild Surge effect to activate. If no selection is made, the first effect will be activated by default. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Activate a Wild Surge effect. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activate Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Controlled Surge Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Use your reaction to roll Wild Surge and replace the active effect. diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt index f90d7af9ef..b4f39b7914 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/PathOfTheWildMagic-es.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa tu reacción par Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Reacción inestable Proxy/&ProxyPathOfTheWildMagicSummonTitle=Oleada salvaje: Espíritu invocado Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Selecciona un efecto de Oleada salvaje para activar. Si no realizas ninguna selección, se activará el primer efecto de forma predeterminada. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Activa un efecto de Oleada salvaje. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activar Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Aumento controlado Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Usa tu reacción para lanzar Oleada salvaje y reemplazar el efecto activo. diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt index 9223ec0bfe..bd268c44d9 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/PathOfTheWildMagic-fr.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Utilisez votre réac Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Contrecoup instable Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge : Esprit invoqué Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Sélectionnez un effet Wild Surge à activer. Si aucune sélection n'est effectuée, le premier effet sera activé par défaut. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Activez un effet Wild Surge. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Activer Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Surtension contrôlée Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Utilisez votre réaction pour lancer Wild Surge et remplacer l'effet actif. diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt index 6e460db618..1fe93ab7e8 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheWildMagic-it.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Usa la tua reazione Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Gioco instabile Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Spirito Evocato Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Seleziona un effetto Wild Surge da attivare. Se non viene effettuata alcuna selezione, il primo effetto verrà attivato per impostazione predefinita. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Attiva un effetto Wild Surge. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Attivare Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Sovratensione controllata Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Usa la tua reazione per lanciare Wild Surge e sostituire l'effetto attivo. diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt index 1ac929ffc7..3175acad10 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/PathOfTheWildMagic-ja.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=反応を使用し Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=不安定な反発 Proxy/&ProxyPathOfTheWildMagicSummonTitle=ワイルドサージ:召喚されたスピリット Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=有効にするワイルドサージ効果を選択します。選択しない場合は、デフォルトで最初の効果が有効になります。 +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=ワイルドサージ効果を発動します。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=活性化 Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=制御されたサージ Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=反応を使用してワイルドサージをロールし、アクティブな効果を置き換えます。 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt index 06a3985597..ab239a1d92 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/PathOfTheWildMagic-ko.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=반응을 사용하 Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=불안정한 반발 Proxy/&ProxyPathOfTheWildMagicSummonTitle=와일드 서지: 소환된 영혼 Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=활성화할 Wild Surge 효과를 선택합니다. 선택하지 않으면 기본적으로 첫 번째 효과가 활성화됩니다. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=와일드 서지 효과를 활성화합니다. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=활성화 Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=제어된 서지 Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=반응을 사용하여 Wild Surge를 굴리고 활성 효과를 교체하십시오. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt index b41d45adac..ae93ceb51e 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheWildMagic-pt-BR.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Use sua reação par Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Reação Instável Proxy/&ProxyPathOfTheWildMagicSummonTitle=Wild Surge: Espírito Invocado Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Selecione um Wild Surge Effect para ativar. Se nenhuma seleção for feita, o primeiro efeito será ativado por padrão. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Ative um efeito de Surto Selvagem. Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Ativar Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Surto controlado Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Use sua reação para rolar Surto Selvagem e substituir o efeito ativo. diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt index e6de797794..21a4c37ec1 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/PathOfTheWildMagic-ru.txt @@ -51,6 +51,7 @@ Feature/&PowerPathOfTheWildMagicTeleportTitle=Всплеск дикости: т Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=Используйте свою реакцию, чтобы совершить бросок по таблице "Дикая магия" и заменить активный эффект. Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=Нестабильная отдача Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=Выберите эффект всплеска дикости для активации. Если выбор не совершён, первый эффект будет активирован по умолчанию. +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=Активируйте эффект «Дикого всплеска». Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=Активировать Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=Контролируемый всплеск Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=Используйте свою реакцию, чтобы совершить бросок по таблице "Дикая магия" и заменить активный эффект. diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt index 2812621de7..1896916180 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/PathOfTheWildMagic-zh-CN.txt @@ -54,6 +54,7 @@ Feature/&PowerPathOfTheWildMagicUnstableBacklashDescription=使用你的反应 Feature/&PowerPathOfTheWildMagicUnstableBacklashTitle=掌控浪潮 Proxy/&ProxyPathOfTheWildMagicSummonTitle=狂野浪潮:召唤灵魂 Reaction/&ReactionSpendPowerBundleControlledSurgeDescription=选择要激活的狂野涌动效果。如果未进行选择,则默认激活第一个效果。 +Reaction/&ReactionSpendPowerBundleControlledSurgeReactDescription=激活狂野涌动效果。 Reaction/&ReactionSpendPowerBundleControlledSurgeReactTitle=启用 Reaction/&ReactionSpendPowerBundleControlledSurgeTitle=控制浪涌 Reaction/&UsePowerPathOfTheWildMagicUnstableBacklashDescription=使用你的反应来滚动狂野浪潮并替换主动效果。 From 6c3c1086cd1d662d60de7017d7e5a2c14723a4a7 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 09:16:20 -0700 Subject: [PATCH 140/162] review usages of GetRemainingPowerUses and GetRemainingUsesOfPower --- .../RulesetCharacterExtensions.cs | 2 +- .../ReactionRequestSpendBundlePower.cs | 1 + .../CustomUI/Tooltips.cs | 3 +- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 5 +-- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 39 +++---------------- .../Models/FixesContext.cs | 6 +-- .../Patches/ShapeOptionItemPatcher.cs | 6 +-- SolastaUnfinishedBusiness/Races/Imp.cs | 6 +-- SolastaUnfinishedBusiness/Races/Wyrmkin.cs | 15 ++----- .../Spells/SpellBuildersLevel07.cs | 3 +- .../Subclasses/CircleOfTheNight.cs | 2 +- .../Subclasses/MartialForceKnight.cs | 3 +- .../Subclasses/MartialRoyalKnight.cs | 4 +- .../Subclasses/MartialWarlord.cs | 5 +-- .../Subclasses/PathOfTheBeast.cs | 4 +- .../Subclasses/RoguishBladeCaller.cs | 5 +-- .../Subclasses/WizardWarMagic.cs | 5 +-- .../Validators/ValidatorsCharacter.cs | 2 + 18 files changed, 39 insertions(+), 77 deletions(-) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs index 21f2402aa4..b4240df485 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/RulesetCharacterExtensions.cs @@ -196,7 +196,7 @@ internal static bool CanUsePower(this RulesetCharacter instance, bool considerUses = true, bool considerHaving = false) { - if (power == null) + if (!power) { return false; } diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs index 827810ccd7..6955b30465 100644 --- a/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionRequestSpendBundlePower.cs @@ -97,6 +97,7 @@ private static bool CanUsePower(RulesetCharacter character, FeatureDefinitionPow return false; } + // must use GetRemainingPowerUses as power could be a Shared Pool return character.GetRemainingPowerUses(power) > 0; } diff --git a/SolastaUnfinishedBusiness/CustomUI/Tooltips.cs b/SolastaUnfinishedBusiness/CustomUI/Tooltips.cs index 95a76d950f..10cd4ae26b 100644 --- a/SolastaUnfinishedBusiness/CustomUI/Tooltips.cs +++ b/SolastaUnfinishedBusiness/CustomUI/Tooltips.cs @@ -59,7 +59,8 @@ private static string FormatUses(FeatureDefinitionPower power, RulesetCharacter var usablePower = PowerProvider.Get(power, character); var maxUses = character.GetMaxUsesOfPower(usablePower); - var remainingUses = character.GetRemainingUsesOfPower(usablePower); + // must use GetRemainingPowerUses as power could be a Shared Pool + var remainingUses = character.GetRemainingPowerUses(power); return $"{remainingUses}/{maxUses}"; } diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 7d06fc60ea..b4c948d57b 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -970,17 +970,16 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( private IEnumerator HandleBalefulScion(GameLocationCharacter attacker, GameLocationCharacter defender) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerBalefulScion, rulesetAttacker); if (!attacker.IsWithinRange(defender, 12) || !attacker.OncePerTurnIsValid(powerBalefulScion.Name) || !rulesetAttacker.IsToggleEnabled((ActionDefinitions.Id)ExtraActionId.BalefulScionToggle) || - rulesetAttacker.GetRemainingPowerUses(powerBalefulScion) == 0) + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } - var usablePower = PowerProvider.Get(powerBalefulScion, rulesetAttacker); - attacker.UsedSpecialFeatures.TryAdd(powerBalefulScion.Name, 0); usablePower.Consume(); rulesetAttacker.InflictCondition( diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 0148e6b00f..2a1f5094b6 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -7,7 +7,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -1582,9 +1581,8 @@ private static FeatDefinition BuildOrcishFury(List feats) private sealed class CustomBehaviorOrcishFury( FeatureDefinitionPower powerOrcishFury, ConditionDefinition conditionDefinition) - : IPhysicalAttackBeforeHitConfirmedOnEnemy, IPhysicalAttackFinishedByMe, - IPhysicalAttackBeforeHitConfirmedOnMe, IMagicEffectBeforeHitConfirmedOnMe, - IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe + : IPhysicalAttackBeforeHitConfirmedOnEnemy, IPhysicalAttackBeforeHitConfirmedOnMe, + IMagicEffectBeforeHitConfirmedOnMe, IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe { #region Additional Damage @@ -1601,15 +1599,17 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( bool criticalHit) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerOrcishFury, rulesetAttacker); if (!ValidatorsWeapon.IsOfWeaponType(CustomSituationalContext.SimpleOrMartialWeapons) (attackMode, null, null) || !rulesetAttacker.IsToggleEnabled((ActionDefinitions.Id)ExtraActionId.OrcishFuryToggle) || - rulesetAttacker.GetRemainingPowerUses(powerOrcishFury) == 0) + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } + usablePower.Consume(); rulesetAttacker.InflictCondition( conditionDefinition.Name, DurationType.Round, @@ -1625,35 +1625,6 @@ public IEnumerator OnPhysicalAttackBeforeHitConfirmedOnEnemy( 0); } - public IEnumerator OnPhysicalAttackFinishedByMe( - GameLocationBattleManager battleManager, - CharacterAction action, - GameLocationCharacter attacker, - GameLocationCharacter defender, - RulesetAttackMode attackMode, - RollOutcome rollOutcome, - int damageAmount) - { - if (rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess)) - { - yield break; - } - - var rulesetAttacker = attacker.RulesetCharacter; - - if (!ValidatorsWeapon.IsOfWeaponType(CustomSituationalContext.SimpleOrMartialWeapons) - (attackMode, null, null) || - !rulesetAttacker.IsToggleEnabled((ActionDefinitions.Id)ExtraActionId.OrcishFuryToggle) || - rulesetAttacker.GetRemainingPowerUses(powerOrcishFury) == 0) - { - yield break; - } - - var usablePower = PowerProvider.Get(powerOrcishFury, rulesetAttacker); - - rulesetAttacker.UsePower(usablePower); - } - #endregion #region Knock-Out diff --git a/SolastaUnfinishedBusiness/Models/FixesContext.cs b/SolastaUnfinishedBusiness/Models/FixesContext.cs index 1bb1dcc47d..6d2e378559 100644 --- a/SolastaUnfinishedBusiness/Models/FixesContext.cs +++ b/SolastaUnfinishedBusiness/Models/FixesContext.cs @@ -7,7 +7,6 @@ using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Feats; using SolastaUnfinishedBusiness.Interfaces; @@ -686,8 +685,9 @@ public IEnumerator OnPhysicalAttackFinishedByMe( } var rulesetAttacker = action.ActingCharacter.RulesetCharacter; + var usablePower = PowerProvider.Get(PowerMonkStunningStrike, rulesetAttacker); - if (rulesetAttacker.GetRemainingPowerUses(PowerMonkStunningStrike) == 0) + if (rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -728,8 +728,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var usablePower = PowerProvider.Get(PowerMonkStunningStrike, rulesetAttacker); - attacker.MyExecuteActionPowerNoCost(usablePower, [defender]); } diff --git a/SolastaUnfinishedBusiness/Patches/ShapeOptionItemPatcher.cs b/SolastaUnfinishedBusiness/Patches/ShapeOptionItemPatcher.cs index d4241f29f5..70db10e67d 100644 --- a/SolastaUnfinishedBusiness/Patches/ShapeOptionItemPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/ShapeOptionItemPatcher.cs @@ -2,7 +2,7 @@ using HarmonyLib; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; -using SolastaUnfinishedBusiness.Behaviors; +using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Subclasses; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.CharacterClassDefinitions; using static SolastaUnfinishedBusiness.Api.DatabaseHelper.FeatureDefinitionPowers; @@ -36,12 +36,12 @@ public static void Postfix( var power = isCircleOfTheNight ? CircleOfTheNight.PowerCircleOfTheNightWildShapeCombat : PowerDruidWildShape; - var rulesetUsablePower = PowerProvider.Get(power, rulesetCharacterHero); var isShapeOptionAvailable = requiredLevel <= levels && (!isCircleOfTheNight || !CircleOfTheNight.IsTwoPointsShape(shapeDefinition) || - shifter.GetRemainingUsesOfPower(rulesetUsablePower) > 1); + // must use GetRemainingPowerUses as PowerCircleOfTheNightWildShapeCombat is a shared pool power + shifter.GetRemainingPowerUses(power) > 1); __instance.levelLabel.TMP_Text.color = isShapeOptionAvailable ? __instance.validLevelColor diff --git a/SolastaUnfinishedBusiness/Races/Imp.cs b/SolastaUnfinishedBusiness/Races/Imp.cs index e9f34a43e9..b32c834918 100644 --- a/SolastaUnfinishedBusiness/Races/Imp.cs +++ b/SolastaUnfinishedBusiness/Races/Imp.cs @@ -6,7 +6,6 @@ using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Behaviors; -using SolastaUnfinishedBusiness.Behaviors.Specific; using SolastaUnfinishedBusiness.Builders; using SolastaUnfinishedBusiness.Builders.Features; using SolastaUnfinishedBusiness.CustomUI; @@ -797,16 +796,15 @@ private void HandleImpishWrath(GameLocationCharacter attacker, List } var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerImpForestImpishWrath, rulesetAttacker); var alreadyTriggered = rulesetAttacker.HasConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionImpForestImpishWrathMark.Name); var shouldTrigger = rulesetAttacker.IsToggleEnabled(ImpishWrathToggle) && - rulesetAttacker.GetRemainingPowerUses(powerImpForestImpishWrath) > 0; + rulesetAttacker.GetRemainingUsesOfPower(usablePower) > 0; if (shouldTrigger && !alreadyTriggered) { - var usablePower = PowerProvider.Get(powerImpForestImpishWrath, rulesetAttacker); - rulesetAttacker.UsePower(usablePower); rulesetAttacker.InflictCondition( conditionImpForestImpishWrathMark.Name, diff --git a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs index 4fab01329c..a570f37910 100644 --- a/SolastaUnfinishedBusiness/Races/Wyrmkin.cs +++ b/SolastaUnfinishedBusiness/Races/Wyrmkin.cs @@ -328,20 +328,13 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( RollOutcome rollOutcome, int damageAmount) { - var actionManager = - ServiceRepository.GetService() as GameLocationActionManager; - - if (!actionManager) - { - yield break; - } - var rulesetDefender = defender.RulesetCharacter; + var usablePower = PowerProvider.Get(powerHighWyrmkinSwiftRetribution, rulesetDefender); if (rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || defender.IsMyTurn() || !defender.CanReact() || - rulesetDefender.GetRemainingPowerUses(powerHighWyrmkinSwiftRetribution) == 0) + rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -372,11 +365,9 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( battleManager); yield break; - + void ReactionValidated() { - var usablePower = PowerProvider.Get(powerHighWyrmkinSwiftRetribution, rulesetDefender); - rulesetDefender.UsePower(usablePower); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs index 5319430703..9de4f5f53d 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel07.cs @@ -397,7 +397,8 @@ private sealed class CustomBehaviorPowerCrownOfStars( public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) { var rulesetCharacter = action.ActingCharacter.RulesetCharacter; - var remainingUses = action.ActingCharacter.RulesetCharacter.GetRemainingPowerUses(powerMotes); + // must use GetRemainingPowerUses for convenience + var remainingUses = rulesetCharacter.GetRemainingPowerUses(powerMotes); // ReSharper disable once ConvertIfStatementToSwitchStatement if (remainingUses == 0 && diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheNight.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheNight.cs index f584cf3071..658a13276e 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheNight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheNight.cs @@ -138,7 +138,7 @@ public CircleOfTheNight() .AddToDB(); } - internal static FeatureDefinitionPower PowerCircleOfTheNightWildShapeCombat { get; private set; } + internal static FeatureDefinitionPowerSharedPool PowerCircleOfTheNightWildShapeCombat { get; private set; } internal override CharacterClassDefinition Klass => CharacterClassDefinitions.Druid; diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs index 2bb512283d..08e8b3585c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialForceKnight.cs @@ -737,7 +737,8 @@ public IEnumerator OnTryAlterOutcomeAttack( helper.IsOppositeSide(defender.Side) || !helper.CanReact() || !helper.CanPerceiveTarget(defender) || - rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) + // must use GetRemainingPowerUses as a shared pool power + rulesetHelper.GetRemainingPowerUses(powerKineticBarrier) == 0) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs index 0daa8b6e9d..df9b1e5a3f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs @@ -267,8 +267,10 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - yield return originalHelper.MyReactToSpendPower( + yield return originalHelper.MyReactToUsePower( + ActionDefinitions.Id.PowerNoCost, usablePower, + [], attacker, "RoyalKnightInspiringProtection", FormatReactionDescription(action, attacker, defender, originalHelper), diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs b/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs index 1dfa55cc7d..4975d9962b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialWarlord.cs @@ -545,8 +545,9 @@ public IEnumerator OnPhysicalAttackFinishedByMe( int damageAmount) { var rulesetCharacter = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerCoordinatedAssault, rulesetCharacter); - if (rulesetCharacter.GetRemainingPowerUses(powerCoordinatedAssault) == 0) + if (rulesetCharacter.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -673,8 +674,6 @@ public IEnumerator OnPhysicalAttackFinishedByMe( yield break; } - var usablePower = PowerProvider.Get(powerCoordinatedAssault, rulesetCharacter); - attacker.UsedSpecialFeatures.TryAdd(CoordinatedAssaultMarker, 0); rulesetCharacter.UsePower(usablePower); } diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index c66b6f43a5..609b4d398e 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -681,11 +681,11 @@ public IEnumerator OnPhysicalAttackFinishedByMe( { var rulesetAttacker = attacker.RulesetCharacter; var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerInfectiousFury, attacker.RulesetCharacter); + var usablePower = PowerProvider.Get(powerInfectiousFury, rulesetAttacker); if (rollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || !attacker.IsMyTurn() || - rulesetAttacker.GetRemainingPowerUses(powerInfectiousFury) == 0 || + rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0 || rulesetDefender is not { IsDeadOrDyingOrUnconscious: false } || rulesetDefender.HasAnyConditionOfType(condition.name) || attackMode.SourceDefinition is not ItemDefinition item || diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs index 304750634c..f65e6cf813 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishBladeCaller.cs @@ -381,14 +381,13 @@ public IEnumerator HandleReducedToZeroHpByMe( RulesetEffect activeEffect) { var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerHailOfBlades, rulesetAttacker); - if (rulesetAttacker.GetRemainingPowerUses(powerHailOfBlades) > 0) + if (rulesetAttacker.GetRemainingUsesOfPower(usablePower) > 0) { yield break; } - var usablePower = PowerProvider.Get(powerHailOfBlades, rulesetAttacker); - rulesetAttacker.RepayPowerUse(usablePower); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index 9423c7b44c..c5eefa20d2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -389,17 +389,16 @@ private void HandlePowerSurge(GameLocationCharacter attacker, List a } var rulesetAttacker = attacker.RulesetCharacter; + var usablePower = PowerProvider.Get(powerSurge, rulesetAttacker); var alreadyTriggered = rulesetAttacker.HasConditionOfCategoryAndType( AttributeDefinitions.TagEffect, conditionSurgeMark.Name); var shouldTrigger = attacker.OncePerTurnIsValid(powerSurge.Name) && rulesetAttacker.IsToggleEnabled((ActionDefinitions.Id)ExtraActionId.PowerSurgeToggle) && - rulesetAttacker.GetRemainingPowerUses(powerSurge) > 0; + rulesetAttacker.GetRemainingUsesOfPower(usablePower) > 0; if (shouldTrigger && !alreadyTriggered) { - var usablePower = PowerProvider.Get(powerSurge, rulesetAttacker); - attacker.UsedSpecialFeatures.TryAdd(powerSurge.Name, 0); rulesetAttacker.UsePower(usablePower); rulesetAttacker.InflictCondition( diff --git a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs index 9f86fe7b8f..5cec6ff0ad 100644 --- a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs +++ b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs @@ -124,11 +124,13 @@ internal static bool HasBowWithoutArmor(RulesetCharacter character) internal static IsCharacterValidHandler HasAvailablePowerUsage(FeatureDefinitionPower power) { + // must use GetRemainingPowerUses return character => character.GetRemainingPowerUses(power) > 0; } internal static IsCharacterValidHandler HasNotAvailablePowerUsage(FeatureDefinitionPower power) { + // must use GetRemainingPowerUses return character => character.GetRemainingPowerUses(power) == 0; } From 4b7c5f1ebb9869eb6663969de6344971e8935001 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 09:52:10 -0700 Subject: [PATCH 141/162] remove unused terms --- .../Translations/de/SubClasses/MartialWeaponMaster-de.txt | 4 ---- .../Translations/en/SubClasses/MartialWeaponMaster-en.txt | 4 ---- .../Translations/es/SubClasses/MartialWeaponMaster-es.txt | 4 ---- .../Translations/fr/SubClasses/MartialWeaponMaster-fr.txt | 4 ---- .../Translations/it/SubClasses/MartialWeaponMaster-it.txt | 4 ---- .../Translations/ja/SubClasses/MartialWeaponMaster-ja.txt | 4 ---- .../Translations/ko/SubClasses/MartialWeaponMaster-ko.txt | 4 ---- .../pt-BR/SubClasses/MartialWeaponMaster-pt-BR.txt | 4 ---- .../Translations/ru/SubClasses/MartialWeaponMaster-ru.txt | 4 ---- .../zh-CN/SubClasses/MartialWeaponMaster-zh-CN.txt | 4 ---- 10 files changed, 40 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialWeaponMaster-de.txt b/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialWeaponMaster-de.txt index ccc824d793..49db2a9f11 100644 --- a/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialWeaponMaster-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/SubClasses/MartialWeaponMaster-de.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Konzentrierte Schläge Feedback/&ActivateRepaysLine={0} erhält die Nutzung von {1} zurück Feedback/&AdditionalDamageDeadlyAccuracyFormat=Präzisionsangriff! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} führt einen tödlichen Präzisionsangriff auf {1} (+{2}) aus -Reaction/&CustomReactionMomentumDescription=Du entwickelst Schwung und kannst einen Bonusangriff erzielen. -Reaction/&CustomReactionMomentumReactDescription=Gewinnen Sie an Schwung. -Reaction/&CustomReactionMomentumReactTitle=Schwung -Reaction/&CustomReactionMomentumTitle=Schwung Subclass/&MartialWeaponMasterDescription=Waffenmeister sind erstklassige Krieger, die all ihre Zeit und Energie der Beherrschung einer einzigen Waffenart gewidmet haben. Sie sind außerordentlich geschickt darin, Schwächen auszunutzen und können mit tödlicher Effizienz durch die feindlichen Linien brechen. Subclass/&MartialWeaponMasterTitle=Waffenmeister UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Waffenspezialisierung diff --git a/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialWeaponMaster-en.txt b/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialWeaponMaster-en.txt index df38b5b112..d7c8afe62a 100644 --- a/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialWeaponMaster-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/SubClasses/MartialWeaponMaster-en.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Focused Strikes Feedback/&ActivateRepaysLine={0} regains use of {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=Accuracy Attack! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} performs a deadly accuracy attack on {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=You develop momentum and can gain a bonus attack. -Reaction/&CustomReactionMomentumReactDescription=Gain momentum. -Reaction/&CustomReactionMomentumReactTitle=Momentum -Reaction/&CustomReactionMomentumTitle=Momentum Subclass/&MartialWeaponMasterDescription=Weapon Masters are first-rate warriors who devoted all their time and energy into Mastery a single weapon type. They are extraordinarily adept at exploiting weaknesses and can cut through enemy lines with deadly efficiency. Subclass/&MartialWeaponMasterTitle=Weapon Master UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Weapon Specialization diff --git a/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialWeaponMaster-es.txt b/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialWeaponMaster-es.txt index 4d00c821d6..89aedd063f 100644 --- a/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialWeaponMaster-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/SubClasses/MartialWeaponMaster-es.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Golpes concentrados Feedback/&ActivateRepaysLine={0} recupera el uso de {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=¡Ataque de precisión! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} realiza un ataque de precisión letal contra {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=Desarrollas impulso y puedes obtener un ataque adicional. -Reaction/&CustomReactionMomentumReactDescription=Ganar momento. -Reaction/&CustomReactionMomentumReactTitle=Impulso -Reaction/&CustomReactionMomentumTitle=Impulso Subclass/&MartialWeaponMasterDescription=Los maestros de armas son guerreros de primera categoría que dedican todo su tiempo y energía a dominar un solo tipo de arma. Son extraordinariamente hábiles para explotar las debilidades y pueden atravesar las líneas enemigas con una eficacia letal. Subclass/&MartialWeaponMasterTitle=Maestro de armas UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Especialización en armas diff --git a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialWeaponMaster-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialWeaponMaster-fr.txt index 09da207399..cf1f1b8103 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialWeaponMaster-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/SubClasses/MartialWeaponMaster-fr.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Frappes ciblées Feedback/&ActivateRepaysLine={0} récupère l'usage de {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=Attaque de précision ! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} effectue une attaque de précision mortelle sur {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=Vous développez votre élan et pouvez obtenir une attaque bonus. -Reaction/&CustomReactionMomentumReactDescription=Prendre de l'élan. -Reaction/&CustomReactionMomentumReactTitle=Élan -Reaction/&CustomReactionMomentumTitle=Élan Subclass/&MartialWeaponMasterDescription=Les maîtres d'armes sont des guerriers de premier ordre qui ont consacré tout leur temps et leur énergie à la maîtrise d'un seul type d'arme. Ils sont extraordinairement doués pour exploiter les faiblesses et peuvent percer les lignes ennemies avec une efficacité mortelle. Subclass/&MartialWeaponMasterTitle=Maître d'armes UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Spécialisation des armes diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialWeaponMaster-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialWeaponMaster-it.txt index 7677a7dd2c..0f58737984 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialWeaponMaster-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/MartialWeaponMaster-it.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Colpi mirati Feedback/&ActivateRepaysLine={0} riacquista l'uso di {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=Attacco di precisione! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} esegue un attacco di precisione mortale su {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=Acquisisci slancio e puoi ottenere un attacco bonus. -Reaction/&CustomReactionMomentumReactDescription=Acquisire slancio. -Reaction/&CustomReactionMomentumReactTitle=Quantità di moto -Reaction/&CustomReactionMomentumTitle=Quantità di moto Subclass/&MartialWeaponMasterDescription=I Maestri d'armi sono guerrieri di prima categoria che hanno dedicato tutto il loro tempo e la loro energia alla Padronanza di un singolo tipo di arma. Sono straordinariamente abili nello sfruttare le debolezze e possono tagliare le linee nemiche con efficienza mortale. Subclass/&MartialWeaponMasterTitle=Maestro d'armi UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Specializzazione delle armi diff --git a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialWeaponMaster-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialWeaponMaster-ja.txt index 269882ea7d..64d96d4e9a 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialWeaponMaster-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/SubClasses/MartialWeaponMaster-ja.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=集中攻撃 Feedback/&ActivateRepaysLine={0} が {1} の使用を回復します Feedback/&AdditionalDamageDeadlyAccuracyFormat=アキュラシーアタック! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} が {1} に対して致命的な精度攻撃を実行します (+{2}) -Reaction/&CustomReactionMomentumDescription=勢いがつき、ボーナス攻撃を得ることができます。 -Reaction/&CustomReactionMomentumReactDescription=勢いを得ます。 -Reaction/&CustomReactionMomentumReactTitle=勢い -Reaction/&CustomReactionMomentumTitle=勢い Subclass/&MartialWeaponMasterDescription=武器マスターは、1 種類の武器の習得に時間とエネルギーをすべて費やした一流の戦士です。彼らは弱点を突くことに非常に長けており、驚くほど効率的に敵の戦線を切り抜けることができます。 Subclass/&MartialWeaponMasterTitle=武器マスター UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=武器の特化 diff --git a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialWeaponMaster-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialWeaponMaster-ko.txt index 72ddc5b8ae..848cd1bab3 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialWeaponMaster-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/SubClasses/MartialWeaponMaster-ko.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=집중 공격 Feedback/&ActivateRepaysLine={0}은(는) {1}의 사용을 다시 얻습니다. Feedback/&AdditionalDamageDeadlyAccuracyFormat=정확도 공격! Feedback/&AdditionalDamageDeadlyAccuracyLine={0}이(가) {1}(+{2})에 대해 치명적인 정확도 공격을 수행합니다. -Reaction/&CustomReactionMomentumDescription=추진력을 키우고 보너스 공격을 얻을 수 있습니다. -Reaction/&CustomReactionMomentumReactDescription=추진력을 얻으세요. -Reaction/&CustomReactionMomentumReactTitle=기세 -Reaction/&CustomReactionMomentumTitle=기세 Subclass/&MartialWeaponMasterDescription=웨폰 마스터는 단일 무기 유형을 마스터하는 데 모든 시간과 에너지를 쏟은 일류 전사입니다. 그들은 약점을 이용하는 데 매우 능숙하며 치명적인 효율성으로 적진을 뚫을 수 있습니다. Subclass/&MartialWeaponMasterTitle=무기 마스터 UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=무기 전문화 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialWeaponMaster-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialWeaponMaster-pt-BR.txt index fb4be98a4c..7d103462eb 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialWeaponMaster-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/MartialWeaponMaster-pt-BR.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Ataques Focados Feedback/&ActivateRepaysLine={0} recupera o uso de {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=Ataque de precisão! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} executa um ataque de precisão mortal em {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=Você desenvolve impulso e pode ganhar um ataque bônus. -Reaction/&CustomReactionMomentumReactDescription=Ganhe impulso. -Reaction/&CustomReactionMomentumReactTitle=Momento -Reaction/&CustomReactionMomentumTitle=Momento Subclass/&MartialWeaponMasterDescription=Mestres de Armas são guerreiros de primeira classe que devotaram todo seu tempo e energia para dominar um único tipo de arma. Eles são extraordinariamente hábeis em explorar fraquezas e podem cortar as linhas inimigas com eficiência mortal. Subclass/&MartialWeaponMasterTitle=Mestre das Armas UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Especialização em Armas diff --git a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialWeaponMaster-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialWeaponMaster-ru.txt index 2edd6816af..5877c018e8 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialWeaponMaster-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/SubClasses/MartialWeaponMaster-ru.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=Целенаправлен Feedback/&ActivateRepaysLine={0} восстанавливает использование {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=Точная атака! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} совершает атаку со смертельной точностью по {1} (+{2}) -Reaction/&CustomReactionMomentumDescription=Вы развили импульс и можете получить бонусную атаку. -Reaction/&CustomReactionMomentumReactDescription=Получить импульс. -Reaction/&CustomReactionMomentumReactTitle=Импульс -Reaction/&CustomReactionMomentumTitle=Импульс Subclass/&MartialWeaponMasterDescription=Мастера оружия - это первоклассные воины, посвятившие всё своё время и энергию овладению одним видом оружия. Они чрезвычайно искусны в использовании слабых мест и могут прорываться сквозь ряды врагов со смертельной эффективностью. Subclass/&MartialWeaponMasterTitle=Мастер оружия UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=Специализация на оружии diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialWeaponMaster-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialWeaponMaster-zh-CN.txt index f6fd3af4a2..a35cfc2fb0 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialWeaponMaster-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/SubClasses/MartialWeaponMaster-zh-CN.txt @@ -17,10 +17,6 @@ Feature/&PowerMartialWeaponMasterFocusedStrikesTitle=集中打击 Feedback/&ActivateRepaysLine={0} 重新获得 {1} Feedback/&AdditionalDamageDeadlyAccuracyFormat=精准攻击! Feedback/&AdditionalDamageDeadlyAccuracyLine={0} 对 {1} 进行致命精准攻击 (+{2}) -Reaction/&CustomReactionMomentumDescription=你获得势不可当,可以获得附赠攻击。 -Reaction/&CustomReactionMomentumReactDescription=获得势不可当。 -Reaction/&CustomReactionMomentumReactTitle=势不可当 -Reaction/&CustomReactionMomentumTitle=势不可当 Subclass/&MartialWeaponMasterDescription=武器大师是一流的战士,他们将所有的时间和精力都投入到精通一种武器类型中。他们非常善于利用弱点,能够以致命的效率突破敌人的防线。 Subclass/&MartialWeaponMasterTitle=武器大师 UI/&CustomFeatureSelectionTooltipTypeMartialWeaponMaster=武器专精 From fc1adf5789a27c34e3e776174032efb074cd7d08 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 10:58:51 -0700 Subject: [PATCH 142/162] minor fixes after reactions refactor --- SolastaUnfinishedBusiness/Classes/InventorClass.cs | 5 ++--- SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs | 6 +----- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 8010557020..73a3faabf9 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -1001,10 +1001,8 @@ public IEnumerator OnTryAlterAttributeCheck( yield break; } - yield return helper.MyReactToUsePower( - ActionDefinitions.Id.PowerReaction, + yield return helper.MyReactToSpendPower( usablePower, - [helper], defender, "InventorFlashOfGeniusCheck", "SpendPowerInventorFlashOfGeniusCheckDescription".Formatted( @@ -1028,6 +1026,7 @@ void ReactionValidated() ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); + usablePower.Consume(); helper.RulesetCharacter.LogCharacterUsedPower( power, "Feedback/&FlashOfGeniusCheckToHitRoll", diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs index df9b1e5a3f..d0d785f7b7 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs @@ -267,10 +267,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( yield break; } - yield return originalHelper.MyReactToUsePower( - ActionDefinitions.Id.PowerNoCost, + yield return originalHelper.MyReactToSpendPower( usablePower, - [], attacker, "RoyalKnightInspiringProtection", FormatReactionDescription(action, attacker, defender, originalHelper), @@ -298,8 +296,6 @@ void ReactionValidated() action.SaveOutcome = saveOutcome; action.SaveOutcomeDelta = saveOutcomeDelta; - - rulesetOriginalHelper.LogCharacterUsedPower(powerInspiringProtection, indent: true); } } From f81a17712435276a9a9db67f0ad11dc691343e27 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 11:01:10 -0700 Subject: [PATCH 143/162] fix MyReactToCastSpell reaction modal descriptions --- .../Api/GameExtensions/GameLocationCharacterExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs index 8796aef30a..9badffacc3 100644 --- a/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs +++ b/SolastaUnfinishedBusiness/Api/GameExtensions/GameLocationCharacterExtensions.cs @@ -176,6 +176,7 @@ internal static IEnumerator MyReactToCastSpell( { ActionModifiers = { new ActionModifier() }, IntParameter = slotLevel, + StringParameter = spell.Name, RulesetEffect = ServiceRepository.GetService() .InstantiateEffectSpell(ruleCaster, repertoire, spell, slotLevel, false), SpellRepertoire = repertoire, From f960f0dc26497313e84d14de24e7ee5f1966c4aa Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 11:41:52 -0700 Subject: [PATCH 144/162] fix power consumption on MyReactToSpendPower --- SolastaUnfinishedBusiness/Classes/InventorClass.cs | 3 ++- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 4 ++-- SolastaUnfinishedBusiness/Models/Level20Context.cs | 3 ++- SolastaUnfinishedBusiness/Races/Imp.cs | 8 ++++++-- .../Subclasses/CircleOfTheCosmos.cs | 12 ++++++++++++ .../Subclasses/InnovationVivisectionist.cs | 1 + .../Subclasses/SorcerousWildMagic.cs | 4 ++++ 7 files changed, 29 insertions(+), 6 deletions(-) diff --git a/SolastaUnfinishedBusiness/Classes/InventorClass.cs b/SolastaUnfinishedBusiness/Classes/InventorClass.cs index 73a3faabf9..1b17ca0467 100644 --- a/SolastaUnfinishedBusiness/Classes/InventorClass.cs +++ b/SolastaUnfinishedBusiness/Classes/InventorClass.cs @@ -1014,6 +1014,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + usablePower.Consume(); + abilityCheckData.AbilityCheckRoll += bonus; abilityCheckData.AbilityCheckSuccessDelta += bonus; @@ -1026,7 +1028,6 @@ void ReactionValidated() ? (ConsoleStyleDuplet.ParameterType.Positive, "Feedback/&RollCheckSuccessTitle") : (ConsoleStyleDuplet.ParameterType.Negative, "Feedback/&RollCheckFailureTitle"); - usablePower.Consume(); helper.RulesetCharacter.LogCharacterUsedPower( power, "Feedback/&FlashOfGeniusCheckToHitRoll", diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index b4c948d57b..265ed3557b 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2350,10 +2350,10 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + rulesetDefender.UsePower(usablePower); + action.SaveOutcomeDelta = 0; action.SaveOutcome = RollOutcome.Success; - - rulesetDefender.LogCharacterUsedPower(PowerMageSlayerSaving); } } diff --git a/SolastaUnfinishedBusiness/Models/Level20Context.cs b/SolastaUnfinishedBusiness/Models/Level20Context.cs index a37198466c..38c6d743e1 100644 --- a/SolastaUnfinishedBusiness/Models/Level20Context.cs +++ b/SolastaUnfinishedBusiness/Models/Level20Context.cs @@ -1050,9 +1050,10 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + rulesetAttacker.UsePower(usablePower); + var delta = -action.AttackSuccessDelta; - rulesetAttacker.UsePower(usablePower); action.AttackRollOutcome = RollOutcome.Success; action.AttackSuccessDelta += delta; action.AttackRoll += delta; diff --git a/SolastaUnfinishedBusiness/Races/Imp.cs b/SolastaUnfinishedBusiness/Races/Imp.cs index b32c834918..9882b500e0 100644 --- a/SolastaUnfinishedBusiness/Races/Imp.cs +++ b/SolastaUnfinishedBusiness/Races/Imp.cs @@ -583,7 +583,8 @@ private class DrawInspirationAlterOutcome(FeatureDefinitionPower powerImpBadland public int HandlerPriority => -10; - public IEnumerator OnTryAlterOutcomeAttack(GameLocationBattleManager battleManager, + public IEnumerator OnTryAlterOutcomeAttack( + GameLocationBattleManager battleManager, CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, @@ -614,6 +615,7 @@ public IEnumerator OnTryAlterOutcomeAttack(GameLocationBattleManager battleManag void ReactionValidated() { + usablePower.Consume(); action.AttackSuccessDelta += InspirationValue; action.AttackRollOutcome = RollOutcome.Success; actionModifier.AttackRollModifier += InspirationValue; @@ -623,7 +625,8 @@ void ReactionValidated() } } - public IEnumerator OnTryAlterOutcomeSavingThrow(GameLocationBattleManager battleManager, + public IEnumerator OnTryAlterOutcomeSavingThrow( + GameLocationBattleManager battleManager, CharacterAction action, GameLocationCharacter attacker, GameLocationCharacter defender, @@ -654,6 +657,7 @@ action.SaveOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) | void ReactionValidated() { + usablePower.Consume(); action.RolledSaveThrow = true; action.SaveOutcomeDelta = 0; action.SaveOutcome = RollOutcome.Success; diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs index 20c024a70c..1d51905373 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheCosmos.cs @@ -828,6 +828,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); attackModifier.AttacktoHitTrends.Add( @@ -891,6 +893,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); abilityCheckData.AbilityCheckRoll += dieRoll; @@ -957,6 +961,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); action.RolledSaveThrow = true; @@ -1037,6 +1043,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); @@ -1101,6 +1109,8 @@ public IEnumerator OnTryAlterAttributeCheck( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); @@ -1168,6 +1178,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { + usablePower.Consume(); + var dieRoll = -rulesetHelper.RollDie(DieType, RollContext.None, false, AdvantageType.None, out _, out _); diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs index fce49eb0d8..dfbefa83b2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVivisectionist.cs @@ -239,6 +239,7 @@ public IEnumerator HandleReducedToZeroHpByMe( void ReactionValidated() { + usablePower.Consume(); rulesetAttacker.RepayPowerUse(usablePowerEmergencyCure); rulesetAttacker.RepayPowerUse(usablePowerEmergencySurgery); } diff --git a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs index 286de5688e..85fc8afb21 100644 --- a/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/SorcerousWildMagic.cs @@ -632,6 +632,8 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { + usablePower.Consume(); + List advantageTrends = [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; @@ -733,6 +735,8 @@ action.SaveOutcome is not RollOutcome.Failure || void ReactionValidated() { + usablePower.Consume(); + List advantageTrends = [new TrendInfo(1, FeatureSourceType.CharacterFeature, PowerTidesOfChaos.Name, PowerTidesOfChaos)]; From 8717214bd78bbfb9c6d5f8762e833d15419ef69a Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 13:18:06 -0700 Subject: [PATCH 145/162] fix vanilla not refreshing attack modes on free attacks --- .../Patches/GameLocationCharacterPatcher.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs index 5f2ae9a1cd..30af5facee 100644 --- a/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GameLocationCharacterPatcher.cs @@ -488,6 +488,13 @@ public static void Postfix( //PATCH: support for action switching ActionSwitching.CheckIfActionSwitched( __instance, actionParams, scope, _mainRank, _mainAttacks, _bonusRank, _bonusAttacks); + + //PATCH: vanilla doesn't refresh attack modes on free attacks + if (scope == ActionDefinitions.ActionScope.Battle && + actionParams.ActionDefinition.Id == ActionDefinitions.Id.AttackFree) + { + __instance.RulesetCharacter.RefreshAttackModes(); + } } } From 4ad9cc2daf02d462ad3ba2ea5e31f18a3b9953a2 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 13:18:44 -0700 Subject: [PATCH 146/162] add additional prohibited actions to Eldritch Cannon, Wildfire Spirit, and Steel Defender --- SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs | 3 ++- .../Subclasses/InnovationArtillerist.cs | 3 ++- SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs | 6 ++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs index 7255ea0a9c..566e8b86a4 100644 --- a/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs +++ b/SolastaUnfinishedBusiness/Subclasses/CircleOfTheWildfire.cs @@ -166,7 +166,8 @@ public CircleOfTheWildfire() .SetGuiPresentationNoContent(true) .SetForbiddenActions( Id.AttackMain, Id.AttackOff, Id.AttackFree, Id.AttackReadied, Id.AttackOpportunity, Id.Ready, - Id.PowerMain, Id.PowerBonus, Id.PowerReaction, Id.SpendPower, Id.Shove, Id.ShoveBonus, Id.ShoveFree) + Id.PowerMain, Id.PowerBonus, Id.PowerNoCost, Id.PowerReaction, Id.SpendPower, + Id.Shove, Id.ShoveBonus, Id.ShoveFree) .AddCustomSubFeatures(new SummonerHasConditionOrKOd(), ForceInitiativeToSummoner.Mark) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs index 07302a2366..9a3d29af9c 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationArtillerist.cs @@ -53,7 +53,8 @@ public sealed class InnovationArtillerist : AbstractSubclass .SetGuiPresentationNoContent(true) .SetForbiddenActions( Id.AttackMain, Id.AttackOff, Id.AttackFree, Id.AttackReadied, Id.AttackOpportunity, Id.Ready, - Id.PowerMain, Id.PowerBonus, Id.PowerReaction, Id.SpendPower, Id.Shove, Id.ShoveBonus, Id.ShoveFree) + Id.PowerMain, Id.PowerBonus, Id.PowerNoCost, Id.PowerReaction, Id.SpendPower, + Id.Shove, Id.ShoveBonus, Id.ShoveFree) .AddCustomSubFeatures(new SummonerHasConditionOrKOd()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs index 17a51a3a19..c942d42215 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationWeapon.cs @@ -386,8 +386,10 @@ private static MonsterDefinition BuildSteelDefenderMonster() FeatureDefinitionActionAffinityBuilder .Create("ActionAffinitySteelDefenderBasic") .SetGuiPresentationNoContent() - .SetForbiddenActions(Id.AttackMain, Id.AttackOff, Id.AttackReadied, Id.AttackOpportunity, Id.Ready, - Id.Shove, Id.PowerMain, Id.PowerBonus, Id.PowerReaction, Id.SpendPower) + .SetForbiddenActions( + Id.AttackMain, Id.AttackOff, Id.AttackFree, Id.AttackReadied, Id.AttackOpportunity, Id.Ready, + Id.PowerMain, Id.PowerBonus, Id.PowerNoCost, Id.PowerReaction, Id.SpendPower, + Id.Shove, Id.ShoveBonus, Id.ShoveFree) .AddCustomSubFeatures(new SummonerHasConditionOrKOd()) .AddToDB(), FeatureDefinitionActionAffinitys.ActionAffinityFightingStyleProtection, From 31510f5fee3dcddad720270ece1817c01bc7dad5 Mon Sep 17 00:00:00 2001 From: Ender Wiggin Date: Sat, 10 Aug 2024 23:21:19 +0300 Subject: [PATCH 147/162] improved Chaos Bolt spell tooltip: - grouped damage types list a bit - generate damage types list from config instead of hard-coding in translations - made it display its damage in effects as 'Chaotic Damage' instead of Blunt --- .../Builders/GuiPresentationBuilder.cs | 25 ++++--- .../Spells/SpellBuildersLevel01.cs | 71 ++++++++++++------- .../Translations/en/Others-en.txt | 1 + .../Translations/en/Spells/Spells01-en.txt | 2 +- 4 files changed, 62 insertions(+), 37 deletions(-) diff --git a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs index c5f7f3f1c3..a9953c02eb 100644 --- a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs @@ -1,4 +1,5 @@ -using SolastaUnfinishedBusiness.Api.Infrastructure; +using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.Infrastructure; using UnityEngine.AddressableAssets; namespace SolastaUnfinishedBusiness.Builders; @@ -79,14 +80,15 @@ internal GuiPresentation Build() return _guiPresentation; } - private static GuiPresentation Build( + public static GuiPresentation Build( string title, string description, AssetReferenceSprite sprite = null, int? sortOrder = null, - bool? hidden = null) + bool? hidden = null, + [CanBeNull] string symbol = null) { - return Build(null, title, description, sprite, sortOrder, hidden); + return Build(null, title, description, sprite, sortOrder, hidden, symbol); } internal static GuiPresentation Build( @@ -95,7 +97,8 @@ internal static GuiPresentation Build( string description, AssetReferenceSprite sprite = null, int? sortOrder = null, - bool? hidden = null) + bool? hidden = null, + [CanBeNull] string symbol = null) { var guiPresentation = reference == null ? new GuiPresentation() : new GuiPresentation(reference); @@ -104,6 +107,7 @@ internal static GuiPresentation Build( guiPresentation.spriteReference = sprite ?? reference?.SpriteReference ?? EmptySprite; guiPresentation.sortOrder = sortOrder ?? reference?.SortOrder ?? 0; guiPresentation.hidden = hidden ?? reference?.Hidden ?? false; + guiPresentation.symbolChar = symbol ?? reference?.symbolChar; return guiPresentation; } @@ -113,9 +117,10 @@ internal static GuiPresentation Build( Category category, AssetReferenceSprite sprite = null, int? sortOrder = null, - bool? hidden = null) + bool? hidden = null, + [CanBeNull] string symbol = null) { - return Build(null, name, category, sprite, sortOrder, hidden); + return Build(null, name, category, sprite, sortOrder, hidden, symbol); } internal static GuiPresentation Build( @@ -124,10 +129,12 @@ internal static GuiPresentation Build( Category category, AssetReferenceSprite sprite = null, int? sortOrder = null, - bool? hidden = null) + bool? hidden = null, + [CanBeNull] string symbol = null) { return Build( - reference, CreateTitleKey(name, category), CreateDescriptionKey(name, category), sprite, sortOrder, hidden); + reference, CreateTitleKey(name, category), CreateDescriptionKey(name, category), sprite, sortOrder, hidden, + symbol); } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 29d9dce6ed..3435bed79d 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -754,6 +754,7 @@ internal static SpellDefinition BuildThunderousSmite() #endregion #region Chaos Bolt + const string DamageTypeChaosBolt = "DamageChaosBolt"; private static readonly (string, IMagicEffect)[] ChaosBoltDamagesAndEffects = [ @@ -765,6 +766,30 @@ private static readonly (string, IMagicEffect)[] ChaosBoltDamagesAndEffects = internal static SpellDefinition BuildChaosBolt() { + var formattedDamages = ""; + for (var i = 0; i < ChaosBoltDamagesAndEffects.Length; i++) + { + if (i > 0) + { + if (i % 2 == 1) + { + formattedDamages += " \t"; + } + else + { + formattedDamages += "\n"; + } + } + formattedDamages += $"{i+1}: {Gui.FormatDamageType(ChaosBoltDamagesAndEffects[i].Item1, true)}"; + } + + var spellDescription = Gui.Format("Spell/&ChaosBoltDescription", formattedDamages); + //267B = ♻ + var damageGui = GuiPresentationBuilder.Build(Gui.NoLocalization, Gui.NoLocalization, symbol:"267B"); + DamageDefinitionBuilder.Create(DamageTypeChaosBolt) + .SetGuiPresentation(damageGui) + .AddToDB(); + const string NAME = "ChaosBolt"; var sprite = Sprites.GetSprite(NAME, Resources.ChaosBolt, 128); @@ -800,7 +825,7 @@ internal static SpellDefinition BuildChaosBolt() var powerLeap = FeatureDefinitionPowerBuilder .Create($"Power{NAME}Leap") - .SetGuiPresentation(NAME, Category.Spell, sprite) + .SetGuiPresentation(NAME, Category.Spell, spellDescription, sprite) .SetUsesFixed(ActivationTime.NoCost) .SetUseSpellAttack() .SetEffectDescription( @@ -811,8 +836,8 @@ internal static SpellDefinition BuildChaosBolt() .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetEffectAdvancement(EffectIncrementMethod.None) .SetEffectForms( - EffectFormBuilder.DamageForm(DamageTypeBludgeoning, 2, DieType.D8), - EffectFormBuilder.DamageForm(DamageTypeBludgeoning, 1, DieType.D6)) + EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 2, DieType.D8), + EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 1, DieType.D6)) .SetCasterEffectParameters(PrismaticSpray) .SetImpactEffectParameters(new AssetReference()) .Build()) @@ -837,7 +862,7 @@ internal static SpellDefinition BuildChaosBolt() var spell = SpellDefinitionBuilder .Create(NAME) - .SetGuiPresentation(Category.Spell, sprite) + .SetGuiPresentation(Category.Spell, spellDescription, sprite) .SetSchoolOfMagic(SchoolOfMagicDefinitions.SchoolEvocation) .SetSpellLevel(1) .SetCastingTime(ActivationTime.Action) @@ -853,8 +878,8 @@ internal static SpellDefinition BuildChaosBolt() .SetTargetFiltering(TargetFilteringMethod.CharacterOnly) .SetEffectAdvancement(EffectIncrementMethod.PerAdditionalSlotLevel) .SetEffectForms( - EffectFormBuilder.DamageForm(DamageTypeBludgeoning, 2, DieType.D8), - EffectFormBuilder.DamageForm(DamageTypeBludgeoning, 1, DieType.D6)) + EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 2, DieType.D8), + EffectFormBuilder.DamageForm(DamageTypeChaosBolt, 1, DieType.D6)) .SetCasterEffectParameters(PrismaticSpray) .SetImpactEffectParameters(new AssetReference()) .Build()) @@ -1050,13 +1075,7 @@ public IEnumerator OnMagicEffectBeforeHitConfirmedOnEnemy( MagicEffect.Add((defender, effect)); - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - x.DamageForm.DamageType == DamageTypeBludgeoning)) - { - effectForm.DamageForm.DamageType = damageType; - } + ModifyChaosBoltForms(actualEffectForms, damageType); } else { @@ -1096,13 +1115,7 @@ void ReactionValidated(ReactionRequestSpendBundlePower reactionRequest) MagicEffect.Add((defender, effect)); - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - x.DamageForm.DamageType == DamageTypeBludgeoning)) - { - effectForm.DamageForm.DamageType = damageType; - } + ModifyChaosBoltForms(actualEffectForms, damageType); } void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) @@ -1121,17 +1134,21 @@ void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) MagicEffect.Add((defender, effect)); - foreach (var effectForm in actualEffectForms - .Where(x => - x.FormType == EffectForm.EffectFormType.Damage && - x.DamageForm.DamageType == DamageTypeBludgeoning)) - { - effectForm.DamageForm.DamageType = damageType; - } + ModifyChaosBoltForms(actualEffectForms, damageType); } } } + private static void ModifyChaosBoltForms(List actualEffectForms, string damageType) + { + foreach (var effectForm in actualEffectForms + .Where(x => x.FormType == EffectForm.EffectFormType.Damage && + x.DamageForm.DamageType == DamageTypeChaosBolt)) + { + effectForm.DamageForm.DamageType = damageType; + } + } + public void BeforeRoll( RollContext rollContext, RulesetCharacter rulesetCharacter, diff --git a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt index a819e09a03..26a777ce96 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Others-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Others-en.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Must have extra attacks Tooltip/&PreReqMustKnow=Must know {0} Tooltip/&SecondTargetNotWithinRange=Can't select this target as not within range of first Tooltip/&Tag9000Title=Custom Effect +Tooltip/&TagDamageChaosBoltTitle=Chaotic Damage Tooltip/&TagUnfinishedBusinessTitle=Unfinished Business Tooltip/&TargetMeleeWeaponError=Can't perform melee attack on this target with current weapon UI/&CustomFeatureSelectionStageDescription=Select extra features for your class/subclass. diff --git a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt index 52210189ad..5873806d9b 100644 --- a/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt +++ b/SolastaUnfinishedBusiness/Translations/en/Spells/Spells01-en.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Incoming Element Attack! Reaction/&SubitemSelectElementalInfusionTitle=Select a slot. Spell/&CausticZapDescription=You send a jolt of green energy toward the target momentarily disorientating them as the spell burn some of their armor. The spell targets one enemy with a spell attack and deals 1d4 acid and 1d6 lightning damage and applies the dazzled condition. Spell/&CausticZapTitle=Caustic Zap -Spell/&ChaosBoltDescription=Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type:\n1• Acid\n2• Cold\n3• Fire\n4• Force\n5• Lightning\n6• Poison\n7• Psychic\n8• Thunder\nIf you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell. +Spell/&ChaosBoltDescription=Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type:\n{0}\nIf you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell. Spell/&ChaosBoltTitle=Chaos Bolt Spell/&ChromaticOrbDescription=You hurl a 4-inch-diameter sphere of energy at a creature that you can see within range. You choose acid, cold, fire, lightning, poison, or thunder for the type of orb you create, and then make a ranged spell attack against the target. If the attack hits, the creature takes 3d8 damage of the type you chose. Spell/&ChromaticOrbTitle=Chromatic Orb From 6f5e7469e56dfb755e5676f7f156f3bc82a55e86 Mon Sep 17 00:00:00 2001 From: Ender Wiggin Date: Sat, 10 Aug 2024 23:43:45 +0300 Subject: [PATCH 148/162] made Chaos Bolt properly display its slot advancement info --- .../CustomUI/CustomSpellAdvancementTooltip.cs | 15 +++++++++++++++ .../Patches/GuiSpellDefinitionPatcher.cs | 17 +++++++++++++++++ .../Spells/SpellBuildersLevel01.cs | 1 + 3 files changed, 33 insertions(+) create mode 100644 SolastaUnfinishedBusiness/CustomUI/CustomSpellAdvancementTooltip.cs diff --git a/SolastaUnfinishedBusiness/CustomUI/CustomSpellAdvancementTooltip.cs b/SolastaUnfinishedBusiness/CustomUI/CustomSpellAdvancementTooltip.cs new file mode 100644 index 0000000000..0c9ea25ba2 --- /dev/null +++ b/SolastaUnfinishedBusiness/CustomUI/CustomSpellAdvancementTooltip.cs @@ -0,0 +1,15 @@ +namespace SolastaUnfinishedBusiness.CustomUI; + +public delegate string CustomSpellAdvancementTooltipDelegate(SpellDefinition spell); + +public static class CustomSpellAdvancementTooltip +{ + public static CustomSpellAdvancementTooltipDelegate ExtraDie(RuleDefinitions.DieType type, int count = 1) + { + var format = count > 1 + ? GuiSpellDefinition.advancementGainAdditionalDiceMultipleFormat + : GuiSpellDefinition.advancementGainAdditionalDiceSingleFormat; + + return _ => Gui.Format(format, $"{count:+0;-#} {Gui.GetDieSymbol(type)}"); + } +} diff --git a/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs b/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs index 7be1e1aed2..6f5532eb29 100644 --- a/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs @@ -1,7 +1,9 @@ using System.Diagnostics.CodeAnalysis; using HarmonyLib; using JetBrains.Annotations; +using SolastaUnfinishedBusiness.Api.GameExtensions; using SolastaUnfinishedBusiness.Behaviors.Specific; +using SolastaUnfinishedBusiness.CustomUI; using SolastaUnfinishedBusiness.Models; namespace SolastaUnfinishedBusiness.Patches; @@ -34,4 +36,19 @@ public static void Postfix(GuiSpellDefinition __instance, ref EffectDescription __result = PowerBundle.ModifyMagicEffectGui(__result, __instance.SpellDefinition); } } + + [HarmonyPatch(typeof(GuiSpellDefinition), nameof(GuiSpellDefinition.AdvancementGain), MethodType.Getter)] + [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] + [UsedImplicitly] + public static class AdvancementGain_Getter_Patch + { + [UsedImplicitly] + public static void Postfix(GuiSpellDefinition __instance, ref string __result) + { + //PATCH: support for CustomSpellAdvancementTooltip + __result = __instance.SpellDefinition.GetFirstSubFeatureOfType() + ?.Invoke(__instance.SpellDefinition) + ?? __result; + } + } } diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 3435bed79d..82805404a1 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -893,6 +893,7 @@ internal static SpellDefinition BuildChaosBolt() new FilterTargetingCharacterChaosBolt(conditionMark); spell.AddCustomSubFeatures( + CustomSpellAdvancementTooltip.ExtraDie(DieType.D6), initAndFinishBehavior, filterTargetBehavior); powerLeap.AddCustomSubFeatures( From 975cb906584dfca1e288f573ce4dd067e4ca605e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 15:40:20 -0700 Subject: [PATCH 149/162] update diagnostics --- .../ConditionInvulnerability.json | 1 + .../DamageDefinition/DamageChaosBolt.json | 30 ++++++++++ ...tionAffinityCircleOfTheWildfireSpirit.json | 1 + ...tyInnovationArtilleristEldritchCannon.json | 1 + .../ActionAffinitySteelDefenderBasic.json | 6 +- ...ffinityInvulnerabilityDamageChaosBolt.json | 55 +++++++++++++++++++ .../PowerChaosBoltLeap.json | 6 +- .../SpellDefinition/ChaosBolt.json | 6 +- Documentation/Feats.md | 4 +- .../Monsters/SolastaMonstersElemental.md | 8 +-- .../Monsters/SolastaMonstersHumanoid.md | 2 +- .../Monsters/SolastaMonstersMonstrosity.md | 10 ++-- Documentation/Spells.md | 12 ++-- Documentation/Subclasses.md | 2 +- 14 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 Diagnostics/UnfinishedBusinessBlueprints/DamageDefinition/DamageChaosBolt.json create mode 100644 Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionDamageAffinity/DamageAffinityInvulnerabilityDamageChaosBolt.json diff --git a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInvulnerability.json b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInvulnerability.json index b540fa7237..2f708e1874 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInvulnerability.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/ConditionDefinition/ConditionInvulnerability.json @@ -6,6 +6,7 @@ "features": [ "Definition:DamageAffinityInvulnerabilityDamageAcid:be3b4456-69b6-5221-9276-0770c1656194", "Definition:DamageAffinityInvulnerabilityDamageBludgeoning:314c78fb-0e2b-5525-a7e8-8a3ecafaadd2", + "Definition:DamageAffinityInvulnerabilityDamageChaosBolt:e4eb612d-90a3-5b78-bcd6-af7ffdad31d0", "Definition:DamageAffinityInvulnerabilityDamageCold:545182d8-0df0-5833-87b6-368eab21129f", "Definition:DamageAffinityInvulnerabilityDamageFire:7bfaba80-217c-5383-aac1-97e2d20c23cb", "Definition:DamageAffinityInvulnerabilityDamageForce:8b1865b8-7510-5625-b9d6-26f124950e97", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/DamageDefinition/DamageChaosBolt.json b/Diagnostics/UnfinishedBusinessBlueprints/DamageDefinition/DamageChaosBolt.json new file mode 100644 index 0000000000..6279d372b8 --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/DamageDefinition/DamageChaosBolt.json @@ -0,0 +1,30 @@ +{ + "$type": "DamageDefinition, Assembly-CSharp", + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": false, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "267B", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "ebaf896a-d18b-53c8-9d01-7f45e1033cb1", + "contentPack": 9999, + "name": "DamageChaosBolt" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCircleOfTheWildfireSpirit.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCircleOfTheWildfireSpirit.json index e37a66fcde..c609f7190e 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCircleOfTheWildfireSpirit.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityCircleOfTheWildfireSpirit.json @@ -21,6 +21,7 @@ "SpendPower", "AttackReadied", "Ready", + "PowerNoCost", "ShoveBonus", "AttackFree", "ShoveFree" diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityInnovationArtilleristEldritchCannon.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityInnovationArtilleristEldritchCannon.json index 79edeed4f1..aa016fa171 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityInnovationArtilleristEldritchCannon.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinityInnovationArtilleristEldritchCannon.json @@ -21,6 +21,7 @@ "SpendPower", "AttackReadied", "Ready", + "PowerNoCost", "ShoveBonus", "AttackFree", "ShoveFree" diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinitySteelDefenderBasic.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinitySteelDefenderBasic.json index cb6c1e3b10..68914333fd 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinitySteelDefenderBasic.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionActionAffinity/ActionAffinitySteelDefenderBasic.json @@ -20,7 +20,11 @@ "Shove", "SpendPower", "AttackReadied", - "Ready" + "Ready", + "PowerNoCost", + "ShoveBonus", + "AttackFree", + "ShoveFree" ], "authorizedActions": [], "restrictedActions": [], diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionDamageAffinity/DamageAffinityInvulnerabilityDamageChaosBolt.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionDamageAffinity/DamageAffinityInvulnerabilityDamageChaosBolt.json new file mode 100644 index 0000000000..2704a50e1a --- /dev/null +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionDamageAffinity/DamageAffinityInvulnerabilityDamageChaosBolt.json @@ -0,0 +1,55 @@ +{ + "$type": "FeatureDefinitionDamageAffinity, Assembly-CSharp", + "ancestryDefinesDamageType": false, + "ancestryType": "Sorcerer", + "damageType": "DamageChaosBolt", + "savingThrowAdvantageType": "None", + "savingThrowModifier": 0, + "damageAffinityType": "Immunity", + "flatDamageReduction": 0, + "flatDamageReductionOnlyAppliesToFirstDamageForm": true, + "tagsIgnoringAffinity": [], + "situationalContext": "None", + "healsBack": false, + "healBackCap": 10, + "retaliateWhenHit": false, + "retaliateProximity": "Melee", + "retaliateRangeCells": 1, + "retaliatePower": null, + "retaliateFromSource": false, + "knockOutAffinity": "None", + "knockOutOccurencesNumber": 1, + "knockOutRequiredCondition": null, + "knockOutDCAttribute": "RelentlessRageDC", + "knockOutAddDC": 5, + "instantDeathImmunity": false, + "myselfFamilyRestrictions": [], + "otherCharacterFamilyRestrictions": [], + "guiPresentation": { + "$type": "GuiPresentation, Assembly-CSharp", + "hidden": true, + "title": "Feature/&NoContentTitle", + "description": "Feature/&NoContentTitle", + "spriteReference": { + "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", + "m_AssetGUID": "", + "m_SubObjectName": null, + "m_SubObjectType": null + }, + "color": { + "$type": "UnityEngine.Color, UnityEngine.CoreModule", + "r": 1.0, + "g": 1.0, + "b": 1.0, + "a": 1.0 + }, + "symbolChar": "221E", + "sortOrder": 0, + "unusedInSolastaCOTM": false, + "usedInValleyDLC": false + }, + "contentCopyright": "UserContent", + "guid": "e4eb612d-90a3-5b78-bcd6-af7ffdad31d0", + "contentPack": 9999, + "name": "DamageAffinityInvulnerabilityDamageChaosBolt" +} \ No newline at end of file diff --git a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json index f82a5e9590..1bee84f811 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/FeatureDefinitionPower/PowerChaosBoltLeap.json @@ -84,7 +84,7 @@ "overrideWithBardicInspirationDie": false, "versatileDieType": "D1", "bonusDamage": 0, - "damageType": "DamageBludgeoning", + "damageType": "DamageChaosBolt", "ancestryType": "Sorcerer", "healFromInflictedDamage": "Never", "hitPointsFloor": 0, @@ -119,7 +119,7 @@ "overrideWithBardicInspirationDie": false, "versatileDieType": "D1", "bonusDamage": 0, - "damageType": "DamageBludgeoning", + "damageType": "DamageChaosBolt", "ancestryType": "Sorcerer", "healFromInflictedDamage": "Never", "hitPointsFloor": 0, @@ -372,7 +372,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Spell/&ChaosBoltTitle", - "description": "Spell/&ChaosBoltDescription", + "description": "Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type:\n1: ◰ Acid \t2: ◲ Cold\n3: ◳ Fire \t4: ◴ Force\n5: ◵ Lightning \t6: ◸ Poison\n7: ◹ Psychic \t8: ◼ Thunder\nIf you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell.", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "1fafc10f-ce1e-5584-ac22-56a6d222c643", diff --git a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json index b0ebd0ae1a..0d9cf66b88 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json +++ b/Diagnostics/UnfinishedBusinessBlueprints/SpellDefinition/ChaosBolt.json @@ -96,7 +96,7 @@ "overrideWithBardicInspirationDie": false, "versatileDieType": "D1", "bonusDamage": 0, - "damageType": "DamageBludgeoning", + "damageType": "DamageChaosBolt", "ancestryType": "Sorcerer", "healFromInflictedDamage": "Never", "hitPointsFloor": 0, @@ -131,7 +131,7 @@ "overrideWithBardicInspirationDie": false, "versatileDieType": "D1", "bonusDamage": 0, - "damageType": "DamageBludgeoning", + "damageType": "DamageChaosBolt", "ancestryType": "Sorcerer", "healFromInflictedDamage": "Never", "hitPointsFloor": 0, @@ -363,7 +363,7 @@ "$type": "GuiPresentation, Assembly-CSharp", "hidden": false, "title": "Spell/&ChaosBoltTitle", - "description": "Spell/&ChaosBoltDescription", + "description": "Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type:\n1: ◰ Acid \t2: ◲ Cold\n3: ◳ Fire \t4: ◴ Force\n5: ◵ Lightning \t6: ◸ Poison\n7: ◹ Psychic \t8: ◼ Thunder\nIf you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell.", "spriteReference": { "$type": "UnityEngine.AddressableAssets.AssetReferenceSprite, Unity.Addressables", "m_AssetGUID": "1fafc10f-ce1e-5584-ac22-56a6d222c643", diff --git a/Documentation/Feats.md b/Documentation/Feats.md index 8912d04f47..2bd687913e 100644 --- a/Documentation/Feats.md +++ b/Documentation/Feats.md @@ -79,7 +79,9 @@ You master the dagger, shortsword, longsword, scimitar, rapier, and greatsword. # 16. - Bladestorm [UB] -Once during your turn when you take the Attack action while wielding a greatsword, greataxe or maul, you can replace one attack to instead launch a Bladestorm attack. Bladestorm makes one attack roll against all enemy creatures within 5ft of you but doesn't add your attribute modifier to damage dealt (unless that modifier is negative). +You become a master of whirling death, gaining the following benefits while wielding a greatsword, greataxe or maul: +• When you take the Attack action and attack with the weapon, you can use a bonus action to make a quick melee attack with the weapon. This attack uses the same ability modifier as the primary attack and deals 1d4 damage of the same type as the wielded weapon. +• Once during your turn when you take the Attack action with the weapon, you can replace one attack to instead attack all enemy creatures within 5ft of you. # 17. - Blessed Soul [UB] diff --git a/Documentation/Monsters/SolastaMonstersElemental.md b/Documentation/Monsters/SolastaMonstersElemental.md index 222604ff72..d586f748e6 100644 --- a/Documentation/Monsters/SolastaMonstersElemental.md +++ b/Documentation/Monsters/SolastaMonstersElemental.md @@ -44,7 +44,7 @@ A flying current of whirling air animated by magical elemental forces. Alignment: *Neutral* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | @@ -120,7 +120,7 @@ A bulky stone creature animated by magical elemental forces. Alignment: *Neutral* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | @@ -197,7 +197,7 @@ A creature of pure fire, animated by magical elemental forces. Alignment: *Neutral* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | @@ -432,7 +432,7 @@ A creature of pure ice, animated by magical forces that also sustain its extreme Alignment: *Neutral* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | diff --git a/Documentation/Monsters/SolastaMonstersHumanoid.md b/Documentation/Monsters/SolastaMonstersHumanoid.md index 43b45967c1..bf9f849d3e 100644 --- a/Documentation/Monsters/SolastaMonstersHumanoid.md +++ b/Documentation/Monsters/SolastaMonstersHumanoid.md @@ -1710,7 +1710,7 @@ Size: *Medium* | 2 | Misty Step | Teleports you to a free cell you can see, no more than 6 cells away. | | 2 | Mirror Image | Three illusory duplicates of yourself appear in your space. Until the spell ends, each time a creature targets you with an attack, roll a d20 to determine whether the attack instead targets one of your duplicates. If you have 3 duplicates, you must roll a 6 or higher to change the attack's target to a duplicate. With 2 duplicates, you must roll an 8 or higher. With 1 duplicate, you must roll an 11 or higher. -A duplicate's armor class is equal to 10 + your Dexterity modifier. If an attack hits a duplicate, the duplicate is destroyed. A duplicate can be destroyed only by an attack that hits it. It ignores all other damage and effects. The spell ends when all three duplicates are destroyed. +A duplicate's AC is equal to 10 + your Dexterity modifier. If an attack hits a duplicate, the duplicate is destroyed. A duplicate can be destroyed only by an attack that hits it. It ignores all other damage and effects. The spell ends when all three duplicates are destroyed. A creature is unaffected by this spell if it is Blinded, or has Blindsight, Truesight or Tremorsense (doesn't apply if you don't touch ground). | | 2 | Scorching Ray | Fling rays of fire at one or more enemies. | | 3 | Counterspell | Interrupt an enemy's spellcasting. | diff --git a/Documentation/Monsters/SolastaMonstersMonstrosity.md b/Documentation/Monsters/SolastaMonstersMonstrosity.md index 842a3e4770..580b30882d 100644 --- a/Documentation/Monsters/SolastaMonstersMonstrosity.md +++ b/Documentation/Monsters/SolastaMonstersMonstrosity.md @@ -112,7 +112,7 @@ A giant spider from the underground acid lakes of the Badlands. Alignment: *Neutral* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | @@ -182,7 +182,7 @@ From the ranks of the powerful minotaurs, Greymane arise as superior fighters an Alignment: *Chaotic Evil* -Dungeon Maker: *YES* +Dungeon Maker: *NO* Size: *Large* | AC | HD | CR | @@ -195,9 +195,9 @@ Size: *Large* *Features:* * Condition Affinity Frightened Immunity -* Damage Affinity Bludgeoning Resistance -* Damage Affinity Piercing Resistance -* Damage Affinity Slashing Resistance +* Damage Affinity Bludgeoning Resistance True +* Damage Affinity Piercing Resistance True +* Damage Affinity Slashing Resistance True * Walk 8 * Action Surge * Reckless diff --git a/Documentation/Spells.md b/Documentation/Spells.md index ebd66aca50..c4d57ce8b1 100644 --- a/Documentation/Spells.md +++ b/Documentation/Spells.md @@ -221,14 +221,10 @@ You send a jolt of green energy toward the target momentarily disorientating the # 54. - *Chaos Bolt* © (V,S) level 1 Evocation [UB] Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type: -1• Acid -2• Cold -3• Fire -4• Force -5• Lightning -6• Poison -7• Psychic -8• Thunder +1: ◰ Acid 2: ◲ Cold +3: ◳ Fire 4: ◴ Force +5: ◵ Lightning 6: ◸ Poison +7: ◹ Psychic 8: ◼ Thunder If you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell. # 55. - Charm Person (V,S) level 1 Enchantment [SOL] diff --git a/Documentation/Subclasses.md b/Documentation/Subclasses.md index e2601409d8..3dd3730c45 100644 --- a/Documentation/Subclasses.md +++ b/Documentation/Subclasses.md @@ -1168,7 +1168,7 @@ Bards of the College of Swords entertain through daring feats of weapon prowess. * Blade Flourish -Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a melee weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver: +Whenever you take the Attack action on your turn, your walking speed increases by 10 feet until the end of the turn, and if a weapon attack that you make as part of this action hits a creature, you can expend one use of your Bardic Inspiration to cause the weapon to deal extra damage to the target you hit. The damage equals the number you roll on the Bardic Inspiration die. You also choose a particular maneuver: • Defensive Flourish: You add the Bardic Inspiration die roll to your AC until the start of your next turn. • Slashing Flourish: You deal the extra damage to all other enemy creatures within 5 feet of you. • Mobile Flourish: You gain benefits of disengage until the end of your turn. From 6684e310959c34358cf2e91e0fac68c328cc1563 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 15:40:45 -0700 Subject: [PATCH 150/162] update translations --- SolastaUnfinishedBusiness/Translations/de/Others-de.txt | 1 + .../Translations/de/Spells/Spells01-de.txt | 2 +- SolastaUnfinishedBusiness/Translations/es/Others-es.txt | 1 + .../Translations/es/Spells/Spells01-es.txt | 2 +- SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt | 1 + .../Translations/fr/Spells/Spells01-fr.txt | 2 +- SolastaUnfinishedBusiness/Translations/it/Others-it.txt | 1 + .../Translations/it/Spells/Spells01-it.txt | 2 +- SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt | 1 + .../Translations/ja/Spells/Spells01-ja.txt | 2 +- SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt | 1 + .../Translations/ko/Spells/Spells01-ko.txt | 2 +- SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt | 1 + .../Translations/pt-BR/Spells/Spells01-pt-BR.txt | 2 +- SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt | 1 + .../Translations/ru/Spells/Spells01-ru.txt | 2 +- SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt | 1 + .../Translations/zh-CN/Spells/Spells01-zh-CN.txt | 2 +- 18 files changed, 18 insertions(+), 9 deletions(-) diff --git a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt index 7d2d70473e..8004f855c4 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Others-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Others-de.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Muss zusätzliche Angriffe haben Tooltip/&PreReqMustKnow=Muss man wissen {0} Tooltip/&SecondTargetNotWithinRange=Dieses Ziel kann nicht ausgewählt werden, da es sich nicht in Reichweite des ersten befindet. Tooltip/&Tag9000Title=Benutzerdefinierter Effekt +Tooltip/&TagDamageChaosBoltTitle=Chaotischer Schaden Tooltip/&TagUnfinishedBusinessTitle=Unerledigte Aufgabe Tooltip/&TargetMeleeWeaponError=Mit der aktuellen Waffe ist kein Nahkampfangriff auf dieses Ziel möglich. UI/&CustomFeatureSelectionStageDescription=Wählen Sie zusätzliche Funktionen für Ihre Klasse/Unterklasse aus. diff --git a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt index a5e1744bb5..b123089865 100644 --- a/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt +++ b/SolastaUnfinishedBusiness/Translations/de/Spells/Spells01-de.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Elementarangriff steht bevor! Reaction/&SubitemSelectElementalInfusionTitle=Wählen Sie einen Steckplatz aus. Spell/&CausticZapDescription=Sie senden einen grünen Energiestoß auf das Ziel und desorientieren es kurzzeitig, während der Zauber einen Teil seiner Rüstung verbrennt. Der Zauber zielt mit einem Zauberangriff auf einen Feind und verursacht 1W4 Säure- und 1W6 Blitzschaden und verursacht den Zustand der Geblendung. Spell/&CausticZapTitle=Ätzender Zap -Spell/&ChaosBoltDescription=Führe einen Fernangriff mit Zauber gegen ein Ziel aus. Bei einem Treffer erleidet das Ziel 2W8 + 1W6 Schaden. Wähle einen der W8. Die gewürfelte Zahl bestimmt die Schadensart des Angriffs:\n1• Säure\n2• Kälte\n3• Feuer\n4• Kraft\n5• Blitz\n6• Gift\n7• Psycho\n8• Donner\nWenn du auf beiden W8 dieselbe Zahl würfelst, kannst du deine freie Aktion nutzen, um eine andere Kreatur deiner Wahl anzuvisieren. Führe einen neuen Angriffswurf gegen das neue Ziel aus und führe einen neuen Schadenswurf aus, der die chaotische Energie erneut auslösen könnte. Eine Kreatur kann durch jedes Wirken dieses Zaubers nur einmal verletzt werden. +Spell/&ChaosBoltDescription=Führe einen Fernangriff mit Zauber gegen ein Ziel aus. Bei einem Treffer erleidet das Ziel 2W8 + 1W6 Schaden. Wähle einen der W8. Die gewürfelte Zahl bestimmt die Schadensart des Angriffs:\n{0}\nWenn du auf beiden W8 dieselbe Zahl würfelst, kannst du deine freie Aktion nutzen, um eine andere Kreatur deiner Wahl anzuvisieren. Führe einen neuen Angriffswurf gegen das neue Ziel aus und führe einen neuen Schadenswurf aus, der die chaotische Energie erneut auslösen könnte. Eine Kreatur kann durch jedes Wirken dieses Zaubers nur einmal Schaden erleiden. Spell/&ChaosBoltTitle=Chaosblitz Spell/&ChromaticOrbDescription=Du schleuderst eine Energiekugel mit 4 Zoll Durchmesser auf eine Kreatur, die du in Reichweite sehen kannst. Du wählst Säure, Kälte, Feuer, Blitz, Gift oder Donner als Art der Kugel, die du erschaffst, und führst dann einen Fernkampf-Zauberangriff gegen das Ziel aus. Wenn der Angriff trifft, erleidet die Kreatur 3W8 Schaden der von dir gewählten Art. Spell/&ChromaticOrbTitle=Chromatische Kugel diff --git a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt index 7b51cf26fb..cdaf334c8e 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Others-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Others-es.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Debe tener ataques adicionales Tooltip/&PreReqMustKnow=Debe saber {0} Tooltip/&SecondTargetNotWithinRange=No se puede seleccionar este objetivo porque no está dentro del alcance del primero. Tooltip/&Tag9000Title=Efecto personalizado +Tooltip/&TagDamageChaosBoltTitle=Daño caótico Tooltip/&TagUnfinishedBusinessTitle=Negocios inconclusos Tooltip/&TargetMeleeWeaponError=No se puede realizar un ataque cuerpo a cuerpo contra este objetivo con el arma actual. UI/&CustomFeatureSelectionStageDescription=Seleccione funciones adicionales para su clase/subclase. diff --git a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt index 10ab0c3dcf..252a9fd797 100644 --- a/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt +++ b/SolastaUnfinishedBusiness/Translations/es/Spells/Spells01-es.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=¡Ataque elemental entrante! Reaction/&SubitemSelectElementalInfusionTitle=Seleccione una ranura. Spell/&CausticZapDescription=Envías una descarga de energía verde hacia el objetivo, desorientándolo momentáneamente mientras el hechizo quema parte de su armadura. El hechizo apunta a un enemigo con un ataque de hechizo y causa 1d4 de daño de ácido y 1d6 de daño de relámpago, y aplica el estado de deslumbramiento. Spell/&CausticZapTitle=Zap cáustico -Spell/&ChaosBoltDescription=Realiza un ataque de hechizo a distancia contra un objetivo. Si impacta, el objetivo recibe 2d8 + 1d6 de daño. Elige uno de los d8. El número que salga en ese dado determina el tipo de daño del ataque:\n1• Ácido\n2• Frío\n3• Fuego\n4• Fuerza\n5• Rayo\n6• Veneno\n7• Psíquico\n8• Trueno\nSi sacas el mismo número en ambos d8, puedes usar tu acción gratuita para apuntar a una criatura diferente de tu elección. Haz una nueva tirada de ataque contra el nuevo objetivo y haz una nueva tirada de daño, que podría hacer que la energía caótica salte de nuevo. Una criatura solo puede resultar dañada una vez por cada lanzamiento de este hechizo. +Spell/&ChaosBoltDescription=Realiza un ataque de hechizo a distancia contra un objetivo. Si impacta, el objetivo recibe 2d8 + 1d6 de daño. Elige uno de los d8. El número que salga en ese dado determina el tipo de daño del ataque:\n{0}\nSi sacas el mismo número en ambos d8, puedes usar tu acción gratuita para atacar a una criatura diferente de tu elección. Realiza una nueva tirada de ataque contra el nuevo objetivo y una nueva tirada de daño, que podría hacer que la energía caótica salte de nuevo. Una criatura solo puede resultar dañada una vez por cada lanzamiento de este hechizo. Spell/&ChaosBoltTitle=Rayo del caos Spell/&ChromaticOrbDescription=Lanzas una esfera de energía de 4 pulgadas de diámetro a una criatura que puedas ver dentro del alcance. Eliges ácido, frío, fuego, relámpago, veneno o trueno como el tipo de orbe que creas y luego realizas un ataque de hechizo a distancia contra el objetivo. Si el ataque impacta, la criatura recibe 3d8 puntos de daño del tipo que elegiste. Spell/&ChromaticOrbTitle=Orbe cromático diff --git a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt index 9440acb0e5..b295cbef6c 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Others-fr.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Doit avoir des attaques supplémentaires Tooltip/&PreReqMustKnow=A savoir {0} Tooltip/&SecondTargetNotWithinRange=Impossible de sélectionner cette cible car elle n'est pas à portée de la première Tooltip/&Tag9000Title=Effet personnalisé +Tooltip/&TagDamageChaosBoltTitle=Dégâts chaotiques Tooltip/&TagUnfinishedBusinessTitle=Inachevé Tooltip/&TargetMeleeWeaponError=Impossible d'effectuer une attaque au corps à corps sur cette cible avec l'arme actuelle UI/&CustomFeatureSelectionStageDescription=Sélectionnez des fonctionnalités supplémentaires pour votre classe/sous-classe. diff --git a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt index 797184dbf3..52785ab272 100644 --- a/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt +++ b/SolastaUnfinishedBusiness/Translations/fr/Spells/Spells01-fr.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Attaque d'élément entrante ! Reaction/&SubitemSelectElementalInfusionTitle=Sélectionnez un emplacement. Spell/&CausticZapDescription=Vous envoyez une décharge d'énergie verte vers la cible, la désorientant momentanément tandis que le sort brûle une partie de son armure. Le sort cible un ennemi avec une attaque magique et inflige 1d4 dégâts d'acide et 1d6 dégâts de foudre et applique l'état d'éblouissement. Spell/&CausticZapTitle=Zap caustique -Spell/&ChaosBoltDescription=Lancez une attaque à distance contre une cible. En cas de succès, la cible subit 2d8 + 1d6 dégâts. Choisissez l'un des d8. Le nombre obtenu sur ce dé détermine le type de dégâts de l'attaque :\n1• Acide\n2• Froid\n3• Feu\n4• Force\n5• Foudre\n6• Poison\n7• Psy\n8• Tonnerre\nSi vous obtenez le même nombre sur les deux d8, vous pouvez utiliser votre action libre pour cibler une autre créature de votre choix. Effectuez un nouveau jet d'attaque contre la nouvelle cible, puis un nouveau jet de dégâts, ce qui pourrait faire bondir à nouveau l'énergie chaotique. Une créature ne peut être blessée qu'une fois par lancement de ce sort. +Spell/&ChaosBoltDescription=Lancez une attaque à distance contre une cible. En cas de succès, la cible subit 2d8 + 1d6 dégâts. Choisissez l'un des d8. Le nombre obtenu sur ce dé détermine le type de dégâts de l'attaque :\n{0}\nSi vous obtenez le même nombre sur les deux d8, vous pouvez utiliser votre action libre pour cibler une autre créature de votre choix. Lancez un nouveau jet d'attaque contre la nouvelle cible, puis un nouveau jet de dégâts, ce qui pourrait faire bondir à nouveau l'énergie chaotique. Une créature ne peut être blessée qu'une seule fois par lancement de ce sort. Spell/&ChaosBoltTitle=Éclair du chaos Spell/&ChromaticOrbDescription=Vous lancez une sphère d'énergie de 10 cm de diamètre sur une créature que vous pouvez voir à portée. Vous choisissez l'acide, le froid, le feu, la foudre, le poison ou le tonnerre comme type d'orbe que vous créez, puis effectuez une attaque de sort à distance contre la cible. Si l'attaque touche, la créature subit 3d8 dégâts du type que vous avez choisi. Spell/&ChromaticOrbTitle=Orbe chromatique diff --git a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt index 706c2eecc7..42aaec5328 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Others-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Others-it.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Deve avere attacchi extra Tooltip/&PreReqMustKnow=Bisogna sapere {0} Tooltip/&SecondTargetNotWithinRange=Impossibile selezionare questo bersaglio perché non è nel raggio del primo Tooltip/&Tag9000Title=Effetto personalizzato +Tooltip/&TagDamageChaosBoltTitle=Danno caotico Tooltip/&TagUnfinishedBusinessTitle=Lavoro incompleto Tooltip/&TargetMeleeWeaponError=Non è possibile eseguire un attacco corpo a corpo su questo bersaglio con l'arma attuale UI/&CustomFeatureSelectionStageDescription=Seleziona funzionalità extra per la tua classe/sottoclasse. diff --git a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt index 38450a2f13..50ec2507cc 100644 --- a/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/Spells/Spells01-it.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Attacco Elementale in arrivo! Reaction/&SubitemSelectElementalInfusionTitle=Seleziona uno slot. Spell/&CausticZapDescription=Invii una scossa di energia verde verso il bersaglio, disorientandolo momentaneamente mentre l'incantesimo brucia parte della sua armatura. L'incantesimo prende di mira un nemico con un attacco magico e infligge 1d4 danni da acido e 1d6 da fulmine, e applica la condizione abbagliato. Spell/&CausticZapTitle=Zap caustico -Spell/&ChaosBoltDescription=Esegui un attacco magico a distanza contro un bersaglio. Se colpisce, il bersaglio subisce 2d8 + 1d6 danni. Scegli uno dei d8. Il numero tirato su quel dado determina il tipo di danno dell'attacco:\n1• Acido\n2• Freddo\n3• Fuoco\n4• Forza\n5• Fulmine\n6• Veleno\n7• Psichico\n8• Tuono\nSe tiri lo stesso numero su entrambi i d8, puoi usare la tua azione gratuita per prendere di mira una creatura diversa a tua scelta. Esegui un nuovo tiro per colpire contro il nuovo bersaglio e un nuovo tiro per i danni, che potrebbe far balzare di nuovo l'energia caotica. Una creatura può essere danneggiata solo una volta da ogni lancio di questo incantesimo. +Spell/&ChaosBoltDescription=Esegui un attacco magico a distanza contro un bersaglio. Se colpisce, il bersaglio subisce 2d8 + 1d6 danni. Scegli uno dei d8. Il numero tirato su quel dado determina il tipo di danno dell'attacco:\n{0}\nSe tiri lo stesso numero su entrambi i d8, puoi usare la tua azione gratuita per prendere di mira una creatura diversa a tua scelta. Esegui un nuovo tiro per colpire contro il nuovo bersaglio e un nuovo tiro per i danni, che potrebbe far balzare di nuovo l'energia caotica. Una creatura può essere danneggiata solo una volta da ogni lancio di questo incantesimo. Spell/&ChaosBoltTitle=Fulmine del Caos Spell/&ChromaticOrbDescription=Scagli una sfera di energia di 4 pollici di diametro contro una creatura che puoi vedere entro il raggio d'azione. Scegli acido, freddo, fuoco, fulmine, veleno o tuono per il tipo di sfera che crei, quindi esegui un attacco magico a distanza contro il bersaglio. Se l'attacco colpisce, la creatura subisce 3d8 danni del tipo che hai scelto. Spell/&ChromaticOrbTitle=Sfera cromatica diff --git a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt index 01b1b63583..3ba3ea768e 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Others-ja.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=追加攻撃が必要 Tooltip/&PreReqMustKnow={0} を知っておく必要があります Tooltip/&SecondTargetNotWithinRange=最初の範囲内にないため、このターゲットを選択できません Tooltip/&Tag9000Title=カスタムエフェクト +Tooltip/&TagDamageChaosBoltTitle=カオスダメージ Tooltip/&TagUnfinishedBusinessTitle=未完の仕事 Tooltip/&TargetMeleeWeaponError=現在の武器ではこのターゲットに近接攻撃を実行できません UI/&CustomFeatureSelectionStageDescription=クラス/サブクラスの追加機能を選択します。 diff --git a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt index 5577019122..6f6e6419a7 100644 --- a/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt +++ b/SolastaUnfinishedBusiness/Translations/ja/Spells/Spells01-ja.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=エレメントアタック到来 Reaction/&SubitemSelectElementalInfusionTitle=スロットを選択します。 Spell/&CausticZapDescription=ターゲットに向かって緑のエネルギーの衝撃を送り、呪文が鎧の一部を燃やすと、ターゲットは一時的に方向感覚を失います。この呪文は敵 1 体を呪文攻撃で対象とし、1d4 の酸ダメージと 1d6 の雷ダメージを与え、幻惑状態を適用します。 Spell/&CausticZapTitle=カウスティックザップ -Spell/&ChaosBoltDescription=ターゲットに対して遠距離魔法攻撃を行います。命中すると、ターゲットは 2d8 + 1d6 のダメージを受けます。 d8 のいずれかを選択します。そのダイスで出た数字によって、攻撃のダメージ タイプが決まります:\n1• 酸\n2• 冷気\n3• 火\n4• フォース\n5• 雷\n6• 毒\n7・サイキック\n8・サンダー\n両方のd8で同じ数字を出したら、フリーアクションを使って、選択した別のクリーチャーを対象にすることができます。新しいターゲットに対して新しい攻撃ロールを作成し、新しいダメージ ロールを作成します。これにより、混沌としたエネルギーが再び跳躍する可能性があります。クリーチャーは、この呪文を唱えるたびに 1 回だけダメージを受けることができます。 +Spell/&ChaosBoltDescription=ターゲットに対して遠隔呪文攻撃を行います。命中すると、ターゲットは 2d8 + 1d6 のダメージを受けます。d8 のうち 1 つを選択します。そのダイスで出た目によって、攻撃のダメージの種類が決まります:\n{0}\n両方の d8 で同じ目が出た場合、自由行動を使用して、選択した別のクリーチャーをターゲットにすることができます。新しいターゲットに対して新しい攻撃ロールを行い、新しいダメージ ロールを行います。これにより、混沌のエネルギーが再び跳ね上がる可能性があります。クリーチャーは、この呪文を唱えるたびに 1 回だけダメージを受ける可能性があります。 Spell/&ChaosBoltTitle=カオスボルト Spell/&ChromaticOrbDescription=範囲内に見える生き物に直径 4 インチのエネルギーの球を投げます。作成するオーブの種類として酸、冷気、火、稲妻、毒、または雷を選択し、ターゲットに対して遠隔呪文攻撃を行います。攻撃が命中した場合、そのクリーチャーはあなたが選んだタイプに 3d8 のダメージを受けます。 Spell/&ChromaticOrbTitle=クロマティックオーブ diff --git a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt index a59ec9653a..65cc80c49e 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Others-ko.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=추가 공격이 있어야 합니다. Tooltip/&PreReqMustKnow={0}을(를) 알아야 합니다. Tooltip/&SecondTargetNotWithinRange=첫 번째 범위 내에 있지 않으므로 이 대상을 선택할 수 없습니다. Tooltip/&Tag9000Title=맞춤 효과 +Tooltip/&TagDamageChaosBoltTitle=혼돈스러운 피해 Tooltip/&TagUnfinishedBusinessTitle=끝나지 않은 사업 Tooltip/&TargetMeleeWeaponError=현재 무기로는 이 대상에 근접 공격을 수행할 수 없습니다. UI/&CustomFeatureSelectionStageDescription=클래스/하위 클래스에 대한 추가 기능을 선택하세요. diff --git a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt index 40dc98b622..35819edd1a 100644 --- a/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt +++ b/SolastaUnfinishedBusiness/Translations/ko/Spells/Spells01-ko.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=들어오는 요소 공격! Reaction/&SubitemSelectElementalInfusionTitle=슬롯을 선택하세요. Spell/&CausticZapDescription=주문이 갑옷의 일부를 태울 때 대상을 향해 녹색 에너지 충격을 보내 순간적으로 방향 감각을 잃게 만듭니다. 이 주문은 주문 공격으로 적 한 명을 대상으로 하며 1d4의 산성 피해와 1d6의 번개 피해를 입히고 눈부신 상태를 적용합니다. Spell/&CausticZapTitle=가성 Zap -Spell/&ChaosBoltDescription=대상에게 원거리 주문 공격을 가합니다. 적중 시 대상은 2d8 + 1d6의 피해를 입습니다. d8 중 하나를 선택하세요. 주사위에 굴린 숫자에 따라 공격의 피해 유형이 결정됩니다.\n1• 산성\n2• 냉기\n3• 불\n4• 힘\n5• 번개\n6• 독\n7• 심령\n8• 천둥\n두 d8에서 동일한 숫자가 나오면 자유 행동을 사용하여 선택한 다른 생물을 목표로 삼을 수 있습니다. 새로운 대상에 대해 새로운 공격 굴림을 하고, 새로운 피해 굴림을 하면 혼돈 에너지가 다시 도약할 수 있습니다. 이 주문을 시전할 때마다 생물은 한 번만 피해를 입을 수 있습니다. +Spell/&ChaosBoltDescription=대상에게 원거리 주문 공격을 합니다. 명중 시 대상은 2d8 + 1d6의 피해를 입습니다. d8 중 하나를 선택합니다. 해당 주사위에 나온 숫자가 공격의 피해 유형을 결정합니다:\n{0}\n두 d8 모두에서 같은 숫자가 나오면 자유 행동을 사용하여 원하는 다른 생물을 대상으로 지정할 수 있습니다. 새로운 대상에게 새로운 공격 굴림을 하고 새로운 피해 굴림을 합니다. 그러면 혼돈 에너지가 다시 뛸 수 있습니다. 생물은 이 주문을 시전할 때마다 한 번만 피해를 입을 수 있습니다. Spell/&ChaosBoltTitle=카오스볼트 Spell/&ChromaticOrbDescription=범위 내에서 볼 수 있는 생물에게 직경 4인치의 에너지 구체를 던집니다. 생성하는 오브 유형에 대해 산성, 냉기, 불, 번개, 독 또는 천둥을 선택한 다음 대상에 대해 원거리 주문 공격을 가합니다. 공격이 적중하면 생물은 선택한 유형의 3d8 피해를 입습니다. Spell/&ChromaticOrbTitle=색채의 오브 diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt index 5fe0112d93..bb1b6e220d 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Others-pt-BR.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Deve ter ataques extras Tooltip/&PreReqMustKnow=Preciso saber {0} Tooltip/&SecondTargetNotWithinRange=Não é possível selecionar este alvo porque ele não está dentro do alcance do primeiro Tooltip/&Tag9000Title=Efeito personalizado +Tooltip/&TagDamageChaosBoltTitle=Dano Caótico Tooltip/&TagUnfinishedBusinessTitle=Negócios inacabados Tooltip/&TargetMeleeWeaponError=Não é possível realizar ataque corpo a corpo neste alvo com a arma atual UI/&CustomFeatureSelectionStageDescription=Selecione recursos extras para sua classe/subclasse. diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt index f368af2ad6..2e6c599d8b 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/Spells/Spells01-pt-BR.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Ataque Elemental Chegando! Reaction/&SubitemSelectElementalInfusionTitle=Selecione um slot. Spell/&CausticZapDescription=Você envia um choque de energia verde em direção ao alvo, desorientando-o momentaneamente enquanto a magia queima parte de sua armadura. A magia alveja um inimigo com um ataque de magia e causa 1d4 de dano ácido e 1d6 de dano de raio e aplica a condição ofuscado. Spell/&CausticZapTitle=Zap cáustico -Spell/&ChaosBoltDescription=Faça um ataque mágico à distância contra um alvo. Em um acerto, o alvo recebe 2d8 + 1d6 de dano. Escolha um dos d8s. O número rolado naquele dado determina o tipo de dano do ataque:\n1• Ácido\n2• Frio\n3• Fogo\n4• Força\n5• Raio\n6• Veneno\n7• Psíquico\n8• Trovão\nSe você rolar o mesmo número em ambos os d8s, você pode usar sua ação livre para alvejar uma criatura diferente de sua escolha. Faça uma nova jogada de ataque contra o novo alvo e faça uma nova jogada de dano, o que pode fazer a energia caótica saltar novamente. Uma criatura pode ser danificada apenas uma vez por cada conjuração desta magia. +Spell/&ChaosBoltDescription=Faça um ataque mágico à distância contra um alvo. Em um acerto, o alvo recebe 2d8 + 1d6 de dano. Escolha um dos d8s. O número rolado naquele dado determina o tipo de dano do ataque:\n{0}\nSe você rolar o mesmo número em ambos os d8s, você pode usar sua ação livre para alvejar uma criatura diferente de sua escolha. Faça uma nova jogada de ataque contra o novo alvo, e faça uma nova jogada de dano, o que pode fazer a energia caótica saltar novamente. Uma criatura pode ser danificada apenas uma vez por cada conjuração desta magia. Spell/&ChaosBoltTitle=Raio do Caos Spell/&ChromaticOrbDescription=Você arremessa uma esfera de energia de 4 polegadas de diâmetro em uma criatura que você pode ver dentro do alcance. Você escolhe ácido, frio, fogo, relâmpago, veneno ou trovão para o tipo de orbe que você cria, e então faz um ataque de magia à distância contra o alvo. Se o ataque acertar, a criatura sofre 3d8 de dano do tipo que você escolheu. Spell/&ChromaticOrbTitle=Orbe Cromático diff --git a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt index 84e6ee93eb..049465df33 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Others-ru.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=Должен иметь дополнител Tooltip/&PreReqMustKnow=Должен знать {0} Tooltip/&SecondTargetNotWithinRange=Невозможно выбрать эту цель, поскольку она находится вне досягаемости Tooltip/&Tag9000Title=Кастомный эффект +Tooltip/&TagDamageChaosBoltTitle=Хаотический урон Tooltip/&TagUnfinishedBusinessTitle=Неоконченное Дело Tooltip/&TargetMeleeWeaponError=Невозможно провести атаку ближнего боя по этой цели с выбранным оружием UI/&CustomFeatureSelectionStageDescription=Выберите дополнительные черты для вашего класса/архетипа. diff --git a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt index 223e569a33..700c531af9 100644 --- a/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt +++ b/SolastaUnfinishedBusiness/Translations/ru/Spells/Spells01-ru.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=Входящая стихийна Reaction/&SubitemSelectElementalInfusionTitle=Выберите ячейку. Spell/&CausticZapDescription=Вы посылаете в цель разряд зелёной энергии, на мгновение дезориентируя её, пока заклинание сжигает часть её брони. Заклинание поражает одного противника атакой заклинанием, наносит 1d4 урона кислотой и 1d6 урона электричеством, а также накладывает состояние ослепления. Spell/&CausticZapTitle=Едкий заряд -Spell/&ChaosBoltDescription=Вы бросаете волнистую, трепещущую массу хаотической энергии в одно существо в радиусе действия. Совершите дальнобойную атаку заклинанием по существу. При попадании цель получает 2d8 + 1d6 урона. Выберите одну из брошенных костей d8. Выпавшее число определяет вид урона атаки:\n1• Кислота\n2• Холод\n3• Огонь\n4• Силовое поле\n5• Электричество\n6• Яд\n7• Психическая энергия\n8• Звук\nЕсли вы выбрасываете одинаковое значение на обоих к8, свободным действием вы можете выбрать другое существо по вашему выбору. Совершите новый бросок атаки против новой цели и совершите новый бросок урона, который может привести к тому, что хаотическая энергия снова перескочит. Существо может получить урон от этого заклинания только один раз за каждое его наложение. +Spell/&ChaosBoltDescription=Сделайте дальнюю атаку заклинанием против цели. При попадании цель получает 2d8 + 1d6 урона. Выберите один из d8. Число, выпавшее на этой кости, определяет тип урона атаки:\n{0}\nЕсли вы выбросили одинаковое число на обоих d8, вы можете использовать свое свободное действие, чтобы нацелиться на другое существо по вашему выбору. Сделайте новый бросок атаки против новой цели и сделайте новый бросок урона, который может снова вызвать скачок хаотической энергии. Существо может быть повреждено только один раз каждым применением этого заклинания. Spell/&ChaosBoltTitle=Снаряд хаоса Spell/&ChromaticOrbDescription=Вы бросаете 4-дюймовую сферу энергии в существо, которое видите в пределах дистанции. Выберите звук, кислоту, огонь, холод, электричество или яд при создании сферы, а затем совершите по цели дальнобойную атаку заклинанием. Если атака попадает, существо получает 3d8 урона выбранного вида. Spell/&ChromaticOrbTitle=Цветной шарик diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt index e941120017..6854f8e5f6 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Others-zh-CN.txt @@ -301,6 +301,7 @@ Tooltip/&PreReqMustHaveExtraAttacks=必须有额外的攻击 Tooltip/&PreReqMustKnow=需要已知 {0} Tooltip/&SecondTargetNotWithinRange=无法选择此目标,因为不在第一个范围内 Tooltip/&Tag9000Title=自定义效果 +Tooltip/&TagDamageChaosBoltTitle=混沌伤害 Tooltip/&TagUnfinishedBusinessTitle=未竟之业 Tooltip/&TargetMeleeWeaponError=无法使用当前武器对该目标进行近战攻击 UI/&CustomFeatureSelectionStageDescription=为你的职业/子职业选择额外的特性。 diff --git a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt index c300596e78..d185b9414c 100644 --- a/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt +++ b/SolastaUnfinishedBusiness/Translations/zh-CN/Spells/Spells01-zh-CN.txt @@ -70,7 +70,7 @@ Reaction/&SpendSpellSlotElementalInfusionTitle=元素攻击袭来! Reaction/&SubitemSelectElementalInfusionTitle=选择一个法术位。 Spell/&CausticZapDescription=你向目标发射一股绿色能量,使他们暂时迷失方向,同时法术会烧毁他们的一些护甲。该法术以单个敌人为目标进行法术攻击,造成 1d4 强酸和 1d6 闪电伤害,并施加眩晕状态。 Spell/&CausticZapTitle=酸蚀震击 -Spell/&ChaosBoltDescription=你向射程内的一个生物投掷一团波动、颤动的混乱能量。对目标进行远程法术攻击。命中后,目标受到 2d8 + 1d6 点伤害。选择 d8 之一。骰子上投掷的数字决定了攻击的伤害类型:\n1• 强酸\n2• 冷冻\n3• 火焰\n4• 力场\n5• 闪电\n6• 毒素\n7• 心灵\n8• 雷鸣\n\n如果你在两个 d8 上掷出相同的数字,则混乱能量会从目标跃迁到距离目标 30 尺内你选择的其他生物。对新目标进行新的攻击检定,并进行新的伤害检定,这可能会导致混沌能量再次跳跃。每次施展该法术只能将一个生物作为目标一次。 +Spell/&ChaosBoltDescription=对目标进行远程法术攻击。命中后,目标受到 2d8 + 1d6 伤害。选择其中一个 d8。该骰子上掷出的数字决定了攻击的伤害类型:\n{0}\n如果两个 d8 上掷出的数字相同,则可以使用自由行动来瞄准您选择的其他生物。对新目标进行新的攻击掷骰,并进行新的伤害掷骰,这可能会导致混沌能量再次跳跃。每次施放此法术只能对生物造成一次伤害。 Spell/&ChaosBoltTitle=混乱箭 Spell/&ChromaticOrbDescription=你向范围内你能看到的一个生物投掷一个直径 4 寸的能量球。你选择强酸、冷冻、火焰、闪电、毒素或雷鸣作为你创造的球体类型,然后对目标进行远程法术攻击。如果攻击命中,该生物将受到你选择类型的 3d8 点伤害。 Spell/&ChromaticOrbTitle=繁彩球 From c2cc597209526574b150a51ca7739a94739c030d Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 15:58:41 -0700 Subject: [PATCH 151/162] fix scenarios on ITryAlterOutcome interfaces where helper must instantiate the usable power --- SolastaUnfinishedBusiness/Feats/OtherFeats.cs | 10 +++---- SolastaUnfinishedBusiness/Feats/RaceFeats.cs | 12 ++++----- .../FightingStyles/Interception.cs | 14 +++++----- .../Models/Level20Context.cs | 8 +++--- SolastaUnfinishedBusiness/Races/Imp.cs | 8 +++--- SolastaUnfinishedBusiness/Races/Oligath.cs | 16 ++++++------ .../Subclasses/Builders/GambitsBuilders.cs | 26 +++++++++---------- .../Subclasses/MartialGuardian.cs | 10 +++---- .../Subclasses/PathOfTheBeast.cs | 5 ++-- .../Subclasses/RoguishAcrobat.cs | 6 ++--- .../Subclasses/RoguishRavenScion.cs | 10 +++---- .../Subclasses/WayOfTheDragon.cs | 6 ++--- .../Subclasses/WayOfTheSilhouette.cs | 6 ++--- .../Subclasses/WizardWarMagic.cs | 20 +++++++------- 14 files changed, 79 insertions(+), 78 deletions(-) diff --git a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs index 265ed3557b..7740b1c721 100644 --- a/SolastaUnfinishedBusiness/Feats/OtherFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/OtherFeats.cs @@ -2322,8 +2322,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(PowerMageSlayerSaving, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(PowerMageSlayerSaving, rulesetHelper); var effectDescription = action.ActionParams.AttackMode?.EffectDescription ?? action.ActionParams.RulesetEffect?.EffectDescription; @@ -2331,7 +2331,7 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( if (helper != defender || !action.RolledSaveThrow || action.SaveOutcome != RollOutcome.Failure || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || effectDescription?.savingThrowAbility is not (AttributeDefinitions.Intelligence or AttributeDefinitions.Wisdom or AttributeDefinitions.Charisma)) { @@ -2350,8 +2350,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( void ReactionValidated() { - rulesetDefender.UsePower(usablePower); - + rulesetHelper.UsePower(usablePower); + action.SaveOutcomeDelta = 0; action.SaveOutcome = RollOutcome.Success; } diff --git a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs index 2a1f5094b6..3f8502a9c2 100644 --- a/SolastaUnfinishedBusiness/Feats/RaceFeats.cs +++ b/SolastaUnfinishedBusiness/Feats/RaceFeats.cs @@ -1837,13 +1837,13 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || helper != defender || !defender.CanReact() || !defender.CanPerceiveTarget(attacker) || - rulesetDefender.HasConditionOfType(conditionSecondChance)) + rulesetHelper.HasConditionOfType(conditionSecondChance)) { yield break; } @@ -1860,14 +1860,14 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { - rulesetDefender.InflictCondition( + rulesetHelper.InflictCondition( conditionSecondChance.Name, DurationType.UntilAnyRest, 0, TurnOccurenceType.StartOfTurn, AttributeDefinitions.TagEffect, - rulesetDefender.guid, - rulesetDefender.CurrentFaction.Name, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, 1, conditionSecondChance.Name, 0, @@ -1928,7 +1928,7 @@ void ReactionValidated() var sign = toHitBonus > 0 ? "+" : string.Empty; - rulesetDefender.LogCharacterUsedFeature( + rulesetHelper.LogCharacterUsedFeature( featureSecondChance, "Feedback/&TriggerRerollLine", false, diff --git a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs index 2adf631da9..c442df1bb9 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs @@ -85,10 +85,10 @@ public IEnumerator OnTryAlterOutcomeAttack( yield break; } - var helperCharacter = helper.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; - if (ValidatorsWeapon.IsUnarmed(helperCharacter.GetMainWeapon()?.ItemDefinition, null) && - ValidatorsWeapon.IsUnarmed(helperCharacter.GetOffhandWeapon()?.ItemDefinition, null)) + if (ValidatorsWeapon.IsUnarmed(rulesetHelper.GetMainWeapon()?.ItemDefinition, null) && + ValidatorsWeapon.IsUnarmed(rulesetHelper.GetOffhandWeapon()?.ItemDefinition, null)) { yield break; } @@ -105,9 +105,9 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { - var roll = helperCharacter.RollDie(DieType.D10, RollContext.None, true, AdvantageType.None, out _, + var roll = rulesetHelper.RollDie(DieType.D10, RollContext.None, true, AdvantageType.None, out _, out _); - var reducedDamage = roll + helperCharacter.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); + var reducedDamage = roll + rulesetHelper.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); defender.RulesetActor.InflictCondition( conditionDefinition.Name, @@ -115,8 +115,8 @@ void ReactionValidated() 0, TurnOccurenceType.StartOfTurn, AttributeDefinitions.TagEffect, - helperCharacter.guid, - helperCharacter.CurrentFaction.Name, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, 1, conditionDefinition.Name, reducedDamage, diff --git a/SolastaUnfinishedBusiness/Models/Level20Context.cs b/SolastaUnfinishedBusiness/Models/Level20Context.cs index 38c6d743e1..14a3fd09c1 100644 --- a/SolastaUnfinishedBusiness/Models/Level20Context.cs +++ b/SolastaUnfinishedBusiness/Models/Level20Context.cs @@ -1029,12 +1029,12 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetAttacker = attacker.RulesetCharacter; - var usablePower = PowerProvider.Get(power, rulesetAttacker); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(power, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || - rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -1050,7 +1050,7 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { - rulesetAttacker.UsePower(usablePower); + rulesetHelper.UsePower(usablePower); var delta = -action.AttackSuccessDelta; diff --git a/SolastaUnfinishedBusiness/Races/Imp.cs b/SolastaUnfinishedBusiness/Races/Imp.cs index 9882b500e0..b966f81320 100644 --- a/SolastaUnfinishedBusiness/Races/Imp.cs +++ b/SolastaUnfinishedBusiness/Races/Imp.cs @@ -593,7 +593,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetHelper = attacker.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || @@ -634,13 +634,13 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( ActionModifier actionModifier, bool hasHitVisual, [UsedImplicitly] bool hasBorrowedLuck) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerImpBadlandDrawInspiration, rulesetHelper); if (helper != defender || !action.RolledSaveThrow || action.SaveOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0 || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0 || action.SaveOutcomeDelta < -InspirationValue) { yield break; diff --git a/SolastaUnfinishedBusiness/Races/Oligath.cs b/SolastaUnfinishedBusiness/Races/Oligath.cs index a4f5235ef4..c72a7468d1 100644 --- a/SolastaUnfinishedBusiness/Races/Oligath.cs +++ b/SolastaUnfinishedBusiness/Races/Oligath.cs @@ -168,17 +168,17 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerStoneEndurance, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerStoneEndurance, rulesetHelper); // don't use CanReact() to allow stone endurance when prone if (helper != defender || - !defender.IsReactionAvailable() || - rulesetDefender is not { IsDeadOrUnconscious: false } || - rulesetDefender.HasConditionOfTypeOrSubType(ConditionIncapacitated) || - rulesetDefender.HasConditionOfTypeOrSubType(ConditionStunned) || - rulesetDefender.HasConditionOfTypeOrSubType(ConditionParalyzed) || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) + !helper.IsReactionAvailable() || + rulesetHelper is not { IsDeadOrUnconscious: false } || + rulesetHelper.HasConditionOfTypeOrSubType(ConditionIncapacitated) || + rulesetHelper.HasConditionOfTypeOrSubType(ConditionStunned) || + rulesetHelper.HasConditionOfTypeOrSubType(ConditionParalyzed) || + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs index ebea29fc41..691dee5d5b 100644 --- a/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs +++ b/SolastaUnfinishedBusiness/Subclasses/Builders/GambitsBuilders.cs @@ -1685,16 +1685,16 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetAttacker = attacker.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; if (action.AttackRollOutcome != RollOutcome.Failure || helper != attacker || - !rulesetAttacker.CanUsePower(pool)) + !rulesetHelper.CanUsePower(pool)) { yield break; } - var dieType = GetGambitDieSize(rulesetAttacker); + var dieType = GetGambitDieSize(rulesetHelper); var max = DiceMaxValue[(int)dieType]; var delta = Math.Abs(action.AttackSuccessDelta); @@ -1721,7 +1721,7 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { - rulesetAttacker.UpdateUsageForPower(pool, 1); + rulesetHelper.UpdateUsageForPower(pool, 1); var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); @@ -1738,7 +1738,7 @@ void ReactionValidated() action.AttackRollOutcome = RollOutcome.Success; } - rulesetAttacker.ShowDieRoll( + rulesetHelper.ShowDieRoll( dieType, dieRoll, title: feature.GuiPresentation.Title, @@ -1746,7 +1746,7 @@ void ReactionValidated() displayOutcome: true ); - rulesetAttacker.LogCharacterUsedFeature( + rulesetHelper.LogCharacterUsedFeature( feature, Line, extra: @@ -1778,20 +1778,20 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || helper != defender || rulesetEffect != null || !defender.CanReact() || - rulesetDefender.GetRemainingPowerCharges(pool) <= 0 || + rulesetHelper.GetRemainingPowerCharges(pool) <= 0 || attackMode is { Ranged: true } || attackMode is { Thrown: true }) { yield break; } - var dieType = GetGambitDieSize(rulesetDefender); + var dieType = GetGambitDieSize(rulesetHelper); var guiMe = new GuiCharacter(defender); var guiTarget = new GuiCharacter(attacker); @@ -1809,20 +1809,20 @@ public IEnumerator OnTryAlterOutcomeAttack( void ReactionValidated() { - rulesetDefender.UpdateUsageForPower(pool, 1); + rulesetHelper.UpdateUsageForPower(pool, 1); var dieRoll = RollDie(dieType, AdvantageType.None, out _, out _); - var pb = 2 * rulesetDefender.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); + var pb = 2 * rulesetHelper.TryGetAttributeValue(AttributeDefinitions.ProficiencyBonus); var reduction = dieRoll + pb; actionModifier.damageRollReduction += reduction; - rulesetDefender.ShowDieRoll(dieType, dieRoll, + rulesetHelper.ShowDieRoll(dieType, dieRoll, title: feature.GuiPresentation.Title, displayModifier: true, modifier: pb); - rulesetDefender.LogCharacterUsedFeature(feature, Line, + rulesetHelper.LogCharacterUsedFeature(feature, Line, extra: [ (ConsoleStyleDuplet.ParameterType.AbilityInfo, Gui.FormatDieTitle(dieType)), diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialGuardian.cs b/SolastaUnfinishedBusiness/Subclasses/MartialGuardian.cs index eb9de9d591..6dae81907d 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialGuardian.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialGuardian.cs @@ -273,24 +273,24 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; if (helper != defender || rulesetEffect != null || attackMode.Magical || - !ValidatorsCharacter.HasHeavyArmor(rulesetDefender)) + !ValidatorsCharacter.HasHeavyArmor(rulesetHelper)) { yield break; } - rulesetDefender.InflictCondition( + rulesetHelper.InflictCondition( conditionImperviousProtector.Name, DurationType.Round, 0, TurnOccurenceType.StartOfTurn, AttributeDefinitions.TagEffect, - rulesetDefender.Guid, - rulesetDefender.CurrentFaction.Name, + rulesetHelper.Guid, + rulesetHelper.CurrentFaction.Name, 1, conditionImperviousProtector.Name, 0, diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs index 609b4d398e..56d2d5227f 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheBeast.cs @@ -435,6 +435,7 @@ internal BeastTailHandler() : base(ActionDefinitions.ActionType.Main) .SetSpecialInterruptions(ConditionInterruption.AnyBattleTurnEnd) .SetPossessive() .AddToDB(); + conditionTailSwipe.AddCustomSubFeatures(new BeastTailModifyArmorClass(conditionTailSwipe)); _powerTailSwipe = FeatureDefinitionPowerBuilder @@ -463,7 +464,7 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; + var rulesetHelper = helper.RulesetCharacter; if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || helper != defender || @@ -477,7 +478,7 @@ public IEnumerator OnTryAlterOutcomeAttack( defender.UsedSpecialFeatures.Remove(TagBeastTailArmorClass); - var usablePower = PowerProvider.Get(_powerTailSwipe, rulesetDefender); + var usablePower = PowerProvider.Get(_powerTailSwipe, rulesetHelper); yield return helper.MyReactToUsePower( ActionDefinitions.Id.PowerReaction, diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs index eb738f5338..ac46344d84 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishAcrobat.cs @@ -213,14 +213,14 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerHeroicUncannyDodge, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerHeroicUncannyDodge, rulesetHelper); if (helper != defender || defender.IsMyTurn() || !defender.CanReact() || !defender.CanPerceiveTarget(attacker) || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs index 3dc346f3fe..5fb4adeb77 100644 --- a/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/RoguishRavenScion.cs @@ -243,13 +243,13 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetAttacker = attacker.RulesetCharacter; - var usablePower = PowerProvider.Get(powerDeadlyFocus, rulesetAttacker); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerDeadlyFocus, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Failure or RollOutcome.CriticalFailure) || helper != attacker || !ValidatorsWeapon.IsTwoHandedRanged(attackMode) || - rulesetAttacker.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } @@ -272,7 +272,7 @@ void ReactionValidated() ? "Feedback/&RollAttackCriticalFailureTitle" : "Feedback/&RollAttackFailureTitle"; - rulesetAttacker.LogCharacterUsedPower( + rulesetHelper.LogCharacterUsedPower( powerDeadlyFocus, $"Feedback/&Trigger{Name}RerollLine", false, @@ -287,7 +287,7 @@ void ReactionValidated() attackModifier.AttackAdvantageTrends.SetRange(advantageTrends); - var roll = rulesetAttacker.RollAttack( + var roll = rulesetHelper.RollAttack( attackMode.toHitBonus, defender.RulesetActor, attackMode.sourceDefinition, diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs index ee62a834c1..3113dfc31a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheDragon.cs @@ -833,13 +833,13 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerReactiveHide, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerReactiveHide, rulesetHelper); if (defender != helper || !defender.CanReact() || !ValidatorsWeapon.IsMelee(attackMode) || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs index f25c063014..32bf5762a4 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WayOfTheSilhouette.cs @@ -270,13 +270,13 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetDefender = defender.RulesetCharacter; - var usablePower = PowerProvider.Get(powerShadowSanctuary, rulesetDefender); + var rulesetHelper = helper.RulesetCharacter; + var usablePower = PowerProvider.Get(powerShadowSanctuary, rulesetHelper); if (action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSuccess) || defender != helper || !defender.CanReact() || - rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) + rulesetHelper.GetRemainingUsesOfPower(usablePower) == 0) { yield break; } diff --git a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs index c5eefa20d2..bf618b1038 100644 --- a/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/WizardWarMagic.cs @@ -175,8 +175,8 @@ public IEnumerator OnTryAlterOutcomeAttack( RulesetAttackMode attackMode, RulesetEffect rulesetEffect) { - var rulesetCharacter = helper.RulesetCharacter; - var intelligence = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.Intelligence); + var rulesetHelper = helper.RulesetCharacter; + var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); if (action.AttackRollOutcome != RollOutcome.Success || @@ -202,14 +202,14 @@ void ReactionValidated() { EffectHelpers.StartVisualEffect( helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); - rulesetCharacter.InflictCondition( + rulesetHelper.InflictCondition( conditionArcaneDeflection.Name, DurationType.Round, 0, TurnOccurenceType.EndOfTurn, AttributeDefinitions.TagEffect, - rulesetCharacter.guid, - rulesetCharacter.CurrentFaction.Name, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, 1, conditionArcaneDeflection.Name, 0, @@ -245,8 +245,8 @@ public IEnumerator OnTryAlterOutcomeSavingThrow( bool hasHitVisual, bool hasBorrowedLuck) { - var rulesetCharacter = helper.RulesetCharacter; - var intelligence = rulesetCharacter.TryGetAttributeValue(AttributeDefinitions.Intelligence); + var rulesetHelper = helper.RulesetCharacter; + var intelligence = rulesetHelper.TryGetAttributeValue(AttributeDefinitions.Intelligence); var bonus = Math.Max(AttributeDefinitions.ComputeAbilityScoreModifier(intelligence), 1); if (!action.RolledSaveThrow || @@ -273,14 +273,14 @@ void ReactionValidated() { EffectHelpers.StartVisualEffect( helper, helper, SpellDefinitions.Shield, EffectHelpers.EffectType.QuickCaster); - rulesetCharacter.InflictCondition( + rulesetHelper.InflictCondition( conditionArcaneDeflection.Name, DurationType.Round, 0, TurnOccurenceType.EndOfTurn, AttributeDefinitions.TagEffect, - rulesetCharacter.guid, - rulesetCharacter.CurrentFaction.Name, + rulesetHelper.guid, + rulesetHelper.CurrentFaction.Name, 1, conditionArcaneDeflection.Name, 0, From ce62d1c6072d64bb7f654cbd607f3fd63239f5c2 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 16:00:18 -0700 Subject: [PATCH 152/162] auto format and clean up --- .../Models/Level20SubclassesContext.cs | 8 +++-- .../Patches/GuiSpellDefinitionPatcher.cs | 2 +- .../Spells/SpellBuildersLevel01.cs | 36 ++++++++++--------- .../Spells/SpellBuildersLevel09.cs | 6 ++-- .../Subclasses/DomainTempest.cs | 4 +-- .../Subclasses/MartialRoyalKnight.cs | 1 - .../Subclasses/PatronMoonlitScion.cs | 1 - 7 files changed, 32 insertions(+), 26 deletions(-) diff --git a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs index ebafe726be..588c13f67e 100644 --- a/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs +++ b/SolastaUnfinishedBusiness/Models/Level20SubclassesContext.cs @@ -2197,7 +2197,8 @@ public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) battle.InitiativeSortedContenders.RemoveAt(index); - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); } public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) @@ -2216,8 +2217,9 @@ public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) var positionCharacterIndex = initiativeSortedContenders.IndexOf(positionCharacter); initiativeSortedContenders.Insert(positionCharacterIndex, locationCharacter); - - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); + + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); } } diff --git a/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs b/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs index 6f5532eb29..a118d00d88 100644 --- a/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs +++ b/SolastaUnfinishedBusiness/Patches/GuiSpellDefinitionPatcher.cs @@ -36,7 +36,7 @@ public static void Postfix(GuiSpellDefinition __instance, ref EffectDescription __result = PowerBundle.ModifyMagicEffectGui(__result, __instance.SpellDefinition); } } - + [HarmonyPatch(typeof(GuiSpellDefinition), nameof(GuiSpellDefinition.AdvancementGain), MethodType.Getter)] [SuppressMessage("Minor Code Smell", "S101:Types should be named in PascalCase", Justification = "Patch")] [UsedImplicitly] diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs index 82805404a1..cb3dfdf20f 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel01.cs @@ -754,7 +754,8 @@ internal static SpellDefinition BuildThunderousSmite() #endregion #region Chaos Bolt - const string DamageTypeChaosBolt = "DamageChaosBolt"; + + private const string DamageTypeChaosBolt = "DamageChaosBolt"; private static readonly (string, IMagicEffect)[] ChaosBoltDamagesAndEffects = [ @@ -780,16 +781,17 @@ internal static SpellDefinition BuildChaosBolt() formattedDamages += "\n"; } } - formattedDamages += $"{i+1}: {Gui.FormatDamageType(ChaosBoltDamagesAndEffects[i].Item1, true)}"; + + formattedDamages += $"{i + 1}: {Gui.FormatDamageType(ChaosBoltDamagesAndEffects[i].Item1, true)}"; } var spellDescription = Gui.Format("Spell/&ChaosBoltDescription", formattedDamages); //267B = ♻ - var damageGui = GuiPresentationBuilder.Build(Gui.NoLocalization, Gui.NoLocalization, symbol:"267B"); + var damageGui = GuiPresentationBuilder.Build(Gui.NoLocalization, Gui.NoLocalization, symbol: "267B"); DamageDefinitionBuilder.Create(DamageTypeChaosBolt) .SetGuiPresentation(damageGui) .AddToDB(); - + const string NAME = "ChaosBolt"; var sprite = Sprites.GetSprite(NAME, Resources.ChaosBolt, 128); @@ -1140,16 +1142,6 @@ void ReactionNotValidated(ReactionRequestSpendBundlePower reactionRequest) } } - private static void ModifyChaosBoltForms(List actualEffectForms, string damageType) - { - foreach (var effectForm in actualEffectForms - .Where(x => x.FormType == EffectForm.EffectFormType.Damage && - x.DamageForm.DamageType == DamageTypeChaosBolt)) - { - effectForm.DamageForm.DamageType = damageType; - } - } - public void BeforeRoll( RollContext rollContext, RulesetCharacter rulesetCharacter, @@ -1214,6 +1206,16 @@ public EffectDescription GetEffectDescription( return effectDescription; } + private static void ModifyChaosBoltForms(List actualEffectForms, string damageType) + { + foreach (var effectForm in actualEffectForms + .Where(x => x.FormType == EffectForm.EffectFormType.Damage && + x.DamageForm.DamageType == DamageTypeChaosBolt)) + { + effectForm.DamageForm.DamageType = damageType; + } + } + public void Reset(GameLocationCharacter attacker) { attacker.UsedSpecialFeatures.TryAdd("ChaosBoltLeap", 0); @@ -2173,10 +2175,12 @@ public IEnumerator OnInitiativeEnded(GameLocationCharacter locationCharacter) var rulesetCharacter = locationCharacter.RulesetCharacter; var roll = rulesetCharacter.RollDie(DieType.D8, RollContext.None, false, AdvantageType.None, out _, out _); - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); locationCharacter.LastInitiative += roll; Gui.Battle.initiativeSortedContenders.Sort(Gui.Battle); - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); locationCharacter.RulesetCharacter.LogCharacterUsedFeature( featureDefinition, diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs index dfb1f1eb7f..ec08e284e6 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel09.cs @@ -473,7 +473,8 @@ private static void RemoveTimeStop(GameLocationCharacter locationCharacter) battle.InitiativeSortedContenders.RemoveAt(index); } - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Remove, false, false); } // remove time stop condition from others @@ -534,7 +535,8 @@ public IEnumerator OnPowerOrSpellFinishedByMe(CharacterActionMagicEffect action, initiativeSortedContenders.Insert(positionCharacterIndex + 1, locationCharacter); } - Gui.Battle.ContenderModified(locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); + Gui.Battle.ContenderModified( + locationCharacter, GameLocationBattle.ContenderModificationMode.Add, false, false); } } diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index af446098ff..dd0de7c745 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -367,7 +367,7 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc !defender.CanPerceiveTarget(attacker) || rulesetDefender.GetRemainingUsesOfPower(usablePower) == 0) { - yield break; + yield break; } yield return defender.MyReactToSpendPowerBundle( @@ -375,7 +375,7 @@ action.AttackRollOutcome is not (RollOutcome.Success or RollOutcome.CriticalSucc [attacker], attacker, "WrathOfTheStorm", - reactionValidated: ReactionValidated); + ReactionValidated); yield break; diff --git a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs index d0d785f7b7..6cd41b12b6 100644 --- a/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs +++ b/SolastaUnfinishedBusiness/Subclasses/MartialRoyalKnight.cs @@ -1,7 +1,6 @@ using System.Collections; using JetBrains.Annotations; using SolastaUnfinishedBusiness.Api.GameExtensions; -using SolastaUnfinishedBusiness.Api.Helpers; using SolastaUnfinishedBusiness.Api.LanguageExtensions; using SolastaUnfinishedBusiness.Behaviors; using SolastaUnfinishedBusiness.Builders; diff --git a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs index d5976174d6..983580dd92 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PatronMoonlitScion.cs @@ -587,7 +587,6 @@ private IEnumerator HandleReaction( yield break; } - yield return defender.MyReactToUsePower( ActionDefinitions.Id.PowerReaction, usablePower, From e4b1c22754f3ae01b4dd8bd525922cf9967e8752 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 16:00:51 -0700 Subject: [PATCH 153/162] fix corrupting bolt --- .../Spells/SpellBuildersLevel03.cs | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 26e78bfd90..5f75a0699b 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -359,11 +359,22 @@ internal static SpellDefinition BuildCorruptingBolt() .SetImpactEffectParameters(Disintegrate) .SetEffectEffectParameters(Disintegrate) .Build()) + .AddCustomSubFeatures(new PowerOrSpellInitiatedByMeCorruptingBolt()) .AddToDB(); return spell; } + private sealed class PowerOrSpellInitiatedByMeCorruptingBolt : IPowerOrSpellInitiatedByMe + { + public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) + { + action.ActingCharacter.UsedSpecialFeatures.TryAdd("CorruptingBolt", 0); + + yield break; + } + } + private sealed class CustomBehaviorCorruptingBolt : IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe { public IEnumerator OnMagicEffectFinishedOnMe( @@ -372,6 +383,12 @@ public IEnumerator OnMagicEffectFinishedOnMe( GameLocationCharacter defender, List targets) { + // finishing corrupting bolt cast + if (attacker.UsedSpecialFeatures.Remove("CorruptingBolt")) + { + yield break; + } + var rulesetEffect = action.ActionParams.RulesetEffect; if (rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) @@ -381,8 +398,8 @@ public IEnumerator OnMagicEffectFinishedOnMe( var rulesetDefender = defender.RulesetCharacter; - rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, - "ConditionCorruptingBolt"); + rulesetDefender.RemoveAllConditionsOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); } public IEnumerator OnPhysicalAttackFinishedOnMe( @@ -396,8 +413,8 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( { var rulesetDefender = defender.RulesetCharacter; - rulesetDefender.RemoveAllConditionsOfCategoryAndType(AttributeDefinitions.TagEffect, - "ConditionCorruptingBolt"); + rulesetDefender.RemoveAllConditionsOfCategoryAndType( + AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); yield break; } From 5b381380701e1c061a3ad61dbdeb826504c9736b Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 16:01:15 -0700 Subject: [PATCH 154/162] fix symbolChar attribute default value --- SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs index a9953c02eb..48da7de118 100644 --- a/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs +++ b/SolastaUnfinishedBusiness/Builders/GuiPresentationBuilder.cs @@ -107,7 +107,7 @@ internal static GuiPresentation Build( guiPresentation.spriteReference = sprite ?? reference?.SpriteReference ?? EmptySprite; guiPresentation.sortOrder = sortOrder ?? reference?.SortOrder ?? 0; guiPresentation.hidden = hidden ?? reference?.Hidden ?? false; - guiPresentation.symbolChar = symbol ?? reference?.symbolChar; + guiPresentation.symbolChar = symbol ?? reference?.symbolChar ?? guiPresentation.symbolChar; return guiPresentation; } From 2e31633333ab6bc2b49935dc95a5425c0d2e37b2 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 18:11:55 -0700 Subject: [PATCH 155/162] update collaterals --- ...s-GuiPresentation-InvalidSyntaxTranslation-en.txt | 12 ++++++++++++ Diagnostics/UnfinishedBusinessBlueprints/Assets.txt | 4 ++++ SolastaUnfinishedBusiness/ChangelogHistory.txt | 2 ++ .../it/SubClasses/PathOfTheElements-it.txt | 2 +- .../pt-BR/SubClasses/PathOfTheElements-pt-BR.txt | 2 +- 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt index cb5da672db..fde0f010cf 100644 --- a/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt +++ b/Diagnostics/CE-Definitions-GuiPresentation-InvalidSyntaxTranslation-en.txt @@ -90,6 +90,12 @@ CastSpellFeatSpellSniperWarlock Title='Sniper'. CastSpellFeatSpellSniperWarlock Description='You learn one cantrip of your choice from the Warlock spell list. When you cast a spell that requires you to make an attack roll, the spell's range is doubled. Your ranged spell attacks ignore half cover and three-quarters cover.'. CastSpellFeatSpellSniperWizard Title='Sniper'. CastSpellFeatSpellSniperWizard Description='You learn one cantrip of your choice from the Wizard spell list. When you cast a spell that requires you to make an attack roll, the spell's range is doubled. Your ranged spell attacks ignore half cover and three-quarters cover.'. +ChaosBolt Description='Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type: +1: ◰ Acid 2: ◲ Cold +3: ◳ Fire 4: ◴ Force +5: ◵ Lightning 6: ◸ Poison +7: ◹ Psychic 8: ◼ Thunder +If you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell.'. ChromaticOrbDamageAcid Title='Acid Damage'. ChromaticOrbDamageAcid Description='The creature takes 3d8 Acid Damage damage.'. ChromaticOrbDamageCold Title='Cold Damage'. @@ -1118,6 +1124,12 @@ PowerChaosBoltDamagePsychic Title='Psychic Damage'. PowerChaosBoltDamagePsychic Description='Use Psychic Damage damage.'. PowerChaosBoltDamageThunder Title='Thunder Damage'. PowerChaosBoltDamageThunder Description='Use Thunder Damage damage.'. +PowerChaosBoltLeap Description='Make a ranged spell attack against a target. On a hit, the target takes 2d8 + 1d6 damage. Choose one of the d8s. The number rolled on that die determines the attack's damage type: +1: ◰ Acid 2: ◲ Cold +3: ◳ Fire 4: ◴ Force +5: ◵ Lightning 6: ◸ Poison +7: ◹ Psychic 8: ◼ Thunder +If you roll the same number on both d8s, you can use your free action to target a different creature of your choice. Make a new attack roll against the new target, and make a new damage roll, which could cause the chaotic energy to leap again. A creature can be damaged only once by each casting of this spell.'. PowerCreateInfusedReplicaAmuletOfHealth Title='Replica Amulet of Health'. PowerCreateInfusedReplicaAmuletOfHealth Description='Create replica Amulet of Health: This amulet was created by Marsh halfling mages in the olden times to help sick people survive the hardships of Olme Fen.'. diff --git a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt index 1ad449a6f6..fcd9c42268 100644 --- a/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt +++ b/Diagnostics/UnfinishedBusinessBlueprints/Assets.txt @@ -1227,6 +1227,7 @@ ConditionWrack ConditionDefinition ConditionDefinition 886b855a-3d41-5c6a-87e5-f ConditionWrathfulSmite ConditionDefinition ConditionDefinition b551eee2-5f52-552d-a943-4fba57fea5cb ConditionWrathfulSmiteEnemy ConditionDefinition ConditionDefinition 08ab37a6-23bc-59c3-ac2b-09f02170a996 9999 ContentPackDefinition ContentPackDefinition 81c2b331-87e1-51f4-a035-33adf3429def +DamageChaosBolt DamageDefinition DamageDefinition ebaf896a-d18b-53c8-9d01-7f45e1033cb1 DamagePure DamageDefinition DamageDefinition c5cbdb1e-040d-55a7-bbdb-d56c40f14ab8 DecisionBreakFreeConditionFlashFreeze TA.AI.DecisionDefinition TA.AI.DecisionDefinition c1790fe7-d377-51c3-8bd4-3ff2556b771e DecisionBreakFreeConditionGrappledRestrainedEnsnared TA.AI.DecisionDefinition TA.AI.DecisionDefinition 69855aed-d774-527f-9de3-8de1e5a9743f @@ -2210,6 +2211,7 @@ DamageAffinityInfusionResistantArmorDamageThunder FeatureDefinitionDamageAffinit DamageAffinityInvocationGiftOfTheProtectorsRelentlessEndurance FeatureDefinitionDamageAffinity FeatureDefinition 5409fd33-c4c3-5cd1-b75b-0b13945da567 DamageAffinityInvulnerabilityDamageAcid FeatureDefinitionDamageAffinity FeatureDefinition be3b4456-69b6-5221-9276-0770c1656194 DamageAffinityInvulnerabilityDamageBludgeoning FeatureDefinitionDamageAffinity FeatureDefinition 314c78fb-0e2b-5525-a7e8-8a3ecafaadd2 +DamageAffinityInvulnerabilityDamageChaosBolt FeatureDefinitionDamageAffinity FeatureDefinition e4eb612d-90a3-5b78-bcd6-af7ffdad31d0 DamageAffinityInvulnerabilityDamageCold FeatureDefinitionDamageAffinity FeatureDefinition 545182d8-0df0-5833-87b6-368eab21129f DamageAffinityInvulnerabilityDamageFire FeatureDefinitionDamageAffinity FeatureDefinition 7bfaba80-217c-5383-aac1-97e2d20c23cb DamageAffinityInvulnerabilityDamageForce FeatureDefinitionDamageAffinity FeatureDefinition 8b1865b8-7510-5625-b9d6-26f124950e97 @@ -4656,6 +4658,7 @@ DamageAffinityInfusionResistantArmorDamageThunder FeatureDefinitionDamageAffinit DamageAffinityInvocationGiftOfTheProtectorsRelentlessEndurance FeatureDefinitionDamageAffinity FeatureDefinitionAffinity 5409fd33-c4c3-5cd1-b75b-0b13945da567 DamageAffinityInvulnerabilityDamageAcid FeatureDefinitionDamageAffinity FeatureDefinitionAffinity be3b4456-69b6-5221-9276-0770c1656194 DamageAffinityInvulnerabilityDamageBludgeoning FeatureDefinitionDamageAffinity FeatureDefinitionAffinity 314c78fb-0e2b-5525-a7e8-8a3ecafaadd2 +DamageAffinityInvulnerabilityDamageChaosBolt FeatureDefinitionDamageAffinity FeatureDefinitionAffinity e4eb612d-90a3-5b78-bcd6-af7ffdad31d0 DamageAffinityInvulnerabilityDamageCold FeatureDefinitionDamageAffinity FeatureDefinitionAffinity 545182d8-0df0-5833-87b6-368eab21129f DamageAffinityInvulnerabilityDamageFire FeatureDefinitionDamageAffinity FeatureDefinitionAffinity 7bfaba80-217c-5383-aac1-97e2d20c23cb DamageAffinityInvulnerabilityDamageForce FeatureDefinitionDamageAffinity FeatureDefinitionAffinity 8b1865b8-7510-5625-b9d6-26f124950e97 @@ -5267,6 +5270,7 @@ DamageAffinityInfusionResistantArmorDamageThunder FeatureDefinitionDamageAffinit DamageAffinityInvocationGiftOfTheProtectorsRelentlessEndurance FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity 5409fd33-c4c3-5cd1-b75b-0b13945da567 DamageAffinityInvulnerabilityDamageAcid FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity be3b4456-69b6-5221-9276-0770c1656194 DamageAffinityInvulnerabilityDamageBludgeoning FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity 314c78fb-0e2b-5525-a7e8-8a3ecafaadd2 +DamageAffinityInvulnerabilityDamageChaosBolt FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity e4eb612d-90a3-5b78-bcd6-af7ffdad31d0 DamageAffinityInvulnerabilityDamageCold FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity 545182d8-0df0-5833-87b6-368eab21129f DamageAffinityInvulnerabilityDamageFire FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity 7bfaba80-217c-5383-aac1-97e2d20c23cb DamageAffinityInvulnerabilityDamageForce FeatureDefinitionDamageAffinity FeatureDefinitionDamageAffinity 8b1865b8-7510-5625-b9d6-26f124950e97 diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 0583037a30..95ecb2b0d5 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -5,12 +5,14 @@ - fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 - fixed College of Swords flourish description +- fixed Corrupting Bolt spell removing corrupted condition too soon - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration - fixed Toll the Dead and Wrack cantrips description - fixed Variant Spell Points consumption on slots above 5 - improved Bladestorm feat with an additional 1D4 BA attack, and mod damage on whirlwind attack +- improved Chaos Bolt tooltip to present damage symbols, and correct 1D6 damage progression - improved Time Stop spell to behave as in tabletop KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheElements-it.txt b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheElements-it.txt index ce5b893f62..e04090b76d 100644 --- a/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheElements-it.txt +++ b/SolastaUnfinishedBusiness/Translations/it/SubClasses/PathOfTheElements-it.txt @@ -12,7 +12,7 @@ Feature/&FeatureSetPathOfTheElementsElementalBlessingDescription=A partire dal 6 Feature/&FeatureSetPathOfTheElementsElementalBlessingTitle=Benedizione Elementale Feature/&FeatureSetPathOfTheElementsElementalBurstDescription=A partire dal 10° livello, ottieni poteri aggiuntivi a seconda della calamità elementale scelta al 3° livello.\n• Tempesta: {0}\n• Bufera di neve: {1}\n• Incendio selvaggio: {2} Feature/&FeatureSetPathOfTheElementsElementalBurstTitle=Scoppio Elementale -Feature/&FeatureSetPathOfTheElementsElementalConduitDescription=A partire dal 14° livello, ottieni poteri aggiuntivi a seconda della calamità elementale scelta al 3° livello.\n• Tempesta: {0}\n• Tormenta: {1 }\n• Incendio: {2} +Feature/&FeatureSetPathOfTheElementsElementalConduitDescription=A partire dal 14° livello, ottieni poteri aggiuntivi a seconda della calamità elementale scelta al 3° livello.\n• Tempesta: {0}\n• Tormenta: {1}\n• Incendio: {2} Feature/&FeatureSetPathOfTheElementsElementalConduitTitle=Condotto Elementale Feature/&FeatureSetPathOfTheElementsElementalFuryDescription=A partire dal 3° livello, scegli una calamità elementale. La calamità determina il tipo di mantello magico che crei mentre sei in preda alla furia, così come le caratteristiche che ottieni ai livelli più alti mentre segui questo percorso. Se un effetto richiede un tiro salvezza, la CD è pari a 8 + il tuo bonus di competenza + il tuo modificatore di Costituzione.\n• Tempesta: mentre sei in preda alla furia, tutti i nemici entro 1,5 metri da te subiscono 1D6 danni da fulmine quando termini il tuo turno.\n• Bufera di neve: mentre sei in preda alla furia, tutti i nemici entro 1,5 metri da te subiscono 1D6 danni da freddo quando termini il tuo turno.\n• Incendio selvaggio: mentre sei in preda alla furia, tutti i nemici entro 1,5 metri da te subiscono 1D6 danni da fuoco quando termini il tuo turno.\n Questi danni aumentano a 1d10 al 6° livello, 2d6 al 10° livello e 2d10 al 14° livello. Feature/&FeatureSetPathOfTheElementsElementalFuryTitle=Furia Elementale diff --git a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheElements-pt-BR.txt b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheElements-pt-BR.txt index 2eb0b68829..8b6a5c5b02 100644 --- a/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheElements-pt-BR.txt +++ b/SolastaUnfinishedBusiness/Translations/pt-BR/SubClasses/PathOfTheElements-pt-BR.txt @@ -12,7 +12,7 @@ Feature/&FeatureSetPathOfTheElementsElementalBlessingDescription=A partir do 6º Feature/&FeatureSetPathOfTheElementsElementalBlessingTitle=Bênção Elemental Feature/&FeatureSetPathOfTheElementsElementalBurstDescription=A partir do 10º nível, você ganha poderes adicionais dependendo da calamidade elemental escolhida no 3º nível.\n• Tempestade: {0}\n• Nevasca: {1}\n• Fogo Selvagem: {2} Feature/&FeatureSetPathOfTheElementsElementalBurstTitle=Explosão Elemental -Feature/&FeatureSetPathOfTheElementsElementalConduitDescription=A partir do 14º nível, você ganha poderes adicionais dependendo da calamidade elemental escolhida no 3º nível.\n• Tempestade: {0}\n• Nevasca: {1 }\n• Incêndio: {2} +Feature/&FeatureSetPathOfTheElementsElementalConduitDescription=A partir do 14º nível, você ganha poderes adicionais dependendo da calamidade elemental escolhida no 3º nível.\n• Tempestade: {0}\n• Nevasca: {1}\n• Incêndio: {2} Feature/&FeatureSetPathOfTheElementsElementalConduitTitle=Conduíte Elemental Feature/&FeatureSetPathOfTheElementsElementalFuryDescription=Começando no 3º nível, escolha uma calamidade elemental. A calamidade dita o tipo de manto mágico que você cria enquanto está em fúria, assim como as características que você obtém em níveis mais altos enquanto segue esse caminho. Se algum efeito exigir um teste de resistência, a CD será igual a 8 + seu bônus de proficiência + seu modificador de Constituição.\n• Tempestade: Enquanto você estiver em fúria, todos os inimigos a até 1,5 m de você sofrem 1D6 de dano de raio quando você terminar seu turno.\n• Nevasca: Enquanto você estiver em fúria, todos os inimigos a até 1,5 m de você sofrem 1D6 de dano de frio quando você terminar seu turno.\n• Fogo Selvagem: Enquanto você estiver em fúria, todos os inimigos a até 1,5 m de você sofrem 1D6 de dano de fogo quando você terminar seu turno.\n Esses danos aumentam para 1d10 no 6º nível, 2d6 no 10º nível e 2d10 no 14º nível. Feature/&FeatureSetPathOfTheElementsElementalFuryTitle=Fúria Elemental From 235da13308fb8a3f2d803e04b61967a250478486 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 18:42:37 -0700 Subject: [PATCH 156/162] improve corrupting bolt removal logic on magic effect hit --- .../Spells/SpellBuildersLevel03.cs | 31 +++++++------------ 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs index 5f75a0699b..50eecfd71e 100644 --- a/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs +++ b/SolastaUnfinishedBusiness/Spells/SpellBuildersLevel03.cs @@ -359,36 +359,21 @@ internal static SpellDefinition BuildCorruptingBolt() .SetImpactEffectParameters(Disintegrate) .SetEffectEffectParameters(Disintegrate) .Build()) - .AddCustomSubFeatures(new PowerOrSpellInitiatedByMeCorruptingBolt()) .AddToDB(); return spell; } - private sealed class PowerOrSpellInitiatedByMeCorruptingBolt : IPowerOrSpellInitiatedByMe - { - public IEnumerator OnPowerOrSpellInitiatedByMe(CharacterActionMagicEffect action, BaseDefinition baseDefinition) - { - action.ActingCharacter.UsedSpecialFeatures.TryAdd("CorruptingBolt", 0); - - yield break; - } - } - private sealed class CustomBehaviorCorruptingBolt : IPhysicalAttackFinishedOnMe, IMagicEffectFinishedOnMe { + private const string ConditionCorruptingBoltName = "ConditionCorruptingBolt"; + public IEnumerator OnMagicEffectFinishedOnMe( CharacterActionMagicEffect action, GameLocationCharacter attacker, GameLocationCharacter defender, List targets) { - // finishing corrupting bolt cast - if (attacker.UsedSpecialFeatures.Remove("CorruptingBolt")) - { - yield break; - } - var rulesetEffect = action.ActionParams.RulesetEffect; if (rulesetEffect.EffectDescription.RangeType is not (RangeType.MeleeHit or RangeType.RangeHit)) @@ -396,10 +381,16 @@ public IEnumerator OnMagicEffectFinishedOnMe( yield break; } + var rulesetAttacker = action.ActingCharacter.RulesetCharacter; var rulesetDefender = defender.RulesetCharacter; - rulesetDefender.RemoveAllConditionsOfCategoryAndType( - AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); + if (rulesetDefender.TryGetConditionOfCategoryAndType( + AttributeDefinitions.TagEffect, ConditionCorruptingBoltName, out var activeCondition) && + !rulesetAttacker.SpellsCastByMe.Any(x => x.TrackedConditionGuids.Contains(activeCondition.Guid))) + { + rulesetDefender.RemoveAllConditionsOfCategoryAndType( + AttributeDefinitions.TagEffect, ConditionCorruptingBoltName); + } } public IEnumerator OnPhysicalAttackFinishedOnMe( @@ -414,7 +405,7 @@ public IEnumerator OnPhysicalAttackFinishedOnMe( var rulesetDefender = defender.RulesetCharacter; rulesetDefender.RemoveAllConditionsOfCategoryAndType( - AttributeDefinitions.TagEffect, "ConditionCorruptingBolt"); + AttributeDefinitions.TagEffect, ConditionCorruptingBoltName); yield break; } From ffe686a88f023244e73eeda4ea62edae846d8807 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 18:43:38 -0700 Subject: [PATCH 157/162] bring back wrath of the storm reaction resource as only bundle power that indeed needs it --- .../ReactionResourceWrathOfTheStorm.cs | 24 +++++++++++++++++++ .../Subclasses/DomainTempest.cs | 1 + 2 files changed, 25 insertions(+) create mode 100644 SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs diff --git a/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs new file mode 100644 index 0000000000..5f808909ba --- /dev/null +++ b/SolastaUnfinishedBusiness/CustomUI/ReactionResourceWrathOfTheStorm.cs @@ -0,0 +1,24 @@ +using SolastaUnfinishedBusiness.Api; +using SolastaUnfinishedBusiness.Behaviors; +using SolastaUnfinishedBusiness.Interfaces; +using SolastaUnfinishedBusiness.Subclasses; +using UnityEngine.AddressableAssets; + +namespace SolastaUnfinishedBusiness.CustomUI; + +public class ReactionResourceWrathOfTheStorm : ICustomReactionResource +{ + private ReactionResourceWrathOfTheStorm() + { + } + + public static ICustomReactionResource Instance { get; } = new ReactionResourceWrathOfTheStorm(); + public AssetReferenceSprite Icon => DatabaseHelper.ActionDefinitions.ActionSurge.GuiPresentation.SpriteReference; + + public string GetUses(RulesetCharacter character) + { + var usablePower = PowerProvider.Get(DomainTempest.PowerWrathOfTheStorm, character); + + return character.GetRemainingUsesOfPower(usablePower).ToString(); + } +} diff --git a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs index dd0de7c745..2949c26fd2 100644 --- a/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs +++ b/SolastaUnfinishedBusiness/Subclasses/DomainTempest.cs @@ -80,6 +80,7 @@ public DomainTempest() PowerWrathOfTheStorm.AddCustomSubFeatures( ModifyPowerVisibility.Hidden, + ReactionResourceWrathOfTheStorm.Instance, new CustomBehaviorWrathOfTheStorm(PowerWrathOfTheStorm)); var powerWrathOfTheStormLightning = FeatureDefinitionPowerSharedPoolBuilder From 0a7453b2c4b8159d224041456f12272945f0f102 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 18:53:59 -0700 Subject: [PATCH 158/162] clean up and change WildSurgeGrowthOnTurnEnd from PowerBonus to PowerNoCost --- .../Subclasses/PathOfTheWildMagic.cs | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs index 424dd3c193..30447f582a 100644 --- a/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs +++ b/SolastaUnfinishedBusiness/Subclasses/PathOfTheWildMagic.cs @@ -120,14 +120,15 @@ private class WildSurgeHandler public WildSurgeHandler(FeatureDefinition featureControlledSurge) { _featureControlledSurge = featureControlledSurge; - _wildSurgeEffects.Add(BuildWildSurgeDrain()); - _wildSurgeEffects.Add(BuildWildSurgeTeleport()); - _wildSurgeEffects.Add(BuildWildSurgeSummon()); - _wildSurgeEffects.Add(BuildWildSurgeWeapon()); - _wildSurgeEffects.Add(BuildWildSurgeRetribution()); - _wildSurgeEffects.Add(BuildWildSurgeAura()); - _wildSurgeEffects.Add(BuildWildSurgeGrowth()); - _wildSurgeEffects.Add(BuildWildSurgeBolt()); + _wildSurgeEffects.AddRange( + BuildWildSurgeDrain(), + BuildWildSurgeTeleport(), + BuildWildSurgeSummon(), + BuildWildSurgeWeapon(), + BuildWildSurgeRetribution(), + BuildWildSurgeAura(), + BuildWildSurgeGrowth(), + BuildWildSurgeBolt()); _conditionPreventAction = ConditionDefinitionBuilder .Create($"Condition{Name}PreventAction") @@ -755,6 +756,7 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation } var usablePower = PowerProvider.Get(power, rulesetCharacter); + var commandService = ServiceRepository.GetService(); if (power.EffectDescription.TargetType != TargetType.Position) { @@ -765,9 +767,9 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation { var actionParams = new CharacterActionParams(character, Id.PowerNoCost) { - RulesetEffect = implementationManager.MyInstantiateEffectPower( - rulesetCharacter, usablePower, false) - //IsReactionEffect = true + RulesetEffect = implementationManager + .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), + IsReactionEffect = true }; if (reactingOutOfTurn) @@ -801,12 +803,11 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation { var actionParams = new CharacterActionParams(character, Id.PowerNoCost) { - RulesetEffect = implementationManager.MyInstantiateEffectPower( - rulesetCharacter, usablePower, false) - // IsReactionEffect = true + RulesetEffect = implementationManager + .MyInstantiateEffectPower(rulesetCharacter, usablePower, false), + IsReactionEffect = true }; - ServiceRepository.GetService() - ?.ExecuteInstantSingleAction(actionParams); + commandService.ExecuteInstantSingleAction(actionParams); } } else @@ -831,7 +832,7 @@ public IEnumerator HandleWildSurge(GameLocationCharacter character, GameLocation actionParams.TargetCharacters.Add(attacker); actionParams.ActionModifiers.Add(new ActionModifier()); - ServiceRepository.GetService()?.ExecuteInstantSingleAction(actionParams); + commandService.ExecuteInstantSingleAction(actionParams); } } else @@ -989,15 +990,14 @@ private sealed class WildSurgeGrowthOnTurnEnd(FeatureDefinitionPower power) : IC public void OnCharacterBeforeTurnEnded(GameLocationCharacter locationCharacter) { var rulesetCharacter = locationCharacter.RulesetCharacter; - var actionParams = new CharacterActionParams(locationCharacter, Id.PowerBonus); + var actionParams = new CharacterActionParams(locationCharacter, Id.PowerNoCost); var usablePower = PowerProvider.Get(power, rulesetCharacter); actionParams.RulesetEffect = ServiceRepository.GetService() .InstantiateEffectPower(rulesetCharacter, usablePower, false); actionParams.SkipAnimationsAndVFX = true; - ServiceRepository.GetService()? - .ExecuteInstantSingleAction(actionParams); + ServiceRepository.GetService()?.ExecuteInstantSingleAction(actionParams); } } From e632d06c26861026cd8eddfc8ed17f9238f092a4 Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 19:08:42 -0700 Subject: [PATCH 159/162] fix Innovation Vitriolist vitriolic infusion infinite damage --- SolastaUnfinishedBusiness/ChangelogHistory.txt | 3 ++- .../Subclasses/InnovationVitriolist.cs | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 95ecb2b0d5..0950e2e753 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -6,6 +6,7 @@ - fixed Cleric domains missing divine intervention improvement at 20 - fixed College of Swords flourish description - fixed Corrupting Bolt spell removing corrupted condition too soon +- fixed Innovation Vitriolist vitriolic infusion infinite damage - fixed Martial Guardian not getting the Sentinel feat - fixed Path of the Wild Magic retribution on self, and spirit blast soft lock - fixed Sunlit Blade cantrip highlighted condition duration @@ -13,7 +14,7 @@ - fixed Variant Spell Points consumption on slots above 5 - improved Bladestorm feat with an additional 1D4 BA attack, and mod damage on whirlwind attack - improved Chaos Bolt tooltip to present damage symbols, and correct 1D6 damage progression -- improved Time Stop spell to behave as in tabletop +- improved Time Stop spell to behave as in tabletop, and grant 1d4+1 additional turns [combat only] KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs index 0c8db39a0a..057cd01537 100644 --- a/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs +++ b/SolastaUnfinishedBusiness/Subclasses/InnovationVitriolist.cs @@ -495,6 +495,11 @@ public IEnumerator OnMagicEffectFinishedByMe( GameLocationCharacter attacker, List targets) { + if (action.ActionParams.RulesetEffect.SourceDefinition == powerVitriolicInfusion) + { + yield break; + } + var damagedTargets = new List(); foreach (var target in targets) @@ -514,8 +519,6 @@ public IEnumerator OnMagicEffectFinishedByMe( { InflictDamage(attacker, damagedTargets); } - - yield break; } public IEnumerator OnMagicEffectInitiatedByMe( From e302c9d3f27b6bf6a404694411060c987b4842cb Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 20:13:44 -0700 Subject: [PATCH 160/162] consolidate HasAnyWeaponTag and set default attackMode to null on IsUnarmed(ItemDefinition, RulesetAttackMode) --- .../Behaviors/AddExtraAttack.cs | 4 +-- .../FightingStyles/Interception.cs | 4 +-- .../FightingStyles/Lunger.cs | 21 ++++++++------- .../Validators/ValidatorsCharacter.cs | 27 ++++++++++++------- .../Validators/ValidatorsWeapon.cs | 10 +++---- 5 files changed, 35 insertions(+), 31 deletions(-) diff --git a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs index c558d212ce..23974540d4 100644 --- a/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs +++ b/SolastaUnfinishedBusiness/Behaviors/AddExtraAttack.cs @@ -150,7 +150,7 @@ protected override List GetAttackModes([NotNull] RulesetChara var originalHero = character.GetOriginalHero(); var mainHandItem = hero.GetMainWeapon(); - var isUnarmedWeapon = mainHandItem != null && ValidatorsWeapon.IsUnarmed(mainHandItem.ItemDefinition, null); + var isUnarmedWeapon = mainHandItem != null && ValidatorsWeapon.IsUnarmed(mainHandItem.ItemDefinition); var strikeDefinition = isUnarmedWeapon ? mainHandItem.ItemDefinition : originalHero != null @@ -275,7 +275,7 @@ private void AddItemAttack( attackMode.Reach = false; attackMode.Ranged = true; - attackMode.Thrown = ValidatorsWeapon.HasAnyWeaponTag(item, TagsDefinitions.WeaponTagThrown); + attackMode.Thrown = ValidatorsWeapon.HasAnyWeaponTag(item.ItemDefinition, TagsDefinitions.WeaponTagThrown); attackMode.AttackTags.Remove(TagsDefinitions.WeaponTagMelee); attackModes.Add(attackMode); diff --git a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs index c442df1bb9..f69719ff31 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Interception.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Interception.cs @@ -87,8 +87,8 @@ public IEnumerator OnTryAlterOutcomeAttack( var rulesetHelper = helper.RulesetCharacter; - if (ValidatorsWeapon.IsUnarmed(rulesetHelper.GetMainWeapon()?.ItemDefinition, null) && - ValidatorsWeapon.IsUnarmed(rulesetHelper.GetOffhandWeapon()?.ItemDefinition, null)) + if (ValidatorsWeapon.IsUnarmed(rulesetHelper.GetMainWeapon()?.ItemDefinition) && + ValidatorsWeapon.IsUnarmed(rulesetHelper.GetOffhandWeapon()?.ItemDefinition)) { yield break; } diff --git a/SolastaUnfinishedBusiness/FightingStyles/Lunger.cs b/SolastaUnfinishedBusiness/FightingStyles/Lunger.cs index ac13fd6f84..50939643c2 100644 --- a/SolastaUnfinishedBusiness/FightingStyles/Lunger.cs +++ b/SolastaUnfinishedBusiness/FightingStyles/Lunger.cs @@ -22,19 +22,20 @@ internal sealed class Lunger : AbstractFightingStyle .Create("FeatureLunger") .SetGuiPresentationNoContent(true) .AddCustomSubFeatures(new IncreaseWeaponReach(1, (mode, rulesetItem, _) => - { - RulesetItem attackModeRulesetItem = null; - - if (mode?.SourceObject is RulesetItem rulesetItem1) { - attackModeRulesetItem = rulesetItem1; - } + RulesetItem attackModeRulesetItem = null; + + if (mode?.SourceObject is RulesetItem rulesetItem1) + { + attackModeRulesetItem = rulesetItem1; + } - var item = attackModeRulesetItem ?? rulesetItem; + var item = attackModeRulesetItem ?? rulesetItem; - return ValidatorsWeapon.IsMelee(item) && - !ValidatorsWeapon.HasAnyWeaponTag(item, TagsDefinitions.WeaponTagHeavy); - }, Name)) + return ValidatorsWeapon.IsMelee(item) && + !ValidatorsWeapon.HasAnyWeaponTag(item?.ItemDefinition, TagsDefinitions.WeaponTagHeavy); + }, + Name)) .AddToDB()) .AddToDB(); diff --git a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs index 5cec6ff0ad..afc7127461 100644 --- a/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs +++ b/SolastaUnfinishedBusiness/Validators/ValidatorsCharacter.cs @@ -70,7 +70,8 @@ internal static class ValidatorsCharacter internal static readonly IsCharacterValidHandler HasFreeHandWithoutTwoHandedInMain = character => character.HasFreeHandSlot() && - !ValidatorsWeapon.HasAnyWeaponTag(character.GetMainWeapon(), TagsDefinitions.WeaponTagTwoHanded); + !ValidatorsWeapon.HasAnyWeaponTag( + character.GetMainWeapon()?.ItemDefinition, TagsDefinitions.WeaponTagTwoHanded); internal static readonly IsCharacterValidHandler HasFreeHand = character => character.HasFreeHandSlot() || @@ -88,6 +89,7 @@ internal static class ValidatorsCharacter internal static readonly IsCharacterValidHandler HasMeleeWeaponInMainHand = character => { var weapon = character.GetMainWeapon(); + return ValidatorsWeapon.IsMelee(weapon) || (weapon == null && InnovationArmor.InGuardianMode(character)); }; @@ -103,7 +105,7 @@ internal static class ValidatorsCharacter HasMeleeWeaponInMainHand(character) && HasMeleeWeaponInOffHand(character); private static readonly IsCharacterValidHandler IsUnarmedInMainHand = character => - ValidatorsWeapon.IsUnarmed(character.GetMainWeapon()?.ItemDefinition, null); + ValidatorsWeapon.IsUnarmed(character.GetMainWeapon()?.ItemDefinition); internal static readonly IsCharacterValidHandler IsNotInBrightLight = character => HasAnyOfLightingStates( @@ -217,15 +219,20 @@ internal static bool IsMonkWeapon(this RulesetActor character, WeaponDescription { var monkWeaponSpecializations = character.GetSubFeaturesByType(); - return weaponDescription == null || weaponDescription.IsMonkWeaponOrUnarmed() || + return weaponDescription == null || + weaponDescription.IsMonkWeaponOrUnarmed() || monkWeaponSpecializations.Exists(x => x.WeaponType == weaponDescription.WeaponTypeDefinition); } [MethodImpl(MethodImplOptions.AggressiveInlining)] internal static bool IsMonkWeapon(this RulesetCharacter character, ItemDefinition itemDefinition) { - return itemDefinition && itemDefinition.IsWeapon && - character.IsMonkWeapon(itemDefinition.WeaponDescription); + if (!itemDefinition) + { + return false; + } + + return itemDefinition.IsWeapon && character.IsMonkWeapon(itemDefinition.WeaponDescription); } [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -233,7 +240,7 @@ internal static bool IsFreeOffhandVanilla(RulesetCharacter character) { var offHand = character.GetOffhandWeapon(); - // does character has free offhand in TA's terms as used in RefreshAttackModes for Monk bonus unarmed attack? + // does character have free offhand in TA's terms as used in RefreshAttackModes for Monk bonus unarmed attack? return offHand == null || !offHand.ItemDefinition.IsWeapon; } @@ -260,8 +267,8 @@ private static bool HasArmorCategory(RulesetCharacter character, string category return false; } - var equipedItem = character.CharacterInventory.InventorySlotsByName[EquipmentDefinitions.SlotTypeTorso] - .EquipedItem; + var equipedItem = + character.CharacterInventory.InventorySlotsByName[EquipmentDefinitions.SlotTypeTorso].EquipedItem; if (equipedItem == null || !equipedItem.ItemDefinition.IsArmor) { @@ -271,7 +278,7 @@ private static bool HasArmorCategory(RulesetCharacter character, string category var armorDescription = equipedItem.ItemDefinition.ArmorDescription; var element = DatabaseHelper.GetDefinition(armorDescription.ArmorType); - return DatabaseHelper.GetDefinition(element.ArmorCategory) - .IsPhysicalArmor && element.ArmorCategory == category; + return DatabaseHelper.GetDefinition(element.ArmorCategory).IsPhysicalArmor && + element.ArmorCategory == category; } } diff --git a/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs b/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs index 3f619a0f8d..5f9fac9cfc 100644 --- a/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs +++ b/SolastaUnfinishedBusiness/Validators/ValidatorsWeapon.cs @@ -158,7 +158,9 @@ internal static bool IsPolearmType([CanBeNull] RulesetAttackMode attackMode) } [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsUnarmed([CanBeNull] ItemDefinition itemDefinition, [CanBeNull] RulesetAttackMode attackMode) + internal static bool IsUnarmed( + [CanBeNull] ItemDefinition itemDefinition, + [CanBeNull] RulesetAttackMode attackMode = null) { if (attackMode is { SourceDefinition: MonsterAttackDefinition { proximity: AttackProximity.Melee } }) { @@ -192,10 +194,4 @@ internal static bool HasAnyWeaponTag([CanBeNull] ItemDefinition itemDefinition, && itemDefinition.WeaponDescription != null && tags.Any(t => itemDefinition.WeaponDescription.WeaponTags.Contains(t)); } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool HasAnyWeaponTag([CanBeNull] RulesetItem rulesetItem, [NotNull] params string[] tags) - { - return rulesetItem != null && HasAnyWeaponTag(rulesetItem.ItemDefinition, tags); - } } From 18d093aec884d24c88db780f34de8fe49c4bc0ea Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 20:14:14 -0700 Subject: [PATCH 161/162] change Stop power to use MyExecuteActionPowerNoCost --- .../CustomUI/StopPowerConcentrationProvider.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/SolastaUnfinishedBusiness/CustomUI/StopPowerConcentrationProvider.cs b/SolastaUnfinishedBusiness/CustomUI/StopPowerConcentrationProvider.cs index 35fe1292e1..2e353ff9ec 100644 --- a/SolastaUnfinishedBusiness/CustomUI/StopPowerConcentrationProvider.cs +++ b/SolastaUnfinishedBusiness/CustomUI/StopPowerConcentrationProvider.cs @@ -27,16 +27,13 @@ public void Stop(RulesetCharacter character) } var locationCharacter = GameLocationCharacter.GetFromActor(character); + var usablePower = PowerProvider.Get(StopPower, character); - if (locationCharacter == null) - { - return; - } - +#if false var implementationManager = ServiceRepository.GetService() as RulesetImplementationManager; - var usablePower = PowerProvider.Get(StopPower, character); + var actionParams = new CharacterActionParams(locationCharacter, ActionDefinitions.Id.PowerNoCost) { ActionModifiers = { new ActionModifier() }, @@ -48,5 +45,8 @@ public void Stop(RulesetCharacter character) ServiceRepository.GetService()? .ExecuteAction(actionParams, _ => { }, false); +#endif + + locationCharacter.MyExecuteActionPowerNoCost(usablePower, [locationCharacter]); } } From 2aeac513de6c61204f67ddb6aa0557e62b75445e Mon Sep 17 00:00:00 2001 From: ThyWolf Date: Sat, 10 Aug 2024 20:40:27 -0700 Subject: [PATCH 162/162] prepare for `1.5.97.26` release --- .../ChangelogHistory.txt | 20 +++++++++---------- SolastaUnfinishedBusiness/Info.json | 2 +- .../SolastaUnfinishedBusiness.csproj | 2 +- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SolastaUnfinishedBusiness/ChangelogHistory.txt b/SolastaUnfinishedBusiness/ChangelogHistory.txt index 0950e2e753..800948dc21 100644 --- a/SolastaUnfinishedBusiness/ChangelogHistory.txt +++ b/SolastaUnfinishedBusiness/ChangelogHistory.txt @@ -4,17 +4,17 @@ - fixed Bait and Switch maneuver greyed out on action bar - fixed Bountiful Luck feat triggering on any failure regardless the dice roll - fixed Cleric domains missing divine intervention improvement at 20 -- fixed College of Swords flourish description +- fixed College of Swords flourish description stating melee attack instead of weapon attack - fixed Corrupting Bolt spell removing corrupted condition too soon -- fixed Innovation Vitriolist vitriolic infusion infinite damage -- fixed Martial Guardian not getting the Sentinel feat -- fixed Path of the Wild Magic retribution on self, and spirit blast soft lock -- fixed Sunlit Blade cantrip highlighted condition duration -- fixed Toll the Dead and Wrack cantrips description -- fixed Variant Spell Points consumption on slots above 5 -- improved Bladestorm feat with an additional 1D4 BA attack, and mod damage on whirlwind attack -- improved Chaos Bolt tooltip to present damage symbols, and correct 1D6 damage progression -- improved Time Stop spell to behave as in tabletop, and grant 1d4+1 additional turns [combat only] +- fixed Innovation Vitriolist vitriolic infusion dealing infinite damage +- fixed Martial Guardian not getting the Sentinel feat at 3rd +- fixed Path of the Wild Magic retribution on self, and spirit blast soft locking the game +- fixed Sunlit Blade cantrip removing highlighted condition too soon +- fixed Toll the Dead and Wrack cantrips description stating 1d8 instead of 1d6 damage +- fixed Variant Spell Points consumption removing all usages from 6 to 9 at once if any used +- improved Bladestorm feat with an additional 1d4 BA attack, and mod damage on whirlwind attack +- improved Chaos Bolt spell tooltip to present damage symbols, and correct 1d6 damage progression +- improved Time Stop spell to behave as in tabletop, and grant 1d4+1 additional turns during combat KNOWN ISSUES: diff --git a/SolastaUnfinishedBusiness/Info.json b/SolastaUnfinishedBusiness/Info.json index c7a3bd8074..926b77517b 100644 --- a/SolastaUnfinishedBusiness/Info.json +++ b/SolastaUnfinishedBusiness/Info.json @@ -1,7 +1,7 @@ { "Id": "SolastaUnfinishedBusiness", "DisplayName": "[Un] Finished Business", - "Version": "1.5.97.25", + "Version": "1.5.97.26", "GameVersion": "1.5.97", "ManagerVersion": "0.24.0", "AssemblyName": "SolastaUnfinishedBusiness.dll", diff --git a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj index b908a9626e..4dc5b0eb82 100644 --- a/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj +++ b/SolastaUnfinishedBusiness/SolastaUnfinishedBusiness.csproj @@ -3,7 +3,7 @@ 12 net48 - 1.5.97.25 + 1.5.97.26 https://github.com/SolastaMods/SolastaUnfinishedBusiness git Debug Install;Release Install