frontend/osu/js/launchgame.js
2023-05-22 17:12:06 -04:00

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");
}
);
}