Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

* Pfadsuche leicht modifiziert, so dass beim Durchlaufen eines Porta…

…ls Wegpunkte auf beiden Seiten des Portals angelegt werden. Dadurch sollten beim Ablaufen des Pfades keine Koordinaten mehr entstehen, welche eine Einheit ausserhalb des begehbaren Gebietes liegen. Dies korrigiert Bug #8.

 * world_size liefert nun als x2 und y2 Koordinaten, welche gerade noch innerhalb des Spielfelds liegen. Zuvor hat world_size Koordinaten geliefert, welche gerade ausserhalb liegen. Skripte, welche sich auf das alte Verhalten verlassen, koennen x2 und y2 jeweils um 1 inkrementieren.


git-svn-id: http://infon.googlecode.com/svn/branches/lua-5.1@72 8171fb75-e542-0410-96e4-03d5dd800671
  • Loading branch information...
commit fe750380a7b2e72577b67c5f0393528bc23b14af 1 parent 9ac2dc9
@dividuum authored
View
4 Makefile
@@ -24,12 +24,12 @@ ifdef WINDOWS
MINGW = $(HOME)/progs/mingw32/
SDLDIR = $(MINGW)
CC = /opt/xmingw/bin/i386-mingw32msvc-gcc
- CFLAGS = $(COMMON_CFLAGS) -I$(MINGW)/include
+ CFLAGS += $(COMMON_CFLAGS) -I$(MINGW)/include
WINDRES = /opt/xmingw/bin/i386-mingw32msvc-windres
LUAPLAT = mingw
else
SDLDIR = $(shell sdl-config --prefix)
- CFLAGS = $(COMMON_CFLAGS)
+ CFLAGS += $(COMMON_CFLAGS)
LUAPLAT = debug #linux
LDFLAGS += -ldl
endif
View
44 creature.c
@@ -83,6 +83,10 @@ int creature_num(const creature_t *creature) {
return creature - creatures;
}
+int creature_groundbased(const creature_t *creature) {
+ return creature->type != CREATURE_FLYER;
+}
+
maptype_e creature_tile_type(const creature_t *creature) {
return world_get_type(X_TO_TILEX(creature->x), Y_TO_TILEY(creature->y));
}
@@ -205,6 +209,9 @@ void creature_do_move_to_target(creature_t *creature, int delta) {
creature->x += dx * travelled / dist_to_waypoint;
creature->y += dy * travelled / dist_to_waypoint;
+
+ assert(!creature_groundbased(creature) || world_walkable(X_TO_TILEX(creature->x),
+ Y_TO_TILEY(creature->y)));
}
// ------------- Food -> Health -------------
@@ -774,36 +781,23 @@ void creature_moveall(int delta) {
int creature_set_path(creature_t *creature, int x, int y) {
pathnode_t *newpath;
- switch (creature->type) {
- case CREATURE_SMALL:
- case CREATURE_BIG:
- // Bodenbasierte Viecher
- if (!world_walkable(X_TO_TILEX(x), Y_TO_TILEY(y)))
- return 0;
+ if (creature_groundbased(creature)) {
+ if (!world_walkable(X_TO_TILEX(x), Y_TO_TILEY(y)))
+ return 0;
+
+ newpath = world_findpath(creature->x, creature->y, x, y);
- newpath = world_findpath(creature->x, creature->y, x, y);
- break;
- case CREATURE_FLYER:
- // Fliegendes Vieh
- if (!world_is_within_border(X_TO_TILEX(x), Y_TO_TILEY(y)))
- return 0;
+ if (!newpath)
+ return 0;
+ } else {
+ // Fliegendes Vieh
+ if (!world_is_within_border(X_TO_TILEX(x), Y_TO_TILEY(y)))
+ return 0;
- newpath = malloc(sizeof(pathnode_t));
- if (newpath) {
- newpath->x = x;
- newpath->y = y;
- newpath->next = NULL;
- }
- break;
- default:
- assert(0);
+ newpath = pathnode_new(x, y);
}
- if (!newpath)
- return 0;
-
path_delete(creature->path);
-
creature->path = newpath;
return 1;
}
View
2  gui_creature.c
@@ -238,7 +238,6 @@ void gui_creature_from_network(packet_t *packet) {
} else {
if (CREATURE_USED(creature)) PROTOCOL_ERROR();
memset(creature, 0, sizeof(gui_creature_t));
- creature->used = 1;
if (playerno >= MAXPLAYERS) PROTOCOL_ERROR();
creature->player = playerno;
@@ -248,6 +247,7 @@ void gui_creature_from_network(packet_t *packet) {
creature->last_x = x;
creature->last_y = y;
+ creature->used = 1;
// XXX: x, y checken?
gui_creature_add_path(creature,
View
5 map.h
@@ -46,9 +46,8 @@ typedef struct tile_s {
#define TILE_X1(x) ((x) * TILE_WIDTH)
#define TILE_Y1(y) ((y) * TILE_HEIGHT)
-// XXX: Add +1?
-#define TILE_X2(x) (TILE_X1(x) + TILE_WIDTH)
-#define TILE_Y2(y) (TILE_Y1(y) + TILE_HEIGHT)
+#define TILE_X2(x) (TILE_X1(x) + TILE_WIDTH - 1)
+#define TILE_Y2(y) (TILE_Y1(y) + TILE_HEIGHT - 1)
#define TILE_XCENTER(x) (TILE_X1(x) + TILE_WIDTH / 2)
#define TILE_YCENTER(y) (TILE_Y1(y) + TILE_HEIGHT / 2)
View
63 path.c
@@ -37,8 +37,10 @@ inline int path_calc_cost(int x1, int y1, int x2, int y2) {
pathnode_t *pathnode_new(int x, int y) {
pathnode_t *node = (pathnode_t*)malloc(sizeof(pathnode_t));
- node->x = x;
- node->y = y;
+ assert(node);
+ node->x = x;
+ node->y = y;
+ node->next = NULL;
return node;
}
@@ -177,11 +179,8 @@ pathnode_t *finder_find(pathfinder_t *finder, map_t *map, int sx, int sy, int ex
const tile_t *etile = MAP_TILE(map, tex, tey);
// Ziel und Quelle gleich
- if (sx == ex && sy == ey) {
- pathnode_t *path = pathnode_new(ex, ey);
- path->next = NULL;
- return path;
- }
+ if (sx == ex && sy == ey)
+ return pathnode_new(ex, ey);
// Gibt es ueberhaupt eine Verbindung?
if (stile->region != etile->region)
@@ -193,21 +192,14 @@ pathnode_t *finder_find(pathfinder_t *finder, map_t *map, int sx, int sy, int ex
// Spezialfall: Nur ein Tile
if ((ABS(tsx - tex) == 1 && (tsy == tey)) ||
((tsx == tex) && ABS(tsy - tey) == 1))
- {
- pathnode_t *path = pathnode_new(ex, ey);
- path->next = NULL;
- return path;
- }
+ return pathnode_new(ex, ey);
const area_t *sarea = stile->area;
const area_t *earea = etile->area;
// Ziel und Quelle im gleichen Area?
- if (sarea == earea) {
- pathnode_t *path = pathnode_new(ex, ey);
- path->next = NULL;
- return path;
- }
+ if (sarea == earea)
+ return pathnode_new(ex, ey);
// Neue Path id zum eindeutigen erkennen, ob
// path_prev in portal_t aktuell oder veraltet ist holen.
@@ -335,28 +327,25 @@ pathnode_t *finder_find(pathfinder_t *finder, map_t *map, int sx, int sy, int ex
pathnode_t *curpath = &pathstart;
int lastx = sx, lasty = sy;
do {
- // Die cx und cy Koordinaten befinden sich jeweils an der linken bzw
- // oberen Kante eines Tiles. Kommt ein Pfad daher von Rechts oder von
- // Unten zu einem solchen Portal, so wuerde der hier erzeugte Knoten noch im
- // aktuell durchlaufenen Area liegen. Wird ein solcher Weg abgelaufen und
- // direkt nach dem Knoten folgt eine ~90 Grad Kurve, so kann es sein, dass
- // die x bzw y Koordinate fuer eine kurze Zeit nicht veraendert wird,
- // d.h. das Area, obwohl schon auf dem Weg zum naechsten Knoten, nicht
- // verlassen wird. Wird in diesem Moment eine erneute Suche zum gleichen
- // Ziel begonnen, wird der zuvor bereits ueberquerte Knoten erneut
- // als Pfadknoten gefunden und es kommt zu einer haesslichen Endlosschleife.
- // Daher wird von x bzw y der Wert 1 subtrahiert, falls das Portal von
- // Rechts bzw von unten angesteuert wird.
- curpath->next = pathnode_new(pathportal->cx - (pathportal->cx <= lastx),
- pathportal->cy - (pathportal->cy <= lasty));
- lastx = pathportal->cx;
- lasty = pathportal->cy;
- curpath = curpath->next;
- pathportal = pathportal->path_prev;
+ if (pathportal->dir == PORTAL_DIR_HORIZONTAL) {
+ curpath->next = pathnode_new(pathportal->cx,
+ pathportal->cy + (lasty > pathportal->cy));
+ curpath = curpath->next;
+ curpath->next = pathnode_new(pathportal->cx,
+ pathportal->cy + (lasty <= pathportal->cy));
+ } else {
+ curpath->next = pathnode_new(pathportal->cx + (lastx > pathportal->cx),
+ pathportal->cy);
+ curpath = curpath->next;
+ curpath->next = pathnode_new(pathportal->cx + (lastx <= pathportal->cx),
+ pathportal->cy);
+ }
+ curpath = curpath->next;
+ lastx = curpath->x;
+ lasty = curpath->y;
+ pathportal = pathportal->path_prev;
} while (pathportal);
curpath->next = pathnode_new(ex, ey);
- curpath->next->next = NULL;
-
return pathstart.next;
}
View
3  path.h
@@ -50,11 +50,12 @@ struct open_s {
struct pathnode_s {
int x;
int y;
- int dist;
pathnode_t *next;
};
pathnode_t *finder_find(pathfinder_t *finder, map_t *map, int sx, int sy, int ex, int ey);
+pathnode_t *pathnode_new(int x, int y);
+
void path_delete(pathnode_t *path);
void finder_init (pathfinder_t *finder);
Please sign in to comment.
Something went wrong with that request. Please try again.