From eb08a1e18a8ec4b218db247a9224cf303f818f9e Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 26 Dec 2022 19:18:50 +0530 Subject: [PATCH] console start --- data/font/Lucida Console.fnt | 108 +++++++++++++ data/font/LucidaConsole.png | Bin 0 -> 88237 bytes src/AudioManager.hx | 2 + src/Console.hx | 88 ++++++++++ src/Main.hx | 9 ++ src/MarbleGame.hx | 22 +++ src/MarbleWorld.hx | 18 +++ src/Mission.hx | 4 + src/Resource.hx | 3 + src/ResourceLoader.hx | 10 ++ src/Settings.hx | 6 + src/gui/Canvas.hx | 2 + src/gui/ConsoleDlg.hx | 108 +++++++++++++ src/gui/GuiConsoleScrollCtrl.hx | 273 ++++++++++++++++++++++++++++++++ src/mis/MisParser.hx | 3 +- 15 files changed, 655 insertions(+), 1 deletion(-) create mode 100644 data/font/Lucida Console.fnt create mode 100644 data/font/LucidaConsole.png create mode 100644 src/Console.hx create mode 100644 src/gui/ConsoleDlg.hx create mode 100644 src/gui/GuiConsoleScrollCtrl.hx diff --git a/data/font/Lucida Console.fnt b/data/font/Lucida Console.fnt new file mode 100644 index 00000000..a3836141 --- /dev/null +++ b/data/font/Lucida Console.fnt @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/data/font/LucidaConsole.png b/data/font/LucidaConsole.png new file mode 100644 index 0000000000000000000000000000000000000000..3e188bcea3a3c7232cff531ead517ff7e865fbd4 GIT binary patch literal 88237 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%0AIzkWRlo2kDmr(iz+GfIYZ-UT2p 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�R&M;v*z2r9jB>5(aWGl5W6tisai=*MO1$ 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 PV981;N#;Cw;`9Fiq99{p literal 0 HcmV?d00001 diff --git a/src/AudioManager.hx b/src/AudioManager.hx index 108bb753..9fc59ea8 100644 --- a/src/AudioManager.hx +++ b/src/AudioManager.hx @@ -10,6 +10,7 @@ import src.Settings; import hxd.snd.ChannelGroup; import src.Resource; import src.ResourceLoaderWorker; +import src.Console; class AudioManager { static var manager:hxd.snd.Manager; @@ -23,6 +24,7 @@ class AudioManager { static var currentMusicResource:Resource; public static function init() { + Console.log("Initializing Audio System"); AudioManager.manager = hxd.snd.Manager.get(); AudioManager.soundGroup = new SoundGroup("sound"); soundGroup.volume = Settings.optionsSettings.soundVolume; diff --git a/src/Console.hx b/src/Console.hx new file mode 100644 index 00000000..186f5186 --- /dev/null +++ b/src/Console.hx @@ -0,0 +1,88 @@ +package src; + +@:publicFields +class ConsoleEntry { + var time:Float; + var type:String; + var text:String; + + public function new(time:Float, type:String, text:String) { + this.time = time; + this.type = type; + this.text = text; + } +} + +class Console { + public static var instance:Console; + + public var entries:Array; + + var consumers:ArrayVoid>; + var timeSinceStart:Float; + + public function new() { + if (instance == null) { + instance = this; + } + entries = []; + consumers = []; + timeSinceStart = haxe.Timer.stamp(); + } + + public function clear() { + entries = []; + } + + function getTime() { + return Std.int((haxe.Timer.stamp() - timeSinceStart) * 1000) / 1000; + } + + function addEntry(type:String, msg:String) { + var e = new ConsoleEntry(getTime(), type, msg); + entries.push(e); + for (c in consumers) { + c(e); + } + } + + function _log(t:String) { + addEntry("log", t); + } + + function _warn(t:String) { + addEntry("warn", t); + } + + function _error(t:String) { + addEntry("error", t); + } + + function _debug(t:String) { + addEntry("debug", t); + } + + public static function log(t:String) { + instance._log(t); + } + + public static function warn(t:String) { + instance._warn(t); + } + + public static function error(t:String) { + instance._error(t); + } + + public static function debug(t:String) { + instance._debug(t); + } + + public static function addConsumer(c:ConsoleEntry->Void) { + instance.consumers.push(c); + } + + public static function removeConsumer(c:ConsoleEntry->Void) { + instance.consumers.remove(c); + } +} diff --git a/src/Main.hx b/src/Main.hx index 88303fa9..1034247c 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -1,5 +1,6 @@ package; +import src.Console; import hxd.Key; import src.Util; import src.ResourceLoader; @@ -23,6 +24,8 @@ class Main extends hxd.App { var loaded:Bool = false; + var frameByFrame:Bool = false; + override function init() { super.init(); @@ -56,6 +59,12 @@ class Main extends hxd.App { }); #end + new Console(); // Singleton + Console.log("Initializing MBHaxe"); + #if hl + Console.log("System: " + Sys.systemName()); + #end + Settings.init(); ResourceLoader.init(s2d, () -> { AudioManager.init(); diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index f7b028b3..01297ca3 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -1,5 +1,6 @@ package src; +import gui.ConsoleDlg; import src.Replay; import touch.TouchInput; import src.ResourceLoader; @@ -17,6 +18,7 @@ import gui.Canvas; import src.Util; import src.ProfilerUI; import src.Settings; +import src.Console; @:publicFields class MarbleGame { @@ -36,7 +38,11 @@ class MarbleGame { var touchInput:TouchInput; + var consoleShown:Bool = false; + var console:ConsoleDlg; + public function new(scene2d:h2d.Scene, scene:h3d.scene.Scene) { + Console.log("Initializing the game..."); canvas = new Canvas(scene2d, cast this); this.scene = scene; this.scene2d = scene2d; @@ -183,6 +189,19 @@ class MarbleGame { } } if (canvas != null) { + if (Key.isPressed(Key.QWERTY_TILDE)) { + consoleShown = !consoleShown; + if (consoleShown) { + if (console == null) + console = new ConsoleDlg(); + @:privateAccess console.isShowing = true; + canvas.pushDialog(console); + } else { + @:privateAccess console.isShowing = false; + canvas.popDialog(console, false); + } + } + var mouseState:MouseState = { position: new Vector(canvas.scene2d.mouseX, canvas.scene2d.mouseY) } @@ -193,6 +212,7 @@ class MarbleGame { public function handlePauseGame() { if (paused && world._ready) { + Console.log("Game paused"); world.setCursorLock(false); exitGameDlg = new ExitGameDlg((sender) -> { canvas.popDialog(exitGameDlg); @@ -210,6 +230,7 @@ class MarbleGame { canvas.pushDialog(exitGameDlg); } else { if (world._ready) { + Console.log("Game unpaused"); if (exitGameDlg != null) canvas.popDialog(exitGameDlg); world.setCursorLock(true); @@ -218,6 +239,7 @@ class MarbleGame { } public function quitMission() { + Console.log("Quitting mission"); world.setCursorLock(false); paused = false; var pmg = new PlayMissionGui(); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 6d6cb97b..8859c8b0 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -87,6 +87,7 @@ import src.Resource; import src.ProfilerUI; import src.ResourceLoaderWorker; import haxe.io.Path; +import src.Console; class MarbleWorld extends Scheduler { public var collisionWorld:CollisionWorld; @@ -197,6 +198,7 @@ class MarbleWorld extends Scheduler { } public function initLoading() { + Console.log("*** LOADING MISSION: " + mission.path); this.loadingGui = new LoadingGui(this.mission.title, this.mission.game); MarbleGame.canvas.setContent(this.loadingGui); @@ -260,6 +262,7 @@ class MarbleWorld extends Scheduler { } public function initScene(onFinish:Void->Void) { + Console.log("Starting scene"); this.collisionWorld = new CollisionWorld(); this.playGui = new PlayGui(); this.instanceManager = new InstanceManager(scene); @@ -330,6 +333,7 @@ class MarbleWorld extends Scheduler { } public function initMarble(onFinish:Void->Void) { + Console.log("Initializing marble"); var worker = new ResourceLoaderWorker(onFinish); var marblefiles = [ "particles/star.png", @@ -390,6 +394,7 @@ class MarbleWorld extends Scheduler { } public function start() { + Console.log("LEVEL START"); restart(true); for (interior in this.interiors) interior.onLevelStart(); @@ -502,20 +507,25 @@ class MarbleWorld extends Scheduler { AudioManager.playSound(ResourceLoader.getResource('data/sound/spawn.wav', ResourceLoader.getAudio, this.soundResources)); + Console.log("State Start"); this.clearSchedule(); this.schedule(0.5, () -> { // setCenterText('ready'); + Console.log("State Ready"); AudioManager.playSound(ResourceLoader.getResource('data/sound/ready.wav', ResourceLoader.getAudio, this.soundResources)); return 0; }); this.schedule(2, () -> { // setCenterText('set'); + Console.log("State Set"); AudioManager.playSound(ResourceLoader.getResource('data/sound/set.wav', ResourceLoader.getAudio, this.soundResources)); return 0; }); this.schedule(3.5, () -> { // setCenterText('go'); + Console.log("State Go"); AudioManager.playSound(ResourceLoader.getResource('data/sound/go.wav', ResourceLoader.getAudio, this.soundResources)); + Console.log("State Play"); return 0; }); @@ -570,6 +580,7 @@ class MarbleWorld extends Scheduler { this.addPathedInterior(pathedInterior, () -> { if (pathedInterior == null) { fwd(); + Console.error("Unable to load pathed interior"); return; } @@ -736,6 +747,7 @@ class MarbleWorld extends Scheduler { else if (["clear", "cloudy", "dusk", "wintry"].contains(dataBlockLowerCase)) shape = new shapes.Sky(dataBlockLowerCase); else { + Console.error("Unable to create static shape with data block '" + element.datablock + "'"); onFinish(); return; } @@ -849,6 +861,7 @@ class MarbleWorld extends Scheduler { else if (["clear", "cloudy", "dusk", "wintry"].contains(dataBlockLowerCase)) shape = new shapes.Sky(dataBlockLowerCase); else { + Console.error("Unknown item: " + element.datablock); onFinish(); return; } @@ -920,12 +933,14 @@ class MarbleWorld extends Scheduler { var shapeName = element.shapename; var index = shapeName.indexOf('data/'); if (index == -1) { + Console.error("Unable to parse shape path: " + shapeName); onFinish(); return; } var dtsPath = 'data/' + shapeName.substring(index + 'data/'.length); if (ResourceLoader.getProperFilepath(dtsPath) == "") { + Console.error("DTS path does not exist: " + dtsPath); onFinish(); return; } @@ -969,6 +984,7 @@ class MarbleWorld extends Scheduler { } public function addParticleEmitterNode(element:MissionElementParticleEmitterNode) { + Console.warn("Unimplemented method addParticleEmitterNode"); // TODO THIS SHIT } @@ -1265,6 +1281,7 @@ class MarbleWorld extends Scheduler { return; if (!_ready && !postInited) { postInited = true; + Console.log("Finished loading, starting mission"); postInit(); } } @@ -1623,6 +1640,7 @@ class MarbleWorld extends Scheduler { } function showFinishScreen() { + Console.log("State End"); var egg:EndGameGui = null; #if js var pointercontainer = js.Browser.document.querySelector("#pointercontainer"); diff --git a/src/Mission.hx b/src/Mission.hx index e1003ccf..86ff1361 100644 --- a/src/Mission.hx +++ b/src/Mission.hx @@ -14,6 +14,7 @@ import src.ResourceLoader; import hxd.res.Image; import src.Resource; import src.Util; +import src.Console; class Mission { public var root:MissionElementSimGroup; @@ -146,11 +147,13 @@ class Mission { }); return imgFileEntry.path; } + Console.error("Preview image not found for " + this.path); var img = new BitmapData(1, 1); img.setPixel(0, 0, 0); onLoaded(Tile.fromBitmap(img)); return null; } else { + Console.error("Preview image not found for " + this.path); var img = new BitmapData(1, 1); img.setPixel(0, 0, 0); onLoaded(Tile.fromBitmap(img)); @@ -181,6 +184,7 @@ class Mission { return path; if (ResourceLoader.fileSystem.exists(dirpath + fname)) return dirpath + fname; + Console.error("Interior resource not found: " + rawElementPath); return ""; } diff --git a/src/Resource.hx b/src/Resource.hx index aa191680..14292ee6 100644 --- a/src/Resource.hx +++ b/src/Resource.hx @@ -1,5 +1,7 @@ package src; +import src.Console; + class Resource { public var resource:T; public var identifier:String; @@ -23,6 +25,7 @@ class Resource { public function release() { this.referenceCount--; if (this.referenceCount == 0) { + Console.log("Freeing: " + identifier); disposeFunc(this.resource); this.resourceMap.remove(this.identifier); // trace('Releasing Resource ${this.identifier}'); diff --git a/src/ResourceLoader.hx b/src/ResourceLoader.hx index 471296b1..13688eb1 100644 --- a/src/ResourceLoader.hx +++ b/src/ResourceLoader.hx @@ -19,6 +19,7 @@ import src.Resource; import src.ResourceLoaderWorker; import fs.TorqueFileSystem; import src.Settings; +import src.Console; class ResourceLoader { #if (hl && !android) @@ -46,6 +47,10 @@ class ResourceLoader { // static var threadPool:FixedThreadPool = new FixedThreadPool(4); public static function init(scene2d:h2d.Scene, onLoadedFunc:Void->Void) { + Console.log("Initializing filesystem"); + #if hl + Console.log("Filesystem Path: " + @:privateAccess cast(fileSystem, TorqueFileSystem).baseDir); + #end hxd.res.Resource.LIVE_UPDATE = false; // Disable live update to save frames @:privateAccess hxd.res.Image.ENABLE_AUTO_WATCH = false; @:privateAccess hxd.res.Sound.ENABLE_AUTO_WATCH = false; @@ -275,6 +280,7 @@ class ResourceLoader { if (interiorResources.exists(path)) return interiorResources.get(path); else { + Console.log("Load Interior: " + path); var itr:Dif; // var lock = new Lock(); // threadPool.run(() -> { @@ -293,6 +299,7 @@ class ResourceLoader { if (dtsResources.exists(path)) return dtsResources.get(path); else { + Console.log("Load DTS: " + path); var dts = new DtsFile(); // var lock = new Lock(); // threadPool.run(() -> { @@ -311,6 +318,7 @@ class ResourceLoader { if (textureCache.exists(path)) return textureCache.get(path); if (fileSystem.exists(path)) { + Console.log("Load Texture: " + path); var img = loader.load(path).toImage(); Image.setupTextureFlags = (texObj) -> { texObj.flags.set(MipMapped); @@ -333,6 +341,7 @@ class ResourceLoader { if (imageCache.exists(path)) return imageCache.get(path); if (fileSystem.exists(path)) { + Console.log("Load Image: " + path); var tex = loader.load(path).toImage(); var imageresource = new Resource(tex, path, imageCache, img -> {}); imageCache.set(path, imageresource); @@ -348,6 +357,7 @@ class ResourceLoader { if (audioCache.exists(path)) return audioCache.get(path); if (fileSystem.exists(path)) { + Console.log("Load Audio: " + path); var snd = loader.load(path).toSound(); // @:privateAccess snd.watchCallb(); var audioresource = new Resource(snd, path, audioCache, snd -> snd.dispose()); diff --git a/src/Settings.hx b/src/Settings.hx index c4187a6f..9454a892 100644 --- a/src/Settings.hx +++ b/src/Settings.hx @@ -16,6 +16,7 @@ import haxe.io.Path; import src.ResourceLoader; import haxe.Json; import src.Util; +import src.Console; typedef Score = { var name:String; @@ -268,6 +269,7 @@ class Settings { } public static function load() { + Console.log("Loading settings"); var settingsExists = false; #if hl settingsExists = FileSystem.exists(Path.join([settingsDir, "settings.json"])); @@ -334,6 +336,7 @@ class Settings { #end highscoreName = json.highscoreName; } else { + Console.warn("Settings file does not exist"); save(); } #if hl @@ -376,6 +379,9 @@ class Settings { canvasElement.style.height = "100%"; #end + Console.log("Window resized to " + Settings.optionsSettings.screenWidth + "x" + Settings.optionsSettings.screenHeight + " (Zoom " + zoomRatio + + ")"); + MarbleGame.canvas.scene2d.scaleMode = Zoom(zoomRatio); MarbleGame.canvas.render(MarbleGame.canvas.scene2d); diff --git a/src/gui/Canvas.hx b/src/gui/Canvas.hx index f9be47b6..9414e126 100644 --- a/src/gui/Canvas.hx +++ b/src/gui/Canvas.hx @@ -1,5 +1,6 @@ package gui; +import src.Console; import src.MarbleGame; import h3d.Vector; import h2d.Scene; @@ -12,6 +13,7 @@ class Canvas extends GuiControl { public function new(scene, marbleGame:MarbleGame) { super(); + Console.log("Creating canvas"); this.scene2d = scene; this.marbleGame = marbleGame; diff --git a/src/gui/ConsoleDlg.hx b/src/gui/ConsoleDlg.hx new file mode 100644 index 00000000..94ec1e68 --- /dev/null +++ b/src/gui/ConsoleDlg.hx @@ -0,0 +1,108 @@ +package gui; + +import src.Console.ConsoleEntry; +import h2d.Graphics; +import h2d.Tile; +import h3d.mat.Texture; +import hxd.res.BitmapFont; +import src.ResourceLoader; +import h3d.Vector; +import src.Settings; +import src.Console; + +class ConsoleDlg extends GuiControl { + var onConsoleEntry:(e:ConsoleEntry) -> Void; + var isShowing = false; + + public function new() { + super(); + this.position = new Vector(0, 0); + this.extent = new Vector(640, 370); + + var white = Tile.fromColor(0xFFFFFF); + var black = Tile.fromColor(0x000000); + var consoleWhite = new GuiImage(white); + consoleWhite.position = new Vector(0, 0); + consoleWhite.extent = new Vector(640, 350); + consoleWhite.horizSizing = Width; + consoleWhite.vertSizing = Top; + this.addChild(consoleWhite); + + var scroll = new GuiConsoleScrollCtrl(ResourceLoader.getResource("data/ui/common/darkscroll.png", ResourceLoader.getImage, this.imageResources) + .toTile()); + scroll.position = new Vector(0, 0); + scroll.extent = new Vector(640, 350); + scroll.horizSizing = Width; + scroll.vertSizing = Height; + + consoleWhite.addChild(scroll); + + var consolefontdata = ResourceLoader.getFileEntry("data/font/Lucida Console.fnt"); + var consoleb = new BitmapFont(consolefontdata.entry); + @:privateAccess consoleb.loader = ResourceLoader.loader; + var consoleb = consoleb.toSdfFont(cast 11.7 * Settings.uiScale, MultiChannel); + + function mlFontLoader(text:String) { + return null; + } + + var consoleContent = new GuiMLText(consoleb, mlFontLoader); + consoleContent.position = new Vector(0, 0); + consoleContent.extent = new Vector(640, 350); + consoleContent.horizSizing = Width; + consoleContent.vertSizing = Top; + consoleContent.text.textColor = 0; + consoleContent.scrollable = true; + scroll.addChild(consoleContent); + + consoleContent.text.text = ""; + + // Generate console text + for (entry in Console.instance.entries) { + var txt = '[${entry.time}] ${StringTools.htmlEscape(entry.text)}
'; + consoleContent.text.text += txt; + } + + scroll.setScrollMax(consoleContent.text.textHeight); + scroll.updateScrollVisual(); + + var arial14fontdata = ResourceLoader.getFileEntry("data/font/arial.fnt"); + var arial14b = new BitmapFont(arial14fontdata.entry); + @:privateAccess arial14b.loader = ResourceLoader.loader; + var arial14 = arial14b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel); + + var bord = new GuiImage(black); + bord.position = new Vector(0, 350); + bord.extent = new Vector(640, 18); + bord.horizSizing = Width; + consoleContent.addChild(bord); + + var consoleInput = new GuiTextInput(arial14); + consoleInput.position = new Vector(1, 351); + consoleInput.extent = new Vector(638, 20); + consoleInput.horizSizing = Width; + consoleInput.vertSizing = Top; + consoleInput.text.textColor = 0; + consoleInput.text.backgroundColor = 0xFFFFFFFF; + consoleInput.text.selectionColor.set(1, 1, 1); + consoleInput.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(consoleInput.text.font.lineHeight)); + + consoleContent.addChild(consoleInput); + + onConsoleEntry = (e) -> { + var txt = '[${e.time}] ${StringTools.htmlEscape(e.text)}
'; + consoleContent.text.text += txt; + if (isShowing) { + scroll.setScrollMax(consoleContent.text.textHeight); + haxe.Timer.delay(() -> scroll.setScrollPercentage(1), 1); + } + }; + + Console.addConsumer(onConsoleEntry); + } + + override function dispose() { + super.dispose(); + Console.removeConsumer(onConsoleEntry); + } +} diff --git a/src/gui/GuiConsoleScrollCtrl.hx b/src/gui/GuiConsoleScrollCtrl.hx new file mode 100644 index 00000000..14653fae --- /dev/null +++ b/src/gui/GuiConsoleScrollCtrl.hx @@ -0,0 +1,273 @@ +package gui; + +import h2d.Bitmap; +import h3d.Vector; +import src.Settings; +import gui.GuiControl.MouseState; +import h2d.Interactive; +import h2d.Scene; +import h2d.Tile; +import h2d.Graphics; +import src.MarbleGame; +import src.Util; + +class GuiConsoleScrollCtrl extends GuiControl { + public var scrollY:Float = 0; + + var maxScrollY:Float; + + var scrollBarY:Graphics; + var scrollTrack:Bitmap; + + var scrollTopTile:Tile; + var scrollBottomTile:Tile; + var scrollFillTile:Tile; + + var scrollTopPressedTile:Tile; + var scrollBottomPressedTile:Tile; + var scrollFillPressedTile:Tile; + + var scrollTrackTile:Tile; + + var clickInteractive:Interactive; + + var pressed:Bool = false; + var dirty:Bool = true; + var prevMousePos:Vector; + + var scrollUpButton:GuiButton; + var scrollDownButton:GuiButton; + + public function new(scrollBar:Tile) { + super(); + this.scrollTopTile = scrollBar.sub(0, 37, 18, 8); + this.scrollBottomTile = scrollBar.sub(0, 55, 18, 8); + this.scrollFillTile = scrollBar.sub(0, 46, 18, 1); + this.scrollTopPressedTile = scrollBar.sub(19, 37, 18, 8); + this.scrollBottomPressedTile = scrollBar.sub(19, 46, 18, 8); + this.scrollFillPressedTile = scrollBar.sub(19, 55, 18, 1); + this.scrollTrackTile = scrollBar.sub(0, 64, 18, 1); + var scrollUpTile = scrollBar.sub(0, 1, 18, 17); + var scrollDownTile = scrollBar.sub(0, 19, 18, 17); + var scrollUpPressedTile = scrollBar.sub(19, 1, 18, 17); + var scrollDownPressedTile = scrollBar.sub(19, 19, 18, 17); + var scrollUpDisabledTile = scrollBar.sub(38, 1, 18, 17); + var scrollDownDisabledTile = scrollBar.sub(38, 19, 18, 17); + + scrollUpButton = new GuiButton([scrollUpTile, scrollUpTile, scrollUpPressedTile, scrollUpDisabledTile]); + scrollUpButton.position = new Vector(0, 0); + scrollUpButton.extent = new Vector(18, 17); + scrollUpButton.horizSizing = Right; + scrollUpButton.pressedAction = (e) -> { + this.scrollY -= 10; + this.updateScrollVisual(); + } + this.addChild(scrollUpButton); + + scrollDownButton = new GuiButton([scrollDownTile, scrollDownTile, scrollDownPressedTile, scrollDownDisabledTile]); + scrollDownButton.position = new Vector(0, 0); + scrollDownButton.extent = new Vector(18, 17); + scrollDownButton.horizSizing = Right; + scrollDownButton.pressedAction = (e) -> { + this.scrollY += 10; + this.updateScrollVisual(); + } + this.addChild(scrollDownButton); + + this.scrollBarY = new Graphics(); + this.scrollBarY.scale(Settings.uiScale); + this.clickInteractive = new Interactive(10 * Settings.uiScale, 1); + this.clickInteractive.onPush = (e) -> { + if (!this.pressed) { + this.pressed = true; + this.dirty = true; + this.updateScrollVisual(); + + var prevEY:Null = null; + + this.clickInteractive.startCapture(e2 -> { + if (e2.kind == ERelease) { + this.clickInteractive.stopCapture(); + } + if (e2.kind == EMove) { + if (prevEY == null) { + prevEY = e2.relY; + } else { + this.scrollY += (e2.relY - prevEY); + prevEY = e2.relY; + this.updateScrollVisual(); + } + } + }, () -> { + if (this.pressed) { + this.pressed = false; + this.dirty = true; + this.updateScrollVisual(); + } + }); + } + }; + this.scrollTrack = new Bitmap(scrollTrackTile); + } + + public function setScrollMax(max:Float) { + this.scrollY = 0; + this.maxScrollY = max; + this.dirty = true; + this.updateScrollVisual(); + } + + public override function getRenderRectangle():Rect { + var rrec = super.getRenderRectangle(); + rrec.scroll.y = scrollY * this.maxScrollY / (rrec.extent.y - 34 * Settings.uiScale); + return rrec; + } + + public override function render(scene2d:Scene) { + this.dirty = true; + + scrollUpButton.position = new Vector(this.extent.x - 18, 0); + scrollDownButton.position = new Vector(this.extent.x - 18, this.extent.y - 17); + + if (scene2d.contains(scrollTrack)) + scene2d.removeChild(scrollTrack); + + if (scene2d.contains(scrollBarY)) + scene2d.removeChild(scrollBarY); + + if (scene2d.contains(clickInteractive)) + scene2d.removeChild(clickInteractive); + + scene2d.addChild(scrollTrack); + scene2d.addChild(scrollBarY); + scene2d.addChild(clickInteractive); + + updateScrollVisual(); + + super.render(scene2d); + } + + public function updateScrollVisual() { + var renderRect = this.getRenderRectangle(); + + if (maxScrollY < renderRect.extent.y) { + scrollBarY.clear(); + return; + } + + this.scrollTrack.setPosition(renderRect.position.x + renderRect.extent.x - 18 * Settings.uiScale, renderRect.position.y); + + var scrollExtentY = renderRect.extent.y - 34 * Settings.uiScale; + + var scrollBarYSize = (scrollExtentY * scrollExtentY / (maxScrollY * Settings.uiScale - 34 * Settings.uiScale)); + + this.scrollTrack.scaleY = renderRect.extent.y; + + this.scrollY = Util.clamp(scrollY, 0, scrollExtentY - scrollBarYSize * Settings.uiScale); + + this.scrollBarY.setPosition(renderRect.position.x + + renderRect.extent.x + - 18 * Settings.uiScale, + 18 * Settings.uiScale + + renderRect.position.y + + scrollY); + + this.clickInteractive.setPosition(renderRect.position.x + renderRect.extent.x - 18 * Settings.uiScale, 18 * Settings.uiScale + renderRect.position.y); + + this.clickInteractive.height = scrollExtentY; + + if (this.dirty) { + if (scrollBarYSize > scrollExtentY) { + scrollBarYSize = scrollExtentY; + scrollBarY.clear(); + return; + } + + scrollBarY.clear(); + + scrollBarY.tileWrap = true; + + scrollBarY.drawTile(0, 0, pressed ? scrollTopPressedTile : scrollTopTile); + + // :skull: + for (i in 0...cast(scrollBarYSize - 12)) { + scrollBarY.drawTile(0, i + 8, pressed ? scrollFillPressedTile : scrollFillTile); + } + + scrollBarY.drawTile(0, scrollBarYSize - 8, pressed ? scrollBottomPressedTile : scrollBottomTile); + + this.dirty = false; + } + + for (c in this.children) { + c.onScroll(0, scrollY * (this.maxScrollY - 34 * Settings.uiScale) / scrollExtentY); + } + } + + public override function dispose() { + super.dispose(); + this.scrollBarY.remove(); + this.scrollTrack.remove(); + this.clickInteractive.remove(); + } + + public function setScrollPercentage(f:Float) { + var renderRect = this.getRenderRectangle(); + var scrollExtentY = renderRect.extent.y - 34 * Settings.uiScale; + var scrollBarYSize = (scrollExtentY * scrollExtentY / (maxScrollY * Settings.uiScale - 34 * Settings.uiScale)); + + this.scrollY = Util.lerp(0, scrollExtentY - scrollBarYSize * Settings.uiScale, f); + updateScrollVisual(); + } + + public override function onRemove() { + super.onRemove(); + if (MarbleGame.canvas.scene2d.contains(scrollTrack)) { + MarbleGame.canvas.scene2d.removeChild(scrollTrack); // Refresh "layer" + } + if (MarbleGame.canvas.scene2d.contains(scrollBarY)) { + MarbleGame.canvas.scene2d.removeChild(scrollBarY); // Refresh "layer" + } + if (MarbleGame.canvas.scene2d.contains(clickInteractive)) { + MarbleGame.canvas.scene2d.removeChild(clickInteractive); // Refresh "layer" + } + } + + public override function onMousePress(mouseState:MouseState) { + if (Util.isTouchDevice()) { + this.pressed = true; + this.dirty = true; + this.updateScrollVisual(); + this.prevMousePos = mouseState.position; + } + } + + public override function onMouseRelease(mouseState:MouseState) { + if (Util.isTouchDevice()) { + this.pressed = false; + this.dirty = true; + this.updateScrollVisual(); + } + } + + public override function onMouseMove(mouseState:MouseState) { + if (Util.isTouchDevice()) { + super.onMouseMove(mouseState); + if (this.pressed) { + var dy = mouseState.position.y - this.prevMousePos.y; + this.scrollY -= dy; + this.prevMousePos = mouseState.position; + this.updateScrollVisual(); + } + } + } + + // public override function onMouseDown(mouseState:MouseState) { + // var renderRect = this.getHitTestRect(); + // if (mouseState.position.x >= renderRect.position.x + renderRect.extent.x - 10) { + // this.scrollY = mouseState.position.y - renderRect.position.y; + // this.updateScrollVisual(); + // } + // super.onMouseDown(mouseState); + // } +} diff --git a/src/mis/MisParser.hx b/src/mis/MisParser.hx index c719e585..9bc6977b 100644 --- a/src/mis/MisParser.hx +++ b/src/mis/MisParser.hx @@ -23,6 +23,7 @@ import mis.MissionElement.MissionElementScriptObject; import src.Util; import h3d.Vector; import h3d.Quat; +import src.Console; final elementHeadRegEx = ~/new (\w+)\((\w*)\) *{/g; final blockCommentRegEx = ~/\/\*(.|\n)*?\*\//g; @@ -175,7 +176,7 @@ class MisParser { case "ParticleEmitterNode": MisParserMacros.parseObject(name, MissionElementParticleEmitterNode, MissionElementType.ParticleEmitterNode); default: - trace("Unknown element type! " + type); + Console.warn("Unknown element type! " + type); // Still advance the index var endingBraceIndex = Util.indexOfIgnoreStringLiterals(this.text, '};', this.index); if (endingBraceIndex == -1)