diff --git a/src/InteriorObject.hx b/src/InteriorObject.hx index b7326143..8ec4cedf 100644 --- a/src/InteriorObject.hx +++ b/src/InteriorObject.hx @@ -11,6 +11,7 @@ class InteriorObject extends GameObject { public var collider:CollisionEntity; public var interiorFile:String; public var useInstancing = true; + public var level:MarbleWorld; public function new() { super(); @@ -19,11 +20,13 @@ class InteriorObject extends GameObject { public function init(level:MarbleWorld) { this.identifier = this.interiorFile; + this.level = level; DifBuilder.loadDif(this.interiorFile, cast this); } public override function setTransform(transform:Matrix) { super.setTransform(transform); collider.setTransform(transform); + this.level.collisionWorld.updateTransform(this.collider); } } diff --git a/src/Main.hx b/src/Main.hx index aa1d52eb..5bc96f7c 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -1,73 +1,21 @@ package; -import gui.GuiControl.MouseState; -import hxd.Window; -import gui.Canvas; +import src.MarbleGame; import gui.MainMenuGui; import hxd.res.DefaultFont; import h2d.Text; -import src.Mission; -import mis.MisParser; -import sys.io.File; -import shapes.EndPad; -import shapes.LandMine; -import shapes.StartPad; -import shapes.TriangleBumper; -import shapes.RoundBumper; -import shapes.Oilslick; -import gui.PlayGui; -import shapes.Helicopter; -import shapes.ShockAbsorber; -import shapes.SuperBounce; -import shapes.SuperSpeed; -import shapes.SignFinish; -import shapes.Trapdoor; -import shapes.AntiGravity; -import shapes.SuperJump; -import h3d.prim.Polygon; -import src.ResourceLoader; -import src.GameObject; -import shapes.Tornado; -import shapes.DuctFan; -import dts.DtsFile; -import src.InteriorObject; -import h3d.Quat; -import src.PathedInteriorMarker; -import src.PathedInterior; -import src.MarbleWorld; -import collision.CollisionWorld; -import src.Marble; -import src.DifBuilder; import h3d.Vector; -import h3d.scene.fwd.DirLight; -import h3d.mat.Material; -import h3d.prim.Cube; -import h3d.scene.*; -import src.DtsObject; class Main extends hxd.App { - var scene:Scene; - - var world:MarbleWorld; - var dtsObj:DtsObject; - - var canvas:Canvas; + var marbleGame:MarbleGame; var fpsCounter:Text; override function init() { super.init(); - var ltr = File.getContent("data/missions/advanced/airwalk.mis"); - var mfp = new MisParser(ltr); - var mis = mfp.parse(); - - var mission = new Mission(); - mission.root = mis.root; - - canvas = new Canvas(s2d); - - canvas.setContent(new MainMenuGui()); + marbleGame = new MarbleGame(s2d, s3d); + marbleGame.canvas.setContent(new MainMenuGui()); // world = new MarbleWorld(s3d, s2d, mission); // world.init(); @@ -80,17 +28,14 @@ class Main extends hxd.App { override function update(dt:Float) { super.update(dt); - var wnd = Window.getInstance(); - var mouseState:MouseState = { - position: new Vector(wnd.mouseX, wnd.mouseY) - } - canvas.update(dt, mouseState); + marbleGame.update(dt); // world.update(dt); fpsCounter.text = 'FPS: ${this.engine.fps}'; } override function render(e:h3d.Engine) { // this.world.render(e); + marbleGame.render(e); super.render(e); } diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx new file mode 100644 index 00000000..996e681b --- /dev/null +++ b/src/MarbleGame.hx @@ -0,0 +1,66 @@ +package src; + +import gui.ExitGameDlg; +import hxd.Key; +import src.Mission; +import h3d.Vector; +import gui.GuiControl.MouseState; +import hxd.Window; +import src.MarbleWorld; +import gui.Canvas; + +@:publicFields +class MarbleGame { + var canvas:Canvas; + var world:MarbleWorld; + + var scene2d:h2d.Scene; + var scene:h3d.scene.Scene; + + var paused:Bool; + + var exitGameDlg:ExitGameDlg; + + public function new(scene2d:h2d.Scene, scene:h3d.scene.Scene) { + this.canvas = new Canvas(scene2d, cast this); + this.scene = scene; + this.scene2d = scene2d; + } + + public function update(dt:Float) { + if (world != null) { + if (!paused) { + world.update(dt); + } + if (Key.isPressed(Key.ESCAPE)) { + paused = !paused; + if (paused) { + exitGameDlg = new ExitGameDlg(); + canvas.pushDialog(exitGameDlg); + } else { + canvas.popDialog(exitGameDlg); + } + } + } + if (canvas != null) { + var wnd = Window.getInstance(); + var mouseState:MouseState = { + position: new Vector(wnd.mouseX, wnd.mouseY) + } + canvas.update(dt, mouseState); + } + } + + public function playMission(mission:Mission) { + this.canvas.clearContent(); + mission.load(); + world = new MarbleWorld(scene, scene2d, mission); + world.init(); + world.start(); + } + + public function render(e:h3d.Engine) { + if (world != null) + world.render(e); + } +} diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index dbbcd3d9..eff1ee94 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -525,7 +525,6 @@ class MarbleWorld extends Scheduler { if (element.datablock == "OutOfBoundsTrigger") { trigger = new OutOfBoundsTrigger(element, cast this); } else if (element.datablock == "InBoundsTrigger") { - return; trigger = new InBoundsTrigger(element, cast this); } else if (element.datablock == "HelpTrigger") { trigger = new HelpTrigger(element, cast this); diff --git a/src/Mission.hx b/src/Mission.hx index 141d3f02..dd59d71c 100644 --- a/src/Mission.hx +++ b/src/Mission.hx @@ -20,6 +20,12 @@ class Mission { public function new() {} + public function load() { + var misParser = new MisParser(ResourceLoader.fileSystem.get(this.path).getText()); + var contents = misParser.parse(); + root = contents.root; + } + public static function fromMissionInfo(path:String, mInfo:MissionElementScriptObject) { var mission = new Mission(); mission.path = path; diff --git a/src/PathedInterior.hx b/src/PathedInterior.hx index 69230ef1..fadd23c3 100644 --- a/src/PathedInterior.hx +++ b/src/PathedInterior.hx @@ -51,8 +51,6 @@ class PathedInterior extends InteriorObject { var stopped:Bool = false; var stopTime:Float; - public var level:MarbleWorld; - var previousState:PIState; public static function createFromSimGroup(simGroup:MissionElementSimGroup, level:MarbleWorld) { diff --git a/src/gui/Canvas.hx b/src/gui/Canvas.hx index 6569de69..62f5504a 100644 --- a/src/gui/Canvas.hx +++ b/src/gui/Canvas.hx @@ -1,15 +1,19 @@ package gui; +import src.MarbleGame; import h3d.Vector; import h2d.Scene; import gui.GuiControl.MouseState; +@:publicFields class Canvas extends GuiControl { var scene2d:Scene; + var marbleGame:MarbleGame; - public function new(scene) { + public function new(scene, marbleGame:MarbleGame) { super(); this.scene2d = scene; + this.marbleGame = marbleGame; this.position = new Vector(); this.extent = new Vector(640, 480); @@ -23,6 +27,22 @@ class Canvas extends GuiControl { this.render(scene2d); } + public function pushDialog(content:GuiControl) { + this.addChild(content); + this.render(scene2d); + } + + public function popDialog(content:GuiControl) { + content.dispose(); + this.removeChild(content); + this.render(scene2d); + } + + public function clearContent() { + this.dispose(); + this.render(scene2d); + } + public override function update(dt:Float, mouseState:MouseState) { super.update(dt, mouseState); } diff --git a/src/gui/ExitGameDlg.hx b/src/gui/ExitGameDlg.hx new file mode 100644 index 00000000..38ef5f6c --- /dev/null +++ b/src/gui/ExitGameDlg.hx @@ -0,0 +1,52 @@ +package gui; + +import h3d.Vector; +import src.ResourceLoader; + +class ExitGameDlg extends GuiControl { + public function new() { + super(); + + this.horizSizing = Width; + this.vertSizing = Height; + this.position = new Vector(); + this.extent = new Vector(640, 480); + + function loadButtonImages(path:String) { + var normal = ResourceLoader.getImage('${path}_n.png').toTile(); + var hover = ResourceLoader.getImage('${path}_h.png').toTile(); + var pressed = ResourceLoader.getImage('${path}_d.png').toTile(); + return [normal, hover, pressed]; + } + + var dialogImg = new GuiImage(ResourceLoader.getImage("data/ui/common/dialog.png").toTile()); + dialogImg.horizSizing = Center; + dialogImg.vertSizing = Center; + dialogImg.position = new Vector(134, 148); + dialogImg.extent = new Vector(388, 186); + + var yesButton = new GuiButton(loadButtonImages("data/ui/common/yes")); + yesButton.position = new Vector(47, 107); + yesButton.extent = new Vector(88, 52); + yesButton.vertSizing = Top; + yesButton.horizSizing = Right; + + var noButton = new GuiButton(loadButtonImages("data/ui/common/no")); + noButton.position = new Vector(151, 107); + noButton.extent = new Vector(83, 55); + noButton.vertSizing = Top; + noButton.horizSizing = Right; + + var restartButton = new GuiButton(loadButtonImages("data/ui/common/restart")); + restartButton.position = new Vector(249, 107); + restartButton.extent = new Vector(103, 56); + restartButton.vertSizing = Top; + restartButton.horizSizing = Right; + + dialogImg.addChild(yesButton); + dialogImg.addChild(noButton); + dialogImg.addChild(restartButton); + + this.addChild(dialogImg); + } +} diff --git a/src/gui/GuiControl.hx b/src/gui/GuiControl.hx index 49a19bfd..9006de7a 100644 --- a/src/gui/GuiControl.hx +++ b/src/gui/GuiControl.hx @@ -122,12 +122,12 @@ class GuiControl { } if (this.horizSizing == HorizSizing.Left) { if (this.parent != null) { - rect.position.x = parentRect.extent.x - (parent.extent.x - this.position.x); + rect.position.x = parentRect.position.x + parentRect.extent.x - (parent.extent.x - this.position.x); } } if (this.vertSizing == VertSizing.Top) { if (this.parent != null) { - rect.position.y = parentRect.extent.y - (parent.extent.y - this.position.y); + rect.position.y = parentRect.position.y + parentRect.extent.y - (parent.extent.y - this.position.y); } } return rect; diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 0006d143..6bf2f53c 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -39,6 +39,7 @@ class PlayGui { var powerupBox:GuiImage; var powerupImageScene:h3d.scene.Scene; var powerupImageSceneTarget:Texture; + var powerupImageSceneTargetBitmap:Bitmap; var powerupImageObject:DtsObject; var RSGOCenterText:Anim; @@ -50,6 +51,17 @@ class PlayGui { var playGuiCtrl:GuiControl; + public function dispose() { + playGuiCtrl.dispose(); + gemImageScene.dispose(); + gemImageSceneTarget.dispose(); + gemImageSceneTargetBitmap.remove(); + powerupImageScene.dispose(); + powerupImageSceneTarget.dispose(); + powerupImageSceneTargetBitmap.remove(); + RSGOCenterText.remove(); + } + public function init(scene2d:h2d.Scene) { this.scene2d = scene2d; @@ -231,7 +243,7 @@ class PlayGui { powerupImageSceneTarget = new Texture(68, 67, [Target]); powerupImageSceneTarget.depthBuffer = new DepthBuffer(68, 67); - var powerupImageSceneTargetBitmap = new Bitmap(Tile.fromTexture(powerupImageSceneTarget), scene2d); + powerupImageSceneTargetBitmap = new Bitmap(Tile.fromTexture(powerupImageSceneTarget), scene2d); powerupImageSceneTargetBitmap.x = scene2d.width - 88; powerupImageSceneTargetBitmap.y = 18; } diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index 816afd05..73b10b90 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -138,6 +138,10 @@ class PlayMissionGui extends GuiImage { var pmPlay = new GuiButton(loadButtonImages("data/ui/play/play")); pmPlay.position = new Vector(391, 257); pmPlay.extent = new Vector(121, 62); + pmPlay.pressedAction = (sender) -> { + // Wacky hacks + cast(this.parent, Canvas).marbleGame.playMission(currentList[currentSelection]); + } pmBox.addChild(pmPlay); var pmPrev = new GuiButton(loadButtonImages("data/ui/play/prev")); @@ -199,7 +203,7 @@ class PlayMissionGui extends GuiImage { var descText2 = '

' + 'ÂTest Align'; descText2 += '


'; for (i in 0...3) { - descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ00:00.000'; + descText2 += '
ÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂÂ99:59.999'; } pmDescriptionOther.text.text = descText2; pmBox.addChild(pmDescriptionOther);