var userReportEnabledText; // contains the original version with "$status" placeholder var currentSubmenuType; // contains submenu type const MARGIN = 4; // menu border size const background = "hellenes1"; // Background type. var g_ShowSplashScreens; function init(initData, hotloadData) { initMusic(); // Play main menu music global.music.setState(global.music.states.MENU); userReportEnabledText = Engine.GetGUIObjectByName("userReportEnabledText").caption; // initialize currentSubmenuType with placeholder to avoid null when switching currentSubmenuType = "submenuSinglePlayer"; EnableUserReport(Engine.IsUserReportEnabled()); // Only show splash screen(s) once at startup, but not again after hotloading g_ShowSplashScreens = hotloadData ? hotloadData.showSplashScreens : initData && initData.isStartup; } function getHotloadData() { return { "showSplashScreens": g_ShowSplashScreens }; } var t0 = new Date; function scrollBackgrounds(background) { switch(background) { default: case "hellenes1": var layer1 = Engine.GetGUIObjectByName("backgroundHele1-1"); var layer2 = Engine.GetGUIObjectByName("backgroundHele1-2"); var layer3 = Engine.GetGUIObjectByName("backgroundHele1-3"); layer1.hidden = false; layer2.hidden = false; layer3.hidden = false; var screen = layer1.parent.getComputedSize(); var h = screen.bottom - screen.top; // height of screen var w = h*16/9; // width of background image // Offset the layers by oscillating amounts var t = (t0 - new Date) / 700; var speed = 1/20; var off1 = 0.02 * w * (1+Math.cos(t*speed)); var off2 = 0.12 * w * (1+Math.cos(t*speed)) - h*6/9; var off3 = 0.16 * w * (1+Math.cos(t*speed)); var left = screen.right - w * (1 + Math.ceil(screen.right / w)); layer1.size = new GUISize(left + off1, screen.top, screen.right + off1, screen.bottom); layer2.size = new GUISize(screen.right/2 - h + off2, screen.top, screen.right/2 + h + off2, screen.bottom); layer3.size = new GUISize(screen.right - h + off3, screen.top, screen.right + off3, screen.bottom); break; } } function submitUserReportMessage() { var input = Engine.GetGUIObjectByName("userReportMessageInput"); var msg = input.caption; if (msg.length) Engine.SubmitUserReport("message", 1, msg); input.caption = ""; } function formatUserReportStatus(status) { var d = status.split(/:/, 3); if (d[0] == "disabled") return translate("disabled"); if (d[0] == "connecting") return translate("connecting to server"); if (d[0] == "sending") { var done = d[1]; return sprintf(translate("uploading (%f%%)"), Math.floor(100*done)); } if (d[0] == "completed") { var httpCode = d[1]; if (httpCode == 200) return translate("upload succeeded"); else return sprintf(translate("upload failed (%(errorCode)s)"), { errorCode: httpCode }); } if (d[0] == "failed") { var errCode = d[1]; var errMessage = d[2]; return sprintf(translate("upload failed (%(errorMessage)s)"), { errorMessage: errMessage }); } return translate("unknown"); } var lastTickTime = new Date; function onTick() { var now = new Date; var tickLength = new Date - lastTickTime; lastTickTime = now; // Animate backgrounds scrollBackgrounds(background); // Animate submenu updateMenuPosition(tickLength); if (Engine.IsUserReportEnabled()) { Engine.GetGUIObjectByName("userReportEnabledText").caption = userReportEnabledText.replace(/\$status/, formatUserReportStatus(Engine.GetUserReportStatus())); } // Show splash screens here, so we don't interfere with main menu hotloading if (g_ShowSplashScreens) { g_ShowSplashScreens = false; if (Engine.ConfigDB_GetValue("user", "splashscreendisable") !== "true" && Engine.ConfigDB_GetValue("user", "splashscreenversion") < Engine.GetFileMTime("gui/splashscreen/splashscreen.txt")) Engine.PushGuiPage("page_splashscreen.xml", { "page": "splashscreen", callback : "SplashScreenClosedCallback" } ); else ShowRenderPathMessage(); } } function ShowRenderPathMessage() { // Warn about removing fixed render path if (Engine.Renderer_GetRenderPath() == "fixed") messageBox( 600, 300, "[font=\"sans-bold-16\"]" + sprintf(translate("%(startWarning)sWarning:%(endWarning)s You appear to be using non-shader (fixed function) graphics. This option will be removed in a future 0 A.D. release, to allow for more advanced graphics features. We advise upgrading your graphics card to a more recent, shader-compatible model."), { startWarning: "[color=\"200 20 20\"]", endWarning: "[/color]"}) + "\n\n" + // Translation: This is the second paragraph of a warning. The // warning explains that the user is using “non-shader“ graphics, // and that in the future this will not be supported by the game, so // the user will need a better graphics card. translate("Please press \"Read More\" for more information or \"OK\" to continue."), translate("WARNING!"), 0, [translate("OK"), translate("Read More")], [ null, function() { Engine.OpenURL("http://www.wildfiregames.com/forum/index.php?showtopic=16734"); } ] ); } function SplashScreenClosedCallback() { ShowRenderPathMessage(); } function EnableUserReport(Enabled) { Engine.GetGUIObjectByName("userReportDisabled").hidden = Enabled; Engine.GetGUIObjectByName("userReportEnabled").hidden = !Enabled; Engine.SetUserReportEnabled(Enabled); } /* * MENU FUNCTIONS */ // Slide menu function updateMenuPosition(dt) { var submenu = Engine.GetGUIObjectByName("submenu"); if (submenu.hidden == false) { // Number of pixels per millisecond to move const SPEED = 1.2; var maxOffset = Engine.GetGUIObjectByName("mainMenu").size.right - submenu.size.left; if (maxOffset > 0) { var offset = Math.min(SPEED * dt, maxOffset); var size = submenu.size; size.left += offset; size.right += offset; submenu.size = size; } } } // Opens the menu by revealing the screen which contains the menu function openMenu(newSubmenu, position, buttonHeight, numButtons) { // switch to new submenu type currentSubmenuType = newSubmenu; Engine.GetGUIObjectByName(currentSubmenuType).hidden = false; // set position of new submenu var submenu = Engine.GetGUIObjectByName("submenu"); var top = position - MARGIN; var bottom = position + ((buttonHeight + MARGIN) * numButtons); submenu.size = submenu.size.left + " " + top + " " + submenu.size.right + " " + bottom; // Blend in right border of main menu into the left border of the submenu blendSubmenuIntoMain(top, bottom); // Reveal submenu Engine.GetGUIObjectByName("submenu").hidden = false; } // Closes the menu and resets position function closeMenu() { // playButtonSound(); // remove old submenu type Engine.GetGUIObjectByName(currentSubmenuType).hidden = true; // hide submenu and reset position var submenu = Engine.GetGUIObjectByName("submenu"); submenu.hidden = true; submenu.size = Engine.GetGUIObjectByName("mainMenu").size; // reset main menu panel right border Engine.GetGUIObjectByName("MainMenuPanelRightBorderTop").size = "100%-2 0 100% 100%"; } // Sizes right border on main menu panel to match the submenu function blendSubmenuIntoMain(topPosition, bottomPosition) { var topSprite = Engine.GetGUIObjectByName("MainMenuPanelRightBorderTop"); topSprite.size = "100%-2 0 100% " + (topPosition + MARGIN); var bottomSprite = Engine.GetGUIObjectByName("MainMenuPanelRightBorderBottom"); bottomSprite.size = "100%-2 " + (bottomPosition) + " 100% 100%"; } function getBuildString() { return sprintf(translate("Build: %(buildDate)s (%(revision)s)"), { buildDate: Engine.GetBuildTimestamp(0), revision: Engine.GetBuildTimestamp(2) }); } /* * FUNCTIONS BELOW DO NOT WORK YET */ //// Move the credits up the screen. //function updateCredits() //{ // // If there are still credit lines to remove, remove them. // if (getNumItems("pgCredits") > 0) // removeItem ("pgCredits", 0); // else // { // // When we've run out of credit, // // // Stop the increment timer if it's still active. // cancelInterval(); // // // Close the credits screen and return. // closeMainMenuSubWindow ("pgCredits"); // guiUnHide ("pg"); // } //} function exitGamePressed() { closeMenu(); var btCaptions = [translate("No"), translate("Yes")]; var btCode = [null, Engine.Exit]; messageBox(400, 200, translate("Are you sure you want to quit 0 A.D.?"), translate("Confirmation"), 0, btCaptions, btCode); } function pressedScenarioEditorButton() { closeMenu(); // Start Atlas if (Engine.AtlasIsAvailable()) Engine.RestartInAtlas(); else messageBox(400, 200, translate("The scenario editor is not available or failed to load. See the game logs for additional information."), translate("Error"), 2); } function getLobbyDisabledByBuild() { return translate("Launch the multiplayer lobby. \\[DISABLED BY BUILD]"); } function getTechnicalDetails() { return translate("Technical Details"); } function getManual() { return translate("Manual"); }