-
Notifications
You must be signed in to change notification settings - Fork 0
/
MinerFull.java
110 lines (89 loc) · 3.46 KB
/
MinerFull.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
98
99
100
101
102
103
104
105
106
107
108
109
110
import java.util.List;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Predicate;
import processing.core.PImage;
public class MinerFull extends Entity{
public MinerFull(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 MinerFullVisitor());
}
public static MinerFull createMinerFull(String id, int resourceLimit,
Point position, int actionPeriod, int animationPeriod,
List<PImage> images)
{
return new MinerFull(id, position, images,
resourceLimit, resourceLimit, actionPeriod, animationPeriod);
}
public void executeMinerFullActivity( WorldModel world, ImageStore imageStore, EventScheduler scheduler)
{
Optional<Entity> fullTarget = world.findNearest(this.position, Smith.class);
if (fullTarget.isPresent() &&
this.moveToFull(world, fullTarget.get(), scheduler))
{
this.transformFull(world, scheduler, imageStore);
}
else
{
scheduler.scheduleEvent(this,
Activity.createActivityAction(this, world, imageStore),
this.actionPeriod);
}
}
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 transformFull( WorldModel world,
EventScheduler scheduler, ImageStore imageStore)
{
MinerNotFull miner = MinerNotFull.createMinerNotFull(this.id, this.resourceLimit,
this.position, this.actionPeriod, this.animationPeriod,
this.images);
world.removeEntity( this);
scheduler.unscheduleAllEvents( this);
world.addEntity(miner);
miner.scheduleActions(scheduler, world, imageStore);
}
public boolean moveToFull(WorldModel world, Entity target, EventScheduler scheduler)
{
if (this.position.adjacent(target.position))
{
return true;
}
else
{
AStarPathingStrategy singleStep = new AStarPathingStrategy();
Predicate<Point> canPassThrough = (point) -> world.withinBounds(point) && !world.isOccupied(point);
BiPredicate<Point, Point> withinReach = (point1, point2) -> point1.adjacent(point2);
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;
}
}
}