-
Notifications
You must be signed in to change notification settings - Fork 0
/
Snail.java
97 lines (81 loc) · 3.13 KB
/
Snail.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import java.util.List;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import processing.core.PImage;
public class Snail extends Entity{
public Snail(String id, Point position,
List<PImage> images, int resourceLimit, int resourceCount,
int actionPeriod, int animationPeriod)
{
super(id, position, images, resourceLimit, resourceCount, actionPeriod, animationPeriod);
}
public <R> R accept(EntityVisitor<R> visitor)
{
return visitor.visit(this);
}
public boolean instanceToVisitor (Entity entity)
{
return entity.accept(new SnailVisitor());
}
public static Snail createSnail(String id, int resourceLimit,
Point position, int actionPeriod, int animationPeriod,
List<PImage> images)
{
return new Snail(id, position, images,
resourceLimit, 0, actionPeriod, animationPeriod);
}
public void scheduleActions(EventScheduler scheduler, WorldModel world, ImageStore imageStore)
{
scheduler.scheduleEvent(this,
Activity.createActivityAction(this, world, imageStore),
this.actionPeriod);
scheduler.scheduleEvent(this, Animation.createAnimationAction(this, 0), this.animationPeriod);
}
public void executeSnailActivity( WorldModel world, ImageStore imageStore, EventScheduler scheduler)
{
Optional<Entity> fullTarget = world.findNearest(this.getPosition(), Ore.class);
long nextPeriod = this.actionPeriod;
if (fullTarget.isPresent())
{
Point tgtPos = fullTarget.get().getPosition();
if (this.moveToSnail(world, fullTarget.get(), scheduler))
{
world.removeEntityAt(tgtPos);
}
}
scheduler.scheduleEvent(this,
new Activity(this, world, imageStore, 0),
nextPeriod);
}
public boolean moveToSnail(WorldModel world, Entity target, EventScheduler scheduler)
{
AStarPathingStrategy singleStep = new AStarPathingStrategy();
Predicate<Point> canPassThrough = (point) -> world.withinBounds(point) && !world.isOccupied(point);
BiPredicate<Point, Point> withinReach = (point1, point2) -> point1.adjacent(point2);
if (this.position.adjacent(target.getPosition()))
{
world.removeEntity(target);
scheduler.unscheduleAllEvents(target);
return true;
}
else
{
List<Point> path = singleStep.computePath(this.getPosition(), target.getPosition(), canPassThrough, withinReach, PathingStrategy.CARDINAL_NEIGHBORS);
Point nextPos = null;
if (path.size() != 0) {
nextPos = path.get(0);
}
if (nextPos != null)
{
Optional<Entity> occupant = world.getOccupant(nextPos);
if (occupant.isPresent())
{
scheduler.unscheduleAllEvents(occupant.get());
}
world.moveEntity(this, nextPos);
}
return false;
}
}
}