jak-project/goal_src/jak2/levels/sewer/sewer-scenes.gc
ManDude 18ddd1613c
Jak 2 pc subtitle support (#2672)
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:

![image](https://github.com/open-goal/jak-project/assets/7569514/033e6374-a05a-4c31-b029-51868153a932)

![image](https://github.com/open-goal/jak-project/assets/7569514/5298aa6d-a183-446e-bdb6-61c4682df917)

Unlike in Jak 1, it will not hide the bottom HUD when subtitles are
active:

![image](https://github.com/open-goal/jak-project/assets/7569514/d466bfc0-55d0-4689-a6e1-b7784b9fff59)

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>
2023-06-08 01:04:16 +01:00

1340 lines
40 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: sewer-scenes.gc
;; name in dgo: sewer-scenes
;; dgos: SEB, SWB
(declare-type sew-gunturret enemy)
;; DECOMP BEGINS
(defpartgroup group-sewer-explode0
:id 151
:duration (seconds 3)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 1458 :fade-after (meters 200) :falloff-to (meters 200) :period (seconds 32) :length (seconds 0.085))
(sp-item 1459 :period (seconds 32) :length (seconds 0.035) :offset 10)
(sp-item 1460 :fade-after (meters 120) :falloff-to (meters 120) :period (seconds 32) :length (seconds 0.335) :offset 25)
(sp-item 1461 :fade-after (meters 60) :period (seconds 32) :length (seconds 0.117) :offset 10)
(sp-item 1462 :period (seconds 32) :length (seconds 0.167) :offset 15)
(sp-item 1463 :period (seconds 32) :length (seconds 0.017))
(sp-item 1464 :period (seconds 32) :length (seconds 0.167) :offset 15)
(sp-item 1465 :period (seconds 32) :length (seconds 0.017))
)
)
(defpart 1463
:init-specs ((:texture (new 'static 'texture-id :index #xbb :page #xc))
(:num 1.0)
(:y (meters -2.5))
(:scale-x (meters 32))
(:rot-x (degrees 45))
(:scale-y :copy scale-x)
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 96.0)
(:scalevel-x (meters 0.5))
(:rotvel-z (degrees 0.3))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -1.28)
(:fade-b -5.1)
(:fade-a 0.0)
(:timer (seconds 0.217))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow))
(:userdata 40960.0)
(:next-time (seconds 0.1))
(:next-launcher 1466)
)
)
(defpart 1466
:init-specs ((:scalevel-x (meters -0.2857143))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -3.6571429)
(:fade-b 0.0)
(:fade-a -2.7428572)
)
)
(defpart 1465
:init-specs ((:texture (new 'static 'texture-id :index #xca :page #xc))
(:num 1.0)
(:scale-x (meters 120))
(:rot-x (degrees 45))
(:scale-y :copy scale-x)
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 24.0)
(:scalevel-x (meters 0.13333334))
(:rotvel-z (degrees 0.3))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -4.266667)
(:fade-b -4.266667)
(:fade-a 0.0)
(:timer (seconds 0.5))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 glow))
(:userdata 40960.0)
(:next-time (seconds 0.25))
(:next-launcher 1467)
)
)
(defpart 1467
:init-specs ((:scalevel-x (meters 0))
(:scalevel-y :copy scalevel-x)
(:fade-r -0.85333335)
(:fade-g -1.7066667)
(:fade-b -1.7066667)
(:fade-a -0.64)
)
)
(defpart 1461
:init-specs ((:texture (new 'static 'texture-id :index #x92 :page #xc))
(:num 16.0)
(:y (meters -3.5) (meters 2))
(:scale-x (meters 2.5))
(:rot-x 4)
(:scale-y (meters 0.1) (meters 0.2))
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 64.0 32.0)
(:omega (degrees 0.0675))
(:vel-y (meters 0.26666668) (meters 0.2))
(:fade-b -8.0)
(:accel-y (meters -0.0033333334) (meters -0.0016666667))
(:friction 0.9 0.08)
(:timer (seconds 1.5) (seconds 0.997))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3))
(:func 'sparticle-motion-blur)
(:next-time (seconds 0.05))
(:next-launcher 1468)
(:conerot-x (degrees 0) (degrees 140))
(:conerot-y (degrees 0) (degrees 10000))
(:rotate-y (degrees 90))
)
)
(defpart 1468
:init-specs ((:r 255.0)
(:g 255.0)
(:b 0.0)
(:fade-r 0.0)
(:fade-g -2.6133332)
(:fade-b -1.7066667)
(:fade-a -0.096 -0.096)
(:next-time (seconds 0.25))
(:next-launcher 1469)
)
)
(defpart 1469
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0))
)
(defpart 1464
:init-specs ((:texture (new 'static 'texture-id :index #x34 :page #xc))
(:num 5.0 5.0)
(:y (meters -2.5))
(:scale-x (meters 3) (meters 2))
(:rot-x 4)
(:rot-z (degrees 0) (degrees 360) :store)
(:scale-y (meters 8) (meters 4))
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 32.0 32.0)
(:vel-y (meters 0.033333335) (meters 0.06666667))
(:scalevel-x (meters 0.033333335) (meters 0.13333334))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -0.36)
(:fade-b -4.24)
(:fade-a -0.26666668)
(:friction 0.92 0.02)
(:timer (seconds 3.335))
(:flags (sp-cpuinfo-flag-2))
(:func 'sparticle-motion-blur)
(:next-time (seconds 0.085))
(:next-launcher 1470)
(:conerot-x '*sp-temp*)
(:rotate-y (degrees 90))
(:conerot-radius (meters 0) (meters 2))
)
)
(defpart 1470
:init-specs ((:scalevel-x (meters 0.016666668) (meters 0.016666668))
(:scalevel-y :copy scalevel-x)
(:fade-r -0.55)
(:fade-g -2.95)
(:fade-b -3.3)
(:next-time (seconds 0.1) (seconds 0.03))
(:next-launcher 1471)
)
)
(defpart 1471
:init-specs ((:scalevel-x (meters 0.008333334) (meters 0.008333334))
(:scalevel-y :copy scalevel-x)
(:fade-r -1.2944444)
(:fade-g -0.7111111)
(:fade-b -0.2)
(:fade-a -0.225 -0.225)
)
)
(defpart 1462
:init-specs ((:texture (new 'static 'texture-id :index #x33 :page #xc))
(:birth-func 'birth-func-texture-group)
(:num 16.0 10.0)
(:y (meters -2.5))
(:scale-x (meters 3) (meters 2))
(:rot-z (degrees 0))
(:scale-y (meters 6.8) (meters 1.2))
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 32.0 32.0)
(:vel-y (meters 0) (meters 0.13333334))
(:scalevel-x (meters 0.06666667) (meters 0.13333334))
(:rotvel-z (degrees -0.12) (degrees 0.24))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -0.36)
(:fade-b -4.24)
(:fade-a -0.32)
(:friction 0.94)
(:timer (seconds 3.335))
(:flags (sp-cpuinfo-flag-2))
(:userdata :data (new 'static 'boxed-array :type int32 40 1 0 #xc00000 #xc03300))
(:next-time (seconds 0.085))
(:next-launcher 1472)
(:conerot-x (degrees 0) (degrees 360))
(:rotate-y (degrees 90))
(:conerot-radius (meters 0) (meters 8))
)
)
(defpart 1472
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:next-time (seconds 0.017) (seconds 0.065)) (:next-launcher 1473))
)
(defpart 1473
:init-specs ((:scalevel-x (meters 0.016666668) (meters 0.016666668))
(:scalevel-y :copy scalevel-x)
(:fade-r -0.44)
(:fade-g -2.36)
(:fade-b -2.64)
(:next-time (seconds 0.117) (seconds 0.047))
(:next-launcher 1474)
)
)
(defpart 1474
:init-specs ((:scalevel-x (meters 0.008333334) (meters 0.008333334))
(:scalevel-y :copy scalevel-x)
(:fade-r -1.2)
(:fade-g -0.7111111)
(:fade-b -0.2)
(:fade-a -0.06545454 -0.06545454)
(:next-time (seconds 0.5) (seconds 0.097))
(:next-launcher 1475)
)
)
(defpart 1475
:init-specs ((:fade-r 0.0) (:fade-g 0.0) (:fade-b 0.0) (:fade-a -0.1125))
)
(defpart 1460
:init-specs ((:texture (new 'static 'texture-id :index #x32 :page #xc))
(:num 6.0 8.0)
(:x (meters 0.25))
(:y (meters -2.5))
(:scale-x (meters 3) (meters 5))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 255.0)
(:g 255.0)
(:b 255.0)
(:a 16.0 48.0)
(:vel-y (meters 0.06666667) (meters 0.4))
(:scalevel-x (meters 0.013333334) (meters 0.013333334))
(:rotvel-z (degrees -0.12) (degrees 0.24))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g -0.18)
(:fade-b -2.12)
(:accel-y (meters -0.00033333333) (meters -0.0023333333))
(:friction 0.88 0.02)
(:timer (seconds 10))
(:flags (sp-cpuinfo-flag-2))
(:next-time (seconds 0.117) (seconds 0.047))
(:next-launcher 1476)
(:conerot-x (degrees 0) (degrees 360))
(:rotate-y (degrees 90))
(:conerot-radius (meters 3) (meters 5))
)
)
(defpart 1476
:init-specs ((:scalevel-x (meters 0.0016666667))
(:scalevel-y :copy scalevel-x)
(:fade-r 0.0)
(:fade-g 0.02)
(:fade-b 0.23555556)
(:next-time (seconds 0.15) (seconds 0.047))
(:next-launcher 1477)
)
)
(defpart 1477
:init-specs ((:fade-r -0.5543478) (:fade-g -0.5543478) (:fade-b -0.5543478) (:fade-a -0.10666667 -0.10666667))
)
(defpart 1458
:init-specs ((:texture (new 'static 'texture-id :page #xc))
(:num 4.0 8.0)
(:x (meters 0) (meters 0.6))
(:y (meters -2.5))
(:scale-x (meters 8.5) (meters 8))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 70.0 20.0)
(:g 70.0 20.0)
(:b 70.0 20.0)
(:a 0.0 40.0)
(:vel-y (meters 0) (meters 0.2))
(:scalevel-x (meters 0.033333335) (meters 0.086666666))
(:rotvel-z (degrees -0.12) (degrees 0.24))
(:scalevel-y :copy scalevel-x)
(:fade-r 3.3)
(:fade-g 3.12)
(:fade-b 1.18)
(:fade-a 1.76)
(:friction 0.89)
(:timer (seconds 2.367))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3))
(:next-time (seconds 0.117) (seconds 0.047))
(:next-launcher 1478)
(:conerot-x (degrees -1440) (degrees 2880))
(:rotate-y (degrees 90))
)
)
(defpart 1478
:init-specs ((:scalevel-x (meters 0.0033333334))
(:scalevel-y :copy scalevel-x)
(:fade-r -0.53333336)
(:fade-g -1.9666667)
(:fade-b -2.2)
(:fade-a -0.41666666)
(:next-time (seconds 0.15) (seconds 0.047))
(:next-launcher 1479)
)
)
(defpart 1479
:init-specs ((:scalevel-x (meters 0))
(:scalevel-y :copy scalevel-x)
(:fade-r -0.38833332)
(:fade-g -0.21333334)
(:fade-b -0.028333334)
(:fade-a -0.38833332)
)
)
(defpart 1459
:init-specs ((:texture (new 'static 'texture-id :index #x31 :page #xc))
(:num 9.0)
(:y (meters -2.5))
(:scale-x (meters 4) (meters 8))
(:rot-x 4)
(:rot-z (degrees 0) (degrees 360))
(:scale-y (meters 1) (meters 0.5))
(:r 128.0 128.0)
(:g 96.0)
(:b 64.0)
(:a 64.0 64.0)
(:scalevel-x (meters 0.13333334) (meters 0.4))
(:fade-g 1.6)
(:fade-b 3.2)
(:fade-a -1.6)
(:timer (seconds 0.3))
(:flags (sp-cpuinfo-flag-2))
)
)
(defpartgroup group-sewer-explode1
:id 346
:duration (seconds 3)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 1458 :fade-after (meters 200) :falloff-to (meters 200) :period (seconds 32) :length (seconds 0.085))
(sp-item 1459 :period (seconds 32) :length (seconds 0.035) :offset 10)
(sp-item 1460 :fade-after (meters 120) :falloff-to (meters 120) :period (seconds 32) :length (seconds 0.335) :offset 25)
(sp-item 1461 :fade-after (meters 60) :period (seconds 32) :length (seconds 0.117) :offset 10)
(sp-item 1462 :period (seconds 32) :length (seconds 0.167) :offset 15)
(sp-item 1463 :period (seconds 32) :length (seconds 0.017))
(sp-item 1464 :period (seconds 32) :length (seconds 0.167) :offset 15)
(sp-item 1465 :period (seconds 32) :length (seconds 0.017))
)
)
(defpartgroup group-sewer-explode2
:id 347
:duration (seconds 3)
:linger-duration (seconds 2)
:flags (use-local-clock)
:bounds (static-bspherem 0 0 0 2)
:parts ((sp-item 1458 :fade-after (meters 200) :falloff-to (meters 200) :period (seconds 32) :length (seconds 0.067))
(sp-item 1459 :period (seconds 32) :length (seconds 0.035) :offset 10)
(sp-item 1460 :fade-after (meters 120) :falloff-to (meters 120) :period (seconds 32) :length (seconds 0.335) :offset 25)
(sp-item 1461 :fade-after (meters 60) :period (seconds 32) :length (seconds 0.117) :offset 5)
(sp-item 1462 :period (seconds 32) :length (seconds 0.167) :offset 10)
(sp-item 1463 :period (seconds 32) :length (seconds 0.017))
(sp-item 1464 :period (seconds 32) :length (seconds 0.135) :offset 15)
(sp-item 1465 :period (seconds 32) :length (seconds 0.017))
(sp-item 1480 :period (seconds 32) :length (seconds 2.667))
)
)
(defpart 1480
:init-specs ((:texture (new 'static 'texture-id :page #xc))
(:num 0.25 0.2)
(:x (meters 0) (meters 16))
(:y (meters -4))
(:scale-x (meters 4) (meters 4))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 64.0 128.0)
(:g :copy r)
(:b :copy g)
(:a 0.0)
(:vel-y (meters 0.01) (meters 0.016666668))
(:scalevel-x (meters 0.013333334) (meters 0.013333334))
(:rotvel-z (degrees -0.12) (degrees 0.24))
(:scalevel-y :copy scalevel-x)
(:fade-a 0.10666667 0.13333334)
(:accel-y (meters -0.00016666666) (meters -0.00033333333))
(:timer (seconds 2))
(:flags (sp-cpuinfo-flag-2))
(:next-time (seconds 1))
(:next-launcher 1481)
(:rotate-y (degrees 0) (degrees 3600))
)
)
(defpart 1481
:init-specs ((:fade-a -0.08 -0.08))
)
(defpartgroup group-sewer-gun-laser-beam
:id 348
:flags (unk-4)
:bounds (static-bspherem 0 0 0 1)
:parts ((sp-item 1482 :flags (bit6 bit7)) (sp-item 1483 :flags (bit6 bit7)) (sp-item 1484 :flags (is-3d bit6 bit7)))
)
(defpart 1483
:init-specs ((:texture (new 'static 'texture-id :index #xbb :page #xc))
(:num 1.0)
(:scale-x (meters 0.4) (meters 0.1))
(:rot-x (degrees 1.125))
(:scale-y :copy scale-x)
(:r 255.0)
(:g 32.0 8.0)
(:b :copy g)
(:a 48.0 16.0)
(:rotvel-z (degrees 0.3))
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 glow))
(:userdata 1.0)
(:rotate-y (degrees 0))
)
)
(defpart 1482
:init-specs ((:texture (new 'static 'texture-id :index #xbb :page #xc))
(:num 1.0)
(:scale-x (meters 0.1) (meters 0.05))
(:rot-x (degrees 1.125))
(:scale-y :copy scale-x)
(:r 255.0)
(:g 128.0)
(:b :copy g)
(:a 64.0 32.0)
(:rotvel-z (degrees 0.3))
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 glow))
(:userdata 1.0)
(:rotate-y (degrees 0))
)
)
(defpart 1484
:init-specs ((:texture (new 'static 'texture-id :index #x4c :page #xc))
(:num 3.0)
(:z (meters 8))
(:scale-x (meters 0.025) (meters 0.005))
(:rot-z (degrees 0) (degrees 3600))
(:scale-y (meters 20))
(:r 255.0)
(:g :copy r)
(:b :copy g)
(:a 20.0 8.0)
(:timer (seconds 0.017))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-3 sp-cpuinfo-flag-14 left-multiply-quat))
(:userdata :data (new 'static 'boxed-array :type int32
10
1
0
#xc04c00
#xc04d00
#xc04e00
#xc04f00
#xc05000
#xc05100
#xc05200
#xc05300
#xc05400
#xc05500
#xc05600
#xc05700
#xc05800
#xc05900
#xc05a00
#xc05b00
#xc05c00
#xc05d00
#xc05e00
#xc05f00
#xc06000
#xc06100
#xc06200
#xc06300
#xc06400
#xc06500
#xc06600
#xc06700
#xc06800
#xc06900
#xc06a00
#xc06b00
)
)
(:func 'sparticle-texture-animate)
(:rotate-y (degrees 0))
)
)
(defpartgroup group-sewer-key-pull-out
:id 349
:linger-duration (seconds 1.5)
:bounds (static-bspherem 0 0 0 15)
:parts ((sp-item 1485) (sp-item 1486) (sp-item 1487))
)
(defpart 1485
:init-specs ((:texture (new 'static 'texture-id :page #xc))
(:num 2.0)
(:scale-x (meters 1) (meters 1))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 138.0)
(:g 85.0 16.0)
(:b 64.0 16.0)
(:a 16.0 32.0)
(:vel-y (meters 0.02) (meters 0.01))
(:scalevel-x (meters 0.0033333334))
(:rotvel-z (degrees -0.2) (degrees 0.4))
(:scalevel-y :copy scalevel-x)
(:fade-a -0.16)
(:accel-y (meters -0.00033333333))
(:friction 0.95)
(:timer (seconds 1))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-12))
(:conerot-x (degrees 60) (degrees 30))
(:conerot-y (degrees 0) (degrees 360))
)
)
(defpart 1486
:init-specs ((:texture (new 'static 'texture-id :page #xc))
(:num 8.0)
(:scale-x (meters 0.5) (meters 0.25))
(:rot-z (degrees 0) (degrees 360))
(:scale-y :copy scale-x)
(:r 128.0)
(:g 96.0 16.0)
(:b 64.0 16.0)
(:a 16.0 16.0)
(:vel-y (meters 0.053333335) (meters 0.02))
(:scalevel-x (meters 0.0016666667))
(:rotvel-z (degrees -0.2) (degrees 0.4))
(:scalevel-y :copy scalevel-x)
(:fade-a -0.21333334)
(:accel-y (meters -0.00033333333))
(:friction 0.95)
(:timer (seconds 0.5))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-12))
(:conerot-x (degrees 60) (degrees 30))
(:conerot-y (degrees 0) (degrees 360))
)
)
(defpart 1487
:init-specs ((:texture (new 'static 'texture-id :index #x26 :page #xc))
(:num 32.0)
(:x (meters -0.4) (meters 0.8))
(:y (meters -0.1) (meters 0.4))
(:z (meters -0.4) (meters 0.8))
(:scale-x (meters 0.03) (meters 0.02))
(:scale-y :copy scale-x)
(:r 148.0)
(:g 85.0 16.0)
(:b 64.0 16.0)
(:a 64.0 64.0)
(:vel-y (meters 0.015) (meters 0.006666667))
(:fade-a -0.42666668)
(:accel-y (meters -0.0013333333) (meters 0.00066666666))
(:timer (seconds 1))
(:flags (sp-cpuinfo-flag-2 sp-cpuinfo-flag-12))
(:conerot-x (degrees 30) (degrees 50.000004))
(:conerot-y (degrees 0) (degrees 360))
(:conerot-radius (meters 0.5))
)
)
(scene-method-16
(new 'static 'scene
:name "sewer-drain-res"
:extra #f
:info #f
:mask-to-clear (process-mask movie enemy platform projectile)
:entity "scene-stage-30"
:art-group "scenecamera"
:anim "sewer-drain-res"
:parts 8
:command-list '((0 (task-close! "sewer-board-resolution") (fadein (frame-time-30 10)))
(400 (part-tracker "group-sewer-key-pull-out" entity "sew-gold-key" joint "key" duration (frame-time 5)))
)
:cut-list '(70 330 441 498 591)
:wait-ground-time (seconds 1)
:draw-target #f
:abort #t
:actor (new 'static 'boxed-array :type scene-actor
(new 'static 'scene-actor
:name "scenecamera"
:level #f
:art-group "skel-scenecamera"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:camera 4
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sidekick-highres"
:level 'sewer
:art-group "skel-sidekick-highres"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "jak-highres"
:level 'sewer
:art-group "skel-jak-highres"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sew-gold-key"
:level 'sewer
:art-group "skel-sew-gold-key"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
)
:load-point-obj "sewer-start"
:end-point-obj #f
:borrow '()
:sfx-volume -1.0
:ambient-volume -1.0
:music-volume -1.0
:blackout-end #t
:peaceful #t
:music-delay 1500.0
:save #t
)
)
(scene-method-16
(new 'static 'scene
:name "sewer-blow-up-statue-res"
:extra #f
:info #f
:mask-to-clear (process-mask movie enemy platform projectile)
:entity "scene-stage-40"
:art-group "scenecamera"
:anim "sewer-blow-up-statue-res"
:parts 15
:command-list '((0
(kill "sewer-part-366")
(kill "sewer-part-367")
(kill "sewer-part-368")
(kill "sewer-part-369")
(fadein (seconds (new 'static 'bfloat :data 0.333)))
(send-event "jinx-sewer-1" 'hide #t)
(send-event "grim-sewer-1" 'hide #t)
(send-event "mog-sewer-1" 'hide #t)
)
(200
(send-event "jinx" 'segment 1024 770)
(send-event "mog" 'segment 32768 131074)
(send-event "grim" 'segment 16 770)
)
(362 (send-event "jinx" 'segment 0 6208) (send-event "mog" 'segment 0 16384) (send-event "grim" 'segment 0 8))
(365 (send-event "sew-mar-statue-5" 'hide))
(375
(part-tracker
"group-sewer-explode0"
entity
"particleman"
joint
"particleA"
track
#t
duration
(frame-range (new 'static 'bfloat :data 375.0) (new 'static 'bfloat :data 475.0))
)
)
(377 (apply ,(lambda :behavior scene-player () (set-sewesc-explosion!))))
(390
(apply ,(lambda :behavior scene-player () (set-sewesc-explosion!)))
(part-tracker
"group-sewer-explode1"
entity
"particleman"
joint
"particleB"
track
#t
duration
(frame-range (new 'static 'bfloat :data 390.0) (new 'static 'bfloat :data 490.0))
)
)
(395
(apply ,(lambda :behavior scene-player () (set-sewesc-explosion!)))
(part-tracker
"group-sewer-explode2"
entity
"particleman"
joint
"particleC"
track
#t
duration
(frame-range (new 'static 'bfloat :data 395.0) (new 'static 'bfloat :data 495.0))
)
)
(418 (apply ,(lambda :behavior scene-player () (set-sewesc-explosion!))))
(2340 (fadeout (seconds (new 'static 'bfloat :data 0.333))))
(10000
(send-event "sew-mar-statue-5" 'trigger)
(task-close! "sewer-escort-resolution")
(talker-spawn "krew003")
)
)
:cut-list '(86 161 296 326 361 376 396 416 539 571 620 681 731 781)
:wait-ground-time (seconds 1)
:draw-target #f
:abort #t
:actor (new 'static 'boxed-array :type scene-actor
(new 'static 'scene-actor
:name "scenecamera"
:level #f
:art-group "skel-scenecamera"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:camera 4
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "particleman"
:level 'sewesc
:art-group "skel-particleman"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sidekick-highres"
:level 'sewesc
:art-group "skel-sidekick-highres"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "jak-highres"
:level 'sewesc
:art-group "skel-jak-highres"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sew-mar-statue-explode-a"
:level 'sewesc
:art-group "skel-sew-mar-statue-explode-a"
:prefix "a-"
:draw-frames '((min max))
:scissor-frames '((369 376) (541 542) (620 692) (731 781))
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sew-mar-statue-explode-b"
:level 'sewesc
:art-group "skel-sew-mar-statue-explode-b"
:prefix "b-"
:draw-frames '((min max))
:scissor-frames '((369 376) (541 542) (620 692) (731 781))
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "heart-of-mar"
:level 'sewesc
:art-group "skel-heart-of-mar"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "jinx"
:level 'sewesc
:art-group "skel-jinx"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x1ae2
:no-draw-seg #x3e51c
)
(new 'static 'scene-actor
:name "mog"
:level 'sewesc
:art-group "skel-jinx"
:prefix "mog-"
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x26002
:no-draw-seg #x19ffc
)
(new 'static 'scene-actor
:name "grim"
:level 'sewesc
:art-group "skel-jinx"
:prefix "grim-"
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x28e
:no-draw-seg #x3fd70
)
)
:load-point-obj "sewesc-start"
:end-point-obj (new 'static 'continue-point
:name "sewesc-start"
:level #f
:flags (continue-flags change-continue)
:trans (new 'static 'vector :x 5541148.0 :y -363968.9 :z 2435194.5 :w 1.0)
:quat (new 'static 'vector :y 0.0482 :w 0.9988)
:camera-trans (new 'static 'vector :x 5518817.0 :y -344878.7 :z 2399633.5 :w 1.0)
:camera-rot (new 'static 'inline-array vector3s 3
(new 'static 'vector3s :data (new 'static 'array float 3 0.8481 0.0 -0.5297))
(new 'static 'vector3s :data (new 'static 'array float 3 0.0787 0.9888 0.126))
(new 'static 'vector3s :data (new 'static 'array float 3 0.5238 -0.1486 0.8387))
)
:on-goto #f
:vis-nick 'sewesc
:want (new 'static 'inline-array level-buffer-state 6
(new 'static 'level-buffer-state :name 'sewescb :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name 'sewesc :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
)
:want-sound (new 'static 'array symbol 3 'sewer4 'sewer5 'sewer6)
)
:borrow '()
:sfx-volume -1.0
:ambient-volume -1.0
:music-volume -1.0
:blackout-end #t
:peaceful #t
:music-delay 1500.0
:save #t
:scene-task #xb0
)
)
(deftype fake-jinx-bomb-info (basic)
((handle handle :offset-assert 8)
)
:method-count-assert 9
:size-assert #x10
:flag-assert #x900000010
)
(define *fake-jinx-bomb-info* (new 'static 'fake-jinx-bomb-info))
(set! (-> *fake-jinx-bomb-info* handle) (the-as handle #f))
(scene-method-16
(new 'static 'scene
:name "sewer-hosehead"
:extra #f
:info #f
:mask-to-clear (process-mask movie)
:entity "scene-stage-66"
:art-group "scenecamera"
:anim "sewer-hosehead"
:parts 4
:command-list '((0
(fadein (seconds (new 'static 'bfloat :data 0.333)))
(send-event "jinx-sewer-1" 'hide #t)
(send-event "grim-sewer-1" 'hide #t)
(send-event "mog-sewer-1" 'hide #t)
(send-event "jinx" 'segment 0 1026)
(send-event "mog" 'segment 0 32770)
(send-event "grim" 'segment 0 18)
(kill "sew-wall-3")
(send-event "jinx-sewer-1" 'request 'no-bomb)
(apply
,(lambda :behavior scene-player
()
(let ((gp-0 (new 'stack-no-clear 'vector))
(s5-0 (new 'stack-no-clear 'quaternion))
)
(set-vector! gp-0 5705928.5 -364089.75 2060228.6 1.0)
(quaternion-identity! s5-0)
(set! (-> *fake-jinx-bomb-info* handle)
(ppointer->handle
(process-spawn
jinx-bomb
gp-0
s5-0
(level-get *level* 'sewesc)
0
#f
#f
:to (ppointer->process (-> *setting-control* user-current movie))
)
)
)
)
(none)
)
)
)
(13
(apply
,(lambda :behavior scene-player
()
(send-event (handle->process (-> *fake-jinx-bomb-info* handle)) 'trigger)
(none)
)
)
)
(128 (apply ,(lambda :behavior scene-player () (spawn-hosehead-fakes) (none))))
(184
(apply
,(lambda :behavior scene-player
()
(hosehead-fake-trigger 8)
(hosehead-fake-trigger 9)
(hosehead-fake-trigger 12)
(hosehead-fake-trigger 19)
(hosehead-fake-trigger 20)
(none)
)
)
)
(211 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 7) (none))))
(237 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 10) (hosehead-fake-trigger 22) (none))))
(249 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 3) (none))))
(256 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 11) (none))))
(257 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 2) (none))))
(260 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 25) (none))))
(262 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 15) (none))))
(265 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 29) (none))))
(268
(send-event "hal-sewer-1" 'hosehead-fake 14)
(apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 14) (none)))
)
(275
(send-event "hal-sewer-1" 'hosehead-fake 13)
(apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 13) (none)))
)
(293 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 4) (hosehead-fake-trigger 23) (none))))
(299 (apply ,(lambda :behavior scene-player () (hosehead-fake-trigger 24) (none))))
(354 (send-event *target* 'change-mode 'gun #f (unbox 1)))
(368
(part-tracker "group-sewer-gun-laser-beam" entity "gun" joint "laser" track #t duration (frame-range 368 400))
)
(10000
(send-event "jinx-sewer-1" 'hide #f)
(send-event "grim-sewer-1" 'hide #f)
(send-event "mog-sewer-1" 'hide #f)
(task-close! "sewer-escort-explode-wall2")
)
)
:cut-list '(55 181 350)
:wait-ground-time (seconds 1)
:draw-target #f
:abort #t
:actor (new 'static 'boxed-array :type scene-actor
(new 'static 'scene-actor
:name "scenecamera"
:level #f
:art-group "skel-scenecamera"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:camera 4
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sidekick-highres"
:level 'sewesc
:art-group "skel-sidekick-highres"
:prefix ""
:draw-frames '((min 181) (350 max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "jak-highres"
:level 'sewesc
:art-group "skel-jak-highres"
:prefix ""
:draw-frames '((min 181) (350 max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "sew-wall"
:level 'sewesc
:art-group "skel-sew-wall"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "hosehead"
:level 'sewesc
:art-group "skel-hosehead"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
)
(new 'static 'scene-actor
:name "gun"
:level #f
:art-group "skel-gun"
:prefix ""
:draw-frames '((350 max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:no-draw-seg #x4
)
(new 'static 'scene-actor
:name "jinx"
:level 'sewesc
:art-group "skel-jinx"
:prefix ""
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x1ae2
:no-draw-seg #x3e51c
)
(new 'static 'scene-actor
:name "mog"
:level 'sewesc
:art-group "skel-jinx"
:prefix "mog-"
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x26002
:no-draw-seg #x19ffc
)
(new 'static 'scene-actor
:name "grim"
:level 'sewesc
:art-group "skel-jinx"
:prefix "grim-"
:draw-frames '((min max))
:scissor-frames '()
:light-index #x1e
:flags #x1
:shadow-flags -1
:shadow-volume-joint #f
:draw-seg #x28e
:no-draw-seg #x3fd70
)
)
:load-point-obj "sewesc-start"
:end-point-obj (new 'static 'continue-point
:name "sewesc-start"
:level #f
:flags (continue-flags change-continue)
:trans (new 'static 'vector :x 5608474.5 :y -363960.3 :z 1988017.4 :w 1.0)
:quat (new 'static 'vector :y -0.6775 :w -0.7354)
:camera-trans (new 'static 'vector :x 5562796.5 :y -344327.78 :z 1985962.4 :w 1.0)
:camera-rot (new 'static 'inline-array vector3s 3
(new 'static 'vector3s :data (new 'static 'array float 3 0.0457 0.0 -0.9989))
(new 'static 'vector3s :data (new 'static 'array float 3 0.1258 0.992 0.0057))
(new 'static 'vector3s :data (new 'static 'array float 3 0.9909 -0.126 0.0454))
)
:on-goto #f
:vis-nick 'sewesc
:want (new 'static 'inline-array level-buffer-state 6
(new 'static 'level-buffer-state :name 'sewescb :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name 'sewesc :display? 'display :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
(new 'static 'level-buffer-state :name #f :display? #f :force-vis? #f :force-inside? #f)
)
:want-sound (new 'static 'array symbol 3 'sewer4 'sewer5 'sewer6)
)
:borrow '()
:sfx-volume -1.0
:ambient-volume -1.0
:music-volume -1.0
:blackout-end #t
:peaceful #t
:music-delay 1500.0
:save #t
:scene-task #xaf
)
)
(defmethod draw hud-gunturret ((obj hud-gunturret))
(set-hud-piece-position!
(the-as hud-sprite (-> obj sprites))
(the int (+ 457.0 (* 130.0 (-> obj offset))))
205
)
(format (clear (-> obj strings 0 text)) "~D" (-> obj values 0 current))
(set-as-offset-from! (the-as hud-sprite (-> obj strings 0 pos)) (the-as vector4w (-> obj sprites)) -20 24)
((method-of-type hud draw) obj)
0
(none)
)
(defmethod update-values hud-gunturret ((obj hud-gunturret))
(set! (-> obj values 0 target) (the int (-> *game-info* counter)))
((method-of-type hud update-values) obj)
0
(none)
)
(defmethod init-callback hud-gunturret ((obj hud-gunturret))
(set! (-> obj level) (level-get *level* 'sewerb))
(set! (-> obj gui-id)
(add-process *gui-control* obj (gui-channel hud-middle-right) (gui-action hidden) (-> obj name) 81920.0 0)
)
(logior! (-> obj flags) (hud-flags show))
(set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :page #xd37)))
(set! (-> obj sprites 0 flags) (the-as uint 4))
(set! (-> obj sprites 0 scale-x) 0.7)
(set! (-> obj sprites 0 scale-y) 0.7)
(alloc-string-if-needed obj 0)
(set! (-> obj strings 0 scale) 0.6)
(set! (-> obj strings 0 flags) (font-flags kerning middle large))
0
(none)
)
(set-subtask-hook!
*game-info*
(game-task-node sewer-enemy-blow-up-turrets)
TASK_MANAGER_INIT_HOOK
(lambda :behavior task-manager
()
(while (!= (level-status *level* 'sewer) 'active)
(suspend)
)
(set! (-> *game-info* controller 0) (process->handle self))
(let ((a0-6 (entity-by-type sew-gunturret)))
(set! (-> self actor-group 0) (res-lump-struct a0-6 'actor-groups (pointer entity-actor)))
)
(when (-> self actor-group 0)
(set! (-> self data-int32 0) (the-as int (-> self actor-group 0 0)))
(set! (-> self data-int32 1) (the-as int (-> self actor-group 0 0)))
)
(when (-> self actor-group 0)
(dotimes (gp-1 (the-as int (-> self actor-group 0 0)))
(let ((t0-1 (-> (&+ (-> self actor-group 0) (* gp-1 8)) 3)))
(if t0-1
(add-icon! *minimap* self (the-as uint 16) (the-as int #f) (the-as vector t0-1) 0)
)
)
)
#f
)
)
)
(set-subtask-hook!
*game-info*
(game-task-node sewer-enemy-blow-up-turrets)
TASK_MANAGER_CODE_HOOK
(lambda :behavior task-manager
()
(local-vars (sv-96 int) (sv-100 float) (sv-104 vector))
(set! (-> self start-time) (current-time))
(set! (-> self hud-timer) (ppointer->handle (process-spawn hud-gunturret :init hud-init-by-other :to self)))
(while (> (-> self data-int32 0) 0)
(when (!= (level-status *level* 'sewer) 'active)
(send-event (handle->process (-> self hud-timer)) 'hide-and-die)
(while (-> self child)
(suspend)
)
(deactivate self)
)
(set! sv-96 (-> self data-int32 1))
(set! sv-100 4095996000.0)
(set! sv-104 (target-pos 0))
(when (-> self actor-group 0)
(dotimes (gp-2 (the-as int (-> self actor-group 0 0)))
(let ((s5-0 (-> (&+ (-> self actor-group 0) (* gp-2 8)) 3)))
(let ((f0-1 (vector-vector-distance sv-104 (-> s5-0 extra trans))))
(if (< f0-1 sv-100)
(set! sv-100 f0-1)
)
)
(if (and s5-0 (logtest? (-> s5-0 extra perm status) (entity-perm-status dead)))
(set! sv-96 (+ sv-96 -1))
)
)
)
)
(when (< sv-96 (-> self data-int32 0))
(case sv-96
((3)
(talker-spawn-func (-> *talker-speech* 462) *entity-pool* (target-pos 0) (the-as region #f))
)
((2)
(talker-spawn-func (-> *talker-speech* 463) *entity-pool* (target-pos 0) (the-as region #f))
)
((1)
(talker-spawn-func (-> *talker-speech* 464) *entity-pool* (target-pos 0) (the-as region #f))
)
)
)
(let ((v1-51 sv-96))
(set! (-> self data-int32 0) v1-51)
(set! (-> *game-info* counter) (the float v1-51))
)
(when (and (= (-> self data-int32 1) sv-96)
(and (< sv-100 122880.0) (>= (- (current-time) (-> self beep-time)) (seconds 40)))
)
(talker-spawn-func (-> *talker-speech* 53) *entity-pool* (target-pos 0) (the-as region #f))
(set! (-> self beep-time) (current-time))
)
(suspend)
)
(go-virtual complete)
)
)