export const TILE_SIZE = 48; export const WORLD_WIDTH = 64; export const WORLD_HEIGHT = 64; export const TICK_RATE = 10; // server ticks per second export const MOVE_SPEED = 0.75; // tiles per tick (NPC movement speed) export const BROADCAST_EVERY_N_TICKS = 3; // state broadcast frequency export const SPRITE_FRAME_WIDTH = 48; export const SPRITE_FRAME_HEIGHT = 48; export const SPRITE_COLS = 6; export const SPRITE_ROWS = 4; // NPC needs export const HUNGER_DECAY_PER_TICK = 0.05; export const ENERGY_DECAY_PER_TICK = 0.03; export const HUNGER_THRESHOLD = 30; export const ENERGY_THRESHOLD = 20; export const NEED_RECOVERY_RATE = 0.5; // Directions (row index in spritesheet) export const Direction = { DOWN: 0, LEFT: 1, UP: 2, RIGHT: 3, } as const; export type Direction = (typeof Direction)[keyof typeof Direction]; // Accessory slot names in z-order (bottom to top rendering) export const ACCESSORY_SLOTS = [ 'bottom', 'feet', 'chest', 'arm', 'shoulder', 'waist', 'back', 'facialHair', 'haircut', 'hat', ] as const; export type AccessorySlot = (typeof ACCESSORY_SLOTS)[number]; // Portrait-only slots (facial features for close-up portraits) export const PORTRAIT_SLOTS = ['brows', 'eyes', 'mouths'] as const; export type PortraitSlot = (typeof PORTRAIT_SLOTS)[number]; // Mapping from sprite accessory slot names to portrait folder names // (some folders are pluralized in the portrait assets) export const SPRITE_TO_PORTRAIT_FOLDER: Record = { arm: 'arms', back: 'back', bottom: 'bottom', chest: 'chest', facialHair: 'facialHair', // feet: no portrait equivalent haircut: 'haircuts', hat: 'hats', shoulder: 'shoulders', waist: 'waist', }; // Social interactions export const AWARENESS_RADIUS = 5; // Manhattan distance in tiles export const FACING_DURATION = 10; // ticks (1s) export const PAUSING_DURATION = 15; // ticks (1.5s) export const EMOTING_DURATION = 20; // ticks (2s) export const SOCIAL_GLOBAL_COOLDOWN = 50; // ticks (5s) export const SOCIAL_PAIR_COOLDOWN = 300; // ticks (30s) export const PROPOSAL_EMOTING_DURATION = 30; // 3 seconds - longer for dramatic effect // Camera mode commands export const MAX_NPC_COUNT = 50;