mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-13 20:09:41 +00:00
Trading in lakes 🚤 (#3653)
## Description: - Widened port placement and warship spawn/patrol checks from `isOcean`/`isOceanShore` to `isWater`/`isShore`, so ports can be built on lake shores and ships can operate on lakes, we discussed it here: <img width="996" height="423" alt="image" src="https://github.com/user-attachments/assets/acf1e970-9631-4848-a0ed-6d0470616e1d" /> - Filtered `tradingPorts()` by water component so ports only attempt trades with reachable ports - prevents silent path-not-found failures across disconnected water bodies - Applied the same water component filter when a captured trade ship reroutes to its new owner's nearest port - Removed the `WaterManager` fallback that force-marked isolated water-nuked-tiles as ocean (no longer needed since lakes are now navigable) - Added a check to prevent nations from building ports on water bodies that aren't accessible to other players ## Please complete the following: - [X] I have added screenshots for all UI updates - [X] I process any text displayed to the user through translateText() and I've added it to the en.json file - [X] I have added relevant tests to the test directory - [X] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: FloPinguin --------- Co-authored-by: Evan <evanpelle@gmail.com>
This commit is contained in:
@@ -1222,7 +1222,7 @@ export class PlayerImpl implements Player {
|
||||
manhattanDistFN(tile, this.mg.config().radiusPortSpawn()),
|
||||
),
|
||||
)
|
||||
.filter((t) => this.mg.owner(t) === this && this.mg.isOceanShore(t))
|
||||
.filter((t) => this.mg.owner(t) === this && this.mg.isShore(t))
|
||||
.sort(
|
||||
(a, b) =>
|
||||
this.mg.manhattanDist(a, tile) - this.mg.manhattanDist(b, tile),
|
||||
@@ -1239,14 +1239,19 @@ export class PlayerImpl implements Player {
|
||||
}
|
||||
|
||||
warshipSpawn(tile: TileRef): TileRef | false {
|
||||
if (!this.mg.isOcean(tile)) {
|
||||
if (!this.mg.isWater(tile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const tileComponent = this.mg.getWaterComponent(tile);
|
||||
const bestPort = findClosestBy(
|
||||
this.units(UnitType.Port),
|
||||
(port) => this.mg.manhattanDist(port.tile(), tile),
|
||||
(port) => port.isActive() && !port.isUnderConstruction(),
|
||||
(port) =>
|
||||
port.isActive() &&
|
||||
!port.isUnderConstruction() &&
|
||||
tileComponent !== null &&
|
||||
this.mg.hasWaterComponent(port.tile(), tileComponent),
|
||||
);
|
||||
|
||||
return bestPort?.tile() ?? false;
|
||||
|
||||
@@ -216,14 +216,6 @@ export class WaterManager {
|
||||
}
|
||||
}
|
||||
}
|
||||
// If no converted tile is adjacent to existing ocean (e.g. all-land map),
|
||||
// mark all converted tiles as ocean so they're navigable for ports/boats.
|
||||
if (oceanQueue.length === 0) {
|
||||
for (const tile of converted) {
|
||||
map.setOcean(tile);
|
||||
oceanQueue.push(tile);
|
||||
}
|
||||
}
|
||||
let oHead = 0;
|
||||
while (oHead < oceanQueue.length) {
|
||||
const tile = oceanQueue[oHead++];
|
||||
|
||||
Reference in New Issue
Block a user