MBHaxe/src/Settings.hx
2021-07-09 16:16:28 +05:30

176 lines
4.2 KiB
Haxe

package src;
import src.AudioManager;
import hxd.Key;
import src.MarbleGame;
import hxd.Window;
import haxe.DynamicAccess;
#if hl
import sys.io.File;
#end
import src.ResourceLoader;
import haxe.Json;
typedef Score = {
var name:String;
var time:Float;
}
typedef OptionsSettings = {
var screenWidth:Int;
var screenHeight:Int;
var isFullScreen:Bool;
var videoDriver:Int;
var colorDepth:Int;
var shadows:Bool;
var musicVolume:Float;
var soundVolume:Float;
var vsync:Bool;
}
typedef ControlsSettings = {
var forward:Int;
var backward:Int;
var left:Int;
var right:Int;
var camForward:Int;
var camBackward:Int;
var camLeft:Int;
var camRight:Int;
var jump:Int;
var powerup:Int;
var freelook:Int;
var alwaysFreeLook:Bool;
var cameraSensitivity:Float;
var invertYAxis:Bool;
}
class Settings {
public static var highScores:Map<String, Array<Score>> = [];
public static var optionsSettings:OptionsSettings = {
screenWidth: 1280,
screenHeight: 720,
isFullScreen: false,
videoDriver: 0,
colorDepth: 1,
shadows: false,
musicVolume: 1,
soundVolume: 0.7,
vsync: true
};
public static var controlsSettings:ControlsSettings = {
forward: Key.W,
backward: Key.S,
left: Key.A,
right: Key.D,
camForward: Key.UP,
camBackward: Key.DOWN,
camLeft: Key.LEFT,
camRight: Key.RIGHT,
jump: Key.SPACE,
powerup: Key.MOUSE_LEFT,
freelook: Key.MOUSE_RIGHT,
alwaysFreeLook: true,
cameraSensitivity: 0.6,
invertYAxis: false
};
public static var progression = [24, 24, 52];
public static var highscoreName = "";
public static function applySettings() {
Window.getInstance().resize(optionsSettings.screenWidth, optionsSettings.screenHeight);
Window.getInstance().displayMode = optionsSettings.isFullScreen ? FullscreenResize : Windowed;
AudioManager.updateVolumes();
MarbleGame.canvas.render(MarbleGame.canvas.scene2d);
save();
}
public static function saveScore(mapPath:String, score:Score) {
if (highScores.exists(mapPath)) {
var scoreList = highScores.get(mapPath);
scoreList.push(score);
scoreList.sort((a, b) -> a.time == b.time ? 0 : (a.time > b.time ? 1 : -1));
} else {
highScores.set(mapPath, [score]);
}
save();
}
public static function getScores(mapPath:String) {
if (highScores.exists(mapPath)) {
return highScores.get(mapPath).copy();
} else {
return [];
}
}
public static function save() {
var outputData = {
highScores: highScores,
options: optionsSettings,
controls: controlsSettings,
progression: progression,
highscoreName: highscoreName
};
var json = Json.stringify(outputData);
#if hl
File.saveContent("settings.json", json);
#end
#if js
var localStorage = js.Browser.getLocalStorage();
if (localStorage != null) {
localStorage.setItem("MBHaxeSettings", json);
}
#end
}
public static function load() {
var settingsExists = false;
#if hl
settingsExists = ResourceLoader.fileSystem.exists("settings.json");
#end
#if js
var localStorage = js.Browser.getLocalStorage();
if (localStorage != null) {
settingsExists = localStorage.getItem("MBHaxeSettings") != null;
}
#end
if (settingsExists) {
#if hl
var json = Json.parse(ResourceLoader.fileSystem.get("settings.json").getText());
#end
#if js
var json = Json.parse(localStorage.getItem("MBHaxeSettings"));
#end
var highScoreData:DynamicAccess<Array<Score>> = json.highScores;
for (key => value in highScoreData) {
highScores.set(key, value);
}
optionsSettings = json.options;
controlsSettings = json.controls;
progression = json.progression;
highscoreName = json.highscoreName;
}
Window.getInstance().vsync = optionsSettings.vsync;
}
public static function init() {
load();
#if hl
Window.getInstance().resize(optionsSettings.screenWidth, optionsSettings.screenHeight);
Window.getInstance().displayMode = optionsSettings.isFullScreen ? FullscreenResize : Windowed;
#end
// @:privateAccess Window.getInstance().window.center();
Window.getInstance().addResizeEvent(() -> {
var wnd = Window.getInstance();
Settings.optionsSettings.screenWidth = wnd.width;
Settings.optionsSettings.screenHeight = wnd.height;
MarbleGame.canvas.render(MarbleGame.canvas.scene2d);
});
}
}