From 3c249b2740245e24cd39514826750cf7d43835c9 Mon Sep 17 00:00:00 2001 From: Josh Curtiss Date: Wed, 5 Jun 2024 10:39:20 -0500 Subject: [PATCH] feat: Add bonus life at 20000 points --- src/abilities/Score.ts | 9 +++++++++ src/objects/Peter.ts | 13 +++++++++++-- src/scenes/GameScene.ts | 17 +++++++++-------- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/abilities/Score.ts b/src/abilities/Score.ts index 0fbdb23..50f7713 100644 --- a/src/abilities/Score.ts +++ b/src/abilities/Score.ts @@ -1,7 +1,12 @@ +import { k } from '../kaboom'; import { Comp } from 'kaboom'; +const { play } = k; + export const ON_SCORE_CHANGE = 'scoreChange'; +const NEW_LIFE_SCORE_THRESHOLD = 20000; + export interface ScoreComp extends Comp { get score(): number; set score(score: number); @@ -17,6 +22,10 @@ export function canScore(): ScoreComp { return score; }, set score(newScore) { + if (score % NEW_LIFE_SCORE_THRESHOLD > newScore % NEW_LIFE_SCORE_THRESHOLD) { + play('powerup'); + this.lives+=1; + } score = newScore; this.trigger(ON_SCORE_CHANGE, score); }, diff --git a/src/objects/Peter.ts b/src/objects/Peter.ts index 0669e14..7bc2977 100644 --- a/src/objects/Peter.ts +++ b/src/objects/Peter.ts @@ -31,6 +31,7 @@ const { export const ON_DIE = 'die'; export const ON_WIN = 'win'; +export const ON_LIVES_CHANGE = 'livesChange'; export interface PeterControls { keyboard: { @@ -55,11 +56,12 @@ export interface PeterComp extends Comp { isFrozen: boolean; isAlive: boolean; level: number; - lives: number; freeze: Function; action: Function; die: Function; win: Function; + get lives(): number; + set lives(num: number); setAnim: (dir: Vec2) => void; } @@ -102,6 +104,7 @@ export function addPeter(options: Partial = {}): PeterObj { export function peter(options: Partial = {}): PeterComp { const opt = Object.assign({}, PeterCompOptDefaults, options); + let lives = 4; return { id: "peter", require: ["area", "sprite", "can-salt", "can-walk"], @@ -125,7 +128,6 @@ export function peter(options: Partial = {}): PeterComp { isInitialized: false, isAlive: false, level: 0, - lives: 4, add() { this.onCollide("enemy", enemy=>{ if (enemy.isStunned) return; @@ -134,6 +136,13 @@ export function peter(options: Partial = {}): PeterComp { this.on(ON_DIR_CHANGE, this.setAnim); this.setObjects(opt.walkableObjects); }, + get lives() { + return lives; + }, + set lives(num: number) { + lives = num; + this.trigger(ON_LIVES_CHANGE, num); + }, action() { this.throwSalt(); }, diff --git a/src/scenes/GameScene.ts b/src/scenes/GameScene.ts index 45d8724..93c7895 100644 --- a/src/scenes/GameScene.ts +++ b/src/scenes/GameScene.ts @@ -2,7 +2,7 @@ import { LevelOpt } from 'kaboom'; import { k, BURGERTIME_BLUE } from '../kaboom'; import { waitSpawnPowerup } from '../objects/Powerup'; import { addEnemy } from '../objects/Enemy'; -import { ON_DIE, ON_WIN, PeterObj } from '../objects/Peter'; +import { ON_DIE, ON_WIN, ON_LIVES_CHANGE, PeterObj } from '../objects/Peter'; import { WalkableObj } from '../abilities/Walk'; import { ON_SALT_CHANGE } from '../abilities/Salt'; import { ON_SCORE_CHANGE } from '../abilities/Score'; @@ -107,10 +107,6 @@ export default function(options: Partial) { sprite('head-h'), pos(216, 8), ]); - ui.add([ - text(player.lives.toString(), { size: UI_FONT_SIZE }), - pos(230, 8), - ]); ui.add([ text(`${opt.currentPlayer+1} UP`, { size: UI_FONT_SIZE }), pos(16, 8), @@ -119,6 +115,10 @@ export default function(options: Partial) { text('HI', { size: UI_FONT_SIZE }), pos(112, 8), ]); + const txtScore = ui.add([ + text(player.score.toString(), { size: UI_FONT_SIZE, align: 'right', width: 50 }), + pos(48, 8), + ]); const txtHiScore = ui.add([ text('20000', { size: UI_FONT_SIZE, align: 'right', width: 50 }), pos(124, 8), @@ -127,10 +127,11 @@ export default function(options: Partial) { text(player.salt.toString(), { size: UI_FONT_SIZE }), pos(198, 8), ]); - const txtScore = ui.add([ - text(player.score.toString(), { size: UI_FONT_SIZE, align: 'right', width: 50 }), - pos(48, 8), + const txtLives = ui.add([ + text(player.lives.toString(), { size: UI_FONT_SIZE }), + pos(230, 8), ]); + player.on(ON_LIVES_CHANGE, (qty: number)=>txtLives.text = qty<0 ? '0' : qty.toString()); player.on(ON_SALT_CHANGE, (qty: number)=>txtPepper.text = qty.toString()); player.on(ON_SCORE_CHANGE, (score: number)=>{ txtScore.text = score.toString();