Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/engine/state/inter_city_connection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@ export type Offset = z.infer<typeof Offset>;
export const InterCityConnection = z.object({
id: z.string(),
connects: CoordinatesZod.array(),
connectedTownExits: DirectionZod.array().optional(),
cost: z.number(),
center: CoordinatesZod.optional(),
offset: Offset.optional(),

// No owner means the connection isn't built. An owner but no color means it's built but unowned.
owner: z.object({ color: PlayerColorZod.optional() }).optional(),
});
Expand Down
2 changes: 1 addition & 1 deletion src/maps/denmark/build_validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -174,4 +174,4 @@ function hasDuplicateOwnedRoute(routes: RouteInfo[]): boolean {
}
}
return false;
}
}
2 changes: 1 addition & 1 deletion src/maps/denmark/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,4 @@ export class DenmarkMapSettings implements MapSettings {
}),
];
}
}
}
3 changes: 3 additions & 0 deletions src/maps/factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { OnRoll, OnRollData } from "../engine/state/roll";
import { CityData, LandData } from "../engine/state/space";
import { Coordinates } from "../utils/coordinates";
import { duplicate } from "../utils/functions";
import { Direction } from "../engine/state/tile";

export const PLAIN: LandData = {
type: SpaceType.PLAIN,
Expand Down Expand Up @@ -150,6 +151,7 @@ interface InterCityConnectionFactoryProps {
cost?: number;
center?: [number, number];
offset?: Offset;
connectedTownExits?: Direction[];
}

export function interCityConnections(
Expand All @@ -167,6 +169,7 @@ export function interCityConnections(
id: "" + (idx + 1),
connects: [cities.get(spec.connects[0])!, cities.get(spec.connects[1])!],
cost: spec.cost ?? 2,
connectedTownExits: spec.connectedTownExits,
offset: spec.offset,
center: spec.center
? Coordinates.from({ q: spec.center[0], r: spec.center[1] })
Expand Down
114 changes: 0 additions & 114 deletions src/maps/portugal/lisboa.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,6 @@ import {
ConnectCitiesData,
} from "../../engine/build/connect_cities";
import { BuildPhase } from "../../engine/build/phase";
import { Validator, InvalidBuildReason } from "../../engine/build/validator";
import { BOTTOM, Direction } from "../../engine/state/tile";
import { MoveValidator, RouteInfo } from "../../engine/move/validator";
import { PlayerColor } from "../../engine/state/player";
import { DanglerInfo } from "../../engine/map/grid";
import { OwnedInterCityConnection } from "../../engine/state/inter_city_connection";
import { injectState } from "../../engine/framework/execution_context";
import { Key } from "../../engine/framework/key";
import { City } from "../../engine/map/city";
Expand Down Expand Up @@ -66,8 +60,6 @@ export class LisboaBuildAction extends BuildAction {
export class LisboaConnectAction extends ConnectCitiesAction {
private readonly connected = injectState(CONNECTED_TO_LISBOA);

protected validateUrbanizedCities(): void {}

validate(data: ConnectCitiesData): void {
super.validate(data);
// Only one connection out of Lisboa can be built per turn, per player.
Expand All @@ -89,89 +81,6 @@ export class LisboaConnectAction extends ConnectCitiesAction {
}
}

export class PortugalValidator extends Validator {
protected connectionAllowed(
land: Land,
exit: Direction,
): InvalidBuildReason | undefined {
if (
(land.name() === "Sagres" || land.name() === "Sines") &&
land.hasTown() &&
exit === BOTTOM
) {
return undefined;
}

return super.connectionAllowed(land, exit);
}
}

export class PortugalMoveValidator extends MoveValidator {
protected getAdditionalRoutesFromLand(location: Land): RouteInfo[] {
const grid = this.grid();
return grid.connections
.filter((connection) =>
connection.connects.some((c) => c.equals(location.coordinates)),
)
.filter((connection) => connection.owner != null)
.flatMap((connection) => {
const otherEnd = grid.get(
connection.connects.find((c) => !location.coordinates.equals(c))!,
);
if (!(otherEnd instanceof City)) {
return [];
}
if (
(isLisboa(otherEnd) || otherEnd.name() === "Madeira") &&
(location.name() === "Sagres" || location.name() === "Sines") &&
location.hasTown()
) {
return [
{
type: "connection",
destination: otherEnd.coordinates,
connection: connection as OwnedInterCityConnection,
owner: connection.owner!.color,
},
];
}
return [];
});
}

protected getAdditionalRoutesFromCity(location: City): RouteInfo[] {
const grid = this.grid();
return grid.connections
.filter((connection) =>
connection.connects.some((c) => c.equals(location.coordinates)),
)
.filter((connection) => connection.owner != null)
.flatMap((connection) => {
const otherEnd = grid.get(
connection.connects.find((c) => !location.coordinates.equals(c))!,
);
if (!(otherEnd instanceof Land)) {
return [];
}
if (
(isLisboa(location) || location.name() === "Madeira") &&
(otherEnd.name() === "Sagres" || otherEnd.name() === "Sines") &&
otherEnd.hasTown()
) {
return [
{
type: "connection",
destination: otherEnd.coordinates,
connection: connection as OwnedInterCityConnection,
owner: connection.owner!.color,
},
];
}
return [];
});
}
}

export class PortugalBuildPhase extends BuildPhase {
private readonly connected = injectState(CONNECTED_TO_LISBOA);
onStartTurn(): void {
Expand All @@ -183,29 +92,6 @@ export class PortugalBuildPhase extends BuildPhase {
this.connected.delete();
super.onEndTurn();
}

getDanglersAsInfo(color?: PlayerColor): DanglerInfo[] {
return this.grid()
.getDanglers(color)
.filter((track) => {
if (
//Sines
((track.coordinates.q === 14 && track.coordinates.r === 7) ||
//Sagres
(track.coordinates.q === 17 && track.coordinates.r === 6)) &&
this.grid().getImmovableExitReference(track) === BOTTOM
) {
return false;
}

return true;
})
.map((track) => ({
coordinates: track.coordinates,
immovableExit: this.grid().getImmovableExitReference(track),
length: this.grid().getRoute(track).length,
}));
}
}

function isLisboa(space: City | Land | undefined): boolean {
Expand Down
22 changes: 11 additions & 11 deletions src/maps/portugal/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@ import {
import { Module } from "../../engine/module/module";
import { BOTTOM, TOP } from "../../engine/state/tile";
import { OneClaimLimitModule } from "../../modules/one_claim_limit";
import { TownsAndSeaLinksModule } from "../../modules/towns_and_sea_links";
import { interCityConnections } from "../factory";
import { PortugalGoodsGrowthPhase } from "./goods";
import { map } from "./grid";
import {
LisboaBuildAction,
LisboaConnectAction,
PortugalValidator,
PortugalMoveValidator,
PortugalBuildPhase,
} from "./lisboa";

Expand Down Expand Up @@ -52,26 +51,27 @@ export class PortugalMapSettings implements MapSettings {
center: [11, 13],
offset: { direction: TOP, distance: 0.2 },
},
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 7] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 8] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 9] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 10] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 7], connectedTownExits: [BOTTOM] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 8], connectedTownExits: [BOTTOM] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 9], connectedTownExits: [BOTTOM] },
{ connects: ["Sagres", "Madeira"], cost: 6, center: [17, 10], connectedTownExits: [BOTTOM] },
{ connects: ["Lisboa", "Porto"], cost: 6, center: [6, 13] },
{ connects: ["Lisboa", "Sines"], cost: 6, center: [13, 9] },
{ connects: ["Lisboa", "Sines"], cost: 6, center: [13, 9], connectedTownExits: [BOTTOM] },
]);

getOverrides() {
return [
LisboaBuildAction,
LisboaConnectAction,
PortugalGoodsGrowthPhase,
PortugalValidator,
PortugalMoveValidator,
PortugalBuildPhase,
];
}

getModules(): Array<Module> {
return [new OneClaimLimitModule()];
return [
new OneClaimLimitModule(),
new TownsAndSeaLinksModule(),
];
}
}
}
Loading
Loading