Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

De-hardcode the overlays that Tiberiums use #147

Merged
merged 9 commits into from
Apr 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
7 changes: 3 additions & 4 deletions src/TSMapEditor/Config/Scripts/Count Credits On Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -44,11 +44,10 @@ public void Perform(Map map)
if (cell.Overlay?.OverlayType == null || !cell.Overlay.OverlayType.Tiberium)
return;

int tiberiumIndex = cell.Overlay.OverlayType.GetTiberiumIndex(Constants.UseCountries);
if (tiberiumIndex > -1)
TiberiumType tiberiumType = cell.Overlay.OverlayType.TiberiumType;
if (tiberiumType != null)
{
int tiberiumTypeValue = map.Rules.TiberiumTypes[tiberiumIndex].Value;
count += tiberiumTypeValue * (cell.Overlay.FrameIndex + 1);
count += cell.Overlay.FrameIndex * tiberiumType.Value;
}
});
}
Expand Down
13 changes: 13 additions & 0 deletions src/TSMapEditor/Config/Tiberiums.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
; C&C World-Altering Editor (WAE)
; https://github.com/Rampastring/WorldAlteringEditor

; A list of overlays to be used by each Tiberium.

; The following configuration is an example accurate for vanilla TS.
; As long as Tiberium overlays maintain the same indices, configuration is not necesssary.

[Tiberiums]
;Riparius=TIB01,TIB02,TIB03,TIB04,TIB05,TIB06,TIB07,TIB08,TIB09,TIB10,TIB11,TIB12,TIB13,TIB14,TIB15,TIB16,TIB17,TIB18,TIB19,TIB20
;Cruentus=BTIB01,BTIB02,BTIB03,BTIB04,BTIB05,BTIB06,BTIB07,BTIB08,BTIB09,BTIB10,BTIB11,BTIB12
;Vinifera=TIB2_01,TIB2_02,TIB2_03,TIB2_04,TIB2_05,TIB2_06,TIB2_07,TIB2_08,TIB2_09,TIB2_10,TIB2_11,TIB2_12,TIB2_13,TIB2_14,TIB2_15,TIB2_16,TIB2_17,TIB2_18,TIB2_19,TIB2_20
;Aboreus=TIB3_01,TIB3_02,TIB3_03,TIB3_04,TIB3_05,TIB3_06,TIB3_07,TIB3_08,TIB3_09,TIB3_10,TIB3_11,TIB3_12,TIB3_13,TIB3_14,TIB3_15,TIB3_16,TIB3_17,TIB3_18,TIB3_19,TIB3_20
88 changes: 86 additions & 2 deletions src/TSMapEditor/Models/EditorConfig.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Rampastring.Tools;
using System;
using System.Collections.Generic;
using System.Linq;
using TSMapEditor.CCEngine;
using TSMapEditor.UI;

Expand Down Expand Up @@ -29,6 +30,26 @@ public EditorConfig()
public List<ConnectedOverlayType> ConnectedOverlays { get; } = new List<ConnectedOverlayType>();
public List<TeamTypeFlag> TeamTypeFlags { get; } = new List<TeamTypeFlag>();

private static readonly Dictionary<string, (int StartIndex, int Count)> TiberiumDefaults = new()
{
{
"Riparius",
(102, 20)
},
{
"Cruentus",
(27, 12)
},
{
"Vinifera",
(127, 20)
},
{
"Aboreus",
(147, 20)
}
};

public void EarlyInit()
{
ReadBrushSizes();
Expand All @@ -46,6 +67,7 @@ public void RulesDependentInit(Rules rules)
ReadSmudgeCollections(rules);
ReadBridges(rules);
ReadConnectedOverlays(rules);
ReadTiberiumOverlays(rules);
}

private void ReadTheaters()
Expand Down Expand Up @@ -191,8 +213,8 @@ private void ReadTriggerEventTypes()

if (TriggerEventTypes.ContainsKey(triggerEventType.ID))
{
throw new INIConfigException( $"Error while adding Trigger Event {triggerEventType.Name}: " +
$"a Trigger Event with ID {triggerEventType.ID} already exists!");
throw new INIConfigException($"Error while adding Trigger Event {triggerEventType.Name}: " +
$"a Trigger Event with ID {triggerEventType.ID} already exists!");
}

TriggerEventTypes.Add(triggerEventType.ID, triggerEventType);
Expand Down Expand Up @@ -268,6 +290,68 @@ private void ReadConnectedOverlays(Rules rules)
}
}

private void ReadTiberiumOverlays(Rules rules)
{
var iniFile = new IniFile(Environment.CurrentDirectory + "/Config/Tiberiums.ini");
const string sectionName = "Tiberiums";

foreach (var tiberiumType in rules.TiberiumTypes)
{
tiberiumType.Overlays = new List<OverlayType>();
string tibName = tiberiumType.ININame;

string overlaysString = iniFile.GetStringValue(sectionName, tibName, null);

if (overlaysString == null)
{
if (!TiberiumDefaults.ContainsKey(tibName))
continue;

var defaultOverlays = rules.OverlayTypes.Slice(TiberiumDefaults[tibName].StartIndex, TiberiumDefaults[tibName].Count);
tiberiumType.Overlays.AddRange(defaultOverlays);
defaultOverlays.ForEach(ot =>
{
if (ot.TiberiumType == null)
{
ot.TiberiumType = tiberiumType;
}
else
{
throw new INIConfigException(
$"OverlayType {ot.ININame} is already associated with Tiberium {ot.TiberiumType.Index} ({ot.TiberiumType.ININame}), " +
$"but it is also set to be associated with Tiberium {tiberiumType.Index} ({tiberiumType.ININame})!");
}
});

continue;
}

var overlayNames = overlaysString.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
var overlays = overlayNames.Select(name => (name, rules.FindOverlayType(name))).ToList();

if (overlays.Any(ot => ot.Item2 == null))
{
throw new INIConfigException($"Tiberium {tibName} has invalid overlay type(s) specified: " +
$"{string.Join(", ", overlays.Where(ot => ot.Item2 == null).Select(ot => ot.name))}!");
}

tiberiumType.Overlays.AddRange(overlays.Select(ot => ot.Item2));
overlays.ForEach(ot =>
{
if (ot.Item2.TiberiumType == null)
{
ot.Item2.TiberiumType = tiberiumType;
}
else
{
throw new INIConfigException(
$"OverlayType {ot.Item2.ININame} is already associated with Tiberium {ot.Item2.TiberiumType.Index} ({ot.Item2.TiberiumType.ININame}), " +
$"but it is also set to be associated with Tiberium {tiberiumType.Index} ({tiberiumType.ININame})!");
}
});
}
}

private void ReadTeamTypeFlags()
{
TeamTypeFlags.Clear();
Expand Down
10 changes: 0 additions & 10 deletions src/TSMapEditor/Models/Enums/TiberiumTypeEnum.cs

This file was deleted.

98 changes: 1 addition & 97 deletions src/TSMapEditor/Models/OverlayType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,102 +28,6 @@ public OverlayType(string iniName) : base(iniName)
public bool Tiberium { get; set; }
public bool IsVeins { get; set; }
public bool IsVeinholeMonster { get; set; }

public int GetTiberiumIndex(bool useYROrder)
{
var tiberium = GetTiberiumTypeEnum();
return (tiberium, useYROrder) switch
{
(TiberiumTypeEnum.Vinifera, true) => (int)TiberiumTypeEnum.Cruentus,
(TiberiumTypeEnum.Cruentus, true) => (int)TiberiumTypeEnum.Vinifera,
(null, _) => -1,
_ => (int)tiberium,
};
}

private TiberiumTypeEnum? GetTiberiumTypeEnum()
{
switch (Index)
{
case 27:
case 28:
case 29:
case 30:
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
return TiberiumTypeEnum.Vinifera;
case 102:
case 103:
case 104:
case 105:
case 106:
case 107:
case 108:
case 109:
case 110:
case 111:
case 112:
case 113:
case 114:
case 115:
case 116:
case 117:
case 118:
case 119:
case 120:
case 121:
return TiberiumTypeEnum.Riparius;
case 127:
case 128:
case 129:
case 130:
case 131:
case 132:
case 133:
case 134:
case 135:
case 136:
case 137:
case 138:
case 139:
case 140:
case 141:
case 142:
case 143:
case 144:
case 145:
case 146:
return TiberiumTypeEnum.Cruentus;
case 147:
case 148:
case 149:
case 150:
case 151:
case 152:
case 153:
case 154:
case 155:
case 156:
case 157:
case 158:
case 159:
case 160:
case 161:
case 162:
case 163:
case 164:
case 165:
case 166:
return TiberiumTypeEnum.Aboreus;
default:
return null;
}
}
public TiberiumType TiberiumType { get; set; }
}
}
34 changes: 8 additions & 26 deletions src/TSMapEditor/Models/Rules.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ public void InitFromINI(IniFile iniFile, IInitializer initializer, bool isMapIni
InitFromTypeSection(iniFile, "Weapons", Weapons); // TS CnCNet ts-patches + Vinifera
InitFromTypeSection(iniFile, "WeaponTypes", Weapons); // YR Ares
InitFromTypeSection(iniFile, "SuperWeaponTypes", SuperWeaponTypes);
InitFromTypeSection(iniFile, "Tiberiums", TiberiumTypes);

if (!isMapIni)
{
Expand All @@ -80,12 +81,17 @@ public void InitFromINI(IniFile iniFile, IInitializer initializer, bool isMapIni
SuperWeaponTypes.ForEach(sw => initializer.ReadObjectTypePropertiesFromINI(sw, iniFile));
AnimTypes.ForEach(a => initializer.ReadObjectTypePropertiesFromINI(a, iniFile));
RulesHouseTypes.ForEach(ht => initializer.ReadObjectTypePropertiesFromINI(ht, iniFile));
TiberiumTypes.ForEach(ht => initializer.ReadObjectTypePropertiesFromINI(ht, iniFile));

if (!isMapIni)
InitColors(iniFile);

if (!isMapIni)
InitTiberiums(iniFile);
TiberiumTypes.ForEach(tt =>
{
var rulesColor = Colors.Find(c => c.Name == tt.Color);
if (rulesColor != null)
tt.XNAColor = rulesColor.XNAColor;
});

InitSides(iniFile);

Expand Down Expand Up @@ -128,30 +134,6 @@ private void InitColors(IniFile iniFile)
});
}

private void InitTiberiums(IniFile iniFile)
{
var tiberiumsSection = iniFile.GetSection("Tiberiums");
if (tiberiumsSection != null)
{
for (int i = 0; i < tiberiumsSection.Keys.Count; i++)
{
var kvp = tiberiumsSection.Keys[i];
var tiberiumType = new TiberiumType(kvp.Value, i);

var tiberiumTypeSection = iniFile.GetSection(kvp.Value);
if (tiberiumTypeSection != null)
{
tiberiumType.ReadPropertiesFromIniSection(tiberiumTypeSection);

TiberiumTypes.Add(tiberiumType);
var rulesColor = Colors.Find(c => c.Name == tiberiumType.Color);
if (rulesColor != null)
tiberiumType.XNAColor = rulesColor.XNAColor;
}
}
}
}

private void InitSides(IniFile iniFile)
{
var sidesSection = iniFile.GetSection("Sides");
Expand Down
15 changes: 10 additions & 5 deletions src/TSMapEditor/Models/TiberiumType.cs
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
using Microsoft.Xna.Framework;
using System.Collections.Generic;
using Microsoft.Xna.Framework;

namespace TSMapEditor.Models
{
public class TiberiumType : INIDefineable
public class TiberiumType : INIDefineable, INIDefined
{
public TiberiumType(string iniName, int index)
public TiberiumType(string iniName)
{
ININame = iniName;
Index = index;
}

public string ININame { get; }
public int Index { get; }
public int Index { get; set; }
public string Name { get; set; }
public int Value { get; set; }
public int Power { get; set; }
Expand All @@ -21,6 +21,11 @@ public TiberiumType(string iniName, int index)
public int Spread { get; set; }
public int SpreadPercentage { get; set; }
public string Color { get; set; } = string.Empty;

[INI(false)]
public Color XNAColor { get; set; }

[INI(false)]
public List<OverlayType> Overlays { get; set; } = new List<OverlayType>();
}
}
6 changes: 2 additions & 4 deletions src/TSMapEditor/Rendering/ObjectRenderers/OverlayRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,9 @@ protected override CommonDrawParams GetDrawParams(Overlay gameObject)

protected override void Render(Overlay gameObject, int heightOffset, Point2D drawPoint, in CommonDrawParams drawParams)
{
int tiberiumIndex = gameObject.OverlayType.GetTiberiumIndex(Constants.UseCountries);

Color remapColor = Color.White;
if (tiberiumIndex > -1 && tiberiumIndex < Map.Rules.TiberiumTypes.Count)
remapColor = Map.Rules.TiberiumTypes[tiberiumIndex].XNAColor;
if (gameObject.OverlayType.TiberiumType != null)
remapColor = gameObject.OverlayType.TiberiumType.XNAColor;

int overlayIndex = gameObject.OverlayType.Index;

Expand Down
3 changes: 3 additions & 0 deletions src/TSMapEditor/TSMapEditor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -247,6 +247,9 @@
</None>
<None Update="Config\Theaters.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Config\Tiberiums.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Config\UI\Windows\ScriptsWindow.ini">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,11 +86,10 @@ private int GetTiberiumValue(int startY, int endY, int startX, int endX)
if (cell.Overlay == null || cell.Overlay.OverlayType == null || !cell.Overlay.OverlayType.Tiberium)
continue;

int tiberiumIndex = cell.Overlay.OverlayType.GetTiberiumIndex(Constants.UseCountries);
if (tiberiumIndex > -1)
TiberiumType tiberiumType = cell.Overlay.OverlayType.TiberiumType;
if (tiberiumType != null)
{
int tiberiumTypeValue = Map.Rules.TiberiumTypes[tiberiumIndex].Value;
tiberiumValue += tiberiumTypeValue * (cell.Overlay.FrameIndex + 1);
tiberiumValue += cell.Overlay.FrameIndex * tiberiumType.Value;
}
}
}
Expand Down