jak-project/goal_src/engine/game/collectables.gc
ManDude c245f37feb
[decomp] joint and related (#1003)
* update jak 2 config and hack to make game text dumpable

* update stuff

* update src

* do `cspace<-parented-transformq-joint!`

* progress.... kind of...

* more drawable stuff

* clagng

* bones begin

* more bones

* even more bones

* everything builds

* touches

* errors

* ?

* fix `quicksandlurker`

* updates

* update refs

* more fixes

* update refs
2021-12-26 11:43:16 -05:00

3242 lines
116 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
;; name: collectables.gc
;; name in dgo: collectables
;; dgos: GAME, ENGINE
(declare-type vent process-drawable)
(declare-type eco eco-collectable)
(defenum collectable-flags
:bitfield #t
:type uint32
(trans 0)
(fade 1)
(can-collect 2)
(fading 3)
(suck 4)
(ignore-blue 5)
(anim 6)
)
;; DECOMP BEGINS
(define *eco-pill-count* 0)
(deftype collectable (process-drawable)
((root-override collide-shape-moving :offset 112)
(pickup-type pickup-type :offset-assert 176)
(pickup-amount float :offset-assert 180)
(notify-parent basic :offset-assert 184)
(old-base vector :inline :offset-assert 192)
(base vector :inline :offset-assert 208)
(extra-trans vector :inline :offset-assert 224)
(jump-pos vector :inline :offset-assert 240)
(flags collectable-flags :offset-assert 256)
(birth-time int64 :offset-assert 264)
(collect-timeout int64 :offset-assert 272)
(fadeout-timeout int64 :offset-assert 280)
(bob-offset int64 :offset-assert 288)
(bob-amount float :offset-assert 296)
(pickup-handle handle :offset-assert 304)
(actor-pause symbol :offset-assert 312)
)
:heap-base #xd0
:method-count-assert 22
:size-assert #x13c
:flag-assert #x1600d0013c
(:methods
(initialize (_type_) _type_ 20)
(initialize-params (_type_ int float) none 21)
)
)
(defmethod initialize-params collectable ((obj collectable) (arg0 int) (arg1 float))
(logclear! (-> obj mask) (process-mask crate enemy platform ambient))
(set! (-> obj mask) (logior (process-mask collectable) (-> obj mask)))
(set! (-> obj flags) (collectable-flags can-collect ignore-blue))
(set! (-> obj bob-amount) arg1)
(set! (-> obj bob-offset) (+ (the-as int (-> obj root-override trans x))
(the-as int (-> obj root-override trans y))
(the-as int (-> obj root-override trans z))
)
)
(cond
((or
(= (vector-length (-> obj root-override transv)) 0.0)
(logtest? (-> obj fact options) (fact-options fop6))
)
(vector-reset! (-> obj root-override transv))
)
(else
(logior! (-> obj flags) (collectable-flags trans))
(logclear! (-> obj flags) (collectable-flags can-collect))
(logclear! (-> obj mask) (process-mask actor-pause))
(set! (-> obj bob-amount) 0.0)
)
)
(when (and (> arg0 0) #t)
(logior! (-> obj flags) (collectable-flags fade))
(set! (-> obj fadeout-timeout) arg0)
)
(set! (-> obj collect-timeout) 99)
(set! (-> obj birth-time) (-> *display* base-frame-counter))
(set! (-> obj base quad) (-> obj root-override trans quad))
(set! (-> obj old-base quad) (-> obj root-override trans quad))
(set! (-> obj pickup-handle) (the-as handle #f))
(case (-> obj fact pickup-type)
(((pickup-type eco-pill) (pickup-type eco-green) (pickup-type money) (pickup-type eco-blue))
(logclear! (-> obj flags) (collectable-flags ignore-blue))
)
)
(if (logtest? (-> obj fact options) (fact-options large))
(set! (-> obj root-override root-prim local-sphere w) (* 2.5 (-> obj root-override root-prim local-sphere w)))
)
(none)
)
(deftype eco-collectable (collectable)
((eco-effect sparticle-launch-group :offset-assert 316)
(collect-effect sparticle-launch-group :offset-assert 320)
(collect-effect2 sparticle-launch-group :offset-assert 324)
(collect-effect-time seconds :offset-assert 328)
(respawn-delay int64 :offset-assert 336)
(sound-name sound-spec :offset-assert 344)
(target handle :offset-assert 352)
(suck-time int64 :offset-assert 360)
(suck-y-offset float :offset-assert 368)
(speed vector :inline :offset-assert 384)
(movie-pos-index int32 :offset-assert 400)
)
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
(:methods
(wait () _type_ :state 22)
(pickup (object handle) _type_ :state 23)
(die () _type_ :state 24)
(jump () _type_ :state 25)
(notice-blue (handle) _type_ :state 26)
(get-pickup-sound (_type_ pickup-type) ambient-sound 27)
(initialize-eco (_type_ entity-actor pickup-type float) object 28)
(animate (_type_) none 29)
(blocked () _type_ :state 30)
)
)
(defmethod initialize eco-collectable ((obj eco-collectable))
(stack-size-set! (-> obj main-thread) 128)
(logior! (-> obj mask) (process-mask actor-pause))
(set! (-> obj actor-pause) #t)
(set! (-> obj notify-parent) #f)
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint #x8040))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set-vector! (-> s4-0 local-sphere) 0.0 3276.8 0.0 3276.8)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> obj root-override) s5-0)
)
(set! (-> obj fact) (new 'process 'fact-info obj (-> obj pickup-type) (-> obj pickup-amount)))
(if (logtest? (fact-options respawn) (-> obj fact options))
(set! (-> obj respawn-delay) (-> obj fact fade-time))
)
obj
)
(defmethod get-pickup-sound eco-collectable ((obj eco-collectable) (arg0 pickup-type))
(set! (-> obj fact pickup-type) arg0)
(case (-> obj fact pickup-type)
(((pickup-type eco-blue) (pickup-type eco-red) (pickup-type eco-green) (pickup-type eco-yellow))
(logclear! (-> obj mask) (process-mask actor-pause))
)
)
(set! (-> obj sound-name) #f)
(case arg0
(((pickup-type eco-yellow))
(set! (-> obj eco-effect) (-> *part-group-id-table* 56))
(set! (-> obj collect-effect) (-> *part-group-id-table* 68))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 57))
(set! (-> obj collect-effect-time) 150)
(set! (-> obj sound-name) (new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "yel-eco-idle")
:volume #x400
:fo-max 15
)
)
)
(((pickup-type eco-red))
(set! (-> obj eco-effect) (-> *part-group-id-table* 48))
(set! (-> obj collect-effect) (-> *part-group-id-table* 69))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 49))
(set! (-> obj collect-effect-time) 150)
(set! (-> obj sound-name) (new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "red-eco-idle")
:volume #x400
:fo-max 15
)
)
)
(((pickup-type eco-blue))
(set! (-> obj eco-effect) (-> *part-group-id-table* 42))
(set! (-> obj collect-effect) (-> *part-group-id-table* 67))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 43))
(set! (-> obj collect-effect-time) 150)
(set! (-> obj sound-name) (new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "blue-eco-idle")
:volume #x400
:fo-max 15
)
)
)
(((pickup-type eco-green))
(set! (-> obj eco-effect) (-> *part-group-id-table* 58))
(set! (-> obj collect-effect) (-> *part-group-id-table* 66))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 61))
(set! (-> obj collect-effect-time) 150)
(set! (-> obj sound-name) (new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "green-eco-idle")
:volume #x400
:fo-max 15
)
)
)
(((pickup-type eco-pill))
(set! (-> obj eco-effect) (-> *part-group-id-table* 59))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 60))
(set! (-> obj collect-effect-time) 150)
)
)
(set! (-> obj part) (create-launch-control (-> obj eco-effect) obj))
(when (-> obj sound-name)
(let ((v0-1 (new 'process 'ambient-sound (-> obj sound-name) (-> obj root-override trans))))
(set! (-> obj sound) v0-1)
v0-1
)
)
)
(defbehavior initialize-eco-by-other eco ((arg0 vector) (arg1 vector) (arg2 fact-info))
(let ((s3-0 (-> arg2 pickup-type))
(f30-0 (-> arg2 pickup-spawn-amount))
)
(set! (-> self pickup-amount) f30-0)
(set! (-> self pickup-type) s3-0)
(initialize self)
(set! (-> self fact pickup-type) s3-0)
(set! (-> self fact pickup-amount) f30-0)
)
(set! (-> self fact options) (-> arg2 options))
(set! (-> self root-override trans quad) (-> arg0 quad))
(set! (-> self root-override transv quad) (-> arg1 quad))
(get-pickup-sound self (-> self fact pickup-type))
(set! (-> self notify-parent) #f)
(case (-> self fact pickup-type)
(((pickup-type eco-blue) (pickup-type eco-yellow) (pickup-type eco-red))
(initialize-params
self
(if (and arg2 (logtest? (-> arg2 options) (fact-options fade)))
(-> arg2 fade-time)
0
)
(the-as float 1024.0)
)
)
(else
(initialize-params self 4500 (the-as float 1024.0))
)
)
(dummy-47 (-> self root-override))
(set! (-> self event-hook) (-> (method-of-object self wait) event))
(if (logtest? (fact-options eco-blocked) (-> self fact options))
(go-virtual blocked)
)
(go-virtual wait)
(none)
)
(defmethod initialize-eco eco-collectable ((obj eco-collectable) (arg0 entity-actor) (arg1 pickup-type) (arg2 float))
(set! (-> obj pickup-amount) arg2)
(set! (-> obj pickup-type) arg1)
(initialize obj)
(set! (-> obj root-override trans quad) (-> arg0 extra trans quad))
(get-pickup-sound obj (-> obj fact pickup-type))
(initialize-params obj 0 (the-as float 1024.0))
(dummy-47 (-> obj root-override))
(if (logtest? (fact-options eco-blocked) (-> obj fact options))
(go (method-of-object obj blocked))
)
(go (method-of-object obj wait))
)
(defmethod animate eco-collectable ((obj eco-collectable))
0
(none)
)
(defun add-blue-shake ((arg0 vector) (arg1 vector) (arg2 vector))
(let* ((f0-0 (vector-vector-distance arg1 arg2))
(f30-0 (lerp-scale
(the-as float 409.6)
(the-as float 0.0)
f0-0
(-> *FACT-bank* suck-suck-dist)
(-> *FACT-bank* suck-bounce-dist)
)
)
)
(+! (-> arg0 x) (rand-vu-float-range (- f30-0) f30-0))
(+! (-> arg0 y) (rand-vu-float-range (- f30-0) f30-0))
(+! (-> arg0 z) (rand-vu-float-range (- f30-0) f30-0))
)
arg0
)
(defbehavior check-blue-suck eco-collectable ((arg0 process-drawable))
(let ((v1-1 (if (and (nonzero? arg0) (type-type? (-> arg0 type) process-drawable))
arg0
)
)
)
(when v1-1
(let* ((gp-1 (-> v1-1 root))
(v1-3 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
gp-1
)
)
)
(when v1-3
(let ((a0-5 (-> self root-override root-prim prim-core))
(a1-2 (-> (the-as collide-shape v1-3) root-prim prim-core))
)
(if (< (vector-vector-distance (the-as vector a0-5) (the-as vector a1-2)) (-> *FACT-bank* suck-suck-dist))
(logior! (-> self flags) (collectable-flags suck))
)
)
)
)
)
)
(none)
)
(defbehavior add-blue-motion eco-collectable ((arg0 symbol) (arg1 symbol) (arg2 symbol) (arg3 symbol))
(let* ((gp-0 (handle->process (-> self target)))
(v1-4 (if (and (nonzero? gp-0) (type-type? (-> gp-0 type) process-drawable))
gp-0
)
)
)
(when v1-4
(let* ((gp-1 (-> (the-as process-drawable v1-4) root))
(v1-6 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
(the-as collide-shape gp-1)
)
)
)
(when v1-6
(let ((s2-0 (-> self root-override root-prim prim-core))
(gp-2 (-> v1-6 root-prim prim-core))
)
(if (and arg1 (rand-vu-percent? (the-as float 0.25)))
(eco-blue-glow (the-as vector s2-0))
)
(let ((f0-0 (vector-vector-distance (the-as vector s2-0) (the-as vector gp-2))))
(cond
((and arg3 (< f0-0 8192.0))
(return #t)
)
((begin
(set! arg0
(and
(or
(not arg2)
(or (< f0-0 (-> *FACT-bank* suck-suck-dist)) (logtest? (-> self flags) (collectable-flags suck)))
)
arg0
)
)
arg0
)
(logior! (-> self flags) (collectable-flags suck))
(if (= (-> self speed w) 0.0)
(set! (-> self suck-time) (-> *display* base-frame-counter))
)
(+! (-> self speed w) (* 163840.0 (-> *display* seconds-per-frame)))
(+! (-> self speed y) (* 291271.12 (-> *display* seconds-per-frame)))
(set! (-> self speed y) (fmin (fmin 291271.12 (-> self speed y)) (-> self speed y)))
(let ((s5-2 (vector-! (new 'stack-no-clear 'vector) (-> self base) (the-as vector gp-2))))
(vector-normalize!
s5-2
(fmax 0.0 (- (vector-length s5-2) (* (-> self speed w) (-> *display* seconds-per-frame))))
)
(vector-rotate-y! s5-2 s5-2 (* (-> self speed y) (-> self speed z) (-> *display* seconds-per-frame)))
(set! (-> self suck-y-offset)
(* 2048.0 (sin (* 873.81335 (the float (mod (- (-> *display* base-frame-counter) (-> self suck-time)) 75)))))
)
(vector+! (-> self base) (the-as vector gp-2) s5-2)
)
)
((and arg2 (and
(< (+ 4096.0 (-> *FACT-bank* suck-bounce-dist)) f0-0)
(zero? (logand (-> self flags) (collectable-flags suck)))
)
)
(go-virtual wait)
)
(arg1
(add-blue-shake (-> self root-override trans) (the-as vector s2-0) (the-as vector gp-2))
)
)
)
)
)
)
)
)
#f
)
(defstate blocked (eco-collectable)
:virtual #t
:trans
(behavior ()
(if (task-complete? *game-info* (-> self entity extra perm task))
(go-virtual wait)
)
(none)
)
:code
(the-as (function none :behavior eco-collectable) anim-loop)
)
(defstate jump (eco-collectable)
:virtual #t
:code
(behavior ()
(if (type-type? (-> self type) fuel-cell)
(sound-play-by-name (static-sound-name "cell-prize") (new-sound-id) 1024 0 0 1 #t)
)
(logclear! (-> self mask) (process-mask actor-pause))
(let ((gp-1 (new 'stack 'trajectory)))
(set! (-> self base y) (-> self jump-pos y))
(setup-from-to-duration!
gp-1
(-> self root-override trans)
(-> self jump-pos)
(the-as float 300.0)
(the-as float -2.2755556)
)
(set! (-> self state-time) (-> *display* base-frame-counter))
(until (>= (- (-> *display* base-frame-counter) (-> self state-time)) 300)
(let ((f0-2 (the float (- (-> *display* base-frame-counter) (-> self state-time)))))
(eval-position! gp-1 f0-2 (-> self root-override trans))
)
(transform-post)
(animate self)
(suspend)
(when (nonzero? (-> self skel))
(let ((a0-10 (-> self skel root-channel 0)))
(set! (-> a0-10 param 0) 0.5)
(joint-control-channel-group-eval! a0-10 (the-as art-joint-anim #f) num-func-loop!)
)
)
)
)
(set! (-> self root-override trans quad) (-> self jump-pos quad))
(set! (-> self base quad) (-> self root-override trans quad))
(vector-reset! (-> self root-override transv))
(dummy-47 (-> self root-override))
(logclear! (-> self flags) (collectable-flags trans))
(logior! (-> self flags) (collectable-flags can-collect))
(if (-> self actor-pause)
(logior! (-> self mask) (process-mask actor-pause))
)
(go-virtual wait)
(none)
)
)
(defstate wait (eco-collectable)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(local-vars (v0-3 none))
(when (and
(or (= arg2 'touch) (= arg2 'attack))
(and
(logtest? (-> self flags) (collectable-flags can-collect))
(>= (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self collect-timeout))
(!= (-> self next-state name) 'pickup)
(send-event arg0 'get-pickup (-> self fact pickup-type) (-> self fact pickup-amount))
)
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (process->handle arg0))
)
(the-as
object
(cond
((= arg2 'eco-blue)
(when (and
(zero? (logand (-> self flags) (collectable-flags fading ignore-blue)))
(!= (-> self next-state name) 'pickup)
(begin (check-blue-suck (the-as process-drawable arg0)) #t)
(logtest? (-> self flags) (collectable-flags can-collect))
(>= (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self collect-timeout))
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual notice-blue (process->handle arg0))
)
)
((= arg2 'trans)
(set! (-> self root-override trans quad) (-> (the-as vector (-> arg3 param 0)) quad))
(dummy-47 (-> self root-override))
(ja-post)
)
((= arg2 'jump)
(logclear! (-> self mask) (process-mask actor-pause))
(set! (-> self jump-pos quad) (-> (the-as vector (-> arg3 param 0)) quad))
(go-virtual jump)
)
((= arg2 'pickup)
(when (!= (-> self next-state name) 'pickup)
(if (and (> arg1 0) (-> arg3 param 0))
(TODO-RENAME-30 (-> self root-override) (the-as vector (-> arg3 param 0)))
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (the-as handle #f))
)
)
((= arg2 'die)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual die)
)
((= arg2 'movie-pos)
(set! v0-3 (the-as none (-> arg3 param 0)))
(set! (-> self movie-pos-index) (the-as int v0-3))
v0-3
)
((= arg2 'actor-pause)
(cond
((-> arg3 param 0)
(logior! (-> self mask) (process-mask actor-pause))
(set! v0-3 (the-as none #t))
(set! (-> self actor-pause) (the-as symbol v0-3))
v0-3
)
(else
(logclear! (-> self mask) (process-mask actor-pause))
(set! (-> self actor-pause) #f)
#f
)
)
)
((= arg2 'fade)
(logior! (-> self flags) (collectable-flags fade))
(set! (-> self fadeout-timeout) 30)
(set! v0-3 (the-as none (-> *display* base-frame-counter)))
(set! (-> self birth-time) (the-as int v0-3))
v0-3
)
)
)
)
:enter
(behavior ()
(if (and
(logtest? (-> self fact options) (fact-options fop6 can-collect))
(logtest? (-> self flags) (collectable-flags can-collect))
(!= (-> self next-state name) 'pickup)
(send-event *target* 'get-pickup (-> self fact pickup-type) (-> self fact pickup-amount))
)
(go-virtual pickup #f (process->handle *target*))
)
(none)
)
:trans
(behavior ()
(cond
((logtest? (-> self flags) (collectable-flags trans))
(vector-v++!
(-> self root-override transv)
(dummy-62 (-> self root-override) (new-stack-vector0) (the-as float 0.0))
)
(dummy-57 (-> self root-override) (-> self root-override transv))
(when (and (>= 0.0 (-> self root-override transv y)) (>= (-> self base y) (-> self root-override trans y)))
(set! (-> self root-override trans y) (-> self base y))
(cond
((< (-> self root-override transv y) -8192.0)
(set! (-> self root-override transv y) (* -0.5 (-> self root-override transv y)))
)
(else
(vector-reset! (-> self root-override transv))
(logclear! (-> self flags) (collectable-flags trans))
(logior! (-> self flags) (collectable-flags can-collect))
(if (-> self actor-pause)
(logior! (-> self mask) (process-mask actor-pause))
)
(set! (-> self base quad) (-> self root-override trans quad))
(if (and
(logtest? (-> self fact options) (fact-options can-collect))
(zero? (logand (-> self flags) (collectable-flags ignore-blue)))
)
(go-virtual notice-blue (process->handle *target*))
)
(if (and
(logtest? (-> self fact options) (fact-options fop6 can-collect))
(!= (-> self next-state name) 'pickup)
(send-event *target* 'get-pickup (-> self fact pickup-type) (-> self fact pickup-amount))
)
(go-virtual pickup #f (process->handle *target*))
)
)
)
)
)
(else
(set! (-> self trans-hook) #f)
)
)
(dummy-47 (-> self root-override))
(none)
)
:code
(behavior ()
(while #t
(let ((gp-0 (-> self part))
(s5-0 (-> self root-override root-prim prim-core))
)
(when (and
(logtest? (-> self flags) (collectable-flags fade))
(>= (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self fadeout-timeout))
)
(let ((v1-10 (- 300 (- (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self fadeout-timeout)))))
(cond
((< v1-10 0)
(process-entity-status! self (entity-perm-status dead) #t)
(deactivate self)
)
(else
(logclear! (-> self mask) (process-mask actor-pause))
(set! (-> self actor-pause) #f)
(logior! (-> self flags) (collectable-flags fading))
(logior! (-> self state-flags) 1)
(set! (-> gp-0 fade) (* 0.0033333334 (the float v1-10)))
)
)
)
)
(spawn gp-0 (the-as vector s5-0))
)
(if (nonzero? (-> self sound))
(update! (-> self sound))
)
(suspend)
)
(none)
)
)
(defstate notice-blue (eco-collectable)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(when (and
(or (= arg2 'touch) (= arg2 'attack))
(and
(logtest? (-> self flags) (collectable-flags can-collect))
(>= (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self collect-timeout))
(!= (-> self next-state name) 'pickup)
(send-event arg0 'get-pickup (-> self fact pickup-type) (-> self fact pickup-amount))
)
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (process->handle arg0))
)
)
:enter
(behavior ((arg0 handle))
(set! (-> self target) arg0)
(set! (-> self speed quad) (the-as uint128 0))
(set! (-> self speed z) (the-as float (if (rand-vu-percent? (the-as float 0.5))
1.0
-1.0
)
)
)
(set! (-> self suck-y-offset) 0.0)
(logclear! (-> self mask) (process-mask actor-pause))
(none)
)
:exit
(behavior ()
(if (-> self actor-pause)
(logior! (-> self mask) (process-mask actor-pause))
)
(none)
)
:trans
(behavior ()
(let ((a1-0 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-0 from) self)
(set! (-> a1-0 num-params) 2)
(set! (-> a1-0 message) 'query)
(set! (-> a1-0 param 0) (the-as uint 'powerup))
(set! (-> a1-0 param 1) (the-as uint 3))
(if (and (not (send-event-function *target* a1-0)) (zero? (logand (-> self flags) (collectable-flags suck))))
(go-virtual wait)
)
)
(none)
)
:code
(behavior ((arg0 handle))
(while #t
(set! (-> self root-override trans quad) (-> self base quad))
(add-blue-motion #t #f #t #f)
(dummy-47 (-> self root-override))
(if (nonzero? (-> self draw))
(ja-post)
)
(let ((a0-5 (-> self part))
(a1-1 (-> self root-override root-prim prim-core))
)
(if (nonzero? a0-5)
(spawn a0-5 (the-as vector a1-1))
)
)
(if (nonzero? (-> self sound))
(update! (-> self sound))
)
(suspend)
)
(none)
)
)
(defstate pickup (eco-collectable)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(let ((v1-0 arg2))
(the-as
object
(cond
((= v1-0 'set-movie-pos)
(let ((v1-3 (res-lump-struct (-> self entity) 'movie-pos vector :time (the-as float -1000000000.0))))
(the-as symbol (when v1-3
(set! (-> v1-3 quad) (-> (the-as vector (-> arg3 param 0)) quad))
(the-as symbol v1-3)
)
)
)
)
((= v1-0 'actor-pause)
(the-as symbol (cond
((-> arg3 param 0)
(logior! (-> self mask) (process-mask actor-pause))
(let ((v0-1 #t))
(set! (-> self actor-pause) v0-1)
v0-1
)
)
(else
(logclear! (-> self mask) (process-mask actor-pause))
(set! (-> self actor-pause) #f)
#f
)
)
)
)
((= v1-0 'fade)
(process-entity-status! self (entity-perm-status dead) #t)
(the-as symbol (deactivate self))
)
)
)
)
)
:enter
(behavior ((arg0 object) (arg1 handle))
(set! (-> self pickup-handle) arg1)
(when (-> self notify-parent)
(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 'pickup))
(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
)
)
)
)
(logclear! (-> self mask) (process-mask actor-pause))
(none)
)
:code
(behavior ((arg0 object) (arg1 handle))
(clear-collide-with-as (-> self root-override))
(if (not (or
(= (-> self fact pickup-type) (pickup-type eco-pill))
(logtest? (-> self fact options) (fact-options powerup))
)
)
(send-event (handle->process arg1) 'powerup (-> self fact pickup-type) (-> self fact pickup-amount))
)
(if (nonzero? (-> self sound))
(stop! (-> self sound))
)
(case (-> self fact pickup-type)
(((pickup-type eco-yellow))
(sound-play-by-name (static-sound-name "y-eco-pickup") (new-sound-id) 1024 0 0 1 #t)
)
(((pickup-type eco-red))
(sound-play-by-name (static-sound-name "r-eco-pickup") (new-sound-id) 1024 0 0 1 #t)
)
(((pickup-type eco-blue))
(sound-play-by-name (static-sound-name "b-eco-pickup") (new-sound-id) 1024 0 0 1 #t)
(case (-> (level-get-target-inside *level*) name)
(('training)
(level-hint-spawn
(game-text-id training-more-eco-more-time)
"sagevb23"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
)
)
(((pickup-type eco-green))
(sound-play-by-name (static-sound-name "g-eco-pickup") (new-sound-id) 1024 0 0 1 #t)
)
(((pickup-type eco-green) (pickup-type eco-pill))
(sound-play-by-name (static-sound-name "pill-pickup") (new-sound-id) 1024 0 0 1 #t)
)
)
(if (nonzero? (-> self part))
(kill-and-free-particles (-> self part))
)
(let ((gp-6 (handle->process (-> self pickup-handle))))
(when (nonzero? (-> self collect-effect))
(let ((s5-5 (get-process *default-dead-pool* part-tracker #x4000)))
(when s5-5
(let ((t9-17 (method-of-type part-tracker activate)))
(t9-17 (the-as part-tracker s5-5) gp-6 'part-tracker (the-as pointer #x70004000))
)
(run-now-in-process
s5-5
part-tracker-init
(-> self collect-effect)
-1
part-tracker-track-target
#f
#f
(-> self root-override root-prim prim-core)
)
(-> s5-5 ppointer)
)
)
)
)
(when (nonzero? (-> self collect-effect2))
(let ((gp-7 (get-process *default-dead-pool* part-tracker #x4000)))
(when gp-7
(let ((t9-20 (method-of-type part-tracker activate)))
(t9-20 (the-as part-tracker gp-7) self 'part-tracker (the-as pointer #x70004000))
)
(run-now-in-process
gp-7
part-tracker-init
(-> self collect-effect2)
-1
(lambda ((arg0 part-tracker))
(let ((s5-0 (handle->process (-> arg0 userdata))))
(when s5-0
(let* ((v1-4 (handle->process (-> (the-as eco-collectable s5-0) pickup-handle)))
(a2-0 (cond
((not v1-4)
(-> arg0 root trans)
)
((= (-> v1-4 type) target)
(vector<-cspace! (new 'stack-no-clear 'vector) (-> (the-as target v1-4) node-list data 5))
)
(else
(-> (the-as target v1-4) control trans)
)
)
)
)
(vector-lerp!
(-> arg0 root trans)
(-> arg0 offset)
a2-0
(/ (the float (- (-> *display* base-frame-counter) (the-as int (-> arg0 start-time))))
(the float (-> (the-as eco-collectable s5-0) collect-effect-time))
)
)
)
)
)
)
(process->handle self)
#f
(-> self root-override root-prim prim-core)
)
(-> gp-7 ppointer)
)
)
)
(while (-> self child)
(suspend)
)
(go-virtual die)
(none)
)
)
(defstate die (eco-collectable)
:virtual #t
:code
(behavior () (process-entity-status! self (entity-perm-status dead) #t) (none))
)
(deftype eco (eco-collectable)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod animate eco ((obj eco))
(let ((a0-1 (-> obj part))
(a1-0 (-> obj root-override root-prim prim-core))
)
(spawn a0-1 (the-as vector a1-0))
)
(if (nonzero? (-> obj sound))
(update! (-> obj sound))
)
0
(none)
)
(defstate die (eco)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(let ((v1-0 arg2))
(the-as object (cond
((= v1-0 'fade)
(process-entity-status! self (entity-perm-status dead) #t)
(deactivate self)
)
((= v1-0 'die)
(go-virtual die)
)
)
)
)
)
:exit
(behavior ()
(process-entity-status! self (entity-perm-status bit-3) #f)
(if (-> self actor-pause)
(logior! (-> self mask) (process-mask actor-pause))
)
(none)
)
:code
(behavior ()
(process-entity-status! self (entity-perm-status bit-3) #t)
(logclear! (-> self mask) (process-mask actor-pause))
(logclear! (-> self fact options) (fact-options fop6 can-collect))
(if (nonzero? (-> self part))
(kill-and-free-particles (-> self part))
)
(cond
((nonzero? (-> self respawn-delay))
(let ((gp-0 (-> *display* base-frame-counter)))
(while (< (- (-> *display* base-frame-counter) gp-0) (-> self respawn-delay))
(suspend)
)
)
)
(else
(while (let ((f30-0 0.0)
(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 'pickup))
(set! (-> a1-1 param 1) (the-as uint (-> self fact pickup-type)))
(< f30-0 (the-as float (send-event-function *target* a1-1)))
)
(suspend)
)
)
)
(set! (-> self base quad) (-> self old-base quad))
(set! (-> self root-override trans quad) (-> self base quad))
(restore-collide-with-as (-> self root-override))
(go-virtual wait)
(none)
)
)
(deftype eco-yellow (eco)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod init-from-entity! eco-yellow ((obj eco-yellow) (arg0 entity-actor))
(initialize-eco obj arg0 (pickup-type eco-yellow) (-> *FACT-bank* eco-single-inc))
(none)
)
(deftype eco-red (eco)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod init-from-entity! eco-red ((obj eco-red) (arg0 entity-actor))
(initialize-eco obj arg0 (pickup-type eco-red) (-> *FACT-bank* eco-single-inc))
(none)
)
(deftype eco-blue (eco)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod init-from-entity! eco-blue ((obj eco-blue) (arg0 entity-actor))
(initialize-eco obj arg0 (pickup-type eco-blue) (-> *FACT-bank* eco-single-inc))
(none)
)
(deftype health (eco-collectable)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod animate health ((obj health))
(let ((a0-1 (-> obj part))
(a1-0 (-> obj root-override root-prim prim-core))
)
(spawn a0-1 (the-as vector a1-0))
)
(if (nonzero? (-> obj sound))
(update! (-> obj sound))
)
0
(none)
)
(defmethod init-from-entity! health ((obj health) (arg0 entity-actor))
(initialize-eco obj arg0 (pickup-type eco-green) (-> *FACT-bank* health-single-inc))
(none)
)
(deftype eco-pill (eco-collectable)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod animate eco-pill ((obj eco-pill))
(let ((a0-1 (-> obj part))
(a1-0 (-> obj root-override root-prim prim-core))
)
(spawn a0-1 (the-as vector a1-0))
)
(if (nonzero? (-> obj sound))
(update! (-> obj sound))
)
0
(none)
)
(defmethod init-from-entity! eco-pill ((obj eco-pill) (arg0 entity-actor))
(initialize-eco obj arg0 (pickup-type eco-pill) (-> *FACT-bank* health-small-inc))
(none)
)
(defmethod deactivate eco-pill ((obj eco-pill))
(set! *eco-pill-count* (+ *eco-pill-count* -1))
((method-of-type eco-collectable deactivate) obj)
(none)
)
(defmethod initialize eco-pill ((obj eco-pill))
(set! *eco-pill-count* (+ *eco-pill-count* 1))
(stack-size-set! (-> obj main-thread) 128)
(logior! (-> obj mask) (process-mask actor-pause))
(set! (-> obj actor-pause) #t)
(set! (-> obj notify-parent) #f)
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint #x8040))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set-vector! (-> s4-0 local-sphere) 0.0 3276.8 0.0 8192.0)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> obj root-override) s5-0)
)
(set! (-> obj fact) (new 'process 'fact-info obj (-> obj pickup-type) (-> obj pickup-amount)))
obj
)
(defskelgroup *money-sg* money
0
4
((1 (meters 20)) (2 (meters 40)) (3 (meters 999999)))
:bounds (static-spherem 0 0 0 0.6)
:longest-edge (meters 0)
:texture-level 2
)
(defskelgroup *fuel-cell-sg* fuel-cell
0
2
((1 (meters 999999)))
:bounds (static-spherem 0 1 0 1.6)
:longest-edge (meters 0)
:texture-level 2
)
(deftype money (eco-collectable)
()
:heap-base #x130
:method-count-assert 31
:size-assert #x194
:flag-assert #x1f01300194
)
(defmethod run-logic? money ((obj money))
(or
(zero? (logand (-> obj mask) (process-mask actor-pause)))
(or
(and
(nonzero? (-> obj draw))
(logtest? (-> obj draw status) (draw-status drwf03))
(>= (+ (-> *ACTOR-bank* pause-dist) (-> obj root-override pause-adjust-distance))
(vector-vector-distance (-> obj root-override trans) (math-camera-pos))
)
)
(and (nonzero? (-> obj skel)) (!= (-> obj skel root-channel 0) (-> obj skel channel)))
(and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) (draw-status drwf04)))
)
)
)
(defmethod deactivate money ((obj money))
(when (= (-> obj next-state name) 'pickup)
(if (not (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status dead))))
(format #t "money ~A was killed in pickup~%")
)
(process-entity-status! obj (entity-perm-status dead) #t)
)
((method-of-type eco-collectable deactivate) obj)
(none)
)
(defstate wait (money)
:virtual #t
:code
(behavior ()
(while #t
(quaternion-rotate-y!
(-> self root-override quat)
(-> self root-override quat)
(* 40049.777 (-> *display* seconds-per-frame))
)
(let ((f30-0 (-> self bob-amount)))
(when (< 0.0 f30-0)
(set! (-> self root-override trans y)
(+ (-> self base y)
(-> self suck-y-offset)
(* f30-0
(sin
(* 109.22667
(the float (mod (+ (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self bob-offset)) 600))
)
)
)
)
)
(dummy-47 (-> self root-override))
)
)
(ja-post)
(suspend)
)
(none)
)
)
(defstate notice-blue (money)
:virtual #t
:code
(behavior ((arg0 handle))
(while #t
(quaternion-rotate-y!
(-> self root-override quat)
(-> self root-override quat)
(* 91022.22 (-> *display* seconds-per-frame))
)
(set! (-> self root-override trans quad) (-> self base quad))
(add-blue-motion #t #t #t #f)
(let ((f30-0 (-> self bob-amount)))
(if (< 0.0 f30-0)
(set! (-> self root-override trans y)
(+ (-> self base y)
(-> self suck-y-offset)
(* f30-0
(sin
(* 109.22667
(the float (mod (+ (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self bob-offset)) 600))
)
)
)
)
)
)
)
(transform-post)
(suspend)
)
(none)
)
)
(defstate pickup (money)
:virtual #t
:code
(behavior ((arg0 object) (arg1 handle))
(logclear! (-> self mask) (process-mask actor-pause))
(clear-collide-with-as (-> self root-override))
(process-entity-status! self (entity-perm-status dead) #t)
(convert-to-hud-object self (the-as hud (ppointer->process (-> *hud-parts* money))))
(none)
)
)
(defmethod initialize money ((obj money))
(stack-size-set! (-> obj main-thread) 128)
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint #x8040))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set-vector! (-> s4-0 local-sphere) 0.0 2048.0 0.0 4915.2)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> obj root-override) s5-0)
)
(logior! (-> obj mask) (process-mask actor-pause))
(set! (-> obj actor-pause) #t)
(set! (-> obj notify-parent) #f)
(set! (-> obj fact) (new 'process 'fact-info obj (pickup-type money) (the-as float 1.0)))
(let ((a0-10 (-> obj entity)))
(if (when a0-10
(let ((a0-11 (-> a0-10 extra perm task)))
(if a0-11
(= a0-11 (game-task none))
)
)
)
(set! (-> obj entity extra perm task) (game-task complete))
)
)
(initialize-skeleton obj *money-sg* '())
(if (-> obj entity)
(nav-mesh-connect obj (-> obj root-override) (the-as nav-control #f))
)
(set-vector! (-> obj draw color-mult) 0.8 0.8 0.8 1.0)
(set-vector! (-> obj draw color-emissive) 0.2 0.2 0.2 1.0)
obj
)
(defmethod init-from-entity! money ((obj money) (arg0 entity-actor))
(initialize obj)
(process-drawable-from-entity! obj (the-as entity-actor (-> obj entity)))
(initialize-params obj 0 (the-as float 1024.0))
(dummy-47 (-> obj root-override))
(go (method-of-object obj wait))
(none)
)
(defbehavior money-init-by-other money ((arg0 vector) (arg1 vector) (arg2 fact-info) (arg3 entity))
(let ((s3-0 (-> arg2 pickup-type))
(f30-0 (-> arg2 pickup-spawn-amount))
)
(set! (-> self entity) arg3)
(set! (-> self pickup-type) s3-0)
(set! (-> self pickup-amount) f30-0)
(initialize self)
(set! (-> self fact pickup-type) s3-0)
(set! (-> self fact pickup-amount) f30-0)
)
(set! (-> self fact options) (-> arg2 options))
(set! (-> self notify-parent) #t)
(set! (-> self root-override trans quad) (-> arg0 quad))
(quaternion-identity! (-> self root-override quat))
(vector-identity! (-> self root-override scale))
(set! (-> self root-override transv quad) (-> arg1 quad))
(initialize-params self 4500 (the-as float 1024.0))
(dummy-47 (-> self root-override))
(set! (-> self event-hook) (-> (method-of-object self wait) event))
(go-virtual wait)
(none)
)
(defbehavior money-init-by-other-no-bob money ((arg0 vector) (arg1 vector) (arg2 fact-info) (arg3 float) (arg4 entity))
(set! (-> self entity) arg4)
(set! (-> self pickup-type) (the-as pickup-type arg2))
(set! (-> self pickup-amount) arg3)
(initialize self)
(set! (-> self fact pickup-type) (the-as pickup-type arg2))
(set! (-> self fact pickup-amount) arg3)
(set! (-> self notify-parent) #t)
(set! (-> self root-override trans quad) (-> arg0 quad))
(quaternion-identity! (-> self root-override quat))
(vector-identity! (-> self root-override scale))
(set! (-> self root-override transv quad) (-> arg1 quad))
(initialize-params self 4500 (the-as float 0.0))
(logior! (-> self flags) (collectable-flags ignore-blue))
(dummy-47 (-> self root-override))
(set! (-> self event-hook) (-> (method-of-object self wait) event))
(go-virtual wait)
(none)
)
(define *fuel-cell-tune-pos* (new 'static 'vector :w 1000000000.0))
(deftype fuel-cell (eco-collectable)
((victory-anim spool-anim :offset-assert 404)
(state-object symbol :offset-assert 408)
)
:heap-base #x130
:method-count-assert 31
:size-assert #x19c
:flag-assert #x1f0130019c
)
(defun fuel-cell-pick-anim ((arg0 process-drawable))
(let* ((gp-0 (-> arg0 entity extra trans))
(a0-2 (res-lump-value (-> arg0 entity) 'movie-mask uint128 :time (the-as float -1000000000.0)))
(a1-1 8)
(v1-6 (abs (the int (+ (* 0.00024414062 (-> gp-0 x)) (* 0.00024414062 (-> gp-0 z))))))
(v1-7 (mod v1-6 a1-1))
)
(while (logtest? a0-2 (ash 1 v1-7))
(set! v1-7 (mod (+ v1-7 1) a1-1))
)
(when *target*
(cond
((logtest? (-> *target* control root-prim prim-core action) 512)
(set! v1-7 16)
)
((logtest? (-> *target* control root-prim prim-core action) #x4000)
(set! v1-7 32)
)
)
)
(cond
((zero? v1-7)
(new 'static 'spool-anim :name "fuel-cell-victory" :index 3 :parts 2 :command-list '())
)
((= v1-7 1)
(new 'static 'spool-anim :name "fuel-cell-victory-2" :index 4 :parts 2 :command-list '())
)
((= v1-7 2)
(new 'static 'spool-anim :name "fuel-cell-victory-3" :index 5 :parts 2 :command-list '())
)
((= v1-7 3)
(new 'static 'spool-anim :name "fuel-cell-victory-4" :index 6 :parts 2 :command-list '())
)
((= v1-7 4)
(new 'static 'spool-anim :name "fuel-cell-victory-5" :index 7 :parts 2 :command-list '())
)
((= v1-7 5)
(new 'static 'spool-anim :name "fuel-cell-victory-6" :index 8 :parts 2 :command-list '())
)
((= v1-7 6)
(new 'static 'spool-anim :name "fuel-cell-victory-7" :index 9 :parts 2 :command-list '())
)
((= v1-7 7)
(new 'static 'spool-anim :name "fuel-cell-victory-8" :index 10 :parts 2 :command-list '())
)
((= v1-7 16)
(new 'static 'spool-anim :name "fuel-cell-racer-victory-1" :index 40 :parts 2 :command-list '())
)
((= v1-7 32)
(new 'static 'spool-anim :name "fuel-cell-flut-victory-1" :index 44 :parts 2 :command-list '())
)
(else
(new 'static 'spool-anim :name "fuel-cell-victory-3" :index 5 :parts 2 :command-list '())
)
)
)
)
(defbehavior fuel-cell-animate fuel-cell ()
(let* ((gp-0 self)
(s5-0 (if (and (nonzero? gp-0) (type-type? (-> gp-0 type) fuel-cell))
gp-0
)
)
)
(cond
(s5-0
(set! (-> s5-0 victory-anim) (fuel-cell-pick-anim s5-0))
(spool-push *art-control* (-> s5-0 victory-anim name) 0 self (the-as float -99.0))
)
(else
(let ((v1-5 (fuel-cell-pick-anim self)))
(spool-push *art-control* (-> v1-5 name) 0 self (the-as float -99.0))
)
)
)
)
(when (nonzero? (-> self part))
(cond
((logtest? (-> self draw status) (draw-status drwf01 drwf02))
(kill-and-free-particles (-> self part))
(if (nonzero? (-> self sound))
(kill-and-free-particles (-> self part))
)
)
(else
(let* ((gp-1 (-> self root-override))
(v1-20 (if (and (nonzero? gp-1) (type-type? (-> gp-1 type) collide-shape))
gp-1
)
)
(gp-2 (if v1-20
(-> v1-20 root-prim prim-core)
(-> self root-override trans)
)
)
)
(spawn (-> self part) (the-as vector gp-2))
(when (nonzero? (-> self sound))
(update-trans! (-> self sound) (the-as vector gp-2))
(update! (-> self sound))
)
)
)
)
)
(set-vector! (-> self draw color-mult) 0.5 0.5 0.5 1.0)
(set-vector! (-> self draw color-emissive) 0.5 0.5 0.5 1.0)
0
(none)
)
(method-set! fuel-cell 29 fuel-cell-animate)
(defstate wait (fuel-cell)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(local-vars (v0-3 none))
(when (and
(or (= arg2 'touch) (= arg2 'attack))
(and
(logtest? (-> self flags) (collectable-flags can-collect))
(>= (- (-> *display* base-frame-counter) (-> self birth-time)) (-> self collect-timeout))
(and
(not (handle->process (-> *game-info* other-camera-handle)))
(not *progress-process*)
(!= (-> self next-state name) 'pickup)
*target*
(zero? (logand (-> *target* state-flags) #x8100))
)
)
)
(push-setting! *setting-control* self 'allow-progress #f 0.0 0)
(copy-settings-from-target! *setting-control*)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (process->handle arg0))
)
(the-as object (cond
((= arg2 'trans)
(set! (-> self root-override trans quad) (-> (the-as vector (-> arg3 param 0)) quad))
(set! (-> self base quad) (-> self root-override trans quad))
(dummy-47 (-> self root-override))
)
((= arg2 'pickup)
(when (!= (-> self next-state name) 'pickup)
(if (and (> arg1 0) (-> arg3 param 0))
(TODO-RENAME-30 (-> self root-override) (the-as vector (-> arg3 param 0)))
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (process->handle *target*))
)
)
((= arg2 'collide-shape)
(if (-> arg3 param 0)
(restore-collide-with-as (-> self root-override))
(clear-collide-with-as (-> self root-override))
)
)
((= arg2 'movie-pos)
(set! v0-3 (the-as none (-> arg3 param 0)))
(set! (-> self movie-pos-index) (the-as int v0-3))
v0-3
)
((= arg2 'anim)
(cond
((-> arg3 param 0)
(set! v0-3 (the-as none (logclear (-> self flags) (collectable-flags anim))))
(set! (-> self flags) (the-as collectable-flags v0-3))
)
(else
(set! v0-3 (the-as none (logior (-> self flags) (collectable-flags anim))))
(set! (-> self flags) (the-as collectable-flags v0-3))
)
)
v0-3
)
)
)
)
:code
(behavior ()
0.5
(let ((f28-0 0.0))
(let ((v1-3 (-> self skel root-channel 0)))
(set! (-> v1-3 frame-group) (the-as art-joint-anim (-> self draw art-group data 2)))
)
(while #t
(let ((f30-0 (vector-vector-distance (-> self base) (target-pos 0))))
(set! f28-0
(if (and (< f30-0 (-> *FACT-bank* suck-suck-dist)) (zero? (logand (-> self flags) (collectable-flags anim))))
(seek f28-0 (the-as float 16384.0) (* 3072.0 (-> *display* seconds-per-frame)))
(seek f28-0 (the-as float 0.0) (* 3072.0 (-> *display* seconds-per-frame)))
)
)
(set! (-> self root-override trans y) (+ (-> self base y) (* 2867.2 (sin f28-0))))
(let ((f30-1
(lerp-scale (the-as float 0.6) (the-as float 0.5) f30-0 (the-as float 8192.0) (-> *FACT-bank* suck-suck-dist))
)
)
(transform-post)
(fuel-cell-animate)
(suspend)
(let ((a0-11 (-> self skel root-channel 0)))
(set! (-> a0-11 param 0) f30-1)
(joint-control-channel-group-eval! a0-11 (the-as art-joint-anim #f) num-func-loop!)
)
)
)
)
)
(none)
)
)
(defstate pickup (fuel-cell)
:virtual #t
:enter
(behavior ((arg0 object) (arg1 handle))
(set! (-> self state-time) (-> *display* base-frame-counter))
(set! (-> self state-object) #t)
(let ((t9-1 (-> (the-as (state eco-collectable) (find-parent-method fuel-cell 23)) enter)))
(if t9-1
(t9-1)
)
)
(none)
)
:trans
(behavior ()
(let ((f30-0 (the-as float (cond
((string= (-> self victory-anim name) "fuel-cell-victory")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-2")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-3")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-4")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-5")
77.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-6")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-7")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-victory-8")
97.0
)
((string= (-> self victory-anim name) "fuel-cell-racer-victory-1")
88.0
)
((string= (-> self victory-anim name) "fuel-cell-flut-victory-1")
150.0
)
(else
5000.0
)
)
)
)
)
(when (and (logtest? (-> self skel status) 32) (and (>= (ja-aframe-num 0) f30-0) (-> self state-object)))
(set! (-> self state-object) #f)
(kill-and-free-particles (-> self part))
(logior! (-> self draw status) (draw-status drwf05))
(if (not (or
(logtest?
(the-as int (res-lump-value (-> self entity) 'options uint128 :time (the-as float -1000000000.0)))
4096
)
(and *target* (logtest? (-> *target* control root-prim prim-core action) 512))
)
)
(send-event *camera* 'teleport-to-other-start-string)
)
)
)
(none)
)
:code
(behavior ((arg0 object) (arg1 handle))
(local-vars (sv-96 res-tag))
(sound-play-by-name (static-sound-name "pu-powercell") (new-sound-id) 1024 0 0 1 #t)
(clear-collide-with-as (-> self root-override))
(logclear! (-> self mask) (process-mask actor-pause))
(logclear! (-> self draw status) (draw-status drwf01))
(process-entity-status! self (entity-perm-status dead) #t)
(stop! (-> self sound))
(while (handle->process (-> *game-info* other-camera-handle))
(format
#t
"WARNING: fuel-cell stall ~D ~A ~A~%"
(-> *display* base-frame-counter)
(handle->process (-> *game-info* other-camera-handle))
(-> *level* loading-level)
)
(spool-push *art-control* (-> self victory-anim name) 0 self (the-as float -99.0))
(suspend)
)
(while (let ((a1-8 (new 'stack-no-clear 'event-message-block)))
(set! (-> a1-8 from) self)
(set! (-> a1-8 num-params) 1)
(set! (-> a1-8 message) 'clone-anim)
(set! (-> a1-8 param 0) (the-as uint self))
(not (send-event-function *target* a1-8))
)
(spool-push *art-control* (-> self victory-anim name) 0 self (the-as float -99.0))
(format #t "WARNING: fuel-cell stall on not cloning.~%")
(suspend)
)
(set! sv-96 (new 'static 'res-tag))
(let* ((v1-34
(res-lump-data
(-> self entity)
'movie-pos
(inline-array vector)
:tag-ptr
(& sv-96)
:time
(the-as float -1000000000.0)
)
)
(gp-1 (if (and v1-34 (< (-> self movie-pos-index) (the-as int (-> sv-96 elt-count))))
(-> v1-34 (-> self movie-pos-index))
(the-as vector #f)
)
)
)
(cond
((and *debug-segment* (< (-> *fuel-cell-tune-pos* w) 1000000000.0))
(TODO-RENAME-30 (-> self root-override) *fuel-cell-tune-pos*)
(set-yaw-angle-clear-roll-pitch! (-> self root-override) (-> *fuel-cell-tune-pos* w))
)
((= (-> self movie-pos-index) -1)
)
(gp-1
(TODO-RENAME-30 (-> self root-override) gp-1)
(set-yaw-angle-clear-roll-pitch! (-> self root-override) (-> gp-1 w))
)
(else
(TODO-RENAME-30 (-> self root-override) (-> *target* control trans))
(set-yaw-angle-clear-roll-pitch! (-> self root-override) (y-angle (-> *target* control)))
(dummy-60 (-> self root-override) (the-as float 40960.0) (the-as float 40960.0) #f (the-as uint 1))
)
)
)
(spool-push *art-control* (-> self victory-anim name) 0 self (the-as float -99.0))
(send-event *target* 'get-pickup (-> self fact pickup-type) (-> self fact pickup-amount))
(set! (-> self draw bounds w) 32768.0)
(logior! (-> self skel status) 1)
(send-event *target* 'blend-shape #t)
(push-setting! *setting-control* self 'music-volume 'rel (-> *setting-control* current music-volume-movie) 0)
(push-setting! *setting-control* self 'sfx-volume 'rel (-> *setting-control* current sfx-volume-movie) 0)
(push-setting!
*setting-control*
self
'ambient-volume
'rel
(-> *setting-control* current ambient-volume-movie)
0
)
(let ((gp-3 (get-process *default-dead-pool* othercam #x4000)))
(when gp-3
(let ((t9-26 (method-of-type othercam activate)))
(t9-26 (the-as othercam gp-3) self 'othercam (the-as pointer #x70004000))
)
(run-now-in-process gp-3 othercam-init-by-other self 10 #f #t)
(-> gp-3 ppointer)
)
)
(auto-save-command 'auto-save 0 0 *default-pool*)
(ja-play-spooled-anim
(-> self victory-anim)
(the-as art-joint-anim (-> self draw art-group data 2))
(the-as art-joint-anim #f)
(the-as (function process-drawable symbol) false-func)
)
(clear-pending-settings-from-process *setting-control* self 'music-volume)
(clear-pending-settings-from-process *setting-control* self 'sfx-volume)
(clear-pending-settings-from-process *setting-control* self 'ambient-volume)
(send-event *target* 'blend-shape #f)
(send-event *target* 'end-mode)
(send-event *camera* 'no-intro)
(send-event *camera* 'clear-entity)
(ja-channel-set! 0)
(suspend)
(suspend)
(let ((gp-4 (get-process *default-dead-pool* process #x4000)))
(when gp-4
(let ((t9-39 (method-of-type process activate)))
(t9-39 gp-4 self 'process (the-as pointer #x70004000))
)
(run-next-time-in-process
gp-4
(lambda :behavior collectable
((arg0 game-task))
(while (or
(-> *setting-control* current ambient)
(-> *setting-control* current movie)
(-> *setting-control* current hint)
(str-is-playing?)
)
(suspend)
)
(cond
((= arg0 (game-task training-buzzer))
(level-hint-spawn
(game-text-id training-assistant-found-scout-fly-cell)
"asstvb45"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task training-door))
(level-hint-spawn
(game-text-id training-eco-opened-door)
"sagevb25"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task beach-ecorocks))
(level-hint-spawn
(game-text-id beach-collectors-unblocked)
"sagevb01"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task misty-cannon))
(level-hint-spawn
(game-text-id misty-stopped-lurkers-at-silo)
"sagevb02"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task misty-bike))
(level-hint-spawn
(game-text-id misty-stopped-balloon-lurkers)
"asstvb03"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task firecanyon-end))
(level-hint-spawn
(game-text-id fire-canyon-we-made-it)
"sksp0095"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task rolling-robbers))
(level-hint-spawn
(game-text-id rolling-beat-lurkers)
"asstvb20"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task rolling-plants))
(level-hint-spawn
(game-text-id sage-golfclap-i-have-low-expectations)
"sagevb03"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task swamp-flutflut))
(level-hint-spawn
(game-text-id swamp-finished-with-flutflut)
"asstvb21"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task ogre-boss))
(level-hint-spawn
(game-text-id ogre-boss-killed)
"asstvb23"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task ogre-end))
(level-hint-spawn
(game-text-id assistant-finished-mountain-pass-race)
"asstvb25"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task beach-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task jungle-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task misty-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task firecanyon-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task rolling-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task sunken-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task swamp-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task ogre-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task cave-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task snow-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task lavatube-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task citadel-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task village1-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task village2-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= arg0 (game-task village3-buzzer))
(level-hint-spawn
(game-text-id found-all-scout-flies)
"sksp009k"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
)
(none)
)
(the int (-> self fact pickup-amount))
)
(-> gp-4 ppointer)
)
)
(case (the int (-> self fact pickup-amount))
(((game-task citadel-sage-blue))
(send-event (process-by-name "blue-sagecage-1" *active-pool*) 'play-anim)
)
(((game-task citadel-sage-red))
(send-event (process-by-name "red-sagecage-1" *active-pool*) 'play-anim)
)
(((game-task citadel-sage-yellow))
(send-event (process-by-name "yellow-sagecage-1" *active-pool*) 'play-anim)
)
(((game-task citadel-sage-green))
(send-event (process-by-name "green-sagecage-1" *active-pool*) 'play-anim)
)
(((game-task jungle-eggtop) (game-task snow-eggtop) (game-task snow-ball) (game-task sunken-slide))
)
(else
(send-event (ppointer->process (-> *hud-parts* fuel-cell)) 'show)
)
)
(convert-to-hud-object self (the-as hud (ppointer->process (-> *hud-parts* fuel-cell))))
(none)
)
:post
(behavior ()
(transform-post)
(if (-> self state-object)
(spawn (-> self part) (the-as vector (-> self root-override root-prim prim-core)))
)
(none)
)
)
(defmethod initialize fuel-cell ((obj fuel-cell))
(stack-size-set! (-> obj main-thread) 512)
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint 64))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set! (-> s4-0 transform-index) 3)
(set-vector! (-> s4-0 local-sphere) 0.0 0.0 0.0 4915.2)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> obj root-override) s5-0)
)
(logior! (-> obj mask) (process-mask actor-pause))
(set! (-> obj actor-pause) #t)
(set! (-> obj notify-parent) #f)
(set! (-> obj fact) (new 'process 'fact-info obj (pickup-type fuel-cell) (the-as float 0.0)))
(initialize-skeleton obj *fuel-cell-sg* '())
(set! (-> obj base quad) (-> obj root-override trans quad))
(set! (-> obj old-base quad) (-> obj root-override trans quad))
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 63) obj))
(set! (-> obj sound) (new
'process
'ambient-sound
(new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "powercell-idle")
:volume #x400
:fo-max 40
)
(-> obj root-override trans)
)
)
(set! (-> obj victory-anim) (fuel-cell-pick-anim obj))
obj
)
(defmethod init-from-entity! fuel-cell ((obj fuel-cell) (arg0 entity-actor))
(initialize obj)
(process-drawable-from-entity! obj (the-as entity-actor (-> obj entity)))
(initialize-params obj 0 (the-as float 1024.0))
(logclear! (-> obj fact options) (fact-options can-collect))
(dummy-47 (-> obj root-override))
(go (method-of-object obj wait))
(none)
)
(defbehavior fuel-cell-init-by-other fuel-cell ((arg0 vector) (arg1 vector) (arg2 fact-info) (arg3 entity))
(let ((s3-0 (-> arg2 pickup-type))
(f30-0 (-> arg2 pickup-spawn-amount))
)
(set! (-> self entity) arg3)
(set! (-> self pickup-type) s3-0)
(set! (-> self pickup-amount) f30-0)
(initialize self)
(set! (-> self fact pickup-type) s3-0)
(set! (-> self fact pickup-amount) f30-0)
)
(set! (-> self fact options) (-> arg2 options))
(set! (-> self notify-parent) #t)
(set! (-> self root-override trans quad) (-> arg0 quad))
(quaternion-identity! (-> self root-override quat))
(vector-identity! (-> self root-override scale))
(set! (-> self root-override transv quad) (-> arg1 quad))
(initialize-params self 0 (the-as float 1024.0))
(logclear! (-> self fact options) (fact-options can-collect))
(dummy-47 (-> self root-override))
(let ((gp-1 (res-lump-struct (-> self entity) 'movie-pos structure :time (the-as float -1000000000.0))))
(cond
((and *debug-segment* (< (-> *fuel-cell-tune-pos* w) 1000000000.0))
(set! (-> self jump-pos quad) (-> *fuel-cell-tune-pos* quad))
(set! (-> self jump-pos y) (+ 4096.0 (-> self jump-pos y)))
(go-virtual jump)
)
((and
gp-1
(zero? (logand
(the-as int (res-lump-value (-> self entity) 'options uint128 :time (the-as float -1000000000.0)))
128
)
)
(zero? (logand (-> self fact options) (fact-options fop7)))
)
(set! (-> self jump-pos quad) (-> (the-as vector gp-1) quad))
(set! (-> self jump-pos y) (+ 4096.0 (-> self jump-pos y)))
(go-virtual jump)
)
)
)
(set! (-> self event-hook) (-> (method-of-object self wait) event))
(go-virtual wait)
(none)
)
(defstate fuel-cell-clone-anim (fuel-cell)
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(case arg2
(('pickup)
(when (!= (-> self next-state name) 'pickup)
(if (and (> arg1 0) (-> arg3 param 0))
(TODO-RENAME-30 (-> self root-override) (the-as vector (-> arg3 param 0)))
)
(logclear! (-> self mask) (process-mask actor-pause))
(go-virtual pickup #f (the-as handle #f))
)
)
(('trans)
(set! (-> self root-override trans quad) (-> (the-as vector (-> arg3 param 0)) quad))
(set! (-> self base quad) (-> self root-override trans quad))
(dummy-47 (-> self root-override))
)
(('stop-cloning 'notify)
(set! (-> self root-override trans quad) (-> self draw origin quad))
(set! (-> self base quad) (-> self root-override trans quad))
(ja-channel-set! 1)
(let ((v1-20 (-> self skel root-channel 0)))
(set! (-> v1-20 frame-group) (the-as art-joint-anim (-> self draw art-group data 2)))
)
(logclear! (-> self draw status) (draw-status drwf01))
(vector-reset! (-> self draw origin))
(go-virtual wait)
)
)
)
:exit
(behavior ()
(if (-> self actor-pause)
(logior! (-> self mask) (process-mask actor-pause))
)
(set! (-> self skel status) (logand -33 (-> self skel status)))
(none)
)
:code
(behavior ((arg0 handle))
(logclear! (-> self mask) (process-mask actor-pause))
(clone-anim arg0 3 #t "")
(format #t "ERROR<GMJ>: clone-anim returned in fuel-cell~%")
(deactivate self)
(none)
)
:post
(behavior () (dummy-47 (-> self root-override)) (animate self) (none))
)
(defbehavior fuel-cell-init-as-clone fuel-cell ((arg0 handle) (arg1 int))
(initialize self)
(set! (-> self fact pickup-type) (pickup-type fuel-cell))
(set! (-> self fact pickup-amount) (the float arg1))
(initialize-params self 0 (the-as float 1024.0))
(logclear! (-> self mask) (process-mask actor-pause))
(set! (-> self actor-pause) #f)
(sound-play-by-name (static-sound-name "cell-prize") (new-sound-id) 1024 0 0 1 #t)
(go fuel-cell-clone-anim arg0)
(none)
)
(defskelgroup *buzzer-sg* buzzer
0
2
((1 (meters 999999)))
:bounds (static-spherem 0 1 0 1.6)
:longest-edge (meters 0)
:texture-level 2
)
(deftype buzzer (eco-collectable)
((victory-anim spool-anim :offset-assert 404)
)
:heap-base #x130
:method-count-assert 31
:size-assert #x198
:flag-assert #x1f01300198
)
(defmethod animate buzzer ((obj buzzer))
(quaternion-rotate-y!
(-> obj root-override quat)
(-> obj root-override quat)
(* 40049.777 (-> *display* seconds-per-frame))
)
(let ((a0-2 (-> obj skel root-channel 0)))
(set! (-> a0-2 param 0) 1.0)
(joint-control-channel-group-eval! a0-2 (the-as art-joint-anim #f) num-func-loop!)
)
(let ((f0-3 (y-angle (-> obj root-override))))
(set! (-> *part-id-table* 239 init-specs 4 initial-valuef) (+ 16384.0 f0-3))
(set! (-> *part-id-table* 240 init-specs 4 initial-valuef) (+ 16384.0 f0-3))
)
(spawn (-> obj part) (vector<-cspace! (new 'stack-no-clear 'vector) (-> obj node-list data 15)))
(if (nonzero? (-> obj sound))
(update! (-> obj sound))
)
(if (and *target* (>= (-> *target* fact-info-target buzzer) 6.0))
(spool-push *art-control* (-> obj victory-anim name) 0 obj (the-as float -99.0))
)
0
(none)
)
(defstate wait (buzzer)
:virtual #t
:code
(behavior ()
(case (get-reminder (get-task-control (the-as game-task (logand (the int (-> self fact pickup-amount)) #xffff))) 0)
((127)
(go-virtual pickup #t (the-as handle #f))
)
)
(while #t
(transform-post)
(animate self)
(suspend)
)
(none)
)
)
(defstate pickup (buzzer)
:virtual #t
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(let ((v1-0 arg2))
(the-as object (if (= v1-0 'notify)
(process-entity-status! self (entity-perm-status dead) #t)
)
)
)
)
:enter
(behavior ((arg0 object) (arg1 handle))
(set! (-> self pickup-handle) arg1)
(logclear! (-> self mask) (process-mask actor-pause))
(none)
)
:code
(behavior ((arg0 object) (arg1 handle))
(logclear! (-> self mask) (process-mask actor-pause))
(process-entity-status! self (entity-perm-status complete) #t)
(sound-play-by-name (static-sound-name "buzzer-pickup") (new-sound-id) 1024 0 0 1 #t)
(case (-> (level-get-target-inside *level*) name)
(('training)
(level-hint-spawn
(game-text-id training-assistant-found-scout-fly)
"asstvb44"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
(('firecanyon)
(level-hint-spawn
(game-text-id collectables-theres-scout-flys-here-too)
"sksp0096"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
(else
(level-hint-spawn
(game-text-id collectables-scout-flies-red-boxes)
"sksp009j"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
)
(ja-channel-set! 0)
(clear-collide-with-as (-> self root-override))
(if (nonzero? (-> self sound))
(stop! (-> self sound))
)
(when (not arg0)
(let* ((s5-1 (get-process *default-dead-pool* manipy #x4000))
(v1-18 (when s5-1
(let ((t9-11 (method-of-type manipy activate)))
(t9-11 (the-as manipy s5-1) *entity-pool* 'manipy (the-as pointer #x70004000))
)
(run-now-in-process s5-1 manipy-init (-> self root-override trans) #f *buzzer-sg* #f)
(-> s5-1 ppointer)
)
)
)
(send-event (ppointer->process v1-18) 'become-hud-object (ppointer->process (-> *hud-parts* buzzers)))
)
)
(let* ((s5-2 (logand (the int (-> self fact pickup-amount)) #xffff))
(s4-1 (get-task-control (the-as game-task s5-2)))
)
(if (nonzero? s5-2)
(close-specific-task! (the-as game-task s5-2) (task-status need-hint))
)
(when (and
(= (get-reminder s4-1 0) 127)
(and (-> self entity) (not (task-complete? *game-info* (the-as game-task s5-2))))
)
(if (and *target* (logtest? (-> *target* control root-prim prim-core action) #x7200) (not arg0))
(logior! (-> self fact options) (fact-options fop6 fop7))
)
(let ((v1-47
(birth-pickup-at-point
(vector+! (new 'stack-no-clear 'vector) (-> self root-override trans) (new 'static 'vector :y 4096.0 :w 1.0))
(pickup-type fuel-cell)
(the float s5-2)
#f
self
(-> self fact)
)
)
)
(when v1-47
(send-event (ppointer->process v1-47) 'movie-pos (-> self movie-pos-index))
(ja-channel-set! 0)
(clear-collide-with-as (-> self root-override))
(ja-post)
(while (-> self child)
(suspend)
)
)
)
)
)
(when (-> self notify-parent)
(let ((gp-1 (new 'stack-no-clear 'event-message-block)))
(set! (-> gp-1 from) self)
(set! (-> gp-1 num-params) 1)
(set! (-> gp-1 message) 'notify)
(set! (-> gp-1 param 0) (the-as uint 'pickup))
(let ((s5-3 send-event-function)
(s4-2 (ppointer->process (-> self parent)))
)
(s5-3
(if (and (nonzero? s4-2) (type-type? (-> s4-2 type) process))
s4-2
)
gp-1
)
)
)
)
(none)
)
)
(defmethod initialize buzzer ((obj buzzer))
(let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-sphere s5-0 (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint #x8040))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set-vector! (-> s4-0 local-sphere) 0.0 2457.6 0.0 4915.2)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> obj root-override) s5-0)
)
(logior! (-> obj mask) (process-mask actor-pause))
(set! (-> obj actor-pause) #t)
(set! (-> obj notify-parent) #f)
(set! (-> obj fact) (new 'process 'fact-info obj (pickup-type buzzer) (the-as float 0.0)))
(initialize-skeleton obj *buzzer-sg* '())
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 65) obj))
(set! (-> obj sound) (new
'process
'ambient-sound
(new 'static 'sound-spec
:mask #x80
:num 1.0
:group #x1
:sound-name (static-sound-name "buzzer")
:volume #x400
:fo-max 40
)
(-> obj root-override trans)
)
)
(set! (-> obj victory-anim) (fuel-cell-pick-anim obj))
obj
)
(defmethod init-from-entity! buzzer ((obj buzzer) (arg0 entity-actor))
(initialize obj)
(process-drawable-from-entity! obj (the-as entity-actor (-> obj entity)))
(initialize-params obj 0 (the-as float 1024.0))
(set! (-> obj collect-timeout) 600)
(dummy-47 (-> obj root-override))
(update-trans! (-> obj sound) (-> obj root-override trans))
(if (and (-> obj entity) (logtest? (-> obj entity extra perm status) (entity-perm-status complete)))
(go (method-of-object obj wait))
(go (method-of-object obj pickup) #t (the-as handle #f))
)
(none)
)
(defbehavior buzzer-init-by-other buzzer ((arg0 vector) (arg1 vector) (arg2 fact-info) (arg3 entity))
(let ((s3-0 (-> arg2 pickup-type))
(f30-0 (-> arg2 pickup-spawn-amount))
)
(set! (-> self entity) arg3)
(set! (-> self pickup-type) s3-0)
(set! (-> self pickup-amount) f30-0)
(initialize self)
(set! (-> self fact pickup-type) s3-0)
(set! (-> self fact pickup-amount) f30-0)
)
(set! (-> self fact options) (-> arg2 options))
(set! (-> self notify-parent) #t)
(set! (-> self root-override trans quad) (-> arg0 quad))
(quaternion-identity! (-> self root-override quat))
(vector-identity! (-> self root-override scale))
(set! (-> self root-override transv quad) (-> arg1 quad))
(initialize-params self 0 (the-as float 1024.0))
(dummy-47 (-> self root-override))
(update-trans! (-> self sound) (-> self root-override trans))
(set! (-> self event-hook) (-> (method-of-object self wait) event))
(go-virtual wait)
(none)
)
(defmethod init-from-entity! eco ((obj eco) (arg0 entity-actor))
(let ((v1-2 (res-lump-value (-> obj entity) 'eco-info pickup-type :time (the-as float -1000000000.0))))
(set! (-> obj type) (cond
((= v1-2 (pickup-type eco-blue))
eco-blue
)
((= v1-2 (pickup-type eco-red))
eco-red
)
((= v1-2 (pickup-type eco-yellow))
eco-yellow
)
((= v1-2 (pickup-type eco-green))
health
)
((= v1-2 (pickup-type money))
money
)
((= v1-2 (pickup-type fuel-cell))
fuel-cell
)
((= v1-2 (pickup-type buzzer))
buzzer
)
(else
eco-pill
)
)
)
)
(init-from-entity! obj arg0)
(none)
)
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 190]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 221]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 252]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 284]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 320]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 356]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 363]
;; WARN: rewrite_to_get_var got a none typed variable. Is there unreachable code? [OP: 122]
(defbehavior birth-pickup-at-point process ((arg0 vector) (arg1 pickup-type) (arg2 float) (arg3 symbol) (arg4 process-drawable) (arg5 fact-info))
(local-vars
(v1-2 basic)
(v1-28 symbol)
(v1-34 symbol)
(v1-40 symbol)
(v1-46 symbol)
(v1-52 symbol)
(v1-58 symbol)
(v1-64 symbol)
(v1-71 symbol)
(sv-32 fact-info)
(sv-48 int)
(sv-64 process)
(sv-80 process)
(sv-96 process)
(sv-112 process)
(sv-128 process)
(sv-144 process)
(sv-160 process)
(sv-176 process)
(sv-192 (pointer process))
)
(set! sv-32 arg5)
(let ((s1-0 (new-stack-vector0))
(t9-0 (method-of-type res-lump get-property-value-float))
)
(let ((v1-1 sv-32))
(b! (not v1-1) cfg-3 :likely-delay (set! v1-2 sv-32))
)
(set! v1-2 (nonzero? (-> sv-32 process)))
(label cfg-3)
(let ((f30-0 (t9-0
(if v1-2
(-> sv-32 process entity)
)
'pickup-radius
'interp
(the-as float -1000000000.0)
(the-as float (cond
((= arg1 (pickup-type buzzer))
0.0
)
((= arg2 1.0)
409.6
)
(else
8192.0
)
)
)
(the-as (pointer res-tag) #f)
*res-static-buf*
)
)
)
(set! sv-192 (the-as (pointer process) #f))
(set! sv-48 (the int arg2))
(let ((s0-0 (new 'static 'fact-info)))
(set! (-> s0-0 options) (fact-options))
(if sv-32
(mem-copy! (&-> s0-0 type) (&-> sv-32 type) 40)
)
(set! (-> s0-0 pickup-type) arg1)
(set! (-> s0-0 pickup-spawn-amount) 1.0)
(while (> sv-48 0)
(set! sv-48 (+ sv-48 -1))
(when arg3
(set-vector! s1-0 0.0 57001.605 f30-0 1.0)
(vector-rotate-around-y! s1-0 s1-0 (/ (* 65536.0 (the float sv-48)) arg2))
)
(let ((v1-25 arg1))
(cond
((= v1-25 (pickup-type eco-yellow))
(set! sv-64 (get-process *pickup-dead-pool* eco-yellow #x4000))
(set! v1-28 (when sv-64
(set! sv-192 (the-as (pointer process) v1-28))
(let ((t9-4 (method-of-type eco-yellow activate)))
(t9-4 (the-as eco-yellow sv-64) arg4 'eco-yellow (the-as pointer #x70004000))
)
(run-now-in-process sv-64 initialize-eco-by-other arg0 s1-0 s0-0)
(set! sv-192 (-> sv-64 ppointer))
v1-28
)
)
sv-192
)
((= v1-25 (pickup-type eco-red))
(set! sv-80 (get-process *pickup-dead-pool* eco-red #x4000))
(set! v1-34 (when sv-80
(set! sv-192 (the-as (pointer process) v1-34))
(let ((t9-7 (method-of-type eco-red activate)))
(t9-7 (the-as eco-red sv-80) arg4 'eco-red (the-as pointer #x70004000))
)
(run-now-in-process sv-80 initialize-eco-by-other arg0 s1-0 s0-0)
(set! sv-192 (-> sv-80 ppointer))
v1-34
)
)
(level-hint-spawn
(game-text-id sidekick-hint-misty-get-red-eco)
"sksp0071"
(the-as entity #f)
*entity-pool*
(game-task none)
)
)
((= v1-25 (pickup-type eco-blue))
(set! sv-96 (get-process *pickup-dead-pool* eco-blue #x4000))
(set! v1-40 (when sv-96
(set! sv-192 (the-as (pointer process) v1-40))
(let ((t9-11 (method-of-type eco-blue activate)))
(t9-11 (the-as eco-blue sv-96) arg4 'eco-blue (the-as pointer #x70004000))
)
(run-now-in-process sv-96 initialize-eco-by-other arg0 s1-0 s0-0)
(set! sv-192 (-> sv-96 ppointer))
v1-40
)
)
sv-192
)
((= v1-25 (pickup-type eco-green))
(set! sv-112 (get-process *pickup-dead-pool* health #x4000))
(set! v1-46 (when sv-112
(set! sv-192 (the-as (pointer process) v1-46))
(let ((t9-14 (method-of-type health activate)))
(t9-14 (the-as health sv-112) arg4 'health (the-as pointer #x70004000))
)
(run-now-in-process sv-112 initialize-eco-by-other arg0 s1-0 s0-0)
(set! sv-192 (-> sv-112 ppointer))
v1-46
)
)
sv-192
)
((= v1-25 (pickup-type eco-pill))
(set! sv-128 (get-process *pickup-dead-pool* eco-pill #x4000))
(set! v1-52 (when sv-128
(set! sv-192 (the-as (pointer process) v1-52))
(let ((t9-17 (method-of-type eco-pill activate)))
(t9-17 (the-as eco-pill sv-128) arg4 'eco-pill (the-as pointer #x70004000))
)
(run-now-in-process sv-128 initialize-eco-by-other arg0 s1-0 s0-0)
(set! sv-192 (-> sv-128 ppointer))
v1-52
)
)
sv-192
)
((= v1-25 (pickup-type money))
(set! sv-144 (get-process *pickup-dead-pool* money #x4000))
(set! v1-58 (when sv-144
(set! sv-192 (the-as (pointer process) v1-58))
(let ((t9-20 (method-of-type money activate)))
(t9-20 (the-as money sv-144) arg4 'money (the-as pointer #x70004000))
)
(run-now-in-process sv-144 money-init-by-other arg0 s1-0 s0-0 (-> self entity))
(set! sv-192 (-> sv-144 ppointer))
v1-58
)
)
sv-192
)
((= v1-25 (pickup-type fuel-cell))
(set! (-> s0-0 pickup-spawn-amount) arg2)
(set! sv-160 (get-process *pickup-dead-pool* fuel-cell #x4000))
(set! v1-64 (when sv-160
(set! sv-192 (the-as (pointer process) v1-64))
(let ((t9-23 (method-of-type fuel-cell activate)))
(t9-23 (the-as fuel-cell sv-160) arg4 'fuel-cell (the-as pointer #x70004000))
)
(run-now-in-process sv-160 fuel-cell-init-by-other arg0 s1-0 s0-0 (-> self entity))
(set! sv-192 (-> sv-160 ppointer))
v1-64
)
)
(set! sv-48 0)
sv-48
)
((= v1-25 (pickup-type buzzer))
(set! (-> s0-0 pickup-spawn-amount) arg2)
(set! sv-176 (get-process *pickup-dead-pool* buzzer #x4000))
(set! v1-71 (when sv-176
(set! sv-192 (the-as (pointer process) v1-71))
(let ((t9-26 (method-of-type buzzer activate)))
(t9-26 (the-as buzzer sv-176) arg4 'buzzer (the-as pointer #x70004000))
)
(run-now-in-process sv-176 buzzer-init-by-other arg0 s1-0 s0-0 (-> self entity))
(set! sv-192 (-> sv-176 ppointer))
v1-71
)
)
(set! sv-48 0)
sv-48
)
(else
(format 0 "ERROR: unknown type of eco ~d~%" arg1)
#f
)
)
)
)
)
)
)
sv-192
)
(defmethod drop-pickup fact-info ((obj fact-info) (arg0 symbol) (arg1 process-tree) (arg2 fact-info) (arg3 int))
(let ((s3-0 (-> obj pickup-type))
(f30-0 (-> obj pickup-amount))
)
(when (= s3-0 (pickup-type eco-pill-random))
f30-0
(let ((s1-0 (get-death-count *game-info* #f)))
(set! s3-0 (pickup-type eco-pill))
(set! f30-0 (cond
((and
(= s1-0 1)
*target*
(and (>= 1.0 (-> *target* fact-info-target health)) (rand-vu-percent? (the-as float 0.1)))
)
(set! s3-0 (pickup-type eco-green))
1.0
)
((and
(< 1 s1-0)
*target*
(and (>= 2.0 (-> *target* fact-info-target health)) (rand-vu-percent? (the-as float 0.05)))
)
(set! s3-0 (pickup-type eco-green))
1.0
)
((< 20 *eco-pill-count*)
(return (the-as (pointer process) #f))
f30-0
)
((< 10 *eco-pill-count*)
1.0
)
((type-type? (-> obj type) fact-info-enemy)
(+ (rand-vu-float-range (the-as float 3.0) (+ 5.0 f30-0)) (the float arg3))
)
(else
(+ (rand-vu-float-range (the-as float 2.0) (+ 3.0 f30-0)) (the float arg3))
)
)
)
)
)
(let ((s2-1 (new 'stack-no-clear 'vector)))
(set! (-> s2-1 quad) (-> obj process root trans quad))
(set! (-> s2-1 y) (+ 12288.0 (-> s2-1 y)))
(let ((s1-1 (new 'stack-no-clear 'collide-tri-result)))
(if (>= (fill-and-probe-using-y-probe
*collide-cache*
s2-1
(the-as float 81920.0)
(the-as uint 1)
(the-as process #f)
s1-1
(the-as uint 1)
)
0.0
)
(set! (-> s2-1 quad) (-> s1-1 intersect quad))
(set! (-> s2-1 quad) (-> obj process root trans quad))
)
)
(if (= (the-as int s3-0) 6)
(set! (-> s2-1 y) (+ 6144.0 (-> s2-1 y)))
)
(birth-pickup-at-point s2-1 (the-as pickup-type s3-0) f30-0 arg0 (the-as process-drawable arg1) obj)
)
)
)
(deftype ecovalve (process-drawable)
((root-override collide-shape-moving :offset 112)
(offset vector :inline :offset-assert 176)
(offset-target vector :inline :offset-assert 192)
(block-func (function vent symbol) :offset-assert 208)
)
:heap-base #x70
:method-count-assert 20
:size-assert #xd4
:flag-assert #x14007000d4
)
(defskelgroup *ecovalve-sg* ecovalve
0
2
((1 (meters 999999)))
:bounds (static-spherem 0 1 0 1.6)
:longest-edge (meters 0)
:texture-level 2
)
(defstate ecovalve-idle (ecovalve)
:code
(behavior ()
(transform-post)
(suspend)
(transform-post)
(while #t
(if (not ((-> self block-func) (the-as vent (ppointer->process (-> self parent)))))
(set-vector! (-> self offset-target) 0.0 0.0 0.0 1.0)
)
(when (!= (-> self offset-target y) (-> self offset y))
(vector-seek! (-> self offset) (-> self offset-target) (* 4096.0 (-> *display* seconds-per-frame)))
(TODO-RENAME-30 (-> self root-override) (vector+!
(new 'stack-no-clear 'vector)
(-> (the-as process-drawable (-> self parent 0)) root trans)
(-> self offset)
)
)
(transform-post)
)
(suspend)
)
(none)
)
)
(defbehavior ecovalve-init-by-other ecovalve ((arg0 (function vent symbol)))
(stack-size-set! (-> self main-thread) 128)
(let ((s5-0 (new 'process 'collide-shape-moving self (collide-list-enum hit-by-player))))
(set! (-> s5-0 dynam) (copy *standard-dynamics* 'process))
(set! (-> s5-0 reaction) default-collision-reaction)
(set! (-> s5-0 no-reaction)
(the-as (function collide-shape-moving collide-shape-intersect vector vector none) nothing)
)
(let ((s4-0 (new 'process 'collide-shape-prim-mesh s5-0 (the-as uint 0) (the-as uint 0))))
(set! (-> s4-0 prim-core collide-as) (the-as uint 256))
(set! (-> s4-0 collide-with) (the-as uint 16))
(set! (-> s4-0 prim-core action) (the-as uint 1))
(set! (-> s4-0 prim-core offense) 1)
(set! (-> s4-0 transform-index) 3)
(set-vector! (-> s4-0 local-sphere) 0.0 3686.4 0.0 6144.0)
(set-root-prim! s5-0 s4-0)
)
(set! (-> s5-0 nav-radius) (* 0.75 (-> s5-0 root-prim local-sphere w)))
(backup-collide-with-as s5-0)
(set! (-> self root-override) s5-0)
)
(if (and *target* (logtest? (-> *target* control root-prim prim-core action) 512))
(clear-collide-with-as (-> self root-override))
)
(set! (-> self block-func) arg0)
(set! (-> self root-override trans quad) (-> (the-as process-drawable (-> self parent 0)) root trans quad))
(set-vector! (-> self offset-target) 0.0 -2252.8 0.0 1.0)
(if (not ((-> self block-func) (the-as vent (ppointer->process (-> self parent)))))
(set-vector! (-> self offset-target) 0.0 0.0 0.0 1.0)
)
(set! (-> self offset quad) (-> self offset-target quad))
(initialize-skeleton self *ecovalve-sg* '())
(TODO-RENAME-30 (-> self root-override) (vector+!
(new 'stack-no-clear 'vector)
(-> (the-as process-drawable (-> self parent 0)) root trans)
(-> self offset)
)
)
(go ecovalve-idle)
(none)
)
(deftype vent (process-drawable)
((root-override collide-shape :offset 112)
(show-particles symbol :offset-assert 176)
(collect-effect sparticle-launch-group :offset-assert 180)
(collect-effect2 sparticle-launch-group :offset-assert 184)
(collect-effect-time uint64 :offset-assert 192)
(blocker entity-actor :offset-assert 200)
(block-func (function vent symbol) :offset-assert 204)
(pickup-handle handle :offset-assert 208)
)
:heap-base #x70
:method-count-assert 21
:size-assert #xd8
:flag-assert #x15007000d8
(:methods
(initialize (_type_ entity-actor pickup-type) none 20)
)
(:states
vent-blocked
(vent-pickup handle)
vent-wait-for-touch
)
)
(defmethod initialize vent ((obj vent) (arg0 entity-actor) (arg1 pickup-type))
(stack-size-set! (-> obj main-thread) 128)
(logior! (-> obj mask) (process-mask actor-pause))
(let ((s3-0 (new 'process 'collide-shape obj (collide-list-enum hit-by-player))))
(let ((s2-0 (new 'process 'collide-shape-prim-sphere s3-0 (the-as uint 0))))
(set! (-> s2-0 prim-core collide-as) (the-as uint 64))
(set! (-> s2-0 collide-with) (the-as uint 16))
(set-vector! (-> s2-0 local-sphere) 0.0 4915.2 0.0 6553.6)
(set-root-prim! s3-0 s2-0)
)
(set! (-> s3-0 nav-radius) (* 0.75 (-> s3-0 root-prim local-sphere w)))
(backup-collide-with-as s3-0)
(set! (-> obj root-override) s3-0)
)
(set! (-> obj root-override trans quad) (-> arg0 extra trans quad))
(dummy-47 (-> obj root-override))
(set! (-> obj root-override pause-adjust-distance) 409600.0)
(set! (-> obj fact) (new 'process 'fact-info obj arg1 (-> *FACT-bank* eco-full-inc)))
(set! (-> obj block-func) (the-as (function vent symbol) true-func))
(case (-> obj fact pickup-type)
(((pickup-type eco-blue))
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 44) obj))
(set! (-> obj collect-effect) (-> *part-group-id-table* 67))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 43))
(set! (-> obj sound) (new 'process 'ambient-sound 'eco-bg-blue (-> obj root-override trans)))
)
(((pickup-type eco-red))
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 50) obj))
(set! (-> obj collect-effect) (-> *part-group-id-table* 69))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 49))
(set! (-> obj sound) (new 'process 'ambient-sound 'eco-bg-red (-> obj root-override trans)))
)
(((pickup-type eco-green))
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 62) obj))
(set! (-> obj collect-effect) (-> *part-group-id-table* 66))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 61))
(set! (-> obj sound) (new 'process 'ambient-sound 'eco-bg-green (-> obj root-override trans)))
)
(((pickup-type eco-yellow))
(set! (-> obj part) (create-launch-control (-> *part-group-id-table* 52) obj))
(set! (-> obj collect-effect) (-> *part-group-id-table* 68))
(set! (-> obj collect-effect2) (-> *part-group-id-table* 57))
(set! (-> obj sound) (new 'process 'ambient-sound 'eco-bg-yellow (-> obj root-override trans)))
)
)
(set! (-> obj blocker) (entity-actor-lookup (-> obj entity) 'alt-actor 0))
(when (-> obj blocker)
(logior! (-> obj fact options) (fact-options vent-blocked))
(set! (-> obj block-func)
(lambda ((arg0 vent)) (zero? (logand (-> arg0 blocker extra perm status) (entity-perm-status complete))))
)
)
(set! (-> obj show-particles) #t)
(when (logtest? (-> obj fact options) (fact-options vent-blocked))
(when (logtest? (-> obj fact options) (fact-options vent-valve))
(case (-> obj fact pickup-type)
(((pickup-type eco-blue))
(set! (-> obj block-func)
(the-as (function vent symbol) (lambda () (not (task-complete? *game-info* (game-task jungle-eggtop)))))
)
)
(((pickup-type eco-red))
(set! (-> obj block-func)
(the-as (function vent symbol) (lambda () (not (task-complete? *game-info* (game-task red-eggtop)))))
)
)
(((pickup-type eco-yellow))
(set! (-> obj block-func)
(the-as (function vent symbol) (lambda () (not (task-complete? *game-info* (game-task snow-eggtop)))))
)
)
)
(let ((s5-1 (get-process *pickup-dead-pool* ecovalve #x4000)))
(when s5-1
(let ((t9-17 (method-of-type ecovalve activate)))
(t9-17 (the-as ecovalve s5-1) obj 'ecovalve (the-as pointer #x70004000))
)
(run-now-in-process s5-1 ecovalve-init-by-other (-> obj block-func))
(-> s5-1 ppointer)
)
)
)
(if ((-> obj block-func) obj)
(go vent-blocked)
)
)
(go vent-wait-for-touch)
(none)
)
(defbehavior vent-standard-event-handler vent ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(case arg2
(('show-particles)
(let ((v0-0 (the-as object (-> arg3 param 0))))
(set! (-> self show-particles) (the-as symbol v0-0))
v0-0
)
)
(('hide)
(set! (-> self block-func) (the-as (function vent symbol) true-func))
(go vent-blocked)
)
)
)
(defstate vent-wait-for-touch (vent)
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
(if (and
(or (= arg2 'touch) (= arg2 'attack))
(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) 'get-pickup)
(set! (-> a1-1 param 0) (the-as uint (-> self fact pickup-type)))
(set! (-> a1-1 param 1) (the-as uint (-> self fact pickup-amount)))
(and
(= (send-event-function arg0 a1-1) #t)
(or (logtest? (-> self fact options) (fact-options powerup)) (send-event arg0 'powerup))
)
)
)
(go vent-pickup (process->handle arg0))
)
(vent-standard-event-handler arg0 arg1 arg2 arg3)
)
:code
(behavior ()
(while #t
(let ((a0-0 (-> self part))
(a1-0 (-> self root-override trans))
(gp-0 (-> self sound))
)
(if (and (nonzero? a0-0) (-> self show-particles))
(spawn a0-0 a1-0)
)
(if (nonzero? gp-0)
(update! gp-0)
)
)
(suspend)
)
(none)
)
)
(defstate vent-blocked (vent)
:event
(behavior ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block)) (case arg2
(('show)
(go vent-wait-for-touch)
)
)
)
:code
(behavior ()
(while #t
(if (not ((-> self block-func) self))
(go vent-wait-for-touch)
)
(suspend)
)
(none)
)
)
(defstate vent-pickup (vent)
:event
vent-standard-event-handler
:code
(behavior ((arg0 handle))
(when (-> self show-particles)
(when (nonzero? (-> self collect-effect))
(let* ((s5-0 (handle->process arg0))
(gp-0 (if (and (nonzero? s5-0) (type-type? (-> s5-0 type) process-drawable))
s5-0
)
)
)
(when gp-0
(let* ((s4-0 (-> (the-as process-drawable gp-0) root))
(s5-1 (if (and (nonzero? s4-0) (type-type? (-> s4-0 type) collide-shape))
s4-0
)
)
)
(when s5-1
(let ((s4-1 (get-process *default-dead-pool* part-tracker #x4000)))
(when s4-1
(let ((t9-3 (method-of-type part-tracker activate)))
(t9-3 (the-as part-tracker s4-1) gp-0 'part-tracker (the-as pointer #x70004000))
)
(run-now-in-process
s4-1
part-tracker-init
(-> self collect-effect)
-1
part-tracker-track-target
#f
#f
(-> (the-as collide-shape s5-1) root-prim prim-core)
)
(-> s4-1 ppointer)
)
)
(let ((gp-1 (get-process *default-dead-pool* part-tracker #x4000)))
(when gp-1
(let ((t9-6 (method-of-type part-tracker activate)))
(t9-6 (the-as part-tracker gp-1) self 'part-tracker (the-as pointer #x70004000))
)
(run-now-in-process
gp-1
part-tracker-init
(-> self collect-effect2)
-1
part-tracker-move-to-target
#f
#f
(-> self root-override root-prim prim-core)
)
(-> gp-1 ppointer)
)
)
)
)
)
)
)
)
(go vent-wait-for-touch)
(none)
)
)
(deftype ventyellow (vent)
()
:heap-base #x70
:method-count-assert 21
:size-assert #xd8
:flag-assert #x15007000d8
)
(defmethod init-from-entity! ventyellow ((obj ventyellow) (arg0 entity-actor))
(initialize obj arg0 (pickup-type eco-yellow))
(none)
)
(deftype ventred (vent)
()
:heap-base #x70
:method-count-assert 21
:size-assert #xd8
:flag-assert #x15007000d8
)
(defmethod init-from-entity! ventred ((obj ventred) (arg0 entity-actor))
(initialize obj arg0 (pickup-type eco-red))
(none)
)
(deftype ventblue (vent)
()
:heap-base #x70
:method-count-assert 21
:size-assert #xd8
:flag-assert #x15007000d8
)
(defmethod init-from-entity! ventblue ((obj ventblue) (arg0 entity-actor))
(initialize obj arg0 (pickup-type eco-blue))
(none)
)
(deftype ecovent (vent)
()
:heap-base #x70
:method-count-assert 21
:size-assert #xd8
:flag-assert #x15007000d8
)
(defmethod init-from-entity! ecovent ((obj ecovent) (arg0 entity-actor))
(initialize obj arg0 (pickup-type eco-blue))
(none)
)