xxxxxxxxxx
863
let room = "start";
let stage = 0
let currentWeapon = "axe"
let health = 1000
let healthBox;
let tries = 0;
let timer = 500;
let swinging = 10;
let swingingBool = false;
let blasting = 10
let blastingBool = false
let arsenal = ["axe", "staff", "crossbow"]
let arsenalPos = 0
let inProgress = true;
let shield = "Vulnerable"
let facing = "right"
let weapon;
let lifespan = 40;
let guy;
let heart;
let speed = 5;
let gravity = 4;
let jump = 4;
let skeleVel = 2;
let enemyPic;
let enemyArray = [];
let portal;
let beam;
let beams;
let arrow;
let arrows;
let fireball;
let fireballs;
let ground;
let blok;
let platform1;
let platform2;
let goingUp = false;
let jumpTime = 15;
let onFloor = false;
let player_sprite_sheet;
let enemy_sprite_sheet;
let idleAnimation;
let enemyIdleAnimation;
let attack;
let axeSound;
let staffSound;
let crossSound;
let shieldSound;
let music;
let jumpSound;
let hurt;
let tele;
function preload() {
myFont = loadFont('Gamerock.otf');
myFont2 = loadFont("IMMORTAL.ttf");
axeSound = loadSound("sounds/axeswoosh.wav")
crossSound = loadSound("sounds/crossswoosh.wav")
staffSound = loadSound("sounds/staffBloo.wav")
shieldSound = loadSound("sounds/shieldWob2.wav")
music = loadSound("sounds/music.mp3")
jumpSound = loadSound("sounds/jump.wav")
hurt = loadSound("sounds/hurt.ogg")
tele = loadSound("sounds/tp.wav")
}
function setup() {
createCanvas(600, 600);
let oldTries = localStorage.getItem("tries")
if (oldTries) {
tries = parseFloat(oldTries);
}
shieldSound.playMode("untilDone")
music.loop()
jumpSound.rate(2)
hurt.playMode("untilDone")
hurt.rate(2)
tele.rate(1.5)
enemies = new Group()
bgPic = loadImage("background.png")
beams = new Group()
arrows = new Group()
fireballs = new Group()
portal = createSprite(550, 610, 50, 50)
portal.addAnimation("portalAnim", "portal/sprite_0.png", "portal/sprite_1.png", "portal/sprite_2.png", "portal/sprite_3.png")
guy = createSprite(300, 300, 50, 50)
guy.addAnimation("stand", "cat/sprite_0.png", "cat/sprite_1.png", "cat/sprite_2.png", "cat/sprite_3.png", "cat/sprite_4.png", "cat/sprite_5.png", "cat/sprite_6.png", "cat/sprite_7.png")
guy.addAnimation("shield", "catShield/sprite_0.png", "catShield/sprite_1.png", "catShield/sprite_2.png", "catShield/sprite_3.png", "catShield/sprite_4.png", "catShield/sprite_5.png", "catShield/sprite_6.png", "catShield/sprite_7.png")
heart = createSprite(40, 50, 50, 50)
heart.addAnimation("pulse", "heart/sprite_0.png", "heart/sprite_1.png", "heart/sprite_2.png", "heart/sprite_3.png")
weapon = createSprite(guy.position.x + 20, guy.position.y)
weapon.addAnimation("axe", "axe/sprite_0.png")
weapon.addAnimation("axeSwing", "axe/sprite_2.png", "axe/sprite_3.png")
weapon.addAnimation("staff", "staff/sprite_0.png")
weapon.addAnimation("staffBoom", "staff/sprite_1.png")
weapon.addAnimation("crossbow", "crossbow/sprite_0.png")
weapon.addAnimation("crossbowShwoo", "crossbow/sprite_1.png")
ground = createSprite(300, 600, 600, 300)
blok = createSprite(300, 10, 100, 100)
blok.shapeColor = color(0, 0, 112)
platform1 = createSprite(100, 300, 100, 40)
platform1.shapeColor = color(89, 0, 0)
platform2 = createSprite(100, 300, 300, 60)
platform2.shapeColor = color(0, 0, 112)
ground.shapeColor = color(0, 0, 112);
}
function draw() {
textSize(36)
fill(255, 255, 255)
stroke(0, 0, 0)
background(bgPic)
if (room === "gameover") {
textAlign(CENTER)
textFont(myFont)
fill(255, 255, 255)
strokeWeight(4)
stroke(0, 0, 0)
textSize(36)
text("G A M E", 300, 200)
text("O V E R", 300, 300)
textFont(myFont2)
text("Fails: " + tries, 300, 400)
localStorage.setItem("tries", tries)
text("Enter to try again", 300, 440)
} else if (room === "start") {
textAlign(CENTER)
textFont(myFont)
textSize(36)
fill(255, 255, 255)
stroke(0, 0, 0)
strokeWeight(4)
text("Welcome to The Dark Forest", 300, 100)
text("Press ENTER to begin", 300, 200)
} else {
if (room === 1) {
textAlign(CENTER)
textFont(myFont2)
fill(255, 255, 255)
strokeWeight(2)
stroke(0, 0, 0)
textSize(20)
text("You awake in a strange place...", 300, 220)
} else if (room === 2) {
textAlign(CENTER)
textFont(myFont2)
fill(255, 255, 255)
strokeWeight(2)
stroke(0, 0, 0)
textSize(20)
text("You are equipt with different weapons \nsuited to kill different monsters.", 300, 190)
text("O: Attack", 120, 260)
text("P: Cycle", 300, 260)
text("SHIFT: Shield", 470, 260)
text("Q: Axe", 120, 310)
text("E: Staff", 300, 310)
text("F: Crossbow", 470, 310)
}
//-------------------------------------------------------------HERE IS THE LEVEL CREATOR-------------------------------------------------------------------------\\
else if (room === 3) {
if (stage === 1) { //stage 1
if (timer % 100 === 0 && inProgress) {
spawnEnemy("skeleton")
}
if (timer > 0) {
timer--
} else if (timer <= 0) {
inProgress = false;
if (enemies.length === 0) {
portal.position.x = 550
portal.position.y = 400
}
}
} else if (stage === 3) { //stage 3
if (timer === 1000 && inProgress) {
spawnEnemy("dragon")
} else if (timer === 990) {
spawnEnemy("skeleton")
spawnEnemy("ghost")
} else if (timer === 960) {
spawnEnemy("skeleton")
spawnEnemy("skeleton")
spawnEnemy("skeleton")
spawnEnemy("dragon")
} else if (timer === 850) {
spawnEnemy("dragon")
} else if (timer === 730) {
spawnEnemy("ghost")
}
if (timer > 0) {
timer--
} else if (timer <= 0) {
inProgress = false;
if (enemies.length === 0) {
portal.position.x = 550
portal.position.y = 400
}
}
} else if (stage === 2) { //stage 2
if (timer % 100 === 0 && inProgress) {
spawnEnemy("dragon")
}
if (timer > 0) {
timer--
} else if (timer <= 0) {
inProgress = false;
if (enemies.length === 0) {
portal.position.x = 550
portal.position.y = 400
}
}
} else if (stage === 4) { //stage 4
if (timer % 150 === 0 && inProgress) {
spawnEnemy("ghost")
spawnEnemy("ghost")
spawnEnemy("skeleton")
} else if (timer === 1) {
spawnEnemy("ghost")
spawnEnemy("ghost")
spawnEnemy("ghost")
spawnEnemy("ghost")
spawnEnemy("ghost")
}
if (timer > 0) {
timer--
} else if (timer <= 0) {
inProgress = false;
if (enemies.length === 0) {
portal.position.x = 550
portal.position.y = 400
}
}
} else if (stage === 5) {
if (timer === 1) {
spawnEnemy("skeleton")
spawnEnemy("skeleton")
spawnEnemy("skeleton")
spawnEnemy("dragon")
spawnEnemy("dragon")
spawnEnemy("dragon")
spawnEnemy("ghost")
spawnEnemy("ghost")
spawnEnemy("ghost")
} else if (timer % 100 === 0 && inProgress) {
spawnEnemy("skeleton")
spawnEnemy("ghost")
spawnEnemy("dragon")
}
if (timer > 0) {
timer--
} else if (timer <= 0) {
inProgress = false;
if (enemies.length === 0) {
portal.position.x = 550
portal.position.y = 400
}
}
} else if (stage === 6) {
room = "victory"
}
} else if (room === "victory") {
textAlign(CENTER)
textFont(myFont)
fill(255, 255, 255)
strokeWeight(2)
stroke(0, 0, 0)
textSize(30)
text("V I C T O R Y", 300, 220)
textFont(myFont2)
text("It took you " + (tries + 1) + " tries", 300, 300)
}
//--------------------------------------------------------------------end of level creator--------------------------------------------------\\
if (health <= 0) {
room = "gameover"
tries++
}
var healthDisplay = health / 5
rect(40, 40, 1000 / 5, 10)
push()
stroke(0, 0, 0)
strokeWeight(4)
fill(255, 0, 0)
rect(40, 40, healthDisplay, 10)
pop()
textSize(36)
textFont(myFont)
textAlign(RIGHT)
text(currentWeapon, 560, 60)
text(shield, 560, 110)
if (currentWeapon === "axe") {
if (swingingBool === true && swinging > 0) {
weapon.changeAnimation("axeSwing")
swinging--
} else {
swingingBool = false;
weapon.changeAnimation("axe")
swinging = 10
}
} else if (currentWeapon === "staff") {
if (swingingBool === true && swinging > 0) {
weapon.changeAnimation("staffBoom")
swinging--
} else {
swingingBool = false
weapon.changeAnimation("staff")
swinging = 10
}
} else if (currentWeapon === "crossbow") {
if (swingingBool === true && swinging > 0) {
weapon.changeAnimation("crossbowShwoo")
swinging--
} else {
swingingBool = false
weapon.changeAnimation("crossbow")
swinging = 10
}
}
if (keyIsDown(SHIFT)) {
shield = "Shielding"
guy.changeAnimation("shield")
shieldSound.play()
} else {
shield = "Vulnerable"
guy.changeAnimation("stand")
shieldSound.stop()
}
guy.position.y += gravity
blok.position.y += gravity
if (keyIsDown(68)) {
guy.position.x += speed;
guy.mirrorX(1);
facing = "right"
}
if (keyIsDown(65)) {
guy.position.x -= speed;
guy.mirrorX(-1);
facing = "left"
}
if (guy.position.x < 0) {
if (room === 1) {
guy.position.x += speed
} else if (room === 2) {
room = 1
drawEnvironment()
guy.position.x = 600;
} else {
guy.position.x = 600
}
}
if (guy.position.x > 600) {
if (room === 1) {
room = 2
drawEnvironment()
guy.position.x = 0;
} else if (room === 2) {
room = 3
guy.position.x = 0;
stage = 1
drawEnvironment()
} else {
guy.position.x = 0;
}
}
if (blok.position.x < 0) {
blok.position.x = 570
}
if (blok.position.x > 600) {
blok.position.x = 50
}
if (facing === "right") {
weapon.position.x = guy.position.x + 50
weapon.position.y = guy.position.y
weapon.mirrorX(1)
} else if (facing === "left") {
weapon.position.x = guy.position.x - 50
weapon.position.y = guy.position.y
weapon.mirrorX(-1)
}
//------------------enemy movement--------------------\\
for (var i = 0; i < enemies.length; i++) {
var manX = guy.position.x
var badX = enemies[i].position.x
var manY = guy.position.y
var badY = enemies[i].position.y
if (enemyArray[i].type === "ghost") {
enemies[i].attractionPoint(.04, manX, manY)
if (enemies[i].position.x > guy.position.x) {
enemies[i].mirrorX(1)
} else {
enemies[i].mirrorX(-1)
}
} else if (enemyArray[i].type === "skeleton") {
if (badX > manX) {
enemies[i].position.x -= skeleVel;
enemies[i].mirrorX(1)
} else if (badX < manX) {
enemies[i].position.x += skeleVel;
enemies[i].mirrorX(-1)
}
} else if (enemyArray[i].type === "dragon") {
var fireballChance = Math.floor((Math.random() * 100) + 1);
if ((fireballChance > 90) && stage != 5) {
if (enemies[i].velocity.x > 0) {
fireball = createSprite(enemies[i].position.x + 50, enemies[i].position.y, 20, 20)
} else {
fireball = createSprite(enemies[i].position.x - 50, enemies[i].position.y, 20, 20)
}
fireball.addAnimation("flameAnim", "flameball/sprite_0.png", "flameball/sprite_1.png", "flameball/sprite_2.png", "flameball/sprite_3.png", "flameball/sprite_4.png")
fireballs.add(fireball)
fireball.velocity.y = 8
}else if(stage === 5 && fireballChance > 98){
if (enemies[i].velocity.x > 0) {
fireball = createSprite(enemies[i].position.x + 50, enemies[i].position.y, 20, 20)
} else {
fireball = createSprite(enemies[i].position.x - 50, enemies[i].position.y, 20, 20)
}
fireball.addAnimation("flameAnim", "flameball/sprite_0.png", "flameball/sprite_1.png", "flameball/sprite_2.png", "flameball/sprite_3.png", "flameball/sprite_4.png")
fireballs.add(fireball)
fireball.velocity.y = 8
}
if (enemies[i].position.x > 605) {
enemies[i].velocity.x = -3
enemies[i].mirrorX(-1)
} else if (enemies[i].position.x < 0) {
enemies[i].velocity.x = 3
enemies[i].mirrorX(1)
}
}
}
collisions()
drawSprites();
}
}
function startStage(number) {
if (number === 1) {
}
}
//---------------build stage-----------------------------------------//
function drawEnvironment() {
if (room === 1) {
platform1.position.x = -200
platform2.position.x = -600
blok.position.y = 700
} else if (room === 2) {
} else if (room === 3) {
if (stage === 1) {
} else if (stage === 2) {
platform1.position.x = 100
platform1.position.y = 400
blok.position.x = 300
blok.position.y = 700
} else if (stage === 4) {
platform1.position.x = 300
platform1.position.y = 300
blok.position.y = 70
blok.position.x = 20
} else if (stage === 3) {
platform1.position.x = 200
platform1.position.y = 400
platform2.position.x = 600
blok.position.x = 900
} else if (stage === 5) {
platform1.position.x = 300
platform1.position.y = 300
platform2.position.y = 900
blok.position.y = 900
}
} else if (room === "victory") {
platform1.position.x = 900
}
}
function collisions() {
//--------------------health-----------------------\\
if (shield === "Vulnerable") {
if (enemies.overlap(guy)) {
health -= 2;
hurt.play()
}
if (fireballs.overlap(guy)) {
health -= 20
}
}
//---------------------environment------------------------------\\
guy.collide(ground)
guy.collide(platform1)
guy.collide(platform2)
if (guy.position.y < blok.position.y) {
guy.collide(blok)
if (guy.collide(blok)) {}
} else {
guy.displace(blok)
}
blok.collide(platform1)
blok.collide(platform2)
blok.collide(ground)
//------------------------jumping-------------------------------\\
if (guy.overlap(ground) || (guy.overlap(blok) && guy.position.y < blok.position.y - 70)) {
onFloor = true;
} else {
onFloor = false;
}
if (goingUp && jumpTime != 0) {
guy.position.y -= (jump + jumpTime)
jumpTime--;
} else {
jumpTime = 15
goingUp = false;
}
//-----------------------------shooty-----------------------------\\
beams.overlap(enemies, ded)
arrows.overlap(enemies, deder)
fireballs.overlap(guy, boom)
fireballs.overlap(ground, boomer)
fireballs.overlap(platform2, boomer)
//------------portal--------------------------\\
if (guy.overlap(portal)) {
if (guy.position.x >= portal.position.x) {
stage++;
timer = 1001
inProgress = true
guy.position.x = 300
guy.position.y = 440
portal.position.y = 900
drawEnvironment()
tele.play()
}
}
}
function keyPressed() {
if (keyCode === ENTER && (room === "start" || room === "gameover")) {
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].remove()
enemyArray.pop()
}
guy.position.x = 300
guy.position.y = 300
health = 1000
timer = 500
portal.position.y = 800
inProgress = true;
room = 1
stage = 0
drawEnvironment()
}
}
function keyTyped() {
if (room != "gameover") {
if (key === 'w') {
if (onFloor) {
goingUp = true;
jumpSound.play()
}
} else if (key === 'p') {
weaponCycle("forwards")
} else if (key === "q") {
currentWeapon = "axe"
arsenalPos = 0
} else if (key === "e") {
currentWeapon = "staff"
arsenalPos = 1
} else if (key === "f") {
currentWeapon = "crossbow"
arsenalPos = 2
} else if (key === "0") {
room = "victory"
} else if (key === 'o') {
if (shield === "Vulnerable") {
if (currentWeapon === "axe") {
axeSound.play();
} else if (currentWeapon === "crossbow") {
crossSound.play()
} else if (currentWeapon === "staff") {
staffSound.play()
}
swingingBool = true;
strike()
}
}
}
}
function spawnEnemy(which) {
if (which === "ghost") {
enemy = new Enemy("ghost", random(0, 600), random(0, 400), enemyPic)
enemyArray.push(enemy)
enemy.view()
} else if (which === "skeleton") {
enemy = new Enemy("skeleton", 605, 400, enemyPic)
enemyArray.push(enemy)
enemy.view()
} else if (which === "dragon") {
enemy = new Enemy("dragon", -5, 40, enemyPic)
enemyArray.push(enemy)
enemy.view()
}
}
function weaponCycle(direction) {
if (direction === "forwards") {
arsenalPos++
if (arsenalPos === arsenal.length) {
arsenalPos = 0
}
} else if (direction === "backwards") {
arsenalPos--
if (arsenalPos < 0) {
arsenalPos = arsenal.length - 1
}
}
currentWeapon = arsenal[arsenalPos]
}
function ded(bullet, killedGuy) {
var testArray = enemies.toArray()
var testPos = testArray[killedGuy]
var index = testArray.indexOf(killedGuy);
if (enemyArray[index].type === "ghost") {
if (index > -1) {
enemyArray.splice(index, 1);
}
bullet.remove()
killedGuy.remove()
}
}
function deder(bullet, killedGuy) {
var testArray = enemies.toArray()
var testPos = testArray[killedGuy]
var index = testArray.indexOf(killedGuy);
if (enemyArray[index].type === "dragon") {
if (index > -1) {
enemyArray.splice(index, 1);
}
bullet.remove()
killedGuy.remove()
}
}
function boom(bullet, hurtGuy) {
bullet.remove()
if (shield === "Vulnerable") {
health -= 50
hurt.play()
}
}
function boomer(bullet, hurtGuy) {
bullet.remove()
}
function strike() {
if (currentWeapon === "staff") {
if (facing === "right") {
beam = createSprite(guy.position.x + 60, guy.position.y - 30, 20, 20)
beam.life = lifespan
beam.addAnimation("vzh", "beam/sprite_0.png", "beam/sprite_1.png", "beam/sprite_2.png", "beam/sprite_3.png")
} else if (facing === "left") {
beam = createSprite(guy.position.x - 60, guy.position.y - 30, 20, 20)
beam.addAnimation("vzh", "beam/sprite_0.png", "beam/sprite_1.png", "beam/sprite_2.png", "beam/sprite_3.png")
beam.mirrorX(-1)
beam.life = lifespan
}
beams.add(beam)
if (facing === "right") {
beam.velocity.x = 9
} else {
beam.velocity.x = -9
}
} else if (currentWeapon === "crossbow") {
if (facing === "right") {
arrow = createSprite(guy.position.x + 80, guy.position.y - 10, 20, 20)
arrow.life = lifespan
arrow.addAnimation("arrow", "crossbow/sprite_2.png")
arrow.velocity.x = 4
arrow.setCollider("circle", arrow.position.x + 10, arrow.position.y - 20, 20)
} else if (facing === "left") {
arrow = createSprite(guy.position.x - 80, guy.position.y - 10, 20, 20)
arrow.life = lifespan
arrow.addAnimation("arrow", "crossbow/sprite_2.png")
arrow.mirrorX(-1)
arrow.velocity.x = -4
arrow.setCollider("circle", arrow.position.x - 10, arrow.position.y - 20, 20)
}
arrows.add(arrow)
arrow.velocity.y = -9
}
for (var i = 0; i < enemies.length; i++) {
var currentEnemy = enemies[i]
if (weapon.overlap(currentEnemy) && currentWeapon != "bow" && currentWeapon != "staff") {
if (currentWeapon === "axe" && enemyArray[i].type === "skeleton") {
var testArray = enemies.toArray()
var testPos = testArray[currentEnemy]
var index = testArray.indexOf(currentEnemy);
if (enemyArray[index].type === "skeleton") {
enemyArray[index].changeTo("ghost")
currentEnemy.changeAnimation("ghostAnim")
}
}
}
}
}
//--------------------classes---------------------\\
class Enemy {
constructor(type, x, y, image) {
this.type = type
this.x = x
this.y = y
this.image = image
// this.moveAnim = moveAnim
// this.attackAnim = attackAnim
}
view() {
var bad = createSprite(this.x, this.y)
if (this.type === "skeleton") {
bad.addAnimation("zombieAnim", "zombie/sprite_0.png", "zombie/sprite_1.png", "zombie/sprite_2.png", "zombie/sprite_3.png", "zombie/sprite_4.png", "zombie/sprite_5.png", "zombie/sprite_6.png", "zombie/sprite_7.png")
bad.addAnimation("ghostAnim", "ghost/sprite_0.png", "ghost/sprite_1.png", "ghost/sprite_2.png", "ghost/sprite_3.png", "ghost/sprite_4.png")
} else if (this.type === "dragon") {
bad.addAnimation("dragonAnim", "dragon/sprite_0.png", "dragon/sprite_1.png", "dragon/sprite_2.png", "dragon/sprite_3.png", "dragon/sprite_4.png", "dragon/sprite_5.png", "dragon/sprite_6.png", "dragon/sprite_7.png")
} else if (this.type === "ghost") {
bad.addAnimation("ghostAnim", "ghost/sprite_0.png", "ghost/sprite_1.png", "ghost/sprite_2.png", "ghost/sprite_3.png", "ghost/sprite_4.png")
}
enemies.add(bad)
}
changeTo(newType) {
this.type = newType;
}
kill() {
bad.remove()
}
getType() {
return this.type;
}
}