jak-project/goal_src/levels/swamp/swamp-bat.gc
ManDude 80a002f8c0
[decomp] entity birth (#964)
* make birthing work

* fix float representation on defskelgroup

* test

* update

* debugger improvements & dont upload aux sprites

* ?

* fix progress

* fixes

* fixes

* Create bea.gd

* fix test

* fix xmm reg clobbering in kernel (water)

* cleanup cam-start

* clear gamepad state every frame

* allow controller connects and disconnects while running
2021-11-15 19:05:28 -05:00

980 lines
26 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: swamp-bat.gc
;; name in dgo: swamp-bat
;; dgos: L1, SWA
(declare-type swamp-bat-slave process-drawable)
(define-extern swamp-bat-slave-idle (state swamp-bat-slave)) ;; unknown type
(define-extern swamp-bat-slave-return (state swamp-bat-slave)) ;; unknown type
(define-extern swamp-bat-slave-strafe (state swamp-bat-slave)) ;; unknown type
(define-extern swamp-bat-slave-swoop (state swamp-bat-slave)) ;; unknown type
(define-extern swamp-bat-slave-die (state handle swamp-bat-slave)) ;; unknown type
(define-extern swamp-bat-slave-launch (state swamp-bat-slave)) ;; unknown type
(declare-type swamp-bat process-drawable)
(define-extern swamp-bat-idle (state swamp-bat)) ;; unknown type
(define-extern swamp-bat-launch-slaves (state swamp-bat)) ;; unknown type
;; DECOMP BEGINS
(deftype swamp-bat-idle-path (structure)
((origin vector :inline :offset-assert 0)
(x-axis vector :inline :offset-assert 16)
(y-axis vector :inline :offset-assert 32)
)
:method-count-assert 10
:size-assert #x30
:flag-assert #xa00000030
(:methods
(TODO-RENAME-9 (_type_ vector float) vector 9)
)
)
(defmethod
TODO-RENAME-9
swamp-bat-idle-path
((obj swamp-bat-idle-path) (arg0 vector) (arg1 float))
(let ((f30-0 (* 65536.0 arg1)))
(set! (-> arg0 quad) (-> obj origin quad))
(vector+*! arg0 arg0 (-> obj x-axis) (cos f30-0))
(vector+*! arg0 arg0 (-> obj y-axis) (sin f30-0))
)
arg0
)
(deftype swamp-bat (process-drawable)
((child-process (pointer swamp-bat-slave) :offset 20)
(root-override collide-shape :offset 112)
(fact-override fact-info-enemy :offset 144)
(path-origin vector :inline :offset-assert 176)
(idle-position-angle float 8 :offset-assert 192)
(path-select-plane plane 2 :inline :offset-assert 224)
(path-list curve-control 2 :offset-assert 256)
(path-select int8 :offset-assert 264)
(slave-count int8 :offset-assert 265)
(path-count int8 :offset-assert 266)
)
:heap-base #xa0
:method-count-assert 20
:size-assert #x10b
:flag-assert #x1400a0010b
)
(defmethod relocate swamp-bat ((obj swamp-bat) (arg0 int))
(dotimes (v1-0 2)
(if (nonzero? (-> obj path-list v1-0))
(&+! (-> obj path-list v1-0) arg0)
)
)
(the-as
swamp-bat
((the-as
(function process-drawable int process-drawable)
(find-parent-method swamp-bat 7)
)
obj
arg0
)
)
)
(deftype swamp-bat-slave (process-drawable)
((parent-process (pointer swamp-bat) :offset 12)
(root-override collide-shape-moving :offset 112)
(sync sync-info :inline :offset-assert 176)
(idle-anim-speed float :offset-assert 184)
(strafe-envelope float :offset-assert 188)
(strafe-distance float :offset-assert 192)
(path-point-count float :offset-assert 196)
(idle-path swamp-bat-idle-path :inline :offset-assert 208)
(idle-position vector :inline :offset-assert 256)
(idle-position-index int8 :offset-assert 272)
(path-select int8 :offset-assert 273)
(launch-ready symbol :offset-assert 276)
)
:heap-base #xb0
:method-count-assert 21
:size-assert #x118
:flag-assert #x1500b00118
(:methods
(dummy-20 (_type_) float 20)
)
)
(defbehavior
swamp-bat-slave-event-handler swamp-bat-slave
((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(case arg2
(('attack)
(logclear! (-> self mask) (process-mask actor-pause))
(go swamp-bat-slave-die (process->handle arg0))
)
(('touch)
(level-hint-spawn
(game-text-id swamp-bats-hint)
"sksp0156"
(the-as entity #f)
*entity-pool*
(game-task none)
)
(send-event arg0 'attack (-> arg3 param 0) (new 'static 'attack-info))
)
(('launch)
(if (-> self launch-ready)
(go swamp-bat-slave-launch)
)
)
)
)
swamp-bat-slave-event-handler
(defbehavior swamp-bat-slave-post swamp-bat-slave ()
(transform-post)
)
(defmethod dummy-20 swamp-bat-slave ((obj swamp-bat-slave))
(* (get-current-phase (-> obj sync)) (-> obj path-point-count))
)
(defbehavior swamp-bat-slave-path-post swamp-bat-slave ()
(let ((s2-0 (-> self parent-process 0 path-list (-> self path-select)))
(s5-0 (new-stack-vector0))
(gp-0 (new-stack-vector0))
(s4-0 (new-stack-vector0))
(f30-0 (dummy-20 self))
(s3-0 (new 'static 'vector :y 1.0 :w 1.0))
)
(eval-path-curve-div! s2-0 s5-0 f30-0 'interp)
(TODO-RENAME-12 s2-0 gp-0 f30-0)
(vector-cross! s4-0 gp-0 s3-0)
(vector-normalize! s4-0 1.0)
(let
((f0-4
(fmax
(fmin
(- (vector-dot (target-pos 0) s4-0) (vector-dot s5-0 s4-0))
(-> self strafe-envelope)
)
(- (-> self strafe-envelope))
)
)
)
(set!
(-> self strafe-distance)
(seek
(-> self strafe-distance)
f0-4
(* 20480.0 (-> *display* seconds-per-frame))
)
)
)
(vector-float*! s4-0 s4-0 (-> self strafe-distance))
(vector+! (-> self root-override trans) s5-0 s4-0)
(forward-up->quaternion (-> self root-override quat) gp-0 s3-0)
)
(swamp-bat-slave-post)
)
(defskelgroup *swamp-bat-slave-sg* swamp-bat
0
4
((1 (meters 20)) (2 (meters 40)) (3 (meters 999999)))
:bounds (static-spherem 0 0 0 2.5)
:longest-edge (meters 0)
)
(defbehavior swamp-bat-slave-get-new-path swamp-bat-slave ()
(set! (-> self path-select) (-> self parent-process 0 path-select))
(set!
(-> self idle-path origin quad)
(-> self parent-process 0 path-origin quad)
)
(let*
((f28-0
(->
self
parent-process
0
idle-position-angle
(-> self idle-position-index)
)
)
(f30-0 (cos f28-0))
(f26-0 (sin f28-0))
(f28-1 (cos 8192.0))
)
(let ((f0-0 (sin 8192.0)))
(set! (-> self idle-path x-axis x) (* 12288.0 f30-0))
(set! (-> self idle-path x-axis y) 0.0)
(set! (-> self idle-path x-axis z) (* 12288.0 f26-0))
(set! (-> self idle-path x-axis w) 1.0)
(set! (-> self idle-path y-axis x) (* -12288.0 f26-0 f28-1))
(set! (-> self idle-path y-axis y) (* 12288.0 f0-0))
)
(set! (-> self idle-path y-axis z) (* 12288.0 f30-0 f28-1))
)
(set! (-> self idle-path y-axis w) 1.0)
(vector+!
(-> self idle-position)
(the-as vector (-> self idle-path))
(-> self idle-path x-axis)
)
(let
((f0-8
(the
float
(+
(->
self
parent-process
0
path-list
(-> self path-select)
curve
num-cverts
)
-1
)
)
)
)
(set! (-> self path-point-count) f0-8)
f0-8
)
)
(defstate swamp-bat-slave-idle (swamp-bat-slave)
:event
swamp-bat-slave-event-handler
:code
(behavior ()
(set! (-> self state-time) (-> *display* base-frame-counter))
(set! (-> self launch-ready) #f)
(ja-channel-push! 1 49)
(let ((v1-4 (-> self skel root-channel 0)))
(set!
(-> v1-4 frame-group)
(the-as art-joint-anim (-> self draw art-group data 4))
)
)
(let ((s5-0 (new 'stack-no-clear 'vector)))
(set! (-> s5-0 quad) (-> self root-override trans quad))
(let
((s4-0
(quaternion-copy!
(new 'stack-no-clear 'quaternion)
(-> self root-override quat)
)
)
(gp-0 (new-stack-quaternion0))
)
(let
((s2-0
(TODO-RENAME-12
(-> self parent-process 0 path-list (-> self path-select))
(new 'stack-no-clear 'vector)
0.1
)
)
)
0
(let* ((f0-0 300.0)
(f1-0 32768.0)
(s3-0
(the
int
(*
f0-0
(/ 1.0 f1-0)
(vector-vector-distance s5-0 (-> self idle-position))
)
)
)
)
(forward-up->quaternion gp-0 s2-0 (new 'static 'vector :y 1.0 :w 1.0))
(while #t
(let
((v1-17 (- (-> *display* base-frame-counter) (-> self state-time))))
(when (>= v1-17 s3-0)
0
(goto cfg-10)
)
(let ((f30-1 (/ (the float v1-17) (the float s3-0))))
(when *run-time-assert-enable*
(set-pos
*__private-assert-info*
"swamp-bat"
(the-as uint 283)
(the-as uint 20)
)
(__assert (< f30-1 1.0) "(< interp 1.0)")
)
(vector-lerp!
(-> self root-override trans)
s5-0
(-> self idle-position)
f30-1
)
(quaternion-slerp! (-> self root-override quat) s4-0 gp-0 f30-1)
)
)
(let ((a0-16 (-> self skel root-channel 0)))
(set! (-> a0-16 param 0) (-> self idle-anim-speed))
(joint-control-channel-group-eval!
a0-16
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
0
)
)
)
(label cfg-10)
(set! (-> self root-override trans quad) (-> self idle-position quad))
(quaternion-copy! (-> self root-override quat) gp-0)
)
)
(set! (-> self launch-ready) #t)
(logior! (-> self mask) (process-mask actor-pause))
(let ((f30-2 0.0))
(while #t
(let ((f26-0 (cos f30-2))
(f28-0 (sin f30-2))
)
(set! (-> self root-override trans quad) (-> self idle-path origin quad))
(vector+*!
(-> self root-override trans)
(-> self root-override trans)
(-> self idle-path x-axis)
f26-0
)
(vector+*!
(-> self root-override trans)
(-> self root-override trans)
(-> self idle-path y-axis)
f28-0
)
)
(let ((a0-26 (-> self skel root-channel 0)))
(set! (-> a0-26 param 0) (-> self idle-anim-speed))
(joint-control-channel-group-eval!
a0-26
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
(+!
f30-2
(* 32768.0 (-> *display* seconds-per-frame) (-> self idle-anim-speed))
)
)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-post)
)
(defstate swamp-bat-slave-launch (swamp-bat-slave)
:event
swamp-bat-slave-event-handler
:code
(behavior ()
(set! (-> self state-time) (-> *display* base-frame-counter))
(set! (-> self launch-ready) #f)
(ja-channel-push! 1 30)
(let ((gp-0 (new-stack-vector0)))
(set! (-> gp-0 quad) (-> self root-override trans quad))
(let ((s5-0 (new-stack-vector0)))
(eval-path-curve-div!
(-> self parent-process 0 path-list (-> self path-select))
s5-0
0.0
'interp
)
(let ((v1-12 (-> self skel root-channel 0)))
(set!
(-> v1-12 frame-group)
(the-as art-joint-anim (-> self draw art-group data 4))
)
)
(while #t
(let ((s4-0 (- (-> *display* base-frame-counter) (-> self state-time))))
(if (>= s4-0 90)
(go swamp-bat-slave-swoop)
)
(let ((f0-1 (* 0.011111111 (the float s4-0))))
(vector-lerp! (-> self root-override trans) gp-0 s5-0 f0-1)
)
)
(let ((a0-9 (-> self skel root-channel 0)))
(set! (-> a0-9 param 0) (-> self idle-anim-speed))
(joint-control-channel-group-eval!
a0-9
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
0
)
)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-post)
)
(defstate swamp-bat-slave-swoop (swamp-bat-slave)
:event
swamp-bat-slave-event-handler
:code
(behavior ()
(set! (-> self strafe-envelope) 0.0)
(ja-channel-push! 1 30)
(let ((gp-0 (-> self skel root-channel 0)))
(joint-control-channel-group-eval!
gp-0
(the-as art-joint-anim (-> self draw art-group data 5))
num-func-identity
)
(set! (-> gp-0 frame-num) 0.0)
)
(until (ja-done? 0)
(if (< (ja-aframe-num 0) 10.0)
(sync-now! (-> self sync) 0.0)
)
(suspend)
(let ((a0-4 (-> self skel root-channel 0)))
(set!
(-> a0-4 param 0)
(the float (+ (-> a0-4 frame-group data 0 length) -1))
)
(set! (-> a0-4 param 1) 1.0)
(joint-control-channel-group-eval!
a0-4
(the-as art-joint-anim #f)
num-func-seek!
)
)
)
(set! (-> self strafe-envelope) 20480.0)
(ja-channel-push! 1 30)
(let ((v1-18 (-> self skel root-channel 0)))
(set!
(-> v1-18 frame-group)
(the-as art-joint-anim (-> self draw art-group data 6))
)
)
(while #t
(if (>= (dummy-20 self) 2.0)
(go swamp-bat-slave-strafe)
)
(let ((a0-11 (-> self skel root-channel 0)))
(set! (-> a0-11 param 0) 1.0)
(joint-control-channel-group-eval!
a0-11
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-path-post)
)
(defstate swamp-bat-slave-strafe (swamp-bat-slave)
:event
swamp-bat-slave-event-handler
:code
(behavior ()
(set! (-> self strafe-envelope) 20480.0)
(ja-channel-push! 1 30)
(let ((v1-2 (-> self skel root-channel 0)))
(set!
(-> v1-2 frame-group)
(the-as art-joint-anim (-> self draw art-group data 7))
)
)
(while #t
(if (>= (dummy-20 self) 6.0)
(go swamp-bat-slave-return)
)
(let ((a0-5 (-> self skel root-channel 0)))
(set! (-> a0-5 param 0) 1.0)
(joint-control-channel-group-eval!
a0-5
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-path-post)
)
(defstate swamp-bat-slave-return (swamp-bat-slave)
:event
swamp-bat-slave-event-handler
:code
(behavior ()
(set! (-> self strafe-envelope) 0.0)
(ja-channel-push! 1 22)
(let ((v1-2 (-> self skel root-channel 0)))
(set!
(-> v1-2 frame-group)
(the-as art-joint-anim (-> self draw art-group data 7))
)
)
(let ((f30-0 (+ -1.0 (-> self path-point-count)))
(gp-0 #t)
)
(while #t
(let ((f28-0 (dummy-20 self)))
(if (>= f28-0 f30-0)
(go swamp-bat-slave-idle)
)
(when (and gp-0 (>= f28-0 7.0) (< f28-0 8.0))
(set! gp-0 #f)
(when (!= (-> self path-select) (-> self parent-process 0 path-select))
(swamp-bat-slave-get-new-path)
(go swamp-bat-slave-idle)
)
)
)
(let ((a0-6 (-> self skel root-channel 0)))
(set! (-> a0-6 param 0) 1.0)
(joint-control-channel-group-eval!
a0-6
(the-as art-joint-anim #f)
num-func-loop!
)
)
(suspend)
)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-path-post)
)
(defstate swamp-bat-slave-die (swamp-bat-slave)
:event
(the-as
(function process int symbol event-message-block object :behavior swamp-bat-slave)
process-drawable-death-event-handler
)
:code
(behavior ((arg0 handle))
(ja-channel-push! 1 21)
(let ((gp-0 (new-stack-vector0)))
(let ((v1-1 (handle->process arg0)))
(if v1-1
(vector-!
gp-0
(-> self root-override trans)
(-> (the-as swamp-bat v1-1) root-override trans)
)
)
)
(set! (-> gp-0 y) (+ -6144.0 (-> gp-0 y)))
(vector-normalize! gp-0 98304.0)
(let ((v1-8 (-> self skel root-channel 0)))
(set!
(-> v1-8 frame-group)
(the-as art-joint-anim (-> self draw art-group data 8))
)
)
(until (ja-done? 0)
(vector-v++! (-> self root-override trans) gp-0)
(let ((a0-12 (-> self skel root-channel 0)))
(set!
(-> a0-12 param 0)
(the float (+ (-> a0-12 frame-group data 0 length) -1))
)
(set! (-> a0-12 param 1) 0.5)
(joint-control-channel-group-eval!
a0-12
(the-as art-joint-anim #f)
num-func-seek!
)
)
(suspend)
)
)
(dummy-18 self)
(none)
)
:post
(the-as (function none :behavior swamp-bat-slave) swamp-bat-slave-post)
)
(defbehavior
swamp-bat-slave-init-by-other swamp-bat-slave
((arg0 swamp-bat-slave) (arg1 int))
(set! (-> self mask) (logior (process-mask enemy) (-> self mask)))
(let
((s4-0
(new
'process
'collide-shape-moving
self
(collide-list-enum usually-hit-by-player)
)
)
)
(set! (-> s4-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s4-0 reaction) default-collision-reaction)
(set! (-> s4-0 no-reaction) nothing)
(let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 1) 0)))
(set! (-> s3-0 prim-core collide-as) (the-as uint 256))
(set! (-> s3-0 collide-with) (the-as uint 16))
(set! (-> s3-0 prim-core action) (the-as uint 1))
(set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 6144.0)
(dummy-46 s4-0)
(let ((s2-0 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-0 prim-core collide-as) (the-as uint 256))
(set! (-> s2-0 collide-with) (the-as uint 16))
(set! (-> s2-0 prim-core action) (the-as uint 1))
(set! (-> s2-0 prim-core offense) 4)
(set! (-> s2-0 transform-index) 3)
(set-vector! (-> s2-0 local-sphere) 0.0 0.0 0.0 4096.0)
)
(dummy-28 s3-0)
)
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
(dummy-50 s4-0)
(set! (-> self root-override) s4-0)
)
(set! (-> self root-override trans quad) (-> arg0 root-override trans quad))
(set!
(-> self root-override quat vec quad)
(-> arg0 root-override quat vec quad)
)
(vector-float*! (-> self root-override scale) *identity-vector* 2.0)
(set! (-> self root-override pause-adjust-distance) 286720.0)
(set!
(-> self fact)
(new
'process
'fact-info-enemy
self
(pickup-type eco-pill-random)
(-> *FACT-bank* default-pill-inc)
)
)
(set! (-> self idle-anim-speed) (rand-vu-float-range 0.9 1.1))
(set! (-> self strafe-distance) 0.0)
(set! (-> self strafe-envelope) 0.0)
(set! (-> self idle-position-index) arg1)
(swamp-bat-slave-get-new-path)
(set! (-> self root-override trans quad) (-> self idle-position quad))
(setup-params! (-> self sync) (the-as uint 1200) 0.0 0.15 0.15)
(initialize-skeleton self *swamp-bat-slave-sg* '())
(logclear! (-> self mask) (process-mask actor-pause))
(go swamp-bat-slave-idle)
(none)
)
(defbehavior swamp-bat-setup-new-path swamp-bat ((arg0 int))
(when *run-time-assert-enable*
(set-pos
*__private-assert-info*
"swamp-bat"
(the-as uint 520)
(the-as uint 2)
)
(__assert-zero-lim-range-int
arg0
(-> self path-count)
"path-index"
"(-> self path-count)"
)
)
(when (< 0.0 (the float (+ (-> self path-list arg0 curve num-cverts) -1)))
(set! (-> self path-select) arg0)
(let ((f30-0 0.0)
(f28-0 (/ 65536.0 (the float (-> self slave-count))))
)
(eval-path-curve-div!
(-> self path-list arg0)
(-> self path-origin)
0.0
'interp
)
(dotimes (v1-16 (-> self slave-count))
(set! (-> self idle-position-angle v1-16) f30-0)
(+! f30-0 f28-0)
)
)
#f
)
)
(defbehavior swamp-bat-make-path-select-plane swamp-bat ((arg0 int))
(when *run-time-assert-enable*
(set-pos
*__private-assert-info*
"swamp-bat"
(the-as uint 538)
(the-as uint 2)
)
(__assert-zero-lim-range-int
arg0
(-> self path-count)
"path-index"
"(-> self path-count)"
)
)
(let* ((s5-0 (-> self path-list arg0))
(gp-1 (TODO-RENAME-12 s5-0 (-> self path-select-plane arg0) 5.0))
(s5-1
(eval-path-curve-div! s5-0 (new 'stack-no-clear 'vector) 5.0 'interp)
)
)
(set! (-> gp-1 y) 0.0)
(vector-normalize! gp-1 1.0)
(let ((f0-3 (- (vector-dot s5-1 gp-1))))
(set! (-> gp-1 w) f0-3)
f0-3
)
)
)
(defbehavior swamp-bat-update-path swamp-bat ()
(dotimes (gp-0 (-> self path-count))
(when (!= (-> self path-select) gp-0)
(let* ((s5-0 (-> self path-select-plane gp-0))
(f0-2
(+ (vector-dot (target-pos 0) (the-as vector s5-0)) (-> s5-0 w))
)
)
(if (< 0.0 f0-2)
(swamp-bat-setup-new-path gp-0)
)
)
)
)
(none)
)
(defbehavior swamp-bat-debug swamp-bat ()
0
(none)
)
(defbehavior swamp-bat-check-slave-paths-match? swamp-bat ((arg0 int))
(let ((v1-0 (the-as (pointer process-tree) (-> self child-process))))
(while v1-0
(if
(and
(-> (the-as swamp-bat-slave (-> v1-0 0)) launch-ready)
(!= (-> (the-as swamp-bat-slave (-> v1-0 0)) path-select) arg0)
)
(return #f)
)
(set! v1-0 (-> v1-0 0 brother))
)
)
#t
)
(defstate swamp-bat-idle (swamp-bat)
:trans
swamp-bat-debug
:code
(behavior ()
(when (zero? (-> self path-count))
(process-entity-status! self (entity-perm-status dead) #t)
(deactivate self)
)
(while #t
(when
(and
(>= (- (-> *display* base-frame-counter) (-> self state-time)) 60)
*target*
(>=
(-> self fact-override idle-distance)
(vector-vector-distance
(-> self root-override trans)
(-> *target* control trans)
)
)
)
(when (not (-> self child-process))
(process-entity-status! self (entity-perm-status dead) #t)
(deactivate self)
)
(swamp-bat-update-path)
(let ((s5-0 (method-of-object (-> self vol) dummy-10)))
(target-pos 5)
(if
(or
(s5-0)
(not (swamp-bat-check-slave-paths-match? (-> self path-select)))
)
(go swamp-bat-launch-slaves)
)
)
)
(let ((gp-1 (new 'static 'matrix)))
(quaternion->matrix gp-1 (-> self root-override quat))
(set! (-> gp-1 vector 3 quad) (-> self root-override trans quad))
)
(suspend)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat) #f)
)
(defbehavior swamp-bat-launch-slave swamp-bat ()
(let ((gp-0 (the-as (pointer process-tree) (-> self child-process)))
(v0-0 (the-as object #f))
)
(while (and gp-0 (not v0-0))
(let ((a1-0 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-0 from) self)
(set! (-> a1-0 num-params) 0)
(set! (-> a1-0 message) 'launch)
(set! v0-0 (send-event-function (ppointer->process gp-0) a1-0))
)
(set! gp-0 (-> gp-0 0 brother))
)
v0-0
)
)
(defstate swamp-bat-launch-slaves (swamp-bat)
:trans
swamp-bat-debug
:code
(behavior ()
(set! (-> self state-time) (-> *display* base-frame-counter))
(while #t
(swamp-bat-update-path)
(when (>= (- (-> *display* base-frame-counter) (-> self state-time)) 150)
(set! (-> self state-time) (-> *display* base-frame-counter))
(if (not (swamp-bat-launch-slave))
(go swamp-bat-idle)
)
)
(suspend)
)
(none)
)
:post
(the-as (function none :behavior swamp-bat) #f)
)
(defmethod init-from-entity! swamp-bat ((obj swamp-bat) (arg0 entity-actor))
(let
((s4-0 (new 'process 'collide-shape obj (collide-list-enum hit-by-player))))
(set-vector!
(->
(new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))
local-sphere
)
0.0
0.0
0.0
0.0
)
(dummy-46 s4-0)
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
(dummy-50 s4-0)
(set! (-> obj root-override) s4-0)
)
(process-drawable-from-entity! obj arg0)
(logclear! (-> obj mask) (process-mask actor-pause))
(set! (-> obj mask) (logior (process-mask enemy) (-> obj mask)))
(set! (-> obj vol) (new 'process 'vol-control obj))
(logior! (-> obj vol flags) 3)
(set!
(-> obj path-list 0)
(new 'process 'curve-control obj 'path -1000000000.0)
)
(set!
(-> obj path-list 1)
(new 'process 'curve-control obj 'pathb -1000000000.0)
)
(logior!
(-> obj path-list 0 flags)
(path-control-flag display draw-line draw-point draw-text)
)
(logior!
(-> obj path-list 1 flags)
(path-control-flag display draw-line draw-point draw-text)
)
(set! (-> obj path-count) 0)
(when (< 0.0 (the float (+ (-> obj path-list 0 curve num-cverts) -1)))
(+! (-> obj path-count) 1)
(swamp-bat-make-path-select-plane 0)
)
(when (< 0.0 (the float (+ (-> obj path-list 1 curve num-cverts) -1)))
(+! (-> obj path-count) 1)
(swamp-bat-make-path-select-plane 1)
)
(if (!= (-> obj path-count) 2)
(go process-drawable-art-error "need 2 paths")
)
(set!
(-> obj fact-override)
(new
'process
'fact-info-enemy
obj
(pickup-type eco-pill-random)
(-> *FACT-bank* default-pill-inc)
)
)
(let
((a1-10
(res-lump-value arg0 'num-lurkers uint128 :default (the-as uint128 6))
)
)
(set! (-> obj slave-count) (max 2 (min 8 (the-as int a1-10))))
)
(swamp-bat-setup-new-path 0)
(swamp-bat-update-path)
(dotimes (s5-1 (-> obj slave-count))
(let ((s4-1 (get-process *default-dead-pool* swamp-bat-slave 4512)))
(when s4-1
(let ((t9-16 (method-of-type swamp-bat-slave activate)))
(t9-16
(the-as swamp-bat-slave s4-1)
obj
'swamp-bat-slave
(the-as pointer #x70004000)
)
)
(run-now-in-process s4-1 swamp-bat-slave-init-by-other obj s5-1)
(-> s4-1 ppointer)
)
)
)
(go swamp-bat-idle)
(none)
)