Skip to content

Commit

Permalink
Add serializable script templates (#365)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonko0493 authored Jul 30, 2024
1 parent 7916ff0 commit 80314bc
Show file tree
Hide file tree
Showing 22 changed files with 1,250 additions and 259 deletions.
2 changes: 1 addition & 1 deletion src/SerialLoops.Lib/Build.cs
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ private static void ReplaceSingleFile(ArchiveFile<DataFile> archive, string file
try
{
DataFile file = archive.GetFileByIndex(index);
file.Data = File.ReadAllBytes(filePath).ToList();
file.Data = [.. File.ReadAllBytes(filePath)];
file.Edited = true;
archive.Files[archive.Files.IndexOf(file)] = file;
}
Expand Down
48 changes: 40 additions & 8 deletions src/SerialLoops.Lib/Config.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using HaruhiChokuretsuLib.Util;
using SerialLoops.Lib.Hacks;
using SerialLoops.Lib.Script;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Globalization;
using System.IO;
using System.Linq;
Expand All @@ -25,7 +27,11 @@ public class Config
[JsonIgnore]
public string HacksDirectory => Path.Combine(UserDirectory, "Hacks");
[JsonIgnore]
public string ScriptTemplatesDirectory => Path.Combine(UserDirectory, "ScriptTemplates");
[JsonIgnore]
public List<AsmHack> Hacks { get; set; }
[JsonIgnore]
public ObservableCollection<ScriptTemplate> ScriptTemplates { get; set; }
public string CurrentCultureName { get; set; }
public string DevkitArmPath { get; set; }
public bool UseDocker { get; set; }
Expand All @@ -42,43 +48,45 @@ public void Save(ILogger log)
IO.WriteStringFile(ConfigPath, JsonSerializer.Serialize(this), log);
}

public static Config LoadConfig(ILogger log)
public static Config LoadConfig(Func<string, string> localize, ILogger log)
{
string configJson = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config.json");

if (!File.Exists(configJson))
{
Config defaultConfig = GetDefault(log);
defaultConfig.ValidateConfig(log);
defaultConfig.ValidateConfig(localize, log);
defaultConfig.ConfigPath = configJson;
defaultConfig.InitializeHacks(log);
defaultConfig.InitializeScriptTemplates(localize, log);
IO.WriteStringFile(configJson, JsonSerializer.Serialize(defaultConfig), log);
return defaultConfig;
}

try
{
Config config = JsonSerializer.Deserialize<Config>(File.ReadAllText(configJson));
config.ValidateConfig(log);
config.ValidateConfig(localize, log);
config.ConfigPath = configJson;
config.InitializeHacks(log);
config.InitializeScriptTemplates(localize, log);
return config;
}
catch (JsonException exc)
{
log.LogError($"Exception occurred while parsing config.json!\n{exc.Message}\n\n{exc.StackTrace}");
log.LogException(localize("Exception occurred while parsing config.json!"), exc);
Config defaultConfig = GetDefault(log);
defaultConfig.ValidateConfig(log);
defaultConfig.ValidateConfig(localize, log);
IO.WriteStringFile(configJson, JsonSerializer.Serialize(defaultConfig), log);
return defaultConfig;
}
}

public void ValidateConfig(ILogger log)
public void ValidateConfig(Func<string, string> localize, ILogger log)
{
if (string.IsNullOrWhiteSpace(DevkitArmPath))
{
log.LogError("devkitARM is not detected at the default or specified install location. Please set devkitARM path.");
log.LogError(localize("devkitARM is not detected at the default or specified install location. Please set devkitARM path."));
}
if (CurrentCultureName is null)
{
Expand Down Expand Up @@ -123,6 +131,30 @@ private void InitializeHacks(ILogger log)
}
}

private void InitializeScriptTemplates(Func<string, string> localize, ILogger log)
{
if (!Directory.Exists(ScriptTemplatesDirectory))
{
Directory.CreateDirectory(ScriptTemplatesDirectory);
}

IO.CopyFiles(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Sources", "ScriptTemplates"), ScriptTemplatesDirectory, log); // Update script templates each time we launch in case of program update
string[] scriptTemplateFiles = Directory.GetFiles(ScriptTemplatesDirectory, "*.slscr");
List<ScriptTemplate> templates = [];
foreach (string scriptTemplateFile in scriptTemplateFiles)
{
try
{
templates.Add(JsonSerializer.Deserialize<ScriptTemplate>(File.ReadAllText(scriptTemplateFile)));
}
catch (Exception ex)
{
log.LogException(string.Format(localize("Failed to deserialize script template file '{0}'"), scriptTemplateFile), ex);
}
}
ScriptTemplates = new(templates);
}

private static Config GetDefault(ILogger log)
{
string devkitArmDir = Environment.GetEnvironmentVariable("DEVKITARM") ?? string.Empty;
Expand Down Expand Up @@ -157,7 +189,7 @@ private static Config GetDefault(ILogger log)
{
emulatorPath = Path.Combine("/snap", "melonds", "current", "usr", "local", "bin", "melonDS");
}
if (!Directory.Exists(emulatorPath) && !File.Exists(emulatorPath))
if (!Directory.Exists(emulatorPath) && !File.Exists(emulatorPath)) // on Mac, .app is a dir, so we check both of these
{
emulatorPath = "";
log.LogWarning("Valid emulator path not found in config.json.");
Expand Down
8 changes: 4 additions & 4 deletions src/SerialLoops.Lib/Project.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public partial class Project
[JsonIgnore]
public ProjectSettings Settings { get; set; }
[JsonIgnore]
public List<ItemDescription> Items { get; set; } = new();
public List<ItemDescription> Items { get; set; } = [];

// Archives
[JsonIgnore]
Expand All @@ -65,7 +65,7 @@ public partial class Project

// Common graphics
[JsonIgnore]
public FontReplacementDictionary FontReplacement { get; set; } = new();
public FontReplacementDictionary FontReplacement { get; set; } = [];
[JsonIgnore]
public FontFile FontMap { get; set; } = new();
[JsonIgnore]
Expand Down Expand Up @@ -107,7 +107,7 @@ public partial class Project
[JsonIgnore]
public Func<string, string> Localize { get; set; }

private static readonly string[] NON_SCRIPT_EVT_FILES = new string[] { "CHESSS", "EVTTBLS", "TOPICS", "SCENARIOS", "TUTORIALS", "VOICEMAPS" };
private static readonly string[] NON_SCRIPT_EVT_FILES = ["CHESSS", "EVTTBLS", "TOPICS", "SCENARIOS", "TUTORIALS", "VOICEMAPS"];

public Project()
{
Expand Down Expand Up @@ -1150,7 +1150,7 @@ public List<ItemDescription> GetSearchResults(SearchQuery query, ILogger log, IP
catch (Exception ex)
{
log.LogException("Failed to get search results!", ex);
return Array.Empty<ItemDescription>().ToList();
return [];
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/SerialLoops.Lib/Script/Parameters/BgScriptParameter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public class BgScriptParameter : ScriptParameter
{
public BackgroundItem Background { get; set; }
public bool Kinetic { get; set; }
public override short[] GetValues(object obj = null) => new short[] { (short)Background.Id };
public override short[] GetValues(object obj = null) => [(short)(Background?.Id ?? 0)];

public BgScriptParameter(string name, BackgroundItem background, bool kinetic) : base(name, ParameterType.BG)
{
Expand Down
2 changes: 1 addition & 1 deletion src/SerialLoops.Lib/Script/ScriptItemCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public ScriptItemCommand(ScriptSection section, EventFile script, int index, Pro
public ScriptItemCommand(CommandVerb verb, params ScriptParameter[] parameters)
{
Verb = verb;
Parameters = parameters.ToList();
Parameters = [.. parameters];
}

public List<ScriptItemCommand> WalkCommandGraph(Dictionary<ScriptSection, List<ScriptItemCommand>> commandTree, AdjacencyGraph<ScriptSection, ScriptSectionEdge> graph)
Expand Down
Loading

0 comments on commit 80314bc

Please sign in to comment.