Exemple #1
0
        // Adjust position state based on current behaviour
        private EntityPositionState EvaluateBehaviour()
        {
            creep = false;
            switch (BehaviouralState)
            {
            case BehaviourState.Wander:
            {
                return(EntityPositionState.SteeringWander);
            }

            case BehaviourState.SlowFlee:
            {
                creep = true;
                return(EntityPositionState.SteeringFlee);
            }

            case BehaviourState.RangedPursue:
            {
                if ((Position - Target.Position).Length() < MAX_PROJECTILE_DISTANCE)
                {
                    return(EntityPositionState.RangedAttack);
                }
                GroundTarget = Target.Position;
                return(EntityPositionState.SteeringArrive);
            }

            case BehaviourState.RangedCreep:
            {
                if ((Position - Target.Position).Length() < MAX_PROJECTILE_DISTANCE)
                {
                    return(EntityPositionState.RangedAttack);
                }
                creep        = true;
                GroundTarget = Target.Position;
                return(EntityPositionState.SteeringArrive);
            }

            case BehaviourState.MeleePursue:
            {
                // if zombie has reserved a slot, check if close enough to attack, or far enough to release
                if (targetslot >= 0)
                {
                    // check if close enough to slot to start attacking
                    if ((Position - SlotTarget).Length() < ArriveRadius)
                    {
                        return(EntityPositionState.Attack);
                    }
                    // check if far enough to release slot
                    if ((Position - Target.Position).Length() > 2 * MAX_PROJECTILE_DISTANCE)
                    {
                        Target.releaseSlot(this, targetslot);
                        targetslot = -1;
                    }
                    GroundTarget = SlotTarget;
                    return(EntityPositionState.SteeringArrive);
                }
                // zombie has no slot, try to attack or reserve a slot
                if ((Position - Target.Position).Length() < MAX_MELEE_DISTANCE)
                {
                    return(EntityPositionState.Attack);
                }
                // check if close enough to reserve a slot and set slot as target
                if ((Position - Target.Position).Length() < MAX_PROJECTILE_DISTANCE)
                {
                    targetslot   = Target.reserveSlot(this);
                    GroundTarget = Target.Position;
                    return(EntityPositionState.SteeringArrive);
                }

                GroundTarget = Target.Position;
                return(EntityPositionState.SteeringArrive);
            }

            case BehaviourState.MeleeCreep:
            {
                // if zombie has reserved a slot, check if close enough to attack, or far enough to release
                if (targetslot >= 0)
                {
                    // check if close enough to slot to start attacking
                    if ((Position - SlotTarget).Length() < ArriveRadius)
                    {
                        return(EntityPositionState.Attack);
                    }
                    // check if far enough to release slot
                    if ((Position - Target.Position).Length() > 2 * MAX_PROJECTILE_DISTANCE)
                    {
                        Target.releaseSlot(this, targetslot);
                        targetslot = -1;
                    }
                    GroundTarget = SlotTarget;
                    creep        = true;
                    return(EntityPositionState.SteeringArrive);
                }
                // zombie has no slot, try to attack or reserve a slot
                if ((Position - Target.Position).Length() < MAX_MELEE_DISTANCE)
                {
                    return(EntityPositionState.Attack);
                }
                // check if close enough to reserve a slot and set slot as target
                if ((Position - Target.Position).Length() < MAX_PROJECTILE_DISTANCE)
                {
                    targetslot   = Target.reserveSlot(this);
                    GroundTarget = Target.Position;
                    return(EntityPositionState.SteeringArrive);
                }

                creep        = true;
                GroundTarget = Target.Position;
                return(EntityPositionState.SteeringArrive);
            }

            case BehaviourState.Flee:
            {
                return(EntityPositionState.SteeringFlee);
            }

            default:
            {
                return(EntityPositionState.None);
            }
            }
        }