コード例 #1
0
ファイル: Creature.cs プロジェクト: svifylabs/dwarfcorp
            public override void Update(DwarfTime time, Creature creature)
            {
                float dt = (float)time.ElapsedGameTime.TotalSeconds;

                creature.Heal(dt * DamagePerSecond);

                base.Update(time, creature);
            }
コード例 #2
0
ファイル: OngoingHealBuff.cs プロジェクト: sodomon2/dwarfcorp
        public override void Update(DwarfTime time, Creature creature)
        {
            DamageTimer.Update(time);

            if (DamageTimer.HasTriggered)
            {
                creature.Heal(DamagePerSecond);
                creature.DrawLifeTimer.Reset();
                IndicatorManager.DrawIndicator((DamagePerSecond).ToString() + " HP",
                                               creature.Physics.Position, 1.0f,
                                               GameSettings.Current.Colors.GetColor("Positive", Microsoft.Xna.Framework.Color.Green));
            }

            base.Update(time, creature);
        }
コード例 #3
0
ファイル: SleepAct.cs プロジェクト: polytronicgr/dwarfcorp
        public override IEnumerable <Status> Run()
        {
            float startingHealth = Creature.Status.Health.CurrentValue;

            PreTeleport = Creature.AI.Position;
            if (Type == SleepType.Sleep)
            {
                while (!Creature.Status.Energy.IsSatisfied() && Creature.Manager.World.Time.IsNight())
                {
                    if (Creature.Physics.IsInLiquid)
                    {
                        Creature.Status.IsAsleep       = false;
                        Creature.CurrentCharacterMode  = CharacterMode.Idle;
                        Creature.OverrideCharacterMode = false;
                        yield return(Status.Fail);
                    }
                    if (Teleport)
                    {
                        Creature.AI.Position               = TeleportLocation;
                        Creature.Physics.Velocity          = Vector3.Zero;
                        Creature.Physics.LocalPosition     = TeleportLocation;
                        Creature.Physics.AllowPhysicsSleep = true;
                        Creature.Physics.IsSleeping        = true;
                    }
                    Creature.CurrentCharacterMode        = CharacterMode.Sleeping;
                    Creature.Status.Energy.CurrentValue += DwarfTime.Dt * RechargeRate;
                    if (Creature.Status.Health.CurrentValue < startingHealth)
                    {
                        Creature.Status.IsAsleep       = false;
                        Creature.CurrentCharacterMode  = CharacterMode.Idle;
                        Creature.OverrideCharacterMode = false;
                        yield return(Status.Fail);
                    }

                    Creature.Status.IsAsleep       = true;
                    Creature.OverrideCharacterMode = false;
                    yield return(Status.Running);
                }

                if (Teleport)
                {
                    Creature.AI.Position               = PreTeleport;
                    Creature.Physics.Velocity          = Vector3.Zero;
                    Creature.Physics.LocalPosition     = TeleportLocation;
                    Creature.Physics.IsSleeping        = false;
                    Creature.Physics.AllowPhysicsSleep = false;
                }

                Creature.AddThought(Thought.ThoughtType.Slept);
                Creature.Status.IsAsleep           = false;
                Creature.Physics.IsSleeping        = false;
                Creature.Physics.AllowPhysicsSleep = false;
                yield return(Status.Success);
            }
            else
            {
                while (Creature.Status.Health.IsDissatisfied() || Creature.Buffs.Any(buff => buff is Disease))
                {
                    if (Creature.Physics.IsInLiquid)
                    {
                        Creature.Status.IsAsleep       = false;
                        Creature.CurrentCharacterMode  = CharacterMode.Idle;
                        Creature.OverrideCharacterMode = false;
                        yield return(Status.Fail);
                    }
                    if (Teleport)
                    {
                        Creature.AI.Position               = TeleportLocation;
                        Creature.Physics.Velocity          = Vector3.Zero;
                        Creature.Physics.LocalPosition     = TeleportLocation;
                        Creature.Physics.IsSleeping        = true;
                        Creature.Physics.AllowPhysicsSleep = true;
                    }
                    Creature.CurrentCharacterMode        = CharacterMode.Sleeping;
                    Creature.Status.Energy.CurrentValue += DwarfTime.Dt * RechargeRate;
                    Creature.Heal(DwarfTime.Dt * HealRate);
                    Creature.Status.IsAsleep       = true;
                    Creature.OverrideCharacterMode = false;
                    yield return(Status.Running);
                }

                if (Teleport)
                {
                    Creature.AI.Position               = PreTeleport;
                    Creature.Physics.Velocity          = Vector3.Zero;
                    Creature.Physics.LocalPosition     = TeleportLocation;
                    Creature.Physics.IsSleeping        = false;
                    Creature.Physics.AllowPhysicsSleep = false;
                }
                Creature.AddThought(Thought.ThoughtType.Slept);
                Creature.Status.IsAsleep           = false;
                Creature.Physics.IsSleeping        = false;
                Creature.Physics.AllowPhysicsSleep = false;
                yield return(Status.Success);
            }
        }
コード例 #4
0
        public override IEnumerable <Status> Run()
        {
            Creature.IsCloaked = false;

            if (CurrentAttack == null)
            {
                yield return(Status.Fail);

                yield break;
            }

            Timeout.Reset();
            FailTimer.Reset();
            if (Target == null && TargetName != null)
            {
                Target = Agent.Blackboard.GetData <GameComponent>(TargetName);

                if (Target == null)
                {
                    yield return(Status.Fail);

                    yield break;
                }
            }

            if (Agent.Faction.Race.IsIntelligent)
            {
                var targetInventory = Target.GetRoot().GetComponent <Inventory>();
                if (targetInventory != null)
                {
                    targetInventory.SetLastAttacker(Agent);
                }
            }

            CharacterMode defaultCharachterMode = Creature.AI.Movement.CanFly
                ? CharacterMode.Flying
                : CharacterMode.Walking;

            bool avoided = false;

            while (true)
            {
                Timeout.Update(DwarfTime.LastTime);
                FailTimer.Update(DwarfTime.LastTime);
                if (FailTimer.HasTriggered)
                {
                    Creature.Physics.Orientation   = Physics.OrientMode.RotateY;
                    Creature.OverrideCharacterMode = false;
                    Creature.CurrentCharacterMode  = defaultCharachterMode;
                    yield return(Status.Fail);

                    yield break;
                }

                if (Timeout.HasTriggered)
                {
                    if (Training)
                    {
                        Agent.AddXP(1);
                        Creature.Physics.Orientation   = Physics.OrientMode.RotateY;
                        Creature.OverrideCharacterMode = false;
                        Creature.CurrentCharacterMode  = defaultCharachterMode;
                        yield return(Status.Success);

                        yield break;
                    }
                    else
                    {
                        Creature.Physics.Orientation   = Physics.OrientMode.RotateY;
                        Creature.OverrideCharacterMode = false;
                        Creature.CurrentCharacterMode  = defaultCharachterMode;
                        yield return(Status.Fail);

                        yield break;
                    }
                }

                if (Target == null || Target.IsDead)
                {
                    Creature.CurrentCharacterMode = defaultCharachterMode;
                    Creature.Physics.Orientation  = Physics.OrientMode.RotateY;
                    yield return(Status.Success);
                }

                // Find the location of the melee target
                Vector3 targetPos = new Vector3(Target.GlobalTransform.Translation.X,
                                                Target.GetBoundingBox().Min.Y,
                                                Target.GlobalTransform.Translation.Z);

                Vector2 diff = new Vector2(targetPos.X, targetPos.Z) - new Vector2(Creature.AI.Position.X, Creature.AI.Position.Z);

                Creature.Physics.Face(targetPos);

                bool  intersectsbounds = Creature.Physics.BoundingBox.Intersects(Target.BoundingBox);
                float dist             = diff.Length();
                // If we are really far from the target, something must have gone wrong.
                if (DefensiveStructure == null && !intersectsbounds && dist > CurrentAttack.Weapon.Range * 4)
                {
                    Creature.Physics.Orientation   = Physics.OrientMode.RotateY;
                    Creature.OverrideCharacterMode = false;
                    Creature.CurrentCharacterMode  = defaultCharachterMode;
                    yield return(Status.Fail);

                    yield break;
                }

                if (DefensiveStructure != null)
                {
                    if (Creature.Hp < LastHp)
                    {
                        float damage = LastHp - Creature.Hp;
                        Creature.Heal(Math.Min(5.0f, damage));
                        var health = DefensiveStructure.GetRoot().GetComponent <Health>();
                        if (health != null)
                        {
                            health.Damage(damage);
                            Drawer2D.DrawLoadBar(health.World.Renderer.Camera, DefensiveStructure.Position, Color.White, Color.Black, 32, 1, health.Hp / health.MaxHealth, 0.1f);
                        }
                        LastHp = Creature.Hp;
                    }

                    if (dist > CurrentAttack.Weapon.Range)
                    {
                        float sqrDist = dist * dist;
                        foreach (var threat in Creature.AI.Faction.Threats)
                        {
                            float threatDist = (threat.AI.Position - Creature.AI.Position).LengthSquared();
                            if (threatDist < sqrDist)
                            {
                                sqrDist = threatDist;
                                Target  = threat.Physics;
                                break;
                            }
                        }
                        dist = (float)Math.Sqrt(sqrDist);
                    }

                    if (dist > CurrentAttack.Weapon.Range * 4)
                    {
                        yield return(Status.Fail);

                        yield break;
                    }

                    if (DefensiveStructure.IsDead)
                    {
                        DefensiveStructure = null;
                    }
                }

                LastHp = Creature.Hp;


                // If we're out of attack range, run toward the target.
                if (DefensiveStructure == null && !Creature.AI.Movement.IsSessile && !intersectsbounds && diff.Length() > CurrentAttack.Weapon.Range)
                {
                    Creature.CurrentCharacterMode = defaultCharachterMode;
                    var greedyPath = new GreedyPathAct(Creature.AI, Target, CurrentAttack.Weapon.Range * 0.75f)
                    {
                        PathLength = 5
                    };
                    greedyPath.Initialize();

                    foreach (Act.Status stat in greedyPath.Run())
                    {
                        if (stat == Act.Status.Running)
                        {
                            yield return(Status.Running);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
                // If we have a ranged weapon, try avoiding the target for a few seconds to get within range.
                else if (DefensiveStructure == null && !Creature.AI.Movement.IsSessile && !intersectsbounds && !avoided && (CurrentAttack.Weapon.Mode == Weapon.AttackMode.Ranged &&
                                                                                                                            dist < CurrentAttack.Weapon.Range * 0.15f))
                {
                    FailTimer.Reset();
                    foreach (Act.Status stat in AvoidTarget(CurrentAttack.Weapon.Range, 3.0f))
                    {
                        yield return(Status.Running);
                    }
                    avoided = true;
                }
                // Else, stop and attack
                else if ((DefensiveStructure == null && dist < CurrentAttack.Weapon.Range) ||
                         (DefensiveStructure != null && dist < CurrentAttack.Weapon.Range * 2.0))
                {
                    if (CurrentAttack.Weapon.Mode == Weapon.AttackMode.Ranged &&
                        VoxelHelpers.DoesRayHitSolidVoxel(Creature.World.ChunkManager, Creature.AI.Position, Target.Position))
                    {
                        yield return(Status.Fail);

                        yield break;
                    }

                    FailTimer.Reset();
                    avoided = false;
                    Creature.Physics.Orientation = Physics.OrientMode.Fixed;
                    Creature.Physics.Velocity    = new Vector3(Creature.Physics.Velocity.X * 0.9f, Creature.Physics.Velocity.Y, Creature.Physics.Velocity.Z * 0.9f);
                    CurrentAttack.RechargeTimer.Reset(CurrentAttack.Weapon.RechargeRate);

                    Creature.Sprite.ResetAnimations(Creature.Stats.CurrentClass.AttackMode);
                    Creature.Sprite.PlayAnimations(Creature.Stats.CurrentClass.AttackMode);
                    Creature.CurrentCharacterMode  = Creature.Stats.CurrentClass.AttackMode;
                    Creature.OverrideCharacterMode = true;
                    Timer timeout = new Timer(10.0f, true);
                    while (!CurrentAttack.Perform(Creature, Target, DwarfTime.LastTime, Creature.Stats.Strength + Creature.Stats.Size,
                                                  Creature.AI.Position, Creature.Faction.ParentFaction.Name))
                    {
                        timeout.Update(DwarfTime.LastTime);
                        if (timeout.HasTriggered)
                        {
                            break;
                        }

                        Creature.Physics.Velocity = new Vector3(Creature.Physics.Velocity.X * 0.9f, Creature.Physics.Velocity.Y, Creature.Physics.Velocity.Z * 0.9f);
                        if (Creature.AI.Movement.CanFly)
                        {
                            Creature.Physics.ApplyForce(-Creature.Physics.Gravity * 0.1f, DwarfTime.Dt);
                        }
                        yield return(Status.Running);
                    }

                    timeout.Reset();
                    while (!Agent.Creature.Sprite.AnimPlayer.IsDone())
                    {
                        timeout.Update(DwarfTime.LastTime);
                        if (timeout.HasTriggered)
                        {
                            break;
                        }
                        if (Creature.AI.Movement.CanFly)
                        {
                            Creature.Physics.ApplyForce(-Creature.Physics.Gravity * 0.1f, DwarfTime.Dt);
                        }
                        yield return(Status.Running);
                    }

                    var targetCreature = Target.GetRoot().GetComponent <CreatureAI>();
                    if (targetCreature != null && Creature.AI.FightOrFlight(targetCreature) == CreatureAI.FightOrFlightResponse.Flee)
                    {
                        yield return(Act.Status.Fail);

                        yield break;
                    }
                    Creature.CurrentCharacterMode = CharacterMode.Attacking;

                    Vector3 dogfightTarget = Vector3.Zero;
                    while (!CurrentAttack.RechargeTimer.HasTriggered && !Target.IsDead)
                    {
                        CurrentAttack.RechargeTimer.Update(DwarfTime.LastTime);
                        if (CurrentAttack.Weapon.Mode == Weapon.AttackMode.Dogfight)
                        {
                            dogfightTarget += MathFunctions.RandVector3Cube() * 0.1f;
                            Vector3 output = Creature.Controller.GetOutput(DwarfTime.Dt, dogfightTarget + Target.Position, Creature.Physics.GlobalTransform.Translation) * 0.9f;
                            Creature.Physics.ApplyForce(output - Creature.Physics.Gravity, DwarfTime.Dt);
                        }
                        else
                        {
                            Creature.Physics.Velocity = Vector3.Zero;
                            if (Creature.AI.Movement.CanFly)
                            {
                                Creature.Physics.ApplyForce(-Creature.Physics.Gravity, DwarfTime.Dt);
                            }
                        }
                        yield return(Status.Running);
                    }

                    Creature.CurrentCharacterMode = defaultCharachterMode;
                    Creature.Physics.Orientation  = Physics.OrientMode.RotateY;

                    if (Target.IsDead)
                    {
                        Target = null;
                        Agent.AddXP(10);
                        Creature.Physics.Face(Creature.Physics.Velocity + Creature.Physics.GlobalTransform.Translation);
                        Creature.Stats.NumThingsKilled++;
                        Creature.AddThought("I killed somehing!", new TimeSpan(0, 8, 0, 0), 1.0f);
                        Creature.Physics.Orientation   = Physics.OrientMode.RotateY;
                        Creature.OverrideCharacterMode = false;
                        Creature.CurrentCharacterMode  = defaultCharachterMode;
                        yield return(Status.Success);

                        break;
                    }
                }

                yield return(Status.Running);
            }
        }
コード例 #5
0
ファイル: Creature.cs プロジェクト: maroussil/dwarfcorp
            public override void Update(DwarfTime time, Creature creature)
            {
                float dt = (float)time.ElapsedGameTime.TotalSeconds;
                creature.Heal(dt * DamagePerSecond);

                base.Update(time, creature);
            }