From 1fb2b528a820f11b78885890eb99f1488de7d72d Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Thu, 18 Apr 2024 01:15:52 -0400 Subject: [PATCH 1/6] refactor: change to use new msu affordability preview system --- .../skills/actives/rf_en_garde_toggle_skill.nut | 4 ++-- .../skills/perks/perk_rf_fresh_and_furious.nut | 17 +++++++++++------ 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/scripts/skills/actives/rf_en_garde_toggle_skill.nut b/scripts/skills/actives/rf_en_garde_toggle_skill.nut index af0d0beb3..925729c71 100644 --- a/scripts/skills/actives/rf_en_garde_toggle_skill.nut +++ b/scripts/skills/actives/rf_en_garde_toggle_skill.nut @@ -144,9 +144,9 @@ this.rf_en_garde_toggle_skill <- ::inherit("scripts/skills/skill", { } } - function onAffordablePreview( _skill, _movementTile ) + function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) { - this.modifyPreviewField(this, "FatigueCost", 15, false); + this.m.FatigueCost = 15; } function onUse( _user, _targetTile ) diff --git a/scripts/skills/perks/perk_rf_fresh_and_furious.nut b/scripts/skills/perks/perk_rf_fresh_and_furious.nut index b927d596d..a35c9135e 100644 --- a/scripts/skills/perks/perk_rf_fresh_and_furious.nut +++ b/scripts/skills/perks/perk_rf_fresh_and_furious.nut @@ -71,20 +71,25 @@ this.perk_rf_fresh_and_furious <- ::inherit("scripts/skills/skill", { { foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) { - // ::Math.round to round up the subtraction because we want to emulate the behavior of _properties.IsSkillUseHalfCost - // whereby it rounds down the cost (due to integer division) after halving it. - skill.m.ActionPointCost -= ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, ::Math.round(skill.m.ActionPointCost / 2.0))); + skill.m.ActionPointCost = ::Math.max(1, skill.m.ActionPointCost / 2); } } } - function onAffordablePreview( _skill, _movementTile ) + function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) { - if (_skill != null && _skill.getActionPointCost() != 0 && _skill.getFatigueCost() != 0) + if (this.m.IsSpent || this.m.RequiresRecover) + return; + + // Use comparison of PreviewActionPoints vs ActionPoints and PreviewFatigue vs Fatigue to check if _previewedSkill is free to use + // We cannot use _previewedSkill.getActionPointCost() because we are in an update loop and there + // may be changes to the actor after this skill which may cause that function to return different value later + local actor = this.getContainer().getActor(); + if (_previewedMovement != null || (actor.getPreviewActionPoints() == actor.getActionPoints() && actor.getPreviewFatigue() == actor.getFatigue())) { foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) { - this.modifyPreviewField(skill, "ActionPointCost", 0, false); + skill.m.ActionPointCost = ::Math.max(1, skill.m.ActionPointCost / 2); } } } From 68a8c982f60481690709f337b02cf15d0e71d571 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Thu, 18 Apr 2024 20:34:39 -0400 Subject: [PATCH 2/6] refactor: use getActionPointCost and getFatigueCost Instead of comparing preview values. I realized that it is ok to use these functions because they are based on CurrentProperties and we don't mess with that during update functions. --- scripts/skills/perks/perk_rf_fresh_and_furious.nut | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/scripts/skills/perks/perk_rf_fresh_and_furious.nut b/scripts/skills/perks/perk_rf_fresh_and_furious.nut index a35c9135e..9120d24d7 100644 --- a/scripts/skills/perks/perk_rf_fresh_and_furious.nut +++ b/scripts/skills/perks/perk_rf_fresh_and_furious.nut @@ -81,11 +81,7 @@ this.perk_rf_fresh_and_furious <- ::inherit("scripts/skills/skill", { if (this.m.IsSpent || this.m.RequiresRecover) return; - // Use comparison of PreviewActionPoints vs ActionPoints and PreviewFatigue vs Fatigue to check if _previewedSkill is free to use - // We cannot use _previewedSkill.getActionPointCost() because we are in an update loop and there - // may be changes to the actor after this skill which may cause that function to return different value later - local actor = this.getContainer().getActor(); - if (_previewedMovement != null || (actor.getPreviewActionPoints() == actor.getActionPoints() && actor.getPreviewFatigue() == actor.getFatigue())) + if (_previewedMovement != null || (_previewedSkill.getActionPointCost() == 0 && _previewedSkill.getFatigueCost() == 0)) { foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) { From 85789cad3285526fb50e6a26b8f20854df361ab4 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Thu, 9 May 2024 23:28:12 -0400 Subject: [PATCH 3/6] refactor: change to new msu affordability system --- .../actives/rf_en_garde_toggle_skill.nut | 5 ++- scripts/skills/perks/perk_rf_combo.nut | 25 ++----------- .../perks/perk_rf_fresh_and_furious.nut | 17 ++------- scripts/skills/perks/perk_rf_momentum.nut | 37 ++++++------------- scripts/skills/perks/perk_rf_vanquisher.nut | 17 +++------ .../skills/perks/perk_rf_vigorous_assault.nut | 32 +++------------- 6 files changed, 33 insertions(+), 100 deletions(-) diff --git a/scripts/skills/actives/rf_en_garde_toggle_skill.nut b/scripts/skills/actives/rf_en_garde_toggle_skill.nut index 925729c71..21171e7da 100644 --- a/scripts/skills/actives/rf_en_garde_toggle_skill.nut +++ b/scripts/skills/actives/rf_en_garde_toggle_skill.nut @@ -144,9 +144,10 @@ this.rf_en_garde_toggle_skill <- ::inherit("scripts/skills/skill", { } } - function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) + function onAfterUpdate( _properties ) { - this.m.FatigueCost = 15; + if (this.getContainer().getActor().isPreviewing()) + this.m.FatigueCost = 15; } function onUse( _user, _targetTile ) diff --git a/scripts/skills/perks/perk_rf_combo.nut b/scripts/skills/perks/perk_rf_combo.nut index 169fffaf1..2113f44b0 100644 --- a/scripts/skills/perks/perk_rf_combo.nut +++ b/scripts/skills/perks/perk_rf_combo.nut @@ -50,28 +50,11 @@ this.perk_rf_combo <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { - if (this.m.UsedSkillID == "") - return; - - foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) - { - if (skill.getID() != this.m.UsedSkillID && skill.m.ActionPointCost > 3) - { - skill.m.ActionPointCost -= 1; - } - } - } - - function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) - { - local usedSkillID = ""; - if (_previewedMovement != null) - { - usedSkillID = this.m.UsedSkillID; - } - else if (_previewedSkill.getActionPointCost() != 0) + local actor = this.getContainer().getActor(); + local usedSkillID = this.m.UsedSkillID; + if (actor.isPreviewing() && actor.getPreviewSkill() != null) { - usedSkillID = _previewedSkill.getID(); + usedSkillID = actor.getPreviewSkill().getID(); } if (usedSkillID != "") diff --git a/scripts/skills/perks/perk_rf_fresh_and_furious.nut b/scripts/skills/perks/perk_rf_fresh_and_furious.nut index 9120d24d7..38991cd96 100644 --- a/scripts/skills/perks/perk_rf_fresh_and_furious.nut +++ b/scripts/skills/perks/perk_rf_fresh_and_furious.nut @@ -66,26 +66,17 @@ this.perk_rf_fresh_and_furious <- ::inherit("scripts/skills/skill", { } function onAfterUpdate( _properties ) - { - if (!this.m.IsSpent && !this.m.RequiresRecover) - { - foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) - { - skill.m.ActionPointCost = ::Math.max(1, skill.m.ActionPointCost / 2); - } - } - } - - function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) { if (this.m.IsSpent || this.m.RequiresRecover) return; - if (_previewedMovement != null || (_previewedSkill.getActionPointCost() == 0 && _previewedSkill.getFatigueCost() == 0)) + local actor = this.getContainer().getActor(); + if (!actor.isPreviewing() || actor.getPreviewMovement() != null || (actor.getPreviewSkill().getActionPointCost() == 0 && actor.getPreviewSkill().getFatigueCost() == 0)) { foreach (skill in this.getContainer().getAllSkillsOfType(::Const.SkillType.Active)) { - skill.m.ActionPointCost = ::Math.max(1, skill.m.ActionPointCost / 2); + if (skill.m.ActionPointCost > 1) + skill.m.ActionPointCost /= 2; } } } diff --git a/scripts/skills/perks/perk_rf_momentum.nut b/scripts/skills/perks/perk_rf_momentum.nut index ecf3c11c1..be5e70d59 100644 --- a/scripts/skills/perks/perk_rf_momentum.nut +++ b/scripts/skills/perks/perk_rf_momentum.nut @@ -76,41 +76,26 @@ this.perk_rf_momentum <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { - if (this.isEnabled() && this.m.TilesMovedThisTurn > 0) - { - foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) - { - if (skill.isAttack() && skill.isRanged()) - { - skill.m.ActionPointCost -= ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, this.m.TilesMovedThisTurn)); - } - } - } - } + if (!this.isEnabled()) + return; - function onAffordablePreview( _skill, _movementTile ) - { - if (!this.isEnabled()) return; - - if (_skill != null) + local actor = this.getContainer().getActor(); + local tilesMoved = this.m.TilesMovedThisTurn; + if (actor.isPreviewing()) { - foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) - { - if (skill.isAttack() && skill.isRanged()) - { - this.modifyPreviewField(skill, "ActionPointCost", 0, false); - } - } + if (actor.getPreviewSkill() != null) + return; + + tilesMoved += actor.getPreviewMovement().End.getDistanceTo(actor.getTile()); } - if (_movementTile != null) + if (tilesMoved > 0) { - local bonus = this.m.TilesMovedThisTurn + _movementTile.getDistanceTo(this.getContainer().getActor().getTile()); foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) { if (skill.isAttack() && skill.isRanged()) { - this.modifyPreviewField(skill, "ActionPointCost", ::Math.min(skill.m.ActionPointCost - 1, bonus) * -1, false); + skill.m.ActionPointCost -= ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, this.m.TilesMovedThisTurn)); } } } diff --git a/scripts/skills/perks/perk_rf_vanquisher.nut b/scripts/skills/perks/perk_rf_vanquisher.nut index a3c2f4e73..52da2f387 100644 --- a/scripts/skills/perks/perk_rf_vanquisher.nut +++ b/scripts/skills/perks/perk_rf_vanquisher.nut @@ -66,20 +66,15 @@ this.perk_rf_vanquisher <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { - if (this.m.IsInEffect) + local actor = this.getContainer().getActor(); + local isValid = this.m.IsInEffect; + if (actor.isPreviewing()) { - foreach (skill in this.getContainer().m.Skills) - { - if (!skill.isGarbage() && skill.m.ActionPointCost > 1) - skill.m.ActionPointCost /= 2; - } + // Gain Ground can only be used on a valid tile + isValid = (actor.getPreviewMovement() != null && !this.isTileValid(actor.getPreviewMovement().End)) || (actor.getPreviewSkill() != null && actor.getPreviewSkill().getID() != "actives.rf_gain_ground"); } - } - function onAfterUpdatePreview( _properties, _previewedSkill, _previewedMovement ) - { - // Gain Ground can only be used on a valid tile - if ((_previewedSkill != null && _previewedSkill.getID() == "actives.rf_gain_ground") || (_previewedMovement != null && this.isTileValid(_previewedMovement.End))) + if (isValid) { foreach (skill in this.getContainer().m.Skills) { diff --git a/scripts/skills/perks/perk_rf_vigorous_assault.nut b/scripts/skills/perks/perk_rf_vigorous_assault.nut index b72510faa..8cb714e0c 100644 --- a/scripts/skills/perks/perk_rf_vigorous_assault.nut +++ b/scripts/skills/perks/perk_rf_vigorous_assault.nut @@ -100,6 +100,10 @@ this.perk_rf_vigorous_assault <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { + local actor = this.getContainer().getActor(); + if (actor.isPreviewing() && actor.getPreviewSkill() != null) + return; + this.resetBonus(); if (!this.isEnabled() || !::Tactical.TurnSequenceBar.isActiveEntity(this.getContainer().getActor())) @@ -107,8 +111,7 @@ this.perk_rf_vigorous_assault <- ::inherit("scripts/skills/skill", { return; } - local actor = this.getContainer().getActor(); - local distanceMoved = this.m.StartingTile.getDistanceTo(actor.getTile()); + local distanceMoved = this.m.StartingTile.getDistanceTo(actor.isPreviewing() ? actor.getPreviewMovement().End : actor.getTile()); local aoo = this.getContainer().getAttackOfOpportunity(); local mult = distanceMoved / this.m.BonusEveryXTiles; @@ -169,31 +172,6 @@ this.perk_rf_vigorous_assault <- ::inherit("scripts/skills/skill", { } } - function onAffordablePreview( _skill, _movementTile ) - { - if (!this.isEnabled()) return; - - if (_skill != null) - { - foreach (skill in this.getContainer().getSkillsByFunction(@(skill) skill.isAttack())) - { - this.modifyPreviewField(skill, "ActionPointCost", 0, false); - this.modifyPreviewField(skill, "FatigueCostMult", 1, true); - } - } - - if (_movementTile != null) - { - local bonus = this.m.StartingTile.getDistanceTo(_movementTile) / this.m.BonusEveryXTiles; - - foreach (skill in this.getContainer().getSkillsByFunction(@(skill) skill.isAttack())) - { - this.modifyPreviewField(skill, "ActionPointCost", -1 * ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, bonus)), false); - this.modifyPreviewField(skill, "FatigueCostMult", 1 - this.m.FatCostReduction * bonus * 0.01, true); - } - } - } - function onWaitTurn() { this.m.StartingTile = null; From 737b9f10aa496fc8eadb27a223b6f1d86ee1341b Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Mon, 13 May 2024 19:00:44 -0400 Subject: [PATCH 4/6] refactor: add comment and use member variable for fatigue cost --- scripts/skills/actives/rf_en_garde_toggle_skill.nut | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/skills/actives/rf_en_garde_toggle_skill.nut b/scripts/skills/actives/rf_en_garde_toggle_skill.nut index 21171e7da..463b971b3 100644 --- a/scripts/skills/actives/rf_en_garde_toggle_skill.nut +++ b/scripts/skills/actives/rf_en_garde_toggle_skill.nut @@ -146,8 +146,10 @@ this.rf_en_garde_toggle_skill <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { + // During preview set the fatigue cost so that the player knows if their previewed action + // will still allow en garde to trigger afterward if (this.getContainer().getActor().isPreviewing()) - this.m.FatigueCost = 15; + this.m.FatigueCost = this.m.FatigueRequired; } function onUse( _user, _targetTile ) From e8a027e89597f9317691189b45f715c8fc2bf5e9 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Mon, 13 May 2024 19:01:49 -0400 Subject: [PATCH 5/6] docs: add comment about why we return early with previewed skill --- scripts/skills/perks/perk_rf_vigorous_assault.nut | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/skills/perks/perk_rf_vigorous_assault.nut b/scripts/skills/perks/perk_rf_vigorous_assault.nut index 8cb714e0c..fa8cf6cba 100644 --- a/scripts/skills/perks/perk_rf_vigorous_assault.nut +++ b/scripts/skills/perks/perk_rf_vigorous_assault.nut @@ -101,7 +101,7 @@ this.perk_rf_vigorous_assault <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { local actor = this.getContainer().getActor(); - if (actor.isPreviewing() && actor.getPreviewSkill() != null) + if (actor.isPreviewing() && actor.getPreviewSkill() != null) // The effect of this skill expires upon using any skill, so we reflect that in the preview return; this.resetBonus(); From 4389932feb4737bc85ed941ea7ee77bddd0172ac Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Mon, 13 May 2024 19:07:04 -0400 Subject: [PATCH 6/6] refactor: revert the changes to momentum --- scripts/skills/perks/perk_rf_momentum.nut | 37 ++++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/scripts/skills/perks/perk_rf_momentum.nut b/scripts/skills/perks/perk_rf_momentum.nut index be5e70d59..ecf3c11c1 100644 --- a/scripts/skills/perks/perk_rf_momentum.nut +++ b/scripts/skills/perks/perk_rf_momentum.nut @@ -76,26 +76,41 @@ this.perk_rf_momentum <- ::inherit("scripts/skills/skill", { function onAfterUpdate( _properties ) { - if (!this.isEnabled()) - return; - - local actor = this.getContainer().getActor(); - local tilesMoved = this.m.TilesMovedThisTurn; - if (actor.isPreviewing()) + if (this.isEnabled() && this.m.TilesMovedThisTurn > 0) { - if (actor.getPreviewSkill() != null) - return; + foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) + { + if (skill.isAttack() && skill.isRanged()) + { + skill.m.ActionPointCost -= ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, this.m.TilesMovedThisTurn)); + } + } + } + } - tilesMoved += actor.getPreviewMovement().End.getDistanceTo(actor.getTile()); + function onAffordablePreview( _skill, _movementTile ) + { + if (!this.isEnabled()) return; + + if (_skill != null) + { + foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) + { + if (skill.isAttack() && skill.isRanged()) + { + this.modifyPreviewField(skill, "ActionPointCost", 0, false); + } + } } - if (tilesMoved > 0) + if (_movementTile != null) { + local bonus = this.m.TilesMovedThisTurn + _movementTile.getDistanceTo(this.getContainer().getActor().getTile()); foreach (skill in this.getContainer().getActor().getMainhandItem().getSkills()) { if (skill.isAttack() && skill.isRanged()) { - skill.m.ActionPointCost -= ::Math.max(0, ::Math.min(skill.m.ActionPointCost - 1, this.m.TilesMovedThisTurn)); + this.modifyPreviewField(skill, "ActionPointCost", ::Math.min(skill.m.ActionPointCost - 1, bonus) * -1, false); } } }