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

(import "goal_src/jak1/import/bounceytarp-ag.gc")

;; definition of type springbox
(deftype springbox (process-drawable)
  ((spring-height meters  :offset-assert 176)
   (smush         float   :offset-assert 180)
   )
  :heap-base #x50
  :method-count-assert 20
  :size-assert         #xb8
  :flag-assert         #x14005000b8
  (:states
    bouncer-fire
    bouncer-smush
    bouncer-wait
    )
  )

;; definition for method 3 of type springbox
(defmethod inspect springbox ((obj springbox))
  (let ((t9-0 (method-of-type process-drawable inspect)))
    (t9-0 obj)
    )
  (format #t "~T~Tspring-height: (meters ~m)~%" (-> obj spring-height))
  (format #t "~T~Tsmush: ~f~%" (-> obj smush))
  obj
  )

;; failed to figure out what this is:
(method-set! springbox 12 (method-of-type process run-logic?))

;; failed to figure out what this is:
(defskelgroup *bouncer-sg* bounceytarp bounceytarp-lod0-jg bounceytarp-idle-ja
              ((bounceytarp-lod0-mg (meters 999999)))
              :bounds (static-spherem 0 0 0 4)
              )

;; failed to figure out what this is:
(defstate bouncer-wait (springbox)
  :event (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
    (case arg2
      (('bonk)
       (when (send-event arg0 'jump (-> self spring-height) (-> self spring-height) #f)
         (sound-play "trampoline")
         (go bouncer-fire)
         )
       )
      (('touch)
       (if (not (or (= (-> self next-state name) 'bouncer-smush) (= (-> self next-state name) 'bouncer-fire)))
           (go bouncer-smush)
           )
       )
      (('attack)
       (when (and (= (-> arg3 param 1) 'flop) (send-event arg0 'jump (-> self spring-height) (-> self spring-height) #f))
         (go bouncer-fire)
         #f
         )
       )
      )
    )
  :code (behavior ()
    (ja :group! (-> self draw art-group data 2) :num! min)
    (transform-post)
    (loop
      (logior! (-> self mask) (process-mask sleep))
      (suspend)
      )
    (none)
    )
  )

;; failed to figure out what this is:
(defstate bouncer-smush (springbox)
  :event (behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
    (case arg2
      (('touch)
       (set! (-> self state-time) (-> *display* base-frame-counter))
       #f
       )
      (else
        ((-> bouncer-wait event) arg0 arg1 arg2 arg3)
        )
      )
    )
  :code (behavior ()
    (set! (-> self state-time) (-> *display* base-frame-counter))
    (set! (-> self smush) 0.0)
    (loop
      (if (>= (- (-> *display* base-frame-counter) (-> self state-time)) (seconds 0.2))
          (ja :num! (seek! 0.0 0.1))
          (ja :num! (seek!
                      (lerp-scale
                        (ja-aframe 6.0 0)
                        (ja-aframe 2.0 0)
                        (vector-vector-xz-distance (target-pos 0) (-> self root trans))
                        0.0
                        4096.0
                        )
                      0.2
                      )
              )
          )
      (suspend)
      (if (ja-min? 0)
          (go bouncer-wait)
          )
      )
    (none)
    )
  :post (the-as (function none :behavior springbox) transform-post)
  )

;; failed to figure out what this is:
(defstate bouncer-fire (springbox)
  :code (behavior ()
    (cpad-set-buzz! (-> *cpad-list* cpads 0) 1 178 (seconds 0.1))
    (ja-no-eval :group! (-> self draw art-group data 2) :num! (seek!) :frame-num (ja-aframe 6.0 0))
    (until (ja-done? 0)
      (suspend)
      (ja :num! (seek!))
      )
    (go bouncer-wait)
    (none)
    )
  :post (the-as (function none :behavior springbox) transform-post)
  )

;; definition for method 11 of type springbox
;; INFO: Return type mismatch object vs none.
(defmethod init-from-entity! springbox ((obj springbox) (arg0 entity-actor))
  (let ((s4-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
    (set! (-> s4-0 dynam) (copy *standard-dynamics* 'process))
    (set! (-> s4-0 reaction) default-collision-reaction)
    (set! (-> s4-0 no-reaction)
          (the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
          )
    (let ((s3-0 (new 'process 'collide-shape-prim-mesh s4-0 (the-as uint 0) (the-as uint 0))))
      (set! (-> s3-0 prim-core collide-as) (collide-kind crate))
      (set! (-> s3-0 collide-with) (collide-kind target))
      (set! (-> s3-0 prim-core action) (collide-action solid))
      (set! (-> s3-0 prim-core offense) (collide-offense indestructible))
      (set! (-> s3-0 transform-index) 0)
      (set-vector! (-> s3-0 local-sphere) 0.0 3072.0 0.0 6963.2)
      (set-root-prim! s4-0 s3-0)
      )
    (set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
    (backup-collide-with-as s4-0)
    (set! (-> obj root) s4-0)
    )
  (process-drawable-from-entity! obj arg0)
  (initialize-skeleton obj *bouncer-sg* '())
  (nav-mesh-connect obj (-> obj root) (the-as nav-control #f))
  (set! (-> obj spring-height) (res-lump-float arg0 'spring-height :default 45056.0))
  (go bouncer-wait)
  (none)
  )
