public import CPlaydate /// Raw C API bootstrap. The firmware passes the `PlaydateAPI` table to the game's /// `eventHandler`; call `initialize(with:)` there before any other API in this module. /// The wrappers (`System`, `Graphics`, `Sprite`, `Sound`, ...) are top-level. public enum Playdate { /// Copy of the C API table; `nil` until `initialize(with:)`. Unsynchronized: the /// runtime is single-threaded and this is written once at startup. public internal(set) nonisolated(unsafe) static var api: PlaydateAPI! /// The pointer passed to `initialize(with:)`, for C calls that take it; `nil` until then. public internal(set) nonisolated(unsafe) static var apiPointer: UnsafeMutablePointer! // Cached so each wrapper call is one field load instead of re-walking `api`. nonisolated(unsafe) static var systemAPI: UnsafePointer! nonisolated(unsafe) static var displayAPI: UnsafePointer! nonisolated(unsafe) static var graphicsAPI: UnsafePointer! nonisolated(unsafe) static var spriteAPI: UnsafePointer! nonisolated(unsafe) static var soundAPI: UnsafePointer! nonisolated(unsafe) static var fileAPI: UnsafePointer! nonisolated(unsafe) static var jsonAPI: UnsafePointer! nonisolated(unsafe) static var luaAPI: UnsafePointer! nonisolated(unsafe) static var scoreboardsAPI: UnsafePointer! nonisolated(unsafe) static var networkAPI: UnsafePointer! // Optional chaining tolerates partial tables (e.g. test mocks) with a null parent; // using a missing table traps at the call site. nonisolated(unsafe) static var tilemapAPI: UnsafePointer! nonisolated(unsafe) static var videoAPI: UnsafePointer! nonisolated(unsafe) static var videoStreamAPI: UnsafePointer! nonisolated(unsafe) static var channelAPI: UnsafePointer! nonisolated(unsafe) static var sourceAPI: UnsafePointer! nonisolated(unsafe) static var filePlayerAPI: UnsafePointer! nonisolated(unsafe) static var sampleAPI: UnsafePointer! nonisolated(unsafe) static var samplePlayerAPI: UnsafePointer! nonisolated(unsafe) static var synthAPI: UnsafePointer! nonisolated(unsafe) static var instrumentAPI: UnsafePointer! nonisolated(unsafe) static var trackAPI: UnsafePointer! nonisolated(unsafe) static var sequenceAPI: UnsafePointer! nonisolated(unsafe) static var signalAPI: UnsafePointer! nonisolated(unsafe) static var lfoAPI: UnsafePointer! nonisolated(unsafe) static var envelopeAPI: UnsafePointer! nonisolated(unsafe) static var controlSignalAPI: UnsafePointer! nonisolated(unsafe) static var effectAPI: UnsafePointer! nonisolated(unsafe) static var twoPoleFilterAPI: UnsafePointer! nonisolated(unsafe) static var onePoleFilterAPI: UnsafePointer! nonisolated(unsafe) static var bitCrusherAPI: UnsafePointer! nonisolated(unsafe) static var ringModulatorAPI: UnsafePointer! nonisolated(unsafe) static var delayLineAPI: UnsafePointer! nonisolated(unsafe) static var overdriveAPI: UnsafePointer! nonisolated(unsafe) static var httpAPI: UnsafePointer! nonisolated(unsafe) static var tcpAPI: UnsafePointer! /// Stores the `eventHandler`'s `PlaydateAPI*` and caches its sub-tables. Call on the /// `.initialize` event, before any other API in this module. public static func initialize(with pointer: UnsafeMutableRawPointer) { apiPointer = pointer.assumingMemoryBound(to: PlaydateAPI.self) api = apiPointer.pointee systemAPI = api.system displayAPI = api.display graphicsAPI = api.graphics spriteAPI = api.sprite soundAPI = api.sound fileAPI = api.file jsonAPI = api.json luaAPI = api.lua scoreboardsAPI = api.scoreboards networkAPI = api.network tilemapAPI = graphicsAPI?.pointee.tilemap videoAPI = graphicsAPI?.pointee.video videoStreamAPI = graphicsAPI?.pointee.videostream channelAPI = soundAPI?.pointee.channel sourceAPI = soundAPI?.pointee.source filePlayerAPI = soundAPI?.pointee.fileplayer sampleAPI = soundAPI?.pointee.sample samplePlayerAPI = soundAPI?.pointee.sampleplayer synthAPI = soundAPI?.pointee.synth instrumentAPI = soundAPI?.pointee.instrument trackAPI = soundAPI?.pointee.track sequenceAPI = soundAPI?.pointee.sequence signalAPI = soundAPI?.pointee.signal lfoAPI = soundAPI?.pointee.lfo envelopeAPI = soundAPI?.pointee.envelope controlSignalAPI = soundAPI?.pointee.controlsignal effectAPI = soundAPI?.pointee.effect twoPoleFilterAPI = effectAPI?.pointee.twopolefilter onePoleFilterAPI = effectAPI?.pointee.onepolefilter bitCrusherAPI = effectAPI?.pointee.bitcrusher ringModulatorAPI = effectAPI?.pointee.ringmodulator delayLineAPI = effectAPI?.pointee.delayline overdriveAPI = effectAPI?.pointee.overdrive httpAPI = networkAPI?.pointee.http tcpAPI = networkAPI?.pointee.tcp } }