feat(packs): Fancy dies as a mode → topdown packs; Roguelike Dungeon tile pack (B)

Modes are TECHNIQUES; 'Fancy' (tiles+FX) was really a topdown PACK, so:
- Remove 'fancy' from RENDER_MODES (saved 'fancy' falls back to tiles; its dead
  Pixi branch is short-circuited by canUseMode). Modes = Tiled/ASCII/Iso/3D.
- Modes now carry a ; a premium mode unlocks once the user has ANY
  unlocked pack for that projection (not a single hardcoded pack) — needed now
  that iso is multi-pack.
- New 'roguelike-dungeon' topdown pack: same sheet, a DUNGEON palette (stone
  floors + barrels/crates vs the wood interior) — a distinct 2D tileset with zero
  new assets. Registered + catalog (migration 027, topdown tier 1 / 1 credit).
  The tiled renderer's lighting/shadows/vignette are the built-in FX.
- Also: iso facing fix (Male 0=NW..6=NE) reflected in tests.

So the Tiled pack picker now offers Roguelike Interior <-> Dungeon, and Iso offers
Dungeon <-> Medieval — packs as products, proven in the best-looking mode too.
Suite 58/419 green.
This commit is contained in:
jwinterm
2026-07-11 14:35:30 -04:00
parent 4a91d91822
commit ccaff7d29c
5 changed files with 54 additions and 12 deletions
+5 -5
View File
@@ -105,10 +105,11 @@ describe('render pack visual resolver', () => {
expect(RK.isoAssets.characters['char-merchant']).toBeUndefined();
expect(RK.isoAssets.characters['char-wizard']).toBeUndefined();
expect(RK.isoAssets.characters['char-goblin']).toBeUndefined();
expect(RK.isoAssets.directions.down.idle).toContain('Male_3_Idle0.png');
expect(RK.isoAssets.directions.up.idle).toContain('Male_7_Idle0.png');
// 45° renders: 0=NW,2=SW,4=SE,6=NE. Facing follows visual movement (up->NE, down->SW, etc.).
expect(RK.isoAssets.directions.down.idle).toContain('Male_2_Idle0.png');
expect(RK.isoAssets.directions.up.idle).toContain('Male_6_Idle0.png');
expect(RK.isoAssets.directions.left.idle).toContain('Male_0_Idle0.png');
expect(RK.isoAssets.directions.right.idle).toContain('Male_5_Idle0.png');
expect(RK.isoAssets.directions.right.idle).toContain('Male_4_Idle0.png');
});
test('projection visuals expose the saved base tint as a render color', () => {
@@ -142,8 +143,7 @@ describe('render pack visual resolver', () => {
// With test unlocks on, ALL premium modes and packs are available for QA
RK.RENDER_MODE_TEST_UNLOCKS = true;
expect(RK.canUseMode('fancy')).toBe(true);
expect(RK.canUseMode('iso')).toBe(true);
expect(RK.canUseMode('iso')).toBe(true); // 'fancy' is no longer a mode — it's a topdown pack
expect(RK.canUseMode('3d')).toBe(true);
expect(RK.canUsePack('iso-dungeon')).toBe(true);
expect(RK.canUsePack('kenney-3d-characters')).toBe(true);