mirror of
https://gitlab.com/skysthelimit.dev/selenite.git
synced 2025-06-16 10:32:08 -05:00
161 lines
5.6 KiB
JavaScript
161 lines
5.6 KiB
JavaScript
function launchOSU(osu, beatmapid, version) {
|
|
// select track
|
|
let trackid = -1;
|
|
// mode can be 0 or undefined
|
|
for (let i = 0; i < osu.tracks.length; i++){
|
|
if (osu.tracks[i].metadata.BeatmapID == beatmapid || !osu.tracks[i].mode && osu.tracks[i].metadata.Version == version){
|
|
trackid = i;
|
|
}
|
|
}
|
|
console.log("Launching", beatmapid, version)
|
|
if (trackid == -1) {
|
|
console.error("No such track");
|
|
console.log("Available tracks are:");
|
|
for (let i = 0; i < osu.tracks.length; ++i)
|
|
console.log(osu.tracks[i].metadata.BeatmapID, osu.tracks[i].mode, osu.tracks[i].metadata.Version);
|
|
return;
|
|
}
|
|
// prevent launching multiple times
|
|
if (window.app) return;
|
|
console.log("Launching PIXI app");
|
|
// launch PIXI app
|
|
let app = window.app = new PIXI.Application({
|
|
width: window.innerWidth,
|
|
height: window.innerHeight,
|
|
resolution: (window.game.overridedpi ? window.game.dpiscale : window.devicePixelRatio) || 1,
|
|
autoResize: true,
|
|
});
|
|
app.renderer.autoDensity = true;
|
|
app.renderer.backgroundColor = 0x111111;
|
|
|
|
// remember where the page is scrolled to
|
|
let scrollTop = document.body.scrollTop;
|
|
// save alert function and replace with silent alert to prevent pop-up in game
|
|
let defaultAlert = window.alert;
|
|
window.alert = function (msg) {
|
|
console.log("IN-GAME ALERT " + msg);
|
|
};
|
|
// get ready for gaming
|
|
document.addEventListener("contextmenu", function (e) {
|
|
e.preventDefault();
|
|
return false;
|
|
});
|
|
document.body.classList.add("gaming");
|
|
// update game settings
|
|
if (window.gamesettings) {
|
|
window.gamesettings.refresh();
|
|
window.gamesettings.loadToGame();
|
|
}
|
|
|
|
// load cursor
|
|
if (!game.showhwmouse || game.autoplay) {
|
|
game.cursor = new PIXI.Sprite(Skin["cursor.png"]);
|
|
game.cursor.anchor.x = game.cursor.anchor.y = 0.5;
|
|
game.cursor.scale.x = game.cursor.scale.y = 0.3 * game.cursorSize;
|
|
game.stage.addChild(game.cursor);
|
|
}
|
|
|
|
// switch page to game view
|
|
if (game.autofullscreen)
|
|
document.documentElement.requestFullscreen();
|
|
let pGameArea = document.getElementById("game-area");
|
|
var pMainPage = document.getElementById("main-page");
|
|
var pNav = document.getElementById("main-nav");
|
|
pGameArea.appendChild(app.view);
|
|
if (game.autoplay) {
|
|
pGameArea.classList.remove("shownomouse");
|
|
pGameArea.classList.remove("showhwmousemedium");
|
|
pGameArea.classList.remove("showhwmousesmall");
|
|
pGameArea.classList.remove("showhwmousetiny");
|
|
} else if (game.showhwmouse) {
|
|
pGameArea.classList.remove("shownomouse");
|
|
if (game.cursorSize < 0.65)
|
|
pGameArea.classList.add("showhwmousetiny");
|
|
else if (game.cursorSize < 0.95)
|
|
pGameArea.classList.add("showhwmousesmall");
|
|
else
|
|
pGameArea.classList.add("showhwmousemedium");
|
|
} else {
|
|
pGameArea.classList.add("shownomouse");
|
|
pGameArea.classList.remove("showhwmousemedium");
|
|
pGameArea.classList.remove("showhwmousesmall");
|
|
pGameArea.classList.remove("showhwmousetiny");
|
|
}
|
|
pMainPage.setAttribute("hidden", "");
|
|
pNav.setAttribute("style", "display: none");
|
|
pGameArea.removeAttribute("hidden");
|
|
|
|
var gameLoop;
|
|
// set quit callback
|
|
window.quitGame = function () {
|
|
pGameArea.setAttribute("hidden", "");
|
|
pMainPage.removeAttribute("hidden");
|
|
pNav.removeAttribute("style");
|
|
document.body.classList.remove("gaming");
|
|
// restore page scroll position
|
|
document.body.scrollTop = scrollTop;
|
|
// restore alert function
|
|
window.alert = defaultAlert;
|
|
// TODO application level clean up
|
|
if (game.cursor) {
|
|
game.stage.removeChild(game.cursor);
|
|
game.cursor.destroy();
|
|
game.cursor = null;
|
|
}
|
|
window.app.destroy(true, {
|
|
children: true,
|
|
texture: false
|
|
});
|
|
window.app = null;
|
|
gameLoop = null;
|
|
window.cancelAnimationFrame(window.animationRequestID);
|
|
}
|
|
|
|
// load playback
|
|
var playback = new Playback(window.game, osu, osu.tracks[trackid]);
|
|
game.scene = playback;
|
|
playback.onload = function () {
|
|
// stop beatmap preview
|
|
let audios = document.getElementsByTagName("audio");
|
|
for (let i = 0; i < audios.length; ++i)
|
|
if (audios[i].softstop)
|
|
audios[i].softstop();
|
|
}
|
|
playback.load(); // load audio
|
|
|
|
// start main loop
|
|
gameLoop = function (timestamp) {
|
|
if (game.scene) {
|
|
game.scene.render(timestamp);
|
|
}
|
|
if (game.cursor) {
|
|
// Handle cursor
|
|
game.cursor.x = game.mouseX / 512 * gfx.width + gfx.xoffset;
|
|
game.cursor.y = game.mouseY / 384 * gfx.height + gfx.yoffset;
|
|
game.cursor.bringToFront();
|
|
}
|
|
app.renderer.render(game.stage);
|
|
window.animationRequestID = window.requestAnimationFrame(gameLoop);
|
|
}
|
|
window.animationRequestID = window.requestAnimationFrame(gameLoop);
|
|
}
|
|
|
|
function launchGame(osublob, beatmapid, version) {
|
|
// unzip osz & parse beatmap
|
|
let fs = new zip.fs.FS();
|
|
fs.root.importBlob(osublob,
|
|
function () {
|
|
let osu = new Osu(fs.root);
|
|
osu.ondecoded = function () {
|
|
launchOSU(osu, beatmapid, version);
|
|
}
|
|
osu.onerror = function () {
|
|
console.error("osu parse error");
|
|
}
|
|
osu.load();
|
|
},
|
|
function (err) {
|
|
console.error("unzip failed");
|
|
}
|
|
);
|
|
} |