mirror of
https://github.com/open-goal/jak-project
synced 2026-05-26 23:47:57 -04:00
cd68cb671e
Major change to how `deftype` shows up in our code: - the decompiler will no longer emit the `offset-assert`, `method-count-assert`, `size-assert` and `flag-assert` parameters. There are extremely few cases where having this in the decompiled code is helpful, as the types there come from `all-types` which already has those parameters. This also doesn't break type consistency because: - the asserts aren't compared. - the first step of the test uses `all-types`, which has the asserts, which will throw an error if they're bad. - the decompiler won't emit the `heap-base` parameter unless necessary now. - the decompiler will try its hardest to turn a fixed-offset field into an `overlay-at` field. It falls back to the old offset if all else fails. - `overlay-at` now supports field "dereferencing" to specify the offset that's within a field that's a structure, e.g.: ```lisp (deftype foobar (structure) ((vec vector :inline) (flags int32 :overlay-at (-> vec w)) ) ) ``` in this structure, the offset of `flags` will be 12 because that is the final offset of `vec`'s `w` field within this structure. - **removed ID from all method declarations.** IDs are only ever automatically assigned now. Fixes #3068. - added an `:overlay` parameter to method declarations, in order to declare a new method that goes on top of a previously-defined method. Syntax is `:overlay <method-name>`. Please do not ever use this. - added `state-methods` list parameter. This lets you quickly specify a list of states to be put in the method table. Same syntax as the `states` list parameter. The decompiler will try to put as many states in this as it can without messing with the method ID order. Also changes `defmethod` to make the first type definition (before the arguments) optional. The type can now be inferred from the first argument. Fixes #3093. --------- Co-authored-by: Hat Kid <6624576+Hat-Kid@users.noreply.github.com>
2371 lines
81 KiB
Common Lisp
2371 lines
81 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: task-control.gc
|
|
;; name in dgo: task-control
|
|
;; dgos: ENGINE, GAME
|
|
|
|
(defenum fail-mission-flags
|
|
:bitfield #t
|
|
:type uint8
|
|
(famflags-0)
|
|
(famflags-1)
|
|
(famflags-2)
|
|
(famflags-3)
|
|
(famflags-4)
|
|
(famflags-5)
|
|
(famflags-6)
|
|
(famflags-7)
|
|
)
|
|
|
|
(defenum fail-mission-message
|
|
:type uint8
|
|
(fammsg-0)
|
|
(fammsg-1)
|
|
(fammsg-2)
|
|
(fammsg-3)
|
|
(fammsg-4)
|
|
(fammsg-5)
|
|
)
|
|
|
|
(declare-type fail-mission process)
|
|
|
|
;; DECOMP BEGINS
|
|
|
|
(deftype fail-mission-params (structure)
|
|
((message fail-mission-message)
|
|
(flags fail-mission-flags)
|
|
(retry-continue string)
|
|
(fail-continue string)
|
|
(reset-delay uint32)
|
|
(task game-task)
|
|
(fail-message text-id)
|
|
)
|
|
)
|
|
|
|
|
|
(deftype fail-mission-control (basic)
|
|
((process handle)
|
|
(handle-init-hack pointer :overlay-at process)
|
|
)
|
|
(:methods
|
|
(reset? (_type_) symbol)
|
|
(get-proc (_type_) fail-mission)
|
|
(start! (_type_ fail-mission-params) symbol)
|
|
(reset! (_type_) object)
|
|
)
|
|
)
|
|
|
|
|
|
(define *fail-mission-control* (new 'static 'fail-mission-control :handle-init-hack #f))
|
|
|
|
(defun game-task-node->string ((arg0 game-task-node))
|
|
(-> *game-info* sub-task-list arg0 name)
|
|
)
|
|
|
|
(defun update-task-masks ((arg0 symbol))
|
|
(if (= arg0 'none)
|
|
(return 0)
|
|
)
|
|
(cond
|
|
((or (= arg0 'debug) (= arg0 'level))
|
|
)
|
|
((logtest? (-> *game-info* secrets) (game-secrets hero-mode))
|
|
(set! (-> *game-info* features) (game-feature gun gun-yellow gun-red gun-blue gun-dark))
|
|
)
|
|
(else
|
|
(set! (-> *game-info* features) (game-feature))
|
|
0
|
|
)
|
|
)
|
|
(let ((s5-0 (the-as connection-pers (-> *minimap* engine alive-list))))
|
|
(while s5-0
|
|
(let ((s4-0 (the-as connection-minimap s5-0)))
|
|
(if (and (logtest? (-> s4-0 flags) (minimap-flag task-graph))
|
|
(not (open? (-> *game-info* sub-task-list (-> s4-0 node))))
|
|
)
|
|
(logior! (-> s4-0 flags) (minimap-flag fade-out))
|
|
)
|
|
)
|
|
(set! s5-0 (-> s5-0 next))
|
|
)
|
|
)
|
|
(let ((borrow-eval (lambda ((arg0 pair))
|
|
(let ((a0-1 (car arg0)))
|
|
(while (not (null? arg0))
|
|
(let* ((v1-0 (car a0-1))
|
|
(s5-0 (/ (the-as int (car (cdr a0-1))) 8))
|
|
(s4-0 (car (cdr (cdr a0-1))))
|
|
(s3-0 (car (cdr (cdr (cdr a0-1)))))
|
|
(s2-0 (-> (the-as symbol v1-0) value))
|
|
(v1-1 (if (type? s2-0 level-load-info)
|
|
(the-as level-load-info s2-0)
|
|
)
|
|
)
|
|
)
|
|
(when v1-1
|
|
(set! (-> v1-1 borrow-level s5-0) (the-as symbol s4-0))
|
|
(set! (-> v1-1 borrow-display? s5-0) (the-as symbol s3-0))
|
|
)
|
|
)
|
|
(set! arg0 (cdr arg0))
|
|
(set! a0-1 (car arg0))
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
(borrow-eval (-> *game-info* sub-task-list (game-task-node fortress-escape-start) borrow))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(case arg0
|
|
(('debug 'level)
|
|
)
|
|
(else
|
|
(if (logtest? (-> node flags) (game-task-node-flag closed))
|
|
(eval-add node)
|
|
)
|
|
)
|
|
)
|
|
(let ((node-open? (open? node)))
|
|
(if (and (logtest? (-> node flags) (game-task-node-flag task-manager))
|
|
(and (-> node info) (or node-open? (and (logtest? (-> node flags) (game-task-node-flag closed))
|
|
(not (task-node-closed? (-> node info final-node)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(script-eval '(task-manager) :key node)
|
|
)
|
|
(when node-open?
|
|
(if (-> node on-open)
|
|
(script-eval (-> node on-open) :key node)
|
|
)
|
|
(when (-> node when-open)
|
|
(countdown (node-ev-i (-> node when-open length))
|
|
(let ((node-open-ev (-> node when-open node-ev-i)))
|
|
(case (-> node-open-ev actor)
|
|
(((game-task-actor minimap))
|
|
(let ((v1-67
|
|
(add-icon! *minimap* *dproc* (-> node-open-ev icon) (the-as int (-> node-open-ev icon)) (the-as vector #f) i)
|
|
)
|
|
)
|
|
(if v1-67
|
|
(logior! (-> v1-67 flags) (minimap-flag task-graph))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(borrow-eval (-> node borrow))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(logior! (-> *game-info* features) (-> *game-info* debug-features))
|
|
(borrow-eval (-> *setting-control* user-current borrow))
|
|
)
|
|
(add-borrow-levels *load-state*)
|
|
(dotimes (lev-i (-> *level* length))
|
|
(let ((lev (-> *level* level lev-i)))
|
|
(if (= (-> lev status) 'active)
|
|
(level-method-22 lev arg0)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defmethod level-method-22 ((this level) (arg0 symbol))
|
|
(if (= arg0 'none)
|
|
(return 0)
|
|
)
|
|
(set! (-> this task-mask)
|
|
(logand (-> this info base-task-mask) (task-mask task0 task1 task2 task3 task4 task5 task6 task7 done))
|
|
)
|
|
(let ((name (-> this info taskname))
|
|
(game-subtasks (-> *game-info* sub-task-list))
|
|
)
|
|
(dotimes (i (-> game-subtasks length))
|
|
(when (nonzero? i)
|
|
(let ((subtask (-> game-subtasks i)))
|
|
(when (and (logtest? (-> subtask flags) (game-task-node-flag closed)) (= (-> subtask level) name))
|
|
(cond
|
|
((logtest? (-> subtask flags) (game-task-node-flag abs-task-mask))
|
|
(set! (-> this task-mask) (-> subtask task-mask))
|
|
)
|
|
((logtest? (-> subtask flags) (game-task-node-flag set-task-mask))
|
|
(logior! (-> this task-mask) (-> subtask task-mask))
|
|
)
|
|
((logtest? (-> subtask flags) (game-task-node-flag clear-task-mask))
|
|
(logclear! (-> this task-mask) (-> subtask task-mask))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(case (-> this name)
|
|
(('strip)
|
|
(prototypes-game-visible-set!
|
|
'("strip-ev-base-ring.mb"
|
|
"strip-ev-base-top.mb"
|
|
"strip-ev-base.mb"
|
|
"strip-ev-panel.mb"
|
|
"strip-ev-pipe-01.mb"
|
|
"strip-ev-pipe-02.mb"
|
|
"strip-ev-pipe-03.mb"
|
|
"strip-ev-tank.mb"
|
|
"strip-ev-band.mb"
|
|
"strip-ev-little-block.mb"
|
|
)
|
|
(not (task-node-closed? (game-task-node strip-grenade-explode)))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("strip-pipe-01.mb"
|
|
"strip-pipe-02-nut-drop.mb"
|
|
"strip-shrub-nut-drop.mb"
|
|
"strip-shrub-yellow-stripe.mb"
|
|
"strip-pipe-col-disappear.mb"
|
|
)
|
|
(or (and (task-complete? *game-info* (game-task strip-grenade))
|
|
(task-node-closed? (game-task-node strip-drop-introduction))
|
|
)
|
|
(demo?)
|
|
)
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("strip-blown-up-vent-base.mb" "strip-blown-up-vent-pieces.mb")
|
|
(task-complete? *game-info* (game-task strip-grenade))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("strip-blocker-crate-01.mb"
|
|
"strip-blocker-crate-02.mb"
|
|
"strip-blocker-crate-03.mb"
|
|
"strip-blocker-crate-04.mb"
|
|
"strip-blocker-crate-05.mb"
|
|
"strip-blocker-crate-06.mb"
|
|
)
|
|
(not (task-complete? *game-info* (game-task strip-rescue)))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("lowres-casboss.mb")
|
|
(not (task-node-closed? (game-task-node castle-boss-resolution)))
|
|
)
|
|
)
|
|
(('ruins)
|
|
(prototypes-game-visible-set!
|
|
'("ruins-board-task2.mb"
|
|
"ruins-lgcollision-task2.mb"
|
|
"ruins-plank-task2.mb"
|
|
"ruins-smlcollision-task2.mb"
|
|
"ruins-support-task2.mb"
|
|
)
|
|
(and (task-complete? *game-info* (game-task ruins-tower))
|
|
(task-node-closed? (game-task-node ruins-enemy-introduction))
|
|
)
|
|
)
|
|
(prototypes-game-visible-set! '("ruin-tower-junk.mb") (task-complete? *game-info* (game-task ruins-tower)))
|
|
(prototypes-game-visible-set!
|
|
'("ruin-balcony-01-tower.mb"
|
|
"ruin-balcony-02-tower.mb"
|
|
"ruin-bar-01-tower.mb"
|
|
"ruin-bar-02-tower.mb"
|
|
"ruin-bar-03-tower.mb"
|
|
"ruin-bridge-01-tower.mb"
|
|
"ruin-lamp-post-01-tower.mb"
|
|
"ruin-lamp-post-03-tower.mb"
|
|
"ruin-lamp-post-04-tower.mb"
|
|
"ruin-lampbase-02-tower.mb"
|
|
"ruin-lamplite-01-tower.mb"
|
|
"ruin-pillar-broken-01-tower.mb"
|
|
"ruin-pillar-broken-03-tower.mb"
|
|
"ruin-top-tower.mb"
|
|
"ruin-tower-window-01.mb"
|
|
"ruin-window-01-tower.mb"
|
|
"ruins-city-corner-roof-tower.mb"
|
|
"ruins-city-roof-01-tower.mb"
|
|
"ruins-cracked-roof-tower.mb"
|
|
"ruins-pipe-2m-end-tower.mb"
|
|
"ruins-pipe-elbow-tower.mb"
|
|
"ruins-pipe-mid-tower.mb"
|
|
"ruins-pipe-ring-tower.mb"
|
|
"ruins-support-01-tower.mb"
|
|
"ruins-support-02-tower.mb"
|
|
"swingpole-geo.mb"
|
|
"ruin-top-brick-01.mb"
|
|
"ruin-brick-side-01.mb"
|
|
)
|
|
(not (task-complete? *game-info* (game-task ruins-tower)))
|
|
)
|
|
)
|
|
(('atoll)
|
|
(prototypes-game-visible-set!
|
|
'("atoll-tank.mb")
|
|
(and (not (task-complete? *game-info* (game-task atoll-sig)))
|
|
(not (task-node-closed? (game-task-node atoll-sig-tank)))
|
|
)
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("lowres-casboss.mb")
|
|
(not (task-node-closed? (game-task-node castle-boss-resolution)))
|
|
)
|
|
)
|
|
(('ctymarkb)
|
|
(prototypes-game-visible-set!
|
|
'("city-mark-roof-before-broken.mb")
|
|
(not (task-node-closed? (game-task-node city-intercept-tanker-roof-explode)))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("city-mark-roof-broken.mb")
|
|
(task-node-closed? (game-task-node city-intercept-tanker-introduction))
|
|
)
|
|
)
|
|
(('ctypal)
|
|
(prototypes-game-visible-set!
|
|
'("ctyp-statue-wall-breakable.mb")
|
|
(not (task-node-closed? (game-task-node canyon-insert-items-shard)))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("ctyp-statue-rubble-a.mb" "ctyp-statue-rubble-b.mb" "ctyp-statue-rubble-big-a.mb")
|
|
(task-node-closed? (game-task-node canyon-insert-items-shard))
|
|
)
|
|
)
|
|
(('sewer 'sewerb 'sewesc 'sewescb)
|
|
(prototypes-game-visible-set!
|
|
'("sewer-c-connect-door.mb")
|
|
(not (and (task-complete? *game-info* (game-task sewer-enemy))
|
|
(task-node-closed? (game-task-node sewer-board-introduction))
|
|
(not (task-complete? *game-info* (game-task sewer-board)))
|
|
)
|
|
)
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("sewer-hover-door.mb")
|
|
(and (task-complete? *game-info* (game-task sewer-enemy))
|
|
(task-node-closed? (game-task-node sewer-board-introduction))
|
|
(not (task-complete? *game-info* (game-task sewer-board)))
|
|
)
|
|
)
|
|
(cond
|
|
((= arg0 'debug)
|
|
)
|
|
((task-complete? *game-info* (game-task sewer-board))
|
|
(set! *ocean-height-hack* (ocean-height-hack sewer-lo))
|
|
(set-height! *ocean-map-sewer* -368050.2)
|
|
)
|
|
((not (task-node-closed? (game-task-node sewer-board-drain)))
|
|
(set! *ocean-height-hack* (ocean-height-hack zero))
|
|
(set-height! *ocean-map-sewer* -216498.17)
|
|
)
|
|
)
|
|
)
|
|
(('ctyasha)
|
|
(prototypes-game-visible-set!
|
|
'("cty-tanker-barrel.mb")
|
|
(task-node-closed? (game-task-node city-intercept-tanker-introduction))
|
|
)
|
|
)
|
|
(('consite)
|
|
(prototypes-game-visible-set!
|
|
'("consite-barrel-broken.mb"
|
|
"consite-cor-sheet-8x16-hi-broken.mb"
|
|
"consite-scaffold-assmb-24m-mid-broken.mb"
|
|
"consite-scaffold-beam-4m-broken.mb"
|
|
"consite-scaffold-beam-8m-broken.mb"
|
|
"consite-scaffold-i-hook-broken.mb"
|
|
"consite-scaffold-i-span-broken.mb"
|
|
"consite-scaffold-t-connector-broken.mb"
|
|
"consite-scaffold-x-connector-corner-broken.mb"
|
|
"consite-scaffold-x-connector-corner-out-broken.mb"
|
|
"consite-plank-double-broken.mb"
|
|
"consite-plank-single-broken.mb"
|
|
"consite-rope-14m-broken.mb"
|
|
"consite-rope-8m-broken.mb"
|
|
"consite-rope-ring-broken.mb"
|
|
"consite-scaffold-x-connector-broken.mb"
|
|
)
|
|
(task-node-closed? (game-task-node consite-find-baron-resolution))
|
|
)
|
|
)
|
|
(('caspad)
|
|
(prototypes-game-visible-set!
|
|
'("cpad-bigtank-side.mb"
|
|
"cpad-bigtank-top.mb"
|
|
"cpad-bigtank-top-details.mb"
|
|
"cpad-crane.mb"
|
|
"cpad-crane-base.mb"
|
|
"cpad-elev-scaffolding.mb"
|
|
"cpad-elev-shaft-ex.mb"
|
|
"cpad-elev-shaft-ex-detail.mb"
|
|
"cpad-elev-shaft-roof.mb"
|
|
"cpad-liltank-side.mb"
|
|
"cpad-liltank-top.mb"
|
|
"cpad-pipe-base.mb"
|
|
"cpad-pipe-flat.mb"
|
|
"cpad-pipe-lil-elbo.mb"
|
|
"cpad-pipe-lil-strt.mb"
|
|
"cpad-pipe-med-elbo.mb"
|
|
"cpad-pipe-med-strt.mb"
|
|
"cpad-pipe-tank-45.mb"
|
|
"cpad-pipe-tank-strt.mb"
|
|
"cpad-scaffold-structure.mb"
|
|
"cpad-scaff-x-beam.mb"
|
|
"cpad-stonework.mb"
|
|
"cpad-top.mb"
|
|
"cpad-tower-bottom.mb"
|
|
"cpad-tower-centrifuse.mb"
|
|
"cpad-tower-generator.mb"
|
|
"cpad-tower-generator-panels.mb"
|
|
"cpad-tower-smokestack.mb"
|
|
"cpad-tower-supports-lower.mb"
|
|
"cpad-tower-turbine.mb"
|
|
"cpad-tower-walkway-lower.mb"
|
|
"cpad-x-beam.mb"
|
|
)
|
|
(not (task-node-closed? (game-task-node castle-boss-resolution)))
|
|
)
|
|
)
|
|
(('stadiumb)
|
|
(prototypes-game-visible-set!
|
|
'("stdmb-tunnel-ramp-reverse.mb")
|
|
(task-node-closed? (game-task-node stadium-burning-bush-race-class3-r-introduction))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("stdmb-tunnel-ramp.mb")
|
|
(not (task-node-closed? (game-task-node stadium-burning-bush-race-class3-r-introduction)))
|
|
)
|
|
)
|
|
(('hiphog)
|
|
(prototypes-game-visible-set!
|
|
'("hip-paintings-bar-a.mb" "hip-paintings-wall-reflection-a.mb" "hip-paintings-wall-a.mb")
|
|
(not (task-node-closed? (game-task-node nest-boss-resolution)))
|
|
)
|
|
(prototypes-game-visible-set!
|
|
'("hip-paintings-bar-b.mb" "hip-paintings-wall-reflection-b.mb" "hip-paintings-wall-b.mb")
|
|
(task-node-closed? (game-task-node nest-boss-resolution))
|
|
)
|
|
)
|
|
)
|
|
(logior! (-> this task-mask) (-> *setting-control* user-current task-mask))
|
|
0
|
|
)
|
|
|
|
(defun play-clean ((arg0 symbol))
|
|
(set! *display-entity-errors* #f)
|
|
(set! *display-profile* #f)
|
|
(set! *display-actor-marks* #f)
|
|
(set! (-> *level* play?) #t)
|
|
(time-of-day-setup #t)
|
|
(set! *time-of-day-fast* #f)
|
|
(send-event (ppointer->process *time-of-day*) 'change 'ratio 1.0)
|
|
(when arg0
|
|
(let ((s5-0 (-> *game-info* mode)))
|
|
(set! (-> *game-info* mode) arg0)
|
|
(initialize! *game-info* 'game (the-as game-save #f) (the-as string #f))
|
|
(set! (-> *game-info* mode) s5-0)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defun play-task ((arg0 game-task) (arg1 symbol) (arg2 symbol))
|
|
(play-clean arg1)
|
|
(let ((gp-1 (-> *game-info* play-list arg0)))
|
|
(cond
|
|
((and (= arg2 'pre-play) (-> gp-1 pre-play-continue))
|
|
(task-node-open! (-> gp-1 pre-play-node))
|
|
(-> gp-1 pre-play-continue)
|
|
)
|
|
((and (= arg2 'kiosk) (-> gp-1 kiosk-play-continue))
|
|
(task-node-open! (-> gp-1 kiosk-play-node))
|
|
(-> gp-1 kiosk-play-continue)
|
|
)
|
|
(else
|
|
(if (-> gp-1 play-continue)
|
|
(task-node-open! (-> gp-1 play-node))
|
|
)
|
|
(-> gp-1 play-continue)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun restart-mission ()
|
|
(let ((restart? #t))
|
|
(let ((mgr-status #f))
|
|
(let ((v1-1 (the-as connection (-> *task-manager-engine* alive-list next0))))
|
|
*task-manager-engine*
|
|
(let ((s4-0 (the-as connection (-> v1-1 next0))))
|
|
(while (!= v1-1 (-> *task-manager-engine* alive-list-end))
|
|
(let ((task-mgr (the-as process (-> v1-1 param1))))
|
|
(if (not mgr-status)
|
|
(set! mgr-status #t)
|
|
)
|
|
(if (and (-> task-mgr next-state) (let ((v1-7 (-> task-mgr next-state name)))
|
|
(or (= v1-7 'complete) (= v1-7 'fail) (= v1-7 'retry))
|
|
)
|
|
)
|
|
(set! mgr-status 'busy)
|
|
)
|
|
(if (send-event task-mgr 'retry)
|
|
(set! restart? #f)
|
|
)
|
|
)
|
|
(set! v1-1 s4-0)
|
|
*task-manager-engine*
|
|
(set! s4-0 (the-as connection (-> s4-0 next0)))
|
|
)
|
|
)
|
|
)
|
|
(if (or (and *target* (focus-test? *target* dead) mgr-status) (= mgr-status 'busy))
|
|
(return (the-as int #f))
|
|
)
|
|
)
|
|
(when restart?
|
|
(let ((gp-1 0))
|
|
(let ((cur-lev (level-get-target-inside *level*)))
|
|
(when (and cur-lev (not (logtest? (-> cur-lev info level-flags) 1)))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(if (and (= (-> node level) (-> cur-lev info taskname))
|
|
(!= (-> node level) 'city)
|
|
(not (logtest? (game-task-node-flag no-restart) (-> node flags)))
|
|
(open? node)
|
|
)
|
|
(set! gp-1 (the-as int (-> node task)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(when (nonzero? gp-1)
|
|
(let ((a1-4 (-> *game-info* play-list gp-1 play-continue)))
|
|
(if a1-4
|
|
(set-continue! *game-info* a1-4 #t)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((a1-5 (new 'stack-no-clear 'fail-mission-params)))
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0 famflags-2))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-0))
|
|
(set! (-> a1-5 retry-continue) #f)
|
|
(set! (-> a1-5 fail-continue) #f)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (game-task none))
|
|
(set! (-> a1-5 fail-message) (text-id null))
|
|
(logior! (-> a1-5 flags) (fail-mission-flags famflags-3 famflags-4))
|
|
(start! *fail-mission-control* a1-5)
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defun task-node-by-name ((arg0 string))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(if (string= arg0 (-> node name))
|
|
(return node)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(the-as game-task-node-info #f)
|
|
)
|
|
|
|
(defun task-resolution-close! ((arg0 game-task))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(when (and (= (-> node task) arg0) (logtest? (-> node flags) (game-task-node-flag close-task)))
|
|
(close! node 'event)
|
|
(return #t)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
|
|
(defun task-close! ((arg0 string))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(when (string= arg0 (-> node name))
|
|
(let ((gp-2 (not (logtest? (-> node flags) (game-task-node-flag closed)))))
|
|
(close! node 'event)
|
|
(return gp-2)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(format 0 "ERROR: attempting to close unknown task node ~A.~%" arg0)
|
|
#f
|
|
)
|
|
|
|
(defun task-closed? ((arg0 string))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(if (string= arg0 (-> node name))
|
|
(return (logtest? (-> node flags) (game-task-node-flag closed)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(format 0 "ERROR: attempting to query closed? of unknown task node ~A.~%" arg0)
|
|
#f
|
|
)
|
|
|
|
(defun open-task-nodes ((arg0 (array game-task-node-info)))
|
|
(local-vars (a3-4 symbol))
|
|
(set! (-> arg0 length) 0)
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(when (and (not (logtest? (-> node flags) (game-task-node-flag closed)))
|
|
(begin
|
|
(dotimes (a3-3 4)
|
|
(when (and (nonzero? (-> node parent-node a3-3))
|
|
(not (logtest? (-> game-nodes (-> node parent-node a3-3) flags) (game-task-node-flag closed)))
|
|
)
|
|
(set! a3-4 #f)
|
|
(goto cfg-14)
|
|
)
|
|
)
|
|
(set! a3-4 #t)
|
|
(label cfg-14)
|
|
(and a3-4 (< (-> arg0 length) (-> arg0 allocated-length)))
|
|
)
|
|
)
|
|
(set! (-> arg0 (-> arg0 length)) node)
|
|
(+! (-> arg0 length) 1)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
arg0
|
|
)
|
|
|
|
(defmethod print ((this game-task-node-info))
|
|
(format
|
|
#t
|
|
"#<game-task-node-info ~S ~S @ #x~X>"
|
|
(-> this name)
|
|
(cond
|
|
((logtest? (-> this flags) (game-task-node-flag closed))
|
|
"closed"
|
|
)
|
|
((open? this)
|
|
"open"
|
|
)
|
|
(else
|
|
"inactive"
|
|
)
|
|
)
|
|
this
|
|
)
|
|
this
|
|
)
|
|
|
|
(defun get-active-mission-description ((info discord-info))
|
|
"Added in PC port to retrieve a string for the currently active mission to display in Discord."
|
|
(let* ((nodes (-> *game-info* sub-task-list))
|
|
(level (level-get-target-inside *level*))
|
|
(task-level-idx (if level (-> level info task-level) 0))
|
|
(side-missions-start (the int (game-task-node city-burning-bush-ring-1-introduction)))
|
|
(side-missions-end (the int (game-task-node stadium-burning-bush-race-class1-r-resolution)))
|
|
(gg-node? (lambda ((node game-task-node-info))
|
|
(or (= (-> node task) (game-task city-red-gun-training))
|
|
(= (-> node task) (game-task city-yellow-gun-training))
|
|
(= (-> node task) (game-task city-blue-gun-training))
|
|
(= (-> node task) (game-task city-dark-gun-training))))))
|
|
(dotimes (i (-> nodes length))
|
|
(when (nonzero? i)
|
|
(let* ((node (-> nodes i))
|
|
(mgr-info (-> node info))
|
|
(mgr-handle (if mgr-info (-> mgr-info manager) (the-as handle #f))))
|
|
;; if we are not in a valid task level, just return.
|
|
(when (= task-level-idx 0)
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-not-in-mission) #f))
|
|
)
|
|
;; check for onin-game
|
|
(when (and (= (-> level name) 'onintent)
|
|
(or (= (the game-task-node i) (game-task-node city-play-onin-game-post-game))
|
|
(= (the game-task-node i) (game-task-node city-play-onin-game-skill)))
|
|
(task-node-open? (the game-task-node i))
|
|
(process-by-name "onin-game" *active-pool*))
|
|
(set! (-> info task) "onin-game")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-onin-game) #f))
|
|
)
|
|
;; check for whack-a-metal
|
|
(when (and (= (-> level name) 'hiphog)
|
|
(= (the game-task-node i) (game-task-node city-whack-post-game))
|
|
(task-node-open? (the game-task-node i))
|
|
(process-by-name "whack-a-metal" *active-pool*))
|
|
(set! (-> info task) "city-whack")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-whack) #f))
|
|
)
|
|
;; check for gungame (there is probably a better way to do this)
|
|
(when (and (= (-> level name) 'gungame)
|
|
(gg-node? node)
|
|
(task-node-open? (the game-task-node i)))
|
|
(awhen (process-by-ename "training-manager-2")
|
|
(if (= (-> it next-state name) 'course)
|
|
(let ((feat (-> *setting-control* user-current features)))
|
|
(cond
|
|
((not (logtest? feat (game-feature gun-yellow gun-blue gun-dark)))
|
|
(set! (-> info task) "city-red-gun-training")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-red-gun-training) #f))
|
|
)
|
|
((not (logtest? feat (game-feature gun-red gun-blue gun-dark)))
|
|
(set! (-> info task) "city-yellow-gun-training")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-yellow-gun-training) #f))
|
|
)
|
|
((not (logtest? feat (game-feature gun-red gun-yellow gun-dark)))
|
|
(set! (-> info task) "city-blue-gun-training")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-blue-gun-training) #f))
|
|
)
|
|
(else
|
|
(set! (-> info task) "city-dark-gun-training")
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-dark-gun-training) #f))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
;; check for side missions
|
|
(when (and (>= i side-missions-start)
|
|
(<= i side-missions-end)
|
|
(task-node-open? (the game-task-node i))
|
|
mgr-handle)
|
|
(set! (-> info task) (game-task->string (-> node task)))
|
|
(return (lookup-text! *common-text* (text-id discord-rpc-in-side-mission) #f))
|
|
)
|
|
;; check for any other tasks
|
|
(when (and (not (gg-node? node))
|
|
(task-node-open? (the game-task-node i))
|
|
(!= (-> node description) (the text-id 0))
|
|
(= (-> *task-level* task-level-idx) (-> node level)))
|
|
(set! (-> info task) (game-task->string (-> node task)))
|
|
(return (lookup-text! *common-text* (-> node description) #f))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(lookup-text! *common-text* (text-id discord-rpc-not-in-mission) #f)
|
|
)
|
|
)
|
|
|
|
(defmethod close! ((this game-task-node-info) (arg0 symbol))
|
|
(when (not (logtest? (-> this flags) (game-task-node-flag closed)))
|
|
(let ((task-node-close-func
|
|
(lambda ((arg0 game-task-node-info))
|
|
(logior! (-> arg0 flags) (game-task-node-flag closed))
|
|
(+! (-> *game-info* task-counter) 1)
|
|
(when (zero? (-> arg0 close-time))
|
|
(set! (-> arg0 gem-count) (the-as uint (the int (-> *game-info* gem))))
|
|
(set! (-> arg0 skill-count) (the-as uint (the int (-> *game-info* skill))))
|
|
(set! (-> arg0 close-time) (-> *display* game-clock frame-counter))
|
|
)
|
|
(if (-> arg0 on-close)
|
|
(script-eval (-> arg0 on-close) :key arg0)
|
|
)
|
|
(if (logtest? (-> arg0 flags) (game-task-node-flag close-task))
|
|
((lambda ((arg0 game-task-node-info))
|
|
(if *target*
|
|
(send-event *target* 'get-pickup (pickup-type fuel-cell) (the float (-> arg0 task)))
|
|
(give *game-info* 'fuel-cell (the float (-> arg0 task)) (the-as handle #f))
|
|
)
|
|
)
|
|
arg0
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(let ((p-node-count 0)
|
|
(s3-0 (new 'stack-no-clear 'inline-array 'qword 8))
|
|
)
|
|
(let ((s1-0 this))
|
|
(loop
|
|
(cond
|
|
((= (-> s1-0 parent-node 0) (game-task-node none))
|
|
(goto cfg-21)
|
|
)
|
|
((= (-> s1-0 parent-node 1) (game-task-node none))
|
|
(let ((v1-10 (-> *game-info* sub-task-list (-> s1-0 parent-node 0))))
|
|
(cond
|
|
((logtest? (-> v1-10 flags) (game-task-node-flag closed))
|
|
(goto cfg-21)
|
|
)
|
|
(else
|
|
(set! (-> (&-> s3-0 0 hword p-node-count) 0) (the-as uint (-> s1-0 parent-node 0)))
|
|
(+! p-node-count 1)
|
|
(when (< 64 p-node-count)
|
|
(break!)
|
|
0
|
|
)
|
|
)
|
|
)
|
|
(set! s1-0 v1-10)
|
|
)
|
|
)
|
|
(else
|
|
(dotimes (p-i 4)
|
|
(let ((v1-15 (-> s1-0 parent-node p-i)))
|
|
(if (nonzero? v1-15)
|
|
(close! (-> *game-info* sub-task-list v1-15) 'none)
|
|
)
|
|
)
|
|
)
|
|
(goto cfg-21)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(label cfg-21)
|
|
(while (nonzero? p-node-count)
|
|
(+! p-node-count -1)
|
|
(task-node-close-func (-> *game-info* sub-task-list (-> (&-> s3-0 0 hword p-node-count) 0)))
|
|
)
|
|
)
|
|
(task-node-close-func this)
|
|
)
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(if (and (logtest? (-> node flags) (game-task-node-flag auto-close)) (open? node))
|
|
(close! node 'none)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(update-task-masks arg0)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defun task-node-closed? ((arg0 game-task-node))
|
|
(let ((node (-> *game-info* sub-task-list arg0)))
|
|
(logtest? (-> node flags) (game-task-node-flag closed))
|
|
)
|
|
)
|
|
|
|
(defun task-node-close! ((arg0 game-task-node))
|
|
(close! (-> *game-info* sub-task-list arg0) 'event)
|
|
0
|
|
)
|
|
|
|
(defmethod open! ((this game-task-node-info) (arg0 symbol))
|
|
(local-vars (v1-19 symbol))
|
|
(when (logtest? (-> this flags) (game-task-node-flag closed))
|
|
(logclear! (-> this flags) (game-task-node-flag closed))
|
|
(+! (-> *game-info* task-counter) 1)
|
|
(if (logtest? (-> this flags) (game-task-node-flag close-task))
|
|
(logclear! (-> *game-info* task-perm-list data (-> this task) status) (entity-perm-status complete))
|
|
)
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(set! v1-19
|
|
(and (logtest? (-> node flags) (game-task-node-flag closed))
|
|
(begin
|
|
(dotimes (ii 4)
|
|
(when (and (nonzero? (-> node parent-node ii))
|
|
(not (logtest? (-> game-nodes (-> node parent-node ii) flags) (game-task-node-flag closed)))
|
|
)
|
|
(set! v1-19 #t)
|
|
(goto cfg-17)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
(label cfg-17)
|
|
(if v1-19
|
|
(open! node 'none)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(update-task-masks arg0)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defun task-node-open? ((arg0 game-task-node))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(open? (-> game-nodes arg0))
|
|
)
|
|
)
|
|
|
|
(defmethod open? ((this game-task-node-info))
|
|
(local-vars (a1-1 symbol))
|
|
(let ((game-nodes (-> *game-info* sub-task-list))
|
|
(node-info this)
|
|
)
|
|
(and (not (logtest? (-> node-info flags) (game-task-node-flag closed)))
|
|
(begin
|
|
(dotimes (pi 4)
|
|
(let ((t0-0 (-> node-info parent-node pi)))
|
|
(when (and (nonzero? t0-0) (not (logtest? (-> game-nodes t0-0 flags) (game-task-node-flag closed))))
|
|
(set! a1-1 #f)
|
|
(goto cfg-12)
|
|
)
|
|
)
|
|
)
|
|
(set! a1-1 #t)
|
|
(label cfg-12)
|
|
(and a1-1
|
|
(or (zero? (-> *setting-control* user-current exclusive-task))
|
|
(= (-> *setting-control* user-current exclusive-task) (-> this task))
|
|
(logtest? (-> node-info flags) (game-task-node-flag auto-close))
|
|
)
|
|
(or (not (-> node-info open?)) ((-> node-info open?) node-info))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun task-node-open! ((arg0 game-task-node))
|
|
(let ((game-node (-> *game-info* sub-task-list arg0)))
|
|
(dotimes (p-i 4)
|
|
(if (nonzero? (-> game-node parent-node p-i))
|
|
(close! (-> *game-info* sub-task-list (-> game-node parent-node p-i)) 'event)
|
|
)
|
|
)
|
|
(open! game-node 'event)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defmethod eval-add ((this game-task-node-info))
|
|
(case (-> this add)
|
|
(((game-task-node-command none))
|
|
)
|
|
(((game-task-node-command add-sidekick))
|
|
(logior! (-> *game-info* features) (game-feature sidekick))
|
|
)
|
|
(((game-task-node-command sub-sidekick))
|
|
(logclear! (-> *game-info* features) (game-feature sidekick))
|
|
)
|
|
(((game-task-node-command add-board))
|
|
(logior! (-> *game-info* features) (game-feature board))
|
|
)
|
|
(((game-task-node-command add-board-training))
|
|
(logior! (-> *game-info* features) (game-feature board-training))
|
|
)
|
|
(((game-task-node-command sub-board))
|
|
(logclear! (-> *game-info* features) (game-feature board))
|
|
)
|
|
(((game-task-node-command add-gun-red))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-red))
|
|
)
|
|
(((game-task-node-command add-gun-yellow))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-yellow))
|
|
)
|
|
(((game-task-node-command add-gun-blue))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-blue))
|
|
)
|
|
(((game-task-node-command add-gun-dark))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-dark))
|
|
)
|
|
(((game-task-node-command add-gun-up-1))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-upgrade-speed))
|
|
)
|
|
(((game-task-node-command add-gun-up-2))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-upgrade-ammo))
|
|
)
|
|
(((game-task-node-command add-gun-up-3))
|
|
(logior! (-> *game-info* features) (game-feature gun gun-upgrade-damage))
|
|
)
|
|
(((game-task-node-command add-pass-red))
|
|
(logior! (-> *game-info* features) (game-feature pass-red))
|
|
)
|
|
(((game-task-node-command add-pass-green))
|
|
(logior! (-> *game-info* features) (game-feature pass-green))
|
|
)
|
|
(((game-task-node-command add-pass-yellow))
|
|
(logior! (-> *game-info* features) (game-feature pass-yellow))
|
|
)
|
|
(((game-task-node-command add-pass-blue))
|
|
(logior! (-> *game-info* features) (game-feature pass-blue))
|
|
)
|
|
(((game-task-node-command add-darkjak))
|
|
(logior! (-> *game-info* features) (game-feature darkjak))
|
|
)
|
|
(((game-task-node-command add-darkjak-0))
|
|
(logior! (-> *game-info* features) (game-feature darkjak-bomb0))
|
|
)
|
|
(((game-task-node-command add-darkjak-1))
|
|
(logior! (-> *game-info* features) (game-feature darkjak-bomb1))
|
|
)
|
|
(((game-task-node-command add-darkjak-2))
|
|
(logior! (-> *game-info* features) (game-feature darkjak-invinc))
|
|
)
|
|
(((game-task-node-command add-darkjak-3))
|
|
(logior! (-> *game-info* features) (game-feature darkjak-giant))
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defun task-node-reset ((arg0 symbol))
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(when (logtest? (-> node flags) (game-task-node-flag closed))
|
|
(case arg0
|
|
(('game)
|
|
(if (nonzero? i)
|
|
(logclear! (-> node flags) (game-task-node-flag closed))
|
|
)
|
|
)
|
|
(('life)
|
|
(if (and (not (task-complete? *game-info* (-> node task)))
|
|
(not (logtest? (-> node flags) (game-task-node-flag save-on-life)))
|
|
)
|
|
(logclear! (-> node flags) (game-task-node-flag closed))
|
|
)
|
|
)
|
|
(('try)
|
|
(if (and (not (task-complete? *game-info* (-> node task)))
|
|
(or (not (logtest? (-> node flags) (game-task-node-flag save-on-life save-on-try)))
|
|
(logtest? (-> node flags) (game-task-node-flag reset-on-try))
|
|
)
|
|
)
|
|
(logclear! (-> node flags) (game-task-node-flag closed))
|
|
)
|
|
)
|
|
)
|
|
(when (logtest? (-> node flags) (game-task-node-flag closed))
|
|
(dotimes (v1-31 4)
|
|
(if (nonzero? (-> node parent-node v1-31))
|
|
(logior! (-> game-nodes (-> node parent-node v1-31) flags) (game-task-node-flag closed))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(+! (-> *game-info* task-counter) 1)
|
|
0
|
|
)
|
|
|
|
(defun-debug task-node-dump ((arg0 symbol))
|
|
(let ((gp-0 (-> *game-info* sub-task-list)))
|
|
(dotimes (s5-0 (-> gp-0 length))
|
|
(when (nonzero? s5-0)
|
|
(let* ((s0-0 (-> gp-0 s5-0))
|
|
(s4-0 format)
|
|
(s3-0 #t)
|
|
(s2-0 " ~-40S ~-8S ~S~%")
|
|
(s1-0 (game-task-node->string (the-as game-task-node s5-0)))
|
|
(a3-0 (if (task-node-closed? (the-as game-task-node s5-0))
|
|
"closed"
|
|
"open"
|
|
)
|
|
)
|
|
(t0-0 (and (-> s0-0 info) (handle->process (-> s0-0 info manager))))
|
|
)
|
|
(set! t0-0 (cond
|
|
(t0-0
|
|
(empty)
|
|
t0-0
|
|
)
|
|
(else
|
|
""
|
|
)
|
|
)
|
|
)
|
|
(s4-0 s3-0 s2-0 s1-0 a3-0 t0-0)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
|
|
(defmethod print ((this game-task-event))
|
|
(let* ((t9-0 format)
|
|
(a0-1 #t)
|
|
(a1-0 "#<game-task-control ~S :action ~S :scene ~A @ #x~X>")
|
|
(v1-0 (-> this actor))
|
|
(a2-1 (cond
|
|
((= v1-0 (game-task-actor burning-bush-genc))
|
|
"burning-bush-genc"
|
|
)
|
|
((= v1-0 (game-task-actor minimap))
|
|
"minimap"
|
|
)
|
|
((= v1-0 (game-task-actor youngsamos-tomb))
|
|
"youngsamos-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor youngsamos-onintent))
|
|
"youngsamos-onintent"
|
|
)
|
|
((= v1-0 (game-task-actor baron-consite))
|
|
"baron-consite"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-markb))
|
|
"burning-bush-markb"
|
|
)
|
|
((= v1-0 (game-task-actor keira-garage))
|
|
"keira-garage"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-genc-2))
|
|
"burning-bush-genc-2"
|
|
)
|
|
((= v1-0 (game-task-actor samos-garage))
|
|
"samos-garage"
|
|
)
|
|
((= v1-0 (game-task-actor kid-hideout))
|
|
"kid-hideout"
|
|
)
|
|
((= v1-0 (game-task-actor krew-hiphog))
|
|
"krew-hiphog"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-port-2))
|
|
"burning-bush-port-2"
|
|
)
|
|
((= v1-0 (game-task-actor none))
|
|
"none"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-port-3))
|
|
"burning-bush-port-3"
|
|
)
|
|
((= v1-0 (game-task-actor brutter-kiosk))
|
|
"brutter-kiosk"
|
|
)
|
|
((= v1-0 (game-task-actor tess-alley))
|
|
"tess-alley"
|
|
)
|
|
((= v1-0 (game-task-actor whack-a-metal-hiphog))
|
|
"whack-a-metal-hiphog"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-gena))
|
|
"burning-bush-gena"
|
|
)
|
|
((= v1-0 (game-task-actor vin-vinroom))
|
|
"vin-vinroom"
|
|
)
|
|
((= v1-0 (game-task-actor kor-hideout))
|
|
"kor-hideout"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-pal-2))
|
|
"burning-bush-pal-2"
|
|
)
|
|
((= v1-0 (game-task-actor kid-alley))
|
|
"kid-alley"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-stadium))
|
|
"burning-bush-stadium"
|
|
)
|
|
((= v1-0 (game-task-actor ashelin-market))
|
|
"ashelin-market"
|
|
)
|
|
((= v1-0 (game-task-actor kid-tomb))
|
|
"kid-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-farma))
|
|
"burning-bush-farma"
|
|
)
|
|
((= v1-0 (game-task-actor baron-tomb))
|
|
"baron-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-slumc))
|
|
"burning-bush-slumc"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-slumb-2))
|
|
"burning-bush-slumb-2"
|
|
)
|
|
((= v1-0 (game-task-actor baron-palace))
|
|
"baron-palace"
|
|
)
|
|
((= v1-0 (game-task-actor crocadog-alley))
|
|
"crocadog-alley"
|
|
)
|
|
((= v1-0 (game-task-actor baron-castle))
|
|
"baron-castle"
|
|
)
|
|
((= v1-0 (game-task-actor crocadog-vinroom))
|
|
"crocadog-vinroom"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-gena-2))
|
|
"burning-bush-gena-2"
|
|
)
|
|
((= v1-0 (game-task-actor daxter-tomb))
|
|
"daxter-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-port))
|
|
"burning-bush-port"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-marka))
|
|
"burning-bush-marka"
|
|
)
|
|
((= v1-0 (game-task-actor crocadog-tomb))
|
|
"crocadog-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor keira-stadium))
|
|
"keira-stadium"
|
|
)
|
|
((= v1-0 (game-task-actor sig-hiphog))
|
|
"sig-hiphog"
|
|
)
|
|
((= v1-0 (game-task-actor youngsamos-hideout))
|
|
"youngsamos-hideout"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-genb-2))
|
|
"burning-bush-genb-2"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-inda))
|
|
"burning-bush-inda"
|
|
)
|
|
((= v1-0 (game-task-actor kor-tomb))
|
|
"kor-tomb"
|
|
)
|
|
((= v1-0 (game-task-actor kor-consite))
|
|
"kor-consite"
|
|
)
|
|
((= v1-0 (game-task-actor torn-hideout))
|
|
"torn-hideout"
|
|
)
|
|
((= v1-0 (game-task-actor onin-onintent))
|
|
"onin-onintent"
|
|
)
|
|
((= v1-0 (game-task-actor kor-alley))
|
|
"kor-alley"
|
|
)
|
|
((= v1-0 (game-task-actor kid-vinroom))
|
|
"kid-vinroom"
|
|
)
|
|
((= v1-0 (game-task-actor ashelin-atoll))
|
|
"ashelin-atoll"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-sluma))
|
|
"burning-bush-sluma"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-slumb))
|
|
"burning-bush-slumb"
|
|
)
|
|
((= v1-0 (game-task-actor youngsamos-alley))
|
|
"youngsamos-alley"
|
|
)
|
|
((= v1-0 (game-task-actor youngsamos-forest))
|
|
"youngsamos-forest"
|
|
)
|
|
((= v1-0 (game-task-actor samos-hideout))
|
|
"samos-hideout"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-genb))
|
|
"burning-bush-genb"
|
|
)
|
|
((= v1-0 (game-task-actor oracle-oracle))
|
|
"oracle-oracle"
|
|
)
|
|
((= v1-0 (game-task-actor torn-alley))
|
|
"torn-alley"
|
|
)
|
|
((= v1-0 (game-task-actor kor-onintent))
|
|
"kor-onintent"
|
|
)
|
|
((= v1-0 (game-task-actor tess-hiphog))
|
|
"tess-hiphog"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-markb-2))
|
|
"burning-bush-markb-2"
|
|
)
|
|
((= v1-0 (game-task-actor ashelin-throne))
|
|
"ashelin-throne"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-indb))
|
|
"burning-bush-indb"
|
|
)
|
|
((= v1-0 (game-task-actor pecker-onintent))
|
|
"pecker-onintent"
|
|
)
|
|
((= v1-0 (game-task-actor kor-vinroom))
|
|
"kor-vinroom"
|
|
)
|
|
((= v1-0 (game-task-actor sig-atoll))
|
|
"sig-atoll"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-pal))
|
|
"burning-bush-pal"
|
|
)
|
|
((= v1-0 (game-task-actor burning-bush-farmb))
|
|
"burning-bush-farmb"
|
|
)
|
|
(else
|
|
"*unknown*"
|
|
)
|
|
)
|
|
)
|
|
(v1-1 (-> this action))
|
|
)
|
|
(t9-0
|
|
a0-1
|
|
a1-0
|
|
a2-1
|
|
(cond
|
|
((= v1-1 (game-task-action idle))
|
|
"idle"
|
|
)
|
|
((= v1-1 (game-task-action play))
|
|
"play"
|
|
)
|
|
((= v1-1 (game-task-action show))
|
|
"show"
|
|
)
|
|
((= v1-1 (game-task-action talk))
|
|
"talk"
|
|
)
|
|
((= v1-1 (game-task-action hide))
|
|
"hide"
|
|
)
|
|
((= v1-1 (game-task-action say))
|
|
"say"
|
|
)
|
|
((= v1-1 (game-task-action trade))
|
|
"trade"
|
|
)
|
|
((= v1-1 (game-task-action menu))
|
|
"menu"
|
|
)
|
|
(else
|
|
"*unknown*"
|
|
)
|
|
)
|
|
(-> this scene)
|
|
this
|
|
)
|
|
)
|
|
this
|
|
)
|
|
|
|
(defmethod new game-task-control ((allocation symbol) (type-to-make type) (arg0 game-task-actor))
|
|
(let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size)))))
|
|
(set! (-> v0-0 actor) arg0)
|
|
v0-0
|
|
)
|
|
)
|
|
|
|
(defmethod get-current-task-event ((this game-task-control))
|
|
(with-pp
|
|
(let ((gp-0 (new 'static 'game-task-event :scene #f)))
|
|
(let ((s5-0 #f))
|
|
(when (!= (-> this counter) (-> *game-info* task-counter))
|
|
(set! (-> this counter) (-> *game-info* task-counter))
|
|
(set! (-> this current-node) (game-task-node none))
|
|
(set! (-> this current-event) #f)
|
|
(set! s5-0 #t)
|
|
(let ((game-nodes (-> *game-info* sub-task-list)))
|
|
(dotimes (i (-> game-nodes length))
|
|
(when (nonzero? i)
|
|
(let ((node (-> game-nodes i)))
|
|
(when (and (task-node-open? (the-as game-task-node i))
|
|
(-> node when-open)
|
|
(begin
|
|
(countdown (v1-12 (-> node when-open length))
|
|
(when (= (-> this actor) (-> node when-open v1-12 actor))
|
|
(set! (-> this current-event) (-> node when-open v1-12))
|
|
(set! (-> this current-node) (the-as game-task-node i))
|
|
#t
|
|
(goto cfg-18)
|
|
)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(label cfg-18)
|
|
(cond
|
|
((= (-> this current-node) (game-task-node none))
|
|
(set! (-> gp-0 actor) (-> this actor))
|
|
)
|
|
(else
|
|
(set! gp-0 (-> this current-event))
|
|
(cond
|
|
((and (logtest? (-> gp-0 flags) (game-task-flags gatflag-00))
|
|
(let ((a1-2 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-2 from) (process->ppointer pp))
|
|
(set! (-> a1-2 num-params) 0)
|
|
(set! (-> a1-2 message) 'get-alert-level)
|
|
(let ((a0-11 (send-event-function *traffic-manager* a1-2)))
|
|
(and a0-11 (nonzero? a0-11))
|
|
)
|
|
)
|
|
)
|
|
(set! (-> gp-0 action) (game-task-action hide))
|
|
0
|
|
)
|
|
(else
|
|
(set! (-> gp-0 action) (the-as game-task-action (-> gp-0 tex)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(if s5-0
|
|
(logior! (-> gp-0 flags) (game-task-flags gatflag-01))
|
|
(logclear! (-> gp-0 flags) (game-task-flags gatflag-01))
|
|
)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
)
|
|
|
|
(deftype fail-mission (process)
|
|
((message fail-mission-message)
|
|
(flags fail-mission-flags)
|
|
(retry-continue string)
|
|
(fail-continue string)
|
|
(reset-delay uint32)
|
|
(grabbed-time time-frame)
|
|
(retry symbol)
|
|
(task game-task)
|
|
(message-id sound-id)
|
|
(fail-message text-id)
|
|
(stinger sound-id)
|
|
)
|
|
(:state-methods
|
|
idle
|
|
resetting
|
|
)
|
|
(:methods
|
|
(print-text (_type_) float)
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod run-logic? ((this fail-mission))
|
|
#t
|
|
)
|
|
|
|
(defmethod print-text ((this fail-mission))
|
|
(when (and (not (logtest? (-> this flags) (fail-mission-flags famflags-6)))
|
|
(= (get-status *gui-control* (-> this message-id)) (gui-status active))
|
|
)
|
|
(let ((gp-0
|
|
(new 'stack 'font-context *font-default-matrix* 70 20 0.0 (font-color orange) (font-flags shadow kerning))
|
|
)
|
|
)
|
|
(set! (-> gp-0 origin x) 120.0)
|
|
(let ((v1-7 gp-0))
|
|
(set! (-> v1-7 scale) 0.7)
|
|
)
|
|
(let ((v1-8 gp-0))
|
|
(set! (-> v1-8 width) (the float 300))
|
|
)
|
|
(let ((v1-9 gp-0))
|
|
(set! (-> v1-9 height) (the float 35))
|
|
)
|
|
(set! (-> gp-0 flags) (font-flags shadow kerning middle middle-vert large))
|
|
(let ((s4-0 (if (logtest? (-> this flags) (fail-mission-flags famflags-2))
|
|
(the-as int (-> this fail-message))
|
|
393
|
|
)
|
|
)
|
|
)
|
|
(when (nonzero? s4-0)
|
|
(let ((s3-0 print-game-text))
|
|
(format (clear *temp-string*) (lookup-text! *common-text* (the-as text-id s4-0) #f) 1)
|
|
(s3-0 *temp-string* gp-0 #f 44 (bucket-id progress))
|
|
)
|
|
)
|
|
)
|
|
(when (= (-> this message) (fail-mission-message fammsg-1))
|
|
(let ((v1-17 gp-0))
|
|
(set! (-> v1-17 height) (the float 95))
|
|
)
|
|
(let ((s5-1 print-game-text))
|
|
(format (clear *temp-string*) (lookup-text! *common-text* (text-id try-again?) #f) 1)
|
|
(s5-1 *temp-string* gp-0 #f 44 (bucket-id progress))
|
|
)
|
|
(let ((v1-19 gp-0))
|
|
(set! (-> v1-19 height) (the float 155))
|
|
)
|
|
(let ((s5-2 print-game-text))
|
|
(format (clear *temp-string*) (lookup-text! *common-text* (text-id yes-no-prompt) #f) 1)
|
|
(s5-2 *temp-string* gp-0 #f 44 (bucket-id progress))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate idle (fail-mission)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('reset)
|
|
(cond
|
|
((logtest? (-> self flags) (fail-mission-flags famflags-1))
|
|
(persist-with-delay *setting-control* 'fail (seconds 10) 'bg-a 'abs 1.0 0)
|
|
(go-virtual resetting)
|
|
)
|
|
(else
|
|
(logior! (-> self flags) (fail-mission-flags famflags-0))
|
|
(set! (-> self reset-delay) (the-as uint 0))
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
(('query)
|
|
(case (-> block param 0)
|
|
(('reset)
|
|
(logtest? (-> self flags) (fail-mission-flags famflags-1))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:exit (behavior ()
|
|
(update-rates! (-> *display* bg-clock) 1.0)
|
|
(update-rates! (-> *display* entity-clock) 1.0)
|
|
(update-rates! (-> *display* target-clock) 1.0)
|
|
(update-rates! (-> *display* camera-clock) 1.0)
|
|
)
|
|
:code (behavior ()
|
|
(when (and *target* (focus-test? *target* dead))
|
|
(if (and (logtest? (-> self flags) (fail-mission-flags famflags-3)) (zero? (-> self message)))
|
|
(deactivate self)
|
|
)
|
|
(if (= (-> self message) (fail-mission-message fammsg-0))
|
|
(logior! (-> self flags) (fail-mission-flags famflags-3))
|
|
)
|
|
)
|
|
(case (-> self message)
|
|
(((fail-mission-message fammsg-0))
|
|
(while (begin
|
|
(if (and *target* (focus-test? *target* grabbed))
|
|
(process-release? *target*)
|
|
)
|
|
(let ((a1-0 (new 'stack-no-clear 'event-message-block)))
|
|
(set! (-> a1-0 from) (process->ppointer self))
|
|
(set! (-> a1-0 num-params) 2)
|
|
(set! (-> a1-0 message) 'attack-invinc)
|
|
(set! (-> a1-0 param 0) (the-as uint #f))
|
|
(set! (-> a1-0 param 1) (the-as uint (static-attack-info ((id (new-attack-id)) (mode 'bot)))))
|
|
(not (or (send-event-function *target* a1-0) (and *target* (focus-test? *target* dead))))
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(((fail-mission-message fammsg-1))
|
|
(while (not (process-grab? *target* 'dead))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
(logior! (-> self flags) (fail-mission-flags famflags-1))
|
|
(set-time! (-> self grabbed-time))
|
|
(when (not (logtest? (-> self flags) (fail-mission-flags famflags-3)))
|
|
(when (not (logtest? (-> self flags) (fail-mission-flags famflags-5)))
|
|
(while (not (time-elapsed? (-> self grabbed-time) (seconds 1.5)))
|
|
(let ((f30-0 (lerp-scale 0.0 1.0 (the float (- (current-time) (-> self grabbed-time))) 0.0 450.0)))
|
|
(set-filter-color!
|
|
(lerp-scale 1.0 1.25 f30-0 0.0 1.0)
|
|
(lerp-scale 1.0 0.875 f30-0 0.0 1.0)
|
|
(lerp-scale 1.0 0.25 f30-0 0.0 1.0)
|
|
)
|
|
(update-rates! (-> *display* bg-clock) (- 1.0 f30-0))
|
|
(update-rates! (-> *display* entity-clock) (- 1.0 f30-0))
|
|
(update-rates! (-> *display* target-clock) (- 1.0 f30-0))
|
|
(update-rates! (-> *display* camera-clock) (- 1.0 f30-0))
|
|
)
|
|
(print-text self)
|
|
(suspend)
|
|
)
|
|
(set! (-> self clock) (-> *display* real-clock))
|
|
(logclear! (-> self mask) (process-mask freeze))
|
|
(set-master-mode 'freeze)
|
|
)
|
|
)
|
|
(case (-> self message)
|
|
(((fail-mission-message fammsg-0))
|
|
(until #f
|
|
(when (or (and (logtest? (-> self flags) (fail-mission-flags famflags-0))
|
|
(time-elapsed? (-> self grabbed-time) (the-as time-frame (-> self reset-delay)))
|
|
)
|
|
(or (cpad-pressed? 0 confirm) (logtest? (-> self flags) (fail-mission-flags famflags-3)))
|
|
)
|
|
(logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons confirm))
|
|
(logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons confirm))
|
|
(persist-with-delay *setting-control* 'fail (seconds 10) 'bg-a 'abs 1.0 0)
|
|
(go-virtual resetting)
|
|
)
|
|
(print-text self)
|
|
(suspend)
|
|
)
|
|
#f
|
|
)
|
|
(((fail-mission-message fammsg-1))
|
|
(until #f
|
|
(when (or (cpad-pressed? 0 confirm) (logtest? (-> self flags) (fail-mission-flags famflags-3)))
|
|
(logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons confirm))
|
|
(logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons confirm))
|
|
(set! (-> self retry) #t)
|
|
(while (not (process-release? *target*))
|
|
(suspend)
|
|
)
|
|
(suspend)
|
|
(persist-with-delay *setting-control* 'fail (seconds 10) 'bg-a 'abs 1.0 0)
|
|
(go-virtual resetting)
|
|
)
|
|
(when (cpad-pressed? 0 triangle)
|
|
(logclear! (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons triangle))
|
|
(logclear! (-> *cpad-list* cpads 0 button0-rel 0) (pad-buttons triangle))
|
|
(set! (-> self retry) #f)
|
|
(while (not (process-release? *target*))
|
|
(suspend)
|
|
)
|
|
(suspend)
|
|
(go-virtual resetting)
|
|
)
|
|
(print-text self)
|
|
(suspend)
|
|
)
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod deactivate ((this fail-mission))
|
|
(set-filter-color! 1.0 1.0 1.0)
|
|
(sound-group-continue (sound-group sfx music dialog sog3 ambient dialog2 sog6 sog7))
|
|
(update-rates! (-> *display* bg-clock) 1.0)
|
|
(update-rates! (-> *display* entity-clock) 1.0)
|
|
(update-rates! (-> *display* target-clock) 1.0)
|
|
(update-rates! (-> *display* camera-clock) 1.0)
|
|
(call-parent-method this)
|
|
(none)
|
|
)
|
|
|
|
(defstate resetting (fail-mission)
|
|
:virtual #t
|
|
:event (behavior ((proc process) (argc int) (message symbol) (block event-message-block))
|
|
(case message
|
|
(('reset)
|
|
#t
|
|
)
|
|
(('query)
|
|
(case (-> block param 0)
|
|
(('reset)
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
:enter (behavior ()
|
|
'()
|
|
)
|
|
:exit (behavior ()
|
|
(if (= *master-mode* 'freeze)
|
|
(set-master-mode 'game)
|
|
)
|
|
(process-release? *target*)
|
|
)
|
|
:code (behavior ()
|
|
(local-vars (a1-10 string))
|
|
(let ((gp-0 (current-time)))
|
|
(until (time-elapsed? gp-0 (seconds 1))
|
|
(let ((f30-0 (lerp-scale 1.0 0.0 (the float (- (current-time) gp-0)) 0.0 270.0)))
|
|
(when *sound-player-enable*
|
|
(let ((v1-6 (the-as sound-rpc-set-param (get-sound-buffer-entry))))
|
|
(set! (-> v1-6 command) (sound-command set-param))
|
|
(set! (-> v1-6 id) (-> self stinger))
|
|
(set! (-> v1-6 params volume) (the int (* 1024.0 f30-0)))
|
|
(set! (-> v1-6 params mask) (the-as uint 1))
|
|
(-> v1-6 id)
|
|
)
|
|
)
|
|
)
|
|
(let ((f30-1 (lerp-scale 1.0 0.0 (the float (- (current-time) gp-0)) 0.0 300.0)))
|
|
(set-filter-color!
|
|
(lerp-scale 1.0 1.25 f30-1 0.0 1.0)
|
|
(lerp-scale 1.0 0.875 f30-1 0.0 1.0)
|
|
(lerp-scale 1.0 0.25 f30-1 0.0 1.0)
|
|
)
|
|
)
|
|
(suspend)
|
|
)
|
|
)
|
|
(case (-> self message)
|
|
(((fail-mission-message fammsg-0))
|
|
(let ((a1-6 (-> self fail-continue)))
|
|
(if a1-6
|
|
(set-continue! *game-info* a1-6 #t)
|
|
)
|
|
)
|
|
(task-node-reset 'life)
|
|
(update-task-masks 'life)
|
|
(send-event *target* 'end-mode)
|
|
)
|
|
(((fail-mission-message fammsg-1))
|
|
(cond
|
|
((-> self retry)
|
|
(let ((a1-8 (-> self retry-continue)))
|
|
(if a1-8
|
|
(set-continue! *game-info* a1-8 #t)
|
|
)
|
|
)
|
|
(initialize! *game-info* 'try (the-as game-save #f) (the-as string #f))
|
|
)
|
|
((begin (set! a1-10 (-> self fail-continue)) a1-10)
|
|
(set-continue! *game-info* a1-10 #t)
|
|
(initialize! *game-info* 'life (the-as game-save #f) (the-as string #f))
|
|
)
|
|
(else
|
|
(task-node-reset 'life)
|
|
(update-task-masks 'life)
|
|
(if (and *target* (focus-test? *target* dead grabbed))
|
|
(send-event *target* 'end-mode)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(persist-with-delay *setting-control* 'allow-continue (seconds 3) 'allow-continue #f 0.0 0)
|
|
(persist-with-delay *setting-control* 'speech-control (seconds 3) 'speech-control #f 0.0 0)
|
|
(persist-with-delay *setting-control* 'music-volume (seconds 3) 'music-volume 'abs 0.0 0)
|
|
(persist-with-delay *setting-control* 'sfx-volume (seconds 3) 'music-volume 'abs 0.0 0)
|
|
)
|
|
)
|
|
|
|
(defbehavior fail-mission-init-by-other fail-mission ((arg0 fail-mission-params))
|
|
(set! (-> self message) (-> arg0 message))
|
|
(set! (-> self flags) (-> arg0 flags))
|
|
(set! (-> self retry-continue) (-> arg0 retry-continue))
|
|
(set! (-> self fail-continue) (-> arg0 fail-continue))
|
|
(set! (-> self reset-delay) (-> arg0 reset-delay))
|
|
(set! (-> self task) (-> arg0 task))
|
|
(set! (-> self fail-message) (-> arg0 fail-message))
|
|
(set-setting! 'allow-continue #f 0.0 0)
|
|
(set-setting! 'minimap 'clear 0.0 (minimap-flag minimap))
|
|
(set-action!
|
|
*gui-control*
|
|
(gui-action stop)
|
|
(the-as sound-id 1)
|
|
(gui-channel guard)
|
|
(gui-action none)
|
|
(the-as string #f)
|
|
(the-as (function gui-connection symbol) #f)
|
|
(the-as process #f)
|
|
)
|
|
(set-action!
|
|
*gui-control*
|
|
(gui-action stop)
|
|
(the-as sound-id 1)
|
|
(gui-channel citizen)
|
|
(gui-action none)
|
|
(the-as string #f)
|
|
(the-as (function gui-connection symbol) #f)
|
|
(the-as process #f)
|
|
)
|
|
(when (not (logtest? (-> arg0 flags) (fail-mission-flags famflags-4)))
|
|
(if (not (and *target* (focus-test? *target* dead) (zero? (-> self message))))
|
|
(set! (-> self stinger)
|
|
(add-process *gui-control* *target* (gui-channel background) (gui-action play) "lose1" -99.0 0)
|
|
)
|
|
)
|
|
)
|
|
(set-setting! 'music-volume 'abs 0.0 0)
|
|
(set-setting! 'sfx-volume 'abs 0.0 0)
|
|
(set-setting! 'speech-control #f 0.0 0)
|
|
(set! (-> self clock) (-> *display* base-clock))
|
|
(apply-settings *setting-control*)
|
|
(if (or (not (logtest? (-> self flags) (fail-mission-flags famflags-2)))
|
|
(nonzero? (-> self fail-message))
|
|
(= (-> self message) (fail-mission-message fammsg-1))
|
|
)
|
|
(set! (-> self message-id)
|
|
(add-process *gui-control* self (gui-channel supertitle) (gui-action play) "fail" 81920.0 0)
|
|
)
|
|
)
|
|
(go-virtual idle)
|
|
)
|
|
|
|
(defmethod start! ((this fail-mission-control) (arg0 fail-mission-params))
|
|
(when (not (handle->process (-> this process)))
|
|
(let ((v1-4 (process-spawn fail-mission arg0 :to *entity-pool*)))
|
|
(when v1-4
|
|
(set! (-> this process) (process->handle (-> v1-4 0)))
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defmethod reset! ((this fail-mission-control))
|
|
(send-event (handle->process (-> this process)) 'reset)
|
|
)
|
|
|
|
;; WARN: Return type mismatch object vs symbol.
|
|
(defmethod reset? ((this fail-mission-control))
|
|
(the-as symbol (send-event (handle->process (-> this process)) 'query 'reset))
|
|
)
|
|
|
|
;; WARN: Return type mismatch process vs fail-mission.
|
|
(defmethod get-proc ((this fail-mission-control))
|
|
(the-as fail-mission (handle->process (-> this process)))
|
|
)
|
|
|
|
(defmethod copy-hooks! ((this game-task-node-info) (arg0 game-task-node-info))
|
|
(when (and (-> this info) (-> arg0 info))
|
|
(countdown (v1-3 7)
|
|
(set! (-> this info hooks v1-3) (-> arg0 info hooks v1-3))
|
|
)
|
|
)
|
|
this
|
|
)
|
|
|
|
;; WARN: Return type mismatch process vs task-manager.
|
|
(defmethod relocate ((this task-manager) (arg0 int))
|
|
(if (nonzero? (-> this link))
|
|
(+! (-> this link) arg0)
|
|
)
|
|
(the-as task-manager ((method-of-type process relocate) this arg0))
|
|
)
|
|
|
|
(defbehavior task-manager-init-by-other task-manager ((arg0 game-task-node-info) (arg1 symbol))
|
|
(stack-size-set! (-> self main-thread) 3072) ;; increased from 1024
|
|
(add-connection *task-manager-engine* self nothing self arg0 #f)
|
|
(set! (-> self node-info) arg0)
|
|
(set! (-> self lev-name) arg1)
|
|
(add-setting! 'task arg0 0.0 0)
|
|
(add-setting! 'task-manager (process->ppointer self) 0.0 0)
|
|
(set-time! (-> self intro-time))
|
|
(set! (-> self fail-on-death?) (not (logtest? (-> arg0 flags) (game-task-node-flag no-fail-on-death))))
|
|
(when arg1
|
|
(let* ((v1-15 (level-get *level* arg1))
|
|
(a1-6 (if (and (nonzero? (-> v1-15 entity)) (> (-> v1-15 entity length) 0))
|
|
(-> v1-15 entity data 0 entity)
|
|
)
|
|
)
|
|
)
|
|
(if a1-6
|
|
(process-entity-set! self a1-6)
|
|
)
|
|
)
|
|
)
|
|
(initialize! self)
|
|
(go-virtual wait)
|
|
)
|
|
|
|
(defmethod kill-all-children ((this task-manager))
|
|
(while (-> this child)
|
|
(deactivate (ppointer->process (-> this child)))
|
|
)
|
|
0
|
|
)
|
|
|
|
(defmethod check-time ((this task-manager))
|
|
(when (nonzero? (-> this start-time))
|
|
(let ((v1-3 (handle->process (-> this hud-timer))))
|
|
(if (and *target* (not v1-3))
|
|
(set! (-> this hud-timer) (ppointer->handle (process-spawn hud-timer :init hud-init-by-other :to *target*)))
|
|
)
|
|
)
|
|
(let ((v1-15 (- (-> this time-limit) (- (current-time) (-> this start-time)))))
|
|
(let ((a0-15 *game-info*))
|
|
(set! (-> a0-15 timer) v1-15)
|
|
(set! (-> a0-15 timer-flash) (< v1-15 (seconds 10)))
|
|
)
|
|
(when (< v1-15 0)
|
|
(if *debug-segment*
|
|
(format #t "task failed: ran out of time~%")
|
|
)
|
|
(send-event (handle->process (-> this hud-timer)) 'hide-and-die)
|
|
(go (method-of-object this fail))
|
|
)
|
|
)
|
|
)
|
|
0
|
|
)
|
|
|
|
(defmethod initialize! ((this task-manager))
|
|
(set! (-> this info) (-> this node-info info))
|
|
(countdown (v1-2 32)
|
|
(set! (-> this slave v1-2) (the-as handle #f))
|
|
)
|
|
(countdown (v1-5 4)
|
|
(set! (-> this hud v1-5) (the-as handle #f))
|
|
)
|
|
(set! (-> this arrow) (the-as handle #f))
|
|
(countdown (v1-8 4)
|
|
(set! (-> this minimap v1-8) #f)
|
|
)
|
|
(countdown (v1-11 4)
|
|
(set! (-> this actor-group v1-11) (the-as (pointer entity-actor) #f))
|
|
)
|
|
(set! (-> this fail-now) #f)
|
|
(set! (-> this retry-now) #f)
|
|
(set! (-> this allow-fail) #t)
|
|
0
|
|
)
|
|
|
|
(defmethod deactivate ((this task-manager))
|
|
(with-pp
|
|
(let ((s5-0 pp))
|
|
(set! pp this)
|
|
(let ((t9-0 (-> this info cleanup-hook)))
|
|
(if t9-0
|
|
(t9-0)
|
|
)
|
|
)
|
|
(set! pp s5-0)
|
|
)
|
|
(countdown (s5-1 4)
|
|
(send-event (handle->process (-> this hud s5-1)) 'hide-and-die)
|
|
)
|
|
((method-of-type process deactivate) this)
|
|
(none)
|
|
)
|
|
)
|
|
|
|
(defbehavior task-manager-event-handler task-manager ((arg0 process) (arg1 int) (arg2 symbol) (arg3 event-message-block))
|
|
(local-vars (v0-0 object))
|
|
(case arg2
|
|
(('fail)
|
|
(if (not (and (-> self next-state) (let ((v1-4 (-> self next-state name)))
|
|
(or (= v1-4 'complete) (= v1-4 'fail) (= v1-4 'retry))
|
|
)
|
|
)
|
|
)
|
|
(go-virtual fail)
|
|
)
|
|
)
|
|
(('retry)
|
|
(if (and (not (and (-> self next-state) (let ((v1-10 (-> self next-state name)))
|
|
(or (= v1-10 'complete) (= v1-10 'fail) (= v1-10 'retry))
|
|
)
|
|
)
|
|
)
|
|
(-> self info retry-continue)
|
|
)
|
|
(go-virtual retry)
|
|
)
|
|
)
|
|
(('complete)
|
|
(if (or (not (and (-> self next-state) (let ((v1-18 (-> self next-state name)))
|
|
(or (= v1-18 'complete) (= v1-18 'fail) (= v1-18 'retry))
|
|
)
|
|
)
|
|
)
|
|
(not (-> self allow-fail))
|
|
)
|
|
(go-virtual complete)
|
|
)
|
|
)
|
|
(('wait)
|
|
(go-virtual wait)
|
|
)
|
|
(('active)
|
|
(go-virtual active)
|
|
)
|
|
(('fail-on-death)
|
|
(set! v0-0 (-> arg3 param 0))
|
|
(set! (-> self fail-on-death?) (the-as symbol v0-0))
|
|
v0-0
|
|
)
|
|
(('target)
|
|
(case (-> arg3 param 0)
|
|
(('die)
|
|
(when (-> self fail-on-death?)
|
|
(if (and (-> self next-state) (= (-> self next-state name) 'active))
|
|
(go-virtual fail)
|
|
)
|
|
(when (and (-> self next-state) (let ((v1-40 (-> self next-state name)))
|
|
(or (= v1-40 'active) (= v1-40 'fail) (= v1-40 'retry))
|
|
)
|
|
)
|
|
(if (or (-> self info retry-continue) (-> self info fail-continue))
|
|
'wait
|
|
#f
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(('fail-continue)
|
|
(if (and (-> self info fail-continue)
|
|
(= (-> *setting-control* user-current exclusive-task) (-> self node-info task))
|
|
)
|
|
(-> self info fail-continue)
|
|
)
|
|
)
|
|
(('fail-immediately)
|
|
(when (or (not (and (-> self next-state) (let ((v1-54 (-> self next-state name)))
|
|
(or (= v1-54 'complete) (= v1-54 'fail) (= v1-54 'retry))
|
|
)
|
|
)
|
|
)
|
|
(not (-> self allow-fail))
|
|
)
|
|
(set! (-> self allow-fail) #t)
|
|
(set! (-> self fail-now) #t)
|
|
(go-virtual fail)
|
|
)
|
|
)
|
|
(('allow-fail)
|
|
(set! v0-0 (-> arg3 param 0))
|
|
(set! (-> self allow-fail) (the-as symbol v0-0))
|
|
v0-0
|
|
)
|
|
(('retry-immediately)
|
|
(when (and (or (not (and (-> self next-state) (let ((v1-64 (-> self next-state name)))
|
|
(or (= v1-64 'complete) (= v1-64 'fail) (= v1-64 'retry))
|
|
)
|
|
)
|
|
)
|
|
(not (-> self allow-fail))
|
|
)
|
|
(-> self info retry-continue)
|
|
)
|
|
(set! (-> self retry-now) #t)
|
|
(go-virtual retry)
|
|
)
|
|
)
|
|
(else
|
|
(let ((t9-8 (-> self info event-hook)))
|
|
(if t9-8
|
|
(t9-8 arg0 arg1 arg2 arg3)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
;; WARN: Return type mismatch object vs symbol.
|
|
(defmethod task-manager-method-22 ((this task-manager))
|
|
(the-as
|
|
symbol
|
|
(and (or (not (logtest? (-> this node-info flags) (game-task-node-flag city-wait)))
|
|
(let ((a0-2 (level-get-target-inside *level*)))
|
|
(cond
|
|
((not (and a0-2 (logtest? (-> a0-2 info level-flags) 1)))
|
|
(set-time! (-> this intro-time))
|
|
#f
|
|
)
|
|
(else
|
|
#t
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(or (zero? (-> this info intro-delay))
|
|
(time-elapsed? (-> this intro-time) (the-as time-frame (-> this info intro-delay)))
|
|
)
|
|
(and *target* (not (logtest? (focus-status dead teleporting) (-> *target* focus-status))))
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate wait (task-manager)
|
|
:virtual #t
|
|
:event task-manager-event-handler
|
|
:trans (behavior ()
|
|
(if (or (and (nonzero? (-> self info final-node)) (task-node-closed? (-> self info final-node)))
|
|
(and (not (logtest? (-> self node-info flags) (game-task-node-flag closed)))
|
|
(not (open? (-> self node-info)))
|
|
)
|
|
)
|
|
(deactivate self)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(while (or (not *target*) (not *spawn-actors*))
|
|
(suspend)
|
|
)
|
|
(when (or (logtest? (-> self node-info flags) (game-task-node-flag intro-wait city-wait))
|
|
(nonzero? (-> self info intro-delay))
|
|
)
|
|
(while (not (task-manager-method-22 self))
|
|
(suspend)
|
|
)
|
|
(let ((a0-3 (-> self info intro-scene)))
|
|
(if a0-3
|
|
(talker-spawn-func (string->talker-speech a0-3) *entity-pool* (target-pos 0) (the-as region #f))
|
|
)
|
|
)
|
|
(if (logtest? (-> self node-info flags) (game-task-node-flag intro-wait))
|
|
(close! (-> self node-info) 'event)
|
|
)
|
|
)
|
|
(let ((t9-5 (-> self info init-hook)))
|
|
(if t9-5
|
|
(t9-5)
|
|
)
|
|
)
|
|
(go-virtual active)
|
|
)
|
|
)
|
|
|
|
(defstate active (task-manager)
|
|
:virtual #t
|
|
:event task-manager-event-handler
|
|
:trans (behavior ()
|
|
((-> (method-of-object self wait) trans))
|
|
(let ((t9-1 (-> self info update-hook)))
|
|
(if t9-1
|
|
(t9-1)
|
|
)
|
|
)
|
|
)
|
|
:code (behavior ()
|
|
(let ((t9-0 (-> self info code-hook)))
|
|
(if t9-0
|
|
(t9-0)
|
|
)
|
|
)
|
|
;; og:preserve-this
|
|
(#when PC_PORT
|
|
(set! (-> self post-hook) #f))
|
|
(until #f
|
|
(if *debug-segment*
|
|
(format *stdcon* "task-manager: alive task ~A~%" (game-task->string (-> self node-info task)))
|
|
)
|
|
(suspend)
|
|
)
|
|
#f
|
|
)
|
|
;; og:preserve-this added this so we can see it during the code-hook
|
|
:post (behavior ()
|
|
(if *debug-segment*
|
|
(format *stdcon* "task-manager: alive in code task ~A~%" (game-task->string (-> self node-info task)))
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate complete (task-manager)
|
|
:virtual #t
|
|
:event task-manager-event-handler
|
|
:code (behavior ()
|
|
(if (handle->process (-> *fail-mission-control* process))
|
|
(sleep-code)
|
|
)
|
|
(send-event (handle->process (-> self arrow)) 'die)
|
|
(countdown (gp-0 4)
|
|
(send-event (handle->process (-> self hud gp-0)) 'hide-and-die)
|
|
)
|
|
(let ((t9-3 (-> self info complete-hook)))
|
|
(if t9-3
|
|
(t9-3)
|
|
)
|
|
)
|
|
(set-time! (-> self state-time))
|
|
(when (logtest? (-> self info mask) (task-manager-mask resolution-scene))
|
|
(let ((gp-2 (ppointer->handle (process-spawn
|
|
scene-player
|
|
:init scene-player-init
|
|
(-> self info resolution-scene)
|
|
#t
|
|
(-> self info resolution-scene-continue)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(while (handle->process (the-as handle gp-2))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
(let ((gp-3 (-> self info on-complete)))
|
|
(if gp-3
|
|
(script-eval gp-3)
|
|
)
|
|
)
|
|
(task-node-close! (-> self info final-node))
|
|
(while (-> self child)
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate fail (task-manager)
|
|
:virtual #t
|
|
:event task-manager-event-handler
|
|
:exit (behavior ()
|
|
(disable *screen-filter*)
|
|
)
|
|
:code (behavior ()
|
|
(while (not (-> self allow-fail))
|
|
(suspend)
|
|
)
|
|
(send-event (handle->process (-> self arrow)) 'die)
|
|
(countdown (gp-0 4)
|
|
(send-event (handle->process (-> self hud gp-0)) 'hide-and-die)
|
|
)
|
|
(let ((t9-2 (-> self info fail-hook)))
|
|
(if t9-2
|
|
(t9-2)
|
|
)
|
|
)
|
|
(let ((gp-1 (-> self info on-fail)))
|
|
(if gp-1
|
|
(script-eval gp-1)
|
|
)
|
|
)
|
|
(let ((a0-10 (-> self info retry-continue))
|
|
(v1-28 (-> self info fail-continue))
|
|
)
|
|
(when (or a0-10 v1-28)
|
|
(let ((a1-5 (new 'stack-no-clear 'fail-mission-params)))
|
|
(cond
|
|
((and (logtest? (-> self node-info flags) (game-task-node-flag task-retry))
|
|
(logtest? (-> self info mask) (task-manager-mask retry-message))
|
|
)
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0 famflags-2))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-1))
|
|
(set! (-> a1-5 retry-continue) a0-10)
|
|
(set! (-> a1-5 fail-continue) v1-28)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (-> self node-info task))
|
|
(set! (-> a1-5 fail-message) (-> self info retry-message))
|
|
)
|
|
((logtest? (-> self node-info flags) (game-task-node-flag task-retry))
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-1))
|
|
(set! (-> a1-5 retry-continue) a0-10)
|
|
(set! (-> a1-5 fail-continue) v1-28)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (-> self node-info task))
|
|
(set! (-> a1-5 fail-message) (text-id null))
|
|
)
|
|
((logtest? (-> self info mask) (task-manager-mask fail-message))
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0 famflags-2))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-0))
|
|
(set! (-> a1-5 retry-continue) a0-10)
|
|
(set! (-> a1-5 fail-continue) v1-28)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (-> self node-info task))
|
|
(set! (-> a1-5 fail-message) (-> self info fail-message))
|
|
)
|
|
(else
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-0))
|
|
(set! (-> a1-5 retry-continue) a0-10)
|
|
(set! (-> a1-5 fail-continue) v1-28)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (-> self node-info task))
|
|
(set! (-> a1-5 fail-message) (text-id null))
|
|
)
|
|
)
|
|
(if (logtest? (game-task-node-flag no-audio) (-> self node-info flags))
|
|
(logior! (-> a1-5 flags) (fail-mission-flags famflags-4))
|
|
)
|
|
(if (logtest? (game-task-node-flag no-slow-down) (-> self node-info flags))
|
|
(logior! (-> a1-5 flags) (fail-mission-flags famflags-5))
|
|
)
|
|
(when (-> self fail-now)
|
|
(set! (-> a1-5 flags) (fail-mission-flags famflags-0 famflags-2))
|
|
(set! (-> a1-5 message) (fail-mission-message fammsg-0))
|
|
(set! (-> a1-5 retry-continue) v1-28)
|
|
(set! (-> a1-5 fail-continue) v1-28)
|
|
(set! (-> a1-5 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-5 task) (-> self node-info task))
|
|
(set! (-> a1-5 fail-message) (text-id null))
|
|
(set! (-> a1-5 reset-delay) (the-as uint 0))
|
|
(logior! (-> a1-5 flags) (fail-mission-flags famflags-0 famflags-3 famflags-4 famflags-5 famflags-6))
|
|
)
|
|
(start! *fail-mission-control* a1-5)
|
|
)
|
|
(while (handle->process (-> *fail-mission-control* process))
|
|
(suspend)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defstate retry (task-manager)
|
|
:virtual #t
|
|
:event task-manager-event-handler
|
|
:exit (-> (method-of-type task-manager fail) exit)
|
|
:code (behavior ()
|
|
(send-event (handle->process (-> self arrow)) 'die)
|
|
(countdown (gp-0 4)
|
|
(send-event (handle->process (-> self hud gp-0)) 'hide-and-die)
|
|
)
|
|
(let ((t9-2 (-> self info fail-hook)))
|
|
(if t9-2
|
|
(t9-2)
|
|
)
|
|
)
|
|
(let ((v1-20 (-> self info retry-continue)))
|
|
(cond
|
|
(v1-20
|
|
(let ((a1-2 (new 'stack-no-clear 'fail-mission-params)))
|
|
(set! (-> a1-2 flags) (fail-mission-flags famflags-0 famflags-2))
|
|
(set! (-> a1-2 message) (fail-mission-message fammsg-1))
|
|
(set! (-> a1-2 retry-continue) v1-20)
|
|
(set! (-> a1-2 fail-continue) v1-20)
|
|
(set! (-> a1-2 reset-delay) (the-as uint 1500))
|
|
(set! (-> a1-2 task) (-> self node-info task))
|
|
(set! (-> a1-2 fail-message) (text-id null))
|
|
(logior! (-> a1-2 flags) (fail-mission-flags famflags-3 famflags-4))
|
|
(when (-> self retry-now)
|
|
(set! (-> a1-2 reset-delay) (the-as uint 0))
|
|
(logior! (-> a1-2 flags) (fail-mission-flags famflags-0 famflags-3 famflags-4 famflags-5 famflags-6))
|
|
)
|
|
(start! *fail-mission-control* a1-2)
|
|
)
|
|
(while (handle->process (-> *fail-mission-control* process))
|
|
(suspend)
|
|
)
|
|
)
|
|
(else
|
|
(initialize! *game-info* 'try (the-as game-save #f) (the-as string #f))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|