-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGridManager.java
157 lines (134 loc) · 4.4 KB
/
GridManager.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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import java.util.LinkedList;
public class GridManager {
private Region region;
public GridManager(Region _region) {
region = _region;
} //constructor
//********************command methods******************//
public void moveCharTo(GameAction action) {
Character c = action.getOwner();
GameActionType type = action.getType();
boolean canMoveTo = true;
int size = c.getMapSize();
Point center = c.getMapCenter();
Point temp;
if (type == GameActionType.MOVE_UP) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), i, -1);
if (temp == null || !canMoveTo(temp)) {
canMoveTo = false;
break;
}
}
} else if (type == GameActionType.MOVE_DOWN) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getLowerLeft(center, (size-1)/2), i, 1);
if (temp == null || !canMoveTo(temp)) {
canMoveTo = false;
break;
}
}
} else if (type == GameActionType.MOVE_LEFT) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), -1, i);
if (temp == null || !canMoveTo(temp)) {
canMoveTo = false;
break;
}
}
} else if (type == GameActionType.MOVE_RIGHT) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperRight(center, (size-1)/2), 1, i);
if (temp == null || !canMoveTo(temp)) {
canMoveTo = false;
break;
}
}
}
if (canMoveTo) {
executeMove(action);
}
} //moveCharTo
private void executeMove(GameAction action) {
Character c = action.getOwner();
GameActionType type = action.getType();
int size = c.getMapSize();
Point center = c.getMapCenter();
Point temp;
if (type == GameActionType.MOVE_UP) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), i, 0);
temp.occupy();
temp = getRelativePoint(getLowerLeft(center, (size-1)/2), i, 0);
temp.vacate();
}
center = getRelativePoint(center, 0, -1);
} else if (type == GameActionType.MOVE_DOWN) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getLowerLeft(center, (size-1)/2), i, 0);
temp.occupy();
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), i, 0);
temp.vacate();
}
center = getRelativePoint(center, 0, 1);
} else if (type == GameActionType.MOVE_LEFT) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), 0, i);
temp.occupy();
temp = getRelativePoint(getUpperRight(center, (size-1)/2), 0, i);
temp.vacate();
}
center = getRelativePoint(center, -1, 0);
} else if (type == GameActionType.MOVE_RIGHT) {
for (int i = 0; i < size; i++) {
temp = getRelativePoint(getUpperRight(center, (size-1)/2), 0, i);
temp.occupy();
temp = getRelativePoint(getUpperLeft(center, (size-1)/2), 0, i);
temp.vacate();
}
center = getRelativePoint(center, 1, 0);
}
c.setMapCenter(center);
} //executeMove
//*********************util methods********************//
//@return: null if return is out of array
public Point getRelativePoint(Point p, int dx, int dy) {
return region.getPoint(p.getX() + dx, p.getY() + dy);
} //getRelativePoint
//@return: true if p is unoccupied and pathable
public boolean canMoveTo(Point p) {
return (p.isPathable() && !p.isOccupied());
} //canMoveTo
public boolean canMoveTo(Point center,int size) {
for(Point p:getRegion(center,size))
if(!canMoveTo(p)) return false;
return true;
} //canMoveTo2
private Point getUpperLeft(Point center, int size) {
return getRelativePoint(center, -size, -size);
} //getUpperLeft
private Point getLowerLeft(Point center, int size) {
return getRelativePoint(center, -size, size);
} //getLowerLeft
private Point getUpperRight(Point center, int size) {
return getRelativePoint(center, size, -size);
} //getUpperRight
private Point getLowerRight(Point center, int size) {
return getRelativePoint(center, size, size);
} //getLowerRight
//@param size: must be odd
public LinkedList<Point> getRegion(Point center, int size) {
LinkedList<Point> points = new LinkedList<Point>();
Point temp;
Point upperLeftCorner = getRelativePoint(center,
-(size-1)/2,
-(size-1)/2);
for (int y = 0; y < size; y++) {
for (int x = 0; x < size; x++) {
temp = getRelativePoint(upperLeftCorner, x, y);
points.add(temp);
}
}
return points;
} //getRegion
}