Пример #1
0
        private bool OnSerializeHelper(IBitStream stream, bool initialState)
        {
            if (!initialState && m_serializeHelper.ShouldReturnImmediately(ref stream))
            {
                return(false);
            }
            int turnToUpdate = m_turnToUpdate;

            stream.Serialize(ref turnToUpdate);
            bool flag1 = turnToUpdate != m_turnToUpdate;

            m_turnToUpdate = turnToUpdate;
            int phaseToUpdate = (int)m_phaseToUpdate;

            stream.Serialize(ref phaseToUpdate);
            bool flag2 = m_phaseToUpdate != (AbilityPriority)phaseToUpdate;

            if (flag2 || flag1)
            {
                m_phaseToUpdate  = (AbilityPriority)phaseToUpdate;
                m_phaseStartTime = Time.time;
                if (flag1)
                {
                    m_turn = new Turn();
                }
            }
            m_turn.OnSerializeHelper(stream);
            if (flag2)
            {
                m_turn.UnknownMethod(m_phaseToUpdate);
            }
            return(m_serializeHelper.End(initialState, syncVarDirtyBits));
        }
Пример #2
0
 public override void Deserialize(NetworkReader reader)
 {
     AbilityPhase = (AbilityPriority)reader.ReadSByte();
     ActorIndex   = reader.ReadInt32();
     AsFailsafe   = reader.ReadBoolean();
     AsResend     = reader.ReadBoolean();
 }
Пример #3
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            // High Priority / Buff Management
            result.Add("Haunt", r => !r.HasBuff("Haunt"));
            result.Add("Fade Out", r => GameManager.LocalPlayer.HasCleansableCC());

            // Medium Priority / Psi Point Specific
            result.Add("Reap", r => GameManager.LocalPlayer.InnateResource == 5);
            result.Add("Mind Burst", r => GameManager.LocalPlayer.InnateResource == 5);
            result.Add("Telekinetic Storm", r => GameManager.LocalPlayer.InnateResource == 5);
            result.Add("Spectral Form", r => GameManager.LocalPlayer.InnateResource >= 4);

            // Medium Low Priority / Cast Once (summon)
            result.Add("Spectral Swarm", r => true);
            result.Add("Geist", r => true);

            // Low Priority / Interrupt
            result.Add("Shockwave", r => r.IsCasting);
            result.Add("Restraint", r => r.IsCasting);
            result.Add("Crush", r => r.IsCasting);
            result.Add("Incapacitate", r => r.IsCasting);

            // Spam Priority / Psi Point builders
            result.Add("Psychic Frenzy", r => GameManager.LocalPlayer.InnateResource < 5);
            result.Add("Illusionary Blades", r => GameManager.LocalPlayer.InnateResource < 5);
            result.Add("Blade Dance", r => GameManager.LocalPlayer.InnateResource < 5);
            result.Add("Telekinetic Strike", r => GameManager.LocalPlayer.InnateResource < 5);
            result.Add("Concentrated Blade", r => GameManager.LocalPlayer.InnateResource < 5);

            return(result);
        }
        public void ResolveAbilities(ActorData actor, AbilityPriority priority)
        {
            AbilityData abilityData = actor.gameObject.GetComponent <AbilityData>();

            // I didn't find any code that calculates what an ability hits aside from UpdateTargeting which is
            // used to draw targeters on the client. In order for it to work on the server we need to
            // * set actor as active owned actor data -- calculations rely on this
            // * AppearAtBoardSquare to set actor's current board square
            // * patch TargeterUtils so that RemoveActorsInvisibleToClient isn't called on the server
            // * disable ActorData.IsVisibleToClient on server (break cover otherwise)
            // * ..?
            foreach (ActorTargeting.AbilityRequestData ard in actor.TeamSensitiveData_authority.GetAbilityRequestData())
            {
                Ability ability = abilityData.GetAbilityOfActionType(ard.m_actionType);

                if (ability.m_runPriority != priority)
                {
                    continue;
                }
                Log.Info($"Resolving {ability.m_abilityName} for {actor.DisplayName}");

                AbilityResolver resolver = GetAbilityResolver(actor, ability, priority, ard);
                resolver.Resolve();
                ActionsThisPhase.AddRange(resolver.Actions);
                Animations.AddRange(resolver.Animations);
                Utils.Add(TargetedActorsThisPhase, resolver.TargetedActors);
                Barriers.AddRange(resolver.Barriers);
            }
        }
Пример #5
0
        public AbilityResolver_TrapWire(ActorData actor, Ability ability, AbilityPriority priority, ActorTargeting.AbilityRequestData abilityRequestData)
            : base(actor, ability, priority, abilityRequestData)
        {
            BoardSquare square = GetGameplayRefSquare(abilityRequestData.m_targets[0], m_caster);

            m_targetSquare = square.GetGridPosition();
            m_targetPos    = GetHighlightGoalPos(Targeter, abilityRequestData.m_targets[0], m_caster); // TODO fix height if it matters (probably just different heights on different maps)
            Vector3 pos = m_targetPos * 2 - square.GetWorldPosition();

            m_secondarySquare = Board.Get().GetSquare(pos).GetGridPosition();
        }
        private void UpdateTheatrics()
        {
            var Theatrics = TheatricsManager.Get();

            Theatrics.m_turn         = Turn;
            Theatrics.m_turnToUpdate = Turn.TurnID;
            Theatrics.SetDirtyBit(uint.MaxValue);

            AbilityPriority phase = Phase == AbilityPriority.NumAbilityPriorities ? AbilityPriority.INVALID : Phase;

            Theatrics.PlayPhase(phase);
        }
Пример #7
0
        public static AbilityPriority GetCurrentAbilityPhase()
        {
            AbilityPriority abilityPriority = AbilityPriority.INVALID;

//            if (!NetworkServer.active)
//            {
//                if (ClientActionBuffer.Get() != null)
//                    abilityPriority = ClientActionBuffer.Get().AbilityPhase;
//                else
//                    Log.Print(LogType.Error,"Trying to examine current ability phase, but ClientActionBuffer does not exist.");
//            }
            return(abilityPriority);
        }
Пример #8
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            //result.Add("Hyper Wave", r => r.ThreatListGuids.Contains(GameManager.LocalPlayer.Guid));
            //result.Add("Particle Ejector", r => r.ThreatListGuids.Contains(GameManager.LocalPlayer.Guid));

            result.Add("Shatter Impairment", r => GameManager.LocalPlayer.HasCleansableCC());

            // Interrupt
            result.Add("Obstruct Vision", r => r.IsCasting);
            result.Add("Code Red", r => r.IsCasting);
            result.Add("Diminisherbot", r => r.IsCasting);
            result.Add("Zap", r => r.IsCasting);
            result.Add("Urgent Withdrawal", r => r.IsCasting);
            result.Add("Bruiserbot", r => (r.IsCasting) || r.GetSurrounding().Count() >= Settings.BruiserbotSurroundAmount);
            result.Add("Repairbot", r => InstanceManager.Party.Average(s => s.ShieldPercent) <= Settings.RepairbotSPercent);

            result.Add("Recursive Matrix", r => GameManager.LocalPlayer.GetSurrounding(20).Count() >= Settings.RecursiveMatrixSurroundAmount);

            // Buff management
            result.Add("Bio Shell", r => !r.HasBuff("Expose"));
            result.Add("Unstable Anomaly", r => !r.HasBuff("Wound"));
            result.Add("Unsteady Miasma", r => !r.HasBuff("Blunder"));
            result.Add("Personal Defense Unit", r => !GameManager.LocalPlayer.HasBuff("Defense"));

            // Proc / Cast when up

            // IsSpellReady is used for procs!
            result.Add("Quick Burst", r => IsSpellProcReady("Quick Burst"));
            result.Add("Artillerybot", r => IsSpellProcReady("Artillerybot"));
            result.Add("Feedback", r => IsSpellProcReady("Feedback"));
            result.Add("Thresher", r => IsSpellProcReady("Thresher"));

            // Spender
            result.Add("Electrocute", r => GameManager.LocalPlayer.InnateResourcePercent >= Settings.ElectrocuteIPercent);
            result.Add("Mortar Strike", r => GameManager.LocalPlayer.InnateResourcePercent >= Settings.MortarStrikeIPercent);
            result.Add("Bolt Caster", r => GameManager.LocalPlayer.InnateResourcePercent >= Settings.BoltCasterIPercent);

            // Builders
            result.Add("Disruptive Module", r => GameManager.LocalPlayer.InnateResourcePercent < Settings.DisruptiveModuleIPercent && InstanceManager.Party.Average(s => s.ShieldPercent) <= Settings.DisruptiveModuleSPercent);
            result.Add("Flak Cannon", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.FlakCannonIPercent);
            result.Add("Ricochet", r => !r.HasBuff("Exhaust") && GameManager.LocalPlayer.InnateResourcePercent <= Settings.RicochetIPercent);
            result.Add("Target Acquisition", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.TargetAquisitionIPercent);
            result.Add("Shock Pulse", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.ShockPulseIPercent);
            result.Add("Volatile Injection", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.VolatileInjectionIPercent);
            result.Add("Energy Auger", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.EnergyAugerIPercent);
            result.Add("Pulse Blast", r => GameManager.LocalPlayer.InnateResourcePercent <= Settings.PulseBlastIPercent);

            return(result);
        }
 private AbilityResolver GetAbilityResolver(ActorData actor, Ability ability, AbilityPriority priority, ActorTargeting.AbilityRequestData abilityRequestData)
 {
     if (ability.m_abilityName == "Trick Shot")
     {
         Log.Info("AbilityResolver_TrickShot");
         return(new AbilityResolver_TrickShot(actor, ability, priority, abilityRequestData));
     }
     else if (ability.m_abilityName == "Trapwire")
     {
         Log.Info("AbilityResolver_TrapWire");
         return(new AbilityResolver_TrapWire(actor, ability, priority, abilityRequestData));
     }
     return(new AbilityResolver(actor, ability, priority, abilityRequestData));
 }
Пример #10
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            // Spell Interrupt
            result.Add("Kick", r => r.IsCasting);

            // CC handle & break
            result.Add("Flash Bang", r => r.HasCC(CCStateType.Blind));
            result.Add("Tether Bolt", r => GameManager.LocalPlayer.HasCC(CCStateType.Tether));
            result.Add("Unstoppable Force", r => GameManager.LocalPlayer.HasCleansableCC());
            result.Add("Leap", r => r.Distance > 10 || GameManager.LocalPlayer.HasCleansableCC());
            result.Add("Savage Strikes", r => GameManager.LocalPlayer.HasCC(CCStateType.Knockback));

            // Shield handle
            result.Add("Shield Burst", r => GameManager.LocalPlayer.ShieldPercent == 0);

            // Buff application
            result.Add("Polarity Field", r => !r.HasBuff("Exhaust") && r.GetSurrounding().Count() > 1);
            result.Add("Augmented Blade", r => !r.HasBuff("Wound"));
            result.Add("Smackdown", r => r.HasBuff("Expose"));
            result.Add("Sentinel", r => !GameManager.LocalPlayer.HasBuff("Guard"));

            // Cast when-up
            result.Add("Power Link", r => true);
            result.Add("Defense Grid", r => true);
            result.Add("Emergency Reserves", r => true);

            // TANK?
            result.Add("Plasma Blast", r => r.CurrentTarget != null && r.CurrentTarget.Guid != GameManager.LocalPlayer.Guid);
            result.Add("Atomic Surge", r => InstanceManager.IsTank && r.CurrentTarget != null && r.CurrentTarget.Guid != GameManager.LocalPlayer.Guid);
            result.Add("Bum Rush", r => InstanceManager.IsTank || GameManager.LocalPlayer.HealthPercent < 70);
            result.Add("Tremor", r => r.GetSurrounding().Count() > 1);

            // Spenders
            result.Add("Rampage", r => GameManager.LocalPlayer.InnateResourcePercent >= 90);
            result.Add("Whirlwind", r => GameManager.LocalPlayer.InnateResourcePercent >= 90);
            result.Add("Expulsion", r => GameManager.LocalPlayer.Buffs.Where(b => b.IsHarmful).Count() >= 1);
            result.Add("Bolstering Strike", r => GameManager.LocalPlayer.InnateResource > 250 && InstanceManager.Party.Average(s => s.HealthPercent) < 50);
            result.Add("Jolt", r => GameManager.LocalPlayer.InnateResource > 90 && GameManager.LocalPlayer.InnateResourcePercent >= 90);
            result.Add("Plasma Wall", r => GameManager.LocalPlayer.InnateResource > 90 && GameManager.LocalPlayer.InnateResourcePercent >= 90);
            result.Add("Ripsaw", r => r.GetSurrounding().Count() > 1);

            // Builders
            result.Add("Menacing Strike", r => GameManager.LocalPlayer.InnateResourcePercent < 90 && GameManager.LocalPlayer.HealthPercent < 70);
            result.Add("Breaching Strikes", r => GameManager.LocalPlayer.InnateResourcePercent < 90 && GameManager.LocalPlayer.InnateResourcePercent < 90);
            result.Add("Relentless Strikes", r => GameManager.LocalPlayer.InnateResourcePercent < 90);

            return(result);
        }
Пример #11
0
        public override AbilityPriority CreateHeal()
        {
            var result = new AbilityPriority();

            result.Add("Runic Healing", r => GameManager.LocalPlayer.Mana >= 40 && r.HealthPercent < Settings.RunicHealingHPPercent);
            result.Add("Runes of Protection", r => GameManager.LocalPlayer.Mana >= 34 && InstanceManager.Party.Average(s => s.ShieldPercent) < Settings.RunesOfProtectionSPPercent);
            result.Add("Vitality Burst", r => GameManager.LocalPlayer.Mana >= 12 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.VitalityBurstHPPercent);
            result.Add("Astral Infusion", r => GameManager.LocalPlayer.Mana >= 52 && GameManager.LocalPlayer.HealthPercent < Settings.AstralInfusionHPPercent);
            result.Add("Healing Salve", r => GameManager.LocalPlayer.Mana >= 20 && !GameManager.LocalPlayer.HasBuff("Healing Salve"));
            result.Add("Dual Fire", r => GameManager.LocalPlayer.Mana >= 16 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.DualFireHPPercent);
            result.Add("Healing Torrent", r => GameManager.LocalPlayer.Mana >= 31 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.HealingTorrentHPPercent);
            result.Add("Voidspring", r => GameManager.LocalPlayer.Mana >= 27 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.VoidSpringHPPercent);
            result.Add("Regenerative Pulse", r => GameManager.LocalPlayer.Mana >= 33 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.RegenerativePulseHPPercent);
            result.Add("Sustain", r => GameManager.LocalPlayer.Mana >= 30 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.SustainHPPercent);

            return(result);
        }
Пример #12
0
        public override AbilityPriority CreateHeal()
        {
            var result = new AbilityPriority();

            result.Add("Emission", r => GameManager.LocalPlayer.InnateResource < 2);
            result.Add("Crisis Wave", r => GameManager.LocalPlayer.InnateResource >= 2 && GameManager.LocalPlayer.Mana >= 35 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.CrisisWaveHPPercent);
            result.Add("Dual Shock", r => GameManager.LocalPlayer.Mana >= 35 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.DualShockHPPercent);
            result.Add("Mending Probes", r => GameManager.LocalPlayer.Mana >= 18 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.MendingProbesHPPercent);
            result.Add("Triage", r => GameManager.LocalPlayer.Mana >= 20 && InstanceManager.Party.OrderBy(s => s.HealthPercent).FirstOrDefault().HealthPercent < Settings.TriageHPPercent && InstanceManager.Party.OrderBy(s => s.ShieldPercent).FirstOrDefault().ShieldPercent < Settings.TriageSPPercent);
            result.Add("Flash", r => GameManager.LocalPlayer.Mana >= 28 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.FlashHPPercent);
            result.Add("Barrier", r => GameManager.LocalPlayer.Mana >= 86 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.BarrierHPPercent && InstanceManager.Party.Average(s => s.ShieldPercent) < Settings.BarrierSPPercent);
            result.Add("Rejuvenator", r => GameManager.LocalPlayer.Mana >= 30 && InstanceManager.Party.Average(s => s.HealthPercent) < Settings.RejuvenatorHPPercent);
            result.Add("Shield Surge", r => GameManager.LocalPlayer.Mana >= 41 && GameManager.LocalPlayer.InnateResource >= 2 && InstanceManager.Party.Average(s => s.ShieldPercent) < Settings.ShieldSurgeSPPercent);
            result.Add("Extricate", r => GameManager.LocalPlayer.Mana >= 46 && GameManager.LocalPlayer.HealthPercent < Settings.ExtricateHPPercent);
            result.Add("Field Probes", r => GameManager.LocalPlayer.HasBuff("Beacon") && InstanceManager.Party.Average(s => s.HealthPercent) < 50);

            return(result);
        }
Пример #13
0
        private void Setup()
        {
            forcePause              = true;
            doCloseButton           = false;
            doCloseX                = true;
            absorbInputAroundWindow = true;
            closeOnClickedOutside   = true;
            soundAppear             = SoundDefOf.InfoCard_Open;
            soundClose              = SoundDefOf.InfoCard_Close;

            var abilities = pawn.PsiTracker().Abilities.Where(ability => ability.Def.Autocastable).ToList();

            curAbility = abilities.First();

            RebuildTabCache();
            RebuildConditionCache();

            lastAutocastSetting = curAbility.Autocast;
            lastPrioritySetting = curAbility.Priority;
            lastConditionsCount = curAbility.AutocastConditions.Count;
        }
Пример #14
0
 public override void DeserializeAsset(AssetFile assetFile, StreamReader stream)
 {
     m_toolTip = stream.ReadString32();
     m_debugUnlocalizedTooltip     = stream.ReadString32();
     m_savedStatusTypesForTooltips = new SerializedVector <StatusType>(assetFile, stream);
     m_shortToolTip   = stream.ReadString32();
     m_rewardString   = stream.ReadString32();
     m_sequencePrefab = new SerializedComponent(assetFile, stream);
     m_abilityName    = stream.ReadString32();
     m_flavorText     = stream.ReadString32();
     m_ultimate       = stream.ReadBoolean();
     stream.AlignTo();
     m_previewVideo = stream.ReadString32();
     m_expectedSequencePrefixForEditor = stream.ReadString32();
     m_cooldown                = stream.ReadInt32();
     m_maxStocks               = stream.ReadInt32();
     m_stockRefreshDuration    = stream.ReadInt32();
     m_refillAllStockOnRefresh = stream.ReadBoolean();
     stream.AlignTo();
     m_initialStockAmount       = stream.ReadInt32();
     m_stockConsumedOnCast      = stream.ReadInt32();
     m_abilityManagedStockCount = stream.ReadBoolean();
     stream.AlignTo();
     m_runPriority = (AbilityPriority)stream.ReadInt32();
     m_freeAction  = stream.ReadBoolean();
     stream.AlignTo();
     m_techPointsCost         = stream.ReadInt32();
     m_techPointInteractions  = new SerializedVector <TechPointInteraction>(assetFile, stream);
     m_actionAnimType         = (ActorModelData.ActionAnimationType)stream.ReadInt32();
     m_rotationVisibilityMode = (RotationVisibilityMode)stream.ReadInt32();
     m_movementAdjustment     = (MovementAdjustment)stream.ReadInt32();
     m_movementSpeed          = stream.ReadSingle();
     m_movementDuration       = stream.ReadSingle();
     m_cameraBoundsMinHeight  = stream.ReadSingle();
     m_targetData             = new SerializedArray <TargetData>(assetFile, stream);
     m_tags = new SerializedVector <AbilityTags>(assetFile, stream);
     m_statusWhenRequested   = new SerializedVector <StatusType>(assetFile, stream);
     m_chainAbilities        = new SerializedVector <SerializedMonoBehaviour>(assetFile, stream);
     m_targeterTemplateSwaps = new SerializedVector <TargeterTemplateSwapData>(assetFile, stream);
 }
Пример #15
0
        public override AbilityPriority CreateHeal()
        {
            var result = new AbilityPriority();

            // High Priority / Buff Management
            result.Add("Phantasmal Armor", r => (InstanceManager.Tank != null ? InstanceManager.Tank.HealthPercent : GameManager.LocalPlayer.HealthPercent) < Settings.PhantasmalArmorHP);
            result.Add("Catharsis", r => GameManager.LocalPlayer.HealthPercent <Settings.CatharsisHP && InstanceManager.CleanseTarget.Buffs.Count> Settings.CatharsisBuff, async cast =>
            {
                var Target = InstanceManager.CleanseTarget;

                if (Omnibus.WindowSettings.EnableMovement)
                {
                    Target.Face();
                }

                return(await SpellCastBehaviors.CastSimple("Catharsis", () => Target, awaitCastFinished: true));
            });

            // Medium Priority / Psi Point Specific
            result.Add("Mental Boon", r => GameManager.LocalPlayer.InnateResource == 5 && GameManager.LocalPlayer.HealthPercent < Settings.MentalBoonHP);
            result.Add("Reverie", r => InstanceManager.AveragePartyHealth < Settings.ReverieHP && GameManager.LocalPlayer.InnateResource == 5);
            result.Add("Mending Banner", r => InstanceManager.AveragePartyHealth < Settings.MendingBannerHP && GameManager.LocalPlayer.InnateResource == 5);

            // Medium Low Priority / Health Percentage
            result.Add("Projected Spirit", r => InstanceManager.AveragePartyHealth > Settings.ProjectedSpiritHP);

            // Low Priority / Psi Point Builders
            result.Add("Meditate", r => GameManager.LocalPlayer.InnateResource < 5 && GameManager.LocalPlayer.HealthPercent <= Settings.MeditateHP);
            result.Add("Pyrokinetic Flame", r => InstanceManager.AveragePartyHealth < Settings.PyrokineticFlameHP && GameManager.LocalPlayer.InnateResource < 5);
            result.Add("Warden", r => GameManager.LocalPlayer.InnateResource < 5 && (GameManager.LocalPlayer.HealthPercent < Settings.WardenHP || InstanceManager.AveragePartyHealth < Settings.WardenAllyHP));
            result.Add("Mirage", r => GameManager.LocalPlayer.InnateResource < 5 && GameManager.LocalPlayer.HealthPercent < Settings.MirageHP);
            result.Add("Soothe", r => GameManager.LocalPlayer.InnateResource < 5 && GameManager.LocalPlayer.HealthPercent < Settings.SootheHP);
            result.Add("Bolster", r => GameManager.LocalPlayer.InnateResource < 5 && GameManager.LocalPlayer.HealthPercent < Settings.BolsterHP);
            result.Add("Mind Over Body", r => GameManager.LocalPlayer.InnateResource < 5 && GameManager.LocalPlayer.HealthPercent < Settings.MindOverBodyHP);

            return(result);
        }
Пример #16
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            // Spell interrupting
            result.Add("Magnetic Lockdown", r => r.IsCasting);
            result.Add("Paralytic Surge", r => r.IsCasting);

            // Cleansing
            result.Add("Dematerialize", r => r.Buffs.Count(s => s.IsBeneficial) > 1);
            result.Add("Calm", r => GameManager.LocalPlayer.HasCleansableCC());
            result.Add("Antidote", r => GameManager.LocalPlayer.Mana > 24 && GameManager.LocalPlayer.HealthPercent < 50 && GameManager.LocalPlayer.Buffs.Count(s => s.IsHarmful) > 1);

            // Buff application
            result.Add("Fissure", r => !r.HasBuff("Expose"));
            result.Add("Protection Probes", r => !GameManager.LocalPlayer.HasBuff("Defense"));
            result.Add("Empowering Probes", r => !GameManager.LocalPlayer.HasBuff("Empower"));

            // Cast when-up / health percentage
            result.Add("Collider", r => r.HealthPercent < 30);
            result.Add("Nullifier", r => true);
            result.Add("Devastator Probes", r => true);
            result.Add("Annihilation", r => true);
            result.Add("Urgency", r => true);
            result.Add("Restrictor", r => true);

            // Spenders
            result.Add("Gamma Rays", r => GameManager.LocalPlayer.InnateResource >= 2);
            result.Add("Quantum Cascade", r => GameManager.LocalPlayer.InnateResource >= 2);

            // Chargers
            result.Add("Discharge", r => GameManager.LocalPlayer.InnateResource < 2);
            result.Add("Atomize", r => GameManager.LocalPlayer.InnateResource < 2);
            result.Add("Recharge", r => GameManager.LocalPlayer.Mana < 80);

            return(result);
        }
Пример #17
0
        public override AbilityPriority CreateHeal()
        {
            var result = new AbilityPriority();

            return(result);
        }
Пример #18
0
        public override void DoWindowContents(Rect inRect)
        {
            if (Event.current.type == EventType.Layout)
            {
                return;
            }

            // Deal with all the things that have changed //
            if (conditionsToRemove.Count != 0)
            {
                conditionsToRemove.ForEach(condition => curAbility.AutocastConditions.Remove(condition));
                conditionsToRemove.Clear();
            }

            if (lastAutocastSetting != curAbility.Autocast || lastPrioritySetting != curAbility.Priority)
            {
                RebuildTabCache();
                lastAutocastSetting = curAbility.Autocast;
                lastPrioritySetting = curAbility.Priority;
            }

            if (lastConditionsCount != curAbility.AutocastConditions.Count)
            {
                RebuildConditionCache();
                lastConditionsCount = curAbility.AutocastConditions.Count;
            }

            // Draw gizmo hide toggle //
            Text.Font = GameFont.Medium;

            Widgets.Label(new Rect(inRect.x + 10f, inRect.y + 10f, 285f, TopBarHeight), HideAutocastToggleGizmoKey.Translate());
            Widgets.Checkbox(inRect.x + 300f, inRect.y + 10f + (TopBarHeight - AutocastCheckSize) / 2, ref pawn.PsiTracker().HideAutocastToggleGizmo);

            // Draw menu and tabs //
            Text.Font = GameFont.Small;

            var tabBox = new Rect(inRect.x, inRect.y + 50f, inRect.width, inRect.height - 50f);

            tabBox.yMin += TabVerticalOffset;
            var drawBox = tabBox.ContractedBy(10f);

            Widgets.DrawMenuSection(tabBox);
            TabDrawer.DrawTabs(tabBox, tabs);

            // First vertical section - autocast toggle and priority select //
            var xAnchor = drawBox.x;
            var yAnchor = drawBox.y;

            Text.Font   = GameFont.Medium;
            Text.Anchor = TextAnchor.MiddleCenter;

            // Autocast label & checkbox - left side
            Widgets.Label(new Rect(xAnchor, yAnchor, AutocastLabelWidth, TopBarHeight), AutocastLabelKey.Translate());
            xAnchor += AutocastLabelWidth + XSeparation;
            Widgets.Checkbox(xAnchor, yAnchor + (TopBarHeight - AutocastCheckSize) / 2, ref curAbility.Autocast);

            // Priority label & dropdown - right side
            Widgets.Label(new Rect(drawBox.xMax - PriorityLabelWidth, yAnchor, PriorityLabelWidth, TopBarHeight), PriorityLabelKey.Translate());
            Widgets.Dropdown(new Rect(drawBox.xMax - 2 * PriorityLabelWidth, yAnchor, PriorityLabelWidth, TopBarHeight), curAbility.Priority,
                             priority => priority.ToString(), priority => GeneratePriorityOptions(curAbility),
                             LocalizePriority(curAbility.Priority));

            Text.Font   = GameFont.Small;
            Text.Anchor = TextAnchor.UpperLeft;

            // Conditions and Filters prep
            yAnchor += TopBarHeight + YSeparation;
            var subMenuWidth  = (drawBox.width - XSeparation) / 2;
            var subMenuHeight = drawBox.height - (TopBarHeight + YSeparation);

            var conditionsBox = new Rect(drawBox.x, yAnchor, subMenuWidth + ConditionsRebalanceWidth, subMenuHeight);
            var filterBox     = new Rect(drawBox.x + subMenuWidth + ConditionsRebalanceWidth + XSeparation, yAnchor,
                                         subMenuWidth - ConditionsRebalanceWidth, subMenuHeight);

            Widgets.DrawMenuSection(conditionsBox);
            Widgets.DrawMenuSection(filterBox);

            // Conditions box //
            var condBoxCont = conditionsBox.ContractedBy(5f);

            xAnchor = condBoxCont.x;
            yAnchor = condBoxCont.y;

            Text.Anchor = TextAnchor.MiddleLeft;

            Widgets.Label(new Rect(xAnchor, yAnchor, condBoxCont.width, BoxTitleHeight), AutocastConditionsKey.Translate());

            // Add condition button
            if (Widgets.ButtonText(new Rect(condBoxCont.xMax - AddConditionButtonWidth, yAnchor, AddConditionButtonWidth, BoxTitleHeight), AddAutocastCondition.Translate()))
            {
                var options = new List <FloatMenuOption>();
                foreach (var condition in conditionsForAdd)
                {
                    options.Add(GenerateAutocastConditionOption(condition));
                }

                if (!options.NullOrEmpty())
                {
                    Find.WindowStack.Add(new FloatMenu(options));
                }
            }

            yAnchor    += BoxTitleHeight + YSeparation;
            Text.Anchor = TextAnchor.UpperLeft;

            // Find the total needed height and available height, see if we need to draw a scroll bar
            var needed    = curAbility.AutocastConditions.Sum(condition => condition.Height + YSeparation);
            var available = condBoxCont.height - (BoxTitleHeight + YSeparation);

            if (needed > available)   // Need to draw a scrollbar
            {
                var outRect      = new Rect(xAnchor, yAnchor, condBoxCont.width, available);
                var viewRect     = new Rect(0, 0, condBoxCont.width - 16f, needed);
                var scrollAnchor = 0f;
                Widgets.BeginScrollView(outRect, ref scrollPosition, viewRect);
                foreach (var condition in curAbility.AutocastConditions)
                {
                    var height = condition.Height;
                    condition.Draw(new Rect(0, scrollAnchor, condBoxCont.width - 21f, height), this);
                    scrollAnchor += height + YSeparation;
                }
                Widgets.EndScrollView();
            }
            else   // No need to draw a scrollbar
            {
                foreach (var condition in curAbility.AutocastConditions)
                {
                    var height = condition.Height;
                    condition.Draw(new Rect(xAnchor, yAnchor, condBoxCont.width, height), this);
                    yAnchor += height + YSeparation;
                }
            }

            // Filter box //
            var filterBoxCont = filterBox.ContractedBy(5f);

            xAnchor = filterBoxCont.x;
            yAnchor = filterBoxCont.y;

            Text.Anchor = TextAnchor.MiddleLeft;

            Widgets.Label(new Rect(xAnchor, yAnchor, condBoxCont.width, BoxTitleHeight), AutocastFilterKey.Translate());
            yAnchor += BoxTitleHeight + YSeparation;

            var filterDrawBox = new Rect(xAnchor, yAnchor, filterBoxCont.width, filterBoxCont.height - BoxTitleHeight - YSeparation);

            curAbility.AutocastFilter.Draw(filterDrawBox);

            Text.Anchor = TextAnchor.UpperLeft;
        }
Пример #19
0
 public void UnknownMethod(AbilityPriority _param1)
 {
 }
Пример #20
0
 public AbilityResolver_TrickShot(ActorData actor, Ability ability, AbilityPriority priority, ActorTargeting.AbilityRequestData abilityRequestData)
     : base(actor, ability, priority, abilityRequestData)
 {
 }
Пример #21
0
 public override void Deserialize(NetworkReader reader)
 {
     CurrentTurnIndex              = reader.ReadInt32();
     CurrentAbilityPhase           = (AbilityPriority)reader.ReadSByte();
     NumResolutionActionsThisPhase = reader.ReadSByte();
 }
Пример #22
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            // Spell interrupting
            result.Add("Gate", r => r.IsCasting && GameManager.LocalPlayer.InnateResource <= 1);
            result.Add("Flash Freeze", r => r.IsCasting);
            result.Add("Chill", r => r.IsCasting);
            result.Add("Arcane Shock", r => r.IsCasting);
            #region Spatial Shift
            result.Add("Spatial Shift", r =>
            {
                if (r != null)
                {
                    Actor Target = r;

                    return(Target.IsCasting && (GameManager.LocalPlayer.InnateResource == 1 || GameManager.LocalPlayer.InnateResource >= 2 && (CanCast("Gate") || CanCast("Arcane Shock"))));
                }
                return(false);
            });
            #endregion
            // Cleansing
            result.Add("Void Slip", r => GameManager.LocalPlayer.HasCleansableCC());
            result.Add("Purify", r => GameManager.LocalPlayer.Mana >= 15 && GameManager.LocalPlayer.HealthPercent < Settings.PurifyHPPercent && GameManager.LocalPlayer.Buffs.Count(s => s.IsHarmful) >= 1);

            // Buff application
            result.Add("Void Pact", r => !GameManager.LocalPlayer.HasBuff("Empower"));
            result.Add("Phase Shift", r => !GameManager.LocalPlayer.HasBuff("Defense"));

            // Special
            result.Add("Gather Focus", r => GameManager.LocalPlayer.Mana < 100);
            result.Add("Affinity", r => InstanceManager.LowestHealth.HealthPercent < Settings.AffinityHPPercent);

            // Builder & spenders
            #region Spell surge

            // Build reliant Spell Surge
            result.Add("Ignite",
                       r =>
            {
                if (r != null)
                {
                    Actor Target = r;
                    var Ignite   = GetSpell("Ignite");
                    return(Ignite != null && Ignite.CanCast && (Ignite.Ability.TierIndex <= 8 && !Target.HasBuff("Ignite") || Ignite.Ability.TierIndex == 8));
                }

                return(false);
            }, async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Ignite");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Quick Draw",
                       r =>
            {
                if (r != null)
                {
                    Actor Target  = r;
                    var QuickDraw = GetSpell("Quick Draw");
                    return(QuickDraw != null && QuickDraw.CanCast && Target.HealthPercent < 30 && GameManager.LocalPlayer.Mana >= 50);
                }

                return(false);
            },
                       async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Quick Draw");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Flame Burst",
                       r =>
            {
                if (r != null)
                {
                    Actor Target   = r;
                    var FlameBurst = GetSpell("Flame Burst");
                    return(FlameBurst != null && FlameBurst.CanCast && (FlameBurst.Ability.TierIndex == 8 && Target.HasBuff("Ignite") || FlameBurst.Ability.TierIndex < 8));
                }

                return(false);
            },
                       async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Flame Burst");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Assassinate",
                       r =>
            {
                if (r != null)
                {
                    Actor Target    = r;
                    var Assassinate = GetSpell("Assassinate");
                    return(Assassinate != null && Assassinate.CanCast && (Target.HealthPercent >= 30 && GameManager.LocalPlayer.Mana > 25 || Target.HealthPercent < 30));
                }

                return(false);
            },
                       async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Assassinate");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });

            // "Spam" Spell Surge
            result.Add("Wild Barrage", r => true, async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Wild Barrage");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Rapid Fire", r => true, async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Rapid Fire");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("True Shot", r => true, async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("True Shot");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Arcane Missiles", r => !r.HasBuff("Expose"), async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Arcane Missiles");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            result.Add("Charged Shot", r => true, async cast =>
            {
                await SpellCastBehaviors.CastSimple("Spell Surge");
                await SpellCastBehaviors.CastSimple("Charged Shot");

                return(await SpellCastBehaviors.CastSimple("Spell Surge"));
            });
            #endregion

            return(result);
        }
Пример #23
0
        private void HookSetAbilityPhase(AbilityPriority value)
        {
            Networkm_abilityPhase = value;
//            SynchronizeClientData();
        }
        public bool ResolveNextPhase()
        {
            bool lastPhase = false;

            TargetedActorsThisPhase = new Dictionary <ActorData, Dictionary <AbilityTooltipSymbol, int> >();
            ActionsThisPhase        = new List <ClientResolutionAction>();
            Animations = new List <ActorAnimation>();
            Barriers   = new List <Barrier>();

            var sab = Artemis.ArtemisServer.Get().SharedActionBuffer;

            if (Turn == null)
            {
                Turn = new Turn()
                {
                    TurnID = GameFlowData.Get().CurrentTurn
                };
                TargetedActorsThisTurn = new Dictionary <ActorData, Dictionary <AbilityTooltipSymbol, int> >();
                ActionsThisTurn        = new List <ClientResolutionAction>();
            }

            while (ActionsThisPhase.Count == 0)
            {
                AdvancePhase();
                if (Phase >= AbilityPriority.NumAbilityPriorities)
                {
                    Log.Info("Abilities resolved");
                    lastPhase = true;
                    break;
                }
                Log.Info($"Resolving {Phase} abilities");

                foreach (ActorData actor in GameFlowData.Get().GetActors())
                {
                    GameFlowData.Get().activeOwnedActorData = actor;
                    ResolveAbilities(actor, Phase);
                }
                GameFlowData.Get().activeOwnedActorData = null;

                Utils.Add(TargetedActorsThisTurn, TargetedActorsThisPhase);
            }

            sab.Networkm_abilityPhase = Phase; // TODO check this

            UpdateTheatricsPhase();

            if (lastPhase)
            {
                Turn = null;
                GameFlowData.Get().activeOwnedActorData = null;
                sab.Networkm_actionPhase  = ActionBufferPhase.AbilitiesWait;
                sab.Networkm_abilityPhase = AbilityPriority.Prep_Defense;
                Phase = AbilityPriority.INVALID;
                return(false);
            }

            SendToAll((short)MyMsgType.StartResolutionPhase, new StartResolutionPhase()
            {
                CurrentTurnIndex              = GameFlowData.Get().CurrentTurn,
                CurrentAbilityPhase           = Phase,
                NumResolutionActionsThisPhase = ActionsThisPhase.Count
            });

            SendActions();

            foreach (Barrier barrier in Barriers)
            {
                BarrierManager.Get().AddBarrier(barrier, true, out var _);
                // TODO AddBarrier updates ability blocking. Should we update vision/movement/cover?
            }

            // TODO process ClientResolutionManager.SendResolutionPhaseCompleted
            return(true);
        }
Пример #25
0
 public override void Deserialize(NetworkReader reader)
 {
     TurnIndex  = (int)reader.ReadPackedUInt32();
     PhaseIndex = (AbilityPriority)reader.ReadSByte();
 }
Пример #26
0
        public override AbilityPriority CreateCombat()
        {
            var result = new AbilityPriority();

            // Spell interrupt
            result.Add("Stagger", r => r.IsCasting);
            result.Add("False Retreat", r => r.IsCasting);
            result.Add("Pounce", r => r.IsCasting);
            result.Add("Tether Mine", r => r.IsCasting);
            result.Add("Collapse", r => r.IsCasting);

            // Buff application
            result.Add("Phlebotomize", r => GameManager.LocalPlayer.SuitPower >= 15 && !r.HasBuff("Wound"));
            result.Add("Reaver", r => !r.HasCC(CCStateType.Taunt));
            result.Add("Bloodthirst", r => !GameManager.LocalPlayer.HasBuff("Lifesteal"));
            result.Add("Preperation", r => !GameManager.LocalPlayer.HasBuff("Empower") && !GameManager.LocalPlayer.HasBuff("Defense"));
            result.Add("Decimate", r => !r.HasBuff("Weaken"));
            #region Concussive Kicks
            result.Add("Concussive Kicks", r =>
            {
                var punish = GetSpell("Punish");

                if (punish != null && punish.CooldownTimeRemaining.TotalMilliseconds < 2000)
                {
                    return(false);
                }

                return(!GameManager.LocalPlayer.HasBuff("Concussive Kicks - Cooldown") || GameManager.LocalPlayer.HasBuff("Concussive Kicks - Cooldown") && GameManager.LocalPlayer.SuitPower >= 15);
            });
            #endregion

            // Cast when-up
            //result.Add("Tactical Retreat", r => true); REMOVED
            result.Add("Whiplash", r => true);
            result.Add("Razor Storm", r => true);
            result.Add("Stim Drone", r => true);

            // Spenders
            result.Add("Neutralize", r => GameManager.LocalPlayer.SuitPower >= 15 && !GameManager.LocalPlayer.HasBuff("Neutralize"));
            result.Add("Punish", r => GameManager.LocalPlayer.SuitPower < 35 && !GameManager.LocalPlayer.HasBuff("Punish"));
            #region Shred
            result.Add("Shred", r =>
            {
                var impale = GetSpell("Impale");

                if (impale != null && impale.Ability.TierIndex >= 8)
                {
                    return(GameManager.LocalPlayer.SuitPower < 30);
                }

                return(GameManager.LocalPlayer.SuitPower <= 35);
            });
            #endregion
            #region Impale
            result.Add("Impale", r =>
            {
                var impale = GetSpell("Impale");

                if (impale != null && impale.Ability.TierIndex >= 8)
                {
                    return(GameManager.LocalPlayer.SuitPower >= 30);
                }

                return(GameManager.LocalPlayer.SuitPower >= 35);
            });
            #endregion
            result.Add("Clone", r => GameManager.LocalPlayer.SuitPower >= 25);
            result.Add("Analyze Weakness", r => GameManager.LocalPlayer.SuitPower >= 15);
            result.Add("Ruin", r => GameManager.LocalPlayer.SuitPower >= 10);
            result.Add("Cripple", r => GameManager.LocalPlayer.SuitPower >= 5 && GameManager.LocalPlayer.SuitPower >= 3);
            result.Add("Nano Field", r => GameManager.LocalPlayer.SuitPower >= 20);
            result.Add("Razor Disk", r => GameManager.LocalPlayer.SuitPower >= 20);
            result.Add("Nano Virus", r => GameManager.LocalPlayer.SuitPower >= 10);
            result.Add("Amplification Spike", r => GameManager.LocalPlayer.SuitPower >= 25);
            result.Add("Frenzy", r => GameManager.LocalPlayer.SuitPower >= 30);
            result.Add("Nano Dart", r => GameManager.LocalPlayer.SuitPower >= 10);

            // Builders
            result.Add("Steadfast", r => GameManager.LocalPlayer.SuitPower < 100 && !GameManager.LocalPlayer.HasBuff("Defense"));

            return(result);
        }
Пример #27
0
        internal void u001C(IBitStream _param1)
        {
            sbyte index1 = (sbyte)Index;

            _param1.Serialize(ref index1);
            Index = (AbilityPriority)index1;
            sbyte num1 = (sbyte)u000E.Count;
            bool  flag = _param1.isWriting &&
                         true; // TODO

//                        (u0006 || index1 < (sbyte) ServerClientUtils.GetCurrentAbilityPhase());
            if (_param1.isWriting && flag)
            {
                num1 = 0;
            }
            _param1.Serialize(ref num1);
            for (int index2 = 0; index2 < (int)num1; ++index2)
            {
                while (index2 >= u000E.Count)
                {
                    u000E.Add(new ActorAnimation(u000F));
                }
                u000E[index2].u000Du000E(_param1);
            }

            if (_param1.isWriting)
            {
                sbyte count = (sbyte)u0012.Count;
                _param1.Serialize(ref count);
                foreach (KeyValuePair <int, int> keyValuePair in u0012)
                {
                    sbyte key  = (sbyte)keyValuePair.Key;
                    short num2 = (short)keyValuePair.Value;
                    _param1.Serialize(ref key);
                    _param1.Serialize(ref num2);
                }
            }
            else
            {
                sbyte num2 = -1;
                _param1.Serialize(ref num2);
                u0012 = new Dictionary <int, int>();
                for (int index2 = 0; index2 < (int)num2; ++index2)
                {
                    sbyte invalidActorIndex = (sbyte)ActorData.s_invalidActorIndex;
                    short num3 = -1;
                    _param1.Serialize(ref invalidActorIndex);
                    _param1.Serialize(ref num3);
                    u0012.Add(invalidActorIndex, num3);
                }
            }

            if (index1 == 5)
            {
                if (_param1.isWriting)
                {
                    sbyte count = (sbyte)u0015.Count;
                    if (flag)
                    {
                        sbyte num2 = 0;
                        _param1.Serialize(ref num2);
                    }
                    else
                    {
                        _param1.Serialize(ref count);
                        foreach (KeyValuePair <int, int> keyValuePair in u0015)
                        {
                            sbyte key  = (sbyte)keyValuePair.Key;
                            sbyte num2 = (sbyte)keyValuePair.Value;
                            _param1.Serialize(ref key);
                            _param1.Serialize(ref num2);
                        }
                    }
                }
                else
                {
                    sbyte num2 = -1;
                    _param1.Serialize(ref num2);
                    u0015 = new Dictionary <int, int>();
                    for (int index2 = 0; index2 < (int)num2; ++index2)
                    {
                        sbyte invalidActorIndex = (sbyte)ActorData.s_invalidActorIndex;
                        sbyte num3 = -1;
                        _param1.Serialize(ref invalidActorIndex);
                        _param1.Serialize(ref num3);
                        u0015.Add(invalidActorIndex, num3);
                    }
                }
            }

            if (_param1.isWriting)
            {
                sbyte count = (sbyte)u0016.Count;
                _param1.Serialize(ref count);
                for (sbyte index2 = 0; (int)index2 < (int)count; ++index2)
                {
                    sbyte num2 = (sbyte)u0016[index2];
                    _param1.Serialize(ref num2);
                }
            }
            else
            {
                sbyte num2 = -1;
                _param1.Serialize(ref num2);
                u0016 = new List <int>();
                for (sbyte index2 = 0; (int)index2 < (int)num2; ++index2)
                {
                    sbyte num3 = -1;
                    _param1.Serialize(ref num3);
                    u0016.Add(num3);
                }
            }
        }
Пример #28
0
 public override void DeserializeAsset(AssetFile assetFile, StreamReader stream)
 {
     m_abilityScopeId  = stream.ReadInt32();
     m_name            = stream.ReadString32();
     m_availableInGame = stream.ReadBoolean();
     stream.AlignTo();
     m_gameTypeReq  = (AbilityModGameTypeReq)stream.ReadInt32();
     m_equipCost    = stream.ReadInt32();
     m_defaultEquip = stream.ReadBoolean();
     stream.AlignTo();
     m_tooltip    = stream.ReadString32();
     m_flavorText = stream.ReadString32();
     m_debugUnlocalizedTooltip     = stream.ReadString32();
     m_savedStatusTypesForTooltips = new SerializedVector <StatusType>(assetFile, stream);
     m_iconSprite             = new SerializedComponent(assetFile, stream);
     m_useRunPriorityOverride = stream.ReadBoolean();
     stream.AlignTo();
     m_runPriorityOverride        = (AbilityPriority)stream.ReadInt32();
     m_techPointCostMod           = new AbilityModPropertyInt(assetFile, stream);
     m_maxCooldownMod             = new AbilityModPropertyInt(assetFile, stream);
     m_maxStocksMod               = new AbilityModPropertyInt(assetFile, stream);
     m_stockRefreshDurationMod    = new AbilityModPropertyInt(assetFile, stream);
     m_refillAllStockOnRefreshMod = new AbilityModPropertyBool(assetFile, stream);
     m_isFreeActionMod            = new AbilityModPropertyBool(assetFile, stream);
     m_autoQueueIfValidMod        = new AbilityModPropertyBool(assetFile, stream);
     m_targetDataMaxRangeMod      = new AbilityModPropertyFloat(assetFile, stream);
     m_targetDataMinRangeMod      = new AbilityModPropertyFloat(assetFile, stream);
     m_targetDataCheckLosMod      = new AbilityModPropertyBool(assetFile, stream);
     m_useTargetDataOverrides     = stream.ReadBoolean();
     stream.AlignTo();
     m_targetDataOverrides       = new SerializedArray <TargetData>(assetFile, stream);
     m_techPointInteractionMods  = new SerializedArray <TechPointInteractionMod>(assetFile, stream);
     m_useActionAnimTypeOverride = stream.ReadBoolean();
     stream.AlignTo();
     m_actionAnimTypeOverride        = (ActorModelData.ActionAnimationType)stream.ReadInt32();
     m_useMovementAdjustmentOverride = stream.ReadBoolean();
     stream.AlignTo();
     m_movementAdjustmentOverride     = (Ability.MovementAdjustment)stream.ReadInt32();
     m_effectToSelfOnCast             = new StandardEffectInfo(assetFile, stream);
     m_effectToTargetEnemyOnHit       = new StandardEffectInfo(assetFile, stream);
     m_effectToTargetAllyOnHit        = new StandardEffectInfo(assetFile, stream);
     m_useAllyEffectForTargetedCaster = stream.ReadBoolean();
     stream.AlignTo();
     m_effectTriggerChance = stream.ReadSingle();
     m_effectTriggerChanceMultipliedPerHit = stream.ReadBoolean();
     stream.AlignTo();
     m_cooldownReductionsOnSelf    = new AbilityModCooldownReduction(assetFile, stream);
     m_selfHitTimingSequencePrefab = new SerializedComponent(assetFile, stream);
     m_chainAbilityModInfo         = new SerializedVector <ChainAbilityAdditionalModInfo>(assetFile, stream);
     m_useChainAbilityOverrides    = stream.ReadBoolean();
     stream.AlignTo();
     m_chainAbilityOverrides          = new SerializedVector <SerializedMonoBehaviour>(assetFile, stream).ToChildArray <Ability>();
     m_tagsModType                    = (TagOverrideType)stream.ReadInt32();
     m_abilityTagsInMod               = new SerializedVector <AbilityTags>(assetFile, stream);
     m_statModsWhileEquipped          = new SerializedArray <AbilityStatMod>(assetFile, stream);
     m_useStatusWhenRequestedOverride = stream.ReadBoolean();
     stream.AlignTo();
     m_statusWhenRequestedOverride = new SerializedVector <StatusType>(assetFile, stream);
     beginningOfModSpecificData    = stream.ReadBoolean();
     stream.AlignTo();
 }