From 765e2c32c81a113102ddbbf700208155d3573a12 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Sat, 4 Jan 2025 13:03:19 +0000 Subject: [PATCH] Implement drawlist updating for decreasing y --- game/main.c | 44 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/game/main.c b/game/main.c index 977b2b5..e94d1ad 100644 --- a/game/main.c +++ b/game/main.c @@ -646,6 +646,44 @@ static void update_drawlist(dynentity_t *e, entity_t **drawlist) n->prev->next = (entity_t *)e; n->prev = (entity_t *)e; } + } else { + // The entity moved up -- this is mostly symmetric with the + // above case. + entity_t *n = e->e.prev; + if (n == NULL) + return; + + const int y = dynentity_bottom(e); + int prevy = entity_bottom(n); + if (y >= prevy) + return; + + while (n->prev != NULL && y < prevy) { + n = n->prev; + prevy = entity_bottom(n); + } + assert(n != NULL); + + if (y < prevy) { + e->e.prev->next = e->e.next; + e->e.next->prev = e->e.prev; + + e->e.prev = NULL; + e->e.next = n; + *drawlist = n->prev = (entity_t *)e; + } else { + if (e->e.next == NULL) { + e->e.prev->next = NULL; + } else { + e->e.next->prev = e->e.prev; + e->e.prev->next = e->e.next; + } + + e->e.next = n->next; + e->e.prev = n; + n->next->prev = (entity_t *)e; + n->next = (entity_t *)e; + } } } @@ -675,7 +713,8 @@ static void update_dynentity(gamestate_t *state, dynentity_t *e, double dt) e->svar = SPRITE_DIR_UP; } - // Apply velocity (handling map collisions) + // Apply velocity, handling map collisions and updating the + // drawlist const double nextx = e->pos.x + dt * e->speed * e->dir.x; const double nexty = e->pos.y + dt * e->speed * e->dir.y; const dvec_t pfb @@ -692,8 +731,7 @@ static void update_dynentity(gamestate_t *state, dynentity_t *e, double dt) if (valid) { e->pos.x = nextx; e->pos.y = nexty; - - update_drawlist(e); + update_drawlist(e, &state->drawlist); } }