// 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); } } }