diff --git a/project/code/TMV/Mission.cs b/project/code/TMV/Mission.cs index a14f645..41d84a7 100644 --- a/project/code/TMV/Mission.cs +++ b/project/code/TMV/Mission.cs @@ -38,15 +38,18 @@ public partial class Mission : Node3D [Export] public bool Dump = false; + + InstallPaths _installPaths; DbFile _file; TextureLoader _textureLoader; public override void _Ready() { var missionSelector = GetNode("%MissionSelector") as MissionSelector; - missionSelector.LoadMission += (string path) => + missionSelector.LoadMission += (string rootPath, string missionPath) => { - FileName = path; + _installPaths = new InstallPaths(rootPath); + FileName = missionPath; Build = true; }; } @@ -88,7 +91,7 @@ public partial class Mission : Node3D { ClearMap(); - _textureLoader = new TextureLoader("", FileName.GetBaseDir()); + _textureLoader = new TextureLoader(_installPaths.famPath, FileName.GetBaseDir()); _file = new(FileName); var textureList = (TxList)_file.Chunks["TXLIST"]; diff --git a/project/code/TMV/TextureLoader.cs b/project/code/TMV/TextureLoader.cs index b7f9a60..b2649ab 100644 --- a/project/code/TMV/TextureLoader.cs +++ b/project/code/TMV/TextureLoader.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.IO; +using System.IO.Compression; using System.Linq; using Godot; @@ -7,21 +8,38 @@ namespace KeepersCompound.TMV; public partial class TextureLoader { - private readonly string _rootPath; // TODO: Load from installation resources + private readonly string _userTexturesPath; + private readonly string _rootFamPath; // TODO: Load from installation resources private readonly string _fmPath; + private readonly Dictionary _rootTexturePaths = new(); private readonly Dictionary _fmTexturePaths = new(); private readonly List _textureCache = new(); private readonly Dictionary _idMap = new(); private readonly Dictionary _pathMap = new(); - public TextureLoader(string rootPath, string fmPath) + public TextureLoader(string rootFamPath, string fmPath) { - _rootPath = rootPath; + _rootFamPath = rootFamPath; _fmPath = fmPath; + _userTexturesPath = ProjectSettings.GlobalizePath($"user://textures/tmp"); + ExtractRootFamFiles(); LoadDefaultTexture(); - RegisterFmTexturePaths(); + RegisterTexturePaths(_fmPath, _fmTexturePaths); + RegisterTexturePaths(_userTexturesPath, _rootTexturePaths); + } + + private void ExtractRootFamFiles() + { + var dir = new DirectoryInfo(_userTexturesPath); + if (dir.Exists) + { + dir.Delete(true); + } + + var zip = ZipFile.OpenRead(_rootFamPath); + zip.ExtractToDirectory(_userTexturesPath.PathJoin("fam")); } private void LoadDefaultTexture() @@ -32,7 +50,7 @@ public partial class TextureLoader _textureCache.Add(texture); } - private void RegisterFmTexturePaths() + private static void RegisterTexturePaths(string rootDir, Dictionary map) { // TODO: Load DDS BMP GIF CEL string[] validExtensions = { "png", "tga", "pcx" }; @@ -44,34 +62,33 @@ public partial class TextureLoader RecurseSubdirectories = true, }; - foreach (var dirPath in Directory.EnumerateDirectories(_fmPath, "fam", famOptions)) + foreach (var dirPath in Directory.EnumerateDirectories(rootDir, "fam", famOptions)) { foreach (var path in Directory.EnumerateFiles(dirPath, "*", textureOptions)) { if (validExtensions.Contains(path.GetExtension().ToLower())) { // TODO: This only adds the first one found rather than the highest priority - var key = path.TrimPrefix(_fmPath).GetBaseName().ToLower(); - _fmTexturePaths.TryAdd(key, path); + var key = path.TrimPrefix(rootDir).GetBaseName().ToLower(); + map.TryAdd(key, path); } } } + + GD.Print($"Registered {map.Count} texture paths at : {rootDir}"); } public bool Load(int id, string path) { - // TODO: Handle lowercase .pcx :) - var userTexturesPath = ProjectSettings.GlobalizePath($"user://textures{path}.PCX"); - var loaded = false; - if (_fmTexturePaths.TryGetValue(path.ToLower(), out var filePath)) + if (_fmTexturePaths.TryGetValue(path.ToLower(), out var fmTexPath)) { - _textureCache.Add(LoadTexture(filePath)); + _textureCache.Add(LoadTexture(fmTexPath)); loaded = true; } - else if (File.Exists(userTexturesPath)) + else if (_rootTexturePaths.TryGetValue(path.ToLower(), out var rootTexPath)) { - _textureCache.Add(LoadTexture(userTexturesPath)); + _textureCache.Add(LoadTexture(rootTexPath)); loaded = true; } diff --git a/project/code/TMV/UI/MissionSelector.cs b/project/code/TMV/UI/MissionSelector.cs index 6076ee9..f4579ba 100644 --- a/project/code/TMV/UI/MissionSelector.cs +++ b/project/code/TMV/UI/MissionSelector.cs @@ -7,7 +7,7 @@ namespace KeepersCompound.TMV.UI; public partial class MissionSelector : Control { [Signal] - public delegate void LoadMissionEventHandler(string path); + public delegate void LoadMissionEventHandler(string rootPath, string missionPath); private InstallPaths _installPaths; @@ -116,7 +116,7 @@ public partial class MissionSelector : Control var campaignPath = selectedCampaign == 0 ? _installPaths.omsPath : _installPaths.fmsPath + _Campaigns.GetItemText(selectedCampaign); var path = campaignPath + _Missions.GetItemText(selected[0]); - EmitSignal(SignalName.LoadMission, path); + EmitSignal(SignalName.LoadMission, _installPaths.rootPath, path); Visible = false; }