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:
@@ -7,8 +7,6 @@ library;
|
|||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
import 'package:wolf_3d_cli/cli_game_loop.dart';
|
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.dart';
|
||||||
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
|
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
|
||||||
import 'package:wolf_3d_dart/wolf_3d_engine.dart';
|
import 'package:wolf_3d_dart/wolf_3d_engine.dart';
|
||||||
@@ -64,12 +62,12 @@ void main() async {
|
|||||||
input: CliInput(),
|
input: CliInput(),
|
||||||
onGameWon: () => stopAndExit(0),
|
onGameWon: () => stopAndExit(0),
|
||||||
onQuit: () => stopAndExit(0),
|
onQuit: () => stopAndExit(0),
|
||||||
saveGamePersistence: CliSaveGamePersistence(),
|
saveGamePersistence: DefaultSaveGamePersistence(),
|
||||||
);
|
);
|
||||||
|
|
||||||
engine.init();
|
engine.init();
|
||||||
|
|
||||||
final persistence = CliRendererSettingsPersistence();
|
final persistence = DefaultRendererSettingsPersistence();
|
||||||
final WolfRendererSettings? saved = await persistence.load();
|
final WolfRendererSettings? saved = await persistence.load();
|
||||||
|
|
||||||
gameLoop = CliGameLoop(
|
gameLoop = CliGameLoop(
|
||||||
|
|||||||
@@ -12,9 +12,7 @@ import 'package:wolf_3d_dart/wolf_3d_engine.dart';
|
|||||||
class CliRendererSettingsPersistence extends RendererSettingsPersistence
|
class CliRendererSettingsPersistence extends RendererSettingsPersistence
|
||||||
with JsonRendererSettingsPersistence {
|
with JsonRendererSettingsPersistence {
|
||||||
CliRendererSettingsPersistence({String? filePath})
|
CliRendererSettingsPersistence({String? filePath})
|
||||||
: _filePath =
|
: _filePath = filePath ?? '${_platformConfigDir()}/settings.json';
|
||||||
filePath ??
|
|
||||||
'${Platform.environment['HOME'] ?? '.'}/.wolf3d_cli_settings.json';
|
|
||||||
|
|
||||||
final String _filePath;
|
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.
|
/// `SAVEGAM{slot}.{ext}` where `{ext}` follows the active game version.
|
||||||
class CliSaveGamePersistence implements SaveGamePersistence {
|
class CliSaveGamePersistence implements SaveGamePersistence {
|
||||||
CliSaveGamePersistence({String? directoryPath})
|
CliSaveGamePersistence({String? directoryPath})
|
||||||
: _directoryPath =
|
: _directoryPath = directoryPath ?? '${_platformConfigDir()}/saves';
|
||||||
directoryPath ??
|
|
||||||
'${Platform.environment['HOME'] ?? '.'}/.wolf3d_saves';
|
|
||||||
|
|
||||||
final String _directoryPath;
|
final String _directoryPath;
|
||||||
|
|
||||||
@@ -66,3 +64,21 @@ class CliSaveGamePersistence implements SaveGamePersistence {
|
|||||||
return '$_directoryPath/SAVEGAM$normalizedSlot.${version.fileExtension}';
|
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';
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ import 'package:wolf_3d_dart/wolf_3d_renderer.dart';
|
|||||||
import 'package:wolf_3d_flutter/renderer/wolf_3d_ascii_renderer.dart';
|
import 'package:wolf_3d_flutter/renderer/wolf_3d_ascii_renderer.dart';
|
||||||
import 'package:wolf_3d_flutter/renderer/wolf_3d_flutter_renderer.dart';
|
import 'package:wolf_3d_flutter/renderer/wolf_3d_flutter_renderer.dart';
|
||||||
import 'package:wolf_3d_flutter/renderer/wolf_3d_glsl_renderer.dart';
|
import 'package:wolf_3d_flutter/renderer/wolf_3d_glsl_renderer.dart';
|
||||||
import 'package:wolf_3d_flutter/renderer_settings_persistence_flutter.dart';
|
|
||||||
import 'package:wolf_3d_flutter/save_game_persistence_flutter.dart';
|
|
||||||
import 'package:wolf_3d_flutter/wolf_3d_flutter.dart';
|
import 'package:wolf_3d_flutter/wolf_3d_flutter.dart';
|
||||||
import 'package:wolf_3d_flutter/wolf_3d_input_flutter.dart';
|
import 'package:wolf_3d_flutter/wolf_3d_input_flutter.dart';
|
||||||
import 'package:wolf_3d_gui/screens/debug_tools_screen.dart';
|
import 'package:wolf_3d_gui/screens/debug_tools_screen.dart';
|
||||||
@@ -141,10 +139,10 @@ class GameScreen extends StatefulWidget {
|
|||||||
|
|
||||||
class _GameScreenState extends State<GameScreen> {
|
class _GameScreenState extends State<GameScreen> {
|
||||||
late final WolfEngine _engine;
|
late final WolfEngine _engine;
|
||||||
final FlutterRendererSettingsPersistence _persistence =
|
final DefaultRendererSettingsPersistence _persistence =
|
||||||
FlutterRendererSettingsPersistence();
|
DefaultRendererSettingsPersistence();
|
||||||
final FlutterSaveGamePersistence _savePersistence =
|
final DefaultSaveGamePersistence _savePersistence =
|
||||||
FlutterSaveGamePersistence();
|
DefaultSaveGamePersistence();
|
||||||
|
|
||||||
/// Mirrors [WolfRendererSettings.mode] into the Flutter renderer enum.
|
/// Mirrors [WolfRendererSettings.mode] into the Flutter renderer enum.
|
||||||
RendererMode _rendererMode = RendererMode.hardware;
|
RendererMode _rendererMode = RendererMode.hardware;
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
/// Routes to the native or stub implementation based on platform.
|
||||||
|
library;
|
||||||
|
|
||||||
|
export 'default_renderer_settings_persistence_stub.dart'
|
||||||
|
if (dart.library.io) 'default_renderer_settings_persistence_io.dart';
|
||||||
+49
@@ -0,0 +1,49 @@
|
|||||||
|
/// Native (dart:io) renderer-settings persistence.
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:wolf_3d_dart/src/engine/rendering/renderer_settings.dart';
|
||||||
|
import 'package:wolf_3d_dart/src/engine/rendering/renderer_settings_persistence.dart';
|
||||||
|
import 'package:wolf_3d_dart/src/platform/platform_config_dir.dart';
|
||||||
|
|
||||||
|
/// Persists [WolfRendererSettings] as JSON to the platform config directory.
|
||||||
|
///
|
||||||
|
/// Pass an explicit [filePath] to override the default location (useful in tests).
|
||||||
|
class DefaultRendererSettingsPersistence extends RendererSettingsPersistence
|
||||||
|
with JsonRendererSettingsPersistence {
|
||||||
|
DefaultRendererSettingsPersistence({String? filePath}) : _filePath = filePath;
|
||||||
|
|
||||||
|
final String? _filePath;
|
||||||
|
String? _resolvedPath;
|
||||||
|
|
||||||
|
Future<String> _getFilePath() async {
|
||||||
|
if (_resolvedPath != null) return _resolvedPath!;
|
||||||
|
_resolvedPath = _filePath ?? '${platformConfigDir()}/settings.json';
|
||||||
|
return _resolvedPath!;
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<String?> readRaw() async {
|
||||||
|
try {
|
||||||
|
final String path = await _getFilePath();
|
||||||
|
final File f = File(path);
|
||||||
|
if (!f.existsSync()) return null;
|
||||||
|
return await f.readAsString();
|
||||||
|
} catch (_) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> writeRaw(String json) async {
|
||||||
|
try {
|
||||||
|
final String path = await _getFilePath();
|
||||||
|
final Directory dir = File(path).parent;
|
||||||
|
if (!dir.existsSync()) await dir.create(recursive: true);
|
||||||
|
await File(path).writeAsString(json, flush: true);
|
||||||
|
} catch (_) {
|
||||||
|
// Best-effort.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+17
@@ -0,0 +1,17 @@
|
|||||||
|
/// Web stub for renderer-settings persistence: silently skips all I/O.
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'package:wolf_3d_dart/src/engine/rendering/renderer_settings.dart';
|
||||||
|
import 'package:wolf_3d_dart/src/engine/rendering/renderer_settings_persistence.dart';
|
||||||
|
|
||||||
|
/// No-op implementation used on web, where dart:io is unavailable.
|
||||||
|
class DefaultRendererSettingsPersistence extends RendererSettingsPersistence {
|
||||||
|
// ignore: avoid_unused_constructor_parameters
|
||||||
|
DefaultRendererSettingsPersistence({String? filePath});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<WolfRendererSettings?> load() async => null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> save(WolfRendererSettings settings) async {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
/// Routes to the native or stub implementation based on platform.
|
||||||
|
library;
|
||||||
|
|
||||||
|
export 'default_save_game_persistence_stub.dart'
|
||||||
|
if (dart.library.io) 'default_save_game_persistence_io.dart';
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/// Native (dart:io) slot-based save-game persistence.
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:wolf_3d_dart/src/engine/save/save_game_persistence.dart';
|
||||||
|
import 'package:wolf_3d_dart/src/platform/platform_config_dir.dart';
|
||||||
|
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
|
||||||
|
|
||||||
|
/// Persists save-game slots as raw bytes under the platform config directory.
|
||||||
|
///
|
||||||
|
/// Files are stored in `<configDir>/saves/` and named
|
||||||
|
/// `SAVEGAM{slot}.{ext}` where `{ext}` follows the active game version.
|
||||||
|
///
|
||||||
|
/// Pass an explicit [directoryPath] to override the default (useful in tests).
|
||||||
|
class DefaultSaveGamePersistence extends SaveGamePersistence {
|
||||||
|
DefaultSaveGamePersistence({String? directoryPath})
|
||||||
|
: _directoryPath = directoryPath ?? '${platformConfigDir()}/saves';
|
||||||
|
|
||||||
|
final String _directoryPath;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Uint8List?> load({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final File file = File(_slotPath(slot, version));
|
||||||
|
if (!file.existsSync()) return null;
|
||||||
|
return await file.readAsBytes();
|
||||||
|
} catch (_) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> exists({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
final File file = File(_slotPath(slot, version));
|
||||||
|
return file.existsSync() && file.lengthSync() > 0;
|
||||||
|
} catch (_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> save({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
required Uint8List bytes,
|
||||||
|
}) async {
|
||||||
|
final Directory dir = Directory(_directoryPath);
|
||||||
|
if (!dir.existsSync()) await dir.create(recursive: true);
|
||||||
|
await File(_slotPath(slot, version)).writeAsBytes(bytes, flush: true);
|
||||||
|
}
|
||||||
|
|
||||||
|
String _slotPath(int slot, GameVersion version) {
|
||||||
|
final String normalizedSlot = slot.clamp(0, 9).toString();
|
||||||
|
return '$_directoryPath/SAVEGAM$normalizedSlot.${version.fileExtension}';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/// Web stub for save-game persistence: silently skips all I/O.
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'dart:typed_data';
|
||||||
|
|
||||||
|
import 'package:wolf_3d_dart/src/engine/save/save_game_persistence.dart';
|
||||||
|
import 'package:wolf_3d_dart/wolf_3d_data_types.dart';
|
||||||
|
|
||||||
|
/// No-op implementation used on web, where dart:io is unavailable.
|
||||||
|
class DefaultSaveGamePersistence extends SaveGamePersistence {
|
||||||
|
// ignore: avoid_unused_constructor_parameters
|
||||||
|
DefaultSaveGamePersistence({String? directoryPath});
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<Uint8List?> load({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
}) async => null;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<bool> exists({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
}) async => false;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> save({
|
||||||
|
required int slot,
|
||||||
|
required GameVersion version,
|
||||||
|
required Uint8List bytes,
|
||||||
|
}) async {}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/// Returns the platform-appropriate Wolf3D config directory path.
|
||||||
|
///
|
||||||
|
/// This file is only ever imported by native (dart:io) code paths and must
|
||||||
|
/// never be loaded on web.
|
||||||
|
library;
|
||||||
|
|
||||||
|
import 'dart:io';
|
||||||
|
|
||||||
|
/// Returns the Wolf3D config directory for the current platform.
|
||||||
|
///
|
||||||
|
/// - Linux: `$XDG_CONFIG_HOME/wolf3d` (defaults to `~/.config/wolf3d`)
|
||||||
|
/// - macOS: `~/Library/Application Support/wolf3d`
|
||||||
|
/// - Windows: `%APPDATA%/wolf3d`
|
||||||
|
/// - Other: `~/.config/wolf3d`
|
||||||
|
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,8 +12,10 @@ export 'src/engine/managers/door_manager.dart';
|
|||||||
export 'src/engine/managers/pushwall_manager.dart';
|
export 'src/engine/managers/pushwall_manager.dart';
|
||||||
export 'src/engine/player/player.dart';
|
export 'src/engine/player/player.dart';
|
||||||
export 'src/engine/player_locomotion_constants.dart';
|
export 'src/engine/player_locomotion_constants.dart';
|
||||||
|
export 'src/engine/rendering/default_renderer_settings_persistence.dart';
|
||||||
export 'src/engine/rendering/renderer_settings.dart';
|
export 'src/engine/rendering/renderer_settings.dart';
|
||||||
export 'src/engine/rendering/renderer_settings_persistence.dart';
|
export 'src/engine/rendering/renderer_settings_persistence.dart';
|
||||||
|
export 'src/engine/save/default_save_game_persistence.dart';
|
||||||
export 'src/engine/save/game_session_snapshot.dart';
|
export 'src/engine/save/game_session_snapshot.dart';
|
||||||
export 'src/engine/save/save_game_codec.dart';
|
export 'src/engine/save/save_game_codec.dart';
|
||||||
export 'src/engine/save/save_game_persistence.dart';
|
export 'src/engine/save/save_game_persistence.dart';
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class FlutterRendererSettingsPersistence extends RendererSettingsPersistence
|
|||||||
final String? _filePath;
|
final String? _filePath;
|
||||||
String? _resolvedPath;
|
String? _resolvedPath;
|
||||||
|
|
||||||
Future<String> _getFilePath() async {
|
String get filePath {
|
||||||
if (_resolvedPath != null) {
|
if (_resolvedPath != null) {
|
||||||
return _resolvedPath!;
|
return _resolvedPath!;
|
||||||
}
|
}
|
||||||
@@ -29,10 +29,7 @@ class FlutterRendererSettingsPersistence extends RendererSettingsPersistence
|
|||||||
_resolvedPath = _filePath;
|
_resolvedPath = _filePath;
|
||||||
return _resolvedPath!;
|
return _resolvedPath!;
|
||||||
}
|
}
|
||||||
// Resolve platform app-support directory.
|
_resolvedPath = '$platformConfigDir/settings.json';
|
||||||
final String home =
|
|
||||||
Platform.environment['HOME'] ?? Platform.environment['APPDATA'] ?? '.';
|
|
||||||
_resolvedPath = '$home/.wolf3d_settings.json';
|
|
||||||
return _resolvedPath!;
|
return _resolvedPath!;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -40,8 +37,7 @@ class FlutterRendererSettingsPersistence extends RendererSettingsPersistence
|
|||||||
Future<String?> readRaw() async {
|
Future<String?> readRaw() async {
|
||||||
if (kIsWeb) return null;
|
if (kIsWeb) return null;
|
||||||
try {
|
try {
|
||||||
final String path = await _getFilePath();
|
final File f = File(filePath);
|
||||||
final File f = File(path);
|
|
||||||
if (!f.existsSync()) return null;
|
if (!f.existsSync()) return null;
|
||||||
return await f.readAsString();
|
return await f.readAsString();
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
@@ -53,10 +49,27 @@ class FlutterRendererSettingsPersistence extends RendererSettingsPersistence
|
|||||||
Future<void> writeRaw(String json) async {
|
Future<void> writeRaw(String json) async {
|
||||||
if (kIsWeb) return;
|
if (kIsWeb) return;
|
||||||
try {
|
try {
|
||||||
final String path = await _getFilePath();
|
await File(filePath).writeAsString(json, flush: true);
|
||||||
await File(path).writeAsString(json, flush: true);
|
|
||||||
} catch (_) {
|
} catch (_) {
|
||||||
// Best-effort.
|
// Best-effort.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get 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';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,9 +24,7 @@ class FlutterSaveGamePersistence implements SaveGamePersistence {
|
|||||||
return _resolvedDirectoryPath!;
|
return _resolvedDirectoryPath!;
|
||||||
}
|
}
|
||||||
|
|
||||||
final String home =
|
_resolvedDirectoryPath = '${_platformConfigDir()}/saves';
|
||||||
Platform.environment['HOME'] ?? Platform.environment['APPDATA'] ?? '.';
|
|
||||||
_resolvedDirectoryPath = '$home/.wolf3d_saves';
|
|
||||||
return _resolvedDirectoryPath!;
|
return _resolvedDirectoryPath!;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,3 +92,21 @@ class FlutterSaveGamePersistence implements SaveGamePersistence {
|
|||||||
return '$dirPath/SAVEGAM$normalizedSlot.${version.fileExtension}';
|
return '$dirPath/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';
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user