;;-*-Lisp-*-
(in-package goal)
(bundles "ENGINE.CGO" "GAME.CGO")
(require "engine/gfx/sprite/sparticle/sparticle-launcher.gc")
(require "engine/debug/debug.gc")
(#when PC_PORT
  (define *part-tester-id* 105))

;; DECOMP BEGINS

;; this file is debug only
(declare-file (debug))

(defpartgroup group-part-tester
  :id 105
  :bounds (static-bspherem 0 0 0 1)
  :parts ((sp-item 56) (sp-item 57)))

(deftype part-tester (process)
  ((root      trsqv)
   (part      sparticle-launch-control)
   (old-group sparticle-launch-group))
  :heap-base #x100)

(define-extern *part-tester* part-tester)

(define *part-tester-name* (the-as string #f))

(defmethod deactivate ((this part-tester))
  (if (nonzero? (-> this part)) (kill-and-free-particles (-> this part)))
  ((method-of-type process deactivate) this)
  (none))

(defstate part-tester-idle (part-tester)
  :code
    (behavior ()
      (loop
        (let ((gp-0 (entity-by-name *part-tester-name*)))
          (when gp-0
            (let ((s5-0 (-> gp-0 extra process)))
              (if (and s5-0 (type-type? (-> s5-0 type) process-drawable) (nonzero? (-> (the-as process-drawable s5-0) root)))
                (set! (-> self root trans quad) (-> (the-as process-drawable s5-0) root trans quad))
                (set! (-> self root trans quad) (-> gp-0 extra trans quad))))))
        (add-debug-x #t
                     (bucket-id debug-no-zbuf)
                     (-> self root trans)
                     (the-as rgba (new 'static 'rgba :r #xff :g #xff :b #xff :a #x80)))
        ;; og:preserve-this
        ;; change this line to change the particle group to test
        ;; notes:
        ;;  - particles that use aux list won't work (warp parts)
        ;;  - some particles may have callbacks that won't work yet
        (let ((gp-1 (-> *part-group-id-table* 105)))
          (#when PC_PORT
            (if (nonzero? (-> *part-group-id-table* *part-tester-id*)) (set! gp-1 (-> *part-group-id-table* *part-tester-id*))))
          (let ((s5-1 (-> self root trans)))
            (when (!= gp-1 (-> self old-group))
              (when (nonzero? (-> self part))
                (kill-and-free-particles (-> self part))
                (set! (-> self heap-cur) (&-> (-> self part) type)))
              (set! (-> self part) (create-launch-control gp-1 self)))
            (if (nonzero? (-> self part))
              (spawn (-> self part)
                     (cond
                       ((logtest? (-> gp-1 flags) (sp-group-flag screen-space)) *zero-vector*)
                       (else (empty) s5-1)))))
          (set! (-> self old-group) gp-1))
        (suspend))))

(defbehavior part-tester-init-by-other process-drawable ((arg0 vector))
  (set! (-> self root) (new 'process 'trsqv))
  (set! (-> self root trans quad) (-> arg0 quad))
  (set! *part-tester* (the-as part-tester (process->ppointer self)))
  (go part-tester-idle)
  (none))

(define-perm *debug-part-dead-pool* dead-pool (new 'debug 'dead-pool 1 #x10000 '*debug-part-dead-pool*))

(defun start-part ()
  (kill-by-type part-tester *active-pool*)
  (process-spawn part-tester
                 (if *anim-tester* (-> *anim-tester* 0 root trans) (target-pos 0))
                 :from
                 *debug-part-dead-pool*)
  (none))
