mirror of https://github.com/OpenTTD/OpenTTD
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
parent
e1c19367f0
commit
7bbcf5875c
30
ai.c
30
ai.c
|
@ -462,7 +462,7 @@ static void AiFindSubsidyIndustryRoute(FoundRoute *fr)
|
|||
to_xy = to_ind->xy;
|
||||
}
|
||||
|
||||
fr->distance = GetTileDist(from->xy, to_xy);
|
||||
fr->distance = DistanceManhattan(from->xy, to_xy);
|
||||
}
|
||||
|
||||
static void AiFindSubsidyPassengerRoute(FoundRoute *fr)
|
||||
|
@ -493,7 +493,7 @@ static void AiFindSubsidyPassengerRoute(FoundRoute *fr)
|
|||
if (from->population < 400 || to->population < 400)
|
||||
return;
|
||||
|
||||
fr->distance = GetTileDist(from->xy, to->xy);
|
||||
fr->distance = DistanceManhattan(from->xy, to->xy);
|
||||
}
|
||||
|
||||
static void AiFindRandomIndustryRoute(FoundRoute *fr)
|
||||
|
@ -531,7 +531,7 @@ static void AiFindRandomIndustryRoute(FoundRoute *fr)
|
|||
return;
|
||||
|
||||
fr->to = i2;
|
||||
fr->distance = GetTileDist(i->xy, i2->xy);
|
||||
fr->distance = DistanceManhattan(i->xy, i2->xy);
|
||||
} else {
|
||||
// pick a dest town, and see if it's big enough
|
||||
t = AiFindRandomTown();
|
||||
|
@ -539,7 +539,7 @@ static void AiFindRandomIndustryRoute(FoundRoute *fr)
|
|||
return;
|
||||
|
||||
fr->to = t;
|
||||
fr->distance = GetTileDist(i->xy, t->xy);
|
||||
fr->distance = DistanceManhattan(i->xy, t->xy);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -561,7 +561,7 @@ static void AiFindRandomPassengerRoute(FoundRoute *fr)
|
|||
if (dest == NULL || source == dest || dest->population < 400)
|
||||
return;
|
||||
|
||||
fr->distance = GetTileDist(source->xy, dest->xy);
|
||||
fr->distance = DistanceManhattan(source->xy, dest->xy);
|
||||
}
|
||||
|
||||
// Warn: depends on 'xy' being the first element in both Town and Industry
|
||||
|
@ -580,9 +580,9 @@ static bool AiCheckIfRouteIsGood(Player *p, FoundRoute *fr, byte bitmask)
|
|||
|
||||
dist = 0xFFFF;
|
||||
FOR_ALL_STATIONS(st) if (st->xy != 0 && st->owner == _current_player) {
|
||||
cur = GetTileDist1D(from_tile, st->xy);
|
||||
cur = DistanceMax(from_tile, st->xy);
|
||||
if (cur < dist) dist = cur;
|
||||
cur = GetTileDist1D(to_tile, st->xy);
|
||||
cur = DistanceMax(to_tile, st->xy);
|
||||
if (cur < dist) dist = cur;
|
||||
if (to_tile == from_tile && st->xy == to_tile)
|
||||
same_station++;
|
||||
|
@ -1419,7 +1419,7 @@ static void AiWantOilRigAircraftRoute(Player *p)
|
|||
// Find a random oil rig industry
|
||||
in = GetIndustry(RandomRange(_total_industries));
|
||||
if (in != NULL && in->type == IT_OIL_RIG) {
|
||||
if (GetTileDist(t->xy, in->xy) < 60)
|
||||
if (DistanceManhattan(t->xy, in->xy) < 60)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1843,7 +1843,7 @@ static bool AiEnumFollowTrack(uint tile, AiRailPathFindData *a, int track, uint
|
|||
return true;
|
||||
}
|
||||
|
||||
if (GetTileDist1D(tile, a->tile2) < 4)
|
||||
if (DistanceMax(tile, a->tile2) < 4)
|
||||
a->count++;
|
||||
|
||||
return false;
|
||||
|
@ -2028,7 +2028,7 @@ static void AiBuildRailRecursive(AiRailFinder *arf, TileIndex tile, int dir)
|
|||
|
||||
// Depth too deep?
|
||||
if (arf->depth >= 4) {
|
||||
uint dist = GetTileDist1Db(tile, arf->final_tile);
|
||||
uint dist = DistanceMaxPlusManhattan(tile, arf->final_tile);
|
||||
if (dist < arf->cur_best_dist) {
|
||||
// Store the tile that is closest to the final position.
|
||||
arf->cur_best_depth = arf->depth;
|
||||
|
@ -2620,7 +2620,7 @@ static bool AiCheckBlockDistances(Player *p, TileIndex tile)
|
|||
|
||||
do {
|
||||
if (aib->cur_building_rule != 255) {
|
||||
if (GetTileDist(aib->use_tile, tile) < 9)
|
||||
if (DistanceManhattan(aib->use_tile, tile) < 9)
|
||||
return false;
|
||||
}
|
||||
} while (++aib, --num);
|
||||
|
@ -2768,7 +2768,7 @@ static bool AiCheckRoadPathBetter(AiRoadFinder *arf, const byte *p)
|
|||
|
||||
static bool AiEnumFollowRoad(uint tile, AiRoadEnum *a, int track, uint length, byte *state)
|
||||
{
|
||||
uint dist = GetTileDist(tile, a->dest);
|
||||
uint dist = DistanceManhattan(tile, a->dest);
|
||||
uint tile2;
|
||||
|
||||
if (dist <= a->best_dist) {
|
||||
|
@ -2813,7 +2813,7 @@ static bool AiCheckRoadFinished(Player *p)
|
|||
FollowTrack(tile, 0x3000 | TRANSPORT_ROAD, _dir_by_track[i], (TPFEnumProc*)AiEnumFollowRoad, NULL, &are);
|
||||
}
|
||||
|
||||
if (GetTileDist(tile, are.dest) <= are.best_dist)
|
||||
if (DistanceManhattan(tile, are.dest) <= are.best_dist)
|
||||
return false;
|
||||
|
||||
if (are.best_dist == 0)
|
||||
|
@ -2913,7 +2913,7 @@ static void AiBuildRoadRecursive(AiRoadFinder *arf, TileIndex tile, int dir)
|
|||
|
||||
// Depth too deep?
|
||||
if (arf->depth >= 4) {
|
||||
uint dist = GetTileDist1Db(tile, arf->final_tile);
|
||||
uint dist = DistanceMaxPlusManhattan(tile, arf->final_tile);
|
||||
if (dist < arf->cur_best_dist) {
|
||||
// Store the tile that is closest to the final position.
|
||||
arf->cur_best_dist = dist;
|
||||
|
@ -3292,7 +3292,7 @@ static void AiStateAirportStuff(Player *p)
|
|||
continue;
|
||||
|
||||
// Dismiss airports too far away.
|
||||
if (GetTileDist1D(st->airport_tile, aib->spec_tile) > aib->rand_rng)
|
||||
if (DistanceMax(st->airport_tile, aib->spec_tile) > aib->rand_rng)
|
||||
continue;
|
||||
|
||||
// It's ideal airport, let's take it!
|
||||
|
|
26
ai_new.c
26
ai_new.c
|
@ -224,7 +224,7 @@ static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type) {
|
|||
// to build there
|
||||
if (!st->goods[CT_PASSENGERS].last_speed) continue;
|
||||
// Is it around our city
|
||||
if (GetTileDist(st->xy, t->xy) > 10) continue;
|
||||
if (DistanceManhattan(st->xy, t->xy) > 10) continue;
|
||||
// It does take this cargo.. what is his rating?
|
||||
if (st->goods[CT_PASSENGERS].rating < AI_CHECKCITY_CARGO_RATING) continue;
|
||||
j++;
|
||||
|
@ -287,7 +287,7 @@ static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type) {
|
|||
// It does not take this cargo
|
||||
if (!st->goods[i->produced_cargo[0]].last_speed) continue;
|
||||
// Is it around our industry
|
||||
if (GetTileDist(st->xy, i->xy) > 5) continue;
|
||||
if (DistanceManhattan(st->xy, i->xy) > 5) continue;
|
||||
// It does take this cargo.. what is his rating?
|
||||
if (st->goods[i->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
|
||||
j++;
|
||||
|
@ -410,12 +410,17 @@ static void AiNew_State_LocateRoute(Player *p) {
|
|||
max_cargo -= GetTown(p->ainew.from_ic)->act_pass + GetTown(p->ainew.temp)->act_pass;
|
||||
// max_cargo is now the amount of cargo we can move between the two cities
|
||||
// If it is more than the distance, we allow it
|
||||
if (GetTileDist(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_BUS_CARGO_DISTANCE) {
|
||||
if (DistanceManhattan(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_BUS_CARGO_DISTANCE) {
|
||||
// We found a good city/industry, save the data of it
|
||||
p->ainew.to_ic = p->ainew.temp;
|
||||
p->ainew.state = AI_STATE_FIND_STATION;
|
||||
|
||||
DEBUG(ai,1)("[AiNew - LocateRoute] Found bus-route of %d tiles long (from %d to %d)",GetTileDist(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy), p->ainew.from_ic, p->ainew.temp);
|
||||
DEBUG(ai,1)(
|
||||
"[AiNew - LocateRoute] Found bus-route of %d tiles long (from %d to %d)",
|
||||
DistanceManhattan(GetTown(p->ainew.from_ic)->xy, GetTown(p->ainew.temp)->xy),
|
||||
p->ainew.from_ic,
|
||||
p->ainew.temp
|
||||
);
|
||||
|
||||
p->ainew.from_tile = 0;
|
||||
p->ainew.to_tile = 0;
|
||||
|
@ -458,8 +463,8 @@ static void AiNew_State_LocateRoute(Player *p) {
|
|||
if (found) {
|
||||
// Yeah, they are compatible!!!
|
||||
// Check the length against the amount of goods
|
||||
if (GetTileDist(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) > AI_LOCATEROUTE_TRUCK_MIN_DISTANCE &&
|
||||
GetTileDist(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
|
||||
if (DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) > AI_LOCATEROUTE_TRUCK_MIN_DISTANCE &&
|
||||
DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy) <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
|
||||
p->ainew.to_ic = p->ainew.temp;
|
||||
if (p->ainew.from_deliver) {
|
||||
p->ainew.cargo = GetIndustry(p->ainew.from_ic)->produced_cargo[0];
|
||||
|
@ -468,7 +473,12 @@ static void AiNew_State_LocateRoute(Player *p) {
|
|||
}
|
||||
p->ainew.state = AI_STATE_FIND_STATION;
|
||||
|
||||
DEBUG(ai,1)("[AiNew - LocateRoute] Found truck-route of %d tiles long (from %d to %d)",GetTileDist(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy), p->ainew.from_ic, p->ainew.temp);
|
||||
DEBUG(ai,1)(
|
||||
"[AiNew - LocateRoute] Found truck-route of %d tiles long (from %d to %d)",
|
||||
DistanceManhattan(GetIndustry(p->ainew.from_ic)->xy, GetIndustry(p->ainew.temp)->xy),
|
||||
p->ainew.from_ic,
|
||||
p->ainew.temp
|
||||
);
|
||||
|
||||
p->ainew.from_tile = 0;
|
||||
p->ainew.to_tile = 0;
|
||||
|
@ -637,7 +647,7 @@ static void AiNew_State_FindStation(Player *p) {
|
|||
|
||||
for (x=0;x<i;x++) {
|
||||
if (found_best[x] > best ||
|
||||
(found_best[x] == best && GetTileDist(tile, new_tile) > GetTileDist(tile, found_spot[x]))) {
|
||||
(found_best[x] == best && DistanceManhattan(tile, new_tile) > DistanceManhattan(tile, found_spot[x]))) {
|
||||
new_tile = found_spot[x];
|
||||
best = found_best[x];
|
||||
}
|
||||
|
|
|
@ -153,12 +153,12 @@ static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current,
|
|||
int r, r2;
|
||||
if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION) {
|
||||
// The station is pointing to a direction, add a tile towards that direction, so the H-value is more accurate
|
||||
r = GetTileDist(current->tile, PathFinderInfo->end_tile_tl + TileOffsByDir(PathFinderInfo->end_direction));
|
||||
r2 = GetTileDist(current->tile, PathFinderInfo->end_tile_br + TileOffsByDir(PathFinderInfo->end_direction));
|
||||
r = DistanceManhattan(current->tile, PathFinderInfo->end_tile_tl + TileOffsByDir(PathFinderInfo->end_direction));
|
||||
r2 = DistanceManhattan(current->tile, PathFinderInfo->end_tile_br + TileOffsByDir(PathFinderInfo->end_direction));
|
||||
} else {
|
||||
// No direction, so just get the fastest route to the station
|
||||
r = GetTileDist(current->tile, PathFinderInfo->end_tile_tl);
|
||||
r2 = GetTileDist(current->tile, PathFinderInfo->end_tile_br);
|
||||
r = DistanceManhattan(current->tile, PathFinderInfo->end_tile_tl);
|
||||
r2 = DistanceManhattan(current->tile, PathFinderInfo->end_tile_br);
|
||||
}
|
||||
// See if the bottomright is faster than the topleft..
|
||||
if (r2 < r) r = r2;
|
||||
|
|
|
@ -48,7 +48,7 @@ static uint32 FindNearestHangar(Vehicle *v)
|
|||
// don't crash the planes if we know they can't land at the airport
|
||||
if (HASBIT(v->subtype,1) && st->airport_type == AT_SMALL && !_cheats.no_jetcrash.value) continue;
|
||||
|
||||
temp_distance = GetTileDistAdv(v->tile, st->airport_tile);
|
||||
temp_distance = DistanceSquare(v->tile, st->airport_tile);
|
||||
if (temp_distance < distance) {
|
||||
distance = temp_distance;
|
||||
index_to_target = st->index;
|
||||
|
|
14
economy.c
14
economy.c
|
@ -896,7 +896,7 @@ static void FindSubsidyPassengerRoute(FoundRoute *fr)
|
|||
if (from==to || to->xy == 0 || to->population < 400 || to->pct_pass_transported > 42)
|
||||
return;
|
||||
|
||||
fr->distance = GetTileDist(from->xy, to->xy);
|
||||
fr->distance = DistanceManhattan(from->xy, to->xy);
|
||||
}
|
||||
|
||||
static void FindSubsidyCargoRoute(FoundRoute *fr)
|
||||
|
@ -937,7 +937,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
|
|||
// Only want big towns
|
||||
if (t->xy == 0 || t->population < 900)
|
||||
return;
|
||||
fr->distance = GetTileDist(i->xy, t->xy);
|
||||
fr->distance = DistanceManhattan(i->xy, t->xy);
|
||||
fr->to = t;
|
||||
} else {
|
||||
// The destination is an industry
|
||||
|
@ -949,7 +949,7 @@ static void FindSubsidyCargoRoute(FoundRoute *fr)
|
|||
cargo != i2->accepts_cargo[1] &&
|
||||
cargo != i2->accepts_cargo[2]))
|
||||
return;
|
||||
fr->distance = GetTileDist(i->xy, i2->xy);
|
||||
fr->distance = DistanceManhattan(i->xy, i2->xy);
|
||||
fr->to = i2;
|
||||
}
|
||||
}
|
||||
|
@ -1132,7 +1132,7 @@ static void DeliverGoodsToIndustry(TileIndex xy, byte cargo_type, int num_pieces
|
|||
== ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[2]) &&
|
||||
ind->produced_cargo[0] != 0xFF &&
|
||||
ind->produced_cargo[0] != cargo_type &&
|
||||
(t=GetTileDist(ind->xy, xy)) < u) {
|
||||
(t = DistanceManhattan(ind->xy, xy)) < u) {
|
||||
u = t;
|
||||
best = ind;
|
||||
}
|
||||
|
@ -1171,7 +1171,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
|
|||
} else {
|
||||
xy = (GetIndustry(s->from))->xy;
|
||||
}
|
||||
if (GetTileDist1D(xy, from->xy) > 9)
|
||||
if (DistanceMax(xy, from->xy) > 9)
|
||||
continue;
|
||||
|
||||
/* Check distance from dest */
|
||||
|
@ -1181,7 +1181,7 @@ static bool CheckSubsidised(Station *from, Station *to, byte cargo_type)
|
|||
xy = (GetIndustry(s->to))->xy;
|
||||
}
|
||||
|
||||
if (GetTileDist1D(xy, to->xy) > 9)
|
||||
if (DistanceMax(xy, to->xy) > 9)
|
||||
continue;
|
||||
|
||||
/* Found a subsidy, change the values to indicate that it's in use */
|
||||
|
@ -1242,7 +1242,7 @@ static int32 DeliverGoods(int num_pieces, byte cargo_type, byte source, byte des
|
|||
|
||||
// Determine profit
|
||||
{
|
||||
int t = GetTileDist(s_from->xy, s_to->xy);
|
||||
int t = DistanceManhattan(s_from->xy, s_to->xy);
|
||||
int r = num_pieces;
|
||||
profit = 0;
|
||||
do {
|
||||
|
|
|
@ -169,12 +169,6 @@ void NetworkSend_Command(uint32 tile, uint32 p1, uint32 p2, uint32 cmd, CommandC
|
|||
/* misc_cmd.c */
|
||||
void PlaceTreesRandomly(void);
|
||||
|
||||
uint GetTileDist(TileIndex xy1, TileIndex xy2);
|
||||
uint GetTileDist1D(TileIndex xy1, TileIndex xy2);
|
||||
uint GetTileDist1Db(TileIndex xy1, TileIndex xy2);
|
||||
uint GetTileDistAdv(TileIndex xy1, TileIndex xy2);
|
||||
bool CheckDistanceFromEdge(TileIndex tile, uint distance);
|
||||
|
||||
void InitializeLandscapeVariables(bool only_constants);
|
||||
|
||||
/* misc.c */
|
||||
|
|
|
@ -1346,7 +1346,7 @@ static bool CheckIfIndustryTilesAreFree(uint tile, const IndustryTileTable *it,
|
|||
return false;
|
||||
}
|
||||
} else if (type == IT_TOY_SHOP) {
|
||||
if (GetTileDist1D(t->xy, cur_tile) > 9)
|
||||
if (DistanceMax(t->xy, cur_tile) > 9)
|
||||
return false;
|
||||
if (ti.type != MP_HOUSE) goto do_clear;
|
||||
} else if (type == IT_WATER_TOWER) {
|
||||
|
@ -1379,7 +1379,7 @@ static bool CheckIfTooCloseToIndustry(uint tile, int type)
|
|||
FOR_ALL_INDUSTRIES(i) {
|
||||
// check if an industry that accepts the same goods is nearby
|
||||
if (i->xy != 0 &&
|
||||
(GetTileDist1D(tile, i->xy) <= 14) &&
|
||||
(DistanceMax(tile, i->xy) <= 14) &&
|
||||
spec->accepts_cargo[0] != 0xFF &&
|
||||
spec->accepts_cargo[0] == i->accepts_cargo[0] &&
|
||||
!(_game_mode == GM_EDITOR &&
|
||||
|
@ -1392,7 +1392,7 @@ static bool CheckIfTooCloseToIndustry(uint tile, int type)
|
|||
// check "not close to" field.
|
||||
if (i->xy != 0 &&
|
||||
(i->type == spec->a || i->type == spec->b || i->type == spec->c) &&
|
||||
GetTileDist1D(tile, i->xy) <= 14) {
|
||||
DistanceMax(tile, i->xy) <= 14) {
|
||||
_error_message = STR_INDUSTRY_TOO_CLOSE;
|
||||
return false;
|
||||
}
|
||||
|
|
44
map.c
44
map.c
|
@ -108,6 +108,50 @@ uint ScaleByMapSize1D(uint n)
|
|||
}
|
||||
|
||||
|
||||
uint DistanceManhattan(TileIndex t0, TileIndex t1)
|
||||
{
|
||||
return
|
||||
abs(TileX(t0) - TileX(t1)) +
|
||||
abs(TileY(t0) - TileY(t1));
|
||||
}
|
||||
|
||||
|
||||
uint DistanceSquare(TileIndex t0, TileIndex t1)
|
||||
{
|
||||
const int x = TileX(t0) - TileX(t1);
|
||||
const int y = TileY(t0) - TileY(t1);
|
||||
return x * x + y * y;
|
||||
}
|
||||
|
||||
|
||||
uint DistanceMax(TileIndex t0, TileIndex t1)
|
||||
{
|
||||
const uint x = abs(TileX(t0) - TileX(t1));
|
||||
const uint y = abs(TileY(t0) - TileY(t1));
|
||||
return x > y ? x : y;
|
||||
}
|
||||
|
||||
|
||||
uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1)
|
||||
{
|
||||
const uint x = abs(TileX(t0) - TileX(t1));
|
||||
const uint y = abs(TileY(t0) - TileY(t1));
|
||||
return x > y ? 2 * x + y : 2 * y + x;
|
||||
}
|
||||
|
||||
|
||||
uint DistanceFromEdge(TileIndex tile)
|
||||
{
|
||||
const uint xl = TileX(tile);
|
||||
const uint yl = TileY(tile);
|
||||
const uint xh = MapSizeX() - 1 - xl;
|
||||
const uint yh = MapSizeY() - 1 - yl;
|
||||
const uint minl = xl < yl ? xl : yl;
|
||||
const uint minh = xh < yh ? xh : yh;
|
||||
return minl < minh ? minl : minh;
|
||||
}
|
||||
|
||||
|
||||
const TileIndexDiffC _tileoffs_by_dir[] = {
|
||||
{-1, 0},
|
||||
{ 0, 1},
|
||||
|
|
8
map.h
8
map.h
|
@ -72,6 +72,14 @@ static inline TileIndexDiff ToTileIndexDiff(TileIndexDiffC tidc)
|
|||
#define TILE_ADDXY(tile, x, y) TILE_ADD(tile, TILE_XY(x, y))
|
||||
|
||||
|
||||
// Functions to calculate distances
|
||||
uint DistanceManhattan(TileIndex, TileIndex); // also known as L1-Norm
|
||||
uint DistanceSquare(TileIndex, TileIndex); // euclidian- or L2-Norm squared
|
||||
uint DistanceMax(TileIndex, TileIndex); // also known as L-Infinity-Norm
|
||||
uint DistanceMaxPlusManhattan(TileIndex, TileIndex); // Max + Manhattan
|
||||
uint DistanceFromEdge(TileIndex); // shortest distance from any edge of the map
|
||||
|
||||
|
||||
static inline TileIndexDiff TileOffsByDir(uint dir)
|
||||
{
|
||||
extern const TileIndexDiffC _tileoffs_by_dir[4];
|
||||
|
|
37
misc.c
37
misc.c
|
@ -533,43 +533,6 @@ void InitializeLandscapeVariables(bool only_constants)
|
|||
}
|
||||
}
|
||||
|
||||
// distance in Manhattan metric
|
||||
uint GetTileDist(TileIndex xy1, TileIndex xy2)
|
||||
{
|
||||
return myabs(TileX(xy1) - TileX(xy2)) +
|
||||
myabs(TileY(xy1) - TileY(xy2));
|
||||
}
|
||||
|
||||
// maximum distance in x _or_ y
|
||||
uint GetTileDist1D(TileIndex xy1, TileIndex xy2)
|
||||
{
|
||||
return max(myabs(TileX(xy1) - TileX(xy2)),
|
||||
myabs(TileY(xy1) - TileY(xy2)));
|
||||
}
|
||||
|
||||
uint GetTileDist1Db(TileIndex xy1, TileIndex xy2)
|
||||
{
|
||||
int a = myabs(TileX(xy1) - TileX(xy2));
|
||||
int b = myabs(TileY(xy1) - TileY(xy2));
|
||||
|
||||
if (a > b)
|
||||
return a*2+b;
|
||||
else
|
||||
return b*2+a;
|
||||
}
|
||||
|
||||
uint GetTileDistAdv(TileIndex xy1, TileIndex xy2)
|
||||
{
|
||||
uint a = myabs(TileX(xy1) - TileX(xy2));
|
||||
uint b = myabs(TileY(xy1) - TileY(xy2));
|
||||
return a*a+b*b;
|
||||
}
|
||||
|
||||
bool CheckDistanceFromEdge(TileIndex tile, uint distance)
|
||||
{
|
||||
return IS_INT_INSIDE(TileX(tile), distance, MapSizeX() - distance) &&
|
||||
IS_INT_INSIDE(TileY(tile), distance, MapSizeY() - distance);
|
||||
}
|
||||
|
||||
void OnNewDay_Train(Vehicle *v);
|
||||
void OnNewDay_RoadVeh(Vehicle *v);
|
||||
|
|
|
@ -140,7 +140,7 @@ int32 CmdInsertOrder(int x, int y, uint32 flags, uint32 veh_sel, uint32 packed_o
|
|||
if (v->type == VEH_Ship && IS_HUMAN_PLAYER(v->owner) &&
|
||||
sel != 0 && GetVehicleOrder(v, sel - 1)->type == OT_GOTO_STATION) {
|
||||
|
||||
int dist = GetTileDist(
|
||||
int dist = DistanceManhattan(
|
||||
GetStation(GetVehicleOrder(v, sel - 1)->station)->xy,
|
||||
GetStation(new_order.station)->xy
|
||||
);
|
||||
|
|
|
@ -701,7 +701,7 @@ static Waypoint *FindDeletedWaypointCloseTo(uint tile)
|
|||
|
||||
for(cp = _waypoints; cp != endof(_waypoints); cp++) {
|
||||
if (cp->deleted && cp->xy) {
|
||||
cur_dist = GetTileDist(tile, cp->xy);
|
||||
cur_dist = DistanceManhattan(tile, cp->xy);
|
||||
if (cur_dist < thres) {
|
||||
thres = cur_dist;
|
||||
best = cp;
|
||||
|
|
|
@ -973,7 +973,7 @@ static void TileLoop_Road(uint tile)
|
|||
|
||||
// Show an animation to indicate road work
|
||||
if (t->road_build_months != 0 &&
|
||||
!(GetTileDist(t->xy, tile) >= 8 && grp==0) &&
|
||||
!(DistanceManhattan(t->xy, tile) >= 8 && grp == 0) &&
|
||||
(_map5[tile]==5 || _map5[tile]==10)) {
|
||||
if (GetTileSlope(tile, NULL) == 0 && EnsureNoVehicle(tile) && CHANCE16(1,20)) {
|
||||
_map2[tile] = ((_map2[tile]&7) <= 1) ? 6 : 7;
|
||||
|
|
|
@ -651,7 +651,7 @@ static void ProcessRoadVehOrder(Vehicle *v)
|
|||
dist = malloc(num * sizeof(int32));
|
||||
|
||||
do {
|
||||
*dist = GetTileDistAdv(v->tile, rs->xy);
|
||||
*dist = DistanceSquare(v->tile, rs->xy);
|
||||
if (*dist < mindist) {
|
||||
v->dest_tile = rs->xy;
|
||||
}
|
||||
|
@ -999,7 +999,7 @@ typedef struct {
|
|||
|
||||
static bool EnumRoadTrackFindDist(uint tile, FindRoadToChooseData *frd, int track, uint length, byte *state)
|
||||
{
|
||||
uint dist = GetTileDist(tile, frd->dest);
|
||||
uint dist = DistanceManhattan(tile, frd->dest);
|
||||
if (dist <= frd->mindist) {
|
||||
if (dist != frd->mindist || length < frd->maxtracklen) {
|
||||
frd->maxtracklen = length;
|
||||
|
@ -1577,9 +1577,9 @@ static void CheckIfRoadVehNeedsService(Vehicle *v)
|
|||
|
||||
i = FindClosestRoadDepot(v);
|
||||
|
||||
if (i < 0 || GetTileDist(v->tile, (&_depots[i])->xy) > 12) {
|
||||
if (i < 0 || DistanceManhattan(v->tile, (&_depots[i])->xy) > 12) {
|
||||
if (v->current_order.type == OT_GOTO_DEPOT && !(
|
||||
GetTileDist(v->tile, v->dest_tile) > 25 && v->set_for_replacement)) {
|
||||
DistanceManhattan(v->tile, v->dest_tile) > 25 && v->set_for_replacement)) {
|
||||
/* a vehicle needs a greater distance to a depot to loose it than to find it since
|
||||
they can circle forever othervise if they are in a loop with an unlucky distance */
|
||||
v->current_order.type = OT_DUMMY;
|
||||
|
|
|
@ -73,7 +73,7 @@ static int FindClosestShipDepot(Vehicle *v)
|
|||
for(i=0; i!=lengthof(_depots); i++) {
|
||||
tile = _depots[i].xy;
|
||||
if (IsTileType(tile, MP_WATER) && _map_owner[tile] == owner) {
|
||||
dist = GetTileDist(tile, tile2);
|
||||
dist = DistanceManhattan(tile, tile2);
|
||||
if (dist < best_dist) {
|
||||
best_dist = dist;
|
||||
best_depot = i;
|
||||
|
@ -106,7 +106,7 @@ static void CheckIfShipNeedsService(Vehicle *v)
|
|||
|
||||
i = FindClosestShipDepot(v);
|
||||
|
||||
if (i < 0 || GetTileDist(v->tile, (&_depots[i])->xy) > 12) {
|
||||
if (i < 0 || DistanceManhattan(v->tile, (&_depots[i])->xy) > 12) {
|
||||
if (v->current_order.type == OT_GOTO_DEPOT) {
|
||||
v->current_order.type = OT_DUMMY;
|
||||
v->current_order.flags = 0;
|
||||
|
@ -499,7 +499,7 @@ static bool ShipTrackFollower(uint tile, PathFindShip *pfs, int track, uint leng
|
|||
|
||||
// Skip this tile in the calculation
|
||||
if (tile != pfs->skiptile) {
|
||||
pfs->best_bird_dist = minu(pfs->best_bird_dist, GetTileDist1Db(pfs->dest_coords, tile));
|
||||
pfs->best_bird_dist = minu(pfs->best_bird_dist, DistanceMaxPlusManhattan(pfs->dest_coords, tile));
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -318,7 +318,7 @@ static bool GenerateStationName(Station *st, uint tile, int flag)
|
|||
}
|
||||
|
||||
/* check close enough to town to get central as name? */
|
||||
if (GetTileDist1D(tile,t->xy) < 8) {
|
||||
if (DistanceMax(tile,t->xy) < 8) {
|
||||
found = M(STR_SV_STNAME);
|
||||
if (HASBIT(free_names, M(STR_SV_STNAME))) goto done;
|
||||
|
||||
|
@ -328,7 +328,7 @@ static bool GenerateStationName(Station *st, uint tile, int flag)
|
|||
|
||||
/* Check lakeside */
|
||||
if (HASBIT(free_names, M(STR_SV_STNAME_LAKESIDE)) &&
|
||||
!CheckDistanceFromEdge(tile, 20) &&
|
||||
DistanceFromEdge(tile) < 20 &&
|
||||
CountMapSquareAround(tile, MP_WATER, 0, 0) >= 5) {
|
||||
found = M(STR_SV_STNAME_LAKESIDE);
|
||||
goto done;
|
||||
|
@ -386,7 +386,7 @@ static Station *GetClosestStationFromTile(uint tile, uint threshold, byte owner)
|
|||
uint cur_dist;
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
cur_dist = GetTileDist(tile, st->xy);
|
||||
cur_dist = DistanceManhattan(tile, st->xy);
|
||||
if (cur_dist < threshold && (owner == 0xFF || st->owner == owner) && (st->xy != 0)) {
|
||||
threshold = cur_dist;
|
||||
best_station = st;
|
||||
|
@ -2591,7 +2591,8 @@ void ModifyStationRatingAround(TileIndex tile, byte owner, int amount, uint radi
|
|||
int i;
|
||||
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (st->xy != 0 && st->owner == owner && GetTileDist(tile, st->xy) <= radius) {
|
||||
if (st->xy != 0 && st->owner == owner &&
|
||||
DistanceManhattan(tile, st->xy) <= radius) {
|
||||
ge = st->goods;
|
||||
for(i=0; i!=NUM_CARGO; i++,ge++) {
|
||||
if (ge->enroute_from != 0xFF) {
|
||||
|
|
12
town_cmd.c
12
town_cmd.c
|
@ -166,7 +166,7 @@ static bool IsCloseToTown(uint tile, uint dist)
|
|||
Town *t;
|
||||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy != 0 && GetTileDist(tile, t->xy) < dist)
|
||||
if (t->xy != 0 && DistanceManhattan(tile, t->xy) < dist)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -970,7 +970,7 @@ int32 CmdBuildTown(int x, int y, uint32 flags, uint32 p1, uint32 p2)
|
|||
SET_EXPENSES_TYPE(EXPENSES_OTHER);
|
||||
|
||||
// Check if too close to the edge of map
|
||||
if (!CheckDistanceFromEdge(tile, 12))
|
||||
if (DistanceFromEdge(tile) < 12)
|
||||
return_cmd_error(STR_0237_TOO_CLOSE_TO_EDGE_OF_MAP);
|
||||
|
||||
// Can only build on clear flat areas.
|
||||
|
@ -1008,7 +1008,7 @@ Town *CreateRandomTown(void)
|
|||
do {
|
||||
// Generate a tile index not too close from the edge
|
||||
tile = TILE_MASK(Random());
|
||||
if (!CheckDistanceFromEdge(tile, 20))
|
||||
if (DistanceFromEdge(tile) < 20)
|
||||
continue;
|
||||
|
||||
// Make sure the tile is plain
|
||||
|
@ -1074,7 +1074,7 @@ int GetTownRadiusGroup(Town *t, uint tile)
|
|||
uint dist;
|
||||
int i,smallest;
|
||||
|
||||
dist = GetTileDistAdv(tile, t->xy);
|
||||
dist = DistanceSquare(tile, t->xy);
|
||||
if (t->fund_buildings_months && dist <= 25)
|
||||
return 4;
|
||||
|
||||
|
@ -1637,7 +1637,7 @@ static void UpdateTownGrowRate(Town *t)
|
|||
|
||||
n = 0;
|
||||
FOR_ALL_STATIONS(st) {
|
||||
if (GetTileDistAdv(st->xy, t->xy) <= t->radius[0]) {
|
||||
if (DistanceSquare(st->xy, t->xy) <= t->radius[0]) {
|
||||
if (st->time_since_load <= 20 || st->time_since_unload <= 20) {
|
||||
n++;
|
||||
if (st->owner < MAX_PLAYERS && t->ratings[st->owner] <= 1000-12)
|
||||
|
@ -1740,7 +1740,7 @@ Town *ClosestTownFromTile(uint tile, uint threshold)
|
|||
|
||||
FOR_ALL_TOWNS(t) {
|
||||
if (t->xy != 0) {
|
||||
dist = GetTileDist(tile, t->xy);
|
||||
dist = DistanceManhattan(tile, t->xy);
|
||||
if (dist < best) {
|
||||
best = dist;
|
||||
best_town = t;
|
||||
|
|
|
@ -1598,7 +1598,7 @@ static bool TrainTrackFollower(uint tile, TrainTrackFollowerData *ttfd, int trac
|
|||
return length >= ttfd->best_track_dist;
|
||||
|
||||
// didn't find station
|
||||
dist = GetTileDist(tile, ttfd->dest_coords);
|
||||
dist = DistanceManhattan(tile, ttfd->dest_coords);
|
||||
if (dist < ttfd->best_bird_dist) {
|
||||
ttfd->best_bird_dist = dist;
|
||||
ttfd->best_track = state[1];
|
||||
|
|
Loading…
Reference in New Issue