Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapName.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapName.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapName.js (revision 25077) @@ -0,0 +1,36 @@ +/** + * Map name. + * This is usually just the regular map name, but can be overwritten. + */ +GameSettings.prototype.Attributes.MapName = class MapName extends GameSetting +{ + init() + { + } + + toInitAttributes(attribs) + { + if (this.value) + attribs.settings.Name = this.value; + else + { + // Copy from the map data by default - this helps make InitAttributes self-sufficient, + // which is nice for replays / saved games. + // Fallback to the map name to avoid 'undefined' errors. + attribs.settings.Name = this.settings.map?.data?.settings?.Name || this.settings.map.map; + } + } + + fromInitAttributes(attribs) + { + // Ser/Deser from a different attribute name as a poor man's not-persisted-setting. + // TODO: split this off more properly. + if (attribs.mapName) + this.value = attribs.mapName; + } + + set(name) + { + this.value = name; + } +}; Property changes on: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapName.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js (revision 25077) @@ -0,0 +1,35 @@ +GameSettings.prototype.Attributes.MapSize = class MapSize extends GameSetting +{ + init() + { + this.defaultValue = this.getDefaultValue("MapSizes", "Tiles") || 256; + this.setSize(this.defaultValue); + this.settings.map.watch(() => this.onTypeChange(), ["type"]); + } + + toInitAttributes(attribs) + { + if (this.settings.map.type === "random") + attribs.settings.Size = this.size; + } + + fromInitAttributes(attribs) + { + if (!!this.getLegacySetting(attribs, "Size")) + this.setSize(this.getLegacySetting(attribs, "Size")); + } + + setSize(size) + { + this.available = this.settings.map.type === "random"; + this.size = size; + } + + onTypeChange(old) + { + if (this.settings.map.type === "random" && old !== "random") + this.setSize(this.defaultValue); + else if (this.settings.map.type !== "random") + this.available = false; + } +}; Property changes on: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js (revision 25077) @@ -0,0 +1,23 @@ +GameSettings.prototype.Attributes.Nomad = class Nomad extends GameSetting +{ + init() + { + this.enabled = false; + } + + toInitAttributes(attribs) + { + if (this.settings.map.type == "random") + attribs.settings.Nomad = this.enabled; + } + + fromInitAttributes(attribs) + { + this.setEnabled(!!this.getLegacySetting(attribs, "Nomad")); + } + + setEnabled(enabled) + { + this.enabled = enabled; + } +}; Property changes on: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js (revision 25077) @@ -0,0 +1,133 @@ +/** + * Stores civ settings for all players. + */ +GameSettings.prototype.Attributes.PlayerCiv = class PlayerCiv extends GameSetting +{ + init() + { + // NB: watchers aren't auto-triggered when modifying array elements. + this.values = []; + this.locked = []; + this.settings.playerCount.watch(() => this.maybeUpdate(), ["nbPlayers"]); + this.settings.map.watch(() => this.onMapChange(), ["map"]); + } + + toInitAttributes(attribs) + { + if (!attribs.settings.PlayerData) + attribs.settings.PlayerData = []; + while (attribs.settings.PlayerData.length < this.values.length) + attribs.settings.PlayerData.push({}); + for (let i in this.values) + if (this.values[i]) + attribs.settings.PlayerData[i].Civ = this.values[i]; + } + + fromInitAttributes(attribs) + { + if (!this.getLegacySetting(attribs, "PlayerData")) + return; + let pData = this.getLegacySetting(attribs, "PlayerData"); + if (this.values.length < pData.length) + this._resize(pData.length); + for (let i in pData) + if (pData[i] && pData[i].Civ) + this.setValue(i, pData[i].Civ); + } + + _resize(nb) + { + while (this.values.length > nb) + { + this.values.pop(); + this.locked.pop(); + } + while (this.values.length < nb) + { + this.values.push("random"); + this.locked.push(false); + } + } + + onMapChange() + { + // Reset. + if (this.settings.map.type == "scenario" || + this.getMapSetting("PlayerData") && + this.getMapSetting("PlayerData").some(data => data && data.Civ)) + { + this._resize(0); + this.maybeUpdate(); + } + } + + maybeUpdate() + { + this._resize(this.settings.playerCount.nbPlayers); + this.values.forEach((c, i) => this._set(i, c)); + this.trigger("values"); + } + + pickRandomItems() + { + // Get a unique array of selectable cultures + let cultures = Object.keys(this.settings.civData).filter(civ => this.settings.civData[civ].SelectableInGameSetup).map(civ => this.settings.civData[civ].Culture); + cultures = cultures.filter((culture, index) => cultures.indexOf(culture) === index); + + let picked = false; + for (let i in this.values) + { + if (this.values[i] != "random") + continue; + picked = true; + + // Pick a random civ of a random culture + let culture = pickRandom(cultures); + this.values[i] = pickRandom(Object.keys(this.settings.civData).filter(civ => + this.settings.civData[civ].Culture == culture && this.settings.civData[civ].SelectableInGameSetup)); + + } + if (picked) + this.trigger("values"); + + return picked; + } + + _getMapData(i) + { + let data = this.settings.map.data; + if (!data || !data.settings || !data.settings.PlayerData) + return undefined; + if (data.settings.PlayerData.length <= i) + return undefined; + return data.settings.PlayerData[i].Civ; + } + + _set(playerIndex, value) + { + let map = this._getMapData(playerIndex); + if (!!map) + { + this.values[playerIndex] = map; + this.locked[playerIndex] = true; + } + else + { + this.values[playerIndex] = value; + this.locked[playerIndex] = this.settings.map.type == "scenario"; + } + } + + setValue(playerIndex, val) + { + this._set(playerIndex, val); + this.trigger("values"); + } + + swap(sourceIndex, targetIndex) + { + [this.values[sourceIndex], this.values[targetIndex]] = [this.values[targetIndex], this.values[sourceIndex]]; + [this.locked[sourceIndex], this.locked[targetIndex]] = [this.locked[targetIndex], this.locked[sourceIndex]]; + this.trigger("values"); + } +}; Property changes on: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js (revision 25077) @@ -0,0 +1,67 @@ +GameSettings.prototype.Attributes.PlayerCount = class PlayerCount extends GameSetting +{ + init() + { + this.nbPlayers = 1; + this.settings.map.watch(() => this.onMapTypeChange(), ["type"]); + this.settings.map.watch(() => this.onMapChange(), ["map"]); + } + + toInitAttributes(attribs) + { + if (!attribs.settings.PlayerData) + attribs.settings.PlayerData = []; + while (attribs.settings.PlayerData.length < this.nbPlayers) + attribs.settings.PlayerData.push({}); + } + + fromInitAttributes(attribs) + { + if (!this.getLegacySetting(attribs, "PlayerData")) + return; + let pData = this.getLegacySetting(attribs, "PlayerData"); + if (this.nbPlayers !== pData.length) + this.nbPlayers = pData.length; + } + + onMapTypeChange(old) + { + if (this.settings.map.type == "random" && old != "random") + this.nbPlayers = 2; + } + + onMapChange() + { + if (this.settings.map.type == "random") + return; + if (!this.settings.map.data || !this.settings.map.data.settings || + !this.settings.map.data.settings.PlayerData) + return; + this.nbPlayers = this.settings.map.data.settings.PlayerData.length; + } + + reloadFromLegacy(data) + { + if (this.settings.map.type != "random") + { + this.nbPlayers = this.settings.map.data.settings.PlayerData.length; + return; + } + if (!data || !data.settings || data.settings.PlayerData === undefined) + return; + this.nbPlayers = data.settings.PlayerData.length; + } + + /** + * @param index - Player Index, 0 is 'player 1' since GAIA isn't there. + */ + get(index) + { + return this.data[index]; + } + + setNb(nb) + { + this.nbPlayers = Math.max(1, Math.min(g_MaxPlayers, nb)); + } +}; Property changes on: ps/trunk/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/autostart/autostart.js =================================================================== --- ps/trunk/binaries/data/mods/public/gui/autostart/autostart.js (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/autostart/autostart.js (revision 25077) @@ -0,0 +1,17 @@ +function init(initData) +{ + let settings = new GameSettings().init(); + settings.fromInitAttributes(initData); + let assignments = { + "local": { + "player": 1, + "name": Engine.ConfigDB_GetValue("user", "playername.singleplayer") || Engine.GetSystemUsername() + } + }; + settings.launchGame(assignments); + + Engine.SwitchGuiPage("page_loading.xml", { + "attribs": settings.toInitAttributes(), + "playerAssignments": assignments + }); +} Property changes on: ps/trunk/binaries/data/mods/public/gui/autostart/autostart.js ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: ps/trunk/binaries/data/mods/public/gui/autostart/autostart.xml =================================================================== --- ps/trunk/binaries/data/mods/public/gui/autostart/autostart.xml (nonexistent) +++ ps/trunk/binaries/data/mods/public/gui/autostart/autostart.xml (revision 25077) @@ -0,0 +1,8 @@ + + +