TNT and change goal calculation
This commit is contained in:
parent
14f598c905
commit
546f891acd
20
src/game.js
20
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)
|
||||
}
|
||||
|
||||
|
@ -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])
|
||||
}
|
||||
|
99
src/level.js
99
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
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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))
|
||||
}
|
||||
|
BIN
static/barrel_piece.png
Normal file
BIN
static/barrel_piece.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.2 KiB |
BIN
static/explosion.png
Normal file
BIN
static/explosion.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.6 KiB |
BIN
static/tnt.png
Normal file
BIN
static/tnt.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 5.2 KiB |
Loading…
Reference in New Issue
Block a user