From 0bf31fb68c99751628755c32f2c296d9669b3d33 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Thu, 22 Jun 2023 23:03:58 +0530 Subject: [PATCH] end game finish --- src/MarbleWorld.hx | 3 +- src/gui/EndGameGui.hx | 389 +++++++------------------------------- src/gui/GuiXboxButton.hx | 154 +++++++++++++++ src/mis/MissionElement.hx | 1 + 4 files changed, 225 insertions(+), 322 deletions(-) create mode 100644 src/gui/GuiXboxButton.hx diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 38674648..20333498 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1398,7 +1398,7 @@ class MarbleWorld extends Scheduler { this.finishPitch = this.marble.camera.CameraPitch; displayAlert("Congratulations! You've finished!"); if (!this.isWatching) - this.schedule(this.timeState.currentAttemptTime + 2, () -> cast showFinishScreen()); + this.schedule(this.timeState.currentAttemptTime + 5, () -> cast showFinishScreen()); // Stop the ongoing sounds if (timeTravelSound != null) { timeTravelSound.stop(); @@ -1410,6 +1410,7 @@ class MarbleWorld extends Scheduler { function showFinishScreen() { if (this.isWatching) return 0; + playGui.setGuiVisibility(false); Console.log("State End"); var egg:EndGameGui = null; #if js diff --git a/src/gui/EndGameGui.hx b/src/gui/EndGameGui.hx index 60ce1862..d0941a9d 100644 --- a/src/gui/EndGameGui.hx +++ b/src/gui/EndGameGui.hx @@ -1,5 +1,6 @@ package gui; +import mis.MisParser; import hxd.BitmapData; import h2d.Tile; import src.MarbleGame; @@ -13,13 +14,14 @@ import src.ResourceLoader; import src.TimeState; import src.Util; -class EndGameGui extends GuiControl { +class EndGameGui extends GuiImage { var mission:Mission; var scoreSubmitted:Bool = false; public function new(continueFunc:GuiControl->Void, restartFunc:GuiControl->Void, nextLevelFunc:GuiControl->Void, mission:Mission, timeState:TimeState) { - super(); + var res = ResourceLoader.getImage("data/ui/xbox/BG_fadeOutSoftEdge.png").resource.toTile(); + super(res); this.horizSizing = Width; this.vertSizing = Height; this.position = new Vector(0, 0); @@ -38,8 +40,8 @@ class EndGameGui extends GuiControl { var offsetX = (scene2d.width - 1280) / 2; var offsetY = (scene2d.height - 720) / 2; - var subX = 640 - (scene2d.width - offsetX * 2) * 640 / scene2d.width; - var subY = 480 - (scene2d.height - offsetY * 2) * 480 / scene2d.height; + var subX = 640 - (scene2d.width - offsetX) * 640 / scene2d.width; + var subY = 480 - (scene2d.height - offsetY) * 480 / scene2d.height; var innerCtrl = new GuiControl(); innerCtrl.position = new Vector(offsetX, offsetY); @@ -48,16 +50,26 @@ class EndGameGui extends GuiControl { innerCtrl.vertSizing = Height; this.addChild(innerCtrl); + var coliseumfontdata = ResourceLoader.getFileEntry("data/font/ColiseumRR.fnt"); + var coliseumb = new BitmapFont(coliseumfontdata.entry); + @:privateAccess coliseumb.loader = ResourceLoader.loader; + var coliseum = coliseumb.toSdfFont(cast 44 * Settings.uiScale, MultiChannel); + + var rootTitle = new GuiText(coliseum); + rootTitle.position = new Vector(100, 30); + rootTitle.extent = new Vector(1120, 80); + rootTitle.text.textColor = 0xFFFFFF; + rootTitle.text.text = "LEVEL COMPLETE!"; + rootTitle.text.alpha = 0.5; + innerCtrl.addChild(rootTitle); + var endGameWnd = new GuiImage(ResourceLoader.getResource("data/ui/xbox/endGameWindow.png", ResourceLoader.getImage, this.imageResources).toTile()); endGameWnd.horizSizing = Left; endGameWnd.vertSizing = Top; - endGameWnd.position = new Vector(80 - offsetX / 2, 170); + endGameWnd.position = new Vector(80 - offsetX, 170 - offsetY); endGameWnd.extent = new Vector(336, 150); innerCtrl.addChild(endGameWnd); - var subX = 640 - (scene2d.width - offsetX * 2) * 640 / scene2d.width; - var subY = 480 - (scene2d.height - offsetY * 2) * 480 / scene2d.height; - var arial14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); var arial14b = new BitmapFont(arial14fontdata.entry); @:privateAccess arial14b.loader = ResourceLoader.loader; @@ -72,16 +84,37 @@ class EndGameGui extends GuiControl { return arial14; } + var beatPar = timeState.gameplayClock < mission.qualifyTime; + var egResultLeft = new GuiMLText(arial14, mlFontLoader); egResultLeft.position = new Vector(28, 26); egResultLeft.extent = new Vector(180, 100); - egResultLeft.text.text = '

Time:
Par Time:
Rating:
My Best Time:

'; + egResultLeft.text.text = '

Time:
Par Time:
Rating:
My Best Time:

'; endGameWnd.addChild(egResultLeft); var c0 = 0xEBEBEB; var c1 = 0x8DFF8D; var c2 = 0x88BCEE; var c3 = 0xFF7575; + function calcRating(time:Float, parTime:Float, goldTime:Float, difficulty:Int):Int { + var t = time - (time % 10); + if (t == 0) + return 0; + var completionBonus = 1000; + var timeBonus = 0; + if (t < parTime) + timeBonus = Math.floor(parTime / t) * 1000; + else + timeBonus = Math.floor(parTime / t) * 500; + return (completionBonus + timeBonus) * difficulty; + } + + var rating = calcRating(timeState.gameplayClock * 1000, mission.qualifyTime * 1000, mission.goldTime * 1000, + Std.parseInt(mission.missionInfo.difficulty)); + + var myScore = {name: "Player", time: timeState.gameplayClock}; + Settings.saveScore(mission.path, myScore); + var scoreData:Array = Settings.getScores(mission.path); while (scoreData.length < 1) { scoreData.push({name: "Nardo Polo", time: 5999.999}); @@ -90,324 +123,38 @@ class EndGameGui extends GuiControl { var bestScore = scoreData[0]; var egResultRight = new GuiMLText(arial14, mlFontLoader); + egResultRight.position = new Vector(214, 26); egResultRight.extent = new Vector(180, 100); - egResultRight.text.text = '${Util.formatTime(timeState.gameplayClock)}
${Util.formatTime(mission.qualifyTime)}
0
${Util.formatTime(bestScore.time)}'; + egResultRight.text.text = '${Util.formatTime(timeState.gameplayClock)}
${Util.formatTime(mission.qualifyTime)}
${rating}
${Util.formatTime(bestScore.time)}'; endGameWnd.addChild(egResultRight); - // var pg = new GuiImage(ResourceLoader.getResource("data/ui/endgame/base.png", ResourceLoader.getImage, this.imageResources).toTile()); - // pg.horizSizing = Center; - // pg.vertSizing = Center; - // pg.position = new Vector(28, 20); - // pg.extent = new Vector(584, 440); + var bottomBar = new GuiControl(); + bottomBar.position = new Vector(0, innerCtrl.extent.x * 590 / 480); + bottomBar.extent = new Vector(640, 200); + bottomBar.horizSizing = Width; + bottomBar.vertSizing = Bottom; + this.addChild(bottomBar); - // var continueButton = new GuiButton(loadButtonImages("data/ui/endgame/continue")); - // continueButton.horizSizing = Right; - // continueButton.vertSizing = Bottom; - // continueButton.position = new Vector(460, 307); - // continueButton.extent = new Vector(104, 54); - // continueButton.accelerator = hxd.Key.ENTER; - // continueButton.gamepadAccelerator = ["A"]; - // continueButton.pressedAction = (e) -> continueFunc(continueButton); + var retryButton = new GuiXboxButton("Retry", 160); + retryButton.position = new Vector(-240, 0); + retryButton.vertSizing = Bottom; + retryButton.horizSizing = Left; + retryButton.gamepadAccelerator = ["B"]; + retryButton.pressedAction = (e) -> restartFunc(retryButton); + bottomBar.addChild(retryButton); - // var restartButton = new GuiButton(loadButtonImages("data/ui/endgame/replay")); - // restartButton.horizSizing = Right; - // restartButton.vertSizing = Bottom; - // restartButton.position = new Vector(460, 363); - // restartButton.extent = new Vector(104, 54); - // restartButton.gamepadAccelerator = ["B"]; - // restartButton.pressedAction = (e) -> restartFunc(restartButton); + var lbButton = new GuiXboxButton("Leaderboard", 220); + lbButton.position = new Vector(110, 0); + lbButton.vertSizing = Bottom; + lbButton.horizSizing = Left; + bottomBar.addChild(lbButton); - // var nextLevel = new GuiControl(); - // nextLevel.position = new Vector(326, 307); - // nextLevel.extent = new Vector(130, 110); - - // var temprev = new BitmapData(1, 1); - // temprev.setPixel(0, 0, 0); - // var tmpprevtile = Tile.fromBitmap(temprev); - - // var nextLevelPreview = new GuiImage(tmpprevtile); - // nextLevelPreview.position = new Vector(-15, 0); - // nextLevelPreview.extent = new Vector(160, 110); - // nextLevel.addChild(nextLevelPreview); - - // mission.getNextMission().getPreviewImage(t -> { - // nextLevelPreview.bmp.tile = t; - // }); - - // var nextLevelBtn = new GuiButton(loadButtonImages('data/ui/endgame/level_window')); - // nextLevelBtn.horizSizing = Width; - // nextLevelBtn.vertSizing = Height; - // nextLevelBtn.position = new Vector(0, 0); - // nextLevelBtn.extent = new Vector(130, 110); - // nextLevelBtn.gamepadAccelerator = ["X"]; - // nextLevelBtn.pressedAction = (e) -> nextLevelFunc(nextLevelBtn); - // nextLevel.addChild(nextLevelBtn); - - // function setButtonStates(enabled:Bool) { - // nextLevelBtn.disabled = !enabled; - // continueButton.disabled = !enabled; - // restartButton.disabled = !enabled; - // } - - // var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); - // var arial14b = new BitmapFont(arial14fontdata.entry); - // @:privateAccess arial14b.loader = ResourceLoader.loader; - // var arial14 = arial14b.toSdfFont(cast 12 * Settings.uiScale, MultiChannel); - - // var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt"); - // var domcasual32b = new BitmapFont(domcasual32fontdata.entry); - // @:privateAccess domcasual32b.loader = ResourceLoader.loader; - // var domcasual32 = domcasual32b.toSdfFont(cast 28 * Settings.uiScale, MultiChannel); - // var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel); - // var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel); - - // var expo50fontdata = ResourceLoader.getFileEntry("data/font/EXPON.fnt"); - // var expo50b = new BitmapFont(expo50fontdata.entry); - // @:privateAccess expo50b.loader = ResourceLoader.loader; - // var expo50 = expo50b.toSdfFont(cast 35 * Settings.uiScale, MultiChannel); - // var expo32 = expo50b.toSdfFont(cast 24 * Settings.uiScale, MultiChannel); - - // function mlFontLoader(text:String) { - // switch (text) { - // case "DomCasual24": - // return domcasual24; - // case "DomCasual32": - // return domcasual32; - // case "DomCasual64": - // return domcasual64; - // case "Arial14": - // return arial14; - // case "Expo32": - // return expo32; - // default: - // return null; - // } - // } - - // var egResult = new GuiMLText(domcasual32, mlFontLoader); - // egResult.position = new Vector(313, 54); - // egResult.extent = new Vector(244, 69); - // egResult.text.text = '

${Util.formatTime(timeState.gameplayClock)}

'; - // egResult.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); - // pg.addChild(egResult); - - // var egFirstLine = new GuiMLText(domcasual24, mlFontLoader); - // egFirstLine.position = new Vector(340, 150); - // egFirstLine.extent = new Vector(210, 25); - // egFirstLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFirstLine); - - // var egSecondLine = new GuiMLText(domcasual24, mlFontLoader); - // egSecondLine.position = new Vector(341, 178); - // egSecondLine.extent = new Vector(209, 25); - // egSecondLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egSecondLine); - - // var egThirdLine = new GuiMLText(domcasual24, mlFontLoader); - // egThirdLine.position = new Vector(341, 206); - // egThirdLine.extent = new Vector(209, 25); - // egThirdLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egThirdLine); - - // var egFourthLine = new GuiMLText(domcasual24, mlFontLoader); - // egFourthLine.position = new Vector(341, 234); - // egFourthLine.extent = new Vector(209, 25); - // egFourthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFourthLine); - - // var egFifthLine = new GuiMLText(domcasual24, mlFontLoader); - // egFifthLine.position = new Vector(341, 262); - // egFifthLine.extent = new Vector(209, 25); - // egFifthLine.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFifthLine); - - // var egFirstLineScore = new GuiMLText(domcasual24, mlFontLoader); - // egFirstLineScore.position = new Vector(475, 150); - // egFirstLineScore.extent = new Vector(210, 25); - // egFirstLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFirstLineScore); - - // var egSecondLineScore = new GuiMLText(domcasual24, mlFontLoader); - // egSecondLineScore.position = new Vector(476, 178); - // egSecondLineScore.extent = new Vector(209, 25); - // egSecondLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egSecondLineScore); - - // var egThirdLineScore = new GuiMLText(domcasual24, mlFontLoader); - // egThirdLineScore.position = new Vector(476, 206); - // egThirdLineScore.extent = new Vector(209, 25); - // egThirdLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egThirdLineScore); - - // var egFourthLineScore = new GuiMLText(domcasual24, mlFontLoader); - // egFourthLineScore.position = new Vector(476, 234); - // egFourthLineScore.extent = new Vector(209, 25); - // egFourthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFourthLineScore); - - // var egFifthLineScore = new GuiMLText(domcasual24, mlFontLoader); - // egFifthLineScore.position = new Vector(476, 262); - // egFifthLineScore.extent = new Vector(209, 25); - // egFifthLineScore.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // pg.addChild(egFifthLineScore); - - // var egTitleText = new GuiMLText(expo50, mlFontLoader); - // egTitleText.text.textColor = 0xffff00; - // egTitleText.text.text = 'Your Time:'; - // egTitleText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); - // egTitleText.position = new Vector(34, 54); - // egTitleText.extent = new Vector(247, 69); - // pg.addChild(egTitleText); - - // var egTopThreeText = new GuiMLText(domcasual32, mlFontLoader); - // egTopThreeText.position = new Vector(341, 114); - // egTopThreeText.extent = new Vector(209, 34); - // egTopThreeText.text.text = 'Top 5 Times:'; // Make toggleable 3-5 - // egTopThreeText.text.filter = new DropShadow(1.414, 0.785, 0, 1, 0, 0.4, 1, true); - // pg.addChild(egTopThreeText); - - // var text = '

'; - // // Check for ultimate time TODO - // if (mission.ultimateTime > 0 && timeState.gameplayClock < mission.ultimateTime) { - // text += 'You beat the Ultimate Time!'; - // } else { - // if (mission.goldTime > 0 && timeState.gameplayClock < mission.goldTime) { - // if (mission.game == "gold" || mission.game.toLowerCase() == "ultra") - // text += 'You beat the Gold Time!'; - // else - // text += 'You beat the Platinum Time!'; - // } else { - // if (mission.qualifyTime > timeState.gameplayClock) { - // text += "You beat the Par Time!"; - // } else { - // text += 'You didn\'t pass the Par Time!'; - // } - // } - // } - // text += '

'; - - // var finishMessage = new GuiMLText(expo32, mlFontLoader); - // finishMessage.text.textColor = 0x00ff00; - // finishMessage.text.text = text; - // finishMessage.text.filter = new DropShadow(1, 0.785, 0, 1, 0, 0.4, 1, true); - // // finishMessage.justify = Center; - // finishMessage.position = new Vector(25, 120); - // finishMessage.extent = new Vector(293, 211); - // pg.addChild(finishMessage); - - // var qualified = mission.qualifyTime > timeState.gameplayClock; - - // var scoreData:Array = Settings.getScores(mission.path); - // while (scoreData.length < 5) { - // scoreData.push({name: "Matan W.", time: 5999.999}); - // } - - // egFirstLine.text.text = '

1. ${scoreData[0].name}

'; - // egSecondLine.text.text = '

2. ${scoreData[1].name}

'; - // egThirdLine.text.text = '

3. ${scoreData[2].name}

'; - // egFourthLine.text.text = '

4. ${scoreData[3].name}

'; - // egFifthLine.text.text = '

5. ${scoreData[4].name}

'; - - // var lineelems = [ - // egFirstLineScore, - // egSecondLineScore, - // egThirdLineScore, - // egFourthLineScore, - // egFifthLineScore - // ]; - - // for (i in 0...5) { - // if (scoreData[i].time < mission.ultimateTime) { - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } else { - // if (scoreData[i].time < mission.goldTime) { - // if (mission.game == "gold" || mission.game.toLowerCase() == "ultra") - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // else - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } else { - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } - // } - // } - - // var leftColumn = new GuiMLText(domcasual24, mlFontLoader); - // leftColumn.text.lineSpacing = 5; - // leftColumn.text.textColor = 0xFFFFFF; - // leftColumn.text.text = 'Par Time:
${mission.game == "gold" || mission.game.toLowerCase() == "ultra" ? 'Gold Time:' : 'Platinum Time:'}
${mission.ultimateTime != 0 ? 'Ultimate Time:
' : ''}
Time Passed:
Clock Bonuses:
'; - // leftColumn.text.filter = new DropShadow(1.414, 0.785, 0x7777777F, 1, 0, 0.4, 1, true); - // leftColumn.position = new Vector(25, 165); - // leftColumn.extent = new Vector(293, 211); - // pg.addChild(leftColumn); - - // var elapsedTime = Math.max(timeState.currentAttemptTime - 3.5, 0); - // var bonusTime = Math.max(0, Std.int((elapsedTime - timeState.gameplayClock) * 1000) / 1000); - - // var rightColumn = new GuiMLText(domcasual24, mlFontLoader); - // rightColumn.text.lineSpacing = 5; - // rightColumn.text.textColor = 0xFFFFFF; - // rightColumn.text.text = '${Util.formatTime(mission.qualifyTime == Math.POSITIVE_INFINITY ? 5999.999 : mission.qualifyTime)}
${Util.formatTime(mission.goldTime)}
${mission.ultimateTime != 0 ? '${Util.formatTime(mission.ultimateTime)}
' : ''}
${Util.formatTime(elapsedTime)}
${Util.formatTime(bonusTime)}
'; - // rightColumn.text.filter = new DropShadow(1.414, 0.785, 0xffffff, 1, 0, 0.4, 1, true); - // rightColumn.position = new Vector(235, 165); - // rightColumn.extent = new Vector(293, 211); - // pg.addChild(rightColumn); - - // pg.addChild(continueButton); - // pg.addChild(restartButton); - // pg.addChild(nextLevel); - // pg.addChild(egFirstLine); - // pg.addChild(egSecondLine); - // pg.addChild(egThirdLine); - // pg.addChild(egFourthLine); - // pg.addChild(egFifthLine); - - // this.addChild(pg); - - // var scoreTimes = scoreData.map(x -> x.time).concat([timeState.gameplayClock]); - // scoreTimes.sort((a, b) -> a == b ? 0 : (a > b ? 1 : -1)); - - // var idx = scoreTimes.indexOf(timeState.gameplayClock); - - // // if (Settings.progression[mission.difficultyIndex] == mission.index && qualified) { - // // Settings.progression[mission.difficultyIndex]++; - // // } - // Settings.save(); - - // if (idx <= 4) { - // setButtonStates(false); - // var end = new EnterNameDlg(idx, (name) -> { - // setButtonStates(true); - // if (scoreSubmitted) - // return; - - // var myScore = {name: name, time: timeState.gameplayClock}; - // scoreData.push(myScore); - // scoreData.sort((a, b) -> a.time == b.time ? 0 : (a.time > b.time ? 1 : -1)); - - // egFirstLine.text.text = '

1. ${scoreData[0].name}

'; - // egSecondLine.text.text = '

2. ${scoreData[1].name}

'; - // egThirdLine.text.text = '

3. ${scoreData[2].name}

'; - // egFourthLine.text.text = '

4. ${scoreData[3].name}

'; - // egFifthLine.text.text = '

5. ${scoreData[4].name}

'; - - // for (i in 0...5) { - // if (scoreData[i].time < mission.ultimateTime) { - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } else { - // if (scoreData[i].time < mission.goldTime) { - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } else { - // lineelems[i].text.text = '${Util.formatTime(scoreData[i].time)}'; - // } - // } - // } - - // Settings.saveScore(mission.path, myScore); - - // scoreSubmitted = true; - // }); - // this.addChild(end); - // } + var nextButton = new GuiXboxButton("Next", 160); + nextButton.position = new Vector(320, 0); + nextButton.vertSizing = Bottom; + nextButton.horizSizing = Left; + nextButton.pressedAction = (e) -> continueFunc(nextButton); + bottomBar.addChild(nextButton); } } diff --git a/src/gui/GuiXboxButton.hx b/src/gui/GuiXboxButton.hx new file mode 100644 index 00000000..c99ef5b8 --- /dev/null +++ b/src/gui/GuiXboxButton.hx @@ -0,0 +1,154 @@ +package gui; + +import h3d.Matrix; +import hxd.Key; +import gui.GuiControl.MouseState; +import hxd.res.BitmapFont; +import h3d.Vector; +import src.ResourceLoader; +import src.Settings; +import src.Gamepad; +import src.AudioManager; + +class GuiXboxButton extends GuiControl { + var left:GuiAnim; + var fill:GuiAnim; + var right:GuiAnim; + var text:GuiText; + + public var pressedAction:GuiEvent->Void = null; + + public var disabled:Bool = false; + + public var pressed:Bool = false; + + public var buttonSounds:Bool = true; + + public var accelerator:Int = 0; + public var gamepadAccelerator:Array = []; + public var acceleratorWasPressed = false; + + public function new(text:String, width:Int) { + super(); + this.extent = new Vector(width, 94); + var buttonImage = ResourceLoader.getResource("data/ui/xbox/cursorButtonArray.png", ResourceLoader.getImage, this.imageResources).toTile(); + var buttonLeft = buttonImage.sub(0, 2, 39, 94); + var buttonFill = buttonImage.sub(52, 2, 396, 94); + var buttonRight = buttonImage.sub(452, 2, 41, 94); + var buttonLeftPressed = buttonImage.sub(0, 98, 39, 94); + var buttonFillPressed = buttonImage.sub(52, 98, 396, 94); + var buttonRightPressed = buttonImage.sub(452, 98, 41, 94); + + var cmat = Matrix.I(); + cmat.colorGain(0x7F7F7F, 1); + // cmat._44 = 1; + var shadeFilter = new h2d.filter.ColorMatrix(cmat); + shadeFilter.enable = false; + + var fillWidth = width - 39 - 41; + + left = new GuiAnim([buttonLeft, buttonLeftPressed]); + left.position = new Vector(0, 0); + left.extent = new Vector(39, 94); + left.anim.filter = shadeFilter; + this.addChild(left); + fill = new GuiAnim([buttonFill, buttonFillPressed]); + fill.position = new Vector(39, 0); + fill.extent = new Vector(fillWidth, 94); + fill.anim.filter = shadeFilter; + this.addChild(fill); + right = new GuiAnim([buttonRight, buttonRightPressed]); + right.position = new Vector(39 + fillWidth, 0); + right.extent = new Vector(41, 94); + right.anim.filter = shadeFilter; + this.addChild(right); + + var arial14fontdata = ResourceLoader.getFileEntry("data/font/Arial Bold.fnt"); + var arial14b = new BitmapFont(arial14fontdata.entry); + @:privateAccess arial14b.loader = ResourceLoader.loader; + var arial14 = arial14b.toSdfFont(cast 20 * Settings.uiScale, h2d.Font.SDFChannel.MultiChannel); + + this.text = new GuiText(arial14); + this.text.position = new Vector(39, 37); + this.text.extent = new Vector(fillWidth, 35); + this.text.justify = Center; + this.text.vertSizing = Top; + this.text.text.text = text; + this.text.text.textColor = 0x787878; + this.addChild(this.text); + } + + public override function update(dt:Float, mouseState:MouseState) { + var renderRect = getHitTestRect(); + if (renderRect.inRect(mouseState.position) && !disabled) { + if (buttonSounds && Key.isPressed(Key.MOUSE_LEFT)) { + AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonpress.wav", ResourceLoader.getAudio, this.soundResources)); + } + } + if (renderRect.inRect(mouseState.position) && !disabled) { + if (Key.isDown(Key.MOUSE_LEFT)) { + left.anim.currentFrame = 1; + fill.anim.currentFrame = 1; + right.anim.currentFrame = 1; + left.anim.filter.enable = true; + fill.anim.filter.enable = true; + right.anim.filter.enable = true; + text.text.textColor = 0x101010; + pressed = true; + } else { + left.anim.currentFrame = 1; + fill.anim.currentFrame = 1; + right.anim.currentFrame = 1; + left.anim.filter.enable = false; + fill.anim.filter.enable = false; + right.anim.filter.enable = false; + text.text.textColor = 0x101010; + pressed = false; + } + } else { + left.anim.currentFrame = 0; + fill.anim.currentFrame = 0; + right.anim.currentFrame = 0; + left.anim.filter.enable = false; + fill.anim.filter.enable = false; + right.anim.filter.enable = false; + this.text.text.textColor = 0x787878; + pressed = false; + } + if (!disabled) { + if (acceleratorWasPressed && (accelerator != 0 && hxd.Key.isReleased(accelerator)) || Gamepad.isReleased(gamepadAccelerator)) { + if (this.pressedAction != null) { + this.pressedAction(new GuiEvent(this)); + } + } else if ((accelerator != 0 && hxd.Key.isPressed(accelerator)) || Gamepad.isPressed(gamepadAccelerator)) { + acceleratorWasPressed = true; + } + } + if (acceleratorWasPressed) { + if ((accelerator != 0 && hxd.Key.isReleased(accelerator)) || Gamepad.isReleased(gamepadAccelerator)) + acceleratorWasPressed = false; + } + super.update(dt, mouseState); + } + + public override function onMouseRelease(mouseState:MouseState) { + if (mouseState.handled) + return; + mouseState.handled = true; + super.onMouseRelease(mouseState); + if (this.pressedAction != null && !disabled) { + this.pressedAction(new GuiEvent(this)); + } + } + + public override function onMouseEnter(mouseState:MouseState) { + if (mouseState.handled) + return; + mouseState.handled = true; + super.onMouseEnter(mouseState); + + if (buttonSounds && !disabled) { + AudioManager.playSound(ResourceLoader.getResource("data/sound/buttonover.wav", ResourceLoader.getAudio, this.soundResources)); + } + } +} diff --git a/src/mis/MissionElement.hx b/src/mis/MissionElement.hx index e49a6041..71401ca3 100644 --- a/src/mis/MissionElement.hx +++ b/src/mis/MissionElement.hx @@ -58,6 +58,7 @@ class MissionElementScriptObject extends MissionElementBase { var music:String; var alarmstarttime:String; var game:String; + var difficulty:String; public function new() { _type = MissionElementType.ScriptObject;