Skip to content

Commit 921a408

Browse files
committed
Refactor trigger owner to be based on a HouseType reference instead of a string
1 parent 6ea73c5 commit 921a408

8 files changed

Lines changed: 46 additions & 19 deletions

File tree

src/TSMapEditor/Config/Scripts/Add Map Reveal Trigger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public void Perform(Map map)
4848
{
4949
var trigger = new Trigger(map.GetNewUniqueInternalId());
5050
trigger.Name = mapRevealTriggerName;
51-
trigger.HouseType = "Neutral";
51+
trigger.HouseType = map.FindHouseType(Constants.DefaultHouseTypeName);
5252

5353
var timeElapsedCondition = new TriggerCondition();
5454
timeElapsedCondition.ConditionIndex = 13;

src/TSMapEditor/Config/Translations/en/Translation_en.ini

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ MapLoader.ReadSmudges.SmudgeOutOfBounds=Smudge at {0},{1} is placed outside of t
8989
MapLoader.ReadOverlays.OverlayIndexOutOfBounds=Ignoring overlay on tile at {0},{1} because it's out of bounds compared to Rules.ini overlay list
9090
MapLoader.ReadWaypoints.InvalidWaypointSyntax=Invalid syntax encountered for waypoint: {0}={1}
9191
MapLoader.ReadWaypoints.WaypointOutOfBounds=Waypoint {0} at {1} was not within the valid map area. It has been moved to {2}.
92+
MapLoader.ReadTriggers.FailedToLoadTrigger=Failed to load trigger {0}! It most likely has a malformed INI format.
93+
MapLoader.ReadTriggers.InvalidHouseTypeForTrigger=Trigger "{0}" had a non-existent HouseType "{1}" as its owner. It has been reset to \"{2}\".
9294
MapLoader.TriggerFix.InvalidTriggerAction=Trigger "{0}" had action "{1}" with invalid value for uncustomizable parameter #{2}: "{3}". It has been automatically corrected to "{4}".
9395
MapLoader.TriggerFix.InvalidTriggerAction=Trigger "{0}" had action "{1}" with invalid value for uncustomizable parameter #{2}: "{3}". It has been automatically corrected to "{4}".
9496
MapLoader.ReadTags.TriggerNotFound=Ignoring tag {0} because its related trigger {1} does not exist!
@@ -136,7 +138,7 @@ Map.CheckForIssues.TriggerEventNoObjectAttached=Trigger '{0}' is using the {1} e
136138
Map.CheckForIssues.TriggerAttachedToSelf=Trigger '{0}' is attached to itself (potentially through other triggers). This will cause the game to crash!
137139
Map.CheckForIssues.InvalidTriggerActionTeamType=Trigger '{0}' has a nonexistent TeamType specified as a parameter for one or more of its actions.
138140
Map.CheckForIssues.InvalidTriggerActionHouse=Trigger '{0}' has a nonexistent HouseType specified as a parameter for one or more of its actions.
139-
Map.CheckForIssues.InvalidTriggerOwner=Trigger '{0}' has a nonexistent HouseType '{1}' specified as its owner.
141+
Map.CheckForIssues.InvalidTriggerOwner=Trigger '{0}' has a nonexistent HouseType specified as its owner.
140142
Map.CheckForIssues.TriggerTooManyActions=Trigger '{0}' has more than {1} actions! This can cause the game to crash! Consider splitting it up to multiple triggers.
141143
Map.CheckForIssues.SpecialWaypointUsed=The map makes use of waypoint #{0}. In Tiberian Sun, this waypoint is reserved for special use cases (WAYPT_SPECIAL). Using it as a normal waypoint may cause issues as it may be dynamically moved by game events.
142144
Map.CheckForAITriggerTeamWithMaxZeroIssue.TeamTypeMax=Team '{0}', linked to AITrigger '{1}', has Max=0. This prevents the AI from building the team.

src/TSMapEditor/Constants.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,8 @@ public static class Constants
123123

124124
public const int TS_WAYPT_SPECIAL = 100;
125125

126+
public const string DefaultHouseTypeName = "Neutral";
127+
126128
public static void Init()
127129
{
128130
const string ConstantsSectionName = "Constants";

src/TSMapEditor/Initialization/MapLoader.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -864,8 +864,20 @@ public static void ReadTriggers(IMap map, IniFile mapIni)
864864
continue;
865865

866866
var trigger = Trigger.ParseTrigger(kvp.Key, kvp.Value);
867-
if (trigger != null)
868-
map.AddTrigger(trigger);
867+
if (trigger == null)
868+
{
869+
AddMapLoadError(string.Format(Translate("MapLoader.ReadTriggers.FailedToLoadTrigger", "Failed to load trigger {0}! It most likely has a malformed INI format."), kvp.Key));
870+
continue;
871+
}
872+
873+
map.AddTrigger(trigger);
874+
trigger.HouseType = map.FindHouseType(trigger.LoadedHouseTypeName);
875+
if (trigger.HouseType == null)
876+
{
877+
trigger.HouseType = map.FindHouseType(Constants.DefaultHouseTypeName);
878+
AddMapLoadError(string.Format(Translate("MapLoader.ReadTriggers.InvalidHouseTypeForTrigger", "Trigger \"{0}\" had a non-existent HouseType \"{1}\" as its owner. It has been reset to \"{2}\"."),
879+
trigger.Name, trigger.LoadedHouseTypeName, trigger.HouseType?.ININame));
880+
}
869881

870882
string actionData = mapIni.GetStringValue("Actions", trigger.ID, null);
871883
trigger.ParseActions(actionData);

src/TSMapEditor/Misc/MapIssueChecker.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -384,10 +384,12 @@ public static List<string> CheckForIssues(Map map)
384384
// Check for triggers having invalid owners
385385
foreach (var trigger in map.Triggers)
386386
{
387-
if (!houseTypes.Exists(ht => trigger.HouseType == ht.ININame))
387+
if (trigger.HouseType == null || map.FindHouseType(trigger.HouseType.ININame) == null)
388+
{
388389
issueList.Add(string.Format(Translate(map, "CheckForIssues.InvalidTriggerOwner",
389-
"Trigger '{0}' has a nonexistent HouseType '{1}' specified as its owner."),
390-
trigger.Name, trigger.HouseType));
390+
"Trigger '{0}' has a nonexistent HouseType as its owner."),
391+
trigger.Name));
392+
}
391393
}
392394

393395
// Check for triggers in SP that have Building Exists event but house belongs to an AI
@@ -397,7 +399,7 @@ public static List<string> CheckForIssues(Map map)
397399
foreach (var trigger in map.Triggers)
398400
{
399401
// Get the house of the trigger
400-
var house = map.Houses.Find(house => house.ININame == trigger.HouseType);
402+
var house = map.Houses.Find(house => house.HouseType == trigger.HouseType);
401403

402404
if (house == null)
403405
continue; // will be reported by the check for invalid owners

src/TSMapEditor/Models/Trigger.cs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,14 @@ public class Trigger : IIDContainer
2323
public void SetInternalID(string id) => ID = id;
2424

2525
public string ID { get; private set; }
26-
public string HouseType { get; set; }
26+
27+
public HouseType HouseType { get; set; }
28+
29+
/// <summary>
30+
/// The name of the trigger's HouseType as loaded from the map.
31+
/// Should not be used for anything after the map has been loaded.
32+
/// </summary>
33+
public string LoadedHouseTypeName { get; private set; }
2734

2835
/// <summary>
2936
/// The linked trigger ID loaded from the map.
@@ -103,8 +110,9 @@ public void WriteToIniFile(IniFile iniFile, EditorConfig editorConfig)
103110
{
104111
// Write entry to [Triggers]
105112
string linkedTriggerId = LinkedTrigger == null ? Constants.NoneValue1 : LinkedTrigger.ID;
113+
string owner = HouseType != null ? HouseType.ININame : Constants.NoneValue1;
106114
iniFile.SetStringValue("Triggers", ID,
107-
$"{HouseType},{linkedTriggerId},{Name}," +
115+
$"{owner},{linkedTriggerId},{Name}," +
108116
$"{Helpers.BoolToIntString(Disabled)}," +
109117
$"{Helpers.BoolToIntString(Easy)},{Helpers.BoolToIntString(Normal)},{Helpers.BoolToIntString(Hard)},0");
110118

@@ -249,7 +257,7 @@ public static Trigger ParseTrigger(string id, string data)
249257

250258
return new Trigger(id)
251259
{
252-
HouseType = parts[0],
260+
LoadedHouseTypeName = parts[0],
253261
LinkedTriggerId = parts[1],
254262
Name = parts[2],
255263
Disabled = Conversions.BooleanFromString(parts[3], false),
@@ -261,7 +269,7 @@ public static Trigger ParseTrigger(string id, string data)
261269

262270
public void Serialize(MemoryStream memoryStream)
263271
{
264-
StreamHelpers.WriteUnicodeString(memoryStream, HouseType);
272+
StreamHelpers.WriteUnicodeString(memoryStream, HouseType != null ? HouseType.ININame : Constants.NoneValue1);
265273
StreamHelpers.WriteUnicodeString(memoryStream, Name);
266274

267275
StreamHelpers.WriteBool(memoryStream, Disabled);
@@ -286,7 +294,7 @@ public void Serialize(MemoryStream memoryStream)
286294

287295
public void Deserialize(MemoryStream memoryStream)
288296
{
289-
HouseType = StreamHelpers.ReadUnicodeString(memoryStream);
297+
LoadedHouseTypeName = StreamHelpers.ReadUnicodeString(memoryStream);
290298
Name = StreamHelpers.ReadUnicodeString(memoryStream);
291299

292300
Disabled = StreamHelpers.ReadBool(memoryStream);
@@ -340,6 +348,7 @@ public static (Trigger, Tag) GetTriggerAndTagFromClipboard(Map map)
340348

341349
var trigger = new Trigger(map.GetNewUniqueInternalId());
342350
trigger.Deserialize(memoryStream);
351+
trigger.HouseType = map.FindHouseType(trigger.LoadedHouseTypeName);
343352

344353
var tag = new Tag();
345354
tag.ID = map.GetNewUniqueInternalId();

src/TSMapEditor/UI/Windows/CreateRandomTriggerSetWindow.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ private Trigger CreateBaseTrigger(string name, int elapsedTime, string color, in
154154

155155
var baseTrigger = new Trigger(map.GetNewUniqueInternalId());
156156
baseTrigger.Name = triggerName;
157-
baseTrigger.HouseType = "Neutral";
157+
baseTrigger.HouseType = map.FindHouseType(Constants.DefaultHouseTypeName);
158158

159159
if (!string.IsNullOrWhiteSpace(color))
160160
{
@@ -203,7 +203,7 @@ private List<Trigger> CreateChildTriggers(string name, int count, int delay, str
203203
{
204204
var childTrigger = new Trigger(map.GetNewUniqueInternalId());
205205
childTrigger.Name = $"{name} {i + 1}";
206-
childTrigger.HouseType = "Neutral";
206+
childTrigger.HouseType = map.FindHouseType(Constants.DefaultHouseTypeName);
207207
childTrigger.Disabled = true;
208208

209209
if (!string.IsNullOrWhiteSpace(color))

src/TSMapEditor/UI/Windows/TriggersWindow.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,7 +1768,7 @@ private void BtnNewTrigger_LeftClick(object sender, EventArgs e)
17681768
{
17691769
map.TriggersChanged -= Map_TriggersChanged;
17701770

1771-
var newTrigger = new Trigger(map.GetNewUniqueInternalId()) { Name = "New trigger", HouseType = "Neutral" };
1771+
var newTrigger = new Trigger(map.GetNewUniqueInternalId()) { Name = "New trigger", HouseType = map.FindHouseType(Constants.DefaultHouseTypeName) };
17721772
map.AddTrigger(newTrigger);
17731773
map.AddTag(new Tag() { ID = map.GetNewUniqueInternalId(), Name = "New tag", Trigger = newTrigger });
17741774
ListTriggers();
@@ -2232,7 +2232,7 @@ public void Open()
22322232
private void RefreshHouses()
22332233
{
22342234
ddHouseType.Items.Clear();
2235-
map.GetHouseTypes().ForEach(ht => ddHouseType.AddItem(ht.ININame, Helpers.GetHouseTypeUITextColor(ht)));
2235+
map.GetHouseTypes().ForEach(ht => ddHouseType.AddItem(new XNADropDownItem() { Text = ht.ININame, TextColor = Helpers.GetHouseTypeUITextColor(ht), Tag = ht }));
22362236
}
22372237

22382238
private void ListTriggers()
@@ -2339,7 +2339,7 @@ private void EditTrigger(Trigger trigger)
23392339
}
23402340

23412341
tbName.Text = editedTrigger.Name;
2342-
ddHouseType.SelectedIndex = map.GetHouseTypes().FindIndex(h => h.ININame == trigger.HouseType);
2342+
ddHouseType.SelectedIndex = map.GetHouseTypes().FindIndex(h => h == trigger.HouseType);
23432343
ddType.SelectedIndex = tag == null ? 3 : tag.Repeating;
23442344
selAttachedTrigger.Text = editedTrigger.LinkedTrigger == null ? Constants.NoneValue1 : editedTrigger.LinkedTrigger.Name;
23452345
selAttachedTrigger.Tag = editedTrigger.LinkedTrigger;
@@ -2419,7 +2419,7 @@ private void DdType_SelectedIndexChanged(object sender, EventArgs e)
24192419

24202420
private void DdHouse_SelectedIndexChanged(object sender, EventArgs e)
24212421
{
2422-
editedTrigger.HouseType = ddHouseType.SelectedItem.Text;
2422+
editedTrigger.HouseType = (HouseType)ddHouseType.SelectedItem.Tag;
24232423
}
24242424

24252425
private void ChkDisabled_CheckedChanged(object sender, EventArgs e)

0 commit comments

Comments
 (0)