diff --git a/binaries/data/mods/public/art/textures/ui/tipdisplay/arrow.png b/binaries/data/mods/public/art/textures/ui/tipdisplay/arrow.png new file mode 100644 index 0000000000..4f95a6eff1 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tipdisplay/arrow.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd80f8fbb416cf89330033fc8b99d8a36f4e192e07e728d892a38b3bb56889b2 +size 1596 diff --git a/binaries/data/mods/public/art/textures/ui/tips/briton_war_dog.png b/binaries/data/mods/public/art/textures/ui/tips/briton_war_dog.png index 83da91fe32..063a4f44ed 100644 --- a/binaries/data/mods/public/art/textures/ui/tips/briton_war_dog.png +++ b/binaries/data/mods/public/art/textures/ui/tips/briton_war_dog.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d8d35bec52b327e6616c3604a0374c6a5421a411ae1f9c9d62bd61078afab2c7 -size 413825 +oid sha256:2780a4b1d089ea77912798930ef0d183094cc7d348d8787d100e70ce7c085030 +size 480924 diff --git a/binaries/data/mods/public/art/textures/ui/tips/forge.png b/binaries/data/mods/public/art/textures/ui/tips/forge.png deleted file mode 100644 index c28918d8f9..0000000000 --- a/binaries/data/mods/public/art/textures/ui/tips/forge.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:69c66869ac39f5f124fea4f830c84f0bc4b1a9b09e0d86ea0adc0473770844b8 -size 517303 diff --git a/binaries/data/mods/public/art/textures/ui/tips/forge_iber.png b/binaries/data/mods/public/art/textures/ui/tips/forge_iber.png new file mode 100644 index 0000000000..575667ef85 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/forge_iber.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cc993d0288a5d0abf29236b08393b9c331d1bc4c2d1947f6a1347237df611c9 +size 550182 diff --git a/binaries/data/mods/public/art/textures/ui/tips/forge_maur.png b/binaries/data/mods/public/art/textures/ui/tips/forge_maur.png new file mode 100644 index 0000000000..dcd158c72b --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/forge_maur.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78f72ce32819ae863f2c498228380cf973d8dab9962bb25e37b79f49a38d20dc +size 469980 diff --git a/binaries/data/mods/public/art/textures/ui/tips/forge_rome.png b/binaries/data/mods/public/art/textures/ui/tips/forge_rome.png new file mode 100644 index 0000000000..18aefa7214 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/forge_rome.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de2de12c31add95f3570ebb4b887bf920ce7f7c4efbfad572e6b8364720e82f9 +size 466687 diff --git a/binaries/data/mods/public/art/textures/ui/tips/fortress_han.png b/binaries/data/mods/public/art/textures/ui/tips/fortress_han.png new file mode 100644 index 0000000000..6ca1947bb2 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/fortress_han.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f0587f5303a872f38977c844f0cd2533887c5da48e2b4808f728774e3c56285 +size 374279 diff --git a/binaries/data/mods/public/art/textures/ui/tips/fortress.png b/binaries/data/mods/public/art/textures/ui/tips/fortress_iber.png similarity index 100% rename from binaries/data/mods/public/art/textures/ui/tips/fortress.png rename to binaries/data/mods/public/art/textures/ui/tips/fortress_iber.png diff --git a/binaries/data/mods/public/art/textures/ui/tips/fortress_maur.png b/binaries/data/mods/public/art/textures/ui/tips/fortress_maur.png new file mode 100644 index 0000000000..c2af6684e3 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/fortress_maur.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b3b260c96a162b4d3ee988cd4f2efbdf62d902a60dafa2eb8be471df63e14ffd +size 436665 diff --git a/binaries/data/mods/public/art/textures/ui/tips/nomad.png b/binaries/data/mods/public/art/textures/ui/tips/nomad.png new file mode 100644 index 0000000000..6153c5e86d --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/nomad.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71d6f493ebe0ae1174dedca2853e085273085157ee2640a817402453804c108e +size 549108 diff --git a/binaries/data/mods/public/art/textures/ui/tips/storehouse.png b/binaries/data/mods/public/art/textures/ui/tips/storehouse_1.png similarity index 100% rename from binaries/data/mods/public/art/textures/ui/tips/storehouse.png rename to binaries/data/mods/public/art/textures/ui/tips/storehouse_1.png diff --git a/binaries/data/mods/public/art/textures/ui/tips/storehouse_2.png b/binaries/data/mods/public/art/textures/ui/tips/storehouse_2.png new file mode 100644 index 0000000000..640edafaf7 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/storehouse_2.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb1a15d43c9d73f1acd14de07b550ea2bda8545100ee61f625f8b38830b0f2a0 +size 502623 diff --git a/binaries/data/mods/public/art/textures/ui/tips/temple.png b/binaries/data/mods/public/art/textures/ui/tips/temple.png deleted file mode 100644 index c39f840d13..0000000000 --- a/binaries/data/mods/public/art/textures/ui/tips/temple.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:758ea5f1c0f85fd58e1e99cf71dc9efed092f9163511e6c5aeed76f9ec1c476a -size 511577 diff --git a/binaries/data/mods/public/art/textures/ui/tips/temple_gaul.png b/binaries/data/mods/public/art/textures/ui/tips/temple_gaul.png new file mode 100644 index 0000000000..4e33ac4855 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/temple_gaul.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1443e8f68e24c5c9a6edfe74a20e32b942b9fe676e292279f54dae877c5164ae +size 479957 diff --git a/binaries/data/mods/public/art/textures/ui/tips/temple_greek.png b/binaries/data/mods/public/art/textures/ui/tips/temple_greek.png new file mode 100644 index 0000000000..bdf9f97bb3 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/temple_greek.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f9f954feb9a6330a22c019b7100d6d22af307da4a0300285595bc77d6181e75 +size 525437 diff --git a/binaries/data/mods/public/art/textures/ui/tips/temple_pers.png b/binaries/data/mods/public/art/textures/ui/tips/temple_pers.png new file mode 100644 index 0000000000..b66bb101b9 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/temple_pers.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aecff65f487f55815b3017b2512e58cc93aba3d3c5d81ca5771a96be686c1dfd +size 476475 diff --git a/binaries/data/mods/public/art/textures/ui/tips/theater.png b/binaries/data/mods/public/art/textures/ui/tips/theater.png index 15e36a6ca8..2cda7c2f32 100644 --- a/binaries/data/mods/public/art/textures/ui/tips/theater.png +++ b/binaries/data/mods/public/art/textures/ui/tips/theater.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:cee6ea8fd639ec4628cebb0c5ef6044a451e35ad6e63dc11b2a060d94c3d988a -size 505920 +oid sha256:d5fec420dfaa0693dc93187f173e7a53680d564445dcef8375d310389e7b2a74 +size 516779 diff --git a/binaries/data/mods/public/art/textures/ui/tips/wonder_gaul.png b/binaries/data/mods/public/art/textures/ui/tips/wonder_gaul.png new file mode 100644 index 0000000000..3cac12d276 --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/wonder_gaul.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9289a34996a452e538a4c5d26ad3c6727a062027683dcdf85bc04372d39e7758 +size 490746 diff --git a/binaries/data/mods/public/art/textures/ui/tips/wonder_han.png b/binaries/data/mods/public/art/textures/ui/tips/wonder_han.png new file mode 100644 index 0000000000..0fd38470fa --- /dev/null +++ b/binaries/data/mods/public/art/textures/ui/tips/wonder_han.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98dba1a205e9b519049fe643770eb3a14c6098a73d9b22de6f2059d582944e8b +size 407700 diff --git a/binaries/data/mods/public/gui/credits/texts/art.json b/binaries/data/mods/public/gui/credits/texts/art.json index 30fe55fc83..5ec48d9502 100644 --- a/binaries/data/mods/public/gui/credits/texts/art.json +++ b/binaries/data/mods/public/gui/credits/texts/art.json @@ -58,6 +58,7 @@ { "nick": "Sundiata", "name": "Malcolm Kwadwo Kwarte Quartey" }, { "nick": "ThorRune" }, { "name": "Tsaag Valren" }, + { "nick": "Vantha" }, { "name": "Veronica L. Almy Wright" }, { "nick": "Victor Rossi", "name": "Victor Rossi" }, { "nick": "wackyserious", "name": "Arjel Kenneth Abulog" }, diff --git a/binaries/data/mods/public/gui/credits/texts/programming.json b/binaries/data/mods/public/gui/credits/texts/programming.json index 8f2907c16a..5a5c264256 100644 --- a/binaries/data/mods/public/gui/credits/texts/programming.json +++ b/binaries/data/mods/public/gui/credits/texts/programming.json @@ -297,7 +297,7 @@ { "nick": "tpearson", "name": "Timothy Pearson" }, { "nick": "user1", "name": "A. C." }, { "nick": "usey11" }, - { "nick": "Vantha"}, + { "nick": "Vantha" }, { "nick": "vincent_c", "name": "Vincent Cheng" }, { "nick": "vinhig", "name": "Vincent Higginson" }, { "nick": "vladislavbelov", "name": "Vladislav Belov" }, diff --git a/binaries/data/mods/public/gui/loading/loading.js b/binaries/data/mods/public/gui/loading/loading.js index 3cca5df849..ff4b8ee79c 100644 --- a/binaries/data/mods/public/gui/loading/loading.js +++ b/binaries/data/mods/public/gui/loading/loading.js @@ -6,8 +6,7 @@ function init(data) "initData": data, "progressBar": new ProgressBar(), "quoteDisplay": new QuoteDisplay(), - // Note that the construction parameter is set to false to disable tip scrolling. - "tipDisplay": new TipDisplay(false), + "tipDisplay": new TipDisplay({ "tipScrolling": false }), "titleDisplay": new TitleDisplay(data) }; diff --git a/binaries/data/mods/public/gui/pregame/MainMenuItems.js b/binaries/data/mods/public/gui/pregame/MainMenuItems.js index 058aa4e371..4248c22d94 100644 --- a/binaries/data/mods/public/gui/pregame/MainMenuItems.js +++ b/binaries/data/mods/public/gui/pregame/MainMenuItems.js @@ -36,7 +36,7 @@ var g_MainMenuItems = [ "caption": translate("Tips and Tricks"), "tooltip": translate("Discover simple tips, tricks, and game mechanics."), "onPress": () => { - Engine.PushGuiPage("page_tips.xml"); + Engine.PushGuiPage("page_tips.xml", { "tipScrolling": true }); } }, { diff --git a/binaries/data/mods/public/gui/reference/tips/TipsPage.js b/binaries/data/mods/public/gui/reference/tips/TipsPage.js index eaa5a8a757..119f9f4c12 100644 --- a/binaries/data/mods/public/gui/reference/tips/TipsPage.js +++ b/binaries/data/mods/public/gui/reference/tips/TipsPage.js @@ -1,8 +1,8 @@ class TipsPage { - constructor() + constructor(initData, hotloadData) { - this.tipDisplay = new TipDisplay(); + this.tipDisplay = new TipDisplay(initData, hotloadData); this.closeButton = new CloseButton(this); } diff --git a/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.js b/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.js index 5f54e29be6..8cbfb06e9f 100644 --- a/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.js +++ b/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.js @@ -1,65 +1,96 @@ /** * This class is concerned with chosing and displaying tips about how to play the game. - * This includes a text and an image. + * This includes a text and one or more images. */ class TipDisplay { /** - * @param {boolean} tipScrolling - Whether or not to enable the player to scroll through the tips. + * @param {boolean} initData.tipScrolling - Whether or not to enable the player to scroll through the tips and the tip images. + * @param {Array|undefined} hotloadData.tipFilesData - Hotloaded value storing last time's tipFilesData. + * @param {number|undefined} hotloadData.tipIndex - Hotloaded value pointing to a specific tip. + * @param {number|undefined} hotloadData.tipImageIndex - Hotloaded value pointing to a specific tip image. */ - constructor(tipScrolling = true) + constructor(initData, hotloadData) { this.tipImage = Engine.GetGUIObjectByName("tipImage"); this.tipTitle = Engine.GetGUIObjectByName("tipTitle"); this.tipTitleDecoration = Engine.GetGUIObjectByName("tipTitleDecoration"); this.tipText = Engine.GetGUIObjectByName("tipText"); + this.tipImageText = Engine.GetGUIObjectByName("tipImageText"); this.previousTipButton = Engine.GetGUIObjectByName("previousTipButton"); + this.imageControlPanel = Engine.GetGUIObjectByName("imageControlPanel"); this.nextTipButton = Engine.GetGUIObjectByName("nextTipButton"); + this.previousImageButton = Engine.GetGUIObjectByName("previousImageButton"); + this.nextImageButton = Engine.GetGUIObjectByName("nextImageButton"); this.previousTipButton.caption = this.CaptionPreviousTip; - this.previousTipButton.tooltip = colorizeHotkey("%(hotkey)s: ", "item.prev") + this.TooltipPreviousTip; - this.nextTipButton.caption = this.CaptionNextTip; + + this.previousTipButton.tooltip = colorizeHotkey("%(hotkey)s: ", "item.prev") + this.TooltipPreviousTip; this.nextTipButton.tooltip = colorizeHotkey("%(hotkey)s: ", "item.next") + this.TooltipNextTip; + this.previousImageButton.tooltip = this.TooltipPreviousImage; + this.nextImageButton.tooltip = this.TooltipNextImage; - this.tipFiles = shuffleArray(listFiles(this.TextPath, ".txt", false)); - if (this.tipFiles.length === 0) - { - warn("Failed to find any tips to display."); - return; - } + this.tipFilesData = + hotloadData?.tipFilesData || + shuffleArray( + Engine.ReadJSONFile(this.TipFilesDataFile) + ).map(tip => { + tip.imageFiles = shuffleArray(tip.imageFiles); + return tip; + }); - const hideButtons = !tipScrolling || this.tipFiles.length < 2; + this.currentTip = {}; + this.tipIndex = -1; + this.tipImageIndex = -1; + + this.enableTipScrolling = initData.tipScrolling; + const hideButtons = !initData.tipScrolling || this.tipFilesData.length < 2; this.previousTipButton.hidden = hideButtons; this.nextTipButton.hidden = hideButtons; - this.tipFilesIndex = -1; - this.nextTipButton.onPress = () => this.onIndexChange(1); - this.previousTipButton.onPress = () => this.onIndexChange(-1); - this.onIndexChange(1); + + this.previousTipButton.onPress = () => this.onTipIndexChange(-1); + this.nextTipButton.onPress = () => this.onTipIndexChange(1); + this.previousImageButton.onPress = () => this.onTipImageIndexChange(-1); + this.nextImageButton.onPress = () => this.onTipImageIndexChange(1); + + this.onTipIndexChange(hotloadData?.tipIndex ? hotloadData.tipIndex + 1 : 1); + if (hotloadData?.tipImageIndex) + this.onTipImageIndexChange(hotloadData.tipImageIndex + 1); } - onIndexChange(number) + getHotloadData() { - this.tipFilesIndex += number; - - this.tipFilesIndex = Math.max(0, Math.min(this.tipFilesIndex, this.tipFiles.length - 1)); - - this.displayTip(this.tipFiles[this.tipFilesIndex]); - this.rebuildButtons(); + return { + "tipFilesData": this.tipFilesData, + "tipIndex": this.tipIndex, + "tipImageIndex": this.tipImageIndex + }; } - rebuildButtons() + onTipIndexChange(number) { - this.previousTipButton.enabled = this.tipFilesIndex !== 0 && !this.previousTipButton.hidden; - this.nextTipButton.enabled = this.tipFilesIndex < this.tipFiles.length - 1 && !this.nextTipButton.hidden; + this.tipIndex += number; + this.tipIndex = Math.max(0, Math.min(this.tipIndex, this.tipFilesData.length - 1)); + this.currentTip = this.tipFilesData[this.tipIndex]; + + this.updateTipText(); + this.rebuildTipButtons(); + this.onTipImageIndexChange(-this.tipImageIndex); } - displayTip(tipFile) + onTipImageIndexChange(number) { - this.tipImage.sprite = "stretched:" + this.ImagePath + tipFile + ".png"; + this.tipImageIndex += number; + this.tipImageIndex = Math.max(0, Math.min(this.tipImageIndex, this.currentTip.imageFiles.length - 1)); - const tipText = Engine.TranslateLines(Engine.ReadFile( - this.TextPath + tipFile + ".txt")).split("\n"); + this.updateTipImage(); + this.rebuildTipImageButtons(); + } + + updateTipText() + { + const tipText = Engine.TranslateLines(Engine.ReadFile(this.TextPath + this.currentTip.textFile)).split("\n"); this.tipTitle.caption = tipText.shift(); this.scaleGuiElementsToFit(); @@ -67,6 +98,27 @@ class TipDisplay text && "[icon=\"BulletPoint\"] " + text).join("\n\n"); } + updateTipImage() + { + this.tipImage.sprite = "stretched:" + this.ImagePath + this.currentTip.imageFiles[this.tipImageIndex]; + this.imageControlPanel.hidden = !this.enableTipScrolling || this.currentTip.imageFiles.length === 1; + + if (!this.imageControlPanel.hidden) + this.tipImageText.caption = (this.tipImageIndex + 1) + " / " + this.currentTip.imageFiles.length; + } + + rebuildTipButtons() + { + this.previousTipButton.enabled = !this.previousTipButton.hidden && this.tipIndex !== 0; + this.nextTipButton.enabled = !this.nextTipButton.hidden && this.tipIndex < this.tipFilesData.length - 1; + } + + rebuildTipImageButtons() + { + this.previousImageButton.enabled = this.tipImageIndex > 0; + this.nextImageButton.enabled = this.tipImageIndex < this.currentTip.imageFiles.length - 1; + } + scaleGuiElementsToFit() { const titleSize = this.tipTitle.size; @@ -92,12 +144,20 @@ TipDisplay.prototype.TooltipPreviousTip = translate("Switch to the previous tip. TipDisplay.prototype.CaptionNextTip = translateWithContext("button", "Next"); TipDisplay.prototype.TooltipNextTip = translate("Switch to the next tip."); +TipDisplay.prototype.TooltipPreviousImage = translate("Switch to the previous image."); +TipDisplay.prototype.TooltipNextImage = translate("Switch to the next image."); + +/** + * JSON file assigning one or more tip image files (.png) to each tip text file (.txt). + */ +TipDisplay.prototype.TipFilesDataFile = "gui/reference/tips/tipfiles.json"; + /** * Directory storing .txt files containing the gameplay tips. */ TipDisplay.prototype.TextPath = "gui/reference/tips/texts/"; /** - * Directory storing the .png images with filenames corresponding to the tip text files. + * Subdirectory of art/textures/ui storing the .png images illustrating the tips. */ TipDisplay.prototype.ImagePath = "tips/"; diff --git a/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.xml b/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.xml index 1fb47d1876..6c315dd8f5 100644 --- a/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.xml +++ b/binaries/data/mods/public/gui/reference/tips/sections/TipDisplay.xml @@ -1,11 +1,15 @@