diff --git a/BossMod/Autorotation/Legacy/CommonState.cs b/BossMod/Autorotation/Legacy/CommonState.cs index 6d309054df..7a487e3c27 100644 --- a/BossMod/Autorotation/Legacy/CommonState.cs +++ b/BossMod/Autorotation/Legacy/CommonState.cs @@ -24,29 +24,24 @@ public abstract class CommonState(RotationModule module) public bool NextPositionalImminent; // true if next positional will happen on next gcd public bool NextPositionalCorrect; // true if correctly positioned for next positional - // these simply point to client state - public Cooldown[] Cooldowns => Module.World.Client.Cooldowns; - public ActionID[] DutyActions => Module.World.Client.DutyActions; - public byte[] BozjaHolster => Module.World.Client.BozjaHolster; - // both 2.5 max (unless slowed), reduced by gear attributes and certain status effects public float AttackGCDTime; public float SpellGCDTime; // find a slot containing specified duty action; returns -1 if not found - public int FindDutyActionSlot(ActionID action) => Array.IndexOf(DutyActions, action); + public int FindDutyActionSlot(ActionID action) => Array.IndexOf(Module.World.Client.DutyActions, action); // find a slot containing specified duty action, if other duty action is the specified one; returns -1 if not found, or other action is different public int FindDutyActionSlot(ActionID action, ActionID other) { var slot = FindDutyActionSlot(action); - return slot >= 0 && DutyActions[1 - slot] == other ? slot : -1; + return slot >= 0 && Module.World.Client.DutyActions[1 - slot] == other ? slot : -1; } - public float GCD => Cooldowns[ActionDefinitions.GCDGroup].Remaining; // 2.5 max (decreased by SkS), 0 if not on gcd - public float PotionCD => Cooldowns[ActionDefinitions.PotionCDGroup].Remaining; // variable max - public float CD(AID aid) where AID : Enum => Cooldowns[ActionDefinitions.Instance.Spell(aid)!.MainCooldownGroup].Remaining; + public float GCD => Module.World.Client.Cooldowns[ActionDefinitions.GCDGroup].Remaining; // 2.5 max (decreased by SkS), 0 if not on gcd + public float PotionCD => Module.World.Client.Cooldowns[ActionDefinitions.PotionCDGroup].Remaining; // variable max + public float CD(AID aid) where AID : Enum => Module.World.Client.Cooldowns[ActionDefinitions.Instance.Spell(aid)!.MainCooldownGroup].Remaining; - public float DutyActionCD(int slot) => slot is >= 0 and < 2 ? Cooldowns[ActionDefinitions.DutyAction0CDGroup + slot].Remaining : float.MaxValue; + public float DutyActionCD(int slot) => slot is >= 0 and < 2 ? Module.World.Client.Cooldowns[ActionDefinitions.DutyAction0CDGroup + slot].Remaining : float.MaxValue; public float DutyActionCD(ActionID action) => DutyActionCD(FindDutyActionSlot(action)); // check whether weaving typical ogcd off cooldown would end its animation lock by the specified deadline diff --git a/BossMod/Autorotation/Legacy/LegacyGNB.cs b/BossMod/Autorotation/Legacy/LegacyGNB.cs index 31d15767ae..a89c7918de 100644 --- a/BossMod/Autorotation/Legacy/LegacyGNB.cs +++ b/BossMod/Autorotation/Legacy/LegacyGNB.cs @@ -176,12 +176,12 @@ public override void Execute(StrategyValues strategy, Actor? primaryTarget) private int NumTargetsHitByAOE() => Hints.NumPriorityTargetsInAOECircle(Player.Position, 5); // old GNBRotation - private int GaugeGainedFromAction(GNB.AID action) => action switch - { - GNB.AID.SolidBarrel or GNB.AID.DemonSlaughter => 1, - GNB.AID.Bloodfest => _state.Unlocked(GNB.TraitID.CartridgeChargeII) ? 3 : 2, - _ => 0 - }; + //private int GaugeGainedFromAction(GNB.AID action) => action switch + //{ + // GNB.AID.SolidBarrel or GNB.AID.DemonSlaughter => 1, + // GNB.AID.Bloodfest => _state.Unlocked(GNB.TraitID.CartridgeChargeII) ? 3 : 2, + // _ => 0 + //}; private int GetSTComboLength(GNB.AID comboLastMove) => comboLastMove switch { @@ -192,12 +192,12 @@ public override void Execute(StrategyValues strategy, Actor? primaryTarget) private int GetAOEComboLength(GNB.AID comboLastMove) => comboLastMove == GNB.AID.DemonSlice ? 1 : 2; - private GNB.AID GetNextSTComboAction(GNB.AID comboLastMove, GNB.AID finisher) => comboLastMove switch - { - GNB.AID.BrutalShell => finisher, - GNB.AID.KeenEdge => GNB.AID.BrutalShell, - _ => GNB.AID.KeenEdge - }; + //private GNB.AID GetNextSTComboAction(GNB.AID comboLastMove, GNB.AID finisher) => comboLastMove switch + //{ + // GNB.AID.BrutalShell => finisher, + // GNB.AID.KeenEdge => GNB.AID.BrutalShell, + // _ => GNB.AID.KeenEdge + //}; private GNB.AID GetNextBrutalShellComboAction(GNB.AID comboLastMove) { @@ -688,18 +688,18 @@ private GNB.AID GetNextAmmoAction(StrategyValues strategy, bool aoe) return GetNextUnlockedComboAction(strategy, aoe); } - private bool ShouldSpendGauge(StrategyValues strategy, bool aoe) => strategy.Option(Track.Gauge).As() switch - { - GaugeStrategy.Automatic or GaugeStrategy.LightningShotIfNotInMelee => (_state.RaidBuffsLeft > _state.GCD || _state.FightEndIn <= _state.RaidBuffsIn + 10), - GaugeStrategy.Spend => true, - GaugeStrategy.ForceST => true, - GaugeStrategy.ForceAOE => true, - GaugeStrategy.ForceGF => true, - GaugeStrategy.Hold => true, - GaugeStrategy.ComboFitBeforeDowntime => _state.FightEndIn <= _state.GCD + 2.5f * ((aoe ? GetAOEComboLength(_state.ComboLastMove) : GetSTComboLength(_state.ComboLastMove)) - 1), - GaugeStrategy.PenultimateComboThenSpend => _state.ComboLastMove is GNB.AID.BrutalShell or GNB.AID.DemonSlice, - _ => true - }; + //private bool ShouldSpendGauge(StrategyValues strategy, bool aoe) => strategy.Option(Track.Gauge).As() switch + //{ + // GaugeStrategy.Automatic or GaugeStrategy.LightningShotIfNotInMelee => (_state.RaidBuffsLeft > _state.GCD || _state.FightEndIn <= _state.RaidBuffsIn + 10), + // GaugeStrategy.Spend => true, + // GaugeStrategy.ForceST => true, + // GaugeStrategy.ForceAOE => true, + // GaugeStrategy.ForceGF => true, + // GaugeStrategy.Hold => true, + // GaugeStrategy.ComboFitBeforeDowntime => _state.FightEndIn <= _state.GCD + 2.5f * ((aoe ? GetAOEComboLength(_state.ComboLastMove) : GetSTComboLength(_state.ComboLastMove)) - 1), + // GaugeStrategy.PenultimateComboThenSpend => _state.ComboLastMove is GNB.AID.BrutalShell or GNB.AID.DemonSlice, + // _ => true + //}; private bool ShouldUsePotion(StrategyValues strategy) => strategy.Option(Track.Potion).As() switch { diff --git a/BossMod/Autorotation/Legacy/LegacyMNK.cs b/BossMod/Autorotation/Legacy/LegacyMNK.cs index 6892baaf94..d2ba64082f 100644 --- a/BossMod/Autorotation/Legacy/LegacyMNK.cs +++ b/BossMod/Autorotation/Legacy/LegacyMNK.cs @@ -519,7 +519,7 @@ private ActionID GetNextBestOGCD(StrategyValues strategy, float deadline, float var fop = BozjaActionID.GetNormal(BozjaHolsterID.LostFontOfPower); var ex = BozjaActionID.GetNormal(BozjaHolsterID.LostExcellence); - var hsacInBag = _state.BozjaHolster[(int)BozjaHolsterID.BannerHonoredSacrifice] > 0; + var hsacInBag = _state.Module.World.Client.BozjaHolster[(int)BozjaHolsterID.BannerHonoredSacrifice] > 0; var hsacSlot = _state.FindDutyActionSlot(hsac, fop); var exSlot = _state.FindDutyActionSlot(ex, fop); diff --git a/BossMod/Autorotation/Strategy.cs b/BossMod/Autorotation/Strategy.cs index 66ab18a313..15a521fe55 100644 --- a/BossMod/Autorotation/Strategy.cs +++ b/BossMod/Autorotation/Strategy.cs @@ -52,9 +52,9 @@ public record struct StrategyValue() public string Comment = ""; // user-editable comment string } -public record struct StrategyValues(List Configs) +public readonly record struct StrategyValues(List Configs) { - public StrategyValue[] Values = Utils.MakeArray(Configs.Count, new StrategyValue()); + public readonly StrategyValue[] Values = Utils.MakeArray(Configs.Count, new StrategyValue()); // unfortunately, c# doesn't support partial type inference, and forcing user to spell out track enum twice is obnoxious, so here's the hopefully cheap solution public readonly ref struct OptionRef(ref StrategyConfig config, ref StrategyValue value) diff --git a/BossMod/Autorotation/Utility/ClassBRDUtility.cs b/BossMod/Autorotation/Utility/ClassBRDUtility.cs index ec7bcb4a2b..c28ec2c848 100644 --- a/BossMod/Autorotation/Utility/ClassBRDUtility.cs +++ b/BossMod/Autorotation/Utility/ClassBRDUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassBRDUtility(RotationModuleManager manager, Actor player) { public enum Track { WardensPaean = SharedTrack.Count, Troubadour, NaturesMinne } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(BRD.AID.SagittariusArrow); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(BRD.AID.SagittariusArrow); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassDNCUtility.cs b/BossMod/Autorotation/Utility/ClassDNCUtility.cs index 997a569ed5..19aa013e32 100644 --- a/BossMod/Autorotation/Utility/ClassDNCUtility.cs +++ b/BossMod/Autorotation/Utility/ClassDNCUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassDNCUtility(RotationModuleManager manager, Actor player) { public enum Track { CuringWaltz = SharedTrack.Count, ShieldSamba, Improvisation } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(DNC.AID.CrimsonLotus); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(DNC.AID.CrimsonLotus); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassDRGUtility.cs b/BossMod/Autorotation/Utility/ClassDRGUtility.cs index 228014dab1..c14a0cd7aa 100644 --- a/BossMod/Autorotation/Utility/ClassDRGUtility.cs +++ b/BossMod/Autorotation/Utility/ClassDRGUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassDRGUtility(RotationModuleManager manager, Actor player) { //public enum Track { ElusiveJump = SharedTrack.Count } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(DRG.AID.DragonsongDive); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(DRG.AID.DragonsongDive); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassGNBUtility.cs b/BossMod/Autorotation/Utility/ClassGNBUtility.cs index 631cc56b28..cc4ca06c09 100644 --- a/BossMod/Autorotation/Utility/ClassGNBUtility.cs +++ b/BossMod/Autorotation/Utility/ClassGNBUtility.cs @@ -5,7 +5,7 @@ public sealed class ClassGNBUtility(RotationModuleManager manager, Actor player) public enum Track { Camouflage = SharedTrack.Count, Nebula, Aurora, Superbolide, HeartOfLight, HeartOfCorundum } public enum HoCOption { None, HeartOfStone, HeartOfCorundum } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(GNB.AID.GunmetalSoul); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(GNB.AID.GunmetalSoul); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassMNKUtility.cs b/BossMod/Autorotation/Utility/ClassMNKUtility.cs index 4baf4bec2b..0cab10af58 100644 --- a/BossMod/Autorotation/Utility/ClassMNKUtility.cs +++ b/BossMod/Autorotation/Utility/ClassMNKUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassMNKUtility(RotationModuleManager manager, Actor player) { public enum Track { Mantra = SharedTrack.Count, RiddleOfEarth } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(MNK.AID.FinalHeaven); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(MNK.AID.FinalHeaven); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassPLDUtility.cs b/BossMod/Autorotation/Utility/ClassPLDUtility.cs index 4e7e67ca39..4b96bbf064 100644 --- a/BossMod/Autorotation/Utility/ClassPLDUtility.cs +++ b/BossMod/Autorotation/Utility/ClassPLDUtility.cs @@ -5,7 +5,7 @@ public sealed class ClassPLDUtility(RotationModuleManager manager, Actor player) public enum Track { Sheltron = SharedTrack.Count, Sentinel, HallowedGround } public enum BWOption { None, Bloodwhetting, RawIntuition, NascentFlash } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(PLD.AID.LastBastion); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(PLD.AID.LastBastion); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassRPRUtility.cs b/BossMod/Autorotation/Utility/ClassRPRUtility.cs index afc0bca92a..ceb6b8ad5b 100644 --- a/BossMod/Autorotation/Utility/ClassRPRUtility.cs +++ b/BossMod/Autorotation/Utility/ClassRPRUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassRPRUtility(RotationModuleManager manager, Actor player) { public enum Track { ArcaneCrest = SharedTrack.Count } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(RPR.AID.TheEnd); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(RPR.AID.TheEnd); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassSAMUtility.cs b/BossMod/Autorotation/Utility/ClassSAMUtility.cs index ac41d21533..c91a3df91c 100644 --- a/BossMod/Autorotation/Utility/ClassSAMUtility.cs +++ b/BossMod/Autorotation/Utility/ClassSAMUtility.cs @@ -4,7 +4,7 @@ public sealed class ClassSAMUtility(RotationModuleManager manager, Actor player) { public enum Track { ThirdEye = SharedTrack.Count } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(SAM.AID.DoomOfTheLiving); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(SAM.AID.DoomOfTheLiving); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Autorotation/Utility/ClassWARUtility.cs b/BossMod/Autorotation/Utility/ClassWARUtility.cs index 76b2a24396..d2895eb2f6 100644 --- a/BossMod/Autorotation/Utility/ClassWARUtility.cs +++ b/BossMod/Autorotation/Utility/ClassWARUtility.cs @@ -5,7 +5,7 @@ public sealed class ClassWARUtility(RotationModuleManager manager, Actor player) public enum Track { Thrill = SharedTrack.Count, Vengeance, Holmgang, Bloodwhetting, Equilibrium, ShakeItOff } public enum BWOption { None, Bloodwhetting, RawIntuition, NascentFlash } - public static ActionID IDLimitBreak3 = ActionID.MakeSpell(WAR.AID.LandWaker); + public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(WAR.AID.LandWaker); public static RotationModuleDefinition Definition() { diff --git a/BossMod/Framework/IPCProvider.cs b/BossMod/Framework/IPCProvider.cs index a84da15bf5..213c7962f3 100644 --- a/BossMod/Framework/IPCProvider.cs +++ b/BossMod/Framework/IPCProvider.cs @@ -38,12 +38,12 @@ private void Register(string name, Func func) _disposeActions += p.UnregisterFunc; } - private void Register(string name, Action func) - { - var p = Service.PluginInterface.GetIpcProvider("BossMod." + name); - p.RegisterAction(func); - _disposeActions += p.UnregisterAction; - } + //private void Register(string name, Action func) + //{ + // var p = Service.PluginInterface.GetIpcProvider("BossMod." + name); + // p.RegisterAction(func); + // _disposeActions += p.UnregisterAction; + //} //private void Register(string name, Action func) //{ diff --git a/BossMod/Replay/Analysis/ClassDefinitions.cs b/BossMod/Replay/Analysis/ClassDefinitions.cs index 785dbdb9b3..6874de0a15 100644 --- a/BossMod/Replay/Analysis/ClassDefinitions.cs +++ b/BossMod/Replay/Analysis/ClassDefinitions.cs @@ -488,7 +488,7 @@ public void Group(string group, IEnumerable actions, bool allowClass } public string Comment(ActionData action, bool allowClasses) - => $"{LevelString(action, allowClasses)}, {CastTimeString(action)}{CooldownString(action)}{ChargesString(action)}, range {ActionDefinitions.Instance.ActionRange(action.ID, action.IsPhysRanged)}, {DescribeShape(action.Row)}, targets={ActionDefinitions.Instance.ActionAllowedTargets(action.ID).ToString().Replace(", ", "/")}{AnimLockString(action)}"; + => $"{LevelString(action, allowClasses)}, {CastTimeString(action)}{CooldownString(action)}{ChargesString(action)}, range {ActionDefinitions.Instance.ActionRange(action.ID, action.IsPhysRanged)}, {DescribeShape(action.Row)}, targets={ActionDefinitions.Instance.ActionAllowedTargets(action.ID).ToString().Replace(", ", "/", StringComparison.InvariantCulture)}{AnimLockString(action)}"; private string LevelString(ActionData action, bool allowClasses) { diff --git a/BossMod/Replay/Visualization/ReplayDetailsWindow.cs b/BossMod/Replay/Visualization/ReplayDetailsWindow.cs index 88990d15d2..e6f235d21a 100644 --- a/BossMod/Replay/Visualization/ReplayDetailsWindow.cs +++ b/BossMod/Replay/Visualization/ReplayDetailsWindow.cs @@ -380,7 +380,7 @@ private void DrawAI() ResetPF(); } - private string FlagTransitionString((bool active, float transIn) arg) => $"{(arg.active ? "end" : "start")} in {arg.transIn:f2}s"; + //private string FlagTransitionString((bool active, float transIn) arg) => $"{(arg.active ? "end" : "start")} in {arg.transIn:f2}s"; private void MoveTo(DateTime t) {