feat: Implement platform-specific persistence for renderer settings and save games

Signed-off-by: Hans Kokx <hans.d.kokx@gmail.com>
This commit is contained in:
2026-03-23 16:28:35 +01:00
parent dcfb2e8e02
commit 26c738b702
14 changed files with 291 additions and 28 deletions
+2 -4
View File
@@ -7,8 +7,6 @@ library;
import 'dart:io';
import 'package:wolf_3d_cli/cli_game_loop.dart';
import 'package:wolf_3d_cli/cli_renderer_settings_persistence.dart';
import 'package:wolf_3d_cli/cli_save_game_persistence.dart';
import 'package:wolf_3d_dart/wolf_3d_data.dart';
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
import 'package:wolf_3d_dart/wolf_3d_engine.dart';
@@ -64,12 +62,12 @@ void main() async {
input: CliInput(),
onGameWon: () => stopAndExit(0),
onQuit: () => stopAndExit(0),
saveGamePersistence: CliSaveGamePersistence(),
saveGamePersistence: DefaultSaveGamePersistence(),
);
engine.init();
final persistence = CliRendererSettingsPersistence();
final persistence = DefaultRendererSettingsPersistence();
final WolfRendererSettings? saved = await persistence.load();
gameLoop = CliGameLoop(
@@ -12,9 +12,7 @@ import 'package:wolf_3d_dart/wolf_3d_engine.dart';
class CliRendererSettingsPersistence extends RendererSettingsPersistence
with JsonRendererSettingsPersistence {
CliRendererSettingsPersistence({String? filePath})
: _filePath =
filePath ??
'${Platform.environment['HOME'] ?? '.'}/.wolf3d_cli_settings.json';
: _filePath = filePath ?? '${_platformConfigDir()}/settings.json';
final String _filePath;
@@ -40,3 +38,21 @@ class CliRendererSettingsPersistence extends RendererSettingsPersistence
}
}
}
String _platformConfigDir() {
if (Platform.isLinux) {
final String xdg = Platform.environment['XDG_CONFIG_HOME'] ?? '';
final String home = Platform.environment['HOME'] ?? '.';
return xdg.isNotEmpty ? '$xdg/wolf3d' : '$home/.config/wolf3d';
}
if (Platform.isMacOS) {
final String home = Platform.environment['HOME'] ?? '.';
return '$home/Library/Application Support/wolf3d';
}
if (Platform.isWindows) {
final String appData = Platform.environment['APPDATA'] ?? '.';
return '$appData/wolf3d';
}
final String home = Platform.environment['HOME'] ?? '.';
return '$home/.config/wolf3d';
}
@@ -12,9 +12,7 @@ import 'package:wolf_3d_dart/wolf_3d_engine.dart';
/// `SAVEGAM{slot}.{ext}` where `{ext}` follows the active game version.
class CliSaveGamePersistence implements SaveGamePersistence {
CliSaveGamePersistence({String? directoryPath})
: _directoryPath =
directoryPath ??
'${Platform.environment['HOME'] ?? '.'}/.wolf3d_saves';
: _directoryPath = directoryPath ?? '${_platformConfigDir()}/saves';
final String _directoryPath;
@@ -66,3 +64,21 @@ class CliSaveGamePersistence implements SaveGamePersistence {
return '$_directoryPath/SAVEGAM$normalizedSlot.${version.fileExtension}';
}
}
String _platformConfigDir() {
if (Platform.isLinux) {
final String xdg = Platform.environment['XDG_CONFIG_HOME'] ?? '';
final String home = Platform.environment['HOME'] ?? '.';
return xdg.isNotEmpty ? '$xdg/wolf3d' : '$home/.config/wolf3d';
}
if (Platform.isMacOS) {
final String home = Platform.environment['HOME'] ?? '.';
return '$home/Library/Application Support/wolf3d';
}
if (Platform.isWindows) {
final String appData = Platform.environment['APPDATA'] ?? '.';
return '$appData/wolf3d';
}
final String home = Platform.environment['HOME'] ?? '.';
return '$home/.config/wolf3d';
}