From 55f383de5953965745b1500d610c7cb961ef2e6e Mon Sep 17 00:00:00 2001 From: kingzilla54 Date: Tue, 21 May 2024 12:49:36 -0400 Subject: [PATCH 1/7] Add files via upload --- plain_kakuna.js | 1314 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1314 insertions(+) create mode 100644 plain_kakuna.js diff --git a/plain_kakuna.js b/plain_kakuna.js new file mode 100644 index 0000000000..ec7b1dcaa0 --- /dev/null +++ b/plain_kakuna.js @@ -0,0 +1,1314 @@ +/* + +@title: Crossy_Sprig +@author: hatanuk +@tags: ['endless'] +@img: "" +@addedOn: 2024-03-21 + +j +CONTROLS: +w - Up +a - Left +d- Right +Can't go down! + +i - begin game +j - reset back to beginning + +*/ + + + +const playerLeft = "q" +const playerRight = "w" +const playerLeftFlap = "e" +const playerRightFlap = "r" +const death = "t" +const roadOne = "u" +const roadTwo = "i" +const grassOne = "o" +const grassTwo = "p" +const grassThree = "a" +const chickenHouse = "d" +const seaOne = "f" +const seaTwo = "g" +const sand = "h" +const carPurpleRight = "s" +const carPurpleLeft = "j" +const carGreenRight = "y" +const carGreenLeft = "k" +const bam = "l" +const gui = "z" +const guiTopLeft = "1" +const guiTopRight = "2" +const guiBottomLeft = "3" +const guiBottomRight = "4" +const guiTop = "5" +const guiBottom = "6" +const guiLeft = "7" +const guiRight = "8" +const truckLeft = "x" +const truckRight = "c" +const asphalt = "v" +const tree1 = "b" +const tree2 = "n" +const box = "m" + +const leftCarSprites = [carPurpleLeft, carGreenLeft, truckLeft] +const rightCarSprites = [carPurpleRight, carGreenRight, truckRight] +const carSprites = [...leftCarSprites, ...rightCarSprites] + +const playerSprites = [playerLeft, playerRight, playerLeftFlap, playerRightFlap] + +const grassSprites = [grassOne, grassTwo, grassThree] +const seaSprites = [seaOne, seaTwo] +const asphaltSprites = [asphalt] +const solidObjects = [tree1, tree2, box] +const worldObjects = [roadOne, roadTwo, sand, chickenHouse, ...seaSprites, ...grassSprites, ...carSprites, ...asphaltSprites, ...solidObjects]; +const guiElements = [guiTopLeft,guiTopRight,guiBottomLeft,guiBottomRight,guiTop,guiBottom,guiLeft,guiRight, gui] + + +const MOVECOOLDOWN = 100 +const TICKMS = 100; + +let premoveUp +let premoveLeft +let premoveRight + + +let gameStart = false +let canStart = true +let cooldown = false +let gameTickCounter = 0 +let cooldownTickCounter = 0 +let playerDirection = "left" +let currentScore = 0 +let highScore = 0 + +let counterDict = {"road": 0, + "grass": 0, + "asphalt": 0} + +let activeRoads = [] + +setSolids([...playerSprites, ...solidObjects]) + +setLegend( + [bam, bitmap` +...HH........H.. +...HHHHH...HHH.. +....HH88HHHH8H.. +.....H888HH88H.. +..HHHH8788878HH. +HHH88877777788H. +HH888777777788HH +.HHH877777778HH. +..HH877777778H.. +...H877777778H.. +..HH887777888HH. +.HH88H88788HHHHH +..HHHHH888HHHH.. +..HH.HHH8HHH.... +..H...HHHHH..... +.......HH.......` ], + [death, bitmap` +................ +................ +....111LL111.... +...1LLLLLLLL1... +...1LLLL00LL1... +...LLLL0000LL... +...LLLL0000LL... +...LLLL100LLL... +...LLL1LLLLLL... +...L11LL33LLL... +...LL1LLD33LL... +...LLLLLDD331... +11LLLLLDDDD3LL1. +.11111DDL1LL11.. +...1111111111... +................` ], + [gui, bitmap` +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH` ], + [guiTopLeft, bitmap` +....HHHHHHHHHHHH +..HH777777777777 +.H77777777777777 +.H77HHHHHHHHHHHH +H77HH88888888888 +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH` ], + [guiTopRight, bitmap` +HHHHHHHHHHHH.... +777777777777HH.. +77777777777777H. +HHHHHHHHHHHH77H. +88888888888HH77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H` ], + [guiBottomLeft, bitmap` +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77HH88888888888 +.H77HHHHHHHHHHHH +.H77777777777777 +..HH777777777777 +....HHHHHHHHHHHH` ], + [guiBottomRight, bitmap` +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +88888888888HH77H +HHHHHHHHHHHH77H. +77777777777777H. +777777777777HH.. +HHHHHHHHHHHH....` ], + [guiTop, bitmap` +HHHHHHHHHHHHHHHH +7777777777777777 +7777777777777777 +HHHHHHHHHHHHHHHH +8888888888888888 +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH` ], + [guiBottom, bitmap` +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +8888888888888888 +HHHHHHHHHHHHHHHH +7777777777777777 +7777777777777777 +HHHHHHHHHHHHHHHH` ], + [guiLeft, bitmap` +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH` ], + [guiRight, bitmap` +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H` ], + [chickenHouse, bitmap` +DDDDDDDDDDDDDDDD +DDD4DDDDDDDDDDD1 +D44DDDDD333DDDDD +DDDDDD33333CCDDD +DDDD3333333CCCCD +DD333333333CCCCC +DDDD5555333CC55D +DDDD55555555555D +4DDD556F6555555D +D4DD56FFF655555D +D4DD5FFFFF55555D +DDDD5FF8885555DD +DDDD588888555DDD +DDDDDD888855DDDD +DDDDDDDDDDDDDDDD +DDD1DDDDDDDDDDDD` ], + [truckRight, bitmap +` +.2222222222..... +200000000002.... +20LLLLLLLL02.... +20LHHHHHHH02.... +2000000000022... +20H22222220662.. +20H288588209962. +20H285858200096. +20H2222222000092 +2000000000099992 +2999999999999992 +.2L0L222222L0L2. +.2LLL2....2LLL2. +..222......222.. +................ +................` ], + [truckLeft, bitmap +` +.....2222222222. +....200000000002 +....20LLLLLLLL02 +....201111111L02 +...2200000000002 +..2660HHHHHHH102 +.26330H77577H102 +.63000H75757H102 +230000HHHHHHH102 +2333300000000002 +2333333333333332 +.2L0L222222L0L2. +.2LLL2....2LLL2. +..222......222.. +................ +................` ], + [carPurpleRight, bitmap` +................ +................ +...22222222..... +.22555888552222. +2585088888055552 +2585088888058852 +2585088888058882 +2585088888058882 +2588500000558852 +2555555555555552 +.25LLL5555LLL52. +..2L1L2222L1L2.. +..2LLL2..2LLL2.. +...222....222... +................ +................` ], + [carPurpleLeft, bitmap` +................ +................ +.....22222222... +.2222HH777HHH22. +2HHHH0777770H7H2 +2H77H0777770H7H2 +2777H0777770H7H2 +2777H0777770H7H2 +2H77HH00000H77H2 +2HHHHHHHHHHHHHH2 +.2HLLLHHHHLLLH2. +..2L1L2222L1L2.. +..2LLL2..2LLL2.. +...222....222... +................ +................` ], + [carGreenRight, bitmap` +................ +........2....... +....2222L22..... +..22HH7LLHH222.. +.27H707L770HHH2. +.27H7077770H77H2 +.27H7077770H7772 +.27H7077770H7772 +.277H00000HH77H2 +.2HHHHHHHHHHHH2. +.2HHLLLHHHLLLH2. +..22L1L222L1L2.. +...2LLL2.2LLL2.. +....222...222... +................ +................` ], + [carGreenLeft, bitmap` +................ +.......2........ +.....22L2222.... +..22200LLL0022.. +.20000LLLL000L2. +20LL00LLLL000L2. +2LLL00LLLL000L2. +2LLL00LLLL000L2. +20LL00000000LL2. +.20000000000002. +.20LLL000LLL002. +..2L1L222L1L22.. +..2LLL2.2LLL2... +...222...222.... +................ +................` ], + [playerLeft, bitmap` +......2222...... +....22333322.... +...2LLLL11112... +...2LLLL11112... +..26699L10012... +..26699L10012... +...2L33L11112... +...2L33L11112... +...2LLLL111122.. +..2100232000L12. +.21L000200001L2. +.21L000000001L12 +..2100000000L112 +...222692269222. +....269926992... +.....2222222....` ], + [playerLeftFlap, bitmap` +......2222...... +....22333322.... +...2LLLL11112... +..26699L11112... +..22L33L10012... +..26699L10012... +...2L33L1111222. +..22L33L11112LL2 +.21LLLLL1111L1L2 +21LLL002320011L2 +21LLL000200011L2 +.22220000000LL12 +....200000001112 +....22692269222. +...269926992.... +....2222222.....` ], + [playerRight, bitmap` +......2222...... +....22333322.... +...21111LLLL2... +...21111LLLL2... +...21001L99662.. +...21001L99662.. +...21111L33L2... +...21111L33L2... +..221111LLLL2... +.21L0023200012.. +.2L100020000L12. +21L100000000L12. +211L0000000012.. +.222962296222... +...299629962.... +....2222222.....` ], + [playerRightFlap, bitmap` +......2222...... +....22333322.... +...21111LLLL2... +...21111L99662.. +...21001L33L22.. +...21001L99662.. +.2221111L33L2... +2LL21111L33L22.. +2L1L1111LLLLL12. +2L110023200LLL12 +2L110002000LLL12 +21LL00000002222. +211100000002.... +.22296229622.... +....299629962... +.....2222222....` ], + [tree1, bitmap` +......4444...... +....44444444.... +...4434444444... +...4444443444... +....4C4444C4.00. +......CC4C..0000 +.......CC....00. +.......CCC..000. +.......CC..000.. +.......CC.0000.. +....444CC44400.. +...4DDCCCCDD40.. +..4DCCCCCCCCD4.. +...4CDDCDDDC4... +....44444444.... +................` ], + [tree2, bitmap` +................ +....44494444.... +...4444444444... +..4444C44C4494.. +..444.C4CC.444.. +.......CC..LLLL. +........C....LLL +........C....L.. +........C...LL.. +.......CC..LLL.. +....444CC444LL.. +...4DDCCCCDD4L.. +..4DCCCCCCCCD4.. +...4CDDCDDDC4... +....44444444.... +................` ], + [box, bitmap` +................ +................ +................ +......CCCCCCCC.. +....CCCCCCCCCC.. +....C999999CCC.. +....CC9999C9CC.. +....C9C99C99CC.. +....C99CC999CC.. +...CCCCCC999CCL. +..CCCCCC9C99CCL. +..C999CC99C9CLL. +..C9C9CC999CLLL. +..C999CCLLLLLL.. +..CCCCCLLLLLL... +..LLLLLLLLL.....` ], + [roadOne, bitmap` +2222222222222222 +1111111111111111 +LLLLLLLLLLLLLLLL +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000666666 +0000000000666666 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +LLLLLLLLLLLLLLLL +1111111111111111 +2222222222222222` ], + [roadTwo, bitmap` +2222222222222222 +1111111111111111 +LLLLLLLLLLLLLLLL +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +6666660000000000 +6666660000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +LLLLLLLLLLLLLLLL +1111111111111111 +2222222222222222` ], + [grassOne, bitmap` +DDDDDDDDDDDDD4DD +DDDDDDDDDDDDDD4D +DDDDDDD4DDDDDD4D +DDD4DDD4DDDDDDDD +DDD4DD4DDDDDDDDD +DDDD4D4DDDD44DDD +DDDD4DDDDD434DDD +DDDDDDDDDD44DDDD +DDDDDDDDDDDDDDDD +DD6DDDDD4DDDDDDD +D696DDDD4DDDDDDD +DD6DDDD4DDDDDDDD +DD4DDDD4DDDDDDDD +DDD4DDDDDDDDDDDD +DDDDDDDDDDDDDDD4 +DDDDDDDDDDDDDD4D` ], + [grassTwo, bitmap` +DDDDDDDDDDDDDDDD +DDDDDD4DDDDDD1DD +DDDDDD4DDDD4DDDD +DDDDD4DDDDD4DDDD +DDDDD4DDDDDD4DDD +DDDDDDDDDDDD4DDD +DDDDDDDDDDDDDDDD +DDD4DDDDDDDDDDDD +DD484DDD4DDDDDDD +DDD4DDD4H4DDDDDD +DDDDDDDD4DDDDDDD +DDDDD4DDDDDDD4DD +DDDDDD4DDDDDD4DD +D4DDDDDDDDDD4DDD +D4DDDDDDDDDDDDDD +DD4DDDDDDDDDDDDD` ], + [grassThree, bitmap` +DDDDDDDDDDDDDDDD +DDDDDDDDD4DDDDDD +DD4DDDDD4DDDDDDD +DD4DDDDD4DDDDDDD +DDD4DDDDDDDDDDDD +DDD4DDDDDDDDDDDD +DDDDDDDDDD4DDDDD +DDDDDDDDD4DDDDDD +DDDDDDDD4DDDDDDD +DDDDD4DDDDDDDDDD +DDDDD4DDDDDDDDDD +DDDDDD4DDDDDDDDD +DDDDDDDDDDDDD4DD +DDD4DDDDDDDDDD4D +DD4DDDDDDDDDDD4D +DD4DDDDDDDDDDDDD` ], + [seaOne, bitmap` +6F666666F66666F6 +6666F66666666666 +6666666666666F66 +F6FFFF666FFF666F +FFFFFFFFFFFFFFFF +2FFF222FFF22FFF2 +7222777222772227 +2777227772227772 +7777777777777777 +7772777777772777 +7777777777777777 +7777777777777777 +7777777777777777 +5555577777777755 +5555555555555555 +5555555555555555id ` ], + [seaTwo, bitmap` +6F666666F66666F6 +6666F66666666666 +6666666666666F66 +F6FFFF666FFF666F +FFFFFFFFFFFFFFFF +2FFF222FFF22FFF2 +2222777222772222 +7777227772227777 +7777277777727777 +7777777777777777 +7777777777777777 +7777777777777777 +7777777777777777 +5555577777777755 +5555555577755555 +5555555555555555` ], + [sand, bitmap` +DDDDDDDDDDDDDDDD +DD4DDDD4DDDDDDDD +444444444444DDDD +46466646646644DD +66666666646F6644 +666F666666666664 +666666F666666F66 +6666666666666666 +6666666666666666 +F66666666F666666 +6666666666666666 +666F666666666666 +6666666666666666 +666666666666666F +6666666F66666666 +6666666666666666` ], + [asphalt, bitmap` +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +111L111111111111 +11L1111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +11111111111L1111 +1111111111L11111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111` ], + + + +) + + +let level = 0 +const levels = [ + map` +oapapaappo +ppooapoaop +oappoapapp +aoapaoaaoa +pappdppppp +oaooaoaoao +hhhhhhhhhh +fgfgfgfgfg` +] + + +function mainLoop() { + counterDict = {"road": 0, + "grass": 2, + "asphalt": 2} + setMap(levels[0]) + addSprite(5, 4, playerLeft) + bringUpGUI() + addText("PRESS", { + x: 6, + y: parseInt(height()) / 2, + color:color`2` + }) + + addText("-> i <-", { + x: 6, + y: parseInt(height()) / 2 + 1, + color:color`0` + }) + + addText("TO BEGIN", { + x: 6, + y: parseInt(height()) / 2 + 2, + color:color`2` + }) +} + +function bringUpGUI() { + let coords + const max_x = width() - 1 + const max_y = parseInt(height()) / 2 + for (let x=1; x < max_x; x++) { + for (let y = 1; y < max_y; y++) { + switch (true) { + case x == 1 && y == 1: + addSprite(x, y, guiTopLeft) + break; + case x == max_x - 1 && y == 1: + addSprite(x, y, guiTopRight) + break; + + case x == 1 && y == max_y - 1: + addSprite(x, y, guiBottomLeft) + break; + + case x == max_x - 1 && y == max_y - 1: + addSprite(x, y, guiBottomRight) + break; + + case x == 1: + addSprite(x, y, guiLeft) + break; + + case x == max_x - 1: + addSprite(x, y, guiRight) + break; + + case y == 1: + addSprite(x, y, guiTop) + break; + + case y == max_y - 1: + addSprite(x, y, guiBottom) + break; + + default: + addSprite(x, y, gui) + } + + } + } +} + +function bringUpScore() { + let max_x = width() - 4 + let min_x = width() - max_x - 1 + for (let x=min_x; x <= max_x; x++) { + switch (true){ + case (x == min_x): + addSprite(x, height() - 1, guiTopLeft) + break; + case (x == max_x): + addSprite(x, height() - 1, guiTopRight) + break; + default: + addSprite(x, height() - 1, guiTop) + } + } +} + + +function hideGUI() { + let guiSprites + guiElements.forEach((guiElement) => { + guiSprites = getAll(guiElement) + guiSprites.forEach((guiSprite) => { + guiSprite.remove() + }) + }) + +} + +// Scroll system + +function getObjects() { + let assets = getAll(); + let objects = []; + for (let i = 0; i < assets.length; i++) { + + if (worldObjects.includes(assets[i].type)) { + + objects.push(assets[i]); + } + } + return objects +} + +function changeObject(from, to) { + addSprite(from.x, from.y, to) + +} + +function moveView(x, y) { + let objects = getObjects(); + for (let i = 0; i < objects.length; i++) { + + // Move object y upwards + objects[i].y -= y; + + // Move object x to the right + objects[i].x -= x; + + } +} + + +function clearLastRow() { + let row = height() - 1 + + for (let col = 0; col < width(); col++) { + clearTile(col, row) + } + bringUpScore() +} + +function updateRoadYCoordinate() { + activeRoads.forEach((road) => { + road["yCoordinate"] += 1 + }) +} + +function checkRoadClear() { + // checks the oldest generated road to see whether it's time to remove it + if (activeRoads.length > 0) { + let road = activeRoads[0] + if (road["yCoordinate"] >= height() - 1) { + activeRoads.shift() + } + } +} + +// checks if there is no object blocking the path upward +function isAboveClear() { + let player = getFirst(getPlayer()) + let spritesAbove = getTile(player.x, player.y-1) + let isClear = true + + + spritesAbove.forEach((sprite) => { + if (solidObjects.includes(sprite.type)) { + isClear = false + } + + }) + + return isClear ? true : false +} + +function onUpMove() { + updateSprite(playerDirection) + if (isAboveClear()) { + clearLastRow() + checkRoadClear() + moveView(0, -1); + updateRoadYCoordinate() + generateNewRow() + currentScore += 1 + } +} + +// Probability-based helper functions + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); +} + +function chooseRandomElement(array) { + return array[getRandomInt(0, array.length - 1)] +} + + +function getNewRowType() { + const probability = getRandomInt(1, 100); + + if (counterDict["road"] > 2) { + // Prevent more than 3 roads stacking + return (probability < 50) ? "grass" : "asphalt" + } + if (counterDict["grass"] > 1 || counterDict["asphalt"] > 1) { + // Prevent more than 2 grass/asphalt stacking + return "road" + } + if (probability <= 30) { + // 30 percent chance to generate road, otherwise grass/asphalt + return "road" + } else { + if (counterDict["grass"] > 0) { + return "grass" + } else if (counterDict["asphalt"] > 0){ + return "asphalt" + } else { + return (probability <= 65) ? "asphalt" : "grass" + } + } +} + +function addObject(objectArray) { + let amount = getRandomInt(1, 3) + let avaliableTiles = shuffleArray(Array.from(Array(width()).keys())) + for (let i = 0; i < amount; i++) { + addSprite(avaliableTiles[i], 0, chooseRandomElement(objectArray)) + } +} + + +function buildRow(rowFactory) { + for (let x = 0; x < width(); x++) { + addSprite(x, 0, rowFactory(x)) + } +} + +function resetCounters(exception) { + + Object.keys(counterDict).forEach( (counter) => { + if (counter != exception) { + counterDict[counter] = 0 + } + }) + +} + +function generateRoad() { + // roads have 2 distinct features: direction, speed and traffic density of vehicles + // these are chosen randomly + + // speed is measured in ticks: how many milliseconds for a vehicle to change position + const SPEEDS = [800, 500] + // which direction the vehicles come from + const DIRECTIONS = ["left", "right"] + // probability that a new vehicle will spawn every time the positions change + const TRAFFIC = [10, 20, 20, 20, 30] + + + // ramp up difficulty the higher the score + for (let i = 20; i <= currentScore; i += 20) { + SPEEDS.push(200) + TRAFFIC.push(30) + } + + const chosenSpeed = SPEEDS[getRandomInt(0, SPEEDS.length - 1)] + const chosenDirection = DIRECTIONS[getRandomInt(0, DIRECTIONS.length - 1)] + const chosenTraffic = TRAFFIC[getRandomInt(0, TRAFFIC.length - 1)] + + let road = {"direction": chosenDirection, + "spawnRate" : chosenSpeed, + "spawnFrequency" : chosenTraffic, + "yCoordinate" : 0} + activeRoads.push({"direction": chosenDirection, + "spawnRate" : chosenSpeed, + "spawnFrequency" : chosenTraffic, + "yCoordinate" : 0}) + + // Add some car sprites randomly to make the road appear pre-populated + let numCars = parseInt(chosenTraffic / 10) + let carSprite + let possibleTiles = shuffleArray(Array.from(Array(width()).keys())) + while (numCars != 0) { + carSprite = (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites) + addSprite(possibleTiles.pop(), 0, carSprite) + numCars -= 1 + } + +} + +function shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array +} + + +function generateNewRow() { + const rowType = getNewRowType() + if (rowType == "road") { + counterDict["road"]++ + buildRow((x) => x % 2 == 0 ? roadOne : roadTwo) + // Reset all counters except road + resetCounters("road") + generateRoad() + + } else if (rowType == "grass") { + counterDict["grass"]++ + buildRow((x) => chooseRandomElement(grassSprites)) + // Reset all counters except grass + resetCounters("grass") + // if it comes right after a road, add objects + if (counterDict["grass"] == 1) { + addObject(solidObjects) + } + } else if (rowType == "asphalt") { + counterDict["asphalt"]++ + buildRow((x) => chooseRandomElement(asphaltSprites)) + // Reset all counters except asphalt + resetCounters("asphalt") + if (counterDict["asphalt"] == 1) { + addObject(solidObjects) + } + } + +} +// this function returns the correct player sprite depending on the direction of the player and movement cooldown +function getPlayer() { + if (playerDirection == "left" && cooldown) { + return playerLeftFlap + } + else if (playerDirection == "right" && cooldown) { + return playerRightFlap + } + else if (playerDirection == "left") { + return playerLeft + } + else if (playerDirection == "right") { + return playerRight + } +} + +// replaces the sprite of the player given their old one with a new one +function replacePlayer(oldSprite, newSprite) { + + const oldPlayer = getFirst(oldSprite) + let x = oldPlayer.x + let y = oldPlayer.y + oldPlayer.remove() + addSprite(x, y, newSprite) + +} + + +// updates the sprite whenever the player moves with the correct direction and animation +function updateSprite(direction) { + let oldSprite = getPlayer() + cooldown = true + playerDirection = direction + let newSprite = getPlayer() + replacePlayer(oldSprite, newSprite) +} + +function onSideMove(direction) { + updateSprite(direction) + getFirst(getPlayer()).x += (direction == "right") ? 1 : -1 +} + +onInput("w", () => { + if (gameStart == true && cooldown == false) { + onUpMove() + } else if (gameStart == true && cooldown == true) { + // premove + premoveUp = true + + } + +}) + + +onInput("a", () => { + if (gameStart == true && cooldown == false) { + onSideMove("left") + } else if (gameStart == true && cooldown == true) { + // premove + premoveLeft = true + } +}) + +onInput("d", () => { + if (gameStart == true && cooldown == false) { + onSideMove("right") + } else if (gameStart == true && cooldown == true) { + // premove + premoveRight = true + } +}) + + +onInput("i", () => { + if (gameStart == false && canStart == true) { + clearText() + hideGUI() + currentScore = 0 + bringUpScore() + gameStart = true + } +} +) + + +onInput("j", () => { + if (gameStart == false) { + clearText() + mainLoop() + canStart = true + } +} +) + + + +function spawnVehicle(road) { + let x = (road["direction"] == "left") ? 0 : width() - 1 + // this is a probability check; we generate a number between 1-100 + // and check if its below or equal to the spawn chance (somewhere between 15-30) + let chance = getRandomInt(1, 100) + if (chance <= road["spawnFrequency"]) { + addSprite(x, road["yCoordinate"], (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites)) + } +} + +function getVehiclesOnRoad(road) { + let y = road["yCoordinate"] + let vehicles = [] + + for (let x = 0; x < width(); x++) { + getTile(x, y).forEach((sprite) => { + if (carSprites.includes(sprite.type)) { + vehicles.push(sprite) + } + }) + } + return vehicles +} + +function moveVehicles(road) { + let vehicles = getVehiclesOnRoad(road) + + + vehicles.forEach((vehicle) => { + if (road["direction"] == "left") { + if (vehicle.x < width() - 1) { + vehicle.x += 1 + } else { + vehicle.remove() + } + } + + if (road["direction"] == "right") { + if (vehicle.x > 0) { + vehicle.x -= 1 + } else { + vehicle.remove() + } + } + }) +} + +function delayDelete(sprite, time) { + setTimeout(() => { + sprite.remove()}, time) +} + +function onDeath(player, collidedVehicle) { + player.type = death + collidedVehicle.type = bam + clearText() + addText("BACK:j", + {x:7, + y:15, + color:color`0`}) + addSprite(2, 2, death) + addSprite(width() - 3, 2, death) + + if (currentScore > highScore) {highScore = currentScore} + + addText("-MORTIS-", + {x:6, + y:4, + color:"2"}) + addText("NOW:" + String(currentScore), + {x:7, + y:5, + color:color`6`}) + addText("BEST:" + String(highScore), + {x:7, + y:6, + color:color`6`}) + + activeRoads = [] + cooldown = false + playerDirection = "left" + canStart = false + +} + + + +// BUILT IN FUNCTION THAT RUNS EVERY X MILLISECONDS +// I use it here to increment TickCounter variables in order to implement cooldowns and enemy movements +setInterval(() => { + + + if (!gameStart) { + bringUpGUI() + } + + if (gameStart) { + let isDead = false + let player = getFirst(getPlayer()) + let collidedVehicle + // checks if there are any tiles where the player and a vehicle has collided - ie death has occurred + // -> for all vehicle sprites + carSprites.forEach( (carType) => { + let sprites = tilesWith(player.type, carType) + + if (sprites.length > 0) { + // if there is a tile with a player + vehicle + isDead = true + gameStart = false + sprites[0].forEach ( (sprite) => { + if (sprite.type == carType) { + collidedVehicle = sprite + } + }) + } + }) + if (isDead) { + onDeath(player, collidedVehicle) + return + + } + // Current score Display + addText( + String(currentScore), + {x:9, + y: 15, + color:color`2`}) + + + + // set gameTickCounter to += TICKMS if it's less than 1500ms - otherwise reset it back to 0 + // This is so that it won't become infinitely large + if (gameTickCounter < 1400) { + gameTickCounter += TICKMS + } else { + gameTickCounter = 0 + } + + + + // remember - setInterval is called every X milliseconds (ms) + // here I specified it to run every 10 miliseconds + let counter = 0 + + activeRoads.forEach((road) => { + + + + if (gameTickCounter % road["spawnRate"] == 0) { + counter += 1 + moveVehicles(road) + spawnVehicle(road) + + } + }) + + + if (cooldown) { + // count up the cooldownTickCounter if a cooldown is activated + cooldownTickCounter += 50 + } + // then when the cooldownTickCounter >= MOVECOOLDOWN, set the cooldown to false and change animation back + if (cooldownTickCounter >= MOVECOOLDOWN) { + let oldSprite = getPlayer() + cooldown = false + let newSprite = getPlayer() + replacePlayer(oldSprite, newSprite) + cooldownTickCounter = 0 + + // also perform any premoves + if (premoveUp) { + premoveUp = false + onUpMove() + } + if (premoveLeft) { + premoveLeft = false + onSideMove("left") + } + if (premoveRight) { + premoveRight= false + onSideMove("right") + } + } + } + }, TICKMS) + // Notice how the TICKMS here is another parameter - I defined this constant earlier, + // The setInterval function runs every TICKMS milliseconds + + // Call the mainLoop() function to begin the game when you run the program +mainLoop() From 4fa5f89ab668b1efd2685f0350790371a869f167 Mon Sep 17 00:00:00 2001 From: kingzilla54 Date: Tue, 21 May 2024 12:54:58 -0400 Subject: [PATCH 2/7] Add files via upload --- Screenshot 2024-05-21 125209.png | Bin 0 -> 817 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Screenshot 2024-05-21 125209.png diff --git a/Screenshot 2024-05-21 125209.png b/Screenshot 2024-05-21 125209.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; literal 0 HcmV?d00001 From 2261c8856533d4f65e614bac55e4c5e0054cb449 Mon Sep 17 00:00:00 2001 From: graham Date: Wed, 19 Jun 2024 15:41:26 -0400 Subject: [PATCH 3/7] Fix metadata and filepath --- plain_kakuna.js => games/crossy_sprig.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) rename plain_kakuna.js => games/crossy_sprig.js (99%) diff --git a/plain_kakuna.js b/games/crossy_sprig.js similarity index 99% rename from plain_kakuna.js rename to games/crossy_sprig.js index ec7b1dcaa0..ab3aa5d7ad 100644 --- a/plain_kakuna.js +++ b/games/crossy_sprig.js @@ -1,12 +1,10 @@ /* - -@title: Crossy_Sprig +@title: Crossy Sprig @author: hatanuk @tags: ['endless'] @img: "" @addedOn: 2024-03-21 -j CONTROLS: w - Up a - Left From 7ddb2f81d63ca4b8314d291c2e50fa19cc8cca70 Mon Sep 17 00:00:00 2001 From: Graham Darcey Date: Wed, 19 Jun 2024 15:48:36 -0400 Subject: [PATCH 4/7] Fix filepath and move img to correct dir --- Screenshot 2024-05-21 125209.png | Bin 817 -> 0 bytes games/Cross_The_Road.js | 339 ------- games/crossy_sprig.js | 1509 ++++++------------------------ games/img/Crossy_Sprig.png | Bin 4756 -> 817 bytes 4 files changed, 268 insertions(+), 1580 deletions(-) delete mode 100644 Screenshot 2024-05-21 125209.png delete mode 100644 games/Cross_The_Road.js diff --git a/Screenshot 2024-05-21 125209.png b/Screenshot 2024-05-21 125209.png deleted file mode 100644 index ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; diff --git a/games/Cross_The_Road.js b/games/Cross_The_Road.js deleted file mode 100644 index 1f5c6300bf..0000000000 --- a/games/Cross_The_Road.js +++ /dev/null @@ -1,339 +0,0 @@ -/* -@title: Cross_The_Road -@tags: ['endless'] -@addedOn: 2022-12-27 -@author: Haneesh Pediredla - -Play:- -WASD to move. Dodge the vehicles and reach the finish line. -If you stand longer dodging the vehicles then the score will be high. -Press I to restart the game. -*/ - -const vehicle = 'v'; -const player = 'p'; -const finishLine = 'f'; - -let gameRunning; - -let time = 0; -let score = 0; - -setLegend( - [player, bitmap` -................ -................ -................ -................ -................ -.....00......... -....0000........ -....0..0........ -.....00......... -....0000........ -...0.00.0....... -..0..00..0...... -.....00......... -.....00......... -....0..0........ -...0....0.......`], - [vehicle, bitmap` -................ -................ -................ -................ -................ -333333333333.... -3333333333333... -37737737737733.. -377377377377733. -3773773773777733 -3333333333333333 -3333333333333333 -................ -................ -................ -................`], - [finishLine, bitmap` -000222000222000L -000222000222000L -000222000222000L -222000222000222L -222000222000222L -222000222000222L -000222000222000L -000222000222000L -000222000222000L -222000222000222L -222000222000222L -222000222000222L -000222000222000L -000222000222000L -000222000222000L -................`], -); - -setMap(map` -ffffffff -......v. -...v.... -.....v.. -.v...... -......v. -....v... -.......p`); - -onInput('w', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).y -= 1; - } - } -}); - -onInput('s', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).y += 1; - } - } -}); - -onInput('a', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).x -= 1; - } - } -}); - -onInput('d', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).x += 1; - } - } -}); - -onInput("i", () => { - if(gameRunning == false) { - let p = getFirst("p"); - - score = 0; - - p.x = 7; - p.y = 7; - - setMap(map` -ffffffff -......v. -...v.... -.....v.. -.v...... -......v. -....v... -.......p`); - - addText("Game Over!", { - x: 5, - y: 6, - color: color`2` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`2` - }); - - addText("Won Game!", { - x: 5, - y: 6, - color: color`2` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`2` - }); - runGame(); - } -}); - -function spawnVehicle() { - let x = 0; - let y = Math.floor(Math.random() * 7) + 1; - addSprite(x, y, vehicle); -} - -function moveVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - vehicles[i].x += 1; - } -} - -function despawnVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - if (vehicles[i].x == 7) { - vehicles[i].remove(); - } - } -} - -function despawnAllVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - vehicles[i].remove(); - } -} - -function checkHit() { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - for (let i = 0; i < vehicles.length; i++) { - if (vehicles[i].x == p.x && vehicles[i].y == p.y) { - return true; - } - } - - return false; -} - -addText("Score: "+score, { - x: 3, - y: 15, - color: color`0` -}); - -function checkWin() { - let finishLines = getAll(finishLine); - let p = getFirst(player); - - for (let i = 0; i < finishLines.length; i++) { - if(finishLines[i].y == p.y) { - return true; - } - } - - return false; -} - -function runGame() { - gameRunning = true; - - let gameLoop = setInterval(() => { - ++score; - addText("Score: "+score, { - x: 3, - y: 15, - color: color`0` - }); - ++time; - - despawnVehicles(); - moveVehicles(); - spawnVehicle(); - spawnVehicle(); - }, 1000); - - let checksLoop = setInterval(() => { - if (checkHit()) { - gameRunning = false; - clearInterval(gameLoop); - clearInterval(checksLoop); - addText("Game Over!", { - x: 5, - y: 6, - color: color`3` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`3` - }); - - despawnAllVehicles(); - } - - if(checkWin()) { - gameRunning = false; - clearInterval(checksLoop); - addText("Won Game! ", { - x: 5, - y: 6, - color: color`4` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`4` - }); - - despawnAllVehicles(); - } - - if(checkHit() || checkWin()) { - clearInterval(gameLoop); - clearInterval(checksLoop); - } - }, 1); -} - -runGame(); diff --git a/games/crossy_sprig.js b/games/crossy_sprig.js index ab3aa5d7ad..1f5c6300bf 100644 --- a/games/crossy_sprig.js +++ b/games/crossy_sprig.js @@ -1,1312 +1,339 @@ /* -@title: Crossy Sprig -@author: hatanuk +@title: Cross_The_Road @tags: ['endless'] -@img: "" -@addedOn: 2024-03-21 - -CONTROLS: -w - Up -a - Left -d- Right -Can't go down! - -i - begin game -j - reset back to beginning +@addedOn: 2022-12-27 +@author: Haneesh Pediredla +Play:- +WASD to move. Dodge the vehicles and reach the finish line. +If you stand longer dodging the vehicles then the score will be high. +Press I to restart the game. */ +const vehicle = 'v'; +const player = 'p'; +const finishLine = 'f'; +let gameRunning; -const playerLeft = "q" -const playerRight = "w" -const playerLeftFlap = "e" -const playerRightFlap = "r" -const death = "t" -const roadOne = "u" -const roadTwo = "i" -const grassOne = "o" -const grassTwo = "p" -const grassThree = "a" -const chickenHouse = "d" -const seaOne = "f" -const seaTwo = "g" -const sand = "h" -const carPurpleRight = "s" -const carPurpleLeft = "j" -const carGreenRight = "y" -const carGreenLeft = "k" -const bam = "l" -const gui = "z" -const guiTopLeft = "1" -const guiTopRight = "2" -const guiBottomLeft = "3" -const guiBottomRight = "4" -const guiTop = "5" -const guiBottom = "6" -const guiLeft = "7" -const guiRight = "8" -const truckLeft = "x" -const truckRight = "c" -const asphalt = "v" -const tree1 = "b" -const tree2 = "n" -const box = "m" - -const leftCarSprites = [carPurpleLeft, carGreenLeft, truckLeft] -const rightCarSprites = [carPurpleRight, carGreenRight, truckRight] -const carSprites = [...leftCarSprites, ...rightCarSprites] - -const playerSprites = [playerLeft, playerRight, playerLeftFlap, playerRightFlap] - -const grassSprites = [grassOne, grassTwo, grassThree] -const seaSprites = [seaOne, seaTwo] -const asphaltSprites = [asphalt] -const solidObjects = [tree1, tree2, box] -const worldObjects = [roadOne, roadTwo, sand, chickenHouse, ...seaSprites, ...grassSprites, ...carSprites, ...asphaltSprites, ...solidObjects]; -const guiElements = [guiTopLeft,guiTopRight,guiBottomLeft,guiBottomRight,guiTop,guiBottom,guiLeft,guiRight, gui] - - -const MOVECOOLDOWN = 100 -const TICKMS = 100; - -let premoveUp -let premoveLeft -let premoveRight - - -let gameStart = false -let canStart = true -let cooldown = false -let gameTickCounter = 0 -let cooldownTickCounter = 0 -let playerDirection = "left" -let currentScore = 0 -let highScore = 0 - -let counterDict = {"road": 0, - "grass": 0, - "asphalt": 0} - -let activeRoads = [] - -setSolids([...playerSprites, ...solidObjects]) +let time = 0; +let score = 0; setLegend( - [bam, bitmap` -...HH........H.. -...HHHHH...HHH.. -....HH88HHHH8H.. -.....H888HH88H.. -..HHHH8788878HH. -HHH88877777788H. -HH888777777788HH -.HHH877777778HH. -..HH877777778H.. -...H877777778H.. -..HH887777888HH. -.HH88H88788HHHHH -..HHHHH888HHHH.. -..HH.HHH8HHH.... -..H...HHHHH..... -.......HH.......` ], - [death, bitmap` -................ -................ -....111LL111.... -...1LLLLLLLL1... -...1LLLL00LL1... -...LLLL0000LL... -...LLLL0000LL... -...LLLL100LLL... -...LLL1LLLLLL... -...L11LL33LLL... -...LL1LLD33LL... -...LLLLLDD331... -11LLLLLDDDD3LL1. -.11111DDL1LL11.. -...1111111111... -................` ], - [gui, bitmap` -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH` ], - [guiTopLeft, bitmap` -....HHHHHHHHHHHH -..HH777777777777 -.H77777777777777 -.H77HHHHHHHHHHHH -H77HH88888888888 -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH` ], - [guiTopRight, bitmap` -HHHHHHHHHHHH.... -777777777777HH.. -77777777777777H. -HHHHHHHHHHHH77H. -88888888888HH77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H` ], - [guiBottomLeft, bitmap` -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77HH88888888888 -.H77HHHHHHHHHHHH -.H77777777777777 -..HH777777777777 -....HHHHHHHHHHHH` ], - [guiBottomRight, bitmap` -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -88888888888HH77H -HHHHHHHHHHHH77H. -77777777777777H. -777777777777HH.. -HHHHHHHHHHHH....` ], - [guiTop, bitmap` -HHHHHHHHHHHHHHHH -7777777777777777 -7777777777777777 -HHHHHHHHHHHHHHHH -8888888888888888 -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH` ], - [guiBottom, bitmap` -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -HHHHHHHHHHHHHHHH -8888888888888888 -HHHHHHHHHHHHHHHH -7777777777777777 -7777777777777777 -HHHHHHHHHHHHHHHH` ], - [guiLeft, bitmap` -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH -H77H8HHHHHHHHHHH` ], - [guiRight, bitmap` -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H -HHHHHHHHHHH8H77H` ], - [chickenHouse, bitmap` -DDDDDDDDDDDDDDDD -DDD4DDDDDDDDDDD1 -D44DDDDD333DDDDD -DDDDDD33333CCDDD -DDDD3333333CCCCD -DD333333333CCCCC -DDDD5555333CC55D -DDDD55555555555D -4DDD556F6555555D -D4DD56FFF655555D -D4DD5FFFFF55555D -DDDD5FF8885555DD -DDDD588888555DDD -DDDDDD888855DDDD -DDDDDDDDDDDDDDDD -DDD1DDDDDDDDDDDD` ], - [truckRight, bitmap -` -.2222222222..... -200000000002.... -20LLLLLLLL02.... -20LHHHHHHH02.... -2000000000022... -20H22222220662.. -20H288588209962. -20H285858200096. -20H2222222000092 -2000000000099992 -2999999999999992 -.2L0L222222L0L2. -.2LLL2....2LLL2. -..222......222.. -................ -................` ], - [truckLeft, bitmap -` -.....2222222222. -....200000000002 -....20LLLLLLLL02 -....201111111L02 -...2200000000002 -..2660HHHHHHH102 -.26330H77577H102 -.63000H75757H102 -230000HHHHHHH102 -2333300000000002 -2333333333333332 -.2L0L222222L0L2. -.2LLL2....2LLL2. -..222......222.. -................ -................` ], - [carPurpleRight, bitmap` -................ + [player, bitmap` ................ -...22222222..... -.22555888552222. -2585088888055552 -2585088888058852 -2585088888058882 -2585088888058882 -2588500000558852 -2555555555555552 -.25LLL5555LLL52. -..2L1L2222L1L2.. -..2LLL2..2LLL2.. -...222....222... ................ -................` ], - [carPurpleLeft, bitmap` ................ ................ -.....22222222... -.2222HH777HHH22. -2HHHH0777770H7H2 -2H77H0777770H7H2 -2777H0777770H7H2 -2777H0777770H7H2 -2H77HH00000H77H2 -2HHHHHHHHHHHHHH2 -.2HLLLHHHHLLLH2. -..2L1L2222L1L2.. -..2LLL2..2LLL2.. -...222....222... ................ -................` ], - [carGreenRight, bitmap` +.....00......... +....0000........ +....0..0........ +.....00......... +....0000........ +...0.00.0....... +..0..00..0...... +.....00......... +.....00......... +....0..0........ +...0....0.......`], + [vehicle, bitmap` ................ -........2....... -....2222L22..... -..22HH7LLHH222.. -.27H707L770HHH2. -.27H7077770H77H2 -.27H7077770H7772 -.27H7077770H7772 -.277H00000HH77H2 -.2HHHHHHHHHHHH2. -.2HHLLLHHHLLLH2. -..22L1L222L1L2.. -...2LLL2.2LLL2.. -....222...222... ................ -................` ], - [carGreenLeft, bitmap` ................ -.......2........ -.....22L2222.... -..22200LLL0022.. -.20000LLLL000L2. -20LL00LLLL000L2. -2LLL00LLLL000L2. -2LLL00LLLL000L2. -20LL00000000LL2. -.20000000000002. -.20LLL000LLL002. -..2L1L222L1L22.. -..2LLL2.2LLL2... -...222...222.... ................ -................` ], - [playerLeft, bitmap` -......2222...... -....22333322.... -...2LLLL11112... -...2LLLL11112... -..26699L10012... -..26699L10012... -...2L33L11112... -...2L33L11112... -...2LLLL111122.. -..2100232000L12. -.21L000200001L2. -.21L000000001L12 -..2100000000L112 -...222692269222. -....269926992... -.....2222222....` ], - [playerLeftFlap, bitmap` -......2222...... -....22333322.... -...2LLLL11112... -..26699L11112... -..22L33L10012... -..26699L10012... -...2L33L1111222. -..22L33L11112LL2 -.21LLLLL1111L1L2 -21LLL002320011L2 -21LLL000200011L2 -.22220000000LL12 -....200000001112 -....22692269222. -...269926992.... -....2222222.....` ], - [playerRight, bitmap` -......2222...... -....22333322.... -...21111LLLL2... -...21111LLLL2... -...21001L99662.. -...21001L99662.. -...21111L33L2... -...21111L33L2... -..221111LLLL2... -.21L0023200012.. -.2L100020000L12. -21L100000000L12. -211L0000000012.. -.222962296222... -...299629962.... -....2222222.....` ], - [playerRightFlap, bitmap` -......2222...... -....22333322.... -...21111LLLL2... -...21111L99662.. -...21001L33L22.. -...21001L99662.. -.2221111L33L2... -2LL21111L33L22.. -2L1L1111LLLLL12. -2L110023200LLL12 -2L110002000LLL12 -21LL00000002222. -211100000002.... -.22296229622.... -....299629962... -.....2222222....` ], - [tree1, bitmap` -......4444...... -....44444444.... -...4434444444... -...4444443444... -....4C4444C4.00. -......CC4C..0000 -.......CC....00. -.......CCC..000. -.......CC..000.. -.......CC.0000.. -....444CC44400.. -...4DDCCCCDD40.. -..4DCCCCCCCCD4.. -...4CDDCDDDC4... -....44444444.... -................` ], - [tree2, bitmap` ................ -....44494444.... -...4444444444... -..4444C44C4494.. -..444.C4CC.444.. -.......CC..LLLL. -........C....LLL -........C....L.. -........C...LL.. -.......CC..LLL.. -....444CC444LL.. -...4DDCCCCDD4L.. -..4DCCCCCCCCD4.. -...4CDDCDDDC4... -....44444444.... -................` ], - [box, bitmap` +333333333333.... +3333333333333... +37737737737733.. +377377377377733. +3773773773777733 +3333333333333333 +3333333333333333 ................ ................ ................ -......CCCCCCCC.. -....CCCCCCCCCC.. -....C999999CCC.. -....CC9999C9CC.. -....C9C99C99CC.. -....C99CC999CC.. -...CCCCCC999CCL. -..CCCCCC9C99CCL. -..C999CC99C9CLL. -..C9C9CC999CLLL. -..C999CCLLLLLL.. -..CCCCCLLLLLL... -..LLLLLLLLL.....` ], - [roadOne, bitmap` -2222222222222222 -1111111111111111 -LLLLLLLLLLLLLLLL -0000000000000000 -0000000000000000 -0000000000000000 -0000000000000000 -0000000000666666 -0000000000666666 -0000000000000000 -0000000000000000 -0000000000000000 -0000000000000000 -LLLLLLLLLLLLLLLL -1111111111111111 -2222222222222222` ], - [roadTwo, bitmap` -2222222222222222 -1111111111111111 -LLLLLLLLLLLLLLLL -0000000000000000 -0000000000000000 -0000000000000000 -0000000000000000 -6666660000000000 -6666660000000000 -0000000000000000 -0000000000000000 -0000000000000000 -0000000000000000 -LLLLLLLLLLLLLLLL -1111111111111111 -2222222222222222` ], - [grassOne, bitmap` -DDDDDDDDDDDDD4DD -DDDDDDDDDDDDDD4D -DDDDDDD4DDDDDD4D -DDD4DDD4DDDDDDDD -DDD4DD4DDDDDDDDD -DDDD4D4DDDD44DDD -DDDD4DDDDD434DDD -DDDDDDDDDD44DDDD -DDDDDDDDDDDDDDDD -DD6DDDDD4DDDDDDD -D696DDDD4DDDDDDD -DD6DDDD4DDDDDDDD -DD4DDDD4DDDDDDDD -DDD4DDDDDDDDDDDD -DDDDDDDDDDDDDDD4 -DDDDDDDDDDDDDD4D` ], - [grassTwo, bitmap` -DDDDDDDDDDDDDDDD -DDDDDD4DDDDDD1DD -DDDDDD4DDDD4DDDD -DDDDD4DDDDD4DDDD -DDDDD4DDDDDD4DDD -DDDDDDDDDDDD4DDD -DDDDDDDDDDDDDDDD -DDD4DDDDDDDDDDDD -DD484DDD4DDDDDDD -DDD4DDD4H4DDDDDD -DDDDDDDD4DDDDDDD -DDDDD4DDDDDDD4DD -DDDDDD4DDDDDD4DD -D4DDDDDDDDDD4DDD -D4DDDDDDDDDDDDDD -DD4DDDDDDDDDDDDD` ], - [grassThree, bitmap` -DDDDDDDDDDDDDDDD -DDDDDDDDD4DDDDDD -DD4DDDDD4DDDDDDD -DD4DDDDD4DDDDDDD -DDD4DDDDDDDDDDDD -DDD4DDDDDDDDDDDD -DDDDDDDDDD4DDDDD -DDDDDDDDD4DDDDDD -DDDDDDDD4DDDDDDD -DDDDD4DDDDDDDDDD -DDDDD4DDDDDDDDDD -DDDDDD4DDDDDDDDD -DDDDDDDDDDDDD4DD -DDD4DDDDDDDDDD4D -DD4DDDDDDDDDDD4D -DD4DDDDDDDDDDDDD` ], - [seaOne, bitmap` -6F666666F66666F6 -6666F66666666666 -6666666666666F66 -F6FFFF666FFF666F -FFFFFFFFFFFFFFFF -2FFF222FFF22FFF2 -7222777222772227 -2777227772227772 -7777777777777777 -7772777777772777 -7777777777777777 -7777777777777777 -7777777777777777 -5555577777777755 -5555555555555555 -5555555555555555id ` ], - [seaTwo, bitmap` -6F666666F66666F6 -6666F66666666666 -6666666666666F66 -F6FFFF666FFF666F -FFFFFFFFFFFFFFFF -2FFF222FFF22FFF2 -2222777222772222 -7777227772227777 -7777277777727777 -7777777777777777 -7777777777777777 -7777777777777777 -7777777777777777 -5555577777777755 -5555555577755555 -5555555555555555` ], - [sand, bitmap` -DDDDDDDDDDDDDDDD -DD4DDDD4DDDDDDDD -444444444444DDDD -46466646646644DD -66666666646F6644 -666F666666666664 -666666F666666F66 -6666666666666666 -6666666666666666 -F66666666F666666 -6666666666666666 -666F666666666666 -6666666666666666 -666666666666666F -6666666F66666666 -6666666666666666` ], - [asphalt, bitmap` -1111111111111111 -1111111111111111 -1111111111111111 -1111111111111111 -111L111111111111 -11L1111111111111 -1111111111111111 -1111111111111111 -1111111111111111 -11111111111L1111 -1111111111L11111 -1111111111111111 -1111111111111111 -1111111111111111 -1111111111111111 -1111111111111111` ], - - - -) - - -let level = 0 -const levels = [ - map` -oapapaappo -ppooapoaop -oappoapapp -aoapaoaaoa -pappdppppp -oaooaoaoao -hhhhhhhhhh -fgfgfgfgfg` -] - - -function mainLoop() { - counterDict = {"road": 0, - "grass": 2, - "asphalt": 2} - setMap(levels[0]) - addSprite(5, 4, playerLeft) - bringUpGUI() - addText("PRESS", { - x: 6, - y: parseInt(height()) / 2, - color:color`2` - }) - - addText("-> i <-", { - x: 6, - y: parseInt(height()) / 2 + 1, - color:color`0` - }) - - addText("TO BEGIN", { - x: 6, - y: parseInt(height()) / 2 + 2, - color:color`2` - }) -} - -function bringUpGUI() { - let coords - const max_x = width() - 1 - const max_y = parseInt(height()) / 2 - for (let x=1; x < max_x; x++) { - for (let y = 1; y < max_y; y++) { - switch (true) { - case x == 1 && y == 1: - addSprite(x, y, guiTopLeft) - break; - case x == max_x - 1 && y == 1: - addSprite(x, y, guiTopRight) - break; - - case x == 1 && y == max_y - 1: - addSprite(x, y, guiBottomLeft) - break; - - case x == max_x - 1 && y == max_y - 1: - addSprite(x, y, guiBottomRight) - break; - - case x == 1: - addSprite(x, y, guiLeft) - break; - - case x == max_x - 1: - addSprite(x, y, guiRight) - break; - - case y == 1: - addSprite(x, y, guiTop) - break; - - case y == max_y - 1: - addSprite(x, y, guiBottom) - break; - - default: - addSprite(x, y, gui) - } - - } - } -} - -function bringUpScore() { - let max_x = width() - 4 - let min_x = width() - max_x - 1 - for (let x=min_x; x <= max_x; x++) { - switch (true){ - case (x == min_x): - addSprite(x, height() - 1, guiTopLeft) - break; - case (x == max_x): - addSprite(x, height() - 1, guiTopRight) - break; - default: - addSprite(x, height() - 1, guiTop) +................`], + [finishLine, bitmap` +000222000222000L +000222000222000L +000222000222000L +222000222000222L +222000222000222L +222000222000222L +000222000222000L +000222000222000L +000222000222000L +222000222000222L +222000222000222L +222000222000222L +000222000222000L +000222000222000L +000222000222000L +................`], +); + +setMap(map` +ffffffff +......v. +...v.... +.....v.. +.v...... +......v. +....v... +.......p`); + +onInput('w', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).y -= 1; } } -} - - -function hideGUI() { - let guiSprites - guiElements.forEach((guiElement) => { - guiSprites = getAll(guiElement) - guiSprites.forEach((guiSprite) => { - guiSprite.remove() - }) - }) - -} - -// Scroll system +}); -function getObjects() { - let assets = getAll(); - let objects = []; - for (let i = 0; i < assets.length; i++) { +onInput('s', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); - if (worldObjects.includes(assets[i].type)) { - - objects.push(assets[i]); + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).y += 1; } } - return objects -} - -function changeObject(from, to) { - addSprite(from.x, from.y, to) - -} - -function moveView(x, y) { - let objects = getObjects(); - for (let i = 0; i < objects.length; i++) { - - // Move object y upwards - objects[i].y -= y; - - // Move object x to the right - objects[i].x -= x; - - } -} +}); +onInput('a', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); -function clearLastRow() { - let row = height() - 1 - - for (let col = 0; col < width(); col++) { - clearTile(col, row) - } - bringUpScore() -} - -function updateRoadYCoordinate() { - activeRoads.forEach((road) => { - road["yCoordinate"] += 1 - }) -} - -function checkRoadClear() { - // checks the oldest generated road to see whether it's time to remove it - if (activeRoads.length > 0) { - let road = activeRoads[0] - if (road["yCoordinate"] >= height() - 1) { - activeRoads.shift() + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).x -= 1; } } -} - -// checks if there is no object blocking the path upward -function isAboveClear() { - let player = getFirst(getPlayer()) - let spritesAbove = getTile(player.x, player.y-1) - let isClear = true +}); +onInput('d', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); - spritesAbove.forEach((sprite) => { - if (solidObjects.includes(sprite.type)) { - isClear = false + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).x += 1; } + } +}); - }) - - return isClear ? true : false -} +onInput("i", () => { + if(gameRunning == false) { + let p = getFirst("p"); -function onUpMove() { - updateSprite(playerDirection) - if (isAboveClear()) { - clearLastRow() - checkRoadClear() - moveView(0, -1); - updateRoadYCoordinate() - generateNewRow() - currentScore += 1 + score = 0; + + p.x = 7; + p.y = 7; + + setMap(map` +ffffffff +......v. +...v.... +.....v.. +.v...... +......v. +....v... +.......p`); + + addText("Game Over!", { + x: 5, + y: 6, + color: color`2` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`2` + }); + + addText("Won Game!", { + x: 5, + y: 6, + color: color`2` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`2` + }); + runGame(); } -} - -// Probability-based helper functions +}); -function getRandomInt(min, max) { - return Math.floor(Math.random() * (max - min + 1) + min); +function spawnVehicle() { + let x = 0; + let y = Math.floor(Math.random() * 7) + 1; + addSprite(x, y, vehicle); } -function chooseRandomElement(array) { - return array[getRandomInt(0, array.length - 1)] +function moveVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + vehicles[i].x += 1; + } } - -function getNewRowType() { - const probability = getRandomInt(1, 100); - - if (counterDict["road"] > 2) { - // Prevent more than 3 roads stacking - return (probability < 50) ? "grass" : "asphalt" - } - if (counterDict["grass"] > 1 || counterDict["asphalt"] > 1) { - // Prevent more than 2 grass/asphalt stacking - return "road" - } - if (probability <= 30) { - // 30 percent chance to generate road, otherwise grass/asphalt - return "road" - } else { - if (counterDict["grass"] > 0) { - return "grass" - } else if (counterDict["asphalt"] > 0){ - return "asphalt" - } else { - return (probability <= 65) ? "asphalt" : "grass" +function despawnVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + if (vehicles[i].x == 7) { + vehicles[i].remove(); } } } -function addObject(objectArray) { - let amount = getRandomInt(1, 3) - let avaliableTiles = shuffleArray(Array.from(Array(width()).keys())) - for (let i = 0; i < amount; i++) { - addSprite(avaliableTiles[i], 0, chooseRandomElement(objectArray)) +function despawnAllVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + vehicles[i].remove(); } } - -function buildRow(rowFactory) { - for (let x = 0; x < width(); x++) { - addSprite(x, 0, rowFactory(x)) - } -} - -function resetCounters(exception) { - - Object.keys(counterDict).forEach( (counter) => { - if (counter != exception) { - counterDict[counter] = 0 +function checkHit() { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + for (let i = 0; i < vehicles.length; i++) { + if (vehicles[i].x == p.x && vehicles[i].y == p.y) { + return true; } - }) - -} - -function generateRoad() { - // roads have 2 distinct features: direction, speed and traffic density of vehicles - // these are chosen randomly - - // speed is measured in ticks: how many milliseconds for a vehicle to change position - const SPEEDS = [800, 500] - // which direction the vehicles come from - const DIRECTIONS = ["left", "right"] - // probability that a new vehicle will spawn every time the positions change - const TRAFFIC = [10, 20, 20, 20, 30] - - - // ramp up difficulty the higher the score - for (let i = 20; i <= currentScore; i += 20) { - SPEEDS.push(200) - TRAFFIC.push(30) } - - const chosenSpeed = SPEEDS[getRandomInt(0, SPEEDS.length - 1)] - const chosenDirection = DIRECTIONS[getRandomInt(0, DIRECTIONS.length - 1)] - const chosenTraffic = TRAFFIC[getRandomInt(0, TRAFFIC.length - 1)] - - let road = {"direction": chosenDirection, - "spawnRate" : chosenSpeed, - "spawnFrequency" : chosenTraffic, - "yCoordinate" : 0} - activeRoads.push({"direction": chosenDirection, - "spawnRate" : chosenSpeed, - "spawnFrequency" : chosenTraffic, - "yCoordinate" : 0}) - - // Add some car sprites randomly to make the road appear pre-populated - let numCars = parseInt(chosenTraffic / 10) - let carSprite - let possibleTiles = shuffleArray(Array.from(Array(width()).keys())) - while (numCars != 0) { - carSprite = (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites) - addSprite(possibleTiles.pop(), 0, carSprite) - numCars -= 1 - } - + + return false; } -function shuffleArray(array) { - for (let i = array.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [array[i], array[j]] = [array[j], array[i]]; - } - return array -} +addText("Score: "+score, { + x: 3, + y: 15, + color: color`0` +}); +function checkWin() { + let finishLines = getAll(finishLine); + let p = getFirst(player); -function generateNewRow() { - const rowType = getNewRowType() - if (rowType == "road") { - counterDict["road"]++ - buildRow((x) => x % 2 == 0 ? roadOne : roadTwo) - // Reset all counters except road - resetCounters("road") - generateRoad() - - } else if (rowType == "grass") { - counterDict["grass"]++ - buildRow((x) => chooseRandomElement(grassSprites)) - // Reset all counters except grass - resetCounters("grass") - // if it comes right after a road, add objects - if (counterDict["grass"] == 1) { - addObject(solidObjects) - } - } else if (rowType == "asphalt") { - counterDict["asphalt"]++ - buildRow((x) => chooseRandomElement(asphaltSprites)) - // Reset all counters except asphalt - resetCounters("asphalt") - if (counterDict["asphalt"] == 1) { - addObject(solidObjects) + for (let i = 0; i < finishLines.length; i++) { + if(finishLines[i].y == p.y) { + return true; } } -} -// this function returns the correct player sprite depending on the direction of the player and movement cooldown -function getPlayer() { - if (playerDirection == "left" && cooldown) { - return playerLeftFlap - } - else if (playerDirection == "right" && cooldown) { - return playerRightFlap - } - else if (playerDirection == "left") { - return playerLeft - } - else if (playerDirection == "right") { - return playerRight - } + return false; } -// replaces the sprite of the player given their old one with a new one -function replacePlayer(oldSprite, newSprite) { - - const oldPlayer = getFirst(oldSprite) - let x = oldPlayer.x - let y = oldPlayer.y - oldPlayer.remove() - addSprite(x, y, newSprite) +function runGame() { + gameRunning = true; -} - - -// updates the sprite whenever the player moves with the correct direction and animation -function updateSprite(direction) { - let oldSprite = getPlayer() - cooldown = true - playerDirection = direction - let newSprite = getPlayer() - replacePlayer(oldSprite, newSprite) -} - -function onSideMove(direction) { - updateSprite(direction) - getFirst(getPlayer()).x += (direction == "right") ? 1 : -1 -} - -onInput("w", () => { - if (gameStart == true && cooldown == false) { - onUpMove() - } else if (gameStart == true && cooldown == true) { - // premove - premoveUp = true + let gameLoop = setInterval(() => { + ++score; + addText("Score: "+score, { + x: 3, + y: 15, + color: color`0` + }); + ++time; - } + despawnVehicles(); + moveVehicles(); + spawnVehicle(); + spawnVehicle(); + }, 1000); + + let checksLoop = setInterval(() => { + if (checkHit()) { + gameRunning = false; + clearInterval(gameLoop); + clearInterval(checksLoop); + addText("Game Over!", { + x: 5, + y: 6, + color: color`3` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`3` + }); -}) - - -onInput("a", () => { - if (gameStart == true && cooldown == false) { - onSideMove("left") - } else if (gameStart == true && cooldown == true) { - // premove - premoveLeft = true - } -}) - -onInput("d", () => { - if (gameStart == true && cooldown == false) { - onSideMove("right") - } else if (gameStart == true && cooldown == true) { - // premove - premoveRight = true - } -}) - - -onInput("i", () => { - if (gameStart == false && canStart == true) { - clearText() - hideGUI() - currentScore = 0 - bringUpScore() - gameStart = true - } -} -) - - -onInput("j", () => { - if (gameStart == false) { - clearText() - mainLoop() - canStart = true - } -} -) - - - -function spawnVehicle(road) { - let x = (road["direction"] == "left") ? 0 : width() - 1 - // this is a probability check; we generate a number between 1-100 - // and check if its below or equal to the spawn chance (somewhere between 15-30) - let chance = getRandomInt(1, 100) - if (chance <= road["spawnFrequency"]) { - addSprite(x, road["yCoordinate"], (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites)) + despawnAllVehicles(); } -} - -function getVehiclesOnRoad(road) { - let y = road["yCoordinate"] - let vehicles = [] - for (let x = 0; x < width(); x++) { - getTile(x, y).forEach((sprite) => { - if (carSprites.includes(sprite.type)) { - vehicles.push(sprite) - } - }) - } - return vehicles -} - -function moveVehicles(road) { - let vehicles = getVehiclesOnRoad(road) - - - vehicles.forEach((vehicle) => { - if (road["direction"] == "left") { - if (vehicle.x < width() - 1) { - vehicle.x += 1 - } else { - vehicle.remove() + if(checkWin()) { + gameRunning = false; + clearInterval(checksLoop); + addText("Won Game! ", { + x: 5, + y: 6, + color: color`4` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`4` + }); + + despawnAllVehicles(); } - } - if (road["direction"] == "right") { - if (vehicle.x > 0) { - vehicle.x -= 1 - } else { - vehicle.remove() - } + if(checkHit() || checkWin()) { + clearInterval(gameLoop); + clearInterval(checksLoop); } - }) + }, 1); } -function delayDelete(sprite, time) { - setTimeout(() => { - sprite.remove()}, time) -} - -function onDeath(player, collidedVehicle) { - player.type = death - collidedVehicle.type = bam - clearText() - addText("BACK:j", - {x:7, - y:15, - color:color`0`}) - addSprite(2, 2, death) - addSprite(width() - 3, 2, death) - - if (currentScore > highScore) {highScore = currentScore} - - addText("-MORTIS-", - {x:6, - y:4, - color:"2"}) - addText("NOW:" + String(currentScore), - {x:7, - y:5, - color:color`6`}) - addText("BEST:" + String(highScore), - {x:7, - y:6, - color:color`6`}) - - activeRoads = [] - cooldown = false - playerDirection = "left" - canStart = false - -} - - - -// BUILT IN FUNCTION THAT RUNS EVERY X MILLISECONDS -// I use it here to increment TickCounter variables in order to implement cooldowns and enemy movements -setInterval(() => { - - - if (!gameStart) { - bringUpGUI() - } - - if (gameStart) { - let isDead = false - let player = getFirst(getPlayer()) - let collidedVehicle - // checks if there are any tiles where the player and a vehicle has collided - ie death has occurred - // -> for all vehicle sprites - carSprites.forEach( (carType) => { - let sprites = tilesWith(player.type, carType) - - if (sprites.length > 0) { - // if there is a tile with a player + vehicle - isDead = true - gameStart = false - sprites[0].forEach ( (sprite) => { - if (sprite.type == carType) { - collidedVehicle = sprite - } - }) - } - }) - if (isDead) { - onDeath(player, collidedVehicle) - return - - } - // Current score Display - addText( - String(currentScore), - {x:9, - y: 15, - color:color`2`}) - - - - // set gameTickCounter to += TICKMS if it's less than 1500ms - otherwise reset it back to 0 - // This is so that it won't become infinitely large - if (gameTickCounter < 1400) { - gameTickCounter += TICKMS - } else { - gameTickCounter = 0 - } - - - - // remember - setInterval is called every X milliseconds (ms) - // here I specified it to run every 10 miliseconds - let counter = 0 - - activeRoads.forEach((road) => { - - - - if (gameTickCounter % road["spawnRate"] == 0) { - counter += 1 - moveVehicles(road) - spawnVehicle(road) - - } - }) - - - if (cooldown) { - // count up the cooldownTickCounter if a cooldown is activated - cooldownTickCounter += 50 - } - // then when the cooldownTickCounter >= MOVECOOLDOWN, set the cooldown to false and change animation back - if (cooldownTickCounter >= MOVECOOLDOWN) { - let oldSprite = getPlayer() - cooldown = false - let newSprite = getPlayer() - replacePlayer(oldSprite, newSprite) - cooldownTickCounter = 0 - - // also perform any premoves - if (premoveUp) { - premoveUp = false - onUpMove() - } - if (premoveLeft) { - premoveLeft = false - onSideMove("left") - } - if (premoveRight) { - premoveRight= false - onSideMove("right") - } - } - } - }, TICKMS) - // Notice how the TICKMS here is another parameter - I defined this constant earlier, - // The setInterval function runs every TICKMS milliseconds - - // Call the mainLoop() function to begin the game when you run the program -mainLoop() +runGame(); diff --git a/games/img/Crossy_Sprig.png b/games/img/Crossy_Sprig.png index 67a6baa7299b0ea152edc5e0bf6976736ddb6558..ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c 100644 GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; literal 4756 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 From 0a561517c611a970ced8c30f8f7ff248c9b4a7ff Mon Sep 17 00:00:00 2001 From: Graham Darcey Date: Wed, 19 Jun 2024 15:49:23 -0400 Subject: [PATCH 5/7] Revert "Fix filepath and move img to correct dir" This reverts commit 7ddb2f81d63ca4b8314d291c2e50fa19cc8cca70. --- Screenshot 2024-05-21 125209.png | Bin 0 -> 817 bytes games/Cross_The_Road.js | 339 +++++++ games/crossy_sprig.js | 1509 ++++++++++++++++++++++++------ games/img/Crossy_Sprig.png | Bin 817 -> 4756 bytes 4 files changed, 1580 insertions(+), 268 deletions(-) create mode 100644 Screenshot 2024-05-21 125209.png create mode 100644 games/Cross_The_Road.js diff --git a/Screenshot 2024-05-21 125209.png b/Screenshot 2024-05-21 125209.png new file mode 100644 index 0000000000000000000000000000000000000000..ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; literal 0 HcmV?d00001 diff --git a/games/Cross_The_Road.js b/games/Cross_The_Road.js new file mode 100644 index 0000000000..1f5c6300bf --- /dev/null +++ b/games/Cross_The_Road.js @@ -0,0 +1,339 @@ +/* +@title: Cross_The_Road +@tags: ['endless'] +@addedOn: 2022-12-27 +@author: Haneesh Pediredla + +Play:- +WASD to move. Dodge the vehicles and reach the finish line. +If you stand longer dodging the vehicles then the score will be high. +Press I to restart the game. +*/ + +const vehicle = 'v'; +const player = 'p'; +const finishLine = 'f'; + +let gameRunning; + +let time = 0; +let score = 0; + +setLegend( + [player, bitmap` +................ +................ +................ +................ +................ +.....00......... +....0000........ +....0..0........ +.....00......... +....0000........ +...0.00.0....... +..0..00..0...... +.....00......... +.....00......... +....0..0........ +...0....0.......`], + [vehicle, bitmap` +................ +................ +................ +................ +................ +333333333333.... +3333333333333... +37737737737733.. +377377377377733. +3773773773777733 +3333333333333333 +3333333333333333 +................ +................ +................ +................`], + [finishLine, bitmap` +000222000222000L +000222000222000L +000222000222000L +222000222000222L +222000222000222L +222000222000222L +000222000222000L +000222000222000L +000222000222000L +222000222000222L +222000222000222L +222000222000222L +000222000222000L +000222000222000L +000222000222000L +................`], +); + +setMap(map` +ffffffff +......v. +...v.... +.....v.. +.v...... +......v. +....v... +.......p`); + +onInput('w', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).y -= 1; + } + } +}); + +onInput('s', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).y += 1; + } + } +}); + +onInput('a', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).x -= 1; + } + } +}); + +onInput('d', () => { + if(gameRunning) { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + let isCollision; + + vehicles.forEach(vehicle => { + if(vehicle.x == p.x && vehicle.y == p.y) + isCollision = true; + else + isCollision = false; + }); + + if(isCollision == false) { + getFirst(player).x += 1; + } + } +}); + +onInput("i", () => { + if(gameRunning == false) { + let p = getFirst("p"); + + score = 0; + + p.x = 7; + p.y = 7; + + setMap(map` +ffffffff +......v. +...v.... +.....v.. +.v...... +......v. +....v... +.......p`); + + addText("Game Over!", { + x: 5, + y: 6, + color: color`2` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`2` + }); + + addText("Won Game!", { + x: 5, + y: 6, + color: color`2` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`2` + }); + runGame(); + } +}); + +function spawnVehicle() { + let x = 0; + let y = Math.floor(Math.random() * 7) + 1; + addSprite(x, y, vehicle); +} + +function moveVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + vehicles[i].x += 1; + } +} + +function despawnVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + if (vehicles[i].x == 7) { + vehicles[i].remove(); + } + } +} + +function despawnAllVehicles() { + let vehicles = getAll(vehicle); + + for (let i = 0; i < vehicles.length; i++) { + vehicles[i].remove(); + } +} + +function checkHit() { + let vehicles = getAll(vehicle); + let p = getFirst(player); + + for (let i = 0; i < vehicles.length; i++) { + if (vehicles[i].x == p.x && vehicles[i].y == p.y) { + return true; + } + } + + return false; +} + +addText("Score: "+score, { + x: 3, + y: 15, + color: color`0` +}); + +function checkWin() { + let finishLines = getAll(finishLine); + let p = getFirst(player); + + for (let i = 0; i < finishLines.length; i++) { + if(finishLines[i].y == p.y) { + return true; + } + } + + return false; +} + +function runGame() { + gameRunning = true; + + let gameLoop = setInterval(() => { + ++score; + addText("Score: "+score, { + x: 3, + y: 15, + color: color`0` + }); + ++time; + + despawnVehicles(); + moveVehicles(); + spawnVehicle(); + spawnVehicle(); + }, 1000); + + let checksLoop = setInterval(() => { + if (checkHit()) { + gameRunning = false; + clearInterval(gameLoop); + clearInterval(checksLoop); + addText("Game Over!", { + x: 5, + y: 6, + color: color`3` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`3` + }); + + despawnAllVehicles(); + } + + if(checkWin()) { + gameRunning = false; + clearInterval(checksLoop); + addText("Won Game! ", { + x: 5, + y: 6, + color: color`4` + }); + + addText("Score: "+score, { + x: 5, + y: 8, + color: color`4` + }); + + despawnAllVehicles(); + } + + if(checkHit() || checkWin()) { + clearInterval(gameLoop); + clearInterval(checksLoop); + } + }, 1); +} + +runGame(); diff --git a/games/crossy_sprig.js b/games/crossy_sprig.js index 1f5c6300bf..ab3aa5d7ad 100644 --- a/games/crossy_sprig.js +++ b/games/crossy_sprig.js @@ -1,339 +1,1312 @@ /* -@title: Cross_The_Road +@title: Crossy Sprig +@author: hatanuk @tags: ['endless'] -@addedOn: 2022-12-27 -@author: Haneesh Pediredla +@img: "" +@addedOn: 2024-03-21 + +CONTROLS: +w - Up +a - Left +d- Right +Can't go down! + +i - begin game +j - reset back to beginning -Play:- -WASD to move. Dodge the vehicles and reach the finish line. -If you stand longer dodging the vehicles then the score will be high. -Press I to restart the game. */ -const vehicle = 'v'; -const player = 'p'; -const finishLine = 'f'; -let gameRunning; -let time = 0; -let score = 0; +const playerLeft = "q" +const playerRight = "w" +const playerLeftFlap = "e" +const playerRightFlap = "r" +const death = "t" +const roadOne = "u" +const roadTwo = "i" +const grassOne = "o" +const grassTwo = "p" +const grassThree = "a" +const chickenHouse = "d" +const seaOne = "f" +const seaTwo = "g" +const sand = "h" +const carPurpleRight = "s" +const carPurpleLeft = "j" +const carGreenRight = "y" +const carGreenLeft = "k" +const bam = "l" +const gui = "z" +const guiTopLeft = "1" +const guiTopRight = "2" +const guiBottomLeft = "3" +const guiBottomRight = "4" +const guiTop = "5" +const guiBottom = "6" +const guiLeft = "7" +const guiRight = "8" +const truckLeft = "x" +const truckRight = "c" +const asphalt = "v" +const tree1 = "b" +const tree2 = "n" +const box = "m" + +const leftCarSprites = [carPurpleLeft, carGreenLeft, truckLeft] +const rightCarSprites = [carPurpleRight, carGreenRight, truckRight] +const carSprites = [...leftCarSprites, ...rightCarSprites] + +const playerSprites = [playerLeft, playerRight, playerLeftFlap, playerRightFlap] + +const grassSprites = [grassOne, grassTwo, grassThree] +const seaSprites = [seaOne, seaTwo] +const asphaltSprites = [asphalt] +const solidObjects = [tree1, tree2, box] +const worldObjects = [roadOne, roadTwo, sand, chickenHouse, ...seaSprites, ...grassSprites, ...carSprites, ...asphaltSprites, ...solidObjects]; +const guiElements = [guiTopLeft,guiTopRight,guiBottomLeft,guiBottomRight,guiTop,guiBottom,guiLeft,guiRight, gui] + + +const MOVECOOLDOWN = 100 +const TICKMS = 100; + +let premoveUp +let premoveLeft +let premoveRight + + +let gameStart = false +let canStart = true +let cooldown = false +let gameTickCounter = 0 +let cooldownTickCounter = 0 +let playerDirection = "left" +let currentScore = 0 +let highScore = 0 + +let counterDict = {"road": 0, + "grass": 0, + "asphalt": 0} + +let activeRoads = [] + +setSolids([...playerSprites, ...solidObjects]) setLegend( - [player, bitmap` + [bam, bitmap` +...HH........H.. +...HHHHH...HHH.. +....HH88HHHH8H.. +.....H888HH88H.. +..HHHH8788878HH. +HHH88877777788H. +HH888777777788HH +.HHH877777778HH. +..HH877777778H.. +...H877777778H.. +..HH887777888HH. +.HH88H88788HHHHH +..HHHHH888HHHH.. +..HH.HHH8HHH.... +..H...HHHHH..... +.......HH.......` ], + [death, bitmap` ................ ................ +....111LL111.... +...1LLLLLLLL1... +...1LLLL00LL1... +...LLLL0000LL... +...LLLL0000LL... +...LLLL100LLL... +...LLL1LLLLLL... +...L11LL33LLL... +...LL1LLD33LL... +...LLLLLDD331... +11LLLLLDDDD3LL1. +.11111DDL1LL11.. +...1111111111... +................` ], + [gui, bitmap` +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH` ], + [guiTopLeft, bitmap` +....HHHHHHHHHHHH +..HH777777777777 +.H77777777777777 +.H77HHHHHHHHHHHH +H77HH88888888888 +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH` ], + [guiTopRight, bitmap` +HHHHHHHHHHHH.... +777777777777HH.. +77777777777777H. +HHHHHHHHHHHH77H. +88888888888HH77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H` ], + [guiBottomLeft, bitmap` +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77HH88888888888 +.H77HHHHHHHHHHHH +.H77777777777777 +..HH777777777777 +....HHHHHHHHHHHH` ], + [guiBottomRight, bitmap` +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +88888888888HH77H +HHHHHHHHHHHH77H. +77777777777777H. +777777777777HH.. +HHHHHHHHHHHH....` ], + [guiTop, bitmap` +HHHHHHHHHHHHHHHH +7777777777777777 +7777777777777777 +HHHHHHHHHHHHHHHH +8888888888888888 +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH` ], + [guiBottom, bitmap` +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +HHHHHHHHHHHHHHHH +8888888888888888 +HHHHHHHHHHHHHHHH +7777777777777777 +7777777777777777 +HHHHHHHHHHHHHHHH` ], + [guiLeft, bitmap` +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH +H77H8HHHHHHHHHHH` ], + [guiRight, bitmap` +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H +HHHHHHHHHHH8H77H` ], + [chickenHouse, bitmap` +DDDDDDDDDDDDDDDD +DDD4DDDDDDDDDDD1 +D44DDDDD333DDDDD +DDDDDD33333CCDDD +DDDD3333333CCCCD +DD333333333CCCCC +DDDD5555333CC55D +DDDD55555555555D +4DDD556F6555555D +D4DD56FFF655555D +D4DD5FFFFF55555D +DDDD5FF8885555DD +DDDD588888555DDD +DDDDDD888855DDDD +DDDDDDDDDDDDDDDD +DDD1DDDDDDDDDDDD` ], + [truckRight, bitmap +` +.2222222222..... +200000000002.... +20LLLLLLLL02.... +20LHHHHHHH02.... +2000000000022... +20H22222220662.. +20H288588209962. +20H285858200096. +20H2222222000092 +2000000000099992 +2999999999999992 +.2L0L222222L0L2. +.2LLL2....2LLL2. +..222......222.. ................ +................` ], + [truckLeft, bitmap +` +.....2222222222. +....200000000002 +....20LLLLLLLL02 +....201111111L02 +...2200000000002 +..2660HHHHHHH102 +.26330H77577H102 +.63000H75757H102 +230000HHHHHHH102 +2333300000000002 +2333333333333332 +.2L0L222222L0L2. +.2LLL2....2LLL2. +..222......222.. ................ +................` ], + [carPurpleRight, bitmap` ................ -.....00......... -....0000........ -....0..0........ -.....00......... -....0000........ -...0.00.0....... -..0..00..0...... -.....00......... -.....00......... -....0..0........ -...0....0.......`], - [vehicle, bitmap` ................ +...22222222..... +.22555888552222. +2585088888055552 +2585088888058852 +2585088888058882 +2585088888058882 +2588500000558852 +2555555555555552 +.25LLL5555LLL52. +..2L1L2222L1L2.. +..2LLL2..2LLL2.. +...222....222... ................ +................` ], + [carPurpleLeft, bitmap` ................ ................ +.....22222222... +.2222HH777HHH22. +2HHHH0777770H7H2 +2H77H0777770H7H2 +2777H0777770H7H2 +2777H0777770H7H2 +2H77HH00000H77H2 +2HHHHHHHHHHHHHH2 +.2HLLLHHHHLLLH2. +..2L1L2222L1L2.. +..2LLL2..2LLL2.. +...222....222... ................ -333333333333.... -3333333333333... -37737737737733.. -377377377377733. -3773773773777733 -3333333333333333 -3333333333333333 +................` ], + [carGreenRight, bitmap` ................ +........2....... +....2222L22..... +..22HH7LLHH222.. +.27H707L770HHH2. +.27H7077770H77H2 +.27H7077770H7772 +.27H7077770H7772 +.277H00000HH77H2 +.2HHHHHHHHHHHH2. +.2HHLLLHHHLLLH2. +..22L1L222L1L2.. +...2LLL2.2LLL2.. +....222...222... ................ +................` ], + [carGreenLeft, bitmap` ................ -................`], - [finishLine, bitmap` -000222000222000L -000222000222000L -000222000222000L -222000222000222L -222000222000222L -222000222000222L -000222000222000L -000222000222000L -000222000222000L -222000222000222L -222000222000222L -222000222000222L -000222000222000L -000222000222000L -000222000222000L -................`], -); - -setMap(map` -ffffffff -......v. -...v.... -.....v.. -.v...... -......v. -....v... -.......p`); - -onInput('w', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).y -= 1; +.......2........ +.....22L2222.... +..22200LLL0022.. +.20000LLLL000L2. +20LL00LLLL000L2. +2LLL00LLLL000L2. +2LLL00LLLL000L2. +20LL00000000LL2. +.20000000000002. +.20LLL000LLL002. +..2L1L222L1L22.. +..2LLL2.2LLL2... +...222...222.... +................ +................` ], + [playerLeft, bitmap` +......2222...... +....22333322.... +...2LLLL11112... +...2LLLL11112... +..26699L10012... +..26699L10012... +...2L33L11112... +...2L33L11112... +...2LLLL111122.. +..2100232000L12. +.21L000200001L2. +.21L000000001L12 +..2100000000L112 +...222692269222. +....269926992... +.....2222222....` ], + [playerLeftFlap, bitmap` +......2222...... +....22333322.... +...2LLLL11112... +..26699L11112... +..22L33L10012... +..26699L10012... +...2L33L1111222. +..22L33L11112LL2 +.21LLLLL1111L1L2 +21LLL002320011L2 +21LLL000200011L2 +.22220000000LL12 +....200000001112 +....22692269222. +...269926992.... +....2222222.....` ], + [playerRight, bitmap` +......2222...... +....22333322.... +...21111LLLL2... +...21111LLLL2... +...21001L99662.. +...21001L99662.. +...21111L33L2... +...21111L33L2... +..221111LLLL2... +.21L0023200012.. +.2L100020000L12. +21L100000000L12. +211L0000000012.. +.222962296222... +...299629962.... +....2222222.....` ], + [playerRightFlap, bitmap` +......2222...... +....22333322.... +...21111LLLL2... +...21111L99662.. +...21001L33L22.. +...21001L99662.. +.2221111L33L2... +2LL21111L33L22.. +2L1L1111LLLLL12. +2L110023200LLL12 +2L110002000LLL12 +21LL00000002222. +211100000002.... +.22296229622.... +....299629962... +.....2222222....` ], + [tree1, bitmap` +......4444...... +....44444444.... +...4434444444... +...4444443444... +....4C4444C4.00. +......CC4C..0000 +.......CC....00. +.......CCC..000. +.......CC..000.. +.......CC.0000.. +....444CC44400.. +...4DDCCCCDD40.. +..4DCCCCCCCCD4.. +...4CDDCDDDC4... +....44444444.... +................` ], + [tree2, bitmap` +................ +....44494444.... +...4444444444... +..4444C44C4494.. +..444.C4CC.444.. +.......CC..LLLL. +........C....LLL +........C....L.. +........C...LL.. +.......CC..LLL.. +....444CC444LL.. +...4DDCCCCDD4L.. +..4DCCCCCCCCD4.. +...4CDDCDDDC4... +....44444444.... +................` ], + [box, bitmap` +................ +................ +................ +......CCCCCCCC.. +....CCCCCCCCCC.. +....C999999CCC.. +....CC9999C9CC.. +....C9C99C99CC.. +....C99CC999CC.. +...CCCCCC999CCL. +..CCCCCC9C99CCL. +..C999CC99C9CLL. +..C9C9CC999CLLL. +..C999CCLLLLLL.. +..CCCCCLLLLLL... +..LLLLLLLLL.....` ], + [roadOne, bitmap` +2222222222222222 +1111111111111111 +LLLLLLLLLLLLLLLL +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000666666 +0000000000666666 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +LLLLLLLLLLLLLLLL +1111111111111111 +2222222222222222` ], + [roadTwo, bitmap` +2222222222222222 +1111111111111111 +LLLLLLLLLLLLLLLL +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +6666660000000000 +6666660000000000 +0000000000000000 +0000000000000000 +0000000000000000 +0000000000000000 +LLLLLLLLLLLLLLLL +1111111111111111 +2222222222222222` ], + [grassOne, bitmap` +DDDDDDDDDDDDD4DD +DDDDDDDDDDDDDD4D +DDDDDDD4DDDDDD4D +DDD4DDD4DDDDDDDD +DDD4DD4DDDDDDDDD +DDDD4D4DDDD44DDD +DDDD4DDDDD434DDD +DDDDDDDDDD44DDDD +DDDDDDDDDDDDDDDD +DD6DDDDD4DDDDDDD +D696DDDD4DDDDDDD +DD6DDDD4DDDDDDDD +DD4DDDD4DDDDDDDD +DDD4DDDDDDDDDDDD +DDDDDDDDDDDDDDD4 +DDDDDDDDDDDDDD4D` ], + [grassTwo, bitmap` +DDDDDDDDDDDDDDDD +DDDDDD4DDDDDD1DD +DDDDDD4DDDD4DDDD +DDDDD4DDDDD4DDDD +DDDDD4DDDDDD4DDD +DDDDDDDDDDDD4DDD +DDDDDDDDDDDDDDDD +DDD4DDDDDDDDDDDD +DD484DDD4DDDDDDD +DDD4DDD4H4DDDDDD +DDDDDDDD4DDDDDDD +DDDDD4DDDDDDD4DD +DDDDDD4DDDDDD4DD +D4DDDDDDDDDD4DDD +D4DDDDDDDDDDDDDD +DD4DDDDDDDDDDDDD` ], + [grassThree, bitmap` +DDDDDDDDDDDDDDDD +DDDDDDDDD4DDDDDD +DD4DDDDD4DDDDDDD +DD4DDDDD4DDDDDDD +DDD4DDDDDDDDDDDD +DDD4DDDDDDDDDDDD +DDDDDDDDDD4DDDDD +DDDDDDDDD4DDDDDD +DDDDDDDD4DDDDDDD +DDDDD4DDDDDDDDDD +DDDDD4DDDDDDDDDD +DDDDDD4DDDDDDDDD +DDDDDDDDDDDDD4DD +DDD4DDDDDDDDDD4D +DD4DDDDDDDDDDD4D +DD4DDDDDDDDDDDDD` ], + [seaOne, bitmap` +6F666666F66666F6 +6666F66666666666 +6666666666666F66 +F6FFFF666FFF666F +FFFFFFFFFFFFFFFF +2FFF222FFF22FFF2 +7222777222772227 +2777227772227772 +7777777777777777 +7772777777772777 +7777777777777777 +7777777777777777 +7777777777777777 +5555577777777755 +5555555555555555 +5555555555555555id ` ], + [seaTwo, bitmap` +6F666666F66666F6 +6666F66666666666 +6666666666666F66 +F6FFFF666FFF666F +FFFFFFFFFFFFFFFF +2FFF222FFF22FFF2 +2222777222772222 +7777227772227777 +7777277777727777 +7777777777777777 +7777777777777777 +7777777777777777 +7777777777777777 +5555577777777755 +5555555577755555 +5555555555555555` ], + [sand, bitmap` +DDDDDDDDDDDDDDDD +DD4DDDD4DDDDDDDD +444444444444DDDD +46466646646644DD +66666666646F6644 +666F666666666664 +666666F666666F66 +6666666666666666 +6666666666666666 +F66666666F666666 +6666666666666666 +666F666666666666 +6666666666666666 +666666666666666F +6666666F66666666 +6666666666666666` ], + [asphalt, bitmap` +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +111L111111111111 +11L1111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +11111111111L1111 +1111111111L11111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111 +1111111111111111` ], + + + +) + + +let level = 0 +const levels = [ + map` +oapapaappo +ppooapoaop +oappoapapp +aoapaoaaoa +pappdppppp +oaooaoaoao +hhhhhhhhhh +fgfgfgfgfg` +] + + +function mainLoop() { + counterDict = {"road": 0, + "grass": 2, + "asphalt": 2} + setMap(levels[0]) + addSprite(5, 4, playerLeft) + bringUpGUI() + addText("PRESS", { + x: 6, + y: parseInt(height()) / 2, + color:color`2` + }) + + addText("-> i <-", { + x: 6, + y: parseInt(height()) / 2 + 1, + color:color`0` + }) + + addText("TO BEGIN", { + x: 6, + y: parseInt(height()) / 2 + 2, + color:color`2` + }) +} + +function bringUpGUI() { + let coords + const max_x = width() - 1 + const max_y = parseInt(height()) / 2 + for (let x=1; x < max_x; x++) { + for (let y = 1; y < max_y; y++) { + switch (true) { + case x == 1 && y == 1: + addSprite(x, y, guiTopLeft) + break; + case x == max_x - 1 && y == 1: + addSprite(x, y, guiTopRight) + break; + + case x == 1 && y == max_y - 1: + addSprite(x, y, guiBottomLeft) + break; + + case x == max_x - 1 && y == max_y - 1: + addSprite(x, y, guiBottomRight) + break; + + case x == 1: + addSprite(x, y, guiLeft) + break; + + case x == max_x - 1: + addSprite(x, y, guiRight) + break; + + case y == 1: + addSprite(x, y, guiTop) + break; + + case y == max_y - 1: + addSprite(x, y, guiBottom) + break; + + default: + addSprite(x, y, gui) + } + } } -}); - -onInput('s', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); +} - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).y += 1; +function bringUpScore() { + let max_x = width() - 4 + let min_x = width() - max_x - 1 + for (let x=min_x; x <= max_x; x++) { + switch (true){ + case (x == min_x): + addSprite(x, height() - 1, guiTopLeft) + break; + case (x == max_x): + addSprite(x, height() - 1, guiTopRight) + break; + default: + addSprite(x, height() - 1, guiTop) } } -}); +} + -onInput('a', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); +function hideGUI() { + let guiSprites + guiElements.forEach((guiElement) => { + guiSprites = getAll(guiElement) + guiSprites.forEach((guiSprite) => { + guiSprite.remove() + }) + }) - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).x -= 1; +} + +// Scroll system + +function getObjects() { + let assets = getAll(); + let objects = []; + for (let i = 0; i < assets.length; i++) { + + if (worldObjects.includes(assets[i].type)) { + + objects.push(assets[i]); } } -}); + return objects +} + +function changeObject(from, to) { + addSprite(from.x, from.y, to) + +} -onInput('d', () => { - if(gameRunning) { - let vehicles = getAll(vehicle); - let p = getFirst(player); +function moveView(x, y) { + let objects = getObjects(); + for (let i = 0; i < objects.length; i++) { - let isCollision; - - vehicles.forEach(vehicle => { - if(vehicle.x == p.x && vehicle.y == p.y) - isCollision = true; - else - isCollision = false; - }); - - if(isCollision == false) { - getFirst(player).x += 1; - } + // Move object y upwards + objects[i].y -= y; + + // Move object x to the right + objects[i].x -= x; + } -}); +} -onInput("i", () => { - if(gameRunning == false) { - let p = getFirst("p"); - score = 0; - - p.x = 7; - p.y = 7; - - setMap(map` -ffffffff -......v. -...v.... -.....v.. -.v...... -......v. -....v... -.......p`); - - addText("Game Over!", { - x: 5, - y: 6, - color: color`2` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`2` - }); - - addText("Won Game!", { - x: 5, - y: 6, - color: color`2` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`2` - }); - runGame(); +function clearLastRow() { + let row = height() - 1 + + for (let col = 0; col < width(); col++) { + clearTile(col, row) } -}); + bringUpScore() +} -function spawnVehicle() { - let x = 0; - let y = Math.floor(Math.random() * 7) + 1; - addSprite(x, y, vehicle); +function updateRoadYCoordinate() { + activeRoads.forEach((road) => { + road["yCoordinate"] += 1 + }) } -function moveVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - vehicles[i].x += 1; +function checkRoadClear() { + // checks the oldest generated road to see whether it's time to remove it + if (activeRoads.length > 0) { + let road = activeRoads[0] + if (road["yCoordinate"] >= height() - 1) { + activeRoads.shift() + } } } -function despawnVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - if (vehicles[i].x == 7) { - vehicles[i].remove(); +// checks if there is no object blocking the path upward +function isAboveClear() { + let player = getFirst(getPlayer()) + let spritesAbove = getTile(player.x, player.y-1) + let isClear = true + + + spritesAbove.forEach((sprite) => { + if (solidObjects.includes(sprite.type)) { + isClear = false } + + }) + + return isClear ? true : false +} + +function onUpMove() { + updateSprite(playerDirection) + if (isAboveClear()) { + clearLastRow() + checkRoadClear() + moveView(0, -1); + updateRoadYCoordinate() + generateNewRow() + currentScore += 1 } } -function despawnAllVehicles() { - let vehicles = getAll(vehicle); - - for (let i = 0; i < vehicles.length; i++) { - vehicles[i].remove(); +// Probability-based helper functions + +function getRandomInt(min, max) { + return Math.floor(Math.random() * (max - min + 1) + min); +} + +function chooseRandomElement(array) { + return array[getRandomInt(0, array.length - 1)] +} + + +function getNewRowType() { + const probability = getRandomInt(1, 100); + + if (counterDict["road"] > 2) { + // Prevent more than 3 roads stacking + return (probability < 50) ? "grass" : "asphalt" + } + if (counterDict["grass"] > 1 || counterDict["asphalt"] > 1) { + // Prevent more than 2 grass/asphalt stacking + return "road" + } + if (probability <= 30) { + // 30 percent chance to generate road, otherwise grass/asphalt + return "road" + } else { + if (counterDict["grass"] > 0) { + return "grass" + } else if (counterDict["asphalt"] > 0){ + return "asphalt" + } else { + return (probability <= 65) ? "asphalt" : "grass" + } } } -function checkHit() { - let vehicles = getAll(vehicle); - let p = getFirst(player); - - for (let i = 0; i < vehicles.length; i++) { - if (vehicles[i].x == p.x && vehicles[i].y == p.y) { - return true; +function addObject(objectArray) { + let amount = getRandomInt(1, 3) + let avaliableTiles = shuffleArray(Array.from(Array(width()).keys())) + for (let i = 0; i < amount; i++) { + addSprite(avaliableTiles[i], 0, chooseRandomElement(objectArray)) + } +} + + +function buildRow(rowFactory) { + for (let x = 0; x < width(); x++) { + addSprite(x, 0, rowFactory(x)) + } +} + +function resetCounters(exception) { + + Object.keys(counterDict).forEach( (counter) => { + if (counter != exception) { + counterDict[counter] = 0 } + }) + +} + +function generateRoad() { + // roads have 2 distinct features: direction, speed and traffic density of vehicles + // these are chosen randomly + + // speed is measured in ticks: how many milliseconds for a vehicle to change position + const SPEEDS = [800, 500] + // which direction the vehicles come from + const DIRECTIONS = ["left", "right"] + // probability that a new vehicle will spawn every time the positions change + const TRAFFIC = [10, 20, 20, 20, 30] + + + // ramp up difficulty the higher the score + for (let i = 20; i <= currentScore; i += 20) { + SPEEDS.push(200) + TRAFFIC.push(30) } - - return false; + + const chosenSpeed = SPEEDS[getRandomInt(0, SPEEDS.length - 1)] + const chosenDirection = DIRECTIONS[getRandomInt(0, DIRECTIONS.length - 1)] + const chosenTraffic = TRAFFIC[getRandomInt(0, TRAFFIC.length - 1)] + + let road = {"direction": chosenDirection, + "spawnRate" : chosenSpeed, + "spawnFrequency" : chosenTraffic, + "yCoordinate" : 0} + activeRoads.push({"direction": chosenDirection, + "spawnRate" : chosenSpeed, + "spawnFrequency" : chosenTraffic, + "yCoordinate" : 0}) + + // Add some car sprites randomly to make the road appear pre-populated + let numCars = parseInt(chosenTraffic / 10) + let carSprite + let possibleTiles = shuffleArray(Array.from(Array(width()).keys())) + while (numCars != 0) { + carSprite = (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites) + addSprite(possibleTiles.pop(), 0, carSprite) + numCars -= 1 + } + } -addText("Score: "+score, { - x: 3, - y: 15, - color: color`0` -}); +function shuffleArray(array) { + for (let i = array.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [array[i], array[j]] = [array[j], array[i]]; + } + return array +} -function checkWin() { - let finishLines = getAll(finishLine); - let p = getFirst(player); - for (let i = 0; i < finishLines.length; i++) { - if(finishLines[i].y == p.y) { - return true; +function generateNewRow() { + const rowType = getNewRowType() + if (rowType == "road") { + counterDict["road"]++ + buildRow((x) => x % 2 == 0 ? roadOne : roadTwo) + // Reset all counters except road + resetCounters("road") + generateRoad() + + } else if (rowType == "grass") { + counterDict["grass"]++ + buildRow((x) => chooseRandomElement(grassSprites)) + // Reset all counters except grass + resetCounters("grass") + // if it comes right after a road, add objects + if (counterDict["grass"] == 1) { + addObject(solidObjects) + } + } else if (rowType == "asphalt") { + counterDict["asphalt"]++ + buildRow((x) => chooseRandomElement(asphaltSprites)) + // Reset all counters except asphalt + resetCounters("asphalt") + if (counterDict["asphalt"] == 1) { + addObject(solidObjects) } } - return false; +} +// this function returns the correct player sprite depending on the direction of the player and movement cooldown +function getPlayer() { + if (playerDirection == "left" && cooldown) { + return playerLeftFlap + } + else if (playerDirection == "right" && cooldown) { + return playerRightFlap + } + else if (playerDirection == "left") { + return playerLeft + } + else if (playerDirection == "right") { + return playerRight + } } -function runGame() { - gameRunning = true; +// replaces the sprite of the player given their old one with a new one +function replacePlayer(oldSprite, newSprite) { + + const oldPlayer = getFirst(oldSprite) + let x = oldPlayer.x + let y = oldPlayer.y + oldPlayer.remove() + addSprite(x, y, newSprite) - let gameLoop = setInterval(() => { - ++score; - addText("Score: "+score, { - x: 3, - y: 15, - color: color`0` - }); - ++time; +} + + +// updates the sprite whenever the player moves with the correct direction and animation +function updateSprite(direction) { + let oldSprite = getPlayer() + cooldown = true + playerDirection = direction + let newSprite = getPlayer() + replacePlayer(oldSprite, newSprite) +} + +function onSideMove(direction) { + updateSprite(direction) + getFirst(getPlayer()).x += (direction == "right") ? 1 : -1 +} + +onInput("w", () => { + if (gameStart == true && cooldown == false) { + onUpMove() + } else if (gameStart == true && cooldown == true) { + // premove + premoveUp = true - despawnVehicles(); - moveVehicles(); - spawnVehicle(); - spawnVehicle(); - }, 1000); - - let checksLoop = setInterval(() => { - if (checkHit()) { - gameRunning = false; - clearInterval(gameLoop); - clearInterval(checksLoop); - addText("Game Over!", { - x: 5, - y: 6, - color: color`3` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`3` - }); + } - despawnAllVehicles(); +}) + + +onInput("a", () => { + if (gameStart == true && cooldown == false) { + onSideMove("left") + } else if (gameStart == true && cooldown == true) { + // premove + premoveLeft = true + } +}) + +onInput("d", () => { + if (gameStart == true && cooldown == false) { + onSideMove("right") + } else if (gameStart == true && cooldown == true) { + // premove + premoveRight = true + } +}) + + +onInput("i", () => { + if (gameStart == false && canStart == true) { + clearText() + hideGUI() + currentScore = 0 + bringUpScore() + gameStart = true + } +} +) + + +onInput("j", () => { + if (gameStart == false) { + clearText() + mainLoop() + canStart = true + } +} +) + + + +function spawnVehicle(road) { + let x = (road["direction"] == "left") ? 0 : width() - 1 + // this is a probability check; we generate a number between 1-100 + // and check if its below or equal to the spawn chance (somewhere between 15-30) + let chance = getRandomInt(1, 100) + if (chance <= road["spawnFrequency"]) { + addSprite(x, road["yCoordinate"], (road["direction"] == "left") ? chooseRandomElement(rightCarSprites) : chooseRandomElement(leftCarSprites)) } +} + +function getVehiclesOnRoad(road) { + let y = road["yCoordinate"] + let vehicles = [] - if(checkWin()) { - gameRunning = false; - clearInterval(checksLoop); - addText("Won Game! ", { - x: 5, - y: 6, - color: color`4` - }); - - addText("Score: "+score, { - x: 5, - y: 8, - color: color`4` - }); - - despawnAllVehicles(); + for (let x = 0; x < width(); x++) { + getTile(x, y).forEach((sprite) => { + if (carSprites.includes(sprite.type)) { + vehicles.push(sprite) + } + }) + } + return vehicles +} + +function moveVehicles(road) { + let vehicles = getVehiclesOnRoad(road) + + + vehicles.forEach((vehicle) => { + if (road["direction"] == "left") { + if (vehicle.x < width() - 1) { + vehicle.x += 1 + } else { + vehicle.remove() } + } - if(checkHit() || checkWin()) { - clearInterval(gameLoop); - clearInterval(checksLoop); + if (road["direction"] == "right") { + if (vehicle.x > 0) { + vehicle.x -= 1 + } else { + vehicle.remove() + } } - }, 1); + }) } -runGame(); +function delayDelete(sprite, time) { + setTimeout(() => { + sprite.remove()}, time) +} + +function onDeath(player, collidedVehicle) { + player.type = death + collidedVehicle.type = bam + clearText() + addText("BACK:j", + {x:7, + y:15, + color:color`0`}) + addSprite(2, 2, death) + addSprite(width() - 3, 2, death) + + if (currentScore > highScore) {highScore = currentScore} + + addText("-MORTIS-", + {x:6, + y:4, + color:"2"}) + addText("NOW:" + String(currentScore), + {x:7, + y:5, + color:color`6`}) + addText("BEST:" + String(highScore), + {x:7, + y:6, + color:color`6`}) + + activeRoads = [] + cooldown = false + playerDirection = "left" + canStart = false + +} + + + +// BUILT IN FUNCTION THAT RUNS EVERY X MILLISECONDS +// I use it here to increment TickCounter variables in order to implement cooldowns and enemy movements +setInterval(() => { + + + if (!gameStart) { + bringUpGUI() + } + + if (gameStart) { + let isDead = false + let player = getFirst(getPlayer()) + let collidedVehicle + // checks if there are any tiles where the player and a vehicle has collided - ie death has occurred + // -> for all vehicle sprites + carSprites.forEach( (carType) => { + let sprites = tilesWith(player.type, carType) + + if (sprites.length > 0) { + // if there is a tile with a player + vehicle + isDead = true + gameStart = false + sprites[0].forEach ( (sprite) => { + if (sprite.type == carType) { + collidedVehicle = sprite + } + }) + } + }) + if (isDead) { + onDeath(player, collidedVehicle) + return + + } + // Current score Display + addText( + String(currentScore), + {x:9, + y: 15, + color:color`2`}) + + + + // set gameTickCounter to += TICKMS if it's less than 1500ms - otherwise reset it back to 0 + // This is so that it won't become infinitely large + if (gameTickCounter < 1400) { + gameTickCounter += TICKMS + } else { + gameTickCounter = 0 + } + + + + // remember - setInterval is called every X milliseconds (ms) + // here I specified it to run every 10 miliseconds + let counter = 0 + + activeRoads.forEach((road) => { + + + + if (gameTickCounter % road["spawnRate"] == 0) { + counter += 1 + moveVehicles(road) + spawnVehicle(road) + + } + }) + + + if (cooldown) { + // count up the cooldownTickCounter if a cooldown is activated + cooldownTickCounter += 50 + } + // then when the cooldownTickCounter >= MOVECOOLDOWN, set the cooldown to false and change animation back + if (cooldownTickCounter >= MOVECOOLDOWN) { + let oldSprite = getPlayer() + cooldown = false + let newSprite = getPlayer() + replacePlayer(oldSprite, newSprite) + cooldownTickCounter = 0 + + // also perform any premoves + if (premoveUp) { + premoveUp = false + onUpMove() + } + if (premoveLeft) { + premoveLeft = false + onSideMove("left") + } + if (premoveRight) { + premoveRight= false + onSideMove("right") + } + } + } + }, TICKMS) + // Notice how the TICKMS here is another parameter - I defined this constant earlier, + // The setInterval function runs every TICKMS milliseconds + + // Call the mainLoop() function to begin the game when you run the program +mainLoop() diff --git a/games/img/Crossy_Sprig.png b/games/img/Crossy_Sprig.png index ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c..67a6baa7299b0ea152edc5e0bf6976736ddb6558 100644 GIT binary patch literal 4756 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 literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; From d129435108281cbed3d7ed5841594e9c2c6059ae Mon Sep 17 00:00:00 2001 From: Graham Darcey Date: Wed, 19 Jun 2024 15:50:46 -0400 Subject: [PATCH 6/7] Trying to un-screw-up things --- Screenshot 2024-05-21 125209.png | Bin 817 -> 0 bytes games/img/Crossy_Sprig.png | Bin 4756 -> 817 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Screenshot 2024-05-21 125209.png diff --git a/Screenshot 2024-05-21 125209.png b/Screenshot 2024-05-21 125209.png deleted file mode 100644 index ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; diff --git a/games/img/Crossy_Sprig.png b/games/img/Crossy_Sprig.png index 67a6baa7299b0ea152edc5e0bf6976736ddb6558..ee4c8279499ad6b6c79d245f6d6de32a7ac55c4c 100644 GIT binary patch literal 817 zcmeAS@N?(olHy`uVBq!ia0vp^QjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0XB4ude`@%$Aj3=B-iJY5_^D&pSW-Jc~ADAMpTc4~{rK@rCs zo#0zPSj3vlxWtl{HVLF?OV_e-<|%V1F*>eY!;&lVg_A}4bVKi40Rxsxo-P(*iTcHJ zX5PJdX8Zm1Cts?aJl?vq`1|>S%Ip#gflHk~G!-5`@iFv%H(2d(x-=T&dtUH>r3=Wf*BUwX^ZHtl}Pt}cH(#O&W+gJo4Q zJHf^PRrYYF#TYzp@-3Y|`)%_2`+G!#zpsngCldVq-QB&y!8h0V&Bag)cLhTGRjc!7 z&t*?9yPll&EMbpOaIN{i_@0$(UfF#Amtnl@**u%ueVLP<@0?|Ybyyg&DEUTE~nRk@RpLk?uY2Ib#(?A|9Ef4=iPZPWkT zx6Ril&w654?ucwF*dg*sGR(PrpI7sJibV?0XWr4)7oO!=Jihy>$q302lHzYp*qQ&{ zGAsW5{-Yt&-ZtNkx)s}>dFfz<>atD2{dGq|;;)weU%9Jpc6NGA=4&*);FzENN_dse zHx}(`p((bltAf5x$(VNiuXeT5)9^K`%-~_W`s=QzmG^zWUtROA&3GLsdXZh;b~<|T k|9j6@#Un**x2eP*###O|+4_#Z2W1KdPgg&ebxsLQ0NL<+NB{r; literal 4756 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 From 02318686bab1a7453020c58b070882b1a6fbb3af Mon Sep 17 00:00:00 2001 From: graham Date: Wed, 19 Jun 2024 15:51:16 -0400 Subject: [PATCH 7/7] Update crossy_sprig.js --- games/crossy_sprig.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/games/crossy_sprig.js b/games/crossy_sprig.js index ab3aa5d7ad..52908a44d2 100644 --- a/games/crossy_sprig.js +++ b/games/crossy_sprig.js @@ -3,7 +3,7 @@ @author: hatanuk @tags: ['endless'] @img: "" -@addedOn: 2024-03-21 +@addedOn: 2024-06-19 CONTROLS: w - Up