diff --git a/src/game.js b/src/game.js index f0c532e..2051aec 100644 --- a/src/game.js +++ b/src/game.js @@ -1,13 +1,13 @@ import { canvas, ctx } from './canvas' -import { Level, Rock, Gold, Diamond, Lootbag } from './level' +import { Level, Rock, Gold, Diamond, Lootbag, BarrelPiece } from './level' import { randomi } from './utils' -const MAP_CLEARANCE_PERCENTAGE = 80 +const MAP_CLEARANCE_PERCENTAGE = 90 const REWARD_TABLE = { rock: 16, - gold: [129, 543, 2399], - diamond: 599, + gold: [229, 843, 1299], + diamond: 1000, lootbag: [5, 5000] } @@ -32,7 +32,7 @@ export class Game { this.wait = 0 } - static calculateScore (obj, skipLoot) { + static calculateScore (obj) { if (obj instanceof Rock) { return REWARD_TABLE.rock * obj.size } @@ -45,7 +45,9 @@ export class Game { return REWARD_TABLE.diamond } - if (skipLoot) return 0 + if (obj instanceof BarrelPiece) { + return 1 + } if (obj instanceof Lootbag) { let ssChance = randomi(0, 3) @@ -61,7 +63,10 @@ export class Game { static calculateLevelScore (level) { let total = 0 for (let i in level.objects) { - total += Game.calculateScore(level.objects[i], true) + let obj = level.objects[i] + if (obj instanceof Gold) { + total += REWARD_TABLE.gold[obj.size - 1] + } } return total } @@ -125,6 +130,7 @@ export class Game { return } + this.level.update() this.player.update(this.level) } diff --git a/src/index.js b/src/index.js index d1ec907..fe18027 100644 --- a/src/index.js +++ b/src/index.js @@ -35,7 +35,8 @@ function start () { async function loadAll () { let images = ['static/hook_open.png', 'static/gold_1.png', 'static/gold_2.png', 'static/gold_3.png', - 'static/rock_1.png', 'static/rock_2.png', 'static/rock_3.png', 'static/diamond.png', 'static/loot.png'] + 'static/rock_1.png', 'static/rock_2.png', 'static/rock_3.png', 'static/diamond.png', 'static/loot.png', + 'static/tnt.png', 'static/barrel_piece.png', 'static/explosion.png'] for (let i in images) { await RES.loadImage(images[i]) } diff --git a/src/level.js b/src/level.js index ab87dfc..28ce75e 100644 --- a/src/level.js +++ b/src/level.js @@ -1,8 +1,10 @@ import { ctx } from './canvas' -import { randomi } from './utils' +import { randomi, distanceTo } from './utils' import RES from './resource' -const offset = 50 +const OFFSET = 50 +const TNT_START = 5 +const DIAMOND_START = 3 // Objects @@ -75,7 +77,46 @@ export class Lootbag extends GameObject { } get weight () { - return 0.56 + return 0.45 + } +} + +export class BarrelPiece extends GameObject { + constructor (x, y) { + super(x, y, 30, 18, 'static/barrel_piece.png') + } + + get weight () { + return 0.05 + } +} + +export class TNTBarrel extends GameObject { + constructor (x, y) { + super(x, y, 40, 55, 'static/tnt.png') + this.radius = 156 + } + + get weight () { + return 0.0 + } + + explode (level) { + for (let i in level.objects) { + let obj = level.objects[i] + if (distanceTo(obj, this) < this.radius) { + if (obj instanceof TNTBarrel && obj !== this && obj.physical) { + obj.explode(level) + continue + } + obj.destroy() + } + } + this.destroy() + level.placeExplosion(this.x, this.y, this.radius) + let b = new BarrelPiece(this.x, this.y) + level.objects.push(b) + return b } } @@ -85,51 +126,85 @@ export class Level { constructor (id, objects) { this.id = id this.objects = objects || [] + this.explosions = [] + } + + placeExplosion (x, y, r) { + this.explosions.push({ x, y, time: 30, r }) } draw () { for (let i in this.objects) { this.objects[i].draw() } + + let expl = RES.loadImage('static/explosion.png', true) + for (let i in this.explosions) { + let ex = this.explosions[i] + let r = ex.r * 1.5 + ctx.drawImage(expl, ctx.oX + ex.x - r / 2, ctx.oY + ex.y - r / 2, r, r) + } + } + + update () { + let toKeep = [] + for (let i in this.explosions) { + let ex = this.explosions[i] + if (ex.time > 0) { + ex.time-- + ex.r -= randomi(-10, 10) + toKeep.push(ex) + continue + } + } + this.explosions = toKeep } static create (index, my, width, height) { let objects = [] let rocks = randomi(4, 12) let gold = randomi(4, 12) - let diamond = randomi(0, 2) + let diamond = index >= DIAMOND_START ? randomi(0, 2) : 0 let loot = randomi(0, 2) + let tnt = index >= TNT_START ? randomi(0, 4) : 0 // Add rocks for (let r = 0; r < rocks; r++) { - let x = randomi(offset, width - offset) - let y = randomi(offset + my, height - (offset + my)) + let x = randomi(OFFSET, width - OFFSET) + let y = randomi(OFFSET + my, height - (OFFSET + my)) let size = randomi(1, 4) objects.push(new Rock(x, y, size)) } // Add gold for (let r = 0; r < gold; r++) { - let x = randomi(offset, width - offset) - let y = randomi(offset + my, height - (offset + my)) + let x = randomi(OFFSET, width - OFFSET) + let y = randomi(OFFSET + my, height - (OFFSET + my)) let size = randomi(1, 4) objects.push(new Gold(x, y, size)) } // Add diamonds for (let r = 0; r < diamond; r++) { - let x = randomi(offset, width - offset) - let y = randomi(offset + my, height - (offset + my)) + let x = randomi(OFFSET, width - OFFSET) + let y = randomi(OFFSET + my, height - (OFFSET + my)) objects.push(new Diamond(x, y)) } // Add loot for (let r = 0; r < loot; r++) { - let x = randomi(offset, width - offset) - let y = randomi(offset + my, height - (offset + my)) + let x = randomi(OFFSET, width - OFFSET) + let y = randomi(OFFSET + my, height - (OFFSET + my)) objects.push(new Lootbag(x, y)) } + // Add TNT + for (let r = 0; r < tnt; r++) { + let x = randomi(OFFSET, width - OFFSET) + let y = randomi(OFFSET + my + 10, height - (OFFSET + my) - 10) + objects.push(new TNTBarrel(x, y)) + } + let n = new Level(index, objects) return n } diff --git a/src/player.js b/src/player.js index 3c52906..8921030 100644 --- a/src/player.js +++ b/src/player.js @@ -127,6 +127,13 @@ class Hook extends GameObject { } if (firstIntersect) { + if (firstIntersect.explode) { + let obj = firstIntersect.explode(level) + this.obj = obj + this.md = 0 + return + } + this.obj = firstIntersect this.md = 0 return diff --git a/src/utils.js b/src/utils.js index 42542ec..31a2b98 100644 --- a/src/utils.js +++ b/src/utils.js @@ -19,3 +19,7 @@ export function intersectRect (r1, r2) { r2.y > r1.h + r1.y || r2.h + r2.y < r1.y) } + +export function distanceTo (o1, o2) { + return Math.sqrt(Math.pow(o2.x - o1.x, 2) + Math.pow(o2.y - o1.y, 2)) +} diff --git a/static/barrel_piece.png b/static/barrel_piece.png new file mode 100644 index 0000000..d81fee7 Binary files /dev/null and b/static/barrel_piece.png differ diff --git a/static/explosion.png b/static/explosion.png new file mode 100644 index 0000000..2af9993 Binary files /dev/null and b/static/explosion.png differ diff --git a/static/tnt.png b/static/tnt.png new file mode 100644 index 0000000..c0f068a Binary files /dev/null and b/static/tnt.png differ