DS-Pokemon-Rom-Editor/DS_Map/Resources/ScriptDatabase.cs

216 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using DSPRE;
using DSPRE.Resources;
using DSPRE.ROMFiles;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Xml.Linq;
using static DSPRE.RomInfo;
public static class ScriptDatabaseJsonLoader
{
/// <summary>
/// Call this once at startup (before any scriptlookups).
/// </summary>
public static void InitializeFromJson(string jsonPath, GameVersions gameVersion)
{
string expandedPath = Environment.ExpandEnvironmentVariables(jsonPath);
string text = File.ReadAllText(expandedPath);
JsonDocument doc = JsonDocument.Parse(text);
try
{
JsonElement root = doc.RootElement;
ScriptDatabase.movementsDictIDName = root
.GetProperty("movements")
.EnumerateObject()
.ToDictionary(
prop => Convert.ToUInt16(prop.Name.Substring(2), 16),
prop => prop.Value.GetString()
);
ScriptDatabase.comparisonOperatorsDict = root
.GetProperty("comparisonOperators")
.EnumerateObject()
.ToDictionary(
prop => Convert.ToUInt16(prop.Name.Substring(2), 16),
prop => prop.Value.GetString()
);
ScriptDatabase.specialOverworlds = root
.GetProperty("specialOverworlds")
.EnumerateObject()
.ToDictionary(
prop => Convert.ToUInt16(prop.Name.Substring(2), 16),
prop => prop.Value.GetString()
);
ScriptDatabase.overworldDirections = root
.GetProperty("overworldDirections")
.EnumerateObject()
.ToDictionary(
prop => (byte)Convert.ToUInt16(prop.Name.Substring(2), 16),
prop => prop.Value.GetString()
);
Dictionary<ushort, string> namesDict;
Dictionary<ushort, byte[]> paramsDict;
switch (gameVersion)
{
case GameVersions.Platinum:
namesDict = ScriptDatabase.PlatScrCmdNames;
paramsDict = ScriptDatabase.PlatScrCmdParameters;
break;
case GameVersions.Diamond:
case GameVersions.Pearl:
namesDict = ScriptDatabase.DPScrCmdNames;
paramsDict = ScriptDatabase.DPScrCmdParameters;
break;
case GameVersions.HeartGold:
case GameVersions.SoulSilver:
namesDict = ScriptDatabase.HGSSScrCmdNames;
paramsDict = ScriptDatabase.HGSSScrCmdParameters;
break;
default:
throw new ArgumentOutOfRangeException(nameof(gameVersion), gameVersion, "Unsupported game");
}
JsonElement scrRoot;
if (!root.TryGetProperty("scrcmd", out scrRoot))
throw new InvalidOperationException("JSON is missing the \"scrcmd\" key");
Console.WriteLine("About to load scrcmd entries:");
foreach (JsonProperty prop in scrRoot.EnumerateObject())
{
ushort code = Convert.ToUInt16(prop.Name.Substring(2), 16);
JsonElement entry = prop.Value;
string name = entry.GetProperty("name").GetString();
namesDict[code] = name;
var arr = entry.GetProperty("parameters");
byte[] bytes = arr
.EnumerateArray()
.Select(x => (byte)x.GetInt32())
.ToArray();
paramsDict[code] = bytes;
}
}
finally
{
doc.Dispose();
}
}
}
namespace DSPRE.Resources {
public static class ScriptDatabase {
public static Dictionary<ushort, string> comparisonOperatorsDict = new Dictionary<ushort, string>() {
// Will be populated at runtime from json
};
public static Dictionary<ushort, string> comparisonOperatorsGenVappendix = new Dictionary<ushort, string>() {
/* GEN V ONLY */
[6] = "OR",
[7] = "AND",
[0xFF] = "TRUEUP"
};
public static Dictionary<ushort, string> specialOverworlds = new Dictionary<ushort, string>() {
// will be populated at runtime from json
};
public static Dictionary<byte, string> overworldDirections = new Dictionary<byte, string>() {
// Will be populated at runtime from json
};
public static Dictionary<ushort, string> pokemonNames = new Dictionary<ushort, string>()
{
// Will be populated at runtime from text archive
};
public static void InitializePokemonNames()
{
string[] names = RomInfo.GetPokemonNames();
pokemonNames = names.Select((name, index) => new { name, index })
.ToDictionary(x => (ushort)x.index, x => x.name);
}
public static Dictionary<ushort, string> itemNames = new Dictionary<ushort, string>()
{
// Will be populated at runtime from text archive
};
public static void InitializeItemNames()
{
string[] names = RomInfo.GetItemNames();
itemNames = names.Select((name, index) => new { name, index })
.ToDictionary(x => (ushort)x.index, x => x.name);
}
public static Dictionary<ushort, string> moveNames = new Dictionary<ushort, string>()
{
// Will be populated at runtime from text archive
};
public static void InitializeMoveNames()
{
string[] names = RomInfo.GetAttackNames();
moveNames = names.Select((name, index) => new { name, index })
.ToDictionary(x => (ushort)x.index, x => x.name);
}
public static Dictionary<ushort, int> commandsWithRelativeJump = new Dictionary<ushort, int>() {
//commandID, ID of parameter With Jump Address
[0x0016] = 0, //Jump
[0x0017] = 1, //Call
[0x0018] = 1, //Call
[0x0019] = 1, //Call
[0x001A] = 0, //Call
[0x001C] = 1, //JumpIf
[0x001D] = 1, //CallIf
[0x005E] = 1, //Movement
};
public static HashSet<ushort?> endCodes = new HashSet<ushort?>() {
0x2,
0x16,
0x1B
};
public static Dictionary<ushort, string> movementsDictIDName = new Dictionary<ushort, string>() {
// Will be populated at runtime from json
};
public static HashSet<ushort?> movementEndCodes = new HashSet<ushort?>() {
0x00FE,
};
public static Dictionary<ushort, string> DPScrCmdNames = new Dictionary<ushort, string>() {
// will be populated at runtime from json
};
public static Dictionary<ushort, byte[]> DPScrCmdParameters = new Dictionary<ushort, byte[]>() {
// will be populated at runtime from json
};
public static Dictionary<ushort, string> PlatScrCmdNames = new Dictionary<ushort, string>() {
// will be populated at runtime from json
};
public static Dictionary<ushort, byte[]> PlatScrCmdParameters = new Dictionary<ushort, byte[]>() {
// will be populated at runtime from json
};
public static Dictionary<ushort, string> HGSSScrCmdNames = new Dictionary<ushort, string>() {
// will be populated from json at runtime
};
public static Dictionary<ushort, byte[]> HGSSScrCmdParameters = new Dictionary<ushort, byte[]>() {
// will be populated from json at runtime
};
}
}