jak-project/goal_src/engine/game/collectables.gc
ManDude 25b0e1be7d
[decomp] collectables + works ingame! (#971)
* decomp: `collectables`

* fix types

* `powerups` and fixes

* fixes

* Merge branch 'pr/929' into d/temp/collectables

* fix collide stuff

* update things...

* update

* update

* temp bump global heap mem

* fix `defstate` hooks wrong/unnecessary sets & collide stuff for collectables

* dumb mistakes :)

* stub out broken process-drawable stuff

* update refs

* add `:no-inspect` key and save some memory & remove birth logs

* Update kmachine.h

* clang

* add citadel

* fix no-inspect key

* fix tests!!

* fix stupid mistake in `collide-shape-prim-sphere` alloc

* comment annoying print

* feedback

* fix edge-case probably

* remove `:no-inspect`s
2021-11-23 18:25:57 -05:00

4303 lines
118 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) 8)
(>=
(+
(-> *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) 16))
)
)
)
(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) 6)
(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) 32)
(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))
(set! (-> self draw status) (logand -3 (-> self draw status)))
(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))
)
)
(set! (-> self draw status) (logand -3 (-> self draw status)))
(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
)
;; WARN: Expression building failed: Function (method 9 fact-info) has a return type of none, but the expression builder found a return statement.
(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 #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
)
)
)
(none)
)
(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)
)