mirror of
https://github.com/open-goal/jak-project
synced 2026-06-15 06:31:22 -04:00
18ddd1613c
Adds support for adding custom subtitles to Jak 2 audio. Comes with a new editor for the new system and format. Compared to the Jak 1 system, this is much simpler to make an editor for. Comes with a few subtitles already made as an example. Cutscenes are not officially supported but you can technically subtitle those with editor, so please don't right now. This new system supports multiple subtitles playing at once (even from a single source!) and will smartly push the subtitles up if there's a message already playing:   Unlike in Jak 1, it will not hide the bottom HUD when subtitles are active:  Sadly this leaves us with not much space for the subtitle region (and the subtitles are shrunk when the minimap is enabled) but when you have guards and citizens talking all the time, hiding the HUD every time anyone spoke would get really frustrating. The subtitle speaker is also color-coded now, because I thought that would be fun to do. TODO: - [x] proper cutscene support. - [x] merge mode for cutscenes so we don't have to rewrite the script? --------- Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
119 lines
3.1 KiB
Common Lisp
119 lines
3.1 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: process-focusable.gc
|
|
;; name in dgo: process-focusable
|
|
;; dgos: ENGINE, GAME
|
|
|
|
(defenum focus-status
|
|
:bitfield #t
|
|
:type uint32
|
|
(disable 0) ;; if set, all collide checks fail
|
|
(dead 1) ;; if set, all collide checks fail
|
|
(ignore 2)
|
|
(inactive 3)
|
|
(dangerous 4)
|
|
(in-air 5)
|
|
(hit 6)
|
|
(grabbed 7)
|
|
(in-head 8)
|
|
(touch-water 9)
|
|
(on-water 10)
|
|
(under-water 11)
|
|
(edge-grab 12)
|
|
(pole 13)
|
|
(pilot-riding 14)
|
|
(flut 15)
|
|
(tube 16)
|
|
(ice 17)
|
|
(board 18)
|
|
(gun 19)
|
|
(pilot 20) ;; also racer?
|
|
(mech 21)
|
|
(dark 22)
|
|
(rail 23)
|
|
(halfpipe 24)
|
|
(carry 25)
|
|
(super 26)
|
|
(shooting 27)
|
|
(indax 28)
|
|
(arrestable 29)
|
|
(teleporting 30)
|
|
(fs31 31)
|
|
)
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype process-focusable (process-drawable)
|
|
((root-override collide-shape :offset 128)
|
|
(focus-status focus-status :offset-assert 200)
|
|
)
|
|
:heap-base #x50
|
|
:method-count-assert 27
|
|
:size-assert #xcc
|
|
:flag-assert #x1b005000cc
|
|
(:methods
|
|
(get-trans (_type_ int) vector 20)
|
|
(get-quat (_type_ int) quaternion 21)
|
|
(get-transv (_type_) vector 22)
|
|
(time-to-apex-or-ground (_type_ int) int 23)
|
|
(get-water-height (_type_) meters 24)
|
|
(get-notice-time (_type_) time-frame 25)
|
|
(get-inv-mass (_type_) float 26)
|
|
)
|
|
)
|
|
|
|
|
|
;; WARN: Return type mismatch structure vs vector.
|
|
(defmethod get-trans process-focusable ((obj process-focusable) (arg0 int))
|
|
"@returns the `trans` [[vector]] from the process's `root` (typically either a [[trsqv]] or a [[collide-shape]])"
|
|
(let ((gp-0 (-> obj root-override)))
|
|
(the-as vector (cond
|
|
((zero? arg0)
|
|
(-> gp-0 trans)
|
|
)
|
|
((and (= arg0 1) (type? gp-0 collide-shape-moving))
|
|
(-> (the-as collide-shape-moving gp-0) gspot-pos)
|
|
)
|
|
((and (or (= arg0 2) (= arg0 3)) (type? gp-0 collide-shape))
|
|
;; PC PORT NOTE : added check here so we don't use invalid bones
|
|
(if (logtest? (-> obj draw status) (draw-control-status uninited))
|
|
(-> gp-0 trans)
|
|
(-> gp-0 root-prim prim-core))
|
|
)
|
|
(else
|
|
(-> gp-0 trans)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod get-transv process-focusable ((obj process-focusable))
|
|
(-> obj root-override transv)
|
|
)
|
|
|
|
(defmethod get-quat process-focusable ((obj process-focusable) (arg0 int))
|
|
(-> obj root-override quat)
|
|
)
|
|
|
|
(defmethod time-to-apex-or-ground process-focusable ((obj process-focusable) (arg0 int))
|
|
0
|
|
)
|
|
|
|
;; WARN: Return type mismatch int vs meters.
|
|
(defmethod get-water-height process-focusable ((obj process-focusable))
|
|
(the-as meters 0)
|
|
)
|
|
|
|
(defmethod get-inv-mass process-focusable ((obj process-focusable))
|
|
0.0
|
|
)
|
|
|
|
;; WARN: Return type mismatch int vs time-frame.
|
|
(defmethod get-notice-time process-focusable ((obj process-focusable))
|
|
(the-as time-frame 0)
|
|
)
|
|
|
|
(defmacro focus-test? (pfoc &rest status)
|
|
`(logtest? (-> (the process-focusable ,pfoc) focus-status) (focus-status ,@status))) |