示例#1
0
        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);
            }
        }
示例#2
0
文件: Cargo.cs 项目: hadow/Commander
        /// <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;
        }
示例#3
0
        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();
            });
        }
示例#4
0
        void OnDeployStarted()
        {
            if (undeployedToken != ConditionManager.InvalidConditionToken)
            {
                undeployedToken = conditionManager.RevokeCondition(self, undeployedToken);
            }

            deployState = DeployState.Deploying;
        }
示例#5
0
        // 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);
            }
        }
示例#6
0
        void OnCruisingAltitudeLeft()
        {
            if (!cruising)
            {
                return;
            }

            cruising = false;

            if (conditionManager != null && cruisingToken != ConditionManager.InvalidConditionToken)
            {
                cruisingToken = conditionManager.RevokeCondition(self, cruisingToken);
            }
        }
示例#7
0
 void Revoke(Actor self)
 {
     if (token != ConditionManager.InvalidConditionToken)
     {
         token = conditionManager.RevokeCondition(self, token);
     }
 }
示例#8
0
        protected override void TraitDisabled(Actor self)
        {
            if (conditionToken == ConditionManager.InvalidConditionToken)
            {
                return;
            }

            conditionToken = conditionManager.RevokeCondition(self, conditionToken);
        }
示例#9
0
        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;
        }
示例#10
0
        /// <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);
            }
        }
示例#11
0
        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;
        }
示例#13
0
        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);
            }
        }
示例#14
0
        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);
            }
        }
示例#16
0
        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);
        }