mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-09 07:13:13 +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:
@@ -180,42 +180,6 @@ describe("Water Nukes", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("all-land map (no pre-existing ocean)", () => {
|
||||
test("nuke-created water gets ocean bit so ports can be built", async () => {
|
||||
game = await setup("plains", {
|
||||
infiniteGold: true,
|
||||
instantBuild: true,
|
||||
waterNukes: true,
|
||||
});
|
||||
const info = new PlayerInfo("p", PlayerType.Human, null, "p");
|
||||
game.addPlayer(info);
|
||||
game.addExecution(new SpawnExecution(gameID, info, game.ref(1, 1)));
|
||||
while (game.inSpawnPhase()) game.executeNextTick();
|
||||
player = game.player(info.id);
|
||||
constructionExecution(game, player, 1, 1, UnitType.MissileSilo);
|
||||
|
||||
const target = game.ref(10, 10);
|
||||
|
||||
// Verify no ocean exists anywhere near the target before the nuke
|
||||
expect(game.isLand(target)).toBe(true);
|
||||
|
||||
launchNukeAt(game, player, target);
|
||||
tickUntilNukeLands(game);
|
||||
|
||||
// The converted tile should be ocean (not just lake water)
|
||||
expect(game.isWater(target)).toBe(true);
|
||||
expect(game.isOcean(target)).toBe(true);
|
||||
|
||||
// Neighboring land tiles should be ocean-shore (required for port placement)
|
||||
const x = game.x(target);
|
||||
const y = game.y(target);
|
||||
const shoreCandidate = game.ref(x + 2, y);
|
||||
if (game.isLand(shoreCandidate)) {
|
||||
expect(game.isOceanShore(shoreCandidate)).toBe(true);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
describe("updateTile terrain byte round-trip", () => {
|
||||
test("terrain byte is packed and unpacked correctly", async () => {
|
||||
game = await setup("plains", {
|
||||
|
||||
Reference in New Issue
Block a user