Files
dflike/shared/src/constants.ts
T
2026-03-07 19:18:38 +00:00

66 lines
2.2 KiB
TypeScript

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<string, string> = {
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;