mirror of
https://github.com/AdAstra-LD/DS-Pokemon-Rom-Editor.git
synced 2026-10-03 07:17:34 -05:00
large refactoring of script parsing logic. now uses ScriptParameter class and loads parameters right from database
This commit is contained in:
@@ -1,30 +1,57 @@
|
||||
using System;
|
||||
using DSPRE;
|
||||
using DSPRE.Resources;
|
||||
using DSPRE.ROMFiles;
|
||||
using System;
|
||||
using System.Globalization;
|
||||
|
||||
public class ScriptParameter {
|
||||
public enum ParameterType {
|
||||
Integer,
|
||||
RelativeJump,
|
||||
Flex,
|
||||
Variable,
|
||||
Flex,
|
||||
Overworld,
|
||||
OwMovementType,
|
||||
OwMovementDirection,
|
||||
ComparisonOperator,
|
||||
Function,
|
||||
Action,
|
||||
CMDNumber,
|
||||
Pokemon,
|
||||
Item,
|
||||
Move
|
||||
Move,
|
||||
Sound
|
||||
}
|
||||
|
||||
public static ParameterType ParseTypeString(string typeStr)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (ParameterType)Enum.Parse(typeof(ParameterType), typeStr, true); // true = ignore case
|
||||
}
|
||||
catch (ArgumentException)
|
||||
{
|
||||
Console.WriteLine($"Warning: Unknown parameter type '{typeStr}', defaulting to Integer");
|
||||
return ParameterType.Integer;
|
||||
}
|
||||
}
|
||||
|
||||
public ParameterType Type { get; set; } = ParameterType.Integer;
|
||||
public byte[] RawData { get; set; }
|
||||
public string DisplayValue { get; set; }
|
||||
public string TargetLabel { get; set; } // For RelativeJump type
|
||||
public int TargetOffset { get; set; } // For RelativeJump type
|
||||
|
||||
// Constructor for regular parameters
|
||||
public ScriptParameter(byte[] data) {
|
||||
Type = ParameterType.Integer;
|
||||
public ScriptParameter(byte[] data, ParameterType type)
|
||||
{
|
||||
RawData = data;
|
||||
Type = type;
|
||||
DisplayValue = FormatParameter(data, type);
|
||||
}
|
||||
|
||||
// Constructor for relative jumps
|
||||
public ScriptParameter(int targetOffset, string targetLabel) {
|
||||
Type = ParameterType.RelativeJump;
|
||||
Type = ParameterType.Function;
|
||||
TargetOffset = targetOffset;
|
||||
TargetLabel = targetLabel;
|
||||
// Store raw bytes only for display purposes
|
||||
@@ -33,7 +60,7 @@ public class ScriptParameter {
|
||||
|
||||
// Get display representation
|
||||
public string GetFormattedValue() {
|
||||
if (Type == ParameterType.RelativeJump && !string.IsNullOrEmpty(TargetLabel)) {
|
||||
if (Type == ParameterType.Function && !string.IsNullOrEmpty(TargetLabel)) {
|
||||
return TargetLabel;
|
||||
}
|
||||
|
||||
@@ -45,4 +72,80 @@ public class ScriptParameter {
|
||||
|
||||
return BitConverter.ToString(RawData);
|
||||
}
|
||||
private string FormatParameter(byte[] data, ParameterType type)
|
||||
{
|
||||
uint value;
|
||||
switch (data.Length)
|
||||
{
|
||||
case 1:
|
||||
value = data[0];
|
||||
break;
|
||||
case 2:
|
||||
value = BitConverter.ToUInt16(data, 0);
|
||||
break;
|
||||
case 4:
|
||||
value = BitConverter.ToUInt32(data, 0);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentException($"Unexpected parameter data length: {data.Length}");
|
||||
}
|
||||
|
||||
switch (type)
|
||||
{
|
||||
case ParameterType.Pokemon:
|
||||
if (ScriptDatabase.pokemonNames.TryGetValue((ushort)value, out string pokeName))
|
||||
return $"[{pokeName}]";
|
||||
break;
|
||||
case ParameterType.Item:
|
||||
if (ScriptDatabase.itemNames.TryGetValue((ushort)value, out string itemName))
|
||||
return $"[{itemName}]";
|
||||
break;
|
||||
case ParameterType.Move:
|
||||
if (ScriptDatabase.moveNames.TryGetValue((ushort)value, out string moveName))
|
||||
return $"[{moveName}]";
|
||||
break;
|
||||
case ParameterType.Function:
|
||||
return $"Function#{value}";
|
||||
//case ParameterType.Variable:
|
||||
// return $"VAR_{FormatHexNumber(value)}";
|
||||
case ParameterType.Action:
|
||||
return $"Action#{value}";
|
||||
case ParameterType.CMDNumber:
|
||||
return $"CMD_{value:X3}";
|
||||
case ParameterType.Overworld:
|
||||
if (ScriptDatabase.specialOverworlds.TryGetValue((ushort)value, out string owName))
|
||||
return owName;
|
||||
return value < 4000 ? $"{Event.EventType.Overworld}.{value}" : FormatHexNumber(value);
|
||||
case ParameterType.OwMovementType:
|
||||
return value < 4000 ? $"Move.{value}" : FormatHexNumber(value);
|
||||
case ParameterType.OwMovementDirection:
|
||||
if (ScriptDatabase.overworldDirections.TryGetValue((byte)value, out string dirName))
|
||||
return dirName;
|
||||
break;
|
||||
case ParameterType.ComparisonOperator:
|
||||
if (RomInfo.ScriptComparisonOperatorsDict.TryGetValue((byte)value, out string compName))
|
||||
return compName;
|
||||
break;
|
||||
case ParameterType.Sound:
|
||||
if (ScriptDatabase.soundNames.TryGetValue((ushort)value, out string PtsoundName))
|
||||
return PtsoundName;
|
||||
break;
|
||||
}
|
||||
|
||||
// Default number formatting based on settings
|
||||
return FormatHexNumber(value);
|
||||
}
|
||||
|
||||
private string FormatHexNumber(uint value)
|
||||
{
|
||||
if (SettingsManager.Settings.scriptEditorFormatPreference == (int)NumberStyles.HexNumber)
|
||||
{
|
||||
return $"0x{value:X}";
|
||||
}
|
||||
else if (SettingsManager.Settings.scriptEditorFormatPreference == (int)NumberStyles.None)
|
||||
{
|
||||
return value >= 4000 ? $"0x{value:X}" : value.ToString();
|
||||
}
|
||||
return value.ToString();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user