Reorganize mission menu and separate design from logic
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-10-17 18:27:31 +02:00
parent 0e71ef1fa7
commit d5464f7438
52 changed files with 2596 additions and 716 deletions
+2
View File
@@ -10,6 +10,8 @@ steps:
image: python:3.13-alpine image: python:3.13-alpine
commands: commands:
- apk add --no-cache git - apk add --no-cache git
- python tools/build_admin_menu.py --check
- python -m unittest discover -s tests -p test_admin_menu_sources.py
- python -m unittest discover -s tests -p test_discord_changelog_ci.py - python -m unittest discover -s tests -p test_discord_changelog_ci.py
- python -m unittest discover -s tests -p test_workshop_changelog.py - python -m unittest discover -s tests -p test_workshop_changelog.py
+5 -1
View File
@@ -1,6 +1,10 @@
# Changelog # Changelog
Latest published Workshop version: **0.0.110** Latest published Workshop version: **0.0.111**
## 2026-10-17 — Mission menu navigation
- Reorganized the mission menu with main tabs across the top and related submenus on the left.
## 2026-10-17 — Configurable Šárka hunters ## 2026-10-17 — Configurable Šárka hunters
+5
View File
@@ -39,6 +39,11 @@ Scripts are organized under `addons/core/Scripts/Game/ERR/`:
The prefixes preserve Enforce script extension order. All modules load together. The prefixes preserve Enforce script extension order. All modules load together.
Resources retain their existing paths and GUIDs within the combined project. Resources retain their existing paths and GUIDs within the combined project.
Menu appearance and navigation are maintained in [ui/admin_menu](ui/admin_menu/README.md):
one theme, a navigation manifest, and separate page layouts. Run
`python3 tools/build_admin_menu.py` after changing those sources; the generated
native layouts remain in the addon for Workbench and publishing.
Register only this project and its external dependencies in Workbench. Remove stale Register only this project and its external dependencies in Workbench. Remove stale
AI/Intel/Map/Chat project entries if you previously added them. RHS: Status Quo, AI/Intel/Map/Chat project entries if you previously added them. RHS: Status Quo,
WCS Armaments and WCS BMP-1 (including their dependencies) remain separate, WCS Armaments and WCS BMP-1 (including their dependencies) remain separate,
@@ -3,93 +3,6 @@ modded enum ChimeraMenuPreset
ERR_AdminPanel ERR_AdminPanel
} }
// Presentation rules only: all mutations still use the authenticated command service.
class ERR_AdminMenuFields
{
static array<string> Keys()
{
return {"aiDoctrine", "aiShadow", "automaticEquipmentChancePercent", "sarkaCarsPerAnger", "motorbikeCount", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "civilianTrafficCount", "emptyRestartHours", "startMode", "radioDefenceSeconds", "aiIntelChancePercent", "intelRevealChancePercent", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "convoyCount", "antiAirChancePercent", "antiPersonnelMineChancePercent", "heliTimerMinutes"};
}
static bool Available(string key, bool hq, bool intel)
{
if (key == "aiDoctrine" || key == "aiShadow") return hq;
if (key == "sarkaCarsPerAnger") return hq;
if (key == "aiIntelChancePercent") return intel;
if (key == "automaticEquipmentChancePercent" || key == "motorbikeCount" || key == "planeAltitudeMetres" || key == "planeReplacementSeconds" || key == "planeSectorSeconds" || key == "planeReconEnabled" || key == "objectGuardCount" || key == "objectGuardEvery" || key == "objectGuardHQMode" || key == "hunterSpawnDistanceMetres" || key == "heliTimerMinutes" || key == "antiAirChancePercent" || key == "antiPersonnelMineChancePercent" || key == "convoyCount" || key == "reportIntervalSeconds" || key == "supportSquadLimit" || key == "responseRadiusMetres") return hq;
return Keys().Contains(key);
}
// A short journal has no older off-screen lines, even if its slider is zero.
static bool FollowJournal(bool empty, float slider, float height, float viewHeight, bool latest)
{
return latest || empty || slider >= 0.98 || height <= viewHeight;
}
// TextWidget interprets hash-prefixed tokens as localization IDs. Keep the
// server audit and retained entries intact; render their numeric IDs literally.
static string JournalText(string line, bool details = false)
{
return ERR_JournalText.Menu(line, details);
}
static string Display(string key, string value)
{
if (key == "aiDoctrine") { if (value == "1") return "Coordinated"; return "Current"; }
if (key == "aiShadow") { if (value == "1") return "On"; return "Off"; }
if (value == "-1" || value == "-2") return ERR_Settings.SelectionText(value.ToInt());
if (key == "startMode") { if (value == "1") return "Crash"; return "Prison"; }
if (key == "startTimeMinutes") return ERR_TimeService.Clock(value.ToInt());
if (key == "startDateCode") return ERR_EnvironmentService.Date(value.ToInt());
if (key == "weatherProfile") return ERR_EnvironmentService.ProfileName(value.ToInt());
if (key == "viewDistanceMetres" && value == "0") return "default";
return value;
}
static string StartSummary(int saved, int current)
{
return "Next start: " + Display("startMode", saved.ToString()) + " | Current round: " + Display("startMode", current.ToString());
}
static string Command(string key, string value)
{
string prefix;
if (key == "aiDoctrine") prefix = "mission doctrine";
else if (key == "aiShadow") prefix = "mission aishadow";
else if (key == "automaticEquipmentChancePercent") prefix = "hq equipment";
else if (key == "sarkaCarsPerAnger") prefix = "mission sarkacars";
else if (key == "motorbikeCount") prefix = "mission motorbikes";
else if (key == "planeReconEnabled") prefix = "mission plane";
else if (key == "planeAltitudeMetres") prefix = "mission planealtitude";
else if (key == "planeReplacementSeconds") prefix = "mission planereplacement";
else if (key == "planeSectorSeconds") prefix = "mission planesector";
else if (key == "startWeaponCount") prefix = "mission startweapons";
else if (key == "startMagazineCount") prefix = "mission startammo";
else if (key == "objectGuardEvery") prefix = "mission objectevery";
else if (key == "objectGuardHQMode") prefix = "mission objecthq";
else if (key == "objectGuardCount") prefix = "mission objectguards";
else if (key == "hunterSpawnDistanceMetres") prefix = "mission hunterdistance";
else if (key == "fieldCampCount") prefix = "mission camps";
else if (key == "fieldHospitalCount") prefix = "mission hospitals";
else if (key == "roadblockCount") prefix = "mission roadblocks";
else if (key == "emptyRestartHours") prefix = "mission emptyhours";
else if (key == "civilianTrafficCount") prefix = "mission traffic";
else if (key == "startMode") prefix = "mission start";
else if (key == "radioDefenceSeconds") prefix = "mission radio";
else if (key == "aiIntelChancePercent") prefix = "intel carrying";
else if (key == "intelRevealChancePercent") prefix = "intel reveal";
else if (key == "startTimeMinutes") prefix = "mission time";
else if (key == "timeMultiplier") prefix = "mission speed";
else if (key == "startDateCode") prefix = "mission date";
else if (key == "weatherProfile") prefix = "mission weather";
else if (key == "viewDistanceMetres") prefix = "mission viewdistance";
else if (key == "reportIntervalSeconds") prefix = "hq interval";
else if (key == "supportSquadLimit") prefix = "hq squads";
else if (key == "responseRadiusMetres") prefix = "hq radius";
else if (key == "antiAirChancePercent") prefix = "hq aa";
else if (key == "antiPersonnelMineChancePercent") prefix = "hq mines";
else if (key == "heliTimerMinutes") prefix = "hq heli timer";
else if (key == "convoyCount") prefix = "hq convoy count";
value = value.Trim();
if (prefix.IsEmpty() || value.IsEmpty() || value.Length() > 32) return "";
return prefix + " set " + value;
}
}
// Own mission dialog. ChimeraMenuBase owns focus, cursor and input-context lifetime. // Own mission dialog. ChimeraMenuBase owns focus, cursor and input-context lifetime.
class ERR_AdminMenu : ChimeraMenuBase class ERR_AdminMenu : ChimeraMenuBase
{ {
@@ -133,17 +46,9 @@ class ERR_AdminMenu : ChimeraMenuBase
m_Controller = SCR_PlayerController.Cast(GetGame().GetPlayerController()); m_Controller = SCR_PlayerController.Cast(GetGame().GetPlayerController());
m_Mode = ERR_GameMode.Cast(GetGame().GetGameMode()); m_Mode = ERR_GameMode.Cast(GetGame().GetGameMode());
if (!m_Controller) { Close(); return; } if (!m_Controller) { Close(); return; }
array<string> names = {"PlaneOn", "PlaneOff", "Close", "OpenSettings", "OpenWorld", "OpenFactions", "OpenHQ", "OpenJournal", "PauseJournal", "JournalDetails", "LatestJournal", "KeepWeaponOn", "KeepWeaponOff", "SelfEpiOn", "SelfEpiOff", "IntelSummary", "RerollIntel", "OpenMods", "OpenIntel", "OpenStatus", "OpenTerrains", "OpenItems", "OpenTTS"}; array<string> names = {"PlaneOn", "PlaneOff", "Close", "PauseJournal", "JournalDetails", "LatestJournal", "KeepWeaponOn", "KeepWeaponOff", "SelfEpiOn", "SelfEpiOff", "IntelSummary", "RerollIntel", "RandomDay_startTimeMinutes", "Default_viewDistanceMetres", "RestartEmptyOn", "RestartEmptyOff", "RecommendedPlane", "RecommendedWeapons"};
names.Insert("RandomDay_startTimeMinutes"); foreach (string mainButton : ERR_AdminMenuPages.MainButtons()) names.Insert(mainButton);
names.Insert("Default_viewDistanceMetres"); foreach (string pageButton : Navigation()) names.Insert(pageButton);
names.Insert("OpenForces");
names.Insert("OpenSarka"); names.Insert("SarkaBack");
names.Insert("RestartEmptyOn"); names.Insert("RestartEmptyOff");
names.Insert("OpenGuards"); names.Insert("GuardsBack");
names.Insert("OpenSites"); names.Insert("SitesBack");
names.Insert("OpenPlane"); names.Insert("PlaneBack");
names.Insert("OpenAI"); names.Insert("AIBack");
names.Insert("OpenStarter"); names.Insert("EquipmentOverview"); names.Insert("OpenAllowedItems"); names.Insert("OpenItemPresets"); names.Insert("OpenWeights"); names.Insert("OpenRecommendations"); names.Insert("RecommendationsBack"); names.Insert("RecommendedPlane"); names.Insert("RecommendedWeapons");
for (int density = 1; density <= 4; density++) names.Insert("GuardEvery_" + density.ToString()); for (int density = 1; density <= 4; density++) names.Insert("GuardEvery_" + density.ToString());
for (int policy = 0; policy <= 2; policy++) names.Insert("GuardHQ_" + policy.ToString()); for (int policy = 0; policy <= 2; policy++) names.Insert("GuardHQ_" + policy.ToString());
foreach (string key : ERR_AdminMenuFields.Keys()) foreach (string key : ERR_AdminMenuFields.Keys())
@@ -167,7 +72,7 @@ class ERR_AdminMenu : ChimeraMenuBase
m_Ready = false; m_Age = 0; m_Poll = 0; m_Ready = false; m_Age = 0; m_Poll = 0;
GetGame().GetInputManager().AddActionListener(UIConstants.MENU_ACTION_BACK, EActionTrigger.PRESSED, OnBack); GetGame().GetInputManager().AddActionListener(UIConstants.MENU_ACTION_BACK, EActionTrigger.PRESSED, OnBack);
m_Bound = true; m_Bound = true;
ShowPage(0); ShowPage(ERR_AdminPage.MISSION);
UpdateActions(); UpdateActions();
RequestSnapshot(); RequestSnapshot();
} }
@@ -194,7 +99,7 @@ class ERR_AdminMenu : ChimeraMenuBase
UpdateActions(); UpdateActions();
} }
if (IsFocused() && m_Poll >= 2) RequestSnapshot(); if (IsFocused() && m_Poll >= 2) RequestSnapshot();
if (m_Page != 2) return; if (m_Page != ERR_AdminPage.JOURNAL) return;
m_LogPoll += tDelta; m_LogPoll += tDelta;
if (m_LogPending && m_LogPoll > 5) m_LogPending = false; if (m_LogPending && m_LogPoll > 5) m_LogPending = false;
if (IsFocused() && m_Ready && m_HQ && !m_LogPaused && !m_LogPending && m_LogPoll >= 1) if (IsFocused() && m_Ready && m_HQ && !m_LogPaused && !m_LogPending && m_LogPoll >= 1)
@@ -230,7 +135,7 @@ class ERR_AdminMenu : ChimeraMenuBase
SCR_EditBoxComponent edit = SCR_EditBoxComponent.GetEditBoxComponent(key, GetRootWidget()); SCR_EditBoxComponent edit = SCR_EditBoxComponent.GetEditBoxComponent(key, GetRootWidget());
if (edit && edit.IsInWriteMode()) return; if (edit && edit.IsInWriteMode()) return;
} }
if (m_Page != 0) ShowPage(0); if (m_Page != ERR_AdminPage.MISSION) ShowPage(ERR_AdminPage.MISSION);
else Close(); else Close();
} }
protected void SetText(string name, string value) protected void SetText(string name, string value)
@@ -238,26 +143,14 @@ class ERR_AdminMenu : ChimeraMenuBase
TextWidget widget = TextWidget.Cast(GetRootWidget().FindAnyWidget(name)); TextWidget widget = TextWidget.Cast(GetRootWidget().FindAnyWidget(name));
if (widget) widget.SetText(value); if (widget) widget.SetText(value);
} }
// Stable page order is also used by the shared navigation bar and native probe. // Stable IDs are generated from the navigation manifest; extensions use named pages.
static array<string> Pages() { return {"SettingsPage", "HQPage", "JournalPage", "ModsPage", "FactionsPage", "WorldPage", "IntelPage", "StatusPage", "TerrainsPage", "ItemsPage", "TTSPage", "ForcesPage", "GuardsPage", "SitesPage", "PlanePage", "RecommendationsPage", "WeightsPage", "AllowedItemsPage", "ItemPresetsPage", "AIPage", "StarterPage", "SarkaPage"}; } static array<string> Pages() { return ERR_AdminMenuPages.Pages(); }
static array<string> Navigation() { return {"OpenSettings", "OpenHQ", "OpenJournal", "OpenMods", "OpenFactions", "OpenWorld", "OpenIntel", "OpenStatus", "OpenTerrains", "OpenItems", "OpenTTS", "OpenForces", "OpenGuards", "OpenSites", "OpenPlane", "OpenRecommendations", "OpenWeights", "OpenAllowedItems", "OpenItemPresets", "OpenAI", "OpenStarter", "OpenSarka"}; } static array<string> Navigation() { return ERR_AdminMenuPages.Navigation(); }
protected void ShowPage(int page) protected void ShowPage(int page)
{ {
array<string> pages = Pages(); if (!ERR_AdminMenuView.ShowPage(GetRootWidget(), page)) return;
array<string> navigation = Navigation();
if (page < 0 || page >= pages.Count()) return;
m_Page = page; m_Page = page;
for (int i = 0; i < pages.Count(); i++) if (page == ERR_AdminPage.JOURNAL) m_LogPoll = 1;
{
GetRootWidget().FindAnyWidget(pages[i]).SetVisible(i == page);
bool selected = i == page || ((page == 12 || page == 13) && i == 11) || ((page == 16 || page == 17 || page == 18 || page == 20) && i == 9) || ((page == 14 || page == 19) && i == 1);
GetRootWidget().FindAnyWidget("Selected_" + navigation[i]).SetVisible(selected);
ERR_SelectionStyle.Choice(SCR_ButtonTextComponent.GetButtonText(navigation[i], GetRootWidget()), selected);
}
GetRootWidget().FindAnyWidget("EquipmentNavigation").SetVisible(page == 9 || page == 16 || page == 17 || page == 18 || page == 20);
GetRootWidget().FindAnyWidget("Selected_EquipmentOverview").SetVisible(page == 9);
ERR_SelectionStyle.Choice(SCR_ButtonTextComponent.GetButtonText("EquipmentOverview", GetRootWidget()), page == 9);
if (page == 2) m_LogPoll = 1;
} }
protected int m_KeepWeaponState = -1; protected int m_KeepWeaponState = -1;
protected int m_SelfEpiState = -1; protected int m_SelfEpiState = -1;
@@ -312,8 +205,8 @@ class ERR_AdminMenu : ChimeraMenuBase
Widget state = GetRootWidget().FindAnyWidget("recommended_" + addonKey); Widget state = GetRootWidget().FindAnyWidget("recommended_" + addonKey);
if (state) if (state)
{ {
if (entry.Substring(divider + 1, entry.Length() - divider - 1) == "1") state.SetColor(Color.FromRGBA(105, 190, 140, 255)); if (entry.Substring(divider + 1, entry.Length() - divider - 1) == "1") state.SetColor(Color.FromInt(ERR_MenuTheme.READY_TEXT));
else state.SetColor(Color.FromRGBA(220, 115, 115, 255)); else state.SetColor(Color.FromInt(ERR_MenuTheme.UNAVAILABLE_TEXT));
} }
continue; continue;
} }
@@ -435,13 +328,10 @@ class ERR_AdminMenu : ChimeraMenuBase
if (!button || !IsFocused()) return; if (!button || !IsFocused()) return;
string name = button.GetRootWidget().GetName(); string name = button.GetRootWidget().GetName();
if (name == "Close") { Close(); return; } if (name == "Close") { Close(); return; }
if (name == "RecommendationsBack") { ShowPage(3); return; } int section = ERR_AdminMenuPages.MainButtons().Find(name);
if (name == "RecommendedPlane") { ShowPage(14); return; } if (section >= 0) { ShowPage(ERR_AdminMenuPages.MainPage(section)); return; }
if (name == "EquipmentOverview") { ShowPage(9); return; } if (name == "RecommendedPlane") { ShowPage(ERR_AdminPage.PLANE); return; }
if (name == "RecommendedWeapons") { ShowPage(9); return; } if (name == "RecommendedWeapons") { ShowPage(ERR_AdminPage.ITEMS); return; }
if (name == "PlaneBack") { ShowPage(1); return; }
if (name == "AIBack") { ShowPage(1); return; }
if (name == "GuardsBack" || name == "SitesBack" || name == "SarkaBack") { ShowPage(11); return; }
int page = Navigation().Find(name); int page = Navigation().Find(name);
if (page >= 0) { ShowPage(page); return; } if (page >= 0) { ShowPage(page); return; }
if (name == "JournalDetails") if (name == "JournalDetails")
@@ -0,0 +1,86 @@
// Presentation rules only: all mutations still use the authenticated command service.
class ERR_AdminMenuFields
{
static array<string> Keys()
{
return {"aiDoctrine", "aiShadow", "automaticEquipmentChancePercent", "sarkaCarsPerAnger", "motorbikeCount", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "civilianTrafficCount", "emptyRestartHours", "startMode", "radioDefenceSeconds", "aiIntelChancePercent", "intelRevealChancePercent", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "convoyCount", "antiAirChancePercent", "antiPersonnelMineChancePercent", "heliTimerMinutes"};
}
static bool Available(string key, bool hq, bool intel)
{
if (key == "aiDoctrine" || key == "aiShadow") return hq;
if (key == "sarkaCarsPerAnger") return hq;
if (key == "aiIntelChancePercent") return intel;
if (key == "automaticEquipmentChancePercent" || key == "motorbikeCount" || key == "planeAltitudeMetres" || key == "planeReplacementSeconds" || key == "planeSectorSeconds" || key == "planeReconEnabled" || key == "objectGuardCount" || key == "objectGuardEvery" || key == "objectGuardHQMode" || key == "hunterSpawnDistanceMetres" || key == "heliTimerMinutes" || key == "antiAirChancePercent" || key == "antiPersonnelMineChancePercent" || key == "convoyCount" || key == "reportIntervalSeconds" || key == "supportSquadLimit" || key == "responseRadiusMetres") return hq;
return Keys().Contains(key);
}
// A short journal has no older off-screen lines, even if its slider is zero.
static bool FollowJournal(bool empty, float slider, float height, float viewHeight, bool latest)
{
return latest || empty || slider >= 0.98 || height <= viewHeight;
}
// TextWidget interprets hash-prefixed tokens as localization IDs. Keep the
// server audit and retained entries intact; render their numeric IDs literally.
static string JournalText(string line, bool details = false)
{
return ERR_JournalText.Menu(line, details);
}
static string Display(string key, string value)
{
if (key == "aiDoctrine") { if (value == "1") return "Coordinated"; return "Current"; }
if (key == "aiShadow") { if (value == "1") return "On"; return "Off"; }
if (value == "-1" || value == "-2") return ERR_Settings.SelectionText(value.ToInt());
if (key == "startMode") { if (value == "1") return "Crash"; return "Prison"; }
if (key == "startTimeMinutes") return ERR_TimeService.Clock(value.ToInt());
if (key == "startDateCode") return ERR_EnvironmentService.Date(value.ToInt());
if (key == "weatherProfile") return ERR_EnvironmentService.ProfileName(value.ToInt());
if (key == "viewDistanceMetres" && value == "0") return "default";
return value;
}
static string StartSummary(int saved, int current)
{
return "Next start: " + Display("startMode", saved.ToString()) + " | Current round: " + Display("startMode", current.ToString());
}
static string Command(string key, string value)
{
string prefix;
if (key == "aiDoctrine") prefix = "mission doctrine";
else if (key == "aiShadow") prefix = "mission aishadow";
else if (key == "automaticEquipmentChancePercent") prefix = "hq equipment";
else if (key == "sarkaCarsPerAnger") prefix = "mission sarkacars";
else if (key == "motorbikeCount") prefix = "mission motorbikes";
else if (key == "planeReconEnabled") prefix = "mission plane";
else if (key == "planeAltitudeMetres") prefix = "mission planealtitude";
else if (key == "planeReplacementSeconds") prefix = "mission planereplacement";
else if (key == "planeSectorSeconds") prefix = "mission planesector";
else if (key == "startWeaponCount") prefix = "mission startweapons";
else if (key == "startMagazineCount") prefix = "mission startammo";
else if (key == "objectGuardEvery") prefix = "mission objectevery";
else if (key == "objectGuardHQMode") prefix = "mission objecthq";
else if (key == "objectGuardCount") prefix = "mission objectguards";
else if (key == "hunterSpawnDistanceMetres") prefix = "mission hunterdistance";
else if (key == "fieldCampCount") prefix = "mission camps";
else if (key == "fieldHospitalCount") prefix = "mission hospitals";
else if (key == "roadblockCount") prefix = "mission roadblocks";
else if (key == "emptyRestartHours") prefix = "mission emptyhours";
else if (key == "civilianTrafficCount") prefix = "mission traffic";
else if (key == "startMode") prefix = "mission start";
else if (key == "radioDefenceSeconds") prefix = "mission radio";
else if (key == "aiIntelChancePercent") prefix = "intel carrying";
else if (key == "intelRevealChancePercent") prefix = "intel reveal";
else if (key == "startTimeMinutes") prefix = "mission time";
else if (key == "timeMultiplier") prefix = "mission speed";
else if (key == "startDateCode") prefix = "mission date";
else if (key == "weatherProfile") prefix = "mission weather";
else if (key == "viewDistanceMetres") prefix = "mission viewdistance";
else if (key == "reportIntervalSeconds") prefix = "hq interval";
else if (key == "supportSquadLimit") prefix = "hq squads";
else if (key == "responseRadiusMetres") prefix = "hq radius";
else if (key == "antiAirChancePercent") prefix = "hq aa";
else if (key == "antiPersonnelMineChancePercent") prefix = "hq mines";
else if (key == "heliTimerMinutes") prefix = "hq heli timer";
else if (key == "convoyCount") prefix = "hq convoy count";
value = value.Trim();
if (prefix.IsEmpty() || value.IsEmpty() || value.Length() > 32) return "";
return prefix + " set " + value;
}
}
@@ -0,0 +1,46 @@
// Generated by tools/build_admin_menu.py; edit ui/admin_menu/navigation.json.
enum ERR_AdminPage
{
MISSION = 0,
HQ = 1,
JOURNAL = 2,
MODS = 3,
FACTIONS = 4,
WORLD = 5,
INTEL = 6,
STATUS = 7,
TERRAINS = 8,
ITEMS = 9,
SPEECH = 10,
FORCES = 11,
GUARDS = 12,
SITES = 13,
PLANE = 14,
RECOMMENDATIONS = 15,
WEIGHTS = 16,
ALLOWED_ITEMS = 17,
ITEM_PRESETS = 18,
AI = 19,
STARTER = 20,
SARKA = 21,
}
class ERR_AdminMenuPages
{
static array<string> Pages() { return {"SettingsPage", "HQPage", "JournalPage", "ModsPage", "FactionsPage", "WorldPage", "IntelPage", "StatusPage", "TerrainsPage", "ItemsPage", "TTSPage", "ForcesPage", "GuardsPage", "SitesPage", "PlanePage", "RecommendationsPage", "WeightsPage", "AllowedItemsPage", "ItemPresetsPage", "AIPage", "StarterPage", "SarkaPage"}; }
static array<string> Navigation() { return {"OpenSettings", "OpenHQ", "OpenJournal", "OpenMods", "OpenFactions", "OpenWorld", "OpenIntel", "OpenStatus", "OpenTerrains", "OpenItems", "OpenTTS", "OpenForces", "OpenGuards", "OpenSites", "OpenPlane", "OpenRecommendations", "OpenWeights", "OpenAllowedItems", "OpenItemPresets", "OpenAI", "OpenStarter", "OpenSarka"}; }
static array<string> MainButtons() { return {"Main_Mission", "Main_Forces", "Main_HQ", "Main_Intel", "Main_Items", "Main_Mods", "Main_Audio", "Main_Status"}; }
static array<string> Sidebars() { return {"Sidebar_Mission", "Sidebar_Forces", "Sidebar_HQ", "Sidebar_Intel", "Sidebar_Items", "Sidebar_Mods", "Sidebar_Audio", "Sidebar_Status"}; }
static int Group(int page)
{
array<int> groups = {0, 2, 7, 5, 1, 0, 3, 7, 0, 4, 6, 1, 1, 1, 2, 5, 4, 4, 4, 2, 4, 1};
if (page < 0 || page >= groups.Count()) return -1;
return groups[page];
}
static int MainPage(int group)
{
array<int> pages = {ERR_AdminPage.MISSION, ERR_AdminPage.FORCES, ERR_AdminPage.HQ, ERR_AdminPage.INTEL, ERR_AdminPage.ITEMS, ERR_AdminPage.MODS, ERR_AdminPage.SPEECH, ERR_AdminPage.STATUS};
if (group < 0 || group >= pages.Count()) return -1;
return pages[group];
}
}
@@ -0,0 +1,26 @@
// Widget presentation only. No settings writes, authorization or transport here.
class ERR_AdminMenuView
{
static bool ShowPage(Widget root, int page)
{
int group = ERR_AdminMenuPages.Group(page);
if (!root || group < 0) return false;
array<string> pages = ERR_AdminMenuPages.Pages();
array<string> navigation = ERR_AdminMenuPages.Navigation();
for (int i = 0; i < pages.Count(); i++)
{
root.FindAnyWidget(pages[i]).SetVisible(i == page);
root.FindAnyWidget("Selected_" + navigation[i]).SetVisible(i == page);
ERR_SelectionStyle.Choice(SCR_ButtonTextComponent.GetButtonText(navigation[i], root), i == page);
}
array<string> buttons = ERR_AdminMenuPages.MainButtons();
array<string> sidebars = ERR_AdminMenuPages.Sidebars();
for (int section = 0; section < buttons.Count(); section++)
{
root.FindAnyWidget(sidebars[section]).SetVisible(section == group);
root.FindAnyWidget("Selected_" + buttons[section]).SetVisible(section == group);
ERR_SelectionStyle.Choice(SCR_ButtonTextComponent.GetButtonText(buttons[section], root), section == group);
}
return true;
}
}
@@ -7,7 +7,7 @@ modded class ERR_AdminMenu
{ {
Open(); Open();
ERR_AdminMenu menu = GetOpenMenu(); ERR_AdminMenu menu = GetOpenMenu();
if (menu) menu.ShowPage(3); if (menu) menu.ShowPage(ERR_AdminPage.MODS);
} }
override void OnMenuOpen() override void OnMenuOpen()
{ {
@@ -0,0 +1,13 @@
// Generated by tools/build_admin_menu.py; edit ui/admin_menu/theme.json.
class ERR_MenuTheme
{
static const int NEUTRAL = 0xFF454B52;
static const int NEUTRAL_HOVER = 0xFF606870;
static const int POSITIVE = 0xFF246B3C;
static const int POSITIVE_HOVER = 0xFF31894F;
static const int NEGATIVE = 0xFF8F2929;
static const int NEGATIVE_HOVER = 0xFFB43B3B;
static const int MIXED = 0xFF805B17;
static const int READY_TEXT = 0xFF69BE8C;
static const int UNAVAILABLE_TEXT = 0xFFDC7373;
}
@@ -19,16 +19,33 @@ modded class ERR_AdminMenu
{ {
GetRootWidget().Update(); GetRootWidget().Update();
if (m_Page != expected) return false; if (m_Page != expected) return false;
int activeGroup = ERR_AdminMenuPages.Group(expected);
Widget content = GetRootWidget().FindAnyWidget(Pages()[expected]);
if (!content) return false;
float contentX, contentY, contentWidth, contentHeight;
content.GetScreenPos(contentX, contentY); content.GetScreenSize(contentWidth, contentHeight);
array<string> mainButtons = ERR_AdminMenuPages.MainButtons();
array<string> sidebars = ERR_AdminMenuPages.Sidebars();
for (int group = 0; group < mainButtons.Count(); group++)
{
Widget mainTab = GetRootWidget().FindAnyWidget(mainButtons[group]);
Widget marker = GetRootWidget().FindAnyWidget("Selected_" + mainButtons[group]);
Widget sidebar = GetRootWidget().FindAnyWidget(sidebars[group]);
if (!mainTab || !marker || !sidebar || !mainTab.IsVisible() || marker.IsVisible() != (group == activeGroup) || sidebar.IsVisible() != (group == activeGroup)) return false;
float x, y, width, height;
mainTab.GetScreenPos(x, y); mainTab.GetScreenSize(width, height);
if (width <= 1 || height <= 1 || y + height > contentY) return false;
}
for (int i = 0; i < Pages().Count(); i++) for (int i = 0; i < Pages().Count(); i++)
{ {
Widget panel = GetRootWidget().FindAnyWidget(Pages()[i]); Widget panel = GetRootWidget().FindAnyWidget(Pages()[i]);
Widget tab = GetRootWidget().FindAnyWidget(Navigation()[i]); Widget tab = GetRootWidget().FindAnyWidget(Navigation()[i]);
Widget selected = GetRootWidget().FindAnyWidget("Selected_" + Navigation()[i]); Widget selected = GetRootWidget().FindAnyWidget("Selected_" + Navigation()[i]);
if (!panel || !tab || !selected || panel.IsVisible() != (i == expected) || !tab.IsVisible() || selected.IsVisible() != (i == expected)) return false; if (!panel || !tab || !selected || panel.IsVisible() != (i == expected) || selected.IsVisible() != (i == expected)) return false;
float x, y, width, height, px, py; if (ERR_AdminMenuPages.Group(i) != activeGroup) continue;
tab.GetScreenPos(x, y); tab.GetScreenSize(width, height); panel.GetScreenPos(px, py); float x, y, width, height;
if (width <= 1 || height <= 1 || (i == expected && y + height > py)) tab.GetScreenPos(x, y); tab.GetScreenSize(width, height);
{ PrintFormat("ERR ADMIN NAV BOUNDS: page=%1 tab=%2 bounds=%3,%4,%5,%6 panelY=%7", expected, i, x, y, width, height, py); return false; } if (!tab.IsVisible() || width <= 1 || height <= 1 || x + width > contentX || y < contentY || y + height > contentY + contentHeight) return false;
} }
return true; return true;
} }
@@ -38,6 +38,7 @@ modded class ERR_HQ
modded class ERR_GameMode modded class ERR_GameMode
{ {
protected int m_ERRSarkaStage; protected int m_ERRSarkaStage;
protected int m_ERRSarkaMenuPage;
protected int m_ERRSarkaDeadline; protected int m_ERRSarkaDeadline;
protected bool m_ERRSarkaOrder; protected bool m_ERRSarkaOrder;
protected override void EOnInit(IEntity owner) protected override void EOnInit(IEntity owner)
@@ -66,7 +67,27 @@ modded class ERR_GameMode
if (m_ERRSarkaStage == 0) if (m_ERRSarkaStage == 0)
{ {
if (!ERR_SarkaProbeCheck(Settings().Get("sarkaCarsPerAnger") == 1, "default one car per anger point")) return; if (!ERR_SarkaProbeCheck(Settings().Get("sarkaCarsPerAnger") == 1, "default one car per anger point")) return;
ERR_AdminMenu.Open(); m_ERRSarkaStage = 10; return; ERR_AdminMenu.Open(); m_ERRSarkaStage = 9; return;
}
if (m_ERRSarkaStage == 9)
{
ERR_AdminMenu menu = ERR_AdminMenu.GetOpenMenu();
if (!menu || !menu.ERR_SarkaProbeReady()) return;
menu.ERR_ProbePage(m_ERRSarkaMenuPage); m_ERRSarkaStage = 90; return;
}
if (m_ERRSarkaStage == 90)
{
ERR_AdminMenu menu = ERR_AdminMenu.GetOpenMenu();
if (!ERR_SarkaProbeCheck(menu && menu.ERR_ProbeNavigation(m_ERRSarkaMenuPage), "top main tabs and left sidebar reach page " + m_ERRSarkaMenuPage.ToString())) return;
System.MakeScreenshot("$logs:err-menu-sidebar-" + m_ERRSarkaMenuPage.ToString());
m_ERRSarkaStage = 91; return;
}
if (m_ERRSarkaStage == 91)
{
m_ERRSarkaMenuPage++;
if (m_ERRSarkaMenuPage < ERR_AdminMenu.Pages().Count()) m_ERRSarkaStage = 9;
else m_ERRSarkaStage = 10;
return;
} }
if (m_ERRSarkaStage == 10) if (m_ERRSarkaStage == 10)
{ {
@@ -4,8 +4,8 @@ class ERR_SelectionStyle
static void Action(SCR_ButtonTextComponent button, bool enable) static void Action(SCR_ButtonTextComponent button, bool enable)
{ {
if (!button) return; if (!button) return;
Color normal = Color.FromInt(0xFF8F2929), hover = Color.FromInt(0xFFB43B3B); Color normal = Color.FromInt(ERR_MenuTheme.NEGATIVE), hover = Color.FromInt(ERR_MenuTheme.NEGATIVE_HOVER);
if (enable) { normal = Color.FromInt(0xFF246B3C); hover = Color.FromInt(0xFF31894F); } if (enable) { normal = Color.FromInt(ERR_MenuTheme.POSITIVE); hover = Color.FromInt(ERR_MenuTheme.POSITIVE_HOVER); }
button.SetBackgroundColors(normal, hover, normal, hover, hover); button.SetBackgroundColors(normal, hover, normal, hover, hover);
button.ColorizeBackground(false); button.ColorizeBackground(false);
} }
@@ -14,11 +14,11 @@ class ERR_SelectionStyle
static void Choice(SCR_ButtonTextComponent button, bool selected, bool positive = true) static void Choice(SCR_ButtonTextComponent button, bool selected, bool positive = true)
{ {
if (!button) return; if (!button) return;
Color normal = Color.FromInt(0xFF454B52), hover = Color.FromInt(0xFF606870); Color normal = Color.FromInt(ERR_MenuTheme.NEUTRAL), hover = Color.FromInt(ERR_MenuTheme.NEUTRAL_HOVER);
if (selected) if (selected)
{ {
normal = Color.FromInt(0xFF246B3C); hover = Color.FromInt(0xFF31894F); normal = Color.FromInt(ERR_MenuTheme.POSITIVE); hover = Color.FromInt(ERR_MenuTheme.POSITIVE_HOVER);
if (!positive) { normal = Color.FromInt(0xFF8F2929); hover = Color.FromInt(0xFFB43B3B); } if (!positive) { normal = Color.FromInt(ERR_MenuTheme.NEGATIVE); hover = Color.FromInt(ERR_MenuTheme.NEGATIVE_HOVER); }
} }
button.SetDisabledOpacity(1); button.SetDisabledOpacity(1);
button.SetBackgroundColors(normal, hover, normal, hover, hover); button.SetBackgroundColors(normal, hover, normal, hover, hover);
@@ -34,10 +34,10 @@ class ERR_SelectionStyle
{ {
SCR_ButtonTextComponent badge = SCR_ButtonTextComponent.GetButtonText(name, parent); SCR_ButtonTextComponent badge = SCR_ButtonTextComponent.GetButtonText(name, parent);
if (!badge) return; if (!badge) return;
string label = "Waiting..."; Color color = Color.FromInt(0xFF454B52); string label = "Waiting..."; Color color = Color.FromInt(ERR_MenuTheme.NEUTRAL);
if (state == 0) { label = "Disabled"; color = Color.FromInt(0xFF8F2929); } if (state == 0) { label = "Disabled"; color = Color.FromInt(ERR_MenuTheme.NEGATIVE); }
if (state == 1) { label = "Enabled"; color = Color.FromInt(0xFF246B3C); } if (state == 1) { label = "Enabled"; color = Color.FromInt(ERR_MenuTheme.POSITIVE); }
if (state == 2) { label = "Mixed"; color = Color.FromInt(0xFF805B17); } if (state == 2) { label = "Mixed"; color = Color.FromInt(ERR_MenuTheme.MIXED); }
badge.SetText(label); badge.SetDisabledOpacity(1); badge.SetEnabled(false, false); badge.SetText(label); badge.SetDisabledOpacity(1); badge.SetEnabled(false, false);
badge.SetBackgroundColors(color, color, color, color, color); badge.ColorizeBackground(false); badge.SetBackgroundColors(color, color, color, color, color); badge.ColorizeBackground(false);
} }
@@ -216,7 +216,7 @@ modded class ERR_AdminMenu
if (button.GetRootWidget() != row.FindAnyWidget("Enable")) continue; if (button.GetRootWidget() != row.FindAnyWidget("Enable")) continue;
SCR_ComboBoxComponent combo = SCR_ComboBoxComponent.GetComboBoxComponent("ItemsMod", GetRootWidget()); SCR_ComboBoxComponent combo = SCR_ComboBoxComponent.GetComboBoxComponent("ItemsMod", GetRootWidget());
if (combo) combo.SetCurrentItem(m_ServerAddonKeys.Find(addon), false, false, false); if (combo) combo.SetCurrentItem(m_ServerAddonKeys.Find(addon), false, false, false);
ShowPage(17); SubmitItems("items list " + addon + " 0"); return; ShowPage(ERR_AdminPage.ALLOWED_ITEMS); SubmitItems("items list " + addon + " 0"); return;
} }
} }
protected void SubmitItems(string command) protected void SubmitItems(string command)
File diff suppressed because it is too large Load Diff
+15 -11
View File
@@ -7,8 +7,10 @@ from pathlib import Path
BASE=Path(os.environ.get("ERR_CONVOY_SETTINGS_ROOT", Path(__file__).resolve().parents[1])) BASE=Path(os.environ.get("ERR_CONVOY_SETTINGS_ROOT", Path(__file__).resolve().parents[1]))
from policy_harness import ROOT, body, run from policy_harness import ROOT, body, run
source = BASE / 'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c' source = BASE / 'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c'
fields = source.with_name('ERR_AdminMenuFields.c')
navigation = source.with_name('ERR_AdminMenuPages.c')
layout = BASE / 'addons/core/UI/layouts/ERR/AdminMenu.layout' layout = BASE / 'addons/core/UI/layouts/ERR/AdminMenu.layout'
keys = re.findall(r'"([A-Za-z]+)"', body(source, 'static array<string> Keys(')) keys = re.findall(r'"([A-Za-z]+)"', body(fields, 'static array<string> Keys('))
settings = re.findall(r'"([A-Za-z]+)"', body(BASE / 'addons/core/Scripts/Game/ERR/00_Core/ERR_Settings.c', 'static array<string> Keys(')) settings = re.findall(r'"([A-Za-z]+)"', body(BASE / 'addons/core/Scripts/Game/ERR/00_Core/ERR_Settings.c', 'static array<string> Keys('))
assert len(keys) == len(set(keys)) and set(settings) - set(keys) == {"automaticConvoyEnabled", "keepWeaponOnUnconscious", "selfEpinephrine", "planeReconEnabled", "restartOnEmpty"} assert len(keys) == len(set(keys)) and set(settings) - set(keys) == {"automaticConvoyEnabled", "keepWeaponOnUnconscious", "selfEpinephrine", "planeReconEnabled", "restartOnEmpty"}
assert set(keys) <= set(settings) # Every menu field must have a server setting. assert set(keys) <= set(settings) # Every menu field must have a server setting.
@@ -46,9 +48,9 @@ else:
names = re.findall(r'\bName "([^"]+)"', layout.read_text()) names = re.findall(r'\bName "([^"]+)"', layout.read_text())
assert 'RandomDay_startTimeMinutes' in names assert 'RandomDay_startTimeMinutes' in names
assert 'PlaneOn' in names and 'PlaneOff' in names assert 'PlaneOn' in names and 'PlaneOff' in names
assert all(n in names for n in ('OpenPlane','PlaneBack','PlanePage','Selected_OpenPlane')) assert all(n in names for n in ('OpenPlane','Sidebar_HQ','PlanePage','Selected_OpenPlane'))
for signature in ('static array<string> Pages(', 'static array<string> Navigation('): for signature in ('static array<string> Pages(', 'static array<string> Navigation('):
for n in re.findall(r'"([A-Za-z]+)"', body(source, signature)): assert n in names for n in re.findall(r'"([A-Za-z]+)"', body(navigation, signature)): assert n in names
assert 'Apply_planeReconEnabled' not in names # Saved-state toggle pair, not a numeric edit. assert 'Apply_planeReconEnabled' not in names # Saved-state toggle pair, not a numeric edit.
assert len(names) == len(set(names)), 'Menu widget names must be unique' assert len(names) == len(set(names)), 'Menu widget names must be unique'
for key in keys: for key in keys:
@@ -59,11 +61,11 @@ for name in ('Close', 'SettingsPage', 'HQPage', 'JournalPage', 'JournalText', 'J
assert name in names assert name in names
for name in re.findall(r'"([A-Za-z]+)"', body(source, 'override void OnMenuOpen(').split('foreach')[0]): for name in re.findall(r'"([A-Za-z]+)"', body(source, 'override void OnMenuOpen(').split('foreach')[0]):
assert name in names assert name in names
journal = body(source, 'static string JournalText(').replace('ERR_JournalText.Menu', 'ERR_JournalText::Menu') journal = body(fields, 'static string JournalText(').replace('ERR_JournalText.Menu', 'ERR_JournalText::Menu')
menu_format = body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_JournalText.c', 'static string Menu(') menu_format = body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_JournalText.c', 'static string Menu(')
follow = body(source, 'static bool FollowJournal(') follow = body(fields, 'static bool FollowJournal(')
command = body(source, 'static string Command(') command = body(fields, 'static string Command(')
available = body(source, 'static bool Available(').replace('Keys().Contains(key)', 'Known(key)') available = body(fields, 'static bool Available(').replace('Keys().Contains(key)', 'Known(key)')
known = ' || '.join('key == "' + key + '"' for key in keys) known = ' || '.join('key == "' + key + '"' for key in keys)
run(r''' run(r'''
#include <cassert> #include <cassert>
@@ -160,7 +162,7 @@ int main(){
} }
''') ''')
# All four rows remain inside the visible Mission page with no overlapping controls. # All four rows remain inside the visible Mission page with no overlapping controls.
page = body(layout, 'FrameWidgetClass { Name "SettingsPage"') page = body(layout, 'FrameWidgetClass { "Is Visible" 1 Name "SettingsPage"')
rectangles = [] rectangles = []
for line in page.splitlines()[1:]: for line in page.splitlines()[1:]:
if not line.startswith(('TextWidgetClass', 'ButtonWidgetClass')): if not line.startswith(('TextWidgetClass', 'ButtonWidgetClass')):
@@ -183,8 +185,10 @@ print('PASS: item editor, preset controls and dynamic item-row layout are struct
# Run the production selected-state styling: retain selected color at disabled # Run the production selected-state styling: retain selected color at disabled
# opacity 1, while unselected controls remain neutral rather than looking active. # opacity 1, while unselected controls remain neutral rather than looking active.
choice=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_SelectionStyle.c','static void Choice(').replace('SCR_ButtonTextComponent button','SCR_ButtonTextComponent* button').replace('button.','button->').replace('Color.FromInt','Color::FromInt') choice=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_SelectionStyle.c','static void Choice(').replace('SCR_ButtonTextComponent button','SCR_ButtonTextComponent* button').replace('button.','button->').replace('Color.FromInt','Color::FromInt').replace('ERR_MenuTheme.', 'ERR_MenuTheme::')
run(r''' palette=(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_MenuTheme.c').read_text().split('class ERR_MenuTheme',1)[1]
palette='struct ERR_MenuTheme'+palette.replace('static const int', 'static constexpr uint32_t')+';\n'
run('#include <cstdint>\n'+palette+r'''
#include <cassert> #include <cassert>
#include <cstdint> #include <cstdint>
struct Color{uint32_t value;static Color FromInt(uint32_t v){return {v};}}; struct Color{uint32_t value;static Color FromInt(uint32_t v){return {v};}};
@@ -213,7 +217,7 @@ weight_layout=(ROOT/'addons/core/UI/layouts/ERR/ItemWeightRow.layout').read_text
validate_layout_structure(weight_layout) validate_layout_structure(weight_layout)
weight_names=re.findall(r'\bName "([^"]+)"', weight_layout) weight_names=re.findall(r'\bName "([^"]+)"', weight_layout)
assert len(weight_names)==len(set(weight_names)) assert len(weight_names)==len(set(weight_names))
for name in ('EquipmentNavigation','EquipmentOverview','OpenAllowedItems','AllowedItemsPage','OpenItemPresets','ItemPresetsPage','OpenWeights','WeightsPage','WeightsMod','WeightsShow','WeightsPrevious','WeightsNext','ModWeight','ModWeightApply','ModWeightNormal','ModWeightHigh','ModWeightSaved','WeightsChance','WeightsPageState','WeightsContent','WeightsScroll'): for name in ('Sidebar_Items','OpenItems','OpenAllowedItems','AllowedItemsPage','OpenItemPresets','ItemPresetsPage','OpenWeights','WeightsPage','WeightsMod','WeightsShow','WeightsPrevious','WeightsNext','ModWeight','ModWeightApply','ModWeightNormal','ModWeightHigh','ModWeightSaved','WeightsChance','WeightsPageState','WeightsContent','WeightsScroll'):
assert name in names, name assert name in names, name
for name in ('WeightLabel','WeightState','WeightValue','WeightApply','WeightNormal'): for name in ('WeightLabel','WeightState','WeightValue','WeightApply','WeightNormal'):
assert name in weight_names, name assert name in weight_names, name
+131
View File
@@ -0,0 +1,131 @@
"""Generated UI stays reproducible; design edits cannot silently break includes/navigation."""
import importlib.util
import json
from pathlib import Path
import re
import shutil
import tempfile
import unittest
ROOT = Path(__file__).resolve().parents[1]
spec = importlib.util.spec_from_file_location('menu_builder', ROOT / 'tools/build_admin_menu.py')
builder = importlib.util.module_from_spec(spec)
spec.loader.exec_module(builder)
class MenuSourceTests(unittest.TestCase):
def setUp(self):
self.temp = tempfile.TemporaryDirectory()
self.addCleanup(self.temp.cleanup)
self.source = Path(self.temp.name) / 'menu'
shutil.copytree(builder.SOURCE, self.source)
def edit_json(self, name, edit):
path = self.source / name
data = json.loads(path.read_text())
edit(data)
path.write_text(json.dumps(data))
def test_committed_outputs_match_sources_and_widget_ids_are_unique(self):
for path, rendered in builder.render().items():
self.assertEqual((ROOT / path).read_text(), rendered, str(path))
self.assertNotIn('{{', rendered)
layout = builder.render()[builder.LAYOUTS / 'AdminMenu.layout']
names = re.findall(r'\bName "([^"]+)"', layout)
self.assertEqual(len(names), len(set(names)))
def test_theme_edit_reaches_pages_rows_and_runtime_colors(self):
def change(theme):
theme['layout']['COLOR_TEXT'] = '1 0.5 0.25 1'
theme['buttons']['POSITIVE'] = '0xFF123456'
self.edit_json('theme.json', change)
rendered = builder.render(self.source)
for name in ('AdminMenu.layout', 'ContentRow.layout', 'ItemRow.layout', 'ItemWeightRow.layout'):
self.assertIn('Color 1 0.5 0.25 1', rendered[builder.LAYOUTS / name])
self.assertNotIn('Color 0.9 0.92 0.94 1', rendered[builder.LAYOUTS / name])
self.assertIn('POSITIVE = 0xFF123456', rendered[builder.PALETTE])
def test_relabel_and_reorder_groups_preserves_stable_page_ids(self):
def change(nav):
nav['groups'].reverse()
nav['pages'][21]['label'] = 'Special forces'
self.edit_json('navigation.json', change)
rendered = builder.render(self.source)
self.assertIn('SARKA = 21', rendered[builder.PAGES])
layout = rendered[builder.LAYOUTS / 'AdminMenu.layout']
self.assertIn('m_sText "Special forces"', layout)
self.assertLess(layout.index('Name "Main_Status"'), layout.index('Name "Main_Mission"'))
def test_top_tabs_and_sidebar_do_not_overlap_content(self):
layout = builder.render()[builder.LAYOUTS / 'AdminMenu.layout']
slots = dict(re.findall(r'Name "([^"]+)" Slot FrameWidgetSlot \{([^}]+)\}', layout))
def rect(name):
slot = slots[name]
return [int(re.search(r'\b' + key + r' (-?\d+)', slot)[1])
for key in ('PositionX', 'PositionY', 'SizeX', 'SizeY')]
nav = json.loads((builder.SOURCE / 'navigation.json').read_text())
pages = {p['key']: p for p in nav['pages']}
panel_width, panel_height = rect('Panel')[2:]
previous_right = 0
for group in nav['groups']:
x, y, width, height = rect('Main_' + group['name'])
self.assertGreaterEqual(x, previous_right)
self.assertLessEqual(x + width, panel_width)
previous_right = x + width
sx, sy, sw, sh = rect('Sidebar_' + group['name'])
previous_bottom = 0
for key in group['pages']:
page = pages[key]
px, py, pw, ph = rect(page['widget'])
bx, by, bw, bh = rect(page['button'])
self.assertLessEqual(y + height, py)
self.assertLessEqual(sx + bx + bw, px)
self.assertGreaterEqual(by, previous_bottom)
self.assertLessEqual(bx + bw, sw)
self.assertLessEqual(by + bh, sh)
self.assertGreaterEqual(sy + by, py)
self.assertLessEqual(sy + by + bh, py + ph)
self.assertLessEqual(px + pw, panel_width)
self.assertLessEqual(py + ph, panel_height)
previous_bottom = by + bh
def test_editor_initial_visibility_matches_mission_page_even_after_reordering(self):
self.edit_json('navigation.json', lambda nav: nav['groups'].reverse())
layout = builder.render(self.source)[builder.LAYOUTS / 'AdminMenu.layout']
visibility = dict((name, int(value)) for value, name in re.findall(
r'WidgetClass \{ "Is Visible" ([01]) Name "([^"]+)"', layout))
nav = json.loads((self.source / 'navigation.json').read_text())
for page in nav['pages']:
self.assertEqual(visibility[page['widget']], int(page['key'] == 'MISSION'))
self.assertEqual(visibility['Selected_' + page['button']], int(page['key'] == 'MISSION'))
for group in nav['groups']:
expected = int('MISSION' in group['pages'])
self.assertEqual(visibility['Sidebar_' + group['name']], expected)
self.assertEqual(visibility['Selected_Main_' + group['name']], expected)
def test_unknown_token_missing_include_cycle_and_escape_fail(self):
shell = self.source / 'shell.layout.in'
for content in ('{{TYPO}}', '{{include:missing.layout.in}}',
'{{include:shell.layout.in}}', '{{include:../outside.layout.in}}'):
with self.subTest(content=content):
shell.write_text(content)
with self.assertRaises(ValueError):
builder.render(self.source)
def test_duplicate_membership_missing_page_and_invalid_theme_fail(self):
original = (self.source / 'navigation.json').read_text()
for change in (lambda n: n['groups'][0]['pages'].append('SARKA'),
lambda n: n['groups'][0]['pages'].pop(),
lambda n: n['pages'][0].update(id=99)):
(self.source / 'navigation.json').write_text(original)
self.edit_json('navigation.json', change)
with self.assertRaises(ValueError):
builder.render(self.source)
(self.source / 'navigation.json').write_text(original)
self.edit_json('theme.json', lambda t: t['layout'].update(COLOR_TEXT='1 1 1 2'))
with self.assertRaises(ValueError):
builder.render(self.source)
if __name__ == '__main__':
unittest.main()
+1 -1
View File
@@ -58,7 +58,7 @@ helper=body(provider,'protected void ConvoyAutoSetting(')
for forbidden in ('StartConvoy','StartScenarioConvoy','Spawn','m_HQ.'): for forbidden in ('StartConvoy','StartScenarioConvoy','Spawn','m_HQ.'):
assert forbidden not in helper assert forbidden not in helper
# Do not advertise this command-only setting as an editable field absent from the actual fixed menu. # Do not advertise this command-only setting as an editable field absent from the actual fixed menu.
menu=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c','static array<string> Keys(') menu=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuFields.c','static array<string> Keys(')
assert 'automaticConvoyEnabled' not in menu assert 'automaticConvoyEnabled' not in menu
assert body(provider,'override bool Help(').count('replies.Insert(')<=5 assert body(provider,'override bool Help(').count('replies.Insert(')<=5
print('PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest') print('PASS: actual read migrates old valid settings, preserves explicit disabled state, rejects invalid data; next-round feedback and fixed menu remain honest')
+1 -1
View File
@@ -4,7 +4,7 @@ from policy_harness import ROOT, body, run
p = ROOT / 'addons/core/Scripts/Game/ERR/00_Core/ERR_SpeechMenu.c' p = ROOT / 'addons/core/Scripts/Game/ERR/00_Core/ERR_SpeechMenu.c'
src = p.read_text() src = p.read_text()
layout = (ROOT / 'addons/core/UI/layouts/ERR/AdminMenu.layout').read_text() layout = (ROOT / 'addons/core/UI/layouts/ERR/AdminMenu.layout').read_text()
menu = ROOT / 'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c' menu = ROOT / 'addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuPages.c'
for name in ('OpenTTS', 'TTSPage', 'TTSEndpoint', 'TTSToken', 'TTSTest', 'TTSDisable', 'TTSPasteEndpoint', 'TTSPasteToken', 'TTSStatus', 'TTSTokenStatus', 'TTSSelectionState', 'RecordingsOn', 'RecordingsOff', 'RecordingsLabel'): for name in ('OpenTTS', 'TTSPage', 'TTSEndpoint', 'TTSToken', 'TTSTest', 'TTSDisable', 'TTSPasteEndpoint', 'TTSPasteToken', 'TTSStatus', 'TTSTokenStatus', 'TTSSelectionState', 'RecordingsOn', 'RecordingsOff', 'RecordingsLabel'):
assert f'Name "{name}"' in layout, name assert f'Name "{name}"' in layout, name
assert '"TTSPage"' in body(menu, 'static array<string> Pages(') assert '"TTSPage"' in body(menu, 'static array<string> Pages(')
+1 -1
View File
@@ -17,7 +17,7 @@ def cpp(s):
return s return s
settings='\n'.join(cpp(body(S,sig)) for sig in ['static array<string> Keys(','static bool Valid(','static bool Randomizable(','static bool ValidSelection(','static string SelectionText(','static int AddedDefault(','protected bool Read(','static bool Parse(','bool Set(']) settings='\n'.join(cpp(body(S,sig)) for sig in ['static array<string> Keys(','static bool Valid(','static bool Randomizable(','static bool ValidSelection(','static string SelectionText(','static int AddedDefault(','protected bool Read(','static bool Parse(','bool Set('])
args='\n'.join(cpp(body(A,sig)) for sig in ['static bool Integer(','static bool Selection(']) args='\n'.join(cpp(body(A,sig)) for sig in ['static bool Integer(','static bool Selection('])
fields='\n'.join(cpp(body(M,sig)) for sig in ['static string Display(','static string StartSummary(']) fields='\n'.join(cpp(body(CORE/'ERR_AdminMenuFields.c',sig)) for sig in ['static string Display(','static string StartSummary('])
command=cpp(body(A,'protected bool StartCommand(')) command=cpp(body(A,'protected bool StartCommand('))
run(r''' run(r'''
#include <cassert> #include <cassert>
+163
View File
@@ -0,0 +1,163 @@
#!/usr/bin/env python3
"""Build native menu layouts and the runtime palette from ui/admin_menu sources."""
import argparse
import json
from pathlib import Path
import re
import sys
ROOT = Path(__file__).resolve().parents[1]
SOURCE = ROOT / 'ui/admin_menu'
LAYOUTS = Path('addons/core/UI/layouts/ERR')
PALETTE = Path('addons/core/Scripts/Game/ERR/00_Core/ERR_MenuTheme.c')
PAGES = Path('addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuPages.c')
TOKEN = re.compile(r'\{\{([^{}]+)\}\}')
def navigation(source, tokens):
config = json.loads((source / 'navigation.json').read_text(encoding='utf-8'))
pages, groups = config['pages'], config['groups']
if [p['id'] for p in pages] != list(range(len(pages))) or not 1 <= len(groups) <= 8:
raise ValueError('Page IDs must be consecutive and main navigation supports 1-8 groups')
for field in ('key', 'widget', 'button'):
values = [p[field] for p in pages]
if len(set(values)) != len(values) or any(not re.fullmatch(r'[A-Za-z][A-Za-z_0-9]*', v) for v in values):
raise ValueError(f'Duplicate or invalid navigation {field}')
keys = {p['key']: p for p in pages}
members = [key for group in groups for key in group['pages']]
names = [g['name'] for g in groups]
if (len(members) != len(set(members)) or set(members) != keys.keys()
or len(set(names)) != len(names)
or any(not re.fullmatch(r'[A-Za-z][A-Za-z0-9]*', n) for n in names)
or any(not 1 <= len(g['pages']) <= 8 for g in groups)):
raise ValueError('Every page must belong to exactly one valid sidebar group')
for page in pages:
if not isinstance(page['label'], str) or any(c in page['label'] for c in '\n\r"\\'):
raise ValueError('Invalid navigation label')
def slot(x, y, w, h):
return f'Slot FrameWidgetSlot {{ Anchor 0 0 0 0 PositionX {x} OffsetLeft {x} PositionY {y} OffsetTop {y} SizeX {w} OffsetRight {-x-w} SizeY {h} OffsetBottom {-y-h} }}'
def button(name, label, x, y, w, selected=False):
return (f'ButtonWidgetClass : "{{75C912A1C89BE6C2}}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {{ Name "{name}" {slot(x,y,w,42)} '
f'components {{ SCR_ButtonTextComponent "{{5548F0143AE99095}}" {{ m_sText "{label}" }} }} }}\n'
f'ImageWidgetClass {{ "Is Visible" {int(selected)} Name "Selected_{name}" {slot(x,y+44,w,3)} Color {tokens["COLOR_ACCENT"]} }}\n')
layout = ''
assignments = {}
for index, group in enumerate(groups):
name = group['name']
initial = 'MISSION' in group['pages']
layout += button('Main_' + name, name, 28 + index * 146, 106, 138, initial)
layout += f'FrameWidgetClass {{ "Is Visible" {int(initial)} Name "Sidebar_{name}" {slot(28,166,180,480)} {{\n'
for row, key in enumerate(group['pages']):
page = keys[key]
assignments[key] = index
layout += button(page['button'], page['label'], 0, row * 54, 180, key == 'MISSION')
layout += '} }\n'
def strings(method, values):
return f' static array<string> {method}() {{ return {{' + ', '.join('"' + v + '"' for v in values) + '}; }\n'
script = '// Generated by tools/build_admin_menu.py; edit ui/admin_menu/navigation.json.\n'
script += 'enum ERR_AdminPage\n{\n' + ''.join(f' {p["key"]} = {p["id"]},\n' for p in pages) + '}\n\n'
script += 'class ERR_AdminMenuPages\n{\n'
script += strings('Pages', [p['widget'] for p in pages])
script += strings('Navigation', [p['button'] for p in pages])
script += strings('MainButtons', ['Main_' + n for n in names])
script += strings('Sidebars', ['Sidebar_' + n for n in names])
script += ' static int Group(int page)\n {\n array<int> groups = {' + ', '.join(str(assignments[p['key']]) for p in pages) + '};\n if (page < 0 || page >= groups.Count()) return -1;\n return groups[page];\n }\n'
script += ' static int MainPage(int group)\n {\n array<int> pages = {' + ', '.join('ERR_AdminPage.' + g['pages'][0] for g in groups) + '};\n if (group < 0 || group >= pages.Count()) return -1;\n return pages[group];\n }\n}\n'
visibility = {'VISIBLE_' + p['widget']: str(int(p['key'] == 'MISSION')) for p in pages}
return layout, script, visibility
def source_file(source, name):
path = (source / name).resolve()
if not path.is_relative_to(source.resolve()) or not path.is_file():
raise ValueError(f'Invalid menu source: {name}')
return path
def expand(source, name, tokens, stack=()):
path = source_file(source, name)
if path in stack:
raise ValueError(f'Cyclic layout include: {name}')
def substitute(match):
key = match[1]
if key.startswith('include:'):
return expand(source, key[len('include:'):], tokens, (*stack, path)).rstrip('\n')
if key not in tokens:
raise ValueError(f'Unknown theme token {key} in {name}')
return tokens[key]
return TOKEN.sub(substitute, path.read_text(encoding='utf-8'))
def render(source=SOURCE):
theme = json.loads((source / 'theme.json').read_text(encoding='utf-8'))
tokens, colors = theme['layout'], theme['buttons']
for name, value in tokens.items():
if not re.fullmatch(r'[A-Z][A-Z_]*', name) or not isinstance(value, str):
raise ValueError(f'Invalid theme token: {name}')
if name == 'FONT':
valid = re.fullmatch(r'\{[A-Fa-f0-9]{16}\}[A-Za-z0-9_/.-]+\.fnt', value)
elif name.startswith('SIZE_'):
valid = value.isascii() and value.isdigit() and 8 <= int(value) <= 96
elif name.startswith('COLOR_'):
parts = value.split()
valid = len(parts) == 4 and all(re.fullmatch(r'\d+(?:\.\d+)?', p) and 0 <= float(p) <= 1 for p in parts)
else:
valid = False
if not valid:
raise ValueError(f'Invalid theme value: {name}')
for name, value in colors.items():
if not re.fullmatch(r'[A-Z][A-Z_]*', name) or not isinstance(value, str) or not re.fullmatch(r'0x[0-9A-F]{8}', value):
raise ValueError(f'Invalid runtime color: {name}')
required = {'NEUTRAL', 'NEUTRAL_HOVER', 'POSITIVE', 'POSITIVE_HOVER', 'NEGATIVE',
'NEGATIVE_HOVER', 'MIXED', 'READY_TEXT', 'UNAVAILABLE_TEXT'}
if not required <= colors.keys():
raise ValueError('Missing runtime palette colors')
nav_layout, nav_script, visibility = navigation(source, tokens)
tokens = {**tokens, **visibility, 'NAVIGATION': nav_layout}
manifest = json.loads((source / 'layouts.json').read_text(encoding='utf-8'))
outputs = {}
for output, template in manifest.items():
if not re.fullmatch(r'[A-Za-z][A-Za-z0-9]*\.layout', output):
raise ValueError(f'Invalid layout output: {output}')
outputs[LAYOUTS / output] = expand(source, template, tokens)
outputs[PALETTE] = ('// Generated by tools/build_admin_menu.py; edit ui/admin_menu/theme.json.\n'
'class ERR_MenuTheme\n{\n' + ''.join(
f' static const int {name} = {value};\n' for name, value in colors.items()) + '}\n')
outputs[PAGES] = nav_script
return outputs
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--check', action='store_true', help='Fail on stale output without changing files')
args = parser.parse_args()
try:
outputs = render() # Validate everything before writing any output.
stale = [path for path, content in outputs.items()
if not (ROOT / path).exists() or (ROOT / path).read_text(encoding='utf-8') != content]
if args.check:
if stale:
print('Stale generated menu files; run python3 tools/build_admin_menu.py:', file=sys.stderr)
for path in stale:
print(path, file=sys.stderr)
return 1
print('Menu layouts and palette are up to date.')
else:
for path in stale:
(ROOT / path).write_text(outputs[path], encoding='utf-8')
print(f'Updated {len(stale)} menu files.')
except (OSError, ValueError, KeyError, TypeError) as error:
print(f'Cannot build admin menu: {error}', file=sys.stderr)
return 1
return 0
if __name__ == '__main__':
sys.exit(main())
+2
View File
@@ -8,6 +8,8 @@ from prefab_identity import check_prefabs
ROOT=Path(__file__).resolve().parents[1] ROOT=Path(__file__).resolve().parents[1]
BASE='58D0FB3206B6F859' BASE='58D0FB3206B6F859'
def check(): def check():
subprocess.run([sys.executable,str(ROOT/'tools/build_admin_menu.py'),'--check'],check=True)
subprocess.run([sys.executable,'-m','unittest','discover','-s',str(ROOT/'tests'),'-p','test_admin_menu_sources.py'],check=True)
subprocess.run([sys.executable,'-m','unittest','discover','-s',str(ROOT/'tests'),'-p','test_workshop_changelog.py'],check=True) subprocess.run([sys.executable,'-m','unittest','discover','-s',str(ROOT/'tests'),'-p','test_workshop_changelog.py'],check=True)
subprocess.run([sys.executable,'-m','unittest','discover','-s',str(ROOT/'tests'),'-p','test_discord_changelog_ci.py'],check=True) subprocess.run([sys.executable,'-m','unittest','discover','-s',str(ROOT/'tests'),'-p','test_discord_changelog_ci.py'],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_terrain_controller_init.py')],check=True) subprocess.run([sys.executable,str(ROOT/'tests/test_terrain_controller_init.py')],check=True)
+74
View File
@@ -0,0 +1,74 @@
# Editing the mission menu
The menu has main sections across the top and a sidebar for each section's pages.
Design sources live here; the game loads the generated native layouts in
`addons/core/UI/layouts/ERR`. Their existing resource GUIDs stay unchanged.
| Change | Edit |
| --- | --- |
| Colors, font, text sizes, button state colors | `theme.json` |
| Main sections, sidebar grouping, order and labels | `navigation.json` |
| A page's controls, wording and spacing | `pages/<PageName>.layout.in` |
| Window, title, connection line and feedback area | `shell.layout.in` |
| Repeated item/mod rows and value controls | `components/*.layout.in` |
| Which layout resources are built | `layouts.json` |
After editing, run from the repository root:
```sh
python3 tools/build_admin_menu.py
python3 tools/build_admin_menu.py --check
python3 -m unittest discover -s tests -p test_admin_menu_sources.py
python3 tests/test_admin_menu.py
```
Commit both the design sources and generated files. Workbench can open the
generated `.layout` resources for inspection. Make lasting edits in these sources:
the builder replaces generated output. `tools/check.py` and Drone reject stale
output, missing includes, invalid colors and broken navigation membership.
The generated layout initially shows only Mission / General, its sidebar and
its selection indicators, so opening it in Workbench does not stack every page.
The builder supplies each page's `{{VISIBLE_<PageWidgetName>}}` token from its
stable navigation key. Runtime navigation overrides these initial visibility
values. To inspect another page in the layout editor, hide `SettingsPage` and
`Sidebar_Mission`, then enable **Is Visible** on the desired page and sidebar.
Do not save these temporary preview changes over the generated layout.
Theme tokens use `{{COLOR_TEXT}}`, `{{SIZE_BODY}}`, and `{{FONT}}`. Colors in native
layouts are four RGBA numbers from 0 to 1. Runtime button colors use eight-digit
ARGB hex values. Includes use `{{include:pages/SettingsPage.layout.in}}` and resolve
relative to this directory. Includes cannot escape this directory or form cycles.
Keep page IDs stable in `navigation.json`: existing scripts and native tests use
them. Reorder a group's `pages` list to reorder its sidebar; reorder `groups` to
reorder main tabs. Each page belongs to exactly one group, whose first page opens
when its main tab is clicked. The shell currently accommodates up to eight main
sections and eight sidebar entries per section. Navigation button geometry lives
in the presentation builder's `navigation()` function; page geometry stays in its
layout fragment. Main tabs occupy the top strip; sidebar controls stay left of
the full-width content area.
To add a page, append a stable ID/key/widget/button/label entry, add its key to a
group, create its page fragment, and include it in the shell. Give controls unique
widget names. Changing a widget name also requires updating its code bindings.
## Where behavior lives
All script paths below are under `addons/core/Scripts/Game/ERR/00_Core/`.
| Responsibility | File |
| --- | --- |
| Field keys, display formatting, capability gates, command mapping | `ERR_AdminMenuFields.c` |
| Page IDs and navigation data (generated) | `ERR_AdminMenuPages.c` |
| Page/sidebar visibility and selected navigation | `ERR_AdminMenuView.c` |
| Runtime palette (generated) | `ERR_MenuTheme.c` |
| Selected/action/status button styling | `ERR_SelectionStyle.c` |
| Dialog lifetime, polling, drafts, snapshots and command submission | `ERR_AdminMenu.c` |
| Item, terrain, faction, speech and backpack behavior | Their existing `*Menu.c` modules |
| Authorization, validation and persistence | `ERR_AdminSession.c`, `ERR_AdminService.c`, `ERR_Settings.c` |
Use `ERR_AdminPage.SARKA` or another named page when linking from code. Visual
changes do not belong in settings persistence or mission gameplay services.
An editable field still needs an authorized command and validated setting; a new
layout control alone does not grant permission or create a setting.
@@ -0,0 +1,21 @@
ButtonWidgetClass : "{0022F0B45ADBC5AC}UI/layouts/WidgetLibrary/EditBox/WLib_EditBox.layout" {
Name "AdminValue"
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_bUseLabel 0
m_sLabel ""
m_fSizeWithoutLabel 42
}
}
{
VerticalLayoutWidgetClass "{5AA4D27F39EB2514}" {
Prefab "{5AA4D27F39EB2514}"
{
SizeLayoutWidgetClass "{5538C205B27B0F5D}" {
Prefab "{5538C205B27B0F5D}"
HeightOverride 42
}
}
}
}
}
@@ -0,0 +1,9 @@
SizeLayoutWidgetClass { Name "ContentRow" Slot LayoutSlot { HorizontalAlign 3 Padding 0 0 0 16 } WidthOverride 900 HeightOverride 160 {
FrameWidgetClass { Name "ContentRowBody" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 } {
TextWidgetClass { Name "PackLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 0 OffsetTop 0 SizeX 718 OffsetRight -718 SizeY 32 OffsetBottom -32 } Color {{COLOR_TEXT}} Text "Content pack" "Font Size" {{SIZE_ROW_TITLE}} "Min Font Size" {{SIZE_ROW_TITLE}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "SelectionState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 734 OffsetLeft 734 PositionY 0 OffsetTop 0 SizeX 160 OffsetRight -894 SizeY 32 OffsetBottom -32 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Waiting..." m_fDisabledOpacity 1 } } }
TextWidgetClass { Name "PackState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 40 OffsetTop 40 SizeX 900 OffsetRight -900 SizeY 30 OffsetBottom -70 } Color {{COLOR_TEXT}} Text "Waiting for server settings..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Enable" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 90 OffsetTop 90 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -132 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enable" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Disable" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 196 OffsetLeft 196 PositionY 90 OffsetTop 90 SizeX 180 OffsetRight -376 SizeY 42 OffsetBottom -132 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disable" } } }
} }
} }
@@ -0,0 +1,9 @@
SizeLayoutWidgetClass { Name "ItemRow" WidthOverride 900 HeightOverride 180 Slot LayoutSlot { HorizontalAlign 3 Padding 0 0 0 16 } {
FrameWidgetClass { Name "ContentRowBody" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 } {
TextWidgetClass { Name "PackLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 0 OffsetTop 0 SizeX 718 OffsetRight -718 SizeY 32 OffsetBottom -32 } Color {{COLOR_TEXT}} Text "Content pack" "Font Size" {{SIZE_ROW_TITLE}} "Min Font Size" {{SIZE_ROW_TITLE}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "SelectionState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 734 OffsetLeft 734 PositionY 0 OffsetTop 0 SizeX 160 OffsetRight -894 SizeY 32 OffsetBottom -32 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Waiting..." m_fDisabledOpacity 1 } } }
TextWidgetClass { Name "PackState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 36 OffsetTop 36 SizeX 900 OffsetRight -900 SizeY 66 OffsetBottom -102 } Color {{COLOR_TEXT}} Text "Waiting for server settings..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Enable" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 112 OffsetTop 112 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -154 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enable" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Disable" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 196 OffsetLeft 196 PositionY 112 OffsetTop 112 SizeX 180 OffsetRight -376 SizeY 42 OffsetBottom -154 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disable" } } }
} }
} }
@@ -0,0 +1,10 @@
SizeLayoutWidgetClass { Name "ItemWeightRow" WidthOverride 900 HeightOverride 154 Slot LayoutSlot { HorizontalAlign 3 Padding 0 0 0 12 } {
FrameWidgetClass { Name "ItemWeightBody" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 } {
TextWidgetClass { Name "WeightLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 0 OffsetTop 0 SizeX 900 OffsetRight -900 SizeY 28 OffsetBottom -28 } Color {{COLOR_TEXT}} Text "Item" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "WeightState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 34 OffsetTop 34 SizeX 900 OffsetRight -900 SizeY 46 OffsetBottom -80 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "WeightValueLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 96 OffsetTop 96 SizeX 280 OffsetRight -280 SizeY 36 OffsetBottom -132 } Color {{COLOR_TEXT}} Text "Item weight (0-100)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "WeightValue" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 300 OffsetLeft 300 PositionY 90 OffsetTop 90 SizeX 110 OffsetRight -410 SizeY 42 OffsetBottom -132 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "WeightApply" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 430 OffsetLeft 430 PositionY 90 OffsetTop 90 SizeX 160 OffsetRight -590 SizeY 42 OffsetBottom -132 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "WeightNormal" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 610 OffsetLeft 610 PositionY 90 OffsetTop 90 SizeX 200 OffsetRight -810 SizeY 42 OffsetBottom -132 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Normal (1)" } } }
} }
} }
+7
View File
@@ -0,0 +1,7 @@
{
"AdminMenu.layout": "shell.layout.in",
"AdminValue.layout": "components/AdminValue.layout.in",
"ContentRow.layout": "components/ContentRow.layout.in",
"ItemRow.layout": "components/ItemRow.layout.in",
"ItemWeightRow.layout": "components/ItemWeightRow.layout.in"
}
+222
View File
@@ -0,0 +1,222 @@
{
"groups": [
{
"name": "Mission",
"pages": [
"MISSION",
"WORLD",
"TERRAINS"
]
},
{
"name": "Forces",
"pages": [
"FORCES",
"FACTIONS",
"GUARDS",
"SITES",
"SARKA"
]
},
{
"name": "HQ",
"pages": [
"HQ",
"AI",
"PLANE"
]
},
{
"name": "Intel",
"pages": [
"INTEL"
]
},
{
"name": "Items",
"pages": [
"ITEMS",
"ALLOWED_ITEMS",
"WEIGHTS",
"ITEM_PRESETS",
"STARTER"
]
},
{
"name": "Mods",
"pages": [
"MODS",
"RECOMMENDATIONS"
]
},
{
"name": "Audio",
"pages": [
"SPEECH"
]
},
{
"name": "Status",
"pages": [
"STATUS",
"JOURNAL"
]
}
],
"pages": [
{
"id": 0,
"key": "MISSION",
"widget": "SettingsPage",
"button": "OpenSettings",
"label": "General"
},
{
"id": 1,
"key": "HQ",
"widget": "HQPage",
"button": "OpenHQ",
"label": "HQ settings"
},
{
"id": 2,
"key": "JOURNAL",
"widget": "JournalPage",
"button": "OpenJournal",
"label": "Journal"
},
{
"id": 3,
"key": "MODS",
"widget": "ModsPage",
"button": "OpenMods",
"label": "Installed mods"
},
{
"id": 4,
"key": "FACTIONS",
"widget": "FactionsPage",
"button": "OpenFactions",
"label": "Factions"
},
{
"id": 5,
"key": "WORLD",
"widget": "WorldPage",
"button": "OpenWorld",
"label": "World"
},
{
"id": 6,
"key": "INTEL",
"widget": "IntelPage",
"button": "OpenIntel",
"label": "Intelligence"
},
{
"id": 7,
"key": "STATUS",
"widget": "StatusPage",
"button": "OpenStatus",
"label": "Mission status"
},
{
"id": 8,
"key": "TERRAINS",
"widget": "TerrainsPage",
"button": "OpenTerrains",
"label": "Terrains"
},
{
"id": 9,
"key": "ITEMS",
"widget": "ItemsPage",
"button": "OpenItems",
"label": "Extra equipment"
},
{
"id": 10,
"key": "SPEECH",
"widget": "TTSPage",
"button": "OpenTTS",
"label": "Speech and sounds"
},
{
"id": 11,
"key": "FORCES",
"widget": "ForcesPage",
"button": "OpenForces",
"label": "Patrols"
},
{
"id": 12,
"key": "GUARDS",
"widget": "GuardsPage",
"button": "OpenGuards",
"label": "Site guards"
},
{
"id": 13,
"key": "SITES",
"widget": "SitesPage",
"button": "OpenSites",
"label": "Field sites"
},
{
"id": 14,
"key": "PLANE",
"widget": "PlanePage",
"button": "OpenPlane",
"label": "Recon plane"
},
{
"id": 15,
"key": "RECOMMENDATIONS",
"widget": "RecommendationsPage",
"button": "OpenRecommendations",
"label": "Recommended mods"
},
{
"id": 16,
"key": "WEIGHTS",
"widget": "WeightsPage",
"button": "OpenWeights",
"label": "Spawn chances"
},
{
"id": 17,
"key": "ALLOWED_ITEMS",
"widget": "AllowedItemsPage",
"button": "OpenAllowedItems",
"label": "Allowed items"
},
{
"id": 18,
"key": "ITEM_PRESETS",
"widget": "ItemPresetsPage",
"button": "OpenItemPresets",
"label": "Presets"
},
{
"id": 19,
"key": "AI",
"widget": "AIPage",
"button": "OpenAI",
"label": "AI behavior"
},
{
"id": 20,
"key": "STARTER",
"widget": "StarterPage",
"button": "OpenStarter",
"label": "Starting backpack"
},
{
"id": 21,
"key": "SARKA",
"widget": "SarkaPage",
"button": "OpenSarka",
"label": "Šárka hunters"
}
]
}
+15
View File
@@ -0,0 +1,15 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_AIPage}} Name "AIPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "AIHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 720 OffsetRight -748 SizeY 42 OffsetBottom -48 } Color {{COLOR_TEXT}} Text "AI doctrine - changes apply next round." "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_aiDoctrine" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 76 OffsetTop 76 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -104 } Color {{COLOR_TEXT}} Text "Hunting doctrine: Current or Coordinated" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "aiDoctrine" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 108 OffsetTop 108 SizeX 360 OffsetRight -388 SizeY 38 OffsetBottom -146 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_aiDoctrine" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 400 OffsetLeft 400 PositionY 108 OffsetTop 108 SizeX 112 OffsetRight -512 SizeY 38 OffsetBottom -146 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_aiDoctrine" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 536 OffsetLeft 536 PositionY 116 OffsetTop 116 SizeX 428 OffsetRight -964 SizeY 26 OffsetBottom -142 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_aiDoctrine" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 152 OffsetTop 152 SizeX 936 OffsetRight -964 SizeY 42 OffsetBottom -194 } Color {{COLOR_TEXT}} Text "Current keeps existing behaviour. Coordinated assigns squads to a shared search operation." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_aiShadow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 206 OffsetTop 206 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -234 } Color {{COLOR_TEXT}} Text "Proposal logging: On or Off" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "aiShadow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 238 OffsetTop 238 SizeX 360 OffsetRight -388 SizeY 38 OffsetBottom -276 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_aiShadow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 400 OffsetLeft 400 PositionY 238 OffsetTop 238 SizeX 112 OffsetRight -512 SizeY 38 OffsetBottom -276 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_aiShadow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 536 OffsetLeft 536 PositionY 246 OffsetTop 246 SizeX 428 OffsetRight -964 SizeY 26 OffsetBottom -272 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_aiShadow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 282 OffsetTop 282 SizeX 936 OffsetRight -964 SizeY 42 OffsetBottom -324 } Color {{COLOR_TEXT}} Text "On logs coordinated proposals while Current keeps control. No coordinated orders are issued." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "AIChangesHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 350 OffsetTop 350 SizeX 936 OffsetRight -964 SizeY 72 OffsetBottom -422 } Color {{COLOR_TEXT}} Text "Current is the default. Proposal logging is for comparing plans before enabling coordinated orders. Neither setting changes the running round." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
@@ -0,0 +1,24 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_AllowedItemsPage}} Name "AllowedItemsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "ItemsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 48 OffsetBottom -52 } Color {{COLOR_TEXT}} Text "Choose a mod, then allow or block its items. Allow all / Block all resets individual selections for this mod. Changes affect future extra equipment." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "ItemsMod" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 58 OffsetTop 58 SizeX 420 OffsetRight -448 SizeY 42 OffsetBottom -100 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsShow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 458 OffsetLeft 458 PositionY 58 OffsetTop 58 SizeX 150 OffsetRight -608 SizeY 42 OffsetBottom -100 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Show items" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsEnableAll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 618 OffsetLeft 618 PositionY 58 OffsetTop 58 SizeX 166 OffsetRight -784 SizeY 42 OffsetBottom -100 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Allow all" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsDisableAll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 794 OffsetLeft 794 PositionY 58 OffsetTop 58 SizeX 170 OffsetRight -964 SizeY 42 OffsetBottom -100 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Block all" } } }
TextWidgetClass { Name "ItemsScan" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 104 OffsetTop 104 SizeX 756 OffsetRight -784 SizeY 24 OffsetBottom -128 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsSelectionState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 804 OffsetLeft 804 PositionY 102 OffsetTop 102 SizeX 160 OffsetRight -964 SizeY 28 OffsetBottom -130 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Waiting..." m_fDisabledOpacity 1 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsPrevious" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 132 OffsetTop 132 SizeX 130 OffsetRight -158 SizeY 42 OffsetBottom -174 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Previous" } } }
TextWidgetClass { Name "ItemsPageState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 136 OffsetTop 136 SizeX 646 OffsetRight -816 SizeY 40 OffsetBottom -176 } Color {{COLOR_TEXT}} Text "Choose a mod and press Show items." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsNext" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 834 OffsetLeft 834 PositionY 132 OffsetTop 132 SizeX 130 OffsetRight -964 SizeY 42 OffsetBottom -174 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Next" } } }
ScrollLayoutWidgetClass { Name "ItemsScroll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 180 OffsetTop 180 SizeX 936 OffsetRight -964 SizeY 246 OffsetBottom -426 } { VerticalLayoutWidgetClass { Name "ItemsContent" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 Padding 8 4 14 4 } { TextWidgetClass { Name "ItemsText" Slot LayoutSlot { HorizontalAlign 3 Padding 0 0 0 8 SizeMode Fill } Text "Choose a mod to edit its inventory items." "Font Size" {{SIZE_BODY}} Wrap 1 } } } } }
} }
@@ -0,0 +1,19 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_FactionsPage}} Name "FactionsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "FactionHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Choose three different factions, then Apply. Random all saves immediately and picks anew each round." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass { Name "FactionLabel_escapists" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 76 OffsetTop 76 SizeX 280 OffsetRight -308 SizeY 32 OffsetBottom -108 } Color {{COLOR_TEXT}} Text "Your faction (Escapists)" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "FactionSelect_escapists" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 320 OffsetLeft 320 PositionY 76 OffsetTop 76 SizeX 644 OffsetRight -964 SizeY 42 OffsetBottom -118 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
TextWidgetClass { Name "FactionState_escapists" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 124 OffsetTop 124 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -168 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "FactionLabel_enemy" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 184 OffsetTop 184 SizeX 280 OffsetRight -308 SizeY 32 OffsetBottom -216 } Color {{COLOR_TEXT}} Text "Main enemy (controls HQ)" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "FactionSelect_enemy" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 320 OffsetLeft 320 PositionY 184 OffsetTop 184 SizeX 644 OffsetRight -964 SizeY 42 OffsetBottom -226 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
TextWidgetClass { Name "FactionState_enemy" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 232 OffsetTop 232 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -276 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "FactionLabel_independent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 292 OffsetTop 292 SizeX 280 OffsetRight -308 SizeY 32 OffsetBottom -324 } Color {{COLOR_TEXT}} Text "Other hostile faction (FIA role)" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "FactionSelect_independent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 320 OffsetLeft 320 PositionY 292 OffsetTop 292 SizeX 644 OffsetRight -964 SizeY 42 OffsetBottom -334 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
TextWidgetClass { Name "FactionState_independent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 340 OffsetTop 340 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -384 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "FactionsRandomAll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 418 OffsetTop 418 SizeX 220 OffsetRight -248 SizeY 42 OffsetBottom -460 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Random all" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "FactionsApply" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 742 OffsetLeft 742 PositionY 418 OffsetTop 418 SizeX 222 OffsetRight -964 SizeY 42 OffsetBottom -460 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply factions" } } }
} }
+148
View File
@@ -0,0 +1,148 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_ForcesPage}} Name "ForcesPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "ForcesHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Enemy patrols, site guards and equipment. Equipment changes apply to newly equipped soldiers." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 66 OffsetTop 66 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -92 }
Color {{COLOR_TEXT}} Text "Convoys (0-20)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -134 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -134 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 136 OffsetTop 136 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -158 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 292 OffsetLeft 292 PositionY 96 OffsetTop 96 SizeX 180 OffsetRight -472 SizeY 38 OffsetBottom -134 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_convoyCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -484 SizeY 32 OffsetBottom -192 }
Color {{COLOR_MUTED}} Text "0 disables convoys. Lost convoys stay lost. Next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass { Name "Label_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 66 OffsetTop 66 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -92 } Color {{COLOR_TEXT}} Text "Roadblocks (0-30; 0 off)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 96 OffsetTop 96 SizeX 130 OffsetRight -638 SizeY 38 OffsetBottom -134 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 650 OffsetLeft 650 PositionY 96 OffsetTop 96 SizeX 110 OffsetRight -760 SizeY 38 OffsetBottom -134 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 136 OffsetTop 136 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -158 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_roadblockCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -192 } Color {{COLOR_TEXT}} Text "Four guards per post. Applies next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "GuardLinkLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 202 OffsetTop 202 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -230 } Color {{COLOR_TEXT}} Text "Building guards, camps and hospitals" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "GuardLinkHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 296 OffsetTop 296 SizeX 456 OffsetRight -484 SizeY 32 OffsetBottom -328 } Color {{COLOR_TEXT}} Text "Site counts, building guards and HQ participation." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_hunterSpawnDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 202 OffsetTop 202 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -228 } Color {{COLOR_TEXT}} Text "Opening patrol distance (800-3000 m)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "hunterSpawnDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 232 OffsetTop 232 SizeX 130 OffsetRight -638 SizeY 38 OffsetBottom -270 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_hunterSpawnDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 650 OffsetLeft 650 PositionY 232 OffsetTop 232 SizeX 110 OffsetRight -760 SizeY 38 OffsetBottom -270 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_hunterSpawnDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 272 OffsetTop 272 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -294 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_hunterSpawnDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 296 OffsetTop 296 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -328 } Color {{COLOR_TEXT}} Text "Opening UAZ and troop-truck patrols. Next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass {
Name "Label_antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 338 OffsetTop 338 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -364 }
Color {{COLOR_TEXT}} Text "Anti-air carriers (0-100%)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 368 OffsetTop 368 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -406 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 368 OffsetTop 368 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -406 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 408 OffsetTop 408 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -430 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 292 OffsetLeft 292 PositionY 368 OffsetTop 368 SizeX 180 OffsetRight -472 SizeY 38 OffsetBottom -406 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_antiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 432 OffsetTop 432 SizeX 456 OffsetRight -484 SizeY 32 OffsetBottom -464 }
Color {{COLOR_MUTED}} Text "Chance of an anti-air launcher for newly equipped soldiers." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 338 OffsetTop 338 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -364 }
Color {{COLOR_TEXT}} Text "Mine carriers (0-100%)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 368 OffsetTop 368 SizeX 130 OffsetRight -638 SizeY 38 OffsetBottom -406 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 650 OffsetLeft 650 PositionY 368 OffsetTop 368 SizeX 110 OffsetRight -760 SizeY 38 OffsetBottom -406 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 408 OffsetTop 408 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -430 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 772 OffsetLeft 772 PositionY 368 OffsetTop 368 SizeX 180 OffsetRight -952 SizeY 38 OffsetBottom -406 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_antiPersonnelMineChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 432 OffsetTop 432 SizeX 456 OffsetRight -964 SizeY 32 OffsetBottom -464 }
Color {{COLOR_MUTED}} Text "Chance of anti-personnel mines for newly equipped soldiers." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
} }
+27
View File
@@ -0,0 +1,27 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_GuardsPage}} Name "GuardsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "GuardsHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color {{COLOR_TEXT}} Text "Building guards - changes apply next round" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "GuardsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 48 OffsetTop 48 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -92 } Color {{COLOR_TEXT}} Text "Nearby eligible buildings share one site. Fixed guards defend their posts; all guards report contacts." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_objectGuardCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 100 OffsetTop 100 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -126 } Color {{COLOR_TEXT}} Text "Soldiers per guarded site (0-16; 0 disables)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "objectGuardCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 130 OffsetTop 130 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -168 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_objectGuardCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 130 OffsetTop 130 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -168 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_objectGuardCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 171 OffsetTop 171 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -193 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_objectGuardCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 195 OffsetTop 195 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -221 } Color {{COLOR_TEXT}} Text "Towers and chimneys use suitable platforms. Lost guards are not replaced." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_objectGuardEvery" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 225 OffsetTop 225 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -251 } Color {{COLOR_TEXT}} Text "Guard every Nth eligible site (1-4)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "objectGuardEvery" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 255 OffsetTop 255 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -293 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_objectGuardEvery" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 255 OffsetTop 255 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -293 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_objectGuardEvery" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 296 OffsetTop 296 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -318 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_objectGuardEvery" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 320 OffsetTop 320 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -346 } Color {{COLOR_TEXT}} Text "1 = every site; 2 = every second; 3 = every third; 4 = every fourth." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardEvery_1" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 292 OffsetLeft 292 PositionY 255 OffsetTop 255 SizeX 155 OffsetRight -447 SizeY 38 OffsetBottom -293 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Every site" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardEvery_2" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 459 OffsetLeft 459 PositionY 255 OffsetTop 255 SizeX 155 OffsetRight -614 SizeY 38 OffsetBottom -293 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Every 2nd" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardEvery_3" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 626 OffsetLeft 626 PositionY 255 OffsetTop 255 SizeX 155 OffsetRight -781 SizeY 38 OffsetBottom -293 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Every 3rd" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardEvery_4" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 793 OffsetLeft 793 PositionY 255 OffsetTop 255 SizeX 155 OffsetRight -948 SizeY 38 OffsetBottom -293 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Every 4th" } } }
TextWidgetClass { Name "Label_objectGuardHQMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 350 OffsetTop 350 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -376 } Color {{COLOR_TEXT}} Text "HQ participation (0-2)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "objectGuardHQMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 380 OffsetTop 380 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -418 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_objectGuardHQMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 170 OffsetLeft 170 PositionY 380 OffsetTop 380 SizeX 110 OffsetRight -280 SizeY 38 OffsetBottom -418 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_objectGuardHQMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 421 OffsetTop 421 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -443 } Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_objectGuardHQMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 445 OffsetTop 445 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -471 } Color {{COLOR_TEXT}} Text "0 = hold positions; 1 = half hold and half respond; 2 = all can respond." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardHQ_0" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 292 OffsetLeft 292 PositionY 380 OffsetTop 380 SizeX 210 OffsetRight -502 SizeY 38 OffsetBottom -418 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Hold positions" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardHQ_1" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 514 OffsetLeft 514 PositionY 380 OffsetTop 380 SizeX 210 OffsetRight -724 SizeY 38 OffsetBottom -418 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Half to HQ" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "GuardHQ_2" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 736 OffsetLeft 736 PositionY 380 OffsetTop 380 SizeX 210 OffsetRight -946 SizeY 38 OffsetBottom -418 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "All to HQ" } } }
} }
+179
View File
@@ -0,0 +1,179 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_HQPage}} Name "HQPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "HQHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 510 OffsetRight -538 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Enemy reports, ground response and aircraft." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 66 OffsetTop 66 SizeX 368 OffsetRight -396 SizeY 26 OffsetBottom -92 }
Color {{COLOR_TEXT}} Text "Sighting-report interval (5-60 s)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 66 OffsetTop 66 SizeX 240 OffsetRight -648 SizeY 38 OffsetBottom -104 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 66 OffsetTop 66 SizeX 112 OffsetRight -772 SizeY 38 OffsetBottom -104 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 106 OffsetTop 106 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -128 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 66 OffsetTop 66 SizeX 180 OffsetRight -964 SizeY 38 OffsetBottom -104 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_reportIntervalSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 130 OffsetTop 130 SizeX 936 OffsetRight -964 SizeY 32 OffsetBottom -162 }
Color {{COLOR_MUTED}} Text "Time between sighting-report attempts. Radio transmission takes extra time. Applies immediately." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 166 OffsetTop 166 SizeX 368 OffsetRight -396 SizeY 26 OffsetBottom -192 }
Color {{COLOR_TEXT}} Text "HQ ground support squads (0-8)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 166 OffsetTop 166 SizeX 240 OffsetRight -648 SizeY 38 OffsetBottom -204 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 166 OffsetTop 166 SizeX 112 OffsetRight -772 SizeY 38 OffsetBottom -204 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 206 OffsetTop 206 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -228 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 166 OffsetTop 166 SizeX 180 OffsetRight -964 SizeY 38 OffsetBottom -204 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_supportSquadLimit" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 230 OffsetTop 230 SizeX 936 OffsetRight -964 SizeY 32 OffsetBottom -262 }
Color {{COLOR_MUTED}} Text "Base limit for HQ response squads; identified losses can raise it. 0 disables this response." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 266 OffsetTop 266 SizeX 368 OffsetRight -396 SizeY 26 OffsetBottom -292 }
Color {{COLOR_TEXT}} Text "HQ response radius (500-5000 m)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 266 OffsetTop 266 SizeX 240 OffsetRight -648 SizeY 38 OffsetBottom -304 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 266 OffsetTop 266 SizeX 112 OffsetRight -772 SizeY 38 OffsetBottom -304 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 306 OffsetTop 306 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -328 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 266 OffsetTop 266 SizeX 180 OffsetRight -964 SizeY 38 OffsetBottom -304 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_responseRadiusMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 330 OffsetTop 330 SizeX 936 OffsetRight -964 SizeY 32 OffsetBottom -362 }
Color {{COLOR_MUTED}} Text "How far HQ looks for nearby response squads, in metres. Applies immediately." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 366 OffsetTop 366 SizeX 368 OffsetRight -396 SizeY 26 OffsetBottom -392 }
Color {{COLOR_TEXT}} Text "Search helicopter delay (1-1440 min)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 366 OffsetTop 366 SizeX 240 OffsetRight -648 SizeY 38 OffsetBottom -404 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 366 OffsetTop 366 SizeX 112 OffsetRight -772 SizeY 38 OffsetBottom -404 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
TextWidgetClass {
Name "Saved_heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 406 OffsetTop 406 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -428 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 366 OffsetTop 366 SizeX 180 OffsetRight -964 SizeY 38 OffsetBottom -404 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Help_heliTimerMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 430 OffsetTop 430 SizeX 936 OffsetRight -964 SizeY 32 OffsetBottom -462 }
Color {{COLOR_MUTED}} Text "Minutes between search helicopter flights. Changes reset a waiting countdown; an active flight continues." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
} }
+117
View File
@@ -0,0 +1,117 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_IntelPage}} Name "IntelPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "IntelHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Control how often soldiers carry intel and whether the first clue reveals an exact location." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 80 OffsetTop 80 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -108 }
Color {{COLOR_TEXT}} Text "AI carrying intel (0-100%)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -136 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 136 OffsetTop 136 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -156 }
Color {{COLOR_MUTED}} Text "Chance for each new enemy soldier to carry intel. Reassign carried intel updates existing soldiers." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 80 OffsetTop 80 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -122 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 80 OffsetTop 80 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -122 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_aiIntelChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 80 OffsetTop 80 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -122 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Label_intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 168 OffsetTop 168 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -196 }
Color {{COLOR_TEXT}} Text "First-document exact reveal (0-100%)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 200 OffsetTop 200 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -224 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 224 OffsetTop 224 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -244 }
Color {{COLOR_MUTED}} Text "First clue: chance to reveal the exact site. Otherwise a question mark shows an approximate area." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 168 OffsetTop 168 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -210 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 168 OffsetTop 168 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -210 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_intelRevealChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 168 OffsetTop 168 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -210 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "IntelSummary" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 276 OffsetTop 276 SizeX 260 OffsetRight -288 SizeY 42 OffsetBottom -318 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Intel summary"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "RerollIntel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 306 OffsetLeft 306 PositionY 276 OffsetTop 276 SizeX 260 OffsetRight -566 SizeY 42 OffsetBottom -318 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Reassign carried intel"
}
}
}
TextWidgetClass {
Name "IntelRerollHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 336 OffsetTop 336 SizeX 936 OffsetRight -964 SizeY 52 OffsetBottom -388 }
Color {{COLOR_TEXT}} Text "Reassign carried intel uses the saved chance on existing AI. Intel already collected stays revealed." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "EvidenceHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 402 OffsetTop 402 SizeX 936 OffsetRight -964 SizeY 60 OffsetBottom -462 }
Color {{COLOR_TEXT}} Text "Enemy bodies stay until a recovery team searches them and reports to HQ. Cleanup is then enabled with a five-minute delay." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
} }
@@ -0,0 +1,14 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_ItemPresetsPage}} Name "ItemPresetsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "PresetsHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -34 } Color {{COLOR_TEXT}} Text "Save your item selections" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "PresetsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 42 OffsetTop 42 SizeX 936 OffsetRight -964 SizeY 46 OffsetBottom -88 } Color {{COLOR_TEXT}} Text "A preset includes allowed / blocked items and their weights across all mods. It does not change the overall extra-equipment chance. Missing mods stay inactive." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "ItemsPresetsLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 98 OffsetTop 98 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -124 } Color {{COLOR_TEXT}} Text "Saved presets" "Font Size" {{SIZE_HELP}} FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "ItemsPresets" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 134 OffsetTop 134 SizeX 560 OffsetRight -588 SizeY 42 OffsetBottom -176 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsPresetLoad" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 608 OffsetLeft 608 PositionY 134 OffsetTop 134 SizeX 170 OffsetRight -778 SizeY 42 OffsetBottom -176 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Load" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsPresetDelete" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 794 OffsetLeft 794 PositionY 134 OffsetTop 134 SizeX 170 OffsetRight -964 SizeY 42 OffsetBottom -176 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Delete" } } }
TextWidgetClass { Name "ItemsPresetNameLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 214 OffsetTop 214 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -240 } Color {{COLOR_TEXT}} Text "New / replacement preset name" "Font Size" {{SIZE_HELP}} FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "ItemsPresetName" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 250 OffsetTop 250 SizeX 560 OffsetRight -588 SizeY 42 OffsetBottom -292 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ItemsPresetSave" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 608 OffsetLeft 608 PositionY 250 OffsetTop 250 SizeX 356 OffsetRight -964 SizeY 42 OffsetBottom -292 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Save / replace" } } }
TextWidgetClass { Name "ItemsStorage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 354 OffsetTop 354 SizeX 936 OffsetRight -964 SizeY 62 OffsetBottom -416 } Color {{COLOR_TEXT}} Text "Auto-saved. Presets cover all mods. Name: letters, digits, _ or - (24 max)." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "PresetNamesHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 304 OffsetTop 304 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -348 } Color {{COLOR_TEXT}} Text "Names: up to 24 letters, digits, _ or -. Save / replace overwrites a preset with the same name." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+14
View File
@@ -0,0 +1,14 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_ItemsPage}} Name "ItemsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "EquipmentHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -34 } Color {{COLOR_TEXT}} Text "Extra equipment for enemy soldiers" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "EquipmentIntro" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 42 OffsetTop 42 SizeX 936 OffsetRight -964 SizeY 46 OffsetBottom -88 } Color {{COLOR_TEXT}} Text "Newly equipped soldiers can receive one extra item from the allowed catalog. First choose how often this happens, then choose which items are more common." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 102 OffsetTop 102 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -132 } Color {{COLOR_TEXT}} Text "Soldiers receiving an extra-item attempt (0-100%)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 140 OffsetTop 140 SizeX 180 OffsetRight -208 SizeY 42 OffsetBottom -182 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 228 OffsetLeft 228 PositionY 140 OffsetTop 140 SizeX 180 OffsetRight -408 SizeY 42 OffsetBottom -182 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Random_automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 428 OffsetLeft 428 PositionY 140 OffsetTop 140 SizeX 180 OffsetRight -608 SizeY 42 OffsetBottom -182 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Random" } } }
TextWidgetClass { Name "Saved_automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 628 OffsetLeft 628 PositionY 146 OffsetTop 146 SizeX 336 OffsetRight -964 SizeY 32 OffsetBottom -178 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_automaticEquipmentChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 194 OffsetTop 194 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -238 } Color {{COLOR_TEXT}} Text "0 = no extra items. 100 = every eligible soldier gets an attempt. Full inventories can refuse an item; medics keep space for medical supplies." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "WeightsChance" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 246 OffsetTop 246 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -290 } Color {{COLOR_TEXT}} Text "Waiting for server..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "EquipmentSteps" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 306 OffsetTop 306 SizeX 936 OffsetRight -964 SizeY 46 OffsetBottom -352 } Color {{COLOR_TEXT}} Text "Example: 50% overall chance with a 20% item share means about 10% of eligible soldiers attempt that item. A weight of 100 does not mean 100%." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "EquipmentTiming" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 374 OffsetTop 374 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -418 } Color {{COLOR_TEXT}} Text "Apply saves the chance above. Item buttons save immediately. Changes affect future equipment rolls; existing soldiers keep their gear." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+57
View File
@@ -0,0 +1,57 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_JournalPage}} Name "JournalPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "JournalHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Each entry explains what happened. Queued means awaiting radio delivery; received means delivered." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ScrollLayoutWidgetClass {
Name "JournalScroll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 58 OffsetTop 58 SizeX 936 OffsetRight -964 SizeY 320 OffsetBottom -378 }
components {
SCR_GamepadScrollComponent "{5707100AC31E657E}" {
}
}
{
VerticalLayoutWidgetClass {
Name "JournalContent" Slot AlignableSlot {
HorizontalAlign 3 VerticalAlign 3 Padding 8 4 14 4
}
{
TextWidgetClass {
Name "JournalText" Slot LayoutSlot {
HorizontalAlign 3 Padding 0 0 0 8 SizeMode Fill
}
Clipping Ancestor Color {{COLOR_TEXT}} Text "Waiting for the first HQ event..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
}
}
}
}
TextWidgetClass {
Name "JournalState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 386 OffsetTop 386 SizeX 936 OffsetRight -964 SizeY 42 OffsetBottom -428 }
Color {{COLOR_TEXT}} Text "Waiting for the server..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "PauseJournal" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 438 OffsetTop 438 SizeX 220 OffsetRight -248 SizeY 42 OffsetBottom -480 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Pause live"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "JournalDetails" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 310 OffsetLeft 310 PositionY 438 OffsetTop 438 SizeX 360 OffsetRight -670 SizeY 42 OffsetBottom -480 }
components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Show technical details" } }
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "LatestJournal" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 742 OffsetLeft 742 PositionY 438 OffsetTop 438 SizeX 222 OffsetRight -964 SizeY 42 OffsetBottom -480 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Jump to latest"
}
}
}
} }
+17
View File
@@ -0,0 +1,17 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_ModsPage}} Name "ModsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "ModsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 650 OffsetRight -678 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Mission content switches are followed by all server-loaded mods. Workshop mods stay loaded; use Edit items to manage their random equipment." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "ModsScope" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 58 OffsetTop 58 SizeX 936 OffsetRight -964 SizeY 46 OffsetBottom -104 }
Color {{COLOR_TEXT}} Text "Switches apply only to supported mission content, next round. Use Edit items for random equipment and presets." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ScrollLayoutWidgetClass { Name "ModsScroll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 936 OffsetRight -964 SizeY 362 OffsetBottom -474 } {
VerticalLayoutWidgetClass { Name "ModList" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 } { } }
} }
} }
+23
View File
@@ -0,0 +1,23 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_PlanePage}} Name "PlanePage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "PlaneHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color {{COLOR_TEXT}} Text "Cessna patrol - changes apply next round" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "PlaneHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 50 OffsetTop 50 SizeX 936 OffsetRight -964 SizeY 48 OffsetBottom -98 } Color {{COLOR_TEXT}} Text "Requires Cessna 172, Propeller Flight Core and a usable airport. Without the addons, no plane spawns." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "PlaneLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 360 OffsetRight -388 SizeY 32 OffsetBottom -144 } Color {{COLOR_TEXT}} Text "Patrol enabled next round" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "PlaneOn" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 106 OffsetTop 106 SizeX 160 OffsetRight -568 SizeY 38 OffsetBottom -144 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enabled" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "PlaneOff" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 580 OffsetLeft 580 PositionY 106 OffsetTop 106 SizeX 160 OffsetRight -740 SizeY 38 OffsetBottom -144 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disabled" } } }
TextWidgetClass { Name "Label_planeAltitudeMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 170 OffsetTop 170 SizeX 440 OffsetRight -468 SizeY 30 OffsetBottom -200 } Color {{COLOR_TEXT}} Text "Patrol altitude (150-500 m; default 250)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "planeAltitudeMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 170 OffsetTop 170 SizeX 160 OffsetRight -640 SizeY 38 OffsetBottom -208 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_planeAltitudeMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 652 OffsetLeft 652 PositionY 170 OffsetTop 170 SizeX 112 OffsetRight -764 SizeY 38 OffsetBottom -208 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_planeAltitudeMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 210 OffsetTop 210 SizeX 484 OffsetRight -964 SizeY 22 OffsetBottom -232 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_planeAltitudeMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 236 OffsetTop 236 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -264 } Color {{COLOR_TEXT}} Text "Clearance above terrain ahead. Climbing and turning take time." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_planeReplacementSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 270 OffsetTop 270 SizeX 440 OffsetRight -468 SizeY 30 OffsetBottom -300 } Color {{COLOR_TEXT}} Text "Replacement delay (30-1800 s; default 60)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "planeReplacementSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 270 OffsetTop 270 SizeX 160 OffsetRight -640 SizeY 38 OffsetBottom -308 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_planeReplacementSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 652 OffsetLeft 652 PositionY 270 OffsetTop 270 SizeX 112 OffsetRight -764 SizeY 38 OffsetBottom -308 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_planeReplacementSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 310 OffsetTop 310 SizeX 484 OffsetRight -964 SizeY 22 OffsetBottom -332 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_planeReplacementSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 336 OffsetTop 336 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -364 } Color {{COLOR_TEXT}} Text "Minimum wait after losing a plane. A blocked departure area can delay it." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_planeSectorSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 370 OffsetTop 370 SizeX 440 OffsetRight -468 SizeY 30 OffsetBottom -400 } Color {{COLOR_TEXT}} Text "New patrol area (30-600 s; default 120)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "planeSectorSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 370 OffsetTop 370 SizeX 160 OffsetRight -640 SizeY 38 OffsetBottom -408 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_planeSectorSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 652 OffsetLeft 652 PositionY 370 OffsetTop 370 SizeX 112 OffsetRight -764 SizeY 38 OffsetBottom -408 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_planeSectorSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 480 OffsetLeft 480 PositionY 410 OffsetTop 410 SizeX 484 OffsetRight -964 SizeY 22 OffsetBottom -432 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_planeSectorSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 436 OffsetTop 436 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -464 } Color {{COLOR_TEXT}} Text "Chooses another area at this interval, or sooner when it reaches its destination." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
@@ -0,0 +1,22 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_RecommendationsPage}} Name "RecommendationsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "RecommendedHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color {{COLOR_TEXT}} Text "Recommended optional addons" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 47 OffsetTop 47 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -75 } Color {{COLOR_TEXT}} Text "Optional extras. Add them to the server mod list and restart. Escape also works without them." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_motorbikeCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 84 OffsetTop 84 SizeX 590 OffsetRight -618 SizeY 30 OffsetBottom -114 } Color {{COLOR_TEXT}} Text "WCS Motorbikes - patrol count (0-6; 0 off)" "Font Size" {{SIZE_LABEL_LARGE}} "Min Font Size" {{SIZE_LABEL_LARGE}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "motorbikeCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 640 OffsetLeft 640 PositionY 80 OffsetTop 80 SizeX 112 OffsetRight -752 SizeY 38 OffsetBottom -118 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_motorbikeCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 764 OffsetLeft 764 PositionY 80 OffsetTop 80 SizeX 200 OffsetRight -964 SizeY 38 OffsetBottom -118 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_motorbikeCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 640 OffsetLeft 640 PositionY 120 OffsetTop 120 SizeX 324 OffsetRight -964 SizeY 24 OffsetBottom -144 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedBikeID" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 116 OffsetTop 116 SizeX 580 OffsetRight -608 SizeY 24 OffsetBottom -140 } Color {{COLOR_TEXT}} Text "Workshop: 6503091A7B264FC3" "Font Size" {{SIZE_MINOR}} "Min Font Size" {{SIZE_MINOR}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "recommended_bikes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 145 OffsetTop 145 SizeX 936 OffsetRight -964 SizeY 25 OffsetBottom -170 } Color {{COLOR_TEXT}} Text "Waiting for server addon list" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_motorbikeCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 175 OffsetTop 175 SizeX 936 OffsetRight -964 SizeY 27 OffsetBottom -202 } Color {{COLOR_TEXT}} Text "Two special-forces crew per bike, alongside UAZ hunters. Count applies next round; losses stay lost." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedBikeRuntime" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 207 OffsetTop 207 SizeX 936 OffsetRight -964 SizeY 36 OffsetBottom -243 } Color {{COLOR_TEXT}} Text "Current round: waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedPlaneLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 256 OffsetTop 256 SizeX 740 OffsetRight -768 SizeY 28 OffsetBottom -284 } Color {{COLOR_TEXT}} Text "Cessna 172 - reconnaissance patrol" "Font Size" {{SIZE_LABEL_LARGE}} "Min Font Size" {{SIZE_LABEL_LARGE}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RecommendedPlane" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 788 OffsetLeft 788 PositionY 252 OffsetTop 252 SizeX 176 OffsetRight -964 SizeY 38 OffsetBottom -290 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Configure Cessna" } } }
TextWidgetClass { Name "RecommendedPlaneID" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 289 OffsetTop 289 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -313 } Color {{COLOR_TEXT}} Text "Workshop: 69BAEE0D439966FE | Propeller Flight Core: 69A8A34027DA65C5" "Font Size" {{SIZE_MINOR}} "Min Font Size" {{SIZE_MINOR}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "recommended_plane" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 316 OffsetTop 316 SizeX 936 OffsetRight -964 SizeY 25 OffsetBottom -341 } Color {{COLOR_TEXT}} Text "Waiting for server addon list" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedPlaneHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 345 OffsetTop 345 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -371 } Color {{COLOR_TEXT}} Text "Patrols and reports sightings. Requires a usable airport on the selected terrain." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "RecommendedWeaponsLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 385 OffsetTop 385 SizeX 740 OffsetRight -768 SizeY 28 OffsetBottom -413 } Color {{COLOR_TEXT}} Text "Phaseline Marksman Rifles - extra weapons" "Font Size" {{SIZE_LABEL_LARGE}} "Min Font Size" {{SIZE_LABEL_LARGE}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RecommendedWeapons" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 788 OffsetLeft 788 PositionY 381 OffsetTop 381 SizeX 176 OffsetRight -964 SizeY 38 OffsetBottom -419 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Manage items" } } }
TextWidgetClass { Name "RecommendedWeaponsID" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 416 OffsetTop 416 SizeX 936 OffsetRight -964 SizeY 22 OffsetBottom -438 } Color {{COLOR_TEXT}} Text "Workshop: BFC890A6F1603EC0" "Font Size" {{SIZE_MINOR}} "Min Font Size" {{SIZE_MINOR}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "recommended_weapons" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 441 OffsetTop 441 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -465 } Color {{COLOR_TEXT}} Text "Waiting for server addon list" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+11
View File
@@ -0,0 +1,11 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_SarkaPage}} Name "SarkaPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "SarkaHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color {{COLOR_TEXT}} Text "Šárka special-forces hunters" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "SarkaHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 50 OffsetTop 50 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -94 } Color {{COLOR_TEXT}} Text "Four soldiers per car, including a medic. Anger rises from identified enemy casualties." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_sarkaCarsPerAnger" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 590 OffsetRight -618 SizeY 32 OffsetBottom -144 } Color {{COLOR_TEXT}} Text "Šárkas per anger point (0-5; 0 disables waves)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "sarkaCarsPerAnger" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 640 OffsetLeft 640 PositionY 108 OffsetTop 108 SizeX 112 OffsetRight -752 SizeY 38 OffsetBottom -146 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_sarkaCarsPerAnger" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 764 OffsetLeft 764 PositionY 108 OffsetTop 108 SizeX 200 OffsetRight -964 SizeY 38 OffsetBottom -146 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_sarkaCarsPerAnger" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 640 OffsetLeft 640 PositionY 148 OffsetTop 148 SizeX 324 OffsetRight -964 SizeY 24 OffsetBottom -172 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_sarkaCarsPerAnger" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 176 OffsetTop 176 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -202 } Color {{COLOR_TEXT}} Text "Default 1; up to 30 cars per wave. Existing teams remain when disabled." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "SarkaSettingsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 424 OffsetTop 424 SizeX 936 OffsetRight -964 SizeY 52 OffsetBottom -476 } Color {{COLOR_TEXT}} Text "Apply saves this setting for new waves. Existing teams remain. Empty sessions do not build up extra waves." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
@@ -0,0 +1,45 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_SettingsPage}} Name "SettingsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "Label_startMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -26 } Color {{COLOR_TEXT}} Text "Next start (Prison or Crash)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "startMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 28 OffsetTop 28 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -60 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_startMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 28 OffsetTop 28 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -60 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_startMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 64 OffsetTop 64 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -92 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_startMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 92 OffsetTop 92 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -120 } Color {{COLOR_TEXT}} Text "Starting scenario for the next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 4 OffsetTop 4 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -26 } Color {{COLOR_TEXT}} Text "Radio defence (30-1800 seconds)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 28 OffsetTop 28 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -60 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 28 OffsetTop 28 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -60 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Random_radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 812 OffsetLeft 812 PositionY 28 OffsetTop 28 SizeX 140 OffsetRight -952 SizeY 32 OffsetBottom -60 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Random" } } }
TextWidgetClass { Name "Saved_radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 64 OffsetTop 64 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -92 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_radioDefenceSeconds" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 92 OffsetTop 92 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -120 } Color {{COLOR_TEXT}} Text "Time to defend the radio." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_startWeaponCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 124 OffsetTop 124 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -146 } Color {{COLOR_TEXT}} Text "Starting pistols (0-12)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "startWeaponCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 148 OffsetTop 148 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -180 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_startWeaponCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 148 OffsetTop 148 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -180 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_startWeaponCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 184 OffsetTop 184 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -212 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_startWeaponCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 212 OffsetTop 212 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -240 } Color {{COLOR_TEXT}} Text "Shared prison/crash backpack; next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_startMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 124 OffsetTop 124 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -146 } Color {{COLOR_TEXT}} Text "Starting spare magazines (0-48)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "startMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 148 OffsetTop 148 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -180 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_startMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 148 OffsetTop 148 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -180 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_startMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 184 OffsetTop 184 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -212 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_startMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 212 OffsetTop 212 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -240 } Color {{COLOR_TEXT}} Text "Shared backpack; 8 rounds per magazine. Next round." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "KeepWeaponLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 244 OffsetTop 244 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -266 } Color {{COLOR_TEXT}} Text "Keep held weapon when unconscious" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "KeepWeaponOn" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 268 OffsetTop 268 SizeX 140 OffsetRight -168 SizeY 32 OffsetBottom -300 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enabled" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "KeepWeaponOff" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 180 OffsetLeft 180 PositionY 268 OffsetTop 268 SizeX 152 OffsetRight -332 SizeY 32 OffsetBottom -300 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disabled" } } }
TextWidgetClass { Name "Saved_keepWeaponOnUnconscious" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 304 OffsetTop 304 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -332 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "SelfEpiLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 332 OffsetTop 332 SizeX 240 OffsetRight -268 SizeY 28 OffsetBottom -360 } Color {{COLOR_TEXT}} Text "Self epinephrine (Space)" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "SelfEpiOn" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 280 OffsetLeft 280 PositionY 332 OffsetTop 332 SizeX 90 OffsetRight -370 SizeY 28 OffsetBottom -360 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enabled" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "SelfEpiOff" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 382 OffsetLeft 382 PositionY 332 OffsetTop 332 SizeX 90 OffsetRight -472 SizeY 28 OffsetBottom -360 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disabled" } } }
TextWidgetClass { Name "Label_civilianTrafficCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 244 OffsetTop 244 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -266 } Color {{COLOR_TEXT}} Text "Civilian traffic (0-6 cars; 0 off)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "civilianTrafficCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 268 OffsetTop 268 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -300 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_civilianTrafficCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 268 OffsetTop 268 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -300 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_civilianTrafficCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 304 OffsetTop 304 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -332 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_civilianTrafficCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 332 OffsetTop 332 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -360 } Color {{COLOR_TEXT}} Text "0 disables new traffic. Player-used cars are kept." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_restartOnEmpty" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 364 OffsetTop 364 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -386 } Color {{COLOR_TEXT}} Text "Restart after last disconnect" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RestartEmptyOn" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 388 OffsetTop 388 SizeX 140 OffsetRight -168 SizeY 32 OffsetBottom -420 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enabled" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RestartEmptyOff" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 180 OffsetLeft 180 PositionY 388 OffsetTop 388 SizeX 152 OffsetRight -332 SizeY 32 OffsetBottom -420 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disabled" } } }
TextWidgetClass { Name "Saved_restartOnEmpty" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 424 OffsetTop 424 SizeX 456 OffsetRight -484 SizeY 24 OffsetBottom -448 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_restartOnEmpty" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 452 OffsetTop 452 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -480 } Color {{COLOR_TEXT}} Text "Applies now. Normal round endings still restart." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_emptyRestartHours" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 364 OffsetTop 364 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -386 } Color {{COLOR_TEXT}} Text "Restart while empty (hours)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "emptyRestartHours" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 388 OffsetTop 388 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -420 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_emptyRestartHours" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 388 OffsetTop 388 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -420 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_emptyRestartHours" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 424 OffsetTop 424 SizeX 456 OffsetRight -964 SizeY 24 OffsetBottom -448 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_emptyRestartHours" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 452 OffsetTop 452 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -480 } Color {{COLOR_TEXT}} Text "0 off; 1-168 real hours empty. Default 5. Applies now." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+16
View File
@@ -0,0 +1,16 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_SitesPage}} Name "SitesPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "SitesHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color {{COLOR_TEXT}} Text "Camps and hospitals - next round" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "SitesHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 50 OffsetTop 50 SizeX 936 OffsetRight -964 SizeY 40 OffsetBottom -90 } Color {{COLOR_TEXT}} Text "More places to discover, raid and find supplies. Unsafe locations can be skipped." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_fieldCampCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 110 OffsetTop 110 SizeX 456 OffsetRight -484 SizeY 28 OffsetBottom -138 } Color {{COLOR_TEXT}} Text "Field camps (1-16; default 12)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "fieldCampCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 144 OffsetTop 144 SizeX 180 OffsetRight -208 SizeY 38 OffsetBottom -182 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_fieldCampCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 144 OffsetTop 144 SizeX 110 OffsetRight -330 SizeY 38 OffsetBottom -182 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_fieldCampCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 192 OffsetTop 192 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -218 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_fieldCampCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 226 OffsetTop 226 SizeX 456 OffsetRight -484 SizeY 54 OffsetBottom -280 } Color {{COLOR_TEXT}} Text "Field guards are shared across the selected sites." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 110 OffsetTop 110 SizeX 456 OffsetRight -964 SizeY 28 OffsetBottom -138 } Color {{COLOR_TEXT}} Text "Field hospitals (1-8; default 6)" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 144 OffsetTop 144 SizeX 180 OffsetRight -688 SizeY 38 OffsetBottom -182 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 144 OffsetTop 144 SizeX 110 OffsetRight -810 SizeY 38 OffsetBottom -182 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 192 OffsetTop 192 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -218 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 226 OffsetTop 226 SizeX 456 OffsetRight -964 SizeY 54 OffsetBottom -280 } Color {{COLOR_TEXT}} Text "Medical supplies and guards. The radio-clue site is retained." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "SitesObjectives" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 318 OffsetTop 318 SizeX 936 OffsetRight -964 SizeY 90 OffsetBottom -408 } Color {{COLOR_TEXT}} Text "The prison, radio, extraction, supply cache and four mortar sites are unchanged. Defaults request 26 sites. More sites share the existing field guard budget. Discover them through intel or exploration." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+20
View File
@@ -0,0 +1,20 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_StarterPage}} Name "StarterPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "StarterHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 5 OffsetTop 5 SizeX 350 OffsetRight -378 SizeY 30 OffsetBottom -35 } Color {{COLOR_TEXT}} Text "Shared starting backpack" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterDefault" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 410 OffsetLeft 410 PositionY 0 OffsetTop 0 SizeX 260 OffsetRight -670 SizeY 40 OffsetBottom -40 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Default loadout" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterCustom" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 690 OffsetLeft 690 PositionY 0 OffsetTop 0 SizeX 274 OffsetRight -964 SizeY 40 OffsetBottom -40 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Custom loadout" } } }
TextWidgetClass { Name "StarterState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 46 OffsetTop 46 SizeX 936 OffsetRight -964 SizeY 44 OffsetBottom -90 } Color {{COLOR_TEXT}} Text "Waiting for saved loadout..." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "StarterMod" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 96 OffsetTop 96 SizeX 470 OffsetRight -498 SizeY 40 OffsetBottom -136 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 40 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterShow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 510 OffsetLeft 510 PositionY 96 OffsetTop 96 SizeX 180 OffsetRight -690 SizeY 40 OffsetBottom -136 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Show items" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterPrevious" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 702 OffsetLeft 702 PositionY 96 OffsetTop 96 SizeX 125 OffsetRight -827 SizeY 40 OffsetBottom -136 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Previous" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterNext" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 839 OffsetLeft 839 PositionY 96 OffsetTop 96 SizeX 125 OffsetRight -964 SizeY 40 OffsetBottom -136 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Next" } } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "StarterCatalogItem" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 144 OffsetTop 144 SizeX 540 OffsetRight -568 SizeY 40 OffsetBottom -184 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 40 } } }
TextWidgetClass { Name "StarterQuantityLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 580 OffsetLeft 580 PositionY 150 OffsetTop 150 SizeX 90 OffsetRight -670 SizeY 30 OffsetBottom -180 } Color {{COLOR_TEXT}} Text "Quantity" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "StarterQuantity" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 676 OffsetLeft 676 PositionY 144 OffsetTop 144 SizeX 88 OffsetRight -764 SizeY 40 OffsetBottom -184 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterAdd" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 776 OffsetLeft 776 PositionY 144 OffsetTop 144 SizeX 188 OffsetRight -964 SizeY 40 OffsetBottom -184 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Save quantity" } } }
TextWidgetClass { Name "StarterCatalogState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 192 OffsetTop 192 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -220 } Color {{COLOR_TEXT}} Text "Choose a mod, then an item. Quantity 0 removes an item." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "StarterSavedHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 230 OffsetTop 230 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -258 } Color {{COLOR_TEXT}} Text "Saved custom contents (select an entry to remove)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "StarterSaved" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 266 OffsetTop 266 SizeX 728 OffsetRight -756 SizeY 40 OffsetBottom -306 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 40 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "StarterRemove" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 776 OffsetLeft 776 PositionY 266 OffsetTop 266 SizeX 188 OffsetRight -964 SizeY 40 OffsetBottom -306 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Remove item" } } }
TextWidgetClass { Name "StarterSummary" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 314 OffsetTop 314 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -344 } Color {{COLOR_TEXT}} Text "Custom list is empty." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "StarterHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 352 OffsetTop 352 SizeX 936 OffsetRight -964 SizeY 72 OffsetBottom -424 } Color {{COLOR_TEXT}} Text "Up to 32 item types / 64 items. Changes apply next round, at prison or crash. The backpack has limited space; items that do not fit are omitted. Enemy spawn weights do not affect this loadout." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+31
View File
@@ -0,0 +1,31 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_StatusPage}} Name "StatusPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "StatusHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Live server state. Mortar counts mean operational / deployed; UAZ allowances include past losses." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ScrollLayoutWidgetClass {
Name "StatusScroll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 58 OffsetTop 58 SizeX 936 OffsetRight -964 SizeY 416 OffsetBottom -474 }
components {
SCR_GamepadScrollComponent "{5707100AC31E657E}" {
}
}
{
VerticalLayoutWidgetClass {
Name "StatusContent" Slot AlignableSlot {
HorizontalAlign 3 VerticalAlign 3 Padding 8 4 14 4
}
{
TextWidgetClass {
Name "Status" Slot LayoutSlot {
HorizontalAlign 3 Padding 0 0 0 8 SizeMode Fill
}
Clipping Ancestor Color {{COLOR_TEXT}} Text "Waiting for mission status..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
}
}
}
}
} }
+18
View File
@@ -0,0 +1,18 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_TTSPage}} Name "TTSPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "TTSHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 58 OffsetBottom -64 } Color {{COLOR_TEXT}} Text "Prerecorded speech works without a service. On / Off applies to everyone. Live TTS below is optional and has its own setting." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TTSSelectionState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 74 OffsetTop 74 SizeX 150 OffsetRight -178 SizeY 42 OffsetBottom -116 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Waiting..." } } }
TextWidgetClass { Name "TTSStatus" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 198 OffsetLeft 198 PositionY 74 OffsetTop 74 SizeX 766 OffsetRight -964 SizeY 58 OffsetBottom -132 } Color {{COLOR_TEXT}} Text "Waiting for the server." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "TTSEndpointLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 148 OffsetTop 148 SizeX 260 OffsetRight -288 SizeY 38 OffsetBottom -186 } Color {{COLOR_TEXT}} Text "Speech bridge URL" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "TTSEndpoint" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 298 OffsetLeft 298 PositionY 144 OffsetTop 144 SizeX 520 OffsetRight -818 SizeY 42 OffsetBottom -186 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TTSPasteEndpoint" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 834 OffsetLeft 834 PositionY 144 OffsetTop 144 SizeX 130 OffsetRight -964 SizeY 42 OffsetBottom -186 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Paste" } } }
TextWidgetClass { Name "TTSTokenLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 216 OffsetTop 216 SizeX 260 OffsetRight -288 SizeY 38 OffsetBottom -254 } Color {{COLOR_TEXT}} Text "Bridge token" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "TTSToken" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 298 OffsetLeft 298 PositionY 212 OffsetTop 212 SizeX 520 OffsetRight -818 SizeY 42 OffsetBottom -254 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TTSPasteToken" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 834 OffsetLeft 834 PositionY 212 OffsetTop 212 SizeX 130 OffsetRight -964 SizeY 42 OffsetBottom -254 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Paste" } } }
TextWidgetClass { Name "TTSTokenStatus" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 298 OffsetLeft 298 PositionY 258 OffsetTop 258 SizeX 666 OffsetRight -964 SizeY 48 OffsetBottom -306 } Color {{COLOR_TEXT}} Text "No token saved." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TTSTest" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 298 OffsetLeft 298 PositionY 318 OffsetTop 318 SizeX 240 OffsetRight -538 SizeY 42 OffsetBottom -360 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Test & enable" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TTSDisable" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 558 OffsetLeft 558 PositionY 318 OffsetTop 318 SizeX 180 OffsetRight -738 SizeY 42 OffsetBottom -360 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Disable live TTS" } } }
TextWidgetClass { Name "RecordingsLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 388 OffsetTop 388 SizeX 400 OffsetRight -428 SizeY 42 OffsetBottom -430 } Color {{COLOR_TEXT}} Text "Prerecorded speech" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RecordingsOn" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 558 OffsetLeft 558 PositionY 386 OffsetTop 386 SizeX 180 OffsetRight -738 SizeY 42 OffsetBottom -428 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "On" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "RecordingsOff" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 758 OffsetLeft 758 PositionY 386 OffsetTop 386 SizeX 180 OffsetRight -938 SizeY 42 OffsetBottom -428 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Off" } } }
TextWidgetClass { Name "TTSServiceHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 440 OffsetTop 440 SizeX 936 OffsetRight -964 SizeY 42 OffsetBottom -482 } Color {{COLOR_TEXT}} Text "Prerecorded speech: welcome, soldier dialogue and extraction radio. Text messages stay visible." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
@@ -0,0 +1,10 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_TerrainsPage}} Name "TerrainsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "TerrainHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 60 OffsetBottom -66 } Color {{COLOR_TEXT}} Text "Choose a terrain scenario from enabled server mods. Saved changes apply after restart; players must rejoin when the map changes." "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "TerrainCurrent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 80 OffsetTop 80 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -130 } Color {{COLOR_TEXT}} Text "Waiting for current terrain..." "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "TerrainSaved" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 142 OffsetTop 142 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -192 } Color {{COLOR_TEXT}} Text "Waiting for saved selection..." "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "TerrainSelect" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 210 OffsetTop 210 SizeX 936 OffsetRight -964 SizeY 42 OffsetBottom -252 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
TextWidgetClass { Name "TerrainCompatibility" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 274 OffsetTop 274 SizeX 936 OffsetRight -964 SizeY 80 OffsetBottom -354 } Color {{COLOR_TEXT}} Text "Choose an exploration or Escape scenario. The terrain must supply navigation and enough clear ground. Server default keeps normal scenario selection." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "TerrainWarning" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 362 OffsetTop 362 SizeX 936 OffsetRight -964 SizeY 45 OffsetBottom -407 } Color {{COLOR_TEXT}} Text "" "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TerrainDefault" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 418 OffsetTop 418 SizeX 260 OffsetRight -288 SizeY 42 OffsetBottom -460 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Use server default" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "TerrainApply" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 742 OffsetLeft 742 PositionY 418 OffsetTop 418 SizeX 222 OffsetRight -964 SizeY 42 OffsetBottom -460 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Save terrain" } } }
} }
+18
View File
@@ -0,0 +1,18 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_WeightsPage}} Name "WeightsPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass { Name "WeightsHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 48 OffsetBottom -52 } Color {{COLOR_TEXT}} Text "Make selected mods or items more common. 1 = normal, 100 = very high, 0 = never. These are relative weights, not percentages." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{4B5AE6E64037FFB4}UI/layouts/WidgetLibrary/ComboBox/WLib_ComboBox.layout" { Name "WeightsMod" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 58 OffsetTop 58 SizeX 560 OffsetRight -588 SizeY 42 OffsetBottom -100 } components { SCR_ComboBoxComponent "{546B1D464BC32853}" { m_bUseLabel 0 m_sLabel "" m_fSizeWithoutLabel 42 } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "WeightsShow" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 608 OffsetLeft 608 PositionY 58 OffsetTop 58 SizeX 356 OffsetRight -964 SizeY 42 OffsetBottom -100 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Show probabilities" } } }
TextWidgetClass { Name "ModWeightLabel" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 280 OffsetRight -308 SizeY 32 OffsetBottom -144 } Color {{COLOR_TEXT}} Text "Whole mod weight (0-100)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "ModWeight" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 310 OffsetLeft 310 PositionY 108 OffsetTop 108 SizeX 90 OffsetRight -400 SizeY 42 OffsetBottom -150 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ModWeightApply" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 414 OffsetLeft 414 PositionY 108 OffsetTop 108 SizeX 130 OffsetRight -544 SizeY 42 OffsetBottom -150 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ModWeightNormal" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 558 OffsetLeft 558 PositionY 108 OffsetTop 108 SizeX 184 OffsetRight -742 SizeY 42 OffsetBottom -150 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Normal (1)" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "ModWeightHigh" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 756 OffsetLeft 756 PositionY 108 OffsetTop 108 SizeX 208 OffsetRight -964 SizeY 42 OffsetBottom -150 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Very high (100)" } } }
TextWidgetClass { Name "ModWeightSaved" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 158 OffsetTop 158 SizeX 936 OffsetRight -964 SizeY 26 OffsetBottom -184 } Color {{COLOR_TEXT}} Text "Choose a mod above." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "WeightsPrevious" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 194 OffsetTop 194 SizeX 130 OffsetRight -158 SizeY 38 OffsetBottom -232 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Previous" } } }
TextWidgetClass { Name "WeightsPageState" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 174 OffsetLeft 174 PositionY 194 OffsetTop 194 SizeX 642 OffsetRight -816 SizeY 38 OffsetBottom -232 } Color {{COLOR_TEXT}} Text "Choose a mod to adjust item probabilities." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "WeightsNext" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 834 OffsetLeft 834 PositionY 194 OffsetTop 194 SizeX 130 OffsetRight -964 SizeY 38 OffsetBottom -232 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Next" } } }
ScrollLayoutWidgetClass { Name "WeightsScroll" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 238 OffsetTop 238 SizeX 936 OffsetRight -964 SizeY 148 OffsetBottom -386 } { VerticalLayoutWidgetClass { Name "WeightsContent" Slot AlignableSlot { HorizontalAlign 3 VerticalAlign 3 Padding 8 4 14 4 } { } } } }
TextWidgetClass { Name "WeightsFooter" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 392 OffsetTop 392 SizeX 936 OffsetRight -964 SizeY 38 OffsetBottom -430 } Color {{COLOR_TEXT}} Text "Shown percentages apply when an extra item is chosen. Mod and item weights multiply. Blocked items remain excluded." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+225
View File
@@ -0,0 +1,225 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_WorldPage}} Name "WorldPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 486 OffsetBottom -646 } {
TextWidgetClass {
Name "WorldHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 936 OffsetRight -964 SizeY 50 OffsetBottom -56 }
Color {{COLOR_TEXT}} Text "Time and weather apply next round. View distance applies now. Press Apply to save." "Font Size" {{SIZE_INTRO}} "Min Font Size" {{SIZE_INTRO}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
TextWidgetClass {
Name "Label_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 70 OffsetTop 70 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -98 }
Color {{COLOR_TEXT}} Text "Next-round start time (HH:MM)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 102 OffsetTop 102 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -126 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 126 OffsetTop 126 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -146 }
Color {{COLOR_MUTED}} Text "24-hour clock. Random = any time; Random day = daylight only. Takes effect next round." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 70 OffsetTop 70 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -112 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 70 OffsetTop 70 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -112 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 70 OffsetTop 70 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -112 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Label_timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 154 OffsetTop 154 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -182 }
Color {{COLOR_TEXT}} Text "Next-round time speed (1-24x)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 186 OffsetTop 186 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -210 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 210 OffsetTop 210 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -230 }
Color {{COLOR_MUTED}} Text "1 = real-time clock; 12 = one game hour in five real minutes. Takes effect next round." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 154 OffsetTop 154 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -196 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 154 OffsetTop 154 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -196 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_timeMultiplier" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 154 OffsetTop 154 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -196 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Label_startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 238 OffsetTop 238 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -266 }
Color {{COLOR_TEXT}} Text "Start date (YYYY-MM-DD or authored)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 270 OffsetTop 270 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -294 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 294 OffsetTop 294 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -314 }
Color {{COLOR_MUTED}} Text "Use YYYY-MM-DD, or authored for the island default. Random picks a date each round." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 238 OffsetTop 238 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -280 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 238 OffsetTop 238 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -280 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_startDateCode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 238 OffsetTop 238 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -280 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Label_weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 322 OffsetTop 322 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -350 }
Color {{COLOR_TEXT}} Text "Weather (authored / clear / overcast / rain)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 354 OffsetTop 354 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -378 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 378 OffsetTop 378 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -398 }
Color {{COLOR_MUTED}} Text "Use authored, clear, overcast or rain. Random chooses one of the three weather types next round." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 322 OffsetTop 322 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -364 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 322 OffsetTop 322 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -364 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Random_weatherProfile" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 322 OffsetTop 322 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -364 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random"
}
}
}
TextWidgetClass {
Name "Label_viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 406 OffsetTop 406 SizeX 368 OffsetRight -396 SizeY 28 OffsetBottom -434 }
Color {{COLOR_TEXT}} Text "View distance (500-10000 m / default)" "Font Size" {{SIZE_LABEL}} "Min Font Size" {{SIZE_LABEL}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Saved_viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 438 OffsetTop 438 SizeX 936 OffsetRight -964 SizeY 24 OffsetBottom -462 }
Color {{COLOR_TEXT}} Text "Waiting for saved value" "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1 FontProperties FontProperties {
Font "{{FONT}}"
}
}
TextWidgetClass {
Name "Help_viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 462 OffsetTop 462 SizeX 936 OffsetRight -964 SizeY 20 OffsetBottom -482 }
Color {{COLOR_MUTED}} Text "Applies now after closing menus. Server/platform limits apply. Default restores normal distance." "Font Size" {{SIZE_CAPTION}} "Min Font Size" {{SIZE_CAPTION}} Wrap 1
FontProperties FontProperties { Font "{{FONT}}" }
}
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" {
Name "viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 408 OffsetLeft 408 PositionY 406 OffsetTop 406 SizeX 240 OffsetRight -648 SizeY 42 OffsetBottom -448 }
components {
SCR_EditBoxComponent "{547290FFBD5B33E9}" {
m_sLabel ""
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Apply_viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 660 OffsetLeft 660 PositionY 406 OffsetTop 406 SizeX 112 OffsetRight -772 SizeY 42 OffsetBottom -448 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Apply"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "Default_viewDistanceMetres" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 406 OffsetTop 406 SizeX 180 OffsetRight -964 SizeY 42 OffsetBottom -448 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Default"
}
}
}
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" {
Name "RandomDay_startTimeMinutes" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 784 OffsetLeft 784 PositionY 112 OffsetTop 112 SizeX 180 OffsetRight -964 SizeY 32 OffsetBottom -144 }
components {
SCR_ButtonTextComponent "{5548F0143AE99095}" {
m_sText "Random day"
}
}
}
} }
+39
View File
@@ -0,0 +1,39 @@
FrameWidgetClass {
Name "ERR_AdminRoot" Slot FrameWidgetSlot { Anchor 0 0 1 1 OffsetLeft 0 OffsetTop 0 OffsetRight 0 OffsetBottom 0 }
{
ImageWidgetClass { Name "DimBackground" Slot FrameWidgetSlot { Anchor 0 0 1 1 OffsetLeft 0 OffsetTop 0 OffsetRight 0 OffsetBottom 0 } Color {{COLOR_DIM}} }
FrameWidgetClass {
Name "Panel" Slot FrameWidgetSlot { Anchor 0.5 0.5 0.5 0.5 PositionX 0 OffsetLeft 0 PositionY 0 OffsetTop 0 SizeX 1220 OffsetRight -1220 SizeY 760 OffsetBottom -760 Alignment 0.5 0.5 }
{
ImageWidgetClass { Name "PanelBackground" Slot FrameWidgetSlot { Anchor 0 0 1 1 OffsetLeft 0 OffsetTop 0 OffsetRight 0 OffsetBottom 0 } Color {{COLOR_PANEL}} }
TextWidgetClass { Name "Title" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 20 OffsetTop 20 SizeX 990 OffsetRight -1018 SizeY 44 OffsetBottom -64 } Color {{COLOR_TEXT}} Text "Co10 Escape Reintroduced" "Font Size" {{SIZE_TITLE}} "Min Font Size" {{SIZE_TITLE}} FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Close" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 1064 OffsetLeft 1064 PositionY 24 OffsetTop 24 SizeX 128 OffsetRight -1192 SizeY 42 OffsetBottom -66 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Close" } } }
TextWidgetClass { Name "Connection" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 70 OffsetTop 70 SizeX 1164 OffsetRight -1192 SizeY 28 OffsetBottom -98 } Color {{COLOR_TEXT}} Text "Requesting administrator access..." "Font Size" {{SIZE_BODY}} "Min Font Size" {{SIZE_BODY}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
{{NAVIGATION}}
{{include:pages/SettingsPage.layout.in}}
{{include:pages/HQPage.layout.in}}
{{include:pages/JournalPage.layout.in}}
{{include:pages/ModsPage.layout.in}}
{{include:pages/FactionsPage.layout.in}}
{{include:pages/WorldPage.layout.in}}
{{include:pages/IntelPage.layout.in}}
{{include:pages/StatusPage.layout.in}}
{{include:pages/TerrainsPage.layout.in}}
{{include:pages/ItemsPage.layout.in}}
{{include:pages/TTSPage.layout.in}}
{{include:pages/ForcesPage.layout.in}}
{{include:pages/GuardsPage.layout.in}}
{{include:pages/SitesPage.layout.in}}
{{include:pages/PlanePage.layout.in}}
{{include:pages/RecommendationsPage.layout.in}}
{{include:pages/WeightsPage.layout.in}}
{{include:pages/AllowedItemsPage.layout.in}}
{{include:pages/ItemPresetsPage.layout.in}}
{{include:pages/AIPage.layout.in}}
{{include:pages/StarterPage.layout.in}}
{{include:pages/SarkaPage.layout.in}}
TextWidgetClass { Name "Feedback" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 248 OffsetLeft 248 PositionY 670 OffsetTop 670 SizeX 936 OffsetRight -1184 SizeY 70 OffsetBottom -740 } Color {{COLOR_TEXT}} Text "" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
}
}
}
}
+32
View File
@@ -0,0 +1,32 @@
{
"layout": {
"FONT": "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt",
"COLOR_TEXT": "0.9 0.92 0.94 1",
"COLOR_MUTED": "0.72 0.81 0.87 1",
"COLOR_ACCENT": "0.9 0.66 0.25 1",
"COLOR_DIM": "0 0 0 0.65",
"COLOR_PANEL": "0.035 0.05 0.065 0.98",
"SIZE_CAPTION_SMALL": "14",
"SIZE_MINOR": "15",
"SIZE_CAPTION": "16",
"SIZE_HELP": "17",
"SIZE_BODY": "18",
"SIZE_INTRO": "19",
"SIZE_LABEL": "20",
"SIZE_LABEL_LARGE": "21",
"SIZE_HEADING": "22",
"SIZE_ROW_TITLE": "26",
"SIZE_TITLE": "32"
},
"buttons": {
"NEUTRAL": "0xFF454B52",
"NEUTRAL_HOVER": "0xFF606870",
"POSITIVE": "0xFF246B3C",
"POSITIVE_HOVER": "0xFF31894F",
"NEGATIVE": "0xFF8F2929",
"NEGATIVE_HOVER": "0xFFB43B3B",
"MIXED": "0xFF805B17",
"READY_TEXT": "0xFF69BE8C",
"UNAVAILABLE_TEXT": "0xFFDC7373"
}
}