-
Notifications
You must be signed in to change notification settings - Fork 0
/
boatBattle.ts
160 lines (128 loc) · 5.44 KB
/
boatBattle.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
namespace BoatBattle {
let enemies: EnemyPirate[] = []
let player1: Pirate
let player2: Pirate
let treasure: Sprite
const player1StatLocation: number[] = [12, 10]
const player2StatLocation: number[] = [130, 10]
let _onWinCallback: () => void
let _onLooseCallback: () => void
let _isDone = false
const _boundingBox: number[] = [0, 10, 160, 100]
const _enemyBoatBox: number[] = [0, 10, 160, 60]
const _ourBoatBox: number[] = [0, 90, 160, 100]
export function init() {
scene.setBackgroundColor(6)
scene.setBackgroundImage(assets.image`Boat Battle`)
enemies = []
_isDone = false
// Spawn the players
player1 = new Pirate({ control: controller.player1, playerNumber: 0, onAttack: onPirateAttack, onDie: onPirateDeath, boundaries: _boundingBox, statLocation: player1StatLocation })
player2 = new Pirate({ control: controller.player2, playerNumber: 1, onAttack: onPirateAttack, onDie: onPirateDeath, boundaries: _boundingBox, statLocation: player2StatLocation })
player1.sprite.x = Math.randomRange(_ourBoatBox[0], _ourBoatBox[2])
player1.sprite.y = Math.randomRange(_ourBoatBox[1], _ourBoatBox[3])
player2.sprite.x = Math.randomRange(_ourBoatBox[0], _ourBoatBox[2])
player2.sprite.y = Math.randomRange(_ourBoatBox[1], _ourBoatBox[3])
// Spawn the treasure!
treasure = sprites.create(assets.image`Chest`)
treasure.x = Math.randomRange(_ourBoatBox[0], _ourBoatBox[2])
treasure.y = Math.randomRange(_ourBoatBox[1], _ourBoatBox[3])
// Spawn the enemies!
// Based on the amount of treasure you have, more enemies will appear!
const boatTreasure = TreasureStats.currentTreasure.onBoat
let numberOfEnemies = 1
if (boatTreasure > 1000) {
numberOfEnemies = 10
} else {
numberOfEnemies = 3 + Math.min(Math.floor(boatTreasure / 1000 * 4), 7);
}
Utils.getArrayOfLength(numberOfEnemies).forEach((index) => {
const locX = Math.randomRange(_enemyBoatBox[0], _enemyBoatBox[2])
const locY = Math.randomRange(_enemyBoatBox[1], _enemyBoatBox[3])
// Had to do this to make it easy and running out of time!
const treasurePretendingToBePirate = { hit: () => {}, health: 1, sprite: treasure }
// At least 2 enemies go for the treasure
let target = Math.pickRandom([player1, player2, treasurePretendingToBePirate])
if (index <= 2) {
target = treasurePretendingToBePirate
}
const enemyPirate = new EnemyPirate({ x: locX, y: locY, target })
enemies.push(enemyPirate)
})
PirateLives.show()
music.play(music.createSong(assets.song`BoatBattle`), music.PlaybackMode.LoopingInBackground)
}
export function render() {
player1.render()
player2.render()
enemies.forEach(enemy => enemy.render())
if (!_isDone) {
checkIfOver()
}
}
export function destroy() {
player1.destroy()
player2.destroy()
enemies.forEach((e) => e.destroy())
enemies = []
treasure.destroy()
scene.setBackgroundImage(assets.image`empty`)
music.stopAllSounds()
}
export function onWin(callback: () => void) {
_onWinCallback = callback
}
export function onLoose(callback: () => void) {
_onLooseCallback = callback
}
function onPirateAttack({ pirate }: { pirate: Pirate }) {
const hitEnemies = Utils.getHitEnemies({ pirate, enemies })
hitEnemies.forEach((enemy) => {
// No looting of EnemyPirates
if (enemy.health > 0) {
enemy.hit({ attacker: pirate, damage: 1 })
}
})
checkIfOver()
}
function onPirateDeath() {
checkIfOver()
}
function checkIfOver() {
if (_isDone) return
const anyAlive = enemies.some((enemy) => enemy.health > 0)
const anyGotTreasure = enemies.some((enemy) => Utils.getDistance(enemy.sprite, treasure) < 5)
const allPlayersDead = player1.health <= 0 && player2.health <= 0
// if any enemy pirates are on top of the treasure, BOOM LOOSE!
if (anyGotTreasure) {
_isDone = true
pause(1000)
game.showLongText('Thee pirates stole ye booty!', DialogLayout.Center)
TreasureStats.currentTreasure = {
onBoat: 0,
onIsland: TreasureStats.currentTreasure.onIsland,
inPocket: 0
}
destroy()
_onLooseCallback()
} else if (allPlayersDead) {
_isDone = true
pause(1000)
game.showLongText('Thar enemy has taken thee boat! Luckily they\'ve accepted you to join their crew!', DialogLayout.Center)
TreasureStats.currentTreasure = {
onBoat: TreasureStats.currentTreasure.onBoat + TreasureStats.currentTreasure.inPocket,
onIsland: 0,
inPocket: 0
}
PirateLives.updatePirateCount(-2)
destroy()
_onLooseCallback()
} else if (!anyAlive) {
_isDone = true
pause(1000)
game.showLongText('Ye have warded off the enemy pirates! For now...', DialogLayout.Center)
destroy()
_onWinCallback()
}
}
}