Back to Provenance

3154

.changelog/3154.md

3.3.12.1 KB
Original Source

Added

  • Per-button haptic patterns — Skin buttons in info.json can declare a haptic block with style (light/medium/heavy/soft/rigid) and intensity (0.0–1.0); falls back to the default UIImpactFeedbackGenerator when absent.
  • Animated skin backgrounds — Orientation representations can declare a backgroundAnimation block (type: frames/apng/gif, frames, fps, loops); rendered by DeltaSkinAnimatedBackgroundView beneath the game screen, pausing when the app is backgrounded.
  • Keyboard overlay rendering — Skins that declare a keyboardOverlay config now display a toggleable virtual keyboard during gameplay; auto-shows when autoShow: true. Supports QWERTY, compact, C64, ZX Spectrum, Amstrad CPC, and Atari ST layouts via the existing VirtualKeyboardView infrastructure.
  • PDF size-aware skin renderingUIImage(pdfData:preserveTransparency:) gains an optional size: CGSize? parameter; when provided, PDFs rasterise at exactly that logical size × screen scale for crisp HiDPI output instead of an uncapped 4096 px default.
  • Animated button sprites — Skin buttons can declare a states block (Manic EMU format) with normal, pressed, and optional animated (frames/fps/loops) image references; DeltaSkinView loads and caches per-button images, falling back to the legacy asset path for existing skins.
  • DeltaSkin model test suiteDeltaSkinModelTests covers DeltaSkinHaptic, DeltaSkinBackgroundAnimation, DeltaSkinButtonStates, and DeltaSkinValidationResult with Codable round-trip, equality, and edge-case tests.

Fixed

  • GameGear / legacy handheld skin screen fill — detect and normalise legacy pixel-coordinate skin layouts; enforce correct aspect ratios for Game Gear (160×144), Atari Lynx (160×102), and WonderSwan so skins fill the screen correctly instead of leaving black bars.
  • Screen filter JSON decodingDeltaSkinScreen now correctly decodes filters from skin info.json and constructs CIFilter instances at import time; CRT, scanline, sepia, and blur filters specified in skins now apply at runtime instead of always being nil.