mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
d1ece445d4
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.
1026 lines
36 KiB
Common Lisp
1026 lines
36 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
(bundles "FIN.DGO")
|
|
|
|
(require "engine/common-obs/plat-eco.gc")
|
|
(require "levels/finalboss/robotboss-misc.gc")
|
|
(require "levels/finalboss/final-door.gc")
|
|
(require "engine/ui/credits.gc")
|
|
|
|
;; name: sage-finalboss-FIN.gc
|
|
;; name in dgo: sage-finalboss
|
|
;; dgos: FIN
|
|
;; DECOMP BEGINS
|
|
|
|
(defskelgroup *robotboss-cinematic-sg* robotboss-cinematic robotboss-cinematic-lod0-jg robotboss-cinematic-idle-ja
|
|
((robotboss-cinematic-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 -10 0 2000)
|
|
)
|
|
|
|
(defskelgroup *jak-white-sg* jak-white jak-white-lod0-jg jak-white-idle-ja
|
|
((jak-white-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 4)
|
|
)
|
|
|
|
(defskelgroup *plat-eco-finalboss-unlit-sg* plat-eco-finalboss plat-eco-finalboss-lod0-jg plat-eco-finalboss-idle-ja
|
|
((plat-eco-finalboss-lod0-mg (meters 20))
|
|
(plat-eco-finalboss-lod1-mg (meters 40))
|
|
(plat-eco-finalboss-lod2-mg (meters 999999))
|
|
)
|
|
:bounds (static-spherem 0 0 0 3)
|
|
)
|
|
|
|
(defskelgroup *plat-eco-finalboss-lit-sg* plat-eco-finalboss plat-eco-finalboss-lit-lod0-jg plat-eco-finalboss-idle-ja
|
|
((plat-eco-finalboss-lit-lod0-mg (meters 20))
|
|
(plat-eco-finalboss-lit-lod1-mg (meters 40))
|
|
(plat-eco-finalboss-lit-lod2-mg (meters 999999))
|
|
)
|
|
:bounds (static-spherem 0 0 0 3)
|
|
)
|
|
|
|
(deftype plat-eco-finalboss (plat-eco)
|
|
((force-dest float)
|
|
(targ-dest float)
|
|
(dest float)
|
|
(speed float)
|
|
(touch-time time-frame)
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod get-unlit-skel ((this plat-eco-finalboss))
|
|
*plat-eco-finalboss-unlit-sg*
|
|
)
|
|
|
|
(defmethod get-lit-skel ((this plat-eco-finalboss))
|
|
*plat-eco-finalboss-lit-sg*
|
|
)
|
|
|
|
(defmethod baseplat-method-26 ((this plat-eco-finalboss))
|
|
(set! (-> this force-dest) -1.0)
|
|
(set! (-> this targ-dest) -1.0)
|
|
(set! (-> this dest) 0.0)
|
|
(set! (-> this speed) 0.1)
|
|
(logclear! (-> this mask) (process-mask actor-pause))
|
|
(process-entity-status! this (entity-perm-status bit-3) #t)
|
|
(none)
|
|
)
|
|
|
|
(defstate plat-path-active (plat-eco-finalboss)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('target)
|
|
(process-entity-status! self (entity-perm-status complete) #t)
|
|
(set! (-> self force-dest) (the-as float (-> block param 0)))
|
|
)
|
|
(('ridden 'edge-grabbed)
|
|
(if (time-elapsed? (-> self touch-time) (seconds 2))
|
|
(set! (-> self targ-dest) (cond
|
|
((= (-> self path-pos) 0.0)
|
|
(set! (-> self force-dest) -1.0)
|
|
0.99
|
|
)
|
|
((= (-> self path-pos) 0.99)
|
|
0.0
|
|
)
|
|
(else
|
|
(-> self targ-dest)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set-time! (-> self touch-time))
|
|
#f
|
|
)
|
|
(else
|
|
(plat-event proc argc message block)
|
|
)
|
|
)
|
|
)
|
|
:enter (behavior ((arg0 plat))
|
|
(set-time! (-> self state-time))
|
|
(lods-assign! (-> self draw) (-> self lit-look))
|
|
(process-entity-status! self (entity-perm-status complete) #t)
|
|
(cond
|
|
(arg0
|
|
)
|
|
(else
|
|
(dotimes (gp-1 5)
|
|
(spawn-projectile-blue *target*)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:trans (behavior ()
|
|
(let ((s5-0 (eval-path-curve! (-> self path) (new 'stack-no-clear 'vector) 0.0 'interp))
|
|
(gp-0 (eval-path-curve! (-> self path) (new 'stack-no-clear 'vector) 1.0 'interp))
|
|
)
|
|
(if (time-elapsed? (-> self touch-time) (seconds 3))
|
|
(set! (-> self targ-dest) -1.0)
|
|
)
|
|
(set! (-> self dest)
|
|
(cond
|
|
((>= (-> self force-dest) 0.0)
|
|
(-> self force-dest)
|
|
)
|
|
((>= (-> self targ-dest) 0.0)
|
|
(-> self targ-dest)
|
|
)
|
|
((< (vector-vector-xz-distance (target-pos 0) s5-0) (vector-vector-xz-distance (target-pos 0) gp-0))
|
|
0.0
|
|
)
|
|
(else
|
|
0.99
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(if (= (-> self state-time) (current-time))
|
|
(set! (-> self path-pos) (-> self dest))
|
|
)
|
|
(seek! (-> self path-pos) (-> self dest) (* (-> self speed) (seconds-per-frame)))
|
|
(eval-path-curve! (-> self path) (-> self basetrans) (-> self path-pos) 'interp)
|
|
(if (< (vector-vector-distance (-> self root trans) (ear-trans)) 81920.0)
|
|
(sound-play "eco-plat-hover" :id (-> self sound-id) :position (the-as symbol (-> self root trans)))
|
|
)
|
|
(plat-trans)
|
|
(when (send-event *target* 'query 'powerup (pickup-type eco-yellow))
|
|
(process-entity-status! self (entity-perm-status complete) #t)
|
|
(set! (-> self force-dest) 0.0)
|
|
)
|
|
)
|
|
)
|
|
|
|
(deftype sage-finalboss-particle (structure)
|
|
((part sparticle-launch-control)
|
|
(active symbol)
|
|
)
|
|
:allow-misaligned
|
|
)
|
|
|
|
|
|
(deftype sage-finalboss (process-taskable)
|
|
((redsage handle)
|
|
(bluesage handle)
|
|
(yellowsage handle)
|
|
(assistant handle)
|
|
(robotplat handle)
|
|
(robotboss handle)
|
|
(silodoor handle)
|
|
(jak-white handle)
|
|
(left-door entity-actor)
|
|
(right-door entity-actor)
|
|
(kick-in-the-door symbol)
|
|
(kick-the-credits symbol)
|
|
(credit-fade float)
|
|
(palette-val float)
|
|
(particle sage-finalboss-particle 9 :inline)
|
|
(particle-whiteout sparticle-launch-control)
|
|
(credits-played symbol)
|
|
)
|
|
(:states
|
|
sage-finalboss-credits
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod relocate ((this sage-finalboss) (arg0 int))
|
|
(dotimes (v1-0 9)
|
|
(if (nonzero? (-> this particle v1-0 part))
|
|
(&+! (-> this particle v1-0 part) arg0)
|
|
)
|
|
)
|
|
(if (nonzero? (-> this particle-whiteout))
|
|
(&+! (-> this particle-whiteout) arg0)
|
|
)
|
|
(the-as sage-finalboss ((method-of-type process-taskable relocate) this arg0))
|
|
)
|
|
|
|
(defmethod deactivate ((this sage-finalboss))
|
|
(dotimes (s5-0 9)
|
|
(let ((a0-1 (-> this particle s5-0 part)))
|
|
(if (nonzero? a0-1)
|
|
(kill-and-free-particles a0-1)
|
|
)
|
|
)
|
|
)
|
|
(if (nonzero? (-> this particle-whiteout))
|
|
(kill-and-free-particles (-> this particle-whiteout))
|
|
)
|
|
((method-of-type process-taskable deactivate) this)
|
|
(none)
|
|
)
|
|
|
|
(defskelgroup *sage-finalboss-sg* green-sagecage green-sagecage-lod0-jg green-sagecage-green-sagecage-idle-ja
|
|
((green-sagecage-lod0-mg (meters 20)) (green-sagecage-lod1-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 0 2.5)
|
|
:shadow green-sagecage-shadow-mg
|
|
)
|
|
|
|
(defmethod play-reminder ((this sage-finalboss))
|
|
(let ((s5-0 (entity-by-name "red-sagecage-1")))
|
|
(when s5-0
|
|
(set! (-> this redsage) (ppointer->handle (manipy-spawn (-> this root trans) s5-0 *redsage-sg* #f :to this)))
|
|
(send-event (handle->process (-> this redsage)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this redsage)) 'blend-shape #t)
|
|
(send-event (handle->process (-> this redsage)) 'center-joint 3)
|
|
(send-event (handle->process (-> this redsage)) 'origin-joint-index 3)
|
|
)
|
|
)
|
|
(let ((s5-1 (entity-by-name "blue-sagecage-1")))
|
|
(when s5-1
|
|
(set! (-> this bluesage)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) s5-1 *bluesage-sg* #f :to this))
|
|
)
|
|
(send-event (handle->process (-> this bluesage)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this bluesage)) 'blend-shape #t)
|
|
(send-event (handle->process (-> this bluesage)) 'center-joint 3)
|
|
(send-event (handle->process (-> this bluesage)) 'origin-joint-index 3)
|
|
)
|
|
)
|
|
(let ((s5-2 (entity-by-name "yellow-sagecage-1")))
|
|
(the-as
|
|
symbol
|
|
(when s5-2
|
|
(set! (-> this yellowsage)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) s5-2 *yellowsage-sg* #f :to this))
|
|
)
|
|
(send-event (handle->process (-> this yellowsage)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this yellowsage)) 'blend-shape #t)
|
|
(send-event (handle->process (-> this yellowsage)) 'center-joint 3)
|
|
(send-event (handle->process (-> this yellowsage)) 'origin-joint-index 3)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod process-taskable-method-45 ((this sage-finalboss))
|
|
(let ((s5-0 (entity-by-name "assistant-lavatube-end-3")))
|
|
(the-as
|
|
symbol
|
|
(when s5-0
|
|
(set! (-> this assistant)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) s5-0 *assistant-lavatube-end-sg* #f :to this))
|
|
)
|
|
(let ((s5-1 (handle->process (-> this assistant))))
|
|
(if (the-as manipy s5-1)
|
|
(set! (-> (the-as manipy s5-1) draw level-index) (the-as uint (-> (level-get *level* 'finalboss) index)))
|
|
)
|
|
)
|
|
(send-event (handle->process (-> this assistant)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this assistant)) 'blend-shape #t)
|
|
(send-event (handle->process (-> this assistant)) 'center-joint 3)
|
|
(send-event (handle->process (-> this assistant)) 'origin-joint-index 3)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod play-anim! ((this sage-finalboss) (arg0 symbol))
|
|
(case (current-status (-> this tasks))
|
|
(((task-status unknown))
|
|
(when arg0
|
|
(close-current! (-> this tasks))
|
|
(set-yaw-angle-clear-roll-pitch! (-> this root) 0.0)
|
|
)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-daxter-sacrifice"
|
|
:index 8
|
|
:parts 6
|
|
:command-list '((1 blackout 0) (236 joint "cameraB") (439 joint "camera"))
|
|
)
|
|
)
|
|
(((task-status need-introduction))
|
|
(when arg0
|
|
(set-yaw-angle-clear-roll-pitch! (-> this root) 0.0)
|
|
(close-current! (-> this tasks))
|
|
(set! (-> this jak-white)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) (-> this entity) *jak-white-sg* #f :to this))
|
|
)
|
|
(send-event
|
|
(handle->process (-> this jak-white))
|
|
'eval
|
|
(lambda :behavior sage-finalboss () (set-vector! (-> self draw color-emissive) 0.5 0.5 0.5 0.0) (none))
|
|
)
|
|
(send-event (handle->process (-> this jak-white)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this jak-white)) 'origin-joint-index 3)
|
|
(send-event (handle->process (-> this jak-white)) 'blend-shape #t)
|
|
(set! (-> this robotboss)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) (-> this entity) *robotboss-cinematic-sg* #f :to this))
|
|
)
|
|
(send-event (handle->process (-> this robotboss)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this robotboss)) 'origin-joint-index 3)
|
|
(let ((v1-67 (handle->process (-> this robotboss))))
|
|
(if (the-as manipy v1-67)
|
|
(set! (-> (the-as manipy v1-67) draw bounds w) 2048000.0)
|
|
)
|
|
)
|
|
(set! (-> this silodoor)
|
|
(ppointer->handle (manipy-spawn (-> this root trans) (-> this entity) *silodoor-sg* #f :to this))
|
|
)
|
|
(send-event (handle->process (-> this silodoor)) 'anim-mode 'clone-anim)
|
|
(let ((v1-84 (handle->process (-> this silodoor))))
|
|
(if (the-as manipy v1-84)
|
|
(set! (-> (the-as silodoor v1-84) draw bounds w) 2048000.0)
|
|
)
|
|
)
|
|
(send-event (process-by-name "silodoor-5" *active-pool*) 'hide)
|
|
(set-setting! 'music #f 0.0 0)
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-outro-beat-boss-a"
|
|
:index 9
|
|
:parts 8
|
|
:command-list '((0 send-event self activate-particle 0)
|
|
(0 send-event self activate-particle 1)
|
|
(0 send-event self activate-particle 7)
|
|
(1 blackout 0)
|
|
(61 joint "cameraB")
|
|
(71 send-event self activate-particle 2)
|
|
(156 joint "camera")
|
|
(216 joint "cameraB")
|
|
(259 send-event self deactivate-particle 2)
|
|
(259 send-event self activate-particle 3)
|
|
(268 send-event self activate-particle 4)
|
|
(270 send-event self deactivate-particle 3)
|
|
(270 send-event self deactivate-particle 0)
|
|
(270 send-event self deactivate-particle 1)
|
|
(271 joint "camera")
|
|
(269 send-event self activate-particle 5)
|
|
(272 send-event self flash)
|
|
(272 eval ,(lambda :behavior sage-finalboss
|
|
()
|
|
(let ((a0-1 (get-task-control (game-task finalboss-movies))))
|
|
(save-reminder a0-1 (logior (get-reminder a0-1 0) 1) 0)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
(273 send-event self deactivate-particle 5)
|
|
(333 joint "cameraB")
|
|
(395 joint "camera")
|
|
(453 joint "cameraB")
|
|
(478 send-event self deactivate-particle 4)
|
|
(478 send-event self activate-particle 6)
|
|
(482 send-event self deactivate-particle 6)
|
|
(583 joint "camera")
|
|
(640 send-event self deactivate-particle 7)
|
|
)
|
|
)
|
|
)
|
|
(((task-status need-reminder-a))
|
|
(when arg0
|
|
(set-yaw-angle-clear-roll-pitch! (-> this root) 0.0)
|
|
(close-current! (-> this tasks))
|
|
(play-reminder this)
|
|
(process-taskable-method-45 this)
|
|
(set! (-> this kick-the-credits) #t)
|
|
(set! (-> this robotplat)
|
|
(ppointer->handle
|
|
(manipy-spawn (-> this root trans) (-> this entity) *plat-eco-finalboss-lit-sg* #f :to this)
|
|
)
|
|
)
|
|
(send-event (handle->process (-> this robotplat)) 'anim-mode 'clone-anim)
|
|
(send-event (handle->process (-> this robotplat)) 'origin-joint-index 3)
|
|
(set! (-> this old-target-pos trans quad)
|
|
(-> (new 'static 'vector :x 11368946.0 :y 2215900.2 :z -19405602.0 :w 1.0) quad)
|
|
)
|
|
(quaternion-copy! (-> this old-target-pos quat) (new 'static 'quaternion :y -0.8472 :w 0.5312))
|
|
(set-setting! 'music #f 0.0 0)
|
|
(set-setting! 'sfx-volume 'abs 0.0 0)
|
|
(set-setting! 'ambient-volume 'abs 0.0 0)
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-outro-beat-boss-b"
|
|
:index 10
|
|
:parts 27
|
|
:command-list '((0 kill "crate-3250")
|
|
(0 kill "crate-3251")
|
|
(0 kill "crate-3252")
|
|
(0 kill "crate-3253")
|
|
(0 kill "crate-3254")
|
|
(0 kill "crate-3255")
|
|
(0 kill "crate-3256")
|
|
(0 kill "crate-3257")
|
|
(0 kill "crate-3258")
|
|
(0 kill "crate-3259")
|
|
(0 kill "plat-eco-finalboss-1")
|
|
(1 blackout 0)
|
|
(61 joint "cameraB")
|
|
(136 joint "camera")
|
|
(510 joint "cameraB")
|
|
(641 joint "camera")
|
|
(751 joint "cameraB")
|
|
(1096 joint "camera")
|
|
(1321 joint "cameraB")
|
|
(1521 joint "camera")
|
|
(1636 joint "cameraB")
|
|
(1751 joint "camera")
|
|
(1916 joint "cameraB")
|
|
(1996 joint "camera")
|
|
(2256 joint "cameraB")
|
|
)
|
|
)
|
|
)
|
|
(((task-status need-reminder))
|
|
(when arg0
|
|
(set-yaw-angle-clear-roll-pitch! (-> this root) -13116.667)
|
|
(close-current! (-> this tasks))
|
|
(process-taskable-method-45 this)
|
|
(send-event *camera* 'teleport)
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
)
|
|
(cond
|
|
((target-has-all-the-cells?)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-outro-beat-boss-enough-cells"
|
|
:index 12
|
|
:parts 6
|
|
:command-list '((0 send-event self fade)
|
|
(1 blackout 0)
|
|
(65 joint "cameraB")
|
|
(104 joint "camera")
|
|
(134 joint "cameraB")
|
|
(165 joint "camera")
|
|
(292 joint "cameraB")
|
|
(488 joint "camera")
|
|
(488 auto-save auto-save)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(if arg0
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-outro-beat-boss-need-cells"
|
|
:index 11
|
|
:parts 8
|
|
:command-list '((0 send-event self fade)
|
|
(1 blackout 0)
|
|
(65 joint "cameraB")
|
|
(104 joint "camera")
|
|
(134 joint "cameraB")
|
|
(165 joint "camera")
|
|
(292 joint "cameraB")
|
|
(488 joint "camera")
|
|
(488 auto-save auto-save)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(((task-status need-reward-speech))
|
|
(when arg0
|
|
(set-yaw-angle-clear-roll-pitch! (-> this root) -13116.667)
|
|
(close-current! (-> this tasks))
|
|
(process-taskable-method-45 this)
|
|
(set! (-> this left-door) (the-as entity-actor (entity-by-name "power-left-2")))
|
|
(set! (-> this right-door) (the-as entity-actor (entity-by-name "power-right-2")))
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
)
|
|
(new 'static 'spool-anim
|
|
:name "green-sagecage-outro-big-finish"
|
|
:index 13
|
|
:parts 7
|
|
:command-list '((1 blackout 0)
|
|
(61 joint "cameraB")
|
|
(102 joint "camera")
|
|
(145 joint "cameraB")
|
|
(220 send-event "power-left-2" open)
|
|
(220 send-event "power-right-2" open)
|
|
(235 joint "camera")
|
|
(243 send-event self activate-particle 8)
|
|
(322 joint "cameraB")
|
|
(428 joint "camera")
|
|
(519 joint "cameraB")
|
|
(602 joint "camera")
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(if arg0
|
|
(format
|
|
0
|
|
"ERROR: <GMJ>: ~S playing anim for task status ~S~%"
|
|
(-> this name)
|
|
(task-status->string (current-status (-> this tasks)))
|
|
)
|
|
)
|
|
(-> this draw art-group data 4)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod get-art-elem ((this sage-finalboss))
|
|
(-> this draw art-group data 4)
|
|
)
|
|
|
|
(defbehavior sage-finalboss-credit-particle sage-finalboss ()
|
|
(when (< 0.0 (-> self credit-fade))
|
|
(if (> (-> self part matrix) 0)
|
|
(set-vector!
|
|
(sprite-get-user-hvdf (-> self part matrix))
|
|
2048.0
|
|
2048.0
|
|
(+ -1024.0 (-> *math-camera* hvdf-off z))
|
|
(-> *math-camera* hvdf-off w)
|
|
)
|
|
)
|
|
(set! (-> *part-id-table* 2827 init-specs 8 initial-valuef) (* 128.0 (-> self credit-fade)))
|
|
(cond
|
|
((< (-> self credit-fade) 1.0)
|
|
(set! (-> *part-id-table* 2825 init-specs 1 initial-valuef) 0.0)
|
|
(set! (-> *part-id-table* 2826 init-specs 1 initial-valuef) 0.0)
|
|
)
|
|
(else
|
|
(set! (-> *part-id-table* 2825 init-specs 1 initial-valuef) 1.0)
|
|
(set! (-> *part-id-table* 2826 init-specs 1 initial-valuef) 0.3)
|
|
)
|
|
)
|
|
(spawn (-> self part) *zero-vector*)
|
|
(+! (-> self credit-fade) -0.008333334)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defstate play-anim (sage-finalboss)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('fade)
|
|
(set! (-> self credit-fade) 1.0)
|
|
)
|
|
(('flash)
|
|
(set! (-> self palette-val) 1.9921875)
|
|
)
|
|
(('activate-particle)
|
|
(let ((v0-0 (the-as object #t)))
|
|
(set! (-> self particle (-> block param 0) active) (the-as symbol v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
(('deactivate-particle)
|
|
(set! (-> self particle (-> block param 0) active) #f)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
:enter (behavior ()
|
|
(set! (-> self credit-fade) 0.0)
|
|
((-> (method-of-type process-taskable play-anim) enter))
|
|
)
|
|
:exit (behavior ()
|
|
(when (= (current-status (-> self tasks)) (task-status invalid))
|
|
(cond
|
|
((not (-> self credits-played))
|
|
(set! (-> self kick-the-credits) #t)
|
|
)
|
|
(else
|
|
(set-blackout-frames 0)
|
|
(initialize! *game-info* 'game (the-as game-save #f) "title-start")
|
|
)
|
|
)
|
|
)
|
|
(let ((a0-4 (handle->process (-> self redsage))))
|
|
(if a0-4
|
|
(deactivate a0-4)
|
|
)
|
|
)
|
|
(let ((a0-8 (handle->process (-> self bluesage))))
|
|
(if a0-8
|
|
(deactivate a0-8)
|
|
)
|
|
)
|
|
(let ((a0-12 (handle->process (-> self yellowsage))))
|
|
(if a0-12
|
|
(deactivate a0-12)
|
|
)
|
|
)
|
|
(let ((a0-16 (handle->process (-> self assistant))))
|
|
(if a0-16
|
|
(deactivate a0-16)
|
|
)
|
|
)
|
|
(let ((a0-20 (handle->process (-> self robotplat))))
|
|
(if a0-20
|
|
(deactivate a0-20)
|
|
)
|
|
)
|
|
(let ((a0-24 (handle->process (-> self robotboss))))
|
|
(if a0-24
|
|
(deactivate a0-24)
|
|
)
|
|
)
|
|
(let ((a0-28 (handle->process (-> self jak-white))))
|
|
(if a0-28
|
|
(deactivate a0-28)
|
|
)
|
|
)
|
|
(let ((a0-32 (handle->process (-> self silodoor))))
|
|
(if a0-32
|
|
(deactivate a0-32)
|
|
)
|
|
)
|
|
(when (-> self left-door)
|
|
(let ((a1-9 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-9 from) self)
|
|
(set! (-> a1-9 num-params) 2)
|
|
(set! (-> a1-9 message) 'brightness)
|
|
(set! (-> a1-9 param 0) (the-as uint 1.0))
|
|
(set! (-> a1-9 param 1) (the-as uint 0.0))
|
|
(let ((t9-11 send-event-function)
|
|
(v1-61 (-> self left-door))
|
|
)
|
|
(t9-11
|
|
(if v1-61
|
|
(-> v1-61 extra process)
|
|
)
|
|
a1-9
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self left-door) #f)
|
|
)
|
|
(when (-> self right-door)
|
|
(let ((a1-10 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-10 from) self)
|
|
(set! (-> a1-10 num-params) 2)
|
|
(set! (-> a1-10 message) 'brightness)
|
|
(set! (-> a1-10 param 0) (the-as uint 1.0))
|
|
(set! (-> a1-10 param 1) (the-as uint 0.0))
|
|
(let ((t9-12 send-event-function)
|
|
(v1-71 (-> self right-door))
|
|
)
|
|
(t9-12
|
|
(if v1-71
|
|
(-> v1-71 extra process)
|
|
)
|
|
a1-10
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self right-door) #f)
|
|
)
|
|
(cond
|
|
((= (current-status (-> self tasks)) (task-status need-reward-speech))
|
|
(if (target-has-all-the-cells?)
|
|
(set! (-> self kick-in-the-door) #t)
|
|
(start 'play (get-continue-by-name *game-info* "finalboss-start"))
|
|
)
|
|
)
|
|
((= (current-status (-> self tasks)) (task-status invalid))
|
|
)
|
|
(else
|
|
(set-blackout-frames (seconds 100))
|
|
)
|
|
)
|
|
(dotimes (v1-84 9)
|
|
(set! (-> self particle v1-84 active) #f)
|
|
)
|
|
((-> (method-of-type process-taskable play-anim) exit))
|
|
)
|
|
:trans (behavior ()
|
|
(local-vars (f28-0 float))
|
|
(when (-> self left-door)
|
|
(let ((f30-0 (ja-aframe-num 0)))
|
|
0.0
|
|
(let ((f30-1
|
|
(cond
|
|
((< f30-0 235.0)
|
|
(set! f28-0 1.0)
|
|
0.0
|
|
)
|
|
((< 320.0 f30-0)
|
|
(set! f28-0 1.0)
|
|
0.0
|
|
)
|
|
(else
|
|
(if (> (-> self particle-whiteout matrix) 0)
|
|
(set-vector!
|
|
(sprite-get-user-hvdf (-> self particle-whiteout matrix))
|
|
2048.0
|
|
2048.0
|
|
(+ -1024.0 (-> *math-camera* hvdf-off z))
|
|
(-> *math-camera* hvdf-off w)
|
|
)
|
|
)
|
|
(set! (-> *part-id-table* 2965 init-specs 8 initial-valuef) (fmax 0.0 (fmin 128.0 (* 0.75 (+ -240.0 f30-0)))))
|
|
(spawn (-> self particle-whiteout) *zero-vector*)
|
|
(set! f28-0 (fmin 2.0 (fmax 0.0 (* 0.033333335 (+ -235.0 f30-0)))))
|
|
f28-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((a1-1 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-1 from) self)
|
|
(set! (-> a1-1 num-params) 2)
|
|
(set! (-> a1-1 message) 'brightness)
|
|
(set! (-> a1-1 param 0) (the-as uint f28-0))
|
|
(set! (-> a1-1 param 1) (the-as uint f30-1))
|
|
(let ((t9-3 send-event-function)
|
|
(v1-20 (-> self left-door))
|
|
)
|
|
(t9-3
|
|
(if v1-20
|
|
(-> v1-20 extra process)
|
|
)
|
|
a1-1
|
|
)
|
|
)
|
|
)
|
|
(let ((a1-2 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-2 from) self)
|
|
(set! (-> a1-2 num-params) 2)
|
|
(set! (-> a1-2 message) 'brightness)
|
|
(set! (-> a1-2 param 0) (the-as uint f28-0))
|
|
(set! (-> a1-2 param 1) (the-as uint f30-1))
|
|
(let ((t9-4 send-event-function)
|
|
(v1-27 (-> self right-door))
|
|
)
|
|
(t9-4
|
|
(if v1-27
|
|
(-> v1-27 extra process)
|
|
)
|
|
a1-2
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (and *target* (-> self particle 0 active))
|
|
(let ((a1-3 (new 'stack-no-clear 'vector)))
|
|
(set! (-> a1-3 quad) (-> *target* draw origin quad))
|
|
(set! (-> a1-3 y) 1970176.0)
|
|
(spawn (-> self particle 0 part) a1-3)
|
|
)
|
|
)
|
|
(when (and (handle->process (-> self jak-white)) (-> self particle 1 active))
|
|
(let ((a0-17 (handle->process (-> self jak-white))))
|
|
(spawn
|
|
(-> self particle 1 part)
|
|
(process-drawable-random-point! (the-as process-drawable a0-17) (new 'stack-no-clear 'vector))
|
|
)
|
|
)
|
|
)
|
|
(when (and (handle->process (-> self jak-white)) (-> self particle 2 active))
|
|
(let* ((v1-52 (handle->process (-> self jak-white)))
|
|
(a1-11 (vector<-cspace! (new 'stack-no-clear 'vector) (-> (the-as process-drawable v1-52) node-list data 52)))
|
|
)
|
|
(spawn (-> self particle 2 part) a1-11)
|
|
)
|
|
)
|
|
(when (and (handle->process (-> self jak-white)) (-> self particle 3 active))
|
|
(let* ((v1-63 (handle->process (-> self jak-white)))
|
|
(a1-15 (vector<-cspace! (new 'stack-no-clear 'vector) (-> (the-as process-drawable v1-63) node-list data 52)))
|
|
)
|
|
(spawn (-> self particle 3 part) a1-15)
|
|
)
|
|
)
|
|
(if (and (handle->process (-> self robotboss)) (-> self particle 4 active))
|
|
(spawn (-> self particle 4 part) (process-drawable-random-point!
|
|
(the-as process-drawable (handle->process (-> self robotboss)))
|
|
(new 'stack-no-clear 'vector)
|
|
)
|
|
)
|
|
)
|
|
(if (and (handle->process (-> self robotboss)) (-> self particle 5 active))
|
|
(spawn
|
|
(-> self particle 5 part)
|
|
(vector<-cspace!
|
|
(new 'stack-no-clear 'vector)
|
|
(-> (the-as process-drawable (handle->process (-> self robotboss))) node-list data 15)
|
|
)
|
|
)
|
|
)
|
|
(if (and (handle->process (-> self robotboss)) (-> self particle 6 active))
|
|
(spawn
|
|
(-> self particle 6 part)
|
|
(vector<-cspace!
|
|
(new 'stack-no-clear 'vector)
|
|
(-> (the-as process-drawable (handle->process (-> self robotboss))) node-list data 6)
|
|
)
|
|
)
|
|
)
|
|
(when (and (handle->process (-> self robotboss)) (-> self particle 7 active))
|
|
(let ((gp-4 (new 'stack-no-clear 'vector)))
|
|
(vector<-cspace! gp-4 (-> (the-as process-drawable (handle->process (-> self robotboss))) node-list data 7))
|
|
(spawn (-> self particle 7 part) gp-4)
|
|
)
|
|
)
|
|
(when (-> self particle 8 active)
|
|
(let ((gp-5 (search-process-tree *active-pool* (lambda ((arg0 final-door)) (= (-> arg0 type) power-left))))
|
|
(a0-70 (search-process-tree *active-pool* (lambda ((arg0 final-door)) (= (-> arg0 type) power-left))))
|
|
(a1-43 (new 'stack-no-clear 'vector))
|
|
)
|
|
(vector+! a1-43 (-> (the-as final-door gp-5) root trans) (-> (the-as final-door a0-70) root trans))
|
|
(vector-float*! a1-43 a1-43 0.5)
|
|
(spawn (-> self particle 8 part) a1-43)
|
|
)
|
|
)
|
|
(sage-finalboss-credit-particle)
|
|
(let* ((f0-14 (- 0.0 (-> self palette-val)))
|
|
(f0-15 (if (< 0.0 f0-14)
|
|
(fmin 0.025 f0-14)
|
|
(fmax -0.025 f0-14)
|
|
)
|
|
)
|
|
)
|
|
(+! (-> self palette-val) f0-15)
|
|
)
|
|
(set! (-> *palette-fade-controls* control 2 fade) (-> self palette-val))
|
|
(case (current-status (-> self tasks))
|
|
(((task-status need-introduction))
|
|
(spool-push *art-control* "green-sagecage-outro-beat-boss-a" 0 self -1.0)
|
|
)
|
|
(((task-status need-reminder-a))
|
|
(spool-push *art-control* "green-sagecage-outro-beat-boss-b" 0 self -1.0)
|
|
)
|
|
(((task-status need-reminder))
|
|
(if (target-has-all-the-cells?)
|
|
(spool-push *art-control* "green-sagecage-outro-beat-boss-enough-cells" 0 self -1.0)
|
|
(spool-push *art-control* "green-sagecage-outro-beat-boss-need-cells" 0 self -1.0)
|
|
)
|
|
)
|
|
(((task-status need-reward-speech))
|
|
(spool-push *art-control* "green-sagecage-outro-big-finish" 0 self -1.0)
|
|
)
|
|
)
|
|
((-> (method-of-type process-taskable play-anim) trans))
|
|
)
|
|
)
|
|
|
|
(defstate sage-finalboss-credits (sage-finalboss)
|
|
:exit (behavior ()
|
|
(when (= (current-status (-> self tasks)) (task-status invalid))
|
|
(set-blackout-frames 0)
|
|
(initialize! *game-info* 'game (the-as game-save #f) "title-start")
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(local-vars (s5-0 symbol))
|
|
(set! (-> self credits-played) #t)
|
|
(set-blackout-frames 0)
|
|
(set-blackout-frames (seconds 0.05))
|
|
(remove-setting! 'sfx-volume)
|
|
(remove-setting! 'ambient-volume)
|
|
(set-setting! 'allow-pause #f 0.0 0)
|
|
(set-setting! 'allow-progress #f 0.0 0)
|
|
(set-setting! 'music 'ogreboss 0.0 0)
|
|
(set! (-> self state-time) (-> *display* game-frame-counter))
|
|
(logior! (-> self draw status) (draw-status hidden))
|
|
(let ((gp-0 (-> self mask)))
|
|
(load-state-want-display-level 'finalboss 'special)
|
|
(logclear! (-> self mask) (process-mask pause progress))
|
|
(add-setting! 'process-mask 'set 0.0 (process-mask pause progress target))
|
|
(apply-settings *setting-control*)
|
|
(let ((f30-0 0.0)
|
|
(f28-0 0.5)
|
|
)
|
|
(until s5-0
|
|
(hide-hud-quick)
|
|
(set! (-> self credit-fade) 1.0)
|
|
(sage-finalboss-credit-particle)
|
|
(set! s5-0 (draw-end-credits (the int f30-0)))
|
|
(if (and *cheat-mode* (cpad-pressed? 0 triangle))
|
|
(set! s5-0 #t)
|
|
)
|
|
(cond
|
|
((paused?)
|
|
)
|
|
((and (< 1300.0 f30-0) (cpad-hold? 0 circle x))
|
|
(set! f28-0 (seek f28-0 16.0 (* 4.0 (seconds-per-frame))))
|
|
(+! f30-0 (* f28-0 (-> *display* time-adjust-ratio)))
|
|
)
|
|
(else
|
|
(set! f28-0 (seek f28-0 0.5 (* 16.0 (seconds-per-frame))))
|
|
(+! f30-0 (* f28-0 (-> *display* time-adjust-ratio)))
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(set! (-> self mask) gp-0)
|
|
)
|
|
(load-state-want-display-level 'finalboss 'display)
|
|
(remove-setting! 'allow-pause)
|
|
(remove-setting! 'allow-progress)
|
|
(remove-setting! 'process-mask)
|
|
(remove-setting! 'music)
|
|
(apply-settings *setting-control*)
|
|
(set-blackout-frames (seconds 0.05))
|
|
(let ((gp-1 (current-time)))
|
|
(until (time-elapsed? gp-1 (seconds 0.05))
|
|
(suspend)
|
|
)
|
|
)
|
|
(go-virtual hidden)
|
|
)
|
|
)
|
|
|
|
(defmethod should-display? ((this sage-finalboss))
|
|
#f
|
|
)
|
|
|
|
(defbehavior sage-finalboss-extra-trans sage-finalboss ()
|
|
(case (current-status (-> self tasks))
|
|
(((task-status need-reminder-a) (task-status need-reminder))
|
|
(send-event self 'play-anim)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defbehavior sage-finalboss-extra-enter sage-finalboss ()
|
|
(cond
|
|
((-> self kick-the-credits)
|
|
(set! (-> self kick-the-credits) #f)
|
|
(go sage-finalboss-credits)
|
|
)
|
|
((-> self kick-in-the-door)
|
|
(set! (-> self kick-in-the-door) #f)
|
|
(entity-birth-no-kill (entity-by-type power-right))
|
|
(entity-birth-no-kill (entity-by-type power-left))
|
|
(send-event
|
|
*target*
|
|
'change-mode
|
|
'final-door
|
|
(search-process-tree *active-pool* (lambda ((arg0 final-door)) (= (-> arg0 type) power-right)))
|
|
(search-process-tree *active-pool* (lambda ((arg0 final-door)) (= (-> arg0 type) power-left)))
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defstate hidden (sage-finalboss)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(sage-finalboss-extra-enter)
|
|
((-> (method-of-type process-taskable hidden) enter))
|
|
(remove-setting! 'allow-progress)
|
|
)
|
|
:trans (behavior ()
|
|
(sage-finalboss-extra-trans)
|
|
((-> (method-of-type process-taskable hidden) trans))
|
|
)
|
|
)
|
|
|
|
(defstate idle (sage-finalboss)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(sage-finalboss-extra-enter)
|
|
((-> (method-of-type process-taskable idle) enter))
|
|
)
|
|
:trans (behavior ()
|
|
(sage-finalboss-extra-trans)
|
|
((-> (method-of-type process-taskable idle) trans))
|
|
)
|
|
)
|
|
|
|
(defmethod init-from-entity! ((this sage-finalboss) (arg0 entity-actor))
|
|
(process-taskable-method-40 this arg0 *sage-finalboss-sg* 3 40 (new 'static 'vector :w 4096.0) 5)
|
|
(set! (-> this tasks) (get-task-control (game-task finalboss-movies)))
|
|
(set! (-> this redsage) (the-as handle #f))
|
|
(set! (-> this bluesage) (the-as handle #f))
|
|
(set! (-> this yellowsage) (the-as handle #f))
|
|
(set! (-> this assistant) (the-as handle #f))
|
|
(set! (-> this robotplat) (the-as handle #f))
|
|
(set! (-> this robotboss) (the-as handle #f))
|
|
(set! (-> this jak-white) (the-as handle #f))
|
|
(set! (-> this silodoor) (the-as handle #f))
|
|
(set! (-> this left-door) #f)
|
|
(set! (-> this right-door) #f)
|
|
(set! (-> this kick-in-the-door) #f)
|
|
(set! (-> this kick-the-credits) #f)
|
|
(set! (-> this credits-played) #f)
|
|
(set! (-> this part) (create-launch-control (-> *part-group-id-table* 682) this))
|
|
(set! (-> this part matrix) (sprite-allocate-user-hvdf))
|
|
(set! (-> this particle-whiteout) (create-launch-control (-> *part-group-id-table* 706) this))
|
|
(set! (-> this particle-whiteout matrix) (sprite-allocate-user-hvdf))
|
|
(set! (-> this particle 0 part) (create-launch-control (-> *part-group-id-table* 699) this))
|
|
(set! (-> this particle 1 part) (create-launch-control (-> *part-group-id-table* 700) this))
|
|
(set! (-> this particle 2 part) (create-launch-control (-> *part-group-id-table* 701) this))
|
|
(set! (-> this particle 3 part) (create-launch-control (-> *part-group-id-table* 702) this))
|
|
(set! (-> this particle 7 part) (create-launch-control (-> *part-group-id-table* 645) this))
|
|
(set! (-> this particle 4 part) (create-launch-control (-> *part-group-id-table* 703) this))
|
|
(set! (-> this particle 5 part) (create-launch-control (-> *part-group-id-table* 696) this))
|
|
(set! (-> this particle 6 part) (create-launch-control (-> *part-group-id-table* 704) this))
|
|
(set! (-> this particle 8 part) (create-launch-control (-> *part-group-id-table* 698) this))
|
|
(dotimes (v1-37 9)
|
|
(set! (-> this particle v1-37 active) #f)
|
|
)
|
|
(set! (-> this palette-val) 0.0)
|
|
(+! (-> this root trans y) 2048.0)
|
|
(if (not (should-display? this))
|
|
(go (method-of-object this hidden))
|
|
(go (method-of-object this idle))
|
|
)
|
|
(none)
|
|
)
|