From 89808690822cfa8c7e275f50cd462e44dc624adf Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 5 Dec 2022 14:35:57 +0530 Subject: [PATCH] add mbu models --- src/MarbleWorld.hx | 39 +++++++++++++++++++++++++++++++++++++++ src/MissionList.hx | 9 +++++++++ src/ResourceLoader.hx | 8 ++++++++ src/gui/PlayMissionGui.hx | 18 +++++++++++++++--- src/shapes/AntiGravity.hx | 4 +++- src/shapes/Blast.hx | 37 +++++++++++++++++++++++++++++++++++++ src/shapes/Glass.hx | 31 +++++++++++++++++++++++++++++++ src/shapes/MegaMarble.hx | 35 +++++++++++++++++++++++++++++++++++ src/shapes/Sky.hx | 16 ++++++++++++++++ 9 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 src/shapes/Blast.hx create mode 100644 src/shapes/Glass.hx create mode 100644 src/shapes/MegaMarble.hx create mode 100644 src/shapes/Sky.hx diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 859cbbbc..40f29b7d 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,5 +1,8 @@ package src; +import shapes.MegaMarble; +import shapes.Blast; +import shapes.Glass; import gui.OOBInsultGui; import shapes.Checkpoint; import triggers.CheckpointTrigger; @@ -297,6 +300,8 @@ class MarbleWorld extends Scheduler { worker.loadFile(file); } + this.scene.camera.zFar = Math.max(2000, Std.parseFloat(this.skyElement.visibledistance)); + this.sky = new Sky(); sky.dmlPath = ResourceLoader.getProperFilepath(skyElement.materiallist); @@ -666,6 +671,8 @@ class MarbleWorld extends Scheduler { shape = new Magnet(); else if (dataBlockLowerCase == "antigravityitem") shape = new AntiGravity(cast element); + else if (dataBlockLowerCase == "norespawnantigravityitem") + shape = new AntiGravity(cast element, true); else if (dataBlockLowerCase == "landmine") shape = new LandMine(); else if (dataBlockLowerCase == "nuke") @@ -676,6 +683,10 @@ class MarbleWorld extends Scheduler { shape = new SuperSpeed(cast element); else if (dataBlockLowerCase == "timetravelitem" || dataBlockLowerCase == "timepenaltyitem") shape = new TimeTravel(cast element); + else if (dataBlockLowerCase == "blast") + shape = new Blast(cast element); + else if (dataBlockLowerCase == "megamarble") + shape = new MegaMarble(cast element); else if (dataBlockLowerCase == "tornado") shape = new Tornado(); else if (dataBlockLowerCase == "trapdoor") @@ -684,6 +695,17 @@ class MarbleWorld extends Scheduler { shape = new Oilslick(); else if (dataBlockLowerCase == "arrow" || StringTools.startsWith(dataBlockLowerCase, "sign")) shape = new Sign(cast element); + else if ([ + "glass_3shape", + "glass_6shape", + "glass_9shape", + "glass_12shape", + "glass_15shape", + "glass_18shape" + ].contains(dataBlockLowerCase)) + shape = new Glass(cast element); + else if (["clear", "cloudy", "dusk", "wintry"].contains(dataBlockLowerCase)) + shape = new shapes.Sky(dataBlockLowerCase); else { onFinish(); return; @@ -762,6 +784,8 @@ class MarbleWorld extends Scheduler { shape = new Magnet(); else if (dataBlockLowerCase == "antigravityitem") shape = new AntiGravity(cast element); + else if (dataBlockLowerCase == "norespawnantigravityitem") + shape = new AntiGravity(cast element, true); else if (dataBlockLowerCase == "landmine") shape = new LandMine(); else if (dataBlockLowerCase == "nuke") @@ -772,6 +796,10 @@ class MarbleWorld extends Scheduler { shape = new SuperSpeed(cast element); else if (dataBlockLowerCase == "timetravelitem" || dataBlockLowerCase == "timepenaltyitem") shape = new TimeTravel(cast element); + else if (dataBlockLowerCase == "blastitem") + shape = new Blast(cast element); + else if (dataBlockLowerCase == "megamarbleitem") + shape = new MegaMarble(cast element); else if (dataBlockLowerCase == "tornado") shape = new Tornado(); else if (dataBlockLowerCase == "trapdoor") @@ -780,6 +808,17 @@ class MarbleWorld extends Scheduler { shape = new Oilslick(); else if (dataBlockLowerCase == "arrow" || StringTools.startsWith(dataBlockLowerCase, "sign")) shape = new Sign(cast element); + else if ([ + "glass_3shape", + "glass_6shape", + "glass_9shape", + "glass_12shape", + "glass_15shape", + "glass_18shape" + ].contains(dataBlockLowerCase)) + shape = new Glass(cast element); + else if (["clear", "cloudy", "dusk", "wintry"].contains(dataBlockLowerCase)) + shape = new shapes.Sky(dataBlockLowerCase); else { onFinish(); return; diff --git a/src/MissionList.hx b/src/MissionList.hx index c2234603..34f3a0dc 100644 --- a/src/MissionList.hx +++ b/src/MissionList.hx @@ -57,6 +57,7 @@ class MissionList { var goldMissions:Map> = []; var platinumMissions:Map> = []; + var ultraMissions:Map> = []; goldMissions.set("beginner", parseDifficulty("gold", "missions_mbg", "beginner")); goldMissions.set("intermediate", parseDifficulty("gold", "missions_mbg", "intermediate")); @@ -67,6 +68,10 @@ class MissionList { platinumMissions.set("advanced", parseDifficulty("platinum", "missions_mbp", "advanced")); platinumMissions.set("expert", parseDifficulty("platinum", "missions_mbp", "expert")); + ultraMissions.set("beginner", parseDifficulty("ultra", "missions_mbu", "beginner")); + ultraMissions.set("intermediate", parseDifficulty("ultra", "missions_mbu", "intermediate")); + ultraMissions.set("advanced", parseDifficulty("ultra", "missions_mbu", "advanced")); + customMissions = parseDifficulty("custom", "missions", "custom"); @:privateAccess goldMissions["beginner"][goldMissions["beginner"].length - 1].next = goldMissions["intermediate"][0]; @@ -76,9 +81,13 @@ class MissionList { @:privateAccess platinumMissions["intermediate"][platinumMissions["intermediate"].length - 1].next = platinumMissions["advanced"][0]; @:privateAccess platinumMissions["advanced"][platinumMissions["advanced"].length - 1].next = platinumMissions["expert"][0]; @:privateAccess platinumMissions["expert"][platinumMissions["expert"].length - 1].next = platinumMissions["beginner"][0]; + @:privateAccess ultraMissions["beginner"][ultraMissions["beginner"].length - 1].next = ultraMissions["intermediate"][0]; + @:privateAccess ultraMissions["intermediate"][ultraMissions["intermediate"].length - 1].next = ultraMissions["advanced"][0]; + @:privateAccess ultraMissions["advanced"][ultraMissions["advanced"].length - 1].next = ultraMissions["beginner"][0]; missionList.set("gold", goldMissions); missionList.set("platinum", platinumMissions); + missionList.set("ultra", ultraMissions); // parseCLAList(); diff --git a/src/ResourceLoader.hx b/src/ResourceLoader.hx index d8c93565..b09c928b 100644 --- a/src/ResourceLoader.hx +++ b/src/ResourceLoader.hx @@ -158,6 +158,14 @@ class ResourceLoader { toloadfiles.push(file); } } + filestats = fileSystem.dir("missions_mbu"); + for (file in filestats) { + if (file.isDirectory) { + toloaddirs.push(file); + } else { + toloadfiles.push(file); + } + } while (toloaddirs.length > 0) { var nextdir = toloaddirs.pop(); for (file in fileSystem.dir(nextdir.path.substring(2))) { diff --git a/src/gui/PlayMissionGui.hx b/src/gui/PlayMissionGui.hx index f942f48e..9934ccbb 100644 --- a/src/gui/PlayMissionGui.hx +++ b/src/gui/PlayMissionGui.hx @@ -412,7 +412,11 @@ class PlayMissionGui extends GuiImage { pmDifficultyUltraAdvanced.ratio = -1 / 16; pmDifficultyUltraAdvanced.setExtent(new Vector(120, 31)); pmDifficultyUltraAdvanced.txtCtrl.text.text = " Advanced"; - pmDifficultyUltraAdvanced.disabled = true; + pmDifficultyUltraAdvanced.pressedAction = (e) -> { + currentList = MissionList.missionList["ultra"]["advanced"]; + currentCategory = "advanced"; + setCategoryFunc("ultra", "advanced"); + } pmDifficultyCtrl.addChild(pmDifficultyUltraAdvanced); var pmDifficultyUltraBeginner = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); @@ -420,7 +424,11 @@ class PlayMissionGui extends GuiImage { pmDifficultyUltraBeginner.ratio = -1 / 16; pmDifficultyUltraBeginner.setExtent(new Vector(120, 31)); pmDifficultyUltraBeginner.txtCtrl.text.text = " Beginner"; - pmDifficultyUltraBeginner.disabled = true; + pmDifficultyUltraBeginner.pressedAction = (e) -> { + currentList = MissionList.missionList["ultra"]["beginner"]; + currentCategory = "beginner"; + setCategoryFunc("ultra", "beginner"); + } pmDifficultyCtrl.addChild(pmDifficultyUltraBeginner); var pmDifficultyUltraIntermediate = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); @@ -428,7 +436,11 @@ class PlayMissionGui extends GuiImage { pmDifficultyUltraIntermediate.ratio = -1 / 16; pmDifficultyUltraIntermediate.setExtent(new Vector(120, 31)); pmDifficultyUltraIntermediate.txtCtrl.text.text = " Intermediate"; - pmDifficultyUltraIntermediate.disabled = true; + pmDifficultyUltraIntermediate.pressedAction = (e) -> { + currentList = MissionList.missionList["ultra"]["intermediate"]; + currentCategory = "intermediate"; + setCategoryFunc("ultra", "intermediate"); + } pmDifficultyCtrl.addChild(pmDifficultyUltraIntermediate); var pmDifficultyGoldAdvanced = new GuiButtonText(loadButtonImages("data/ui/play/difficulty_highlight-120"), markerFelt24); diff --git a/src/shapes/AntiGravity.hx b/src/shapes/AntiGravity.hx index 7523183b..de4c5895 100644 --- a/src/shapes/AntiGravity.hx +++ b/src/shapes/AntiGravity.hx @@ -8,7 +8,7 @@ import src.DtsObject; import src.MarbleWorld; class AntiGravity extends PowerUp { - public function new(element:MissionElementItem) { + public function new(element:MissionElementItem, norespawn:Bool = false) { super(element); this.dtsPath = "data/shapes/items/antigravity.dts"; this.isCollideable = false; @@ -16,6 +16,8 @@ class AntiGravity extends PowerUp { this.identifier = "AntiGravity"; this.pickUpName = "Gravity Defier"; this.autoUse = true; + if (norespawn) + this.cooldownDuration = Math.NEGATIVE_INFINITY; } public function pickUp():Bool { diff --git a/src/shapes/Blast.hx b/src/shapes/Blast.hx new file mode 100644 index 00000000..467f3d5b --- /dev/null +++ b/src/shapes/Blast.hx @@ -0,0 +1,37 @@ +package shapes; + +import src.MarbleWorld; +import src.ResourceLoader; +import src.TimeState; +import mis.MissionElement.MissionElementItem; + +class Blast extends PowerUp { + public function new(element:MissionElementItem) { + super(element); + this.dtsPath = "data/shapes/items/blast.dts"; + this.isCollideable = false; + this.isTSStatic = false; + this.showSequences = true; + this.identifier = "Blast"; + this.pickUpName = "Blast PowerUp"; + this.autoUse = true; + } + + public override function init(level:MarbleWorld, onFinish:Void->Void) { + super.init(level, () -> { + ResourceLoader.load("sound/publastvoice.wav").entry.load(() -> { + this.pickupSound = ResourceLoader.getResource("data/sound/publastvoice.wav", ResourceLoader.getAudio, this.soundResources); + onFinish(); + }); + }); + } + + public function pickUp():Bool { + return true; + } + + public function use(timeState:TimeState) { + var marble = this.level.marble; + this.level.deselectPowerUp(); + } +} diff --git a/src/shapes/Glass.hx b/src/shapes/Glass.hx new file mode 100644 index 00000000..ee70d721 --- /dev/null +++ b/src/shapes/Glass.hx @@ -0,0 +1,31 @@ +package shapes; + +import mis.MissionElement.MissionElementStaticShape; +import src.DtsObject; + +class Glass extends DtsObject { + public function new(element:MissionElementStaticShape) { + super(); + + var datablockLowercase = element.datablock.toLowerCase(); + switch (datablockLowercase) { + case "glass_3shape": + this.dtsPath = "data/shapes/glass/3x3.dts"; + case "glass_6shape": + this.dtsPath = "data/shapes/glass/6x3.dts"; + case "glass_9shape": + this.dtsPath = "data/shapes/glass/9x3.dts"; + case "glass_12shape": + this.dtsPath = "data/shapes/glass/12x3.dts"; + case "glass_15shape": + this.dtsPath = "data/shapes/glass/15x3.dts"; + case "glass_18shape": + this.dtsPath = "data/shapes/glass/18x3.dts"; + } + + this.isCollideable = true; + this.useInstancing = true; + + this.identifier = datablockLowercase; + } +} diff --git a/src/shapes/MegaMarble.hx b/src/shapes/MegaMarble.hx new file mode 100644 index 00000000..86f48930 --- /dev/null +++ b/src/shapes/MegaMarble.hx @@ -0,0 +1,35 @@ +package shapes; + +import src.MarbleWorld; +import src.ResourceLoader; +import src.TimeState; +import mis.MissionElement.MissionElementItem; + +class MegaMarble extends PowerUp { + public function new(element:MissionElementItem) { + super(element); + this.dtsPath = "data/shapes/items/megamarble.dts"; + this.isCollideable = false; + this.isTSStatic = false; + this.showSequences = true; + this.identifier = "MegaMarble"; + this.pickUpName = "Mega Marble PowerUp"; + } + + public override function init(level:MarbleWorld, onFinish:Void->Void) { + super.init(level, () -> { + ResourceLoader.load("sound/pumegamarblevoice.wav").entry.load(() -> { + this.pickupSound = ResourceLoader.getResource("data/sound/pumegamarblevoice.wav", ResourceLoader.getAudio, this.soundResources); + onFinish(); + }); + }); + } + + public function pickUp():Bool { + return this.level.pickUpPowerUp(this); + } + + public function use(timeState:TimeState) { + this.level.deselectPowerUp(); + } +} diff --git a/src/shapes/Sky.hx b/src/shapes/Sky.hx new file mode 100644 index 00000000..47f78ebb --- /dev/null +++ b/src/shapes/Sky.hx @@ -0,0 +1,16 @@ +package shapes; + +import src.DtsObject; + +class Sky extends DtsObject { + public function new(type:String) { + super(); + + this.dtsPath = 'data/shapes/skies/${type}/${type}.dts'; + + this.isCollideable = false; + this.useInstancing = true; + + this.identifier = type + "Sky"; + } +}