;;-*-Lisp-*-
(in-package goal)

(import "goal_src/jak1/import/plat-eco-ag.gc")

;; definition of type plat-eco
(deftype plat-eco (plat)
  ((notice-dist      float           :offset-assert 264)
   (sync-offset-dest float           :offset-assert 268)
   (sync-offset-faux float           :offset-assert 272)
   (sync-linear-val  float           :offset-assert 276)
   (target           handle          :offset-assert 280)
   (unlit-look       lod-set :inline :offset-assert 288)
   (lit-look         lod-set :inline :offset-assert 324)
   )
  :heap-base #x100
  :method-count-assert 33
  :size-assert         #x165
  :flag-assert         #x2101000165
  (:methods
    (notice-blue (handle) _type_ :replace :state 29)
    )
  )

;; definition for method 3 of type plat-eco
(defmethod inspect plat-eco ((obj plat-eco))
  (let ((t9-0 (method-of-type plat inspect)))
    (t9-0 obj)
    )
  (format #t "~T~Tnotice-dist: ~f~%" (-> obj notice-dist))
  (format #t "~T~Tsync-offset-dest: ~f~%" (-> obj sync-offset-dest))
  (format #t "~T~Tsync-offset-faux: ~f~%" (-> obj sync-offset-faux))
  (format #t "~T~Tsync-linear-val: ~f~%" (-> obj sync-linear-val))
  (format #t "~T~Ttarget: ~D~%" (-> obj target))
  (format #t "~T~Tunlit-look: #<lod-set @ #x~X>~%" (-> obj unlit-look))
  (format #t "~T~Tlit-look: #<lod-set @ #x~X>~%" (-> obj lit-look))
  obj
  )

;; failed to figure out what this is:
(defskelgroup *plat-eco-unlit-sg* plat-eco plat-eco-lod0-jg plat-eco-idle-ja
              ((plat-eco-lod0-mg (meters 20)) (plat-eco-lod1-mg (meters 40)) (plat-eco-lod2-mg (meters 999999)))
              :bounds (static-spherem 0 0 0 3)
              )

;; failed to figure out what this is:
(defskelgroup *plat-eco-lit-sg* plat-eco plat-eco-lod0-jg plat-eco-idle-ja
              ((plat-eco-lit-lod0-mg (meters 20)) (plat-eco-lit-lod1-mg (meters 40)) (plat-eco-lit-lod2-mg (meters 999999)))
              :bounds (static-spherem 0 0 0 3)
              )

;; failed to figure out what this is:
(defstate plat-idle (plat-eco)
  :virtual #t
  :event (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
    (case arg2
      (('wake)
       (go-virtual plat-path-active (the-as plat #f))
       )
      (('eco-blue)
       (go-virtual notice-blue (process->handle arg0))
       )
      (('ridden 'edge-grabbed)
       (when (send-event *target* 'query 'powerup (pickup-type eco-blue))
         (send-to-all (-> self link) 'wake)
         (go-virtual plat-path-active (the-as plat #f))
         )
       )
      )
    )
  :enter (behavior ()
    (lods-assign! (-> self draw) (-> self unlit-look))
    (none)
    )
  :trans (behavior ()
    (when (and (and *target*
                    (>= (-> self notice-dist) (vector-vector-distance (-> self root-override trans) (-> *target* control trans)))
                    )
               (send-event *target* 'query 'powerup (pickup-type eco-blue))
               )
      (send-to-all (-> self link) 'wake)
      (go-virtual plat-path-active (the-as plat #f))
      )
    (if (and *target*
             (>= (-> self notice-dist) (vector-vector-distance (-> self root-override trans) (-> *target* control trans)))
             )
        (level-hint-spawn (game-text-id misty-eco-plat) "sksp0073" (the-as entity #f) *entity-pool* (game-task none))
        )
    (none)
    )
  :code (behavior ()
    (ja-post)
    (update-transforms! (-> self root-override))
    (anim-loop)
    (none)
    )
  :post (the-as (function none :behavior plat-eco) ja-post)
  )

;; failed to figure out what this is:
(defstate notice-blue (plat-eco)
  :virtual override
  :event (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
    (case arg2
      (('wake)
       (sound-play "blue-eco-on" :position (the-as symbol (-> self root-override trans)))
       (go-virtual plat-path-active (the-as plat #f))
       )
      (('ridden 'edge-grabbed)
       (when (send-event *target* 'query 'powerup (pickup-type eco-blue))
         (send-to-all (-> self link) 'wake)
         (go-virtual plat-path-active (the-as plat #f))
         )
       )
      )
    )
  :trans (behavior ()
    ((-> (method-of-object self plat-idle) trans))
    (let ((a1-0 (new 'stack-no-clear 'event-message-block)))
      (set! (-> a1-0 from) self)
      (set! (-> a1-0 num-params) 2)
      (set! (-> a1-0 message) 'query)
      (set! (-> a1-0 param 0) (the-as uint 'powerup))
      (set! (-> a1-0 param 1) (the-as uint 3))
      (if (and (not (send-event-function *target* a1-0))
               (begin (logior! (-> self mask) (process-mask sleep-code)) (not (-> self bouncing)))
               )
          (go-virtual plat-idle)
          )
      )
    (none)
    )
  :code (behavior ((arg0 handle))
    (set! (-> self target) arg0)
    (loop
      (let* ((gp-0 (handle->process (-> self target)))
             (v1-4 (if (and (nonzero? gp-0) (type-type? (-> gp-0 type) process-drawable))
                       gp-0
                       )
                   )
             )
        (when v1-4
          (let* ((gp-1 (-> (the-as process-drawable v1-4) root))
                 (v1-6 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
                           gp-1
                           )
                       )
                 )
            (when v1-6
              (let* ((s5-0 (-> self root-override root-prim prim-core))
                     (a1-3 (-> (the-as collide-shape v1-6) root-prim prim-core))
                     (f30-0 (vector-vector-distance (the-as vector s5-0) (the-as vector a1-3)))
                     )
                (when (rand-vu-percent? 0.5)
                  (let ((gp-2 (new 'stack-no-clear 'vector)))
                    (set! (-> gp-2 quad) (-> s5-0 world-sphere quad))
                    (dotimes (s5-1 3)
                      (+! (-> gp-2 data s5-1) (rand-vu-float-range -5324.8 5324.8))
                      )
                    (eco-blue-glow gp-2)
                    )
                  )
                (set! (-> self bouncing) #t)
                (activate!
                  (-> self smush)
                  (lerp-scale
                    (rand-vu-float-range 1.1 1.3)
                    (rand-vu-float-range 1.0 1.02)
                    f30-0
                    (-> *FACT-bank* suck-suck-dist)
                    (-> *FACT-bank* suck-bounce-dist)
                    )
                  60
                  60
                  1.0
                  1.0
                  )
                )
              )
            )
          )
        )
      (suspend)
      )
    (none)
    )
  :post (behavior ()
    (plat-trans)
    (plat-post)
    (none)
    )
  )

;; failed to figure out what this is:
(defstate plat-path-active (plat-eco)
  :virtual #t
  :enter (behavior ((arg0 plat))
    (lods-assign! (-> self draw) (-> self lit-look))
    (sync-now! (-> self sync) (-> self sync-linear-val))
    (set! (-> self sync-offset-faux) (-> self sync offset))
    (let* ((f0-3 (the float (-> self sync period)))
           (f1-1 (* 0.5 f0-3))
           )
      (if (< f1-1 (- (-> self sync-offset-dest) (-> self sync-offset-faux)))
          (+! (-> self sync-offset-faux) f0-3)
          )
      (if (< f1-1 (- (-> self sync-offset-faux) (-> self sync-offset-dest)))
          (set! (-> self sync-offset-faux) (- (-> self sync-offset-faux) f0-3))
          )
      )
    (cond
      (arg0
        (let ((f0-5 (-> self sync-offset-dest)))
          (set! (-> self sync offset) f0-5)
          (set! (-> self sync-offset-faux) f0-5)
          )
        )
      (else
        (process-entity-status! self (entity-perm-status complete) #t)
        (dotimes (gp-1 5)
          (spawn-projectile-blue *target*)
          )
        )
      )
    (none)
    )
  :trans (behavior ()
    (when (!= (-> self sync-offset-faux) (-> self sync-offset-dest))
      (seek! (-> self sync-offset-faux) (-> self sync-offset-dest) (* 12.0 (-> *display* seconds-per-frame)))
      (let* ((f0-7 (the float (-> self sync period)))
             (f1-3 (+ (-> self sync-offset-faux) f0-7))
             )
        (set! (-> self sync offset) (- f1-3 (* (the float (the int (/ f1-3 f0-7))) f0-7)))
        )
      )
    ((-> (method-of-type plat plat-path-active) trans))
    (none)
    )
  )

;; definition for method 24 of type plat-eco
;; INFO: Return type mismatch int vs none.
(defmethod dummy-24 plat-eco ((obj plat-eco))
  (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
    (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
    (set! (-> s5-0 reaction) default-collision-reaction)
    (set! (-> s5-0 no-reaction)
          (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
          )
    (alloc-riders s5-0 1)
    (let ((s4-0 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0))))
      (set! (-> s4-0 prim-core collide-as) (collide-kind ground-object blue-eco-suck))
      (set! (-> s4-0 collide-with) (collide-kind target))
      (set! (-> s4-0 prim-core action) (collide-action solid ca-1))
      (set! (-> s4-0 prim-core offense) (collide-offense indestructible))
      (set! (-> s4-0 transform-index) 0)
      (set-vector! (-> s4-0 local-sphere) 0.0 -1228.8 0.0 13926.4)
      (set-root-prim! s5-0 s4-0)
      )
    (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
    (backup-collide-with-as s5-0)
    (set! (-> obj root-override) s5-0)
    )
  0
  (none)
  )

;; definition for method 23 of type plat-eco
(defmethod get-unlit-skel plat-eco ((obj plat-eco))
  *plat-eco-unlit-sg*
  )

;; definition for method 27 of type plat-eco
(defmethod get-lit-skel plat-eco ((obj plat-eco))
  *plat-eco-lit-sg*
  )

;; definition for method 11 of type plat-eco
;; INFO: Return type mismatch object vs none.
(defmethod init-from-entity! plat-eco ((obj plat-eco) (arg0 entity-actor))
  (set! (-> obj mask) (logior (process-mask platform) (-> obj mask)))
  (set! (-> obj notice-dist) (res-lump-float arg0 'notice-dist :default -1.0))
  (set! (-> obj link) (new 'process 'actor-link-info obj))
  (dummy-24 obj)
  (process-drawable-from-entity! obj arg0)
  (let ((s4-0 (get-unlit-skel obj))
        (s5-1 (get-lit-skel obj))
        )
    (initialize-skeleton obj s4-0 '())
    (setup-lods! (-> obj unlit-look) s4-0 (-> obj draw art-group) (-> obj entity))
    (setup-lods! (-> obj lit-look) s5-1 (-> obj draw art-group) (-> obj entity))
    )
  (logclear! (-> obj mask) (process-mask actor-pause))
  (update-transforms! (-> obj root-override))
  (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 107) obj))
  (set! (-> obj path) (new 'process 'curve-control obj 'path -1000000000.0))
  (logior! (-> obj path flags) (path-control-flag display draw-line draw-point draw-text))
  (set! (-> obj fact)
        (new 'process 'fact-info obj (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc))
        )
  (load-params! (-> obj sync) obj (the-as uint 3000) 0.0 0.15 0.15)
  (set! (-> obj sync-offset-dest) (-> obj sync offset))
  (set! (-> obj sync-linear-val) (get-phase-offset (-> obj sync)))
  (sync-now! (-> obj sync) (-> obj sync-linear-val))
  (set! (-> obj sync-offset-faux) (-> obj sync offset))
  (set! (-> obj path-pos) (get-current-phase-with-mirror (-> obj sync)))
  (eval-path-curve! (-> obj path) (-> obj root-override trans) (-> obj path-pos) 'interp)
  (set! (-> obj sound-id) (new-sound-id))
  (dummy-26 obj)
  (dummy-21 obj)
  (if (or (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status complete)))
          (< (-> obj notice-dist) 0.0)
          )
      (go (method-of-object obj plat-path-active) (the-as plat #t))
      (go (method-of-object obj plat-idle))
      )
  (none)
  )
