diff --git a/main.gd b/main.gd index d84268e..1909668 100644 --- a/main.gd +++ b/main.gd @@ -108,16 +108,8 @@ func step(move: Vector2i): elif ball != null: hist.create_action("push") hist.add_do_method(ball.do_push(move)) - hist.add_do_method(func(): - player.lpos = pos + move - player.lpos = pos - player.anim_progress = 0.5 - ) - hist.add_undo_method(func(): - player.lpos = pos + move - player.lpos = pos - player.anim_progress = 0.5 - ) + hist.add_do_method(player.do_bump(move)) + hist.add_undo_method(player.undo_bump(move)) hist.add_undo_method(ball.undo_push()) hist.commit_action() else: diff --git a/piece.gd b/piece.gd index ee5149d..fca87cf 100644 --- a/piece.gd +++ b/piece.gd @@ -48,11 +48,15 @@ func do_step(board: Board): return var move := lvel.clampi(-1, 1) var new_pos := lpos + move + # ball being collided *with* gets the remainder of the momentum + # EMERGENT COMPLEXITY!??!? if board.solid_at(new_pos): var ball_here := board.type_at(new_pos, Piece.Type.Ball) if ball_here: - ball_here.do_push(lvel-move).call() - lvel = -move + do_bump(move).call() + var rem := lvel % 2 + ball_here.do_push(lvel/2 + rem).call() + lvel = -lvel/2 else: lpos = lpos lvel -= move @@ -89,6 +93,19 @@ func undo_push() -> Callable: lvel = old_vel anim_progress = 1 +# no logical effect, purely for aesthetics +# (and communicating !!!! player yes) +func do_bump(move: Vector2i) -> Callable: + var real_lpos := lpos + return func(): + lpos += move + lpos = real_lpos + anim_progress = 0.5 + +# TODO?: maybe fix? maybe the bump should be more complicated? +func undo_bump(move: Vector2i) -> Callable: + return do_bump(move) + static func ball(pos: Vector2i) -> Piece: return BALL.instantiate().with_lpos(pos)