From 0b98ee540df15601f36a0463a8a6ceeef7289190 Mon Sep 17 00:00:00 2001 From: Kistaro Windrider Date: Sat, 5 Jul 2025 20:18:31 -0700 Subject: [PATCH] segment prototype --- vacuum_gambit.p8 | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/vacuum_gambit.p8 b/vacuum_gambit.p8 index fd34f27..a459dd3 100644 --- a/vacuum_gambit.p8 +++ b/vacuum_gambit.p8 @@ -665,6 +665,85 @@ function destination:target_from(fx, fy) return rx, ry end +segment = mknew{ + -- On loop, where to set index? + loop_idx = 1, + -- current index + current_idx = 1, + -- how long does this segment + -- last? 0 is erroneous, + -- positive values are a frame + -- count, negative values are + -- a number of loops. + limit = -1, + + -- remain: remaining steps until end + -- prev_x, prev_y: stored previous + -- location to figure out + -- approach/depart + -- dest_x, dest_y: stored + -- current destination to + -- figure out approach/depart + -- [1..n]: destinations + init = function(x) + x.remain = x.limit + end +} + +function segment:reset() + self.current_idx = 1 + self.remain = self.limit + self.prev_x = nil + self.prev_y = nil + self.was_approaching = false +end + +function segment:target_from(fx, fy) + local rx, ry = self[self.current_idx]:target_from(fx, fy) + self.dest_x, self.dest_y = rx, ry + return rx, ry +end + +function segment:update(x, y) + local rem = self.remain + -- frame check + if (rem > 0) rem -= 1 + + if self:should_step(x, y) then + if self.current_idx == #self then + self.current_idx = self.loop_idx + if (rem < 0) rem += 1 + else + self.current_idx += 1 + end + end + self.remain = rem + return rem != 0 +end + +function segment:should_step(x, y) + local dest_x, dest_y, ret = self.dest_x, self.dest_y, false + local dx1, dy1 = x - dest_x, y-dest_y + if abs(dx1) <= 4 and abs(dy1) <= 4 then + self.was_approaching = false + ret = true + end + if self.prev_x then + local dx0, dy0 = dest_x = self.prev_x - dest_x, self.prev_y - dest_y + if dx1 * dx1 + dy1 * dy1 > dx0 * dx0 + dy0 * dy0 then + if self.was_approaching then + self.was_approaching = false + ret = true + end + else + self.was_approaching = true + end + end + self.prev_x, self.prev_y = x, y + return ret +end + + -->8 -- bullet and gun behaviors