From c4bbe512df8bbb3a05c90beb010faad04e87a098 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sat, 28 Mar 2026 17:57:50 +0000 Subject: [PATCH] implement progress import-export --- data/ui/options/misc_d.png | Bin 0 -> 6591 bytes data/ui/options/misc_h.png | Bin 0 -> 6469 bytes data/ui/options/misc_i.png | Bin 0 -> 5699 bytes data/ui/options/misc_n.png | Bin 0 -> 6501 bytes src/gui/GuiScrollCtrl.hx | 84 ++++++++++++------------ src/gui/OptionsDlg.hx | 128 +++++++++++++++++++++++++++++++++++-- 6 files changed, 164 insertions(+), 48 deletions(-) create mode 100644 data/ui/options/misc_d.png create mode 100644 data/ui/options/misc_h.png create mode 100644 data/ui/options/misc_i.png create mode 100644 data/ui/options/misc_n.png diff --git a/data/ui/options/misc_d.png b/data/ui/options/misc_d.png new file mode 100644 index 0000000000000000000000000000000000000000..d1a6392e936a52b3c9509c459b94761d900625aa GIT binary patch literal 6591 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 literal 0 HcmV?d00001 diff --git a/data/ui/options/misc_i.png b/data/ui/options/misc_i.png new file mode 100644 index 0000000000000000000000000000000000000000..4eeea84fb14ccbc1d705001bbf1619eeea903015 GIT binary patch literal 5699 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 G$o~K*t1S=! literal 0 HcmV?d00001 diff --git a/data/ui/options/misc_n.png b/data/ui/options/misc_n.png new file mode 100644 index 0000000000000000000000000000000000000000..df5341ac77a08320c5e4a7b120dab4484179e11b GIT binary patch literal 6501 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 LNkvXXu0mjfB&CZ5 literal 0 HcmV?d00001 diff --git a/src/gui/GuiScrollCtrl.hx b/src/gui/GuiScrollCtrl.hx index 32fa399d..00b93aa1 100644 --- a/src/gui/GuiScrollCtrl.hx +++ b/src/gui/GuiScrollCtrl.hx @@ -246,59 +246,59 @@ class GuiScrollCtrl extends GuiControl { } public override function onMousePress(mouseState:MouseState) { - // if (Util.isTouchDevice()) { - this.pressed = true; - this.dirty = true; - this.updateScrollVisual(); - this.prevMousePos = mouseState.position; - this.scrollVelocity = 0; - this.momentumActive = false; - this.lastMoveStamp = Timer.stamp(); - // } + if (Util.isTouchDevice()) { + this.pressed = true; + this.dirty = true; + this.updateScrollVisual(); + this.prevMousePos = mouseState.position; + this.scrollVelocity = 0; + this.momentumActive = false; + this.lastMoveStamp = Timer.stamp(); + } } public override function onMouseRelease(mouseState:MouseState) { - // if (Util.isTouchDevice()) { - this.pressed = false; - this.dirty = true; - deltaY = 0; - this.updateScrollVisual(); - this.momentumActive = Math.abs(scrollVelocity) > 0.01; - this.lastMoveStamp = 0; - // } + if (Util.isTouchDevice()) { + this.pressed = false; + this.dirty = true; + deltaY = 0; + this.updateScrollVisual(); + this.momentumActive = Math.abs(scrollVelocity) > 0.01; + this.lastMoveStamp = 0; + } } public override function onMouseMove(mouseState:MouseState) { - // if (Util.isTouchDevice()) { - super.onMouseMove(mouseState); - if (this.pressed) { - var renderRect = this.getRenderRectangle(); - var scrollExtentY = renderRect.extent.y; - var dy = (mouseState.position.y - this.prevMousePos.y) / ((maxScrollY * Settings.uiScale) / scrollExtentY); - deltaY = -dy; - this.scrollY -= dy; - this.prevMousePos = mouseState.position; - var now = Timer.stamp(); - if (lastMoveStamp > 0) { - var dt = now - lastMoveStamp; - if (dt > 0) - scrollVelocity = -dy / dt; + if (Util.isTouchDevice()) { + super.onMouseMove(mouseState); + if (this.pressed) { + var renderRect = this.getRenderRectangle(); + var scrollExtentY = renderRect.extent.y; + var dy = (mouseState.position.y - this.prevMousePos.y) / ((maxScrollY * Settings.uiScale) / scrollExtentY); + deltaY = -dy; + this.scrollY -= dy; + this.prevMousePos = mouseState.position; + var now = Timer.stamp(); + if (lastMoveStamp > 0) { + var dt = now - lastMoveStamp; + if (dt > 0) + scrollVelocity = -dy / dt; + } + lastMoveStamp = now; + momentumActive = false; + this.updateScrollVisual(); } - lastMoveStamp = now; - momentumActive = false; - this.updateScrollVisual(); } - // } } public override function onMouseLeave(mouseState:MouseState) { - // if (Util.isTouchDevice()) { - this.pressed = false; - this.dirty = true; - this.updateScrollVisual(); - this.momentumActive = Math.abs(scrollVelocity) > 0.01; - this.lastMoveStamp = 0; - // } + if (Util.isTouchDevice()) { + this.pressed = false; + this.dirty = true; + this.updateScrollVisual(); + this.momentumActive = Math.abs(scrollVelocity) > 0.01; + this.lastMoveStamp = 0; + } } public override function update(dt:Float, mouseState:MouseState) { diff --git a/src/gui/OptionsDlg.hx b/src/gui/OptionsDlg.hx index 26153071..eb4bc39d 100644 --- a/src/gui/OptionsDlg.hx +++ b/src/gui/OptionsDlg.hx @@ -1,5 +1,6 @@ package gui; +import haxe.DynamicAccess; import hxd.BitmapData; import h2d.filter.DropShadow; import h2d.Text; @@ -70,10 +71,10 @@ class OptionsDlg extends GuiImage { hotkeysBtn.extent = new Vector(134, 65); window.addChild(hotkeysBtn); - var onlineBtn = new GuiImage(ResourceLoader.getResource("data/ui/options/online_i.png", ResourceLoader.getImage, this.imageResources).toTile()); - onlineBtn.position = new Vector(548, 19); - onlineBtn.extent = new Vector(134, 65); - window.addChild(onlineBtn); + var miscBtn = new GuiButton(loadButtonImages('data/ui/options/misc')); + miscBtn.position = new Vector(548, 19); + miscBtn.extent = new Vector(134, 65); + window.addChild(miscBtn); var generalPanel:GuiScrollCtrl = null; @@ -114,6 +115,10 @@ class OptionsDlg extends GuiImage { hotkeysPanel.position = new Vector(30, 88); hotkeysPanel.extent = new Vector(726, 394); + var miscPanel = new GuiControl(); + miscPanel.position = new Vector(30, 88); + miscPanel.extent = new Vector(726, 394); + var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt"); var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry); @:privateAccess markerFelt32b.loader = ResourceLoader.loader; @@ -470,6 +475,31 @@ class OptionsDlg extends GuiImage { parent.addChild(remapBtn); } + function makeButton(text:String, yPos:Int, buttonText:String, pressedAction:() -> Void, parent:GuiControl, right:Bool = false) { + var textObj = new GuiText(markerFelt32); + textObj.position = new Vector(right ? 368 : 5, yPos); + textObj.extent = new Vector(212, 14); + textObj.text.text = text; + textObj.text.textColor = 0xFFFFFF; + textObj.text.dropShadow = { + dx: 1 * Settings.uiScale, + dy: 1 * Settings.uiScale, + alpha: 0.5, + color: 0 + }; + parent.addChild(textObj); + + var btn = new GuiButtonText(loadButtonImages("data/ui/options/bind"), markerFelt24); + btn.position = new Vector(right ? 363 + 203 : 203, yPos - 3); + btn.txtCtrl.text.text = buttonText; + btn.setExtent(new Vector(152, 49)); + btn.pressedAction = (sender) -> { + pressedAction(); + } + + parent.addChild(btn); + } + if (Util.isTouchDevice()) { var textObj = new GuiText(markerFelt32); textObj.position = new Vector(5, 38); @@ -540,10 +570,85 @@ class OptionsDlg extends GuiImage { hotkeysPanel, true); } + // MISC PANEL + makeButton("Import Progress:", 38, "Import", () -> { + hxd.File.browse((sel) -> { + sel.load((data) -> { + try { + // convert to string + var jsonStr = data.toString(); + // parse JSON + var json = haxe.Json.parse(jsonStr); + + var highScoreData:DynamicAccess> = json.highScores; + for (key => value in highScoreData) { + Settings.highScores.set(key, value); + } + var easterEggData:DynamicAccess = json.easterEggs; + if (easterEggData != null) { + for (key => value in easterEggData) { + Settings.easterEggs.set(key, value); + } + } + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Progress data imported successfully!")); + Settings.save(); + } catch (e) { + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("Failed to import progress data: " + e.message)); + } + }); + }, { + title: "Select a progress file to import", + fileTypes: [ + {name: "JSON files", extensions: ["json"]}, + {name: "All files", extensions: ["*"]} + ], + }); + }, miscPanel); + makeButton("Export Progress:", 38, "Export", () -> { + #if sys + #if MACOS_BUNDLE + // open the finder to that folder + Sys.command('open "${Settings.settingsDir}"'); + #else + // Just open the folder in the explorer.exe + Sys.command('explorer.exe "${Settings.settingsDir}"'); + #end + MarbleGame.canvas.pushDialog(new MessageBoxOkDlg("The settings.json file contains your progress data. You can copy it to another device or share it with others.")); + #end + #if js + // Serialize Settings to JSON + var localStorage = js.Browser.getLocalStorage(); + if (localStorage != null) { + var settingsData = localStorage.getItem("MBHaxeSettings"); + if (settingsData != null) { + // Download this + var replayBytes = settingsData; + var blob = new js.html.Blob([haxe.io.Bytes.ofString(replayBytes).getData()], { + type: 'application/octet-stream' + }); + var url = js.html.URL.createObjectURL(blob); + var fname = 'settings.json'; + var element = js.Browser.document.createElement('a'); + element.setAttribute('href', url); + element.setAttribute('download', fname); + + element.style.display = 'none'; + js.Browser.document.body.appendChild(element); + + element.click(); + + js.Browser.document.body.removeChild(element); + js.html.URL.revokeObjectURL(url); + } + } + #end + }, miscPanel, true); + generalBtn.pressedAction = (e) -> { if (currentTab != "general") { currentTab = "general"; - hotkeysPanel.parent.removeChild(hotkeysPanel); + hotkeysPanel.parent?.removeChild(hotkeysPanel); + miscPanel.parent?.removeChild(miscPanel); generalPanel.scrollY = 0; window.addChild(generalPanel); MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh @@ -553,12 +658,23 @@ class OptionsDlg extends GuiImage { hotkeysBtn.pressedAction = (e) -> { if (currentTab != "hotkeys") { currentTab = "hotkeys"; - generalPanel.parent.removeChild(generalPanel); + generalPanel.parent?.removeChild(generalPanel); + miscPanel.parent?.removeChild(miscPanel); window.addChild(hotkeysPanel); MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh } }; + miscBtn.pressedAction = (e) -> { + if (currentTab != "misc") { + currentTab = "misc"; + generalPanel.parent?.removeChild(generalPanel); + hotkeysPanel.parent?.removeChild(hotkeysPanel); + window.addChild(miscPanel); + MarbleGame.canvas.render(MarbleGame.canvas.scene2d); // Force refresh + } + }; + // // Touch Controls buttons??? // if (Util.isTouchDevice()) { // var touchControlsTxt = new GuiText(domcasual24);