mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
7edfc8bcec
* blocked: `part-tester` - `code` handler thinks it returns nothing * blocked: `crates` finished but `go` is returning none causing issues * blocked: `(event ram-boss-idle)::snow-ram-boss` expression building fails due to delay slot issue * decomp: finish `snow-ram` | `seagull` blocked, new static data issue * decomp: finish `snow-bumper` * stuck: `snow-ball` close, can't figure out a type made on the stack * decomp: finish `spider-egg` * decomp: finish `puffer` * decomp: finish `driller-lurker` * decomp: finish `dark-crystal` * stuck: `kermit` - mostly done but stuck on a joint related callback arg * decomp: finish `gnawer` * decomp: finish `mother-spider-egg` * decomp: finish `swamp-blimp` * stuck: `mistycannon` prebind function signature * decomp: finish `citb-plat` * decomp: finish `darkvine` * blocked: `jungle-mirrors` - issues with `link` macro * decomp: finish `launcherdoor` * decomp: finish `quicksandlurker` except for 1 unused function * stuck: `balloonlurker` - `(code balloonlurker-mine-explode)` has some weird joint related code * stuck: need to decompile an asm func in `orbit-plat` * decomp: finish `voicebox` * blocked: `mother-spider` has issues where `go` returns none * decomp: finish `bully` * decomp: finish `seagull` * fixed up after merge conflicts * decomp: finish `jungle-mirrors` * update gsrc * double checked files, fixed issues * decomp: revert change to projectile methods * decomp: some more fixes * address feedback * fix up remaining method calls in `cam-states` * fix jungle-mirrors
3259 lines
96 KiB
Common Lisp
3259 lines
96 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: generic-obs.gc
|
|
;; name in dgo: generic-obs
|
|
;; dgos: GAME, ENGINE
|
|
|
|
(declare-type swingpole process)
|
|
(define-extern swingpole-stance (state swingpole))
|
|
(define-extern swingpole-active (state swingpole))
|
|
|
|
(define-extern convert-to-hud-object (function process-drawable hud none :behavior hud))
|
|
|
|
;; TODO - temporary
|
|
(define-extern command-get-process (function object process-drawable process :behavior camera-tracker))
|
|
|
|
(define-extern process-drawable-from-entity! (function process-drawable entity-actor none))
|
|
|
|
;; TODO - for citb-plat
|
|
(define-extern *particle-quat* quaternion)
|
|
|
|
;; TODO - for jungle-mirrors
|
|
(define-extern line-in-view-frustum? (function vector vector symbol))
|
|
|
|
;; decomp begins
|
|
|
|
(declare-type beach-part part-spawner)
|
|
(define-extern beach-part-grotto-1 (state beach-part))
|
|
|
|
(declare-type launcher process-drawable)
|
|
(define-extern launcher-active (state launcher))
|
|
(define-extern launcher-idle (state launcher))
|
|
(define-extern launcher-deactivated (state launcher))
|
|
|
|
(define-extern command-get-camera (function object state object)) ;; ret - (state camera) | string | symbol
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(defbehavior
|
|
clone-anim-once process-drawable
|
|
((arg0 handle) (arg1 int) (arg2 symbol) (arg3 string))
|
|
(set! (-> self skel status) (logand -33 (-> self skel status)))
|
|
(let ((s5-0 (handle->process arg0)))
|
|
(if (the-as process-drawable s5-0)
|
|
(joint-control-copy!
|
|
(-> self skel)
|
|
(-> (the-as process-drawable s5-0) skel)
|
|
)
|
|
)
|
|
(cond
|
|
((and
|
|
(the-as process-drawable s5-0)
|
|
(joint-control-remap!
|
|
(-> self skel)
|
|
(-> self draw art-group)
|
|
(-> (the-as process-drawable s5-0) draw art-group)
|
|
'()
|
|
0
|
|
arg3
|
|
)
|
|
)
|
|
(when arg2
|
|
(let* ((s4-1 (-> self root))
|
|
(a0-7
|
|
(if
|
|
(and (nonzero? s4-1) (type-type? (-> s4-1 type) collide-shape))
|
|
(the-as collide-shape s4-1)
|
|
)
|
|
)
|
|
)
|
|
(if a0-7
|
|
(TODO-RENAME-30 a0-7 (-> (the-as process-drawable s5-0) root trans))
|
|
(set!
|
|
(-> self root trans quad)
|
|
(-> (the-as process-drawable s5-0) root trans quad)
|
|
)
|
|
)
|
|
)
|
|
(quaternion-copy!
|
|
(-> self root quat)
|
|
(-> (the-as process-drawable s5-0) root quat)
|
|
)
|
|
)
|
|
(if (logtest? (-> (the-as process-drawable s5-0) skel status) 32)
|
|
(logior! (-> self skel status) 32)
|
|
)
|
|
(set! (-> self draw status) (logand -7 (-> self draw status)))
|
|
(if (not (-> self skel root-channel 0 frame-group))
|
|
(logior! (-> self draw status) 4)
|
|
)
|
|
(let* ((s5-1 self)
|
|
(v1-37 (if (and (nonzero? s5-1) (type-type? (-> s5-1 type) manipy))
|
|
s5-1
|
|
)
|
|
)
|
|
)
|
|
(if (and manipy (not (-> (the-as manipy v1-37) draw?)))
|
|
(logior! (-> self draw status) 4)
|
|
)
|
|
)
|
|
(dummy-17 self)
|
|
(let ((a0-22 (-> self skel effect)))
|
|
(if a0-22
|
|
(TODO-RENAME-9 a0-22)
|
|
)
|
|
)
|
|
(if (logtest? (-> self skel status) 72)
|
|
(merc-blend-shape self)
|
|
)
|
|
(if (logtest? (-> self skel status) 384)
|
|
(merc-eye-anim self)
|
|
)
|
|
)
|
|
(else
|
|
(logior! (-> self draw status) 2)
|
|
(ja-post)
|
|
)
|
|
)
|
|
)
|
|
(if (>= arg1 0)
|
|
(vector<-cspace! (-> self draw origin) (-> self node-list data arg1))
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defbehavior
|
|
clone-anim process-drawable
|
|
((arg0 handle) (arg1 int) (arg2 symbol) (arg3 string))
|
|
(ja-post)
|
|
(while (handle->process arg0)
|
|
(clone-anim-once arg0 arg1 #t arg3)
|
|
(suspend)
|
|
)
|
|
(set! (-> self skel status) (logand -33 (-> self skel status)))
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defstate swingpole-stance (swingpole)
|
|
:code
|
|
(behavior ()
|
|
(while #t
|
|
(when
|
|
(and
|
|
*target*
|
|
(<
|
|
(vector-vector-distance
|
|
(-> self root trans)
|
|
(-> *target* control unknown-vector90)
|
|
)
|
|
(-> self range)
|
|
)
|
|
(logtest? (-> *target* control root-prim prim-core action) 64)
|
|
(<
|
|
(-> *target* control unknown-vector90 y)
|
|
(+ (-> self root trans y) (* 0.5 (-> self range)))
|
|
)
|
|
)
|
|
(let ((a1-1 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-1 from) self)
|
|
(set! (-> a1-1 num-params) 1)
|
|
(set! (-> a1-1 message) 'pole-grab)
|
|
(set! (-> a1-1 param 0) (the-as uint self))
|
|
(if (send-event-function *target* a1-1)
|
|
(go swingpole-active)
|
|
)
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate swingpole-active (swingpole)
|
|
:code
|
|
(behavior ()
|
|
(suspend)
|
|
(while
|
|
(and
|
|
*target*
|
|
(= (handle->process (-> *target* control unknown-handle10)) self)
|
|
)
|
|
(suspend)
|
|
)
|
|
(let ((gp-0 (-> *display* base-frame-counter)))
|
|
(until (>= (- (-> *display* base-frame-counter) gp-0) 150)
|
|
(suspend)
|
|
)
|
|
)
|
|
(go swingpole-stance)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod init-from-entity! swingpole ((obj swingpole) (arg0 entity-actor))
|
|
"Copy defaults from the entity."
|
|
(stack-size-set! (-> obj main-thread) 128)
|
|
(logior! (-> obj mask) (process-mask actor-pause))
|
|
(set! (-> obj root) (new 'process 'trsq))
|
|
(set! (-> obj root trans quad) (-> arg0 extra trans quad))
|
|
(quaternion-copy! (-> obj root quat) (-> arg0 quat))
|
|
(vector-identity! (-> obj root scale))
|
|
(vector-y-quaternion! (-> obj dir) (-> obj root quat))
|
|
(set! (-> obj dir y) 0.0)
|
|
(vector-normalize! (-> obj dir) 1.0)
|
|
(set! (-> obj range) 12288.0)
|
|
(set! (-> obj edge-length) 8192.0)
|
|
(go swingpole-stance)
|
|
(none)
|
|
)
|
|
|
|
(defstate die (process-hidden)
|
|
:virtual #t
|
|
:code
|
|
(the-as (function none :behavior process-hidden) nothing)
|
|
)
|
|
|
|
(defmethod
|
|
init-from-entity!
|
|
process-hidden
|
|
((obj process-hidden) (arg0 entity-actor))
|
|
"Copy defaults from the entity."
|
|
(process-entity-status! obj (entity-perm-status dead) #t)
|
|
(go (method-of-object obj die))
|
|
(none)
|
|
)
|
|
|
|
(deftype target-start (process-hidden)
|
|
()
|
|
:method-count-assert 15
|
|
:size-assert #x70
|
|
:flag-assert #xf00000070
|
|
)
|
|
|
|
|
|
(deftype camera-start (process-hidden)
|
|
()
|
|
:method-count-assert 15
|
|
:size-assert #x70
|
|
:flag-assert #xf00000070
|
|
)
|
|
|
|
|
|
(defstate manipy-idle (manipy)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(local-vars (v0-0 none))
|
|
(let ((v1-0 arg2))
|
|
(the-as object (cond
|
|
((= v1-0 'attackable)
|
|
(cond
|
|
((-> arg3 param 0)
|
|
(set!
|
|
v0-0
|
|
(the-as
|
|
none
|
|
(logior (process-mask attackable) (-> self mask))
|
|
)
|
|
)
|
|
(set! (-> self mask) (the-as process-mask v0-0))
|
|
)
|
|
(else
|
|
(set!
|
|
v0-0
|
|
(the-as
|
|
none
|
|
(logclear (-> self mask) (process-mask attackable))
|
|
)
|
|
)
|
|
(set! (-> self mask) (the-as process-mask v0-0))
|
|
)
|
|
)
|
|
v0-0
|
|
)
|
|
((= v1-0 'blend-shape)
|
|
(cond
|
|
((-> arg3 param 0)
|
|
(set!
|
|
v0-0
|
|
(the-as none (logior (-> self skel status) 264))
|
|
)
|
|
(set! (-> self skel status) (the-as uint v0-0))
|
|
)
|
|
(else
|
|
(set!
|
|
v0-0
|
|
(the-as none (logand -265 (-> self skel status)))
|
|
)
|
|
(set! (-> self skel status) (the-as uint v0-0))
|
|
)
|
|
)
|
|
v0-0
|
|
)
|
|
((= v1-0 'shadow)
|
|
(cond
|
|
((-> arg3 param 0)
|
|
(set! v0-0 (the-as none (-> self shadow-backup)))
|
|
(set! (-> self draw shadow) (the-as shadow-geo v0-0))
|
|
v0-0
|
|
)
|
|
(else
|
|
(set! (-> self draw shadow) #f)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'trans-hook)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set!
|
|
(-> self new-trans-hook)
|
|
(the-as (function none) v0-0)
|
|
)
|
|
v0-0
|
|
)
|
|
((= v1-0 'post-hook)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set!
|
|
(-> self new-post-hook)
|
|
(the-as (function none) v0-0)
|
|
)
|
|
v0-0
|
|
)
|
|
((= v1-0 'eval)
|
|
((the-as (function manipy none) (-> arg3 param 0)) self)
|
|
)
|
|
((= v1-0 'become-hud-object)
|
|
(convert-to-hud-object self (the-as hud (-> arg3 param 0)))
|
|
)
|
|
((= v1-0 'event-hook)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set!
|
|
(-> self cur-event-hook)
|
|
(the-as (function none) v0-0)
|
|
)
|
|
v0-0
|
|
)
|
|
((= v1-0 'art-joint-anim)
|
|
(set!
|
|
(-> self new-joint-anim)
|
|
(the-as
|
|
art-joint-anim
|
|
(dummy-10
|
|
(-> self draw art-group)
|
|
(the-as string (-> arg3 param 0))
|
|
art-joint-anim
|
|
)
|
|
)
|
|
)
|
|
(set! v0-0 (the-as none (-> arg3 param 1)))
|
|
(set! (-> self new-joint-anim-blend) (the-as uint v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'anim-mode)
|
|
(when (nonzero? (-> self skel))
|
|
(set!
|
|
(-> self anim-mode)
|
|
(the-as symbol (-> arg3 param 0))
|
|
)
|
|
(if (= (-> self anim-mode) 'clone-anim)
|
|
(ja-post)
|
|
)
|
|
(-> self anim-mode)
|
|
)
|
|
)
|
|
((or (= v1-0 'origin-joint-index) (= v1-0 'center-joint))
|
|
(set! (-> self draw origin-joint-index) (-> arg3 param 0))
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set! (-> self draw shadow-joint-index) (the-as uint v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'max-vis-dist)
|
|
(let ((f0-0 (the-as float (-> arg3 param 0))))
|
|
(set!
|
|
(->
|
|
self
|
|
draw
|
|
lod-set
|
|
lod
|
|
(-> self draw lod-set max-lod)
|
|
dist
|
|
)
|
|
f0-0
|
|
)
|
|
f0-0
|
|
)
|
|
)
|
|
((= v1-0 'grab)
|
|
(set!
|
|
(-> self cur-grab-handle)
|
|
(process->handle (the-as process (-> arg3 param 0)))
|
|
)
|
|
(let ((v1-30 (handle->process (-> self cur-grab-handle))))
|
|
(when v1-30
|
|
(set! v0-0 (the-as none (-> self old-grab-pos)))
|
|
(set!
|
|
(-> (the-as vector v0-0) quad)
|
|
(-> (the-as process-drawable v1-30) root trans quad)
|
|
)
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'target)
|
|
(set!
|
|
v0-0
|
|
(the-as
|
|
none
|
|
(process->handle (the-as process (-> arg3 param 0)))
|
|
)
|
|
)
|
|
(set! (-> self cur-target-handle) (the-as handle v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'trans)
|
|
(cond
|
|
((type-type? (-> self root type) collide-shape)
|
|
(TODO-RENAME-30
|
|
(the-as collide-shape (-> self root))
|
|
(the-as vector (-> arg3 param 0))
|
|
)
|
|
)
|
|
(else
|
|
(set! v0-0 (the-as none (-> self root trans)))
|
|
(set!
|
|
(-> (the-as vector v0-0) quad)
|
|
(-> (the-as vector (-> arg3 param 0)) quad)
|
|
)
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'rot)
|
|
(let ((s5-0 (new 'stack-no-clear 'matrix)))
|
|
(matrix-rotate-y! s5-0 (the-as float (-> arg3 param 0)))
|
|
(matrix->quaternion (-> self root quat) s5-0)
|
|
)
|
|
)
|
|
((= v1-0 'rot-quat)
|
|
(quaternion-copy!
|
|
(-> self root quat)
|
|
(the-as quaternion (-> arg3 param 0))
|
|
)
|
|
)
|
|
((= v1-0 'clone-copy-trans)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set! (-> self clone-copy-trans) (the-as basic v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'release)
|
|
(set! (-> self cur-grab-handle) (the-as handle #f))
|
|
#f
|
|
)
|
|
((= v1-0 'draw)
|
|
(set! (-> self draw?) (the-as symbol (-> arg3 param 0)))
|
|
(cond
|
|
((-> arg3 param 0)
|
|
(let ((v1-47 (logtest? (-> self draw status) 2)))
|
|
(set!
|
|
(-> self draw status)
|
|
(logand -3 (-> self draw status))
|
|
)
|
|
(when v1-47
|
|
(cond
|
|
((nonzero? (-> self skel))
|
|
(let ((gp-1 (-> self skel status)))
|
|
(logior! (-> self skel status) 1)
|
|
(set! v0-0 (ja-post))
|
|
(set! (-> self skel status) gp-1)
|
|
)
|
|
v0-0
|
|
)
|
|
(else
|
|
(ja-post)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(set!
|
|
v0-0
|
|
(the-as none (logior (-> self draw status) 2))
|
|
)
|
|
(set! (-> self draw status) (the-as uint v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'query)
|
|
(case (-> arg3 param 0)
|
|
(('grab)
|
|
(handle->process (-> self cur-grab-handle))
|
|
)
|
|
(('done)
|
|
(case (-> self anim-mode)
|
|
(('play1 'play)
|
|
(>=
|
|
(ja-frame-num 0)
|
|
(the
|
|
float
|
|
(+ (-> (if (> (-> self skel active-channels) 0)
|
|
(-> self skel root-channel 0 frame-group)
|
|
)
|
|
data
|
|
0
|
|
length
|
|
)
|
|
-2
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'set-frame-num)
|
|
(let ((v1-73 (-> self skel root-channel 0)))
|
|
(set! (-> v1-73 num-func) num-func-identity)
|
|
(let ((f0-2 (the-as float (-> arg3 param 0))))
|
|
(set! (-> v1-73 frame-num) f0-2)
|
|
f0-2
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(if (-> self cur-event-hook)
|
|
((-> self cur-event-hook))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(if (!= (-> self cur-trans-hook) (-> self new-trans-hook))
|
|
(set! (-> self cur-trans-hook) (-> self new-trans-hook))
|
|
)
|
|
(if (!= (-> self cur-post-hook) (-> self new-post-hook))
|
|
(set! (-> self cur-post-hook) (-> self new-post-hook))
|
|
)
|
|
(when
|
|
(and
|
|
(-> self new-joint-anim)
|
|
(nonzero? (-> self skel))
|
|
(and (!= (if (> (-> self skel active-channels) 0)
|
|
(-> self skel root-channel 0 frame-group)
|
|
)
|
|
(-> self new-joint-anim)
|
|
)
|
|
(!= (-> self anim-mode) 'clone-anim)
|
|
)
|
|
)
|
|
(ja-channel-push! 1 (the-as int (-> self new-joint-anim-blend)))
|
|
(let ((gp-0 (-> self skel root-channel 0)))
|
|
(joint-control-channel-group-eval!
|
|
gp-0
|
|
(-> self new-joint-anim)
|
|
num-func-identity
|
|
)
|
|
(set! (-> gp-0 frame-num) 0.0)
|
|
)
|
|
)
|
|
(let ((v1-20 (handle->process (-> self cur-grab-handle))))
|
|
(when v1-20
|
|
(let ((gp-1 (-> (the-as process-drawable v1-20) root trans)))
|
|
(if (type-type? (-> self root type) collide-shape)
|
|
(TODO-RENAME-28
|
|
(the-as collide-shape (-> self root))
|
|
(vector-! (new 'stack-no-clear 'vector) gp-1 (-> self old-grab-pos))
|
|
)
|
|
(vector+!
|
|
(-> self root trans)
|
|
(-> self root trans)
|
|
(vector-! (new 'stack-no-clear 'vector) gp-1 (-> self old-grab-pos))
|
|
)
|
|
)
|
|
(set! (-> self old-grab-pos quad) (-> gp-1 quad))
|
|
)
|
|
)
|
|
)
|
|
((-> self cur-trans-hook))
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
;; TODO - fix me
|
|
(loop (suspend))
|
|
;; (logclear! (-> self mask) (process-mask heap-shrunk))
|
|
;; (while #t
|
|
;; ((-> self cur-post-hook))
|
|
;; (if (!= (-> self anim-mode) 'clone-anim)
|
|
;; (ja-post)
|
|
;; )
|
|
;; (suspend)
|
|
;; (case (-> self anim-mode)
|
|
;; (('loop)
|
|
;; (let ((a0-4 (-> self skel root-channel 0)))
|
|
;; (set! (-> a0-4 param 0) 1.0)
|
|
;; (joint-control-channel-group-eval!
|
|
;; a0-4
|
|
;; (the-as art-joint-anim #f)
|
|
;; num-func-loop!
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (('play)
|
|
;; (let ((a0-7 (-> self skel root-channel 0)))
|
|
;; (set!
|
|
;; (-> a0-7 param 0)
|
|
;; (the float (+ (-> a0-7 frame-group data 0 length) -1))
|
|
;; )
|
|
;; (set! (-> a0-7 param 1) 1.0)
|
|
;; (joint-control-channel-group-eval!
|
|
;; a0-7
|
|
;; (the-as art-joint-anim #f)
|
|
;; num-func-seek!
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (('copy-parent)
|
|
;; (let ((v1-18 (-> self skel root-channel 0)))
|
|
;; (set! (-> v1-18 num-func) num-func-identity)
|
|
;; (set!
|
|
;; (-> v1-18 frame-num)
|
|
;; (->
|
|
;; (the-as process-drawable (ppointer->process (-> self parent)))
|
|
;; skel
|
|
;; root-channel
|
|
;; 0
|
|
;; frame-num
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (('clone-parent)
|
|
;; (let ((gp-0 (ppointer->process (-> self parent))))
|
|
;; (set! (-> self post-hook) #f)
|
|
;; (joint-control-copy!
|
|
;; (-> self skel)
|
|
;; (-> (the-as process-drawable gp-0) skel)
|
|
;; )
|
|
;; (joint-control-remap!
|
|
;; (-> self skel)
|
|
;; (-> self draw art-group)
|
|
;; (-> (the-as process-drawable gp-0) draw art-group)
|
|
;; '()
|
|
;; 0
|
|
;; ""
|
|
;; )
|
|
;; )
|
|
;; (dummy-17 self)
|
|
;; )
|
|
;; (('clone-anim)
|
|
;; (clone-anim-once (the-as handle (cond
|
|
;; ((handle->process
|
|
;; (-> self cur-target-handle)
|
|
;; )
|
|
;; (the-as int (-> self cur-target-handle))
|
|
;; )
|
|
;; (else
|
|
;; (let ((v1-29 (-> self parent)))
|
|
;; (logior
|
|
;; (shl
|
|
;; (->
|
|
;; (the-as
|
|
;; process-drawable
|
|
;; (-> v1-29 0)
|
|
;; )
|
|
;; pid
|
|
;; )
|
|
;; 32
|
|
;; )
|
|
;; (.asm.sllv.r0 v1-29)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (the-as
|
|
;; int
|
|
;; (-> self draw origin-joint-index)
|
|
;; )
|
|
;; (the-as symbol (-> self clone-copy-trans)) ""
|
|
;; )
|
|
;; )
|
|
;; (('still)
|
|
;; )
|
|
;; (('play1)
|
|
;; (let ((a0-33 (-> self skel root-channel 0)))
|
|
;; (set!
|
|
;; (-> a0-33 param 0)
|
|
;; (the float (+ (-> a0-33 frame-group data 0 length) -1))
|
|
;; )
|
|
;; (set! (-> a0-33 param 1) 1.0)
|
|
;; (joint-control-channel-group-eval!
|
|
;; a0-33
|
|
;; (the-as art-joint-anim #f)
|
|
;; num-func-seek!
|
|
;; )
|
|
;; )
|
|
;; (if (ja-done? 0)
|
|
;; (deactivate self)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (none)
|
|
)
|
|
)
|
|
|
|
(defbehavior
|
|
manipy-init manipy
|
|
((arg0 vector) (arg1 entity) (arg2 skeleton-group) (arg3 vector))
|
|
(stack-size-set! (-> self main-thread) 128)
|
|
(logior! (-> self mask) (process-mask heap-shrunk))
|
|
(set! (-> self entity) arg1)
|
|
(cond
|
|
((= arg3 'collide-shape-moving)
|
|
(let
|
|
((s4-1
|
|
(new
|
|
'process
|
|
'collide-shape-moving
|
|
self
|
|
(collide-list-enum hit-by-player)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> s4-1 dynam) (copy *standard-dynamics* 'process))
|
|
(set! (-> s4-1 reaction) default-collision-reaction)
|
|
(set!
|
|
(-> s4-1 no-reaction)
|
|
(the-as
|
|
(function collide-shape-moving collide-shape-intersect vector vector none)
|
|
nothing
|
|
)
|
|
)
|
|
(let
|
|
((s3-1 (new 'process 'collide-shape-prim-sphere s4-1 (the-as uint 0))))
|
|
(set-vector! (-> s3-1 local-sphere) 0.0 0.0 0.0 4096.0)
|
|
(set-root-prim! s4-1 s3-1)
|
|
)
|
|
(set! (-> s4-1 nav-radius) (* 0.75 (-> s4-1 root-prim local-sphere w)))
|
|
(backup-collide-with-as s4-1)
|
|
(set! (-> self root) s4-1)
|
|
)
|
|
)
|
|
(arg3
|
|
(let
|
|
((s4-2
|
|
(new 'process 'collide-shape self (collide-list-enum hit-by-player))
|
|
)
|
|
)
|
|
(let
|
|
((s2-0 (new 'process 'collide-shape-prim-sphere s4-2 (the-as uint 0))))
|
|
(set! (-> s2-0 prim-core collide-as) (the-as uint #x8040))
|
|
(set! (-> s2-0 collide-with) (the-as uint 16))
|
|
(set-vector!
|
|
(-> s2-0 local-sphere)
|
|
(-> arg3 x)
|
|
(-> arg3 y)
|
|
(-> arg3 z)
|
|
(-> arg3 w)
|
|
)
|
|
(set-root-prim! s4-2 s2-0)
|
|
)
|
|
(set! (-> s4-2 nav-radius) (* 0.75 (-> s4-2 root-prim local-sphere w)))
|
|
(backup-collide-with-as s4-2)
|
|
(set! (-> self root) s4-2)
|
|
)
|
|
)
|
|
(else
|
|
(set! (-> self root) (new 'process 'trsqv))
|
|
)
|
|
)
|
|
(set! (-> self root trans quad) (-> arg0 quad))
|
|
(initialize-skeleton self arg2 '())
|
|
(if (type-type? (-> self root type) collide-shape)
|
|
(dummy-47 (the-as collide-shape (-> self root)))
|
|
)
|
|
(set! (-> self shadow-backup) (-> self draw shadow))
|
|
(set! (-> self new-trans-hook) nothing)
|
|
(set! (-> self cur-trans-hook) nothing)
|
|
(set! (-> self new-post-hook) nothing)
|
|
(set! (-> self cur-post-hook) nothing)
|
|
(set! (-> self cur-event-hook) #f)
|
|
(set! (-> self cur-grab-handle) (the-as handle #f))
|
|
(set! (-> self cur-target-handle) (the-as handle #f))
|
|
(set! (-> self clone-copy-trans) #t)
|
|
(set! (-> self draw?) #t)
|
|
(cond
|
|
((nonzero? (-> self skel))
|
|
(set! (-> self new-joint-anim) (if (> (-> self skel active-channels) 0)
|
|
(-> self skel root-channel 0 frame-group)
|
|
)
|
|
)
|
|
(set! (-> self anim-mode) 'loop)
|
|
)
|
|
(else
|
|
(set! (-> self anim-mode) 'still)
|
|
)
|
|
)
|
|
(set! (-> self event-hook) (-> manipy-idle event))
|
|
(go manipy-idle)
|
|
(none)
|
|
)
|
|
|
|
(defmethod deactivate part-tracker ((obj part-tracker))
|
|
(if (nonzero? (-> obj part))
|
|
(kill-and-free-particles (-> obj part))
|
|
)
|
|
((method-of-type process deactivate) obj)
|
|
(none)
|
|
)
|
|
|
|
(defbehavior part-tracker-notify part-tracker ()
|
|
(let ((gp-0 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> gp-0 from) self)
|
|
(set! (-> gp-0 num-params) 1)
|
|
(set! (-> gp-0 message) 'notify)
|
|
(set! (-> gp-0 param 0) (the-as uint 'die))
|
|
(let ((s5-0 send-event-function)
|
|
(s4-0 (ppointer->process (-> self parent)))
|
|
)
|
|
(s5-0 (if (and (nonzero? s4-0) (type-type? (-> s4-0 type) process))
|
|
s4-0
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate part-tracker-process (part-tracker)
|
|
:code
|
|
(behavior ()
|
|
(set! (-> self start-time) (the-as uint (-> *display* base-frame-counter)))
|
|
(while
|
|
(<
|
|
(- (-> *display* base-frame-counter) (the-as int (-> self start-time)))
|
|
(the-as int (-> self duration))
|
|
)
|
|
(let ((gp-0 (handle->process (-> self target))))
|
|
(when gp-0
|
|
(if
|
|
(and
|
|
gp-0
|
|
(type-type? (-> gp-0 type) process-drawable)
|
|
(nonzero? (-> (the-as process-drawable gp-0) root))
|
|
)
|
|
(vector+!
|
|
(-> self root trans)
|
|
(-> (the-as process-drawable gp-0) root trans)
|
|
(-> self offset)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((gp-1 (-> self root trans)))
|
|
(if (-> self callback)
|
|
((-> self callback) self)
|
|
)
|
|
(spawn (-> self part) gp-1)
|
|
)
|
|
(suspend)
|
|
)
|
|
(let ((gp-2 (-> *display* base-frame-counter)))
|
|
(until
|
|
(>=
|
|
(- (-> *display* base-frame-counter) gp-2)
|
|
(the-as int (-> self linger-duration))
|
|
)
|
|
(if (-> self linger-callback)
|
|
((-> self linger-callback) self)
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(if (-> self linger-callback)
|
|
((-> self linger-callback) self)
|
|
)
|
|
(part-tracker-notify)
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defbehavior
|
|
part-tracker-init part-tracker
|
|
((arg0 sparticle-launch-group)
|
|
(arg1 int)
|
|
(arg2 (function part-tracker none))
|
|
(arg3 (pointer process-drawable))
|
|
(arg4 process)
|
|
(arg5 collide-prim-core)
|
|
)
|
|
(stack-size-set! (-> self main-thread) 128)
|
|
(set! (-> self root) (new 'process 'trsqv))
|
|
(set! (-> self root trans quad) (-> arg5 world-sphere quad))
|
|
(set! (-> self offset quad) (-> arg5 world-sphere quad))
|
|
(set! (-> self callback) (the-as (function part-tracker vector) arg2))
|
|
(set! (-> self linger-callback) #f)
|
|
(set! (-> self userdata) (the-as uint arg3))
|
|
(set! (-> self target) (process->handle arg4))
|
|
(set! arg1 (cond
|
|
((> arg1 0)
|
|
(empty)
|
|
arg1
|
|
)
|
|
(else
|
|
(the-as int (-> arg0 duration))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self duration) (the-as uint arg1))
|
|
(set! (-> self linger-duration) (-> arg0 linger-duration))
|
|
(set! (-> self part) (create-launch-control arg0 self))
|
|
(go part-tracker-process)
|
|
(none)
|
|
)
|
|
|
|
;; WARN: disable def twice: 68. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare.
|
|
;; WARN: disable def twice: 82. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare.
|
|
;; WARN: disable def twice: 96. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare.
|
|
;; WARN: disable def twice: 110. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare.
|
|
;; (defbehavior
|
|
;; command-get-process camera-tracker
|
|
;; ((arg0 object) (arg1 process-drawable))
|
|
;; (the-as process (cond
|
|
;; ((null? arg0)
|
|
;; (empty)
|
|
;; arg1
|
|
;; )
|
|
;; ((type-type? (rtype-of arg0) process)
|
|
;; (the-as process-drawable arg0)
|
|
;; )
|
|
;; ((= arg0 'target)
|
|
;; *target*
|
|
;; )
|
|
;; ((= arg0 'sidekick)
|
|
;; (when *target*
|
|
;; (let ((v1-6 (-> *target* sidekick)))
|
|
;; (if v1-6
|
|
;; (the-as process-drawable (-> v1-6 0 self))
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'parent)
|
|
;; (let ((v1-9 (-> self parent)))
|
|
;; (if v1-9
|
|
;; (the-as process-drawable (-> v1-9 0 self))
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'camera)
|
|
;; (the-as process-drawable *camera*)
|
|
;; )
|
|
;; ((type-type? (rtype-of arg0) string)
|
|
;; (the-as
|
|
;; process-drawable
|
|
;; (process-by-ename (the-as string arg0))
|
|
;; )
|
|
;; )
|
|
;; ((type-type? (-> self type) camera-tracker)
|
|
;; (let ((v1-13 self))
|
|
;; (cond
|
|
;; ((= arg0 'work)
|
|
;; (let ((v1-14 (-> v1-13 work-process)))
|
|
;; (and
|
|
;; (nonzero? (l32-false-check v1-14))
|
|
;; (let ((a0-8 (-> v1-14 process 0)))
|
|
;; (if (= (-> v1-14 pid) (-> a0-8 pid))
|
|
;; (the-as process-drawable a0-8)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'grab)
|
|
;; (let ((v1-17 (-> v1-13 grab-target)))
|
|
;; (and
|
|
;; (nonzero? (l32-false-check v1-17))
|
|
;; (let ((a0-12 (-> v1-17 process 0)))
|
|
;; (if (= (-> v1-17 pid) (-> a0-12 pid))
|
|
;; (the-as process-drawable a0-12)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'look-at)
|
|
;; (let ((v1-20 (-> v1-13 look-at-target)))
|
|
;; (and
|
|
;; (nonzero? (l32-false-check v1-20))
|
|
;; (let ((a0-16 (-> v1-20 process 0)))
|
|
;; (if (= (-> v1-20 pid) (-> a0-16 pid))
|
|
;; (the-as process-drawable a0-16)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'pov)
|
|
;; (let ((v1-23 (-> v1-13 pov-target)))
|
|
;; (and
|
|
;; (nonzero? (l32-false-check v1-23))
|
|
;; (let ((a0-20 (-> v1-23 process 0)))
|
|
;; (if (= (-> v1-23 pid) (-> a0-20 pid))
|
|
;; (the-as process-drawable a0-20)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; ((= arg0 'anim)
|
|
;; (let ((v1-26 (-> v1-13 anim-process)))
|
|
;; (and
|
|
;; (nonzero? (l32-false-check v1-26))
|
|
;; (let ((a0-24 (-> v1-26 process 0)))
|
|
;; (if (= (-> v1-26 pid) (-> a0-24 pid))
|
|
;; (the-as process-drawable a0-24)
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (else
|
|
;; (empty)
|
|
;; arg1
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; (else
|
|
;; (empty)
|
|
;; arg1
|
|
;; )
|
|
;; )
|
|
;; )
|
|
;; )
|
|
|
|
(defun command-get-camera ((arg0 object) (arg1 state))
|
|
(cond
|
|
((null? arg0)
|
|
(empty)
|
|
arg1
|
|
)
|
|
((= arg0 'base)
|
|
*camera-base-mode*
|
|
)
|
|
((= arg0 'string)
|
|
cam-string
|
|
)
|
|
((= arg0 'fixed)
|
|
cam-fixed
|
|
)
|
|
((type-type? (rtype-of arg0) symbol)
|
|
(the-as state (-> (the-as symbol arg0) value))
|
|
)
|
|
((type-type? (rtype-of arg0) string)
|
|
(the-as state arg0)
|
|
)
|
|
((type-type? (rtype-of arg0) state)
|
|
(the-as state arg0)
|
|
)
|
|
(else
|
|
(empty)
|
|
arg1
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun command-get-trans ((arg0 object) (arg1 vector))
|
|
(cond
|
|
((null? arg0)
|
|
(empty)
|
|
arg1
|
|
)
|
|
((= arg0 'null)
|
|
*null-vector*
|
|
)
|
|
((= arg0 'target)
|
|
(target-pos 0)
|
|
)
|
|
((pair? arg0)
|
|
(let ((s4-0 (command-get-process (car arg0) *target*))
|
|
(v1-4 (command-get-int (car (cdr arg0)) 0))
|
|
)
|
|
(cond
|
|
(s4-0
|
|
(-> (the-as target s4-0) node-list data v1-4 bone transform vector 3)
|
|
)
|
|
(else
|
|
(empty)
|
|
arg1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(empty)
|
|
arg1
|
|
)
|
|
)
|
|
)
|
|
|
|
(defbehavior process-grab? process ((arg0 process))
|
|
(let ((gp-0 (command-get-process arg0 *target*)))
|
|
(the-as symbol (when gp-0
|
|
(if (type-type? (-> self type) camera-tracker)
|
|
(set!
|
|
(-> (the-as camera-tracker self) grab-target)
|
|
(process->handle gp-0)
|
|
)
|
|
)
|
|
(send-event gp-0 'change-mode 'grab)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defbehavior process-release? process ((arg0 process))
|
|
(let ((gp-0 (command-get-process arg0 *target*)))
|
|
(the-as
|
|
symbol
|
|
(if (and gp-0 (let ((a1-1 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-1 from) self)
|
|
(set! (-> a1-1 num-params) 1)
|
|
(set! (-> a1-1 message) 'query)
|
|
(set! (-> a1-1 param 0) (the-as uint 'mode))
|
|
(send-event-function gp-0 a1-1)
|
|
)
|
|
'target-grab
|
|
)
|
|
(send-event gp-0 'end-mode)
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun camera-change-to ((arg0 string) (arg1 int) (arg2 symbol))
|
|
(let ((gp-0 (command-get-camera arg0 *camera-base-mode*)))
|
|
(cond
|
|
((not gp-0)
|
|
#f
|
|
)
|
|
((type-type? (rtype-of gp-0) string)
|
|
(send-event *camera* 'change-to-entity-by-name gp-0)
|
|
#t
|
|
)
|
|
((type-type? (rtype-of gp-0) state)
|
|
(send-event *camera* 'change-state gp-0 arg1)
|
|
(if arg2
|
|
(send-event *camera* 'blend-from-as-fixed)
|
|
)
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defbehavior camera-look-at camera-tracker ((arg0 pair) (arg1 uint))
|
|
(let ((gp-0 (command-get-process arg0 *target*)))
|
|
(when gp-0
|
|
(if (type-type? (-> self type) camera-tracker)
|
|
(set! (-> self look-at-target) (process->handle gp-0))
|
|
)
|
|
(send-event *camera* 'change-target gp-0 arg1)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
;; TODO modified!
|
|
(defun ja-anim-done? ((arg0 process))
|
|
(let ((gp-0 (command-get-process arg0 *target*)))
|
|
(when gp-0
|
|
(cond
|
|
((type-type? (-> gp-0 type) manipy)
|
|
(the-as symbol (send-event gp-0 'query 'done))
|
|
)
|
|
((type-type? (-> gp-0 type) process-drawable)
|
|
(when (zero? (logand (-> (the-as process-drawable gp-0) skel status) 4))
|
|
|
|
(rlet ((pp :reg r13 :type process))
|
|
(let* ((old-pp pp)
|
|
(ret-val (begin
|
|
;; set the process
|
|
(set! pp gp-0)
|
|
;; run!
|
|
(ja-done? 0)
|
|
)))
|
|
;; restore the old pp
|
|
(set! pp old-pp)
|
|
ret-val
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defbehavior camera-pov-from camera-tracker ((arg0 pair) (arg1 uint))
|
|
(let ((gp-0 (command-get-process arg0 *target*)))
|
|
(when gp-0
|
|
(if (type-type? (-> self type) camera-tracker)
|
|
(set! (-> self pov-target) (process->handle gp-0))
|
|
)
|
|
(when (= arg1 -10)
|
|
(set! arg1 (the-as uint 0))
|
|
(when (> (-> (the-as process-drawable gp-0) skel active-channels) 0)
|
|
(let
|
|
((v1-11
|
|
(dummy-10
|
|
(-> (the-as process-drawable gp-0) draw jgeo)
|
|
"camera"
|
|
(the-as type #f)
|
|
)
|
|
)
|
|
)
|
|
(if v1-11
|
|
(set! arg1 (the-as uint (+ (-> v1-11 number) 1)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(send-event *camera* 'change-pov gp-0 arg1)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
(defbehavior
|
|
camera-anim camera-tracker
|
|
((arg0 symbol) (arg1 basic) (arg2 entity))
|
|
(set! (-> self anim-process) (the-as handle #f))
|
|
(let* ((s2-0 (get-process *default-dead-pool* manipy #x4000))
|
|
(gp-0 (when s2-0
|
|
(let ((t9-1 (method-of-type manipy activate)))
|
|
(t9-1
|
|
(the-as manipy s2-0)
|
|
self
|
|
'manipy
|
|
(the-as pointer #x70004000)
|
|
)
|
|
)
|
|
((the-as
|
|
(function process function object object object object object)
|
|
run-function-in-process
|
|
)
|
|
s2-0
|
|
manipy-init
|
|
arg2
|
|
#f
|
|
arg0
|
|
#f
|
|
)
|
|
(-> s2-0 ppointer)
|
|
)
|
|
)
|
|
)
|
|
(when gp-0
|
|
(send-event (-> gp-0 0 self) 'anim-mode 'play1)
|
|
(send-event (-> gp-0 0 self) 'art-joint-anim arg1)
|
|
(set! (-> self anim-process) (ppointer->handle gp-0))
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
(defmethod dummy-14 camera-tracker ((obj camera-tracker) (arg0 pair))
|
|
(with-pp
|
|
(let ((gp-0 (the-as object #f)))
|
|
(cond
|
|
((null? arg0)
|
|
)
|
|
((pair? arg0)
|
|
(let ((a2-0 (car arg0))
|
|
(s4-0 (cdr arg0))
|
|
)
|
|
(case a2-0
|
|
(('print)
|
|
(set! gp-0 (car s4-0))
|
|
(if (pair? gp-0)
|
|
(set! gp-0 (dummy-14 obj (the-as pair gp-0)))
|
|
)
|
|
(format
|
|
#t
|
|
"~A MESSAGE (~D): ~A~%"
|
|
obj
|
|
(-> *display* base-frame-counter)
|
|
gp-0
|
|
)
|
|
)
|
|
(('while)
|
|
(let ((s3-0 (car s4-0)))
|
|
(while (dummy-14 obj (the-as pair s3-0))
|
|
(let* ((s2-0 (cdr s4-0))
|
|
(a1-3 (car s2-0))
|
|
)
|
|
(while (not (null? s2-0))
|
|
(set! gp-0 (dummy-14 obj (the-as pair a1-3)))
|
|
(set! s2-0 (cdr s2-0))
|
|
(set! a1-3 (car s2-0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(('until)
|
|
(let ((s3-1 (car s4-0)))
|
|
(while (not (dummy-14 obj (the-as pair s3-1)))
|
|
(let* ((s2-1 (cdr s4-0))
|
|
(a1-5 (car s2-1))
|
|
)
|
|
(while (not (null? s2-1))
|
|
(set! gp-0 (dummy-14 obj (the-as pair a1-5)))
|
|
(set! s2-1 (cdr s2-1))
|
|
(set! a1-5 (car s2-1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(('not)
|
|
(set! gp-0 (not (dummy-14 obj (the-as pair (car s4-0)))))
|
|
)
|
|
(('wait-for 'wait 'suspend)
|
|
(let ((s5-1 (command-get-time (car s4-0) 1))
|
|
(s4-1 (-> *display* base-frame-counter))
|
|
)
|
|
(until (>= (- (-> *display* base-frame-counter) s4-1) s5-1)
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
(('message?)
|
|
(when (= (-> obj message) (car s4-0))
|
|
(set! gp-0 (-> obj message))
|
|
(set! (-> obj message) #f)
|
|
)
|
|
)
|
|
(('send-event)
|
|
(let ((s5-2 (command-get-process (car s4-0) *target*))
|
|
(s3-2 (car (cdr s4-0)))
|
|
(s4-2 (cdr (cdr s4-0)))
|
|
)
|
|
(when (and s5-2 (not (null? s3-2)))
|
|
(let ((gp-1 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> gp-1 from) pp)
|
|
(let ((a0-22 s4-2))
|
|
(set!
|
|
(-> gp-1 num-params)
|
|
((method-of-type (rtype-of a0-22) length) a0-22)
|
|
)
|
|
)
|
|
(set! (-> gp-1 message) (the-as symbol s3-2))
|
|
(set!
|
|
(-> gp-1 param 0)
|
|
(the-as uint (command-get-param (car s4-2) #f))
|
|
)
|
|
(set!
|
|
(-> gp-1 param 1)
|
|
(the-as uint (command-get-param (car (cdr s4-2)) #f))
|
|
)
|
|
(set!
|
|
(-> gp-1 param 2)
|
|
(the-as uint (command-get-param (car (cdr (cdr s4-2))) #f))
|
|
)
|
|
(set! gp-0 (send-event-function s5-2 gp-1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(('eval)
|
|
(let ((s4-3 (car s4-0)))
|
|
(if (and s4-3 (type-type? (-> (the-as basic s4-3) type) function))
|
|
(set! gp-0 ((the-as (function camera-tracker symbol) s4-3) obj))
|
|
)
|
|
)
|
|
)
|
|
(('work-set!)
|
|
(set! gp-0 (process->handle (dummy-14 obj (the-as pair (car s4-0)))))
|
|
(set! (-> obj work-process) (the-as handle gp-0))
|
|
)
|
|
(('grab)
|
|
(let ((a0-38 (command-get-process (car s4-0) *target*)))
|
|
(set! gp-0 (process-grab? a0-38))
|
|
)
|
|
)
|
|
(('release)
|
|
(set! gp-0 (process-release? (handle->process (-> obj grab-target))))
|
|
)
|
|
(('alive?)
|
|
(set! gp-0 (command-get-process (car s4-0) *target*))
|
|
)
|
|
(('draw)
|
|
(set! gp-0 (command-get-process (car s4-0) *target*))
|
|
(when (the-as target gp-0)
|
|
(if (car (cdr s4-0))
|
|
(set!
|
|
(-> (the-as target gp-0) skel status)
|
|
(logand -3 (-> (the-as target gp-0) skel status))
|
|
)
|
|
(logior! (-> (the-as target gp-0) skel status) 2)
|
|
)
|
|
)
|
|
)
|
|
(('camera-change-to 'camera)
|
|
(set!
|
|
gp-0
|
|
(camera-change-to
|
|
(the-as string (car s4-0))
|
|
(command-get-time (car (cdr s4-0)) 0)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
(('intro-done?)
|
|
(let ((a1-25 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-25 from) pp)
|
|
(set! (-> a1-25 num-params) 0)
|
|
(set! (-> a1-25 message) 'intro-done?)
|
|
(set! gp-0 (send-event-function *camera* a1-25))
|
|
)
|
|
)
|
|
(('camera-look-at 'look-at)
|
|
(set!
|
|
gp-0
|
|
(camera-look-at
|
|
(the-as pair (car s4-0))
|
|
(the-as uint (command-get-int (car (cdr s4-0)) 0))
|
|
)
|
|
)
|
|
)
|
|
(('pov)
|
|
(set!
|
|
gp-0
|
|
(camera-pov-from
|
|
(the-as pair (car s4-0))
|
|
(the-as uint (command-get-int (car (cdr s4-0)) 0))
|
|
)
|
|
)
|
|
)
|
|
(('camera-anim)
|
|
(let ((s2-2 (car s4-0))
|
|
(s3-3 (car (cdr s4-0)))
|
|
(s4-4 (command-get-trans (car (cdr (cdr s4-0))) *null-vector*))
|
|
(s1-0 string->symbol)
|
|
)
|
|
(format (clear *temp-string*) "*~S-sg*" s2-2)
|
|
(let ((s2-3 (-> (s1-0 *temp-string*) value)))
|
|
(when (type-type? (rtype-of s2-3) skeleton-group)
|
|
(set! (-> obj anim-process) (the-as handle #f))
|
|
(let ((s1-1 (get-process *default-dead-pool* manipy #x4000)))
|
|
(set! gp-0 (when s1-1
|
|
(let ((t9-35 (method-of-type manipy activate)))
|
|
(t9-35
|
|
(the-as manipy s1-1)
|
|
obj
|
|
'manipy
|
|
(the-as pointer #x70004000)
|
|
)
|
|
)
|
|
(run-now-in-process s1-1 manipy-init s4-4 #f s2-3 #f)
|
|
(-> s1-1 ppointer)
|
|
)
|
|
)
|
|
)
|
|
(send-event
|
|
(-> (the-as (pointer process) gp-0) 0 self)
|
|
'anim-mode
|
|
'play1
|
|
)
|
|
(send-event
|
|
(-> (the-as (pointer process) gp-0) 0 self)
|
|
'art-joint-anim
|
|
s3-3
|
|
)
|
|
(set!
|
|
(-> obj anim-process)
|
|
(ppointer->handle (the-as (pointer process) gp-0))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(format
|
|
0
|
|
"ERROR: camera-tracker does not know script line command ~A.~%"
|
|
a2-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(format
|
|
0
|
|
"ERROR: camera-tracker requires a pair as a script line, not ~A.~%"
|
|
arg0
|
|
)
|
|
)
|
|
)
|
|
(the-as process gp-0)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate camera-tracker-process (camera-tracker)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(local-vars (v0-0 uint))
|
|
(let ((v1-0 arg2))
|
|
(the-as object (cond
|
|
((= v1-0 'message)
|
|
(set! v0-0 (-> arg3 param 0))
|
|
(set! (-> self message) (the-as basic v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'mask)
|
|
(set! v0-0 (-> arg3 param 0))
|
|
(set! (-> self mask-to-clear) v0-0)
|
|
v0-0
|
|
)
|
|
((= v1-0 'border)
|
|
(set! v0-0 (-> arg3 param 0))
|
|
(set! (-> self border-value) (the-as basic v0-0))
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:enter
|
|
(behavior ()
|
|
(if (-> self entity-override)
|
|
(dummy-30 (-> self entity-override) (entity-perm-status bit-3) #t)
|
|
)
|
|
(if (not (-> self border-value))
|
|
(push-setting!
|
|
*setting-control*
|
|
self
|
|
'border-mode
|
|
(-> self border-value)
|
|
0.0
|
|
0
|
|
)
|
|
)
|
|
(push-setting!
|
|
*setting-control*
|
|
self
|
|
'process-mask
|
|
'set
|
|
0.0
|
|
(-> self mask-to-clear)
|
|
)
|
|
(push-setting! *setting-control* self 'movie (process->ppointer self) 0.0 0)
|
|
(hide-hud-quick)
|
|
(none)
|
|
)
|
|
:exit
|
|
(behavior ()
|
|
(if (-> self entity-override)
|
|
(dummy-30 (-> self entity-override) (entity-perm-status bit-3) #f)
|
|
)
|
|
(send-event *camera* 'clear-entity)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(cond
|
|
((-> self script-func)
|
|
((-> self script-func))
|
|
)
|
|
(else
|
|
(while (not (null? (-> self script-line)))
|
|
(dummy-14 self (the-as pair (-> self script-line car)))
|
|
(set! (-> self script-line) (the-as pair (-> self script-line cdr)))
|
|
)
|
|
)
|
|
)
|
|
(clear-pending-settings-from-process *setting-control* self 'process-mask)
|
|
(send-event *camera* 'clear-entity)
|
|
(suspend)
|
|
(suspend)
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defbehavior camera-tracker-init camera-tracker ((arg0 object))
|
|
(stack-size-set! (-> self main-thread) 512)
|
|
(logclear!
|
|
(-> self mask)
|
|
(process-mask actor-pause movie enemy platform projectile)
|
|
)
|
|
(set! (-> self mask-to-clear) (the-as uint #x4a0800))
|
|
(set! (-> self grab-target) (the-as handle #f))
|
|
(set! (-> self grab-event) 'grab)
|
|
(set! (-> self release-event) 'end-mode)
|
|
(set! (-> self look-at-target) (the-as handle #f))
|
|
(set! (-> self pov-target) (the-as handle #f))
|
|
(set! (-> self callback) #f)
|
|
(set! (-> self userdata) #f)
|
|
(set! (-> self start-time) (-> *display* base-frame-counter))
|
|
(set! (-> self script) '())
|
|
(set! (-> self script-line) '())
|
|
(set! (-> self script-func) #f)
|
|
(set! (-> self message) #f)
|
|
(set! (-> self border-value) #f)
|
|
(cond
|
|
((pair? arg0)
|
|
(set! (-> self script) (the-as pair arg0))
|
|
(set! (-> self script-line) (the-as pair arg0))
|
|
)
|
|
((type-type? (rtype-of arg0) function)
|
|
(set! (-> self script-func) (the-as (function none) arg0))
|
|
)
|
|
(else
|
|
(format
|
|
0
|
|
"ERROR: camera-tracker requires a pair as a script, not ~A.~%"
|
|
arg0
|
|
)
|
|
)
|
|
)
|
|
(let* ((gp-1 (ppointer->process (-> self parent)))
|
|
(v1-17 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) process))
|
|
gp-1
|
|
)
|
|
)
|
|
)
|
|
(if v1-17
|
|
(set!
|
|
(-> self entity-override)
|
|
(the-as entity-actor (-> (the-as process v1-17) entity))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self event-hook) (-> camera-tracker-process event))
|
|
(go camera-tracker-process)
|
|
)
|
|
|
|
(deftype med-res-level (process-drawable)
|
|
((level symbol :offset-assert 176)
|
|
(part-mode basic :offset-assert 180)
|
|
(index int32 :offset-assert 184)
|
|
)
|
|
:heap-base #x50
|
|
:method-count-assert 20
|
|
:size-assert #xbc
|
|
:flag-assert #x14005000bc
|
|
)
|
|
|
|
|
|
(defstate med-res-level-idle (med-res-level)
|
|
:code
|
|
(behavior ()
|
|
(local-vars (v1-37 float))
|
|
(rlet ((vf0 :class vf)
|
|
(vf16 :class vf)
|
|
(vf17 :class vf)
|
|
)
|
|
(init-vf0-vector)
|
|
(while #t
|
|
(let ((a0-1 (level-get *level* (-> self level)))
|
|
(v1-3 (-> *game-info* current-continue level))
|
|
)
|
|
(cond
|
|
((and
|
|
a0-1
|
|
(or
|
|
(= (-> a0-1 display?) 'special)
|
|
(= (-> a0-1 display?) 'special-vis)
|
|
)
|
|
)
|
|
(set! (-> self draw status) (logand -3 (-> self draw status)))
|
|
(when (nonzero? (-> self skel))
|
|
(let ((a0-5 (-> self skel root-channel 0)))
|
|
(set! (-> a0-5 param 0) 1.0)
|
|
(joint-control-channel-group-eval!
|
|
a0-5
|
|
(the-as art-joint-anim #f)
|
|
num-func-loop!
|
|
)
|
|
)
|
|
)
|
|
)
|
|
((or (and a0-1 (= (-> a0-1 status) 'active)) (= v1-3 'firecanyon))
|
|
(logior! (-> self draw status) 2)
|
|
)
|
|
((and (= (-> self level) 'firecanyon) (< (-> (camera-pos) y) 327680.0))
|
|
(logior! (-> self draw status) 2)
|
|
)
|
|
(else
|
|
(set! (-> self draw status) (logand -3 (-> self draw status)))
|
|
(if (nonzero? (-> self part))
|
|
(spawn (-> self part) (-> self root trans))
|
|
)
|
|
(when (nonzero? (-> self skel))
|
|
(let ((a0-17 (-> self skel root-channel 0)))
|
|
(set! (-> a0-17 param 0) 1.0)
|
|
(joint-control-channel-group-eval!
|
|
a0-17
|
|
(the-as art-joint-anim #f)
|
|
num-func-loop!
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (zero? (logand (-> self draw status) 2))
|
|
(let ((v1-36 (-> self draw))
|
|
(a0-18 (new 'stack-no-clear 'vector))
|
|
)
|
|
(.lvf vf16 (&-> v1-36 origin quad))
|
|
(.lvf vf17 (&-> v1-36 bounds quad))
|
|
(.mul.x.vf vf16 vf16 vf0 :mask #b1000)
|
|
(.add.vf vf16 vf16 vf17)
|
|
(.svf (&-> a0-18 quad) vf16)
|
|
)
|
|
(.mov v1-37 vf16)
|
|
)
|
|
(suspend)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
:post
|
|
(the-as (function none :behavior med-res-level) ja-post)
|
|
)
|
|
|
|
(define *lev-string* (new 'global 'string 64 (the-as string #f)))
|
|
|
|
(defmethod
|
|
init-from-entity!
|
|
med-res-level
|
|
((obj med-res-level) (arg0 entity-actor))
|
|
(local-vars (sv-16 res-tag))
|
|
(stack-size-set! (-> obj main-thread) 128)
|
|
"#f"
|
|
(let ((s4-0 (the-as (pointer sparticle-launch-group) #f)))
|
|
(set! sv-16 (new 'static 'res-tag))
|
|
(let*
|
|
((s3-0
|
|
(res-lump-data
|
|
arg0
|
|
'art-name
|
|
(pointer (pointer sparticle-launch-group))
|
|
:tag-ptr
|
|
(& sv-16)
|
|
)
|
|
)
|
|
(s2-0 (-> s3-0 0))
|
|
)
|
|
(cond
|
|
((not s3-0)
|
|
)
|
|
((part-group-pointer? s2-0)
|
|
(set! s4-0 (-> s3-0 0))
|
|
)
|
|
((= (-> s2-0 -1) string)
|
|
(set! s4-0 (lookup-part-group-pointer-by-name (the-as string s2-0)))
|
|
(if s4-0
|
|
(set! (-> s3-0 0) s4-0)
|
|
)
|
|
)
|
|
((= (-> s2-0 -1) symbol)
|
|
(let ((a0-7 (-> (&+ s2-0 #xff38) 0)))
|
|
(set! s4-0 (lookup-part-group-pointer-by-name (the-as string a0-7)))
|
|
)
|
|
(if s4-0
|
|
(set! (-> s3-0 0) s4-0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when s4-0
|
|
(let ((a0-8 (-> s4-0 0)))
|
|
(if (and (nonzero? a0-8) (= (-> a0-8 type) sparticle-launch-group))
|
|
(set! (-> obj part) (create-launch-control a0-8 obj))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(process-entity-status! obj (entity-perm-status bit-7) #t)
|
|
(let ((s4-1 (res-lump-struct (-> obj entity) 'level structure))
|
|
(s3-1 (res-lump-value (-> obj entity) 'index uint128))
|
|
)
|
|
(when s4-1
|
|
(set! (-> obj level) (the-as symbol s4-1))
|
|
(set! (-> obj index) (the-as int s3-1))
|
|
(set! (-> obj root) (new 'process 'trsqv))
|
|
(process-drawable-from-entity! obj arg0)
|
|
(logclear! (-> obj mask) (process-mask actor-pause))
|
|
(format (clear *lev-string*) "med-res-~S~S" s4-1 (if (zero? s3-1)
|
|
""
|
|
(* s3-1 8)
|
|
)
|
|
)
|
|
(dummy-15 obj *lev-string* '())
|
|
(logior! (-> obj draw status) 64)
|
|
(if (nonzero? (-> obj draw))
|
|
(go med-res-level-idle)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(defmethod dummy-20 part-spawner ((obj part-spawner))
|
|
(sphere<-vector+r! (-> obj world-sphere) (-> obj root trans) (-> obj radius))
|
|
(sphere-in-view-frustum? (-> obj world-sphere))
|
|
(none)
|
|
)
|
|
|
|
(defstate part-spawner-active (part-spawner)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('stop)
|
|
(process-entity-status! self (entity-perm-status complete) #t)
|
|
(set! (-> self enable) #f)
|
|
#t
|
|
)
|
|
(('start)
|
|
(process-entity-status! self (entity-perm-status complete) #f)
|
|
(set! (-> self enable) #t)
|
|
#t
|
|
)
|
|
(('trans)
|
|
(let ((v0-1 (the-as object (-> (the-as vector (-> arg3 param 0)) quad))))
|
|
(set! (-> self root trans quad) (the-as uint128 v0-1))
|
|
v0-1
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(while #t
|
|
(when (-> self enable)
|
|
(spawn (-> self part) (-> self root trans))
|
|
(if (nonzero? (-> self sound))
|
|
(update! (-> self sound))
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defmethod
|
|
init-from-entity!
|
|
part-spawner
|
|
((obj part-spawner) (arg0 entity-actor))
|
|
(local-vars (sv-16 res-tag))
|
|
(stack-size-set! (-> obj main-thread) 128)
|
|
(set! (-> obj mask) (logior (process-mask ambient) (-> obj mask)))
|
|
(set! (-> obj root) (new 'process 'trsqv))
|
|
(process-drawable-from-entity! obj arg0)
|
|
(logclear! (-> obj mask) (process-mask actor-pause))
|
|
(set! (-> obj radius) 12288.0)
|
|
(set!
|
|
(-> obj enable)
|
|
(not
|
|
(and
|
|
(-> obj entity)
|
|
(logtest? (-> obj entity extra perm status) (entity-perm-status complete))
|
|
)
|
|
)
|
|
)
|
|
(set!
|
|
(-> obj sound)
|
|
(new 'process 'ambient-sound (-> obj entity) (-> obj root trans))
|
|
)
|
|
(let ((s4-0 (the-as object "#f")))
|
|
(let ((s3-0 (the-as (pointer sparticle-launch-group) #f)))
|
|
(set! sv-16 (new 'static 'res-tag))
|
|
(let*
|
|
((s5-1
|
|
(res-lump-data
|
|
arg0
|
|
'art-name
|
|
(pointer (pointer sparticle-launch-group))
|
|
:tag-ptr
|
|
(& sv-16)
|
|
)
|
|
)
|
|
(s2-0 (-> s5-1 0))
|
|
)
|
|
(cond
|
|
((part-group-pointer? s2-0)
|
|
(set! s3-0 (-> s5-1 0))
|
|
)
|
|
((= (-> s2-0 -1) string)
|
|
(when (string= (the-as string s2-0) "group-beach-grotto-1")
|
|
(set! (-> obj radius) 61440.0)
|
|
(go beach-part-grotto-1)
|
|
)
|
|
(set! s4-0 s2-0)
|
|
(set! s3-0 (lookup-part-group-pointer-by-name (the-as string s4-0)))
|
|
(if s3-0
|
|
(set! (-> s5-1 0) s3-0)
|
|
)
|
|
)
|
|
((= (-> s2-0 -1) symbol)
|
|
(set! s4-0 (-> (&+ s2-0 #xff38) 0))
|
|
(set! s3-0 (lookup-part-group-pointer-by-name (the-as string s4-0)))
|
|
(if s3-0
|
|
(set! (-> s5-1 0) s3-0)
|
|
)
|
|
)
|
|
(else
|
|
(go process-drawable-art-error (the-as string s2-0))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> obj mode) s3-0)
|
|
(when s3-0
|
|
(let ((a0-19 (-> s3-0 0)))
|
|
(when (and (nonzero? a0-19) (= (-> a0-19 type) sparticle-launch-group))
|
|
(set! (-> obj part) (create-launch-control a0-19 obj))
|
|
(go part-spawner-active)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(go process-drawable-art-error (the-as string s4-0))
|
|
)
|
|
(none)
|
|
)
|
|
|
|
(deftype launcher (process-drawable)
|
|
((root-override collide-shape :offset 112)
|
|
(spring-height meters :offset-assert 176)
|
|
(camera state :offset-assert 180)
|
|
(active-distance float :offset-assert 184)
|
|
(seek-time uint64 :offset-assert 192)
|
|
(dest vector :inline :offset-assert 208)
|
|
(sound-id sound-id :offset-assert 224)
|
|
)
|
|
:heap-base #x80
|
|
:method-count-assert 20
|
|
:size-assert #xe4
|
|
:flag-assert #x14008000e4
|
|
)
|
|
|
|
|
|
(set!
|
|
(-> *part-group-id-table* 37)
|
|
(new 'static 'sparticle-launch-group
|
|
:length 5
|
|
:duration #xbb8
|
|
:linger-duration #x5dc
|
|
:name "group-beach-launcher"
|
|
:launcher
|
|
(new 'static 'inline-array sparticle-group-item 5
|
|
(sp-item 45 :fade-after (meters 100.0) :falloff-to (meters 100.0))
|
|
(sp-item 46 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 47 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 48 :fade-after (meters 50.0) :falloff-to (meters 80.0))
|
|
(sp-item 49 :fade-after (meters 70.0) :falloff-to (meters 100.0))
|
|
)
|
|
:bounds
|
|
(new 'static 'sphere :y 12288.0 :w 20480.0)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 45)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 14
|
|
(sp-flt spt-num 1.5)
|
|
(sp-flt spt-x (meters 1.5))
|
|
(sp-flt spt-y (meters -0.5))
|
|
(sp-int spt-rot-x 5)
|
|
(sp-flt spt-r 4096.0)
|
|
(sp-flt spt-g 2867.2)
|
|
(sp-flt spt-b 3276.8)
|
|
(sp-flt spt-vel-y (meters 0.026666667))
|
|
(sp-int spt-timer 270)
|
|
(sp-cpuinfo-flags aux-list)
|
|
(sp-int spt-next-time 180)
|
|
(sp-launcher-by-id spt-next-launcher 50)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 50)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 2
|
|
(sp-flt spt-fade-b -4.551111)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 46)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 17
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2))
|
|
(sp-flt spt-num 1.0)
|
|
(sp-rnd-flt spt-x (meters 0.0) (meters 1.8) 1.0)
|
|
(sp-flt spt-scale-x (meters 0.2))
|
|
(sp-flt spt-rot-x 16384.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-rnd-flt spt-scale-y (meters 2.5) (meters 2.5) 1.0)
|
|
(sp-rnd-int spt-r 0 1 128.0)
|
|
(sp-rnd-flt spt-g 64.0 196.0 1.0)
|
|
(sp-rnd-flt spt-b 128.0 128.0 1.0)
|
|
(sp-flt spt-a 128.0)
|
|
(sp-flt spt-scalevel-x (meters -0.0025))
|
|
(sp-rnd-flt spt-scalevel-y (meters 0.24414062) (meters 0.48828125) 1.0)
|
|
(sp-int spt-timer 81)
|
|
(sp-cpuinfo-flags bit3)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 47)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 17
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2))
|
|
(sp-flt spt-num 2.0)
|
|
(sp-rnd-flt spt-x (meters 1.8) (meters 1.0) 1.0)
|
|
(sp-flt spt-scale-x (meters 0.2))
|
|
(sp-flt spt-rot-x 16384.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-rnd-flt spt-scale-y (meters 0.5) (meters 1.0) 1.0)
|
|
(sp-rnd-int spt-r 0 1 128.0)
|
|
(sp-rnd-flt spt-g 64.0 196.0 1.0)
|
|
(sp-rnd-flt spt-b 128.0 128.0 1.0)
|
|
(sp-flt spt-a 128.0)
|
|
(sp-flt spt-scalevel-x (meters -0.0025))
|
|
(sp-rnd-flt spt-scalevel-y (meters 0.048828125) (meters 0.09765625) 1.0)
|
|
(sp-int spt-timer 81)
|
|
(sp-cpuinfo-flags bit3)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 48)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 21
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #x17 :page #x2))
|
|
(sp-flt spt-num 1.5)
|
|
(sp-rnd-flt spt-x (meters 2.9) (meters 2.5) 1.0)
|
|
(sp-flt spt-y (meters -0.5))
|
|
(sp-rnd-flt spt-scale-x (meters 0.3) (meters 0.4) 1.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-rnd-flt spt-scale-y (meters 0.1) (meters 0.1) 1.0)
|
|
(sp-rnd-flt spt-r 10.0 6.0 1.0)
|
|
(sp-rnd-flt spt-g 64.0 128.0 1.0)
|
|
(sp-rnd-flt spt-b 10.0 6.0 1.0)
|
|
(sp-flt spt-a 80.0)
|
|
(sp-rnd-flt spt-vel-x (meters -0.011666667) (meters -0.0033333334) 1.0)
|
|
(sp-flt spt-vel-y (meters 0.0))
|
|
(sp-rnd-int-flt spt-rotvel-z (degrees -1.2) 1 436.90668)
|
|
(sp-flt spt-fade-a -0.2)
|
|
(sp-flt spt-accel-y 6.826667)
|
|
(sp-flt spt-friction 0.996)
|
|
(sp-int-plain-rnd spt-timer 180 119 1)
|
|
(sp-cpuinfo-flags bit2)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 49)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 23
|
|
(sp-tex spt-texture (new 'static 'texture-id :page #x2))
|
|
(sp-flt spt-num 0.5)
|
|
(sp-rnd-flt spt-x (meters 2.9) (meters 2.5) 1.0)
|
|
(sp-flt spt-y (meters -0.5))
|
|
(sp-rnd-flt spt-scale-x (meters 2.0) (meters 1.0) 1.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-copy-from-other spt-scale-y -4)
|
|
(sp-rnd-flt spt-r 32.0 32.0 1.0)
|
|
(sp-rnd-flt spt-g 32.0 32.0 1.0)
|
|
(sp-rnd-flt spt-b 10.0 5.0 1.0)
|
|
(sp-flt spt-a 0.0)
|
|
(sp-rnd-flt spt-vel-x (meters -0.011666667) (meters -0.0033333334) 1.0)
|
|
(sp-flt spt-vel-y (meters 0.0))
|
|
(sp-rnd-int-flt spt-rotvel-z (degrees -1.2) 1 436.90668)
|
|
(sp-flt spt-fade-a 0.6)
|
|
(sp-flt spt-accel-y 6.826667)
|
|
(sp-flt spt-friction 0.996)
|
|
(sp-int spt-timer 270)
|
|
(sp-cpuinfo-flags bit2 bit3)
|
|
(sp-int spt-next-time 45)
|
|
(sp-launcher-by-id spt-next-launcher 51)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 51)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 2
|
|
(sp-flt spt-fade-a -0.18)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-group-id-table* 38)
|
|
(new 'static 'sparticle-launch-group
|
|
:length 4
|
|
:duration #xbb8
|
|
:linger-duration #x5dc
|
|
:name "group-jungle-launcher"
|
|
:launcher
|
|
(new 'static 'inline-array sparticle-group-item 4
|
|
(sp-item 45 :fade-after (meters 100.0) :falloff-to (meters 100.0))
|
|
(sp-item 52 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 53 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 54 :fade-after (meters 70.0) :falloff-to (meters 100.0))
|
|
)
|
|
:bounds
|
|
(new 'static 'sphere :y 12288.0 :w 20480.0)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 52)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 17
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2))
|
|
(sp-flt spt-num 1.0)
|
|
(sp-rnd-flt spt-x (meters 0.0) (meters 1.4) 1.0)
|
|
(sp-flt spt-scale-x (meters 0.2))
|
|
(sp-flt spt-rot-x 16384.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-rnd-flt spt-scale-y (meters 2.5) (meters 2.5) 1.0)
|
|
(sp-rnd-int spt-r 0 1 128.0)
|
|
(sp-rnd-flt spt-g 64.0 196.0 1.0)
|
|
(sp-rnd-flt spt-b 128.0 128.0 1.0)
|
|
(sp-flt spt-a 128.0)
|
|
(sp-flt spt-scalevel-x (meters -0.0025))
|
|
(sp-rnd-flt spt-scalevel-y (meters 0.24414062) (meters 0.48828125) 1.0)
|
|
(sp-int spt-timer 81)
|
|
(sp-cpuinfo-flags bit3)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 53)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 17
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #xf :page #x2))
|
|
(sp-flt spt-num 2.0)
|
|
(sp-rnd-flt spt-x (meters 1.4) (meters 0.9) 1.0)
|
|
(sp-flt spt-scale-x (meters 0.2))
|
|
(sp-flt spt-rot-x 16384.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-rnd-flt spt-scale-y (meters 0.5) (meters 1.0) 1.0)
|
|
(sp-rnd-int spt-r 0 1 128.0)
|
|
(sp-rnd-flt spt-g 64.0 196.0 1.0)
|
|
(sp-rnd-flt spt-b 128.0 128.0 1.0)
|
|
(sp-flt spt-a 128.0)
|
|
(sp-flt spt-scalevel-x (meters -0.0025))
|
|
(sp-rnd-flt spt-scalevel-y (meters 0.048828125) (meters 0.09765625) 1.0)
|
|
(sp-int spt-timer 81)
|
|
(sp-cpuinfo-flags bit3)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 54)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 23
|
|
(sp-tex spt-texture (new 'static 'texture-id :page #x2))
|
|
(sp-flt spt-num 0.5)
|
|
(sp-rnd-flt spt-x (meters 2.9) (meters 2.5) 1.0)
|
|
(sp-flt spt-y (meters -0.5))
|
|
(sp-rnd-flt spt-scale-x (meters 2.0) (meters 1.0) 1.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-copy-from-other spt-scale-y -4)
|
|
(sp-rnd-flt spt-r 64.0 32.0 1.0)
|
|
(sp-rnd-flt spt-g 32.0 32.0 1.0)
|
|
(sp-rnd-flt spt-b 10.0 5.0 1.0)
|
|
(sp-flt spt-a 0.0)
|
|
(sp-rnd-flt spt-vel-x (meters -0.011666667) (meters -0.0033333334) 1.0)
|
|
(sp-flt spt-vel-y (meters 0.0))
|
|
(sp-rnd-int-flt spt-rotvel-z (degrees -1.2) 1 436.90668)
|
|
(sp-flt spt-fade-a 0.6)
|
|
(sp-flt spt-accel-y 6.826667)
|
|
(sp-flt spt-friction 0.996)
|
|
(sp-int spt-timer 270)
|
|
(sp-cpuinfo-flags bit2 bit3)
|
|
(sp-int spt-next-time 45)
|
|
(sp-launcher-by-id spt-next-launcher 51)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-group-id-table* 39)
|
|
(new 'static 'sparticle-launch-group
|
|
:length 4
|
|
:duration #xbb8
|
|
:linger-duration #x5dc
|
|
:name "group-swamp-launcher"
|
|
:launcher
|
|
(new 'static 'inline-array sparticle-group-item 4
|
|
(sp-item 45 :fade-after (meters 100.0) :falloff-to (meters 100.0))
|
|
(sp-item 46 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 47 :fade-after (meters 70.0) :falloff-to (meters 100.0) :flags (is-3d))
|
|
(sp-item 55 :fade-after (meters 70.0) :falloff-to (meters 100.0))
|
|
)
|
|
:bounds
|
|
(new 'static 'sphere :y 12288.0 :w 20480.0)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 55)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 23
|
|
(sp-tex spt-texture (new 'static 'texture-id :page #x2))
|
|
(sp-flt spt-num 0.5)
|
|
(sp-rnd-flt spt-x (meters 2.9) (meters 2.5) 1.0)
|
|
(sp-flt spt-y (meters -0.5))
|
|
(sp-rnd-flt spt-scale-x (meters 2.0) (meters 1.0) 1.0)
|
|
(sp-rnd-flt spt-rot-z (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-copy-from-other spt-scale-y -4)
|
|
(sp-rnd-flt spt-r 16.0 16.0 1.0)
|
|
(sp-rnd-flt spt-g 16.0 16.0 1.0)
|
|
(sp-rnd-flt spt-b 5.0 2.5 1.0)
|
|
(sp-flt spt-a 0.0)
|
|
(sp-rnd-flt spt-vel-x (meters -0.011666667) (meters -0.0033333334) 1.0)
|
|
(sp-flt spt-vel-y (meters 0.0))
|
|
(sp-rnd-int-flt spt-rotvel-z (degrees -1.2) 1 436.90668)
|
|
(sp-flt spt-fade-a 0.6)
|
|
(sp-flt spt-accel-y 6.826667)
|
|
(sp-flt spt-friction 0.996)
|
|
(sp-int spt-timer 270)
|
|
(sp-cpuinfo-flags bit2)
|
|
(sp-int spt-next-time 45)
|
|
(sp-launcher-by-id spt-next-launcher 51)
|
|
(sp-rnd-flt spt-rotate-y (degrees 0.0) (degrees 360.0) 1.0)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defbehavior cam-launcher-joystick camera-slave ()
|
|
(when *camera-read-analog*
|
|
(let ((s5-0 (new-stack-matrix0))
|
|
(gp-0 (vector-reset! (new 'stack-no-clear 'vector)))
|
|
)
|
|
(let*
|
|
((f0-0
|
|
(analog-input
|
|
(the-as int (+ (-> *cpad-list* cpads 0 rightx) -128))
|
|
0.0
|
|
48.0
|
|
110.0
|
|
-1.0
|
|
)
|
|
)
|
|
(f1-1 (* -546.13336 f0-0))
|
|
(f0-2 (fmin 546.13336 (fmax -546.13336 f1-1)))
|
|
)
|
|
(matrix-axis-angle! s5-0 (-> *camera* local-down) f0-2)
|
|
)
|
|
(vector-! gp-0 (-> self trans) (-> *camera* tpos-curr))
|
|
(vector-matrix*! gp-0 gp-0 s5-0)
|
|
(vector+! (-> self trans) gp-0 (-> *camera* tpos-curr))
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate cam-launcher-shortfall (camera-slave)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('teleport)
|
|
#f
|
|
)
|
|
(else
|
|
(cam-standard-event-handler arg0 arg1 arg2 arg3)
|
|
)
|
|
)
|
|
)
|
|
:enter
|
|
(behavior ()
|
|
(when (not (-> self enter-has-run))
|
|
(let ((gp-0 (new 'stack-no-clear 'vector)))
|
|
(vector--float*!
|
|
(-> self trans)
|
|
(-> *camera* tpos-curr)
|
|
(-> *camera* local-down)
|
|
28672.0
|
|
)
|
|
(vector-flatten!
|
|
gp-0
|
|
(-> self tracking inv-mat vector 2)
|
|
(-> *camera* local-down)
|
|
)
|
|
(vector-normalize! gp-0 1.0)
|
|
(set! (-> self pivot-pt quad) (-> gp-0 quad))
|
|
(vector+float*! gp-0 gp-0 (-> *camera* local-down) 1000.0)
|
|
(vector-normalize-copy! (-> self tracking inv-mat vector 2) gp-0 1.0)
|
|
)
|
|
(vector-cross!
|
|
(-> self tracking inv-mat vector 1)
|
|
(-> self tracking inv-mat vector 2)
|
|
(the-as vector (-> self tracking))
|
|
)
|
|
(set! (-> self blend-from-type) (the-as uint 0))
|
|
(set! (-> self blend-to-type) (the-as uint 0))
|
|
0
|
|
)
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(if (zero? (logand (-> *camera* master-options) 2))
|
|
(cam-slave-go cam-free-floating)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(let ((gp-0 (-> *display* base-frame-counter)))
|
|
(while #t
|
|
(when (not (paused?))
|
|
(vector--float*!
|
|
(-> self trans)
|
|
(-> *camera* tpos-curr)
|
|
(-> *camera* local-down)
|
|
28672.0
|
|
)
|
|
(send-event *camera* 'teleport)
|
|
(if
|
|
(and
|
|
(-> *camera* on-ground)
|
|
(>= (- (-> *display* base-frame-counter) gp-0) 300)
|
|
)
|
|
(send-event *camera* 'change-state *camera-base-mode* 150)
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defbehavior cam-launcher-long-joystick camera-slave ()
|
|
(when *camera-read-analog*
|
|
(let ((gp-0 (new-stack-matrix0)))
|
|
(let*
|
|
((f0-0
|
|
(analog-input
|
|
(the-as int (+ (-> *cpad-list* cpads 0 rightx) -128))
|
|
0.0
|
|
48.0
|
|
110.0
|
|
-1.0
|
|
)
|
|
)
|
|
(f1-1 (* -546.13336 f0-0))
|
|
(f0-2 (fmin 546.13336 (fmax -546.13336 f1-1)))
|
|
)
|
|
(matrix-axis-angle! gp-0 (-> *camera* local-down) f0-2)
|
|
)
|
|
(vector-matrix*! (-> self view-flat) (-> self view-flat) gp-0)
|
|
)
|
|
(vector-normalize! (-> self view-flat) 4096.0)
|
|
)
|
|
)
|
|
|
|
(defstate cam-launcher-longfall (camera-slave)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('teleport)
|
|
#f
|
|
)
|
|
(else
|
|
(cam-standard-event-handler arg0 arg1 arg2 arg3)
|
|
)
|
|
)
|
|
)
|
|
:enter
|
|
(behavior ()
|
|
(when (not (-> self enter-has-run))
|
|
(new 'stack-no-clear 'vector)
|
|
(vector-negate! (-> self view-flat) (-> self tracking inv-mat vector 2))
|
|
(vector-normalize! (-> self view-flat) 4096.0)
|
|
(vector--float*!
|
|
(-> self trans)
|
|
(-> *camera* tpos-curr)
|
|
(-> *camera* local-down)
|
|
28672.0
|
|
)
|
|
(vector+! (-> self trans) (-> self trans) (-> self view-flat))
|
|
(set! (-> self blend-from-type) (the-as uint 0))
|
|
(set! (-> self blend-to-type) (the-as uint 0))
|
|
(cam-calc-follow! (-> self tracking) (-> self trans) #f)
|
|
(slave-set-rotation!
|
|
(-> self tracking)
|
|
(-> self trans)
|
|
(the-as float (-> self options))
|
|
(-> self fov)
|
|
#f
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(if (zero? (logand (-> *camera* master-options) 2))
|
|
(cam-slave-go cam-free-floating)
|
|
)
|
|
(cam-launcher-long-joystick)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(let ((gp-0 (-> *display* base-frame-counter)))
|
|
(while #t
|
|
(when (not (paused?))
|
|
(let ((s4-0 (new 'stack-no-clear 'vector))
|
|
(s5-0 (new 'stack-no-clear 'vector))
|
|
)
|
|
0.0
|
|
0.0
|
|
0.0
|
|
(send-event *camera* 'teleport)
|
|
(let* ((f0-4 (vector-dot (-> self velocity) (-> *camera* local-down)))
|
|
(f30-0 (* 0.975 f0-4))
|
|
)
|
|
(vector--float*!
|
|
s4-0
|
|
(-> *camera* tpos-curr)
|
|
(-> *camera* local-down)
|
|
28672.0
|
|
)
|
|
(vector-! s4-0 s4-0 (-> self trans))
|
|
(let ((f28-0 (vector-dot s4-0 (-> *camera* local-down))))
|
|
(vector--float*! s5-0 s4-0 (-> *camera* local-down) f28-0)
|
|
(cond
|
|
((< f28-0 f30-0)
|
|
(set! f30-0 f28-0)
|
|
)
|
|
((< 20480.0 f28-0)
|
|
(let ((f28-1 (+ -20480.0 f28-0)))
|
|
(let ((f0-8 (lerp f30-0 f28-1 0.005)))
|
|
(if (< f30-0 f0-8)
|
|
(set! f30-0 f0-8)
|
|
)
|
|
)
|
|
(if (< (* 0.09 f28-1) f30-0)
|
|
(set! f30-0 (* 0.09 f28-1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(vector+float*! (-> self velocity) s5-0 (-> *camera* local-down) f30-0)
|
|
)
|
|
)
|
|
(vector+! (-> self trans) (-> self trans) (-> self velocity))
|
|
(set! (-> self trans x) (-> *camera* tpos-curr x))
|
|
(set! (-> self trans z) (-> *camera* tpos-curr z))
|
|
(vector+! (-> self trans) (-> self trans) (-> self view-flat))
|
|
(if
|
|
(and
|
|
(-> *camera* on-ground)
|
|
(>= (- (-> *display* base-frame-counter) gp-0) 300)
|
|
)
|
|
(send-event *camera* 'change-state *camera-base-mode* 150)
|
|
)
|
|
)
|
|
(vector-reset! (-> self tracking follow-off))
|
|
(vector+!
|
|
(-> self tracking follow-pt)
|
|
(-> *camera* tpos-curr-adj)
|
|
(-> self tracking follow-off)
|
|
)
|
|
(vector--float*!
|
|
(-> self tracking follow-pt)
|
|
(-> self tracking follow-pt)
|
|
(-> *camera* local-down)
|
|
(-> *camera* target-height)
|
|
)
|
|
(slave-set-rotation!
|
|
(-> self tracking)
|
|
(-> self trans)
|
|
(the-as float (-> self options))
|
|
(-> self fov)
|
|
#f
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate launcher-idle (launcher)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(case arg2
|
|
(('instant-death)
|
|
(go launcher-deactivated)
|
|
)
|
|
(('trans)
|
|
(TODO-RENAME-30 (-> self root-override) (the-as vector (-> arg3 param 0)))
|
|
(dummy-47 (-> self root-override))
|
|
)
|
|
)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(when
|
|
(and
|
|
*target*
|
|
(>=
|
|
(-> self active-distance)
|
|
(vector-vector-distance
|
|
(-> self root-override trans)
|
|
(-> *target* control trans)
|
|
)
|
|
)
|
|
)
|
|
(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) 'query)
|
|
(set! (-> a1-1 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-1 param 1) (the-as uint 3))
|
|
(cond
|
|
((send-event-function *target* a1-1)
|
|
(go launcher-active)
|
|
)
|
|
(else
|
|
(let ((gp-0 'target-launch)
|
|
(a1-2 (new 'stack-no-clear 'event-message-block))
|
|
)
|
|
(set! (-> a1-2 from) self)
|
|
(set! (-> a1-2 num-params) 1)
|
|
(set! (-> a1-2 message) 'query)
|
|
(set! (-> a1-2 param 0) (the-as uint 'mode))
|
|
(if (= (send-event-function *target* a1-2) gp-0)
|
|
(send-event *target* 'end-mode)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(if
|
|
(and
|
|
(and
|
|
*target*
|
|
(>=
|
|
32768.0
|
|
(vector-vector-distance
|
|
(-> self root-override trans)
|
|
(-> *target* control trans)
|
|
)
|
|
)
|
|
)
|
|
(let ((a1-5 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-5 from) self)
|
|
(set! (-> a1-5 num-params) 2)
|
|
(set! (-> a1-5 message) 'query)
|
|
(set! (-> a1-5 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-5 param 1) (the-as uint 3))
|
|
(not (send-event-function *target* a1-5))
|
|
)
|
|
)
|
|
(level-hint-spawn
|
|
(game-text-id daxter-launcher-no-eco)
|
|
"sksp0035"
|
|
(the-as entity #f)
|
|
*entity-pool*
|
|
(game-task none)
|
|
)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(the-as (function none :behavior launcher) anim-loop)
|
|
)
|
|
|
|
(defstate launcher-active (launcher)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(when (or (= arg2 'touch) (= arg2 'attack))
|
|
(set! (-> self state-time) (-> *display* base-frame-counter))
|
|
(send-event
|
|
arg0
|
|
'launch
|
|
(-> self spring-height)
|
|
(-> self camera)
|
|
(-> self dest)
|
|
(-> self seek-time)
|
|
)
|
|
)
|
|
(cond
|
|
((= arg2 'instant-death)
|
|
(go launcher-deactivated)
|
|
)
|
|
((= arg2 'trans)
|
|
(TODO-RENAME-30 (-> self root-override) (the-as vector (-> arg3 param 0)))
|
|
(dummy-47 (-> self root-override))
|
|
)
|
|
)
|
|
)
|
|
:exit
|
|
(behavior ()
|
|
(let ((v1-0 (the-as sound-rpc-set-param (get-sound-buffer-entry))))
|
|
(set! (-> v1-0 command) (sound-command set-param))
|
|
(set! (-> v1-0 id) (-> self sound-id))
|
|
(set! (-> v1-0 parms volume) -4)
|
|
(set! (-> v1-0 auto-time) 120)
|
|
(set! (-> v1-0 auto-from) 2)
|
|
(set! (-> v1-0 parms mask) (the-as uint 17))
|
|
(-> v1-0 id)
|
|
)
|
|
(none)
|
|
)
|
|
:trans
|
|
(behavior ()
|
|
(if
|
|
(or
|
|
(or
|
|
(not *target*)
|
|
(<
|
|
(-> self active-distance)
|
|
(vector-vector-distance
|
|
(-> self root-override trans)
|
|
(-> *target* control trans)
|
|
)
|
|
)
|
|
)
|
|
(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) 'query)
|
|
(set! (-> a1-1 param 0) (the-as uint 'powerup))
|
|
(set! (-> a1-1 param 1) (the-as uint 3))
|
|
(not (send-event-function *target* a1-1))
|
|
)
|
|
)
|
|
(go launcher-idle)
|
|
)
|
|
(spawn (-> self part) (-> self root-override trans))
|
|
(sound-play-by-name
|
|
(static-sound-name "launch-idle")
|
|
(-> self sound-id)
|
|
1024
|
|
0
|
|
0
|
|
1
|
|
#t
|
|
)
|
|
(if
|
|
(and
|
|
(and
|
|
*target*
|
|
(>=
|
|
(+ 2867.2 (-> self root-override root-prim prim-core world-sphere w))
|
|
(vector-vector-distance
|
|
(-> self root-override trans)
|
|
(-> *target* control trans)
|
|
)
|
|
)
|
|
)
|
|
(< (- (-> *display* base-frame-counter) (-> self state-time)) 150)
|
|
)
|
|
(send-event
|
|
*target*
|
|
'launch
|
|
(-> self spring-height)
|
|
(-> self camera)
|
|
(-> self dest)
|
|
(-> self seek-time)
|
|
)
|
|
)
|
|
(none)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(sound-play-by-name
|
|
(static-sound-name "launch-start")
|
|
(new-sound-id)
|
|
1024
|
|
0
|
|
0
|
|
1
|
|
#t
|
|
)
|
|
(anim-loop)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defstate launcher-deactivated (launcher)
|
|
:code
|
|
(the-as (function none :behavior launcher) anim-loop)
|
|
)
|
|
|
|
(defmethod init-from-entity! launcher ((obj launcher) (arg0 entity-actor))
|
|
(stack-size-set! (-> obj main-thread) 128)
|
|
(let
|
|
((s4-0 (new 'process 'collide-shape obj (collide-list-enum hit-by-player))))
|
|
(let ((s3-0 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
|
|
(set! (-> s3-0 prim-core collide-as) (the-as uint 256))
|
|
(set! (-> s3-0 collide-with) (the-as uint 16))
|
|
(set-vector! (-> s3-0 local-sphere) 0.0 0.0 0.0 12288.0)
|
|
(set-root-prim! s4-0 s3-0)
|
|
)
|
|
(set! (-> s4-0 nav-radius) 13926.4)
|
|
(backup-collide-with-as s4-0)
|
|
(set! (-> obj root-override) s4-0)
|
|
)
|
|
(process-drawable-from-entity! obj arg0)
|
|
(dummy-47 (-> obj root-override))
|
|
(set! (-> obj active-distance) 409600.0)
|
|
(set!
|
|
(-> obj spring-height)
|
|
(res-lump-float arg0 'spring-height :default 163840.0)
|
|
)
|
|
(let ((s4-1 (res-lump-value arg0 'mode uint128)))
|
|
(let ((v1-18 (-> obj entity extra level name)))
|
|
(set! (-> obj part) (create-launch-control (cond
|
|
((= v1-18 'beach)
|
|
(-> *part-group-id-table* 37)
|
|
)
|
|
((= v1-18 'swamp)
|
|
(-> *part-group-id-table* 39)
|
|
)
|
|
(else
|
|
(-> *part-group-id-table* 38)
|
|
)
|
|
)
|
|
obj
|
|
)
|
|
)
|
|
)
|
|
(let ((v1-24 (logand (the-as int s4-1) 255)))
|
|
(cond
|
|
((= (the-as uint v1-24) 1)
|
|
(set! (-> obj camera) cam-launcher-longfall)
|
|
)
|
|
((= (the-as uint v1-24) 2)
|
|
(set! (-> obj camera) #f)
|
|
)
|
|
(else
|
|
(set! (-> obj camera) cam-launcher-shortfall)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((v1-29 (res-lump-struct arg0 'alt-vector vector)))
|
|
(when v1-29
|
|
(set-vector! (-> obj dest) (-> v1-29 x) (-> v1-29 y) (-> v1-29 z) 1.0)
|
|
(set! (-> obj seek-time) (the-as uint (the int (* 300.0 (-> v1-29 w)))))
|
|
)
|
|
)
|
|
(set! (-> obj sound-id) (new-sound-id))
|
|
(nav-mesh-connect obj (-> obj root-override) (the-as nav-control #f))
|
|
(go launcher-idle)
|
|
(none)
|
|
)
|
|
|
|
(defbehavior
|
|
launcher-init-by-other launcher
|
|
((arg0 vector) (arg1 float) (arg2 int) (arg3 float))
|
|
(stack-size-set! (-> self main-thread) 128)
|
|
(let
|
|
((s2-0 (new 'process 'collide-shape self (collide-list-enum hit-by-player))))
|
|
(let ((s1-0 (new 'process 'collide-shape-prim-sphere s2-0 (the-as uint 0))))
|
|
(set! (-> s1-0 prim-core collide-as) (the-as uint 256))
|
|
(set! (-> s1-0 collide-with) (the-as uint 16))
|
|
(set-vector! (-> s1-0 local-sphere) 0.0 0.0 0.0 12288.0)
|
|
(set-root-prim! s2-0 s1-0)
|
|
)
|
|
(set! (-> s2-0 nav-radius) (* 0.75 (-> s2-0 root-prim local-sphere w)))
|
|
(backup-collide-with-as s2-0)
|
|
(set! (-> self root-override) s2-0)
|
|
)
|
|
(set! (-> self root-override trans quad) (-> arg0 quad))
|
|
(set-vector! (-> self root-override scale) 1.0 1.0 1.0 1.0)
|
|
(set-vector! (-> self root-override quat) 0.0 0.0 0.0 1.0)
|
|
(dummy-47 (-> self root-override))
|
|
(set! (-> self spring-height) arg1)
|
|
(set! (-> self active-distance) arg3)
|
|
(let ((v1-23 (-> self entity extra level name)))
|
|
(set! (-> self part) (create-launch-control (cond
|
|
((= v1-23 'beach)
|
|
(-> *part-group-id-table* 37)
|
|
)
|
|
((= v1-23 'swamp)
|
|
(-> *part-group-id-table* 39)
|
|
)
|
|
(else
|
|
(-> *part-group-id-table* 38)
|
|
)
|
|
)
|
|
self
|
|
)
|
|
)
|
|
)
|
|
(case (logand arg2 255)
|
|
((1)
|
|
(set! (-> self camera) cam-launcher-longfall)
|
|
)
|
|
((2)
|
|
(set! (-> self camera) #f)
|
|
)
|
|
(else
|
|
(set! (-> self camera) cam-launcher-shortfall)
|
|
)
|
|
)
|
|
(let ((v1-34 (res-lump-struct (-> self entity) 'alt-vector vector)))
|
|
(when v1-34
|
|
(set-vector! (-> self dest) (-> v1-34 x) (-> v1-34 y) (-> v1-34 z) 1.0)
|
|
(set! (-> self seek-time) (the-as uint (the int (* 300.0 (-> v1-34 w)))))
|
|
)
|
|
)
|
|
(set! (-> self sound-id) (new-sound-id))
|
|
(go launcher-idle)
|
|
(none)
|
|
)
|
|
|
|
(defstate touch-tracker-idle (touch-tracker)
|
|
:event
|
|
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(local-vars (v0-0 none))
|
|
(let ((v1-0 arg2))
|
|
(the-as object (cond
|
|
((= v1-0 'touched)
|
|
(let ((v1-1 (ppointer->process (-> self parent))))
|
|
(when (!= v1-1 arg0)
|
|
(cond
|
|
((= (-> self event) 'attack)
|
|
(cond
|
|
((= (-> arg0 type) target)
|
|
(let
|
|
((a1-2 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-2 from) (the-as process v1-1))
|
|
(set! (-> a1-2 num-params) 2)
|
|
(set! (-> a1-2 message) (-> self event))
|
|
(set! (-> a1-2 param 0) (the-as uint #f))
|
|
(let ((a2-2 (new 'static 'attack-info :mask #x20)))
|
|
(set!
|
|
(-> a2-2 mode)
|
|
(the-as symbol (-> self event-mode))
|
|
)
|
|
(set! (-> a1-2 param 1) (the-as uint a2-2))
|
|
)
|
|
(send-event-function arg0 a1-2)
|
|
)
|
|
)
|
|
((= (-> v1-1 type) target)
|
|
(let
|
|
((a1-4 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-4 from) (the-as process v1-1))
|
|
(set! (-> a1-4 num-params) 4)
|
|
(set! (-> a1-4 message) (-> self event))
|
|
(set! (-> a1-4 param 0) (the-as uint #f))
|
|
(set!
|
|
(-> a1-4 param 1)
|
|
(the-as uint (-> self event-mode))
|
|
)
|
|
(set!
|
|
(-> a1-4 param 2)
|
|
(the-as uint (-> *target* control unknown-dword50))
|
|
)
|
|
(set!
|
|
(-> a1-4 param 3)
|
|
(the-as uint (-> *target* control unknown-dword51))
|
|
)
|
|
(send-event-function arg0 a1-4)
|
|
)
|
|
)
|
|
(else
|
|
(let
|
|
((a1-5 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-5 from) (the-as process v1-1))
|
|
(set! (-> a1-5 num-params) 4)
|
|
(set! (-> a1-5 message) (-> self event))
|
|
(set! (-> a1-5 param 0) (the-as uint #f))
|
|
(set!
|
|
(-> a1-5 param 1)
|
|
(the-as uint (-> self event-mode))
|
|
)
|
|
(let ((v1-19 (+ *global-attack-id* 1)))
|
|
(set! *global-attack-id* v1-19)
|
|
(set! (-> a1-5 param 2) (the-as uint v1-19))
|
|
)
|
|
(set! (-> a1-5 param 3) (the-as uint 0))
|
|
(send-event-function arg0 a1-5)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
((-> self event)
|
|
(let
|
|
((a1-6 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-6 from) (the-as process v1-1))
|
|
(set! (-> a1-6 num-params) 0)
|
|
(set! (-> a1-6 message) (-> self event))
|
|
(send-event-function arg0 a1-6)
|
|
)
|
|
)
|
|
(else
|
|
(let
|
|
((t0-5 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> t0-5 from) arg0)
|
|
(set! (-> t0-5 num-params) arg1)
|
|
(set! (-> t0-5 message) arg2)
|
|
(set! (-> t0-5 param 0) (-> arg3 param 0))
|
|
(set! (-> t0-5 param 1) (-> arg3 param 1))
|
|
(set! (-> t0-5 param 2) (-> arg3 param 2))
|
|
(set! (-> t0-5 param 3) (-> arg3 param 3))
|
|
(set! (-> t0-5 param 4) (-> arg3 param 4))
|
|
(set! (-> t0-5 param 5) (-> arg3 param 5))
|
|
(set! (-> t0-5 param 6) (-> arg3 param 6))
|
|
(send-event-function v1-1 t0-5)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
((= v1-0 'target)
|
|
(set!
|
|
v0-0
|
|
(the-as
|
|
none
|
|
(process->handle (the-as process (-> arg3 param 0)))
|
|
)
|
|
)
|
|
(set! (-> self target) (the-as handle v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'event)
|
|
(set! (-> self event) (the-as symbol (-> arg3 param 0)))
|
|
(set! v0-0 (the-as none (-> arg3 param 1)))
|
|
(set! (-> self event-mode) (the-as basic v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'exit)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set! (-> self run-function) (the-as (function none) v0-0))
|
|
v0-0
|
|
)
|
|
((= v1-0 'eval)
|
|
((the-as (function touch-tracker none) (-> arg3 param 0))
|
|
self
|
|
)
|
|
)
|
|
((= v1-0 'function)
|
|
(set! v0-0 (the-as none (-> arg3 param 0)))
|
|
(set!
|
|
(-> self callback)
|
|
(the-as (function touch-tracker none) v0-0)
|
|
)
|
|
v0-0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:code
|
|
(behavior ()
|
|
(set! (-> self state-time) (-> *display* base-frame-counter))
|
|
(while ((-> self run-function))
|
|
(let* ((gp-0 (handle->process (-> self target)))
|
|
(a0-4
|
|
(if
|
|
(and (nonzero? gp-0) (type-type? (-> gp-0 type) process-drawable))
|
|
gp-0
|
|
)
|
|
)
|
|
)
|
|
(when a0-4
|
|
(let* ((gp-1 (-> (the-as process-drawable a0-4) root))
|
|
(a0-6
|
|
(if
|
|
(and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
|
|
gp-1
|
|
)
|
|
)
|
|
)
|
|
(if a0-6
|
|
(set!
|
|
(-> self root-override trans quad)
|
|
(-> (the-as collide-shape a0-6) root-prim prim-core world-sphere quad)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(if (-> self callback)
|
|
((-> self callback) self)
|
|
)
|
|
(dummy-47 (-> self root-override))
|
|
(let ((a1-3 (new 'stack-no-clear 'touching-shapes-entry)))
|
|
(set! (-> a1-3 cshape1) (the-as collide-shape 2))
|
|
(set! (-> a1-3 cshape2) (the-as collide-shape *touching-list*))
|
|
(dummy-40 (-> self root-override) a1-3)
|
|
)
|
|
(suspend)
|
|
)
|
|
(clear-collide-with-as (-> self root-override))
|
|
(suspend)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defbehavior
|
|
touch-tracker-init touch-tracker
|
|
((arg0 vector) (arg1 float) (arg2 uint))
|
|
(let
|
|
((s4-0
|
|
(new 'process 'collide-shape-moving self (collide-list-enum hit-by-player))
|
|
)
|
|
)
|
|
(set! (-> s4-0 dynam) (copy *standard-dynamics* 'process))
|
|
(set! (-> s4-0 reaction) default-collision-reaction)
|
|
(set!
|
|
(-> s4-0 no-reaction)
|
|
(the-as
|
|
(function collide-shape-moving collide-shape-intersect vector vector none)
|
|
nothing
|
|
)
|
|
)
|
|
(let ((s2-0 (new 'process 'collide-shape-prim-sphere s4-0 (the-as uint 0))))
|
|
(set! (-> s2-0 prim-core collide-as) (the-as uint 272))
|
|
(set! (-> s2-0 collide-with) (the-as uint 3022))
|
|
(set! (-> s2-0 prim-core offense) 4)
|
|
(set-vector! (-> s2-0 local-sphere) 0.0 0.0 0.0 arg1)
|
|
(set-root-prim! s4-0 s2-0)
|
|
)
|
|
(set! (-> s4-0 nav-radius) (* 0.75 (-> s4-0 root-prim local-sphere w)))
|
|
(backup-collide-with-as s4-0)
|
|
(set! (-> s4-0 event-self) 'touched)
|
|
(set! (-> self root-override) s4-0)
|
|
)
|
|
(set! (-> self root-override trans quad) (-> arg0 quad))
|
|
(set! (-> self duration) arg2)
|
|
(set! (-> self target) (the-as handle #f))
|
|
(set! (-> self event) #f)
|
|
(set! (-> self callback) #f)
|
|
(set!
|
|
(-> self run-function)
|
|
(the-as
|
|
(function none)
|
|
(lambda :behavior touch-tracker
|
|
()
|
|
(<
|
|
(- (-> *display* base-frame-counter) (-> self state-time))
|
|
(the-as int (-> self duration))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set! (-> self event-hook) (-> touch-tracker-idle event))
|
|
(go touch-tracker-idle)
|
|
(none)
|
|
)
|
|
|
|
(defun process-drawable-random-point! ((arg0 process-drawable) (arg1 vector))
|
|
(let ((v1-1 (-> arg0 node-list length))
|
|
(s4-0 (-> arg0 root))
|
|
)
|
|
(cond
|
|
((>= v1-1 7)
|
|
(let ((v1-2 (rand-vu-int-range 3 (+ v1-1 -1))))
|
|
(vector<-cspace! arg1 (-> arg0 node-list data v1-2))
|
|
)
|
|
)
|
|
((and (nonzero? s4-0) (type-type? (-> s4-0 type) collide-shape))
|
|
(vector+!
|
|
arg1
|
|
(the-as vector (-> (the-as collide-shape s4-0) root-prim prim-core))
|
|
(rand-vu-sphere-point!
|
|
arg1
|
|
(-> (the-as collide-shape s4-0) root-prim prim-core world-sphere w)
|
|
)
|
|
)
|
|
)
|
|
(else
|
|
(vector+!
|
|
arg1
|
|
(-> arg0 root trans)
|
|
(rand-vu-sphere-point! arg1 (-> arg0 draw bounds w))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
arg1
|
|
)
|
|
|
|
(defun
|
|
process-drawable-pair-random-point!
|
|
((arg0 process-drawable) (arg1 process-drawable) (arg2 vector) (arg3 float))
|
|
(let ((s4-0 (new-stack-vector0))
|
|
(s3-0 (new-stack-vector0))
|
|
)
|
|
(process-drawable-random-point! arg0 s4-0)
|
|
(process-drawable-random-point! arg1 s3-0)
|
|
(vector-lerp! arg2 s4-0 s3-0 arg3)
|
|
)
|
|
)
|
|
|
|
(define *particle-quat* (new 'static 'quaternion :w 1.0))
|
|
|
|
(defun
|
|
birth-func-set-quat
|
|
((arg0 int) (arg1 sparticle-cpuinfo) (arg2 sparticle-launchinfo))
|
|
(local-vars (a0-2 float) (a0-3 float))
|
|
(rlet ((vf0 :class vf)
|
|
(vf1 :class vf)
|
|
(vf2 :class vf)
|
|
)
|
|
(init-vf0-vector)
|
|
(let ((a0-1 arg2)
|
|
(v1-0 *particle-quat*)
|
|
)
|
|
(cond
|
|
((< (-> v1-0 w) 0.0)
|
|
(.lvf vf1 (&-> a0-1 conerot quad))
|
|
(.lvf vf2 (&-> v1-0 vec quad))
|
|
(.sub.vf vf1 vf0 vf2 :mask #b111)
|
|
(.svf (&-> a0-1 conerot quad) vf1)
|
|
(.mov a0-2 vf1)
|
|
)
|
|
(else
|
|
(.lvf vf1 (&-> a0-1 conerot quad))
|
|
(.lvf vf2 (&-> v1-0 vec quad))
|
|
(.add.vf vf1 vf0 vf2 :mask #b111)
|
|
(.svf (&-> a0-1 conerot quad) vf1)
|
|
(.mov a0-3 vf1)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(set!
|
|
(-> *part-id-table* 2528)
|
|
(new 'static 'sparticle-launcher
|
|
:init-specs
|
|
(new 'static 'inline-array sp-field-init-spec 12
|
|
(sp-tex spt-texture (new 'static 'texture-id :index #xc :page #x2))
|
|
(sp-func spt-birth-func 'birth-func-set-quat)
|
|
(sp-flt spt-num 1.0)
|
|
(sp-rnd-flt spt-scale-x (meters 2.0) (meters 0.5) 1.0)
|
|
(sp-flt spt-scale-y (meters 5.6))
|
|
(sp-rnd-flt spt-r 0.0 44.0 1.0)
|
|
(sp-rnd-flt spt-g 0.0 64.0 1.0)
|
|
(sp-rnd-flt spt-b 128.0 32.0 1.0)
|
|
(sp-flt spt-a 128.0)
|
|
(sp-int spt-timer 5)
|
|
(sp-cpuinfo-flags bit2 bit3 bit14 left-multiply-quat)
|
|
(sp-end)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun draw-eco-beam ((arg0 vector) (arg1 vector))
|
|
(when (line-in-view-frustum? arg0 arg1)
|
|
(let ((s2-1 (vector-! (new 'stack-no-clear 'vector) arg1 arg0))
|
|
(gp-1 (new 'stack-no-clear 'vector))
|
|
(s4-0 (new 'stack-no-clear 'vector))
|
|
(s5-0 (new 'stack-no-clear 'quaternion))
|
|
)
|
|
(vector+*! gp-1 arg0 s2-1 0.5)
|
|
(vector-normalize-copy! s4-0 s2-1 1.0)
|
|
(set!
|
|
(-> *part-id-table* 2528 init-specs 4 initial-valuef)
|
|
(vector-length s2-1)
|
|
)
|
|
(forward-up->quaternion s5-0 s4-0 *y-vector*)
|
|
(dotimes (s4-1 3)
|
|
(quaternion-rotate-local-z! s5-0 s5-0 10922.667)
|
|
(quaternion-copy! *particle-quat* s5-0)
|
|
(sp-launch-particles-var
|
|
*sp-particle-system-3d*
|
|
(-> *part-id-table* 2528)
|
|
gp-1
|
|
(the-as sparticle-launch-state #f)
|
|
(the-as sparticle-launch-control #f)
|
|
1.0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
|
|
|
|
|