antizona

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit bd001b1da3f21f46f51f06f5093312bad91932d4
parent 0587a7dce380a0b53b057b3b4ceda7a1e66406ac
Author: averagecoder <averagecoder@noreply.codeberg.org>
Date:   Mon, 24 Aug 2026 17:34:57 +0300

feat: add jump

Diffstat:
Msrc/render.c | 65++++++++++++++++++++++++++++++++++-------------------------------
1 file changed, 34 insertions(+), 31 deletions(-)

diff --git a/src/render.c b/src/render.c @@ -92,8 +92,8 @@ struct sys_gfx { int in_chat, chat_len; char chat_buf[128]; int menu_open; - KeyCode key_w, key_a, key_s, key_d, key_t, key_esc; - KeyCode key_up, key_down, key_left, key_right; + KeyCode key_w, key_a, key_s, key_d, key_t, + key_esc, key_up, key_down, key_left, key_right, key_space; XIC ic; XFontSet font_set; }; @@ -2619,6 +2619,8 @@ main(int argc, char *argv[]) m_dy = 0; while (XPending(g.dpy)) { + KeySym sym; + XNextEvent(g.dpy, &sa_event); if (XFilterEvent(&sa_event, None)) { continue; @@ -2641,7 +2643,9 @@ main(int argc, char *argv[]) } if (sa_event.type == KeyPress) { code = sa_event.xkey.keycode; - if (code == g.key_esc) { + sym = XLookupKeysym(&sa_event.xkey, 0); + + if (code == g.key_esc || sym == XK_Escape) { if (g.in_chat) { g.in_chat = 0; XGrabPointer(g.dpy, g.win, True, @@ -2663,7 +2667,6 @@ main(int argc, char *argv[]) } if (g.in_chat) { char str[32]; - KeySym sym; Status status; int n = 0; @@ -2713,11 +2716,12 @@ main(int argc, char *argv[]) g.chat_buf[g.chat_len] = '\0'; } } else if (!g.menu_open) { - if (code == g.key_w) g.keys['w'] = 1; - else if (code == g.key_a) g.keys['a'] = 1; - else if (code == g.key_s) g.keys['s'] = 1; - else if (code == g.key_d) g.keys['d'] = 1; - else if (code == g.key_t) { + if (code == g.key_w || sym == XK_w || sym == XK_W) g.keys['w'] = 1; + else if (code == g.key_a || sym == XK_a || sym == XK_A) g.keys['a'] = 1; + else if (code == g.key_s || sym == XK_s || sym == XK_S) g.keys['s'] = 1; + else if (code == g.key_d || sym == XK_d || sym == XK_D) g.keys['d'] = 1; + else if (code == g.key_space || sym == XK_space) g.keys[' '] = 1; + else if (code == g.key_t || sym == XK_t || sym == XK_T) { g.in_chat = 1; g.chat_len = 0; g.chat_buf[0] = '\0'; @@ -2727,10 +2731,13 @@ main(int argc, char *argv[]) } if (sa_event.type == KeyRelease && !g.menu_open) { code = sa_event.xkey.keycode; - if (code == g.key_w) g.keys['w'] = 0; - else if (code == g.key_a) g.keys['a'] = 0; - else if (code == g.key_s) g.keys['s'] = 0; - else if (code == g.key_d) g.keys['d'] = 0; + sym = XLookupKeysym(&sa_event.xkey, 0); + + if (code == g.key_w || sym == XK_w || sym == XK_W) g.keys['w'] = 0; + else if (code == g.key_a || sym == XK_a || sym == XK_A) g.keys['a'] = 0; + else if (code == g.key_s || sym == XK_s || sym == XK_S) g.keys['s'] = 0; + else if (code == g.key_d || sym == XK_d || sym == XK_D) g.keys['d'] = 0; + else if (code == g.key_space || sym == XK_space) g.keys[' '] = 0; } } @@ -2785,11 +2792,6 @@ main(int argc, char *argv[]) if (g.keys['s']) move_forward -= 1.0f; if (g.keys['d']) move_strafe += 1.0f; if (g.keys['a']) move_strafe -= 1.0f; - - if (g.keys[' '] && is_grounded) { - player_vy = JUMP_FORCE; - is_grounded = 0; - } } move_x = sinf(cam_yaw) * move_forward + cosf(cam_yaw) * move_strafe; @@ -2807,20 +2809,21 @@ main(int argc, char *argv[]) ground_y = get_ground_height(player_x, player_z, player_y); - if (is_grounded) { - if (ground_y > -900.0f) { - float diff = player_y - ground_y; - - if (diff <= STEP_SNAP_DOWN && diff >= -0.5f) { - player_y = ground_y; - player_vy = 0.0f; - } else if (diff > STEP_SNAP_DOWN) { - is_grounded = 0; - } - } else { - is_grounded = 0; - } + if (ground_y > -900.0f && player_y <= ground_y + 0.1f && player_vy <= 0.0f) { + player_y = ground_y; + player_vy = 0.0f; + is_grounded = 1; } else { + is_grounded = 0; + } + + if (g.keys[' '] && is_grounded && !g.in_chat && !g.menu_open) { + player_vy = JUMP_FORCE; + player_y += 0.05f; + is_grounded = 0; + } + + if (!is_grounded) { player_vy -= GRAVITY * dt; if (player_vy < -TERMINAL_VEL) { player_vy = -TERMINAL_VEL;