jak-project/goal_src/jak1/levels/jungle/junglesnake.gc
Tyler Wilding d1ece445d4
Dependency graph work - Part 1 - Preliminary work (#3505)
Relates to #1353 

This adds no new functionality or overhead to the compiler, yet. This is
the preliminary work that has:
- added code to the compiler in several spots to flag when something is
used without being properly required/imported/whatever (disabled by
default)
- that was used to generate project wide file dependencies (some
circulars were manually fixed)
- then that graph underwent a transitive reduction and the result was
written to all `jak1` source files.

The next step will be making this actually produce and use a dependency
graph. Some of the reasons why I'm working on this:
- eliminates more `game.gp` boilerplate. This includes the `.gd` files
to some extent (`*-ag` files and `tpage` files will still need to be
handled) this is the point of the new `bundles` form. This should make
it even easier to add a new file into the source tree.
- a build order that is actually informed from something real and
compiler warnings that tell you when you are using something that won't
be available at build time.
- narrows the search space for doing LSP actions -- like searching for
references. Since it would be way too much work to store in the compiler
every location where every symbol/function/etc is used, I have to do
ad-hoc searches. By having a dependency graph i can significantly reduce
that search space.
- opens the doors for common shared code with a legitimate pattern.
Right now jak 2 shares code from the jak 1 folder. This is basically a
hack -- but by having an explicit require syntax, it would be possible
to reference arbitrary file paths, such as a `common` folder.

Some stats:
- Jak 1 has about 2500 edges between files, including transitives
- With transitives reduced at the source code level, each file seems to
have a modest amount of explicit requirements.

Known issues:
- Tracking the location for where `defmacro`s and virtual state
definitions were defined (and therefore the file) is still problematic.
Because those forms are in a macro environment, the reader does not
track them. I'm wondering if a workaround could be to search the
reader's text_db by not just the `goos::Object` but by the text
position. But for the purposes of finishing this work, I just statically
analyzed and searched the code with throwaway python code.
2024-05-12 12:37:59 -04:00

760 lines
26 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
(bundles "JUN.DGO")
(require "engine/common-obs/nav-enemy.gc")
;; name: junglesnake.gc
;; name in dgo: junglesnake
;; dgos: JUN, JUNGLE, L1
;; DECOMP BEGINS
(defskelgroup *junglesnake-sg* junglesnake junglesnake-lod0-jg junglesnake-idle-ja
((junglesnake-lod0-mg (meters 999999)))
:bounds (static-spherem 0 14 0 18)
:longest-edge (meters 2.5)
)
(defpartgroup group-junglesnake-dropping-down
:id 173
:flags (use-local-clock)
:bounds (static-bspherem 0 -12 0 14)
:parts ((sp-item 799 :period (seconds 1) :length (seconds 0.5)))
)
(defpart 799
:init-specs ((:texture (new 'static 'texture-id :index #x1d :page #x2))
(:num 1.0)
(:x (meters -9) (meters 18))
(:y (meters -6))
(:z (meters -9) (meters 18))
(:scale-x (meters 0.1) (meters 0.5))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 32.0 40.0)
(:g 32.0 40.0)
(:b 32.0 40.0)
(:a 128.0)
(:vel-y (meters 0) (meters -0.04))
(:rotvel-z (degrees -0.3) (degrees 0.6))
(:accel-y (meters -0.0016666667) (meters -0.00016666666))
(:timer (seconds 1.3))
(:flags (bit2))
(:userdata 0.0)
(:func 'check-water-level-drop)
)
)
(deftype junglesnake-twist-joint (structure)
((joint-index int32)
(ry float)
(drag-delta-ry float)
)
:allow-misaligned
)
(deftype junglesnake-tilt-joint (structure)
((joint-index int32)
(flip-it symbol)
)
:allow-misaligned
)
(deftype junglesnake (process-drawable)
((root collide-shape :override)
(state-time2 time-frame)
(hit-player symbol :offset 184)
(is-lethal? symbol)
(refractory-delay int32)
(ry float)
(des-ry float)
(tilt float)
(des-tilt float)
(track-player-ry symbol)
(track-player-tilt symbol)
(twist-joints junglesnake-twist-joint 24 :inline :offset 220)
(tilt-joints junglesnake-tilt-joint 3 :inline :offset 604)
)
(:methods
(junglesnake-method-20 (_type_) symbol)
(junglesnake-method-21 (_type_) symbol)
(junglesnake-method-22 (_type_ float) symbol)
(junglesnake-method-23 (_type_) none)
(junglesnake-method-24 (_type_) none)
)
(:states
junglesnake-attack
junglesnake-die
junglesnake-give-up
junglesnake-sleeping
junglesnake-tracking
junglesnake-wake
)
)
;; WARN: disable def twice: 39. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare.
(defbehavior junglesnake-default-event-handler junglesnake ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(case arg2
(('touch)
(when (and *target* ((method-of-type touching-shapes-entry prims-touching?)
(the-as touching-shapes-entry (-> arg3 param 0))
(the-as collide-shape-moving (-> self root))
(the-as uint 1)
)
)
(cond
((and (-> self is-lethal?)
(not (logtest? (-> *target* state-flags)
(state-flags being-attacked invulnerable timed-invulnerable invuln-powerup do-not-notice dying)
)
)
)
(when (send-event arg0 'attack (-> arg3 param 0) (new 'static 'attack-info))
(let ((v0-1 (the-as object #t)))
(set! (-> self hit-player) (the-as symbol v0-1))
v0-1
)
)
)
(else
(do-push-aways! (-> self root))
(send-event
arg0
'shove
(-> arg3 param 0)
(static-attack-info ((shove-back (meters 2)) (shove-up (meters 0.5))))
)
)
)
)
)
(('attack)
(go junglesnake-die)
)
)
)
junglesnake-default-event-handler
(defmethod junglesnake-method-20 ((this junglesnake))
(when (and *target* (-> this track-player-ry))
(let ((v1-3 (target-pos 0)))
(set! (-> this des-ry) (atan (- (-> v1-3 x) (-> this root trans x)) (- (-> v1-3 z) (-> this root trans z))))
)
)
(let ((f0-7 (deg-diff (-> this ry) (-> this des-ry))))
(+! (-> this ry) (seek-with-smooth 0.0 f0-7 (* 655360.0 (seconds-per-frame)) 0.125 0.001))
)
(let ((f30-1 (-> this ry)))
(dotimes (s5-0 24)
(let ((s4-0 (-> this twist-joints s5-0)))
(let ((f28-0 (-> s4-0 drag-delta-ry)))
(cond
((= f28-0 0.0)
(set! (-> s4-0 ry) f30-1)
)
(else
(let ((f26-0 (-> s4-0 ry)))
(let ((f0-14 (deg-diff f30-1 (-> s4-0 ry))))
(if (< f28-0 (fabs f0-14))
(set! f26-0 (if (>= f0-14 0.0)
(+ f30-1 f28-0)
(- f30-1 f28-0)
)
)
)
)
(let ((f0-16 (deg-diff (-> s4-0 ry) f26-0)))
(+! (-> s4-0 ry) (seek-with-smooth 0.0 f0-16 (* 327680.0 (seconds-per-frame)) 0.25 0.001))
)
)
)
)
)
(set! f30-1 (-> s4-0 ry))
)
)
)
#f
)
(defun junglesnake-joint-callback ((arg0 junglesnake))
(let ((s5-0 arg0))
(let ((s4-0 (new 'stack-no-clear 'matrix))
(s3-0 (new 'stack-no-clear 'matrix))
(s2-0 (new 'stack-no-clear 'matrix))
)
(let ((s1-0 (new 'stack-no-clear 'vector)))
(set-vector! s1-0 (-> arg0 root trans x) (-> arg0 root trans y) (-> arg0 root trans z) 1.0)
(matrix-translate! s2-0 s1-0)
(vector-negate! s1-0 s1-0)
(matrix-translate! s3-0 s1-0)
)
(dotimes (s1-1 24)
(let ((s0-0 (-> s5-0 twist-joints s1-1)))
(matrix-rotate-y! s4-0 (-> s0-0 ry))
(let ((s0-1 (-> arg0 node-list data (-> s0-0 joint-index) bone transform)))
(matrix*! s0-1 s0-1 s3-0)
(matrix*! s0-1 s0-1 s4-0)
(matrix*! s0-1 s0-1 s2-0)
)
)
)
)
(dotimes (s4-1 9)
(let ((s3-1 (-> arg0 node-list data (+ s4-1 11) bone transform)))
(let ((a0-14 (-> arg0 node-list data (+ s4-1 12) bone transform))
(a1-7 (new 'stack-no-clear 'vector))
)
(vector-! a1-7 (-> a0-14 vector 3) (-> s3-1 vector 3))
(vector-normalize-copy! (-> s3-1 vector 1) a1-7 1.0)
)
(set! (-> s3-1 vector 1 w) 0.0)
(vector-normalize! (vector-cross! (-> s3-1 vector 2) (the-as vector (-> s3-1 vector)) (-> s3-1 vector 1)) 1.0)
(vector-normalize! (vector-cross! (the-as vector (-> s3-1 vector)) (-> s3-1 vector 1) (-> s3-1 vector 2)) 1.0)
)
)
(cond
((and (-> s5-0 track-player-tilt) *target*)
(let ((s2-1 (-> arg0 node-list data 25 bone transform))
(s4-2 (new 'stack-no-clear 'vector))
)
(vector-normalize-copy! s4-2 (-> s2-1 vector 1) 1.0)
(set! (-> s4-2 w) 1.0)
(let ((s1-2 (new 'stack-no-clear 'vector)))
(vector-! s1-2 (target-pos 0) (-> s2-1 vector 3))
(+! (-> s1-2 y) 9011.2)
(vector-normalize! s1-2 1.0)
(let ((s0-2 (new 'stack-no-clear 'vector))
(s3-4 (new 'stack-no-clear 'vector))
)
(vector-normalize-copy! s0-2 (-> s2-1 vector 2) 1.0)
(vector-flatten! s3-4 s1-2 s0-2)
(vector-normalize! s3-4 1.0)
(let ((f30-0 (acos (vector-dot s4-2 s3-4))))
(if (< (-> s4-2 y) (-> s3-4 y))
(set! f30-0 (- f30-0))
)
(cond
((< 7281.778 f30-0)
(set! f30-0 7281.778)
)
((< f30-0 -11650.845)
(set! f30-0 -11650.845)
)
)
(let ((f0-16 (fabs (deg-diff (-> s5-0 ry) (-> s5-0 des-ry)))))
(if (>= f0-16 24576.0)
(set! f30-0 (* 0.00012207031 (- 32768.0 f0-16) f30-0))
)
)
(set! (-> s5-0 des-tilt) f30-0)
)
)
)
)
)
(else
(set! (-> s5-0 des-tilt) 0.0)
)
)
(let* ((f30-1 (-> s5-0 tilt))
(f0-21 (deg-diff f30-1 (-> s5-0 des-tilt)))
(f28-0 (+ f30-1 (seek-with-smooth 0.0 f0-21 (* 65536.0 (seconds-per-frame)) 0.2 0.001)))
)
(set! (-> s5-0 tilt) f28-0)
(let ((f30-2 (cos f28-0))
(f28-1 (sin f28-0))
(s4-3 (new 'stack-no-clear 'matrix))
(s3-5 (new 'stack-no-clear 'matrix))
)
(matrix-identity! s4-3)
(set! (-> s4-3 vector 0 x) f30-2)
(set! (-> s4-3 vector 0 y) f28-1)
(set! (-> s4-3 vector 1 x) (- f28-1))
(set! (-> s4-3 vector 1 y) f30-2)
(let* ((a2-9 s3-5)
(a3-1 s4-3)
(v1-47 (-> a3-1 vector 0 quad))
(a0-36 (-> a3-1 vector 1 quad))
(a1-20 (-> a3-1 vector 2 quad))
(a3-2 (-> a3-1 vector 3 quad))
)
(set! (-> a2-9 vector 0 quad) v1-47)
(set! (-> a2-9 vector 1 quad) a0-36)
(set! (-> a2-9 vector 2 quad) a1-20)
(set! (-> a2-9 vector 3 quad) a3-2)
)
(set! (-> s3-5 vector 0 y) (- (-> s3-5 vector 0 y)))
(set! (-> s3-5 vector 1 x) (- (-> s3-5 vector 1 x)))
(dotimes (s2-2 3)
(let* ((v1-50 (-> s5-0 tilt-joints s2-2))
(a2-10 (-> arg0 node-list data (-> v1-50 joint-index) bone transform))
)
(if (-> v1-50 flip-it)
(matrix*! a2-10 s3-5 a2-10)
(matrix*! a2-10 s4-3 a2-10)
)
)
)
)
)
)
0
(none)
)
(defstate junglesnake-sleeping (junglesnake)
:event junglesnake-default-event-handler
:enter (behavior ()
(set! (-> self skel postbind-function) #f)
(set! (-> self track-player-ry) #f)
(set! (-> self track-player-tilt) #f)
(set! (-> self des-ry) (-> self ry))
(set! (-> self des-tilt) (-> self tilt))
(logior! (-> self draw status) (draw-status hidden))
)
:trans (behavior ()
(when *target*
(let* ((a0-1 (target-pos 0))
(f0-1 (- (-> a0-1 y) (-> self root trans y)))
)
(if (and (>= 40960.0 f0-1) (>= 143360.0 (vector-vector-xz-distance a0-1 (-> self root trans))))
(go junglesnake-wake)
)
)
)
)
:code (behavior ()
(logior! (-> self mask) (process-mask sleep-code))
(suspend)
0
)
)
(defstate junglesnake-wake (junglesnake)
:event junglesnake-default-event-handler
:enter (behavior ()
(logclear! (-> self draw status) (draw-status hidden))
(set! (-> self track-player-ry) #f)
(set! (-> self track-player-tilt) #f)
(set! (-> self skel postbind-function) junglesnake-joint-callback)
(set! (-> self refractory-delay) 0)
0
)
:trans (behavior ()
(junglesnake-method-20 self)
(when *target*
(if *target*
(look-at-enemy!
(-> *target* neck)
(the-as vector (-> (the-as collide-shape-prim-group (-> self root root-prim)) prims 0 prim-core))
'attacking
self
)
)
)
)
:code (behavior ()
(ja-no-eval :group! junglesnake-drop-down-ja :num! (seek! max 0.85) :frame-num 0.5)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max 0.85))
)
(go junglesnake-tracking)
)
:post transform-post
)
(defstate junglesnake-tracking (junglesnake)
:event junglesnake-default-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
(set! (-> self track-player-ry) #t)
(set! (-> self track-player-tilt) #t)
)
:trans (behavior ()
(if (and (and *target* (>= 24576.0 (vector-vector-distance (-> self root trans) (-> *target* control trans))))
(time-elapsed? (-> self state-time) (-> self refractory-delay))
(not (logtest? (-> *target* state-flags)
(state-flags being-attacked invulnerable timed-invulnerable invuln-powerup do-not-notice dying)
)
)
)
(go junglesnake-attack)
)
(when *target*
(let ((a0-8 (target-pos 0)))
(if (or (>= (- (-> a0-8 y) (-> self root trans y)) 57344.0)
(>= (vector-vector-xz-distance a0-8 (-> self root trans)) 163840.0)
)
(go junglesnake-give-up)
)
)
)
(junglesnake-method-20 self)
(when *target*
(if *target*
(look-at-enemy!
(-> *target* neck)
(the-as vector (-> (the-as collide-shape-prim-group (-> self root root-prim)) prims 0 prim-core))
'attacking
self
)
)
)
)
:code (behavior ()
(cond
((ja-group? junglesnake-idle-ja)
(while (not (ja-done? 0))
(suspend)
(ja :num! (seek!))
)
)
(else
(ja-channel-push! 1 (seconds 0.15))
)
)
(loop
(ja-no-eval :group! junglesnake-idle-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
)
:post transform-post
)
(defstate junglesnake-attack (junglesnake)
:event junglesnake-default-event-handler
:enter (behavior ()
(set! (-> self hit-player) #f)
)
:exit (behavior ()
(junglesnake-method-24 self)
)
:trans (behavior ()
(junglesnake-method-20 self)
(when *target*
(if *target*
(look-at-enemy!
(-> *target* neck)
(the-as vector (-> (the-as collide-shape-prim-group (-> self root root-prim)) prims 0 prim-core))
'attacking
self
)
)
)
)
:code (behavior ()
(set! (-> self track-player-ry) #t)
(set! (-> self track-player-tilt) #t)
(ja-channel-push! 2 (seconds 0.15))
(junglesnake-method-23 self)
(let ((f30-0 (lerp-scale 0.0 1.0 (vector-vector-distance (target-pos 0) (-> self root trans)) 0.0 24576.0)))
(ja-no-eval :group! junglesnake-strike-close-ja :num! (seek! max 1.25) :frame-num 0.0)
(ja-no-eval :chan 1 :group! junglesnake-strike-far-ja :num! (chan 0) :frame-interp f30-0 :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(set! f30-0 (seek
f30-0
(lerp-scale 0.0 1.0 (vector-vector-distance (target-pos 0) (-> self root trans)) 0.0 24576.0)
(* 2.0 (seconds-per-frame))
)
)
(ja :num! (seek! max 1.25))
(ja :chan 1 :num! (chan 0) :frame-interp f30-0)
(let ((f0-12 (ja-aframe-num 0)))
(cond
((and (>= f0-12 22.0) (< f0-12 44.0))
(if (not (-> self is-lethal?))
(junglesnake-method-23 self)
)
)
(else
(if (-> self is-lethal?)
(junglesnake-method-24 self)
)
)
)
)
)
)
(if (-> self hit-player)
(set! (-> self refractory-delay) (rand-vu-int-range 300 600))
(set! (-> self refractory-delay) (rand-vu-int-range 150 300))
)
(go junglesnake-tracking)
)
:post transform-post
)
(defstate junglesnake-give-up (junglesnake)
:event junglesnake-default-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
(set! (-> self track-player-ry) #f)
(set! (-> self track-player-tilt) #f)
(set! (-> self des-ry) (-> self ry))
(set! (-> self des-tilt) (-> self tilt))
)
:trans (behavior ()
(junglesnake-method-20 self)
)
:code (behavior ()
(ja-channel-push! 1 (seconds 0.1))
(let ((gp-0 (new 'stack-no-clear 'vector)))
(let ((s5-0 (new 'stack-no-clear 'vector)))
(set! (-> gp-0 quad) (-> self root trans quad))
(set! (-> s5-0 quad) (-> gp-0 quad))
(+! (-> s5-0 y) 131072.0)
(ja-no-eval :group! junglesnake-give-up-ja :num! (seek! max 0.5) :frame-num 0.0)
(until (ja-done? 0)
(let* ((f0-6 (ja-frame-num 0))
(v1-18 (ja-group))
(f0-7 (/ f0-6 (the float (+ (-> v1-18 data 0 length) -1))))
(s4-0 (new 'stack-no-clear 'vector))
)
(set-vector! (-> self root scale) 1.0 (- 1.0 f0-7) 1.0 1.0)
(vector-lerp! s4-0 gp-0 s5-0 f0-7)
(move-to-point! (-> self root) s4-0)
)
(suspend)
(ja :num! (seek! max 0.5))
)
)
(move-to-point! (-> self root) gp-0)
)
(set-vector! (-> self root scale) 1.0 1.0 1.0 1.0)
(go junglesnake-sleeping)
)
:post transform-post
)
(defstate junglesnake-die (junglesnake)
:event process-drawable-death-event-handler
:code (behavior ()
(logclear! (-> self mask) (process-mask actor-pause))
(clear-collide-with-as (-> self root))
(ja-channel-push! 1 (seconds 0.15))
(ja-no-eval :group! junglesnake-death-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
(cleanup-for-death self)
)
:post ja-post
)
(defmethod junglesnake-method-23 ((this junglesnake))
(when (not (-> this is-lethal?))
(set! (-> this is-lethal?) #t)
(let ((v1-5 (-> (the-as collide-shape-prim-group (-> this root root-prim)) prims 0)))
(logclear! (-> v1-5 prim-core action) (collide-action solid))
)
)
0
(none)
)
(defmethod junglesnake-method-24 ((this junglesnake))
(when (-> this is-lethal?)
(set! (-> this is-lethal?) #f)
(let ((v1-4 (-> (the-as collide-shape-prim-group (-> this root root-prim)) prims 0)))
(logior! (-> v1-4 prim-core action) (collide-action solid))
)
(do-push-aways! (-> this root))
)
0
(none)
)
(define *junglesnake-twist-max-deltas* (new 'static 'array float 28
0.0
0.0
0.0
0.0
0.0
0.0
546.13336
1092.2667
1638.4
2184.5334
2730.6667
3276.8
3822.9333
4369.067
4915.2
5461.3335
6007.467
6553.6
7099.7334
7645.8667
8192.0
8738.134
9284.267
9830.4
10376.533
0.0
0.0
0.0
)
)
(defmethod junglesnake-method-22 ((this junglesnake) (arg0 float))
(let ((f0-0 0.0))
(dotimes (v1-0 24)
(let ((a2-2 (-> this twist-joints v1-0)))
(set! (-> a2-2 ry) arg0)
(set! (-> a2-2 joint-index) (- 26 v1-0))
(let ((f1-1 (-> *junglesnake-twist-max-deltas* v1-0)))
(set! (-> a2-2 drag-delta-ry) (- f1-1 f0-0))
(set! f0-0 f1-1)
)
)
)
)
#f
)
(defmethod junglesnake-method-21 ((this junglesnake))
(dotimes (v1-0 3)
(let ((a1-2 (-> this tilt-joints v1-0)))
(set! (-> a1-2 joint-index) (+ v1-0 23))
(set! (-> a1-2 flip-it) #f)
)
)
(let ((v1-3 (the-as object (&-> this stack 524))))
(set! (-> (the-as junglesnake-tilt-joint v1-3) flip-it) #t)
)
(let ((v1-4 (the-as object (&-> this stack 476)))
(v0-0 #t)
)
(set! (-> (the-as junglesnake-twist-joint v1-4) ry) (the-as float v0-0))
v0-0
)
)
(defmethod init-from-entity! ((this junglesnake) (arg0 entity-actor))
(logior! (-> this mask) (process-mask enemy))
(let ((s4-0 (new 'process 'collide-shape this (collide-list-enum hit-by-player))))
(let ((s3-0 (new 'process 'collide-shape-prim-group s4-0 (the-as uint 9) 0)))
(set! (-> s3-0 prim-core collide-as) (collide-kind enemy))
(set! (-> s3-0 collide-with) (collide-kind target))
(set! (-> s3-0 prim-core action) (collide-action solid))
(set-vector! (-> s3-0 local-sphere) 0.0 16384.0 0.0 30720.0)
(set-root-prim! s4-0 s3-0)
(let ((s2-0 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 1))))
(set! (-> s2-0 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-0 collide-with) (collide-kind target))
(set! (-> s2-0 prim-core action) (collide-action solid))
(set! (-> s2-0 prim-core offense) (collide-offense touch))
(set! (-> s2-0 transform-index) 25)
(set-vector! (-> s2-0 local-sphere) 0.0 2048.0 0.0 4096.0)
(append-prim s3-0 s2-0)
)
(let ((s2-1 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-1 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-1 collide-with) (collide-kind target))
(set! (-> s2-1 prim-core action) (collide-action solid))
(set! (-> s2-1 prim-core offense) (collide-offense touch))
(set! (-> s2-1 transform-index) 21)
(set-vector! (-> s2-1 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-1)
)
(let ((s2-2 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-2 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-2 collide-with) (collide-kind target))
(set! (-> s2-2 prim-core action) (collide-action solid))
(set! (-> s2-2 prim-core offense) (collide-offense touch))
(set! (-> s2-2 transform-index) 20)
(set-vector! (-> s2-2 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-2)
)
(let ((s2-3 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-3 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-3 collide-with) (collide-kind target))
(set! (-> s2-3 prim-core action) (collide-action solid))
(set! (-> s2-3 prim-core offense) (collide-offense touch))
(set! (-> s2-3 transform-index) 19)
(set-vector! (-> s2-3 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-3)
)
(let ((s2-4 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-4 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-4 collide-with) (collide-kind target))
(set! (-> s2-4 prim-core action) (collide-action solid))
(set! (-> s2-4 prim-core offense) (collide-offense touch))
(set! (-> s2-4 transform-index) 18)
(set-vector! (-> s2-4 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-4)
)
(let ((s2-5 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-5 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-5 collide-with) (collide-kind target))
(set! (-> s2-5 prim-core action) (collide-action solid))
(set! (-> s2-5 prim-core offense) (collide-offense touch))
(set! (-> s2-5 transform-index) 17)
(set-vector! (-> s2-5 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-5)
)
(let ((s2-6 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-6 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-6 collide-with) (collide-kind target))
(set! (-> s2-6 prim-core action) (collide-action solid))
(set! (-> s2-6 prim-core offense) (collide-offense touch))
(set! (-> s2-6 transform-index) 16)
(set-vector! (-> s2-6 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-6)
)
(let ((s2-7 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-7 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-7 collide-with) (collide-kind target))
(set! (-> s2-7 prim-core action) (collide-action solid))
(set! (-> s2-7 prim-core offense) (collide-offense touch))
(set! (-> s2-7 transform-index) 15)
(set-vector! (-> s2-7 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-7)
)
(let ((s2-8 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
(set! (-> s2-8 prim-core collide-as) (collide-kind enemy))
(set! (-> s2-8 collide-with) (collide-kind target))
(set! (-> s2-8 prim-core action) (collide-action solid))
(set! (-> s2-8 prim-core offense) (collide-offense touch))
(set! (-> s2-8 transform-index) 14)
(set-vector! (-> s2-8 local-sphere) 0.0 0.0 0.0 3276.8)
(append-prim s3-0 s2-8)
)
)
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
(backup-collide-with-as s4-0)
(set! (-> this root) s4-0)
)
(process-drawable-from-entity! this arg0)
(initialize-skeleton this *junglesnake-sg* '())
(set! (-> this fact)
(new 'process 'fact-info-enemy this (pickup-type eco-pill-random) (-> *FACT-bank* default-pill-inc))
)
(set! (-> this part) (create-launch-control (-> *part-group-id-table* 173) this))
(set! (-> this is-lethal?) #f)
(set! (-> this ry) (y-angle (-> this root)))
(set! (-> this des-ry) (-> this ry))
(set! (-> this tilt) 0.0)
(set! (-> this des-tilt) (-> this tilt))
(set! (-> this track-player-ry) #f)
(set! (-> this track-player-tilt) #f)
(quaternion-identity! (-> this root quat))
(junglesnake-method-22 this (-> this ry))
(junglesnake-method-21 this)
(logior! (-> this skel status) (janim-status inited))
(go junglesnake-sleeping)
(none)
)