xxxxxxxxxx
629
//most of the level data some levels are probably in the mainloop idk if I moved them later
const levels = {
level2: {
blocks: [[50, 600], [0, 600], [100, 600], [250, 450], [300, 450], [500, 580], [350, 450], [550, 580], [650, 580], [700, 580], [750, 580], [850, 580], [900, 580], [950, 580], [1050, 550], [1100, 550], [1150, 550], [1200, 550], [450, 300], [500, 300], [600, 250], [650, 250], [600, 300], [650, 300], [800, 300], [800, 250], [850, 250], [900, 250], [1000, 250], [1050, 250], [1100, 250], [1150, 120], [1150, 120], [1200,120], [100, 350], [50, 350], [50, 200], [100, 50], [150, 50], [200, 50], [400, 450]],
spikes: [[600, 580], [800, 580], [1000, 565], [550, 300], [700, 300], [750, 300], [950, 250], [1200, 250], [1150, 250]],
startpos: [50, 500],
blockstartpos: [-100, 100],
blockMovLimits: [-100, -50],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[1150, 400], [1200, 70]],
goalpos: [200, 0],
texts: [],
zaps:[]
},
level3: {
blocks: [[600, 600], [550, 600], [650, 600], [350, 600], [500, 600], [700, 600], [890, 550], [940, 550], [1090, 550], [1140, 550], [1140, 400], [1100, 250],[1150, 250], [1200, 250], [1000, 250], [950, 250], [900, 250], [750, 200], [800, 200], [750, 50], [800, 50], [700, 50], [650, 50], [100, 600], [300, 600], [50, 450], [50, 600], [150, 300], [300, 300], [0, 170], [50, 170], [350, 300], [450, 200]],
spikes: [[450, 600], [400, 600], [990, 600], [1040, 600], [1050, 250], [850, 250], [600, 200], [600, 50], [200, 300], [200, 30], [400, 300]],
startpos: [600, 400],
blockstartpos: [-100, 100],
blockMovLimits: [-100, -50],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[700, 0], [25, 10], [450, 10]],
goalpos: [670, 320],
texts: [],
zaps: []
},
level4: {
blocks: [[100, 550], [50, 550], [0, 550], [150, 550, true], [200, 550, true], [250, 550, true], [300, 550, true], [400, 550, true], [450, 550, true], [500, 550], [550, 550], [0, 400, true], [100, 300], [700, 550], [250, 300], [300, 300], [450, 200], [550, 200], [550, 50], [600, 50], [650, 50], [750, 550], [850, 550], [900, 550], [950, 550], [1100, 500], [1150, 500], [1200, 500], [1100, 550], [1150, 550], [1200, 550], [1100, 350], [1150, 350], [1200, 350], [950, 250]],
spikes: [[350, 550], [600, 550], [650, 550], [500, 200], [800, 550], [1000, 550], [1050, 550]],
startpos: [100, 400],
blockstartpos: [-100, 100],
blockMovLimits: [-100, -50],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[0, 150], [700, 50], [1150, 100]],
goalpos: [700, 250],
texts: [["invisible blocks appear for a split second and then disappear", 50, 400, "black"]],
zaps: []
},
level5: {
blocks: [[0, 120], [50, 120], [100, 120], [150, 120], [200, 120], [250, 120], [1100, 550], [1150, 550], [1050, 550], [1000, 550], [850, 550], [800, 550], [1200, 550], [750, 550], [1200, 400, "e"], [700, 550], [1100, 300], [920, 250], [870, 250], [1030, 100], [300, 120], [350, 120], [1080, 100], [1130, 100], [650, 550], [600, 550], [550, 550], [400, 550], [350, 550], [300, 550], [1150, 400, "e"], [200, 590, "e"], [200, 400], [150, 590, "e"], [100, 590, 'e'], [50, 590, 'e'], [0, 590], [150, 400], [100, 400], [50, 400, true], [0, 400, false], [820, 250]],
spikes: [[400, 120], [450, 120], [950, 550], [900, 550], [100, 260], [500, 550], [450, 550], [770, 250], [720, 250], [670, 250]],
startpos: [100, 0],
blockstartpos: [-100, 100],
blockMovLimits: [-100, -50],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[0, 0], [1200, 40], [0, 540]],
goalpos: [1200, 500],
texts: [["these blocks are the teleporters", 380, 20, "black"], ["if you touch them they will zap you to the other teleporter", 380, 80, "black"], ["don't touch this one!", 650, 470, 'black'], ["^^^^^^^", 1160, 470, 'black'], [">:)", 140, 500, "black"]],
zaps: [[250, 0, 1100, 350], [700, 500, 100, 170]]
}
}
//variables
let startx;
let starty;
let player_x;
let player_y;
var jumping = false;
var bottom = 449;
let coords = [];
let nonTouchedBlocks = 0;
let standing;
var blockX = null;
var blockMovx;
var blockMovy;
let blockVel = 1;
let blockVel2 = -1;
let blockMovx2;
let blockMovy2;
let onMovingBlock = false;
let timer = 1;
let blockMov;
let collectableAmount;
let canFinish;
var collectables;
let coord_x;
let coord_y;
let colX;
let coly;
let toRemove;
let unlock;
let stage = 0;
let level;
let inLevel = true;
let lives = 5;
let deathScreen;
let lifetimer = 1;
let goalimg;
let tp2img;
let tp1img;
let keyimg;
let lockedgoal;
let sprite
//loading files
function preload() {
keyimg = loadImage("sprites/key 3.jpg")
tp1img = loadImage('sprites/teleporter sprite 1.jpg')
tp2img = loadImage("sprites/teleporter sprite 2.jpg")
goalimg = loadImage("sprites/goal.jpg")
lockedgoal = loadImage("sprites/goallocked.png")
sprite = loadImage("sprites/player.png")
}
//setup stuff
function setup() {
createCanvas(1250, 650);
colorMode(RGB, 255)
textSize(25)
}
//main update function
function draw() {
// first few levels
const startingscreen = {
blocks: [],
spikes: [],
startpos: [0, 200],
blockstartpos: [-100, 100],
blockMovLimits: [300, 720],
block2startpos: [1000, 300],
blockMov2Limits: [300, 1000],
collectables: [],
goalpos: [100, 200],
texts: [],
zaps: []
}
const introlevel1 = {
blocks: [[0, 550], [50, 550], [100, 550], [150, 550], [200, 550], [250, 550], [300, 550], [350, 550], [400, 550], [450, 550], [400, 400], [500, 550], [550, 550], [600, 550], [650, 550], [700, 550], [750, 550], [800, 550], [850, 550], [900, 550], [950, 550], [1000, 550]],
spikes: [],
startpos: [50, 300],
blockstartpos: [-100, 100],
blockMovLimits: [300, 720],
block2startpos: [1000, 300],
blockMov2Limits: [300, 1000],
collectables: [],
goalpos: [1000, 500],
texts: [["Welcome", 70, 300, "black"], ["Use A, D and spacebar to move around", 70, 350, "black"], ["to pass the level get to this goal", 900, 470, "black"]],
zaps:[]
}
const introlevel2 = {
blocks: [[50, 550], [100, 550], [300, 550], [350, 550], [550, 550], [600, 550], [750, 550], [900, 450], [900, 300], [700, 280], [650, 280], [600, 280], [550, 280], [500, 280], [450, 280], [400, 280], [350, 280], [300, 280], [700, 550], [250, 280], [200, 280]],
spikes: [[650, 550], [150, 280], [100, 230], [50, 170]],
startpos: [50, 300],
blockstartpos: [-100, 100],
blockMovLimits: [300, 720],
block2startpos: [1000, 300],
blockMov2Limits: [300, 1000],
collectables: [[550, 200], [450, 200], [350, 200]],
goalpos: [250, 150],
texts: [["watch out for gaps....", 100, 420, "black"], ["and spikes", 640, 420, "black"], ["you need to collect all the keys to pass the level", 480, 170, "black"]],
zaps:[]
}
//this level was the first level made and I probably won't use it because it kinda sucks but I might take the data and modify it
const leveltest = {
blocks: [[50, 400], [200, 400], [400, 300], [0, 400], [500, 450], [550, 450], [600, 450], [650, 450], [950, 450], [1100, 300], [1150, 300], [950, 200], [blockMovx, blockMovy], [250, 100], [blockMovx2, blockMovy2]],
spikes: [[150, 400], [100, 400], [250, 450], [300, 450], [350, 450], [450, 250], [600, 250], [400, 450]],
startpos: [0, 200],
blockstartpos: [-100, 100],
blockMovLimits: [300, 720],
block2startpos: [1000, 300],
blockMov2Limits: [300, 1000],
collectables: [[50, 350], [500, 400], [100, 100]],
goalpos: [100, 200],
texts: [["hello world", 200, 200, "black"]],
zaps:[]
}
//first proper level
const level1 = {
blocks: [[1000, 600], [1050, 600], [950, 600], [900, 600], [750, 600], [700, 600], [530, 470], [700, 340], [750, 340], [900, 340], [220, 580], [170, 580], [470, 260], [270, 260], [420, 260], [850, 600], [320, 260], [220, 260], [580, 470], [120, 580], [70, 580], [20, 580], [650, 340]],
spikes: [[800, 600], [1100, 600], [1150, 600], [1200, 600], [320, 580], [370, 260], [170, 260], [270, 580]],
startpos: [1000, 450],
blockstartpos: [-100, 100],
blockMovLimits: [300, 720],
block2startpos: [1000, 300],
blockMov2Limits: [300, 1000],
collectables: [[900, 290], [470, 80]],
goalpos: [170, 480],
texts: [],
zaps:[]
}
const level6 = {
blocks: [[600, 580], [550, 580], [650, 580], [blockMovx, blockMovy], [1000, 550], [300, 300], [1150, 550], [1200, 550], [250, 300], [70, 250], [650, 120], [700, 120], [1000, 220], [950, 220], [1200, 220]],
spikes: [[700, 530], [500, 530], [1050, 280], [1100, 280], [1050, 550], [1100, 550], [200, 300], [1150, 280], [120, 300]],
startpos: [600, 450],
blockstartpos: [-100, 450],
blockMovLimits: [50, 900],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[1200, 500], [580, 150], [1200, 170]],
goalpos: [20, 570],
texts: [["press SPACE to dismount moving block", 10, 430, "black"]],
zaps: [[70, 40, 650, 0]]
}
const level7 = {
blocks: [[0, 200], [50, 200], [200, 200, 'r'], [250, 200, ''], [300, 200, ''], [500, 300, ''], [650, 200, ''], [850, 150, false], [900, 250, {}], [1100, 250, true], [50, 550], [100, 550], [1200, 400, []], [250, 550], [300, 550], [blockMovx, blockMovy], [1120, 580]],
spikes: [[100, 200], [150, 200], [350, 300], [450, 300], [600, 300], [650, 300], [700, 300], [750, 300], [850, 300], [950, 300], [1000, 300], [1050, 300], [150, 550], [200, 550], [1120, 370], [350, 500]],
startpos: [0, 0],
blockstartpos: [600, 585],
blockMovLimits: [550, 950],
block2startpos: [-100, 0],
blockMov2Limits: [-100, -50],
collectables: [[500, 250], [1200, 350], [1120, 530]],
goalpos: [400, 599],
texts: [],
zaps: [[1200, 200, 50, 300], [300, 300, 800, 350]]
}
switch (stage){
case 0:
level = startingscreen;
inLevel = false;
break;
case 1:
level = introlevel1;
break;
case 2:
level = introlevel2;
break;
case 3:
level = level1;
break;
case 4:
level = levels.level2;
break;
case 5:
level = levels.level3;
break
case 6:
level = levels.level4;
break
case 7:
level = levels.level5;
break
case 8:
level = level6;
break
case 9:
level = level7;
break
default:
level = startingscreen;
inLevel = false
}
//on start
if (timer == 1){
startx = level.startpos[0];
starty = level.startpos[1];
blockMovx = level.blockstartpos[0];
blockMovy = level.blockstartpos[1];
blockMovx2 = level.block2startpos[0];
blockMovy2 = level.block2startpos[1];
player_x = startx;
player_y = starty;
collectableAmount = level.collectables.length;
collectables = level.collectables;
lives = 5;
}
//unpacking a lot of the level data
const coords = level.blocks;
const spikes = level.spikes;
const blockLimitOne = level.blockMovLimits[0];
const blockLimitTwo = level.blockMovLimits[1];
const blockLimitThree = level.blockMov2Limits[0];
const blockLimitFour = level.blockMov2Limits[1];
const finishpos = level.goalpos;
const texts = level.texts;
const invisibleBlocks = level.invisible
const teleporters = level.zaps
//checks if all the keys have been collected yet
if (collectables.length === 0){
unlock = true;
}
else{
unlock = false;
}
background(28, 131, 14);
fill(219, 0, 239)
if (inLevel == true){
image(sprite, player_x, player_y, 50, 50)
if (unlock === true){
image(goalimg, finishpos[0], finishpos[1], 50, 50);
}
else{
image(lockedgoal, finishpos[0], finishpos[1], 50, 50)
}
}
if ((player_y <= bottom) && (jumping == false) && (inLevel === true)){
player_y += 5
}
if (jumping == true){
player_y -= 5
}
if ((jumping == true) && (player_y < bottom - 150)){
jumping = false
}
if ((keyIsDown(65)) && (inLevel == true) && (player_x > 0)){
player_x -= 4
}
if (keyIsDown(68) && (inLevel == true) && (player_x < 1200)){
player_x += 4
}
coords.forEach (coord => {
coord_x = coord[0]
coord_y = coord[1]
if ((coord[2] != undefined)){
if (lifetimer < 300){
fill(19, 227, 250)
stroke(0, 0, 0)
square(coord_x, coord_y, 50)
}
}
else{
fill(95, 46, 0)
square(coord_x, coord_y, 50)
}
if (checkCollision(coord_x, coord_y)){
bottom = coord_y - 51
blockX = coord_x
}
else {
nonTouchedBlocks += 1
}
if ((blockX == blockMovx) && (blockMovy == bottom + 51)){
onMovingBlock = true
player_x = blockMovx
}
else if ((blockX == blockMovx2) && (blockMovy2 == bottom + 51)){
onMovingBlock = true
player_x = blockMovx2
}
else{
onMovingBlock = false
}
})
if (nonTouchedBlocks == coords.length){
standing = false
}
else {
standing = true
}
if ((standing == true) && (onMovingBlock == true)){
if (keyIsDown(83)){
cl('you are standing on a moving block')
}
}
else if ((standing == true) && (onMovingBlock == false)){
if (keyIsDown(83)){
cl('you are standing on a stationary block')
}
}
else if (jumping == false){
if (keyIsDown(83)){
cl('you are not standing on any block')
}
bottom = 599
}
nonTouchedBlocks = 0
if (keyIsDown(83)){
console.log(`player pos, x:${player_x}, y:${player_y}`)
cl(`block pos: x: ${blockX}, y: ${bottom + 51}, floor: ${bottom}`)
cl(`moving block y: ${blockMovy}, moving block x: ${blockMovx}`)
}
spikes.forEach(spike =>{
spikex = spike[0]
spikey = spike[1]
spikeBlock(spikex, spikey)
if (touchingSpike(spikex, spikey)){
onDeath()
}
})
timer += 1
if (inLevel == true){
lifetimer++;
}
blockMovx += blockVel
blockMovx2 += blockVel2
if (blockMovx >= blockLimitTwo){
blockVel = -1
}
else if (blockMovx <= blockLimitOne){
blockVel = 1
}
if (blockMovx2 >= blockLimitFour){
blockVel2 = -1
}
else if (blockMovx2 <= blockLimitThree){
blockVel2 = 1
}
collectableArrayCur = 0;
toRemove = null
collectables.forEach(collect => {
colX = collect[0]
colY = collect[1]
fill(113, 37, 255)
square(colX, colY, 50)
noStroke()
image(keyimg, colX, colY, 50, 50)
if (touchingKey(colX, colY, 50)){
toRemove = collectableArrayCur;
}
collectableArrayCur++;
})
if (toRemove != null){
collectables.splice(toRemove, 1)
toRemove = null
}
if ((touchingKey(finishpos[0], finishpos[1], 50)) && (unlock === true)){
onClear()
}
getHealth()
texts.forEach(t =>{
fill(t[3])
text(t[0], t[1], t[2])
})
if (player_y === 600){
onDeath()
}
if (stage == 0){
showTitleScreen()
}
if (deathScreen == true){
showDeathScreen()
}
if (stage == 10){
endScreen()
}
teleporters.forEach(tel =>{
fill(255, 242, 4)
image(tp1img, tel[0], tel[1], 50, 50)
image(tp2img, tel[2], tel[3], 50, 50)
if (touchingKey(tel[0], tel[1], 50)){
jumping = false
player_x = tel[2];
player_y = tel[3] + 60;
cl('zip')
}
else if (touchingKey(tel[2], tel[3], 50)){
jumping = false
player_x = tel[0];
player_y = tel[1] + 60;
cl('zap')
}
})
if (player_y >= 601){
player_y = 590
}
if (player_y <= -15){
jumping = false
player_y = 0
cl('no')
}
}
function keyPressed(){
if ((player_y - 1 == bottom) && (keyCode == 87) && (inLevel === true)){
jumping = true
}
}
function checkCollision(block_x, block_y){
if ((player_y == block_y - 50) && (player_x > block_x - 50) && (player_x < block_x + 50) && (jumping == false)){
return true
}
else {
return false
}
}
function cl(string){
console.log(string)
}
function spikeBlock(x, y){
fill(30)
stroke(0, 0, 0)
square(x, y, 50)
x3 = x + 25
y3 = y - 30
x1 = x3 - 25
x2 = x3 + 25
y2 = y3 + 30
y1 = y2
fill(40, 40, 40)
triangle(x3,y3,x1,y1,x2,y2)
noStroke()
}
function touchingSpike(x, y){
if ((player_y + 50 > y-25) && (player_y < y + 50) && (player_x + 50 > x) && (player_x < x + 50)){
return true
}
else{
return false
}
}
function touchingKey(block_x, block_y, size){
if ((player_y + size > block_y) && (player_y < block_y + size) && (player_x + size > block_x) && (player_x < block_x + size)){
return true
}
else{
return false
}
}
function onClear(){
jumping = false
cl("level cleared")
stage++;
timer = 1
lifetimer = 1;
}
function getHealth(){
stroke(0, 0, 0)
for (let x = lives; x > 0; x--){
fill(180, 10, 10)
switch(x){
case 1:
heartPos = 1210
break;
case 2:
heartPos = 1170;
break;
case 3:
heartPos = 1130;
break;
case 4:
heartPos = 1090
break
case 5:
heartPos = 1050
fill(250, 196, 22)
}
square(heartPos, 10, 30)
}
}
function showTitleScreen(){
spikeBlock(200, 200)
textSize(50)
text("This is where the title screen will go", 300, 300)
textSize(25)
}
function mousePressed(){
if (stage == 0){
stage++
inLevel = true
timer = 0;
startingScreen = false;
lifetimer = 0
}
else if (deathScreen == true){
deathScreen = false;
inLevel = true
}
}
function onDeath(){
player_x = startx
player_y = starty
collectables = annoyingswitchthatshouldntexistbutitdoesbecausejavascriptiscringe()
lives--;
jumping = false;
inLevel = false
deathScreen = true;
lifetimer = 0;
cl('died')
}
function showDeathScreen(){
textSize(100)
text("you died", 430, 300)
textSize(25)
}
function annoyingswitchthatshouldntexistbutitdoesbecausejavascriptiscringe(){
switch (stage){
case 4:
return [[1150, 400], [1200, 70]]
break
case 5:
return [[700, 0], [25, 10], [450, 10]]
break
case 6:
return [[0, 150], [700, 50], [1150, 100]]
break
case 7:
return [[0, 0], [1200, 0], [0, 540]]
break
case 8:
return [[1200, 500], [580, 150], [1200, 170]]
break
case 9:
return [[500, 250], [1200, 350], [1120, 530]]
break
default:
return level.collectables
break
}
}
function endScreen(){
textSize(50)
fill(0, 0, 0)
text("this is where the ending screen will go", 300, 300)
textSize(25)
}