From 788ace088d8b3ba2afd77a8b21b532abc40d9eba Mon Sep 17 00:00:00 2001 From: truelight Date: Fri, 20 Aug 2004 09:32:32 +0000 Subject: (svn r85) -Add: initial commit of new AI (enable in Patch menu) -Add: generalised A* Algorithm -Add: generalised queues (Fifo, Stack, InsSort, BinaryHeap) --- ai_shared.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 ai_shared.c (limited to 'ai_shared.c') diff --git a/ai_shared.c b/ai_shared.c new file mode 100644 index 000000000..192651c82 --- /dev/null +++ b/ai_shared.c @@ -0,0 +1,82 @@ +#include "stdafx.h" +#include "ttd.h" +#include "player.h" +#include "ai.h" + +int AiNew_GetRailDirection(uint tile_a, uint tile_b, uint tile_c) { + // 0 = vert + // 1 = horz + // 2 = dig up-left + // 3 = dig down-right + // 4 = dig down-left + // 5 = dig up-right + + int x1, x2, x3; + int y1, y2, y3; + + x1 = GET_TILE_X(tile_a); + x2 = GET_TILE_X(tile_b); + x3 = GET_TILE_X(tile_c); + + y1 = GET_TILE_Y(tile_a); + y2 = GET_TILE_Y(tile_b); + y3 = GET_TILE_Y(tile_c); + + if (y1 == y2 && y2 == y3) return 0; + if (x1 == x2 && x2 == x3) return 1; + if (y2 > y1) { + if (x2 > x3) return 2; + else return 4; + } + if (x2 > x1) { + if (y2 > y3) return 2; + else return 5; + } + if (y1 > y2) { + if (x2 > x3) return 5; + else return 3; + } + if (x1 > x2) { + if (y2 > y3) return 4; + else return 3; + } + + return 0; +} + +int AiNew_GetRoadDirection(uint tile_a, uint tile_b, uint tile_c) { + int x1, x2, x3; + int y1, y2, y3; + int r; + + x1 = GET_TILE_X(tile_a); + x2 = GET_TILE_X(tile_b); + x3 = GET_TILE_X(tile_c); + + y1 = GET_TILE_Y(tile_a); + y2 = GET_TILE_Y(tile_b); + y3 = GET_TILE_Y(tile_c); + + r = 0; + + if (x1 < x2) r += 8; + if (y1 < y2) r += 1; + if (x1 > x2) r += 2; + if (y1 > y2) r += 4; + + if (x2 < x3) r += 2; + if (y2 < y3) r += 4; + if (x2 > x3) r += 8; + if (y2 > y3) r += 1; + + return r; +} + +// Get's the direction between 2 tiles seen from tile_a +int AiNew_GetDirection(uint tile_a, uint tile_b) { + if (GET_TILE_Y(tile_a) < GET_TILE_Y(tile_b)) return 1; + if (GET_TILE_Y(tile_a) > GET_TILE_Y(tile_b)) return 3; + if (GET_TILE_X(tile_a) < GET_TILE_X(tile_b)) return 2; + return 0; +} + -- cgit v1.2.3-54-g00ecf