mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-22 10:41:38 +00:00
remove files not needed
This commit is contained in:
parent
2d888d1a80
commit
078f2c9a58
16 changed files with 13 additions and 2212 deletions
|
|
@ -100,8 +100,6 @@ class MarbleWorldMacros {
|
|||
|| dataBlockLowerCase == "timepenaltyitem"
|
||||
|| dataBlockLowerCase == "timetravelitem_mbu")
|
||||
shape = new TimeTravel(cast element);
|
||||
else if (dataBlockLowerCase == "randompowerupitem")
|
||||
shape = new RandomPowerup(cast element);
|
||||
else if (dataBlockLowerCase == "tornado" || dataBlockLowerCase == "tornado_mbm")
|
||||
shape = new Tornado();
|
||||
else if (dataBlockLowerCase == "trapdoor" || dataBlockLowerCase == "trapdoor_mbu")
|
||||
|
|
|
|||
|
|
@ -3,7 +3,6 @@ package src;
|
|||
import mis.MisParser;
|
||||
import triggers.Trigger;
|
||||
import net.Net;
|
||||
import gui.MarbleSelectGui;
|
||||
import net.NetPacket.MarbleNetFlags;
|
||||
import net.BitStream.OutputBitStream;
|
||||
import net.ClientConnection;
|
||||
|
|
@ -399,19 +398,19 @@ class Marble extends GameObject {
|
|||
|
||||
var marbleDts = new DtsObject();
|
||||
var marbleShader = "";
|
||||
if (connection == null) {
|
||||
Console.log("Marble: " + Settings.optionsSettings.marbleModel + " (" + Settings.optionsSettings.marbleSkin + ")");
|
||||
marbleDts.dtsPath = Settings.optionsSettings.marbleModel;
|
||||
marbleDts.matNameOverride.set("base.marble", Settings.optionsSettings.marbleSkin + ".marble");
|
||||
marbleShader = Settings.optionsSettings.marbleShader;
|
||||
} else {
|
||||
var marbleData = MarbleSelectGui.marbleData[connection.getMarbleCatId()][connection.getMarbleId()]; // FIXME category support
|
||||
Console.log("Marble: " + marbleData.dts + " (" + marbleData.skin + ")");
|
||||
marbleDts.dtsPath = marbleData.dts;
|
||||
marbleDts.matNameOverride.set("base.marble", marbleData.skin + ".marble");
|
||||
marbleShader = marbleData.shader;
|
||||
}
|
||||
marbleDts.identifier = "Marble";
|
||||
// if (connection == null) {
|
||||
// Console.log("Marble: " + Settings.optionsSettings.marbleModel + " (" + Settings.optionsSettings.marbleSkin + ")");
|
||||
// marbleDts.dtsPath = Settings.optionsSettings.marbleModel;
|
||||
// marbleDts.matNameOverride.set("base.marble", Settings.optionsSettings.marbleSkin + ".marble");
|
||||
// marbleShader = Settings.optionsSettings.marbleShader;
|
||||
// } else {
|
||||
// var marbleData = MarbleSelectGui.marbleData[connection.getMarbleCatId()][connection.getMarbleId()]; // FIXME category support
|
||||
// Console.log("Marble: " + marbleData.dts + " (" + marbleData.skin + ")");
|
||||
// marbleDts.dtsPath = marbleData.dts;
|
||||
// marbleDts.matNameOverride.set("base.marble", marbleData.skin + ".marble");
|
||||
// marbleShader = marbleData.shader;
|
||||
// }
|
||||
marbleDts.dtsPath = "data/shapes/balls/ball-superball.dts";
|
||||
marbleDts.identifier = "Marble";
|
||||
marbleDts.showSequences = false;
|
||||
marbleDts.useInstancing = false;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ import gui.MainMenuGui;
|
|||
#if !js
|
||||
import gui.ReplayCenterGui;
|
||||
#end
|
||||
import gui.ReplayNameDlg;
|
||||
import gui.ConsoleDlg;
|
||||
import src.Replay;
|
||||
import touch.TouchInput;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,6 @@ import net.NetPacket.PowerupPickupPacket;
|
|||
import net.Move;
|
||||
import net.NetPacket.GemSpawnPacket;
|
||||
import net.BitStream.OutputBitStream;
|
||||
import gui.MarbleSelectGui;
|
||||
import collision.CollisionPool;
|
||||
import net.GemPredictionStore;
|
||||
import net.NetPacket.MarbleNetFlags;
|
||||
|
|
@ -37,19 +36,15 @@ import gui.MainMenuGui;
|
|||
#else
|
||||
import gui.ReplayCenterGui;
|
||||
#end
|
||||
import gui.ReplayNameDlg;
|
||||
import collision.Collision;
|
||||
import shapes.MegaMarble;
|
||||
import shapes.Blast;
|
||||
import shapes.Glass;
|
||||
import gui.OOBInsultGui;
|
||||
import shapes.Checkpoint;
|
||||
import triggers.CheckpointTrigger;
|
||||
import shapes.EasterEgg;
|
||||
import shapes.Sign;
|
||||
import triggers.TeleportTrigger;
|
||||
import triggers.DestinationTrigger;
|
||||
import shapes.Nuke;
|
||||
import shapes.Magnet;
|
||||
import src.Replay;
|
||||
import gui.Canvas;
|
||||
|
|
@ -88,7 +83,6 @@ import shapes.Helicopter;
|
|||
import shapes.TriangleBumper;
|
||||
import shapes.RoundBumper;
|
||||
import shapes.SuperBounce;
|
||||
import shapes.RandomPowerup;
|
||||
import shapes.SignCaution;
|
||||
import shapes.SuperJump;
|
||||
import shapes.Gem;
|
||||
|
|
@ -2403,8 +2397,6 @@ class MarbleWorld extends Scheduler {
|
|||
} else {
|
||||
Settings.levelStatistics[mission.path].oobs++;
|
||||
}
|
||||
if (Settings.optionsSettings.oobInsults)
|
||||
OOBInsultGui.OOBCheck();
|
||||
}
|
||||
// sky.follow = null;
|
||||
// this.oobCameraPosition = camera.position.clone();
|
||||
|
|
|
|||
|
|
@ -1,192 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.MarbleGame;
|
||||
import src.Settings;
|
||||
import src.Mission;
|
||||
import src.MissionList;
|
||||
|
||||
class AchievementsGui extends GuiImage {
|
||||
public function new() {
|
||||
var img = ResourceLoader.getImage("data/ui/achiev/window.png");
|
||||
super(img.resource.toTile());
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(73, -21);
|
||||
this.extent = new Vector(493, 512);
|
||||
|
||||
var achiev = new GuiImage(ResourceLoader.getResource("data/ui/achiev/achiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
achiev.position = new Vector(152, 26);
|
||||
achiev.extent = new Vector(176, 50);
|
||||
this.addChild(achiev);
|
||||
|
||||
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 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 26 * Settings.uiScale, MultiChannel);
|
||||
var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel);
|
||||
var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel);
|
||||
|
||||
function mlFontLoader(text:String) {
|
||||
switch (text) {
|
||||
case "DomCasual24":
|
||||
return domcasual24;
|
||||
case "Arial14":
|
||||
return arial14;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed, disabled];
|
||||
}
|
||||
|
||||
var achievText = new GuiMLText(domcasual32, mlFontLoader);
|
||||
achievText.position = new Vector(156, 60);
|
||||
achievText.extent = new Vector(262, 410);
|
||||
achievText.text.textColor = 0;
|
||||
achievText.text.text = '<font face="DomCasual24">Amateur Marbler</font><br/><font face="Arial14">Beat all Beginner levels.</font><br/>
|
||||
<font face="DomCasual24">Experienced Marbler</font><br/><font face="Arial14">Beat all Intermediate levels.</font><br/>
|
||||
<font face="DomCasual24">Pro Marbler</font><br/><font face="Arial14">Beat all Advanced levels.</font><br/>
|
||||
<font face="DomCasual24">Skilled Marbler</font><br/><font face="Arial14">Beat all Expert Levels</font><br/>
|
||||
<font face="DomCasual24">Marble Master</font><br/><font face="Arial14">Beat all of the Platinum Times.</font><br/>
|
||||
<font face="DomCasual24">Legendary Marbler</font><br/><font face="Arial14">Beat all of the Ultimate Times.</font><br/>
|
||||
<font face="DomCasual24">Egg Seeker</font><br/><font face="Arial14">Find any Easter Egg.</font><br/>
|
||||
<font face="DomCasual24">Easter Bunny</font><br/><font face="Arial14">Find all of the Easter Eggs.</font>';
|
||||
|
||||
this.addChild(achievText);
|
||||
|
||||
var bmp1 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp1.position = new Vector(39, 62);
|
||||
bmp1.extent = new Vector(113, 44);
|
||||
this.addChild(bmp1);
|
||||
|
||||
var bmp2 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp2.position = new Vector(35, 115);
|
||||
bmp2.extent = new Vector(117, 44);
|
||||
this.addChild(bmp2);
|
||||
|
||||
var bmp3 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp3.position = new Vector(30, 168);
|
||||
bmp3.extent = new Vector(122, 44);
|
||||
this.addChild(bmp3);
|
||||
|
||||
var bmp4 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp4.position = new Vector(30, 221);
|
||||
bmp4.extent = new Vector(122, 44);
|
||||
this.addChild(bmp4);
|
||||
|
||||
var bmp5 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp5.position = new Vector(36, 274);
|
||||
bmp5.extent = new Vector(116, 44);
|
||||
this.addChild(bmp5);
|
||||
|
||||
var bmp6 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp6.position = new Vector(37, 327);
|
||||
bmp6.extent = new Vector(115, 44);
|
||||
this.addChild(bmp6);
|
||||
|
||||
var bmp7 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp7.position = new Vector(38, 380);
|
||||
bmp7.extent = new Vector(114, 44);
|
||||
this.addChild(bmp7);
|
||||
|
||||
var bmp8 = new GuiImage(ResourceLoader.getResource("data/ui/achiev/nonachiev.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
bmp8.position = new Vector(39, 433);
|
||||
bmp8.extent = new Vector(113, 44);
|
||||
this.addChild(bmp8);
|
||||
|
||||
var closeButton = new GuiButton(loadButtonImages("data/ui/achiev/close"));
|
||||
closeButton.position = new Vector(355, 426);
|
||||
closeButton.extent = new Vector(95, 45);
|
||||
closeButton.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
}
|
||||
this.addChild(closeButton);
|
||||
|
||||
// Now do the actual achievement check logic
|
||||
var completions:Map<String, Array<{
|
||||
mission:Mission,
|
||||
beatPar:Bool,
|
||||
beatPlatinum:Bool,
|
||||
beatUltimate:Bool,
|
||||
beaten:Bool
|
||||
}>> = [];
|
||||
|
||||
var totalPlatinums = 0;
|
||||
var totalUltimates = 0;
|
||||
var totalEggs = 0;
|
||||
|
||||
for (difficulty => missions in MissionList.missionList["platinum"]) {
|
||||
completions.set(difficulty, missions.map(mis -> {
|
||||
var misScores = Settings.getScores(mis.path);
|
||||
if (misScores.length == 0) {
|
||||
return {
|
||||
mission: mis,
|
||||
beatPar: false,
|
||||
beatPlatinum: false,
|
||||
beatUltimate: false,
|
||||
beaten: false
|
||||
}
|
||||
}
|
||||
var bestTime = misScores[0];
|
||||
var beatPar = bestTime.time < mis.qualifyTime;
|
||||
var beatPlatinum = bestTime.time < mis.goldTime;
|
||||
var beatUltimate = bestTime.time < mis.ultimateTime;
|
||||
var beaten = beatPar || beatPlatinum || beatUltimate;
|
||||
|
||||
if (beatPlatinum)
|
||||
totalPlatinums++;
|
||||
if (beatUltimate)
|
||||
totalUltimates++;
|
||||
if (Settings.easterEggs.exists(mis.path))
|
||||
totalEggs++;
|
||||
return {
|
||||
mission: mis,
|
||||
beatPar: beatPar,
|
||||
beatPlatinum: beatPlatinum,
|
||||
beatUltimate: beatUltimate,
|
||||
beaten: beaten
|
||||
};
|
||||
}));
|
||||
}
|
||||
|
||||
var beginnerFinishAchiev = completions["beginner"].filter(x -> !x.beatPar).length == 0;
|
||||
var intermediateFinishAchiev = completions["intermediate"].filter(x -> !x.beatPar).length == 0;
|
||||
var advancedFinishAchiev = completions["advanced"].filter(x -> !x.beatPar).length == 0;
|
||||
var expertFinishAchiev = completions["expert"].filter(x -> !x.beatPar).length == 0;
|
||||
var beatPlatinumAchiev = totalPlatinums == 120;
|
||||
var beatUltimateAchiev = totalUltimates == 120;
|
||||
var easterEggAny = totalEggs != 0;
|
||||
var easterEggAll = totalEggs == 96;
|
||||
|
||||
if (beginnerFinishAchiev)
|
||||
bmp1.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n1.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (intermediateFinishAchiev)
|
||||
bmp2.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n2.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (advancedFinishAchiev)
|
||||
bmp3.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n3.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (expertFinishAchiev)
|
||||
bmp4.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n4.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (beatPlatinumAchiev)
|
||||
bmp5.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n6.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (beatUltimateAchiev)
|
||||
bmp6.bmp.tile = ResourceLoader.getResource("data/ui/achiev/n5.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (easterEggAny)
|
||||
bmp7.bmp.tile = ResourceLoader.getResource("data/ui/achiev/1.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
if (easterEggAll)
|
||||
bmp8.bmp.tile = ResourceLoader.getResource("data/ui/achiev/2.png", ResourceLoader.getImage, this.imageResources).toTile();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,176 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import h2d.filter.DropShadow;
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.MarbleGame;
|
||||
import src.Settings;
|
||||
import src.AudioManager;
|
||||
|
||||
class JukeboxDlg extends GuiImage {
|
||||
public function new() {
|
||||
var img = ResourceLoader.getImage("data/ui/jukebox/window.png");
|
||||
super(img.resource.toTile());
|
||||
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(39, 35);
|
||||
this.extent = new Vector(541, 409);
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed];
|
||||
}
|
||||
|
||||
var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt");
|
||||
var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry);
|
||||
@:privateAccess markerFelt32b.loader = ResourceLoader.loader;
|
||||
var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt24 = markerFelt32b.toSdfFont(cast 18 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * Settings.uiScale, MultiChannel);
|
||||
|
||||
#if hl
|
||||
var songPath = "data/sound/music";
|
||||
#end
|
||||
#if js
|
||||
var songPath = "sound/music";
|
||||
#end
|
||||
var songFiles = ResourceLoader.fileSystem.dir(songPath);
|
||||
var songList = songFiles.map(x -> StringTools.replace(x.name, ".ogg", ""));
|
||||
|
||||
var playing:Bool = !AudioManager.currentMusicPaused;
|
||||
var selectedIdx:Int = 0;
|
||||
|
||||
var currentPlayingSong = StringTools.replace(AudioManager.currentMusicName, ".ogg", "");
|
||||
selectedIdx = songList.indexOf(currentPlayingSong);
|
||||
|
||||
var songTitle = new GuiMLText(markerFelt24, null);
|
||||
songTitle.position = new Vector(61, 262);
|
||||
songTitle.extent = new Vector(416, 22);
|
||||
songTitle.text.dropShadow = {
|
||||
dx: 1 * Settings.uiScale,
|
||||
dy: 1 * Settings.uiScale,
|
||||
alpha: 0.5,
|
||||
color: 0
|
||||
};
|
||||
songTitle.text.textColor = 0xFFFFFF;
|
||||
songTitle.text.text = '<p align="center">Title: ${songList[selectedIdx]}</p>';
|
||||
this.addChild(songTitle);
|
||||
|
||||
var songStatus = new GuiMLText(markerFelt24, null);
|
||||
songStatus.position = new Vector(56, 283);
|
||||
songStatus.extent = new Vector(421, 22);
|
||||
songStatus.text.dropShadow = {
|
||||
dx: 1 * Settings.uiScale,
|
||||
dy: 1 * Settings.uiScale,
|
||||
alpha: 0.5,
|
||||
color: 0
|
||||
};
|
||||
songStatus.text.textColor = 0xFFFFFF;
|
||||
songStatus.text.text = '<p align="center">${playing ? "Playing" : "Stopped"}</p>';
|
||||
this.addChild(songStatus);
|
||||
|
||||
var scroll = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
scroll.position = new Vector(51, 39);
|
||||
scroll.extent = new Vector(439, 216);
|
||||
scroll.childrenHandleScroll = true;
|
||||
this.addChild(scroll);
|
||||
|
||||
var songCtrl = new GuiTextListCtrl(markerFelt24, songList);
|
||||
songCtrl.position = new Vector(0, 0);
|
||||
songCtrl.extent = new Vector(423, 456);
|
||||
songCtrl.scrollable = true;
|
||||
songCtrl.textYOffset = -6;
|
||||
songCtrl.selectedColor = 0;
|
||||
songCtrl._prevSelected = selectedIdx;
|
||||
scroll.addChild(songCtrl);
|
||||
scroll.setScrollMax(songCtrl.calculateFullHeight());
|
||||
|
||||
function setCurrentSong(idx:Int) {
|
||||
selectedIdx = idx;
|
||||
songCtrl._prevSelected = idx;
|
||||
songTitle.text.text = '<p align="center">Title: ${songList[idx]}</p>';
|
||||
songCtrl.redrawSelectionRect(songCtrl.getHitTestRect());
|
||||
|
||||
if (playing) {
|
||||
songFiles[idx].load(() -> {
|
||||
var audiores = ResourceLoader.getAudio(songFiles[idx].path).resource;
|
||||
AudioManager.playMusic(audiores, songList[idx]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
songCtrl.onSelectedFunc = (idx) -> {
|
||||
setCurrentSong(idx);
|
||||
};
|
||||
|
||||
var stopBtn = new GuiButton(loadButtonImages("data/ui/jukebox/stop"));
|
||||
stopBtn.position = new Vector(219, 306);
|
||||
stopBtn.extent = new Vector(96, 45);
|
||||
this.addChild(stopBtn);
|
||||
|
||||
var playBtn = new GuiButton(loadButtonImages("data/ui/jukebox/play"));
|
||||
playBtn.position = new Vector(219, 306);
|
||||
playBtn.extent = new Vector(96, 45);
|
||||
|
||||
stopBtn.pressedAction = (e) -> {
|
||||
this.removeChild(stopBtn);
|
||||
this.addChild(playBtn);
|
||||
playBtn.render(MarbleGame.canvas.scene2d, @:privateAccess playBtn.parent._flow);
|
||||
playing = false;
|
||||
songStatus.text.text = '<p align="center">${playing ? "Playing" : "Stopped"}</p>';
|
||||
AudioManager.pauseMusic(true);
|
||||
};
|
||||
|
||||
playBtn.pressedAction = (e) -> {
|
||||
this.removeChild(playBtn);
|
||||
this.addChild(stopBtn);
|
||||
stopBtn.render(MarbleGame.canvas.scene2d, @:privateAccess stopBtn.parent._flow);
|
||||
playing = true;
|
||||
songStatus.text.text = '<p align="center">${playing ? "Playing" : "Stopped"}</p>';
|
||||
if (AudioManager.currentMusicName != songList[selectedIdx]) {
|
||||
songFiles[selectedIdx].load(() -> {
|
||||
var audiores = ResourceLoader.getAudio(songFiles[selectedIdx].path).resource;
|
||||
AudioManager.playMusic(audiores, songList[selectedIdx]);
|
||||
});
|
||||
} else {
|
||||
AudioManager.pauseMusic(false);
|
||||
}
|
||||
};
|
||||
|
||||
var prevBtn = new GuiButton(loadButtonImages("data/ui/play/prev"));
|
||||
prevBtn.position = new Vector(145, 307);
|
||||
prevBtn.extent = new Vector(72, 43);
|
||||
prevBtn.pressedAction = (e) -> {
|
||||
if (selectedIdx >= 1) {
|
||||
setCurrentSong(selectedIdx - 1);
|
||||
} else {
|
||||
setCurrentSong(songList.length - 1);
|
||||
}
|
||||
}
|
||||
this.addChild(prevBtn);
|
||||
|
||||
var nextBtn = new GuiButton(loadButtonImages("data/ui/play/next"));
|
||||
nextBtn.position = new Vector(317, 307);
|
||||
nextBtn.extent = new Vector(72, 43);
|
||||
nextBtn.pressedAction = (e) -> {
|
||||
if (selectedIdx < songList.length - 1) {
|
||||
setCurrentSong(selectedIdx + 1);
|
||||
} else {
|
||||
setCurrentSong(0);
|
||||
}
|
||||
}
|
||||
this.addChild(nextBtn);
|
||||
|
||||
var closeBtn = new GuiButton(loadButtonImages("data/ui/jukebox/close"));
|
||||
closeBtn.position = new Vector(47, 307);
|
||||
closeBtn.extent = new Vector(94, 45);
|
||||
closeBtn.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
}
|
||||
this.addChild(closeBtn);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,709 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import h2d.filter.DropShadow;
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.prim.Polygon;
|
||||
import h3d.scene.Mesh;
|
||||
import h3d.shader.AlphaChannel;
|
||||
import src.MarbleGame;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.DtsObject;
|
||||
import src.Settings;
|
||||
import src.ResourceLoaderWorker;
|
||||
|
||||
class MarbleSelectGui extends GuiImage {
|
||||
public static var marbleData = [
|
||||
[
|
||||
{
|
||||
name: "Staff's Original",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "3D Marble",
|
||||
dts: "data/shapes/balls/3dMarble.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Mid P",
|
||||
dts: "data/shapes/balls/midp.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Spade",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin4",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "GMD Logo",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin5",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Textured Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin6",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Golden Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin7",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Rainbow Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin8",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Brown Swirls",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin9",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Caution Stripes",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin10",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Earth",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin11",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Golf Ball",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin12",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Jupiter",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin13",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "MB Gold Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin14",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "MBP on the Marble!",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin15",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Moshe",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin16",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Strong Bad",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin17",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Venus",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin18",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Water",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin19",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Evil Eye",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin20",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Desert and Sky",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin21",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Dirt Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin22",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Friction Textured Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin23",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Grass",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin24",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Mars",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin25",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Phil's Golf Ball",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin26",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Molten",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin27",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Lightning",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin28",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Phil'sEmpire",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin29",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Matan's Red Dragon",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin30",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Metallic Marble",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin31",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Sun",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin32",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Underwater",
|
||||
dts: "data/shapes/balls/ball-superball.dts",
|
||||
skin: "skin33",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "GarageGames logo",
|
||||
dts: "data/shapes/balls/garageGames.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Big Marble 1",
|
||||
dts: "data/shapes/balls/bm1.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Big Marble 2",
|
||||
dts: "data/shapes/balls/bm2.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Big Marble 3",
|
||||
dts: "data/shapes/balls/bm3.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Small Marble 1",
|
||||
dts: "data/shapes/balls/sm1.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Small Marble 2",
|
||||
dts: "data/shapes/balls/sm2.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Small Marble 3",
|
||||
dts: "data/shapes/balls/sm3.dts",
|
||||
skin: "base",
|
||||
shader: "Default"
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
name: "Deep Blue",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin1",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Blood Red",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin2",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Gang Green",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin6",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Pink Candy",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin27",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Chocolate",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin5",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Grape",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin4",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Lemon",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin28",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Lime Green",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin8",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Blueberry",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin7",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Tangerine",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin3",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "8 Ball",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin9",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Ace of Hearts",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin22",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Football",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin16",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "9 Ball",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin29",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Ace of Spades",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin24",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "GarageGames",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin10",
|
||||
shader: "ClassicMarb2"
|
||||
},
|
||||
{
|
||||
name: "Bob",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin30",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Skully",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin18",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Jack-o-Lantern",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin34",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Walled Up",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin25",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Sunny Side Up",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin11",
|
||||
shader: "ClassicMetal"
|
||||
},
|
||||
{
|
||||
name: "Lunar",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin31",
|
||||
shader: "ClassicMetal"
|
||||
},
|
||||
{
|
||||
name: "Battery",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin14",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Static",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin32",
|
||||
shader: "ClassicMarb2"
|
||||
},
|
||||
{
|
||||
name: "Earth",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin20",
|
||||
shader: "ClassicMarbGlass20"
|
||||
},
|
||||
{
|
||||
name: "Red and X",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin13",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Orange Spiral",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin12",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Blue Spiral",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin15",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "Sliced Marble",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin21",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Orange Checkers",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin19",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Torque",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin33",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Fred",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin17",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Pirate",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin26",
|
||||
shader: "ClassicMarbGlass18"
|
||||
},
|
||||
{
|
||||
name: "Shuriken",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin23",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "Eyeball",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin35",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Woody",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin36",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Dat Nostalgia",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin37",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Graffiti",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin38",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Asteroid",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin39",
|
||||
shader: "Default"
|
||||
},
|
||||
{
|
||||
name: "Disco Ball",
|
||||
dts: "data/shapes/balls/pack1/pack1marble.dts",
|
||||
skin: "uskin40",
|
||||
shader: "Default"
|
||||
}
|
||||
],
|
||||
];
|
||||
|
||||
public function new() {
|
||||
var img = ResourceLoader.getImage("data/ui/marbleSelect/marbleSelect.png");
|
||||
super(img.resource.toTile());
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(73, -59);
|
||||
this.extent = new Vector(493, 361);
|
||||
|
||||
var categoryNames = ["Official Marbles", "MBUltra"];
|
||||
|
||||
var curSelection:Int = Settings.optionsSettings.marbleIndex;
|
||||
var curCategorySelection:Int = Settings.optionsSettings.marbleCategoryIndex;
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed, disabled];
|
||||
}
|
||||
|
||||
var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt");
|
||||
var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry);
|
||||
@:privateAccess markerFelt32b.loader = ResourceLoader.loader;
|
||||
var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt24 = markerFelt32b.toSdfFont(cast 18 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt28 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||
|
||||
var selectBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/select"));
|
||||
selectBtn.horizSizing = Center;
|
||||
selectBtn.vertSizing = Top;
|
||||
selectBtn.position = new Vector(199, 270);
|
||||
selectBtn.extent = new Vector(95, 45);
|
||||
selectBtn.pressedAction = (e) -> {
|
||||
Settings.optionsSettings.marbleIndex = curSelection;
|
||||
Settings.optionsSettings.marbleCategoryIndex = curCategorySelection;
|
||||
Settings.optionsSettings.marbleSkin = marbleData[curCategorySelection][curSelection].skin;
|
||||
Settings.optionsSettings.marbleModel = marbleData[curCategorySelection][curSelection].dts;
|
||||
Settings.optionsSettings.marbleShader = marbleData[curCategorySelection][curSelection].shader;
|
||||
Settings.save();
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
}
|
||||
this.addChild(selectBtn);
|
||||
|
||||
var marbleShow = buildObjectShow(marbleData[curCategorySelection][curSelection].dts, new Vector(171, 97), new Vector(150, 150), 2.6, 0,
|
||||
["base.marble" => marbleData[curCategorySelection][curSelection].skin + ".marble"]);
|
||||
marbleShow.horizSizing = Center;
|
||||
marbleShow.vertSizing = Bottom;
|
||||
marbleShow.visible = true;
|
||||
this.addChild(marbleShow);
|
||||
|
||||
var titleText = new GuiMLText(markerFelt28, null);
|
||||
titleText.text.textColor = 0xFFFFFF;
|
||||
titleText.text.dropShadow = {
|
||||
dx: 1 * Settings.uiScale,
|
||||
dy: 1 * Settings.uiScale,
|
||||
alpha: 0.5,
|
||||
color: 0
|
||||
};
|
||||
titleText.horizSizing = Center;
|
||||
titleText.vertSizing = Bottom;
|
||||
titleText.position = new Vector(140, 67);
|
||||
titleText.extent = new Vector(213, 27);
|
||||
titleText.text.text = '<p align="center">${categoryNames[curCategorySelection]}</p>';
|
||||
this.addChild(titleText);
|
||||
|
||||
var marbleText = new GuiMLText(markerFelt24, null);
|
||||
marbleText.text.textColor = 0xFFFFFF;
|
||||
marbleText.text.dropShadow = {
|
||||
dx: 1 * Settings.uiScale,
|
||||
dy: 1 * Settings.uiScale,
|
||||
alpha: 0.5,
|
||||
color: 0
|
||||
};
|
||||
marbleText.horizSizing = Center;
|
||||
marbleText.vertSizing = Bottom;
|
||||
marbleText.position = new Vector(86, 243);
|
||||
marbleText.extent = new Vector(320, 22);
|
||||
marbleText.text.text = '<p align="center">${marbleData[curCategorySelection][curSelection].name}</p>';
|
||||
this.addChild(marbleText);
|
||||
|
||||
var changeMarbleText = new GuiImage(ResourceLoader.getResource("data/ui/play/change_marble_text.png", ResourceLoader.getImage, this.imageResources)
|
||||
.toTile());
|
||||
changeMarbleText.horizSizing = Center;
|
||||
changeMarbleText.position = new Vector(96, 26);
|
||||
changeMarbleText.extent = new Vector(300, 39);
|
||||
this.addChild(changeMarbleText);
|
||||
|
||||
function setMarbleSelection(idx:Int, categoryIdx:Int) {
|
||||
if (categoryIdx < 0)
|
||||
categoryIdx = marbleData.length + categoryIdx;
|
||||
if (categoryIdx >= marbleData.length)
|
||||
categoryIdx -= marbleData.length;
|
||||
|
||||
if (idx < 0)
|
||||
idx = marbleData[categoryIdx].length + idx;
|
||||
if (idx >= marbleData[categoryIdx].length)
|
||||
idx -= marbleData[categoryIdx].length;
|
||||
curSelection = idx;
|
||||
curCategorySelection = categoryIdx;
|
||||
var marble = marbleData[categoryIdx][idx];
|
||||
|
||||
titleText.text.text = '<p align="center">${categoryNames[curCategorySelection]}</p>';
|
||||
marbleText.text.text = '<p align="center">${marble.name}</p>';
|
||||
|
||||
var dtsObj = new DtsObject();
|
||||
dtsObj.dtsPath = marble.dts;
|
||||
dtsObj.ambientRotate = true;
|
||||
dtsObj.ambientSpinFactor /= -2;
|
||||
dtsObj.showSequences = false;
|
||||
dtsObj.useInstancing = false;
|
||||
dtsObj.matNameOverride.set("base.marble", marble.skin + ".marble");
|
||||
|
||||
ResourceLoader.load(dtsObj.dtsPath).entry.load(() -> {
|
||||
var dtsFile = ResourceLoader.loadDts(dtsObj.dtsPath);
|
||||
var directoryPath = haxe.io.Path.directory(dtsObj.dtsPath);
|
||||
var texToLoad = [];
|
||||
for (i in 0...dtsFile.resource.matNames.length) {
|
||||
var matName = dtsObj.matNameOverride.exists(dtsFile.resource.matNames[i]) ? dtsObj.matNameOverride.get(dtsFile.resource.matNames[i]) : dtsFile.resource.matNames[i];
|
||||
var fullNames = ResourceLoader.getFullNamesOf(directoryPath + '/' + matName).filter(x -> haxe.io.Path.extension(x) != "dts");
|
||||
var fullName = fullNames.length > 0 ? fullNames[0] : null;
|
||||
if (fullName != null) {
|
||||
texToLoad.push(fullName);
|
||||
}
|
||||
}
|
||||
|
||||
var worker = new ResourceLoaderWorker(() -> {
|
||||
dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway
|
||||
for (mat in dtsObj.materials) {
|
||||
mat.mainPass.enableLights = false;
|
||||
mat.mainPass.culling = None;
|
||||
if (mat.blendMode != Alpha && mat.blendMode != Add)
|
||||
mat.mainPass.addShader(new AlphaChannel());
|
||||
}
|
||||
marbleShow.changeObject(dtsObj);
|
||||
});
|
||||
|
||||
for (texPath in texToLoad) {
|
||||
worker.loadFile(texPath);
|
||||
}
|
||||
worker.run();
|
||||
});
|
||||
}
|
||||
|
||||
var nextBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/next"));
|
||||
nextBtn.position = new Vector(296, 270);
|
||||
nextBtn.extent = new Vector(75, 45);
|
||||
nextBtn.pressedAction = (e) -> {
|
||||
setMarbleSelection(curSelection + 1, curCategorySelection);
|
||||
}
|
||||
this.addChild(nextBtn);
|
||||
|
||||
var prevBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/prev"));
|
||||
prevBtn.position = new Vector(123, 270);
|
||||
prevBtn.extent = new Vector(75, 45);
|
||||
prevBtn.pressedAction = (e) -> {
|
||||
setMarbleSelection(curSelection - 1, curCategorySelection);
|
||||
}
|
||||
|
||||
var nextCategoryBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/nextcat"));
|
||||
nextCategoryBtn.position = new Vector(371, 270);
|
||||
nextCategoryBtn.extent = new Vector(85, 45);
|
||||
nextCategoryBtn.pressedAction = (e) -> {
|
||||
setMarbleSelection(0, curCategorySelection + 1);
|
||||
}
|
||||
this.addChild(nextCategoryBtn);
|
||||
|
||||
var prevCategoryBtn = new GuiButton(loadButtonImages("data/ui/marbleSelect/prevcat"));
|
||||
prevCategoryBtn.position = new Vector(37, 270);
|
||||
prevCategoryBtn.extent = new Vector(85, 45);
|
||||
prevCategoryBtn.pressedAction = (e) -> {
|
||||
setMarbleSelection(0, curCategorySelection - 1);
|
||||
}
|
||||
this.addChild(prevCategoryBtn);
|
||||
|
||||
setMarbleSelection(curSelection, curCategorySelection);
|
||||
this.addChild(prevBtn);
|
||||
}
|
||||
|
||||
function buildObjectShow(dtsPath:String, position:Vector, extent:Vector, dist:Float = 5, pitch:Float = 0, matnameOverride:Map<String, String> = null) {
|
||||
var oShow = new GuiObjectShow();
|
||||
var dtsObj = new DtsObject();
|
||||
dtsObj.dtsPath = dtsPath;
|
||||
dtsObj.ambientRotate = true;
|
||||
dtsObj.ambientSpinFactor /= -2;
|
||||
dtsObj.showSequences = false;
|
||||
dtsObj.useInstancing = false;
|
||||
if (matnameOverride != null) {
|
||||
for (key => value in matnameOverride) {
|
||||
dtsObj.matNameOverride.set(key, value);
|
||||
}
|
||||
}
|
||||
dtsObj.init(null, () -> {}); // The lambda is not gonna run async anyway
|
||||
for (mat in dtsObj.materials) {
|
||||
mat.mainPass.enableLights = false;
|
||||
mat.mainPass.culling = None;
|
||||
if (mat.blendMode != Alpha && mat.blendMode != Add)
|
||||
mat.mainPass.addShader(new AlphaChannel());
|
||||
}
|
||||
oShow.sceneObject = dtsObj;
|
||||
oShow.position = position;
|
||||
oShow.extent = extent;
|
||||
oShow.renderDistance = dist;
|
||||
oShow.renderPitch = pitch;
|
||||
return oShow;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,180 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.Settings;
|
||||
import src.MarbleGame;
|
||||
|
||||
class OOBInsultGui extends GuiImage {
|
||||
public function new(title:String, text:String) {
|
||||
var img = ResourceLoader.getImage("data/ui/marbleSelect/marbleSelect.png");
|
||||
super(img.resource.toTile());
|
||||
|
||||
MarbleGame.instance.world.setCursorLock(false);
|
||||
MarbleGame.instance.paused = true;
|
||||
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(98, 69);
|
||||
this.extent = new Vector(444, 341);
|
||||
|
||||
var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt");
|
||||
var domcasual32b = new BitmapFont(domcasual32fontdata.entry);
|
||||
@:privateAccess domcasual32b.loader = ResourceLoader.loader;
|
||||
var domcasual32 = domcasual32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||
var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel);
|
||||
var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel);
|
||||
|
||||
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);
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed, disabled];
|
||||
}
|
||||
|
||||
var titleText = new GuiMLText(domcasual24, null);
|
||||
titleText.horizSizing = Center;
|
||||
titleText.position = new Vector(35, 39);
|
||||
titleText.extent = new Vector(374, 25);
|
||||
titleText.text.textColor = 0;
|
||||
titleText.text.text = '<p align="center">${title}</p>';
|
||||
this.addChild(titleText);
|
||||
|
||||
var contentText = new GuiMLText(arial14, null);
|
||||
contentText.horizSizing = Center;
|
||||
contentText.position = new Vector(33, 66);
|
||||
contentText.extent = new Vector(377, 350);
|
||||
contentText.text.textColor = 0;
|
||||
contentText.text.text = text;
|
||||
this.addChild(contentText);
|
||||
|
||||
var okBtn = new GuiButton(loadButtonImages("data/ui/motd/ok"));
|
||||
okBtn.position = new Vector(179, 254);
|
||||
okBtn.extent = new Vector(88, 41);
|
||||
okBtn.vertSizing = Top;
|
||||
okBtn.pressedAction = (e) -> {
|
||||
MarbleGame.instance.paused = false;
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
MarbleGame.instance.world.setCursorLock(true);
|
||||
}
|
||||
this.addChild(okBtn);
|
||||
}
|
||||
|
||||
public static function OOBCheck() {
|
||||
var oobMsgs = [
|
||||
"Let\'s be clear of the blatant truth: You suck!",
|
||||
"Honestly, do you have any control over the marble? It seems to have a life on its own...",
|
||||
"Are you sure you know how to play Marble Blast?",
|
||||
"I really hope you\'re seeing this message on Manic Bounce right now. If you\'re not, man do YOU have some practicing to do.",
|
||||
"Look at the bright side, it\'s part of the learning experience, but it doesn\'t change the fact that you still suck.",
|
||||
"If we ever had a \'You suck\' achievement, you\'d be having the honour to wear it today.",
|
||||
"200 more times to go Out of Bounds before you see this message again. For your sake, try and do better.",
|
||||
"\"I didn\'t play on the computer! It...it was.. my auntie!\" Yeah, right. Admit it, you suck.",
|
||||
"Are you having fun going Out of Bounds all the time? It seriously looks like it.",
|
||||
"Don\'t you just hate all these messages that make a mockery of your suckiness? It\'s a joke of course, but it\'s a nice easter egg.\nIf you don\'t want to see them anymore, then stop going Out of Bounds so many times!",
|
||||
"My grandmother is better than you!",
|
||||
"We\'ll see what happens first: You finishing the level, or the clock hitting the 100 minute mark.",
|
||||
"Can we put this on the video show? I mean, that was absolutely stupid of you to go Out of Bounds like that!",
|
||||
"While we\'re on the subject of you going Out of Bounds, you should try and find out all the possible ways to go Out of Bounds, including the stupid ways which you seem to excel in.",
|
||||
"This level isn\'t made out completely out of tiny thin tightropes! You have no excuse whatsoever on failing this badly. If you see this message on Tightropes, Under Construction, Catwalks, or Slopwropes, ignore it. Instead, change it to \"HAHAHA!\"",
|
||||
"Excuse of the Day: \"I was pushed Out of Bounds by an invisible Mega Marble!\"",
|
||||
"Congratulations, you win--- wait, no, no you don\'t. You went Out of Bounds. Sorry, you lose. Again.",
|
||||
"I found a way for you not to go Out of Bounds. We\'ll change the shape of the marble to a cube. Wait, never mind, you\'ll still find a way, because you can.",
|
||||
"You sure you played the beginner levels? You did? Doesn\'t look like it.",
|
||||
"You know what would be hilarious? This message popping up on \'Training Wheels\'. I hope you aren\'t playing that level right now... are you?",
|
||||
"Mind if we\'ll change your name to \'Mr. McFail?\'",
|
||||
"Excuse of the Day: \"But I was distracted by ________ and he/she/it wouldn\'t stop and forced me to go Out of Bounds.\"",
|
||||
"Which one are you: a bad player or a bad player? We willl go with option C: a really bad player.",
|
||||
"Excuse of the Day: WHO PUT THAT GRAVITY MODIFIER IN THERE??!?!",
|
||||
"Excuse of the Day: That In Bounds Trigger WAS NOT in the level last time I played it! Somebody hacked the level and put one in there!",
|
||||
"Excuse of the Day: My awesome marble was abducted by aliens and was replaced by a really crap one!",
|
||||
"Excuse of the Day: That Out of Bounds trigger was NOT there before! I swear!",
|
||||
"Excuse of the Day: I\'m not Xelna :(",
|
||||
"Excuse of the Day: I don\'t suck, I fell off because I wanted to get to the next 200 Out of Bounds multiplier so I can see the awesome messages that are written down.",
|
||||
"You know, you won\'t beat the level if you keep falling off. You will, however, see more of these messages. Try and stay on the level next time. Our guess is that you can\'t, because you\'re bad.",
|
||||
"Look at the statistics page! I bet you fell more times than the amount of levels you beat!",
|
||||
"Excuse of the Day: I\'m learning to play... the hard way.",
|
||||
"Apparently your marble isn\'t supermarble. It is suckmarble.",
|
||||
"Foo-Foo Marble laughs at how bad you are.",
|
||||
"A Rock Can Do Better!",
|
||||
"Please, Quit Embarrassing Yourself.",
|
||||
"Keep this up and you\'ll win the \'Award of LOL\', courtesy of Marble Blast Fubar creators!",
|
||||
"Marble Blast Fubar creators would like to give you the title of \'Official NOOB of the Year\'. Congratulations!",
|
||||
"Did you hear that \'Practice Makes Perfect\'? Apparently not.",
|
||||
"You should create a new level and title it \'Learn the In Bounds and Out of Bounds Triggers\' because you\'re so experienced with them.",
|
||||
"We\'ve seen the ways you fell while playing this game and we gotta admit, some of their are epic fails. We still can\'t stop laughing!",
|
||||
"SING WITH ME:\n\nOne hundred and ninety nine times Out of Bounds, one hundred and ninety nine times Out of Bounds, throw the marble off the level, two hundred times Out of Bounds!",
|
||||
"*sigh*, you just can\'t stop yourself from going Out of Bounds, can you?",
|
||||
"Excuse of the Day: I\'m playing one of those special levels from Technostick where you must fall off in order to beat them.",
|
||||
"Excuse of the Day: I\'m under bad karma today.",
|
||||
"Excuse of the Day: So THAT\'S what my astrologist referred to when he said I\'ll keep falling off today.",
|
||||
"What do you have against the marble that you keep making it fall off the level?!",
|
||||
"I bet having a Blast powerup would have really helped you there, no? Well, too bad! \nOh, and if you\'re playing an Ultra level, pretend this message says \"HAHAHA!\" instead.",
|
||||
"And how is it OUR fault that you\'re playing so badly?",
|
||||
"Do you ever think about the marble\'s safety when you\'re playing? Apparently not because you\'re really careless with it."
|
||||
];
|
||||
|
||||
var oobSpecial = [
|
||||
"You went Out of Bounds for 1,250 times. This program will now sit in the corner and cry about how bad you are and hope that when you open it again you won\'t repeat it. False hopes are still hopes.",
|
||||
"You went Out of Bounds for 2,500 times. If you aren\'t tired of going Out of Bounds all the time, we sure did. Stop it already!",
|
||||
"Another 1,250 marbles had fallen to the great sea below, and you\'ve reached the 3,750 Out of Bounds mark. You definitely suck. Ah yes, greenpeace would like to see you in court for your \"contribution\" to rising sea levels.",
|
||||
"If I had a nickel for every marble that fell Out of Bounds I\'d be rich right now and all thanks to you. However, I\'m not going to give you any money. Instead, I\'ll stick my tongue out at you and then laugh at you. Ah yes, congratulations on hitting the 5,000 Out of Bounds mark.",
|
||||
"6,750 times Out of Bounds. Let\'s assume, hypothetically, that you won\'t go Out of Bounds ever again. Actually, never mind that, you will still suck even if you don\'t go Out of Bounds again.",
|
||||
"I have an awesome gut feeling that you are going 7,500 times Out of Bounds on purpose if only to see these messages and to hear about how bad you are.\nWell then, I won\'t keep it away from you.\nYou suck!",
|
||||
"8,750 times Out of Bounds. For reaching this landmark, I\'m giving you a nice Australian Slang sentence to answer the question: Will you ever stop sucking in this game and go Out of Bounds? Answer:\nTill it rains in Marble Bar\n\n\nIn your language it means:\nNever.",
|
||||
"Wow, you truly are bad, probably one of the worst Marble Blast players to ever live on this planet. Or you just keep failing to good runs. Are you sure you aren\'t playing an easy level while this message pops up? Whatever, those messages will now repeat themselves (with a few exceptions), but for now, please remember this:\n\n\nYOU suck!",
|
||||
"SING WITH ME:\n\nForty nine thousand nine hundred and ninety nine times Out of Bounds, forty nine thousand nine hundred and ninety nine times Out of Bounds, knock a marble off the level, fifty thousand times Out of Bounds!",
|
||||
"What\'s that in the sky? Is it a plane? Is it a bird? No! It\'s the marble! And it\'s way off the level!!! Congratulations on hitting 300,000 Out of Bounds mark. You may now suck more.",
|
||||
"1,000,000 times Out of Bounds?!?! You seriously love this game, don\'t you? Well then, thanks for playing Marble Blast Platinum! Please keep this bad playing up and continue to go Out of Bounds. We\'ll just laugh at how bad you are. Also, this is the final message as from now on they\'re all repeats. Thank you for sucking at Marble Blast Platinum!",
|
||||
"You have no life. This is official."
|
||||
];
|
||||
|
||||
var oobMsg = "";
|
||||
var oobTitle = "Out of Bounds";
|
||||
|
||||
switch (Settings.playStatistics.oobs) {
|
||||
case 1250:
|
||||
oobMsg = oobSpecial[0];
|
||||
case 2500:
|
||||
oobMsg = oobSpecial[1];
|
||||
case 3750:
|
||||
oobMsg = oobSpecial[2];
|
||||
case 5000:
|
||||
oobMsg = oobSpecial[3];
|
||||
case 6250:
|
||||
oobMsg = oobSpecial[4];
|
||||
case 7500:
|
||||
oobMsg = oobSpecial[5];
|
||||
case 8750:
|
||||
oobMsg = oobSpecial[6];
|
||||
case 10000:
|
||||
oobMsg = oobSpecial[7];
|
||||
case 50000:
|
||||
oobMsg = oobSpecial[8];
|
||||
case 300000:
|
||||
oobMsg = oobSpecial[9];
|
||||
case 1000000:
|
||||
oobMsg = oobSpecial[10];
|
||||
case 30000000:
|
||||
oobMsg = oobSpecial[11];
|
||||
}
|
||||
|
||||
if (oobMsg == "") {
|
||||
if (Settings.playStatistics.oobs != 0 && Settings.playStatistics.oobs % 200 == 0) {
|
||||
oobTitle = 'Out of Bounds ${Settings.playStatistics.oobs} times';
|
||||
oobMsg = oobMsgs[Math.floor(Math.random() * oobMsgs.length)];
|
||||
}
|
||||
}
|
||||
|
||||
if (oobMsg != "") {
|
||||
MarbleGame.canvas.pushDialog(new OOBInsultGui(oobTitle, oobMsg));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,104 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import src.MarbleGame;
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.Settings;
|
||||
|
||||
class ReplayNameDlg extends GuiControl {
|
||||
public function new(callback:Void->Void) {
|
||||
super();
|
||||
var text = "Enter a name for the recording";
|
||||
this.horizSizing = Width;
|
||||
this.vertSizing = Height;
|
||||
this.position = new Vector();
|
||||
this.extent = new Vector(640, 480);
|
||||
|
||||
var domcasual24fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt");
|
||||
var domcasual24b = new BitmapFont(domcasual24fontdata.entry);
|
||||
@:privateAccess domcasual24b.loader = ResourceLoader.loader;
|
||||
var domcasual24 = domcasual24b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel);
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed];
|
||||
}
|
||||
|
||||
var yesNoFrame = new GuiImage(ResourceLoader.getResource("data/ui/common/dialog.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
yesNoFrame.horizSizing = Center;
|
||||
yesNoFrame.vertSizing = Center;
|
||||
yesNoFrame.position = new Vector(187, 156);
|
||||
yesNoFrame.extent = new Vector(300, 191);
|
||||
this.addChild(yesNoFrame);
|
||||
|
||||
var yesNoText = new GuiMLText(domcasual24, null);
|
||||
yesNoText.position = new Vector(33, 26);
|
||||
yesNoText.horizSizing = Center;
|
||||
yesNoText.extent = new Vector(198, 23);
|
||||
yesNoText.text.text = text;
|
||||
yesNoText.text.textColor = 0;
|
||||
yesNoText.text.maxWidth = 198;
|
||||
yesNoFrame.addChild(yesNoText);
|
||||
|
||||
var textFrame = new GuiImage(ResourceLoader.getResource("data/ui/endgame/window.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
textFrame.position = new Vector(33, 67);
|
||||
textFrame.extent = new Vector(232, 40);
|
||||
textFrame.horizSizing = Center;
|
||||
yesNoFrame.addChild(textFrame);
|
||||
|
||||
var textInput = new GuiTextInput(domcasual24);
|
||||
textInput.position = new Vector(6, 5);
|
||||
textInput.extent = new Vector(216, 40);
|
||||
textInput.horizSizing = Width;
|
||||
textInput.vertSizing = Height;
|
||||
textInput.text.textColor = 0;
|
||||
textInput.text.selectionColor.setColor(0xFFFFFFFF);
|
||||
textInput.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(textInput.text.font.lineHeight));
|
||||
textFrame.addChild(textInput);
|
||||
|
||||
textInput.text.text = MarbleGame.instance.world.mission.title;
|
||||
if (MarbleGame.instance.world.finishTime == null) {
|
||||
textInput.text.text += " Unfinished Run";
|
||||
} else {
|
||||
textInput.text.text += " " + MarbleGame.instance.world.finishTime.gameplayClock;
|
||||
}
|
||||
|
||||
var yesButton = new GuiButton(loadButtonImages("data/ui/common/ok"));
|
||||
yesButton.position = new Vector(171, 124);
|
||||
yesButton.extent = new Vector(95, 45);
|
||||
yesButton.vertSizing = Top;
|
||||
yesButton.accelerator = hxd.Key.ENTER;
|
||||
yesButton.gamepadAccelerator = ["A"];
|
||||
yesButton.pressedAction = (sender) -> {
|
||||
if (StringTools.trim(textInput.text.text) != "") {
|
||||
MarbleGame.instance.recordingName = textInput.text.text;
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
MarbleGame.instance.world.saveReplay();
|
||||
callback();
|
||||
}
|
||||
}
|
||||
yesNoFrame.addChild(yesButton);
|
||||
|
||||
var noButton = new GuiButton(loadButtonImages("data/ui/common/cancel"));
|
||||
noButton.position = new Vector(44, 124);
|
||||
noButton.extent = new Vector(88, 41);
|
||||
noButton.vertSizing = Top;
|
||||
noButton.accelerator = hxd.Key.ESCAPE;
|
||||
noButton.gamepadAccelerator = ["B"];
|
||||
noButton.pressedAction = (sender) -> {
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
callback();
|
||||
}
|
||||
yesNoFrame.addChild(noButton);
|
||||
|
||||
if (yesNoText.text.getBounds().yMax > yesNoText.extent.y) {
|
||||
var diff = yesNoText.text.getBounds().yMax - yesNoText.extent.y;
|
||||
yesNoFrame.extent.y += diff;
|
||||
yesButton.position.y += diff;
|
||||
noButton.position.y += diff;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,272 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import src.Marbleland;
|
||||
import h2d.Tile;
|
||||
import hxd.BitmapData;
|
||||
import src.MarbleGame;
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.Settings;
|
||||
import src.MissionList;
|
||||
|
||||
class SearchGui extends GuiImage {
|
||||
public function new(game:String, isCustom:Bool) {
|
||||
var img = ResourceLoader.getImage("data/ui/search/window.png");
|
||||
super(img.resource.toTile());
|
||||
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(76, 8);
|
||||
this.extent = new Vector(487, 463);
|
||||
|
||||
var missionList = [];
|
||||
if (!isCustom) {
|
||||
for (diff in MissionList.missionList[game]) {
|
||||
for (mis in diff) {
|
||||
missionList.push({
|
||||
mis: mis,
|
||||
name: mis.title,
|
||||
artist: mis.artist,
|
||||
path: mis.path
|
||||
});
|
||||
}
|
||||
}
|
||||
} else {
|
||||
var customsList = switch (game) {
|
||||
case 'gold':
|
||||
Marbleland.goldMissions;
|
||||
case 'platinum':
|
||||
Marbleland.platinumMissions;
|
||||
case 'ultra':
|
||||
Marbleland.ultraMissions;
|
||||
default:
|
||||
MissionList.customMissions;
|
||||
};
|
||||
for (mis in customsList) {
|
||||
missionList.push({
|
||||
mis: mis,
|
||||
name: mis.title,
|
||||
artist: mis.artist,
|
||||
path: mis.path
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
var displayList = missionList.map(x -> x.name);
|
||||
displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1));
|
||||
missionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1));
|
||||
var retrieveMissionList = missionList;
|
||||
|
||||
var searchMissionList:GuiTextListCtrl = null;
|
||||
var scrollCtrl:GuiScrollCtrl = null;
|
||||
|
||||
var currentSortBy = "title";
|
||||
|
||||
function sortBy(type:String, txt:String = "") {
|
||||
if (type == "title") {
|
||||
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.name.toLowerCase(), txt.toLowerCase()));
|
||||
displayList = retrieveMissionList.map(x -> x.name);
|
||||
displayList.sort((x, y) -> (x > y) ? 1 : (x == y ? 0 : -1));
|
||||
retrieveMissionList.sort((x, y) -> x.name > y.name ? 1 : (x.name == y.name ? 0 : -1));
|
||||
}
|
||||
if (type == "artist") {
|
||||
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.artist.toLowerCase(), txt.toLowerCase()));
|
||||
retrieveMissionList.sort((x, y) -> x.artist > y.artist ? 1 : (x.artist == y.artist ? 0 : -1));
|
||||
displayList = retrieveMissionList.map(x -> '${x.name} By ${x.artist}');
|
||||
}
|
||||
if (type == "file") {
|
||||
retrieveMissionList = missionList.filter(x -> StringTools.contains(x.path.toLowerCase(), txt.toLowerCase()));
|
||||
retrieveMissionList.sort((x, y) -> x.path > y.path ? 1 : (x.path == y.path ? 0 : -1));
|
||||
var idxofslash = 0;
|
||||
displayList = retrieveMissionList.map(x -> {
|
||||
var idxofslash = 0;
|
||||
var slashcount = 0;
|
||||
for (i in 0...x.path.length) {
|
||||
if (x.path.charCodeAt(x.path.length - i - 1) == '/'.code) {
|
||||
slashcount++;
|
||||
if (slashcount == 2) {
|
||||
idxofslash = x.path.length - i - 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return '${x.path.substr(idxofslash + 1)}';
|
||||
});
|
||||
}
|
||||
searchMissionList.setTexts(displayList);
|
||||
scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight());
|
||||
}
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var disabledObj = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources);
|
||||
var disabled = disabledObj != null ? disabledObj.toTile() : null;
|
||||
return [normal, hover, pressed, disabled];
|
||||
}
|
||||
|
||||
var markerFelt32fontdata = ResourceLoader.getFileEntry("data/font/MarkerFelt.fnt");
|
||||
var markerFelt32b = new BitmapFont(markerFelt32fontdata.entry);
|
||||
@:privateAccess markerFelt32b.loader = ResourceLoader.loader;
|
||||
var markerFelt32 = markerFelt32b.toSdfFont(cast 26 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt24 = markerFelt32b.toSdfFont(cast 18 * Settings.uiScale, MultiChannel);
|
||||
var markerFelt18 = markerFelt32b.toSdfFont(cast 14 * 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 26 * Settings.uiScale, MultiChannel);
|
||||
var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel);
|
||||
var domcasual24 = domcasual32b.toSdfFont(cast 20 * Settings.uiScale, MultiChannel);
|
||||
|
||||
var searchCancel = new GuiButton(loadButtonImages("data/ui/search/cancel"));
|
||||
searchCancel.vertSizing = Top;
|
||||
searchCancel.position = new Vector(21, 395);
|
||||
searchCancel.extent = new Vector(94, 45);
|
||||
searchCancel.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
}
|
||||
this.addChild(searchCancel);
|
||||
|
||||
var selectedIdx:Int = -1;
|
||||
|
||||
var searchPlay = new GuiButton(loadButtonImages("data/ui/search/play"));
|
||||
searchPlay.position = new Vector(370, 395);
|
||||
searchPlay.extent = new Vector(94, 45);
|
||||
searchPlay.disabled = true;
|
||||
searchPlay.pressedAction = (e) -> {
|
||||
if (selectedIdx != -1) {
|
||||
var mis = retrieveMissionList[selectedIdx];
|
||||
cast(this.parent, Canvas).marbleGame.playMission(mis.mis);
|
||||
}
|
||||
}
|
||||
this.addChild(searchPlay);
|
||||
|
||||
var searchTitle = new GuiText(domcasual24);
|
||||
searchTitle.position = new Vector(52, 19);
|
||||
searchTitle.extent = new Vector(64, 25);
|
||||
searchTitle.text.textColor = 0x696969;
|
||||
searchTitle.text.text = "Title:";
|
||||
this.addChild(searchTitle);
|
||||
|
||||
var searchEdit = new GuiTextInput(domcasual24);
|
||||
searchEdit.text.textColor = 0;
|
||||
searchEdit.text.selectionColor.setColor(0xFFFFFFFF);
|
||||
searchEdit.text.selectionTile = h2d.Tile.fromColor(0x808080, 0, hxd.Math.ceil(searchEdit.text.font.lineHeight));
|
||||
searchEdit.position = new Vector(91, 19);
|
||||
searchEdit.extent = new Vector(373, 29);
|
||||
searchEdit.onTextChange = (txt) -> {
|
||||
sortBy(currentSortBy, txt);
|
||||
};
|
||||
this.addChild(searchEdit);
|
||||
|
||||
scrollCtrl = new GuiScrollCtrl(ResourceLoader.getResource("data/ui/common/philscroll.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
scrollCtrl.position = new Vector(19, 65);
|
||||
scrollCtrl.extent = new Vector(447, 317);
|
||||
scrollCtrl.childrenHandleScroll = true;
|
||||
this.addChild(scrollCtrl);
|
||||
|
||||
searchMissionList = new GuiTextListCtrl(markerFelt24, displayList);
|
||||
searchMissionList.selectedColor = 0;
|
||||
searchMissionList.horizSizing = Width;
|
||||
searchMissionList.position = new Vector(4, -1);
|
||||
searchMissionList.extent = new Vector(432, 2880);
|
||||
searchMissionList.textYOffset = -6;
|
||||
searchMissionList.scrollable = true;
|
||||
searchMissionList.onSelectedFunc = (sel) -> {
|
||||
selectedIdx = sel;
|
||||
if (retrieveMissionList.length <= selectedIdx || selectedIdx < 0) {
|
||||
searchPlay.disabled = true;
|
||||
} else {
|
||||
searchPlay.disabled = false;
|
||||
}
|
||||
}
|
||||
scrollCtrl.addChild(searchMissionList);
|
||||
scrollCtrl.setScrollMax(searchMissionList.calculateFullHeight());
|
||||
|
||||
var optionsPopup:GuiButton = null;
|
||||
|
||||
var searchOptions = new GuiButton(loadButtonImages("data/ui/search/options"));
|
||||
searchOptions.vertSizing = Top;
|
||||
searchOptions.horizSizing = Right;
|
||||
searchOptions.position = new Vector(121, 395);
|
||||
searchOptions.extent = new Vector(94, 45);
|
||||
searchOptions.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.pushDialog(optionsPopup);
|
||||
}
|
||||
this.addChild(searchOptions);
|
||||
|
||||
var temprev = new BitmapData(1, 1);
|
||||
temprev.setPixel(0, 0, 0);
|
||||
var tmpprevtile = Tile.fromBitmap(temprev);
|
||||
|
||||
optionsPopup = new GuiButton([tmpprevtile, tmpprevtile, tmpprevtile]);
|
||||
optionsPopup.horizSizing = Width;
|
||||
optionsPopup.vertSizing = Height;
|
||||
optionsPopup.position = new Vector(0, 0);
|
||||
optionsPopup.extent = new Vector(640, 480);
|
||||
optionsPopup.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.popDialog(optionsPopup, false);
|
||||
}
|
||||
|
||||
var optionsPopupInner = new GuiControl();
|
||||
optionsPopupInner.horizSizing = Center;
|
||||
optionsPopupInner.vertSizing = Center;
|
||||
optionsPopupInner.position = new Vector(80, 7);
|
||||
optionsPopupInner.extent = new Vector(480, 465);
|
||||
optionsPopup.addChild(optionsPopupInner);
|
||||
|
||||
var optionsBgR = ResourceLoader.getResource('data/ui/search/more.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
|
||||
var optionsBg = new GuiImage(optionsBgR);
|
||||
optionsBg.position = new Vector(0, 281);
|
||||
optionsBg.extent = new Vector(348, 148);
|
||||
optionsPopupInner.addChild(optionsBg);
|
||||
|
||||
var searchByFile = new GuiButton(loadButtonImages("data/ui/search/file"));
|
||||
searchByFile.buttonType = Radio;
|
||||
searchByFile.position = new Vector(229, 32);
|
||||
searchByFile.extent = new Vector(68, 45);
|
||||
searchByFile.pressedAction = (e) -> {
|
||||
searchTitle.text.text = "File:";
|
||||
currentSortBy = "file";
|
||||
sortBy("file");
|
||||
};
|
||||
optionsBg.addChild(searchByFile);
|
||||
|
||||
var searchByartist = new GuiButton(loadButtonImages("data/ui/search/artist"));
|
||||
searchByartist.buttonType = Radio;
|
||||
searchByartist.position = new Vector(159, 32);
|
||||
searchByartist.extent = new Vector(72, 45);
|
||||
searchByartist.pressedAction = (e) -> {
|
||||
searchTitle.text.text = "Artist:";
|
||||
currentSortBy = "artist";
|
||||
sortBy("artist");
|
||||
};
|
||||
optionsBg.addChild(searchByartist);
|
||||
|
||||
var searchByTitle = new GuiButton(loadButtonImages("data/ui/search/name"));
|
||||
searchByTitle.buttonType = Radio;
|
||||
searchByTitle.position = new Vector(92, 32);
|
||||
searchByTitle.extent = new Vector(68, 45);
|
||||
searchByTitle.pressed = true;
|
||||
searchByTitle.pressedAction = (e) -> {
|
||||
searchTitle.text.text = "Title:";
|
||||
currentSortBy = "title";
|
||||
sortBy("title");
|
||||
};
|
||||
optionsBg.addChild(searchByTitle);
|
||||
|
||||
var searchRandom = new GuiButton(loadButtonImages("data/ui/search/random"));
|
||||
searchRandom.vertSizing = Top;
|
||||
searchRandom.position = new Vector(44, 32);
|
||||
searchRandom.extent = new Vector(44, 44);
|
||||
searchRandom.pressedAction = (e) -> {
|
||||
var mis = missionList[Math.floor(Math.random() * missionList.length)];
|
||||
cast(this.parent, Canvas).marbleGame.playMission(mis.mis);
|
||||
}
|
||||
optionsBg.addChild(searchRandom);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,241 +0,0 @@
|
|||
package gui;
|
||||
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.MarbleGame;
|
||||
import src.Settings;
|
||||
import src.Settings.PlayStatistics;
|
||||
import src.Mission;
|
||||
import src.Util;
|
||||
import src.MissionList;
|
||||
|
||||
class StatisticsGui extends GuiImage {
|
||||
public function new(game:String) {
|
||||
var img = ResourceLoader.getImage("data/ui/achiev/window.png");
|
||||
super(img.resource.toTile());
|
||||
this.horizSizing = Center;
|
||||
this.vertSizing = Center;
|
||||
this.position = new Vector(73, -21);
|
||||
this.extent = new Vector(493, 512);
|
||||
|
||||
var stat = new GuiImage(ResourceLoader.getResource("data/ui/play/statistics_text.png", ResourceLoader.getImage, this.imageResources).toTile());
|
||||
stat.position = new Vector(176, 25);
|
||||
stat.extent = new Vector(160, 39);
|
||||
this.addChild(stat);
|
||||
|
||||
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 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 26 * Settings.uiScale, MultiChannel);
|
||||
var domcasual64 = domcasual32b.toSdfFont(cast 58 * Settings.uiScale, MultiChannel);
|
||||
var domcasual24 = domcasual32b.toSdfFont(cast 21 * Settings.uiScale, MultiChannel);
|
||||
|
||||
function mlFontLoader(text:String) {
|
||||
switch (text) {
|
||||
case "DomCasual24":
|
||||
return domcasual24;
|
||||
case "Arial14":
|
||||
return arial14;
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function loadButtonImages(path:String) {
|
||||
var normal = ResourceLoader.getResource('${path}_n.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var hover = ResourceLoader.getResource('${path}_h.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var pressed = ResourceLoader.getResource('${path}_d.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
var disabled = ResourceLoader.getResource('${path}_i.png', ResourceLoader.getImage, this.imageResources).toTile();
|
||||
return [normal, hover, pressed, disabled];
|
||||
}
|
||||
|
||||
var statLabel = new GuiMLText(domcasual24, mlFontLoader);
|
||||
statLabel.position = new Vector(39, 51);
|
||||
statLabel.extent = new Vector(341, 375);
|
||||
statLabel.text.textColor = 0;
|
||||
statLabel.text.lineSpacing = 4;
|
||||
this.addChild(statLabel);
|
||||
|
||||
var statText = new GuiMLText(domcasual24, mlFontLoader);
|
||||
statText.position = new Vector(59, 54);
|
||||
statText.extent = new Vector(389, 375);
|
||||
statText.horizSizing = Left;
|
||||
statText.text.textColor = 0;
|
||||
statText.text.lineSpacing = 4;
|
||||
|
||||
if (game == "platinum") {
|
||||
statLabel.text.text = "Beginner:<br/>" + "Intermediate:<br/>" + "Advanced:<br/>" + "Expert:<br/>" + "Total:<br/>" + "<br/>"
|
||||
+ "Platinum times:<br/>" + "Ultimate times:<br/>" + "Easter Eggs:<br/>" + "Out of Bounds:<br/>" + "Respawns:<br/>" + "Hardest Level:<br/>"
|
||||
+ "<br/>" + "Grand Total (hours:minutes:seconds):<br/>" + "Total Wasted Time (hours:minutes:seconds):<br/>";
|
||||
}
|
||||
if (game == "gold") {
|
||||
statLabel.text.text = "Beginner:<br/>" + "Intermediate:<br/>" + "Advanced:<br/>" + "Total:<br/>" + "<br/>" + "Gold times:<br/>"
|
||||
+ "Out of Bounds:<br/>" + "Respawns:<br/>" + "Hardest Level:<br/>" + "<br/>" + "Grand Total (hours:minutes:seconds):<br/>"
|
||||
+ "Total Wasted Time (hours:minutes:seconds):";
|
||||
}
|
||||
if (game == "ultra") {
|
||||
statLabel.text.text = "Beginner:<br/>" + "Intermediate:<br/>" + "Advanced:<br/>" + "Total:<br/>" + "<br/>" + "Gold times:<br/>"
|
||||
+ "Ultimate times:<br/>" + "Easter Eggs:<br/>" + "Out of Bounds:<br/>" + "Respawns:<br/>" + "Hardest Level:<br/>" + "<br/>"
|
||||
+ "Grand Total (hours:minutes:seconds):<br/>" + "Total Wasted Time (hours:minutes:seconds):<br/>";
|
||||
}
|
||||
|
||||
this.addChild(statText);
|
||||
|
||||
var closeButton = new GuiButton(loadButtonImages("data/ui/achiev/close"));
|
||||
closeButton.position = new Vector(199, 431);
|
||||
closeButton.extent = new Vector(95, 45);
|
||||
closeButton.horizSizing = Center;
|
||||
closeButton.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.popDialog(this);
|
||||
}
|
||||
this.addChild(closeButton);
|
||||
|
||||
// Now do the actual achievement check logic
|
||||
var completions:Map<String, Array<{
|
||||
mission:Mission,
|
||||
beatPar:Bool,
|
||||
beatPlatinum:Bool,
|
||||
beatUltimate:Bool,
|
||||
beaten:Bool
|
||||
}>> = [];
|
||||
|
||||
var totalPlatinums = 0;
|
||||
var totalUltimates = 0;
|
||||
var totalEggs = 0;
|
||||
var totalBestTime = 0.0;
|
||||
var hardestLevel:Mission = MissionList.missionList[game]["beginner"][0];
|
||||
var hardestStats:PlayStatistics = {
|
||||
oobs: 0,
|
||||
respawns: 0,
|
||||
totalTime: 0
|
||||
};
|
||||
var hardestLevelScore = 0.0;
|
||||
|
||||
for (difficulty => missions in MissionList.missionList[game]) {
|
||||
completions.set(difficulty, missions.map(mis -> {
|
||||
var misScores = Settings.getScores(mis.path);
|
||||
if (misScores.length == 0) {
|
||||
return {
|
||||
mission: mis,
|
||||
beatPar: false,
|
||||
beatPlatinum: false,
|
||||
beatUltimate: false,
|
||||
beaten: false
|
||||
}
|
||||
}
|
||||
var bestTime = misScores[0];
|
||||
totalBestTime += bestTime.time;
|
||||
var beatPar = bestTime.time < mis.qualifyTime;
|
||||
var beatPlatinum = bestTime.time < mis.goldTime;
|
||||
var beatUltimate = bestTime.time < mis.ultimateTime;
|
||||
var beaten = beatPar || beatPlatinum || beatUltimate;
|
||||
|
||||
if (beatPlatinum)
|
||||
totalPlatinums++;
|
||||
if (beatUltimate)
|
||||
totalUltimates++;
|
||||
if (Settings.easterEggs.exists(mis.path))
|
||||
totalEggs++;
|
||||
|
||||
if (Settings.levelStatistics.exists(mis.path)) {
|
||||
var stats = Settings.levelStatistics.get(mis.path);
|
||||
var metric = stats.oobs + stats.respawns + (stats.totalTime / 60);
|
||||
if (metric > hardestLevelScore) {
|
||||
hardestLevel = mis;
|
||||
hardestLevelScore = metric;
|
||||
hardestStats = stats;
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
mission: mis,
|
||||
beatPar: beatPar,
|
||||
beatPlatinum: beatPlatinum,
|
||||
beatUltimate: beatUltimate,
|
||||
beaten: beaten
|
||||
};
|
||||
}));
|
||||
}
|
||||
|
||||
if (game == "platinum") {
|
||||
var beginnerCompletion = completions["beginner"].filter(x -> x.beatPar).length / completions["beginner"].length;
|
||||
var intermediateCompletion = completions["intermediate"].filter(x -> x.beatPar).length / completions["intermediate"].length;
|
||||
var advancedCompletion = completions["advanced"].filter(x -> x.beatPar).length / completions["advanced"].length;
|
||||
var expertCompletion = completions["expert"].filter(x -> x.beatPar).length / completions["expert"].length;
|
||||
var totalCompletion:Float = completions["beginner"].filter(x -> x.beatPar).length
|
||||
+ completions["intermediate"].filter(x -> x.beatPar)
|
||||
.length + completions["advanced"].filter(x -> x.beatPar).length + completions["expert"].filter(x -> x.beatPar).length;
|
||||
totalCompletion /= completions["beginner"].length
|
||||
+ completions["intermediate"].length + completions["advanced"].length + completions["expert"].length;
|
||||
|
||||
statText.text.text = '<p align="right">${Math.floor(beginnerCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(intermediateCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(advancedCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(expertCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(totalCompletion * 100)}%</p>'
|
||||
+ '<br/>'
|
||||
+ '<p align="right">${totalPlatinums}/120 ${Math.floor(totalPlatinums / 120.0 * 100)}%</p>'
|
||||
+ '<p align="right">${totalUltimates}/120 ${Math.floor(totalUltimates / 120.0 * 100)}%</p>'
|
||||
+ '<p align="right">${totalEggs}/96 ${Math.floor(totalEggs / 96 * 100)}%</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.oobs}</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.respawns}</p>'
|
||||
+ '<p align="right">${hardestLevel != null ? hardestLevel.title : ""}</p>'
|
||||
+
|
||||
'<p align="right">${hardestLevel != null ? 'With ${hardestStats.oobs} OOBs, ${hardestStats.respawns} Respawns, and ${Util.formatTimeHours(hardestStats.totalTime)} Played': ""}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(totalBestTime)}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(Settings.playStatistics.totalTime)}</p>';
|
||||
}
|
||||
if (game == "gold") {
|
||||
var beginnerCompletion = completions["beginner"].filter(x -> x.beatPar).length / completions["beginner"].length;
|
||||
var intermediateCompletion = completions["intermediate"].filter(x -> x.beatPar).length / completions["intermediate"].length;
|
||||
var advancedCompletion = completions["advanced"].filter(x -> x.beatPar).length / completions["advanced"].length;
|
||||
var totalCompletion:Float = completions["beginner"].filter(x -> x.beatPar).length
|
||||
+ completions["intermediate"].filter(x -> x.beatPar).length + completions["advanced"].filter(x -> x.beatPar).length;
|
||||
totalCompletion /= completions["beginner"].length + completions["intermediate"].length + completions["advanced"].length;
|
||||
|
||||
statText.text.text = '<p align="right">${Math.floor(beginnerCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(intermediateCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(advancedCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(totalCompletion * 100)}%</p>'
|
||||
+ '<br/>'
|
||||
+ '<p align="right">${totalPlatinums}/100 ${Math.floor(totalPlatinums / 100.0 * 100)}%</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.oobs}</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.respawns}</p>'
|
||||
+ '<p align="right">${hardestLevel != null ? hardestLevel.title : ""}</p>'
|
||||
+
|
||||
'<p align="right">${hardestLevel != null ? 'With ${hardestStats.oobs} OOBs, ${hardestStats.respawns} Respawns, and ${Util.formatTimeHours(hardestStats.totalTime)} Played': ""}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(totalBestTime)}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(Settings.playStatistics.totalTime)}</p>';
|
||||
}
|
||||
if (game == "ultra") {
|
||||
var beginnerCompletion = completions["beginner"].filter(x -> x.beatPar).length / completions["beginner"].length;
|
||||
var intermediateCompletion = completions["intermediate"].filter(x -> x.beatPar).length / completions["intermediate"].length;
|
||||
var advancedCompletion = completions["advanced"].filter(x -> x.beatPar).length / completions["advanced"].length;
|
||||
var totalCompletion:Float = completions["beginner"].filter(x -> x.beatPar).length
|
||||
+ completions["intermediate"].filter(x -> x.beatPar).length + completions["advanced"].filter(x -> x.beatPar).length;
|
||||
totalCompletion /= completions["beginner"].length + completions["intermediate"].length + completions["advanced"].length;
|
||||
|
||||
statText.text.text = '<p align="right">${Math.floor(beginnerCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(intermediateCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(advancedCompletion * 100)}%</p>'
|
||||
+ '<p align="right">${Math.floor(totalCompletion * 100)}%</p>'
|
||||
+ '<br/>'
|
||||
+ '<p align="right">${totalPlatinums}/61 ${Math.floor(totalPlatinums / 61.0 * 100)}%</p>'
|
||||
+ '<p align="right">${totalUltimates}/61 ${Math.floor(totalUltimates / 61.0 * 100)}%</p>'
|
||||
+ '<p align="right">${totalEggs}/20 ${Math.floor(totalEggs / 20 * 100)}%</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.oobs}</p>'
|
||||
+ '<p align="right">${Settings.playStatistics.respawns}</p>'
|
||||
+ '<p align="right">${hardestLevel != null ? hardestLevel.title : ""}</p>'
|
||||
+
|
||||
'<p align="right">${hardestLevel != null ? 'With ${hardestStats.oobs} OOBs, ${hardestStats.respawns} Respawns, and ${Util.formatTimeHours(hardestStats.totalTime)} Played': ""}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(totalBestTime)}</p>'
|
||||
+ '<p align="right">${Util.formatTimeHours(Settings.playStatistics.totalTime)}</p>';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -12,7 +12,6 @@ import src.MarbleWorld;
|
|||
import shapes.Trapdoor;
|
||||
import shapes.PushButton;
|
||||
import src.Util;
|
||||
import shapes.Nuke;
|
||||
import src.Settings;
|
||||
|
||||
class RewindManager {
|
||||
|
|
@ -81,10 +80,6 @@ class RewindManager {
|
|||
var lm:LandMine = cast dts;
|
||||
rf.landMineStates.push(lm.disappearTime);
|
||||
}
|
||||
if (dts is Nuke) {
|
||||
var lm:Nuke = cast dts;
|
||||
rf.landMineStates.push(lm.disappearTime);
|
||||
}
|
||||
if (dts is Trapdoor) {
|
||||
var td:Trapdoor = cast dts;
|
||||
rf.trapdoorStates.push({
|
||||
|
|
@ -200,10 +195,6 @@ class RewindManager {
|
|||
var lm:LandMine = cast dts;
|
||||
lm.disappearTime = lmstates.shift();
|
||||
}
|
||||
if (dts is Nuke) {
|
||||
var lm:Nuke = cast dts;
|
||||
lm.disappearTime = lmstates.shift();
|
||||
}
|
||||
if (dts is Trapdoor) {
|
||||
var td:Trapdoor = cast dts;
|
||||
var tdState = tstates.shift();
|
||||
|
|
|
|||
|
|
@ -1,17 +0,0 @@
|
|||
package shapes;
|
||||
|
||||
import h3d.mat.Material;
|
||||
import src.DtsObject;
|
||||
import src.ResourceLoader;
|
||||
|
||||
class GemBeam extends DtsObject {
|
||||
public function new(color:String) {
|
||||
super();
|
||||
this.dtsPath = "data/shapes/gemlights/gemlight.dts";
|
||||
this.isCollideable = false;
|
||||
this.isTSStatic = false;
|
||||
this.identifier = "GemBeam" + color;
|
||||
this.useInstancing = true;
|
||||
this.matNameOverride.set('base.lightbeam', color + '.lightbeam');
|
||||
}
|
||||
}
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
|
|
@ -1,143 +0,0 @@
|
|||
package shapes;
|
||||
|
||||
import net.BitStream.OutputBitStream;
|
||||
import net.NetPacket.ExplodableUpdatePacket;
|
||||
import src.AudioManager;
|
||||
import src.TimeState;
|
||||
import collision.CollisionHull;
|
||||
import collision.CollisionInfo;
|
||||
import src.DtsObject;
|
||||
import src.Util;
|
||||
import src.ParticleSystem.ParticleEmitterOptions;
|
||||
import src.ParticleSystem.ParticleData;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.MarbleWorld;
|
||||
import net.Net;
|
||||
|
||||
final nukeParticle:ParticleEmitterOptions = {
|
||||
ejectionPeriod: 0.2,
|
||||
ambientVelocity: new Vector(0, 0, 0),
|
||||
ejectionVelocity: 2,
|
||||
velocityVariance: 1,
|
||||
emitterLifetime: 50,
|
||||
inheritedVelFactor: 0.2,
|
||||
particleOptions: {
|
||||
texture: 'particles/smoke.png',
|
||||
blending: Add,
|
||||
spinSpeed: 40,
|
||||
spinRandomMin: -90,
|
||||
spinRandomMax: 90,
|
||||
lifetime: 1000,
|
||||
lifetimeVariance: 150,
|
||||
dragCoefficient: 0.8,
|
||||
acceleration: 0,
|
||||
colors: [new Vector(0.56, 0.36, 0.26, 1), new Vector(0.56, 0.36, 0.26, 0)],
|
||||
sizes: [0.5, 1],
|
||||
times: [0, 1]
|
||||
}
|
||||
};
|
||||
|
||||
final nukeSmokeParticle:ParticleEmitterOptions = {
|
||||
ejectionPeriod: 0.5,
|
||||
ambientVelocity: new Vector(0, 0, 0),
|
||||
ejectionVelocity: 1.3,
|
||||
velocityVariance: 0.5,
|
||||
emitterLifetime: 50,
|
||||
inheritedVelFactor: 0.25,
|
||||
particleOptions: {
|
||||
texture: 'particles/smoke.png',
|
||||
blending: Alpha,
|
||||
spinSpeed: 40,
|
||||
spinRandomMin: -90,
|
||||
spinRandomMax: 90,
|
||||
lifetime: 2500,
|
||||
lifetimeVariance: 300,
|
||||
dragCoefficient: 0.7,
|
||||
acceleration: -8,
|
||||
colors: [
|
||||
new Vector(0.56, 0.36, 0.26, 1),
|
||||
new Vector(0.2, 0.2, 0.2, 1),
|
||||
new Vector(0, 0, 0, 0)
|
||||
],
|
||||
sizes: [1, 1.5, 2],
|
||||
times: [0, 0.5, 1]
|
||||
}
|
||||
};
|
||||
|
||||
final nukeSparksParticle:ParticleEmitterOptions = {
|
||||
ejectionPeriod: 1.7,
|
||||
ambientVelocity: new Vector(0, -0.5, 0),
|
||||
ejectionVelocity: 13 / 1.5,
|
||||
velocityVariance: 5,
|
||||
emitterLifetime: 5000,
|
||||
inheritedVelFactor: 0.2,
|
||||
particleOptions: {
|
||||
texture: 'particles/spark.png',
|
||||
blending: Add,
|
||||
spinSpeed: 40,
|
||||
spinRandomMin: -90,
|
||||
spinRandomMax: 90,
|
||||
lifetime: 4500,
|
||||
lifetimeVariance: 2500,
|
||||
dragCoefficient: 0.5,
|
||||
acceleration: 0,
|
||||
colors: [
|
||||
new Vector(0.6, 0.4, 0.3, 1),
|
||||
new Vector(0.6, 0.4, 0.3, 1),
|
||||
new Vector(1, 0.4, 0.3, 0)
|
||||
],
|
||||
sizes: [0.5, 0.4, 0.2],
|
||||
times: [0, 0.5, 1]
|
||||
}
|
||||
};
|
||||
|
||||
class Nuke extends Explodable {
|
||||
public function new() {
|
||||
super();
|
||||
dtsPath = "data/shapes/hazards/nuke/nuke.dts";
|
||||
this.identifier = "Nuke";
|
||||
this.isCollideable = true;
|
||||
|
||||
particleData = new ParticleData();
|
||||
particleData.identifier = "nukeParticle";
|
||||
particleData.texture = ResourceLoader.getResource("data/particles/smoke.png", ResourceLoader.getTexture, this.textureResources);
|
||||
|
||||
smokeParticleData = new ParticleData();
|
||||
smokeParticleData.identifier = "nukeSmokeParticle";
|
||||
smokeParticleData.texture = ResourceLoader.getResource("data/particles/smoke.png", ResourceLoader.getTexture, this.textureResources);
|
||||
|
||||
sparkParticleData = new ParticleData();
|
||||
sparkParticleData.identifier = "nukeSparkParticle";
|
||||
sparkParticleData.texture = ResourceLoader.getResource("data/particles/spark.png", ResourceLoader.getTexture, this.textureResources);
|
||||
|
||||
particle = nukeParticle;
|
||||
smokeParticle = nukeSmokeParticle;
|
||||
sparksParticle = nukeSparksParticle;
|
||||
|
||||
renewTime = 15000;
|
||||
explodeSoundFile = "data/sound/nukeexplode.wav";
|
||||
}
|
||||
|
||||
function computeExplosionForce(distVec:Vector) {
|
||||
var range = 10;
|
||||
var power = 100;
|
||||
|
||||
var dist = distVec.length();
|
||||
if (dist < range) {
|
||||
var scalar = (1 - dist / range) * power;
|
||||
distVec = distVec.multiply(scalar);
|
||||
}
|
||||
|
||||
return distVec;
|
||||
}
|
||||
|
||||
public function applyImpulse(marble:src.Marble) {
|
||||
var minePos = this.getAbsPos().getPosition();
|
||||
var dtsCenter = this.dts.bounds.center();
|
||||
var off = marble.getAbsPos().getPosition().sub(minePos);
|
||||
|
||||
var force = computeExplosionForce(off);
|
||||
marble.applyImpulse(force, true);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
package shapes;
|
||||
|
||||
import src.ResourceLoaderWorker;
|
||||
import src.ResourceLoader;
|
||||
import mis.MissionElement.MissionElementItem;
|
||||
import src.TimeState;
|
||||
import mis.MisParser;
|
||||
import src.MarbleWorld;
|
||||
|
||||
class RandomPowerup extends PowerUp {
|
||||
var wasTimeTravel:Bool;
|
||||
|
||||
public function new(element:MissionElementItem) {
|
||||
super(element);
|
||||
this.dtsPath = "data/shapes/items/random.dts";
|
||||
this.isCollideable = false;
|
||||
this.isTSStatic = false;
|
||||
this.identifier = "RandomPowerup";
|
||||
this.useInstancing = true;
|
||||
this.autoUse = true;
|
||||
this.wasTimeTravel = false;
|
||||
}
|
||||
|
||||
public override function init(level:MarbleWorld, onFinish:Void->Void) {
|
||||
super.init(level, () -> {
|
||||
var sounds = [
|
||||
"sound/pugyrocoptervoice.wav",
|
||||
"sound/pushockabsorbervoice.wav",
|
||||
"sound/pusuperbouncevoice.wav",
|
||||
"sound/pusuperjumpvoice.wav",
|
||||
"sound/pusuperspeedvoice.wav",
|
||||
"sound/dosuperspeed.wav",
|
||||
"sound/dosuperjump.wav",
|
||||
"sound/putimetravelvoice.wav",
|
||||
"sound/timetravelactive.wav"
|
||||
];
|
||||
#if js
|
||||
// Load all the resources of the other powerups
|
||||
sounds = sounds.concat([
|
||||
"shapes/items/powerup-bounce.png",
|
||||
"shapes/items/rocket.jpg",
|
||||
"shapes/items/shockabsorber.dts",
|
||||
"shapes/items/shockabsorber.png",
|
||||
"shapes/items/sji_shinysteel.png",
|
||||
"shapes/items/superbounce.dts",
|
||||
"shapes/items/superjump.dts",
|
||||
"shapes/items/superspeed.dts",
|
||||
"shapes/items/itemarrow.jpg",
|
||||
"shapes/items/enviro1.jpg",
|
||||
"shapes/images/helicopter.dts",
|
||||
"shapes/images/helicopter.jpg"
|
||||
]);
|
||||
#end
|
||||
var rlw = new ResourceLoaderWorker(onFinish);
|
||||
for (sound in sounds) {
|
||||
rlw.loadFile(sound);
|
||||
}
|
||||
rlw.run();
|
||||
});
|
||||
}
|
||||
|
||||
public function pickUp(marble:src.Marble):Bool {
|
||||
while (true) {
|
||||
var r = Std.random(6);
|
||||
if (this.level.isWatching)
|
||||
r = this.level.replay.getRandomGenState();
|
||||
var pow:PowerUp = null;
|
||||
switch (r) {
|
||||
case 0:
|
||||
pow = new TimeTravel(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/putimetravelvoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = true;
|
||||
case 1:
|
||||
pow = new SuperJump(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/pusuperjumpvoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = false;
|
||||
case 2:
|
||||
pow = new SuperSpeed(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/pusuperspeedvoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = false;
|
||||
case 3:
|
||||
pow = new ShockAbsorber(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/pushockabsorbervoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = false;
|
||||
case 4:
|
||||
pow = new SuperBounce(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/pusuperbouncevoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = false;
|
||||
case 5:
|
||||
pow = new Helicopter(this.element);
|
||||
this.pickupSound = ResourceLoader.getResource("data/sound/pugyrocoptervoice.wav", ResourceLoader.getAudio, this.soundResources);
|
||||
wasTimeTravel = false;
|
||||
}
|
||||
pow.level = this.level;
|
||||
|
||||
if (pow.pickUp(marble)) {
|
||||
this.cooldownDuration = pow.cooldownDuration;
|
||||
this.pickUpName = pow.pickUpName;
|
||||
if (this.level.isRecording && !this.level.rewinding)
|
||||
this.level.replay.recordRandomGenState(r);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public function use(marble:src.Marble, time:TimeState) {
|
||||
if (this.wasTimeTravel) {
|
||||
this.level.addBonusTime(5);
|
||||
wasTimeTravel = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue