/** * THE FIELD GUIDE (AREA_PROPOSALS.md 2026-10-14, B1; T91): a creature catalogue that fills in as a character meets, fells and * loots every attackable kind of levels 1-40. Four lines per creature kind: SEEN (it came within sight), SLAIN (you felled * one), TEN (you felled ten) and DROPS (one of your kills dropped something). The server pays each line's Explorer XP once, * the moment the line is first earned, and a band's bonus once when every creature in the band has all four lines. The * book is saved with the character (`fieldGuide`), the bonus ids live in the Ledger's paid set (`ledgerPaid`). * * The catalogue itself (which kinds, their names, areas and levels) is built by the server from the game guide * (dreadwoods-backend/src/fieldGuideCatalogue.ts), so a new creature in the guide appears here with no second list. Nothing at * level 41 or above is listed (it sits behind gates, V1_SCOPE.md). A kill that is not an NPC kind in the catalogue (a player, * a pet, a hand-built message) is never a line. * * Amounts are PLACEHOLDERS (balance is done last, with James). */ export type FieldGuideBandId = '1-10' | '11-20' | '21-30' | '31-40'; export declare const FIELD_GUIDE_BANDS: readonly { id: FieldGuideBandId; label: string; min: number; max: number; }[]; /** The four lines of a creature, as bits of its saved progress. */ export type FieldGuideLine = 'seen' | 'slain' | 'ten' | 'drops'; export declare const FIELD_GUIDE_BIT: Readonly>; export declare const FIELD_GUIDE_ALL_BITS = 15; export declare const FIELD_GUIDE_LINES: readonly FieldGuideLine[]; export declare const FIELD_GUIDE_LINE_LABEL: Readonly>; /** Kills it takes for the TEN line (the saved count stops here). */ export declare const FIELD_GUIDE_TEN = 10; /** PLACEHOLDER Explorer XP per line (once ever) and the band's finishing bonus (once ever). */ export declare const FIELD_GUIDE_LINE_XP: Readonly>; export declare const FIELD_GUIDE_BAND_BONUS_XP: Readonly>; /** Most creatures a book can hold (the saved list is capped so a hand-built record cannot grow it). */ export declare const FIELD_GUIDE_MAX_KINDS = 600; /** One catalogue row (built by the server). `min`/`max` are the creature's level range. */ export type FieldGuideEntry = { kind: string; name: string; area: string; min: number; max: number; band: FieldGuideBandId; }; /** A character's progress for one kind: the bits of FIELD_GUIDE_BIT and the kills so far (capped at FIELD_GUIDE_TEN). */ export type FieldGuideProgress = { bits: number; kills: number; }; export type FieldGuideBook = Record; /** The wire snapshot: progress per kind packed as `bits | (kills << 4)`; `entries` is sent only when the client asked. */ export type FieldGuideSnapshot = { progress: Record; /** Explorer XP the guide has paid so far (lines and band bonuses). */ xpPaid: number; /** The bands whose bonus is paid. */ bandsPaid: FieldGuideBandId[]; entries?: FieldGuideEntry[]; }; /** The id of a band's finishing bonus in `ledgerPaid` (never a line, never a mark). */ export declare function fieldGuideBonusId(band: FieldGuideBandId): string; export declare const FIELD_GUIDE_BONUS_IDS: readonly string[]; /** The band a creature's lowest level falls in, or null at level 41 and above (gated, never listed) or below 1. */ export declare function fieldGuideBandOf(minLevel: number): FieldGuideBandId | null; export declare function fieldGuidePack(p: FieldGuideProgress | undefined): number; export declare function fieldGuideUnpack(n: number): FieldGuideProgress; /** The lines set in a bit mask. */ export declare function fieldGuideLinesOf(bits: number): FieldGuideLine[]; export declare function fieldGuideLineXp(lines: Iterable): number; /** What happened to a kind: it came into sight, one was felled, a felled one dropped something. A kill is also a sighting. */ export type FieldGuideEvent = { seen?: boolean; kill?: boolean; drops?: boolean; }; /** * Records an event for a kind in the book (mutates it) and returns the lines that are NEW, in order. Each line is returned * once ever: the bit is set the moment it is earned, so the caller pays exactly what comes back. */ export declare function fieldGuideRecord(book: FieldGuideBook, kind: string, ev: FieldGuideEvent): FieldGuideLine[]; /** A band's progress against a catalogue: creatures with every line, and the total in the band. */ export declare function fieldGuideBandCount(entries: readonly FieldGuideEntry[], book: Readonly, band: FieldGuideBandId): { done: number; total: number; }; export declare function fieldGuideBandDone(entries: readonly FieldGuideEntry[], book: Readonly, band: FieldGuideBandId): boolean; /** The lines a book holds, counted across the catalogue (for the cover). */ export declare function fieldGuideTally(entries: readonly FieldGuideEntry[], book: Readonly): Record; /** Saved form: `kind:bits:kills` strings. */ export declare function serializeFieldGuide(book: Readonly): string[]; /** Whatever the database held, made safe: well-formed `kind:bits:kills` strings only, one per kind, capped. */ export declare function normalizeFieldGuide(raw: unknown): FieldGuideBook; //# sourceMappingURL=fieldGuide.d.ts.map