Documentation
¶
Index ¶
- Constants
- func GetPlaceholderImage() *ebiten.Image
- func GetRDBPath() (string, error)
- 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 RDBExists() bool
- 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 emucore.CoreFactory) error
- func RunDirect(factory emucore.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) GetPlaceholderImageData() []byte
- func (a *App) GetRDB() *rdb.RDB
- 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) 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 MetadataManager
- func (m *MetadataManager) DownloadArtwork(gameCRC string, gameName string)
- func (m *MetadataManager) DownloadRDB() error
- func (m *MetadataManager) GetRDB() *rdb.RDB
- func (m *MetadataManager) IsRDBLoaded() bool
- func (m *MetadataManager) LoadRDB() error
- func (m *MetadataManager) LookupByCRC32(crc32 uint32) *rdb.Game
- 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 emucore.SaveStater) error
- func (rb *RewindBuffer) Count() int
- func (rb *RewindBuffer) IsRewinding() bool
- func (rb *RewindBuffer) Reset()
- func (rb *RewindBuffer) Rewind(emu emucore.Emulator, saveStater emucore.SaveStater, count int) bool
- func (rb *RewindBuffer) SetRewinding(v bool)
- type SaveStateManager
- func (m *SaveStateManager) GetCurrentSlot() int
- func (m *SaveStateManager) HasResumeState() bool
- func (m *SaveStateManager) Load(saveStater emucore.SaveStater) error
- func (m *SaveStateManager) LoadResume(saveStater emucore.SaveStater) error
- func (m *SaveStateManager) LoadSRAM(batterySaver emucore.BatterySaver) error
- func (m *SaveStateManager) NextSlot()
- func (m *SaveStateManager) PreviousSlot()
- func (m *SaveStateManager) Save(saveStater emucore.SaveStater) error
- func (m *SaveStateManager) SaveResume(saveStater emucore.SaveStater) error
- func (m *SaveStateManager) SaveResumeData(state []byte) error
- func (m *SaveStateManager) SaveSRAM(batterySaver emucore.BatterySaver) error
- func (m *SaveStateManager) SetGame(gameCRC string)
- func (m *SaveStateManager) SetLibrary(library *storage.Library)
- type ScanManager
- type ScanPhase
- type ScanProgress
- type ScanResult
- type Scanner
- type ScreenshotManager
- type SearchOverlay
- type SharedFramebuffer
- type SharedInput
- type TurboState
- type UINavigation
Constants ¶
const Version = "0.1.0"
Standalone UI version
Variables ¶
This section is empty.
Functions ¶
func GetPlaceholderImage ¶
GetPlaceholderImage returns the placeholder image for missing artwork
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 emucore.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 emucore.CoreFactory, romPath, regionStr string, options map[string]string) 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.
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) GetPlaceholderImageData ¶
GetPlaceholderImageData returns the raw embedded placeholder image data
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) 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) *FramebufferRenderer
NewFramebufferRenderer creates a renderer for the given native screen width.
func (*FramebufferRenderer) DrawFramebuffer ¶
func (r *FramebufferRenderer) DrawFramebuffer(screen *ebiten.Image, pixels []byte, stride, activeHeight int)
DrawFramebuffer renders pixel data to the screen with aspect-ratio-preserving 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.
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 emucore.CoreFactory, systemInfo emucore.SystemInfo, saveStateManager *SaveStateManager, screenshotManager *ScreenshotManager, notification *Notification, library *storage.Library, config *storage.Config, achievementManager *achievements.Manager, gameRDB *rdb.RDB, 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 []emucore.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 []emucore.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 MetadataManager ¶
type MetadataManager struct {
// contains filtered or unexported fields
}
MetadataManager handles RDB and artwork downloads
func NewMetadataManager ¶
func NewMetadataManager(rdbName, thumbnailRepo string) *MetadataManager
NewMetadataManager creates a new metadata manager
func (*MetadataManager) DownloadArtwork ¶
func (m *MetadataManager) DownloadArtwork(gameCRC string, gameName string)
DownloadArtwork downloads artwork for a game using the fallback chain Returns silently on any error (per spec)
func (*MetadataManager) DownloadRDB ¶
func (m *MetadataManager) DownloadRDB() error
DownloadRDB downloads the RDB file from libretro-database Downloads to a temp file first, then renames on success
func (*MetadataManager) GetRDB ¶
func (m *MetadataManager) GetRDB() *rdb.RDB
GetRDB returns the loaded RDB, or nil if not loaded
func (*MetadataManager) IsRDBLoaded ¶
func (m *MetadataManager) IsRDBLoaded() bool
IsRDBLoaded returns true if the RDB is loaded
func (*MetadataManager) LoadRDB ¶
func (m *MetadataManager) LoadRDB() error
LoadRDB loads the RDB file into memory Returns nil without error if file doesn't exist
func (*MetadataManager) LookupByCRC32 ¶
func (m *MetadataManager) LookupByCRC32(crc32 uint32) *rdb.Game
LookupByCRC32 looks up a game by CRC32 Returns nil if not found or RDB not loaded
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 emucore.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 emucore.Emulator, saveStater emucore.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 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 emucore.SaveStater) error
Load loads the state from the current slot
func (*SaveStateManager) LoadResume ¶
func (m *SaveStateManager) LoadResume(saveStater emucore.SaveStater) error
LoadResume loads the resume state
func (*SaveStateManager) LoadSRAM ¶
func (m *SaveStateManager) LoadSRAM(batterySaver emucore.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 emucore.SaveStater) error
Save saves the current state to the current slot
func (*SaveStateManager) SaveResume ¶
func (m *SaveStateManager) SaveResume(saveStater emucore.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 emucore.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, rdbName string, thumbnailRepo string, 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 ScanProgress ¶
type ScanProgress struct {
Phase ScanPhase
Progress float64 // 0.0 to 1.0
GamesFound int
ArtworkTotal int
ArtworkComplete int
StatusText string
}
ScanProgress represents progress updates from the scanner
type ScanResult ¶
ScanResult represents the final scan result
type Scanner ¶
type Scanner struct {
// contains filtered or unexported fields
}
Scanner handles ROM scanning in the background
func NewScanner ¶
func NewScanner(dirs []storage.ScanDirectory, excluded []string, existing map[string]*storage.GameEntry, rescanAll bool, extensions []string, rdbName, thumbnailRepo string) *Scanner
NewScanner creates a new scanner instance
func (*Scanner) Progress ¶
func (s *Scanner) Progress() <-chan ScanProgress
Progress returns the progress channel
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