Files
jak-project/test/decompiler/reference/jak2/levels/sewer/hosehead_REF.gc
T
water111 637990314b wip: better stack var support (#4222)
Closes #736

---------

Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
2026-04-19 00:14:44 +02:00

2470 lines
91 KiB
Common Lisp
Vendored
Generated

;;-*-Lisp-*-
(in-package goal)
;; failed to figure out what this is:
(defpart 1455
:init-specs ((:texture (pal-lightning effects))
(:birth-func 'birth-func-set-quat)
(:num 1.0)
(:scale-x (meters 1))
(:scale-y (meters 40))
(:r 128.0 64.0)
(:g 128.0 64.0)
(:b 128.0 64.0)
(:a 128.0)
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 left-multiply-quat))
)
)
;; failed to figure out what this is:
(defpart 1456
:init-specs ((:texture (glow-hotdot effects))
(:num 1.0)
(:scale-x (meters 1))
(:scale-y :copy scale-x)
(:r 128.0 64.0)
(:g 128.0 64.0)
(:b 128.0 64.0)
(:a 128.0)
(:rotvel-z (degrees 0.3))
(:fade-g -1.0666667)
(:fade-b -1.0666667)
(:fade-a -8.533334)
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14))
)
)
;; failed to figure out what this is:
(defpart 1457
:init-specs ((:texture (glow-hotdot effects))
(:num 1.0)
(:scale-x (meters 1))
(:scale-y :copy scale-x)
(:r 128.0 64.0)
(:g 128.0 64.0)
(:b 128.0 64.0)
(:a 128.0)
(:rotvel-z (degrees 0.3))
(:fade-g -1.0666667)
(:fade-b -1.0666667)
(:fade-a -8.533334)
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14))
)
)
;; definition of type hosehead
(deftype hosehead (nav-enemy)
((on-wall? symbol)
(sentry? symbol)
(shot-by-ruffian? symbol)
(on-stop-sentry function)
(jump-point vector :inline)
(last-time-dist-changed time-frame)
(next-lazer-time time-frame)
(fire-beam? symbol)
(head-angle degrees)
(head-angle-inc degrees)
(target-pos vector :inline)
(come-from-notice symbol)
(allow-head symbol)
(head-joint-mod joint-mod)
(joint-ik joint-mod-ik 4)
(delta-y-ik float 4)
(lazer-dist float :offset 740)
(lazer-pos-sound vector :inline)
(lazer-sound sound-id)
(lazer-sound2 sound-id)
(sync sync-eased :inline)
(angle-sentry degrees)
(lazer-length float)
)
(:state-methods
ambush-land
idle-sentry
active-wall
notice-wall
hostile-sentry
fire
attack
)
(:methods
(hosehead-method-185 (_type_) none)
(hosehead-method-186 (_type_) none)
(hosehead-method-187 (_type_ vector) none)
(hosehead-method-188 (_type_) none)
(hosehead-method-189 (_type_) none)
(hosehead-method-190 (_type_) symbol)
(hosehead-method-191 (_type_ vector vector) none)
(hosehead-method-192 (_type_ vector) symbol)
(hosehead-method-193 (_type_) none)
(hosehead-method-194 (_type_) none)
(hosehead-method-195 (_type_) symbol)
(hosehead-method-196 (_type_) none)
(hosehead-method-197 (_type_) none)
)
)
;; definition for method 3 of type hosehead
(defmethod inspect ((this hosehead))
(when (not this)
(set! this this)
(goto cfg-7)
)
(let ((t9-0 (method-of-type nav-enemy inspect)))
(t9-0 this)
)
(format #t "~2Ton-wall?: ~A~%" (-> this on-wall?))
(format #t "~2Tsentry?: ~A~%" (-> this sentry?))
(format #t "~2Tshot-by-ruffian?: ~A~%" (-> this shot-by-ruffian?))
(format #t "~2Ton-stop-sentry: ~A~%" (-> this on-stop-sentry))
(format #t "~2Tjump-point: #<vector @ #x~X>~%" (-> this jump-point))
(format #t "~2Tlast-time-dist-changed: ~D~%" (-> this last-time-dist-changed))
(format #t "~2Tnext-lazer-time: ~D~%" (-> this next-lazer-time))
(format #t "~2Tfire-beam?: ~A~%" (-> this fire-beam?))
(format #t "~2Thead-angle: ~f~%" (-> this head-angle))
(format #t "~2Thead-angle-inc: ~f~%" (-> this head-angle-inc))
(format #t "~2Ttarget-pos: #<vector @ #x~X>~%" (-> this target-pos))
(format #t "~2Tcome-from-notice: ~A~%" (-> this come-from-notice))
(format #t "~2Tallow-head: ~A~%" (-> this allow-head))
(format #t "~2Thead-joint-mod: ~A~%" (-> this head-joint-mod))
(format #t "~2Tjoint-ik[4] @ #x~X~%" (-> this joint-ik))
(format #t "~2Tdelta-y-ik[4] @ #x~X~%" (-> this delta-y-ik))
(format #t "~2Tactor-group: #x~X~%" (-> this actor-group))
(dotimes (s5-0 (-> this actor-group-count))
(format #t "~T [~D]~2Tactor-group: ~`actor-group`P~%" s5-0 (-> this actor-group s5-0))
)
(format #t "~2Tactor-group-count: ~D~%" (-> this actor-group-count))
(format #t "~2Tlazer-dist: ~f~%" (-> this lazer-dist))
(format #t "~2Tlazer-pos-sound: #<vector @ #x~X>~%" (-> this lazer-pos-sound))
(format #t "~2Tlazer-sound: ~D~%" (-> this lazer-sound))
(format #t "~2Tlazer-sound2: ~D~%" (-> this lazer-sound2))
(format #t "~2Tsync: #<sync-eased @ #x~X>~%" (-> this sync))
(format #t "~2Tangle-sentry: ~f~%" (-> this angle-sentry))
(format #t "~2Tlazer-length: ~f~%" (-> this lazer-length))
(label cfg-7)
this
)
;; failed to figure out what this is:
(defskelgroup skel-hosehead hosehead hosehead-lod0-jg -1
((hosehead-lod0-mg (meters 20)) (hosehead-lod1-mg (meters 40)) (hosehead-lod2-mg (meters 999999)))
:bounds (static-spherem 0 2.25 0 6)
:shadow hosehead-shadow-mg
:origin-joint-index 3
)
;; definition for symbol *hosehead-idle-wall*, type (pointer idle-control-frame)
(define *hosehead-idle-wall*
(new 'static 'array idle-control-frame 4
(new 'static 'idle-control-frame :command (ic-cmd play) :anim #x10 :param0 #x1 :param1 #x1)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
)
)
;; definition for symbol *hosehead-idle-ground*, type (pointer idle-control-frame)
(define *hosehead-idle-ground*
(new 'static 'array idle-control-frame 4
(new 'static 'idle-control-frame :command (ic-cmd play) :anim #xf :param0 #x1 :param1 #x1)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
(new 'static 'idle-control-frame)
)
)
;; definition for symbol *hosehead-nav-enemy-info*, type nav-enemy-info
(define *hosehead-nav-enemy-info* (new 'static 'nav-enemy-info
:use-die-falling #t
:use-victory #f
:use-jump-blocked #f
:debug-draw-neck #f
:jump-debug-draw #f
:move-to-ground #t
:hover-if-no-ground #f
:idle-anim-script #f
:idle-anim 15
:notice-anim 20
:hostile-anim 17
:hit-anim 24
:knocked-anim 18
:knocked-land-anim 19
:die-anim 23
:die-falling-anim 19
:victory-anim 15
:jump-wind-up-anim 7
:jump-in-air-anim 8
:jump-land-anim 9
:neck-joint -1
:look-at-joint 9
:bullseye-joint 6
:sound-hit (static-sound-name "hosehead-hit")
:sound-die (static-sound-name "hosehead-die")
:notice-distance (meters 120)
:notice-distance-delta (meters 10)
:proximity-notice-distance (meters 120)
:default-hit-points 5
:gnd-collide-with (collide-spec backgnd)
:overlaps-others-collide-with-filter (collide-spec jak bot player-list)
:penetrate-knocked (penetrate
touch
generic-attack
lunge
flop
punch
spin
roll
uppercut
bonk
tube
vehicle
flut-attack
board
mech
mech-punch
mech-bonk
dark-skin
dark-punch
dark-bomb
dark-giant
shield
explode
jak-yellow-shot
jak-red-shot
jak-blue-shot
jak-dark-shot
enemy-yellow-shot
enemy-dark-shot
eco-yellow
eco-red
eco-blue
eco-green
knocked
penetrate-33
penetrate-34
penetrate-35
penetrate-36
penetrate-37
penetrate-38
penetrate-39
penetrate-40
penetrate-41
penetrate-42
penetrate-43
penetrate-44
penetrate-45
penetrate-46
penetrate-47
penetrate-48
penetrate-49
penetrate-50
penetrate-51
penetrate-52
penetrate-53
penetrate-54
penetrate-55
penetrate-56
penetrate-57
penetrate-58
penetrate-59
penetrate-60
penetrate-61
penetrate-62
penetrate-63
)
:movement-gravity (meters -100)
:friction 0.8
:attack-shove-back (meters 3)
:attack-shove-up (meters 2)
:attack-mode 'generic
:attack-damage 2
:recover-gnd-collide-with (collide-spec backgnd crate obstacle hit-by-others-list pusher)
:jump-height-min (meters 0.1)
:knocked-seek-ry-clamp 6371.5557
:knocked-soft-vxz-lo 72089.6
:knocked-soft-vxz-hi 108134.4
:knocked-soft-vy-lo 81920.0
:knocked-soft-vy-hi 122880.0
:knocked-medium-vxz-lo 147456.0
:knocked-medium-vxz-hi 196608.0
:knocked-medium-vy-lo 135168.0
:knocked-medium-vy-hi 151552.0
:knocked-hard-vxz-lo 78643.2
:knocked-hard-vxz-hi 117964.8
:knocked-hard-vy-lo 183500.8
:knocked-hard-vy-hi 209715.2
:knocked-huge-vxz-lo 164659.2
:knocked-huge-vxz-hi 249036.8
:knocked-huge-vy-lo 183500.8
:knocked-huge-vy-hi 217907.2
:knocked-yellow-vxz-lo 16384.0
:knocked-yellow-vxz-hi 32768.0
:knocked-yellow-vy-lo 57344.0
:knocked-yellow-vy-hi 81920.0
:knocked-red-vxz-lo 24576.0
:knocked-red-vxz-hi 196608.0
:knocked-red-vy-lo 94208.0
:knocked-red-vy-hi 151552.0
:knocked-blue-vxz-lo 40960.0
:knocked-blue-vxz-hi 49152.0
:knocked-blue-vy-lo 24576.0
:knocked-blue-vy-hi 81920.0
:shadow-size (meters 1)
:shadow-max-y (meters 1)
:shadow-min-y (meters -1)
:shadow-locus-dist (meters 150)
:gem-joint 9
:gem-seg #x2
:gem-no-seg #x4
:gem-offset (new 'static 'sphere :y 1925.12 :z 1802.24 :r 163840.0)
:callback-info #f
:use-momentum #f
:use-frustration #f
:use-stop-chase #f
:use-circling #f
:use-pacing #f
:walk-anim 5
:turn-anim -1
:run-anim 17
:taunt-anim -1
:run-travel-speed (meters 6)
:run-acceleration (meters 1)
:run-turning-acceleration (meters 16)
:walk-travel-speed (meters 3)
:walk-acceleration (meters 1)
:walk-turning-acceleration (meters 16)
:maximum-rotation-rate (degrees 720)
:notice-nav-radius (meters 20)
:frustration-distance (meters 8)
:frustration-time (seconds 4)
:blocked-time (seconds 0.3)
:circle-dist-lo 20480.0
:circle-dist-hi 61440.0
:nav-mesh #f
)
)
;; failed to figure out what this is:
(set! (-> *hosehead-nav-enemy-info* fact-defaults) *fact-info-enemy-defaults*)
;; definition for method 114 of type hosehead
;; WARN: Return type mismatch int vs none.
(defmethod init-enemy-collision! ((this hosehead))
"Initializes the [[collide-shape-moving]] and any ancillary tasks to make the enemy collide properly"
(let ((s5-0 (new 'process 'collide-shape-moving this (collide-list-enum usually-hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) cshape-reaction-default)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-query vector vector object) nothing)
)
(set! (-> s5-0 penetrated-by) (penetrate))
(let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 6) 0)))
(set! (-> s5-0 total-prims) (the-as uint 7))
(set! (-> s4-0 prim-core collide-as) (collide-spec enemy))
(set! (-> s4-0 prim-core collide-with)
(collide-spec backgnd jak bot crate obstacle hit-by-others-list player-list)
)
(set! (-> s4-0 prim-core action) (collide-action solid semi-solid deadly no-standon))
(set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 24576.0)
(set! (-> s5-0 root-prim) s4-0)
)
(let ((v1-12 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-12 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-12 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list))
(set! (-> v1-12 prim-core action) (collide-action solid no-standon))
(set! (-> v1-12 transform-index) 6)
(set-vector! (-> v1-12 local-sphere) 0.0 0.0 0.0 5734.4)
)
(let ((v1-14 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-14 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-14 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list))
(set! (-> v1-14 prim-core action) (collide-action solid no-standon))
(set! (-> v1-14 transform-index) 17)
(set-vector! (-> v1-14 local-sphere) 0.0 0.0 0.0 5734.4)
)
(let ((v1-16 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-16 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-16 prim-core collide-with) (collide-spec backgnd jak bot crate hit-by-others-list player-list))
(set! (-> v1-16 prim-core action) (collide-action solid no-standon))
(set! (-> v1-16 transform-index) 9)
(set-vector! (-> v1-16 local-sphere) 0.0 0.0 0.0 5734.4)
)
(let ((v1-18 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-18 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-18 prim-core collide-with) (collide-spec jak bot player-list))
(set! (-> v1-18 prim-core action) (collide-action deadly))
(set! (-> v1-18 transform-index) 16)
(set-vector! (-> v1-18 local-sphere) 0.0 -6553.6 0.0 4915.2)
)
(let ((v1-20 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-20 prim-core collide-as) (collide-spec enemy))
(set! (-> v1-20 prim-core collide-with) (collide-spec jak bot player-list))
(set! (-> v1-20 prim-core action) (collide-action deadly))
(set! (-> v1-20 transform-index) 14)
(set-vector! (-> v1-20 local-sphere) 0.0 6553.6 0.0 4915.2)
)
(let ((v1-22 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> v1-22 prim-core collide-with) (collide-spec backgnd obstacle))
(set! (-> v1-22 prim-core action) (collide-action solid))
(set-vector! (-> v1-22 local-sphere) 0.0 11468.8 0.0 11468.8)
)
(set! (-> s5-0 nav-radius) 6553.6)
(let ((v1-24 (-> s5-0 root-prim)))
(set! (-> s5-0 backup-collide-as) (-> v1-24 prim-core collide-as))
(set! (-> s5-0 backup-collide-with) (-> v1-24 prim-core collide-with))
)
(set! (-> s5-0 max-iteration-count) (the-as uint 3))
(set! (-> this root) s5-0)
)
0
(none)
)
;; definition of type ik-setup
(deftype ik-setup (structure)
((elbow-index int32)
(hand-dist float)
)
)
;; definition for method 3 of type ik-setup
(defmethod inspect ((this ik-setup))
(when (not this)
(set! this this)
(goto cfg-4)
)
(format #t "[~8x] ~A~%" this 'ik-setup)
(format #t "~1Telbow-index: ~D~%" (-> this elbow-index))
(format #t "~1Thand-dist: ~f~%" (-> this hand-dist))
(label cfg-4)
this
)
;; definition for symbol *hosehead-ik-setup*, type (inline-array ik-setup)
(define *hosehead-ik-setup* (new 'static 'inline-array ik-setup 4
(new 'static 'ik-setup :elbow-index 14 :hand-dist 8257.536)
(new 'static 'ik-setup :elbow-index 16 :hand-dist -8257.536)
(new 'static 'ik-setup :elbow-index 20 :hand-dist 5476.352)
(new 'static 'ik-setup :elbow-index 23 :hand-dist -5476.352)
)
)
;; definition of type hosehead-anim-info
(deftype hosehead-anim-info (structure)
((hit-index int32)
(land-index int32)
)
:pack-me
)
;; definition for method 3 of type hosehead-anim-info
(defmethod inspect ((this hosehead-anim-info))
(when (not this)
(set! this this)
(goto cfg-4)
)
(format #t "[~8x] ~A~%" this 'hosehead-anim-info)
(format #t "~1Thit-index: ~D~%" (-> this hit-index))
(format #t "~1Tland-index: ~D~%" (-> this land-index))
(label cfg-4)
this
)
;; definition of type hosehead-global-info
(deftype hosehead-global-info (basic)
((prev-yellow-hit int8)
(prev-blue-hit int8)
(prev-knocked int8)
(yellow-hit-anim hosehead-anim-info 2 :inline)
(blue-hit-anim hosehead-anim-info 3 :inline :offset 24)
(knocked-anim hosehead-anim-info 2 :inline :offset 48)
)
)
;; definition for method 3 of type hosehead-global-info
(defmethod inspect ((this hosehead-global-info))
(when (not this)
(set! this this)
(goto cfg-4)
)
(format #t "[~8x] ~A~%" this (-> this type))
(format #t "~1Tprev-yellow-hit: ~D~%" (-> this prev-yellow-hit))
(format #t "~1Tprev-blue-hit: ~D~%" (-> this prev-blue-hit))
(format #t "~1Tprev-knocked: ~D~%" (-> this prev-knocked))
(format #t "~1Tyellow-hit-anim[2] @ #x~X~%" (-> this yellow-hit-anim))
(format #t "~1Tblue-hit-anim[3] @ #x~X~%" (-> this blue-hit-anim))
(format #t "~1Tknocked-anim[2] @ #x~X~%" (-> this knocked-anim))
(label cfg-4)
this
)
;; definition for symbol *hosehead-global-info*, type hosehead-global-info
(define *hosehead-global-info* (new 'static 'hosehead-global-info
:yellow-hit-anim (new 'static 'inline-array hosehead-anim-info 2
(new 'static 'hosehead-anim-info :hit-index 24)
(new 'static 'hosehead-anim-info :hit-index 25)
)
:blue-hit-anim (new 'static 'inline-array hosehead-anim-info 3
(new 'static 'hosehead-anim-info :hit-index 26 :land-index 27)
(new 'static 'hosehead-anim-info :hit-index 28 :land-index 29)
(new 'static 'hosehead-anim-info :hit-index 30 :land-index 31)
)
:knocked-anim (new 'static 'inline-array hosehead-anim-info 2
(new 'static 'hosehead-anim-info :hit-index 32 :land-index 33)
(new 'static 'hosehead-anim-info :hit-index 34 :land-index 35)
)
)
)
;; definition for method 77 of type hosehead
(defmethod enemy-method-77 ((this hosehead) (arg0 enemy-knocked-info))
(cond
((zero? (-> this hit-points))
(ja-channel-push! 1 (seconds 0.17))
(let ((a0-2 (-> this skel root-channel 0)))
(set! (-> a0-2 frame-group) (the-as art-joint-anim (-> this draw art-group data 18)))
(set! (-> a0-2 param 0)
(the float (+ (-> (the-as art-joint-anim (-> this draw art-group data 18)) frames num-frames) -1))
)
(set! (-> a0-2 param 1) (-> arg0 anim-speed))
(set! (-> a0-2 frame-num) 0.0)
(joint-control-channel-group! a0-2 (the-as art-joint-anim (-> this draw art-group data 18)) num-func-seek!)
)
#t
)
(else
(case (-> this incoming knocked-type)
(((knocked-type knocked-type-4))
(ja-channel-push! 1 (seconds 0.1))
(let* ((a2-1 (ash 1 (-> *hosehead-global-info* prev-yellow-hit)))
(v1-18 (rnd-bit this 2 a2-1))
(a1-8 (-> this draw art-group data (-> *hosehead-global-info* yellow-hit-anim v1-18 hit-index)))
)
(set! (-> *hosehead-global-info* prev-yellow-hit) v1-18)
(let ((a0-15 (-> this skel root-channel 0)))
(set! (-> a0-15 frame-group) (the-as art-joint-anim a1-8))
(set! (-> a0-15 param 0) (the float (+ (-> (the-as art-joint-anim a1-8) frames num-frames) -1)))
(set! (-> a0-15 param 1) (-> arg0 anim-speed))
(set! (-> a0-15 frame-num) 0.0)
(joint-control-channel-group! a0-15 (the-as art-joint-anim a1-8) num-func-seek!)
)
)
)
(((knocked-type knocked-type-6))
(let* ((a2-3 (ash 1 (-> *hosehead-global-info* prev-blue-hit)))
(v1-27 (rnd-bit this 3 a2-3))
(a1-13 (-> this draw art-group data (-> *hosehead-global-info* blue-hit-anim v1-27 hit-index)))
)
(set! (-> *hosehead-global-info* prev-blue-hit) v1-27)
(let ((a0-27 (-> this skel root-channel 0)))
(set! (-> a0-27 frame-group) (the-as art-joint-anim a1-13))
(set! (-> a0-27 param 0) (the float (+ (-> (the-as art-joint-anim a1-13) frames num-frames) -1)))
(set! (-> a0-27 param 1) 1.0)
(set! (-> a0-27 frame-num) 0.0)
(joint-control-channel-group! a0-27 (the-as art-joint-anim a1-13) num-func-seek!)
)
)
)
(else
(ja-channel-push! 1 (seconds 0.1))
(let* ((a2-5 (ash 1 (-> *hosehead-global-info* prev-knocked)))
(v1-37 (rnd-bit this 2 a2-5))
(a1-19 (-> this draw art-group data (-> *hosehead-global-info* knocked-anim v1-37 hit-index)))
)
(set! (-> *hosehead-global-info* prev-knocked) v1-37)
(let ((a0-39 (-> this skel root-channel 0)))
(set! (-> a0-39 frame-group) (the-as art-joint-anim a1-19))
(set! (-> a0-39 param 0) (the float (+ (-> (the-as art-joint-anim a1-19) frames num-frames) -1)))
(set! (-> a0-39 param 1) (-> arg0 anim-speed))
(set! (-> a0-39 frame-num) 0.0)
(joint-control-channel-group! a0-39 (the-as art-joint-anim a1-19) num-func-seek!)
)
)
)
)
#t
)
)
)
;; definition for method 78 of type hosehead
(defmethod enemy-method-78 ((this hosehead) (arg0 enemy-knocked-info))
(local-vars (v1-15 knocked-type))
(cond
((zero? (-> this hit-points))
(ja-channel-push! 1 (seconds 0.17))
(let ((a0-2 (-> this skel root-channel 0)))
(set! (-> a0-2 frame-group) (the-as art-joint-anim (-> this draw art-group data 19)))
(set! (-> a0-2 param 0)
(the float (+ (-> (the-as art-joint-anim (-> this draw art-group data 19)) frames num-frames) -1))
)
(set! (-> a0-2 param 1) (-> arg0 anim-speed))
(set! (-> a0-2 frame-num) 0.0)
(joint-control-channel-group! a0-2 (the-as art-joint-anim (-> this draw art-group data 19)) num-func-seek!)
)
#t
)
((begin (set! v1-15 (-> this incoming knocked-type)) (= v1-15 (knocked-type knocked-type-6)))
(let* ((a0-4 (-> *hosehead-global-info* prev-blue-hit))
(s4-0 (-> this draw art-group data (-> *hosehead-global-info* blue-hit-anim a0-4 land-index)))
)
(ja-channel-push! 1 (seconds 0.1))
(let ((a0-9 (-> this skel root-channel 0)))
(set! (-> a0-9 frame-group) (the-as art-joint-anim s4-0))
(set! (-> a0-9 param 0) (the float (+ (-> (the-as art-joint-anim s4-0) frames num-frames) -1)))
(set! (-> a0-9 param 1) (-> arg0 anim-speed))
(joint-control-channel-group! a0-9 (the-as art-joint-anim s4-0) num-func-seek!)
)
)
#t
)
((= v1-15 (knocked-type knocked-type-4))
#f
)
(else
(let* ((a0-11 (-> *hosehead-global-info* prev-knocked))
(s4-1 (-> this draw art-group data (-> *hosehead-global-info* knocked-anim a0-11 land-index)))
)
(ja-channel-push! 1 (seconds 0.1))
(let ((a0-16 (-> this skel root-channel 0)))
(set! (-> a0-16 frame-group) (the-as art-joint-anim s4-1))
(set! (-> a0-16 param 0) (the float (+ (-> (the-as art-joint-anim s4-1) frames num-frames) -1)))
(set! (-> a0-16 param 1) (-> arg0 anim-speed))
(joint-control-channel-group! a0-16 (the-as art-joint-anim s4-1) num-func-seek!)
)
)
#t
)
)
)
;; definition for method 189 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defmethod hosehead-method-189 ((this hosehead))
(let ((a0-2 (handle->process (-> this focus handle))))
(when a0-2
(let ((s5-0 (new 'stack-no-clear 'vector)))
(set! (-> s5-0 quad) (-> (get-trans (the-as process-focusable a0-2) 1) quad))
(+! (-> s5-0 y) 8192.0)
(set! (-> this target-pos quad) (-> s5-0 quad))
)
)
)
0
(none)
)
;; definition for method 190 of type hosehead
(defmethod hosehead-method-190 ((this hosehead))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(hosehead-method-189 this)
(let ((gp-0 (new 'stack-no-clear 'collide-query)))
(let ((s4-0 (-> gp-0 start-pos)))
(let ((s3-0 (-> this root trans)))
(let ((v1-4 (vector-y-quaternion! (new 'stack-no-clear 'vector) (-> this root quat))))
(let ((a0-4 6144.0))
(.mov vf7 a0-4)
)
(.lvf vf5 (&-> v1-4 quad))
)
(.lvf vf4 (&-> s3-0 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> s4-0 quad) vf6)
)
(vector-! (-> gp-0 move-dist) (-> this target-pos) (-> gp-0 start-pos))
(let ((v1-7 gp-0))
(set! (-> v1-7 radius) 1024.0)
(set! (-> v1-7 collide-with) (collide-spec backgnd enemy obstacle))
(set! (-> v1-7 ignore-process0) #f)
(set! (-> v1-7 ignore-process1) #f)
(set! (-> v1-7 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-7 action-mask) (collide-action solid))
)
(< (fill-and-probe-using-line-sphere *collide-cache* gp-0) 0.0)
)
)
)
;; definition for function point-line-distance
;; INFO: Used lq/sq
(defun point-line-distance ((arg0 vector) (arg1 vector) (arg2 vector) (arg3 vector))
(local-vars (a1-5 float))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf1 :class vf)
(vf2 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(let ((v1-1 (vector-! (new 'stack-no-clear 'vector) arg1 arg2)))
(let ((f0-1 (vector-dot v1-1 arg3)))
(cond
((>= 0.0 f0-1)
0.0
)
(else
(.lvf vf1 (&-> arg3 quad))
(.add.w.vf.x vf2 vf0 vf0)
(.mul.vf vf1 vf1 vf1)
(.mul.x.vf.x acc vf2 vf1)
(.add.mul.y.vf.x acc vf2 vf1 acc)
(.add.mul.z.vf.x vf1 vf2 vf1 acc)
(.mov a1-5 vf1)
(let ((f0-3 (/ f0-1 a1-5))
(a2-2 v1-1)
)
(let ((a1-6 v1-1))
(let ((t0-0 (- f0-3)))
(.mov vf7 t0-0)
)
(.lvf vf5 (&-> arg3 quad))
(.lvf vf4 (&-> a1-6 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a2-2 quad) vf6)
)
)
)
)
(set! (-> arg0 quad) (-> v1-1 quad))
(vector-length v1-1)
)
)
)
;; definition for method 197 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defmethod hosehead-method-197 ((this hosehead))
(let ((s2-0 (new 'stack-no-clear 'matrix)))
(let* ((a2-0 (-> this node-list data 12 bone transform))
(v1-2 (-> a2-0 quad 0))
(a0-1 (-> a2-0 quad 1))
(a1-0 (-> a2-0 quad 2))
(a2-1 (-> a2-0 trans quad))
)
(set! (-> s2-0 quad 0) v1-2)
(set! (-> s2-0 quad 1) a0-1)
(set! (-> s2-0 quad 2) a1-0)
(set! (-> s2-0 trans quad) a2-1)
)
(new 'stack-no-clear 'matrix)
(let ((s3-0 (new 'stack-no-clear 'collide-query))
(s5-0 (new 'stack-no-clear 'vector))
(s4-0 (new 'stack-no-clear 'vector))
)
(seek! (-> this lazer-length) 327680.0 (* 327680.0 (seconds-per-frame)))
(vector-normalize-copy! s5-0 (-> s2-0 vector 1) (-> this lazer-length))
(matrix->trans s2-0 s4-0)
(set! (-> this lazer-dist) (lerp-scale
1.0
0.0
(point-line-distance (-> this lazer-pos-sound) (-> this target-pos) s4-0 s5-0)
0.0
40960.0
)
)
(vector-! (-> this lazer-pos-sound) (-> this target-pos) (-> this lazer-pos-sound))
(set! (-> s3-0 start-pos quad) (-> s4-0 quad))
(set! (-> s3-0 move-dist quad) (-> s5-0 quad))
(let ((v1-9 s3-0))
(set! (-> v1-9 radius) 40.96)
(set! (-> v1-9 collide-with)
(collide-spec backgnd jak bot enemy obstacle hit-by-player-list hit-by-others-list player-list)
)
(set! (-> v1-9 ignore-process0) #f)
(set! (-> v1-9 ignore-process1) #f)
(set! (-> v1-9 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-9 action-mask) (collide-action solid))
)
(let ((f0-7 (fill-and-probe-using-line-sphere *collide-cache* s3-0)))
(when (>= f0-7 0.0)
(vector-float*! s5-0 s5-0 f0-7)
(let ((s3-1 (the-as basic (as-type (-> s3-0 best-other-tri collide-ptr) collide-shape-prim))))
(when s3-1
(if (logtest? (-> (the-as collide-shape-prim s3-1) prim-core collide-as) (collide-spec enemy))
(go-hostile this)
)
(if (logtest? (-> (the-as collide-shape-prim s3-1) prim-core collide-as) (collide-spec jak bot))
(send-event
(-> (the-as collide-shape-prim s3-1) cshape process)
'attack
#f
(static-attack-info ((id (new-attack-id)) (mode 'beam)))
)
)
)
)
)
)
(set! (-> *part-id-table* 1455 init-specs 4 initial-valuef) (vector-length s5-0))
(draw-beam (-> *part-id-table* 1455) s4-0 s5-0 #f #t)
(launch-particles (-> *part-id-table* 1456) s4-0)
(launch-particles (-> *part-id-table* 1457) (vector+! (new 'stack-no-clear 'vector) s5-0 s4-0))
)
)
(let ((s5-1 sound-play-by-spec)
(s4-1 (static-sound-spec "hosehead-lazer" :volume 0.0 :mask (pitch)))
)
(set! (-> s4-1 volume) (the int (* 1024.0 (lerp-scale 1.0 0.4 (-> this lazer-dist) 1.0 0.0))))
(set! (-> s4-1 pitch-mod) 0)
(s5-1 s4-1 (-> this lazer-sound) (-> this lazer-pos-sound))
)
(let ((s5-2 sound-play-by-spec)
(s4-2 (static-sound-spec "lazer-sub" :volume 0.0 :mask (pitch)))
)
(set! (-> s4-2 volume) (the int (* 1024.0 (lerp-scale 1.0 0.0 (-> this lazer-dist) 1.0 0.5))))
(set! (-> s4-2 pitch-mod) 0)
(s5-2 s4-2 (-> this lazer-sound2) (-> this lazer-pos-sound))
)
0
(none)
)
;; definition for method 88 of type hosehead
(defmethod enemy-method-88 ((this hosehead) (arg0 enemy-jump-info))
(ja-channel-push! 1 (seconds 0.075))
(let ((a1-2 (-> this draw art-group data (-> this enemy-info jump-land-anim)))
(a0-4 (-> this skel root-channel 0))
)
(set! (-> a0-4 frame-group) (the-as art-joint-anim a1-2))
(set! (-> a0-4 param 0) (the float (+ (-> (the-as art-joint-anim a1-2) frames num-frames) -1)))
(set! (-> a0-4 param 1) (-> arg0 anim-speed))
(set! (-> a0-4 frame-num) 0.0)
(joint-control-channel-group! a0-4 (the-as art-joint-anim a1-2) num-func-seek!)
)
#t
)
;; definition for method 74 of type hosehead
(defmethod general-event-handler ((this hosehead) (arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
"Handles various events for the enemy
@TODO - unsure if there is a pattern for the events and this should have a more specific name"
(case arg2
(('cue-chase)
(cond
((-> this on-wall?)
(logclear! (-> this enemy-flags) (enemy-flag use-notice-distance directed directed-ready use-trigger))
(logior! (-> this enemy-flags) (enemy-flag chase-startup))
(logclear! (-> this mask) (process-mask actor-pause))
(go (method-of-object this notice-wall))
)
((-> this sentry?)
(when (and (-> this next-state) (= (-> this next-state name) 'idle-sentry))
(logclear! (-> this enemy-flags) (enemy-flag use-notice-distance directed directed-ready use-trigger))
(logior! (-> this enemy-flags) (enemy-flag chase-startup))
(logclear! (-> this mask) (process-mask actor-pause))
(go (method-of-object this hostile-sentry))
)
)
(else
((method-of-type nav-enemy general-event-handler) this arg0 arg1 arg2 arg3)
)
)
)
(('stop-sentry)
(set! (-> this sentry?) #f)
#t
)
(else
((method-of-type nav-enemy general-event-handler) this arg0 arg1 arg2 arg3)
)
)
)
;; definition for method 186 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch vector vs none.
(defmethod hosehead-method-186 ((this hosehead))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(let ((s3-0 (new 'stack-no-clear 'collide-query))
(gp-0 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'vector))
)
(let ((s2-0 gp-0))
(let ((s1-0 (-> this root trans)))
(let ((v1-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> this root quat))))
(let ((a0-3 8192.0))
(.mov vf7 a0-3)
)
(.lvf vf5 (&-> v1-2 quad))
)
(.lvf vf4 (&-> s1-0 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> s2-0 quad) vf6)
)
(set! (-> s5-0 quad) (-> gp-0 quad))
(+! (-> gp-0 y) -8192.0)
(+! (-> s5-0 y) 8192.0)
(set! (-> s3-0 start-pos quad) (-> gp-0 quad))
(vector-float*!
(-> s3-0 move-dist)
(vector-z-quaternion! (new 'stack-no-clear 'vector) (-> this root quat))
-16384.0
)
(let ((v1-9 s3-0))
(set! (-> v1-9 radius) 40.96)
(set! (-> v1-9 collide-with) (collide-spec backgnd))
(set! (-> v1-9 ignore-process0) #f)
(set! (-> v1-9 ignore-process1) #f)
(set! (-> v1-9 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-9 action-mask) (collide-action solid))
)
(let ((f0-7 (fill-and-probe-using-line-sphere *collide-cache* s3-0)))
(when (>= f0-7 0.0)
(let ((a1-4 gp-0))
(let ((v1-12 gp-0))
(let ((a0-15 (-> s3-0 move-dist)))
(let ((a2-0 f0-7))
(.mov vf7 a2-0)
)
(.lvf vf5 (&-> a0-15 quad))
)
(.lvf vf4 (&-> v1-12 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a1-4 quad) vf6)
)
)
)
(set! (-> s3-0 start-pos quad) (-> s5-0 quad))
(vector-float*!
(-> s3-0 move-dist)
(vector-z-quaternion! (new 'stack-no-clear 'vector) (-> this root quat))
-16384.0
)
(let ((v1-16 s3-0))
(set! (-> v1-16 radius) 40.96)
(set! (-> v1-16 collide-with) (collide-spec backgnd))
(set! (-> v1-16 ignore-process0) #f)
(set! (-> v1-16 ignore-process1) #f)
(set! (-> v1-16 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-16 action-mask) (collide-action solid))
)
(let ((f0-10 (fill-and-probe-using-line-sphere *collide-cache* s3-0)))
(when (>= f0-10 0.0)
(let ((a0-26 s5-0))
(let ((v1-19 s5-0))
(let ((a1-7 (-> s3-0 move-dist)))
(let ((a2-1 f0-10))
(.mov vf7 a2-1)
)
(.lvf vf5 (&-> a1-7 quad))
)
(.lvf vf4 (&-> v1-19 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a0-26 quad) vf6)
)
)
)
(let ((s2-6 (vector-! (new 'stack-no-clear 'vector) gp-0 s5-0))
(s1-1 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> this root quat)))
(s3-1 (new 'stack-no-clear 'quaternion))
)
(let ((s0-0 (new 'stack-no-clear 'matrix)))
(vector-normalize! s2-6 1.0)
(quaternion-vector-angle! s3-1 s1-1 -16384.0)
(quaternion->matrix s0-0 s3-1)
(vector-rotate*! s2-6 s2-6 s0-0)
)
(quaternion-look-at! s3-1 s2-6 *up-vector*)
(quaternion-pseudo-seek (-> this root quat) (-> this root quat) s3-1 (seconds-per-frame))
)
(vector-average! (-> this root trans) gp-0 s5-0)
)
(none)
)
)
;; definition for method 185 of type hosehead
;; WARN: Return type mismatch int vs none.
(defmethod hosehead-method-185 ((this hosehead))
(countdown (s5-0 (length (-> this actor-group 1)))
(let* ((v1-5 (-> this actor-group 1 data s5-0 actor))
(a0-4 (if v1-5
(-> v1-5 extra process)
)
)
)
(send-event a0-4 'stop-sentry)
)
)
0
(none)
)
;; failed to figure out what this is:
(defstate idle-sentry (hosehead)
:virtual #t
:event enemy-event-handler
:enter (-> (method-of-type nav-enemy idle) enter)
:exit (-> (method-of-type nav-enemy idle) exit)
:trans (behavior ()
(when (time-elapsed? (-> self state-time) (-> self state-timeout))
(let ((a0-3 (handle->process (-> self focus handle))))
(when a0-3
(let ((f0-0 (vector-vector-xz-distance (get-trans (the-as process-focusable a0-3) 0) (-> self root trans))))
(if (>= 98304.0 f0-0)
(hosehead-method-185 self)
)
)
)
)
(when (not (-> self sentry?))
(logior! (-> self enemy-flags) (enemy-flag multi-focus))
(set! (-> self focus collide-with) (collide-spec jak bot player-list jak-vehicle))
(let ((gp-1 (-> self on-stop-sentry)))
(if gp-1
(script-eval (the-as pair gp-1) :vector (-> self root trans))
)
)
(go-virtual active)
)
)
)
:code (-> (method-of-type nav-enemy idle) code)
:post (-> (method-of-type nav-enemy idle) post)
)
;; failed to figure out what this is:
(defstate hostile-sentry (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
((-> (method-of-type nav-enemy hostile) enter))
(logior! (-> self skel status) (joint-control-status sync-math))
(logior! (-> self focus-status) (focus-status dangerous))
(let* ((v1-7 *game-info*)
(a0-2 (+ (-> v1-7 attack-id) 1))
)
(set! (-> v1-7 attack-id) a0-2)
(set! (-> self attack-id) a0-2)
)
(set! (-> self fire-beam?) #f)
(set! (-> self allow-head) #t)
(set! (-> self lazer-length) 0.0)
(set-time! (-> self state-time))
)
:exit (behavior ()
(sound-stop (-> self lazer-sound))
(sound-stop (-> self lazer-sound2))
(logclear! (-> self skel status) (joint-control-status sync-math))
(set! (-> self allow-head) #f)
(set! (-> self fire-beam?) #f)
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
)
:trans (behavior ()
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(let ((gp-0 (-> self target-pos)))
(let ((s5-0 (-> self root trans)))
(let ((v1-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root quat))))
(let ((a0-2 40960.0))
(.mov vf7 a0-2)
)
(.lvf vf5 (&-> v1-2 quad))
)
(.lvf vf4 (&-> s5-0 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> gp-0 quad) vf6)
)
(+! (-> self target-pos y) 2867.2)
(let ((f0-5 (* (-> self angle-sentry) (+ -0.5 (get-norm! (-> self sync) 0)))))
(if (logtest? (enemy-flag drawn-mirrored) (-> self enemy-flags))
(set! f0-5 (- f0-5))
)
(set! (-> self head-angle) f0-5)
)
(when (time-elapsed? (-> self state-time) (-> self state-timeout))
(let ((a0-8 (handle->process (-> self focus handle))))
(when a0-8
(let ((f0-6 (vector-vector-xz-distance (get-trans (the-as process-focusable a0-8) 0) (-> self root trans))))
(if (>= 98304.0 f0-6)
(hosehead-method-185 self)
)
)
)
)
(when (not (-> self sentry?))
(logior! (-> self enemy-flags) (enemy-flag multi-focus))
(set! (-> self focus collide-with) (collide-spec jak bot player-list jak-vehicle))
(let ((gp-2 (-> self on-stop-sentry)))
(if gp-2
(script-eval (the-as pair gp-2) :vector (-> self root trans))
)
)
(go-hostile self)
)
)
(set! (-> self fire-beam?) (if (handle->process (-> self focus handle))
#t
#f
)
)
(if (not (-> self fire-beam?))
(set! (-> self lazer-length) 0.0)
)
)
)
:code (behavior ()
(let ((f30-0 (rnd-float-range self 0.9 1.1)))
(ja-channel-push! 1 (seconds 0.01))
(set! (-> self fire-beam?) #t)
(until #f
(ja-no-eval :group! hosehead-shoot-loop-ja :num! (seek! max f30-0) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-0))
)
(suspend)
)
#f
(sound-stop (-> self lazer-sound))
(sound-stop (-> self lazer-sound2))
(ja-no-eval :group! hosehead-shoot-end-ja :num! (seek! max f30-0) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-0))
)
)
)
:post (behavior ()
(enemy-simple-post)
(if (-> self fire-beam?)
(hosehead-method-197 self)
)
)
)
;; definition for method 192 of type hosehead
;; INFO: Used lq/sq
(defmethod hosehead-method-192 ((this hosehead) (arg0 vector))
(local-vars (a2-7 float) (a2-14 float))
(rlet ((vf1 :class vf)
(vf2 :class vf)
(vf3 :class vf)
)
(set! (-> arg0 x) (rnd-float-range this 5607424.0 5812224.0))
(set! (-> arg0 z) (rnd-float-range this 2027520.0 1961984.0))
(set! (-> arg0 y) -368680.97)
(let ((gp-1 (new 'stack-no-clear 'vector)))
(set! (-> gp-1 quad) (-> arg0 quad))
(set! (-> gp-1 w) 32768.0)
(set! *actor-list-length* 0)
(if #t
(set! *actor-list-length* (fill-actor-list-for-sphere *actor-hash* (the-as sphere gp-1) *actor-list* 256))
)
(when #t
(let ((a0-5 (-> *collide-player-list* alive-list next0)))
*collide-player-list*
(let ((v1-18 (-> a0-5 next0)))
(while (!= a0-5 (-> *collide-player-list* alive-list-end))
(let* ((a0-6 (-> (the-as connection a0-5) param1))
(a1-4 (-> (the-as collide-shape a0-6) root-prim))
)
(when (logtest? (-> a1-4 prim-core collide-as) (collide-spec jak bot enemy hit-by-others-list player-list))
(let ((a1-5 (-> a1-4 prim-core)))
(let ((a2-6 a1-5)
(a3-1 gp-1)
)
(.lvf vf2 (&-> a2-6 world-sphere quad))
(.lvf vf3 (&-> a3-1 quad))
)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.add.y.vf.x vf1 vf1 vf1)
(.add.z.vf.x vf1 vf1 vf1)
(.mov a2-7 vf1)
(when (< a2-7 (square (+ (-> a1-5 world-sphere w) (-> gp-1 w))))
(when (< *actor-list-length* 256)
(set! (-> *actor-list* *actor-list-length*) (the-as collide-shape a0-6))
(set! *actor-list-length* (+ *actor-list-length* 1))
)
)
)
)
)
(set! a0-5 v1-18)
*collide-player-list*
(set! v1-18 (-> v1-18 next0))
)
)
)
)
(when #f
(let ((a0-8 (-> *collide-hit-by-player-list* alive-list next0)))
*collide-hit-by-player-list*
(let ((v1-25 (-> a0-8 next0)))
(while (!= a0-8 (-> *collide-hit-by-player-list* alive-list-end))
(let* ((a0-9 (-> (the-as connection a0-8) param1))
(a1-16 (-> (the-as collide-shape a0-9) root-prim))
)
(when (logtest? (-> a1-16 prim-core collide-as) (collide-spec jak bot enemy hit-by-others-list player-list))
(let ((a1-17 (-> a1-16 prim-core)))
(let ((a2-13 a1-17)
(a3-2 gp-1)
)
(.lvf vf2 (&-> a2-13 world-sphere quad))
(.lvf vf3 (&-> a3-2 quad))
)
(.sub.vf vf1 vf3 vf2)
(.mul.vf vf1 vf1 vf1)
(.add.y.vf.x vf1 vf1 vf1)
(.add.z.vf.x vf1 vf1 vf1)
(.mov a2-14 vf1)
(when (< a2-14 (square (+ (-> a1-17 world-sphere w) (-> gp-1 w))))
(when (< *actor-list-length* 256)
(set! (-> *actor-list* *actor-list-length*) (the-as collide-shape a0-9))
(set! *actor-list-length* (+ *actor-list-length* 1))
)
)
)
)
)
(set! a0-8 v1-25)
*collide-hit-by-player-list*
(set! v1-25 (-> v1-25 next0))
)
)
)
)
(dotimes (s5-1 *actor-list-length*)
(let ((v1-30 (-> *actor-list* s5-1)))
(when (logtest? (-> v1-30 root-prim prim-core collide-as)
(collide-spec jak bot enemy hit-by-others-list player-list)
)
(if (>= (square (if (= (-> v1-30 process type) target)
28672.0
20480.0
)
)
(vector-vector-xz-distance-squared gp-1 (-> v1-30 trans))
)
(return #f)
)
)
)
)
)
#t
)
)
;; definition for method 191 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch float vs none.
(defmethod hosehead-method-191 ((this hosehead) (arg0 vector) (arg1 vector))
(cond
((logtest? (-> this fact enemy-options) (enemy-option user10))
(countdown (s3-0 8)
(if (hosehead-method-192 this arg1)
(goto cfg-7)
)
)
(label cfg-7)
(set! (-> arg0 quad) (-> arg1 quad))
(let ((f0-0 (vector-vector-xz-distance arg1 (math-camera-pos))))
(+! (-> arg0 y) (lerp-scale 61440.0 102400.0 f0-0 40960.0 245760.0))
)
)
(else
(set! (-> arg1 quad) (-> this root trans quad))
(set! (-> arg0 quad) (-> arg1 quad))
(+! (-> arg0 y) 81920.0)
)
)
(none)
)
;; failed to figure out what this is:
(defstate directed (hosehead)
:virtual #t
:enter (behavior ()
(when (or (logtest? (-> self fact enemy-options) (enemy-option user8))
(logtest? (-> self fact enemy-options) (enemy-option user10))
)
(logior! (-> self draw status) (draw-control-status no-draw))
(let ((v1-10 (-> self root root-prim)))
(set! (-> v1-10 prim-core collide-as) (collide-spec))
(set! (-> v1-10 prim-core collide-with) (collide-spec))
)
0
)
(let ((t9-0 (-> (method-of-type nav-enemy directed) enter)))
(if t9-0
(t9-0)
)
)
)
)
;; failed to figure out what this is:
(defstate ambush (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(let ((v1-0 self))
(set! (-> v1-0 enemy-flags) (the-as enemy-flag (logclear (-> v1-0 enemy-flags) (enemy-flag enemy-flag36))))
(set! (-> v1-0 nav callback-info) *nav-enemy-null-callback-info*)
)
0
(let ((v1-3 self))
(set! (-> v1-3 enemy-flags) (the-as enemy-flag (logclear (-> v1-3 enemy-flags) (enemy-flag enemy-flag37))))
)
0
(let ((v1-6 (-> self root root-prim)))
(set! (-> v1-6 prim-core collide-as) (collide-spec))
(set! (-> v1-6 prim-core collide-with) (collide-spec))
)
0
(when (logtest? (-> self enemy-flags) (enemy-flag enable-on-notice))
(logclear! (-> self enemy-flags) (enemy-flag enable-on-notice))
(let ((gp-0 (-> self on-notice)))
(if gp-0
(script-eval gp-0 :vector (-> self root trans))
)
)
)
(logior! (-> self enemy-flags) (enemy-flag alert))
(let ((gp-1 (new 'stack-no-clear 'vector)))
(let ((s5-0 (new 'stack-no-clear 'vector)))
(hosehead-method-191 self gp-1 s5-0)
(set! (-> self root trans quad) (-> s5-0 quad))
(set! (-> self jump-point quad) (-> s5-0 quad))
)
(let ((a0-13 (enemy-method-97 self)))
(when a0-13
(let* ((s5-1 (-> self root))
(s2-0
(vector-normalize!
(vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-13) 0) (-> s5-1 trans))
1.0
)
)
(f0-0 (deg-diff (quaternion-y-angle (-> s5-1 quat)) (vector-y-angle s2-0)))
)
(quaternion-rotate-y! (-> s5-1 quat) (-> s5-1 quat) f0-0)
)
)
)
(set! (-> self root trans quad) (-> gp-1 quad))
)
(transform-post)
(logior! (-> self focus-status) (focus-status dangerous))
(vector-reset! (-> self root transv))
(let* ((v1-37 *game-info*)
(a0-22 (+ (-> v1-37 attack-id) 1))
)
(set! (-> v1-37 attack-id) a0-22)
(set! (-> self attack-id) a0-22)
)
(if (logtest? (enemy-option water) (-> self fact enemy-options))
(logior! (-> self enemy-flags) (enemy-flag check-water check-water-backup))
)
(logclear! (-> self draw status) (draw-control-status no-draw))
)
:exit (behavior ()
(logclear! (-> self focus-status) (focus-status dangerous))
)
:trans (behavior ()
(when (>= 61440.0 (- (-> self root trans y) (-> self jump-point y)))
(let ((v1-3 (-> self root root-prim)))
(set! (-> v1-3 prim-core collide-as) (-> self root backup-collide-as))
(set! (-> v1-3 prim-core collide-with) (-> self root backup-collide-with))
)
)
)
:code (behavior ()
(ja-channel-push! 1 (seconds 0.17))
(ja-no-eval :group! hosehead-jump-down-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
(until #f
(suspend)
)
#f
)
:post (behavior ()
(nav-enemy-falling-post)
(if (logtest? (-> self root status) (collide-status on-surface))
(go-virtual ambush-land)
)
)
)
;; failed to figure out what this is:
(defstate ambush-land (hosehead)
:virtual #t
:event enemy-event-handler
:code (behavior ()
(ja-channel-push! 1 (seconds 0.17))
(ja-no-eval :group! hosehead-jump-down-land-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
(go-hostile self)
)
:post nav-enemy-falling-post
)
;; failed to figure out what this is:
(defstate active-wall (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(set-time! (-> self state-time))
(let ((v1-2 self))
(if (not (logtest? (enemy-flag enemy-flag36) (-> v1-2 enemy-flags)))
(set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag38) (-> v1-2 enemy-flags))))
)
(set! (-> v1-2 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag36) (-> v1-2 enemy-flags))))
(set! (-> v1-2 nav callback-info) (-> v1-2 enemy-info callback-info))
)
0
(let ((v1-5 self))
(set! (-> v1-5 enemy-flags) (the-as enemy-flag (logior (enemy-flag enemy-flag37) (-> v1-5 enemy-flags))))
)
0
(stop-looking-at-target! self)
)
:trans (behavior ()
'()
)
:code (behavior ()
(ja-channel-push! 1 (seconds 0.05))
(until #f
(ja-no-eval :group! hosehead-idle-wall0-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
(suspend)
)
#f
)
:post nav-enemy-simple-post
)
;; definition for method 196 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch symbol vs none.
(defmethod hosehead-method-196 ((this hosehead))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(let ((s5-0 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> this root quat)))
(f30-0 0.0)
)
(vector-float*! s5-0 s5-0 20480.0)
(dotimes (s4-0 16)
(let ((s1-0 (new 'stack-no-clear 'vector))
(s3-0 (new 'stack-no-clear 'vector))
)
(vector-rotate-around-y! s1-0 s5-0 (* 182.04445 (the float (+ (* 11 s4-0) -90))))
(let ((v1-7 s3-0))
(let ((a0-5 (-> this root trans)))
(let ((a1-3 s1-0))
(let ((a2-2 1.0))
(.mov vf7 a2-2)
)
(.lvf vf5 (&-> a1-3 quad))
)
(.lvf vf4 (&-> a0-5 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> v1-7 quad) vf6)
)
(let ((v1-8 (-> this nav))
(a0-6 s3-0)
(a1-4 (new 'stack-no-clear 'nav-find-poly-parms))
)
(vector-! (-> a1-4 point) a0-6 (-> v1-8 state mesh bounds))
(set! (-> a1-4 y-threshold) (-> v1-8 nearest-y-threshold))
(set! (-> a1-4 ignore) (the-as uint 2))
(let ((s2-0 (find-poly-containing-point-local (-> v1-8 state mesh) a1-4)))
(when s2-0
(let ((f28-0 (vector-dot s1-0 s5-0)))
(new 'stack-no-clear 'matrix3)
(let ((a1-5 (new 'stack-no-clear 'vector)))
(set! (-> a1-5 quad) (-> s3-0 quad))
(set! (-> a1-5 w) 8192.0)
(when (not (add-root-sphere-to-hash! (-> this nav) a1-5 32))
(when (< f30-0 f28-0)
(set! f30-0 f28-0)
(let ((s0-0 (new 'stack-no-clear 'vector))
(sv-784 (new 'stack-no-clear 'vector))
(s1-1 (new 'stack 'collide-query))
)
(let ((sv-768 (-> this nav))
(sv-800 s0-0)
)
(let ((v1-22 s3-0))
(project-point-onto-plane-of-poly-local
(-> sv-768 state mesh)
s2-0
sv-800
sv-784
(vector-! (new 'stack-no-clear 'vector) v1-22 (-> sv-768 state mesh bounds))
)
)
(let ((v1-23 sv-800))
(let ((a0-17 (-> sv-768 state mesh bounds)))
(.mov.vf.w vf6 vf0)
(.lvf vf4 (&-> sv-800 quad))
(.lvf vf5 (&-> a0-17 quad))
)
(.add.vf.xyz vf6 vf4 vf5)
(.svf (&-> v1-23 quad) vf6)
)
)
0
(set! (-> s3-0 y) (-> s0-0 y))
(if (enemy-above-ground? this s1-1 s3-0 (collide-spec backgnd) 8192.0 81920.0 1024.0)
(set! (-> s3-0 y) (-> s1-1 best-other-tri intersect y))
)
)
(set! (-> this jump-point quad) (-> s3-0 quad))
)
)
)
)
)
)
)
)
)
)
(none)
)
)
;; failed to figure out what this is:
(defstate notice-wall (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(logclear! (-> self enemy-flags) (enemy-flag alert))
((-> (method-of-type nav-enemy notice) enter))
(let ((v1-4 self))
(set! (-> v1-4 enemy-flags) (the-as enemy-flag (logclear (-> v1-4 enemy-flags) (enemy-flag enemy-flag36))))
(set! (-> v1-4 nav callback-info) *nav-enemy-null-callback-info*)
)
0
(let ((v1-7 self))
(set! (-> v1-7 enemy-flags) (the-as enemy-flag (logclear (-> v1-7 enemy-flags) (enemy-flag enemy-flag37))))
)
0
(set! (-> self on-wall?) #f)
(idle-control-method-9 (-> self idle-anim-player) *hosehead-idle-ground*)
(let ((v1-10 (-> self nav)))
(set! (-> v1-10 nearest-y-threshold) 204800.0)
)
0
(let ((gp-0 #f)
(f30-0 4096.0)
)
(while (not gp-0)
(let ((s5-0 (new 'stack-no-clear 'vector)))
(let ((s4-0 (-> self root trans)))
(let ((v0-2 (vector-z-quaternion! (new 'stack-no-clear 'vector) (-> self root quat))))
(let ((v1-15 f30-0))
(.mov vf7 v1-15)
)
(.lvf vf5 (&-> v0-2 quad))
)
(.lvf vf4 (&-> s4-0 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> s5-0 quad) vf6)
(let ((v1-16 (-> self nav))
(a0-9 s5-0)
(a1-4 (new 'stack-no-clear 'nav-find-poly-parms))
)
(vector-! (-> a1-4 point) a0-9 (-> v1-16 state mesh bounds))
(set! (-> a1-4 y-threshold) (-> v1-16 nearest-y-threshold))
(set! (-> a1-4 ignore) (the-as uint 2))
(let ((s2-0 (find-poly-containing-point-local (-> v1-16 state mesh) a1-4)))
(set! (-> self jump-point quad) (-> s5-0 quad))
(when s2-0
(let ((s3-0 (new 'stack-no-clear 'vector))
(sv-688 (new 'stack-no-clear 'vector))
(s4-1 (new 'stack 'collide-query))
)
(let ((s0-0 (-> self nav))
(s1-0 s3-0)
)
(let ((v1-22 s5-0))
(project-point-onto-plane-of-poly-local
(-> s0-0 state mesh)
s2-0
s1-0
sv-688
(vector-! (new 'stack-no-clear 'vector) v1-22 (-> s0-0 state mesh bounds))
)
)
(vector+! s1-0 s1-0 (-> s0-0 state mesh bounds))
)
0
(set! (-> s5-0 y) (-> s3-0 y))
(when (enemy-above-ground? self s4-1 s5-0 (collide-spec backgnd) 8192.0 81920.0 1024.0)
(set! (-> s5-0 y) (-> s4-1 best-other-tri intersect y))
(set! gp-0 #t)
)
)
(set! (-> self jump-point quad) (-> s5-0 quad))
)
)
)
)
(set! f30-0 (+ 4096.0 f30-0))
(when (< 61440.0 f30-0)
(format #t "!!!!! Hosehead jump point not found~%")
(set! gp-0 #t)
)
)
)
)
)
:code (behavior ()
(set! (-> self come-from-notice) #t)
(ja-channel-push! 1 (seconds 0.05))
(until #f
(ja-no-eval :group! hosehead-walk-wall-ja :num! (seek! max 1.5) :frame-num 0.0)
(until (ja-done? 0)
(set! (-> self root trans y) (- (-> self root trans y) (* 36864.0 (seconds-per-frame))))
(hosehead-method-186 self)
(suspend)
(ja :num! (seek! max 1.5))
)
(when (< (- (-> self root trans y) (-> self jump-point y)) 40960.0)
(hosehead-method-196 self)
(set! (-> self enemy-flags)
(the-as enemy-flag (logclear (-> self enemy-flags) (enemy-flag jump-check-blocked)))
)
(send-event self 'jump 0 (-> self jump-point))
)
(suspend)
)
#f
)
:post (behavior ()
(nav-enemy-simple-post)
)
)
;; failed to figure out what this is:
(defstate active (hosehead)
:virtual #t
:enter (behavior ()
(if (-> self on-wall?)
(go-virtual active-wall)
)
(let ((t9-1 (-> (method-of-type nav-enemy active) enter)))
(if t9-1
(t9-1)
)
)
)
)
;; failed to figure out what this is:
(defstate knocked (hosehead)
:virtual #t
:enter (behavior ()
(if (logtest? (enemy-option water) (-> self fact enemy-options))
(logior! (-> self enemy-flags) (enemy-flag check-water check-water-backup))
)
(let ((t9-0 (-> (method-of-type nav-enemy knocked) enter)))
(if t9-0
(t9-0)
)
)
)
)
;; failed to figure out what this is:
(defstate jump (hosehead)
:virtual #t
:enter (behavior ()
(if (logtest? (enemy-option water) (-> self fact enemy-options))
(logior! (-> self enemy-flags) (enemy-flag check-water check-water-backup))
)
(let ((t9-0 (-> (method-of-type nav-enemy jump) enter)))
(if t9-0
(t9-0)
)
)
)
)
;; definition for method 195 of type hosehead
(defmethod hosehead-method-195 ((this hosehead))
(= *target* (handle->process (-> this focus handle)))
)
;; failed to figure out what this is:
(defstate fire (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(logior! (-> self skel status) (joint-control-status sync-math))
(logior! (-> self focus-status) (focus-status dangerous))
(let* ((v1-5 *game-info*)
(a0-2 (+ (-> v1-5 attack-id) 1))
)
(set! (-> v1-5 attack-id) a0-2)
(set! (-> self attack-id) a0-2)
)
(set! (-> self fire-beam?) #f)
(let ((gp-1 (vector-! (new 'stack-no-clear 'vector) (-> self target-pos) (-> self root trans)))
(a2-0 (vector-x-quaternion! (new 'stack-no-clear 'vector) (-> self root quat)))
(s5-0 (new 'stack-no-clear 'vector))
)
(set! (-> gp-1 y) 0.0)
(let ((a1-1 s5-0))
(let ((v1-8 (-> self target-pos)))
(let ((a0-6 a2-0))
(let ((a2-3 (the-as float (if (< 0.0 (vector-dot gp-1 a2-0))
#x47200000
-954204160
)
)
)
)
(.mov vf7 a2-3)
)
(.lvf vf5 (&-> a0-6 quad))
)
(.lvf vf4 (&-> v1-8 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a1-1 quad) vf6)
)
(set! (-> self head-angle)
(deg-diff
(vector-y-angle gp-1)
(vector-y-angle (vector-! (new 'stack-no-clear 'vector) s5-0 (-> self root trans)))
)
)
)
(set! (-> self head-angle-inc) (* -1.0 (-> self head-angle)))
(if (not (hosehead-method-195 self))
(go-hostile self)
)
(set! (-> self lazer-dist) 0.0)
(set! (-> self lazer-length) 0.0)
)
)
:exit (behavior ()
(sound-stop (-> self lazer-sound))
(sound-stop (-> self lazer-sound2))
(logclear! (-> self skel status) (joint-control-status sync-math))
(set! (-> self allow-head) #f)
(set! (-> self fire-beam?) #f)
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
)
:code (behavior ()
(let ((f30-0 (rnd-float-range self 0.9 1.1)))
(set! (-> self allow-head) #t)
(ja-channel-push! 1 (seconds 0.1))
(ja-no-eval :group! hosehead-shoot-start-ja :num! (seek! max f30-0) :frame-num 0.0)
(until (ja-done? 0)
(hosehead-method-189 self)
(suspend)
(ja :num! (seek! max f30-0))
)
(set! (-> self fire-beam?) #t)
(let ((gp-0 (+ (current-time) (seconds 2))))
(until #f
(when (or (< gp-0 (current-time)) (not (-> self fire-beam?)) (not (enemy-method-96 self 8192.0 #t)))
(set! (-> self fire-beam?) #f)
(set! (-> self allow-head) #f)
(goto cfg-13)
)
(suspend)
(+! (-> self head-angle) (* (-> self head-angle-inc) (seconds-per-frame)))
)
)
#f
(label cfg-13)
(sound-stop (-> self lazer-sound))
(sound-stop (-> self lazer-sound2))
(ja-no-eval :group! hosehead-shoot-end-ja :num! (seek! max f30-0) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek! max f30-0))
)
)
(go-hostile self)
)
:post (behavior ()
(enemy-simple-post)
(if (-> self fire-beam?)
(hosehead-method-197 self)
)
)
)
;; failed to figure out what this is:
(defstate attack (hosehead)
:virtual #t
:event enemy-event-handler
:enter (behavior ()
(logior! (-> self focus-status) (focus-status dangerous))
(let* ((v1-2 *game-info*)
(v0-0 (+ (-> v1-2 attack-id) 1))
)
(set! (-> v1-2 attack-id) v0-0)
(set! (-> self attack-id) v0-0)
)
)
:exit (behavior ()
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
)
:code (behavior ()
(ja-channel-push! 1 (seconds 0.2))
(cond
((zero? (rnd-int-count self 2))
(ja-no-eval :group! hosehead-attack1-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
(else
(ja-no-eval :group! hosehead-attack0-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
)
(if (logtest? (-> self enemy-flags) (enemy-flag dangerous-backup))
(logior! (-> self focus-status) (focus-status dangerous))
(logclear! (-> self focus-status) (focus-status dangerous))
)
(let ((v1-57 (rnd-int-count self 4)))
(cond
((zero? v1-57)
(ja-no-eval :group! hosehead-idle1-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
((= v1-57 1)
(ja-no-eval :group! hosehead-idle2-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
)
)
(go-hostile self)
)
:post enemy-simple-post
)
;; failed to figure out what this is:
(defstate hostile (hosehead)
:virtual #t
:enter (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy hostile) enter)))
(if t9-0
(t9-0)
)
)
(nav-enemy-method-166 self)
(set-time! (-> self last-time-dist-changed))
(set! (-> self next-lazer-time) 0)
(set-time! (-> self state-time))
)
:exit (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy hostile) exit)))
(if t9-0
(t9-0)
)
)
(set! (-> self come-from-notice) #f)
)
:trans (behavior ()
(let ((t9-0 (-> (method-of-type nav-enemy hostile) trans)))
(if t9-0
(t9-0)
)
)
(hosehead-method-189 self)
(let ((f30-0 (vector-vector-xz-distance (-> self target-pos) (-> self root trans))))
(if (and (enemy-method-96 self 6371.5557 #t) (< f30-0 18432.0))
(go-virtual attack)
)
(cond
((focus-test? self touch-water under-water)
(set! (-> self next-lazer-time) 0)
0
)
((zero? (-> self next-lazer-time))
(set! (-> self next-lazer-time) (+ (current-time) (the int (* 300.0 (rnd-float-range self 1.0 2.0)))))
)
((>= (current-time) (-> self next-lazer-time))
(if (and (enemy-method-96 self 3640.889 #t) (and (< 40960.0 f30-0) (hosehead-method-190 self)))
(go-virtual fire)
)
)
)
)
)
:code (behavior ()
(ja-channel-push! 1 (seconds 0.2))
(if (zero? (rnd-int-count self 5))
(ja :group! hosehead-run1-ja)
(ja :group! hosehead-run-ja)
)
(ja :num-func num-func-identity :frame-num 0.0)
(let ((f30-0 (rnd-float-range self 0.9 1.1)))
(until #f
(suspend)
(ja :num! (loop! f30-0))
)
)
#f
)
:post nav-enemy-chase-post
)
;; failed to figure out what this is:
(defstate notice (hosehead)
:virtual #t
:code (behavior ()
(set! (-> self come-from-notice) #t)
(ja-channel-push! 1 (seconds 0.075))
(let ((f30-0 (rnd-float-range self 0.8 1.2)))
(new 'stack-no-clear 'vector)
(ja-no-eval :group! (-> self draw art-group data (-> self enemy-info notice-anim))
:num! (seek! max f30-0)
:frame-num 0.0
)
(until (ja-done? 0)
(let ((a0-4 (handle->process (-> self focus handle))))
(if a0-4
(seek-toward-heading-vec!
(-> self root)
(vector-! (new 'stack-no-clear 'vector) (get-trans (the-as process-focusable a0-4) 0) (-> self root trans))
131072.0
(seconds 0.05)
)
)
)
(suspend)
(ja :num! (seek! max f30-0))
)
)
(react-to-focus self)
)
)
;; failed to figure out what this is:
(defstate debug-control (hosehead)
:virtual #t
:code (behavior ()
(let ((v1-0 *nav-enemy-debug-control-info*))
(set! (-> v1-0 steering) 0.0)
(set! (-> v1-0 throttle) 0.0)
)
(ja-channel-push! 1 (seconds 0.2))
(until #f
(ja-no-eval :group! hosehead-run1-ja :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
#f
)
)
;; definition for method 187 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defmethod hosehead-method-187 ((this hosehead) (arg0 vector))
(let ((sv-128 (new 'stack-no-clear 'vector))
(s3-0 (new 'stack-no-clear 'vector))
(s1-0 (new 'stack-no-clear 'vector))
(s0-0 (new 'stack-no-clear 'vector))
(s4-0 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'vector))
)
(let ((a0-1 (-> this node-list data 9 bone transform)))
(matrix->trans a0-1 s1-0)
)
(vector-z-quaternion! s0-0 (-> this root quat))
(vector-! sv-128 arg0 s1-0)
(vector-normalize! sv-128 1.0)
(rot-zxy-from-vector! s4-0 s0-0)
(rot-zxy-from-vector! s3-0 sv-128)
(set! (-> s5-0 x) (fmax -1820.4445 (fmin 1820.4445 (deg- (-> s3-0 x) (-> s4-0 x)))))
(set! (-> s5-0 y) (fmax -3640.889 (fmin 3640.889 (deg- (-> s3-0 y) (-> s4-0 y)))))
(set! (-> s5-0 z) 0.0)
(if (not (logtest? (enemy-flag drawn-mirrored) (-> this enemy-flags)))
(set! (-> s5-0 y) (- (-> s5-0 y)))
)
(+! (-> s5-0 y) (-> this head-angle))
(let ((s4-1 (new 'stack-no-clear 'quaternion)))
(quaternion-zxy! s4-1 s5-0)
(quaternion-pseudo-seek (-> this head-joint-mod quat) (-> this head-joint-mod quat) s4-1 (seconds-per-frame))
)
)
0
(none)
)
;; definition for method 188 of type hosehead
;; WARN: Return type mismatch quaternion vs none.
(defmethod hosehead-method-188 ((this hosehead))
(let ((gp-0 (new 'stack-no-clear 'quaternion)))
(quaternion-identity! gp-0)
(quaternion-pseudo-seek (-> this head-joint-mod quat) (-> this head-joint-mod quat) gp-0 (seconds-per-frame))
)
(none)
)
;; definition for method 55 of type hosehead
(defmethod common-post ((this hosehead))
"Does a lot of various things relating to interacting with the target
- tracks when the enemy was last drawn
- looks at the target and handles attacking
@TODO Not extremely well understood yet"
(let ((t9-0 (method-of-type nav-enemy common-post)))
(t9-0 this)
)
(hosehead-method-194 this)
(dotimes (s5-0 4)
(enable-set! (-> this joint-ik s5-0) #t)
)
(let ((v1-11 (handle->process (-> this focus handle))))
(if (and (-> this allow-head) v1-11)
(hosehead-method-187 this (-> this target-pos))
(hosehead-method-188 this)
)
)
(none)
)
;; definition for method 194 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defmethod hosehead-method-194 ((this hosehead))
(rlet ((acc :class vf)
(vf0 :class vf)
(vf4 :class vf)
(vf5 :class vf)
(vf6 :class vf)
(vf7 :class vf)
)
(init-vf0-vector)
(let ((s5-0 (new 'stack-no-clear 'collide-query)))
(let ((v1-0 (-> s5-0 bbox))
(a0-2 (-> this root trans))
(a1-0 (new 'stack-no-clear 'vector))
)
(set! (-> a1-0 x) 14336.0)
(set! (-> a1-0 y) 14336.0)
(set! (-> a1-0 z) 14336.0)
(set! (-> a1-0 w) 1.0)
(vector-! (-> v1-0 min) a0-2 a1-0)
)
(let ((v1-2 (-> s5-0 bbox max))
(a0-4 (-> this root trans))
(a1-1 (new 'stack-no-clear 'vector))
)
(set! (-> a1-1 x) 14336.0)
(set! (-> a1-1 y) 14336.0)
(set! (-> a1-1 z) 14336.0)
(set! (-> a1-1 w) 1.0)
(vector+! v1-2 a0-4 a1-1)
)
(set! (-> s5-0 collide-with) (collide-spec backgnd))
(set! (-> s5-0 ignore-process0) #f)
(set! (-> s5-0 ignore-process1) #f)
(set! (-> s5-0 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(fill-using-bounding-box *collide-cache* s5-0)
(dotimes (s4-0 4)
(-> this joint-ik s4-0 shoulder-matrix-no-ik)
(let ((a2-8 (-> this joint-ik s4-0 elbow-matrix-no-ik))
(v1-15 (new 'stack-no-clear 'vector))
(s3-0 (new 'stack-no-clear 'vector))
)
(set! (-> s3-0 quad) (-> this node-list data 3 bone transform vector 1 quad))
(new 'stack-no-clear 'vector)
(let ((s2-0 (new 'stack-no-clear 'vector)))
(let ((a1-3 v1-15))
(let ((a0-11 (-> a2-8 trans)))
(let ((a2-9 (-> a2-8 vector 1)))
(let ((a3-2 (-> *hosehead-ik-setup* s4-0 hand-dist)))
(.mov vf7 a3-2)
)
(.lvf vf5 (&-> a2-9 quad))
)
(.lvf vf4 (&-> a0-11 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a1-3 quad) vf6)
)
(set! (-> s2-0 quad) (-> v1-15 quad))
(let ((a1-4 (-> s5-0 start-pos)))
(let ((v1-17 s2-0))
(let ((a0-13 s3-0))
(let ((a2-11 12288.0))
(.mov vf7 a2-11)
)
(.lvf vf5 (&-> a0-13 quad))
)
(.lvf vf4 (&-> v1-17 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> a1-4 quad) vf6)
)
(vector-float*! (-> s5-0 move-dist) s3-0 -24576.0)
(let ((v1-20 s5-0))
(set! (-> v1-20 radius) 40.96)
(set! (-> v1-20 collide-with) (collide-spec backgnd))
(set! (-> v1-20 ignore-process0) #f)
(set! (-> v1-20 ignore-process1) #f)
(set! (-> v1-20 ignore-pat) (new 'static 'pat-surface :noentity #x1 :nojak #x1 :probe #x1 :noendlessfall #x1))
(set! (-> v1-20 action-mask) (collide-action solid))
)
(let ((f0-12 (probe-using-line-sphere *collide-cache* s5-0)))
(when (>= f0-12 0.0)
(let ((s1-0 (new 'stack-no-clear 'vector)))
(let ((v1-24 (-> s5-0 start-pos)))
(let ((a0-20 (-> s5-0 move-dist)))
(let ((a1-7 f0-12))
(.mov vf7 a1-7)
)
(.lvf vf5 (&-> a0-20 quad))
)
(.lvf vf4 (&-> v1-24 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> s1-0 quad) vf6)
(let* ((f0-14 (- (-> s2-0 y) (-> s1-0 y)))
(f0-15 (lerp-scale 1.0 0.0 f0-14 0.0 8192.0))
)
(- (-> s1-0 y) (-> this root trans y))
(let ((f1-5 (vector-dot s3-0 (vector-! (new 'stack-no-clear 'vector) s1-0 (-> this root trans))))
(v1-29 s2-0)
)
(let ((a0-23 s2-0))
(let ((a1-11 (* f0-15 f1-5)))
(.mov vf7 a1-11)
)
(.lvf vf5 (&-> s3-0 quad))
(.lvf vf4 (&-> a0-23 quad))
)
(.add.x.vf.w vf6 vf0 vf0)
(.mul.x.vf.xyz acc vf5 vf7)
(.add.mul.w.vf.xyz vf6 vf4 vf0 acc)
(.svf (&-> v1-29 quad) vf6)
)
)
)
)
)
(handle-copy! (-> this joint-ik s4-0) s2-0)
)
)
)
)
0
(none)
)
)
;; definition for method 106 of type hosehead
;; WARN: Return type mismatch symbol vs none.
(defmethod set-incoming-attack-info ((this hosehead) (arg0 process) (arg1 object) (arg2 penetrate) (arg3 attack-info))
(let ((t9-0 (method-of-type nav-enemy set-incoming-attack-info)))
(t9-0 this arg0 arg1 arg2 arg3)
)
(let ((a1-3 (get-attacker this arg0 arg3)))
(if (and a1-3 (logtest? (process-mask bot) (-> a1-3 mask)))
(set! (-> this shot-by-ruffian?) #t)
(set! (-> this shot-by-ruffian?) #f)
)
)
(none)
)
;; definition for method 56 of type hosehead
(defmethod damage-amount-from-attack ((this hosehead) (arg0 process) (arg1 event-message-block))
"@returns the amount of damage taken from an attack. This can come straight off the [[attack-info]] or via [[penetrate-using->damage]]"
(let* ((t9-0 (method-of-type nav-enemy damage-amount-from-attack))
(v0-0 (t9-0 this arg0 arg1))
)
(if (-> this shot-by-ruffian?)
(set! v0-0 0)
)
v0-0
)
)
;; definition for method 58 of type hosehead
(defmethod enemy-method-58 ((this hosehead) (arg0 process) (arg1 event-message-block))
(let* ((t9-0 (method-of-type nav-enemy enemy-method-58))
(v0-0 (t9-0 this arg0 arg1))
)
(if (and (-> this sentry?) (nonzero? (-> this hit-points)) (zero? (-> this fated-time)))
(set! v0-0 'hit)
)
v0-0
)
)
;; definition for method 7 of type hosehead
(defmethod relocate ((this hosehead) (offset int))
(if (nonzero? (-> this head-joint-mod))
(&+! (-> this head-joint-mod) offset)
)
(dotimes (v1-4 4)
(if (nonzero? (-> this joint-ik v1-4))
(&+! (-> this joint-ik v1-4) offset)
)
)
(call-parent-method this offset)
)
;; definition for method 115 of type hosehead
;; INFO: Used lq/sq
;; WARN: Return type mismatch int vs none.
(defmethod init-enemy! ((this hosehead))
"Common method called to initialize the enemy, typically sets up default field values and calls ancillary helper methods"
(stack-size-set! (-> this main-thread) 256)
(set! (-> this on-stop-sentry) #f)
(initialize-skeleton
this
(the-as skeleton-group (art-group-get-by-name *level* "skel-hosehead" (the-as (pointer uint32) #f)))
(the-as pair 0)
)
(let* ((sv-16 (new 'static 'res-tag))
(a0-5 (res-lump-data (-> this entity) 'trans-offset (pointer float) :tag-ptr (& sv-16)))
)
(when a0-5
(let ((v1-7 (-> this root)))
(+! (-> v1-7 trans x) (-> a0-5 0))
(+! (-> v1-7 trans y) (-> a0-5 1))
(+! (-> v1-7 trans z) (-> a0-5 2))
)
)
)
(let ((f0-6 (res-lump-float (-> this entity) 'rotoffset)))
(if (!= f0-6 0.0)
(quaternion-rotate-local-y! (-> this root quat) (-> this root quat) f0-6)
)
)
(let ((f0-7 (res-lump-float (-> this entity) 'extra-float-param :default 30.0)))
(set! (-> this angle-sentry) (* 182.04445 f0-7))
)
(set! (-> this on-wall?) #f)
(when (>= (res-lump-value (-> this entity) 'extra-id int :default (the-as uint128 -1) :time -1000000000.0) 0)
(set! (-> this on-wall?) #t)
(set! (-> this enemy-flags)
(the-as enemy-flag (logior (enemy-flag no-initial-move-to-ground) (-> this enemy-flags)))
)
)
(init-enemy-behaviour-and-stats! this *hosehead-nav-enemy-info*)
(set! (-> this sentry?) (logtest? (-> this fact enemy-options) (enemy-option user9)))
(when (-> this sentry?)
(set! (-> this root pause-adjust-distance) 409600.0)
(set! (-> this on-stop-sentry) (res-lump-struct (-> this entity) 'on-stop-sentry function))
)
(let ((v1-34 (-> this nav)))
(set! (-> v1-34 speed-scale) 1.0)
)
0
(set-gravity-length (-> this root dynam) 327680.0)
(add-connection
*part-engine*
this
9
this
318
(new 'static 'vector :x 2048.0 :y -40.96 :z 1392.64 :w 163840.0)
)
(add-connection
*part-engine*
this
9
this
318
(new 'static 'vector :x -2048.0 :y -40.96 :z 1392.64 :w 163840.0)
)
(if (-> this on-wall?)
(idle-control-method-9 (-> this idle-anim-player) *hosehead-idle-wall*)
(idle-control-method-9 (-> this idle-anim-player) *hosehead-idle-ground*)
)
(let* ((sv-32 (new 'static 'res-tag))
(v1-49 (res-lump-data (-> this entity) 'actor-groups pointer :tag-ptr (& sv-32)))
)
(cond
((and v1-49 (nonzero? (-> sv-32 elt-count)))
(set! (-> this actor-group) (the-as (pointer actor-group) v1-49))
(set! (-> this actor-group-count) (the-as int (-> sv-32 elt-count)))
)
(else
(set! (-> this actor-group) (the-as (pointer actor-group) #f))
(set! (-> this actor-group-count) 0)
(go process-drawable-art-error "actor-group sewesc")
)
)
)
(set! (-> this head-joint-mod) (new 'process 'joint-mod (joint-mod-mode joint-set*) this 9))
(dotimes (s5-1 4)
(set! (-> this joint-ik s5-1) (new
'process
'joint-mod-ik
this
(-> *hosehead-ik-setup* s5-1 elbow-index)
(-> *hosehead-ik-setup* s5-1 hand-dist)
)
)
(set! (-> this joint-ik s5-1 elbow-pole-vector-axis) (the-as uint 2))
(set! (-> this joint-ik s5-1 elbow-rotation-axis) (the-as uint 0))
)
(logior! (-> this joint-ik 0 flags) (joint-mod-ik-flags elbow-trans-neg))
(logior! (-> this joint-ik 2 flags) (joint-mod-ik-flags elbow-trans-neg))
(set! (-> this come-from-notice) #t)
(set! (-> this lazer-sound) (new-sound-id))
(set! (-> this lazer-sound2) (new-sound-id))
(let ((a1-22 (new 'stack-no-clear 'sync-info-params)))
(let ((v1-77 0))
(if #t
(set! v1-77 (logior v1-77 1))
)
(set! (-> a1-22 sync-type) 'sync-eased)
(set! (-> a1-22 sync-flags) (the-as sync-flags v1-77))
)
(set! (-> a1-22 period) (the-as uint 1200))
(set! (-> a1-22 entity) (-> this entity))
(set! (-> a1-22 percent) 0.0)
(set! (-> a1-22 ease-in) 0.15)
(set! (-> a1-22 ease-out) 0.15)
(set! (-> a1-22 pause-in) 0.0)
(set! (-> a1-22 pause-out) 0.0)
(initialize! (-> this sync) a1-22)
)
0
(none)
)
;; definition for method 66 of type hosehead
(defmethod go-ambush ((this hosehead))
(go (method-of-object this ambush))
)
;; definition for method 70 of type hosehead
(defmethod go-hostile ((this hosehead))
(if (-> this sentry?)
(go (method-of-object this hostile-sentry))
(go (method-of-object this hostile))
)
)
;; definition for method 116 of type hosehead
;; WARN: Return type mismatch object vs none.
(defmethod go-idle ((this hosehead))
(if (-> this sentry?)
(go (method-of-object this idle-sentry))
(go (method-of-object this idle))
)
(none)
)