diff --git a/binaries/data/mods/mod/autostart/entrypoint.js b/binaries/data/mods/mod/autostart/entrypoint.js new file mode 100644 index 0000000000..d926af8159 --- /dev/null +++ b/binaries/data/mods/mod/autostart/entrypoint.js @@ -0,0 +1,23 @@ +/** + * This file is called from the visual & non-visual paths when autostarting. + * To avoid relying on the GUI, this script has access to a special 'LoadScript' function. + * See implementation in the public mod for more details. + */ + +function autostartClient(initData) +{ + throw new Error("Autostart is not implemented in the 'mod' mod"); +} + +function autostartHost(initData, networked = false) +{ + throw new Error("Autostart is not implemented in the 'mod' mod"); +} + +/** + * @returns false if the loop should carry on. + */ +function onTick() +{ + return true; +} diff --git a/binaries/data/mods/public/autostart/autostart.js b/binaries/data/mods/public/autostart/autostart.js new file mode 100644 index 0000000000..20d282ca4a --- /dev/null +++ b/binaries/data/mods/public/autostart/autostart.js @@ -0,0 +1,29 @@ +class AutoStart +{ + constructor(initData) + { + this.settings = new GameSettings().init(); + this.settings.fromInitAttributes(initData.attribs); + + this.playerAssignments = initData.playerAssignments; + + this.settings.launchGame(this.playerAssignments, initData.storeReplay); + + this.onLaunch(); + } + + onTick() + { + } + + /** + * In the visual autostart path, we need to show the loading screen. + */ + onLaunch() + { + Engine.SwitchGuiPage("page_loading.xml", { + "attribs": this.settings.finalizedAttributes, + "playerAssignments": this.playerAssignments + }); + } +} diff --git a/binaries/data/mods/public/autostart/autostart_client.js b/binaries/data/mods/public/autostart/autostart_client.js new file mode 100644 index 0000000000..17a694c3e5 --- /dev/null +++ b/binaries/data/mods/public/autostart/autostart_client.js @@ -0,0 +1,54 @@ +class AutoStartClient +{ + constructor(initData) + { + this.playerAssignments = {}; + + try + { + Engine.StartNetworkJoin(initData.playerName, initData.ip, initData.port, initData.storeReplay); + } + catch (e) + { + const message = sprintf(translate("Cannot join game: %(message)s."), { "message": e.message }); + messageBox(400, 200, message, translate("Error")); + } + } + + onTick() + { + while (true) + { + const message = Engine.PollNetworkClient(); + if (!message) + break; + + switch (message.type) + { + case "players": + this.playerAssignments = message.newAssignments; + Engine.SendNetworkReady(2); + break; + case "start": + this.onLaunch(message); + // Process further pending netmessages in the session page. + return true; + default: + } + } + return false; + } + + /** + * In the visual autostart path, we need to show the loading screen. + * Overload this as appropriate, the default implementation works for the public mod. + */ + onLaunch(message) + { + Engine.SwitchGuiPage("page_loading.xml", { + "attribs": message.initAttributes, + "isRejoining": true, + "playerAssignments": this.playerAssignments + }); + } +} diff --git a/binaries/data/mods/public/autostart/autostart_host.js b/binaries/data/mods/public/autostart/autostart_host.js new file mode 100644 index 0000000000..ed9b09c523 --- /dev/null +++ b/binaries/data/mods/public/autostart/autostart_host.js @@ -0,0 +1,85 @@ +class AutoStartHost +{ + constructor(initData) + { + this.launched = false; + this.maxPlayers = initData.maxPlayers; + this.storeReplay = initData.storeReplay; + this.playerAssignments = {}; + + this.initAttribs = initData.attribs; + + try + { + // Stun and password not implemented for autostart. + Engine.StartNetworkHost(initData.playerName, initData.port, false, "", initData.storeReplay); + } + catch (e) + { + const message = sprintf(translate("Cannot host game: %(message)s."), { "message": e.message }); + messageBox(400, 200, message, translate("Error")); + } + } + + /** + * Handles a simple implementation of player assignments. + * Should not need be overloaded in mods unless you want to change that logic. + */ + onTick() + { + while (true) + { + const message = Engine.PollNetworkClient(); + if (!message) + break; + + switch (message.type) + { + case "players": + this.playerAssignments = message.newAssignments; + Engine.SendNetworkReady(2); + let max = 0; + for (const uid in this.playerAssignments) + { + max = Math.max(this.playerAssignments[uid].player, max); + if (this.playerAssignments[uid].player == -1) + Engine.AssignNetworkPlayer(++max, uid); + } + break; + case "ready": + this.playerAssignments[message.guid].status = message.status; + break; + case "start": + return true; + default: + } + } + + if (!this.launched && Object.keys(this.playerAssignments).length == this.maxPlayers) + { + for (const uid in this.playerAssignments) + if (this.playerAssignments[uid].player == -1 || this.playerAssignments[uid].status == 0) + return false; + this.onLaunch(); + } + return false; + } + + /** + * In the visual autostart path, we need to show the loading screen. + * Overload this as appropriate. + */ + onLaunch() + { + this.launched = true; + + this.settings = new GameSettings().init(); + this.settings.fromInitAttributes(this.initAttribs); + this.settings.playerCount.setNb(Object.keys(this.playerAssignments).length); + this.settings.launchGame(this.playerAssignments, this.storeReplay); + Engine.SwitchGuiPage("page_loading.xml", { + "attribs": this.initAttribs, + "playerAssignments": this.playerAssignments + }); + } +} diff --git a/binaries/data/mods/public/autostart/entrypoint.js b/binaries/data/mods/public/autostart/entrypoint.js new file mode 100644 index 0000000000..423e7bec43 --- /dev/null +++ b/binaries/data/mods/public/autostart/entrypoint.js @@ -0,0 +1,58 @@ +/** + * Implement autostart for the public mod. + * We want to avoid relying on too many specific files, so we'll mock a few engine functions. + * Depending on the path, these may get overwritten with the real function. + */ + +Engine.HasXmppClient = () => false; +Engine.SetRankedGame = () => {}; +Engine.TextureExists = () => false; +Engine.PushGuiPage = () => {}; +Engine.SwitchGuiPage = () => {}; + +var translateObjectKeys = () => {} +var translate = x => x; +var translateWithContext = x => x; + +// Required for functions such as sprintf. +Engine.LoadScript("globalscripts/"); +// MsgBox is used in the failure path. +// TODO: clean this up and show errors better in the non-visual path. +Engine.LoadScript("gui/common/functions_msgbox.js"); + +var autostartInstance; + +function autostartClient(initData) +{ + autostartInstance = new AutoStartClient(initData); +} + +/** + * This path depends on files currently stored under gui/, which should be moved. + * The best place would probably be a new 'engine' mod, independent from the 'mod' mod and the public mod. + */ +function autostartHost(initData, networked = false) +{ + Engine.LoadScript("gui/common/color.js"); + Engine.LoadScript("gui/common/functions_utility.js"); + Engine.LoadScript("gui/common/Observable.js"); + Engine.LoadScript("gui/common/settings.js"); + + Engine.LoadScript("gui/maps/MapCache.js") + + Engine.LoadScript("gamesettings/"); + Engine.LoadScript("gamesettings/attributes/"); + + if (networked) + autostartInstance = new AutoStartHost(initData); + else + autostartInstance = new AutoStart(initData); +} + +/** + * @returns false if the loop should carry on. + */ +function onTick() +{ + return autostartInstance.onTick(); +} diff --git a/binaries/data/mods/public/gui/gamesettings/GameSetting.js b/binaries/data/mods/public/gamesettings/GameSetting.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/GameSetting.js rename to binaries/data/mods/public/gamesettings/GameSetting.js diff --git a/binaries/data/mods/public/gui/gamesettings/GameSettings.js b/binaries/data/mods/public/gamesettings/GameSettings.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/GameSettings.js rename to binaries/data/mods/public/gamesettings/GameSettings.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Biome.js b/binaries/data/mods/public/gamesettings/attributes/Biome.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Biome.js rename to binaries/data/mods/public/gamesettings/attributes/Biome.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/CampaignData.js b/binaries/data/mods/public/gamesettings/attributes/CampaignData.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/CampaignData.js rename to binaries/data/mods/public/gamesettings/attributes/CampaignData.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Ceasefire.js b/binaries/data/mods/public/gamesettings/attributes/Ceasefire.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Ceasefire.js rename to binaries/data/mods/public/gamesettings/attributes/Ceasefire.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Cheats.js b/binaries/data/mods/public/gamesettings/attributes/Cheats.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Cheats.js rename to binaries/data/mods/public/gamesettings/attributes/Cheats.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/CircularMap.js b/binaries/data/mods/public/gamesettings/attributes/CircularMap.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/CircularMap.js rename to binaries/data/mods/public/gamesettings/attributes/CircularMap.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js b/binaries/data/mods/public/gamesettings/attributes/Daytime.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Daytime.js rename to binaries/data/mods/public/gamesettings/attributes/Daytime.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/DisableSpies.js b/binaries/data/mods/public/gamesettings/attributes/DisableSpies.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/DisableSpies.js rename to binaries/data/mods/public/gamesettings/attributes/DisableSpies.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/DisableTreasures.js b/binaries/data/mods/public/gamesettings/attributes/DisableTreasures.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/DisableTreasures.js rename to binaries/data/mods/public/gamesettings/attributes/DisableTreasures.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/GameSpeed.js b/binaries/data/mods/public/gamesettings/attributes/GameSpeed.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/GameSpeed.js rename to binaries/data/mods/public/gamesettings/attributes/GameSpeed.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js b/binaries/data/mods/public/gamesettings/attributes/Landscape.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Landscape.js rename to binaries/data/mods/public/gamesettings/attributes/Landscape.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/LastManStanding.js b/binaries/data/mods/public/gamesettings/attributes/LastManStanding.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/LastManStanding.js rename to binaries/data/mods/public/gamesettings/attributes/LastManStanding.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/LockedTeams.js b/binaries/data/mods/public/gamesettings/attributes/LockedTeams.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/LockedTeams.js rename to binaries/data/mods/public/gamesettings/attributes/LockedTeams.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Map.js b/binaries/data/mods/public/gamesettings/attributes/Map.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Map.js rename to binaries/data/mods/public/gamesettings/attributes/Map.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/MapExploration.js b/binaries/data/mods/public/gamesettings/attributes/MapExploration.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/MapExploration.js rename to binaries/data/mods/public/gamesettings/attributes/MapExploration.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/MapName.js b/binaries/data/mods/public/gamesettings/attributes/MapName.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/MapName.js rename to binaries/data/mods/public/gamesettings/attributes/MapName.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/MapPreview.js b/binaries/data/mods/public/gamesettings/attributes/MapPreview.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/MapPreview.js rename to binaries/data/mods/public/gamesettings/attributes/MapPreview.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js b/binaries/data/mods/public/gamesettings/attributes/MapSize.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/MapSize.js rename to binaries/data/mods/public/gamesettings/attributes/MapSize.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/MatchID.js b/binaries/data/mods/public/gamesettings/attributes/MatchID.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/MatchID.js rename to binaries/data/mods/public/gamesettings/attributes/MatchID.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js b/binaries/data/mods/public/gamesettings/attributes/Nomad.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Nomad.js rename to binaries/data/mods/public/gamesettings/attributes/Nomad.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerAI.js b/binaries/data/mods/public/gamesettings/attributes/PlayerAI.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerAI.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerAI.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js b/binaries/data/mods/public/gamesettings/attributes/PlayerCiv.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerCiv.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerCiv.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerColor.js b/binaries/data/mods/public/gamesettings/attributes/PlayerColor.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerColor.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerColor.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js b/binaries/data/mods/public/gamesettings/attributes/PlayerCount.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerCount.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerCount.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerName.js b/binaries/data/mods/public/gamesettings/attributes/PlayerName.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerName.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerName.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/PlayerTeam.js b/binaries/data/mods/public/gamesettings/attributes/PlayerTeam.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/PlayerTeam.js rename to binaries/data/mods/public/gamesettings/attributes/PlayerTeam.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Population.js b/binaries/data/mods/public/gamesettings/attributes/Population.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Population.js rename to binaries/data/mods/public/gamesettings/attributes/Population.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Rating.js b/binaries/data/mods/public/gamesettings/attributes/Rating.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Rating.js rename to binaries/data/mods/public/gamesettings/attributes/Rating.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/RegicideGarrison.js b/binaries/data/mods/public/gamesettings/attributes/RegicideGarrison.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/RegicideGarrison.js rename to binaries/data/mods/public/gamesettings/attributes/RegicideGarrison.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Relic.js b/binaries/data/mods/public/gamesettings/attributes/Relic.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Relic.js rename to binaries/data/mods/public/gamesettings/attributes/Relic.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/SeaLevelRise.js b/binaries/data/mods/public/gamesettings/attributes/SeaLevelRise.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/SeaLevelRise.js rename to binaries/data/mods/public/gamesettings/attributes/SeaLevelRise.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Seeds.js b/binaries/data/mods/public/gamesettings/attributes/Seeds.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Seeds.js rename to binaries/data/mods/public/gamesettings/attributes/Seeds.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/StartingCamera.js b/binaries/data/mods/public/gamesettings/attributes/StartingCamera.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/StartingCamera.js rename to binaries/data/mods/public/gamesettings/attributes/StartingCamera.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/StartingResources.js b/binaries/data/mods/public/gamesettings/attributes/StartingResources.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/StartingResources.js rename to binaries/data/mods/public/gamesettings/attributes/StartingResources.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js b/binaries/data/mods/public/gamesettings/attributes/TeamPlacement.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/TeamPlacement.js rename to binaries/data/mods/public/gamesettings/attributes/TeamPlacement.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/TriggerDifficulty.js b/binaries/data/mods/public/gamesettings/attributes/TriggerDifficulty.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/TriggerDifficulty.js rename to binaries/data/mods/public/gamesettings/attributes/TriggerDifficulty.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/TriggerScripts.js b/binaries/data/mods/public/gamesettings/attributes/TriggerScripts.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/TriggerScripts.js rename to binaries/data/mods/public/gamesettings/attributes/TriggerScripts.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/VictoryConditions.js b/binaries/data/mods/public/gamesettings/attributes/VictoryConditions.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/VictoryConditions.js rename to binaries/data/mods/public/gamesettings/attributes/VictoryConditions.js diff --git a/binaries/data/mods/public/gui/gamesettings/attributes/Wonder.js b/binaries/data/mods/public/gamesettings/attributes/Wonder.js similarity index 100% rename from binaries/data/mods/public/gui/gamesettings/attributes/Wonder.js rename to binaries/data/mods/public/gamesettings/attributes/Wonder.js diff --git a/binaries/data/mods/public/gui/autostart/autostart.js b/binaries/data/mods/public/gui/autostart/autostart.js deleted file mode 100644 index d5b33cd0ed..0000000000 --- a/binaries/data/mods/public/gui/autostart/autostart.js +++ /dev/null @@ -1,12 +0,0 @@ -function init(initData) -{ - let settings = new GameSettings().init(); - settings.fromInitAttributes(initData.attribs); - - settings.launchGame(initData.playerAssignments, initData.storeReplay); - - Engine.SwitchGuiPage("page_loading.xml", { - "attribs": settings.finalizedAttributes, - "playerAssignments": initData.playerAssignments - }); -} diff --git a/binaries/data/mods/public/gui/autostart/autostart.xml b/binaries/data/mods/public/gui/autostart/autostart.xml index 6a0999d272..7e8efdd6fc 100644 --- a/binaries/data/mods/public/gui/autostart/autostart.xml +++ b/binaries/data/mods/public/gui/autostart/autostart.xml @@ -2,7 +2,8 @@