|
@@ -108,49 +108,49 @@ void MakeDefaultWaypointName(Waypoint *w
|
|
|
bool used_waypoint[MAX_WAYPOINTS_PER_TOWN];
|
|
|
int i;
|
|
|
|
|
|
wp->town_index = ClosestTownFromTile(wp->xy, (uint)-1)->index;
|
|
|
|
|
|
memset(used_waypoint, 0, sizeof(used_waypoint));
|
|
|
|
|
|
/* Find an unused waypoint number belonging to this town */
|
|
|
FOR_ALL_WAYPOINTS(local_wp) {
|
|
|
if (wp == local_wp)
|
|
|
continue;
|
|
|
|
|
|
if (local_wp->xy && local_wp->string == STR_NULL && local_wp->town_index == wp->town_index)
|
|
|
used_waypoint[local_wp->town_cn] = true;
|
|
|
}
|
|
|
|
|
|
/* Find an empty spot */
|
|
|
for (i = 0; used_waypoint[i] && i < MAX_WAYPOINTS_PER_TOWN; i++) {}
|
|
|
|
|
|
wp->string = STR_NULL;
|
|
|
wp->town_cn = i;
|
|
|
}
|
|
|
|
|
|
/* Find a deleted waypoint close to a tile. */
|
|
|
static Waypoint *FindDeletedWaypointCloseTo(uint tile)
|
|
|
static Waypoint *FindDeletedWaypointCloseTo(TileIndex tile)
|
|
|
{
|
|
|
Waypoint *wp, *best = NULL;
|
|
|
uint thres = 8, cur_dist;
|
|
|
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (wp->deleted && wp->xy) {
|
|
|
cur_dist = DistanceManhattan(tile, wp->xy);
|
|
|
if (cur_dist < thres) {
|
|
|
thres = cur_dist;
|
|
|
best = wp;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return best;
|
|
|
}
|
|
|
|
|
|
/** Convert existing rail to waypoint. Eg build a waypoint station over
|
|
|
* piece of rail
|
|
|
* @param x,y coordinates where waypoint will be built
|
|
|
* @param p1 graphics for waypoint type, bit 8 signifies custom waypoint gfx (& 0x100)
|
|
|
* @param p2 unused
|
|
|
*/
|
|
|
int32 CmdBuildTrainWaypoint(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|
@@ -222,49 +222,49 @@ static void DoDeleteWaypoint(Waypoint *w
|
|
|
order.type = OT_GOTO_WAYPOINT;
|
|
|
order.station = wp->index;
|
|
|
DeleteDestinationFromVehicleOrder(order);
|
|
|
|
|
|
if (wp->string != STR_NULL)
|
|
|
DeleteName(wp->string);
|
|
|
|
|
|
RedrawWaypointSign(wp);
|
|
|
}
|
|
|
|
|
|
/* Daily loop for waypoints */
|
|
|
void WaypointsDailyLoop(void)
|
|
|
{
|
|
|
Waypoint *wp;
|
|
|
|
|
|
/* Check if we need to delete a waypoint */
|
|
|
FOR_ALL_WAYPOINTS(wp) {
|
|
|
if (wp->deleted && !--wp->deleted) {
|
|
|
DoDeleteWaypoint(wp);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/* Remove a waypoint */
|
|
|
int32 RemoveTrainWaypoint(uint tile, uint32 flags, bool justremove)
|
|
|
int32 RemoveTrainWaypoint(TileIndex tile, uint32 flags, bool justremove)
|
|
|
{
|
|
|
Waypoint *wp;
|
|
|
|
|
|
/* Make sure it's a waypoint */
|
|
|
if (!IsTileType(tile, MP_RAILWAY) || !IsRailWaypoint(_map5[tile]))
|
|
|
return CMD_ERROR;
|
|
|
|
|
|
if (!CheckTileOwnership(tile) && !(_current_player == OWNER_WATER))
|
|
|
return CMD_ERROR;
|
|
|
|
|
|
if (!EnsureNoVehicle(tile))
|
|
|
return CMD_ERROR;
|
|
|
|
|
|
if (flags & DC_EXEC) {
|
|
|
int direction = _map5[tile] & RAIL_WAYPOINT_TRACK_MASK;
|
|
|
|
|
|
wp = GetWaypointByTile(tile);
|
|
|
|
|
|
wp->deleted = 30; // let it live for this many days before we do the actual deletion.
|
|
|
RedrawWaypointSign(wp);
|
|
|
|
|
|
if (justremove) {
|
|
|
ModifyTile(tile, MP_MAP5, 1<<direction);
|
|
|
_map3_lo[tile] &= ~16;
|
|
@@ -314,49 +314,49 @@ int32 CmdRenameWaypoint(int x, int y, ui
|
|
|
|
|
|
wp->string = str;
|
|
|
wp->town_cn = 0;
|
|
|
|
|
|
UpdateWaypointSign(wp);
|
|
|
MarkWholeScreenDirty();
|
|
|
} else {
|
|
|
DeleteName(str);
|
|
|
}
|
|
|
} else {
|
|
|
if (flags & DC_EXEC) {
|
|
|
wp = GetWaypoint(p1);
|
|
|
if (wp->string != STR_NULL)
|
|
|
DeleteName(wp->string);
|
|
|
|
|
|
MakeDefaultWaypointName(wp);
|
|
|
UpdateWaypointSign(wp);
|
|
|
MarkWholeScreenDirty();
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/* This hacks together some dummy one-shot Station structure for a waypoint. */
|
|
|
Station *ComposeWaypointStation(uint tile)
|
|
|
Station *ComposeWaypointStation(TileIndex tile)
|
|
|
{
|
|
|
Waypoint *wp = GetWaypointByTile(tile);
|
|
|
static Station stat;
|
|
|
|
|
|
stat.train_tile = stat.xy = wp->xy;
|
|
|
stat.town = GetTown(wp->town_index);
|
|
|
stat.string_id = wp->string == STR_NULL ? /* FIXME? */ 0 : wp->string;
|
|
|
stat.build_date = wp->build_date;
|
|
|
stat.class_id = 6;
|
|
|
stat.stat_id = wp->stat_id;
|
|
|
|
|
|
return &stat;
|
|
|
}
|
|
|
|
|
|
extern uint16 _custom_sprites_base;
|
|
|
|
|
|
/* Draw a waypoint */
|
|
|
void DrawWaypointSprite(int x, int y, int stat_id, int railtype)
|
|
|
{
|
|
|
StationSpec *stat;
|
|
|
uint32 relocation;
|
|
|
DrawTileSprites *cust;
|
|
|
DrawTileSeqStruct const *seq;
|
|
|
uint32 ormod, img;
|