Documentation
¶
Index ¶
- Constants
- func FireRumbleEvents(events []RumbleEvent, level int)
- func IsReservedKey(k ebiten.Key) bool
- func KeyToName(k ebiten.Key) (string, bool)
- func PadToName(b ebiten.StandardGamepadButton) (string, bool)
- func ParseKey(name string) (ebiten.Key, bool)
- func ParsePad(name string) (ebiten.StandardGamepadButton, bool)
- func PollButtons(mapping InputMapping, gamepadID ebiten.GamepadID, ...) uint32
- func PollGamepadButtons(mapping InputMapping, gamepadID ebiten.GamepadID, disableAnalog bool) uint32
- func ResolveKeyDisplay(buttonName string, defaultKey string, overrides map[string]string) string
- func ResolvePadDisplay(buttonName string, defaultPad string, overrides map[string]string) string
- func Run(factory coreif.CoreFactory) error
- func RunDirect(factory coreif.CoreFactory, romPath, regionStr string, ...) error
- type AchievementOverlay
- type App
- func (a *App) Draw(screen *ebiten.Image)
- func (a *App) Exit()
- func (a *App) GetExtensions() []string
- func (a *App) GetMD5ByCRC32(crc32 uint32) string
- func (a *App) GetMissingArtImageData() []byte
- func (a *App) GetPlaceholderImageData() []byte
- func (a *App) GetWindowConfig() (width, height int, x, y *int, fullscreen bool)
- func (a *App) GetWindowWidth() int
- func (a *App) LaunchGame(gameCRC string, resume bool)
- func (a *App) Layout(outsideWidth, outsideHeight int) (int, int)
- func (a *App) RequestRebuild()
- func (a *App) SaveAndClose()
- func (a *App) ShowNotification(msg string)
- func (a *App) SwitchToDetail(gameCRC string)
- func (a *App) SwitchToLibrary()
- func (a *App) SwitchToScanProgress(rescanAll bool)
- func (a *App) SwitchToSettings()
- func (a *App) Update() error
- type AppState
- type AudioPlayer
- type AudioRingBuffer
- type EmuControl
- type FramebufferRenderer
- type GameplayManager
- func (gm *GameplayManager) CurrentGameCRC() string
- func (gm *GameplayManager) Draw(screen *ebiten.Image)
- func (gm *GameplayManager) DrawAchievementOverlay(screen *ebiten.Image)
- func (gm *GameplayManager) DrawFramebuffer() *ebiten.Image
- func (gm *GameplayManager) DrawPauseMenu(screen *ebiten.Image)
- func (gm *GameplayManager) Exit(saveResume bool)
- func (gm *GameplayManager) IsPaused() bool
- func (gm *GameplayManager) IsPlaying() bool
- func (gm *GameplayManager) Launch(gameCRC string, resume bool) bool
- func (gm *GameplayManager) Resume()
- func (gm *GameplayManager) SetConfig(config *storage.Config)
- func (gm *GameplayManager) SetLibrary(library *storage.Library)
- func (gm *GameplayManager) Update() (pauseMenuOpened bool, err error)
- type InputManager
- type InputMapping
- type Notification
- func (n *Notification) Clear()
- func (n *Notification) Close()
- func (n *Notification) Draw(screen *ebiten.Image)
- func (n *Notification) IsVisible() bool
- func (n *Notification) PlaySound(soundData []byte)
- func (n *Notification) SetBadge(badge *ebiten.Image)
- func (n *Notification) Show(message string, duration time.Duration)
- func (n *Notification) ShowAchievementWithBadge(title, description string, badge *ebiten.Image)
- func (n *Notification) ShowDefault(message string)
- func (n *Notification) ShowShort(message string)
- type NotificationType
- type PauseMenu
- type PauseMenuOption
- type PlayTimeTracker
- type RewindBuffer
- func (rb *RewindBuffer) Capacity() int
- func (rb *RewindBuffer) Capture(saveStater coreif.SaveStater) error
- func (rb *RewindBuffer) Count() int
- func (rb *RewindBuffer) IsRewinding() bool
- func (rb *RewindBuffer) Reset()
- func (rb *RewindBuffer) Rewind(emu coreif.Emulator, saveStater coreif.SaveStater, count int) bool
- func (rb *RewindBuffer) SetRewinding(v bool)
- type RumbleEngine
- type RumbleEntry
- type RumbleEvent
- type SaveStateManager
- func (m *SaveStateManager) GetCurrentSlot() int
- func (m *SaveStateManager) HasResumeState() bool
- func (m *SaveStateManager) Load(saveStater coreif.SaveStater) error
- func (m *SaveStateManager) LoadResume(saveStater coreif.SaveStater) error
- func (m *SaveStateManager) LoadSRAM(batterySaver coreif.BatterySaver) error
- func (m *SaveStateManager) NextSlot()
- func (m *SaveStateManager) PreviousSlot()
- func (m *SaveStateManager) Save(saveStater coreif.SaveStater) error
- func (m *SaveStateManager) SaveResume(saveStater coreif.SaveStater) error
- func (m *SaveStateManager) SaveResumeData(state []byte) error
- func (m *SaveStateManager) SaveSRAM(batterySaver coreif.BatterySaver) error
- func (m *SaveStateManager) SetGame(gameCRC string)
- func (m *SaveStateManager) SetLibrary(library *storage.Library)
- type ScanManager
- type ScreenshotManager
- type SearchOverlay
- type SharedFramebuffer
- type SharedInput
- type TurboState
- type UINavigation
Constants ¶
const Version = "0.3.0"
Standalone UI version
Variables ¶
This section is empty.
Functions ¶
func FireRumbleEvents ¶ added in v0.3.0
func FireRumbleEvents(events []RumbleEvent, level int)
FireRumbleEvents sends rumble events to gamepads via Ebiten. Levels 1-3 scale CHT intensity and duration by that multiplier. Level 4 scales intensity by 4x but caps duration at 2x. Level 5 (Max) uses maximum intensity with 2x duration. Minimum thresholds ensure any non-zero rumble is perceptible.
func IsReservedKey ¶ added in v0.2.0
IsReservedKey returns true if the key is reserved for UI functions.
func KeyToName ¶ added in v0.2.0
KeyToName converts an ebiten.Key to its name string. Returns the name and true if the key has a name, or "" and false otherwise.
func PadToName ¶ added in v0.2.0
func PadToName(b ebiten.StandardGamepadButton) (string, bool)
PadToName converts an ebiten.StandardGamepadButton to its name string. Returns the name and true if the button has a name, or "" and false otherwise.
func ParseKey ¶
ParseKey converts a key name string to an ebiten.Key. Returns the key and true if the name is valid, or 0 and false otherwise.
func ParsePad ¶
func ParsePad(name string) (ebiten.StandardGamepadButton, bool)
ParsePad converts a gamepad button name string to an ebiten.StandardGamepadButton. Returns the button and true if the name is valid, or 0 and false otherwise.
func PollButtons ¶
func PollButtons(mapping InputMapping, gamepadID ebiten.GamepadID, hasGamepad, disableAnalog bool) uint32
PollButtons reads P1 input from keyboard and gamepad (including D-pad and analog stick). All buttons including D-pad are in the mapping. When disableAnalog is true, the analog stick is not polled. Returns a button bitmask.
func PollGamepadButtons ¶
func PollGamepadButtons(mapping InputMapping, gamepadID ebiten.GamepadID, disableAnalog bool) uint32
PollGamepadButtons reads P2 input from gamepad only (D-pad + analog stick + mapped buttons). No keyboard since that belongs to P1. When disableAnalog is true, the analog stick is not polled. All D-pad buttons are expected in the mapping.
func ResolveKeyDisplay ¶ added in v0.2.0
ResolveKeyDisplay returns the display string for a button's current keyboard binding, checking overrides first then falling back to the provided default.
func ResolvePadDisplay ¶ added in v0.2.0
ResolvePadDisplay returns the display string for a button's current controller binding, checking overrides first then falling back to the provided default.
func Run ¶
func Run(factory coreif.CoreFactory) error
Run is the public entry point for the standalone UI. It initializes storage, configures the window, creates the app, and starts the Ebiten game loop.
func RunDirect ¶
func RunDirect(factory coreif.CoreFactory, romPath, regionStr string, options map[string]string, bios map[string][]byte) error
RunDirect loads a ROM and runs it directly without the full UI. The regionStr parameter accepts "auto", "ntsc", or "pal". The options map is applied to the emulator via SetOption. The bios map provides BIOS data keyed by BIOSOption.Key (may be nil).
Types ¶
type AchievementOverlay ¶
type AchievementOverlay struct {
// contains filtered or unexported fields
}
AchievementOverlay shows achievements during gameplay
func NewAchievementOverlay ¶
func NewAchievementOverlay(manager *achievements.Manager) *AchievementOverlay
NewAchievementOverlay creates a new achievement overlay
func (*AchievementOverlay) Draw ¶
func (o *AchievementOverlay) Draw(screen *ebiten.Image)
Draw renders the overlay
func (*AchievementOverlay) Hide ¶
func (o *AchievementOverlay) Hide()
Hide hides the achievement overlay
func (*AchievementOverlay) InitForGame ¶
func (o *AchievementOverlay) InitForGame()
InitForGame prepares the overlay for a new game session. The manager already caches achievements on LoadGame, so this just resets overlay state.
func (*AchievementOverlay) IsVisible ¶
func (o *AchievementOverlay) IsVisible() bool
IsVisible returns whether the overlay is visible
func (*AchievementOverlay) Reset ¶
func (o *AchievementOverlay) Reset()
Reset clears session state when the game ends
func (*AchievementOverlay) Show ¶
func (o *AchievementOverlay) Show()
Show displays the achievement overlay
func (*AchievementOverlay) Update ¶
func (o *AchievementOverlay) Update()
Update handles input for the overlay
type App ¶
type App struct {
// contains filtered or unexported fields
}
App is the main application struct that implements ebiten.Game
func (*App) GetExtensions ¶
GetExtensions returns the supported ROM file extensions
func (*App) GetMD5ByCRC32 ¶ added in v0.5.0
GetMD5ByCRC32 returns the MD5 hash for a game by CRC32 from loaded RDBs
func (*App) GetMissingArtImageData ¶ added in v0.6.0
GetMissingArtImageData returns the raw embedded missing-art image data shown for games that have no artwork file.
func (*App) GetPlaceholderImageData ¶
GetPlaceholderImageData returns the raw embedded placeholder image data used as the loading indicator while artwork is being loaded asynchronously.
func (*App) GetWindowConfig ¶
GetWindowConfig returns the saved window dimensions, position, and fullscreen state from config. This should be called before RunGame to set the initial window size.
func (*App) GetWindowWidth ¶
GetWindowWidth returns the current window width for responsive layouts
func (*App) LaunchGame ¶
LaunchGame starts the emulator with the specified game
func (*App) RequestRebuild ¶
func (a *App) RequestRebuild()
RequestRebuild triggers a UI rebuild for the current screen. This is safe to call from goroutines - the rebuild happens on the main thread. Focus restoration is handled in the Update loop after ui.Update()
func (*App) SaveAndClose ¶
func (a *App) SaveAndClose()
SaveAndClose saves config and library before exit
func (*App) ShowNotification ¶ added in v0.5.0
ShowNotification shows a brief notification message
func (*App) SwitchToDetail ¶
SwitchToDetail transitions to the detail screen
func (*App) SwitchToLibrary ¶
func (a *App) SwitchToLibrary()
SwitchToLibrary transitions to the library screen
func (*App) SwitchToScanProgress ¶
SwitchToScanProgress transitions to the scan progress screen
func (*App) SwitchToSettings ¶
func (a *App) SwitchToSettings()
SwitchToSettings transitions to the settings screen
type AppState ¶
type AppState int
AppState represents the current state of the application
const ( // StateLibrary is the main library screen showing all games StateLibrary AppState = iota // StateDetail shows information about a selected game StateDetail // StateSettings shows application settings StateSettings // StateScanProgress shows ROM scanning progress StateScanProgress // StateError shows a startup error (corrupted config) StateError // StatePlaying is active gameplay StatePlaying )
type AudioPlayer ¶
type AudioPlayer struct {
// contains filtered or unexported fields
}
AudioPlayer manages audio playback via oto. It writes int16 stereo samples to a ring buffer which oto's player reads from in a pull model.
func NewAudioPlayer ¶
func NewAudioPlayer(volume float64) (*AudioPlayer, error)
NewAudioPlayer creates and initializes audio playback via oto. The volume parameter sets the initial volume before playback starts, preventing audio pops when muted (matching iOS behavior).
func (*AudioPlayer) ClearQueue ¶
func (a *AudioPlayer) ClearQueue()
ClearQueue flushes all buffered audio from the ring buffer. Used when entering rewind mode to prevent stale audio playback.
func (*AudioPlayer) GetBufferLevel ¶
func (a *AudioPlayer) GetBufferLevel() int
GetBufferLevel returns the total bytes of audio data currently buffered (ring buffer + oto player internal buffer). Used for ADT pacing.
func (*AudioPlayer) QueueSamples ¶
func (a *AudioPlayer) QueueSamples(samples []int16)
QueueSamples converts int16 stereo samples to bytes and writes them to the ring buffer for oto to consume.
func (*AudioPlayer) SetVolume ¶
func (a *AudioPlayer) SetVolume(vol float64)
SetVolume sets the playback volume (0.0 = silent, 1.0 = normal, 2.0 = max). Values are clamped to [0.0, 2.0].
type AudioRingBuffer ¶
type AudioRingBuffer struct {
// contains filtered or unexported fields
}
AudioRingBuffer is a thread-safe ring buffer implementing io.Reader. The emulation goroutine writes samples via Write(), and oto's player reads them via Read(). Read blocks when empty; Write drops oldest samples on overflow to prevent stalling the producer.
func NewAudioRingBuffer ¶
func NewAudioRingBuffer(capacity int) *AudioRingBuffer
NewAudioRingBuffer creates a ring buffer with the given capacity in bytes.
func (*AudioRingBuffer) Buffered ¶
func (rb *AudioRingBuffer) Buffered() int
Buffered returns the number of bytes currently in the buffer.
func (*AudioRingBuffer) Clear ¶
func (rb *AudioRingBuffer) Clear()
Clear resets the buffer, discarding all data.
func (*AudioRingBuffer) Close ¶
func (rb *AudioRingBuffer) Close()
Close signals shutdown. Subsequent Reads return io.EOF when the buffer is empty. Unblocks any goroutines waiting in Read.
func (*AudioRingBuffer) Read ¶
func (rb *AudioRingBuffer) Read(p []byte) (int, error)
Read implements io.Reader. Blocks until data is available or the buffer is closed. Returns io.EOF when closed and empty.
func (*AudioRingBuffer) Write ¶
func (rb *AudioRingBuffer) Write(p []byte)
Write adds data to the buffer. Non-blocking; if the buffer overflows, oldest samples are dropped to make room for new data.
type EmuControl ¶
type EmuControl struct {
// contains filtered or unexported fields
}
EmuControl manages pause/resume/stop coordination between the Ebiten thread and the emulation goroutine.
func NewEmuControl ¶
func NewEmuControl() *EmuControl
NewEmuControl creates a new emulation control.
func (*EmuControl) CheckPause ¶
func (ec *EmuControl) CheckPause() bool
CheckPause is called by the emulation goroutine between frames. If a pause has been requested, it sends an acknowledgment and spins until resumed or stopped. Returns false if the goroutine should exit.
func (*EmuControl) IsPaused ¶
func (ec *EmuControl) IsPaused() bool
IsPaused returns true if the emulation goroutine is currently paused.
func (*EmuControl) RequestPause ¶
func (ec *EmuControl) RequestPause()
RequestPause asks the emulation goroutine to pause and blocks until it acknowledges the pause.
func (*EmuControl) RequestResume ¶
func (ec *EmuControl) RequestResume()
RequestResume tells the emulation goroutine to resume.
func (*EmuControl) ShouldRun ¶
func (ec *EmuControl) ShouldRun() bool
ShouldRun returns true if the goroutine should continue running.
func (*EmuControl) Stop ¶
func (ec *EmuControl) Stop()
Stop signals the emulation goroutine to exit.
type FramebufferRenderer ¶
type FramebufferRenderer struct {
// contains filtered or unexported fields
}
FramebufferRenderer owns the ebiten offscreen buffer and handles pixel rendering with scaling. Replaces the emulator-specific DrawCachedFramebuffer/GetCachedFramebufferImage methods that were previously on the bridge emulator.
func NewFramebufferRenderer ¶
func NewFramebufferRenderer(screenWidth int, par float64) *FramebufferRenderer
NewFramebufferRenderer creates a renderer for the given native screen width and pixel aspect ratio.
func (*FramebufferRenderer) DrawFramebuffer ¶
func (r *FramebufferRenderer) DrawFramebuffer(screen *ebiten.Image, pixels []byte, stride, activeHeight int)
DrawFramebuffer renders pixel data to the screen with PAR-corrected aspect ratio scaling.
func (*FramebufferRenderer) GetFramebufferImage ¶
func (r *FramebufferRenderer) GetFramebufferImage(pixels []byte, stride, activeHeight int) *ebiten.Image
GetFramebufferImage returns pixel data as an ebiten.Image at native resolution. Used for shader processing.
func (*FramebufferRenderer) SetAspectRatioMode ¶ added in v0.5.0
func (r *FramebufferRenderer) SetAspectRatioMode(mode string)
SetAspectRatioMode sets the aspect ratio scaling mode ("dar", "4:3", "1:1", "stretch").
type GameplayManager ¶
type GameplayManager struct {
// contains filtered or unexported fields
}
GameplayManager handles all gameplay-related state and logic. This includes emulator control, input handling, save states, play time tracking, and the pause menu.
The emulator runs on a dedicated goroutine with audio-driven timing (ADT). The Ebiten thread handles UI, input polling, and reads the shared framebuffer.
func NewGameplayManager ¶
func NewGameplayManager( factory coreif.CoreFactory, systemInfo coreif.SystemInfo, saveStateManager *SaveStateManager, screenshotManager *ScreenshotManager, notification *Notification, library *storage.Library, config *storage.Config, achievementManager *achievements.Manager, metadata *metadata.MetadataManager, onExitToLibrary func(), onExitApp func(), ) *GameplayManager
NewGameplayManager creates a new gameplay manager
func (*GameplayManager) CurrentGameCRC ¶
func (gm *GameplayManager) CurrentGameCRC() string
CurrentGameCRC returns the CRC of the currently loaded game, or empty string if none
func (*GameplayManager) Draw ¶
func (gm *GameplayManager) Draw(screen *ebiten.Image)
Draw renders the gameplay screen from the shared framebuffer.
func (*GameplayManager) DrawAchievementOverlay ¶
func (gm *GameplayManager) DrawAchievementOverlay(screen *ebiten.Image)
DrawAchievementOverlay draws the achievement overlay
func (*GameplayManager) DrawFramebuffer ¶
func (gm *GameplayManager) DrawFramebuffer() *ebiten.Image
DrawFramebuffer returns the native-resolution framebuffer for xBR processing. Reads from the shared framebuffer rather than directly from the emulator.
func (*GameplayManager) DrawPauseMenu ¶
func (gm *GameplayManager) DrawPauseMenu(screen *ebiten.Image)
DrawPauseMenu draws the pause menu overlay
func (*GameplayManager) Exit ¶
func (gm *GameplayManager) Exit(saveResume bool)
Exit cleans up when exiting gameplay
func (*GameplayManager) IsPaused ¶
func (gm *GameplayManager) IsPaused() bool
IsPaused returns whether the pause menu is visible
func (*GameplayManager) IsPlaying ¶
func (gm *GameplayManager) IsPlaying() bool
IsPlaying returns true if a game is currently being played
func (*GameplayManager) Launch ¶
func (gm *GameplayManager) Launch(gameCRC string, resume bool) bool
Launch starts the emulator with the specified game
func (*GameplayManager) Resume ¶
func (gm *GameplayManager) Resume()
Resume resumes gameplay after pause menu
func (*GameplayManager) SetConfig ¶
func (gm *GameplayManager) SetConfig(config *storage.Config)
SetConfig updates the config reference and rebuilds the input mapping
func (*GameplayManager) SetLibrary ¶
func (gm *GameplayManager) SetLibrary(library *storage.Library)
SetLibrary updates the library reference
func (*GameplayManager) Update ¶
func (gm *GameplayManager) Update() (pauseMenuOpened bool, err error)
Update handles the gameplay update loop. Returns true if pause menu was opened. This runs on the Ebiten thread — it polls input and manages UI state. The emulator itself runs on a separate goroutine.
type InputManager ¶
type InputManager struct {
// contains filtered or unexported fields
}
InputManager handles all input for UI navigation. It tracks gamepad state, handles repeat navigation, and provides a clean interface for UI code to query input state.
func NewInputManager ¶
func NewInputManager() *InputManager
NewInputManager creates a new input manager
func (*InputManager) GetUINavigation ¶
func (im *InputManager) GetUINavigation() UINavigation
GetUINavigation returns the current UI navigation state. This handles keyboard arrow keys and gamepad D-pad/analog stick with repeat navigation, and A/B/Start button presses.
func (*InputManager) Update ¶
func (im *InputManager) Update() (screenshotRequested, fullscreenToggle bool)
Update polls input state. Should be called once per frame. Returns global key states: F12 screenshot and F11 fullscreen toggle.
type InputMapping ¶
type InputMapping struct {
Keys map[int]ebiten.Key // bit ID -> keyboard key
Gamepad map[int]ebiten.StandardGamepadButton // bit ID -> gamepad button
}
InputMapping maps button bit IDs to ebiten input types. Keyed by the Button.ID (bit position in the uint32 bitmask).
func BuildDefaultMapping ¶
func BuildDefaultMapping(buttons []coreif.Button) InputMapping
BuildDefaultMapping creates an InputMapping from the given button definitions. It includes D-pad defaults (WASD keyboard, D-pad controller) plus adaptor buttons. Keys that conflict with reserved standalone UI keys are skipped.
func BuildMappingFromConfig ¶ added in v0.2.0
func BuildMappingFromConfig(buttons []coreif.Button, kbOverrides, padOverrides map[string]string) InputMapping
BuildMappingFromConfig creates an InputMapping using config overrides with adaptor defaults as fallback. D-pad defaults are WASD (keyboard) and DpadUp/Down/Left/Right (controller). For each button, the override map is checked first; if absent or invalid, the adaptor default is used.
type Notification ¶
type Notification struct {
// contains filtered or unexported fields
}
Notification displays temporary messages on screen
func NewNotification ¶
func NewNotification() *Notification
NewNotification creates a new notification system
func (*Notification) Draw ¶
func (n *Notification) Draw(screen *ebiten.Image)
Draw renders the notification
func (*Notification) IsVisible ¶
func (n *Notification) IsVisible() bool
IsVisible returns whether the notification is currently visible
func (*Notification) PlaySound ¶
func (n *Notification) PlaySound(soundData []byte)
PlaySound plays sound data through a one-shot oto player. Sound data should be 48kHz stereo S16LE format.
func (*Notification) SetBadge ¶
func (n *Notification) SetBadge(badge *ebiten.Image)
SetBadge updates the badge image for the current notification (thread-safe)
func (*Notification) Show ¶
func (n *Notification) Show(message string, duration time.Duration)
Show displays a notification message
func (*Notification) ShowAchievementWithBadge ¶
func (n *Notification) ShowAchievementWithBadge(title, description string, badge *ebiten.Image)
ShowAchievementWithBadge displays a prominent achievement notification with a badge image
func (*Notification) ShowDefault ¶
func (n *Notification) ShowDefault(message string)
ShowDefault displays a notification with default 3 second duration
func (*Notification) ShowShort ¶
func (n *Notification) ShowShort(message string)
ShowShort displays a notification with 1 second duration (for gameplay)
type NotificationType ¶
type NotificationType int
NotificationType determines the visual style of the notification
const ( NotificationTypeDefault NotificationType = iota // Small, bottom-right NotificationTypeAchievement // Large, top-center, prominent )
type PauseMenu ¶
type PauseMenu struct {
// contains filtered or unexported fields
}
PauseMenu handles the in-game pause menu
func NewPauseMenu ¶
func NewPauseMenu(onResume, onLibrary, onExit func()) *PauseMenu
NewPauseMenu creates a new pause menu
type PauseMenuOption ¶
type PauseMenuOption int
PauseMenuOption represents a menu option
const ( PauseMenuResume PauseMenuOption = iota PauseMenuLibrary PauseMenuExit PauseMenuOptionCount )
type PlayTimeTracker ¶
type PlayTimeTracker struct {
// contains filtered or unexported fields
}
PlayTimeTracker tracks play time during gameplay
type RewindBuffer ¶
type RewindBuffer struct {
// contains filtered or unexported fields
}
RewindBuffer stores serialized emulator states in a ring buffer for rewinding gameplay. States are captured every frameStep frames and can be popped in reverse order (LIFO) to step backwards.
func NewRewindBuffer ¶
func NewRewindBuffer(bufferSizeMB, frameStep, stateSize int) *RewindBuffer
NewRewindBuffer allocates a ring buffer sized to fit bufferSizeMB worth of serialized states, each stateSize bytes.
func (*RewindBuffer) Capacity ¶
func (rb *RewindBuffer) Capacity() int
Capacity returns the maximum number of entries the buffer can hold.
func (*RewindBuffer) Capture ¶
func (rb *RewindBuffer) Capture(saveStater coreif.SaveStater) error
Capture serializes the emulator state and stores it in the ring buffer. Only captures every frameStep frames. Should be called after RunFrame.
func (*RewindBuffer) Count ¶
func (rb *RewindBuffer) Count() int
Count returns the number of valid entries in the buffer.
func (*RewindBuffer) IsRewinding ¶
func (rb *RewindBuffer) IsRewinding() bool
IsRewinding returns whether the buffer is currently in rewind mode.
func (*RewindBuffer) Reset ¶
func (rb *RewindBuffer) Reset()
Reset clears the buffer. Call on game launch or save state load.
func (*RewindBuffer) Rewind ¶
func (rb *RewindBuffer) Rewind(emu coreif.Emulator, saveStater coreif.SaveStater, count int) bool
Rewind pops count states from the buffer and deserializes the last one. After deserializing, RunFrame is called to regenerate the framebuffer since the serialized state doesn't include rendered pixels. Returns false if the buffer is empty.
func (*RewindBuffer) SetRewinding ¶
func (rb *RewindBuffer) SetRewinding(v bool)
SetRewinding sets the rewind mode flag.
type RumbleEngine ¶ added in v0.3.0
type RumbleEngine struct {
// contains filtered or unexported fields
}
RumbleEngine evaluates rumble entries each frame and produces rumble events.
func NewRumbleEngine ¶ added in v0.3.0
func NewRumbleEngine(entries []RumbleEntry, systemBigEndian bool) *RumbleEngine
NewRumbleEngine creates a new rumble engine from parsed entries. systemBigEndian should match SystemInfo.BigEndianMemory for the core. Byte swapping is determined per-entry by comparing the CHT entry's big_endian field against the system endianness.
func (*RumbleEngine) Evaluate ¶ added in v0.3.0
func (re *RumbleEngine) Evaluate(mi coreif.MemoryInspector) []RumbleEvent
Evaluate reads memory for each entry, checks conditions, and returns rumble events.
func (*RumbleEngine) Reset ¶ added in v0.3.0
func (re *RumbleEngine) Reset()
Reset clears engine state (for save state loads or rewind).
type RumbleEntry ¶ added in v0.3.0
type RumbleEntry struct {
Address uint32
MemorySearchSize int // 0=1bit, 1=2bit, 2=4bit, 3=8bit, 4=16bit, 5=32bit
RumbleType int // 0-10 (0 treated as 1/changes)
RumbleValue uint32 // comparison value for types 5-10
RumblePort int // 0-15 specific, else all
BigEndian bool // CHT entry's big_endian field
PrimaryStrength uint16 // 0-65535
PrimaryDuration int // milliseconds
SecondaryStrength uint16 // 0-65535
SecondaryDuration int // milliseconds
}
RumbleEntry represents a single rumble definition from a CHT file.
func ParseRumbleFile ¶ added in v0.3.0
func ParseRumbleFile(path string) ([]RumbleEntry, error)
ParseRumbleFile reads a CHT rumble file and returns the parsed entries.
type RumbleEvent ¶ added in v0.3.0
type RumbleEvent struct {
Port int
StrongMagnitude float64
WeakMagnitude float64
StrongDurationMs int
WeakDurationMs int
}
RumbleEvent represents a rumble command to send to a gamepad.
type SaveStateManager ¶
type SaveStateManager struct {
// contains filtered or unexported fields
}
SaveStateManager handles save state operations
func NewSaveStateManager ¶
func NewSaveStateManager(notification *Notification) *SaveStateManager
NewSaveStateManager creates a new save state manager
func (*SaveStateManager) GetCurrentSlot ¶
func (m *SaveStateManager) GetCurrentSlot() int
GetCurrentSlot returns the current save slot
func (*SaveStateManager) HasResumeState ¶
func (m *SaveStateManager) HasResumeState() bool
HasResumeState checks if a resume state exists
func (*SaveStateManager) Load ¶
func (m *SaveStateManager) Load(saveStater coreif.SaveStater) error
Load loads the state from the current slot
func (*SaveStateManager) LoadResume ¶
func (m *SaveStateManager) LoadResume(saveStater coreif.SaveStater) error
LoadResume loads the resume state
func (*SaveStateManager) LoadSRAM ¶
func (m *SaveStateManager) LoadSRAM(batterySaver coreif.BatterySaver) error
LoadSRAM loads the cartridge SRAM
func (*SaveStateManager) NextSlot ¶
func (m *SaveStateManager) NextSlot()
NextSlot cycles to the next save slot
func (*SaveStateManager) PreviousSlot ¶
func (m *SaveStateManager) PreviousSlot()
PreviousSlot cycles to the previous save slot
func (*SaveStateManager) Save ¶
func (m *SaveStateManager) Save(saveStater coreif.SaveStater) error
Save saves the current state to the current slot
func (*SaveStateManager) SaveResume ¶
func (m *SaveStateManager) SaveResume(saveStater coreif.SaveStater) error
SaveResume saves the resume state
func (*SaveStateManager) SaveResumeData ¶
func (m *SaveStateManager) SaveResumeData(state []byte) error
SaveResumeData saves pre-serialized state data as the resume state. Used by the auto-save system where the emu goroutine caches serialized state.
func (*SaveStateManager) SaveSRAM ¶
func (m *SaveStateManager) SaveSRAM(batterySaver coreif.BatterySaver) error
SaveSRAM saves the cartridge SRAM
func (*SaveStateManager) SetGame ¶
func (m *SaveStateManager) SetGame(gameCRC string)
SetGame sets the current game for save states Restores the last-used slot from the game's settings
func (*SaveStateManager) SetLibrary ¶
func (m *SaveStateManager) SetLibrary(library *storage.Library)
SetLibrary sets the library reference for slot persistence
type ScanManager ¶
type ScanManager struct {
// contains filtered or unexported fields
}
ScanManager handles ROM scanning orchestration. This includes creating and running scanners, tracking progress, and merging results into the library.
func NewScanManager ¶
func NewScanManager( library *storage.Library, scanScreen *screens.ScanProgressScreen, extensions []string, md *metadata.MetadataManager, defaultConsoleID int, onProgress func(), onComplete func(msg string), ) *ScanManager
NewScanManager creates a new scan manager
func (*ScanManager) IsScanning ¶
func (sm *ScanManager) IsScanning() bool
IsScanning returns true if a scan is in progress
func (*ScanManager) SetLibrary ¶
func (sm *ScanManager) SetLibrary(library *storage.Library)
SetLibrary updates the library reference
func (*ScanManager) SetScanScreen ¶
func (sm *ScanManager) SetScanScreen(screen *screens.ScanProgressScreen)
SetScanScreen updates the scan screen reference
func (*ScanManager) Start ¶
func (sm *ScanManager) Start(rescanAll bool)
Start begins a new scan operation
func (*ScanManager) Update ¶
func (sm *ScanManager) Update()
Update polls for scan progress and completion. Should be called each frame while scanning.
type ScreenshotManager ¶
type ScreenshotManager struct {
// contains filtered or unexported fields
}
ScreenshotManager handles taking and saving screenshots
func NewScreenshotManager ¶
func NewScreenshotManager(notification *Notification) *ScreenshotManager
NewScreenshotManager creates a new screenshot manager
func (*ScreenshotManager) TakeScreenshot ¶
func (m *ScreenshotManager) TakeScreenshot(screen *ebiten.Image, gameCRC string) error
TakeScreenshot captures and saves a screenshot Per design: silent capture with no notification
type SearchOverlay ¶
type SearchOverlay struct {
// contains filtered or unexported fields
}
SearchOverlay displays a search filter at the bottom-left of the screen
func NewSearchOverlay ¶
func NewSearchOverlay(onChanged func(text string)) *SearchOverlay
NewSearchOverlay creates a new search overlay with the given change callback
func (*SearchOverlay) Activate ¶
func (s *SearchOverlay) Activate()
Activate starts capturing keyboard input
func (*SearchOverlay) Clear ¶
func (s *SearchOverlay) Clear()
Clear removes all search text and deactivates
func (*SearchOverlay) Draw ¶
func (s *SearchOverlay) Draw(screen *ebiten.Image)
Draw renders the search overlay at bottom-left
func (*SearchOverlay) HandleInput ¶
func (s *SearchOverlay) HandleInput() bool
HandleInput processes keyboard input when active. Returns true if input was handled (should not propagate to navigation).
func (*SearchOverlay) IsActive ¶
func (s *SearchOverlay) IsActive() bool
IsActive returns true if the overlay is capturing keyboard input
func (*SearchOverlay) IsVisible ¶
func (s *SearchOverlay) IsVisible() bool
IsVisible returns true if the search has text (overlay should be shown)
type SharedFramebuffer ¶
type SharedFramebuffer struct {
// contains filtered or unexported fields
}
SharedFramebuffer holds pixel data written by the emulation goroutine and read by Ebiten's Draw() method. Uses separate write and read buffers so the emu goroutine can write new data while Draw uses the read copy.
func NewSharedFramebuffer ¶
func NewSharedFramebuffer(width, height int) *SharedFramebuffer
NewSharedFramebuffer creates a pre-allocated framebuffer sized for the given screen dimensions (width and height in pixels, 4 bytes per pixel).
func (*SharedFramebuffer) Read ¶
func (sf *SharedFramebuffer) Read() (pixels []byte, stride, activeHeight int)
Read returns a snapshot of the current framebuffer state. Copies the write buffer into the read buffer under the lock, then returns the read buffer which is safe to use without holding the lock.
func (*SharedFramebuffer) Update ¶
func (sf *SharedFramebuffer) Update(pixels []byte, stride, activeHeight int)
Update copies framebuffer data from the emulation goroutine.
type SharedInput ¶
type SharedInput struct {
// contains filtered or unexported fields
}
SharedInput holds controller state as button bitmasks written by the Ebiten thread and read by the emulation goroutine.
func (*SharedInput) Read ¶
func (si *SharedInput) Read() [maxPlayers]uint32
Read returns the current button bitmasks for all players.
func (*SharedInput) Set ¶
func (si *SharedInput) Set(player int, buttons uint32)
Set updates button bitmask for a player from the Ebiten thread.
type TurboState ¶
type TurboState struct {
// contains filtered or unexported fields
}
TurboState holds fast-forward state shared between the Ebiten thread (which sets it from key input) and the emulation goroutine (which reads it).
func (*TurboState) CycleMultiplier ¶
func (ts *TurboState) CycleMultiplier() int
CycleMultiplier advances through Off(1) → 2x → 3x → Off(1), returning the new value. Called from the Ebiten thread.
func (*TurboState) Read ¶
func (ts *TurboState) Read() int
Read returns the current multiplier. Called from the emulation goroutine.
type UINavigation ¶
type UINavigation struct {
}
UINavigation represents the result of UI input polling