export type WorldZoneId = 'safe' | 'deadlands'; export declare const DEADLANDS_WIDTH = 448; export declare const DEADLANDS_DEPTH = 448; export declare const DEADLANDS_MIN_X: number; export declare const DEADLANDS_MAX_X: number; /** * Centred on the land as it was before the northern extension, then moved * south with everything else: the 64 new rows are the Frozen Shore's, not * the Deadlands', and centring on the taller land would move it only 32. */ export declare const DEADLANDS_MIN_Z: number; export declare const DEADLANDS_MAX_Z: number; export declare const DEADLANDS_GATE_X: number; export declare const DEADLANDS_DEFENSE_DEPTH = 3; export declare const DEADLANDS_WALL_TERRAIN_H = 2; export declare const DEADLANDS_TOWER_MIN_GAP = 12; export declare const DEADLANDS_BOUNDS: { readonly minX: number; readonly maxX: number; readonly minZ: number; readonly maxZ: number; }; export declare const ZONE_DISPLAY_NAME: Record; export declare function isPlayableTile(x: number, z: number): boolean; export declare function zoneAt(x: number, z: number): WorldZoneId; export declare function zoneDisplayName(zone: WorldZoneId): string; export declare function isDeadlands(x: number, z: number): boolean; /** * The Dreadwoods are the PvP zone, except the safe pockets (decision D4, safePockets.ts: Gallowmere's palisade, Brakka's outpost): a pocket is inside the * Dreadwoods but outside the PvP rule, so a fight between players cannot start there and one that walks in ends. */ export declare function isPvpZone(x: number, z: number): boolean; /** * The woods chase (2026-09-21). A player can only be attacked by * another from within this many tiles (Chebyshev), and a fight holds only * while the two stay within it: step further apart and it breaks. Whoever * broke away wears a shield for PVP_ESCAPE_SHIELD_MS during which nobody * can attack them, so the chaser has to close the distance again by hand * (there is no follow in the woods) and be within range when it drops. */ export declare const PVP_ENGAGE_RANGE = 3; export declare const PVP_ESCAPE_SHIELD_MS = 3000; /** Combat bands inside the Dreadwoods. Zone 1 is the outer/entrance ring; Zone 5 is the core. */ export type CombatZoneTier = 1 | 2 | 3 | 4 | 5; export declare const COMBAT_ZONE_COUNT = 5; export declare const COMBAT_ZONE_LEVEL_DELTA: Record; export declare function isCombatZoneTier(value: unknown): value is CombatZoneTier; /** * Chebyshev inset from the Dreadwoods square edge. 0 on the outer forest ring, * ~223 at the centre. Null outside the woods (village, beach, wall, mountains). */ export declare function deadlandsInset(x: number, z: number): number | null; /** * Concentric Chebyshev bands of the Dreadwoods square. Equal-width rings from * the outer edge inward so Zone 1 is the entrance frame and Zone 5 the core. */ export declare function combatZoneAt(x: number, z: number): CombatZoneTier | null; /** * The band the player's HUD shows (the red "Danger Zone" panel): `combatZoneAt`, but null inside a safe pocket (B-129). * `combatZoneAt` itself keeps the geometric band for maps and level gaps; the HUD must not warn "Death here costs you * everything" on a tile where nobody can attack you. */ export declare function playerCombatTierAt(x: number, z: number): CombatZoneTier | null; export declare function combatZoneDisplayName(tier: CombatZoneTier): string; export declare function combatZoneLevelDelta(tier: CombatZoneTier): number; export declare function combatZoneRangeLabel(tier: CombatZoneTier): string; /** * Allowed combat-level gap for a wild PvP fight on these two tiles. * Uses the stricter of the two bands so a Zone 1 player cannot be pulled * into a Zone 2-width fight on the boundary. Null if either tile is safe. */ export declare function pvpLevelDeltaAllowed(attackerX: number, attackerZ: number, defenderX: number, defenderZ: number): number | null; export declare function canPvpAttackByLevel(attackerLevel: number, defenderLevel: number, attackerX: number, attackerZ: number, defenderX: number, defenderZ: number): boolean; export declare function pvpAttackBlockedMessage(attackerLevel: number, defenderLevel: number, attackerX: number, attackerZ: number, defenderX: number, defenderZ: number): string | null; export declare function isDeadlandsPerimeter(x: number, z: number): boolean; export declare function isDeadlandsDefenseBand(x: number, z: number): boolean; /** Palisade towers only. Interior forest towers put sentries among the trees. */ export declare function collectDeadlandsTowerSpots(): { x: number; z: number; }[]; //# sourceMappingURL=zones.d.ts.map