예제 #1
0
        public override void End(ActionUsingNode node)
        {
            base.End(node);
            _vitalStat = null;
            var tr = node.ActionEvent.Action.Entity.Get <TransformComponent>();

            if (tr != null)
            {
                ItemPool.Despawn(tr.gameObject);
                node.ActionEvent.Action.Entity.Remove(tr);
                node.ActionEvent.Action.Entity.Remove <RenderingComponent>();
            }
            var blockDamage = node.Entity.Get <BlockDamage>();

            if (blockDamage != null)
            {
                if (_isWaiting)
                {
                    blockDamage.DamageBlockers.Remove(BlockDamageFlat);
                }
                else
                {
                    blockDamage.CollisionHandlers.Remove(EvadeDamageWithStats);
                }
            }
        }
예제 #2
0
 public void Clear()
 {
     ClearMods();
     _dict.Clear();
     _vitals.Clear();
     HealthStat = null;
 }
예제 #3
0
        public override void Start(ActionUsingNode node)
        {
            base.Start(node);
            var model = ItemPool.Spawn(UnityDirs.Models, ModelData, Vector3.zero, Quaternion.identity);

            if (model != null)
            {
                node.ParentSpawn(model.Transform);
                node.ActionEvent.Action.Entity.Add(new RenderingComponent(model.GetComponent <IRenderingComponent>()));
                node.ActionEvent.Action.Entity.Add(new TransformComponent(model.transform));
            }
            var dmgComponent = node.Entity.GetOrAdd <BlockDamage>();

            if (!node.Entity.Tags.Contain(EntityTags.Player))
            {
                dmgComponent.DamageBlockers.Add(BlockDamageFlat);
                _isWaiting = true;
                _vitalStat = null;
                return;
            }
            _vitalStat = node.Stats.GetVital(TargetVital);
            var skillMulti = 1f;

            if (!string.IsNullOrEmpty(_skill))
            {
                var skillValue = node.Entity.FindStatValue(_skill);
                skillMulti = Mathf.Clamp(1 - (skillValue * CostVital.SkillPercent), CostVital.SkillMaxReduction, 1);
            }
            dmgComponent.CollisionHandlers.Add(EvadeDamageWithStats);
            _fxComponent = node.ActionEvent.Action.Fx;
            _finalCost   = Cost * skillMulti;
        }
예제 #4
0
        public static void SetupVitalStats(StatsContainer stats)
        {
            var owner = stats.GetEntity();

            for (int i = 0; i < GameData.Vitals.Count; i++)
            {
                var vital = new VitalStat(owner, GameData.Vitals.Names[i], GameData.Vitals.GetID(i), GameData.Vitals.GetAssociatedValue(i), GameData.Vitals.GetValue <float>(i, "Recovery"));
                stats.Add(vital);
            }
        }
예제 #5
0
        public static void SetupVitalStats(StatsContainer stats)
        {
            var owner = stats.GetEntity();

            for (int i = 0; i < Vitals.Count; i++)
            {
                var vital = new VitalStat(owner, Vitals.GetNameAt(i), Vitals.GetID(i), Vitals.GetStartingValue(i), Vitals.GetRecoveryValue(i));
                stats.Add(vital);
            }
            stats.SetMax();
        }
예제 #6
0
 public void Remove(BaseStat item)
 {
     List.Remove(item);
     _dict.Remove(item.ID);
     if (item is VitalStat vital)
     {
         if (item.ID == GameOptions.Get(RpgSettings.HealthStat, "Vitals.Health"))
         {
             HealthStat = null;
         }
         _vitals.Remove(vital.ID);
     }
 }
예제 #7
0
 public void Add(BaseStat item)
 {
     if (item == null || _dict.ContainsKey(item.ID))
     {
         return;
     }
     List.Add(item);
     _dict.Add(item.ID, item);
     if (item is VitalStat vital)
     {
         if (item.ID == GameOptions.Get(RpgSettings.HealthStat, "Vitals.Health"))
         {
             HealthStat = vital;
         }
         _vitals.Add(vital.ID, vital);
     }
 }
예제 #8
0
            public override void OnExit()
            {
                base.OnExit();
                _vitalStat = null;
                var tr = _actionEntity.Get <TransformComponent>();

                if (tr != null)
                {
                    ItemPool.Despawn(tr.gameObject);
                    _actionEntity.Remove(tr);
                    _actionEntity.Remove <RenderingComponent>();
                }
                if (_isWaiting)
                {
                    Graph.Entity.Remove <BlockDamageFlat>();
                }
                else
                {
                    Graph.Entity.Get <RuleEventListenerComponent>().Handlers.Remove(this);
                }
            }
예제 #9
0
            public override void OnEnter(RuntimeStateNode lastNode)
            {
                base.OnEnter(lastNode);
                var action = Graph.Entity.Get <CurrentAction>()?.Value;

                if (action == null)
                {
                    return;
                }
                _actionEntity = action.Entity;
                _owner        = Graph.Entity.GetTemplate <ActionUsingTemplate>();
                _config       = _actionEntity.Get <BlockDamageAction>();
                var model = ItemPool.Spawn(UnityDirs.Models, _config.ModelData, Vector3.zero, Quaternion.identity);

                if (model != null)
                {
                    var spawnPivot = _actionEntity.Get <SpawnPivotComponent>();
                    spawnPivot.SetNewChild(model.Transform);
                    _actionEntity.Add(new RenderingComponent(model.GetComponent <IRenderingComponent>()));
                    _actionEntity.Add(new TransformComponent(model.transform));
                }
                if (!Graph.Entity.Tags.Contain(EntityTags.Player))
                {
                    Graph.Entity.Add(new BlockDamageFlat());
                    _isWaiting = true;
                    _vitalStat = null;
                    return;
                }
                _vitalStat = _owner.Stats.GetVital(_config.TargetVital);
                var skillMulti = 1f;

                if (!string.IsNullOrEmpty(_config.Skill))
                {
                    var skillValue = _owner.Entity.FindStatValue(_config.Skill);
                    skillMulti = Mathf.Clamp(1 - (skillValue * CostVital.SkillPercent), CostVital.SkillMaxReduction, 1);
                }
                Graph.Entity.GetOrAdd <RuleEventListenerComponent>().Handlers.Add(this);
                _fxComponent = action.Fx?.Value;
                _finalCost   = _config.Cost * skillMulti;
            }
예제 #10
0
 public VitalStatCost(VitalStat stat, float amount)
 {
     _amount = amount;
     _stat   = new CachedStat <VitalStat>(stat);
 }
예제 #11
0
 private void FinishProcess(VitalStat v)
 {
     v.Current -= VitalAmount;
 }