From 801db3e130c97090a4e421861ef6b429707779f2 Mon Sep 17 00:00:00 2001 From: Kurt Date: Sat, 9 May 2020 16:15:37 -0700 Subject: [PATCH] Add exterior acre pixel dumper, show exterior acres on Field Item editor 980KB -> 12KB when compressed, seems legit just an array of tile definitions (32x32 style), sequential acres (undefined acres are all zeroed) tiles aren't displated as granular as possible, only sets as 16x16 tiles instead of larger 32x32, but it should be a good enough color hint to people for editing big thanks to ninji for the color mapping in his disassembly and the pbc->tile parse --- NHSE.Core/Drawing/AcreTileColor.cs | 22 +++++++++++ NHSE.Core/Drawing/TerrainTileColor.cs | 16 +++----- NHSE.Core/NHSE.Core.csproj | 2 + NHSE.Core/Resources/byte/outside.bin | Bin 0 -> 1003520 bytes NHSE.Core/Structures/Acres/OutsideAcre.cs | 36 +++++++++++++++++- .../Acres/Terrain/TerrainManager.cs | 13 +++++-- NHSE.Core/Structures/Misc/GSaveDateMD.cs | 2 +- NHSE.Parsing/GamePBCDumper.cs | 36 ++++++++++++++++++ NHSE.Parsing/PBC/PBC.cs | 31 +-------------- NHSE.Sprites/Field/TerrainSprite.cs | 4 +- 10 files changed, 113 insertions(+), 49 deletions(-) create mode 100644 NHSE.Core/Drawing/AcreTileColor.cs create mode 100644 NHSE.Core/Resources/byte/outside.bin create mode 100644 NHSE.Parsing/GamePBCDumper.cs diff --git a/NHSE.Core/Drawing/AcreTileColor.cs b/NHSE.Core/Drawing/AcreTileColor.cs new file mode 100644 index 0000000..534cf52 --- /dev/null +++ b/NHSE.Core/Drawing/AcreTileColor.cs @@ -0,0 +1,22 @@ +using System.Drawing; + +namespace NHSE.Core +{ + public static class AcreTileColor + { + public static readonly byte[] AcreTiles = ResourceUtil.GetBinaryResource("outside.bin"); + + public static int GetAcreTileColor(byte acre, int x, int y) + { + if (acre > (byte)OutsideAcre.FldOutSBridge01) + return Color.Transparent.ToArgb(); + var baseOfs = acre * 32 * 32 * 4; + + // 64x64 + var shift = (4 * ((y * 64) + x)); + var ofs = baseOfs + shift; + var tile = AcreTiles[ofs]; + return CollisionUtil.Dict[tile].ToArgb(); + } + } +} diff --git a/NHSE.Core/Drawing/TerrainTileColor.cs b/NHSE.Core/Drawing/TerrainTileColor.cs index ee0eb0f..5e92dfe 100644 --- a/NHSE.Core/Drawing/TerrainTileColor.cs +++ b/NHSE.Core/Drawing/TerrainTileColor.cs @@ -5,6 +5,8 @@ namespace NHSE.Core { public static class TerrainTileColor { + private static readonly Color River = Color.FromArgb(128, 215, 195); + public static Color GetTileColor(TerrainTile tile) { if (tile.UnitModelRoad.IsRoad()) @@ -13,7 +15,7 @@ public static Color GetTileColor(TerrainTile tile) if (tile.Elevation == 0) return baseColor; - return ColorUtil.Blend(baseColor, Color.White, 1d / (tile.Elevation + 1)); + return ColorUtil.Blend(baseColor, Color.White, 1.4d / (tile.Elevation + 1)); } private static readonly Color CliffBase = ColorUtil.Blend(Color.ForestGreen, Color.Black, 0.6d); @@ -21,9 +23,9 @@ public static Color GetTileColor(TerrainTile tile) private static Color GetTileDefaultColor(TerrainUnitModel mdl) { if (mdl.IsRiver()) - return Color.DeepSkyBlue; + return River; if (mdl.IsFall()) - return Color.DarkBlue; + return Color.DeepSkyBlue; if (mdl.IsCliff()) return CliffBase; return Color.ForestGreen; @@ -40,12 +42,4 @@ public static string GetTileName(TerrainTile tile) return name.Substring(0, num) + Environment.NewLine + name.Substring(num); } } - - public static class AcreTileColor - { - public static int GetAcreTileColor(byte acre, int x, int y) - { - return Color.ForestGreen.ToArgb(); - } - } } diff --git a/NHSE.Core/NHSE.Core.csproj b/NHSE.Core/NHSE.Core.csproj index b40dcb9..dec72a4 100644 --- a/NHSE.Core/NHSE.Core.csproj +++ b/NHSE.Core/NHSE.Core.csproj @@ -9,6 +9,7 @@ + @@ -50,6 +51,7 @@ + diff --git a/NHSE.Core/Resources/byte/outside.bin b/NHSE.Core/Resources/byte/outside.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a89e936666ea98417257d08a1c83cc256b746b9 GIT binary patch literal 1003520 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 W0~Cjp$k#=s&SuW(RtI?4L;nxj1>u(f literal 0 HcmV?d00001 diff --git a/NHSE.Core/Structures/Acres/OutsideAcre.cs b/NHSE.Core/Structures/Acres/OutsideAcre.cs index d80aa7b..0a165a9 100644 --- a/NHSE.Core/Structures/Acres/OutsideAcre.cs +++ b/NHSE.Core/Structures/Acres/OutsideAcre.cs @@ -1,4 +1,7 @@ -namespace NHSE.Core +using System.Collections.Generic; +using System.Drawing; + +namespace NHSE.Core { public enum OutsideAcre : ushort { @@ -162,4 +165,35 @@ public enum OutsideAcre : ushort FldOutSBridge02 = 243, FldOutSBridge01 = 244 } + + public static class CollisionUtil + { + public static readonly Dictionary Dict = new Dictionary + { + {00, Color.FromArgb( 70, 120, 64)}, // Grass + {01, Color.FromArgb(128, 215, 195)}, // River + {03, Color.FromArgb(192, 192, 192)}, // Stone + {04, Color.FromArgb(240, 230, 170)}, // Sand + {05, Color.FromArgb(128, 215, 195)}, // Sea + {06, Color.FromArgb(255, 128, 128)}, // Wood + {07, Color.FromArgb(0 , 0, 0)}, // Null + {08, Color.FromArgb(32 , 32, 32)}, // Building + {09, Color.FromArgb(255, 0, 0)}, // ?? + {10, Color.FromArgb(48 , 48, 48)}, // Door + {12, Color.FromArgb(128, 215, 195)}, // Water at mouths of river + {15, Color.FromArgb(128, 215, 195)}, // Strip of water between river mouth and river + {22, Color.FromArgb(190, 98, 98)}, // Wood (thin) + {28, Color.FromArgb(255, 0, 0)}, // ?? this one isn't even in ColGroundAttributeParam... + {29, Color.FromArgb(232, 222, 162)}, // Edge of beach, next to sea + {41, Color.FromArgb(118, 122, 132)}, // Rocks at top of map + {42, Color.FromArgb(128, 133, 147)}, // Taller regions, rocks at top of map + {43, Color.Cyan}, + {44, Color.FromArgb( 62, 112, 56)}, // Edge connecting grass and beach + {45, Color.FromArgb(118, 122, 132)}, // Some kind of rock + {46, Color.FromArgb(120, 207, 187)}, // Edge of sea, next to beach + {47, Color.FromArgb(128, 128, 0)}, // Sandstone + {49, Color.FromArgb(190, 98, 98)}, // Pier + {51, Color.FromArgb(32 , 152, 32)}, // "Grass-growing building"?? + }; + } } diff --git a/NHSE.Core/Structures/Acres/Terrain/TerrainManager.cs b/NHSE.Core/Structures/Acres/Terrain/TerrainManager.cs index 5f632d1..e90d7ed 100644 --- a/NHSE.Core/Structures/Acres/Terrain/TerrainManager.cs +++ b/NHSE.Core/Structures/Acres/Terrain/TerrainManager.cs @@ -114,9 +114,13 @@ public bool IsWithinGrid(int acreScale, int relX, int relY) public int GetTileColor(int x, in int y) { - //var acre = GetTileAcre(x, y); - //if (acre != 0) - // return AcreTileColor.GetAcreTileColor(acre, x % 16, y % 16); + var acre = GetTileAcre(x, y); + if (acre != 0) + { + var c = AcreTileColor.GetAcreTileColor(acre, x % 16, y % 16); + if (c != -0x1000000) // transparent + return c; + } var tile = GetTile(x, y); return TerrainTileColor.GetTileColor(tile).ToArgb(); @@ -128,7 +132,8 @@ private byte GetTileAcre(int x, int y) var acreY = 1 + (y / 16); var acreIndex = ((AcreWidth + 2) * acreY) + acreX; - return BaseAcres[acreIndex * 2]; // u16 array, never > 255 + var ofs = acreIndex * 2; + return BaseAcres[ofs]; // u16 array, never > 255 } } } diff --git a/NHSE.Core/Structures/Misc/GSaveDateMD.cs b/NHSE.Core/Structures/Misc/GSaveDateMD.cs index 255b448..1485143 100644 --- a/NHSE.Core/Structures/Misc/GSaveDateMD.cs +++ b/NHSE.Core/Structures/Misc/GSaveDateMD.cs @@ -20,7 +20,7 @@ public struct GSavePlayerHandleName { public const int SIZE = 0xA; - private ushort ModifierId { get; set; } + public ushort ModifierId { get; set; } public byte ModifierLevel { get; set; } public ushort NounId { get; set; } diff --git a/NHSE.Parsing/GamePBCDumper.cs b/NHSE.Parsing/GamePBCDumper.cs new file mode 100644 index 0000000..07b75bc --- /dev/null +++ b/NHSE.Parsing/GamePBCDumper.cs @@ -0,0 +1,36 @@ +using System; +using System.IO; +using System.Linq; +using NHSE.Core; + +namespace NHSE.Parsing +{ + public static class GamePBCDumper + { + public static void DumpOutsideAcrePixels(string modelPath, string path) + { + var files = Directory.EnumerateFiles(modelPath, "*.pbc", SearchOption.AllDirectories); + + const int acreSize = 32 * 32 * 4; + var maxAcre = Enum.GetValues(typeof(OutsideAcre)).Cast().Max(); + var result = new byte[acreSize * ((int)maxAcre + 1)]; + + foreach (var f in files) + { + var fn = Path.GetFileNameWithoutExtension(f); + if (fn == null) + continue; + if (!Enum.TryParse(fn, out var acre)) + continue; + + var data = File.ReadAllBytes(f); + var pbc = new PBC(data); + + var index = (int)acre; + var offset = acreSize * index; + pbc.Tiles.CopyTo(result, offset); + } + File.WriteAllBytes(path, result); + } + } +} diff --git a/NHSE.Parsing/PBC/PBC.cs b/NHSE.Parsing/PBC/PBC.cs index 2553d23..9012771 100644 --- a/NHSE.Parsing/PBC/PBC.cs +++ b/NHSE.Parsing/PBC/PBC.cs @@ -1,7 +1,7 @@ using System; -using System.Collections.Generic; using System.Diagnostics; using System.Drawing; +using NHSE.Core; namespace NHSE.Parsing { @@ -45,37 +45,10 @@ private byte[] GetTiles() } public byte GetTile(int x, int y) => Tiles[(y * Width) + x]; - public Color GetTileColor(int x, int y) => Dict[GetTile(x, y)]; + public Color GetTileColor(int x, int y) => CollisionUtil.Dict[GetTile(x, y)]; public uint Magic => BitConverter.ToUInt32(Data, 0x00); public uint Width => BitConverter.ToUInt32(Data, 0x04); public uint Height => BitConverter.ToUInt32(Data, 0x08); - - public static readonly Dictionary Dict = new Dictionary - { - {00, Color.FromArgb( 70, 120, 64)}, // Grass - {01, Color.FromArgb(128, 215, 195)}, // River - {03, Color.FromArgb(192, 192, 192)}, // Stone - {04, Color.FromArgb(240, 230, 170)}, // Sand - {05, Color.FromArgb(128, 215, 195)}, // Sea - {06, Color.FromArgb(255, 128, 128)}, // Wood - {07, Color.FromArgb(0 , 0, 0)}, // Null - {08, Color.FromArgb(32 , 32, 32)}, // Building - {09, Color.FromArgb(255, 0, 0)}, // ?? - {10, Color.FromArgb(48 , 48, 48)}, // Door - {12, Color.FromArgb(128, 215, 195)}, // Water at mouths of river - {15, Color.FromArgb(128, 215, 195)}, // Strip of water between river mouth and river - {22, Color.FromArgb(190, 98, 98)}, // Wood (thin) - {28, Color.FromArgb(255, 0, 0)}, // ?? this one isn't even in ColGroundAttributeParam... - {29, Color.FromArgb(232, 222, 162)}, // Edge of beach, next to sea - {41, Color.FromArgb(118, 122, 132)}, // Rocks at top of map - {42, Color.FromArgb(128, 133, 147)}, // Taller regions, rocks at top of map - {44, Color.FromArgb( 62, 112, 56)}, // Edge connecting grass and beach - {45, Color.FromArgb(118, 122, 132)}, // Some kind of rock - {46, Color.FromArgb(120, 207, 187)}, // Edge of sea, next to beach - {47, Color.FromArgb(128, 128, 0)}, // Sandstone - {49, Color.FromArgb(190, 98, 98)}, // Pier - {51, Color.FromArgb(32 , 152, 32)}, // "Grass-growing building"?? - }; } } diff --git a/NHSE.Sprites/Field/TerrainSprite.cs b/NHSE.Sprites/Field/TerrainSprite.cs index 2a16c03..116c777 100644 --- a/NHSE.Sprites/Field/TerrainSprite.cs +++ b/NHSE.Sprites/Field/TerrainSprite.cs @@ -24,9 +24,7 @@ public static void CreateMap(TerrainManager mgr, int[] pixels) { for (int x = 0; x < mgr.MapWidth; x++, i++) { - var tile = mgr.GetTile(x, y); - var color = TerrainTileColor.GetTileColor(tile); - pixels[i] = color.ToArgb(); + pixels[i] = mgr.GetTileColor(x, y); } } }