From c4144974dabfa526274c58b9975ca279702ac337 Mon Sep 17 00:00:00 2001 From: phthallo <84078890+phthallo@users.noreply.github.com> Date: Wed, 10 Jul 2024 00:18:42 +0930 Subject: [PATCH] add: hallowed knight (#1893) * add: hallowed knight source * add: hallowed knight thumbnail * fix: broken metadata oops * Fixing metadata * fixing paths * delete old paths --------- Co-authored-by: graham --- games/hallowed_knight.js | 1056 +++++++++++++++++++++++++++++++++ games/img/hallowed_knight.png | Bin 0 -> 38069 bytes 2 files changed, 1056 insertions(+) create mode 100644 games/hallowed_knight.js create mode 100644 games/img/hallowed_knight.png diff --git a/games/hallowed_knight.js b/games/hallowed_knight.js new file mode 100644 index 0000000000..bc38de9940 --- /dev/null +++ b/games/hallowed_knight.js @@ -0,0 +1,1056 @@ +/* +First time? Check out the tutorial game: +https://sprig.hackclub.com/gallery/getting_started + +@title: Hallowed Knight +@author: phthallo +@tags: [] +@addedOn: 2024-07-09 +*/ + +/* Definitely not inspired by Hollow Knight. +--Controls-- +W: Jump +A: Left +D: Right +J: Attack +K: Interact +L: Dash (unlocked ability) + +To go through a downward transition, press any key. +Attacks and dashes can only be done in the direction you were last facing. +To interact with an item, stand in front of it and press K. +The exception to this is the Key Gate (a black column). For this, you will need to obtain a key and interact next to it. +The green things in jars are Grubs, collectibles from Hollow Knight. Free them by attacking the jar they are in. +Dashes can be used to reach areas you were previously unable to reach. +Keep an eye out for walls that look slightly different to the others. +*/ +const mask = "m" +const maskLost = "d" +const player = "p" +const stone = "s" +const background = "b" +const screenTransitionTop = "i" +const screenTransitionLeft = "j" +const screenTransitionRight = "l" +const screenTransitionBottom = "k" +const grass = "g" +const backgroundGrass = "t" +const acid = "a" +const black = "e" +const chest = "c" +const key = "h" +const currency ="n" +const keyGate = "w" +const dashStatue = "f" +const dashAbility="u" +const rightSlash = "x" +const leftSlash = "z" +const tiktik = "q" +const grub = "o" +const fakeWall = "r" +const sign = "v" +const baba = "y" + +const movementY = 2 +const movement = 1 + +var lives = 3 +var inventory = [] +var money = 0 +var freedGrubs = 0 +var lastXInput = "" +var tiktikHealth = 5 +var wallHealth = 3 +var grubJarHealth = 2 + +var keyGet = false +var key2Get = false +var r1GrubSave = false +var r5GrubSave = false +var r8GrubSave = false +var r9GrubSave = false +var keyGateOpen = false + +var gameWon = false + + +const slashSFX = tune` +177.5147928994083: C4/177.5147928994083 + B4/177.5147928994083, +5502.958579881657` +const hurtSFX = tune ` +140.18691588785046: G4-140.18691588785046 + E4-140.18691588785046, +4345.794392523364` +const deathSFX = tune ` +500: G5/500, +15500` + +setLegend( + // UI ELEMENTS + [maskLost, bitmap ` +................ +....22222222.... +...2000000002... +..200110000002.. +..201110011102.. +..201110011102.. +..201110000002.. +..201100000002.. +..201000001102.. +..200011001102.. +..201111101102.. +..200111100002.. +...2000110002... +....22000022.... +......2222...... +................`], + [mask, bitmap ` +....22222222.... +...2000000002... +..201111111102.. +..201111111102.. +..201111111102.. +..201LL11LL102.. +..201LL11LL102.. +..201LL11LL102.. +..201111111102.. +..201111111102.. +..200111111002.. +...2000110002... +....22000022.... +......2002...... +.......22....... +................`], + [key, bitmap ` +................ +..........6666.. +.........666666. +.........66..66. +.........66..66. +.........666666. +........666666.. +.......666...... +......666....... +.....666........ +....66666....... +...666..6....... +.....66..6...... +......6......... +.......6........ +................`], + [currency, bitmap ` +....22222222.... +...2000000002... +..206666666602.. +.20666666666602. +20662FFFFFF66602 +2062226666626602 +2066266666626602 +2066F66666626602 +2066F66666626602 +2066F66666626602 +2066F66666626602 +2066622222266602 +.20666666666602. +..206666666602.. +...2000000002... +....22222222....`], + [dashAbility, bitmap ` +................ +................ +................ +...22222..222... +..200000220002.. +.20LLLLL00LLL02. +.20L00LLLLLLLL02 +.200000LLLLLLL02 +.20LLLLLLLLLLL02 +.20L0000LLLLL02. +..200LLLLLLLL02. +...20L00000LL02. +...20L00LLLLL02. +....2000L00002.. +.....220L0222... +.......202......`], + [player, bitmap` +................ +..000......000.. +..020......020.. +..020......020.. +...0200000020... +...0022222200... +....02022020.... +....02022020.... +....02222220.... +.....022220..... +.....000000..... +....00LLLL00.... +....0LLLLLL0.... +....0LLLLLL0.... +....00LLLL00.... +.....00LL00.....`], + [screenTransitionTop, bitmap ` +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................`], + [screenTransitionLeft, bitmap ` +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL............. +LLL.............`], + [screenTransitionRight, bitmap ` +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL +.............LLL`], + [screenTransitionBottom, bitmap ` +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +................ +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL +LLLLLLLLLLLLLLLL`], + // OTHER STUFF + [rightSlash, bitmap ` +................ +................ +222............. +.22222.......... +..22222......... +...2222......... +...22222........ +...222222....... +....22222....... +....22222....... +....22222....... +....22222....... +....22222....... +...22222........ +..22222......... +................`], + [leftSlash, bitmap ` +................ +.............222 +..........22222. +.........22222.. +.........2222... +........22222... +.......222222... +.......22222.... +.......22222.... +.......22222.... +.......22222.... +.......22222.... +........22222... +.........22222.. +................ +................`], + [baba, bitmap` +................ +................ +................ +................ +..........2..... +......22..22.... +......222.22.... +...222222222.... +..22222222222... +.2222222222022.. +.2222222202222.. +.2222222222222.. +..22222222222... +..22.22.22.22... +.222.22.22.22... +.22..22..22.2...`], + [sign, bitmap ` +................ +................ +................ +................ +................ +................ +...CCCCCCCCCC... +...C00C000C0C... +...CCCCCCCCCC... +...C0CC0C000C... +...CCCCCCCCCC... +...CC0C00C00C... +...CCCCCCCCCC... +.......CC....... +.......CC....... +.......CC.......`], + [fakeWall, bitmap ` +0000000000000000 +0111111111LL11L0 +01LLLL11000011L0 +0111LLL111L011L0 +0LL1LLL111100000 +0L1LLLL1000L11L0 +0L11111111LL11L0 +0LLLL111110LL000 +000001LLL00LL0L0 +011111LL01011000 +001L00111L00L1L0 +00000111L0L11010 +0L1LL1000LL01000 +0LLL11101010LLL0 +0LLL11LL1100LLL0 +0000000000000000`], + [grub, bitmap ` +.......00....... +........0....... +.....000000..... +.00000000000000. +0LLLLLLLLLLLLLL0 +0000000000000000 +.0............0. +.0...DDD......0. +.0..FF0DD.....0. +.0..FFDDDD....0. +.0....44DD....0. +.0....44DD....0. +.0...040DD....0. +.0....44DDD...0. +.000..040DDD000. +...0000000000...`], + [tiktik, bitmap ` +................ +................ +................ +................ +................ +................ +................ +................ +................ +..00000000000... +..022201L1L1L0.. +.0202201L1L1L0.. +.0022201L1L1L0.. +.0222201L1L1L0.. +..000000000000.. +...0.0.0.0.0.0..`], + [dashStatue, bitmap ` +................ +..222......222.. +.21112....21112. +2111112222111112 +2112111111112112 +2112212112122112 +.212.221122.212. +.......22....... +................ +...LLLLLLLLLL... +......LLLL...... +......LLLL...... +......LLLL...... +......LLLL...... +....LLLLLLLL.... +................`], + [keyGate, bitmap ` +.....000000..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....0LLLL0..... +.....000000.....`], + [chest, bitmap ` +................ +................ +................ +................ +................ +................ +..000......000.. +..0F00000000F0.. +..0FCCCCCCCCF0.. +..0FFFF11FFFF0.. +..0FCCC11CCCF0.. +..0FCCCCCCCCF0.. +..0FCCCCCCCCF0.. +..0FCCCCCCCCF0.. +..0FCCCCCCCCF0.. +..000000000000..`], + [stone, bitmap ` +0000000000000000 +0111111111LL1110 +01LLLLL111LL11L0 +0111LLL111LL1110 +0LL1LLL111LL1110 +0L1LLLL1000L11L0 +0L111111110L11L0 +0LLLL111110L11L0 +000001LLL11111L0 +011111LL011111L0 +001L00111110L1L0 +0000011100011110 +0L1LL1000LL11110 +0LLL11111110LLL0 +0LLL11LL1100LLL0 +0000000000000000`], + [background, bitmap ` +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111`], + [grass, bitmap ` +0000000000000000 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0DDDDDDDDDDDDDD0 +0000000000000000`], + [backgroundGrass, bitmap ` +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444 +4444444444444444`], + [acid, bitmap ` +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF +FFFFFFFFFFFFFFFF`], + [black, bitmap ` +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000`], +) + +setSolids([player, stone, grass, keyGate, grub, fakeWall, black]) + +setBackground(background) + +let level = 0 +const levels = [ + map ` +ssssssssssiiis +s............s +s.......q....s +s....vssssssss +s...ss.......s +s............s +s..ssss......s +sp...........s +ssssssssssskks`, // R0: spawn room + map ` +sssssssssssiis +s...........ps +s..sssssssssss +sv...........s +ssssssssss...s +sssss........s +ssrrr.....ssss +ssrrr.......cs +ssssssssssssss`, // R1: room below spawn room w/ chest + map ` +ssssssssssiiis +s........w...s +s.....ssssssss +s....sssssssss +s...ssssss.s.s +s.ssssssss...s +jp...........s +sss..........s +ssssssssssskks`, // R2: hub room between grass and stone + map ` +gggggggggggggg +j............g +j............g +gggaaagg.....g +ggggggggg....g +g....ggggg...g +g.....ggggg.pl +g......q....gg +gkkggggggggggg`, // R3: grass with acid lake + map ` +giiggggggggggg +ggp..........g +ggggg........g +gggggg......cg +gggggggggggggg +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee`, // R4: grass with chest + map ` +sssssssiisssss +ssssssss.....s +sssssssss....s +sssssssssss..l +sssssss......l +sssssss....sss +ssssrrr..sss.. +ssssrrr....p.. +sssssssssssskk`, // R5: room above hub room + map ` +ssssssssssssss +s............s +s...ss.......s +j..ss......q.s +jpss....ssssss +sss..........s +s...ss.....f.s +s.........vsvs +ssssssssssssss`, // R6: dash room + map ` +j..........g.l +ggg..g.....g.l +.........ggg.g +.....gg.....pg +............gg +gg..ggg.....gg +g...........gg +aaaaaaaaaggggg +aaaaaaaaaggggg`, // R7: room after acid lake room + map ` +ssssssssssssss +s.....ss.....s +s.....ssy....s +s...ssssss...s +s............s +s.ss..ss..ss.s +s............s +s........p..ss +sssssskkssssss`, // R8: room above the room above hub room + map ` +gggggggggggggg +g...........pl +g.gg......gggg +g.....ggg.gggg +g............. +j...........gg +gggg...gg..... +aaaaaaaaaaaaaa +aaaaaaaaaaaaaa`, // R9: platforming room after R7 + map ` +eeegiiiiigeeee +eeeg.....geeee +eeeggg...geeee +eeeg.....geeee +eeeg...gggeeee +eeeg.....geeee +eeeggg...geeee +eeeg....pgeeee +eeegggggggeeee`, // R10: the final climb! + // GAME OVER + map ` +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee +eeeeeeeeeeeeee`, + +] + +/* How to interpret the levelsDir => +"roomNumber": [ + [top transition info -> roomNumber, spawnX, spawnY], + [left "], + [right "], + [bottom "], +backgroundBitmap, +[ + [hazard, [respawnX, respawnY]] +], +[ + [secret, [secretX, secretY]] +] +] +*/ + + +// PLEASE DONT JUDGE THIS ABOMINATION OF CODE +var levelsDir = { + "R0": [ + [2, 9, 7], null, null, [1, 12, 1], background, [[tiktik, [1, 7]]], null, ["J: attack", [0,15]] + ], + "R1": [ + [0, 9, 7], null, null, null, background, null, [[grub, [2, 7], r1GrubSave]], ["K: interact", [0, 15]] + ], + "R2": [ + [5, 10, 7], [3, 10, 6], null, [0, 10, 2], background, null, null, null + ], + "R3": [ + null, [7, 13, 3], [2, 1, 6], [4, 2, 1], backgroundGrass, [[acid, [8, 3]], [tiktik, [10, 6]]], null + ], + "R4": [ + [3, 4, 7], null, null, null, backgroundGrass, null, null, null + ], + "R5": [[8,9,7], null, [6, 3, 4], [2, 11 , 1], background, null, [[grub, [4,7], r5GrubSave]], null], + "R6": [null, [5, 12, 4], null, null, background, [[tiktik, [10,7]]], null, ["L: dash", [0,15]]], + "R7": [null, [9, 12, 1], [3, 1, 2], null, backgroundGrass, [[acid, [11,6]]], null, null], + "R8": [null, null, null, [5, 8, 1], background, null, [[grub, [5,2], r8GrubSave]], null], + "R9": [null, [10, 7, 8], [7, 0, 0], null, backgroundGrass, [[acid, [12,1]]], [[grub, [13, 4], r9GrubSave]], null], + "R10": [[11,2,3], null, null, null, backgroundGrass, null, null, null] +}; + +setMap(levels[level]) + +setPushables({ + [player]: [] +}) + +// generate masks +updateHealth() +addSprite(0,1, currency) +updateCurrency(0) + +// Jumps are two units, and if we don't check if there are platforms +// directly above the Knight it will simply move through it. +function ceilingCheck(sprite) { + var yPos = sprite.y + sprite.y -= movement // try to move the sprite up + if (sprite.y == yPos) { // if moving up didnt work + return true + } else // uh oh move it back + sprite.y += movement + return false +} + +// Check if the Knight is currently on a platform. +function groundCheck(sprite) { + var yPos = sprite.y + sprite.y += movement // try to move the sprite down + if (sprite.y == yPos) { + // do nothing because apparently javascript doesnt have pass + return true + } else + sprite.y -= movement // wow the sprite is not currently on the ground! move it back + return false +} + +// While the Knight is not on the ground, move downwards. +function moveDown(sprite) { + setTimeout(() => { + while (!(groundCheck(sprite))) { + sprite.y += movement; + } + }, 150); +} + +// Room transitions + regenerate the UI +function checkInteraction(sprite1, lvl) { + const arr = ["i", "j", "l", "k"] + knightCoords = getTile(getFirst(sprite1).x, getFirst(sprite1).y) + currentLevel = "R" + lvl + for (roomDirection in [0, 1, 2, 3]) { + if (knightCoords.find(sprite => sprite.type == arr[roomDirection]) && (levelsDir[currentLevel][roomDirection])) { + roomInfo = levelsDir[currentLevel][roomDirection] + level = roomInfo[0] + setMap(levels[level]) + setBackground(levelsDir["R"+level][4]) + spawnSecrets(levelsDir["R"+level][6]) + getFirst(sprite1).x = roomInfo[1] + getFirst(sprite1).y = roomInfo[2] + // Refresh UI + if (keyGateOpen==true && level == 2){ + getFirst(keyGate).remove() + } + tiktikHealth = 5 + refreshScreen() + } + } +} + +function refreshScreen(){ + clearText() + updateHealth() + updateInv() + updateCurrency(0) + addSprite(0,1, currency) +} + +function checkHazard(sprite, hazard, respawnCoords) { + directions = + [getTile(getFirst(sprite).x, (getFirst(sprite).y)), + getTile((getFirst(sprite).x), (getFirst(sprite).y)+1), + getTile((getFirst(sprite).x), (getFirst(sprite).y)-1)] + for (knightCoords in directions){ + if (directions[knightCoords].find(sprite => sprite.type == hazard)) { + lives -= 1 + playTune(hurtSFX) + updateHealth() + console.log(lives) + getFirst(sprite).x = respawnCoords[0] + getFirst(sprite).y = respawnCoords[1] + } + } +} + + +function checkGate(knight){ + gateCoords = getTile(getFirst(knight).x+1, (getFirst(knight).y)) + if (gateCoords.find(sprite => sprite.type == keyGate) && (inventory.includes("h"))) { + inventory.splice(inventory.indexOf("h"), 1) + keyGateOpen = true + getFirst(keyGate).remove() + refreshScreen() + } + console.log(inventory) +} + +function spawnSecrets(secretInfo){ + if (secretInfo){ + if (!(secretInfo[0][2])){ // If the secretObtained variable is fase + const secretType = secretInfo[0][0]; + const [secretX, secretY] = secretInfo[0][1]; // secret spawn coordinates + if (secretType === grub) { // the secret is grub + if ((level === 1 && !r1GrubSave) || + (level === 5 && !r5GrubSave) || + (level === 8 && !r8GrubSave) || + (level === 9 && !r9GrubSave)) { + addSprite(secretX, secretY, secretType); + console.log("addedSprite"); + } + } else { + addSprite(secretX, secretY, secretType); + console.log("addedSprite"); + } + } + } else { + console.log("secret info false"); + } +} + +function updateHealth(){ + for (let i = 0; i < 3; i++){ + if (i < lives){ + addSprite(i,0, mask) + } else + addSprite(i,0, maskLost) + } +} + +function updateInv(item=null){ + if (item){ + inventory.push(item) + } + for (let i = 0; i < inventory.length; i++){ + addSprite(i, 2, inventory[i]) + } +} + +function updateCurrency(amount){ + money += amount + addText(String(money), { + x: 2, + y: 3, + color: color`2` +}) +} + +function tutorialText(textInfo){ + if (textInfo){ + addText(String(textInfo[0]), { + x: textInfo[1][0], + y: textInfo[1][1], + color: color`2` +}) + } +} + +function gameWin(){ + gameWon = true + setMap(levels[levels.length-1]) + clearText() + completionRequirements = [inventory.includes(dashAbility), keyGet, key2Get, r1GrubSave, r5GrubSave, r8GrubSave, r9GrubSave] + console.log(completionRequirements.filter(Boolean)) + completionPercent = Math.round((completionRequirements.filter(Boolean).length/completionRequirements.length)*100) + addText("// YOU WON //", { + x: 3, + y: 7, + color: color`2`}) + addText("Completion " + String(completionPercent)+"%", { + x: 3, + y: 9, + color: color`2`}) + +} + +// Directions or smth yay +onInput("w", () => { + if (!(ceilingCheck(getFirst(player)))) { + getFirst(player).y -= movement; + getFirst(player).y -= movement; + moveDown(getFirst(player)) + } +}) + +onInput("a", () => { + getFirst(player).x -= movement; + lastXInput = -1 +}) + + +onInput("d", () => { + getFirst(player).x += movement; + lastXInput = 1 +}) + +onInput("j", () => { + slashX = getFirst(player).x + lastXInput + slashY = getFirst(player).y + if (lastXInput == 1){ + addSprite(slashX, slashY, rightSlash) + } else { + addSprite(slashX, slashY, leftSlash) + } + playTune(slashSFX) + setTimeout(() => { + if (lastXInput == 1){ + for (sprite = 0; sprite < getAll(rightSlash).length; sprite++){ + getAll(rightSlash)[sprite].remove() + } + } else { + for (sprite = 0; sprite < getAll(leftSlash).length; sprite++){ + getAll(leftSlash)[sprite].remove() + } + } + }, 5) + if ((getTile(slashX, slashY)).find(sprite => sprite.type == tiktik)){ + tiktikHealth -=1 + playTune(hurtSFX) + if (tiktikHealth == 0){ + getFirst(tiktik).remove() + updateCurrency(2) + } + } + if ((getTile(slashX, slashY)).find(sprite => sprite.type == fakeWall)){ + wallHealth -= 1 + playTune(hurtSFX) + if (wallHealth <= 0){ + console.log("wall died") + for (let wall = 0; wall < getAll(fakeWall).length; wall++){ + getAll(fakeWall)[wall].remove() + } + } + } + if ((getTile(slashX, slashY)).find(sprite => sprite.type == grub)){ + grubJarHealth -= 1 + playTune(hurtSFX) + if (grubJarHealth <= 0){ + getFirst(grub).remove() + if (level == 1 && (!(r1GrubSave))){ + r1GrubSave = true + freedGrubs += 1 + updateCurrency(3) + addText("GRUB saved", {x:0, y:15, color: color `2`}) + setTimeout(function() { refreshScreen() }, 2000) + } + if (level == 5 && (!(r5GrubSave))){ + r5GrubSave = true + freedGrubs += 1 + updateCurrency(3) + addText("GRUB saved", {x:0, y:15, color: color `2`}) + setTimeout(function() { refreshScreen() }, 2000) + + } + if (level == 8 && (!(r8GrubSave))){ + r8GrubSave = true + freedGrubs += 1 + updateCurrency(3) + addText("GRUB saved", {x:0, y:15, color: color `2`}) + setTimeout(function() { refreshScreen() }, 2000) + } + if (level == 9 && (!(r9GrubSave))){ + r9GrubSave = true + freedGrubs += 1 + updateCurrency(3) + addText("GRUB saved", {x:0, y:15, color: color `2`}) + setTimeout(function() { refreshScreen() }, 2000) + } + + + } + } +}) + +onInput("k", () => { + knightCoords = getTile(getFirst(player).x, getFirst(player).y) + if (knightCoords.find(sprite => sprite.type == chest && keyGet == false)) { + addText("KEY obtained", { + x: 0, + y: 15, + color: color`2`}) + updateInv(key) + updateCurrency(2) + setTimeout(function() { refreshScreen() }, 2000) + keyGet = true + } else if (knightCoords.find(sprite => sprite.type == chest && key2Get == false)){ + updateCurrency(5) + key2Get = true + } + if (knightCoords.find(sprite=> sprite.type == dashStatue) && !(inventory.includes(dashAbility))){ + addText("DASH obtained", { + x: 0, + y: 15, + color: color`2`}) + updateInv(dashAbility) + setTimeout(function() { refreshScreen() }, 2000) + + } + checkGate(player) + updateInv() + if (knightCoords.find(sprite=> sprite.type == sign)){ + tutorialText(levelsDir["R"+level][7]) + setTimeout(function() { refreshScreen() }, 2000) + } +}) + +onInput("l", () => { + if (inventory.includes(dashAbility)){ + for (let i = 0; i < 4; i++){ + getFirst(player).x += lastXInput + } + } +}) + +afterInput(() => { + if (!(groundCheck(getFirst(player)))) { + moveDown(getFirst(player)) + } + if (!(level >= 10)){ + console.log(getFirst(player).x, getFirst(player).y) + checkInteraction(player, level) + enemyInfo = levelsDir["R" + level][5] + if (enemyInfo){ // If there's an enemy/hazard listed as being in the current room + for (enemy in enemyInfo){ + checkHazard(player, enemyInfo[enemy][0], enemyInfo[enemy][1]) + } + } + updateInv() + if (lives <= 0){ + setMap(levels[levels.length-1]) + playTune(deathSFX) + clearText() + addText("~GAME OVER~", { + x: 5, + y: 7, + color: color`2`}) + } + } else if (level == 10 && (getTile(getFirst(player).x, getFirst(player).y).find(sprite => sprite.type == "i"))){ + gameWin() + } else { + //pass +} + }) diff --git a/games/img/hallowed_knight.png b/games/img/hallowed_knight.png new file mode 100644 index 0000000000000000000000000000000000000000..89d4cf22d707daba96a23e94c648cbb4490bf563 GIT binary patch literal 38069 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