Skip to content

Commit 8ed263b

Browse files
Boss mode and player health.
Bosses fire weapons based on intervals, as defined on the enemy styles config. Bosses spawn in the middle of the stage. Adapted enemy manager creation for this. Laser entity with different behavior onCollision if spawned by an enemy entity. Player no longer a sprite but an entity, so collisions can work. Player now has a base health defined on game.data.
1 parent 30a2848 commit 8ed263b

File tree

9 files changed

+152
-27
lines changed

9 files changed

+152
-27
lines changed

index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
<script type="text/javascript" src="src/entities/enemy/entity.js"></script>
6565
<script type="text/javascript" src="src/entities/enemy/manager.js"></script>
6666
<script type="text/javascript" src="src/entities/enemy/styles.js"></script>
67+
<script type="text/javascript" src="src/entities/enemy/boss.js"></script>
6768
<script type="text/javascript" src="src/entities/player/entity.js"></script>
6869
<script type="text/javascript" src="src/entities/laser/entity.js"></script>
6970
<script type="text/javascript" src="src/entities/weapons/bomb.js"></script>

src/config/data.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ game.data = {
22
score: 0,
33
levelscore: 0,
44
level: 0,
5+
player: {
6+
startingHealth: 200,
7+
positionOffset: 25
8+
},
59
startPlayTime: new Date(),
610
weaponEquipped: 0
711
};

src/entities/enemy/boss.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
game.Entities = game.Entities || {};
2+
game.Entities.Boss = me.Entity.extend({
3+
init(x, y, { type, grid }) {
4+
this._super(me.Entity, 'init', [
5+
x, y,
6+
{
7+
image: 'bosses',
8+
width: 128,
9+
height: 128
10+
}
11+
]);
12+
this.anchorPoint.set(0.5, 0.5);
13+
14+
this.body.setVelocity(0, 0);
15+
this.body.collisionType = me.collision.types.ENEMY_OBJECT;
16+
17+
this.grid = grid;
18+
this.alive = true;
19+
this.buildShip(type);
20+
},
21+
22+
update(time) {
23+
this._super(me.Entity, 'update', [time]);
24+
25+
this.body.update();
26+
27+
return true;
28+
},
29+
30+
buildShip(index) {
31+
this.type = game.Entities.EnemyList[index].boss;
32+
this.renderable.addAnimation('idle', [this.type.frame], 1);
33+
this.renderable.setCurrentAnimation('idle');
34+
35+
this.stats = {
36+
health: this.type.health,
37+
armor: this.type.armor,
38+
points: this.type.points
39+
};
40+
41+
this.fireInterval = setInterval(() => {
42+
me.audio.play('fire');
43+
me.game.world.addChild(me.pool.pull('laser', this._absPos.x + this.width / 3, this._absPos.y + this.height, 's', this.type.fire.damage, true));
44+
me.game.world.addChild(me.pool.pull('laser', this._absPos.x + this.width / 1.5, this._absPos.y + this.height, 's', this.type.fire.damage, true));
45+
}, this.type.fire.rate);
46+
},
47+
48+
onDestroyEvent() {
49+
clearInterval(this.fireInterval);
50+
}
51+
});

src/entities/enemy/entity.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
game.Entities = game.Entities || {};
22
game.Entities.Enemy = me.Entity.extend({
3-
init(x, y, type) {
3+
init(x, y, { type, grid }) {
44
this._super(me.Entity, 'init', [
55
x, y,
66
{
@@ -14,6 +14,8 @@ game.Entities.Enemy = me.Entity.extend({
1414
this.body.setVelocity(0, 0);
1515
this.body.collisionType = me.collision.types.ENEMY_OBJECT;
1616

17+
this.grid = grid;
18+
1719
this.alive = true;
1820
this.buildShip(type);
1921
},

src/entities/enemy/manager.js

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,29 +85,48 @@ game.Entities.EnemyManager = me.Container.extend({
8585
},
8686

8787
createEnemies() {
88-
let i;
89-
let j;
88+
let x;
89+
let y;
9090

9191
let amountOfEnemiesCreated = 0;
9292

9393
// Build table for random weighted choice
9494
const table = [];
95-
let { probability } = this.enemyConfig;
95+
let { probability, boss } = this.enemyConfig;
9696
if (!probability) {
9797
// If not defined, set random probability for all enemies.
9898
probability = [];
99-
for (i = 0; i < this.enemyConfig.enemies.length; i += 1) {
99+
for (x = 0; x < this.enemyConfig.enemies.length; x += 1) {
100100
probability.push(~~(Math.random() * 4));
101101
}
102102
}
103103

104-
for (i = 0; i < probability.length; i += 1) {
105-
table.push({ weight: probability[i], id: this.enemyConfig.enemies[i] });
104+
for (x = 0; x < probability.length; x += 1) {
105+
table.push({ weight: probability[x], id: this.enemyConfig.enemies[x] });
106106
}
107107

108-
for (i = 0; i < this.COLS; i += 1) {
109-
for (j = 0; j < this.ROWS; j += 1) {
110-
this.addChild(me.pool.pull('enemy', i * 96, j * 76, rwc(table)));
108+
const middle = {
109+
x: Math.round(this.COLS / 2) - 1
110+
};
111+
112+
boss = [0];
113+
let bossCreated = !boss;
114+
for (y = 0; y < this.ROWS; y += 1) {
115+
for (x = 0; x < this.COLS; x += 1) {
116+
if (!bossCreated && x === middle.x) {
117+
bossCreated = true;
118+
this.addChild(me.pool.pull('boss', x * 96 + 24, 0, { type: boss[0], grid: { x, y } }));
119+
120+
x += 2;
121+
while (x < this.COLS) {
122+
this.addChild(me.pool.pull('enemy', x * 96, y * 76, { type: rwc(table), grid: { x, y } }));
123+
x += 1;
124+
amountOfEnemiesCreated += 1;
125+
}
126+
} else if (!boss || (boss &&
127+
((x !== middle.x && x !== middle.x + 1)) || (y >= this.ROWS - 2))) {
128+
this.addChild(me.pool.pull('enemy', x * 96, y * 76, { type: rwc(table), grid: { x, y } }));
129+
}
111130
amountOfEnemiesCreated += 1;
112131
}
113132
}

src/entities/enemy/styles.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ game.Entities.EnemyList = [
88
health: 5000,
99
armor: 3,
1010
frame: 0,
11-
points: 450
11+
points: 450,
12+
fire: {
13+
rate: 1000,
14+
damage: 50
15+
}
1216
}
1317
},
1418
{

src/entities/laser/entity.js

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
game.Entities = game.Entities || {};
22
game.Entities.Laser = me.Entity.extend({
3-
init(x, y, direction = 'n', damage = 50) {
3+
init(x, y, direction = 'n', damage = 50, firedByEnemy) {
44
this._super(me.Entity, 'init', [x, y, { width: game.Entities.Laser.width, height: game.Entities.Laser.height }]);
55
this.z = 5;
66
this.damage = damage;
7+
this.firedByEnemy = firedByEnemy;
78
this.alwaysUpdate = true;
89

910
this.renderable = new (me.Renderable.extend({
@@ -14,8 +15,16 @@ game.Entities.Laser = me.Entity.extend({
1415
draw(renderer) {
1516
const color = renderer.getColor();
1617

17-
renderer.setColor('#5EFF7E');
18-
renderer.fillRect(0, 0, this.width, this.height);
18+
if (firedByEnemy) {
19+
renderer.setColor('#5EFF7E');
20+
renderer.fillRect(0, 0, this.width, this.height);
21+
22+
renderer.setColor('#822929');
23+
renderer.fillRect(1, 1, this.width - 2, this.height - 2);
24+
} else {
25+
renderer.setColor('#5EFF7E');
26+
renderer.fillRect(0, 0, this.width, this.height);
27+
}
1928
renderer.setColor(color);
2029
}
2130
}))();
@@ -99,7 +108,27 @@ game.Entities.Laser = me.Entity.extend({
99108
},
100109

101110
onCollision(res, other) {
102-
if (other.body.collisionType === me.collision.types.ENEMY_OBJECT) {
111+
if (res.a.firedByEnemy) {
112+
// Shot was fired by an enemy entity
113+
if (other.body.collisionType === me.collision.types.PLAYER_OBJECT) {
114+
me.game.world.removeChild(this);
115+
116+
other.stats.health -= this.damage;
117+
other.renderable.flicker(500);
118+
119+
if (other.stats.health <= 0) {
120+
me.audio.pauseTrack();
121+
game.data.endPlayTime = new Date() - game.data.startPlayTime;
122+
123+
me.state.change(me.state.GAMEOVER);
124+
}
125+
me.audio.play('hit');
126+
return true;
127+
}
128+
129+
return false;
130+
} else if (other.body.collisionType === me.collision.types.ENEMY_OBJECT) {
131+
// Shot fired by the player collided with an enemy entity
103132
me.game.world.removeChild(this);
104133

105134
other.stats.health -= this.damage;
@@ -122,12 +151,12 @@ game.Entities.Laser = me.Entity.extend({
122151
return true;
123152
}
124153

125-
if (other.body.collisionType === me.collision.types.PROJECTILE_OBJECT) {
126-
// do nothing
127-
return false;
128-
}
154+
// if (other.body.collisionType === me.collision.types.PROJECTILE_OBJECT) {
155+
// do nothing
156+
return false;
157+
// }
129158
}
130159
});
131160

132-
game.Entities.Laser.width = 3;
161+
game.Entities.Laser.width = 4;
133162
game.Entities.Laser.height = 20;

src/entities/player/entity.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,28 @@
11
game.Entities = game.Entities || {};
2-
game.Entities.Player = me.Sprite.extend({
2+
game.Entities.Player = me.Entity.extend({
33
init() {
44
const image = me.loader.getImage('player');
55

6-
this._super(me.Sprite, 'init', [
6+
this._super(me.Entity, 'init', [
77
me.game.viewport.width / 2 - image.width / 2,
8-
me.game.viewport.height - image.height,
9-
{ image }
8+
me.game.viewport.height - image.height - game.data.player.positionOffset,
9+
{
10+
image,
11+
width: 64,
12+
height: 64
13+
}
1014
]);
15+
this.body.collisionType = me.collision.types.PLAYER_OBJECT;
16+
17+
this.stats = {
18+
health: game.data.player.startingHealth
19+
};
1120

1221
this.maxX = me.game.viewport.width - this.width;
1322
},
1423

1524
update(time) {
16-
this._super(me.Sprite, 'update', [time]);
25+
this._super(me.Entity, 'update', [time]);
1726

1827
this.movementControls(time);
1928
this.shootingControls();
@@ -86,8 +95,12 @@ game.Entities.Player = me.Sprite.extend({
8695
shoot(equiped) {
8796
const { name, extraArg } = game.data.weapons[equiped];
8897

89-
me.game.world.addChild(me.pool.pull(name, this.pos.x -
90-
(game.Entities.Weapons.Shotgun.width / 2), this.pos.y - this.height / 2, extraArg));
98+
me.game.world.addChild(me.pool.pull(
99+
name,
100+
this.pos.x + this.width / 2 - 2,
101+
this.pos.y - game.data.player.positionOffset / 3 - 2,
102+
extraArg
103+
));
91104
},
92105
volumeControls() {
93106
if (me.input.isKeyPressed('volume-plus')) {

src/game.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ const game = {
6969
loaded() {
7070
me.pool.register('player', game.Entities.Player);
7171
me.pool.register('enemy', game.Entities.Enemy, true);
72+
me.pool.register('boss', game.Entities.Boss, true);
73+
7274
me.pool.register('laser', game.Entities.Laser, true);
7375
me.pool.register('bomb', game.Entities.Weapons.Bomb, true);
7476
me.pool.register('trident', game.Entities.Weapons.Trident, true);

0 commit comments

Comments
 (0)