diff --git a/src/TSMapEditor/Config/UI/Windows/BasicSectionConfigWindow.ini b/src/TSMapEditor/Config/UI/Windows/BasicSectionConfigWindow.ini index cb3af0110..11d9e1227 100644 --- a/src/TSMapEditor/Config/UI/Windows/BasicSectionConfigWindow.ini +++ b/src/TSMapEditor/Config/UI/Windows/BasicSectionConfigWindow.ini @@ -11,23 +11,27 @@ $CC06=tbPercent:EditorNumberTextBox $CC07=lblPercent:XNALabel $CC08=tbInitialTime:EditorNumberTextBox $CC09=lblInitialTime:XNALabel -$CC10=chkEndOfGame:XNACheckBox -$CC11=chkOneTimeOnly:XNACheckBox -$CC12=chkSkipScore:XNACheckBox -$CC13=chkSkipMapSelect:XNACheckBox -$CC14=chkIgnoreGlobalAITriggers:XNACheckBox +$CC10=tbHomeCell:EditorNumberTextBox +$CC11=lblHomeCell:XNALabel +$CC12=selTheme:EditorPopUpSelector +$CC13=lblTheme:XNALabel +$CC14=chkEndOfGame:XNACheckBox +$CC15=chkOneTimeOnly:XNACheckBox +$CC16=chkSkipScore:XNACheckBox +$CC17=chkSkipMapSelect:XNACheckBox ; Second column -$CC15=chkOfficial:XNACheckBox -$CC16=chkTruckCrate:XNACheckBox -$CC17=chkTrainCrate:XNACheckBox -$CC18=chkMultiplayerOnly:XNACheckBox -$CC19=chkGrowingTiberium:XNACheckBox -$CC20=chkGrowingVeins:XNACheckBox -$CC21=chkGrowingIce:XNACheckBox -$CC22=chkTiberiumDeathToVisceroid:XNACheckBox -$CC23=chkFreeRadar:XNACheckBox -$CC24=chkRequiredAddOn:XNACheckBox -$CC25=btnApply:EditorButton +$CC18=chkIgnoreGlobalAITriggers:XNACheckBox +$CC19=chkOfficial:XNACheckBox +$CC20=chkTruckCrate:XNACheckBox +$CC21=chkTrainCrate:XNACheckBox +$CC22=chkMultiplayerOnly:XNACheckBox +$CC23=chkGrowingTiberium:XNACheckBox +$CC24=chkGrowingVeins:XNACheckBox +$CC25=chkGrowingIce:XNACheckBox +$CC26=chkTiberiumDeathToVisceroid:XNACheckBox +$CC27=chkFreeRadar:XNACheckBox +$CC28=chkRequiredAddOn:XNACheckBox +$CC29=btnApply:EditorButton $Height=getBottom(btnApply) + EMPTY_SPACE_BOTTOM HasCloseButton=true @@ -87,9 +91,29 @@ $X=EMPTY_SPACE_SIDES $Y=getY(tbInitialTime) + 1 Text=Initial time: +[tbHomeCell] +$X=getX(tbName) +$Width=getWidth(tbName) +$Y=getBottom(tbInitialTime) + VERTICAL_SPACING + +[lblHomeCell] +$X=EMPTY_SPACE_SIDES +$Y=getY(tbHomeCell) + 1 +Text=Home Cell: + +[selTheme] +$X=getX(tbName) +$Width=getWidth(tbName) +$Y=getBottom(tbHomeCell) + VERTICAL_SPACING + +[lblTheme] +$X=EMPTY_SPACE_SIDES +$Y=getY(selTheme) + 1 +Text=Theme: + [chkEndOfGame] $X=EMPTY_SPACE_SIDES -$Y=getBottom(tbInitialTime) + VERTICAL_SPACING +$Y=getBottom(selTheme) + VERTICAL_SPACING Text=End of Game [chkOneTimeOnly] @@ -107,62 +131,62 @@ $X=EMPTY_SPACE_SIDES $Y=getBottom(chkSkipScore) + VERTICAL_SPACING Text=Skip Map Select -[chkIgnoreGlobalAITriggers] -$X=EMPTY_SPACE_SIDES -$Y=getBottom(chkSkipMapSelect) + VERTICAL_SPACING -Text=Ignore Global AI Triggers - ; ************* ; Second column ; ************* -[chkOfficial] +[chkIgnoreGlobalAITriggers] $X=EMPTY_SPACE_SIDES + 300 + EMPTY_SPACE_SIDES $Y=getBottom(lblHeader) + EMPTY_SPACE_TOP +Text=Ignore Global AI Triggers + +[chkOfficial] +$X=getX(chkIgnoreGlobalAITriggers) +$Y=getBottom(chkIgnoreGlobalAITriggers) + VERTICAL_SPACING Text=Official [chkTruckCrate] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkOfficial) + VERTICAL_SPACING Text=Crate From Destroyed Trucks [chkTrainCrate] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkTruckCrate) + VERTICAL_SPACING Text=Crate From Destroyed Trains [chkMultiplayerOnly] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkTrainCrate) + VERTICAL_SPACING Text=Multiplayer Only [chkGrowingTiberium] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkMultiplayerOnly) + VERTICAL_SPACING Text=Growing Tiberium [chkGrowingVeins] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkGrowingTiberium) + VERTICAL_SPACING Text=Growing Veins [chkGrowingIce] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkGrowingVeins) + VERTICAL_SPACING Text=Growing Ice [chkTiberiumDeathToVisceroid] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkGrowingIce) + VERTICAL_SPACING Text=Visceroid From Death In Tiberium [chkFreeRadar] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkTiberiumDeathToVisceroid) + VERTICAL_SPACING Text=Free Radar [chkRequiredAddOn] -$X=getX(chkOfficial) +$X=getX(chkIgnoreGlobalAITriggers) $Y=getBottom(chkFreeRadar) + VERTICAL_SPACING Text=Enhanced Mode $Enabled=1 - IS_RA2YR @@ -172,6 +196,6 @@ $Enabled=1 - IS_RA2YR [btnApply] $Width=100 $X=(getWidth(BasicSectionConfigWindow) - getWidth(btnApply)) / 2 -$Y=getBottom(chkIgnoreGlobalAITriggers) + EMPTY_SPACE_TOP +$Y=getBottom(chkSkipMapSelect) + EMPTY_SPACE_TOP Text=Apply diff --git a/src/TSMapEditor/Config/UI/Windows/PlaceWaypointWindow.ini b/src/TSMapEditor/Config/UI/Windows/PlaceWaypointWindow.ini index 604a5a556..a6600dd11 100644 --- a/src/TSMapEditor/Config/UI/Windows/PlaceWaypointWindow.ini +++ b/src/TSMapEditor/Config/UI/Windows/PlaceWaypointWindow.ini @@ -1,6 +1,6 @@ [PlaceWaypointWindow] +$Width=215 $CC0=lblDescription:XNALabel -$Width=getRight(lblDescription) + EMPTY_SPACE_SIDES + 30 $CC1=tbWaypointNumber:EditorNumberTextBox $CC2=lblWaypointColor:XNALabel $CC3=ddWaypointColor:XNADropDown @@ -11,7 +11,7 @@ HasCloseButton=yes [lblDescription] $X=EMPTY_SPACE_SIDES $Y=EMPTY_SPACE_TOP -Text=Input waypoint number (0-99): +Text=Input waypoint number: [tbWaypointNumber] $X=EMPTY_SPACE_SIDES diff --git a/src/TSMapEditor/Models/BasicSection.cs b/src/TSMapEditor/Models/BasicSection.cs index 3bc2d5a42..955f5b67f 100644 --- a/src/TSMapEditor/Models/BasicSection.cs +++ b/src/TSMapEditor/Models/BasicSection.cs @@ -13,6 +13,7 @@ public class BasicSection : INIDefineable public string GameModes { get; set; } public int HomeCell { get; set; } = 98; public int AltHomeCell { get; set; } = 99; + public string Theme { get; set; } public int InitTime { get; set; } public bool Official { get; set; } public bool EndOfGame { get; set; } diff --git a/src/TSMapEditor/Models/Themes.cs b/src/TSMapEditor/Models/Themes.cs index 7fbaeb751..8e2b08393 100644 --- a/src/TSMapEditor/Models/Themes.cs +++ b/src/TSMapEditor/Models/Themes.cs @@ -57,6 +57,11 @@ public Theme Get(string name) return List.Find(theme => theme.Name == name); } + public Theme GetByININame(string iniName) + { + return List.Find(theme => theme.ININame == iniName); + } + private void Initialize(IniFileEx themeIni) { var themes = new List(); diff --git a/src/TSMapEditor/UI/Windows/BasicSectionConfigWindow.cs b/src/TSMapEditor/UI/Windows/BasicSectionConfigWindow.cs index 745643341..11fa40e49 100644 --- a/src/TSMapEditor/UI/Windows/BasicSectionConfigWindow.cs +++ b/src/TSMapEditor/UI/Windows/BasicSectionConfigWindow.cs @@ -1,5 +1,7 @@ using Rampastring.XNAUI; using Rampastring.XNAUI.XNAControls; +using System; +using System.Globalization; using TSMapEditor.Models; using TSMapEditor.UI.Controls; @@ -22,6 +24,8 @@ public BasicSectionConfigWindow(WindowManager windowManager, Map map) : base(win private EditorNumberTextBox tbCarryOverCap; private EditorNumberTextBox tbPercent; private EditorNumberTextBox tbInitialTime; + private EditorNumberTextBox tbHomeCell; + private EditorPopUpSelector selTheme; private XNACheckBox chkEndOfGame; private XNACheckBox chkOneTimeOnly; private XNACheckBox chkSkipScore; @@ -36,8 +40,9 @@ public BasicSectionConfigWindow(WindowManager windowManager, Map map) : base(win private XNACheckBox chkGrowingIce; private XNACheckBox chkTiberiumDeathToVisceroid; private XNACheckBox chkFreeRadar; - private XNACheckBox chkRequiredAddOn; + private XNACheckBox chkRequiredAddOn; + private SelectThemeWindow selectThemeWindow; public override void Initialize() { @@ -49,6 +54,11 @@ public override void Initialize() tbCarryOverCap = FindChild(nameof(tbCarryOverCap)); tbPercent = FindChild(nameof(tbPercent)); tbInitialTime = FindChild(nameof(tbInitialTime)); + + tbHomeCell = FindChild(nameof(tbHomeCell)); + tbHomeCell.MaximumTextLength = (Constants.MaxWaypoint - 1).ToString(CultureInfo.InvariantCulture).Length; + + selTheme = FindChild(nameof(selTheme)); chkEndOfGame = FindChild(nameof(chkEndOfGame)); chkOneTimeOnly = FindChild(nameof(chkOneTimeOnly)); chkSkipScore = FindChild(nameof(chkSkipScore)); @@ -63,7 +73,13 @@ public override void Initialize() chkGrowingIce = FindChild(nameof(chkGrowingIce)); chkTiberiumDeathToVisceroid = FindChild(nameof(chkTiberiumDeathToVisceroid)); chkFreeRadar = FindChild(nameof(chkFreeRadar)); - chkRequiredAddOn = FindChild(nameof(chkRequiredAddOn)); + chkRequiredAddOn = FindChild(nameof(chkRequiredAddOn)); + + selectThemeWindow = new SelectThemeWindow(WindowManager, map, true); + var themeDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, selectThemeWindow); + themeDarkeningPanel.Hidden += ThemeDarkeningPanel_Hidden; + + selTheme.LeftClick += SelTheme_LeftClick; FindChild("btnApply").LeftClick += BtnApply_LeftClick; } @@ -77,6 +93,11 @@ public void Open() tbCarryOverCap.Value = map.Basic.CarryOverCap; tbPercent.Value = map.Basic.Percent; tbInitialTime.Value = map.Basic.InitTime; + tbHomeCell.Value = map.Basic.HomeCell; + + selTheme.Tag = map.Rules.Themes.GetByININame(map.Basic.Theme); + selTheme.Text = selTheme.Tag != null ? selTheme.Tag.ToString() : Constants.NoneValue2; + chkEndOfGame.Checked = map.Basic.EndOfGame; chkOneTimeOnly.Checked = map.Basic.OneTimeOnly; chkSkipScore.Checked = map.Basic.SkipScore; @@ -103,6 +124,8 @@ private void BtnApply_LeftClick(object sender, System.EventArgs e) map.Basic.CarryOverCap = tbCarryOverCap.Value; map.Basic.Percent = tbPercent.Value; map.Basic.InitTime = tbInitialTime.Value; + map.Basic.HomeCell = tbHomeCell.Value; + map.Basic.Theme = selTheme.Tag != null ? ((Theme)selTheme.Tag).ININame : null; map.Basic.EndOfGame = chkEndOfGame.Checked; map.Basic.OneTimeOnly = chkOneTimeOnly.Checked; map.Basic.SkipScore = chkSkipScore.Checked; @@ -122,5 +145,17 @@ private void BtnApply_LeftClick(object sender, System.EventArgs e) map.Basic.RequiredAddOn = chkRequiredAddOn.Checked ? 1 : 0; } } + + private void ThemeDarkeningPanel_Hidden(object sender, EventArgs e) + { + selTheme.Tag = selectThemeWindow.SelectedObject; + selTheme.Text = selTheme.Tag != null ? selectThemeWindow.SelectedObject.ToString() : Constants.NoneValue2; + } + + private void SelTheme_LeftClick(object sender, EventArgs e) + { + Theme theme = (Theme)selTheme.Tag; + selectThemeWindow.Open(theme); + } } } diff --git a/src/TSMapEditor/UI/Windows/PlaceWaypointWindow.cs b/src/TSMapEditor/UI/Windows/PlaceWaypointWindow.cs index 36b054fc6..a88be3d24 100644 --- a/src/TSMapEditor/UI/Windows/PlaceWaypointWindow.cs +++ b/src/TSMapEditor/UI/Windows/PlaceWaypointWindow.cs @@ -24,6 +24,7 @@ public PlaceWaypointWindow(WindowManager windowManager, Map map, MutationManager private readonly IMutationTarget mutationTarget; private EditorNumberTextBox tbWaypointNumber; + private XNALabel lblDescription; private XNADropDown ddWaypointColor; private Point2D cellCoords; @@ -36,6 +37,9 @@ public override void Initialize() tbWaypointNumber = FindChild(nameof(tbWaypointNumber)); tbWaypointNumber.MaximumTextLength = (Constants.MaxWaypoint - 1).ToString(CultureInfo.InvariantCulture).Length; + lblDescription = FindChild(nameof(lblDescription)); + lblDescription.Text = $"Input waypoint number (0-{Constants.MaxWaypoint - 1}):"; + FindChild("btnPlace").LeftClick += BtnPlace_LeftClick; // Init color dropdown options diff --git a/src/TSMapEditor/UI/Windows/SelectThemeWindow.cs b/src/TSMapEditor/UI/Windows/SelectThemeWindow.cs index e4c9bbcd8..0bb998a35 100644 --- a/src/TSMapEditor/UI/Windows/SelectThemeWindow.cs +++ b/src/TSMapEditor/UI/Windows/SelectThemeWindow.cs @@ -7,12 +7,14 @@ namespace TSMapEditor.UI.Windows { public class SelectThemeWindow : SelectObjectWindow { - public SelectThemeWindow(WindowManager windowManager, Map map) : base(windowManager) + public SelectThemeWindow(WindowManager windowManager, Map map, bool includeNone) : base(windowManager) { this.map = map; + this.includeNone = includeNone; } private readonly Map map; + private readonly bool includeNone; public override void Initialize() { @@ -35,6 +37,11 @@ protected override void ListObjects() { lbObjectList.Clear(); + if (includeNone) + { + lbObjectList.AddItem(new XNAListBoxItem() { Text = "None" }); + } + foreach (var theme in map.Rules.Themes.List) { lbObjectList.AddItem(new XNAListBoxItem() { Text = theme.ToString(), Tag = theme }); diff --git a/src/TSMapEditor/UI/Windows/TriggersWindow.cs b/src/TSMapEditor/UI/Windows/TriggersWindow.cs index 1fdecb3d8..33521df34 100644 --- a/src/TSMapEditor/UI/Windows/TriggersWindow.cs +++ b/src/TSMapEditor/UI/Windows/TriggersWindow.cs @@ -277,7 +277,7 @@ public override void Initialize() var tutorialDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, selectTutorialLineWindow); tutorialDarkeningPanel.Hidden += TutorialDarkeningPanel_Hidden; - selectThemeWindow = new SelectThemeWindow(WindowManager, map); + selectThemeWindow = new SelectThemeWindow(WindowManager, map, false); var themeDarkeningPanel = DarkeningPanel.InitializeAndAddToParentControlWithChild(WindowManager, Parent, selectThemeWindow); themeDarkeningPanel.Hidden += ThemeDarkeningPanel_Hidden;