import { type CoastPart } from './blackwakeCoast.js'; import { type ShipProp } from './crescentQueen.js'; import type { TileRect } from './worldEvents.js'; export type ShipId = 'cormorant' | 'mirejack' | 'ironhush' | 'crescentqueen' | 'greywake'; type Tile = { x: number; z: number; }; export type ShipDeckDef = Readonly<{ id: string; label: string; room: TileRect; /** Where a player lands arriving on this deck from below, from above or from the shore. */ arrival: Tile; entries: ReadonlyArray; /** A room in the underground strip (lit by lanterns, carved by the backend). */ below: boolean; }>; /** A door: a `caveentrance` (`cqhatch-*`, `cqladder-*` or a rowing boat `hbrowboat--*`). `from`/`to` are deck ids or 'shore'. */ export type ShipDoorDef = Readonly<{ id: string; style: string; x: number; z: number; from: string; to: string; way: 'down' | 'up' | 'board' | 'leave'; arrive: Tile; label: string; text: string; }>; /** B11's crew roles: variants of the Blackwake kinds (a name, a size, tougher or frailer), and two that call help while they live. */ export type ShipCrewRole = 'rigger' | 'brute' | 'monkey' | 'elite' | 'drownedlookout'; /** A boss calls crew when its health falls to `at` (a share of its maximum), once per fight, with a line for everyone aboard. */ export type ShipCall = Readonly<{ at: number; crew: readonly ShipCrewDef[]; line: string; }>; /** A crewman who keeps calling help while alive (the powder monkey, the drowned lookout): one every `everyMs`, at most `max`. */ export type ShipSummon = Readonly<{ crew: ShipCrewDef; everyMs: number; max: number; line: string; }>; export type ShipCrewDef = Readonly<{ kind: 'blackwakedeckhand' | 'lookout' | 'cutthroat' | 'drowneddeckhand' | 'captainrowena' | 'ragtorskeel' | 'sablevenn' | 'brannthehush' | 'drownedcaptain'; level: number; name?: string; boss?: boolean; spot?: Tile; leash?: number; role?: ShipCrewRole; /** Health and blow as multiples of the level's (1 when absent). */ healthFactor?: number; hitFactor?: number; /** Drawn bigger or smaller than the kind's model (NpcPublic.scale). */ scale?: number; calls?: readonly ShipCall[]; summon?: ShipSummon; }>; export type ShipWaveDef = Readonly<{ deck: string; crew: readonly ShipCrewDef[]; extra: ShipCrewDef; title: string; comes: string; }>; export type ShipChestDef = Readonly<{ id: string; x: number; z: number; coins: { min: number; max: number; }; scraps: { min: number; max: number; }; cutlassChance: number; }>; export type ShipDef = Readonly<{ id: ShipId; /** "the Mire Jack", for sentences. */ name: string; /** "The Mire Jack", for the HUD and the guide. */ title: string; levels: readonly [number, number]; /** The walkable top deck's coast model, or null (the Grey Wake fights on a room; her hull is `hull`). */ part: CoastPart | null; /** Placed by another file already (the Cormorant is the cove's moored ship, southExpansion.ts; the Crescent Queen, crescentQueen.ts). */ placedElsewhere?: boolean; /** Scenery hull for an event ship: drawn only while she has risen. */ hull?: Readonly<{ id: string; model: string; x: number; z: number; style: string; }>; boardCombat: number; decks: readonly ShipDeckDef[]; doors: readonly ShipDoorDef[]; waves: readonly ShipWaveDef[]; props: readonly ShipProp[]; /** The captain's chest (the Crescent Queen has Rowena's own hoard instead, rowenaHoard.ts). */ chest?: ShipChestDef; cooldownMs: number; checkpointMs: number; /** An event ship: she is up while (now - offsetMs) mod periodMs < windowMs (UTC epoch ms). */ event?: Readonly<{ periodMs: number; windowMs: number; offsetMs: number; }>; /** The line when the last wave falls. */ won: string; /** Where anyone found below decks on a quiet ship, or aboard a sinking one, is put: the jetty at her plank, or the beach by her boat. */ exit: Tile; /** The line when the boss wave's deck is reached (the checkpoint). */ checkpointText: string; }>; export declare const rigger: (level: number) => ShipCrewDef; export declare const brute: (level: number) => ShipCrewDef; export declare const powderMonkey: (level: number) => ShipCrewDef; export declare const elite: (level: number) => ShipCrewDef; export declare const drownedLookout: (level: number) => ShipCrewDef; /** The cove's moored ship (blackwakeCoast.ts BLACKWAKE_COAST_PARTS `cove-ship`, legacy 587,1017), in the public frame. */ export declare const CORMORANT_PART: CoastPart; /** Her plank (local 3,0) and the cove jetty tile it meets. */ export declare const CORMORANT_PLANK: { readonly x: 590; readonly z: number; }; export declare const CORMORANT_PLANK_FOOT: { readonly x: 591; readonly z: number; }; export declare const MIRE_JACK_PART: CoastPart; export declare const MIRE_JACK_SHORE_BOAT: { readonly x: 706; readonly z: 1178; }; export declare const IRON_HUSH_PART: CoastPart; export declare const IRON_HUSH_SHORE_BOAT: { readonly x: 722; readonly z: 1178; }; /** * Rowena's three phases (sheet B4-v2): her twin-cutlass fight, then at two thirds health Spinning Blades (she calls her crew down the * ladders), then at a third her Final Stand (her best crew). Her whistle (the crew-whistle signature) runs through all three. */ export declare const ROWENA_PHASES: readonly ShipCall[]; export declare const GREY_WAKE_HULL: { readonly id: "sh-greywake-hull"; readonly model: "greywake"; readonly x: 740; readonly z: 1242; readonly style: "greywake-e"; }; export declare const GREY_WAKE_SHORE_BOAT: { readonly x: 714; readonly z: 1177; }; /** She rises every three hours (on the hour, UTC 00, 03, 06 ...) for twelve minutes. */ export declare const GREY_WAKE_EVENT: { readonly periodMs: number; readonly windowMs: number; readonly offsetMs: 0; }; export declare const PIRATE_SHIPS: readonly ShipDef[]; export declare function pirateShip(id: ShipId): ShipDef; /** Every walkable top-deck floor tile of a ship laid by the ship placer (not the Cormorant or the Crescent Queen, laid elsewhere). */ export declare function shipTopFloors(ship: ShipDef): Array<{ x: number; z: number; metres: number; }>; /** The plot of rock the phase 5 decks below are carved in (rooms and their walls), under the Crescent Queen's. */ export declare const PIRATE_SHIPS_BELOW_PLOT: TileRect; /** The ship and deck a tile is on, or null. */ export declare function shipDeckAt(x: number, z: number): { ship: ShipDef; deck: ShipDeckDef; } | null; /** The ship door standing at a tile with this style, or null. */ export declare function shipDoorAt(style: string | undefined, x: number, z: number): { ship: ShipDef; door: ShipDoorDef; } | null; /** A door's hover label by its entity id (the client's hover reads it). */ export declare function shipDoorLabel(entityId: string | undefined): string | null; /** Whether an event ship is up at this moment (UTC epoch ms). Ships without an event are always there. */ export declare function shipRisen(ship: ShipDef, nowMs: number): boolean; /** How long until an event ship next rises (0 while she is up). */ export declare function shipRisesInMs(ship: ShipDef, nowMs: number): number; /** The plank tiles that are walk gates (the Cormorant's and the Crescent Queen's). */ export declare const SHIP_PLANKS: { readonly cormorant: { readonly x: 590; readonly z: number; }; readonly crescentqueen: { readonly x: 606; readonly z: 1022; }; }; /** * The crew's own drop on a ship (no keys: the bay's keys come from its shore crews): a few coins by level and a chance of a scrap, * and (phase 6, pirateCosmetics.ts) their rank's rare hats, face pieces and outfit pieces, as on the shore. */ export declare function shipCrewDrop(level: number, kind?: string): Array<{ kind: string; chance: number; min: number; max: number; }>; export declare const SHIP_TEXT: { readonly sunk: (name: string, mins: number) => string; readonly rises: "The Grey Wake rises in the bay! A drowned ship, weed and grey sails, off the south beach: row out from the beach and share her chest."; readonly sinking: "The Grey Wake groans and settles: she is going under. Anyone still aboard is thrown into the boats."; readonly chestNotYours: "The chest is locked to those who fought for it."; readonly chestTaken: "You have taken your share from this chest. It fills again for the next crew."; readonly chestShut: "The captain's chest is shut tight until the captain falls."; readonly nextWave: "Breather: more are coming."; }; export {}; //# sourceMappingURL=pirateShips.d.ts.map