Skip to content

Commit a4ae109

Browse files
committed
Early preparations for having multiple level files.
Helps with #424 by allowing an alternate level tmx file by `-cheat_level=foo`.
1 parent de4bbd4 commit a4ae109

File tree

10 files changed

+73
-31
lines changed

10 files changed

+73
-31
lines changed

cmd/dumpcplocs/main.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import (
2424
"github.com/divVerent/aaaaxy/internal/vfs"
2525
)
2626

27+
var (
28+
levelName = flag.String("level", "level", "name of the level file to load")
29+
)
30+
2731
func main() {
2832
log.Debugf("initializing VFS...")
2933
err := vfs.Init()
@@ -33,7 +37,7 @@ func main() {
3337
log.Debugf("parsing flags...")
3438
flag.Parse(flag.NoConfig)
3539
log.Debugf("loading level...")
36-
lvl, err := level.NewLoader("level").SkipComparingCheckpointLocations(true).Load()
40+
lvl, err := level.NewLoader(*levelName).SkipComparingCheckpointLocations(true).Load()
3741
if err != nil {
3842
log.Fatalf("could not load level: %v", err)
3943
}

cmd/dumpcps/main.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ import (
2727
"github.com/divVerent/aaaaxy/internal/vfs"
2828
)
2929

30+
var (
31+
levelName = flag.String("level", "level", "name of the level file to load")
32+
)
33+
3034
type (
3135
Edge struct {
3236
WantDelta m.Delta
@@ -78,7 +82,7 @@ func main() {
7882
log.Debugf("parsing flags...")
7983
flag.Parse(flag.NoConfig)
8084
log.Debugf("loading level...")
81-
lvl, err := level.NewLoader("level").SkipCheckpointLocations(true).Load()
85+
lvl, err := level.NewLoader(*levelName).SkipCheckpointLocations(true).Load()
8286
if err != nil {
8387
log.Fatalf("could not load level: %v", err)
8488
}

internal/aaaaxy/init.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (g *Game) InitEarly() error {
129129
if err != nil {
130130
return fmt.Errorf("could not initialize VFS: %w", err)
131131
}
132-
err = initlocale.Init()
132+
err = initlocale.Init(engine.LevelName())
133133
if err != nil {
134134
return fmt.Errorf("could not initialize locale: %w", err)
135135
}

internal/engine/world.go

+20-3
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ var (
4444
debugCheckTileWindowSize = flag.Bool("debug_check_tile_window_size", false, "if set, we verify that the tile window size is set high enough")
4545
debugCheckEntityOverlaps = flag.Bool("debug_check_entity_overlaps", false, "if set, we verify no two static entities overlap at same Z index")
4646
debugCheckEntitySpawn = flag.Bool("debug_check_entity_spawn", false, "if set, crash if an entity fails to spawn")
47+
cheatLevel = flag.String("cheat_level", "level", "name of the level file to load")
4748
)
4849

4950
// World represents the current game state including its entities.
@@ -212,9 +213,23 @@ func loadLevel() (*level.Level, error) {
212213
return loadLevelCache.Clone(), nil
213214
}
214215

215-
var levelLoader *level.Loader = level.NewLoader("level")
216+
// LevelName returns the name of the level used.
217+
// If this ever changes, ReloadLevel and locale.SetLanguage need to be called.
218+
func LevelName() string {
219+
return *cheatLevel
220+
}
221+
222+
var (
223+
levelLoader *level.Loader
224+
levelLoaderCreated bool
225+
)
216226

217227
func Precache(s *splash.State) (splash.Status, error) {
228+
if levelLoader == nil && !levelLoaderCreated {
229+
levelLoader = level.NewLoader(LevelName())
230+
levelLoaderCreated = true
231+
}
232+
218233
status, err := s.Enter("loading level", locale.G.Get("loading level"), "failed to load level", levelLoader.LoadStepwise)
219234
if status != splash.Continue {
220235
return status, err
@@ -234,7 +249,7 @@ func Precache(s *splash.State) (splash.Status, error) {
234249

235250
func ReloadLevel() error {
236251
// Must do this when the language changed.
237-
lvl, err := level.NewLoader("level").Load()
252+
lvl, err := level.NewLoader(LevelName()).Load()
238253
if err != nil {
239254
return err
240255
}
@@ -247,7 +262,7 @@ func ReloadLevel() error {
247262
}
248263

249264
func PaletteChanged() error {
250-
loaded, err := level.NewLoader("level").Load()
265+
loaded, err := level.NewLoader(LevelName()).Load()
251266
if err != nil {
252267
return err
253268
}
@@ -304,6 +319,7 @@ func (w *World) Init(saveState int) error {
304319
// Load loads the current savegame.
305320
// If this fails, the world may be in an undefined state; call w.Init() or w.Load() to resume.
306321
func (w *World) Load() error {
322+
// TODO: #424 - handle multiple levels.
307323
saveName := fmt.Sprintf("save-%d.json", w.saveState)
308324
err := w.loadUnchecked(saveName)
309325
if errors.Is(err, os.ErrNotExist) {
@@ -374,6 +390,7 @@ func (w *World) Save() error {
374390
if is, cheats := flag.Cheating(); is {
375391
return fmt.Errorf("not saving, as cheats are enabled: %s", cheats)
376392
}
393+
// TODO: #424 - handle multiple levels.
377394
return vfs.WriteState(vfs.SavedGames, fmt.Sprintf("save-%d.json", w.saveState), state)
378395
}
379396

internal/locale/initlocale/initlocale.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ func initLinguas() error {
5959
}
6060
}
6161
// Try detecting language packs.
62+
// TODO: #424 - support alternate level packs.
6263
for _, domain := range []string{"game", "level"} {
6364
data, err = vfs.OSOpen(vfs.ExeDir, fmt.Sprintf("%s.po", domain))
6465
if err != nil {
@@ -104,34 +105,35 @@ func initLocaleDomain(lang locale.Lingua, l locale.Type, domain string) {
104105
log.Infof("%s translated to language %s", domain, lang.Name())
105106
}
106107

107-
func Init() error {
108+
func Init(levelName string) error {
108109
err := initLinguas()
109110
if err != nil {
110111
return err
111112
}
112113
locale.InitCurrent()
113-
_, err = forceSetLanguage(locale.Lingua(*language))
114+
_, err = forceSetLanguage(levelName, locale.Lingua(*language))
114115
return err
115116
}
116117

117-
func SetLanguage(lang locale.Lingua) (bool, error) {
118+
func SetLanguage(levelName string, lang locale.Lingua) (bool, error) {
118119
if lang == "auto" {
119120
lang = locale.Current
120121
}
121-
if locale.Active == lang {
122+
if locale.Active == lang && levelName == locale.LName {
122123
return false, nil
123124
}
124-
return forceSetLanguage(lang)
125+
return forceSetLanguage(levelName, lang)
125126
}
126127

127-
func forceSetLanguage(lang locale.Lingua) (bool, error) {
128+
func forceSetLanguage(levelName string, lang locale.Lingua) (bool, error) {
128129
if lang == "auto" {
129130
lang = locale.Current
130131
}
131132
locale.ResetLanguage()
132133
initLocaleDomain(lang, locale.G, "game")
133-
initLocaleDomain(lang, locale.L, "level")
134+
initLocaleDomain(lang, locale.L, levelName)
134135
locale.Active = lang
136+
locale.LName = levelName
135137

136138
err := font.SetFont(locale.ActiveFont())
137139
if err != nil {

internal/locale/po.go

+3
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ var GI IType
3636
// L is the translation of the levels.
3737
var L Type
3838

39+
// LName is the name of the level L is for.
40+
var LName string
41+
3942
// Active is the name of the current language.
4043
var Active Lingua
4144

internal/menu/language.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package menu
1717
import (
1818
"fmt"
1919

20+
"github.com/divVerent/aaaaxy/internal/engine"
2021
"github.com/divVerent/aaaaxy/internal/flag"
2122
"github.com/divVerent/aaaaxy/internal/game/misc"
2223
"github.com/divVerent/aaaaxy/internal/locale"
@@ -53,7 +54,7 @@ func (l *languageSetting) apply(m *Controller) error {
5354
flag.Set("language", string(lingua))
5455

5556
return m.NextFrame(func() error {
56-
changed, err := initlocale.SetLanguage(lingua)
57+
changed, err := initlocale.SetLanguage(engine.LevelName(), lingua)
5758
if err != nil {
5859
return err
5960
}

internal/menu/savestate.go

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ func (s *SaveStateScreen) saveStateInfo(initLvl *level.Level, idx int) string {
5353
if idx == *saveState {
5454
ps = &s.Controller.World.PlayerState
5555
} else {
56+
// TODO: #424 - handle multiple levels.
5657
saveName := fmt.Sprintf("save-%d.json", idx)
5758
state, err := vfs.ReadState(vfs.SavedGames, saveName)
5859
if err != nil {

scripts/build-generated-assets.sh

+16-12
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,22 @@ cp assets/_saved/* assets/generated/
2626

2727
if [ x"$AAAAXY_GENERATE_ASSETS" = x'true' ]; then
2828
if [ x"$AAAAXY_GENERATE_CHECKPOINT_LOCAITONS" = x'true' ]; then
29-
if [ x"$AAAAXY_FORCE_GENERATE_ASSETS" = x'true' ] || ! [ "assets/generated/level.cp.json" -nt "assets/maps/level.tmx" ]; then
30-
trap 'rm -f assets/generated/level.cp.json' EXIT
31-
# Using |cat> instead of > because snapcraft for some reason doesn't allow using a regular > shell redirection with "go run".
32-
${GO} run ${GO_FLAGS} github.com/divVerent/aaaaxy/cmd/dumpcps |cat> assets/generated/level.cp.dot
33-
grep -c . assets/generated/level.cp.dot
34-
neato -Tjson assets/generated/level.cp.dot > assets/generated/level.cp.json
35-
grep -c . assets/generated/level.cp.json
36-
trap - EXIT
37-
fi
38-
if [ x"$AAAAXY_DIFF_ASSETS" != x'false' ]; then
39-
diff -bu -I'.*"width".*' assets/_saved/level.cp.json assets/generated/level.cp.json
40-
fi
29+
for lfile in assets/maps/*.tmx; do
30+
lname=${lfile%.tmx}
31+
lname=${lname##*/}
32+
if [ x"$AAAAXY_FORCE_GENERATE_ASSETS" = x'true' ] || ! [ "assets/generated/$lname.cp.json" -nt "assets/maps/$lname.tmx" ]; then
33+
trap 'rm -f "assets/generated/$lname.cp.json"' EXIT
34+
# Using |cat> instead of > because snapcraft for some reason doesn't allow using a regular > shell redirection with "go run".
35+
${GO} run ${GO_FLAGS} github.com/divVerent/aaaaxy/cmd/dumpcps -level="$lname" |cat> "assets/generated/$lname.cp.dot"
36+
grep -c . "assets/generated/$lname.cp.dot"
37+
neato -Tjson assets/generated/level.cp.dot > assets/generated/level.cp.json
38+
grep -c . "assets/generated/$lname.cp.json"
39+
trap - EXIT
40+
fi
41+
if [ x"$AAAAXY_DIFF_ASSETS" != x'false' ]; then
42+
diff -bu -I'.*"width".*' assets/_saved/level.cp.json assets/generated/level.cp.json
43+
fi
44+
done
4145
fi
4246

4347
if [ x"${AAAAXY_FORCE_GENERATE_ASSETS}" = x'true' ] || [ x"${AAAAXY_DIFF_ASSETS}" != x'false' ]; then

scripts/xgettext.sh

+11-5
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,16 @@
1313
# See the License for the specific language governing permissions and
1414
# limitations under the License.
1515

16-
xgettext --its=scripts/tmx.its --from-code=utf-8 -F --no-location \
17-
-o - assets/maps/level.tmx |\
18-
sed -e 's/^#. #:/#:/g' \
19-
> assets/locales/level.pot
16+
lnames=
17+
for lfile in assets/maps/*.tmx; do
18+
lname=${lfile%.tmx}
19+
lname=${lname##*/}
20+
xgettext --its=scripts/tmx.its --from-code=utf-8 -F --no-location \
21+
-o - "assets/maps/$lname.tmx" |\
22+
sed -e 's/^#. #:/#:/g' \
23+
> "assets/locales/$lname.pot"
24+
lnames="$lnames $lfile"
25+
done
2026
go run github.com/leonelquinteros/gotext/cli/xgotext \
2127
-default game_raw \
2228
-in internal/ \
@@ -58,7 +64,7 @@ for d in assets/locales/*/; do
5864
# Go's x/text/language always uses dashes as separator.
5965
lingua=$(echo "$language" | tr _ -)
6066
all_linguas="$all_linguas$lingua$LF"
61-
for domain in level game; do
67+
for domain in $lnames game; do
6268
f=assets/locales/"$language"/"$domain".po
6369
if ! [ -f "$f" ]; then
6470
echo "$f: not found"

0 commit comments

Comments
 (0)