From abea8d48679e2ceac4e35cae7a5afffb57b6b901 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Sun, 14 Apr 2024 01:54:26 -0400 Subject: [PATCH 1/9] refactor: deprecate the scheduled changes system for skills --- msu/hooks/skills/skill.nut | 4 +++- msu/hooks/skills/skill_container.nut | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/msu/hooks/skills/skill.nut b/msu/hooks/skills/skill.nut index 9f0cbe013..f3a285d7d 100644 --- a/msu/hooks/skills/skill.nut +++ b/msu/hooks/skills/skill.nut @@ -60,7 +60,7 @@ q.m.ItemActionOrder <- ::Const.ItemActionOrder.Any; q.m.IsBaseValuesSaved <- false; - q.m.ScheduledChanges <- []; + q.m.ScheduledChanges <- []; // Deprecated q.m.IsApplyingPreview <- false; q.m.PreviewField <- {}; @@ -93,12 +93,14 @@ else throw ::MSU.Exception.KeyNotFound(_t); } + // Deprecated q.scheduleChange <- function( _field, _change, _set = false ) { this.m.ScheduledChanges.push({Field = _field, Change = _change, Set = _set}); this.getContainer().m.ScheduledChangesSkills.push(this); } + // Deprecated q.executeScheduledChanges <- function() { if (this.m.ScheduledChanges.len() == 0) diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index 138dba667..c8497757a 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -1,5 +1,5 @@ ::MSU.MH.hook("scripts/skills/skill_container", function(q) { - q.m.ScheduledChangesSkills <- []; + q.m.ScheduledChangesSkills <- []; // Deprecated q.m.IsPreviewing <- false; q.m.PreviewProperty <- {}; @@ -17,12 +17,13 @@ __original(); + // Deprecated foreach (skill in this.m.ScheduledChangesSkills) { if (!skill.isGarbage()) skill.executeScheduledChanges(); } - this.m.ScheduledChangesSkills.clear(); + this.m.ScheduledChangesSkills.clear(); // Deprecated } q.callSkillsFunction <- function( _function, _argsArray = null, _update = true, _aliveOnly = false ) @@ -286,7 +287,7 @@ getChange("onUpdate"); getChange("onAfterUpdate"); - getChange("executeScheduledChanges"); + getChange("executeScheduledChanges"); // Deprecated foreach (changes in ::MSU.Skills.QueuedPreviewChanges) { From 7edcde457cf1c3886ce22d47532b6b88cf96351e Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Wed, 17 Apr 2024 23:45:50 -0400 Subject: [PATCH 2/9] feat: add an intuitive and flexible preview modification system This allows directly modifying fields/properties inside the new functions onUpdatePreview and onAfterUpdatePreview just like one would do inside the onUpdate and onAfterUpdate functions. --- msu/hooks/entity/tactical/actor.nut | 7 ++++ msu/hooks/skills/skill.nut | 12 ++++++ msu/hooks/skills/skill_container.nut | 38 +++++++++++++++++++ .../turn_sequence_bar/turn_sequence_bar.nut | 23 ++++++++--- 4 files changed, 75 insertions(+), 5 deletions(-) diff --git a/msu/hooks/entity/tactical/actor.nut b/msu/hooks/entity/tactical/actor.nut index a8412adb9..e13c93707 100644 --- a/msu/hooks/entity/tactical/actor.nut +++ b/msu/hooks/entity/tactical/actor.nut @@ -1,4 +1,11 @@ ::MSU.MH.hook("scripts/entity/tactical/actor", function(q) { + q.setActionPoints = @() function( _a ) + { + this.m.ActionPoints = ::Math.round(_a); + if (!this.getSkills().m.IsPreviewing) + this.setPreviewActionPoints(_a); + } + q.onMovementStart = @(__original) function ( _tile, _numTiles ) { __original(_tile, _numTiles); diff --git a/msu/hooks/skills/skill.nut b/msu/hooks/skills/skill.nut index f3a285d7d..2757dc4b6 100644 --- a/msu/hooks/skills/skill.nut +++ b/msu/hooks/skills/skill.nut @@ -337,6 +337,16 @@ { } + q.onUpdatePreview <- function( _properties, _previewedSkill, _previewedMovement ) + { + this.onUpdate(_properties); + } + + q.onAfterUpdatePreview <- function( _properties, _previewedSkill, _previewedMovement ) + { + this.onAfterUpdate(_properties); + } + q.onAffordablePreview <- function( _skill, _movementTile ) { } @@ -564,9 +574,11 @@ local preview = ::Tactical.TurnSequenceBar.m.ActiveEntityCostsPreview; if (preview != null && preview.id == this.getContainer().getActor().getID()) { + this.getContainer().updatePreview(::Tactical.TurnSequenceBar.m.MSU_PreviewSkill, ::Tactical.TurnSequenceBar.m.MSU_PreviewMovement); this.m.IsApplyingPreview = true; local ret = __original(); this.m.IsApplyingPreview = false; + this.getContainer().update(); local skillID = this.getContainer().getActor().getPreviewSkillID(); local str = " after " + (skillID == "" ? "moving" : "using " + this.getContainer().getSkillByID(skillID).getName()); ret = ::MSU.String.replace(ret, "Fatigue[/color]", "Fatigue[/color]" + str); diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index c8497757a..fe2e8322a 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -326,6 +326,44 @@ ::MSU.Skills.QueuedPreviewChanges.clear(); } + q.updatePreview <- function( _previewedSkill, _previewedMovement ) + { + if (this.m.IsUpdating || !this.m.Actor.isAlive()) + return; + + foreach (skill in this.m.Skills) + { + if (!skill.isGarbage()) + skill.softReset(); + } + + local properties = this.m.Actor.getBaseProperties().getClone(); + + this.m.IsUpdating = true; + + foreach (skill in this.m.Skills) + { + if (!skill.isGarbage()) + skill.onUpdatePreview(properties, _previewedSkill, _previewedMovement); + } + + foreach (skill in this.m.Skills) + { + if (!skill.isGarbage()) + skill.onAfterUpdatePreview(properties, _previewedSkill, _previewedMovement); + } + + // Deprecated + foreach (skill in this.m.ScheduledChangesSkills) + { + skill.executeScheduledChanges(); + } + + this.m.IsUpdating = false; + + this.m.Actor.setCurrentProperties(properties); + } + //Vanilla Overwrites start q.onAfterDamageReceived = @() function() diff --git a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut index aa38e2558..2297e6295 100644 --- a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut +++ b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut @@ -1,4 +1,7 @@ ::MSU.MH.hook("scripts/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar", function(q) { + q.m.MSU_PreviewSkill <- null; + q.m.MSU_PreviewMovement <- null; + q.create = @(__original) function() { __original(); @@ -39,16 +42,18 @@ { local skillID = "SkillID" in _costsPreview ? _costsPreview.SkillID : ""; local skill; - local movementTile; + local movement; if (skillID == "") { - local movement = ::Tactical.getNavigator().getCostForPath(activeEntity, ::Tactical.getNavigator().getLastSettings(), activeEntity.getActionPoints(), activeEntity.getFatigueMax() - activeEntity.getFatigue()); - movementTile = movement.End; + movement = ::Tactical.getNavigator().getCostForPath(activeEntity, ::Tactical.getNavigator().getLastSettings(), activeEntity.getActionPoints(), activeEntity.getFatigueMax() - activeEntity.getFatigue()); } else skill = activeEntity.getSkills().getSkillByID(skillID); activeEntity.getSkills().m.IsPreviewing = true; - activeEntity.getSkills().onAffordablePreview(skill, movementTile); + this.m.MSU_PreviewSkill = skill; + this.m.MSU_PreviewMovement = movement; + activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); + activeEntity.getSkills().updatePreview(skill, movement); } } @@ -57,12 +62,20 @@ __original(_costsPreview); this.m.JSHandle = this.m.MSU_JSHandle.__JSHandle; this.m.JSHandle.asyncCall("updateCostsPreview", this.m.ActiveEntityCostsPreview); + local activeEntity = this.getActiveEntity(); + if (activeEntity != null) + activeEntity.getSkills().update(); } q.resetActiveEntityCostsPreview = @(__original) function() { local activeEntity = this.getActiveEntity(); - if (activeEntity != null) activeEntity.getSkills().m.IsPreviewing = false; + if (activeEntity != null) + { + activeEntity.getSkills().m.IsPreviewing = false; + this.m.MSU_PreviewSkill = null; + this.m.MSU_PreviewMovement = null; + } __original(); } }); From a57525e62053e5442948c88f486a3def9a499a89 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:05:48 -0400 Subject: [PATCH 3/9] refactor: deprecate the onAffordablePreview system --- msu/hooks/skills/skill.nut | 9 +++++++-- msu/hooks/skills/skill_container.nut | 3 ++- .../modules/turn_sequence_bar/turn_sequence_bar.nut | 2 +- msu/utils/skills.nut | 6 ++++-- 4 files changed, 14 insertions(+), 6 deletions(-) diff --git a/msu/hooks/skills/skill.nut b/msu/hooks/skills/skill.nut index 2757dc4b6..236a93e3a 100644 --- a/msu/hooks/skills/skill.nut +++ b/msu/hooks/skills/skill.nut @@ -62,8 +62,8 @@ q.m.IsBaseValuesSaved <- false; q.m.ScheduledChanges <- []; // Deprecated - q.m.IsApplyingPreview <- false; - q.m.PreviewField <- {}; + q.m.IsApplyingPreview <- false; // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system + q.m.PreviewField <- {}; // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.isType = @() function( _t, _any = true, _only = false ) { @@ -347,15 +347,18 @@ this.onAfterUpdate(_properties); } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.onAffordablePreview <- function( _skill, _movementTile ) { } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.modifyPreviewField <- function( _skill, _field, _newChange, _multiplicative ) { ::MSU.Skills.modifyPreview(this, _skill, _field, _newChange, _multiplicative); } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.modifyPreviewProperty <- function( _skill, _field, _newChange, _multiplicative ) { ::MSU.Skills.modifyPreview(this, null, _field, _newChange, _multiplicative); @@ -498,6 +501,7 @@ ::MSU.QueueBucket.VeryLate.push(function() { ::MSU.MH.hook("scripts/skills/skill", function(q) { + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system foreach (func in ::MSU.Skills.PreviewApplicableFunctions) { q[func] = @(__original) function() @@ -559,6 +563,7 @@ } } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.isAffordablePreview = @(__original) function() { if (!this.getContainer().m.IsPreviewing) return __original(); diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index fe2e8322a..949f39d9e 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -1,7 +1,7 @@ ::MSU.MH.hook("scripts/skills/skill_container", function(q) { q.m.ScheduledChangesSkills <- []; // Deprecated q.m.IsPreviewing <- false; - q.m.PreviewProperty <- {}; + q.m.PreviewProperty <- {}; // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.update = @(__original) function() { @@ -221,6 +221,7 @@ ]); } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system q.onAffordablePreview <- function( _skill, _movementTile ) { this.m.PreviewProperty.clear(); diff --git a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut index 2297e6295..abc77ac84 100644 --- a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut +++ b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut @@ -52,7 +52,7 @@ activeEntity.getSkills().m.IsPreviewing = true; this.m.MSU_PreviewSkill = skill; this.m.MSU_PreviewMovement = movement; - activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); + activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system activeEntity.getSkills().updatePreview(skill, movement); } } diff --git a/msu/utils/skills.nut b/msu/utils/skills.nut index 21ab9422d..be5374a0e 100644 --- a/msu/utils/skills.nut +++ b/msu/utils/skills.nut @@ -1,9 +1,9 @@ ::MSU.Skills <- { - PreviewApplicableFunctions = [ + PreviewApplicableFunctions = [ // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system "getActionPointCost", "getFatigueCost" ], - QueuedPreviewChanges = {}, + QueuedPreviewChanges = {}, // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system SoftResetFields = [ "ActionPointCost", "FatigueCost", @@ -48,6 +48,7 @@ }); } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system function addPreviewApplicableFunction( _name ) { ::MSU.requireString(_name); @@ -65,6 +66,7 @@ if (idx != null) this.SoftResetFields.remove(idx); } + // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system // Private function modifyPreview( _caller, _targetSkill, _field, _newChange, _multiplicative ) { From e9dc9d34b48c59c2b893e96ff1774be9d133d866 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:04:44 -0400 Subject: [PATCH 4/9] perf: add guard clauses to return early in setActiveEntityCostsPreview --- .../turn_sequence_bar/turn_sequence_bar.nut | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut index abc77ac84..805cde6ce 100644 --- a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut +++ b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut @@ -35,36 +35,35 @@ q.setActiveEntityCostsPreview = @(__original) function( _costsPreview ) { - if (::MSU.Mod.ModSettings.getSetting("ExpandedSkillTooltips").getValue()) - { - local activeEntity = this.getActiveEntity(); - if (activeEntity != null) - { - local skillID = "SkillID" in _costsPreview ? _costsPreview.SkillID : ""; - local skill; - local movement; - if (skillID == "") - { - movement = ::Tactical.getNavigator().getCostForPath(activeEntity, ::Tactical.getNavigator().getLastSettings(), activeEntity.getActionPoints(), activeEntity.getFatigueMax() - activeEntity.getFatigue()); - } - else skill = activeEntity.getSkills().getSkillByID(skillID); + if (!::MSU.Mod.ModSettings.getSetting("ExpandedSkillTooltips").getValue()) + return __original(_costsPreview); - activeEntity.getSkills().m.IsPreviewing = true; - this.m.MSU_PreviewSkill = skill; - this.m.MSU_PreviewMovement = movement; - activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system - activeEntity.getSkills().updatePreview(skill, movement); - } - } + local activeEntity = this.getActiveEntity(); + if (activeEntity == null) + return __original(_costsPreview); + + local skillID = "SkillID" in _costsPreview ? _costsPreview.SkillID : ""; + local skill; + local movement; + if (skillID == "") + movement = ::Tactical.getNavigator().getCostForPath(activeEntity, ::Tactical.getNavigator().getLastSettings(), activeEntity.getActionPoints(), activeEntity.getFatigueMax() - activeEntity.getFatigue()); + else + skill = activeEntity.getSkills().getSkillByID(skillID); + + activeEntity.getSkills().m.IsPreviewing = true; + this.m.MSU_PreviewSkill = skill; + this.m.MSU_PreviewMovement = movement; + activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system + activeEntity.getSkills().updatePreview(skill, movement); this.m.MSU_JSHandle.__JSHandle = this.m.JSHandle; this.m.JSHandle = this.m.MSU_JSHandle; - __original(_costsPreview); + local ret = __original(_costsPreview); this.m.JSHandle = this.m.MSU_JSHandle.__JSHandle; this.m.JSHandle.asyncCall("updateCostsPreview", this.m.ActiveEntityCostsPreview); - local activeEntity = this.getActiveEntity(); - if (activeEntity != null) - activeEntity.getSkills().update(); + + activeEntity.getSkills().update(); + return ret; } q.resetActiveEntityCostsPreview = @(__original) function() From 8c8494290e49441f56618a1bdd60009b2b0ddfa6 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Wed, 17 Apr 2024 23:29:36 -0400 Subject: [PATCH 5/9] perf: remove unused target variable --- msu/hooks/skills/skill_container.nut | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index 949f39d9e..6c1e7115e 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -294,18 +294,7 @@ { foreach (change in changes) { - local target; - local previewTable; - if (change.TargetSkill != null) - { - target = change.TargetSkill.m; - previewTable = change.TargetSkill.m.PreviewField; - } - else - { - target = this.getActor().getCurrentProperties(); - previewTable = this.m.PreviewProperty; - } + local previewTable = change.TargetSkill == null ? this.m.PreviewProperty : change.TargetSkill.m.PreviewField; if (!(change.Field in previewTable)) previewTable[change.Field] <- { Change = change.Multiplicative ? 1 : 0, Multiplicative = change.Multiplicative }; From d6283a3e06b4d4d623397dddc826112b8aff0115 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Wed, 17 Apr 2024 23:31:37 -0400 Subject: [PATCH 6/9] style: add new line after if condense if else block --- msu/hooks/skills/skill_container.nut | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index 6c1e7115e..c636bc7fa 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -296,20 +296,15 @@ { local previewTable = change.TargetSkill == null ? this.m.PreviewProperty : change.TargetSkill.m.PreviewField; - if (!(change.Field in previewTable)) previewTable[change.Field] <- { Change = change.Multiplicative ? 1 : 0, Multiplicative = change.Multiplicative }; + if (!(change.Field in previewTable)) + previewTable[change.Field] <- { Change = change.Multiplicative ? 1 : 0, Multiplicative = change.Multiplicative }; if (change.Multiplicative) - { previewTable[change.Field].Change *= change.NewChange / (change.CurrChange == 0 ? 1 : change.CurrChange); - } else if (typeof change.NewChange == "bool") - { previewTable[change.Field].Change = change.NewChange; - } else - { previewTable[change.Field].Change += change.NewChange - change.CurrChange; - } } } From 7fd3dcf6f0535ca120c24e32be3f03477ffe51cf Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Wed, 17 Apr 2024 23:53:44 -0400 Subject: [PATCH 7/9] perf: iterate over skills only once to clear PreviewField and call event --- msu/hooks/skills/skill_container.nut | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index c636bc7fa..2eb35c28a 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -225,16 +225,14 @@ q.onAffordablePreview <- function( _skill, _movementTile ) { this.m.PreviewProperty.clear(); + foreach (skill in this.m.Skills) { skill.m.PreviewField.clear(); + if (!skill.isGarbage()) + skill.onAffordablePreview(_skill, _movementTile); } - this.callSkillsFunction("onAffordablePreview", [ - _skill, - _movementTile, - ], false); - if (::MSU.Skills.QueuedPreviewChanges.len() == 0) return; local propertiesClone = this.getActor().getBaseProperties().getClone(); From c84b413e566ac9ca9e84ecbc58bcfff995612f75 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:26:54 -0400 Subject: [PATCH 8/9] refactor: add skill and movement directly to ActiveEntityCostsPreview --- msu/hooks/skills/skill.nut | 2 +- .../turn_sequence_bar/turn_sequence_bar.nut | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/msu/hooks/skills/skill.nut b/msu/hooks/skills/skill.nut index 236a93e3a..47a60b498 100644 --- a/msu/hooks/skills/skill.nut +++ b/msu/hooks/skills/skill.nut @@ -579,7 +579,7 @@ local preview = ::Tactical.TurnSequenceBar.m.ActiveEntityCostsPreview; if (preview != null && preview.id == this.getContainer().getActor().getID()) { - this.getContainer().updatePreview(::Tactical.TurnSequenceBar.m.MSU_PreviewSkill, ::Tactical.TurnSequenceBar.m.MSU_PreviewMovement); + this.getContainer().updatePreview(preview.MSU_PreviewSkill, preview.MSU_PreviewMovement); this.m.IsApplyingPreview = true; local ret = __original(); this.m.IsApplyingPreview = false; diff --git a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut index 805cde6ce..fdca317e8 100644 --- a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut +++ b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut @@ -1,7 +1,4 @@ ::MSU.MH.hook("scripts/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar", function(q) { - q.m.MSU_PreviewSkill <- null; - q.m.MSU_PreviewMovement <- null; - q.create = @(__original) function() { __original(); @@ -51,8 +48,6 @@ skill = activeEntity.getSkills().getSkillByID(skillID); activeEntity.getSkills().m.IsPreviewing = true; - this.m.MSU_PreviewSkill = skill; - this.m.MSU_PreviewMovement = movement; activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system activeEntity.getSkills().updatePreview(skill, movement); @@ -62,6 +57,9 @@ this.m.JSHandle = this.m.MSU_JSHandle.__JSHandle; this.m.JSHandle.asyncCall("updateCostsPreview", this.m.ActiveEntityCostsPreview); + this.m.ActiveEntityCostsPreview.MSU_PreviewSkill <- skill; + this.m.ActiveEntityCostsPreview.MSU_PreviewMovement <- movement; + activeEntity.getSkills().update(); return ret; } @@ -69,12 +67,7 @@ q.resetActiveEntityCostsPreview = @(__original) function() { local activeEntity = this.getActiveEntity(); - if (activeEntity != null) - { - activeEntity.getSkills().m.IsPreviewing = false; - this.m.MSU_PreviewSkill = null; - this.m.MSU_PreviewMovement = null; - } + if (activeEntity != null) activeEntity.getSkills().m.IsPreviewing = false; __original(); } }); From 1d80ba9dae483300d4239d0bd9dba578ad2ef560 Mon Sep 17 00:00:00 2001 From: LordMidas <55047920+LordMidas@users.noreply.github.com> Date: Sat, 4 May 2024 00:16:44 -0400 Subject: [PATCH 9/9] refactor: make the preview system extensible to all functions Instead of only via hard-coded functions like onUpdatePreview etc. --- msu/hooks/entity/tactical/actor.nut | 24 +++++++++++ msu/hooks/skills/skill.nut | 4 +- msu/hooks/skills/skill_container.nut | 41 ++----------------- .../turn_sequence_bar/turn_sequence_bar.nut | 15 ++++--- 4 files changed, 40 insertions(+), 44 deletions(-) diff --git a/msu/hooks/entity/tactical/actor.nut b/msu/hooks/entity/tactical/actor.nut index e13c93707..882b6653f 100644 --- a/msu/hooks/entity/tactical/actor.nut +++ b/msu/hooks/entity/tactical/actor.nut @@ -1,4 +1,7 @@ ::MSU.MH.hook("scripts/entity/tactical/actor", function(q) { + q.m.MSU_PreviewSkill <- null; + q.m.MSU_PreviewMovement <- null; + q.setActionPoints = @() function( _a ) { this.m.ActionPoints = ::Math.round(_a); @@ -121,6 +124,27 @@ } } } + + q.isPreviewing <- function() + { + return this.getSkills().m.IsPreviewing; + } + + q.getPreviewSkill <- function() + { + return this.m.MSU_PreviewSkill; + } + + q.getPreviewMovement <- function() + { + return this.m.MSU_PreviewMovement; + } + + q.clearPreview <- function() + { + this.m.MSU_PreviewSkill = null; + this.m.MSU_PreviewMovement = null; + } }); ::MSU.QueueBucket.VeryLate.push(function() { diff --git a/msu/hooks/skills/skill.nut b/msu/hooks/skills/skill.nut index 47a60b498..82454990e 100644 --- a/msu/hooks/skills/skill.nut +++ b/msu/hooks/skills/skill.nut @@ -579,11 +579,13 @@ local preview = ::Tactical.TurnSequenceBar.m.ActiveEntityCostsPreview; if (preview != null && preview.id == this.getContainer().getActor().getID()) { - this.getContainer().updatePreview(preview.MSU_PreviewSkill, preview.MSU_PreviewMovement); + this.getContainer().update(); this.m.IsApplyingPreview = true; local ret = __original(); this.m.IsApplyingPreview = false; + this.getContainer().m.IsPreviewing = false; this.getContainer().update(); + this.getContainer().m.IsPreviewing = true; local skillID = this.getContainer().getActor().getPreviewSkillID(); local str = " after " + (skillID == "" ? "moving" : "using " + this.getContainer().getSkillByID(skillID).getName()); ret = ::MSU.String.replace(ret, "Fatigue[/color]", "Fatigue[/color]" + str); diff --git a/msu/hooks/skills/skill_container.nut b/msu/hooks/skills/skill_container.nut index 2eb35c28a..4a2398dcf 100644 --- a/msu/hooks/skills/skill_container.nut +++ b/msu/hooks/skills/skill_container.nut @@ -309,44 +309,6 @@ ::MSU.Skills.QueuedPreviewChanges.clear(); } - q.updatePreview <- function( _previewedSkill, _previewedMovement ) - { - if (this.m.IsUpdating || !this.m.Actor.isAlive()) - return; - - foreach (skill in this.m.Skills) - { - if (!skill.isGarbage()) - skill.softReset(); - } - - local properties = this.m.Actor.getBaseProperties().getClone(); - - this.m.IsUpdating = true; - - foreach (skill in this.m.Skills) - { - if (!skill.isGarbage()) - skill.onUpdatePreview(properties, _previewedSkill, _previewedMovement); - } - - foreach (skill in this.m.Skills) - { - if (!skill.isGarbage()) - skill.onAfterUpdatePreview(properties, _previewedSkill, _previewedMovement); - } - - // Deprecated - foreach (skill in this.m.ScheduledChangesSkills) - { - skill.executeScheduledChanges(); - } - - this.m.IsUpdating = false; - - this.m.Actor.setCurrentProperties(properties); - } - //Vanilla Overwrites start q.onAfterDamageReceived = @() function() @@ -406,12 +368,14 @@ q.onTurnEnd = @() function() { this.m.IsPreviewing = false; + this.getActor().clearPreview(); this.callSkillsFunctionWhenAlive("onTurnEnd"); } q.onWaitTurn = @() function() { this.m.IsPreviewing = false; + this.getActor().clearPreview(); this.callSkillsFunctionWhenAlive("onWaitTurn"); } @@ -509,6 +473,7 @@ q.onCombatFinished = @() function() { this.m.IsPreviewing = false; + this.getActor().clearPreview(); this.callSkillsFunction("onCombatFinished"); } diff --git a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut index fdca317e8..d58fa8985 100644 --- a/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut +++ b/msu/hooks/ui/screens/tactical/modules/turn_sequence_bar/turn_sequence_bar.nut @@ -49,7 +49,9 @@ activeEntity.getSkills().m.IsPreviewing = true; activeEntity.getSkills().onAffordablePreview(skill, movement == null ? null : movement.End); // Deprecated - Only needed for the legacy onAffordablePreview system -- use the new onUpdatePreview and onAfterUpdatePreview system - activeEntity.getSkills().updatePreview(skill, movement); + activeEntity.m.MSU_PreviewSkill = skill; + activeEntity.m.MSU_PreviewMovement = movement; + activeEntity.getSkills().update(); this.m.MSU_JSHandle.__JSHandle = this.m.JSHandle; this.m.JSHandle = this.m.MSU_JSHandle; @@ -57,17 +59,20 @@ this.m.JSHandle = this.m.MSU_JSHandle.__JSHandle; this.m.JSHandle.asyncCall("updateCostsPreview", this.m.ActiveEntityCostsPreview); - this.m.ActiveEntityCostsPreview.MSU_PreviewSkill <- skill; - this.m.ActiveEntityCostsPreview.MSU_PreviewMovement <- movement; - + activeEntity.getSkills().m.IsPreviewing = false; activeEntity.getSkills().update(); + activeEntity.getSkills().m.IsPreviewing = true; return ret; } q.resetActiveEntityCostsPreview = @(__original) function() { local activeEntity = this.getActiveEntity(); - if (activeEntity != null) activeEntity.getSkills().m.IsPreviewing = false; + if (activeEntity != null) + { + activeEntity.getSkills().m.IsPreviewing = false; + activeEntity.clearPreview(); + } __original(); } });