/** * THE CRESCENT QUEEN, pirate bay phase 4 (James, 2026-10-15: "needs a pirate boss area ... downstairs in a huge pirate ship ... that u * have to fight to reach"; sheets pirate-bay-b03 "the boss ship", b04-v2 "the lowest hold", b09 "the wave fight", b12 "the ship and * fight prop kit"; plan `.cursor/task-plans/2026-10-15-pirate-bay-phase4.md`). * * Captain Rowena Blackwake's flagship lies broadside across the channel at the end of Port Blackwake's guarded jetty, her plank on the * end platform (The Guarded Jetty's "MOOR HER HERE"). Boarding wants Combat 28 and The Guarded Jetty (a standard walk gate on the * plank, areaGates.ts). The fight is B9's wave fight, deck by deck: wave 1 on the open top deck, then down the hatch to the gun deck * (wave 2), the orlop (wave 3) and the lowest hold, where Rowena and her best crew wait (wave 4, the boss wave). Each deck's hatch * opens only when its wave is beaten; a short breather comes before each wave below; reaching the hold is the checkpoint (a team * wiped there may come straight back down for a while); a team wipe anywhere else resets the ship; a win puts her on a cooldown. * Waves scale lightly with how many are aboard (up to four). The prize is Rowena's own hoard chest at the back of the hold. * * The top deck is a coast model on the finished world (public tiles, like Port Blackwake); the three decks below are rooms carved in * the underground strip (raw strip tiles, x >= UNDERGROUND_ORIGIN_X), reached by the hatches and left by the ladders. * Levels, wave sizes and timings are PLACEHOLDERS (the balance pass comes last, with James). */ import { type CoastPart } from './blackwakeCoast.js'; import type { TileRect } from './worldEvents.js'; export declare const CRESCENT_QUEEN_NAME = "the Crescent Queen"; export declare const CRESCENT_QUEEN_TITLE = "The Crescent Queen"; export declare const CRESCENT_QUEEN_MODEL = "crescentqueen"; /** The ship: broadside across the channel north of the jetty's end, bow west, the plank (local dx 5) south onto the platform. */ export declare const CRESCENT_QUEEN_PART: CoastPart; /** Every deck tile of the top deck, plank included (public tiles, exact 3 m floors). */ export declare const CRESCENT_QUEEN_FLOORS: ReadonlyArray<{ x: number; z: number; metres: number; }>; /** The plank tile (the walk gate's band) and the jetty platform tile it lands on. */ export declare const CQ_PLANK: { readonly x: 606; readonly z: 1022; }; export declare const CQ_PLANK_FOOT: { readonly x: 606; readonly z: 1023; }; /** The same tile in the generator frame, for the Captain's Gate's step (expandedContracts.ts shifts that quest's places once). */ export declare const CQ_PLANK_FOOT_LEGACY: { readonly x: 606; readonly z: number; }; /** The open top deck between the rails, stern cabin to bow (the wave 1 arena and the "aboard" box). */ export declare const CQ_TOP_DECK: TileRect; /** What boarding asks (the plank's walk gate): Rowena's band, and the jetty taken. */ export declare const CQ_BOARD_COMBAT = 28; export declare const CQ_BOARD_QUEST = "theGuardedJetty"; export type ShipDeckId = 'top' | 'gun' | 'orlop' | 'hold'; export declare const SHIP_DECK_ORDER: readonly ShipDeckId[]; export type ShipDeck = Readonly<{ id: ShipDeckId; label: string; /** The walkable deck (the top deck's open boards; below, the carved room). */ room: TileRect; /** Where a player lands coming down (or, for the top deck, coming back up). */ arrival: { x: number; z: number; }; /** The hatch down to the next deck (a `caveentrance` with style `cqhatch-`); none in the hold. */ hatch?: { x: number; z: number; style: string; }; /** The ladder back up (a `caveentrance` with style `cqladder-`, on the room's south wall); none on the top deck. */ ladder?: { x: number; z: number; style: string; }; /** Where the crew come in: over the rails, down the ropes, up the ladders (B9). Snapped to a standable tile in the room. */ entries: ReadonlyArray; }>; /** The plot of rock the three decks below are carved in (rooms and their walls). */ export declare const CQ_BELOW_PLOT: TileRect; export declare const CRESCENT_QUEEN_DECKS: Readonly>; /** Where Rowena stands in the hold, her leash, and her hoard chest at the back of it (B4: "Treasure chest (center-back)"). */ export declare const CQ_ROWENA_SPOT: { readonly x: 1108; readonly z: 1150; }; export declare const CQ_ROWENA_LEASH = 5; export declare const CQ_HOARD_AT: { readonly x: 1108; readonly z: 1145; }; /** The hold's four timber posts (B4's pillars, line of sight to hide behind) and its cargo. */ export declare const CQ_HOLD_PILLARS: ReadonlyArray; export type ShipProp = Readonly<{ id: string; model: string; x: number; z: number; facing: 'n' | 'e' | 's' | 'w'; }>; export declare const CQ_BELOW_PROPS: readonly ShipProp[]; /** The ship's door at a tile (a hatch or a ladder) and which deck it belongs to; null for anything else. */ export type ShipDoor = Readonly<{ deck: ShipDeckId; way: 'down' | 'up'; }>; export declare function crescentQueenDoorAt(style: string | undefined, x: number, z: number): ShipDoor | null; /** The Blender model a ship door draws with (caveEntranceModel). */ export declare function crescentQueenDoorModel(style: string | undefined): string | null; export declare const CQ_HATCH_LABEL = "Go down the hatch"; export declare const CQ_LADDER_LABEL = "Climb the ladder"; /** The deck a tile is on, or null when it is not on the ship. */ export declare function crescentQueenDeckAt(x: number, z: number): ShipDeckId | null; export declare function onCrescentQueen(x: number, z: number): boolean; /** The decks below (the carved plot), for the aggro rule and the lighting. */ export declare function belowCrescentQueen(x: number, z: number): boolean; export type ShipCrewKind = 'blackwakedeckhand' | 'lookout' | 'cutthroat' | 'captainrowena'; export type ShipCrew = Readonly<{ kind: ShipCrewKind; level: number; }>; export type ShipWave = Readonly<{ deck: ShipDeckId; /** The crew a lone boarder meets. */ crew: readonly ShipCrew[]; /** One more of these for each boarder past the first, up to SHIP_MAX_PARTY. */ extra: ShipCrew; /** What the HUD and the chat call the wave. */ title: string; /** The line when it comes in. */ comes: string; }>; /** Light scaling (B9: "Enemy count scales lightly and stays manageable for early game"): at most four boarders count. */ export declare const SHIP_MAX_PARTY = 4; export declare const CRESCENT_QUEEN_WAVES: readonly ShipWave[]; export declare function shipWaveFor(deck: ShipDeckId): ShipWave; /** The crew a wave sends at `party` boarders (1..SHIP_MAX_PARTY). Pure. */ export declare function shipWaveCrew(wave: ShipWave, party: number): ShipCrew[]; /** A wave crewman's health and blow at its level (the Blackwake crew's own ratio, about half the level). */ export declare function shipCrewMaxHit(level: number): number; /** Rowena's whistle in the hold calls this many boarders down the side ladders (her fort wave's sizes, gullsRook.ts rowenaWaveSize). */ export declare const CQ_WHISTLE_LEVEL = 26; /** The breather before each wave below: you have climbed down, they are coming up the ladders. */ export declare const SHIP_BREATHER_MS = 6000; /** Nobody alive aboard for this long is a team wipe. */ export declare const SHIP_WIPE_GRACE_MS = 8000; /** After a wipe in the hold, the decks above stay clear and the hatches open this long for the same crew to come back. */ export declare const SHIP_CHECKPOINT_MS: number; /** After Rowena falls, the ship is quiet this long before a new crew musters (B4: "Reset ~20 minutes"). */ export declare const SHIP_COOLDOWN_MS: number; export type ShipFightStage = 'breather' | 'wave' | 'cleared' | 'checkpoint' | 'won' | 'cooldown'; export type ShipFightView = { ship: string; name: string; stage: ShipFightStage; /** 1-based; `waves` is 4 (the hold is the boss wave). */ wave: number; waves: number; deck: string; crewLeft: number; crewTotal: number; /** The boss bar, in the hold. */ boss?: { name: string; health: number; healthMax: number; }; /** The breather's, the checkpoint's or the cooldown's time left. */ msLeft?: number; /** One line under the counter ("The hatch is free: go below."). */ line: string; }; export declare const CQ_TEXT: { readonly hatchShut: "The hatch is battened down from below. Clear this deck first."; readonly hatchQuiet: "The hatch is chained. Her crew are mustering below; the ship will be ready to fight again soon."; readonly down: (deck: string) => string; readonly up: (deck: string) => string; readonly breather: "Feet on the ladders below: they are coming. Eat now if you need to."; readonly cleared: (n: number, of: number) => string; readonly checkpoint: "You reached the lowest hold: if you all fall here, you may come straight back down to her."; readonly wipe: "The Crescent Queen's crew close the hatches over the last of you. Her decks are manned again."; readonly wipeCheckpoint: "You are thrown off the ship, but the decks above the hold stay clear for a while: come straight back down to Rowena."; readonly checkpointLapsed: "The Crescent Queen's crew are back at their posts."; readonly won: "Captain Rowena Blackwake falls in her own hold. The Crescent Queen is yours for now: her hoard chest stands at the back of the hold."; readonly ready: "A new crew has mustered on the Crescent Queen."; }; //# sourceMappingURL=crescentQueen.d.ts.map