Draw the player's blocked/pushing frame (at last)
This commit is contained in:
parent
c63e1384dc
commit
67504e436e
20
js/game.js
20
js/game.js
@ -354,6 +354,10 @@ export class Level {
|
|||||||
|
|
||||||
// Used to check for a monster chomping the player's tail
|
// Used to check for a monster chomping the player's tail
|
||||||
this.player_leaving_cell = this.player.cell;
|
this.player_leaving_cell = this.player.cell;
|
||||||
|
// Used for visual effect and updated later; don't need to be undoable
|
||||||
|
// because they only apply while holding a key down anyway
|
||||||
|
// TODO but maybe they should be undone anyway so rewind looks better
|
||||||
|
this.player.is_blocked = false;
|
||||||
|
|
||||||
// First pass: tick cooldowns and animations; have actors arrive in their cells. We do the
|
// First pass: tick cooldowns and animations; have actors arrive in their cells. We do the
|
||||||
// arrival as its own mini pass, for one reason: if the player dies (which will end the game
|
// arrival as its own mini pass, for one reason: if the player dies (which will end the game
|
||||||
@ -397,6 +401,11 @@ export class Level {
|
|||||||
this.step_on_cell(actor);
|
this.step_on_cell(actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only reset the player's is_pushing between movement, so it lasts for the whole push
|
||||||
|
if (this.player.movement_cooldown <= 0) {
|
||||||
|
this.player.is_pushing = false;
|
||||||
|
}
|
||||||
|
|
||||||
// Second pass: actors decide their upcoming movement simultaneously
|
// Second pass: actors decide their upcoming movement simultaneously
|
||||||
for (let actor of this.actors) {
|
for (let actor of this.actors) {
|
||||||
if (! actor.cell)
|
if (! actor.cell)
|
||||||
@ -559,7 +568,12 @@ export class Level {
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
let old_cell = actor.cell;
|
let old_cell = actor.cell;
|
||||||
this.attempt_step(actor, actor.decision);
|
let success = this.attempt_step(actor, actor.decision);
|
||||||
|
|
||||||
|
// Track whether the player is blocked, for visual effect
|
||||||
|
if (actor === this.player && p1_primary_direction && ! success) {
|
||||||
|
actor.is_blocked = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Players can also bump the tiles in the cell next to the one they're leaving
|
// Players can also bump the tiles in the cell next to the one they're leaving
|
||||||
let dir2 = actor.secondary_direction;
|
let dir2 = actor.secondary_direction;
|
||||||
@ -575,6 +589,7 @@ export class Level {
|
|||||||
}
|
}
|
||||||
if (could_push && actor.can_push(tile)) {
|
if (could_push && actor.can_push(tile)) {
|
||||||
// Block slapping: you can shove a block by walking past it sideways
|
// Block slapping: you can shove a block by walking past it sideways
|
||||||
|
// TODO i think cc2 uses the push pose and possibly even turns you here?
|
||||||
this.attempt_step(tile, dir2);
|
this.attempt_step(tile, dir2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -697,6 +712,9 @@ export class Level {
|
|||||||
for (let tile of Array.from(goal_cell)) {
|
for (let tile of Array.from(goal_cell)) {
|
||||||
if (actor.can_push(tile)) {
|
if (actor.can_push(tile)) {
|
||||||
this.attempt_step(tile, direction);
|
this.attempt_step(tile, direction);
|
||||||
|
if (actor === this.player) {
|
||||||
|
actor.is_pushing = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -298,6 +298,7 @@ export const CC2_TILESET_LAYOUT = {
|
|||||||
west: [8, 23],
|
west: [8, 23],
|
||||||
east: [8, 22],
|
east: [8, 22],
|
||||||
},
|
},
|
||||||
|
blocked: 'pushing',
|
||||||
moving: {
|
moving: {
|
||||||
north: [[0, 22], [1, 22], [2, 22], [3, 22], [4, 22], [5, 22], [6, 22], [7, 22]],
|
north: [[0, 22], [1, 22], [2, 22], [3, 22], [4, 22], [5, 22], [6, 22], [7, 22]],
|
||||||
east: [[8, 22], [9, 22], [10, 22], [11, 22], [12, 22], [13, 22], [14, 22], [15, 22]],
|
east: [[8, 22], [9, 22], [10, 22], [11, 22], [12, 22], [13, 22], [14, 22], [15, 22]],
|
||||||
@ -532,6 +533,7 @@ export const TILE_WORLD_TILESET_LAYOUT = {
|
|||||||
},
|
},
|
||||||
moving: 'normal',
|
moving: 'normal',
|
||||||
pushing: 'normal',
|
pushing: 'normal',
|
||||||
|
blocked: 'normal',
|
||||||
swimming: {
|
swimming: {
|
||||||
north: [3, 12],
|
north: [3, 12],
|
||||||
west: [3, 13],
|
west: [3, 13],
|
||||||
|
|||||||
@ -34,6 +34,12 @@ function player_visual_state(me) {
|
|||||||
else if (me.slide_mode === 'force') {
|
else if (me.slide_mode === 'force') {
|
||||||
return 'forced';
|
return 'forced';
|
||||||
}
|
}
|
||||||
|
else if (me.is_blocked) {
|
||||||
|
return 'blocked';
|
||||||
|
}
|
||||||
|
else if (me.is_pushing) {
|
||||||
|
return 'pushing';
|
||||||
|
}
|
||||||
else if (me.animation_speed) {
|
else if (me.animation_speed) {
|
||||||
return 'moving';
|
return 'moving';
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user