feat(packs): Medieval Town iso pack (2nd iso environment) + pack picker

Proves the packs-as-products loop end to end:
- Copied Kenney Isometric Medieval Town wood tiles (floor/floor2/wall/window/
  door/banner) into assets/kenney/iso-medieval/.
- Registered 'iso-medieval' as a 2nd iso RENDER pack (its own tile geometry —
  Medieval tiles are shorter than the dungeon set; reuses the dungeon characters).
  Strong on architecture; no medieval furniture at this scale, so furniture kinds
  fall back to floor for now (shines most in the dungeon).
- Catalog product: DEFAULT_CATALOG + migration 026, iso tier 2 / 15 credits.
- PACK PICKER in the tavern: when a projection has >1 unlocked pack, a selector
  appears to switch live (setActivePack -> re-render). Uses ?unlock=1 to preview.

So: switch Iso ★, and the pack picker lets you flip iso-dungeon <-> Medieval Town
live. Adding the next pack = assets + registerPack + a catalog row. Suite 58/419 green.
This commit is contained in:
jwinterm
2026-07-11 13:57:47 -04:00
parent 11b7fb1272
commit 3d9b5420ee
10 changed files with 75 additions and 0 deletions
+23
View File
@@ -294,6 +294,28 @@
}
};
// Second iso pack — Kenney Isometric Medieval Town (a coherent, DIFFERENT environment). Strong on
// architecture (floor/walls/door/window/banner); no medieval furniture at this scale, so furniture
// kinds fall back to floor for now. Reuses the dungeon-pack characters. Its tiles are shorter
// (210x244) than the dungeon set, so its own tile geometry.
RK.isoMedievalAssets = {
pack: 'iso-medieval',
avatar: 'char-villager',
tile: { w: 84, h: 42, imageW: 84, imageH: 98 },
tiles: {
floor: 'assets/kenney/iso-medieval/floor.png',
floor2: 'assets/kenney/iso-medieval/floor2.png',
wall: 'assets/kenney/iso-medieval/wall.png',
window: 'assets/kenney/iso-medieval/window.png',
door: 'assets/kenney/iso-medieval/door.png',
banner: 'assets/kenney/iso-medieval/banner.png',
fallback: 'assets/kenney/iso-medieval/floor.png'
},
character: RK.isoAssets.character,
directions: RK.isoAssets.directions,
characters: RK.isoAssets.characters
};
RK.threeAssets = {
pack: 'kenney-3d-characters',
models: {
@@ -319,6 +341,7 @@
if (RK.registerPack) {
RK.registerPack({ id: 'roguelike-interior', label: 'Roguelike Interior', projection: 'topdown', kind: 'tiles', assets: RK.THEMES['roguelike-interior'] });
RK.registerPack({ id: 'iso-dungeon', label: 'Isometric Dungeon', projection: 'iso', kind: 'tiles', assets: RK.isoAssets });
RK.registerPack({ id: 'iso-medieval', label: 'Medieval Town', projection: 'iso', kind: 'tiles', assets: RK.isoMedievalAssets });
RK.registerPack({ id: 'kenney-3d-characters', label: 'Animated 3D', projection: '3d', kind: 'skin', assets: RK.threeAssets });
}
// Active-pack resolvers the renderers read (fall back to the single default if the registry is absent).