Skip to content

Commit

Permalink
Add system texture items (#195)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonko0493 authored Jun 12, 2023
1 parent e8279e4 commit 018c5d5
Show file tree
Hide file tree
Showing 9 changed files with 425 additions and 10 deletions.
168 changes: 167 additions & 1 deletion src/SerialLoops.Lib/Defaults/DefaultNames.json
Original file line number Diff line number Diff line change
Expand Up @@ -412,5 +412,171 @@
"SLTD0": "MAP_PUZZLE_TEST0",
"SLTD1": "MAP_PUZZLE_TEST1",
"TAID0": "MAP_GYM",
"XTRD0": "MAP_EXTRAS"
"XTRD0": "MAP_EXTRAS",
"SYSTEX_SYS_ADV_B01": "SYSTEX_TOPIC_OBTAINED",
"SYSTEX_SYS_ADV_B02": "SYSTEX_TASK_ASSIGNMENT_B",
"SYSTEX_SYS_ADV_B03": "SYSTEX_CHOOSE_COMPANIONS_B",
"SYSTEX_SYS_ADV_T06": "SYSTEX_EPISODE_SMALL",
"SYSTEX_SYS_ADV_T07": "SYSTEX_SPEECH_BUBBLE",
"SYSTEX_SYS_ADV_T08": "SYSTEX_EMOTES",
"SYSTEX_SYS_ADV_T09": "SYSTEX_KYON_HEADACHE",
"SYSTEX_SYS_ADV_T10": "SYSTEX_SPEECH_BUBBLE_L",
"SYSTEX_SYS_ADV_T11": "SYSTEX_TASK_ASSIGNMENT_T",
"SYSTEX_SYS_ADV_T12": "SYSTEX_CHOOSE_COMPANIONS_T",
"SYSTEX_SYS_ADV_T14": "SYSTEX_EXTRA_SMALL",
"SYSTEX_SYS_CMN_B00": "SYSTEX_BOXES_0",
"SYSTEX_SYS_CMN_B02": "SYSTEX_DIALOGUE_CONTROLS",
"SYSTEX_SYS_CMN_B03": "SYSTEX_DIALOGUE_H",
"SYSTEX_SYS_CMN_B04": "SYSTEX_NUMBERS_SMALL_B",
"SYSTEX_SYS_CMN_B05": "SYSTEX_DIALOGUE_BOX",
"SYSTEX_SYS_CMN_B06": "SYSTEX_UNKNOWN_B06",
"SYSTEX_SYS_CMN_B07": "SYSTEX_NUMBERS_LARGE_B",
"SYSTEX_SYS_CMN_B08": "SYSTEX_SCROLL",
"SYSTEX_SYS_CMN_B09": "SYSTEX_TOPICS_SMALL",
"SYSTEX_SYS_CMN_B11": "SYSTEX_BACK",
"SYSTEX_SYS_CMN_B13": "SYSTEX_UNKNOWN_B13",
"SYSTEX_SYS_CMN_B14": "SYSTEX_HARUHI_METER",
"SYSTEX_SYS_CMN_B15": "SYSTEX_LITTLE_HARUHI",
"SYSTEX_SYS_CMN_B17": "SYSTEX_DIALOGUE_ARROW",
"SYSTEX_SYS_CMN_B18": "SYSTEX_INFORMATION",
"SYSTEX_SYS_CMN_B22": "SYSTEX_CHESS_STUFF",
"SYSTEX_SYS_CMN_B24": "SYSTEX_PUZZLE_TEXT",
"SYSTEX_SYS_CMN_B25": "SYSTEX_TOPIC_BROWSER",
"SYSTEX_SYS_CMN_B27": "SYSTEX_FORWARD",
"SYSTEX_SYS_CMN_B30": "SYSTEX_COMPANION_SELECT",
"SYSTEX_SYS_CMN_B32": "SYSTEX_SWEEPER_SELECT",
"SYSTEX_SYS_CMN_B34": "SYSTEX_BOXES_34",
"SYSTEX_SYS_CMN_B35": "SYSTEX_OK",
"SYSTEX_SYS_CMN_B36": "SYSTEX_CHARACTER_PORTRAITS_B",
"SYSTEX_SYS_CMN_B37": "SYSTEX_TITLE_SCREEN_BOTTOM",
"SYSTEX_SYS_CMN_B38": "SYSTEX_EPISODE_NUMBERS",
"SYSTEX_SYS_CMN_B39": "SYSTEX_TITLE_SCREEN_TEXT",
"SYSTEX_SYS_CMN_B40": "SYSTEX_SOUND_CHECK",
"SYSTEX_SYS_CMN_B41": "SYSTEX_DIALOGUE_BOX2",
"SYSTEX_SYS_CMN_B42": "SYSTEX_LINES_42",
"SYSTEX_SYS_CMN_B43": "SYSTEX_EXTRAS_TEXT",
"SYSTEX_SYS_CMN_B44": "SYSTEX_SAVE_TEXT",
"SYSTEX_SYS_CMN_B46": "SYSTEX_VOICE_PORTRAITS",
"SYSTEX_SYS_CMN_B47": "SYSTEX_VOICE_OPTIONS_TEXT",
"SYSTEX_SYS_CMN_B58": "SYSTEX_AVOIDED",
"SYSTEX_SYS_CMN_T01": "SYSTEX_NUMBERS_SMALL_T",
"SYSTEX_SYS_CMN_T02": "SYSTEX_UNKNOWN_T02",
"SYSTEX_SYS_CMN_T03": "SYSTEX_UNKNOWN_T03",
"SYSTEX_SYS_CMN_T05": "SYSTEX_NUMBERS_LARGE_T",
"SYSTEX_SYS_CMN_T06": "SYSTEX_CIRCLE",
"SYSTEX_SYS_CMN_T07": "SYSTEX_DOT",
"SYSTEX_SYS_CMN_T08": "SYSTEX_MAIN_TOPIC",
"SYSTEX_SYS_CMN_T09": "SYSTEX_HARUHI_TOPIC",
"SYSTEX_SYS_CMN_T10": "SYSTEX_MIKURU_TOPIC",
"SYSTEX_SYS_CMN_T11": "SYSTEX_NAGATO_TOPIC",
"SYSTEX_SYS_CMN_T12": "SYSTEX_KOIZUMI_TOPIC",
"SYSTEX_SYS_CMN_T13": "SYSTEX_SUB_TOPIC",
"SYSTEX_SYS_CMN_T14": "SYSTEX_CHARACTER_PORTRAITS_T",
"SYSTEX_SYS_CMN_T15": "SYSTEX_H_RED",
"SYSTEX_SYS_CMN_T16": "SYSTEX_UNKNOWN_T16",
"SYSTEX_SYS_CMN_T17": "SYSTEX_INSTRUCTIONS_BAR",
"SYSTEX_SYS_CMN_T19": "SYSTEX_ROUTES",
"SYSTEX_SYS_CMN_T22": "SYSTEX_PERCENTAGE_BOX",
"SYSTEX_SYS_CMN_T23": "SYSTEX_HARUHI_PORTRAITS_T",
"SYSTEX_SYS_CMN_T24": "SYSTEX_HARUHI_METER_TOP",
"SYSTEX_SYS_CMN_T29": "SYSTEX_UNKNOWN_T29",
"SYSTEX_SYS_CMN_T60": "SYSTEX_EPISODE_1",
"SYSTEX_SYS_CMN_T61": "SYSTEX_EPISODE_2",
"SYSTEX_SYS_CMN_T62": "SYSTEX_EPISODE_3",
"SYSTEX_SYS_CMN_T63": "SYSTEX_EPISODE_4",
"SYSTEX_SYS_CMN_T64": "SYSTEX_EPISODE_5",
"SYSTEX_SYS_CMN_T65": "SYSTEX_TITLE_SCREEN",
"SYSTEX_SYS_CMN_T66": "SYSTEX_EPILOGUE",
"SYSTEX_SYS_CNF_B00": "SYSTEX_UNKNOWN_B00",
"SYSTEX_SYS_EF_00": "SYSTEX_SMOKE_EFFECT",
"SYSTEX_SYS_EXT_B02": "SYSTEX_EXTRAS_TOPIC_SELECT",
"SYSTEX_SYS_EXT_B03": "SYSTEX_EXTRAS_COMPANION_SELECT",
"SYSTEX_SYS_LOG_B00": "SYSTEX_BACKLOG_SCROLL",
"SYSTEX_SYS_LOG_B01": "SYSTEX_BACKLOG_VOICE",
"SYSTEX_SYS_MNU_B00": "SYSTEX_MENU_NUMBERS",
"SYSTEX_SYS_SLG_B00": "SYSTEX_PUZZLE_UI",
"SYSTEX_SYS_SLG_B01": "SYSTEX_PUZZLE_PORTRAITS",
"SYSTEX_SYS_SLG_B02": "SYSTEX_UNKNOWN_S02",
"SYSTEX_SYS_SLG_B03": "SYSTEX_UNKNOWN_S03",
"SYSTEX_SYS_SLG_B04": "SYSTEX_PUZZLE_TEXT",
"SYSTEX_SYS_SLG_B05": "SYSTEX_UNKNOWN_S05",
"SYSTEX_SYS_SLG_B06": "SYSTEX_PUZZLE_ACCIDENT_SPIKE",
"SYSTEX_SYS_SLG_B07": "SYSTEX_PUZZLE_DELAYED",
"SYSTEX_SYS_SLG_B08": "SYSTEX_PUZZLE_ACCIDENT_TEXT",
"SYSTEX_SYS_SLG_B09": "SYSTEX_PUZZLE_MANGNIFIER",
"SYSTEX_SYS_SLG_B10": "SYSTEX_PUZZLE_TOPIC_TEXT",
"SYSTEX_SYS_SLG_B11": "SYSTEX_PUZZLE_READY_GO_TEXT",
"SYSTEX_SYS_SLG_B12": "SYSTEX_PUZZLE_MORE_TEXT",
"SYSTEX_SYS_SLG_B13": "SYSTEX_PUZZLE_TOPIC_SELECT",
"SYSTEX_SYS_SLG_B14": "SYSTEX_PUZZLE_KYON_HEADACHE",
"SYSTEX_SYS_SLG_B15": "SYSTEX_PUZZLE_ACCIDENT_SMALL",
"SYSTEX_SYS_SLG_B16": "SYSTEX_PUZZLE_TOPICS_SMALL",
"SYSTEX_SYS_SLG_B17": "SYSTEX_PUZZLE_MENU_TEXT",
"SYSTEX_SYS_SLG_MM00": "SYSTEX_PUZZLE_MAP_SQUARE",
"SYSTEX_SYS_SLG_MM10": "SYSTEX_PUZZLE_MAP_PREVIEW",
"SYSTEX_SYS_SLG_T01": "SYSTEX_PUZZLE_ANIM_TEXT",
"SYSTEX_SYS_SLG_T02": "SYSTEX_PUZZLE_ROUTE_TEXT",
"SYSTEX_SYS_SLG_T03": "SYSTEX_PUZZLE_ROUTE_HARUHI",
"SYSTEX_SYS_SLG_T04": "SYSTEX_PUZZLE_HARUHI_ROUTE",
"SYSTEX_SYS_SLG_T30": "SYSTEX_PUZZLE_MAIN_TOPIC",
"SYSTEX_SYS_TPC_B08": "SYSTEX_HARUHI_TOPIC_2",
"SYSTEX_SYS_TPC_B09": "SYSTEX_TOPIC_STAR",
"SYSTEX_SYS_TPC_B10": "SYSTEX_MAIN_TOPIC_2",
"SYSTEX_SYS_TPC_T05": "SYSTEX_GENERIC_TOPIC",
"SYSTEX_SYS_TPC_T07": "SYSTEX_TOPIC_STAR_2",
"SYSTEX_SYS_TPC_T09": "SYSTEX_ACCIDENT_TEXT",
"SYSTEX_XTR_ALB_B01": "SYSTEX_EXTRA_CG_GALLERY",
"SYSTEX_XTR_ALB_B02": "SYSTEX_EXTRA_CG_PAGE1",
"SYSTEX_XTR_ALB_B03": "SYSTEX_EXTRA_CG_PAGE2",
"SYSTEX_XTR_ALB_B04": "SYSTEX_EXTRA_CG_PAGE3",
"SYSTEX_XTR_ALB_B05": "SYSTEX_EXTRA_CG_PAGE4",
"SYSTEX_XTR_ALB_B06": "SYSTEX_EXTRA_CG_PAGE5",
"SYSTEX_XTR_ALB_B07": "SYSTEX_EXTRA_CG_PAGE6",
"SYSTEX_XTR_ALB_B08": "SYSTEX_EXTRA_CG_PAGE7",
"SYSTEX_XTR_ALB_B09": "SYSTEX_EXTRA_CG_PAGE8",
"SYSTEX_XTR_ALB_T01": "SYSTEX_EXTRA_ALBUM_BG",
"SYSTEX_XTR_CHS_B01": "SYSTEX_CHESS_NUMBERS_MENU",
"SYSTEX_XTR_CHS_B02": "SYSTEX_CHESS_PORTRAITS",
"SYSTEX_XTR_CHS_T01": "SYSTEX_CHESS_TEXT",
"SYSTEX_XTR_CHS_T02": "SYSTEX_CHESS_HARUHI",
"SYSTEX_XTR_CHS_T03": "SYSTEX_CHESS_MIKURU",
"SYSTEX_XTR_CHS_T04": "SYSTEX_CHESS_NAGATO",
"SYSTEX_XTR_CHS_T05": "SYSTEX_CHESS_KOIZUMI",
"SYSTEX_XTR_CHS_T06": "SYSTEX_CHESS_TSURUYA",
"SYSTEX_XTR_CHS_T07": "SYSTEX_CHESS_HARUHI_LOCKED",
"SYSTEX_XTR_CHS_T08": "SYSTEX_CHESS_NAGATO_LOCKED",
"SYSTEX_XTR_CHS_T09": "SYSTEX_CHESS_TSURUYA_LOCKED",
"SYSTEX_XTR_ENT_T01": "SYSTEX_EXTRA_EXPLANATION",
"SYSTEX_XTR_ENT_T02": "SYSTEX_EXTRA_EXPLANATION_CHESS",
"SYSTEX_XTR_MPL_B01": "SYSTEX_EXTRA_BGM",
"SYSTEX_XTR_MPL_B02": "SYSTEX_EXTRA_BGM_BUTTONS",
"SYSTEX_XTR_MPL_T01": "SYSTEX_EXTRA_MUSIC_PLAYER_BG",
"SYSTEX_XTR_MPL_T02": "SYSTEX_EXTRA_BGM_PLAY",
"SYSTEX_XTR_PRG_B01": "SYSTEX_PROGRESS_TOPICS",
"SYSTEX_XTR_PRG_B02": "SYSTEX_PROGRESS_ROUTE_COMP",
"SYSTEX_XTR_PRG_B03": "SYSTEX_PROGRESS_NUMBERS",
"SYSTEX_XTR_PRG_T01": "SYSTEX_PROGRESS_GAME_COMP",
"SYSTEX_XTR_PRG_T02": "SYSTEX_PROGRESS_NUMBERS_T",
"SYSTEX_XTR_PRG_T03": "SYSTEX_PROGRESS_100_PERCENT",
"SYSTEX_XTR_PRG_T04": "SYSTEX_PROGRESS_NUMBERS_LARGE",
"SYSTEX_XTR_PRG_T05": "SYSTEX_PROGRESS_PERCENT_LARGE",
"SYSTEX_XTR_PRG_T06": "SYSTEX_PROGRESS_100_PERCENT_LARGE",
"SYSTEX_XTR_PRG_T07": "SYSTEX_PROGRESS_100_50_0_SMALL",
"SYSTEX_XTR_PRG_T08": "SYSTEX_PROGRESS_PORTRAITS",
"SYSTEX_XTR_RTE_B01": "SYSTEX_EXTRA_ROUTE_BROWSER",
"SYSTEX_XTR_RTE_T01": "SYSTEX_EXTRA_ROUTE_COMPLETION",
"SYSTEX_XTR_RTE_T02": "SYSTEX_EXTRA_ROUTE_BOXES",
"SYSTEX_XTR_RTE_T03": "SYSTEX_EXTRA_CONTROLS",
"SYSTEX_XTR_RTE_T04": "SYSTEX_EXTRA_ROUTE_EP1",
"SYSTEX_XTR_RTE_T05": "SYSTEX_EXTRA_ROUTE_EP2",
"SYSTEX_XTR_RTE_T06": "SYSTEX_EXTRA_ROUTE_EP3",
"SYSTEX_XTR_RTE_T07": "SYSTEX_EXTRA_ROUTE_EP4_1",
"SYSTEX_XTR_RTE_T08": "SYSTEX_EXTRA_ROUTE_EP4_2",
"SYSTEX_XTR_RTE_T09": "SYSTEX_EXTRA_ROUTE_EP5",
"SYSTEX_XTR_RTE_T10": "SYSTEX_EXTRA_EP1",
"SYSTEX_XTR_RTE_T11": "SYSTEX_EXTRA_EP2",
"SYSTEX_XTR_RTE_T12": "SYSTEX_EXTRA_EP3",
"SYSTEX_XTR_RTE_T13": "SYSTEX_EXTRA_EP4_1",
"SYSTEX_XTR_RTE_T14": "SYSTEX_EXTRA_EP4_2",
"SYSTEX_XTR_RTE_T15": "SYSTEX_EXTRA_EP5"
}
108 changes: 108 additions & 0 deletions src/SerialLoops.Lib/Items/SystemTextureItem.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
using HaruhiChokuretsuLib.Archive.Data;
using HaruhiChokuretsuLib.Archive.Graphics;
using HaruhiChokuretsuLib.Util;
using SkiaSharp;
using System.Diagnostics;
using System.IO;
using System.Linq;
using static System.Net.Mime.MediaTypeNames;

namespace SerialLoops.Lib.Items
{
public class SystemTextureItem : Item
{
public SystemTexture SysTex { get; set; }
public GraphicsFile Grp { get; set; }
public bool SetPalette { get; set; }
public int TransparentIndex { get; set; }
public int Width { get; set; }
public int Height { get; set; }

public SystemTextureItem(SystemTexture sysTex, Project project, string name, bool setPalette, int transparentIndex, int width = -1, int height = -1) : base(name, ItemType.System_Texture)
{
SysTex = sysTex;
Grp = project.Grp.Files.First(f => f.Index == sysTex.GrpIndex);
if (SysTex.Screen == SysTexScreen.BOTTOM_SCREEN)
{
Grp.ImageForm = GraphicsFile.Form.TEXTURE;
}
else
{
Grp.ImageForm = GraphicsFile.Form.TILE;
}
SetPalette = setPalette;
TransparentIndex = transparentIndex;
Width = width < 0 ? Grp.Width : width;
Height = height < 0 ? Grp.Height : height;
}

public override void Refresh(Project project, ILogger log)
{
}

public SKBitmap GetTexture()
{
if (SysTex.Screen == SysTexScreen.BOTTOM_SCREEN)
{
return Grp.GetImage();
}
else
{
SKBitmap tileBitmap = new(Width, Height);
SKBitmap tiles = Grp.GetImage(width: SysTex.TileWidth);
SKCanvas tileCanvas = new(tileBitmap);
int currentTile = 0;
for (int y = 0; y < tileBitmap.Height; y += SysTex.TileHeight)
{
for (int x = 0; x < tileBitmap.Width; x += SysTex.TileWidth)
{
SKRect crop = new(0, currentTile * SysTex.TileHeight, SysTex.TileWidth, (currentTile + 1) * SysTex.TileHeight);
SKRect dest = new(x, y, x + SysTex.TileWidth, y + SysTex.TileHeight);
tileCanvas.DrawBitmap(tiles, crop, dest);
currentTile++;
}
}
tileCanvas.Flush();

return tileBitmap;
}
}

public void SetTexture(SKBitmap bitmap)
{
if (SysTex.Screen == SysTexScreen.BOTTOM_SCREEN)
{
Grp.SetImage(bitmap, SetPalette, TransparentIndex);
}
else
{
SKBitmap tileBitmap = new(SysTex.TileWidth, bitmap.Width / SysTex.TileWidth * bitmap.Height);
SKCanvas tileCanvas = new(tileBitmap);

int currentTile = 0;
for (int y = 0; y < bitmap.Height; y += SysTex.TileHeight)
{
for (int x = 0; x < bitmap.Width; x += SysTex.TileWidth)
{
SKRect crop = new(x, y, x + 64, y + 64);
SKRect dest = new(0, currentTile * 64, 64, (currentTile + 1) * 64);
tileCanvas.DrawBitmap(bitmap, crop, dest);
currentTile++;
}
}
tileCanvas.Flush();

Grp.SetImage(tileBitmap, SetPalette, TransparentIndex);
}
}

public void Write(Project project, ILogger log)
{
using MemoryStream grpStream = new();
Grp.GetImage().Encode(grpStream, SKEncodedImageFormat.Png, 1);
IO.WriteBinaryFile(Path.Combine("assets", "graphics", $"{Grp.Index:X3}.png"), grpStream.ToArray(), project, log);
IO.WriteStringFile(Path.Combine("assets", "graphics", $"{Grp.Index:X3}_pal.csv"),
string.Join(',', Grp.Palette.Select(c => c.ToString())), project, log);
}
}
}
48 changes: 43 additions & 5 deletions src/SerialLoops.Lib/Project.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public LoadProjectResult(LoadProjectState state)
BadFileIndex = -1;
}
}

public LoadProjectResult Load(Config config, ILogger log, IProgressTracker tracker)
{
Config = config;
Expand All @@ -148,7 +148,7 @@ public void LoadProjectSettings(ILogger log, IProgressTracker tracker)
Settings = new(NdsProjectFile.FromByteArray<NdsProjectFile>(projectFile), log);
tracker.Finished++;
}

public LoadProjectResult LoadArchives(ILogger log, IProgressTracker tracker)
{
tracker.Focus("dat.bin", 3);
Expand Down Expand Up @@ -342,7 +342,7 @@ public LoadProjectResult LoadArchives(ILogger log, IProgressTracker tracker)
Evt.Files.First(f => f.Name == "TOPICS").InitializeTopicFile();
TopicFile = Evt.Files.First(f => f.Name == "TOPICS");
tracker.Focus("Topics", TopicFile.TopicStructs.Count);
foreach (TopicStruct topic in TopicFile.TopicStructs)
foreach (TopicStruct topic in TopicFile.TopicStructs)
{
// Main topics have shadow topics that are located at ID + 40 (this is actually how the game finds them)
// So if we're a main topic and we see another topic 40 back, we know we're one of these shadow topics and should really be
Expand All @@ -358,6 +358,44 @@ public LoadProjectResult LoadArchives(ILogger log, IProgressTracker tracker)
tracker.Finished++;
}

SystemTextureFile systemTextureFile = Dat.Files.First(f => f.Name == "SYSTEXS").CastTo<SystemTextureFile>();
tracker.Focus("System Textures",
5 + systemTextureFile.SystemTextures.Count(s => Grp.Files.Where(g => g.Name.StartsWith("XTR") || g.Name.StartsWith("SYS") && !g.Name.Contains("_SPC_") && g.Name != "SYS_CMN_B12DNX" && g.Name != "SYS_PPT_001DNX").Select(g => g.Index).Distinct().Contains(s.GrpIndex)));
Items.Add(new SystemTextureItem(systemTextureFile.SystemTextures.First(s => s.GrpIndex == Grp.Files.First(g => g.Name == "LOGO_CO_SEGDNX").Index), this, "SYSTEX_SPLASH_SEGA", true, 0, height: 192));
tracker.Finished++;
Items.Add(new SystemTextureItem(systemTextureFile.SystemTextures.First(s => s.GrpIndex == Grp.Files.First(g => g.Name == "LOGO_CO_AQIDNX").Index), this, "SYSTEX_SPLASH_AQI", true, 0, height: 192));
tracker.Finished++;
Items.Add(new SystemTextureItem(systemTextureFile.SystemTextures.First(s => s.GrpIndex == Grp.Files.First(g => g.Name == "LOGO_MW_ACTDNX").Index), this, "SYSTEX_SPLASH_MOBICLIP", true, 0, height: 192));
tracker.Finished++;
string criLogoName = Grp.Files.Any(f => f.Name == "CREDITS") ? "SYSTEX_SPLASH_HAROOHIE" : "SYSTEX_SPLASH_CRIWARE";
Items.Add(new SystemTextureItem(systemTextureFile.SystemTextures.First(s => s.GrpIndex == Grp.Files.First(g => g.Name == "LOGO_MW_CRIDNX").Index), this, criLogoName, true, 0, height: 192));
tracker.Finished++;
if (Grp.Files.Any(f => f.Name == "CREDITS"))
{
Items.Add(new SystemTextureItem(systemTextureFile.SystemTextures.First(s => s.GrpIndex == Grp.Files.First(g => g.Name == "CREDITS").Index), this, "SYSTEX_SPLASH_CREDITS", true, 0, height: 192));
}
tracker.Finished++;
foreach (SystemTexture extraSysTex in systemTextureFile.SystemTextures.Where(s => Grp.Files.Where(g => g.Name.StartsWith("XTR")).Distinct().Select(g => g.Index).Contains(s.GrpIndex)))
{
Items.Add(new SystemTextureItem(extraSysTex, this, $"SYSTEX_{Grp.Files.First(g => g.Index == extraSysTex.GrpIndex).Name[0..^3]}", false, -1));
tracker.Finished++;
}
// Exclude B12 as that's the nameplates we replace in the character items and PPT_001 as that's the puzzle phase singularity we'll be replacing in the puzzle items
// We also exclude the "special" graphics as they do not include all of them in the SYSTEX file (should be made to be edited manually)
foreach (SystemTexture sysSysTex in systemTextureFile.SystemTextures.Where(s => Grp.Files.Where(g => g.Name.StartsWith("SYS") && !g.Name.Contains("_SPC_") && g.Name != "SYS_CMN_B12DNX" && g.Name != "SYS_PPT_001DNX").Select(g => g.Index).Contains(s.GrpIndex)).DistinctBy(s => s.GrpIndex))
{
if (Grp.Files.First(g => g.Index == sysSysTex.GrpIndex).Name[0..^4].EndsWith("T6"))
{
// special case the ep headers
Items.Add(new SystemTextureItem(sysSysTex, this, $"SYSTEX_{Grp.Files.First(g => g.Index == sysSysTex.GrpIndex).Name[0..^3]}", false, -1, height: 192));
}
else
{
Items.Add(new SystemTextureItem(sysSysTex, this, $"SYSTEX_{Grp.Files.First(g => g.Index == sysSysTex.GrpIndex).Name[0..^3]}", false, -1));
}
tracker.Finished++;
}

// Scenario item must be created after script and puzzle items are constructed
tracker.Focus("Scenario", 1);
EventFile scenarioFile = Evt.Files.First(f => f.Name == "SCENARIOS");
Expand Down Expand Up @@ -495,8 +533,8 @@ public List<ItemDescription> GetSearchResults(string searchTerm, bool titlesOnly
}
else
{
return Items.Where(item =>
item.Name.Contains(searchTerm.Trim(), StringComparison.OrdinalIgnoreCase) ||
return Items.Where(item =>
item.Name.Contains(searchTerm.Trim(), StringComparison.OrdinalIgnoreCase) ||
item.DisplayName.Contains(searchTerm.Trim(), StringComparison.OrdinalIgnoreCase) ||
(!string.IsNullOrEmpty(item.SearchableText) &&
item.SearchableText.Contains(searchTerm.Trim(), StringComparison.OrdinalIgnoreCase))).ToList();
Expand Down
2 changes: 2 additions & 0 deletions src/SerialLoops/Controls/EditorTabsPanel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,8 @@ private DocumentPage CreateTab(ItemDescription item, Project project, ILogger lo
return new ScenarioEditor((ScenarioItem)project.Items.First(i => i.Name == item.Name), log, project, this);
case ItemDescription.ItemType.Script:
return new ScriptEditor((ScriptItem)project.Items.First(i => i.Name == item.Name), log, project, this);
case ItemDescription.ItemType.System_Texture:
return new SystemTextureEditor((SystemTextureItem)project.Items.First(i => i.Name == item.Name), project, log);
case ItemDescription.ItemType.Topic:
return new TopicEditor((TopicItem)project.Items.First(i => i.Name == item.Name), project, this, log);
case ItemDescription.ItemType.Voice:
Expand Down
Loading

0 comments on commit 018c5d5

Please sign in to comment.