From 1ec3d889fa1b15e79a070c156be777e4ce12f534 Mon Sep 17 00:00:00 2001 From: MeowcaTheoRange <58280776+MeowcaTheoRange@users.noreply.github.com> Date: Tue, 26 Apr 2022 21:55:28 +0000 Subject: [PATCH] First commit --- .github/workflows/format.yml | 20 - .prettierrc | 1 - .replit | 2 +- code/charts.js | 600 ++++++++++++++++++ code/main.js | 842 +++++++++----------------- readme.md | 8 - sprites/MidSimFont2.png | Bin 0 -> 1177 bytes sprites/PC_jellybeanCake.png | Bin 35160 -> 0 bytes sprites/PC_jellybeanTitle.png | Bin 5276 -> 0 bytes sprites/bean.png | Bin 2546 -> 0 bytes sprites/cursor.png | Bin 273 -> 0 bytes sprites/keyA.png | Bin 1008 -> 0 bytes sprites/keyClick.png | Bin 1088 -> 0 bytes sprites/keySpace.png | Bin 819 -> 0 bytes sprites/notepresselement.png | Bin 631 -> 0 bytes sprites/previews/SonicAndTailsPre.png | Bin 289 -> 283 bytes sprites/previews/TailsPre.png | Bin 0 -> 287 bytes 17 files changed, 874 insertions(+), 599 deletions(-) delete mode 100644 .github/workflows/format.yml delete mode 100644 .prettierrc create mode 100644 code/charts.js delete mode 100644 readme.md create mode 100644 sprites/MidSimFont2.png delete mode 100644 sprites/PC_jellybeanCake.png delete mode 100644 sprites/PC_jellybeanTitle.png delete mode 100644 sprites/bean.png delete mode 100644 sprites/cursor.png delete mode 100644 sprites/keyA.png delete mode 100644 sprites/keyClick.png delete mode 100644 sprites/keySpace.png delete mode 100644 sprites/notepresselement.png create mode 100644 sprites/previews/TailsPre.png diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml deleted file mode 100644 index dc2bb3e..0000000 --- a/.github/workflows/format.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Formatter - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - name: Setup repo - uses: actions/checkout@v2 - - - name: Format code with Prettier - uses: creyD/prettier_action@v4.2 - with: - commit_message: "code formatted" \ No newline at end of file diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 68ea04d..0000000 --- a/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -tabWidth: 4 \ No newline at end of file diff --git a/.replit b/.replit index 16505f2..e104e39 100644 --- a/.replit +++ b/.replit @@ -1,2 +1,2 @@ language = "kaboom" -entrypoint = "code/game.js" \ No newline at end of file +entrypoint = "code/main.js" \ No newline at end of file diff --git a/code/charts.js b/code/charts.js new file mode 100644 index 0000000..c53935b --- /dev/null +++ b/code/charts.js @@ -0,0 +1,600 @@ +import { kaboom } from "../deps.js"; + +export var charts = [ + { + id: "tutorial", + name: "Tutorial", + speed: 5, // How much seconds it takes to get from Right Stage to the hitmarker + bpm: 135, // Song BPM + events: { + preload: function() { + loadSound("hitsoundJellyBean", "sounds/hitsoundJellyBean.wav"); + loadSound("hitsoundCarterRedacted", "sounds/hitsoundJellyBean.wav"); + loadSound("hitsoundMarc", "sounds/hitsoundJellyBean.wav"); + loadSound("hitsoundRedVelvety", "sounds/hitsoundRedVelvety.wav"); + loadSound("hitsoundMarkyMark", "sounds/burp.mp3"); + loadSprite("JellyBeanPre", "sprites/previews/JellyBeanPre.png"); + loadSprite("RedVelvetyPre", "sprites/previews/RedVelvetyPre.png"); + loadSprite("MarkyMarkPre", "sprites/previews/MarkyMarkPre.png"); + loadSprite("CarterRedactedPre", "sprites/previews/CarterRedactedPre.png"); + loadSprite("MarcPre", "sprites/previews/MarcPre.png"); + loadSprite("tutorialBG0", "sprites/bgCake.png"); + loadSprite("tutorialFG0", "sprites/fgCake0.png"); + loadSprite("tutorialFG1", "sprites/fgCake1.png"); + loadSprite("Marctutorial", "sprites/marcCake.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 5, + speed: 20 + }, + miss: { + from: 6, + to: 8, + speed: 10 + }, + }, + }) + loadSprite("CarterRedactedtutorial", "sprites/carterredactedCake.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 5, + speed: 20 + }, + miss: { + from: 6, + to: 8, + speed: 10 + }, + }, + }) + loadSprite("MarkyMarktutorial", "sprites/markymarkCake.png", { + sliceX: 3, + sliceY: 4, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 7, + speed: 40 + }, + miss: { + from: 8, + to: 10, + speed: 10 + }, + }, + }) + loadSprite("RedVelvetytutorial", "sprites/redvelvetyCake.png", { + sliceX: 3, + sliceY: 4, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 5, + speed: 20 + }, + dox: { + from: 6, + to: 7, + speed: 20 + }, + miss: { + from: 8, + to: 10, + speed: 10 + }, + }, + }) + loadSprite("JellyBeantutorial", "sprites/jellybeanCake.png", { + sliceX: 3, + sliceY: 4, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 5, + speed: 20 + }, + dox: { + from: 6, + to: 7, + speed: 20 + }, + miss: { + from: 8, + to: 10, + speed: 10 + }, + }, + }) + } + }, + characters: [ + ["JellyBean", "JellyBean"], + ["RedVelvety", "RedVelvety"], + ["Marc", "Marc"], + ["CarterRedacted", "CarterRedacted"], + ["MarkyMark", "Mark"] + ], + noteTypes: { + "J": noteDefault, + }, + makeScript: { + customChar: false, + customBG: false, + charPos: [], + script: function() { + add([ + sprite("tutorialFG1"), + layer("fg"), + scale(1) + ]); + return {returnType: null}; + } + }, + chart: "................................................................................................................................J...........J.J...........J.J.J.............J.J.................J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J.............J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J.............J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J...................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.............................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J...................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.J.....J.J.....J...........J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.J.....J.J.....J.J.....J...................................................................................................................................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................................................................................................................................................................................................................................................", + scale: 1 //Texture Scale (too lazy to upsize sprites sometimes) + }, + { + id: "faith", + name: "Friendly Faith Plate", + speed: 2, + bpm: 120, + events: { + preload: function() { + loadSound("faith", "sounds/The Friendly Faith Plate.mp3"); //120 + loadSound("hitsoundFaithPlate", "sounds/hitsoundFaithPlate.mp3"); + loadSprite("FaithPlatePre", "sprites/previews/FaithPlatePre.png"); + loadSprite("faithBG0", "sprites/bgFaith.png"); + loadSprite("faithFG0", "sprites/fgFaith.png"); + loadSprite("FaithPlatefaith", "sprites/faithplateFaith.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 3, + speed: 20 + }, + talk: { + from: 4, + to: 5, + speed: 20 + }, + miss: { + from: 6, + to: 8, + speed: 10 + }, + }, + }) + } + }, + characters: [ + ["FaithPlate", "Faith Plate"] + ], + noteTypes: { + "J": noteDefault, + }, + makeScript: { + customChar: false, + customBG: false, + charPos: [], + script: function() { + return {returnType: null}; + } + }, + chart: "................................................................................................................................J...J...J...JJJJJ...J...J...J...J.J.J.J.J.J.J.J.JJJJJJJJJ.J.J.JJJ.J.J.J.J.J.JJJJJ.JJJ.J.J.J.J.J.J.JJJ.JJJ.J.J.J.JJJJJJJJJJJJJJJJJ.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.JJJ.JJJ.JJJ.JJJ.JJJ.J.J.J.J.JJJ.J.JJJJJJJJJJJJJ.J.J.J.JJJJJ.J.J.J.J.J.J.J.JJJJJ.J.J.J.J.JJ.J..J.JJJ.JJJ.J.J.JJJ.JJJ.J.J.J.JJJJJ.J.J.JJJ.JJJJJJJJJJJJJJJJJ.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.J.J.J.J.JJJ.JJJJ.JJ.J.J.J.JJ..J...J.J.J.J.J.J.JJJJJJJJJJJJJ.J.J.J.J.J.J.J.J.J.JJJJJ.J.J.J.J.J.J.J.J...J...J.J.J.J.JJJJJJJJJ.J.J.J.J.J.J.JJJ.J.JJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJJ.JJJJJJJJJJJJJJJ.JJJJJJJJJJJJJ..J.JJJ.JJJJJJJJJJ....J.J.JJJJJJJ.J.JJJ.JJJJJJJJJJJJJJJJJJJJJ.J.J.J.JJJ.JJJJJJJJJ....JJJJJJJJJ....JJJJJJJ.JJJJJJJ..JJJ..J.JJJJJJJJJJJJJJJ.JJJJJJJ..JJJ....JJJJJJJJJJJJJJJ.JJJJJJJ..JJJ....JJJJJJJJJJJJJJJ.JJJJJJJJ.JJJ..J.JJJJJJJ.J.JJJ.JJJJJJJJJJJJJ.JJJ.J...JJJ.J.JJJ.JJJJJJJJJJJJJ.JJJ.JJJ.JJJ.J.JJJJJJJJJJJJJJJJJJJJJ.JJJ.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.JJJ.JJJ.J.JJJ.JJJJJJJJJJJJJJJ...JJJJ........J...JJJJ........J...JJJJ........J...JJJJ........J.J.JJJJ........JJJ.JJJ.JJJ.J.JJJ.J.JJJJ........JJJ.JJJ.JJJ.JJJJJ.J.JJJJ........JJJ.JJJ.JJJ.J.JJJ.J.JJJJ........JJJ.JJJ.JJJ.JJJJJ.J.JJJJJ.......JJJ.J.............", + scale: 4 + }, + { + id: "green", + name: "Green Hill Zone", + speed: 2, + bpm: 150, + events: { + preload: function() { + loadSound("green", "sounds/GreenHill.wav"); //139 + loadSound("hitsoundSonicAndTails", "sounds/hitsoundJellyBean.wav"); + loadSound("hitsoundTails", "sounds/hitsoundJellyBean.wav"); + loadSprite("SonicAndTailsPre", "sprites/previews/SonicAndTailsPre.png"); + loadSprite("TailsPre", "sprites/previews/TailsPre.png"); + loadSprite("sonicBG0", "sprites/SonicBG.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 6, + speed: 10, + loop: true + } + }, + }); + loadSprite("sonicFG0", "sprites/SonicFG.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 0, + speed: 20 + } + }, + }); + loadSprite("SonicAndTailssonic0", "sprites/SonicMidSim.png", { + sliceX: 3, + sliceY: 4, + anims: { + idle: { + from: 0, + to: 6, + speed: 20 + }, + talk: { + from: 7, + to: 8, + speed: 20 + }, + miss: { + from: 9, + to: 11, + speed: 10 + }, + }, + }); + loadSprite("SonicAndTailssonic1", "sprites/TailsMidSim.png", { + sliceX: 3, + sliceY: 9, + anims: { + idle: { + from: 0, + to: 15, + speed: 20 + }, + talk: { + from: 16, + to: 23, + speed: 20 + }, + miss: { + from: 24, + to: 26, + speed: 10 + }, + }, + }); + loadSprite("greenBG0", "sprites/SonicBG.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 6, + speed: 10, + loop: true + } + }, + }); + loadSprite("greenFG0", "sprites/SonicFG.png", { + sliceX: 3, + sliceY: 3, + anims: { + idle: { + from: 0, + to: 0, + speed: 20 + } + }, + }); + loadSprite("SonicAndTailsgreen0", "sprites/SonicMidSim.png", { + sliceX: 3, + sliceY: 4, + anims: { + idle: { + from: 0, + to: 6, + speed: 20 + }, + talk: { + from: 7, + to: 8, + speed: 20 + }, + miss: { + from: 9, + to: 11, + speed: 10 + }, + }, + }); + loadSprite("SonicAndTailsgreen1", "sprites/TailsMidSim.png", { + sliceX: 3, + sliceY: 9, + anims: { + idle: { + from: 0, + to: 15, + speed: 20 + }, + talk: { + from: 16, + to: 23, + speed: 20 + }, + miss: { + from: 24, + to: 26, + speed: 10 + }, + }, + }); + } + }, + characters: [ + ["SonicAndTails", "Sonic"], + ["Tails", "Tails"] + ], + noteTypes: { + "J": function(time, letter, prevStep, char) { + if (char == "Tails") { + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } else { + noteDefault(time, letter, prevStep, char) + } + }, + "T": function(time, letter, prevStep, char) { + if (char == "Tails") { + noteDefault(time, letter, prevStep, char) + } else { + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } + }, + "D": function(time, letter, prevStep) { + noteDefault(time, letter, prevStep); + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } + }, + makeScript: { + customChar: true, + customBG: false, + charPos: [], + script: function(players, char, bgEl) { + var player, player2; + bgEl.play("idle"); + if (char == "Tails") { + player = add([ + sprite("SonicAnd" + char + "green" + "1"), + layer("JELLYBEAN"), + "dances", + pos(224, 20), + scale(1) + ]) + player2 = add([ + sprite("SonicAnd" + char + "green" + "0"), + layer("JELLYBEAN"), + "dances", + pos(20, 108), + scale(1) + ]) + } else { + player = add([ + sprite(char + "green" + "0"), + layer("JELLYBEAN"), + "dances", + pos(20, 108), + scale(1) + ]) + player2 = add([ + sprite(char + "green" + "1"), + layer("JELLYBEAN"), + "dances", + pos(224, 20), + scale(1) + ]) + } + return {returnType: "character", main: player, empty: player2}; + } + }, + chart: "................J.....J.....J.....J.....J...J...J.....J.....J...................J.....J.....J...J.....J.....J...J.....J.................................T.T...T.T...T.T...T...........T.T.T...T.T...T.T...T.............T.T...T.T...T.T...T...........T.T.T...T.T...T.T...T.....T.......J.J...J.J...D.J.T.J.T...T.....J.J.J...J.J...D.J.T.J.T...T.......J.J...J.J...D.J.T.J.T...T.....J.J.J...J.J...D.J.T.J.D...D.....J.....J.....J.....J.T.D.T.J.....J.....J.....J.....J.T.D.T.J.....J.....J.....J.....J.T.D.T.J.T.T.T...T.T.T...T.T.T.T.T.T.T.........J.J...J.J...J.J...J...........J.J.J...J.J...J.J...J.............J.J...J.J...J.J...J...........J.J.J...J.J...J.J...J.....J.......T.T...T.T...D.T.J.T.J...J.....T.T.T...T.T...D.T.J.T.J...J.......T.T...T.T...D.T.J.T.J...J.....T.T.T...T.T...D.T.J.T.J.T.D.....T.....T.....T.....T.J.D.J.T.....T.....T.....T.....T.J.D.J.T.....T.....T.....T.....T.J.D.J.T.J.J.J...J.J.J...J.J.J.J.J.J.J................................................................................................................................................................", + scale: 1 + }, + { + id: "sonic", + name: "Emerald Hill Zone", + speed: 2, + bpm: 139, + events: { + preload: function() { + loadSound("tutorial", "sounds/Getting it Done.mp3"); //135 + loadSound("faith", "sounds/The Friendly Faith Plate.mp3"); //120 + loadSound("sonic", "sounds/SonicInMidSim.wav"); //139 + loadSound("green", "sounds/GreenHill.wav"); //139 + } + }, + characters: [ + ["SonicAndTails", "Sonic"], + ["Tails", "Tails"] + ], + noteTypes: { + "J": function(time, letter, prevStep, char) { + if (char == "Tails") { + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } else { + noteDefault(time, letter, prevStep, char) + } + }, + "T": function(time, letter, prevStep, char) { + if (char == "Tails") { + noteDefault(time, letter, prevStep, char) + } else { + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } + }, + "D": function(time, letter, prevStep) { + noteDefault(time, letter, prevStep); + add([ + rect(0, 50), + pos(width(), 20), + ("note" + prevStep), + "note", + "empty", + { + created: time, + empty: true, + normal: true, + type: letter + } + ]); + } + }, + makeScript: { + customChar: true, + customBG: false, + charPos: [], + script: function(players, char, bgEl) { + var player, player2; + bgEl.play("idle"); + if (char == "Tails") { + player = add([ + sprite("SonicAnd" + char + "green" + "1"), + layer("JELLYBEAN"), + "dances", + pos(224, 20), + scale(1) + ]) + player2 = add([ + sprite("SonicAnd" + char + "green" + "0"), + layer("JELLYBEAN"), + "dances", + pos(20, 108), + scale(1) + ]) + } else { + player = add([ + sprite(char + "green" + "0"), + layer("JELLYBEAN"), + "dances", + pos(20, 108), + scale(1) + ]) + player2 = add([ + sprite(char + "green" + "1"), + layer("JELLYBEAN"), + "dances", + pos(224, 20), + scale(1) + ]) + } + return {returnType: "character", main: player, empty: player2}; + } + }, + chart: "..................................................J.J.J.J.J.JJ....J.J.J.J..J.........JJJJ.J.JJ.J..................T.T.T.T.T.TT....T...T.T..T........TTT.T.T.TT.T..................J.J.J.J.J.J.J.J.J...J...........J.J.J.J.J.JJ..J.................T.T.T.T.T.T.T.T.T...T...........T.T.T.T.T.TT..T...............J.....J.....J.J.J.JJ....T.TT........J.J.J.J.J.J.J.J...J.........T.....T.....T.T.T.TT....J.JJ....DD.D.............................................................", + scale: 1 + }, +] + +export function noteDefault(time, letter, prevStep) { + add([ + rect(10, 50), + pos(width(), 20), + color(232, 3, 252), + ("note" + prevStep), + "note", + { + created: time, + type: letter, + empty: false, + normal: true + } + ]); +} \ No newline at end of file diff --git a/code/main.js b/code/main.js index 7e463fe..4c662a4 100644 --- a/code/main.js +++ b/code/main.js @@ -1,4 +1,6 @@ +"use strict"; import { kaboom, easings, tween, tweentypes } from "../deps.js"; +import { charts } from "./charts.js"; // initialize context kaboom({ @@ -7,16 +9,17 @@ kaboom({ background: [ 0, 0, 0 ], crisp: true, touchToMouse: true, - canvas: document.querySelector("#kaboom") + canvas: document.querySelector("#kaboom"), + font: "MidSim", + scale: 1, + }); +var ismobile = isTouch(); load(new Promise((resolve, reject) => { loadFont("unscii", "sprites/unscii_8x8.png", 8, 8, {chars: " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~"}); + loadFont("MidSim", "sprites/MidSimFont2.png", 10, 10, {chars: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz:;><^%-.!?/()[]\"'|1234567890"}); // Music - loadSound("tutorial", "sounds/Getting it Done.mp3"); //135 - loadSound("faith", "sounds/The Friendly Faith Plate.mp3"); //120 - loadSound("sonic", "sounds/SonicInMidSim.wav"); //139 - loadSound("green", "sounds/GreenHill.wav"); //139 loadSound("gameover", "sounds/gameover.mp3"); // @@ -32,9 +35,6 @@ load(new Promise((resolve, reject) => { loadSprite("jellybeanTitle", "sprites/jellybeanTitle.png"); loadSprite("logo", "sprites/logo.png"); loadSprite("jellybeanFail", "sprites/jellybeanFail.png"); - loadSprite("keyA", "sprites/keyA.png"); - loadSprite("keySpace", "sprites/keySpace.png"); - loadSprite("keyClick", "sprites/keyClick.png"); // // Main Game @@ -54,342 +54,22 @@ load(new Promise((resolve, reject) => { } }, }) - // - - // Character - loadSound("hitsoundFaithPlate", "sounds/hitsoundFaithPlate.mp3"); - loadSound("hitsoundJellyBean", "sounds/hitsoundJellyBean.wav"); - loadSound("hitsoundCarterRedacted", "sounds/hitsoundJellyBean.wav"); - loadSound("hitsoundMarc", "sounds/hitsoundJellyBean.wav"); - loadSound("hitsoundRedVelvety", "sounds/hitsoundRedVelvety.wav"); - loadSound("hitsoundSonicAndTails", "sounds/hitsoundJellyBean.wav"); - loadSound("hitsoundMarkyMark", "sounds/burp.mp3"); - loadSprite("JellyBeanPre", "sprites/previews/JellyBeanPre.png"); - loadSprite("RedVelvetyPre", "sprites/previews/RedVelvetyPre.png"); - loadSprite("MarkyMarkPre", "sprites/previews/MarkyMarkPre.png"); - loadSprite("CarterRedactedPre", "sprites/previews/CarterRedactedPre.png"); - loadSprite("MarcPre", "sprites/previews/MarcPre.png"); - loadSprite("FaithPlatePre", "sprites/previews/FaithPlatePre.png"); - loadSprite("SonicAndTailsPre", "sprites/previews/SonicAndTailsPre.png"); - // - - // Cake/tutorial - loadSprite("tutorialBG0", "sprites/bgCake.png"); - loadSprite("tutorialFG0", "sprites/fgCake0.png"); - loadSprite("tutorialFG1", "sprites/fgCake1.png"); - loadSprite("Marctutorial", "sprites/marcCake.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 5, - speed: 20 - }, - miss: { - from: 6, - to: 8, - speed: 10 - }, - }, - }) - loadSprite("CarterRedactedtutorial", "sprites/carterredactedCake.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 5, - speed: 20 - }, - miss: { - from: 6, - to: 8, - speed: 10 - }, - }, - }) - loadSprite("MarkyMarktutorial", "sprites/markymarkCake.png", { - sliceX: 3, - sliceY: 4, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 7, - speed: 40 - }, - miss: { - from: 8, - to: 10, - speed: 10 - }, - }, - }) - loadSprite("RedVelvetytutorial", "sprites/redvelvetyCake.png", { - sliceX: 3, - sliceY: 4, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 5, - speed: 20 - }, - dox: { - from: 6, - to: 7, - speed: 20 - }, - miss: { - from: 8, - to: 10, - speed: 10 - }, - }, - }) - loadSprite("JellyBeantutorial", "sprites/jellybeanCake.png", { - sliceX: 3, - sliceY: 4, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 5, - speed: 20 - }, - dox: { - from: 6, - to: 7, - speed: 20 - }, - miss: { - from: 8, - to: 10, - speed: 10 - }, - }, - }) - // - // Faith/faith - loadSprite("faithBG0", "sprites/bgFaith.png"); - loadSprite("faithFG0", "sprites/fgFaith.png"); - loadSprite("FaithPlatefaith", "sprites/faithplateFaith.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 3, - speed: 20 - }, - talk: { - from: 4, - to: 5, - speed: 20 - }, - miss: { - from: 6, - to: 8, - speed: 10 - }, - }, - }) - // - - // Sonic In Mid Sim/sonic - loadSprite("sonicBG0", "sprites/SonicBG.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 6, - speed: 10, - loop: true - } - }, - }); - loadSprite("sonicFG0", "sprites/SonicFG.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 0, - speed: 20 - } - }, - }); - loadSprite("SonicAndTailssonic0", "sprites/SonicMidSim.png", { - sliceX: 3, - sliceY: 4, - anims: { - idle: { - from: 0, - to: 6, - speed: 20 - }, - talk: { - from: 7, - to: 8, - speed: 20 - }, - miss: { - from: 9, - to: 11, - speed: 10 - }, - }, - }); - loadSprite("SonicAndTailssonic1", "sprites/TailsMidSim.png", { - sliceX: 3, - sliceY: 9, - anims: { - idle: { - from: 0, - to: 15, - speed: 20 - }, - talk: { - from: 16, - to: 23, - speed: 20 - }, - miss: { - from: 24, - to: 26, - speed: 10 - }, - }, - }); - loadSprite("greenBG0", "sprites/SonicBG.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 6, - speed: 10, - loop: true - } - }, - }); - loadSprite("greenFG0", "sprites/SonicFG.png", { - sliceX: 3, - sliceY: 3, - anims: { - idle: { - from: 0, - to: 0, - speed: 20 - } - }, - }); - loadSprite("SonicAndTailsgreen0", "sprites/SonicMidSim.png", { - sliceX: 3, - sliceY: 4, - anims: { - idle: { - from: 0, - to: 6, - speed: 20 - }, - talk: { - from: 7, - to: 8, - speed: 20 - }, - miss: { - from: 9, - to: 11, - speed: 10 - }, - }, - }); - loadSprite("SonicAndTailsgreen1", "sprites/TailsMidSim.png", { - sliceX: 3, - sliceY: 9, - anims: { - idle: { - from: 0, - to: 15, - speed: 20 - }, - talk: { - from: 16, - to: 23, - speed: 20 - }, - miss: { - from: 24, - to: 26, - speed: 10 - }, - }, - }); + for (let ided in charts) { + console.log("Loading game assets..."); + charts[ided].events.preload(); + console.log("Assets of song " + charts[ided].name + " loaded."); + } resolve("All assets loaded."); -})) +})); -var charts = { - "tutorial": [ - 5, // How much seconds it takes to get from Right Stage to the hitmarker - 135, // Song BPM - "................................................................................................................................J...........J.J...........J.J.J.............J.J.................J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J.............J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J.............J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J...................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.............................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J...................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.J.....J.J.....J...........J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.................................J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.....J.J.....J.J.....J.J.....J...................................................................................................................................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................J...........J.J...........J.J.J.............J.J...J...J...J.J...J...........J.J...........J.J...J...............................................................................................................................................................................................................................................................", - 1 //Texture Scale (too lazy to upsize sprites sometimes) - ], - "faith": [ - 2, - 120, - "................................................................................................................................J...J...J...JJJJJ...J...J...J...J.J.J.J.J.J.J.J.JJJJJJJJJ.J.J.JJJ.J.J.J.J.J.JJJJJ.JJJ.J.J.J.J.J.J.JJJ.JJJ.J.J.J.JJJJJJJJJJJJJJJJJ.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.J.JJJ.JJJ.JJJ.JJJ.JJJ.J.J.J.J.JJJ.J.JJJJJJJJJJJJJ.J.J.J.JJJJJ.J.J.J.J.J.J.J.JJJJJ.J.J.J.J.JJ.J..J.JJJ.JJJ.J.J.JJJ.JJJ.J.J.J.JJJJJ.J.J.JJJ.JJJJJJJJJJJJJJJJJ.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.JJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.J.J.JJJ.J.J.JJJ.J.J.J.J.J.J.JJJ.JJJJ.JJ.J.J.J.JJ..J...J.J.J.J.J.J.JJJJJJJJJJJJJ.J.J.J.J.J.J.J.J.J.JJJJJ.J.J.J.J.J.J.J.J...J...J.J.J.J.JJJJJJJJJ.J.J.J.J.J.J.JJJ.J.JJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.J.J.JJJJ.JJJJJJJJJJJJJJJ.JJJJJJJJJJJJJ..J.JJJ.JJJJJJJJJJ....J.J.JJJJJJJ.J.JJJ.JJJJJJJJJJJJJJJJJJJJJ.J.J.J.JJJ.JJJJJJJJJ....JJJJJJJJJ....JJJJJJJ.JJJJJJJ..JJJ..J.JJJJJJJJJJJJJJJ.JJJJJJJ..JJJ....JJJJJJJJJJJJJJJ.JJJJJJJ..JJJ....JJJJJJJJJJJJJJJ.JJJJJJJJ.JJJ..J.JJJJJJJ.J.JJJ.JJJJJJJJJJJJJ.JJJ.J...JJJ.J.JJJ.JJJJJJJJJJJJJ.JJJ.JJJ.JJJ.J.JJJJJJJJJJJJJJJJJJJJJ.JJJ.JJJ.J.JJJ.JJJJJJJJJJJJJJJJJ.JJJ.JJJ.J.JJJ.JJJJJJJJJJJJJJJ...JJJJ........J...JJJJ........J...JJJJ........J...JJJJ........J.J.JJJJ........JJJ.JJJ.JJJ.J.JJJ.J.JJJJ........JJJ.JJJ.JJJ.JJJJJ.J.JJJJ........JJJ.JJJ.JJJ.J.JJJ.J.JJJJ........JJJ.JJJ.JJJ.JJJJJ.J.JJJJJ.......JJJ.J.............", - 4 - ], - "sonic": [ - 2, - 139, - "..................................................J.J.J.J.J.JJ....J.J.J.J..J........JJJJ..J.JJ.J..................T.T.T.T.T.TT....T...T.T..T........TTT.T.T.TT.T..................J.J.J.J.J.J.J.J.J...J...........J.J.J.J.J.JJ..J.................T.T.T.T.T.T.T.T.T...T...........T.T.T.T.T.TT..T...............J.....J.....J.J.J.JJ....T.TT........J.J.J.J.J.J.J.J...J.........T.....T.....T.T.T.TT....J.JJ....DD.D.............................................................", - 1 - ], - "green": [ - 2, - 150, - "................J.....J.....J.....J.....J...J...J.....J.....J...................J.....J.....J...J.....J.....J...J.....J.................................T.T...T.T...T.T...T...........T.T.T...T.T...T.T...T.............T.T...T.T...T.T...T...........T.T.T...T.T...T.T...T.....T.......J.J...J.J...D.J.T.J.T...T.....J.J.J...J.J...D.J.T.J.T...T.......J.J...J.J...D.J.T.J.T...T.....J.J.J...J.J...D.J.T.J.D...D.....J.....J.....J.....J.T.D.T.J.....J.....J.....J.....J.T.D.T.J.....J.....J.....J.....J.T.D.T.J.T.T.T...T.T.T...T.T.T.T.T.T.T.........J.J...J.J...J.J...J...........J.J.J...J.J...J.J...J.............J.J...J.J...J.J...J...........J.J.J...J.J...J.J...J.....J.......T.T...T.T...D.T.J.T.J...J.....T.T.T...T.T...D.T.J.T.J...J.......T.T...T.T...D.T.J.T.J...J.....T.T.T...T.T...D.T.J.T.J.T.D.....T.....T.....T.....T.J.D.J.T.....T.....T.....T.....T.J.D.J.T.....T.....T.....T.....T.J.D.J.T.J.J.J...J.J.J...J.J.J.J.J.J.J................................................................................................................................................................", - 1 - ] -}; -var songIdx = 0; -var idx = 0; - -scene("Game", (arr) => { - var song = arr[0]; //Also Chart access - var char = arr[1]; - var hitsound = "hitsound" + arr[1]; - var chart = charts[song]; - var crochet = ((60 / chart[1]) * 1000); +scene("Game", (idx, noTrans) => { + var song = charts[idx.song].id; //Also Chart access + var char = charts[idx.song].characters[idx.character][0]; + var hitsound = "hitsound" + charts[idx.song].characters[idx.character][0]; + var chart = charts[idx.song].chart; + var crochet = ((60 / charts[idx.song].bpm) * 1000); var board = width() - strumLine; var curBeat; var prevBeat; @@ -400,12 +80,14 @@ scene("Game", (arr) => { var score = 0; var combo = 0; var health = 1; - var font = "apl386o"; + var font = "MidSim"; if (char == "MarkyMark") { font = "unscii"; } + + // Music var strumLine = width() / 2; - const music = play(song, { + const music = play(charts[idx.song].id, { volume: 1, loop: false }); @@ -414,11 +96,13 @@ scene("Game", (arr) => { loop: false }); music.pause() - wait(chart[0], () => { + wait(charts[idx.song].speed, () => { underlay.pause(); music.play(); - underlay.play(music.time() + chart[0]); + underlay.play(music.time() + charts[idx.song].speed); }); + + // Sprites layers([ "bg", "JELLYBEAN", @@ -427,59 +111,94 @@ scene("Game", (arr) => { "ui0", "ui1" ], "ui0"); - var player; - var player2; - if (song == "sonic" || song == "green") { - player = add([ - sprite(char + song + "0"), - layer("JELLYBEAN"), - "dances", - pos(20, 108), - scale(chart[3]) - ]) - player2 = add([ - sprite(char + song + "1"), - layer("JELLYBEAN"), - "dances", - pos(224, 20), - scale(chart[3]) - ]) - } else { - player = add([ + var players = { + main: 0, + empty: 0, + }; + var bg; + var tweenVals = { + fade: 1, + triggered: false + } + tween(tweenVals, ["fade"], 1, 1, 0, easings.easeOutCirc, tweentypes.NORMAL); + if (!charts[idx.song].makeScript.customChar) { + players.main = add([ sprite(char + song), layer("JELLYBEAN"), "dances", (song == "faith" ? pos(0, 0) : pos((width() / 2) - 162, height() - 400)), - scale(chart[3]) - ]) + scale(charts[idx.song].scale) + ]); + } + if (!charts[idx.song].makeScript.customBG) { + bg = add([ + sprite(song + "BG0"), + layer("bg"), + scale(charts[idx.song].scale) + ]); + const fg = add([ + sprite(song + "FG0"), + (song == "faith" ? layer("bg") : layer("fg")), + scale(charts[idx.song].scale) + ]); } - const bg = add([ - sprite(song + "BG0"), - layer("bg"), - scale(chart[3]) - ]) - if(song == "sonic" || song == "green") bg.play("idle"); - const fg = add([ - sprite(song + "FG0"), - (song == "faith" ? layer("bg") : layer("fg")), - scale(chart[3]) - ]) - if (song == "tutorial") { - const fg = add([ - sprite(song + "FG1"), - layer("fg"), - scale(chart[3]) - ]); + var script = charts[idx.song].makeScript.script(players, char, bg); + if (script.returnType != undefined && script.returnType == "character") { + players.main = script.main; + players.empty = script.empty; } const noteClick = add([ sprite("noteClick"), scale(0.25), pos(strumLine, 15) ]) + const bspButton = add([ + pos(0, 0), + color(CYAN), + text(ismobile ? "<" : "BACKSPACE TO EXIT", { + size: ismobile? 32 : 20, // 48 pixels tall + }), + area({ + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + }), + "back" + ]) + const entButton = add([ + pos(width(), 0), + origin("topright"), + color(YELLOW), + text(ismobile ? "||" : "ENTER TO PAUSE", { + size: ismobile? 32 : 20, // 48 pixels tall + }), + area({ + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + }), + "ent" + ]) + // Gameplay onUpdate(() => { if (health > 1) health = 1; - if (health < 0) {health = 0;go("Lose", score, arr);music.stop();} - if (music.time() > music.duration() && health >= 0) {go("Title");} + if (health < 0) { + health = 0; + if(!tweenVals.triggered) { + tween(tweenVals, ["fade"], 1, 0, 1, easings.easeOutCirc, tweentypes.NORMAL, function () { + underlay.stop(); + music.stop(); + go("Lose", score, idx); + }); + underlay.pause(); + music.pause(); + tweenVals.triggered = true; + } + } + if (music.time() > music.duration() && health >= 0) { + if(!tweenVals.triggered) { + tween(tweenVals, ["fade"], 1, 0, 1, easings.easeOutCirc, tweentypes.NORMAL, function () { + go("Help"); + }); + tweenVals.triggered = true; + } + } strumLine = lerp(18, width() / 2, health); noteClick.pos.x = strumLine - 5; curBeat = Math.floor(((music.time() * 1000) / crochet) * 10) / 10; @@ -500,23 +219,26 @@ scene("Game", (arr) => { ]); } if (!get("note" + prevStep).length) { - makeNote(chart[2][Math.floor(prevStep)]); + makeNote(charts[idx.song].chart[Math.floor(prevStep)]); } if (!underlay.isPaused()) { every("bar", (j) => { - j.pos.x = lerp(width(), strumLine, (underlay.time() - j.created) / chart[0]); + j.pos.x = lerp(width(), strumLine, (underlay.time() - j.created) / charts[idx.song].speed); if(j.pos.x <= strumLine) { beatHit(); if (debugMode) play("metro", {detune: j.mainBar ? 200 : 0}); destroy(j); } + if (charts[idx.song].events.onBeat != undefined) { + charts[idx.song].events.onBeat(curBeat); + } }); every("note", (j) => { - j.pos.x = lerp(width(), strumLine, (underlay.time() - j.created) / chart[0]); + j.pos.x = lerp(width(), strumLine, (underlay.time() - j.created) / charts[idx.song].speed); if(autoplay) { if(j.pos.x <= strumLine && !j.empty) { play(hitsound); - player.play("talk"); + players.main.play("talk"); //Check this area later, you want to add in Note Modularity! destroy(j); } } else { @@ -524,17 +246,18 @@ scene("Game", (arr) => { score -= 200; destroy(j); play("explode"); - player.play("miss"); + players.main.play("miss"); shake(5); combo = 0; health -= 0.1; } } - if(j.pos.x >= strumLine - 20 && j.empty) { - if(j.pos.x <= strumLine) { - destroy(j); //Destroys note. No score. - player2?.play("talk"); + if(j.pos.x <= strumLine && j.empty) { + if (!j.normal) { + j.function(); } + destroy(j); + players.empty?.play("talk"); } }); } @@ -552,14 +275,36 @@ scene("Game", (arr) => { }); onKeyPress("space", () => {judgeHitsLol()}); onKeyPress("backspace", () => { - underlay.stop(); - music.stop(); - go("Help") + tween(tweenVals, ["fade"], 1, 0, 1, easings.easeOutCirc, tweentypes.NORMAL, function () { + underlay.stop(); + music.stop(); + go("Help"); + }); + underlay.pause(); + music.pause(); }); onKeyPress("a", () => {autoplay = !autoplay}); onKeyPress("d", () => {debugMode = !debugMode}); + onClick("back", () => { + tween(tweenVals, ["fade"], 1, 0, 1, easings.easeOutCirc, tweentypes.NORMAL, function () { + underlay.stop(); + music.stop(); + go("Help"); + }); + underlay.pause(); + music.pause(); + }); + onClick("ent", () => { + if (!underlay.isPaused()) { + underlay.pause(); + music.pause(); + mt = [underlay.time(), music.time()]; + } else { + underlay.play(mt[0]); + music.play(mt[1]); + } + }); onClick(() => {judgeHitsLol()}); - onTouchStart(() => {judgeHitsLol()}); onDraw(() => { drawLine({ p1: vec2(0, 20), @@ -580,9 +325,9 @@ scene("Game", (arr) => { color: rgb(255, 255, 255), }) drawText({ - text: "MID-SIMULATOR DEMO -- WORK IN PROGRESS!", + text: "MID-SIMULATOR DEMO", size: 20, - pos: vec2(0, 0), + pos: vec2(0, height() - 20), font: font }); if (debugMode) { @@ -599,19 +344,19 @@ scene("Game", (arr) => { font: font }); drawText({ - text: prevStep + "/" + (chart[2].length - 1), + text: prevStep + "/" + (charts[idx.song].chart.length - 1), size: 20, pos: vec2(0, 60), font: font }); drawText({ - text: (chart[2][Math.floor(prevStep)] ? chart[2][Math.floor(prevStep)] : "."), + text: (charts[idx.song].chart[Math.floor(prevStep)] ? charts[idx.song].chart[Math.floor(prevStep)] : "."), size: 20, pos: vec2(0, 80), font: font }); drawText({ - text: (chart[2][Math.floor(curStep)] ? chart[2][Math.floor(curStep)] : "."), + text: (charts[idx.song].chart[Math.floor(curStep)] ? charts[idx.song].chart[Math.floor(curStep)] : "."), size: 20, pos: vec2(0, 100), font: font @@ -639,65 +384,24 @@ scene("Game", (arr) => { drawText({ text: "AUTOPLAY", size: 20, - pos: vec2(strumLine, 120), + pos: vec2(strumLine, debugMode? 140: 120), font: font }); } + drawRect({ + width: 702, + height: 402, + pos: vec2(-1, -1), + color: BLACK, + opacity: tweenVals.fade + }) }) + + //Functions + function makeNote(letter) { - switch (letter) { - case "J": - add([ - rect(10, 50), - pos(width(), 20), - chart[2][Math.floor(prevStep)] == "F" ? color(168, 56, 50) : color(232, 3, 252), - ("note" + prevStep), - "note", - { - created: underlay.time(), - type: chart[2][Math.floor(prevStep)] - } - ]); - break; - case "T": - add([ - rect(0, 50), - pos(width(), 20), - ("note" + prevStep), - "note", - "empty", - { - created: underlay.time(), - empty: true, - type: chart[2][Math.floor(prevStep)] - } - ]); - break; - case "D": - add([ - rect(10, 50), - pos(width(), 20), - chart[2][Math.floor(prevStep)] == "F" ? color(168, 56, 50) : color(232, 3, 252), - ("note" + prevStep), - "note", - { - created: underlay.time(), - type: chart[2][Math.floor(prevStep)] - } - ]); - add([ - rect(0, 50), - pos(width(), 20), - ("note" + prevStep), - "note", - "empty", - { - created: underlay.time(), - empty: true, - type: chart[2][Math.floor(prevStep)] - } - ]); - break; + if (charts[idx.song].noteTypes.hasOwnProperty(letter)) { + charts[idx.song].noteTypes[letter](underlay.time(), letter, prevStep, char); } } function judgeHitsLol() { @@ -712,6 +416,9 @@ scene("Game", (arr) => { if(j.pos.x <= strumLine + 22) { hits++; iv = true; + if (!j.normal) { + j.function(); + } destroy(j); //Destroys note. No score. noteClick.play("click"); combo += 1; @@ -720,7 +427,7 @@ scene("Game", (arr) => { } if(j.pos.x <= strumLine + 12) { play(hitsound); //Plays sound! - player.play("talk"); + players.main.play("talk"); score += 20; health += 0.01; str = "Perfect!"; @@ -767,179 +474,175 @@ scene("Game", (arr) => { } function beatHit() { every("dances", (obj) => { - if (player.curAnim() != "talk" && player.curAnim() != "miss") { + if (obj.curAnim() != "talk" && obj.curAnim() != "miss") { obj.play("idle"); } }); } }); -scene("Help", () => { - var songs = [ - "tutorial", - "faith", - "green", - "sonic" - ]; - var names = [ - "Tutorial", - "Friendly Faith Plate", - "Green Hill Zone", - "Emerald Hill Zone" - ] - var chars = { - tutorial: [ - "JellyBean", - "RedVelvety", - "Marc", - "CarterRedacted", - "MarkyMark" - ], - faith: [ - "FaithPlate" - ], - green: [ - "SonicAndTails" - ], - sonic: [ - "SonicAndTails" - ] +scene("Help", (noTrans) => { + var index = { + character: 0, + song: 0 } + var tweenVals = { + fade: 0 + } + if (!noTrans) tween(tweenVals, ["fade"], 1, 1, 0, easings.easeOutCirc, tweentypes.NORMAL); const bg = add([ sprite("bgCake") ]); onDraw(() => { + if (!ismobile) { + drawText({ + text: "D: ENABLE DEBUG MODE", + size: 30, + pos: vec2(25, 25) + }); + drawText({ + text: "A: ENABLE AUTOPLAY", + size: 30, + pos: vec2(25, 60) + }); + } drawText({ - text: "CONTROLS", + text: ismobile ? "TAP TO HIT NOTES" : "SPACE/CLICK: HIT NOTE", size: 30, - pos: vec2(25, 25) + pos: ismobile ? vec2(25, 60) : vec2(25, 95) }); drawText({ - text: ": ENABLE AUTOPLAY - ENTER TO PAUSE", - size: 30, - pos: vec2(60, 60) - }); - drawText({ - text: " / : HIT NOTE", - size: 30, - pos: vec2(55, 95) - }); - drawSprite({ - sprite: "keyA", - width: 60, - height: 60, - pos: vec2(5, 45) - }) - drawSprite({ - sprite: "keySpace", - width: 60, - height: 60, - pos: vec2(20, 80) - }) - drawSprite({ - sprite: "keyClick", - width: 60, - height: 60, - pos: vec2(95, 80) - }) - drawText({ - text: "SOUND & SHAKING WARNINGS", - size: 30, - pos: vec2(width() / 2 - 105, 25) - }); - drawText({ - text: "CHARACTER ("+ (idx + 1) +"/"+ chars[songs[songIdx]].length +"): " + chars[songs[songIdx]][idx], + text: charts[index.song].characters[index.character][1] + " ("+ (index.character + 1) +"/"+ charts[index.song].characters.length +")", size: 30, pos: vec2(width() / 2, 200), origin: "top" }); drawText({ - text: "SONG ("+ (songIdx + 1) +"/"+ songs.length +"): " + names[songIdx].toUpperCase(), + text: charts[index.song].name, size: 30, pos: vec2(width() / 2, 160), origin: "top" }); drawSprite({ - sprite: chars[songs[songIdx]][idx] + "Pre", + sprite: charts[index.song].characters[index.character][0] + "Pre", width: 64, height: 64, pos: vec2((width() / 2) - 34, 248) }); + drawRect({ + width: 702, + height: 402, + pos: vec2(-1, -1), + color: BLACK, + opacity: tweenVals.fade + }) }) add([ pos(0, 140), rect(700, 200), color(0, 0, 0) - ]) + ]) var lt = add([ pos(10, 200), text("<", { size: 30 }), - area(), + area({ + height: 30, + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + width: 30, + cursor: "pointer" + }), "LeftText" ]) var rt = add([ - pos(width() - 30, 200), + pos(width() - 10, 200), + origin("topright"), text(">", { size: 30 }), - area(), + area({ + height: 30, + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + width: 30, + cursor: "pointer" + }), "RightText" ]) var dt = add([ pos(10, 160), - text("v", { + text("%", { size: 30 }), - area(), + area({ + height: 30, + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + width: 30, + cursor: "pointer" + }), "DownText" ]) var ut = add([ - pos(width() - 30, 160), + pos(width() - 10, 160), + origin("topright"), text("^", { size: 30 }), - area(), + area({ + height: 30, + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + width: 30, + cursor: "pointer" + }), "UpText" ]) var clickText = add([ - pos(25, height() - 60), - text("Press Space or Click Here to start", { + pos(width() / 2, height() - 45), + text(ismobile ? "TAP HERE TO START" : "SPACE TO START", { size: 30 }), - area(), + origin("top"), + area({ + height: 30, + offset: ismobile ? vec2(canvas.offsetLeft, canvas.offsetTop) : vec2(0, 0), + width: 700, + cursor: "pointer" + }), "TEXT TEXT" ]) function changeIdx(amt) { - idx += amt; - if (idx < 0) { - idx = chars[songs[songIdx]].length - 1; - } else if (idx >= chars[songs[songIdx]].length) { - idx = 0; + index.character += amt; + if (index.character < 0) { + index.character = charts[index.song].characters.length - 1; + } else if (index.character >= charts[index.song].characters.length) { + index.character = 0; } } function changeSongIdx(amt) { - songIdx += amt; - idx = 0; - if (songIdx < 0) { - songIdx = songs.length - 1; - } else if (songIdx >= songs.length) { - songIdx = 0; + index.song += amt; + index.character = 0; + if (index.song < 0) { + index.song = charts.length - 1; + } else if (index.song >= charts.length) { + index.song = 0; } } onKeyPress("left", () => {changeIdx(-1)}); onKeyPress("right", () => {changeIdx(1)}); - onKeyPress("down", () => {changeSongIdx(1)}); - onKeyPress("up", () => {changeSongIdx(-1)}); - onKeyPress("`", () => {go("Chart", songs[songIdx])}); - onClick("LeftText", () => {changeIdx(-1)}); - onClick("RightText", () => {changeIdx(1)}); - onClick("DownText", () => {changeSongIdx(1)}); - onClick("UpText", () => {changeSongIdx(-1)}); - onKeyPress("space", () => {go("Game", [songs[songIdx], chars[songs[songIdx]][idx]]);/*losemus.stop();*/}); - onClick("TEXT TEXT", () => {go("Game", [songs[songIdx], chars[songs[songIdx]][idx]]);/*losemus.stop();*/}); + onKeyPress("down", () => {changeSongIdx(-1)}); + onKeyPress("up", () => {changeSongIdx(1)}); + onKeyPress("`", () => {go("Chart", index.song)}); + lt.onClick(() => {changeIdx(-1)}); + rt.onClick(() => {changeIdx(1)}); + dt.onClick(() => {changeSongIdx(-1)}); + ut.onClick(() => {changeSongIdx(1)}); + onKeyPress("space", () => { + tween(tweenVals, ["fade"], 1, 0, 1, easings.easeOutCirc, tweentypes.NORMAL, function () { + go("Game", index); + }); + }); + clickText.onClick(() => {go("Game", index);/*losemus.stop();*/}); }); scene("Title", () => { @@ -957,14 +660,15 @@ scene("Title", () => { ]); onDraw(() => { drawText({ - text: "SPACE/CLICK TO START", + text: "SPACE TO START", size: 30, - pos: vec2(width() / 2 - 90, height() - 60) + origin: "top", + pos: vec2(width() / 2, height() - 45) }); }) - onKeyPress("space", () => {go("Help", ["tutorial"]);/*losemus.stop();*/}); - onClick(() => {go("Help", ["tutorial"]);/*losemus.stop();*/}); - onTouchStart(() => {go("Help", ["tutorial"]);/*losemus.stop();*/}); + onKeyPress("space", () => {go("Help", true);/*losemus.stop();*/}); + onClick(() => {go("Help", true);/*losemus.stop();*/}); + onTouchStart(() => {go("Help", true);/*losemus.stop();*/}); }); scene("Lose", (score, song) => { @@ -979,12 +683,12 @@ scene("Lose", (score, song) => { }); onDraw(() => { drawText({ - text: "YOU LOST LOL WHOOPS", + text: "OUCHIE!", size: 60, pos: vec2(0, height() - 120) }); drawText({ - text: "SPACE/CLICK TO RESTART", + text: ismobile ? "TAP TO RESTART" : "SPACE TO RESTART", size: 30, pos: vec2(0, height() - 60) }); @@ -998,18 +702,18 @@ scene("Lose", (score, song) => { onClick(() => {go("Game", song);losemus.stop();}); }); -scene("Chart", (song) => { - var chart = charts[song]; - var crochet = ((60 / chart[1]) * 1000); +scene("Chart", (idx) => { + var chart = charts[idx].chart; + var crochet = ((60 / charts[idx].bpm) * 1000); var curBeat; var curStep; var songTime = 0; var tool = "J"; - const music = play(song, { + const music = play(charts[idx].id, { volume: 1, loop: false }); - music.pause() + music.pause(); var lastTargeted = 4; var tempChart = Array.from(Array(Math.floor((music.duration() * 1000) / (crochet / 4))), () => "."); diff --git a/readme.md b/readme.md deleted file mode 100644 index 7589ea3..0000000 --- a/readme.md +++ /dev/null @@ -1,8 +0,0 @@ -# Mid Sim - -## ToDo - -* Good practices in Js code -* Module code -* Custom font -* More minimization? \ No newline at end of file diff --git a/sprites/MidSimFont2.png b/sprites/MidSimFont2.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2d4819f7602ab9edf16780fd84ff31e444f507 GIT binary patch literal 1177 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 diff --git a/sprites/PC_jellybeanTitle.png b/sprites/PC_jellybeanTitle.png deleted file mode 100644 index 2313b11e0feccc1747d960b735017ed48d1cf09f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5276 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 DF0a$p diff --git a/sprites/bean.png b/sprites/bean.png deleted file mode 100644 index ff4a69fa7899b76edf4dce47112a566222534580..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2546 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 TFX;yQiow&>&t;ucLK6c3!|PwU diff --git a/sprites/keyA.png b/sprites/keyA.png deleted file mode 100644 index 7b086a76f0f7fa430ea525c5cd655ee2f2c80726..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1008 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSjKx9jP7LeL$-HD>U|!|v;uum9 z_jayh(QN|(mY4l6T5VnnT77Q)iHg0DHOaIL{W#j zFE1DW=wuM#XJk}hILawvZ^uSEI*#R8<-f;U7jN7hIqm4HOOd(Hq)izmq<3VPG6@Ju z{rN7Tz|h6Wrmh!p?jXbJ^nW(zSL@!-+g{ws^X^-XUAVU1=}m7H<~DBm+0DWzA+u}V zQw|6IwX$0!6x!MtliV^zB@}qyoau0Hb~8qKs$NNKU|I3r`xBo4^Dzd) z#ap;|CbUf}ZwT8Wv0!S5)7_`M8*16U8`=EY&2f)0>CsAH7|dsHU~FngYWTq>zxDuw zJEz=_KTml!g#LRWeP_4adxk=*cBux2BM0tl8#o+zow2~cLB@kez}Rc`0R{;L-I%r9 z$qivaoTU;B%qmA#<$Lm6IG&yH^(n8xlxrrwHT(v%UYIPEO88R7c_3pEi$hjo=I8Kf z1_yq4U)}TQDf5NZZ*(p9aps)6^zKjyvp~c7;)4t|{2P8h>-(j^CgECi+zM#yn~t+L z`V$&9+UyQH%pkEq+d%TDghF%H<5|;<9UkxW*M1z&a&$$zltNy49xG!a(lT(6in_-bbukIz z5d}uA_YAcG_EHP-HUDS*+uv~CSc&1#om=)yEjd9^$qYOjR2BBNTzaN2wA%f^&IYlz`XIQxFcWqrzf@^`U|&MvK?Shk2kv&`IqOE#TOPC zImRlk)^Z01F8=s`sxF1!#Eu_l5KF$0+r;qVMs$hVpkzPNzc7(!ew0!hBQOgyc)I$z JtaD0e0s!02eu4l1 diff --git a/sprites/keyClick.png b/sprites/keyClick.png deleted file mode 100644 index 22e10b8bd76c54e929c13c781e37554cd74bdeb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1088 zcma)+ZA_B~5XbLn%d>*jm6vJ@GP*4YQ(0RO3aIc1z3@(zU;%@Ke^ofE|=Wh z#RPuTb_Z7n0N5TA%}cT={Dk&-qbc4I60f?(Hyd%klCoBy|s+~F1 z2)`&SdZzq4Mp{0~*Skv^8rU-WbRqe)*zk^Q@)%k~DZORjC(D z|MA`?4=T!VpyCsxiaRw38OtXa#_j`29VnZyWC9_f0h_aO0P*Il3)kp4xOgRWmQXOL zaQ1!@f-=Ei?~?05{7*U4UG`3o`}NTS&C0v1LkP715US|cSOF*YAq8!!e^xr*eRgF} z;_|{uSMs^86T^#w+{R|pdd@)=L`(T|V;Dt!W2MoRn77SbKEw&?!enGG;KteFkn z)!I4)&tFJSty>C?b%w0fiz10sxL*|oDR+P}uF$EQ+4$=t42tpAcuq=}7+)-I|I(g} z7j9!h^(u#7ipbU0%jrOA^WthUkDn=CV2G^8ddqFYXx4Iqf)I13od~u%GT_`-xr5~h zTTh(Ky61wn7u*M z=#ct^kdJy0IGCF#-VQZu#PmvJw3dxsNlddt$>D3c85AQbM@Hqnd)XNMC`A-eiL_iJ z{LaSU=jQ?mnoaD74S`Cm3%vlBAVKP%P!1dlfaGEJuP7 z*9$L~>|w$M+J|oj9iXf@w(XwPhPuTAPeI2>R($@)aLv-9J=*jc)rHDME8~*~(4xg~Ah-E`?u5&~*}K34QW_)H9_tsV0!E6;uum9 z_jazMpOd2i>qn(IAJ$v4ysmfBTa;*-Fz4sbwael~t&^;0hR51;9{f@Gu~F?qqhJ1y zZl(jO0Sv4S!VSl_Gm0?yG05F#3t+Hdtf-N8V0^&x;A1W&k`kObx4&_w3(3~s|NhYR z|1}0KfxZ8`nNr@D&+=nj*0G6wpK!vDnfr5ZJ3Oe`nyPV{`2$SGm0og zFtKvPz4J0*jaVpRvzX!F>DbO?4BAtg(nS<1c4}V~NoWoF(8I){U#>cfX-xpvyugMB zPuIBwH;8&2H0Bc6b7yJ>*9Ire3OB~4>AQt|8N)PK&uch*C<+3WRoaEoCb-=UXf9@V$hTkCtU$wXW+Vj88@kqVSpVGvu2hN*$eXUJ< z{_sBY83x(EyO?BDza9T#+aCy&vjK z?f(s2=0viHC}huXzpQZ}F(vZ8f#`#}{pqS^XB{4t?dCmy|6lq9rWEPL3^#wzT^8J+ zx#$fe>xp~sP3AKB2&VFDIDD&H{!%2NOQSkL%b~31@?N2e-?j}M5iBANTij=A;R!3CMLM0(bkt0FL6V*IA1bc3!nCmB+>+R+g%3+o6ZfMPTy!wNDhV~6D zjwYp!h@Z?grb@46m0euYXYQ3xe-@K=uE9P_YFe~8PuRj2N0bwD^(@!3%5z@uWp8E) zZp-#RmK69;HvjsMkiAktd;i`4{yf7gJ%+i4_fT@%Tai}vmc`nx(I49ic2D$Q+WNi4 zxlbnGN6gErsq!MvSN&OZ!}G}U1M91@cFM2$pP>9c;t=zpz0)F%_MKmxcWI91nR6a* zC*5rJp2Lx7QsSkP7?k3XiE@$v`^>bP0l+XkK D7!486 diff --git a/sprites/previews/SonicAndTailsPre.png b/sprites/previews/SonicAndTailsPre.png index 8a16810f2bbc7a73933e9c876e19d2875aa52854..0c1869a7e9ed294916a694cf0b5b7adbd560b344 100644 GIT binary patch delta 255 zcmVnJ*t|sgQlk5%YL8XoIfjp(Pw5rMnB~LR90N;^hW^IP(@C{<&fonV=uTkB zr}*;ify@Wm#RPCzYRKq1QwnsA7Fa+fSZ6 zk_h~QgeTwTrlH-x0X}kajcy*(@n!Fi$fsbdM5fkV?3-HKHiLjD4^Hn%Bpw${Qan00000 LNkvXXu0mjf`wDyQ diff --git a/sprites/previews/TailsPre.png b/sprites/previews/TailsPre.png new file mode 100644 index 0000000000000000000000000000000000000000..fcfda769a479b9d5dae4b368c0f447ff2bef6c56 GIT binary patch literal 287 zcmV+)0pR|LP)$zP zMqAhL>Y(4e-1Cdw_9J7=%Zt^2Sk6>zE3olB$o7Hm+X1?N%VbTe=iiOox-FD0V;r7Dh9 zVxGfCOGF=qKN#&clF(a_(Rc{(ZAj`^#<1JwyM@f2UaJ&^f8JDC6uOAZ-bhq^%5 lXn_S(LeAcbYWXqu#uLABwyHT5gH8Yd002ovPDHLkV1n!WetrM| literal 0 HcmV?d00001