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)); }
public override void Deserialize(NetworkReader reader) { AbilityPhase = (AbilityPriority)reader.ReadSByte(); ActorIndex = reader.ReadInt32(); AsFailsafe = reader.ReadBoolean(); AsResend = reader.ReadBoolean(); }
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); } }
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); }
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); }
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)); }
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); }
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); }
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); }
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; }
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); }
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); }
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); }
public override AbilityPriority CreateHeal() { var result = new AbilityPriority(); return(result); }
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; }
public void UnknownMethod(AbilityPriority _param1) { }
public AbilityResolver_TrickShot(ActorData actor, Ability ability, AbilityPriority priority, ActorTargeting.AbilityRequestData abilityRequestData) : base(actor, ability, priority, abilityRequestData) { }
public override void Deserialize(NetworkReader reader) { CurrentTurnIndex = reader.ReadInt32(); CurrentAbilityPhase = (AbilityPriority)reader.ReadSByte(); NumResolutionActionsThisPhase = reader.ReadSByte(); }
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); }
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); }
public override void Deserialize(NetworkReader reader) { TurnIndex = (int)reader.ReadPackedUInt32(); PhaseIndex = (AbilityPriority)reader.ReadSByte(); }
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); }
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); } } }
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(); }