/// <summary> /// Finds a node to wander /// </summary> /// <param name="pea"></param> /// <returns></returns> protected void FindWanderNode(DataPea pea, Node<MoveNode> prev = null) { var snapshot = GetSnapshot(pea); var block = pea.GridPosition.Y >= 0 ? _grid.Grid[pea.GridPosition.X][pea.GridPosition.Y] : new DataBlock(new Point(pea.GridPosition.X, pea.GridPosition.Y - 1), BlockType.None, null); var node = (prev == null) ? (snapshot.WanderingNode.HasValue && snapshot.WanderingNode.Value.Action != MoveNode.Type.None && snapshot.WanderingNode.Value.Position == pea.GridPosition ? new Node<MoveNode>() { Value = snapshot.WanderingNode.Value } : CreateNode(block, MoveNode.Type.Walk, MoveNode.Direction.None) ) : prev; var possibleNodes = CreateMoveNodesFrom(node); if (possibleNodes.Count > 0) { // Find nodes that go higher (non walk nodes and non lineair jumps) var nonwalk = possibleNodes.Where(a => a.Value.Action != MoveNode.Type.Walk && !((a.Value.Action == MoveNode.Type.Jump) && (a.Value.Dir == MoveNode.Direction.None))); // Limit to these if needed if (nonwalk.Count() > 0) { possibleNodes = nonwalk.ToList(); } else if (DataPea.Random.Next(100) < 10) { snapshot.Wander(node.Value, null); pea.Jump(null); return; } snapshot.Wander(node.Value, possibleNodes[DataPea.Random.Next(possibleNodes.Count)].Value); } else { snapshot.Wander(node.Value, null); pea.Jump(null); } }
/// <summary> /// Jumping start /// </summary> /// <param name="pea"></param> /// <param name="gameTime"></param> public void Jump(DataPea pea, GameTime gameTime) { var snapshot = GetSnapshot(pea); var d = (snapshot.Target.Source.Position + Vector2.UnitX * 35 - Vector2.UnitY * 8 - pea.Position); // If not in range of the target, stop jumping if (d.Length() > 5 || !IsValid(snapshot.Target) || ((snapshot.Target.Placement == DataJumpSpot.Location.Left ? (snapshot.Target.Source == null ? snapshot.Target : snapshot.Target.Source.JumpLeft) : (snapshot.Target.Source == null ? snapshot.Target : snapshot.Target.Source.JumpRight)) ?? snapshot.Target).HasJumped(pea)) { // TODO REMOVE JUMPSPOT FROM CANDIDATES snapshot.Target = null; return; } pea.Jump(snapshot.Target); }