Changeset View
Changeset View
Standalone View
Standalone View
ps/trunk/binaries/data/mods/mod/gui/modmod/modmod.js
Show First 20 Lines • Show All 42 Lines • ▼ Show 20 Lines | |||||
var g_Mods = {}; | var g_Mods = {}; | ||||
/** | /** | ||||
* Folder names of all mods that are or can be launched. | * Folder names of all mods that are or can be launched. | ||||
*/ | */ | ||||
var g_ModsEnabled = []; | var g_ModsEnabled = []; | ||||
var g_ModsDisabled = []; | var g_ModsDisabled = []; | ||||
var g_ModsEnabledFiltered = []; | |||||
var g_ModsDisabledFiltered = []; | |||||
/** | /** | ||||
* Name of the mods installed by the ModInstaller. | * Name of the mods installed by the ModInstaller. | ||||
*/ | */ | ||||
var g_InstalledMods; | var g_InstalledMods; | ||||
var g_ColorNoModSelected = "255 255 100"; | var g_ColorNoModSelected = "255 255 100"; | ||||
var g_ColorDependenciesMet = "100 255 100"; | var g_ColorDependenciesMet = "100 255 100"; | ||||
var g_ColorDependenciesNotMet = "255 100 100"; | var g_ColorDependenciesNotMet = "255 100 100"; | ||||
Show All 24 Lines | function loadMods() | ||||
g_Mods = Engine.GetAvailableMods(); | g_Mods = Engine.GetAvailableMods(); | ||||
deepfreeze(g_Mods); | deepfreeze(g_Mods); | ||||
} | } | ||||
function loadEnabledMods() | function loadEnabledMods() | ||||
{ | { | ||||
g_ModsEnabled = Engine.ConfigDB_GetValue("user", "mod.enabledmods").split(/\s+/).filter(folder => !!g_Mods[folder]); | g_ModsEnabled = Engine.ConfigDB_GetValue("user", "mod.enabledmods").split(/\s+/).filter(folder => !!g_Mods[folder]); | ||||
g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); | g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); | ||||
g_ModsEnabledFiltered = g_ModsEnabled; | |||||
g_ModsDisabledFiltered = g_ModsDisabled; | |||||
} | } | ||||
function validateMods() | function validateMods() | ||||
{ | { | ||||
for (let folder in g_Mods) | for (let folder in g_Mods) | ||||
validateMod(folder, g_Mods[folder], true); | validateMod(folder, g_Mods[folder], true); | ||||
} | } | ||||
Show All 24 Lines | |||||
{ | { | ||||
sortEnabledMods(); | sortEnabledMods(); | ||||
Engine.SetMods(["mod"].concat(g_ModsEnabled)); | Engine.SetMods(["mod"].concat(g_ModsEnabled)); | ||||
Engine.RestartEngine(); | Engine.RestartEngine(); | ||||
} | } | ||||
function displayModLists() | function displayModLists() | ||||
{ | { | ||||
displayModList("modsEnabledList", g_ModsEnabled); | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
displayModList("modsDisabledList", g_ModsDisabled); | g_ModsDisabledFiltered = displayModList("modsDisabledList", g_ModsDisabled); | ||||
} | } | ||||
function displayModList(listObjectName, folders) | function displayModList(listObjectName, folders) | ||||
{ | { | ||||
let listObject = Engine.GetGUIObjectByName(listObjectName); | let listObject = Engine.GetGUIObjectByName(listObjectName); | ||||
if (listObjectName == "modsDisabledList") | if (listObjectName == "modsDisabledList") | ||||
{ | { | ||||
let sortFolder = folder => String(g_Mods[folder][listObject.selected_column] || folder); | let sortFolder = folder => String(g_Mods[folder][listObject.selected_column] || folder); | ||||
folders.sort((folder1, folder2) => | folders.sort((folder1, folder2) => | ||||
listObject.selected_column_order * | listObject.selected_column_order * | ||||
sortFolder(folder1).localeCompare(sortFolder(folder2))); | sortFolder(folder1).localeCompare(sortFolder(folder2))); | ||||
} | } | ||||
folders = folders.filter(filterMod); | folders = folders.filter(filterMod); | ||||
listObject.list_name = folders.map(folder => g_Mods[folder].name).map(name => g_InstalledMods.indexOf(name) == -1 ? name : coloredText(name, "green")); | listObject.list_name = folders.map(folder => g_Mods[folder].name).map(name => g_InstalledMods.indexOf(name) == -1 ? name : coloredText(name, "green")); | ||||
listObject.list_folder = folders; | listObject.list_folder = folders; | ||||
listObject.list_label = folders.map(folder => g_Mods[folder].label); | listObject.list_label = folders.map(folder => g_Mods[folder].label); | ||||
listObject.list_url = folders.map(folder => g_Mods[folder].url || ""); | listObject.list_url = folders.map(folder => g_Mods[folder].url || ""); | ||||
listObject.list_version = folders.map(folder => g_Mods[folder].version); | listObject.list_version = folders.map(folder => g_Mods[folder].version); | ||||
listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" ")); | listObject.list_dependencies = folders.map(folder => g_Mods[folder].dependencies.join(" ")); | ||||
listObject.list = folders; | listObject.list = folders; | ||||
return folders; | |||||
} | |||||
function reloadDisabledMods() | |||||
{ | |||||
g_ModsDisabled = Object.keys(g_Mods).filter(folder => g_ModsEnabled.indexOf(folder) == -1); | |||||
} | } | ||||
function enableMod() | function enableMod() | ||||
{ | { | ||||
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | ||||
let pos = modsDisabledList.selected; | let pos = modsDisabledList.selected; | ||||
if (pos == -1 || !areDependenciesMet(g_ModsDisabled[pos])) | if (pos == -1 || !areDependenciesMet(g_ModsDisabledFiltered[pos])) | ||||
return; | return; | ||||
g_ModsEnabled.push(g_ModsDisabled.splice(pos, 1)[0]); | g_ModsEnabled.push(g_ModsDisabledFiltered.splice(pos, 1)[0]); | ||||
reloadDisabledMods(); | |||||
if (pos >= g_ModsDisabled.length) | if (pos >= g_ModsDisabledFiltered.length) | ||||
--pos; | --pos; | ||||
modsDisabledList.selected = pos; | |||||
displayModLists(); | displayModLists(); | ||||
modsDisabledList.selected = pos; | |||||
} | } | ||||
function disableMod() | function disableMod() | ||||
{ | { | ||||
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | ||||
let pos = modsEnabledList.selected; | let pos = modsEnabledList.selected; | ||||
if (pos == -1) | if (pos == -1) | ||||
return; | return; | ||||
g_ModsDisabled.push(g_ModsEnabled.splice(pos, 1)[0]); | // Find true position of disabled mod and remove it | ||||
let disabledMod = g_ModsEnabledFiltered[pos]; | |||||
for (let i = 0; i < g_ModsEnabled.length; ++i) | |||||
if (g_ModsEnabled[i] == disabledMod) | |||||
{ | |||||
g_ModsEnabled.splice(i, 1); | |||||
break; | |||||
} | |||||
g_ModsDisabled.push(disabledMod); | |||||
// Remove mods that required the removed mod and cascade | // Remove mods that required the removed mod and cascade | ||||
// Sort them, so we know which ones can depend on the removed mod | // Sort them, so we know which ones can depend on the removed mod | ||||
// TODO: Find position where the removed mod would have fit (for now assume idx 0) | // TODO: Find position where the removed mod would have fit (for now assume idx 0) | ||||
sortEnabledMods(); | sortEnabledMods(); | ||||
for (let i = 0; i < g_ModsEnabled.length; ++i) | for (let i = 0; i < g_ModsEnabled.length; ++i) | ||||
if (!areDependenciesMet(g_ModsEnabled[i])) | if (!areDependenciesMet(g_ModsEnabled[i])) | ||||
{ | { | ||||
g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]); | g_ModsDisabled.push(g_ModsEnabled.splice(i, 1)[0]); | ||||
--i; | --i; | ||||
} | } | ||||
modsEnabledList.selected = Math.min(pos, g_ModsEnabled.length - 1); | |||||
displayModLists(); | displayModLists(); | ||||
modsEnabledList.selected = Math.min(pos, g_ModsEnabledFiltered.length - 1); | |||||
} | } | ||||
function applyFilters() | function applyFilters() | ||||
{ | { | ||||
// Save selected rows | // Save selected rows | ||||
let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | let modsDisabledList = Engine.GetGUIObjectByName("modsDisabledList"); | ||||
let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | let modsEnabledList = Engine.GetGUIObjectByName("modsEnabledList"); | ||||
Show All 34 Lines | function filterMod(folder) | ||||
return !negateFilter; | return !negateFilter; | ||||
} | } | ||||
function closePage() | function closePage() | ||||
{ | { | ||||
Engine.SwitchGuiPage("page_pregame.xml", {}); | Engine.SwitchGuiPage("page_pregame.xml", {}); | ||||
} | } | ||||
function areFilters() | |||||
{ | |||||
let searchText = Engine.GetGUIObjectByName("modGenericFilter").caption; | |||||
return searchText && searchText != translate("Filter"); | |||||
} | |||||
/** | /** | ||||
* Moves an item in the list up or down. | * Moves an item in the list up or down. | ||||
*/ | */ | ||||
function moveCurrItem(objectName, up) | function moveCurrItem(objectName, up) | ||||
{ | { | ||||
// Prevent moving while filters are applied | |||||
// because we would need to map filtered positions | |||||
// to not filtered positions so changes will persist. | |||||
if (areFilters()) | |||||
return; | |||||
let obj = Engine.GetGUIObjectByName(objectName); | let obj = Engine.GetGUIObjectByName(objectName); | ||||
let idx = obj.selected; | let idx = obj.selected; | ||||
if (idx == -1) | if (idx == -1) | ||||
return; | return; | ||||
let num = obj.list.length; | let num = obj.list.length; | ||||
let idx2 = idx + (up ? -1 : 1); | let idx2 = idx + (up ? -1 : 1); | ||||
if (idx2 < 0 || idx2 >= num) | if (idx2 < 0 || idx2 >= num) | ||||
return; | return; | ||||
let tmp = g_ModsEnabled[idx]; | let tmp = g_ModsEnabled[idx]; | ||||
g_ModsEnabled[idx] = g_ModsEnabled[idx2]; | g_ModsEnabled[idx] = g_ModsEnabled[idx2]; | ||||
g_ModsEnabled[idx2] = tmp; | g_ModsEnabled[idx2] = tmp; | ||||
obj.list = g_ModsEnabled; | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
obj.selected = idx2; | obj.selected = idx2; | ||||
displayModList("modsEnabledList", g_ModsEnabled); | |||||
} | } | ||||
function areDependenciesMet(folder) | function areDependenciesMet(folder) | ||||
{ | { | ||||
let guiObject = Engine.GetGUIObjectByName("message"); | let guiObject = Engine.GetGUIObjectByName("message"); | ||||
for (let dependency of g_Mods[folder].dependencies) | for (let dependency of g_Mods[folder].dependencies) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | function sortEnabledMods() | ||||
let dependencies = {}; | let dependencies = {}; | ||||
for (let folder of g_ModsEnabled) | for (let folder of g_ModsEnabled) | ||||
dependencies[folder] = g_Mods[folder].dependencies.map(d => d.split(g_RegExpComparisonOperator)[0]); | dependencies[folder] = g_Mods[folder].dependencies.map(d => d.split(g_RegExpComparisonOperator)[0]); | ||||
g_ModsEnabled.sort((folder1, folder2) => | g_ModsEnabled.sort((folder1, folder2) => | ||||
dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 : | dependencies[folder1].indexOf(g_Mods[folder2].name) != -1 ? 1 : | ||||
dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0); | dependencies[folder2].indexOf(g_Mods[folder1].name) != -1 ? -1 : 0); | ||||
displayModList("modsEnabledList", g_ModsEnabled); | g_ModsEnabledFiltered = displayModList("modsEnabledList", g_ModsEnabled); | ||||
} | } | ||||
function selectedMod(listObjectName) | function selectedMod(listObjectName) | ||||
{ | { | ||||
let listObject = Engine.GetGUIObjectByName(listObjectName); | let listObject = Engine.GetGUIObjectByName(listObjectName); | ||||
let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ? | let otherListObject = Engine.GetGUIObjectByName(listObjectName == "modsDisabledList" ? | ||||
"modsEnabledList" : "modsDisabledList"); | "modsEnabledList" : "modsDisabledList"); | ||||
if (listObject.selected != -1) | if (listObject.selected != -1) | ||||
{ | { | ||||
otherListObject.selected = -1; | otherListObject.selected = -1; | ||||
Engine.GetGUIObjectByName("visitWebButton").enabled = true; | Engine.GetGUIObjectByName("visitWebButton").enabled = true; | ||||
let toggleModButton = Engine.GetGUIObjectByName("toggleModButton"); | let toggleModButton = Engine.GetGUIObjectByName("toggleModButton"); | ||||
toggleModButton.caption = listObjectName == "modsDisabledList" ? translate("Enable") : translate("Disable"); | toggleModButton.caption = listObjectName == "modsDisabledList" ? translate("Enable") : translate("Disable"); | ||||
toggleModButton.enabled = true; | toggleModButton.enabled = true; | ||||
toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod; | toggleModButton.onPress = listObjectName == "modsDisabledList" ? enableMod : disableMod; | ||||
Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList"; | Engine.GetGUIObjectByName("enabledModUp").enabled = listObjectName == "modsEnabledList" && !areFilters(); | ||||
Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList"; | Engine.GetGUIObjectByName("enabledModDown").enabled = listObjectName == "modsEnabledList" && !areFilters(); | ||||
} | } | ||||
Engine.GetGUIObjectByName("globalModDescription").caption = | Engine.GetGUIObjectByName("globalModDescription").caption = | ||||
listObject.list[listObject.selected] ? | listObject.list[listObject.selected] ? | ||||
g_Mods[listObject.list[listObject.selected]].description : | g_Mods[listObject.list[listObject.selected]].description : | ||||
'[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]'; | '[color="' + g_ColorNoModSelected + '"]' + translate("No mod has been selected.") + '[/color]'; | ||||
} | } | ||||
Show All 17 Lines |
Wildfire Games · Phabricator