;;-*-Lisp-*- (in-package goal) ;; name: voicebox.gc ;; name in dgo: voicebox ;; dgos: ENGINE, GAME ;; DECOMP BEGINS (defpartgroup group-talkbox-speak :id 77 :flags (unk-4 unk-6) :bounds (static-bspherem 0 0 0 2) :rotate ((degrees 4) (degrees 0) (degrees 0)) :parts ((sp-item 265 :flags (is-3d bit6 bit7) :period 130 :length 30) (sp-item 265 :flags (is-3d bit6 bit7) :period 150 :length 35 :offset 5) (sp-item 265 :flags (is-3d bit6 bit7) :period 330 :length 25 :offset 35) (sp-item 265 :flags (is-3d bit6 bit7) :period 250 :length 60 :offset 15) (sp-item 265 :flags (is-3d bit6 bit7) :period 465 :length 75 :offset 60) ) ) (defpart 265 :init-specs ((sp-tex spt-texture (new 'static 'texture-id :index #xcb :page #xc)) (sp-func spt-birth-func 'birth-func-set-vel) (sp-rnd-flt spt-num 0.0 0.3 1.0) (sp-flt spt-y (meters 0.15)) (sp-flt spt-z (meters 0.4)) (sp-flt spt-scale-x (meters 0.1)) (sp-copy-from-other spt-scale-y -4) (sp-flt spt-r 255.0) (sp-flt spt-g 255.0) (sp-flt spt-b 255.0) (sp-flt spt-a 16.0) (sp-rnd-flt spt-vel-y (meters 0.006666667) (meters 0.0033333334) 1.0) (sp-rnd-flt spt-scalevel-x (meters 0.006666667) (meters 0.0033333334) 1.0) (sp-copy-from-other spt-scalevel-y -4) (sp-flt spt-fade-a 0.32) (sp-int spt-timer 100) (sp-cpuinfo-flags sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 left-multiply-quat) (sp-int spt-next-time 50) (sp-launcher-by-id spt-next-launcher 266) (sp-flt spt-rotate-y (degrees 0.0)) ) ) (defpart 266 :init-specs ((sp-flt spt-fade-a -0.64)) ) (deftype camera-remote (camera-slave) () :heap-base #xa20 :method-count-assert 14 :size-assert #xa94 :flag-assert #xe0a200a94 ) (deftype remote (process-drawable) ((parent-override (pointer camera-slave) :offset 16) (base-trans vector :inline :offset-assert 208) (focus focus :inline :offset-assert 224) (seeker cam-float-seeker :inline :offset-assert 236) (start-time time-frame :offset-assert 264) (blend float :offset-assert 272) (twist float :offset-assert 276) (speak-effect? basic :offset-assert 280) ) :heap-base #xa0 :method-count-assert 26 :size-assert #x11c :flag-assert #x1a00a0011c (:methods (enter () _type_ :state 20) (idle () _type_ :state 21) (exit () _type_ :state 22) (init (_type_) none 23) (get-track-pt-and-scale (_type_ vector) float 24) (post-common (_type_) none 25) ) ) (defskelgroup skel-voicebox talk-box talk-box-lod0-jg talk-box-idle-ja ((talk-box-lod0-mg (meters 999999))) :bounds (static-spherem 0 0 0 4) :texture-level 6 :sort 1 ) (defmethod get-track-pt-and-scale remote ((obj remote) (arg0 vector)) (let ((s4-0 (handle->process (-> obj focus handle)))) (when s4-0 (set! (-> arg0 quad) (-> (get-trans (the-as process-focusable s4-0) 3) quad)) (let ((a0-7 (vector-z-quaternion! (new 'stack-no-clear 'vector) (get-quat (the-as process-focusable s4-0) 0)))) (vector+float*! arg0 arg0 a0-7 (* -16384.0 (- 1.0 (-> obj blend)))) ) ) ) (lerp-scale 1.0 0.0 (-> obj blend) 0.8 1.0) ) (defmethod post-common remote ((obj remote)) (with-pp (rlet ((acc :class vf) (vf0 :class vf) (vf4 :class vf) (vf5 :class vf) (vf6 :class vf) (vf7 :class vf) ) (init-vf0-vector) (ja-post) (if (type? (-> obj root) collide-shape) (update-transforms (the-as collide-shape (-> obj root))) ) (when (and (nonzero? (-> obj part)) (and (or (and (-> obj next-state) (= (-> obj next-state name) 'idle)) (and (-> obj next-state) (= (-> obj next-state name) 'enter)) ) (-> obj speak-effect?) ) ) (let ((v1-15 (vector-float*! (new 'stack-no-clear 'vector) (-> obj parent-override 0 velocity) (-> pp clock frames-per-second) ) ) (a0-8 *particle-vel*) ) (let ((a1-4 (-> obj node-list data 3 bone transform vector 2))) (let ((a2-1 20480.0)) (.mov vf7 a2-1) ) (.lvf vf5 (&-> a1-4 quad)) ) (.lvf vf4 (&-> v1-15 quad)) (.add.x.vf vf6 vf0 vf0 :mask #b1000) (.mul.x.vf acc vf5 vf7 :mask #b111) (.add.mul.w.vf vf6 vf4 vf0 acc :mask #b111) (.svf (&-> a0-8 quad) vf6) ) (let ((v1-16 *particle-vel*) (a0-9 *particle-vel*) (f0-2 300.0) ) (vector-float*! v1-16 a0-9 (/ 1.0 f0-2)) ) (spawn-with-cspace (-> obj part) (-> obj node-list data 3)) ) 0 (none) ) ) ) (defbehavior remote-track remote () (let ((gp-0 (handle->process (-> self focus handle))) (s5-0 (new 'stack-no-clear 'vector)) ) (set! (-> s5-0 quad) (-> self parent-override 0 trans quad)) (let ((f30-0 (get-track-pt-and-scale self s5-0))) (let ((a1-2 (new 'stack-no-clear 'vector))) (set! (-> a1-2 quad) (-> self parent-override 0 trans quad)) (vector-lerp! (-> self root trans) a1-2 s5-0 (-> self blend)) ) (+! (-> self root trans y) (* 1638.4 (sin (* 54.613335 (the float (mod (-> self clock frame-counter) 1200))))) ) (let ((s5-1 (new 'stack-no-clear 'quaternion))) (forward-up->quaternion s5-1 (vector-normalize! (vector-! (new 'stack-no-clear 'vector) (target-pos 8) (-> self root trans)) 1.0) (new 'static 'vector :y 1.0 :w 1.0) ) (rotate-toward-orientation! (-> self root) s5-1 65536.0 5461.3335 150 150 0.0) ) (when gp-0 (let* ((gp-1 (-> (the-as process-drawable gp-0) root)) (s4-1 (-> self root trans)) (f0-6 (deg-diff (y-angle gp-1) (vector-y-angle (vector-! (new 'stack-no-clear 'vector) s4-1 (-> gp-1 trans)))) ) ) (if (< 0.0 f0-6) (seek! (-> self twist) -0.4 (* 0.3 (-> self clock seconds-per-frame))) (seek! (-> self twist) 0.4 (* 0.3 (-> self clock seconds-per-frame))) ) ) (let ((a1-9 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-9 from) (process->ppointer self)) (set! (-> a1-9 num-params) 0) (set! (-> a1-9 message) 'blocked-side?) (case (send-event-function (ppointer->process (-> self parent-override)) a1-9) ((1) (set! (-> self twist) 0.5) ) ((2) (set! (-> self twist) -0.5) ) ((3) (set! (-> self twist) 0.0) ) ) ) (send-event (ppointer->process (-> self parent-override)) 'joystick (-> self twist) -1082130432) ) (set! (-> self root scale x) f30-0) (set! (-> self root scale y) f30-0) (set! (-> self root scale z) f30-0) ) ) 0 (none) ) (defstate enter (remote) :virtual #t :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) (case event-type (('die) (go-virtual exit) ) (('speak-effect) (let ((v0-0 (the-as object (-> event param 0)))) (set! (-> self speak-effect?) (the-as basic v0-0)) v0-0 ) ) ) ) :enter (behavior () (set! (-> self start-time) (-> *display* game-clock frame-counter)) (let* ((gp-0 (ppointer->process (-> self parent-override 0 parent))) (a1-1 (if (type? gp-0 process-focusable) gp-0 ) ) ) (if a1-1 (try-update-focus (-> self focus) (the-as process-focusable a1-1)) ) ) (none) ) :trans (behavior () (remote-track) (let ((a0-1 (handle->process (-> self focus handle)))) (if (and a0-1 (< 0.1 (-> self blend))) (point-toward-point-clear-roll-pitch! (-> self root) (get-trans (the-as process-focusable a0-1) 0)) ) ) (none) ) :code (behavior () (let* ((gp-0 (ppointer->process (-> self parent-override 0 parent))) (a0-1 (if (type? gp-0 process-focusable) (the-as process-focusable gp-0) ) ) ) (if (and a0-1 (logtest? (focus-status pilot) (-> a0-1 focus-status))) (send-event (ppointer->process (-> self parent-override)) 'set-dist (new 'static 'vector :z 8192.0 :w 1.0) (new 'static 'vector :y 20480.0 :z 12288.0 :w 1.0) ) (send-event (ppointer->process (-> self parent-override)) 'set-dist (new 'static 'vector :z 16384.0 :w 1.0) (new 'static 'vector :y 20480.0 :z 40960.0 :w 1.0) ) ) ) (init (-> self seeker) 1.0 0.01 0.022222223 0.1) (set! (-> self seeker target) 0.0) (while (< 0.0001 (-> self blend)) (update! (-> self seeker) 0.0) (set! (-> self blend) (-> self seeker value)) (suspend) ) (set! (-> self blend) 0.0) (go-virtual idle) (none) ) :post (behavior () (post-common self) (none) ) ) (defstate idle (remote) :virtual #t :event (-> (method-of-type remote enter) event) :trans remote-track :code (behavior () (while (handle->process (-> self focus handle)) (suspend) (ja :num! (loop!)) ) (go-virtual exit) (none) ) :post (-> (method-of-type remote enter) post) ) (defstate exit (remote) :virtual #t :trans remote-track :code (behavior () (set! (-> self blend) 1.0) (send-event (ppointer->process (-> self parent-override)) 'change-state empty-state) (suspend) 0 (none) ) :post (-> (method-of-type remote enter) post) ) ;; WARN: Return type mismatch remote vs none. (defmethod init remote ((obj remote)) (reset-to-collide-spec (-> obj focus) (collide-spec jak player-list)) (initialize-skeleton obj (the-as skeleton-group (art-group-get-by-name *level* "skel-voicebox" (the-as (pointer uint32) #f))) (the-as pair 0) ) (set! (-> obj blend) 1.0) (set! (-> obj draw light-index) (the-as uint 30)) (set! (-> obj speak-effect?) #f) (set! (-> obj part) (create-launch-control (-> *part-group-id-table* 77) obj)) (none) ) (defstate cam-remote (camera-slave) :event (-> cam-string event) :enter (-> cam-string enter) :trans (behavior () (if (or (not *camera*) (not (logtest? (-> *camera* master-options) (cam-master-options-u32 HAVE_TARGET))) (not (-> self child)) ) (deactivate self) ) (none) ) :code (-> cam-string code) ) (deftype voicebox (remote) ((hint handle :offset-assert 288) ) :heap-base #xb0 :method-count-assert 26 :size-assert #x128 :flag-assert #x1a00b00128 ) (defstate exit (voicebox) :virtual #t :code (behavior () (remove-setting! 'sound-flava) (set! (-> self state-time) (-> self clock frame-counter)) (set! (-> self seeker target) 1.0) (while (and (< (-> self blend) 0.9999) (not (and (not (handle->process (-> self hint))) (>= (- (-> self clock frame-counter) (-> self state-time)) (seconds 0.05)) (-> *setting-control* user-current hint) ) ) ) (update! (-> self seeker) 0.0) (set! (-> self blend) (-> self seeker value)) (suspend) ) (set! (-> self blend) 1.0) (send-event (ppointer->process (-> self parent-override)) 'change-state empty-state) (suspend) (cleanup-for-death self) (none) ) ) ;; WARN: Return type mismatch object vs none. (defbehavior voicebox-init-by-other voicebox ((arg0 vector) (arg1 handle)) (set! (-> self hint) arg1) (set! (-> self root) (new 'process 'trsqv)) (set! (-> self root trans quad) (-> arg0 quad)) (set! (-> self base-trans quad) (-> arg0 quad)) (init self) (set! (-> self event-hook) (-> (method-of-object self enter) event)) (go-virtual enter) (none) ) (defun voicebox-spawn ((arg0 process-drawable) (arg1 vector)) (with-pp (when *camera* (let ((s3-0 (process-spawn camera-remote :init cam-slave-init cam-remote #f :from *camera-dead-pool* :to arg0))) (if s3-0 (process-spawn voicebox arg1 (process->handle pp) :to (ppointer->process s3-0)) ) ) ) ) ) (deftype judge (remote) ((total-time time-frame :offset-assert 288) (beep-time time-frame :offset-assert 296) (hud-timer handle :offset-assert 304) (score uint8 :offset-assert 312) ) :heap-base #xc0 :method-count-assert 28 :size-assert #x139 :flag-assert #x1c00c00139 (:methods (wait () _type_ :state 26) (setup-collision (_type_) none 27) ) ) (defmethod get-track-pt-and-scale judge ((obj judge) (arg0 vector)) (set! (-> arg0 quad) (-> obj base-trans quad)) 1.0 ) (defmethod post-common judge ((obj judge)) (ja-post) (if (type? (-> obj root) collide-shape) (update-transforms (the-as collide-shape (-> obj root))) ) (when (and (-> obj next-state) (let ((v1-6 (-> obj next-state name))) (or (= v1-6 'idle) (= v1-6 'enter)) ) ) (if *target* (set! (-> *game-info* score) (-> *target* fact-override trick-point)) ) (let ((v1-15 (the-as int (- (-> obj total-time) (- (-> *display* game-clock frame-counter) (-> obj start-time)))))) (if (< (the-as time-frame v1-15) 0) (set! v1-15 0) ) (set! (-> *game-info* timer) (the-as time-frame v1-15)) ) ) 0 (none) ) (defstate wait (judge) :virtual #t :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) (case event-type (('die) (sound-play "judge-stop") (go-virtual exit) ) (('touch 'attack) (let ((s4-0 (process-spawn camera-remote :init cam-slave-init cam-remote #f :from *camera-dead-pool* :to proc)) (s5-2 (if (type? proc process-focusable) (the-as process-focusable proc) ) ) ) (when (and s4-0 (begin (send-event s5-2 'change-mode 'board #f) (logtest? (focus-status board) (-> s5-2 focus-status))) ) (change-parent self (ppointer->process s4-0)) (try-update-focus (-> self focus) s5-2) (go-virtual enter) ) ) ) (('waiting) #t ) ) ) :code (behavior () (transform-post) (logior! (-> self mask) (process-mask sleep)) (suspend) 0 (none) ) ) (defstate enter (judge) :virtual #t :enter (behavior () (set! (-> self start-time) (-> *display* game-clock frame-counter)) (send-event *target* 'get-pickup 20 (the float (-> self total-time))) (sound-play "judge-start") (set! (-> self hud-timer) (ppointer->handle (process-spawn hud-timer :init hud-init-by-other :to self))) (none) ) ) (defstate idle (judge) :virtual #t :event (behavior ((proc process) (arg1 int) (event-type symbol) (event event-message-block)) (case event-type (('die) (sound-play "judge-stop") (go-virtual exit) ) ) ) :code (behavior () (while (let ((a0-2 (handle->process (-> self focus handle)))) (and a0-2 (!= (send-event a0-2 'test-pickup 20) 0.0)) ) (suspend) (ja :num! (loop!)) ) (send-event (handle->process (-> self hud-timer)) 'hide-and-die) (go-virtual exit) (none) ) ) (defmethod setup-collision judge ((obj judge)) (let ((s5-0 (new 'process 'collide-shape obj (collide-list-enum hit-by-player)))) (let ((v1-2 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0)))) (set! (-> v1-2 prim-core collide-as) (collide-spec collectable)) (set! (-> v1-2 prim-core collide-with) (collide-spec jak player-list tobot)) (set-vector! (-> v1-2 local-sphere) 0.0 0.0 0.0 16384.0) (set! (-> s5-0 total-prims) (the-as uint 1)) (set! (-> s5-0 root-prim) v1-2) ) (set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w))) (let ((v1-5 (-> s5-0 root-prim))) (set! (-> s5-0 backup-collide-as) (-> v1-5 prim-core collide-as)) (set! (-> s5-0 backup-collide-with) (-> v1-5 prim-core collide-with)) ) (set! (-> obj root) s5-0) ) 0 (none) ) ;; WARN: Return type mismatch object vs none. (defmethod init-from-entity! judge ((obj judge) (arg0 entity-actor)) (setup-collision obj) (init obj) (process-drawable-from-entity! obj arg0) (set! (-> obj root trans y) (+ 4096.0 (-> obj root trans y))) (set! (-> obj base-trans quad) (-> obj root trans quad)) (set! (-> obj total-time) (seconds 90)) (go (method-of-object obj wait)) (none) ) ;; WARN: Return type mismatch object vs none. (defbehavior judge-init-by-other judge ((arg0 vector) (arg1 uint)) (process-entity-set! self (the-as entity-actor #f)) (set! (-> self score) arg1) (setup-collision self) (init self) (vector-identity! (-> self root scale)) (quaternion-identity! (-> self root quat)) (set! (-> self root trans quad) (-> arg0 quad)) (set! (-> self base-trans quad) (-> self root trans quad)) (set! (-> self total-time) (seconds 90)) (go-virtual wait) (none) ) ;; WARN: Return type mismatch (pointer process) vs (pointer judge). (defun judge-spawn ((arg0 process-tree) (arg1 vector) (arg2 uint)) (process-spawn judge arg1 arg2 :to arg0) )