'use strict'; // Tile dimensions const TILE = 32; const COLS = 32; const ROWS = 24; // Tile types const TILE_TYPES = { FLOOR: 0, WALL: 1, SOFTWALL: 2, LAVA: 3, WATER: 4, TORCH: 5, DOOR: 6, LEVER: 7, SWITCH: 8, TRAP: 9, TARGET: 10, CHEST: 11, EXIT: 12, ROCK: 13, ITEM: 14, }; // Backward-compatible individual constants const T_FLOOR = TILE_TYPES.FLOOR; const T_WALL = TILE_TYPES.WALL; const T_SOFTWALL = TILE_TYPES.SOFTWALL; const T_LAVA = TILE_TYPES.LAVA; const T_WATER = TILE_TYPES.WATER; const T_TORCH = TILE_TYPES.TORCH; const T_DOOR = TILE_TYPES.DOOR; const T_LEVER = TILE_TYPES.LEVER; const T_SWITCH = TILE_TYPES.SWITCH; const T_TRAP = TILE_TYPES.TRAP; const T_TARGET = TILE_TYPES.TARGET; const T_CHEST = TILE_TYPES.CHEST; const T_EXIT = TILE_TYPES.EXIT; const T_ROCK = TILE_TYPES.ROCK; const T_ITEM = TILE_TYPES.ITEM; // Timing constants const MOVE_COOLDOWN = 100; const ATTACK_COOLDOWN = 400; const ATTACK_ANIM = 250; const ENEMY_MOVE_INTERVAL = 800; const ENEMY_ATTACK_INTERVAL = 1500; const HIT_FLASH = 200; const MESSAGE_DURATION = 2000; const TRANSITION_DURATION = 600; // Direction vectors: [Down, Up, Left, Right] const DIRS = [ { x: 0, y: 1 }, { x: 0, y: -1 }, { x: -1, y: 0 }, { x: 1, y: 0 }, ]; const DIR_NAMES = ['Down', 'Up', 'Left', 'Right']; // Opposite direction lookup const OPPOSITE_DIR = [1, 0, 3, 2]; // Color palette (base stone dungeon theme) const COLORS = { floor: '#C4A265', floorDark: '#A8884D', wall: '#505050', wallTop: '#6E6E6E', wallFront: '#5A5A5A', wallBottom: '#383838', playerBody: '#228B22', playerTunic: '#1A6B1A', playerHead: '#FFD700', playerEyes: '#000080', playerHair: '#8B4513', rock: '#888888', rockDark: '#666666', rockLight: '#AAAAAA', target: '#FFD700', targetGlow: 'rgba(255,215,0,0.3)', chestClosed: '#8B4513', chestGold: '#DAA520', chestOpen: '#A0522D', swordBlade: '#C0C0C0', swordHandle: '#8B4513', swordGem: '#FF0000', goblin: '#8B0000', goblinLight: '#CC2222', goblinEye: '#00FF00', goblinTeeth: '#FFFFFF', torchStick: '#654321', torchFlame: '#FF8C00', torchGlow: 'rgba(255,140,0,0.15)', door: '#654321', doorFrame: '#8B7355', doorKnob: '#FFD700', heart: '#FF0000', heartEmpty: '#444444', msgText: '#FFFFFF', overlay: 'rgba(0,0,0,0.75)', hitFlash: 'rgba(255,0,0,0.3)', softwall: '#705040', softwallDark: '#503828', lava: '#FF4500', lavaLight: '#FF6347', water: '#4169AA', waterLight: '#5F9EA0', lever: '#B8860B', switchFloor: '#DAA520', trap: '#8B008B', }; // Screen states const SCREEN_TITLE = 'title'; const SCREEN_DUNGEON_SELECT = 'dungeon_select'; const SCREEN_PLAYING = 'playing'; const SCREEN_DEAD = 'dead'; const SCREEN_DUNGEON_COMPLETE = 'dungeon_complete'; const SCREEN_GAME_COMPLETE = 'game_complete'; const SCREEN_INVENTORY = 'inventory'; // Canvas dimensions const CANVAS_W = 640; const CANVAS_H = 480; // Max values const MAX_HEARTS = 13; // 26 HP const MAX_INVENTORY_SLOTS = 12; const MAX_PARTICLES = 100; if (typeof module !== 'undefined' && module.exports) { module.exports = { TILE, COLS, ROWS, TILE_TYPES, T_FLOOR, T_WALL, T_SOFTWALL, T_LAVA, T_WATER, T_TORCH, T_DOOR, T_LEVER, T_SWITCH, T_TRAP, T_TARGET, T_CHEST, T_EXIT, T_ROCK, T_ITEM, MOVE_COOLDOWN, ATTACK_COOLDOWN, ATTACK_ANIM, ENEMY_MOVE_INTERVAL, ENEMY_ATTACK_INTERVAL, HIT_FLASH, MESSAGE_DURATION, TRANSITION_DURATION, DIRS, DIR_NAMES, OPPOSITE_DIR, COLORS, SCREEN_TITLE, SCREEN_DUNGEON_SELECT, SCREEN_PLAYING, SCREEN_DEAD, SCREEN_DUNGEON_COMPLETE, SCREEN_GAME_COMPLETE, SCREEN_INVENTORY, CANVAS_W, CANVAS_H, MAX_HEARTS, MAX_INVENTORY_SLOTS, MAX_PARTICLES, }; }