diff --git a/html/js/render/assetPacks.js b/html/js/render/assetPacks.js index e2116eb..f6be266 100644 --- a/html/js/render/assetPacks.js +++ b/html/js/render/assetPacks.js @@ -136,17 +136,24 @@ 'original': { id: 'original', label: 'Original Tiles', - tileset: { url: 'assets/kenney/roguelikeSheet.png', tile: 16, spacing: 1 }, + // The game's ORIGINAL tileset (html/tiles.png, 32px, no spacing) — the exact tiles the + // ROT instructions + waiting screens use, so the free pack IS the classic look. Grid + // coords = the legacy pixel coords / 32 (see options.js tileMap). + tileset: { url: 'tiles.png', tile: 32, spacing: 0 }, tiles: { - floor: [5, 2], // wood floor - floor2: [6, 2], // stone accent - wall: [13, 12], // masonry - door: [37, 9], - entrance: [37, 9], - exit: [37, 9], - treasure: [42, 15], - torch: [50, 10] - // No furniture kinds → bar/keg/table/chair/shelf/barrel/crate/rug fall back to floor. + floor: [0, 0], + floor2: [32, 0], // alt/dirt floor + wall: [2, 1], // stone brick wall + door: [1, 0], // wooden door + entrance: [0, 1], + exit: [1, 0], + treasure: [30, 0], // $W gold coin + torch: [32, 1], + // Classic entities too (the tiled renderer prefers a pack's player/monster tile over + // the sprite when present) — the blue-robe @ hero and the green ~ goblin. + player: [2, 0], + monster: [31, 1] + // No furniture kinds → tavern furniture falls back to floor (bare, as intended). } }, 'roguelike-interior': { diff --git a/html/js/render/tileRenderer.js b/html/js/render/tileRenderer.js index ccf9574..db920b8 100644 --- a/html/js/render/tileRenderer.js +++ b/html/js/render/tileRenderer.js @@ -207,6 +207,10 @@ // characters through), falling back to a red orb only if the sprite is unavailable. if (e.kind === 'monster') { drawEntityShadow(ctx, e.x * cell + cell / 2, e.y * cell + cell * 0.9, cell * 0.32, cell * 0.13); + // Prefer the active pack's monster TILE (e.g. the Original pack's ~ goblin) so a + // classic tile pack renders classic; else the character sprite; else a red orb. + var mCoord = useAtlas ? pickVariant(tmap.monster, e.x, e.y) : null; + if (mCoord) { atlas.draw(ctx, mCoord[0], mCoord[1], e.x * cell, e.y * cell, cell); continue; } var mAvatar = e.avatar || 'char-goblin'; if (window.RK && RK.avatarVisuals && RK.avatarVisuals.drawTopdownWorld) { var mv = RK.avatarVisuals.resolve({ avatar: mAvatar }, { projection: 'topdown', context: 'dungeon', entity: e }); @@ -230,6 +234,12 @@ } // Character-like entity: soft ground shadow, then the sprite (or fallback circle). drawEntityShadow(ctx, e.x * cell + cell / 2, e.y * cell + cell * 0.92, cell * 0.34, cell * 0.14); + // In the DUNGEON, prefer the active pack's player TILE (Original pack's @ hero) over the + // sprite so a classic pack is fully classic. The tavern keeps character sprites. + if (scene.isDungeon && (e.you || e.kind === 'player') && useAtlas) { + var pCoord = pickVariant(tmap.player, e.x, e.y); + if (pCoord) { atlas.draw(ctx, pCoord[0], pCoord[1], e.x * cell, e.y * cell, cell); continue; } + } // Roguelike character sprite, or premium animated skin; else the fallback circle. if (window.RK && RK.avatarVisuals && RK.avatarVisuals.drawTopdownWorld) { var visual = RK.avatarVisuals.resolve(e.appearance || { avatar: e.avatar }, {