From 2f5d467e964b7dfa49e949dfe6ee46efd7d29a7b Mon Sep 17 00:00:00 2001 From: Starkku Date: Wed, 12 Jun 2024 00:16:42 +0300 Subject: [PATCH] Add superweapon selector window and support for superweapon ID parameter type --- .../Windows/SelectSuperWeaponTypeWindow.ini | 34 +++++++++++ .../Models/Enums/TriggerParamType.cs | 1 + src/TSMapEditor/TSMapEditor.csproj | 3 + .../UI/Windows/SelectSuperWeaponTypeWindow.cs | 47 ++++++++++++++++ src/TSMapEditor/UI/Windows/TriggersWindow.cs | 56 ++++++++++++++++--- 5 files changed, 133 insertions(+), 8 deletions(-) create mode 100644 src/TSMapEditor/Config/Default/UI/Windows/SelectSuperWeaponTypeWindow.ini create mode 100644 src/TSMapEditor/UI/Windows/SelectSuperWeaponTypeWindow.cs diff --git a/src/TSMapEditor/Config/Default/UI/Windows/SelectSuperWeaponTypeWindow.ini b/src/TSMapEditor/Config/Default/UI/Windows/SelectSuperWeaponTypeWindow.ini new file mode 100644 index 000000000..8bc3ead47 --- /dev/null +++ b/src/TSMapEditor/Config/Default/UI/Windows/SelectSuperWeaponTypeWindow.ini @@ -0,0 +1,34 @@ +[SelectSuperWeaponTypeWindow] +$Width=400 +$Height=RESOLUTION_HEIGHT - 100 +$CC0=lblDescription:XNALabel +$CC1=tbSearch:EditorSuggestionTextBox +$CC2=btnSelect:EditorButton +$CC3=lbObjectList:EditorListBox +HasCloseButton=true + + +[lblDescription] +$X=EMPTY_SPACE_SIDES +$Y=EMPTY_SPACE_TOP +FontIndex=1 +Text=Select SuperWeapon: + +[tbSearch] +$X=EMPTY_SPACE_SIDES +$Y=getBottom(lblDescription) + EMPTY_SPACE_TOP +$Width=getWidth(SelectSuperWeaponTypeWindow) - (EMPTY_SPACE_SIDES * 2) +Suggestion=Search SuperWeapon... + +[btnSelect] +$Width=100 +$X=(getWidth(SelectSuperWeaponTypeWindow) - getWidth(btnSelect)) / 2 +$Y=getHeight(SelectSuperWeaponTypeWindow) - EMPTY_SPACE_BOTTOM - getHeight(btnSelect) +Text=Select + +[lbObjectList] +$X=EMPTY_SPACE_SIDES +$Y=getBottom(tbSearch) + VERTICAL_SPACING +$Width=getWidth(tbSearch) +$Height=getY(btnSelect) - getY(lbObjectList) - EMPTY_SPACE_TOP + diff --git a/src/TSMapEditor/Models/Enums/TriggerParamType.cs b/src/TSMapEditor/Models/Enums/TriggerParamType.cs index bdda457d1..d80df7ff6 100644 --- a/src/TSMapEditor/Models/Enums/TriggerParamType.cs +++ b/src/TSMapEditor/Models/Enums/TriggerParamType.cs @@ -25,6 +25,7 @@ public enum TriggerParamType Theme, Speech, SuperWeapon, + SuperWeaponName, Animation, ParticleSystem, Waypoint, diff --git a/src/TSMapEditor/TSMapEditor.csproj b/src/TSMapEditor/TSMapEditor.csproj index 4ab667e65..548a2902f 100644 --- a/src/TSMapEditor/TSMapEditor.csproj +++ b/src/TSMapEditor/TSMapEditor.csproj @@ -231,6 +231,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/TSMapEditor/UI/Windows/SelectSuperWeaponTypeWindow.cs b/src/TSMapEditor/UI/Windows/SelectSuperWeaponTypeWindow.cs new file mode 100644 index 000000000..1f8c1c42f --- /dev/null +++ b/src/TSMapEditor/UI/Windows/SelectSuperWeaponTypeWindow.cs @@ -0,0 +1,47 @@ +using Rampastring.XNAUI; +using Rampastring.XNAUI.XNAControls; +using System; +using TSMapEditor.Models; + +namespace TSMapEditor.UI.Windows +{ + public class SelectSuperWeaponTypeWindow : SelectObjectWindow + { + public SelectSuperWeaponTypeWindow(WindowManager windowManager, Map map) : base(windowManager) + { + this.map = map; + } + + private readonly Map map; + public bool UseININameAsValue { get; set; } + + public override void Initialize() + { + Name = nameof(SelectSuperWeaponTypeWindow); + base.Initialize(); + } + + protected override void LbObjectList_SelectedIndexChanged(object sender, EventArgs e) + { + if (lbObjectList.SelectedItem == null) + { + SelectedObject = null; + return; + } + + SelectedObject = (SuperWeaponType)lbObjectList.SelectedItem.Tag; + } + + protected override void ListObjects() + { + lbObjectList.Clear(); + + foreach (var swType in map.Rules.SuperWeaponTypes) + { + lbObjectList.AddItem(new XNAListBoxItem() { Text = swType.GetDisplayString(), Tag = swType }); + if (swType == SelectedObject) + lbObjectList.SelectedIndex = lbObjectList.Items.Count - 1; + } + } + } +} diff --git a/src/TSMapEditor/UI/Windows/TriggersWindow.cs b/src/TSMapEditor/UI/Windows/TriggersWindow.cs index 066afa6d8..6621d6d46 100644 --- a/src/TSMapEditor/UI/Windows/TriggersWindow.cs +++ b/src/TSMapEditor/UI/Windows/TriggersWindow.cs @@ -102,6 +102,7 @@ public TriggersWindow(WindowManager windowManager, Map map, EditorState editorSt private SelectStringWindow selectStringWindow; private SelectSpeechWindow selectSpeechWindow; private SelectSoundWindow selectSoundWindow; + private SelectSuperWeaponTypeWindow selectSuperWeaponTypeWindow; private SelectParticleSystemTypeWindow selectParticleSystemTypeWindow; private CreateRandomTriggerSetWindow createRandomTriggerSetWindow; @@ -307,6 +308,10 @@ public override void Initialize() var particleSystemTypeDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, selectParticleSystemTypeWindow); particleSystemTypeDarkeningPanel.Hidden += ParticleSystemTypeDarkeningPanel_Hidden; + selectSuperWeaponTypeWindow = new SelectSuperWeaponTypeWindow(WindowManager, map); + var swDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, selectSuperWeaponTypeWindow); + swDarkeningPanel.Hidden += SuperWeaponDarkeningPanel_Hidden; + createRandomTriggerSetWindow = new CreateRandomTriggerSetWindow(WindowManager, map); var createRandomTriggersSetDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, createRandomTriggerSetWindow); createRandomTriggerSetWindow.RandomTriggerSetTriggersCreated += CreateRandomTriggerSetWindow_RandomTriggersSetCreated; @@ -937,10 +942,17 @@ private void BtnEventParameterValuePreset_LeftClick(object sender, EventArgs e) ctxEventParameterPresetValues.Open(GetCursorPoint()); break; case TriggerParamType.SuperWeapon: - ctxEventParameterPresetValues.ClearItems(); - ctxEventParameterPresetValues.Width = 250; - map.Rules.SuperWeaponTypes.ForEach(sw => ctxEventParameterPresetValues.AddItem(sw.GetDisplayString())); - ctxEventParameterPresetValues.Open(GetCursorPoint()); + int swTypeIndex = Conversions.IntFromString(triggerEvent.Parameters[paramIndex], -1); + selectSuperWeaponTypeWindow.IsForEvent = true; + selectSuperWeaponTypeWindow.UseININameAsValue = false; + if (swTypeIndex > -1 && swTypeIndex < map.Rules.SuperWeaponTypes.Count) + selectSuperWeaponTypeWindow.Open(map.Rules.SuperWeaponTypes[swTypeIndex]); + break; + case TriggerParamType.SuperWeaponName: + string swTypeID = triggerEvent.Parameters[paramIndex]; + selectSuperWeaponTypeWindow.IsForEvent = true; + selectSuperWeaponTypeWindow.UseININameAsValue = true; + selectSuperWeaponTypeWindow.Open(map.Rules.SuperWeaponTypes.Find(swType => swType.ININame.Equals(swTypeID, StringComparison.Ordinal))); break; case TriggerParamType.TeamType: TeamType existingTeamType = map.TeamTypes.Find(tt => tt.ININame == triggerEvent.Parameters[paramIndex]); @@ -1058,10 +1070,18 @@ private void BtnActionParameterValuePreset_LeftClick(object sender, EventArgs e) selectStringWindow.Open(existingString); break; case TriggerParamType.SuperWeapon: - ctxActionParameterPresetValues.ClearItems(); - ctxActionParameterPresetValues.Width = 250; - map.Rules.SuperWeaponTypes.ForEach(sw => ctxActionParameterPresetValues.AddItem(sw.GetDisplayString())); - ctxActionParameterPresetValues.Open(GetCursorPoint()); + int swTypeIndex = Conversions.IntFromString(triggerAction.Parameters[paramIndex], -1); + selectSuperWeaponTypeWindow.IsForEvent = false; + selectSuperWeaponTypeWindow.UseININameAsValue = false; + if (swTypeIndex > -1 && swTypeIndex < map.Rules.SuperWeaponTypes.Count) + selectSuperWeaponTypeWindow.Open(map.Rules.SuperWeaponTypes[swTypeIndex]); + break; + case TriggerParamType.SuperWeaponName: + string swTypeID = triggerAction.Parameters[paramIndex]; + selectSuperWeaponTypeWindow.IsForEvent = false; + selectSuperWeaponTypeWindow.UseININameAsValue = true; + if (!string.IsNullOrEmpty(swTypeID)) + selectSuperWeaponTypeWindow.Open(map.Rules.SuperWeaponTypes.Find(swType => swType.ININame.Equals(swTypeID, StringComparison.Ordinal))); break; case TriggerParamType.ParticleSystem: ParticleSystemType existingParticleSystemType = map.Rules.ParticleSystemTypes.Find(pst => pst.Index == Conversions.IntFromString(triggerAction.Parameters[paramIndex], -1)); @@ -1272,6 +1292,19 @@ private void ParticleSystemTypeDarkeningPanel_Hidden(object sender, EventArgs e) AssignParamValue(selectParticleSystemTypeWindow.IsForEvent, selectParticleSystemTypeWindow.SelectedObject.Index); } + private void SuperWeaponDarkeningPanel_Hidden(object sender, EventArgs e) + { + if (selectSuperWeaponTypeWindow.SelectedObject == null) + return; + + var swType = selectSuperWeaponTypeWindow.SelectedObject; + + if (selectSuperWeaponTypeWindow.UseININameAsValue) + AssignParamValue(selectSuperWeaponTypeWindow.IsForEvent, swType.ININame); + else + AssignParamValue(selectSuperWeaponTypeWindow.IsForEvent, swType.Index); + } + private void AssignParamValue(bool isForEvent, int paramValue) { if (isForEvent) @@ -2252,6 +2285,13 @@ private string GetParamValueText(string paramValue, TriggerParamType paramType, return intValue + " - nonexistent super weapon"; return intValue + " " + map.Rules.SuperWeaponTypes[intValue].GetDisplayStringWithoutIndex(); + case TriggerParamType.SuperWeaponName: + var swType = map.Rules.SuperWeaponTypes.Find(sw => sw.ININame.Equals(paramValue, StringComparison.Ordinal)); + + if (swType == null) + return paramValue; + + return swType.GetDisplayStringWithoutIndex(); case TriggerParamType.ParticleSystem: if (!intParseSuccess) return paramValue;