summaryrefslogtreecommitdiffhomepage
path: root/digital/io-hub
diff options
context:
space:
mode:
authorNicolas Schodet2012-05-12 01:39:50 +0200
committerNicolas Schodet2012-05-12 11:15:56 +0200
commit497e15f6f6e412db0d371155dba8bd43b69ace2f (patch)
tree99db9f750ec60e99fbd60945e1f8181ab068fe80 /digital/io-hub
parent49dd9a2eca79707b49185c522fb4d39d490a3582 (diff)
digital/io-hub/src/guybrush: move obstacles out of path_blocking
Diffstat (limited to 'digital/io-hub')
-rw-r--r--digital/io-hub/src/guybrush/path.c84
1 files changed, 48 insertions, 36 deletions
diff --git a/digital/io-hub/src/guybrush/path.c b/digital/io-hub/src/guybrush/path.c
index 2b53d9ce..5696a2f8 100644
--- a/digital/io-hub/src/guybrush/path.c
+++ b/digital/io-hub/src/guybrush/path.c
@@ -187,6 +187,45 @@ path_pos (uint8_t node, vect_t *pos)
}
}
+/** Static obstacles. */
+static const vect_t path_blocking_segment[][2] = {
+ /* Ship holds. */
+ { { PG_HOLD_SOUTH_X + BOT_SIZE_RADIUS, PG_HOLD_SOUTH_Y },
+ { PG_HOLD_NORTH_X + BOT_SIZE_RADIUS, PG_HOLD_NORTH_Y } },
+ { { PG_MIRROR_X (PG_HOLD_SOUTH_X + BOT_SIZE_RADIUS), PG_HOLD_SOUTH_Y },
+ { PG_MIRROR_X (PG_HOLD_NORTH_X + BOT_SIZE_RADIUS), PG_HOLD_NORTH_Y } },
+ /* Ship captain rooms. */
+ { { 0, PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS },
+ { PG_CAPTAIN_ROOM_WIDTH_MM,
+ PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS } },
+ { { PG_MIRROR_X (0), PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS },
+ { PG_MIRROR_X (PG_CAPTAIN_ROOM_WIDTH_MM),
+ PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS } },
+};
+struct path_blocking_point_t
+{
+ vect_t pos;
+ uint16_t radius;
+};
+static const struct path_blocking_point_t path_blocking_point[] = {
+ /* Totems. */
+ { { PG_TOTEM_LEFT_X, PG_TOTEM_Y },
+ PG_TOTEM_DIAG_MM / 2 + BOT_SIZE_RADIUS },
+ { { PG_TOTEM_RIGHT_X, PG_TOTEM_Y },
+ PG_TOTEM_DIAG_MM / 2 + BOT_SIZE_RADIUS },
+ /* Ship holds. */
+ { { PG_HOLD_NORTH_X, PG_HOLD_NORTH_Y },
+ BOT_SIZE_RADIUS },
+ { { PG_MIRROR_X (PG_HOLD_NORTH_X), PG_HOLD_NORTH_Y },
+ BOT_SIZE_RADIUS },
+ /* Ship captain rooms. */
+ { { PG_CAPTAIN_ROOM_WIDTH_MM, PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM },
+ BOT_SIZE_RADIUS },
+ { { PG_MIRROR_X (PG_CAPTAIN_ROOM_WIDTH_MM),
+ PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM },
+ BOT_SIZE_RADIUS },
+};
+
/** Return 1 if the direct path between a and b nodes is blocked, also compute
* distance. */
static uint8_t
@@ -202,46 +241,19 @@ path_blocking (uint8_t a, uint8_t b, int16_t *dp)
escape_factor = path.escape_factor;
path_pos (a, &va);
path_pos (b, &vb);
- /* Test for totems. */
- static const vect_t totems[] = {
- { PG_TOTEM_LEFT_X, PG_TOTEM_Y },
- { PG_TOTEM_RIGHT_X, PG_TOTEM_Y },
- };
- for (i = 0; i < UTILS_COUNT (totems) && !blocking; i++)
- {
- uint16_t d = distance_segment_point (&va, &vb, &totems[i]);
- if (d < PG_TOTEM_DIAG_MM / 2 + BOT_SIZE_RADIUS)
- blocking = 1;
- }
- /* Test for ships. */
- static const vect_t ships_segments[][2] = {
- { { PG_HOLD_SOUTH_X + BOT_SIZE_RADIUS, PG_HOLD_SOUTH_Y },
- { PG_HOLD_NORTH_X + BOT_SIZE_RADIUS, PG_HOLD_NORTH_Y } },
- { { PG_MIRROR_X (PG_HOLD_SOUTH_X + BOT_SIZE_RADIUS), PG_HOLD_SOUTH_Y },
- { PG_MIRROR_X (PG_HOLD_NORTH_X + BOT_SIZE_RADIUS), PG_HOLD_NORTH_Y } },
- { { 0, PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS },
- { PG_CAPTAIN_ROOM_WIDTH_MM,
- PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS } },
- { { PG_MIRROR_X (0), PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS },
- { PG_MIRROR_X (PG_CAPTAIN_ROOM_WIDTH_MM),
- PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM - BOT_SIZE_RADIUS } },
- };
- static const vect_t ships_angles[] = {
- { PG_HOLD_NORTH_X, PG_HOLD_NORTH_Y },
- { PG_MIRROR_X (PG_HOLD_NORTH_X), PG_HOLD_NORTH_Y },
- { PG_CAPTAIN_ROOM_WIDTH_MM, PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM },
- { PG_MIRROR_X (PG_CAPTAIN_ROOM_WIDTH_MM), PG_LENGTH - PG_CAPTAIN_ROOM_LENGTH_MM },
- };
- for (i = 0; i < UTILS_COUNT (ships_segments) && !blocking; i++)
+ /* Test for static obstacles. */
+ for (i = 0; i < UTILS_COUNT (path_blocking_point) && !blocking; i++)
{
- if (intersection_segment_segment (&va, &vb, &ships_segments[i][0],
- &ships_segments[i][1]))
+ uint16_t d = distance_segment_point
+ (&va, &vb, &path_blocking_point[i].pos);
+ if (d < path_blocking_point[i].radius)
blocking = 1;
}
- for (i = 0; i < UTILS_COUNT (ships_angles) && !blocking; i++)
+ for (i = 0; i < UTILS_COUNT (path_blocking_segment) && !blocking; i++)
{
- uint16_t d = distance_segment_point (&va, &vb, &ships_angles[i]);
- if (d < BOT_SIZE_RADIUS)
+ if (intersection_segment_segment (&va, &vb,
+ &path_blocking_segment[i][0],
+ &path_blocking_segment[i][1]))
blocking = 1;
}
/* Test for a blocking obstacle. */