From 99902e0ab497ae56575d562b877b26437416ea91 Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Thu, 30 Jul 2026 07:23:20 +0200 Subject: [PATCH] add AssetFS hook so assets can load from an embed.FS (js/wasm) Co-Authored-By: Claude Fable 5 --- asset.audio.go | 3 +-- asset.fs.go | 31 +++++++++++++++++++++++++++++++ asset.manager.go | 3 +-- 3 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 asset.fs.go diff --git a/asset.audio.go b/asset.audio.go index eedfbed..d152ad5 100644 --- a/asset.audio.go +++ b/asset.audio.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "os" "path/filepath" "strings" @@ -174,7 +173,7 @@ type audioStream interface { } func decodeAudioStream(path string, sampleRate int) (audioStream, int64, error) { - f, err := os.Open(path) + f, err := openAsset(path) if err != nil { return nil, 0, err } diff --git a/asset.fs.go b/asset.fs.go new file mode 100644 index 0000000..ae57eee --- /dev/null +++ b/asset.fs.go @@ -0,0 +1,31 @@ +package pncdsl + +import ( + "io/fs" + "os" +) + +// AssetFS, when non-nil, is the filesystem asset files (images, audio) +// are read from instead of the OS filesystem. Set it to an embed.FS +// before Run to ship assets inside the binary — required for js/wasm +// builds, where there is no OS filesystem and every asset would fall +// back to a placeholder: +// +// //go:embed assets +// var assetsFS embed.FS +// +// func init() { pncdsl.AssetFS = assetsFS } +// +// Asset.Path values are used as-is, so they must be slash-separated +// and relative (e.g. "assets/bg/bedroom.png") — the same form that +// works with os.Open from the project root. +var AssetFS fs.FS + +// openAsset opens an asset file honoring AssetFS. Every asset read in +// the package goes through here. +func openAsset(path string) (fs.File, error) { + if AssetFS != nil { + return AssetFS.Open(path) + } + return os.Open(path) +} diff --git a/asset.manager.go b/asset.manager.go index 5ae9c1c..4fd81e2 100644 --- a/asset.manager.go +++ b/asset.manager.go @@ -6,7 +6,6 @@ import ( "image/color" _ "image/jpeg" _ "image/png" - "os" "github.com/hajimehoshi/ebiten/v2" ) @@ -57,7 +56,7 @@ func (la *loadedAssets) isPlaceholder(name string) bool { } func loadImageFile(path string) *ebiten.Image { - f, err := os.Open(path) + f, err := openAsset(path) if err != nil { return nil }