mirror of
https://github.com/open-goal/jak-project
synced 2026-06-18 15:36:25 -04:00
cd68cb671e
Major change to how `deftype` shows up in our code: - the decompiler will no longer emit the `offset-assert`, `method-count-assert`, `size-assert` and `flag-assert` parameters. There are extremely few cases where having this in the decompiled code is helpful, as the types there come from `all-types` which already has those parameters. This also doesn't break type consistency because: - the asserts aren't compared. - the first step of the test uses `all-types`, which has the asserts, which will throw an error if they're bad. - the decompiler won't emit the `heap-base` parameter unless necessary now. - the decompiler will try its hardest to turn a fixed-offset field into an `overlay-at` field. It falls back to the old offset if all else fails. - `overlay-at` now supports field "dereferencing" to specify the offset that's within a field that's a structure, e.g.: ```lisp (deftype foobar (structure) ((vec vector :inline) (flags int32 :overlay-at (-> vec w)) ) ) ``` in this structure, the offset of `flags` will be 12 because that is the final offset of `vec`'s `w` field within this structure. - **removed ID from all method declarations.** IDs are only ever automatically assigned now. Fixes #3068. - added an `:overlay` parameter to method declarations, in order to declare a new method that goes on top of a previously-defined method. Syntax is `:overlay <method-name>`. Please do not ever use this. - added `state-methods` list parameter. This lets you quickly specify a list of states to be put in the method table. Same syntax as the `states` list parameter. The decompiler will try to put as many states in this as it can without messing with the method ID order. Also changes `defmethod` to make the first type definition (before the arguments) optional. The type can now be inferred from the first argument. Fixes #3093. --------- Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
319 lines
10 KiB
Common Lisp
319 lines
10 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: com-elevator.gc
|
|
;; name in dgo: com-elevator
|
|
;; dgos: PAS, TOD
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype com-elevator (elevator)
|
|
((camera-startup vector 2 :inline)
|
|
(use-camera-startup? symbol 2)
|
|
(sound-id sound-id)
|
|
)
|
|
(:methods
|
|
(com-elevator-method-49 (_type_ symbol) none)
|
|
)
|
|
)
|
|
|
|
|
|
(defskelgroup skel-com-elevator com-elevator com-elevator-lod0-jg com-elevator-idle-ja
|
|
((com-elevator-lod0-mg (meters 999999)))
|
|
:bounds (static-spherem 0 0 5.6 9.2)
|
|
)
|
|
|
|
(defmethod get-art-group ((this com-elevator))
|
|
"@returns The associated [[art-group]]"
|
|
(art-group-get-by-name *level* "skel-com-elevator" (the-as (pointer uint32) #f))
|
|
)
|
|
|
|
(defmethod move-between-points ((this com-elevator) (arg0 vector) (arg1 float) (arg2 float))
|
|
"Move between two points on the elevator's path
|
|
@param vec TODO not sure
|
|
@param point-a The first point fetched from the elevator's path
|
|
@param point-b The second point fetched from the path
|
|
@see [[path-control]] and [[elevator]]"
|
|
(let ((s4-0 (get-point-in-path! (-> this path) (new 'stack-no-clear 'vector) arg1 'interp))
|
|
(a0-3 (get-point-in-path! (-> this path) (new 'stack-no-clear 'vector) arg2 'interp))
|
|
(v1-3 (-> this root trans))
|
|
)
|
|
(when (and (< (-> a0-3 y) (-> s4-0 y)) (< (-> arg0 y) (+ -8192.0 (-> v1-3 y))))
|
|
(let ((s4-2 (vector-! (new 'stack-no-clear 'vector) arg0 v1-3)))
|
|
(vector-inv-orient-by-quat! s4-2 s4-2 (-> this root quat))
|
|
(and (< (fabs (-> s4-2 x)) 24576.0) (< 0.0 (-> s4-2 z)) (< (-> s4-2 z) 49152.0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod commited-to-ride? ((this com-elevator))
|
|
"@returns if the target is considered within the elevator area enough to begin descending/ascending"
|
|
(let* ((s5-0 *target*)
|
|
(a0-2 (if (type? s5-0 process-focusable)
|
|
s5-0
|
|
)
|
|
)
|
|
)
|
|
(and (when a0-2
|
|
(let* ((v1-2 (get-trans a0-2 0))
|
|
(s5-2 (vector-! (new 'stack-no-clear 'vector) v1-2 (-> this root trans)))
|
|
)
|
|
(vector-inv-orient-by-quat! s5-2 s5-2 (-> this root quat))
|
|
(and (< (fabs (-> s5-2 x)) 20480.0) (< 0.0 (-> s5-2 z)) (< (-> s5-2 z) 40960.0))
|
|
)
|
|
)
|
|
(let ((gp-1 (res-lump-struct (-> this entity) 'on-notice structure)))
|
|
(not (if gp-1
|
|
(script-eval (the-as pair gp-1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod com-elevator-method-49 ((this com-elevator) (arg0 symbol))
|
|
(let ((v1-3 (-> (the-as collide-shape-prim-group (-> this root root-prim)) child 1)))
|
|
(cond
|
|
(arg0
|
|
(set! (-> v1-3 prim-core collide-as) (collide-spec obstacle pusher))
|
|
(set! (-> v1-3 prim-core collide-with) (collide-spec jak player-list))
|
|
)
|
|
(else
|
|
(set! (-> v1-3 prim-core collide-as) (collide-spec))
|
|
(set! (-> v1-3 prim-core collide-with) (collide-spec))
|
|
0
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defstate dormant (com-elevator)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(let ((t9-1 (-> (find-parent-state) enter)))
|
|
(if t9-1
|
|
(t9-1)
|
|
)
|
|
)
|
|
(process-entity-status! self (entity-perm-status subtask-complete) #t)
|
|
)
|
|
)
|
|
|
|
(defstate running (com-elevator)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(let ((t9-0 (-> (method-of-type elevator running) enter)))
|
|
(if t9-0
|
|
(t9-0)
|
|
)
|
|
)
|
|
(com-elevator-method-49 self #t)
|
|
(if (not (logtest? (-> self elevator-status) (elevator-status moving)))
|
|
(set-setting! 'allow-look-around #f 0.0 0)
|
|
)
|
|
)
|
|
:exit (behavior ()
|
|
(sound-stop (-> self sound-id))
|
|
(sound-play "com-elevator-e")
|
|
(let ((t9-3 (-> (method-of-type elevator running) exit)))
|
|
(if t9-3
|
|
(t9-3)
|
|
)
|
|
)
|
|
(com-elevator-method-49 self #f)
|
|
(remove-setting! 'allow-look-around)
|
|
)
|
|
:code (behavior ()
|
|
(let ((gp-0 (current-time)))
|
|
(until (time-elapsed? gp-0 (seconds 1))
|
|
(suspend)
|
|
)
|
|
)
|
|
(sound-play "com-elevator-s")
|
|
(logior! (-> self elevator-status) (elevator-status waiting-to-ascend))
|
|
(until #f
|
|
(suspend)
|
|
(sound-play "com-elevator-lp" :id (-> self sound-id))
|
|
(when (= (-> self path-pos) 1.0)
|
|
(let ((v1-11 (the int (-> self move-pos 1))))
|
|
(if (-> self use-camera-startup? v1-11)
|
|
(persist-with-delay
|
|
*setting-control*
|
|
'string-startup-vector
|
|
(seconds 0.05)
|
|
'string-startup-vector
|
|
'abs
|
|
(the-as float (-> self camera-startup v1-11))
|
|
0
|
|
)
|
|
)
|
|
)
|
|
(logclear! (-> self elevator-status) (elevator-status waiting-to-ascend))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
|
|
(defmethod activate-elevator ((this com-elevator))
|
|
"Puts the elevator initially into the correct state. This is typically based upon game completion"
|
|
(cond
|
|
((logtest? (-> this entity extra perm status) (entity-perm-status subtask-complete))
|
|
(go (method-of-object this dormant))
|
|
)
|
|
((logtest? (-> this params flags) (elevator-flags elevator-flags-6))
|
|
(go (method-of-object this arrived))
|
|
)
|
|
(else
|
|
(go (method-of-object this waiting))
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod deactivate ((this com-elevator))
|
|
(sound-stop (-> this sound-id))
|
|
(call-parent-method this)
|
|
(none)
|
|
)
|
|
|
|
;; WARN: Return type mismatch sound-id vs none.
|
|
(defmethod init-plat! ((this com-elevator))
|
|
"Does any necessary initial platform setup.
|
|
For example for an elevator pre-compute the distance between the first and last points (both ways) and clear the sound."
|
|
(dotimes (s5-0 (-> this path curve num-cverts))
|
|
(let ((a1-1 (res-lump-struct (-> this entity) 'string-startup-vector structure :time (the float s5-0))))
|
|
(cond
|
|
(a1-1
|
|
(vector-normalize-copy! (-> this camera-startup s5-0) (the-as vector a1-1) 1.0)
|
|
(set! (-> this use-camera-startup? s5-0) #t)
|
|
)
|
|
(else
|
|
(set! (-> this use-camera-startup? s5-0) #f)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> this sound-id) (new-sound-id))
|
|
(none)
|
|
)
|
|
|
|
(defmethod init-plat-collision! ((this com-elevator))
|
|
"TODO - collision stuff for setting up the platform"
|
|
(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)
|
|
)
|
|
(let ((s4-0 (new 'process 'collide-shape-prim-group s5-0 (the-as uint 2) 0)))
|
|
(set! (-> s5-0 total-prims) (the-as uint 3))
|
|
(set! (-> s4-0 prim-core collide-as) (collide-spec obstacle camera-blocker pusher))
|
|
(set! (-> s4-0 prim-core collide-with) (collide-spec jak bot player-list))
|
|
(set! (-> s4-0 prim-core action) (collide-action solid rideable))
|
|
(set! (-> s4-0 transform-index) 3)
|
|
(set-vector! (-> s4-0 local-sphere) 0.0 0.0 22937.6 37683.2)
|
|
(set! (-> s5-0 root-prim) s4-0)
|
|
)
|
|
(pusher-init s5-0)
|
|
(let ((v1-15 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0))))
|
|
(set! (-> v1-15 prim-core collide-as) (collide-spec obstacle camera-blocker pusher))
|
|
(set! (-> v1-15 prim-core collide-with) (collide-spec jak bot player-list))
|
|
(set! (-> v1-15 prim-core action) (collide-action solid rideable))
|
|
(set! (-> v1-15 transform-index) 3)
|
|
(set-vector! (-> v1-15 local-sphere) 0.0 0.0 22937.6 37683.2)
|
|
)
|
|
(let ((v1-17 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 1) (the-as uint 0))))
|
|
(set! (-> v1-17 prim-core action) (collide-action solid))
|
|
(set! (-> v1-17 transform-index) 3)
|
|
(set-vector! (-> v1-17 local-sphere) 0.0 0.0 22937.6 39321.6)
|
|
)
|
|
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
|
|
(let ((v1-20 (-> s5-0 root-prim)))
|
|
(set! (-> s5-0 backup-collide-as) (-> v1-20 prim-core collide-as))
|
|
(set! (-> s5-0 backup-collide-with) (-> v1-20 prim-core collide-with))
|
|
)
|
|
(set! (-> this root) s5-0)
|
|
)
|
|
(com-elevator-method-49 this #f)
|
|
(none)
|
|
)
|
|
|
|
(deftype tomb-trans-elevator (com-elevator)
|
|
((unknown-gijh1bn2i3hb1 int32)
|
|
)
|
|
)
|
|
|
|
|
|
(defstate running (tomb-trans-elevator)
|
|
:virtual #t
|
|
:enter (behavior ()
|
|
(let ((t9-0 (-> (method-of-type com-elevator running) enter)))
|
|
(if t9-0
|
|
(t9-0)
|
|
)
|
|
)
|
|
(if (logtest? (-> self elevator-status) (elevator-status waiting-to-descend))
|
|
(set-setting! 'jump #f 0.0 0)
|
|
)
|
|
)
|
|
:exit (behavior ()
|
|
(let ((t9-0 (-> (method-of-type com-elevator running) exit)))
|
|
(if t9-0
|
|
(t9-0)
|
|
)
|
|
)
|
|
(sound-stop (-> self sound-id))
|
|
(sound-play "tmb-elev-stop")
|
|
(if (logtest? (-> self elevator-status) (elevator-status waiting-to-descend))
|
|
(remove-setting! 'jump)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(let ((gp-0 (current-time)))
|
|
(until (time-elapsed? gp-0 (seconds 1))
|
|
(suspend)
|
|
)
|
|
)
|
|
(logior! (-> self elevator-status) (elevator-status waiting-to-ascend))
|
|
(until #f
|
|
(sound-play "tmb-elevator-lp" :id (-> self sound-id))
|
|
(suspend)
|
|
(when (= (-> self path-pos) 1.0)
|
|
(let ((v1-10 (the int (-> self move-pos 1))))
|
|
(if (-> self use-camera-startup? v1-10)
|
|
(persist-with-delay
|
|
*setting-control*
|
|
'string-startup-vector
|
|
(seconds 0.05)
|
|
'string-startup-vector
|
|
'abs
|
|
(the-as float (-> self camera-startup v1-10))
|
|
0
|
|
)
|
|
)
|
|
)
|
|
(logclear! (-> self elevator-status) (elevator-status waiting-to-ascend))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
|
|
(defmethod deactivate ((this tomb-trans-elevator))
|
|
(sound-stop (-> this sound-id))
|
|
(call-parent-method this)
|
|
(none)
|
|
)
|
|
|
|
;; WARN: Return type mismatch sound-id vs none.
|
|
(defmethod init-plat! ((this tomb-trans-elevator))
|
|
"Does any necessary initial platform setup.
|
|
For example for an elevator pre-compute the distance between the first and last points (both ways) and clear the sound."
|
|
(call-parent-method this)
|
|
(set! (-> this sound-id) (new-sound-id))
|
|
(none)
|
|
)
|