diff --git a/src/player.c b/src/player.c index 62a28c5..843ebbe 100644 --- a/src/player.c +++ b/src/player.c @@ -54,8 +54,10 @@ player_update(void) player.locked = 0; } - player.spd.x *= (1 - PLAYER_FRIC); - player.spd.x += dir * PLAYER_ACC; + if (!player.hooking) { + player.spd.x *= (1 - PLAYER_FRIC); + player.spd.x += dir * PLAYER_ACC; + } player.spd.y += GRAVITY + GRAVITY * (player.airbreak && !player.hooking); @@ -70,26 +72,49 @@ player_update(void) void player_hook(void) { + struct Vec2 player_middle = {player.pos.x + PLAYER_S / 2, + player.pos.y + PLAYER_S / 2}; + + /* get the nearest hook */ if (!player.locked) { - player.hook_pos = hook_closest(&player.pos); + player.hook_pos = hook_closest(&player_middle); } - const float dist = length(player.pos.x, player.pos.y, player.hook_pos.x, - player.hook_pos.y); + const float dist = length(player_middle.x, player_middle.y, + player.hook_pos.x, player.hook_pos.y); - if (dist < 100 && player.pos.y > player.hook_pos.y) { + if (dist < 100 && player_middle.y > player.hook_pos.y) { player.hooking = 1; player.locked = 1; + player.jumping = 1; } if (player.hooking && dist) { - const float dist_x = player.hook_pos.x - player.pos.x; - const float dist_y = player.hook_pos.y - player.pos.y; - if (abs(player.spd.x) < 5) { - player.spd.x += dist_x * (0.5f / dist); + float dist_x = player.hook_pos.x - player_middle.x; + float dist_y = player.hook_pos.y - player_middle.y; + /*if (abs(dist_x) < 1) { + dist_x = 1 * sign(dist_x); } - if (abs(player.spd.y) < 5) { - player.spd.y += dist_y * (1.0f / dist); + if (abs(dist_y) < 1) { + dist_y = 1 * sign(dist_y); + }*/ + + struct FVec2 force = {}; + if (dist_x) { + force.x = dist_x / dist; + } + if (dist_y) { + force.y = dist_y / dist; + } + + player.spd.x += force.x; + player.spd.y += force.y; + + if (abs(player.spd.x) > 16) { + player.spd.x = 8 * sign(player.spd.x); + } + if (abs(player.spd.y) > 8) { + player.spd.y = 8 * sign(player.spd.y); } } }