src/ai/api/ai_road.cpp
author truelight
Mon, 19 Mar 2007 14:17:26 +0000
branchnoai
changeset 9483 0c6d80b1a87e
parent 9482 5e0418292ecc
child 9486 a9b5f6b8667c
permissions -rw-r--r--
(svn r9333) [NoAI] -Add: added DC_AUTO for DoCommand in AIRoad() to avoid building over existing structures we can remove
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     1
/* $Id$ */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     2
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     3
/** @file ai_town.cpp handles the functions of the AIRoad class */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     4
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     5
#include "ai_road.hpp"
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     6
#include "../../command.h"
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     7
#include "../../road_map.h"
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     8
#include "../../station_map.h"
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
     9
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    10
bool AIRoad::IsRoadTile(TileIndex tile)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    11
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    12
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    13
	if (tile >= _map_size) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    14
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    15
	return IsTileType(tile, MP_STREET) && GetRoadTileType(tile) != ROAD_TILE_DEPOT;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    16
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    17
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    18
bool AIRoad::BuildRoad(TileIndex start, TileIndex end)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    19
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    20
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    21
	if (start >= _map_size || end >= _map_size || start == end) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    22
	/* Not on one line */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    23
	if (TileX(start) != TileX(end) &&
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    24
			TileY(start) != TileY(end)) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    25
9483
0c6d80b1a87e (svn r9333) [NoAI] -Add: added DC_AUTO for DoCommand in AIRoad() to avoid building over existing structures we can remove
truelight
parents: 9482
diff changeset
    26
	return this->DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | 3, DC_EXEC | DC_AUTO, CMD_BUILD_LONG_ROAD);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    27
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    28
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    29
bool AIRoad::BuildRoadDepot(TileIndex tile, TileIndex front)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    30
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    31
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    32
	if (tile >= _map_size || tile == front) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    33
9482
5e0418292ecc (svn r9331) [NoAI] -Fix: AIRoad() had most directions wrong, should be okay now
truelight
parents: 9453
diff changeset
    34
	uint entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 3 : 1) : (TileX(tile) < TileX(front) ? 2: 0);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    35
9483
0c6d80b1a87e (svn r9333) [NoAI] -Add: added DC_AUTO for DoCommand in AIRoad() to avoid building over existing structures we can remove
truelight
parents: 9482
diff changeset
    36
	return this->DoCommand(tile, entrance_dir, 0, DC_EXEC | DC_AUTO, CMD_BUILD_ROAD_DEPOT);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    37
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    38
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    39
bool AIRoad::BuildRoadStation(TileIndex tile, TileIndex front, bool bus, bool drive_through)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    40
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    41
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    42
	if (tile >= _map_size || tile == front) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    43
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    44
	uint entrance_dir;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    45
	if (drive_through) {
9482
5e0418292ecc (svn r9331) [NoAI] -Fix: AIRoad() had most directions wrong, should be okay now
truelight
parents: 9453
diff changeset
    46
		entrance_dir = TileY(tile) != TileY(front);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    47
	} else {
9482
5e0418292ecc (svn r9331) [NoAI] -Fix: AIRoad() had most directions wrong, should be okay now
truelight
parents: 9453
diff changeset
    48
		entrance_dir = (TileX(tile) == TileX(front)) ? (TileY(tile) < TileY(front) ? 3 : 1) : (TileX(tile) < TileX(front) ? 2: 0);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    49
	}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    50
9483
0c6d80b1a87e (svn r9333) [NoAI] -Add: added DC_AUTO for DoCommand in AIRoad() to avoid building over existing structures we can remove
truelight
parents: 9482
diff changeset
    51
	return this->DoCommand(tile, entrance_dir, drive_through << 1 | bus, DC_EXEC | DC_AUTO, CMD_BUILD_ROAD_STOP);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    52
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    53
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    54
bool AIRoad::RemoveRoad(TileIndex start, TileIndex end)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    55
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    56
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    57
	if (start >= _map_size || end >= _map_size) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    58
	/* Not on one line */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    59
	if (TileX(start) != TileX(end) &&
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    60
			TileY(start) != TileY(end)) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    61
9482
5e0418292ecc (svn r9331) [NoAI] -Fix: AIRoad() had most directions wrong, should be okay now
truelight
parents: 9453
diff changeset
    62
	return this->DoCommand(end, start, (TileY(start) != TileY(end) ? 4 : 0) | 3, DC_EXEC, CMD_REMOVE_LONG_ROAD);
9453
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    63
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    64
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    65
bool AIRoad::RemoveRoadDepot(TileIndex tile)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    66
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    67
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    68
	if (tile >= _map_size) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    69
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    70
	/* Not a road depot tile */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    71
	if (!IsTileType(tile, MP_STREET) || GetRoadTileType(tile) != ROAD_TILE_DEPOT) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    72
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    73
	return this->DoCommand(tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    74
}
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    75
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    76
bool AIRoad::RemoveRoadStation(TileIndex tile)
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    77
{
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    78
	/* Outside of the map */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    79
	if (tile >= _map_size) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    80
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    81
	/* Not a road station tile */
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    82
	if (!IsTileType(tile, MP_STATION) || !IsRoadStop(tile)) return false;
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    83
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    84
	return this->DoCommand(tile, 0, GetRoadStopType(tile), DC_EXEC, CMD_REMOVE_ROAD_STOP);
727ff178a582 (svn r9283) [NoAI] -Add: API for adding/removing road, road depots and road stations.
rubidium
parents:
diff changeset
    85
}