Skip to content

Commit 7a8f48a

Browse files
committed
Add support for DTA's TiberiumOverlays hack
1 parent eca6fd4 commit 7a8f48a

4 files changed

Lines changed: 92 additions & 1 deletion

File tree

src/TSMapEditor/CCEngine/TileSet.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
using Microsoft.Xna.Framework;
22
using Rampastring.Tools;
33
using Rampastring.XNAUI;
4+
using System;
5+
using System.Collections.Generic;
46
using TSMapEditor.Models;
57

68
namespace TSMapEditor.CCEngine
@@ -43,6 +45,9 @@ public TileSet(int index)
4345
/// <param name="tileIndex">The index of the tile.</param>
4446
public bool ContainsTile(int tileIndex) => tileIndex >= StartTileIndex && tileIndex < StartTileIndex + LoadedTileCount;
4547

48+
public Dictionary<TiberiumType, OverlayType> TiberiumGraphicsOverrides { get; set; }
49+
public List<(string tiberiumTypeName, string graphicalOverlayName)> ParsedTiberiumGraphicsOverrides { get; set; }
50+
4651
private static string[] only1x1TileSets = new string[] { "cliffs", "rivers", "shores", "dirt road" };
4752

4853
public void Read(IniSection iniSection)
@@ -58,6 +63,31 @@ public void Read(IniSection iniSection)
5863
const string colorKeyName = "EditorColor";
5964
if (iniSection.KeyExists(colorKeyName))
6065
Color = iniSection.GetColorValue(colorKeyName, UISettings.ActiveSettings.AltColor);
66+
67+
// Support for DTA TiberiumOverlays graphics override feature
68+
// TiberiumOverlays=Riparius:TIB1S_01,Vinifera:TIB2S_01,Ore:ORESNO01,Gems:GEMSRA01,GreenGems:GEMSRA01,BlueGems:GEMSRA01
69+
const string tiberiumOverlaysKeyName = "TiberiumOverlays";
70+
if (iniSection.KeyExists(tiberiumOverlaysKeyName))
71+
{
72+
ParsedTiberiumGraphicsOverrides = new List<(string tiberiumTypeName, string graphicalOverlayName)>();
73+
string value = iniSection.GetStringValue(tiberiumOverlaysKeyName, null);
74+
if (!string.IsNullOrWhiteSpace(value))
75+
{
76+
string[] values = value.Split(',', StringSplitOptions.RemoveEmptyEntries);
77+
78+
foreach (string overrideValue in values)
79+
{
80+
string[] parts = overrideValue.Split(':');
81+
82+
if (parts.Length != 2)
83+
{
84+
throw new INIConfigException($"Failed to parse TiberiumOverlays= of TileSet {SetName} (#{Index}).");
85+
}
86+
87+
ParsedTiberiumGraphicsOverrides.Add((parts[0], parts[1]));
88+
}
89+
}
90+
}
6191
}
6292
}
6393
}

src/TSMapEditor/Models/EditorConfig.cs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,45 @@ private void ReadTiberiumOverlays(Rules rules)
356356
}
357357
}
358358

359+
public void PostTheaterInit(Rules rules)
360+
{
361+
// Re-assign Theater Tiberium graphics overrides
362+
foreach (var theater in Theaters)
363+
{
364+
foreach (var tileSet in theater.TileSets)
365+
{
366+
tileSet.TiberiumGraphicsOverrides?.Clear();
367+
368+
if (tileSet.ParsedTiberiumGraphicsOverrides != null &&
369+
tileSet.ParsedTiberiumGraphicsOverrides.Count > 0)
370+
{
371+
tileSet.TiberiumGraphicsOverrides = new Dictionary<TiberiumType, OverlayType>();
372+
373+
foreach (var tiberiumGraphicsOverride in tileSet.ParsedTiberiumGraphicsOverrides)
374+
{
375+
TiberiumType tiberiumType = rules.TiberiumTypes.Find(tt => tt.ININame == tiberiumGraphicsOverride.tiberiumTypeName);
376+
377+
if (tiberiumType == null)
378+
{
379+
throw new INIConfigException($"Failed to find TiberiumType \"{tiberiumGraphicsOverride.tiberiumTypeName}\" for " +
380+
$"TiberiumOverlays= of TileSet {tileSet.SetName} ({tileSet.Index}) of Theater \"{theater.UIName}\"!");
381+
}
382+
383+
OverlayType overlayType = rules.OverlayTypes.Find(ot => ot.ININame == tiberiumGraphicsOverride.graphicalOverlayName);
384+
385+
if (overlayType == null)
386+
{
387+
throw new INIConfigException($"Failed to find OverlayType \"{tiberiumGraphicsOverride.graphicalOverlayName}\" for " +
388+
$"TiberiumOverlays= of TileSet {tileSet.SetName} ({tileSet.Index}) of Theater \"{theater.UIName}\"!");
389+
}
390+
391+
tileSet.TiberiumGraphicsOverrides.Add(tiberiumType, overlayType);
392+
}
393+
}
394+
}
395+
}
396+
}
397+
359398
private void ReadTeamTypeFlags()
360399
{
361400
TeamTypeFlags.Clear();

src/TSMapEditor/Rendering/ObjectRenderers/OverlayRenderer.cs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,30 @@ public OverlayRenderer(RenderDependencies renderDependencies) : base(renderDepen
1616

1717
protected override CommonDrawParams GetDrawParams(Overlay gameObject)
1818
{
19+
ShapeImage shape = TheaterGraphics.OverlayTextures[gameObject.OverlayType.Index];
20+
21+
// If this is an image for a Tiberium overlay type, check if the cell's underlying TileSet defines an override for the
22+
// Tiberium overlay's graphics
23+
if (gameObject.OverlayType.TiberiumType != null)
24+
{
25+
var cell = Map.GetTile(gameObject.Position);
26+
var tileSet = Map.TheaterInstance.Theater.TileSets[Map.TheaterInstance.GetTileSetId(cell.TileIndex)];
27+
28+
if (tileSet.TiberiumGraphicsOverrides != null &&
29+
tileSet.TiberiumGraphicsOverrides.TryGetValue(gameObject.OverlayType.TiberiumType, out OverlayType startGraphicalOverlayType))
30+
{
31+
// This comes with the assumption that a TiberiumType's Overlays are in the same order as they have been defined in Rules.ini
32+
int indexWithinOverlays = gameObject.OverlayType.TiberiumType.Overlays.IndexOf(gameObject.OverlayType);
33+
34+
int totalOverrideIndex = startGraphicalOverlayType.Index + indexWithinOverlays;
35+
shape = TheaterGraphics.OverlayTextures[totalOverrideIndex];
36+
}
37+
}
38+
1939
return new CommonDrawParams()
2040
{
2141
IniName = gameObject.OverlayType.ININame,
22-
ShapeImage = TheaterGraphics.OverlayTextures[gameObject.OverlayType.Index]
42+
ShapeImage = shape
2343
};
2444
}
2545

src/TSMapEditor/UI/Windows/MainMenuWindows/MapSetup.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ public static void LoadTheaterGraphics(WindowManager windowManager, string gameD
124124

125125
EditorGraphics editorGraphics = new EditorGraphics();
126126

127+
LoadedMap.EditorConfig.PostTheaterInit(LoadedMap.Rules);
128+
127129
var uiManager = new UIManager(windowManager, LoadedMap, theaterGraphics, editorGraphics);
128130
windowManager.AddAndInitializeControl(uiManager);
129131

0 commit comments

Comments
 (0)