void ITick.Tick(Actor self) { if (conditionManager == null) { return; } var activity = self.CurrentActivity as AttackMoveActivity; var attackActive = activity != null && !assaultMoving; var assaultActive = activity != null && assaultMoving; if (attackActive && attackMoveToken == ConditionManager.InvalidConditionToken && !string.IsNullOrEmpty(Info.AttackMoveScanCondition)) { attackMoveToken = conditionManager.GrantCondition(self, Info.AttackMoveScanCondition); } else if (!attackActive && attackMoveToken != ConditionManager.InvalidConditionToken) { attackMoveToken = conditionManager.RevokeCondition(self, attackMoveToken); } if (assaultActive && assaultMoveToken == ConditionManager.InvalidConditionToken && !string.IsNullOrEmpty(Info.AssaultMoveScanCondition)) { assaultMoveToken = conditionManager.GrantCondition(self, Info.AssaultMoveScanCondition); } else if (!assaultActive && assaultMoveToken != ConditionManager.InvalidConditionToken) { assaultMoveToken = conditionManager.RevokeCondition(self, assaultMoveToken); } }
/// <summary> /// 装载乘客 /// </summary> /// <param name="self"></param> /// <param name="a"></param> public void Load(Actor self, Actor a) { cargo.Push(a); var w = GetWeight(a); totalWeight += w; if (reserves.Contains(a)) { reservedWeight -= w; reserves.Remove(a); if (loadingToken != ConditionManager.InvalidConditionToken) { loadingToken = conditionManager.RevokeCondition(self, loadingToken); } } if (initialized) { foreach (var npe in self.TraitsImplementing <INotifyPassengerEntered>()) { npe.OnPassengerEntered(self, a); } } var p = a.Trait <Passenger>(); p.Transport = self; }
public void Forward(Actor self, Action onComplete) { if (conditionManager != null && !string.IsNullOrEmpty(info.Condition) && token == ConditionManager.InvalidConditionToken) { token = conditionManager.GrantCondition(self, info.Condition); } var wsb = wsbs.FirstEnabledTraitOrDefault(); if (wsb == null) { return; } wsb.PlayCustomAnimation(self, info.Sequence, () => { if (token != ConditionManager.InvalidConditionToken) { token = conditionManager.RevokeCondition(self, token); } onComplete(); }); }
void OnDeployStarted() { if (undeployedToken != ConditionManager.InvalidConditionToken) { undeployedToken = conditionManager.RevokeCondition(self, undeployedToken); } deployState = DeployState.Deploying; }
// This gets called by carrier after we touched down public virtual void Detached(Actor self) { if (!attached) { return; } attached = false; if (carriedToken != ConditionManager.InvalidConditionToken) { carriedToken = conditionManager.RevokeCondition(self, carriedToken); } }
void OnCruisingAltitudeLeft() { if (!cruising) { return; } cruising = false; if (conditionManager != null && cruisingToken != ConditionManager.InvalidConditionToken) { cruisingToken = conditionManager.RevokeCondition(self, cruisingToken); } }
void Revoke(Actor self) { if (token != ConditionManager.InvalidConditionToken) { token = conditionManager.RevokeCondition(self, token); } }
protected override void TraitDisabled(Actor self) { if (conditionToken == ConditionManager.InvalidConditionToken) { return; } conditionToken = conditionManager.RevokeCondition(self, conditionToken); }
void ITick.Tick(Actor self) { if (!IsTraitDisabled) { if (remainingTime > 0 && !isDocking) { remainingTime--; } if (Info.UncloakOn.HasFlag(UncloakType.Move) && (lastPos == null || lastPos.Value != self.Location)) { Uncloak(); lastPos = self.Location; } } var isCloaked = Cloaked; if (isCloaked && !wasCloaked) { if (conditionManager != null && cloakedToken == ConditionManager.InvalidConditionToken && !string.IsNullOrEmpty(Info.CloakedCondition)) { cloakedToken = conditionManager.GrantCondition(self, Info.CloakedCondition); } //Sounds shouldn't play if the actor starts cloaked. if (!(firstTick && Info.InitialDelay == 0) && !otherCloaks.Any(a => a.Cloaked)) { WarGame.Sound.Play(SoundType.World, Info.CloakSound, self.CenterPosition); } } else if (!isCloaked && wasCloaked) { if (cloakedToken != ConditionManager.InvalidConditionToken) { cloakedToken = conditionManager.RevokeCondition(self, cloakedToken); } if (!(firstTick && Info.InitialDelay == 0) && !otherCloaks.Any(a => a.Cloaked)) { WarGame.Sound.Play(SoundType.World, Info.UncloakSound, self.CenterPosition); } } wasCloaked = isCloaked; firstTick = false; }
/// <summary> /// Sets only the location ( fromCell,toCell,FromSubCell,ToSubCell) /// </summary> /// <param name="from"></param> /// <param name="fromSub"></param> /// <param name="to"></param> /// <param name="toSub"></param> public void SetLocation(CPos from, SubCell fromSub, CPos to, SubCell toSub) { if (FromCell == from && ToCell == to && FromSubCell == fromSub && ToSubCell == toSub) { return; } RemoveInfluence(); fromCell = from; toCell = to; FromSubCell = fromSub; ToSubCell = toSub; AddInfluence(); // Tunnel condition is added/removed when starting the transition between layers if (toCell.Layer == CustomMovementLayerType.Tunnel && conditionManager != null && !string.IsNullOrEmpty(Info.TunnelCondition) && tunnelToken == ConditionManager.InvalidConditionToken) { tunnelToken = conditionManager.GrantCondition(self, Info.TunnelCondition); } else if (toCell.Layer != CustomMovementLayerType.Tunnel && tunnelToken != ConditionManager.InvalidConditionToken) { tunnelToken = conditionManager.RevokeCondition(self, tunnelToken); } if (toCell.Layer == CustomMovementLayerType.Subterranean && fromCell.Layer != CustomMovementLayerType.Subterranean) { if (!string.IsNullOrEmpty(Info.SubterraneanTransitionSequence)) { self.World.AddFrameEndTask(w => w.Add(new SpriteEffect(self.World.Map.CenterOfCell(fromCell), self.World, Info.SubterraneanTransitionImage, Info.SubterraneanTransitionSequence, Info.SubterraneanTransitionPalette))); } if (!string.IsNullOrEmpty(Info.SubterraneanTransitionSound)) { WarGame.Sound.Play(SoundType.World, Info.SubterraneanTransitionSound); } } // Grant the jumpjet condition as soon as the actor starts leaving the ground layer // The condition is revoked from FinishedMoving if (toCell.Layer == CustomMovementLayerType.Jumpjet && conditionManager != null && !string.IsNullOrEmpty(Info.JumpjetCondition) && jumpjetToken == ConditionManager.InvalidConditionToken) { jumpjetToken = conditionManager.GrantCondition(self, Info.JumpjetCondition); } }
void ITick.Tick(Actor self) { //Stop charging when we lose our target charging &= self.CurrentActivity is SetTarget; var delta = charging ? info.ChargeRate : -info.DischargeRate; ChargeLevel = (ChargeLevel + delta).Clamp(0, info.ChargeLevel); if (ChargeLevel > 0 && conditionManager != null && !string.IsNullOrEmpty(info.ChargingCondition) && chargingToken == ConditionManager.InvalidConditionToken) { chargingToken = conditionManager.GrantCondition(self, info.ChargingCondition); } if (ChargeLevel == 0 && conditionManager != null && chargingToken != ConditionManager.InvalidConditionToken) { chargingToken = conditionManager.RevokeCondition(self, chargingToken); } }
public void PrerequisitesUpdated(Actor self, bool available) { if (available == wasAvailable || conditionManager == null) { return; } if (available && conditionToken == ConditionManager.InvalidConditionToken) { conditionToken = conditionManager.GrantCondition(self, info.Condition); } else if (!available && conditionToken != ConditionManager.InvalidConditionToken) { conditionToken = conditionManager.RevokeCondition(self, conditionToken); } wasAvailable = available; }
void ApplyStanceCondition(Actor self) { if (conditionManager == null) { return; } if (conditionToken != ConditionManager.InvalidConditionToken) { conditionToken = conditionManager.RevokeCondition(self, conditionToken); } string condition; if (Info.ConditionByStance.TryGetValue(stance, out condition)) { conditionToken = conditionManager.GrantCondition(self, condition); } }
void UpdateCondition(Actor self) { if (conditionManager == null || string.IsNullOrEmpty(Info.AmmoCondition)) { return; } while (currentAmmo > tokens.Count && tokens.Count < Info.Ammo) { tokens.Push(conditionManager.GrantCondition(self, Info.AmmoCondition)); } while (currentAmmo < tokens.Count && tokens.Count > 0) { conditionManager.RevokeCondition(self, tokens.Pop()); } }
void Update(Actor self) { if (conditionManager == null) { return; } validPowerState = !IsTraitDisabled && Info.ValidPowerStates.HasFlag(playerPower.PowerState); if (validPowerState && conditionToken == ConditionManager.InvalidConditionToken) { conditionToken = conditionManager.GrantCondition(self, Info.Condition); } else if (!validPowerState && conditionToken != ConditionManager.InvalidConditionToken) { conditionToken = conditionManager.RevokeCondition(self, conditionToken); } }
public int GrantCondition(Actor self, object source, int duration = 0) { if (!CanGrantCondition(self, source)) { return(ConditionManager.InvalidConditionToken); } var token = conditionManager.GrantCondition(self, Info.Condition); HashSet <int> permanent;//常驻 permanentTokens.TryGetValue(source, out permanent); if (duration > 0) { if (Info.SourceCap > 0) { var timedCount = timedTokens.Count(t => t.Source == source); if ((permanent != null ? permanent.Count + timedCount:timedCount) >= Info.SourceCap) { var expireIndex = timedTokens.FindIndex(t => t.Source == source); if (expireIndex >= 0) { var expireToken = timedTokens[expireIndex].Token; timedTokens.RemoveAt(expireIndex); if (conditionManager.TokenValid(self, expireToken)) { conditionManager.RevokeCondition(self, expireToken); } } } } if (Info.TotalCap > 0) { var totalCount = permanentTokens.Values.Sum(t => t.Count) + timedTokens.Count; if (totalCount >= Info.TotalCap) { if (timedTokens.Count > 0) { var expire = timedTokens[0].Token; if (conditionManager.TokenValid(self, expire)) { conditionManager.RevokeCondition(self, expire); } timedTokens.RemoveAt(0); } } } var timedToken = new TimedToken(token, self, source, duration); var index = timedTokens.FindIndex(t => t.Expires >= timedToken.Expires); if (index >= 0) { timedTokens.Insert(index, timedToken); } else { timedTokens.Add(timedToken); expires = timedToken.Expires; this.duration = duration; } } else if (permanent == null) { permanentTokens.Add(source, new HashSet <int> { token }); } else { permanent.Add(token); } return(token); }