Skip to content

Commit a64d845

Browse files
authored
Refactor assets loading (#24)
1 parent 6912c3c commit a64d845

2 files changed

Lines changed: 127 additions & 96 deletions

File tree

assets/assets.go

Lines changed: 119 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -9,112 +9,135 @@ import (
99
)
1010

1111
var (
12-
fieldBuf [19213]byte
13-
Field firefly.Image
14-
fireflyHighlightBuf [262]byte
15-
FireflyHighlight util.SpriteSheet
16-
scrollBuf [16375]byte
17-
ScrollClose util.SpriteSheet
18-
ScrollOpen util.SpriteSheet
19-
tournamentButtonBuf [3037]byte
20-
TournamentButton util.SpriteSheet
21-
trainButtonBuf [909]byte
22-
TrainButton util.SpriteSheet
23-
shopButtonBuf [629]byte
24-
ShopButton util.SpriteSheet
25-
26-
racingMapBuf [192013]byte
27-
RacingMap firefly.Image
28-
racingMapTreesBuf [192013]byte
29-
RacingMapTrees firefly.Image
30-
racingMapTreetopsBuf [192013]byte
31-
RacingMapTreetops firefly.Image
32-
racingMapCloudsBuf [32207]byte
33-
RacingMapClouds util.SpriteSheet
34-
racingMapMaskBuf [96007]byte
35-
RacingMapMask util.ExtImage
36-
racingPlaceBuf [1465]byte
37-
RacingPlace util.SpriteSheet
38-
victorySplashBuf [86407]byte
39-
VictorySplash util.SpriteSheet
40-
defeatSplashBuf [86407]byte
41-
DefeatSplash util.SpriteSheet
42-
fireflySheetBuf [213]byte
43-
FireflySheet util.SpriteSheet
44-
FireflySheetRev util.SpriteSheet
45-
46-
fireflyHatsBuf [1933]byte
12+
buf [1036376]byte
13+
14+
Field firefly.Image
15+
FireflyHighlight util.SpriteSheet
16+
ScrollClose util.SpriteSheet
17+
ScrollOpen util.SpriteSheet
18+
TournamentButton util.SpriteSheet
19+
TrainButton util.SpriteSheet
20+
ShopButton util.SpriteSheet
21+
22+
RacingMap firefly.Image
23+
RacingMapTrees firefly.Image
24+
RacingMapTreetops firefly.Image
25+
RacingMapClouds util.SpriteSheet
26+
RacingMapMask util.ExtImage
27+
RacingPlace util.SpriteSheet
28+
VictorySplash util.SpriteSheet
29+
DefeatSplash util.SpriteSheet
30+
FireflySheet util.SpriteSheet
31+
FireflySheetRev util.SpriteSheet
32+
4733
FireflyHats util.SpriteSheet
4834
FireflyHatsRev util.SpriteSheet
4935

50-
titleScreenBuf [38413]byte
51-
TitleScreen util.SpriteSheet
52-
titleButtonHighlightBuf [702]byte
53-
TitleButtonHighlight util.SpriteSheet
54-
titleNoContinueBuf [423]byte
55-
TitleNoContinue firefly.Image
56-
57-
shopBGBuf [9607]byte
58-
ShopBG firefly.Image
59-
shopFrogBuf [31693]byte
60-
ShopFrog util.SpriteSheet
61-
shopPropsBuf [23533]byte
62-
ShopProps util.SpriteSheet
63-
shopChatboxBuf [3073]byte
64-
ShopChatbox firefly.Image
65-
shopItemBuf [6061]byte
66-
ShopItem util.SpriteSheet
67-
68-
exitBuf [95]byte
69-
Exit firefly.Image
70-
71-
transitionSheetBuf [134]byte
72-
TransitionSheet util.SpriteSheet
73-
74-
cashBannerBuf [589]byte
75-
CashBanner firefly.Image
76-
77-
fontEG_6x9Buf [655]byte
78-
FontEG_6x9 firefly.Font
79-
fontPico8_4x6Buf [295]byte
80-
FontPico8_4x6 firefly.Font
36+
TitleScreen util.SpriteSheet
37+
TitleButtonHighlight util.SpriteSheet
38+
TitleNoContinue firefly.Image
39+
40+
ShopBG firefly.Image
41+
ShopFrog util.SpriteSheet
42+
ShopProps util.SpriteSheet
43+
ShopChatbox firefly.Image
44+
ShopItem util.SpriteSheet
45+
46+
Exit firefly.Image
47+
48+
TransitionSheet util.SpriteSheet
49+
50+
CashBanner firefly.Image
51+
52+
FontEG_6x9 firefly.Font
53+
FontPico8_4x6 firefly.Font
8154
)
8255

8356
func Load() {
84-
// firefly.LogDebug(strconv.Itoa(firefly.GetFileSize("firefly-hats")))
85-
Field = firefly.LoadImage("field", fieldBuf[:])
86-
FireflyHighlight = util.SplitImageBySize(firefly.LoadImage("firefly-hi", fireflyHighlightBuf[:]), firefly.S(32, 32))
87-
allHats := util.SplitImageBySize(firefly.LoadImage("firefly-hats", fireflyHatsBuf[:]), firefly.S(10, 8))
57+
loader := Loader{buf: buf[:]}
58+
59+
Field = loader.LoadImage("field")
60+
FireflyHighlight = util.SplitImageBySize(loader.LoadImage("firefly-hi"), firefly.S(32, 32))
61+
allHats := util.SplitImageBySize(loader.LoadImage("firefly-hats"), firefly.S(10, 8))
8862
FireflyHats = allHats[:22]
8963
FireflyHatsRev = allHats[22:]
90-
ScrollClose = util.SplitImageByCount(firefly.LoadImage("scroll", scrollBuf[:]), firefly.S(4, 1))
64+
ScrollClose = util.SplitImageByCount(loader.LoadImage("scroll"), firefly.S(4, 1))
9165
ScrollOpen = slices.Clone(ScrollClose)
9266
slices.Reverse(ScrollOpen)
93-
TournamentButton = util.SplitImageByCount(firefly.LoadImage("tournament-btn", tournamentButtonBuf[:]), firefly.S(7, 1))
94-
TrainButton = util.SplitImageBySize(firefly.LoadImage("train-btn", trainButtonBuf[:]), firefly.S(61, 14))
95-
ShopButton = util.SplitImageBySize(firefly.LoadImage("shop-btn", shopButtonBuf[:]), firefly.S(42, 14))
96-
RacingMap = firefly.LoadImage("racing-map", racingMapBuf[:])
97-
RacingMapTrees = firefly.LoadImage("racing-map-trees", racingMapTreesBuf[:])
98-
RacingMapTreetops = firefly.LoadImage("racing-map-treetops", racingMapTreetopsBuf[:])
99-
RacingMapClouds = util.SplitImageByCount(firefly.LoadImage("racing-map-clouds", racingMapCloudsBuf[:]), firefly.S(2, 1))
100-
RacingMapMask = util.NewExtImage(firefly.LoadFile("racing-map-mask", racingMapMaskBuf[:]))
101-
RacingPlace = util.SplitImageBySize(firefly.LoadImage("racing-place", racingPlaceBuf[:]), firefly.S(28, 33))
102-
VictorySplash = util.SplitImageByCount(firefly.LoadImage("victory-splash", victorySplashBuf[:]), firefly.S(3, 3))
103-
DefeatSplash = util.SplitImageByCount(firefly.LoadImage("defeat-splash", defeatSplashBuf[:]), firefly.S(3, 3))
104-
fireflyCombinedSheet := util.SplitImageBySize(firefly.LoadImage("firefly", fireflySheetBuf[:]), firefly.S(9, 10))
67+
TournamentButton = util.SplitImageByCount(loader.LoadImage("tournament-btn"), firefly.S(7, 1))
68+
TrainButton = util.SplitImageBySize(loader.LoadImage("train-btn"), firefly.S(61, 14))
69+
ShopButton = util.SplitImageBySize(loader.LoadImage("shop-btn"), firefly.S(42, 14))
70+
RacingMap = loader.LoadImage("racing-map")
71+
RacingMapTrees = loader.LoadImage("racing-map-trees")
72+
RacingMapTreetops = loader.LoadImage("racing-map-treetops")
73+
RacingMapClouds = util.SplitImageByCount(loader.LoadImage("racing-map-clouds"), firefly.S(2, 1))
74+
RacingMapMask = loader.LoadExtImage("racing-map-mask")
75+
RacingPlace = util.SplitImageBySize(loader.LoadImage("racing-place"), firefly.S(28, 33))
76+
VictorySplash = util.SplitImageByCount(loader.LoadImage("victory-splash"), firefly.S(3, 3))
77+
DefeatSplash = util.SplitImageByCount(loader.LoadImage("defeat-splash"), firefly.S(3, 3))
78+
fireflyCombinedSheet := util.SplitImageBySize(loader.LoadImage("firefly"), firefly.S(9, 10))
10579
FireflySheet = fireflyCombinedSheet[0:2]
10680
FireflySheetRev = fireflyCombinedSheet[2:4]
107-
TitleScreen = util.SplitImageByCount(firefly.LoadImage("title-screen", titleScreenBuf[:]), firefly.S(2, 1))
108-
TitleButtonHighlight = util.SplitImageByCount(firefly.LoadImage("title-button-hi", titleButtonHighlightBuf[:]), firefly.S(2, 1))
109-
TitleNoContinue = firefly.LoadImage("title-no-continue", titleNoContinueBuf[:])
110-
ShopBG = firefly.LoadImage("shop-bg", shopBGBuf[:])
111-
ShopFrog = util.SplitImageByCount(firefly.LoadImage("shop-frog", shopFrogBuf[:]), firefly.S(3, 2))
112-
ShopProps = util.SplitImageByCount(firefly.LoadImage("shop-props", shopPropsBuf[:]), firefly.S(3, 2))
113-
ShopChatbox = firefly.LoadImage("shop-chatbox", shopChatboxBuf[:])
114-
ShopItem = util.SplitImageByCount(firefly.LoadImage("shop-item", shopItemBuf[:]), firefly.S(4, 3))
115-
TransitionSheet = util.SplitImageByCount(firefly.LoadImage("transition", transitionSheetBuf[:]), firefly.S(4, 4))
116-
Exit = firefly.LoadImage("exit", exitBuf[:])
117-
CashBanner = firefly.LoadImage("cash-banner", cashBannerBuf[:])
118-
FontEG_6x9 = firefly.LoadFont("eg_6x9", fontEG_6x9Buf[:])
119-
FontPico8_4x6 = firefly.LoadFont("pico8_4x6", fontPico8_4x6Buf[:])
81+
TitleScreen = util.SplitImageByCount(loader.LoadImage("title-screen"), firefly.S(2, 1))
82+
TitleButtonHighlight = util.SplitImageByCount(loader.LoadImage("title-button-hi"), firefly.S(2, 1))
83+
TitleNoContinue = loader.LoadImage("title-no-continue")
84+
ShopBG = loader.LoadImage("shop-bg")
85+
ShopFrog = util.SplitImageByCount(loader.LoadImage("shop-frog"), firefly.S(3, 2))
86+
ShopProps = util.SplitImageByCount(loader.LoadImage("shop-props"), firefly.S(3, 2))
87+
ShopChatbox = loader.LoadImage("shop-chatbox")
88+
ShopItem = util.SplitImageByCount(loader.LoadImage("shop-item"), firefly.S(4, 3))
89+
TransitionSheet = util.SplitImageByCount(loader.LoadImage("transition"), firefly.S(4, 4))
90+
Exit = loader.LoadImage("exit")
91+
CashBanner = loader.LoadImage("cash-banner")
92+
FontEG_6x9 = loader.LoadFont("eg_6x9")
93+
FontPico8_4x6 = loader.LoadFont("pico8_4x6")
94+
95+
loader.AssertBufferFullyUtilized()
96+
}
97+
98+
type Loader struct {
99+
buf []byte
100+
used int
101+
}
102+
103+
func (loader *Loader) LoadFile(path string) firefly.File {
104+
// Have to get the file size separately, even though LoadFile returns the size
105+
// https://github.com/firefly-zero/firefly-runtime/issues/7
106+
fileSize := firefly.GetFileSize(path)
107+
file := firefly.LoadFile(path, loader.buf[:fileSize])
108+
written := len(file.Raw)
109+
loader.used += written
110+
loader.buf = loader.buf[written:]
111+
return file
112+
}
113+
114+
func (loader *Loader) LoadImage(path string) firefly.Image {
115+
return loader.LoadFile(path).Image()
116+
}
117+
118+
func (loader *Loader) LoadExtImage(path string) util.ExtImage {
119+
return util.NewExtImage(loader.LoadFile(path))
120+
}
121+
122+
func (loader *Loader) LoadFont(path string) firefly.Font {
123+
return loader.LoadFile(path).Font()
124+
}
125+
126+
func (loader *Loader) AssertBufferFullyUtilized() {
127+
var buf [100]byte
128+
n := copy(buf[:], "All assets loaded. Total size: ")
129+
n += util.FormatIntInto(buf[n:], loader.used)
130+
firefly.LogDebug(string(buf[:n]))
131+
132+
if len(loader.buf) > 0 {
133+
var buf [100]byte
134+
n := copy(buf[:], "Assets buffer should be smaller. Want: [")
135+
n += util.FormatIntInto(buf[n:], loader.used)
136+
n += copy(buf[n:], "]byte, but got [")
137+
n += util.FormatIntInto(buf[n:], loader.used+len(loader.buf))
138+
n += copy(buf[n:], "]byte")
139+
err := string(buf[:n])
140+
firefly.LogError(err)
141+
panic("assets.Loader: buffer was not fully utilized")
142+
}
120143
}

pkg/util/text.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,14 @@ func numberOfDigits(num int) int {
102102
return 4
103103
case num < 1e5:
104104
return 5
105+
case num < 1e6:
106+
return 6
107+
case num < 1e7:
108+
return 7
109+
case num < 1e8:
110+
return 8
111+
case num < 1e9:
112+
return 9
105113
default:
106114
panic("number is too big")
107115
}

0 commit comments

Comments
 (0)