Files @ r6888:f2ab5d0e6596
Branch filter:

Location: cpp/openttd-patchpack/source/src/ai/trolly/shared.cpp

rubidium
(svn r10131) -Fix [FS#810]: when removing a dock, a ship will always try to reach the old location of the dock even when it cannot anymore because it the old location of the dock is now land instead of water.
/* $Id$ */

#include "../../stdafx.h"
#include "../../openttd.h"
#include "../../debug.h"
#include "../../map.h"
#include "trolly.h"
#include "../../vehicle.h"

int AiNew_GetRailDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c)
{
	// 0 = vert
	// 1 = horz
	// 2 = dig up-left
	// 3 = dig down-right
	// 4 = dig down-left
	// 5 = dig up-right

	uint x1 = TileX(tile_a);
	uint x2 = TileX(tile_b);
	uint x3 = TileX(tile_c);

	uint y1 = TileY(tile_a);
	uint y2 = TileY(tile_b);
	uint y3 = TileY(tile_c);

	if (y1 == y2 && y2 == y3) return 0;
	if (x1 == x2 && x2 == x3) return 1;
	if (y2 > y1) return x2 > x3 ? 2 : 4;
	if (x2 > x1) return y2 > y3 ? 2 : 5;
	if (y1 > y2) return x2 > x3 ? 5 : 3;
	if (x1 > x2) return y2 > y3 ? 4 : 3;

	return 0;
}

int AiNew_GetRoadDirection(TileIndex tile_a, TileIndex tile_b, TileIndex tile_c)
{
	int x1, x2, x3;
	int y1, y2, y3;
	int r;

	x1 = TileX(tile_a);
	x2 = TileX(tile_b);
	x3 = TileX(tile_c);

	y1 = TileY(tile_a);
	y2 = TileY(tile_b);
	y3 = TileY(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
DiagDirection AiNew_GetDirection(TileIndex tile_a, TileIndex tile_b)
{
	if (TileY(tile_a) < TileY(tile_b)) return DIAGDIR_SE;
	if (TileY(tile_a) > TileY(tile_b)) return DIAGDIR_NW;
	if (TileX(tile_a) < TileX(tile_b)) return DIAGDIR_SW;
	return DIAGDIR_NE;
}


// This functions looks up if this vehicle is special for this AI
//  and returns his flag
uint AiNew_GetSpecialVehicleFlag(Player* p, Vehicle* v)
{
	uint i;

	for (i = 0; i < AI_MAX_SPECIAL_VEHICLES; i++) {
		if (p->ainew.special_vehicles[i].veh_id == v->index) {
			return p->ainew.special_vehicles[i].flag;
		}
	}

	// Not found :(
	return 0;
}


bool AiNew_SetSpecialVehicleFlag(Player* p, Vehicle* v, uint flag)
{
	int new_id = -1;
	uint i;

	for (i = 0; i < AI_MAX_SPECIAL_VEHICLES; i++) {
		if (p->ainew.special_vehicles[i].veh_id == v->index) {
			p->ainew.special_vehicles[i].flag |= flag;
			return true;
		}
		if (new_id == -1 &&
				p->ainew.special_vehicles[i].veh_id == 0 &&
				p->ainew.special_vehicles[i].flag == 0) {
			new_id = i;
		}
	}

	// Out of special_vehicle spots :s
	if (new_id == -1) {
		DEBUG(ai, 1, "special_vehicles list is too small");
		return false;
	}
	p->ainew.special_vehicles[new_id].veh_id = v->index;
	p->ainew.special_vehicles[new_id].flag = flag;
	return true;
}