Add a tab to the credits panel for mod-specific text.
Enabled by adding a ModCredits block to mod.yaml.
This commit is contained in:
21
OpenRA.Mods.Common/ModCredits.cs
Normal file
21
OpenRA.Mods.Common/ModCredits.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#region Copyright & License Information
|
||||||
|
/*
|
||||||
|
* Copyright 2007-2018 The OpenRA Developers (see AUTHORS)
|
||||||
|
* This file is part of OpenRA, which is free software. It is made
|
||||||
|
* available to you under the terms of the GNU General Public License
|
||||||
|
* as published by the Free Software Foundation, either version 3 of
|
||||||
|
* the License, or (at your option) any later version. For more
|
||||||
|
* information, see COPYING.
|
||||||
|
*/
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
namespace OpenRA
|
||||||
|
{
|
||||||
|
public class ModCredits : IGlobalModData
|
||||||
|
{
|
||||||
|
public readonly string ModTabTitle = "Game";
|
||||||
|
|
||||||
|
[FieldLoader.Require]
|
||||||
|
public readonly string ModCreditsFile = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -882,6 +882,7 @@
|
|||||||
<Compile Include="UpdateRules\Rules\RenameEmitInfantryOnSell.cs" />
|
<Compile Include="UpdateRules\Rules\RenameEmitInfantryOnSell.cs" />
|
||||||
<Compile Include="Traits\Render\WithBuildingRepairDecoration.cs" />
|
<Compile Include="Traits\Render\WithBuildingRepairDecoration.cs" />
|
||||||
<Compile Include="UpdateRules\Rules\SplitRepairDecoration.cs" />
|
<Compile Include="UpdateRules\Rules\SplitRepairDecoration.cs" />
|
||||||
|
<Compile Include="ModCredits.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
<Target Name="AfterBuild">
|
<Target Name="AfterBuild">
|
||||||
|
|||||||
@@ -11,15 +11,27 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using OpenRA.Widgets;
|
using OpenRA.Widgets;
|
||||||
|
|
||||||
namespace OpenRA.Mods.Common.Widgets.Logic
|
namespace OpenRA.Mods.Common.Widgets.Logic
|
||||||
{
|
{
|
||||||
public class CreditsLogic : ChromeLogic
|
public class CreditsLogic : ChromeLogic
|
||||||
{
|
{
|
||||||
|
readonly ModData modData;
|
||||||
|
readonly ScrollPanelWidget scrollPanel;
|
||||||
|
readonly LabelWidget template;
|
||||||
|
|
||||||
|
readonly IEnumerable<string> modLines;
|
||||||
|
readonly IEnumerable<string> engineLines;
|
||||||
|
bool showMod = false;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public CreditsLogic(Widget widget, ModData modData, Action onExit)
|
public CreditsLogic(Widget widget, ModData modData, Action onExit)
|
||||||
{
|
{
|
||||||
|
this.modData = modData;
|
||||||
|
|
||||||
var panel = widget.Get("CREDITS_PANEL");
|
var panel = widget.Get("CREDITS_PANEL");
|
||||||
|
|
||||||
panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
|
panel.Get<ButtonWidget>("BACK_BUTTON").OnClick = () =>
|
||||||
@@ -28,19 +40,55 @@ namespace OpenRA.Mods.Common.Widgets.Logic
|
|||||||
onExit();
|
onExit();
|
||||||
};
|
};
|
||||||
|
|
||||||
var scrollPanel = panel.Get<ScrollPanelWidget>("CREDITS_DISPLAY");
|
engineLines = ParseLines("AUTHORS");
|
||||||
var template = scrollPanel.Get<LabelWidget>("CREDITS_TEMPLATE");
|
|
||||||
scrollPanel.RemoveChildren();
|
|
||||||
|
|
||||||
var lines = modData.DefaultFileSystem.Open("AUTHORS").ReadAllLines();
|
var tabContainer = panel.Get("TAB_CONTAINER");
|
||||||
foreach (var l in lines)
|
var modTab = tabContainer.Get<ButtonWidget>("MOD_TAB");
|
||||||
|
modTab.IsHighlighted = () => showMod;
|
||||||
|
modTab.OnClick = () => ShowCredits(true);
|
||||||
|
|
||||||
|
var engineTab = tabContainer.Get<ButtonWidget>("ENGINE_TAB");
|
||||||
|
engineTab.IsHighlighted = () => !showMod;
|
||||||
|
engineTab.OnClick = () => ShowCredits(false);
|
||||||
|
|
||||||
|
scrollPanel = panel.Get<ScrollPanelWidget>("CREDITS_DISPLAY");
|
||||||
|
template = scrollPanel.Get<LabelWidget>("CREDITS_TEMPLATE");
|
||||||
|
|
||||||
|
var hasModCredits = modData.Manifest.Contains<ModCredits>();
|
||||||
|
if (hasModCredits)
|
||||||
|
{
|
||||||
|
var modCredits = modData.Manifest.Get<ModCredits>();
|
||||||
|
modLines = ParseLines(modCredits.ModCreditsFile);
|
||||||
|
modTab.GetText = () => modCredits.ModTabTitle;
|
||||||
|
|
||||||
|
// Make space to show the tabs
|
||||||
|
tabContainer.IsVisible = () => true;
|
||||||
|
scrollPanel.Bounds.Y += tabContainer.Bounds.Height;
|
||||||
|
scrollPanel.Bounds.Height -= tabContainer.Bounds.Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
ShowCredits(hasModCredits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ShowCredits(bool modCredits)
|
||||||
|
{
|
||||||
|
showMod = modCredits;
|
||||||
|
|
||||||
|
scrollPanel.RemoveChildren();
|
||||||
|
foreach (var line in showMod ? modLines : engineLines)
|
||||||
{
|
{
|
||||||
// Improve the formatting
|
|
||||||
var line = l.Replace("\t", " ").Replace("*", "\u2022");
|
|
||||||
var label = template.Clone() as LabelWidget;
|
var label = template.Clone() as LabelWidget;
|
||||||
label.GetText = () => line;
|
label.GetText = () => line;
|
||||||
scrollPanel.AddChild(label);
|
scrollPanel.AddChild(label);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IEnumerable<string> ParseLines(string file)
|
||||||
|
{
|
||||||
|
return modData.DefaultFileSystem.Open(file)
|
||||||
|
.ReadAllLines()
|
||||||
|
.Select(l => l.Replace("\t", " ").Replace("*", "\u2022"))
|
||||||
|
.ToList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,15 +17,31 @@ Container@CREDITS_PANEL:
|
|||||||
Height: 400
|
Height: 400
|
||||||
Background: panel-black
|
Background: panel-black
|
||||||
Children:
|
Children:
|
||||||
|
Container@TAB_CONTAINER:
|
||||||
|
Visible: False
|
||||||
|
X: 15
|
||||||
|
Y: 15
|
||||||
|
Width: PARENT_RIGHT - 30
|
||||||
|
Height: 34
|
||||||
|
Children:
|
||||||
|
Button@MOD_TAB:
|
||||||
|
Width: 140
|
||||||
|
Height: 35
|
||||||
|
Button@ENGINE_TAB:
|
||||||
|
X: 150
|
||||||
|
Width: 140
|
||||||
|
Height: 35
|
||||||
|
Text: OpenRA
|
||||||
ScrollPanel@CREDITS_DISPLAY:
|
ScrollPanel@CREDITS_DISPLAY:
|
||||||
X: 15
|
X: 15
|
||||||
Y: 15
|
Y: 15
|
||||||
Width: PARENT_RIGHT - 30
|
Width: PARENT_RIGHT - 30
|
||||||
Height: PARENT_BOTTOM - 30
|
Height: PARENT_BOTTOM - 30
|
||||||
TopBottomSpacing: 18
|
TopBottomSpacing: 6
|
||||||
Children:
|
Children:
|
||||||
Label@CREDITS_TEMPLATE:
|
Label@CREDITS_TEMPLATE:
|
||||||
X: 8
|
X: 8
|
||||||
|
Width: PARENT_RIGHT - 25
|
||||||
Height: 16
|
Height: 16
|
||||||
VAlign: Top
|
VAlign: Top
|
||||||
Button@BACK_BUTTON:
|
Button@BACK_BUTTON:
|
||||||
|
|||||||
@@ -12,15 +12,33 @@ Background@CREDITS_PANEL:
|
|||||||
Font: Bold
|
Font: Bold
|
||||||
Align: Center
|
Align: Center
|
||||||
Text: Credits
|
Text: Credits
|
||||||
|
Container@TAB_CONTAINER:
|
||||||
|
Visible: False
|
||||||
|
X: 15
|
||||||
|
Y: 50
|
||||||
|
Width: PARENT_RIGHT - 30
|
||||||
|
Height: 30
|
||||||
|
Children:
|
||||||
|
Button@MOD_TAB:
|
||||||
|
Width: 140
|
||||||
|
Height: 31
|
||||||
|
Font: Bold
|
||||||
|
Button@ENGINE_TAB:
|
||||||
|
X: 140
|
||||||
|
Width: 140
|
||||||
|
Height: 31
|
||||||
|
Text: OpenRA
|
||||||
|
Font: Bold
|
||||||
ScrollPanel@CREDITS_DISPLAY:
|
ScrollPanel@CREDITS_DISPLAY:
|
||||||
X: 15
|
X: 15
|
||||||
Y: 50
|
Y: 50
|
||||||
Width: PARENT_RIGHT - 30
|
Width: PARENT_RIGHT - 30
|
||||||
Height: 345
|
Height: 345
|
||||||
TopBottomSpacing: 18
|
TopBottomSpacing: 6
|
||||||
Children:
|
Children:
|
||||||
Label@CREDITS_TEMPLATE:
|
Label@CREDITS_TEMPLATE:
|
||||||
X: 8
|
X: 8
|
||||||
|
Width: PARENT_RIGHT - 25
|
||||||
Height: 16
|
Height: 16
|
||||||
VAlign: Top
|
VAlign: Top
|
||||||
Button@BACK_BUTTON:
|
Button@BACK_BUTTON:
|
||||||
|
|||||||
Reference in New Issue
Block a user