/** * DAILY HOOKS (PLAN_1_TO_40.md E10/D4, 2026-10-14): a small reason to come back tomorrow without a chore list. Everything here * turns over at UTC midnight, is the same for every player of the same level, and is a pure function of the day, so the server * and the clients agree and a test can read it. * * - Bruce's daily contract: one of the contracts on the board at the player's level is "today's", and handing it in pays a * SECOND Small Satchel, once per character per day (never a PvP target: a player who avoids PvP always has one). * - The fair's market day: one of the fair's demand goods pays DOUBLE coins on any fair request that asks for it, all day. * - Joss's cart (southFieldsQuests.ts) already turns over daily; the login line names its three orders. * - The login line: one chat line at join naming today's contract, the market day, Joss's cart and when Ringstone next gathers. * and the Fishing Derby (fishingDerby.ts: where the next round is, or that one is on now). * * Amounts are PLACEHOLDERS for the balance pass (a second satchel, double coins). */ import { type BountyOffer, type BountyTargetKind } from './bounty.js'; import { FAIR_DEMAND_POOL } from './fairFolk.js'; import { type CampOrdersState } from './campKitchens.js'; export declare const DAILY_MS: number; /** The day a moment falls in (UTC). */ export declare function dailyDay(nowMs: number): number; /** Bounty targets that can be today's contract: every offer at the player's level except the Dreadwoods PvP ones. */ export declare function dailyContractCandidates(combatLevel: number): BountyOffer[]; /** Today's contract on Bruce's board for a player at this Combat level, or null when the board has nothing for them. */ export declare function dailyContractFor(combatLevel: number, day: number): BountyOffer | null; /** The extra Small Satchels a handed-in daily contract adds to the usual one. */ export declare const DAILY_CONTRACT_EXTRA_SATCHELS = 1; /** What the bounty_state message carries about today's contract. */ export type DailyContractView = { target: BountyTargetKind; count: number; rewardLevel: number; claimed: boolean; }; export declare function dailyContractView(combatLevel: number, day: number, claimedDay: number): DailyContractView | null; /** The saved day of a handed-in daily contract: a whole day number, else 0 (never). */ export declare function normalizeDailyDay(raw: unknown): number; /** The fair's market day: the demand good that pays double coins today. */ export declare function marketDayGood(day: number): (typeof FAIR_DEMAND_POOL)[number]; /** Coins are multiplied by this on a fair request for the market day's good. */ export declare const MARKET_DAY_COIN_MULT = 2; export declare function marketDayMultiplier(kind: string, day: number): number; export type TodayInput = { now: number; combat: number; /** The day the character last handed in a daily contract. */ claimedDay: number; /** Joss's cart is open to them (The Harvest Supper is done). */ cartOpen: boolean; /** The week the character last handed in a hunt of the week (weeklyHunt.ts); 0 = never. */ weeklyClaimed?: number; /** The character's Cooking level and saved camp-order record (campKitchens.ts): the camp cooks join the line from Cooking 10. */ cooking?: number; campOrders?: CampOrdersState; }; /** A higher ring is named in the login line from this many levels below its band (Highstone from Combat 15, Fenstone from 25). */ export declare const HIGHSTONE_LINE_LEAD = 5; /** Brackenstone (levels 11-20, T106) joins the login line from this Combat level. */ export declare const BRACKENSTONE_LINE_COMBAT = 10; /** The lairs (lairAwakening.ts, T82) join the login line from this Combat level (the first lair's band starts at 24). */ export declare const LAIR_LINE_COMBAT = 20; /** "the Crypt Knight wakes in 2 hours 10 minutes (PvP, no healing)": the lair that wakes next. */ export declare function lairTodayText(now: number): string; /** The login line: what is on today, in one sentence (plain, like a person telling you the news). */ export declare function todayLine(input: TodayInput): string; //# sourceMappingURL=dailyHooks.d.ts.map