Draw the player's blocked/pushing frame (at last)

This commit is contained in:
Eevee (Evelyn Woods) 2020-09-23 21:09:57 -06:00
parent c63e1384dc
commit 67504e436e
3 changed files with 27 additions and 1 deletions

View File

@ -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;
}
} }
} }

View File

@ -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],

View File

@ -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';
} }