; SPDX-FileCopyrightText: 2023 Jummit
;
; SPDX-License-Identifier: GPL-3.0-or-later

(fn lerp [a b t speed]
  "Linearly interpolate between a and b. T is the time the lerp started"
  (+ a (* (- b a) (math.min 1 (/ (- (_G.time) (or t 0)) (or speed 100))))))

(fn move [entity x y]
  (set entity.move {:from-x entity.x :from-y entity.y :start (_G.time)})
  (set entity.x x)
  (set entity.y y))

(fn animate-movement [world]
  (each [_ entity (ipairs world)]
    (case entity
      {:move {: from-x : from-y : start} : x : y}
      (do
        (set entity.screen-x (lerp from-x x start))
        (set entity.screen-y (lerp from-y y start))))))

{: move : animate-movement}