Files
jak-project/goal_src/jak1/engine/debug/default-menu.gc
T
2026-07-28 12:00:35 -07:00

2841 lines
234 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
(bundles "ENGINE.CGO" "GAME.CGO")
(require "engine/camera/cam-update.gc")
(require "engine/game/task/task-control.gc")
(require "engine/draw/drawable.gc")
(require "engine/math/euler.gc")
(require "engine/entity/entity.gc")
(require "engine/debug/memory-usage.gc")
(require "engine/debug/menu.gc")
;; This file is the content of the debug menu: the tree of pages and items, and the callbacks that
;; read and write the setting behind each item. engine/debug/menu.gc owns the types, the rendering
;; and the pad handling; nothing here draws.
;;
;; Two trees are built when the file loads. *debug-menu-context* is the full menu reached from the
;; pause screen, *popup-menu-context* is the short list reached by holding L3 while paused.
;; menu-respond-to-pause activates one of them and *menu-hook* runs both once per frame.
;;
;; Declaring a page
;; ----------------
;; A page is a debug-menu. Items are appended with debug-menu-append-item and the page is reached
;; from its parent through a debug-menu-item-submenu. Most pages are written as a static template
;; and expanded by debug-menu-make-from-template:
;;
;; (menu "Stats"
;; (flag "Poly" *stats-poly* dm-boolean-toggle-pick-func)
;; (function "List Sounds" #f ,(lambda () (list-sounds)))
;; (float-var "Subdiv Close" close dm-subdiv-float 10 1 #t 1 200 1)
;; (menu "Ambient Marks" ...))
;;
;; Every entry is (kind label id callback . extra). The label is what the menu draws, the id is
;; handed to the callback unchanged, and the callback is either a function or a symbol whose value
;; is one. A page that is too large or too dynamic for a template is built by hand instead - the
;; camera, shader, instance and task pages - and build-shader-list, build-instance-list and
;; build-continue-menu fill pages whose contents are only known at run time.
;;
;; Numbers inside a template are boxed, so every value the template reader consumes arrives
;; multiplied by 8 and is divided by 8 on the way out. The item id is not divided: a callback that
;; wants the number the template author wrote has to divide by 8 itself, and the hand-built pages
;; therefore pass ids already multiplied by 8 when they share such a callback. vu1-renderer-mask is
;; defined in that shifted form on purpose - its first bit is 3 - so the render page can pass mask
;; values straight through.
;;
;; The callback contract
;; ---------------------
;; flag item, (function object debug-menu-msg object)
;; Called with the item id and a message. press means the user selected the item, so toggle or
;; apply the setting; update and activate mean the menu is refreshing, so only read. The result
;; is stored in is-on and picks the item colour: #f off, #t on, and any other value - the task
;; pages return 'invalid - draws the item as unavailable. Flag items refresh every 23 frames.
;;
;; function item, (function object object)
;; Called with the item id on press only. The result is not stored; a true value flashes the item
;; blue and a false value flashes it red, so a callback that returns none picks a colour from
;; whatever was left in the result register.
;;
;; variable item, (function int debug-menu-msg X X X)
;; Called with the item id, a message, a proposed value, and the value the item is showing. On
;; press write the proposed value and return what was actually taken; on update ignore the
;; proposal and return the live value. When the setting it edits does not exist the callback
;; returns its fourth argument, which leaves the display alone. Integer and float items keep
;; their value in the same field, so a callback has to match the kind the item was set up with.
;; Forward declarations for stuff we haven't written yet:
(define-extern *edit-instance* string)
;; Necessary forward declarations
;; DECOMP BEGINS
;; this file is debug only
(declare-file (debug))
(define *debug-menu-context* (new 'debug 'debug-menu-context))
(define *dm-cam-mode-interpolation* 0)
(defun dm-cam-mode-func ((mode (state camera-slave)) (msg debug-menu-msg))
"Camera mode flag. On press, ask *camera* to enter the slave state mode, interpolating over
*dm-cam-mode-interpolation* frames. Reports whether that state is running. mode #f is the Off
entry: it changes nothing and reports true while no slave state is active."
(if (and (= msg (debug-menu-msg press)) mode) (send-event *camera* 'change-state mode *dm-cam-mode-interpolation*))
(if *camera* (send-event *camera* 'query-state mode) (not mode)))
(defun dm-cam-settings-func ((option int) (msg debug-menu-msg))
"Camera option flags. option indexes the Camera/Settings page and selects one cam-slave-options
bit, one of two camera-master option bits, or the free-camera reset. On press the selected bit
is toggled; the result reports it. master-options bit 0 stops the camera from following
regions and bit 2 restricts region changes to when the target is on the ground. option 6 is
the Reset Free entry, which is a function item and so arrives here without a message."
(when (and (= msg (debug-menu-msg press)) *camera*)
(cond
((zero? option) (send-event *camera* 'toggle-slave-option (cam-slave-options BUTT_CAM)))
((= option 13) (send-event *camera* 'toggle-slave-option (cam-slave-options BLOCK_SHIFT_BUTTONS)))
((= option 1) (send-event *camera* 'toggle-slave-option (cam-slave-options SAME_SIDE)))
((= option 2) (send-event *camera* 'toggle-slave-option (cam-slave-options MOVE_SPHERICAL)))
((= option 3) (send-event *camera* 'toggle-slave-option (cam-slave-options DRAG)))
((= option 4) (send-event *camera* 'toggle-slave-option (cam-slave-options ALLOW_Z_ROT)))
((= option 7) (send-event *camera* 'toggle-slave-option (cam-slave-options JUMP_PITCHES)))
((= option 8) (send-event *camera* 'toggle-slave-option (cam-slave-options FIND_HIDDEN_TARGET)))
((= option 6) (send-event *camera* 'reset-root))
((= option 9) (logxor! (-> *camera* master-options) 1))
((= option 10) (logxor! (-> *camera* master-options) 4))
((= option 11) (send-event *camera* 'toggle-slave-option (cam-slave-options COLLIDE)))
((= option 12) (send-event *camera* 'toggle-slave-option (cam-slave-options LINE_OF_SIGHT)))
((= option 14) (send-event *camera* 'toggle-slave-option (cam-slave-options NO_ROTATE)))
((= option 15) (send-event *camera* 'toggle-slave-option (cam-slave-options STICKY_ANGLE)))))
(cond
(*camera*
(cond
((zero? option) (logtest? (-> *camera* slave-options) (cam-slave-options BUTT_CAM)))
((= option 13) (logtest? (-> *camera* slave-options) (cam-slave-options BLOCK_SHIFT_BUTTONS)))
((= option 1) (logtest? (-> *camera* slave-options) (cam-slave-options SAME_SIDE)))
((= option 2) (logtest? (-> *camera* slave-options) (cam-slave-options MOVE_SPHERICAL)))
((= option 3) (logtest? (-> *camera* slave-options) (cam-slave-options DRAG)))
((= option 4) (logtest? (-> *camera* slave-options) (cam-slave-options ALLOW_Z_ROT)))
((= option 7) (logtest? (-> *camera* slave-options) (cam-slave-options JUMP_PITCHES)))
((= option 8) (logtest? (-> *camera* slave-options) (cam-slave-options FIND_HIDDEN_TARGET)))
((= option 11) (logtest? (-> *camera* slave-options) (cam-slave-options COLLIDE)))
((= option 12) (logtest? (-> *camera* slave-options) (cam-slave-options LINE_OF_SIGHT)))
((= option 14) (logtest? (-> *camera* slave-options) (cam-slave-options NO_ROTATE)))
((= option 15) (logtest? (cam-slave-options STICKY_ANGLE) (-> *camera* slave-options)))
((= option 9) (logtest? (-> *camera* master-options) 1))
((= option 10) (logtest? (-> *camera* master-options) 4))
(else #f)))
(else #f)))
(defun dm-cam-settings-func-int ((id int) (msg debug-menu-msg) (value int) (fallback int))
"Interp Frms variable. Sets the number of frames the debug menu asks the camera to interpolate
over when changing mode. Only id 40 belongs to this item; anything else returns fallback."
(when (and (= msg (debug-menu-msg press)) *camera*)
(if (= (/ id 8) 5) (set! *dm-cam-mode-interpolation* value)))
(cond
(*camera* (if (= (/ id 8) 5) *dm-cam-mode-interpolation* fallback))
(else fallback)))
(defun dm-cam-externalize ((mode symbol) (msg debug-menu-msg))
"External camera control. reset re-seats the external camera at the current view unless it is
locked, allow-z toggles the z-rotation option, and any other value selects that external mode,
deselecting it if it was already current. Reports whether mode is selected."
(when (= msg (debug-menu-msg press))
(cond
((= mode 'reset) (if (!= *external-cam-mode* 'locked) (external-cam-reset!)))
((= mode 'allow-z) (set! *external-cam-options* (logxor *external-cam-options* (external-cam-option allow-z))))
((= *external-cam-mode* mode) (set! *external-cam-mode* #f))
(else (if (not *external-cam-mode*) (external-cam-reset!)) (set! *external-cam-mode* mode))))
(if (= mode 'allow-z) (logtest? *external-cam-options* (external-cam-option allow-z)) (= *external-cam-mode* mode)))
(defun dm-cam-render-float ((id int) (msg debug-menu-msg) (value float) (fallback float))
"Field of view in degrees. id 0 writes *math-camera* and rebuilds its projection; id 8 asks
*camera* to change fov. Returns the live fov in degrees, or fallback when the object it edits
is missing."
(when (= msg (debug-menu-msg press))
(cond
((zero? (/ id 8))
(when *math-camera*
(set! (-> *math-camera* fov) (* 182.04445 value))
(update-math-camera *math-camera* (-> *setting-control* current video-mode) (-> *setting-control* current aspect-ratio))))
((= (/ id 8) 1) (if *camera* (send-event *camera* 'set-fov (* 182.04445 value))))))
(cond
((zero? (/ id 8))
(cond
(*math-camera* (* 0.005493164 (-> *math-camera* fov)))
(else (empty) fallback)))
((= (/ id 8) 1)
(cond
(*camera* (let ((units-to-degrees 0.005493164)) (* units-to-degrees (the-as float (send-event *camera* 'query-fov)))))
(else (empty) fallback)))
(else (empty) fallback)))
(defun dm-subdiv-float ((setting symbol) (msg debug-menu-msg) (value float) (fallback float))
"Subdivision distance in meters. setting picks close or far, and the value goes into profile 3 of
*subdivide-settings*, which is the profile the artist menu overrides. Returns fallback when the
camera or settings are not loaded."
(when (= msg (debug-menu-msg press))
(case setting
(('close) (if (and *math-camera* *subdivide-settings*) (set! (-> *subdivide-settings* close 3) (meters value))))
(('far) (if (and *math-camera* *subdivide-settings*) (set! (-> *subdivide-settings* far 3) (meters value))))))
(case setting
(('close) (if (and *math-camera* *subdivide-settings*) (/ (-> *subdivide-settings* close 3) METER_LENGTH) fallback))
(('far) (if (and *math-camera* *subdivide-settings*) (/ (-> *subdivide-settings* far 3) METER_LENGTH) fallback))
(else fallback)))
(defun dm-subdiv-int ((setting symbol) (msg debug-menu-msg) (value int) (fallback int))
"Anim Tester playback speed. setting is anim-speed; writes and reads the speed of the running
tester, or returns fallback when no tester is running."
(when (= msg (debug-menu-msg press))
(case setting
(('anim-speed) (if *anim-tester* (set! (-> *anim-tester* 0 speed) value)))))
(case setting
(('anim-speed) (if *anim-tester* (-> *anim-tester* 0 speed) fallback))
(else fallback)))
(defun dm-setting-language ((id int) (msg debug-menu-msg))
"Language flag. Writes the default language setting from id / 8 and reports whether it is the
current one."
(if (= msg (debug-menu-msg press)) (set! (-> *setting-control* default language) (the-as language-enum (/ id 8))))
(= (-> *setting-control* default language) (/ id 8)))
(defun dm-current-continue ((continue-name string) (msg debug-menu-msg))
"Continue point flag. On press, restart the player at the named continue point. Reports whether
it is the continue point the game would resume from."
(if (= msg (debug-menu-msg press)) (start 'play (get-continue-by-name *game-info* continue-name)))
(string= (-> (get-or-create-continue! *game-info*) name) continue-name))
(defun dm-subdiv-draw-func ((id int) (msg debug-menu-msg))
"Terrain subdivision draw mode flag: 0 textured, 1 outline, 2 gouraud, 3 hack, from id / 8."
(if (= msg (debug-menu-msg press)) (set! *subdivide-draw-mode* (/ id 8)))
(= (/ id 8) *subdivide-draw-mode*))
(defun dm-ocean-subdiv-draw-func ((id int) (msg debug-menu-msg))
"Ocean subdivision draw mode flag: 0 textured, 1 outline, 2 gouraud, from id / 8."
(if (= msg (debug-menu-msg press)) (set! *ocean-subdivide-draw-mode* (/ id 8)))
(= (/ id 8) *ocean-subdivide-draw-mode*))
(defun dm-time-of-day-func ((id int) (msg debug-menu-msg))
"Time of day flag. Modes 0 through 7 freeze the clock at a fixed hour; mode 8 starts it running
at the normal or fast rate. Reports whether id / 8 is the current mode."
(when (= msg (debug-menu-msg press))
(set! *time-of-day-mode* (/ id 8))
(set! (-> *time-of-day-proc* 0 minute) 0)
(cond
((zero? (/ id 8)) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 7))
((= (/ id 8) 1) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 9))
((= (/ id 8) 2) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 12))
((= (/ id 8) 3) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 15))
((= (/ id 8) 4) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 18))
((= (/ id 8) 5) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 19))
((= (/ id 8) 6) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 23))
((= (/ id 8) 7) (set! (-> *time-of-day-proc* 0 time-ratio) 0.0) (set! (-> *time-of-day-proc* 0 hour) 4))
((= (/ id 8) 8)
(if *time-of-day-fast* (set! (-> *time-of-day-proc* 0 time-ratio) 18000.0) (set! (-> *time-of-day-proc* 0 time-ratio) 300.0)))))
(= (/ id 8) *time-of-day-mode*))
(defun dm-time-of-day-func2 ((setting (pointer symbol)) (msg debug-menu-msg))
"Fast clock flag. Toggles the boolean held by setting, then re-applies the normal or fast time
ratio if the clock is already running."
(when (= msg (debug-menu-msg press))
(set! (-> setting 0) (not (-> setting 0)))
(when (!= (-> *time-of-day-proc* 0 time-ratio) 0.0)
(if *time-of-day-fast* (set! (-> *time-of-day-proc* 0 time-ratio) 18000.0) (set! (-> *time-of-day-proc* 0 time-ratio) 300.0))))
(-> setting 0))
(defun dm-boolean-toggle-pick-func ((setting (pointer symbol)) (msg debug-menu-msg))
"The flag callback behind most items in this file: toggle the boolean held by the symbol setting
on press, and report its value."
(if (= msg (debug-menu-msg press)) (set! (-> setting 0) (not (-> setting 0))))
(-> setting 0))
(defun dm-time-of-day-pick-func ((id symbol) (msg debug-menu-msg))
"Time of day flag that starts or stops the clock through time-of-day-setup. It returns nothing,
so the item's displayed state is whatever the call left in the result register."
(time-of-day-setup (= msg (debug-menu-msg press)))
(none))
(defun dm-actor-marks-pick-func ((mode symbol) (msg debug-menu-msg))
"*display-actor-marks* selector: #f, #t, full or process."
(if (= msg (debug-menu-msg press)) (set! *display-actor-marks* mode))
(= *display-actor-marks* mode))
(defun dm-compact-actor-pick-func ((mode symbol) (msg debug-menu-msg))
"*compact-actors* selector: #f, #t or debug."
(if (= msg (debug-menu-msg press)) (set! *compact-actors* mode))
(= *compact-actors* mode))
(defun dm-actor-vis-pick-func ((mode symbol) (msg debug-menu-msg))
"*display-actor-vis* selector: #f, box, sphere or #t."
(if (= msg (debug-menu-msg press)) (set! *display-actor-vis* mode))
(= *display-actor-vis* mode))
(defun dm-game-mode-pick-func ((mode symbol) (msg debug-menu-msg))
"Game mode selector: play or debug."
(if (= msg (debug-menu-msg press)) (set! (-> *game-info* mode) mode))
(= (-> *game-info* mode) mode))
(defun dm-vu1-user-toggle-pick-func ((mask vu1-renderer-mask) (msg debug-menu-msg))
"Toggle one renderer in *vu1-enable-user-menu*. vu1-renderer-mask starts at bit 3 so that the
boxed template values pass through unshifted."
(if (= msg (debug-menu-msg press)) (set! *vu1-enable-user-menu* (logxor *vu1-enable-user-menu* (the-as uint mask))))
(logtest? *vu1-enable-user-menu* mask))
(defun dm-vu1-user-set-pick-func ((mask vu1-renderer-mask) (msg debug-menu-msg))
"Replace *vu1-enable-user-menu* outright, for the all on and all off entries. all off keeps the
two unread high bits set."
(if (= msg (debug-menu-msg press)) (set! *vu1-enable-user-menu* mask))
(= *vu1-enable-user-menu* mask))
(defun dm-texture-user-toggle-pick-func ((mask int) (msg debug-menu-msg))
"Toggle one texture category in *texture-enable-user-menu*. The Render page passes boxed values
that are never divided by 8, so every entry reaches the bit three positions above the one its
label names."
(if (= msg (debug-menu-msg press)) (set! *texture-enable-user-menu* (logxor *texture-enable-user-menu* mask)))
(logtest? *texture-enable-user-menu* mask))
(defun dm-texture-user-set-pick-func ((mask int) (msg debug-menu-msg))
"Replace *texture-enable-user-menu* outright, for the all textures on and off entries. Shifted
the same way as dm-texture-user-toggle-pick-func, so all textures on leaves the tfrag, pris and
shrub bits clear."
(if (= msg (debug-menu-msg press)) (set! *texture-enable-user-menu* mask))
(= *texture-enable-user-menu* mask))
(defun dm-strip-lines-toggle-pick-func ((id int) (msg debug-menu-msg))
"Toggle one *display-strip-lines* edge category, id / 8."
(if (= msg (debug-menu-msg press)) (set! *display-strip-lines* (logxor *display-strip-lines* (/ id 8))))
(logtest? *display-strip-lines* (/ id 8)))
(defun dm-strip-lines-set-pick-func ((id int) (msg debug-menu-msg))
"Set *display-strip-lines* to a whole preset, id / 8."
(if (= msg (debug-menu-msg press)) (set! *display-strip-lines* (/ id 8)))
(= *display-strip-lines* (/ id 8)))
(defun dm-edit-instance-toggle-pick-func ((mask int) (msg debug-menu-msg))
"Toggle prototype flag bits on the instance named by *edit-instance*. Reports #f when no instance
is selected or the name is not loaded."
(let ((proto (find-instance-by-name *edit-instance*)))
(when proto
(if (= msg (debug-menu-msg press)) (logxor! (-> proto flags) (the-as uint mask)))
(logtest? (-> proto flags) mask))))
(defun all-texture-tweak-adjust ((dir texture-page-dir) (delta float))
"Shift the uv-dist of every texture in dir by delta and push the change into the adgif shaders
that reference them. The body is disabled, so the all tweak+ and all tweak- items do nothing."
;; (dotimes (s4-0 (-> dir length))
;; (let ((s3-0 (-> dir entries s4-0 page)))
;; (dotimes (s2-0 (min (-> s3-0 length) (-> dir entries s4-0 length)))
;; (when (-> dir entries s4-0 link)
;; (let ((v1-12 (+ (the-as uint (-> dir entries s4-0 link)) (* s2-0 4)))
;; (s1-0 (-> dir entries s4-0 page data s2-0))
;; )
;; (+! (-> s1-0 uv-dist) delta)
;; (+ v1-12 0)
;; (let ((s0-0 (the-as object (* (-> (dynamic-array-field-access v1-12 next PLACEHOLDER) shader) 16))))
;; (while (nonzero? (the-as uint s0-0))
;; (adgif-shader-update! (the-as adgif-shader s0-0) s1-0)
;; (+ (the-as uint s0-0) 40)
;; (set! s0-0 (* (-> (the-as adgif-shader s0-0) next shader) 16))
;; )
;; )
;; )
;; )
;; )
;; )
;; )
0
(none))
(defun debug-menu-node<? ((left debug-menu-node) (right debug-menu-node))
"Order two menu nodes by name, for sorting a page's item list."
(string<=? (-> left name) (-> right name)))
(defun dm-shader-pick-func ((tex-id texture-id) (msg debug-menu-msg))
"Select tex-id as *edit-shader* if its page is loaded and the texture has a shader link. Reports
whether it is the current selection."
(if (and (= msg (debug-menu-msg press))
*texture-page-dir*
(-> *texture-page-dir* entries (-> tex-id page) page)
(-> *texture-page-dir* entries (-> tex-id page) link)
(nonzero? (-> *texture-page-dir* entries (-> tex-id page) link next (-> tex-id index))))
(set! *edit-shader* tex-id))
(and (nonzero? *edit-shader*) (= tex-id *edit-shader*)))
(define *shader-pick-menu* (the-as debug-menu #f))
(defun build-shader-list ()
"Rebuild the Pick Shader page with one entry per loaded texture that has a shader link, sorted by
name. Each entry's id packs the texture index and page index into a texture-id."
(debug-menu-remove-all-items *shader-pick-menu*)
(when *texture-page-dir*
(dotimes (page-index (-> *texture-page-dir* length))
(let ((page (-> *texture-page-dir* entries page-index page))
(page-link (-> *texture-page-dir* entries page-index link)))
(when (and page page-link)
(dotimes (tex-index (-> page length))
(when (and (-> page data tex-index) (nonzero? (-> page-link next tex-index)))
(let ((item (new 'debug
'debug-menu-item-flag
(-> page data tex-index name)
(logior (shr (shl tex-index 52) 44) (shr (shl page-index 52) 32))
dm-shader-pick-func)))
(debug-menu-append-item *shader-pick-menu* item))))))))
(set! (-> *shader-pick-menu* items) (sort (-> *shader-pick-menu* items) debug-menu-node<?))
(none))
(defun dm-instance-pick-func ((name string) (msg debug-menu-msg))
"Select the named instance prototype as *edit-instance*, clearing the selection when no loaded
level has that prototype."
(when (= msg (debug-menu-msg press))
(if (find-instance-by-name name) (set! *edit-instance* name) (set! *edit-instance* #f)))
(and *edit-instance* (string= name *edit-instance*)))
(defun dm-enable-instance-func ((name string) (msg debug-menu-msg))
"Visibility flag for one tie prototype. Toggles its invisible bit and reports the bit inverted,
so the item reads as enabled when the prototype draws."
(let ((proto (find-instance-by-name name)))
(cond
(proto (if (= msg (debug-menu-msg press)) (logxor! (-> proto flags) 1)) (not (logtest? (-> proto flags) 1)))
(else #f))))
(define *instance-shrub-menu* (the-as debug-menu #f))
(define *instance-tie-menu* (the-as debug-menu #f))
(define *enable-instance-tie-menu* (the-as debug-menu #f))
(defun build-instance-list ((id object))
"Rebuild the shrub and tie prototype pages from the prototypes of every active level, sorted by
name. Clears *display-instance-info* because the previous selection no longer applies."
(debug-menu-remove-all-items *instance-shrub-menu*)
(debug-menu-remove-all-items *instance-tie-menu*)
(debug-menu-remove-all-items *enable-instance-tie-menu*)
(set! *display-instance-info* #f)
(dotimes (level-index (-> *level* length))
(let ((active-level (-> *level* level level-index)))
(when (= (-> active-level status) 'active)
(let ((trees (-> active-level bsp drawable-trees)))
(dotimes (tree-index (-> trees length))
(let ((tree (-> trees trees tree-index)))
(case (-> tree type)
((drawable-tree-instance-shrub)
(let ((shrub-protos (-> (the-as drawable-tree-instance-shrub tree) info prototype-inline-array-shrub)))
(dotimes (shrub-index (-> shrub-protos length))
;; og:preserve-this
(let ((item (new 'debug
'debug-menu-item-flag
(-> shrub-protos data shrub-index name)
(-> shrub-protos data shrub-index name)
dm-instance-pick-func)))
(debug-menu-append-item *instance-shrub-menu* item)))))
((drawable-tree-instance-tie)
(let ((tie-protos (-> (the-as drawable-tree-instance-tie tree) prototypes prototype-array-tie)))
(dotimes (tie-index (-> tie-protos length))
(let ((pick-item (new 'debug
'debug-menu-item-flag
(-> tie-protos array-data tie-index name)
(-> tie-protos array-data tie-index name)
dm-instance-pick-func)))
(debug-menu-append-item *instance-tie-menu* pick-item))
(let ((enable-item (new 'debug
'debug-menu-item-flag
(-> tie-protos array-data tie-index name)
(-> tie-protos array-data tie-index name)
dm-enable-instance-func)))
(set! (-> enable-item is-on) #t)
(debug-menu-append-item *enable-instance-tie-menu* enable-item))))))))))))
(set! (-> *instance-shrub-menu* items)
(sort (-> *instance-shrub-menu* items)
(lambda ((left debug-menu) (right debug-menu))
(string<=? (-> left name) (-> right name)))))
(set! (-> *instance-tie-menu* items)
(sort (-> *instance-tie-menu* items)
(lambda ((left debug-menu) (right debug-menu))
(string<=? (-> left name) (-> right name)))))
(set! (-> *enable-instance-tie-menu* items)
(sort (-> *enable-instance-tie-menu* items)
(lambda ((left debug-menu) (right debug-menu))
(string<=? (-> left name) (-> right name)))))
0
(none))
(defun debug-create-cam-restore ()
"Print a cam-restore function to the listener that reproduces the current camera position,
orientation, fov and level, together with the profile times, tfrag memory total and polygon
statistics needed to compare a later frame against this one."
(cond
(*math-camera*
(format #t "(defun-debug cam-restore ()~%")
(format #t " ;;this function is a hack, don't use it as an example~%")
(format #t " (let ((pos (new 'stack 'vector))~%")
(format #t " (rot (new 'stack 'matrix)))~%")
(format #t " (set! (-> pos x) ~12F)~%" (-> *math-camera* trans x))
(format #t " (set! (-> pos y) ~12F)~%" (-> *math-camera* trans y))
(format #t " (set! (-> pos z) ~12F)~%" (-> *math-camera* trans z))
(format #t " (set! (-> pos w) 1.0)~%")
(format #t " (set! (-> rot data 0) ~12F)~%" (-> *math-camera* inv-camera-rot vector 0 x))
(format #t " (set! (-> rot data 1) ~12F)~%" (-> *math-camera* inv-camera-rot vector 0 y))
(format #t " (set! (-> rot data 2) ~12F)~%" (-> *math-camera* inv-camera-rot vector 0 z))
(format #t " (set! (-> rot data 3) ~12F)~%" (-> *math-camera* inv-camera-rot vector 0 w))
(format #t " (set! (-> rot data 4) ~12F)~%" (-> *math-camera* inv-camera-rot vector 1 x))
(format #t " (set! (-> rot data 5) ~12F)~%" (-> *math-camera* inv-camera-rot vector 1 y))
(format #t " (set! (-> rot data 6) ~12F)~%" (-> *math-camera* inv-camera-rot vector 1 z))
(format #t " (set! (-> rot data 7) ~12F)~%" (-> *math-camera* inv-camera-rot vector 1 w))
(format #t " (set! (-> rot data 8) ~12F)~%" (-> *math-camera* inv-camera-rot vector 2 x))
(format #t " (set! (-> rot data 9) ~12F)~%" (-> *math-camera* inv-camera-rot vector 2 y))
(format #t " (set! (-> rot data 10) ~12F)~%" (-> *math-camera* inv-camera-rot vector 2 z))
(format #t " (set! (-> rot data 11) ~12F)~%" (-> *math-camera* inv-camera-rot vector 2 w))
(format #t " (set! (-> rot data 12) ~12F)~%" 0.0)
(format #t " (set! (-> rot data 13) ~12F)~%" 0.0)
(format #t " (set! (-> rot data 14) ~12F)~%" 0.0)
(format #t " (set! (-> rot data 15) ~12F)~%" 1.0)
(let ((angles (new 'stack-no-clear 'euler-angles)))
(matrix->eul angles (-> *math-camera* inv-camera-rot) 21)
(format #t " ;; euler angles (xyz order degrees) x ~R y ~R z ~R~%" (-> angles x) (-> angles y) (-> angles z))
(format #t
" ;; MAYA euler angles (xyz order degrees) x ~R y ~R z ~R~%"
(-> angles x)
(- 32768.0 (-> angles y))
(-> angles z)))
(format #t " (debug-set-camera-pos-rot! pos rot)~%")
(format #t " (send-event *camera* 'set-fov (deg ~f))~%" (* 0.005493164 (-> *math-camera* fov)))
(format #t " (clear *camera-old-level*)~%")
(format #t " (format *camera-old-level* \"~A\")~%" (-> *level* level0 name))
(let ((format-fn format)
(format-dest #t)
(format-string " (set! *camera-old-cpu* ~D)~%")
(cpu-bar (-> *display* frames (-> *display* last-screen) frame profile-bar 0)))
(format-fn format-dest format-string (-> cpu-bar data (+ (-> cpu-bar profile-frame-count) -2) time-stamp)))
(let ((format-fn format)
(format-dest #t)
(format-string " (set! *camera-old-vu* ~D)~%")
(vu-bar (-> *display* frames (-> *display* last-screen) frame profile-bar 1)))
(format-fn format-dest format-string (-> vu-bar data (+ (-> vu-bar profile-frame-count) -2) time-stamp)))
(compute-memory-usage (-> *level* level0) #f)
(format #t
" (set! *camera-old-tfrag-bytes* ~D)~%"
(+ (-> *level* level0 mem-usage-block data 1 total)
(-> *level* level0 mem-usage-block data 2 total)
(-> *level* level0 mem-usage-block data 3 total)
(-> *level* level0 mem-usage-block data 4 total)
(-> *level* level0 mem-usage-block data 5 total)
(-> *level* level0 mem-usage-block data 6 total)
(-> *level* level0 mem-usage-block data 7 total)
(-> *level* level0 mem-usage-block data 8 total)))
(format #t " (clear *camera-old-stat-string-tfrag*)~%")
(format #t " (clear *camera-old-stat-string-tfrag-near*)~%")
(format #t " (clear *camera-old-stat-string-total*)~%")
(when *stats-poly*
(format #t " (format *camera-old-stat-string-tfrag* \"~S\")~%" *stat-string-tfrag*)
(format #t " (format *camera-old-stat-string-tfrag-near* \"~S\")~%" *stat-string-tfrag-near*)
(format #t " (format *camera-old-stat-string-total* \"~S\")~%" *stat-string-total*))
(format #t " (set! *display-camera-old-stats* #t)~%")
(format #t " )~%")
(format #t " )~%"))
(else (format #t "camera save failed~%")))
(none))
(defun debug-menu-make-camera-mode-menu ((menu debug-menu) (mode-menu debug-menu))
"Fill mode-menu with one entry per camera slave state and attach it to menu."
;; the result of this one is thrown away; all it does is reparent menu, and a menu's parent is
;; never read.
(new 'debug 'debug-menu-item-submenu "Camera" menu)
(let ((item (new 'debug 'debug-menu-item-submenu "Mode" mode-menu))) (debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Off" #f dm-cam-mode-func))) (debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Free-floating" cam-free-floating dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Fixed" cam-fixed dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Pov" cam-pov dm-cam-mode-func))) (debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Pov180" cam-pov180 dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Billy" cam-billy dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Pov-track" cam-pov-track dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Decel" cam-decel dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Endless fall" cam-endlessfall dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Eye" cam-eye dm-cam-mode-func))) (debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Stick" cam-stick dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "String" cam-string dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Standoff" cam-standoff dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Circular" cam-circular dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Look At" cam-lookat dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Center of world" cam-point-watch dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Spline" cam-spline dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Bike" cam-bike dm-cam-mode-func))) (debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Robotboss" cam-robotboss dm-cam-mode-func)))
(debug-menu-append-item mode-menu item))
(let ((item (new 'debug 'debug-menu-item-function "Reset Free" 6 (the-as (function object object) dm-cam-settings-func))))
(debug-menu-append-item mode-menu item))
(none))
(defun debug-menu-make-camera-menu ((context debug-menu-context))
"Build the Camera page and return the item that opens it."
(let* ((menu (new 'debug 'debug-menu context "Camera menu"))
(camera-item (new 'debug 'debug-menu-item-submenu "Camera" menu)))
(let ((mode-menu (new 'debug 'debug-menu context "Camera mode menu"))) (debug-menu-make-camera-mode-menu menu mode-menu))
(let ((external-menu (new 'debug 'debug-menu context "Camera externalize menu")))
(let ((item (new 'debug 'debug-menu-item-submenu "External" external-menu))) (debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-flag "CPad 0" 'pad-0 dm-cam-externalize)))
(debug-menu-append-item external-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "CPad 1" 'pad-1 dm-cam-externalize)))
(debug-menu-append-item external-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Lock" 'locked dm-cam-externalize)))
(debug-menu-append-item external-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Reset" 'reset dm-cam-externalize)))
(debug-menu-append-item external-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Allow z rot" 'allow-z dm-cam-externalize)))
(debug-menu-append-item external-menu item))
(let ((fov-item (new 'debug 'debug-menu-item-var "Fov" 0 80)))
(debug-menu-item-var-make-float fov-item
dm-cam-render-float
(the-as float 1.0)
#t
(the-as float 15.0)
(the-as float 180.0)
1)
(debug-menu-append-item external-menu fov-item)))
(let ((collision-menu (new 'debug 'debug-menu context "Camera collision menu")))
(let ((item (new 'debug 'debug-menu-item-submenu "Collision" collision-menu))) (debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Record" '*record-cam-collide-history* dm-boolean-toggle-pick-func)))
(debug-menu-append-item collision-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Display" '*display-cam-collide-history* dm-boolean-toggle-pick-func)))
(debug-menu-append-item collision-menu item)))
(let ((settings-menu (new 'debug 'debug-menu context "Camera settings menu")))
(let ((item (new 'debug 'debug-menu-item-submenu "Settings" settings-menu))) (debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Butt cam" 0 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Block shift buttons" 13 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Same side" 1 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Move spherical" 2 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Drag" 3 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Allow Z rot" 4 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Pitch for jump" 7 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Find hidden target" 8 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Move along camera Z" '*cam-free-move-along-z* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Ignore regions" 9 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Switch only on ground" 10 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Collide" 11 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Line of Sight" 12 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "No Rotate" 14 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Sticky Angle" 15 dm-cam-settings-func)))
(debug-menu-append-item settings-menu item))
(let ((interp-item (new 'debug 'debug-menu-item-var "Interp Frms" 40 80)))
(debug-menu-item-var-make-int interp-item dm-cam-settings-func-int 1 #f 0 0 #f)
(debug-menu-append-item settings-menu interp-item))
(let ((fov-item (new 'debug 'debug-menu-item-var "Fov" 8 80)))
(debug-menu-item-var-make-float fov-item
dm-cam-render-float
(the-as float 1.0)
#t
(the-as float 15.0)
(the-as float 180.0)
1)
(debug-menu-append-item settings-menu fov-item))
(let ((item (new 'debug 'debug-menu-item-flag "no mip/lod correction" '*camera-no-mip-correction* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "last attacker" '*display-camera-last-attacker* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "old stats" '*display-camera-old-stats* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "xyz axes" '*display-xyz-axes* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Master Marks" '*display-cam-master-marks* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Other Marks" '*display-cam-other* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "los debug" '*display-cam-los-debug* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "los info" '*display-cam-los-info* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "los Marks" '*display-cam-los-marks* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "coll Marks" '*display-cam-coll-marks* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item))
(let ((item (new 'debug 'debug-menu-item-flag "Camera Marks" '*display-camera-marks* dm-boolean-toggle-pick-func)))
(debug-menu-append-item settings-menu item)))
(let ((item (new 'debug
'debug-menu-item-flag
"Edit"
'*cam-layout*
(lambda ((setting symbol) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(if (-> setting value) (cam-layout-stop) (cam-layout-start)))
(-> setting value)))))
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-function "Save Pos" #f (the-as (function object object) debug-create-cam-restore))))
(debug-menu-append-item menu item))
camera-item))
(defun debug-menu-make-shader-menu ((context debug-menu-context))
"Build the Shader page and return the item that opens it. Every variable item on the page edits
the adgif shaders of the texture in *edit-shader*, so the page does nothing until one is
picked from Pick Shader."
(let* ((menu (new 'debug 'debug-menu context "Shader menu"))
(shader-item (new 'debug 'debug-menu-item-submenu "Shader" menu)))
(let ((pick-menu (new 'debug 'debug-menu context "Shader pick menu")))
(set! *shader-pick-menu* pick-menu)
(let ((item (new 'debug 'debug-menu-item-submenu "Pick Shader" pick-menu))) (debug-menu-append-item menu item)))
(let ((item (new 'debug 'debug-menu-item-function "Refresh" #f (the-as (function object object) build-shader-list))))
(debug-menu-append-item menu item))
(let ((tweak-item (new 'debug 'debug-menu-item-var "tweak" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-float tweak-item
(the-as (function int debug-menu-msg float float float)
(lambda ((id symbol) (msg debug-menu-msg) (value float) (fallback float))
(set! fallback
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(tex (lookup-texture-by-id (the-as texture-id tex-id)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
((and tex page-link)
(when (= msg (debug-menu-msg press))
(set! (-> tex uv-dist) value)
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(adgif-shader-update! (the-as adgif-shader shader-cursor) tex)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(-> tex uv-dist))
(else (empty) fallback))))
(else (empty) fallback)))
(none)))
(the-as float 0.1)
#t
(the-as float 0.1)
(the-as float 30.0)
1)
(debug-menu-append-item menu tweak-item))
(let ((item (new 'debug
'debug-menu-item-function
"all tweak+"
#f
(lambda ((id object))
(all-texture-tweak-adjust *texture-page-dir* (the-as float 0.1))))))
(debug-menu-append-item menu item))
(let ((item (new 'debug
'debug-menu-item-function
"all tweak-"
#f
(lambda ((id object))
(all-texture-tweak-adjust *texture-page-dir* (the-as float -0.1))))))
(debug-menu-append-item menu item))
;; The rest of the page edits one field of the adgif shader registers of the picked texture.
;; Each item walks the page's shader link list for that texture, writes the field into every
;; shader on it, and displays the value read back from the first one.
(let ((item (new 'debug 'debug-menu-item-var "l" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 l) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 l) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
3
#f)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "k" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 k) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 k) fallback)))
(else fallback))))
(else fallback))))
1
#t
-2048
2047
#f)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "mmin" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 mmin) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 mmin) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
5
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "mmag" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 mmag) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 mmag) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
1
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "lcm" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 lcm) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 lcm) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
1
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "tfx" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex0 tfx) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex0 tfx) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
3
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "tbp" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex0 tbp0) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex0 tbp0) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
#x4000
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "tbw" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex0 tbw) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex0 tbw) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
15
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "tw" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex0 tw) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex0 tw) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
10
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "th" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex0 th) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex0 th) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
10
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "mxl" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) tex1 mxl) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) tex1 mxl) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
6
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "wms" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp wms) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp wms) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
3
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "wmt" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp wmt) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp wmt) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
3
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "minu" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp minu) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp minu) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
511
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "maxu" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp maxu) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp maxu) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
511
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "minv" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp minv) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp minv) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
511
#t)
(debug-menu-append-item menu item))
(let ((item (new 'debug 'debug-menu-item-var "maxv" (the-as int '*edit-shader*) 80)))
(debug-menu-item-var-make-int item
(the-as (function int debug-menu-msg int int int)
(lambda ((id symbol) (msg debug-menu-msg) (value int) (fallback basic))
(cond
(*texture-page-dir*
(let* ((tex-id (the-as texture-id (-> id value)))
(page-link (-> *texture-page-dir* entries (-> tex-id page) link)))
(cond
(page-link
(when (= msg (debug-menu-msg press))
(let ((shader-cursor (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(while (nonzero? (the-as uint shader-cursor))
(set! (-> (the-as adgif-shader shader-cursor) clamp maxv) value)
(set! shader-cursor (* (-> (the-as adgif-shader shader-cursor) next shader) 16)))))
(let ((first-shader (the-as object (* (-> page-link next (-> tex-id index) shader) 16))))
(if (nonzero? (the-as uint first-shader)) (-> (the-as adgif-shader first-shader) clamp maxv) fallback)))
(else fallback))))
(else fallback))))
1
#t
0
511
#t)
(debug-menu-append-item menu item))
shader-item))
(defun debug-menu-make-instance-menu ((context debug-menu-context))
"Build the Instance page and return the item that opens it."
(let* ((menu (new 'debug 'debug-menu context "Instance menu"))
(instance-item (new 'debug 'debug-menu-item-submenu "Instance" menu)))
(let ((shrub-menu (new 'debug 'debug-menu context "Instance shrub menu")))
(set! *instance-shrub-menu* shrub-menu)
(let ((item (new 'debug 'debug-menu-item-submenu "Pick Shrub" shrub-menu))) (debug-menu-append-item menu item)))
(let ((tie-menu (new 'debug 'debug-menu context "Instance tie menu")))
(set! *instance-tie-menu* tie-menu)
(let ((item (new 'debug 'debug-menu-item-submenu "Pick Tie" tie-menu))) (debug-menu-append-item menu item)))
(let ((item (new 'debug 'debug-menu-item-function "Refresh" #f build-instance-list))) (debug-menu-append-item menu item))
(let ((near-item (new 'debug 'debug-menu-item-var "near" (the-as int '*edit-instance*) 80)))
(debug-menu-item-var-make-float near-item
(the-as (function int debug-menu-msg float float float)
(lambda ((id debug-menu) (msg debug-menu-msg) (value float) (fallback float))
(let ((proto (find-instance-by-name (-> id name))))
(cond
(proto
(when (= msg (debug-menu-msg press))
(set! (-> proto dists x) (meters value))
(prototype-bucket-recalc-fields proto))
(/ (-> proto dists x) METER_LENGTH))
(else (empty) fallback)))))
(the-as float 1.0)
#t
(the-as float 10.0)
(the-as float 250.0)
1)
(debug-menu-append-item menu near-item))
(let ((far-item (new 'debug 'debug-menu-item-var "far" (the-as int '*edit-instance*) 80)))
(debug-menu-item-var-make-float far-item
(the-as (function int debug-menu-msg float float float)
(lambda ((id debug-menu) (msg debug-menu-msg) (value float) (fallback float))
(let ((proto (find-instance-by-name (-> id name))))
(cond
(proto
(when (= msg (debug-menu-msg press))
(set! (-> proto dists w) (meters value))
(prototype-bucket-recalc-fields proto))
(/ (-> proto dists w) METER_LENGTH))
(else (empty) fallback)))))
(the-as float 1.0)
#t
(the-as float 10.0)
(the-as float 250.0)
1)
(debug-menu-append-item menu far-item))
(let ((item (new 'debug 'debug-menu-item-flag "invisible" 1 dm-edit-instance-toggle-pick-func)))
(debug-menu-append-item menu item))
(let ((enable-menu (new 'debug 'debug-menu context "Enable Instance Tie Menu")))
(set! *enable-instance-tie-menu* enable-menu)
(let ((item (new 'debug 'debug-menu-item-submenu "Enable Tie" enable-menu))) (debug-menu-append-item menu item)))
(let ((item (new 'debug 'debug-menu-item-flag "Instance Info" '*display-instance-info* dm-boolean-toggle-pick-func)))
(debug-menu-append-item menu item))
instance-item))
;; One flag callback per task stage. All seven take the task from id / 8, report 'invalid for a
;; task that has no such stage, and close the stage on press.
(defun dm-task-unknown ((id int) (msg debug-menu-msg))
"Close the unknown stage of the task id / 8. Returns 'invalid when the task has no such stage,
which draws the entry as unavailable."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status unknown))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status unknown)))
(task-closed? (the-as game-task task) (task-status unknown))))
(defun dm-task-hint ((id int) (msg debug-menu-msg))
"Close the need-hint stage of the task id / 8, or return 'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-hint))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status need-hint)))
(task-closed? (the-as game-task task) (task-status need-hint))))
(defun dm-task-introduction ((id int) (msg debug-menu-msg))
"Close the need-introduction stage of the task id / 8, or return 'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-introduction))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status need-introduction)))
(task-closed? (the-as game-task task) (task-status need-introduction))))
(defun dm-task-reminder-a ((id int) (msg debug-menu-msg))
"Close the need-reminder-a stage of the task id / 8, or return 'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-reminder-a))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status need-reminder-a)))
(task-closed? (the-as game-task task) (task-status need-reminder-a))))
(defun dm-task-reminder ((id int) (msg debug-menu-msg))
"Close the need-reminder stage of the task id / 8, or return 'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-reminder))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status need-reminder)))
(task-closed? (the-as game-task task) (task-status need-reminder))))
(defun dm-task-reward-speech ((id int) (msg debug-menu-msg))
"Close the need-reward-speech stage of the task id / 8, or return 'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-reward-speech))) (return 'invalid))
(if (= msg (debug-menu-msg press)) (close-specific-task! (the-as game-task task) (task-status need-reward-speech)))
(task-closed? (the-as game-task task) (task-status need-reward-speech))))
(defun dm-task-resolution ((id int) (msg debug-menu-msg))
"Give the player the fuel cell for the task id / 8 and close its need-resolution stage, or return
'invalid when it has none."
(let ((task (/ id 8)))
(if (not (task-exists? (the-as game-task task) (task-status need-resolution))) (return 'invalid))
(when (= msg (debug-menu-msg press))
(send-event *target* 'get-pickup (pickup-type fuel-cell) (the float task))
(close-specific-task! (the-as game-task task) (task-status need-resolution)))
(task-closed? (the-as game-task task) (task-status need-resolution))))
;; One page per task stage, each listing every task that has that stage. The task numbers in these
;; templates have to be written out: a static list holds boxed numbers, not compile-time constants,
;; so the game-task names survive only as the item labels.
(defun debug-menu-make-task-unknown-menu ((menu debug-menu) (context debug-menu-context))
"Append the unknown page to menu, with one entry per task whose unknown stage can be closed."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "unknown"
#f
#f
(flag "jungle-eggtop" 2 dm-task-unknown)
(flag "jungle-lurkerm" 3 dm-task-unknown)
(flag "jungle-tower" 4 dm-task-unknown)
(flag "jungle-fishgame" 5 dm-task-unknown)
(flag "jungle-plant" 6 dm-task-unknown)
(flag "jungle-buzzer" 7 dm-task-unknown)
(flag "jungle-canyon-end" 8 dm-task-unknown)
(flag "jungle-temple-door" 9 dm-task-unknown)
(flag "village1-yakow" 10 dm-task-unknown)
(flag "village1-mayor-money" 11 dm-task-unknown)
(flag "village1-uncle-money" 12 dm-task-unknown)
(flag "village1-oracle-money1" 13 dm-task-unknown)
(flag "village1-oracle-money2" 14 dm-task-unknown)
(flag "beach-ecorocks" 15 dm-task-unknown)
(flag "beach-pelican" 16 dm-task-unknown)
(flag "beach-flutflut" 17 dm-task-unknown)
(flag "beach-seagull" 18 dm-task-unknown)
(flag "beach-cannon" 19 dm-task-unknown)
(flag "beach-buzzer" 20 dm-task-unknown)
(flag "beach-gimmie" 21 dm-task-unknown)
(flag "beach-sentinel" 22 dm-task-unknown)
(flag "misty-muse" 23 dm-task-unknown)
(flag "misty-boat" 24 dm-task-unknown)
(flag "misty-warehouse" 25 dm-task-unknown)
(flag "misty-cannon" 26 dm-task-unknown)
(flag "misty-bike" 27 dm-task-unknown)
(flag "misty-buzzer" 28 dm-task-unknown)
(flag "misty-bike-jump" 29 dm-task-unknown)
(flag "misty-eco-challenge" 30 dm-task-unknown)
(flag "village2-gambler-money" 31 dm-task-unknown)
(flag "village2-geologist-money" 32 dm-task-unknown)
(flag "village2-warrior-money" 33 dm-task-unknown)
(flag "village2-oracle-money1" 34 dm-task-unknown)
(flag "village2-oracle-money2" 35 dm-task-unknown)
(flag "swamp-billy" 36 dm-task-unknown)
(flag "swamp-flutflut" 37 dm-task-unknown)
(flag "swamp-battle" 38 dm-task-unknown)
(flag "swamp-tether-1" 39 dm-task-unknown)
(flag "swamp-tether-2" 40 dm-task-unknown)
(flag "swamp-tether-3" 41 dm-task-unknown)
(flag "swamp-tether-4" 42 dm-task-unknown)
(flag "swamp-buzzer" 43 dm-task-unknown)
(flag "sunken-platforms" 44 dm-task-unknown)
(flag "sunken-pipe" 45 dm-task-unknown)
(flag "sunken-slide" 46 dm-task-unknown)
(flag "sunken-room" 47 dm-task-unknown)
(flag "sunken-sharks" 48 dm-task-unknown)
(flag "sunken-buzzer" 49 dm-task-unknown)
(flag "sunken-top-of-helix" 50 dm-task-unknown)
(flag "sunken-spinning-room" 51 dm-task-unknown)
(flag "rolling-race" 52 dm-task-unknown)
(flag "rolling-robbers" 53 dm-task-unknown)
(flag "rolling-moles" 54 dm-task-unknown)
(flag "rolling-plants" 55 dm-task-unknown)
(flag "rolling-lake" 56 dm-task-unknown)
(flag "rolling-buzzer" 57 dm-task-unknown)
(flag "rolling-ring-chase-1" 58 dm-task-unknown)
(flag "rolling-ring-chase-2" 59 dm-task-unknown)
(flag "snow-eggtop" 60 dm-task-unknown)
(flag "snow-ram" 61 dm-task-unknown)
(flag "snow-fort" 62 dm-task-unknown)
(flag "snow-ball" 63 dm-task-unknown)
(flag "snow-bunnies" 64 dm-task-unknown)
(flag "snow-buzzer" 65 dm-task-unknown)
(flag "snow-bumpers" 66 dm-task-unknown)
(flag "snow-cage" 67 dm-task-unknown)
(flag "firecanyon-buzzer" 68 dm-task-unknown)
(flag "firecanyon-end" 69 dm-task-unknown)
(flag "citadel-sage-green" 70 dm-task-unknown)
(flag "citadel-sage-blue" 71 dm-task-unknown)
(flag "citadel-sage-red" 72 dm-task-unknown)
(flag "citadel-sage-yellow" 73 dm-task-unknown)
(flag "village3-extra1" 74 dm-task-unknown)
(flag "village1-buzzer" 75 dm-task-unknown)
(flag "village2-buzzer" 76 dm-task-unknown)
(flag "village3-buzzer" 77 dm-task-unknown)
(flag "cave-gnawers" 78 dm-task-unknown)
(flag "cave-dark-crystals" 79 dm-task-unknown)
(flag "cave-dark-climb" 80 dm-task-unknown)
(flag "cave-robot-climb" 81 dm-task-unknown)
(flag "cave-swing-poles" 82 dm-task-unknown)
(flag "cave-spider-tunnel" 83 dm-task-unknown)
(flag "cave-platforms" 84 dm-task-unknown)
(flag "cave-buzzer" 85 dm-task-unknown)
(flag "ogre-boss" 86 dm-task-unknown)
(flag "ogre-end" 87 dm-task-unknown)
(flag "ogre-buzzer" 88 dm-task-unknown)
(flag "lavatube-end" 89 dm-task-unknown)
(flag "lavatube-buzzer" 90 dm-task-unknown)
(flag "citadel-buzzer" 91 dm-task-unknown)
(flag "training-gimmie" 92 dm-task-unknown)
(flag "training-door" 93 dm-task-unknown)
(flag "training-climb" 94 dm-task-unknown)
(flag "training-buzzer" 95 dm-task-unknown)
(flag "village3-miner-money1" 96 dm-task-unknown)
(flag "village3-miner-money2" 97 dm-task-unknown)
(flag "village3-miner-money3" 98 dm-task-unknown)
(flag "village3-miner-money4" 99 dm-task-unknown)
(flag "village3-oracle-money1" 100 dm-task-unknown)
(flag "village3-oracle-money2" 101 dm-task-unknown)
(flag "firecanyon-assistant" 102 dm-task-unknown)
(flag "village2-levitator" 103 dm-task-unknown)
(flag "swamp-arm" 104 dm-task-unknown)
(flag "village3-button" 105 dm-task-unknown)
(flag "red-eggtop" 106 dm-task-unknown)
(flag "lavatube-balls" 107 dm-task-unknown)
(flag "lavatube-start" 108 dm-task-unknown)
(flag "intro" 109 dm-task-unknown)
(flag "ogre-secret" 110 dm-task-unknown)
(flag "village4-button" 111 dm-task-unknown)
(flag "finalboss-movies" 112 dm-task-unknown)
(flag "plunger-lurker-hit" 113 dm-task-unknown)
(flag "leaving-misty" 114 dm-task-unknown)
(flag "assistant-village3" 115 dm-task-unknown)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-hint-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-hint page to menu."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-hint"
#f
#f
(flag "jungle-eggtop" 2 dm-task-hint)
(flag "jungle-lurkerm" 3 dm-task-hint)
(flag "jungle-tower" 4 dm-task-hint)
(flag "jungle-fishgame" 5 dm-task-hint)
(flag "jungle-plant" 6 dm-task-hint)
(flag "jungle-buzzer" 7 dm-task-hint)
(flag "jungle-canyon-end" 8 dm-task-hint)
(flag "jungle-temple-door" 9 dm-task-hint)
(flag "village1-yakow" 10 dm-task-hint)
(flag "village1-mayor-money" 11 dm-task-hint)
(flag "village1-uncle-money" 12 dm-task-hint)
(flag "village1-oracle-money1" 13 dm-task-hint)
(flag "village1-oracle-money2" 14 dm-task-hint)
(flag "beach-ecorocks" 15 dm-task-hint)
(flag "beach-pelican" 16 dm-task-hint)
(flag "beach-flutflut" 17 dm-task-hint)
(flag "beach-seagull" 18 dm-task-hint)
(flag "beach-cannon" 19 dm-task-hint)
(flag "beach-buzzer" 20 dm-task-hint)
(flag "beach-gimmie" 21 dm-task-hint)
(flag "beach-sentinel" 22 dm-task-hint)
(flag "misty-muse" 23 dm-task-hint)
(flag "misty-boat" 24 dm-task-hint)
(flag "misty-warehouse" 25 dm-task-hint)
(flag "misty-cannon" 26 dm-task-hint)
(flag "misty-bike" 27 dm-task-hint)
(flag "misty-buzzer" 28 dm-task-hint)
(flag "misty-bike-jump" 29 dm-task-hint)
(flag "misty-eco-challenge" 30 dm-task-hint)
(flag "village2-gambler-money" 31 dm-task-hint)
(flag "village2-geologist-money" 32 dm-task-hint)
(flag "village2-warrior-money" 33 dm-task-hint)
(flag "village2-oracle-money1" 34 dm-task-hint)
(flag "village2-oracle-money2" 35 dm-task-hint)
(flag "swamp-billy" 36 dm-task-hint)
(flag "swamp-flutflut" 37 dm-task-hint)
(flag "swamp-battle" 38 dm-task-hint)
(flag "swamp-tether-1" 39 dm-task-hint)
(flag "swamp-tether-2" 40 dm-task-hint)
(flag "swamp-tether-3" 41 dm-task-hint)
(flag "swamp-tether-4" 42 dm-task-hint)
(flag "swamp-buzzer" 43 dm-task-hint)
(flag "sunken-platforms" 44 dm-task-hint)
(flag "sunken-pipe" 45 dm-task-hint)
(flag "sunken-slide" 46 dm-task-hint)
(flag "sunken-room" 47 dm-task-hint)
(flag "sunken-sharks" 48 dm-task-hint)
(flag "sunken-buzzer" 49 dm-task-hint)
(flag "sunken-top-of-helix" 50 dm-task-hint)
(flag "sunken-spinning-room" 51 dm-task-hint)
(flag "rolling-race" 52 dm-task-hint)
(flag "rolling-robbers" 53 dm-task-hint)
(flag "rolling-moles" 54 dm-task-hint)
(flag "rolling-plants" 55 dm-task-hint)
(flag "rolling-lake" 56 dm-task-hint)
(flag "rolling-buzzer" 57 dm-task-hint)
(flag "rolling-ring-chase-1" 58 dm-task-hint)
(flag "rolling-ring-chase-2" 59 dm-task-hint)
(flag "snow-eggtop" 60 dm-task-hint)
(flag "snow-ram" 61 dm-task-hint)
(flag "snow-fort" 62 dm-task-hint)
(flag "snow-ball" 63 dm-task-hint)
(flag "snow-bunnies" 64 dm-task-hint)
(flag "snow-buzzer" 65 dm-task-hint)
(flag "snow-bumpers" 66 dm-task-hint)
(flag "snow-cage" 67 dm-task-hint)
(flag "firecanyon-buzzer" 68 dm-task-hint)
(flag "firecanyon-end" 69 dm-task-hint)
(flag "citadel-sage-green" 70 dm-task-hint)
(flag "citadel-sage-blue" 71 dm-task-hint)
(flag "citadel-sage-red" 72 dm-task-hint)
(flag "citadel-sage-yellow" 73 dm-task-hint)
(flag "village3-extra1" 74 dm-task-hint)
(flag "village1-buzzer" 75 dm-task-hint)
(flag "village2-buzzer" 76 dm-task-hint)
(flag "village3-buzzer" 77 dm-task-hint)
(flag "cave-gnawers" 78 dm-task-hint)
(flag "cave-dark-crystals" 79 dm-task-hint)
(flag "cave-dark-climb" 80 dm-task-hint)
(flag "cave-robot-climb" 81 dm-task-hint)
(flag "cave-swing-poles" 82 dm-task-hint)
(flag "cave-spider-tunnel" 83 dm-task-hint)
(flag "cave-platforms" 84 dm-task-hint)
(flag "cave-buzzer" 85 dm-task-hint)
(flag "ogre-boss" 86 dm-task-hint)
(flag "ogre-end" 87 dm-task-hint)
(flag "ogre-buzzer" 88 dm-task-hint)
(flag "lavatube-end" 89 dm-task-hint)
(flag "lavatube-buzzer" 90 dm-task-hint)
(flag "citadel-buzzer" 91 dm-task-hint)
(flag "training-gimmie" 92 dm-task-hint)
(flag "training-door" 93 dm-task-hint)
(flag "training-climb" 94 dm-task-hint)
(flag "training-buzzer" 95 dm-task-hint)
(flag "village3-miner-money1" 96 dm-task-hint)
(flag "village3-miner-money2" 97 dm-task-hint)
(flag "village3-miner-money3" 98 dm-task-hint)
(flag "village3-miner-money4" 99 dm-task-hint)
(flag "village3-oracle-money1" 100 dm-task-hint)
(flag "village3-oracle-money2" 101 dm-task-hint)
(flag "firecanyon-assistant" 102 dm-task-hint)
(flag "village2-levitator" 103 dm-task-hint)
(flag "swamp-arm" 104 dm-task-hint)
(flag "village3-button" 105 dm-task-hint)
(flag "red-eggtop" 106 dm-task-hint)
(flag "lavatube-balls" 107 dm-task-hint)
(flag "lavatube-start" 108 dm-task-hint)
(flag "intro" 109 dm-task-hint)
(flag "ogre-secret" 110 dm-task-hint)
(flag "village4-button" 111 dm-task-hint)
(flag "finalboss-movies" 112 dm-task-hint)
(flag "plunger-lurker-hit" 113 dm-task-hint)
(flag "leaving-misty" 114 dm-task-hint)
(flag "assistant-village3" 115 dm-task-hint)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-introduction-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-introduction page to menu."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-introduction"
#f
#f
(flag "jungle-eggtop" 2 dm-task-introduction)
(flag "jungle-lurkerm" 3 dm-task-introduction)
(flag "jungle-tower" 4 dm-task-introduction)
(flag "jungle-fishgame" 5 dm-task-introduction)
(flag "jungle-plant" 6 dm-task-introduction)
(flag "jungle-buzzer" 7 dm-task-introduction)
(flag "jungle-canyon-end" 8 dm-task-introduction)
(flag "jungle-temple-door" 9 dm-task-introduction)
(flag "village1-yakow" 10 dm-task-introduction)
(flag "village1-mayor-money" 11 dm-task-introduction)
(flag "village1-uncle-money" 12 dm-task-introduction)
(flag "village1-oracle-money1" 13 dm-task-introduction)
(flag "village1-oracle-money2" 14 dm-task-introduction)
(flag "beach-ecorocks" 15 dm-task-introduction)
(flag "beach-pelican" 16 dm-task-introduction)
(flag "beach-flutflut" 17 dm-task-introduction)
(flag "beach-seagull" 18 dm-task-introduction)
(flag "beach-cannon" 19 dm-task-introduction)
(flag "beach-buzzer" 20 dm-task-introduction)
(flag "beach-gimmie" 21 dm-task-introduction)
(flag "beach-sentinel" 22 dm-task-introduction)
(flag "misty-muse" 23 dm-task-introduction)
(flag "misty-boat" 24 dm-task-introduction)
(flag "misty-warehouse" 25 dm-task-introduction)
(flag "misty-cannon" 26 dm-task-introduction)
(flag "misty-bike" 27 dm-task-introduction)
(flag "misty-buzzer" 28 dm-task-introduction)
(flag "misty-bike-jump" 29 dm-task-introduction)
(flag "misty-eco-challenge" 30 dm-task-introduction)
(flag "village2-gambler-money" 31 dm-task-introduction)
(flag "village2-geologist-money" 32 dm-task-introduction)
(flag "village2-warrior-money" 33 dm-task-introduction)
(flag "village2-oracle-money1" 34 dm-task-introduction)
(flag "village2-oracle-money2" 35 dm-task-introduction)
(flag "swamp-billy" 36 dm-task-introduction)
(flag "swamp-flutflut" 37 dm-task-introduction)
(flag "swamp-battle" 38 dm-task-introduction)
(flag "swamp-tether-1" 39 dm-task-introduction)
(flag "swamp-tether-2" 40 dm-task-introduction)
(flag "swamp-tether-3" 41 dm-task-introduction)
(flag "swamp-tether-4" 42 dm-task-introduction)
(flag "swamp-buzzer" 43 dm-task-introduction)
(flag "sunken-platforms" 44 dm-task-introduction)
(flag "sunken-pipe" 45 dm-task-introduction)
(flag "sunken-slide" 46 dm-task-introduction)
(flag "sunken-room" 47 dm-task-introduction)
(flag "sunken-sharks" 48 dm-task-introduction)
(flag "sunken-buzzer" 49 dm-task-introduction)
(flag "sunken-top-of-helix" 50 dm-task-introduction)
(flag "sunken-spinning-room" 51 dm-task-introduction)
(flag "rolling-race" 52 dm-task-introduction)
(flag "rolling-robbers" 53 dm-task-introduction)
(flag "rolling-moles" 54 dm-task-introduction)
(flag "rolling-plants" 55 dm-task-introduction)
(flag "rolling-lake" 56 dm-task-introduction)
(flag "rolling-buzzer" 57 dm-task-introduction)
(flag "rolling-ring-chase-1" 58 dm-task-introduction)
(flag "rolling-ring-chase-2" 59 dm-task-introduction)
(flag "snow-eggtop" 60 dm-task-introduction)
(flag "snow-ram" 61 dm-task-introduction)
(flag "snow-fort" 62 dm-task-introduction)
(flag "snow-ball" 63 dm-task-introduction)
(flag "snow-bunnies" 64 dm-task-introduction)
(flag "snow-buzzer" 65 dm-task-introduction)
(flag "snow-bumpers" 66 dm-task-introduction)
(flag "snow-cage" 67 dm-task-introduction)
(flag "firecanyon-buzzer" 68 dm-task-introduction)
(flag "firecanyon-end" 69 dm-task-introduction)
(flag "citadel-sage-green" 70 dm-task-introduction)
(flag "citadel-sage-blue" 71 dm-task-introduction)
(flag "citadel-sage-red" 72 dm-task-introduction)
(flag "citadel-sage-yellow" 73 dm-task-introduction)
(flag "village3-extra1" 74 dm-task-introduction)
(flag "village1-buzzer" 75 dm-task-introduction)
(flag "village2-buzzer" 76 dm-task-introduction)
(flag "village3-buzzer" 77 dm-task-introduction)
(flag "cave-gnawers" 78 dm-task-introduction)
(flag "cave-dark-crystals" 79 dm-task-introduction)
(flag "cave-dark-climb" 80 dm-task-introduction)
(flag "cave-robot-climb" 81 dm-task-introduction)
(flag "cave-swing-poles" 82 dm-task-introduction)
(flag "cave-spider-tunnel" 83 dm-task-introduction)
(flag "cave-platforms" 84 dm-task-introduction)
(flag "cave-buzzer" 85 dm-task-introduction)
(flag "ogre-boss" 86 dm-task-introduction)
(flag "ogre-end" 87 dm-task-introduction)
(flag "ogre-buzzer" 88 dm-task-introduction)
(flag "lavatube-end" 89 dm-task-introduction)
(flag "lavatube-buzzer" 90 dm-task-introduction)
(flag "citadel-buzzer" 91 dm-task-introduction)
(flag "training-gimmie" 92 dm-task-introduction)
(flag "training-door" 93 dm-task-introduction)
(flag "training-climb" 94 dm-task-introduction)
(flag "training-buzzer" 95 dm-task-introduction)
(flag "village3-miner-money1" 96 dm-task-introduction)
(flag "village3-miner-money2" 97 dm-task-introduction)
(flag "village3-miner-money3" 98 dm-task-introduction)
(flag "village3-miner-money4" 99 dm-task-introduction)
(flag "village3-oracle-money1" 100 dm-task-introduction)
(flag "village3-oracle-money2" 101 dm-task-introduction)
(flag "firecanyon-assistant" 102 dm-task-introduction)
(flag "village2-levitator" 103 dm-task-introduction)
(flag "swamp-arm" 104 dm-task-introduction)
(flag "village3-button" 105 dm-task-introduction)
(flag "red-eggtop" 106 dm-task-introduction)
(flag "lavatube-balls" 107 dm-task-introduction)
(flag "lavatube-start" 108 dm-task-introduction)
(flag "intro" 109 dm-task-introduction)
(flag "ogre-secret" 110 dm-task-introduction)
(flag "village4-button" 111 dm-task-introduction)
(flag "finalboss-movies" 112 dm-task-introduction)
(flag "plunger-lurker-hit" 113 dm-task-introduction)
(flag "leaving-misty" 114 dm-task-introduction)
(flag "assistant-village3" 115 dm-task-introduction)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-reminder-a-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-reminder-a page to menu."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-reminder-a"
#f
#f
(flag "jungle-eggtop" 2 dm-task-reminder-a)
(flag "jungle-lurkerm" 3 dm-task-reminder-a)
(flag "jungle-tower" 4 dm-task-reminder-a)
(flag "jungle-fishgame" 5 dm-task-reminder-a)
(flag "jungle-plant" 6 dm-task-reminder-a)
(flag "jungle-buzzer" 7 dm-task-reminder-a)
(flag "jungle-canyon-end" 8 dm-task-reminder-a)
(flag "jungle-temple-door" 9 dm-task-reminder-a)
(flag "village1-yakow" 10 dm-task-reminder-a)
(flag "village1-mayor-money" 11 dm-task-reminder-a)
(flag "village1-uncle-money" 12 dm-task-reminder-a)
(flag "village1-oracle-money1" 13 dm-task-reminder-a)
(flag "village1-oracle-money2" 14 dm-task-reminder-a)
(flag "beach-ecorocks" 15 dm-task-reminder-a)
(flag "beach-pelican" 16 dm-task-reminder-a)
(flag "beach-flutflut" 17 dm-task-reminder-a)
(flag "beach-seagull" 18 dm-task-reminder-a)
(flag "beach-cannon" 19 dm-task-reminder-a)
(flag "beach-buzzer" 20 dm-task-reminder-a)
(flag "beach-gimmie" 21 dm-task-reminder-a)
(flag "beach-sentinel" 22 dm-task-reminder-a)
(flag "misty-muse" 23 dm-task-reminder-a)
(flag "misty-boat" 24 dm-task-reminder-a)
(flag "misty-warehouse" 25 dm-task-reminder-a)
(flag "misty-cannon" 26 dm-task-reminder-a)
(flag "misty-bike" 27 dm-task-reminder-a)
(flag "misty-buzzer" 28 dm-task-reminder-a)
(flag "misty-bike-jump" 29 dm-task-reminder-a)
(flag "misty-eco-challenge" 30 dm-task-reminder-a)
(flag "village2-gambler-money" 31 dm-task-reminder-a)
(flag "village2-geologist-money" 32 dm-task-reminder-a)
(flag "village2-warrior-money" 33 dm-task-reminder-a)
(flag "village2-oracle-money1" 34 dm-task-reminder-a)
(flag "village2-oracle-money2" 35 dm-task-reminder-a)
(flag "swamp-billy" 36 dm-task-reminder-a)
(flag "swamp-flutflut" 37 dm-task-reminder-a)
(flag "swamp-battle" 38 dm-task-reminder-a)
(flag "swamp-tether-1" 39 dm-task-reminder-a)
(flag "swamp-tether-2" 40 dm-task-reminder-a)
(flag "swamp-tether-3" 41 dm-task-reminder-a)
(flag "swamp-tether-4" 42 dm-task-reminder-a)
(flag "swamp-buzzer" 43 dm-task-reminder-a)
(flag "sunken-platforms" 44 dm-task-reminder-a)
(flag "sunken-pipe" 45 dm-task-reminder-a)
(flag "sunken-slide" 46 dm-task-reminder-a)
(flag "sunken-room" 47 dm-task-reminder-a)
(flag "sunken-sharks" 48 dm-task-reminder-a)
(flag "sunken-buzzer" 49 dm-task-reminder-a)
(flag "sunken-top-of-helix" 50 dm-task-reminder-a)
(flag "sunken-spinning-room" 51 dm-task-reminder-a)
(flag "rolling-race" 52 dm-task-reminder-a)
(flag "rolling-robbers" 53 dm-task-reminder-a)
(flag "rolling-moles" 54 dm-task-reminder-a)
(flag "rolling-plants" 55 dm-task-reminder-a)
(flag "rolling-lake" 56 dm-task-reminder-a)
(flag "rolling-buzzer" 57 dm-task-reminder-a)
(flag "rolling-ring-chase-1" 58 dm-task-reminder-a)
(flag "rolling-ring-chase-2" 59 dm-task-reminder-a)
(flag "snow-eggtop" 60 dm-task-reminder-a)
(flag "snow-ram" 61 dm-task-reminder-a)
(flag "snow-fort" 62 dm-task-reminder-a)
(flag "snow-ball" 63 dm-task-reminder-a)
(flag "snow-bunnies" 64 dm-task-reminder-a)
(flag "snow-buzzer" 65 dm-task-reminder-a)
(flag "snow-bumpers" 66 dm-task-reminder-a)
(flag "snow-cage" 67 dm-task-reminder-a)
(flag "firecanyon-buzzer" 68 dm-task-reminder-a)
(flag "firecanyon-end" 69 dm-task-reminder-a)
(flag "citadel-sage-green" 70 dm-task-reminder-a)
(flag "citadel-sage-blue" 71 dm-task-reminder-a)
(flag "citadel-sage-red" 72 dm-task-reminder-a)
(flag "citadel-sage-yellow" 73 dm-task-reminder-a)
(flag "village3-extra1" 74 dm-task-reminder-a)
(flag "village1-buzzer" 75 dm-task-reminder-a)
(flag "village2-buzzer" 76 dm-task-reminder-a)
(flag "village3-buzzer" 77 dm-task-reminder-a)
(flag "cave-gnawers" 78 dm-task-reminder-a)
(flag "cave-dark-crystals" 79 dm-task-reminder-a)
(flag "cave-dark-climb" 80 dm-task-reminder-a)
(flag "cave-robot-climb" 81 dm-task-reminder-a)
(flag "cave-swing-poles" 82 dm-task-reminder-a)
(flag "cave-spider-tunnel" 83 dm-task-reminder-a)
(flag "cave-platforms" 84 dm-task-reminder-a)
(flag "cave-buzzer" 85 dm-task-reminder-a)
(flag "ogre-boss" 86 dm-task-reminder-a)
(flag "ogre-end" 87 dm-task-reminder-a)
(flag "ogre-buzzer" 88 dm-task-reminder-a)
(flag "lavatube-end" 89 dm-task-reminder-a)
(flag "lavatube-buzzer" 90 dm-task-reminder-a)
(flag "citadel-buzzer" 91 dm-task-reminder-a)
(flag "training-gimmie" 92 dm-task-reminder-a)
(flag "training-door" 93 dm-task-reminder-a)
(flag "training-climb" 94 dm-task-reminder-a)
(flag "training-buzzer" 95 dm-task-reminder-a)
(flag "village3-miner-money1" 96 dm-task-reminder-a)
(flag "village3-miner-money2" 97 dm-task-reminder-a)
(flag "village3-miner-money3" 98 dm-task-reminder-a)
(flag "village3-miner-money4" 99 dm-task-reminder-a)
(flag "village3-oracle-money1" 100 dm-task-reminder-a)
(flag "village3-oracle-money2" 101 dm-task-reminder-a)
(flag "firecanyon-assistant" 102 dm-task-reminder-a)
(flag "village2-levitator" 103 dm-task-reminder-a)
(flag "swamp-arm" 104 dm-task-reminder-a)
(flag "village3-button" 105 dm-task-reminder-a)
(flag "red-eggtop" 106 dm-task-reminder-a)
(flag "lavatube-balls" 107 dm-task-reminder-a)
(flag "lavatube-start" 108 dm-task-reminder-a)
(flag "intro" 109 dm-task-reminder-a)
(flag "ogre-secret" 110 dm-task-reminder-a)
(flag "village4-button" 111 dm-task-reminder-a)
(flag "finalboss-movies" 112 dm-task-reminder-a)
(flag "plunger-lurker-hit" 113 dm-task-reminder-a)
(flag "leaving-misty" 114 dm-task-reminder-a)
(flag "assistant-village3" 115 dm-task-reminder-a)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-reminder-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-reminder page to menu."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-reminder"
#f
#f
(flag "jungle-eggtop" 2 dm-task-reminder)
(flag "jungle-lurkerm" 3 dm-task-reminder)
(flag "jungle-tower" 4 dm-task-reminder)
(flag "jungle-fishgame" 5 dm-task-reminder)
(flag "jungle-plant" 6 dm-task-reminder)
(flag "jungle-buzzer" 7 dm-task-reminder)
(flag "jungle-canyon-end" 8 dm-task-reminder)
(flag "jungle-temple-door" 9 dm-task-reminder)
(flag "village1-yakow" 10 dm-task-reminder)
(flag "village1-mayor-money" 11 dm-task-reminder)
(flag "village1-uncle-money" 12 dm-task-reminder)
(flag "village1-oracle-money1" 13 dm-task-reminder)
(flag "village1-oracle-money2" 14 dm-task-reminder)
(flag "beach-ecorocks" 15 dm-task-reminder)
(flag "beach-pelican" 16 dm-task-reminder)
(flag "beach-flutflut" 17 dm-task-reminder)
(flag "beach-seagull" 18 dm-task-reminder)
(flag "beach-cannon" 19 dm-task-reminder)
(flag "beach-buzzer" 20 dm-task-reminder)
(flag "beach-gimmie" 21 dm-task-reminder)
(flag "beach-sentinel" 22 dm-task-reminder)
(flag "misty-muse" 23 dm-task-reminder)
(flag "misty-boat" 24 dm-task-reminder)
(flag "misty-warehouse" 25 dm-task-reminder)
(flag "misty-cannon" 26 dm-task-reminder)
(flag "misty-bike" 27 dm-task-reminder)
(flag "misty-buzzer" 28 dm-task-reminder)
(flag "misty-bike-jump" 29 dm-task-reminder)
(flag "misty-eco-challenge" 30 dm-task-reminder)
(flag "village2-gambler-money" 31 dm-task-reminder)
(flag "village2-geologist-money" 32 dm-task-reminder)
(flag "village2-warrior-money" 33 dm-task-reminder)
(flag "village2-oracle-money1" 34 dm-task-reminder)
(flag "village2-oracle-money2" 35 dm-task-reminder)
(flag "swamp-billy" 36 dm-task-reminder)
(flag "swamp-flutflut" 37 dm-task-reminder)
(flag "swamp-battle" 38 dm-task-reminder)
(flag "swamp-tether-1" 39 dm-task-reminder)
(flag "swamp-tether-2" 40 dm-task-reminder)
(flag "swamp-tether-3" 41 dm-task-reminder)
(flag "swamp-tether-4" 42 dm-task-reminder)
(flag "swamp-buzzer" 43 dm-task-reminder)
(flag "sunken-platforms" 44 dm-task-reminder)
(flag "sunken-pipe" 45 dm-task-reminder)
(flag "sunken-slide" 46 dm-task-reminder)
(flag "sunken-room" 47 dm-task-reminder)
(flag "sunken-sharks" 48 dm-task-reminder)
(flag "sunken-buzzer" 49 dm-task-reminder)
(flag "sunken-top-of-helix" 50 dm-task-reminder)
(flag "sunken-spinning-room" 51 dm-task-reminder)
(flag "rolling-race" 52 dm-task-reminder)
(flag "rolling-robbers" 53 dm-task-reminder)
(flag "rolling-moles" 54 dm-task-reminder)
(flag "rolling-plants" 55 dm-task-reminder)
(flag "rolling-lake" 56 dm-task-reminder)
(flag "rolling-buzzer" 57 dm-task-reminder)
(flag "rolling-ring-chase-1" 58 dm-task-reminder)
(flag "rolling-ring-chase-2" 59 dm-task-reminder)
(flag "snow-eggtop" 60 dm-task-reminder)
(flag "snow-ram" 61 dm-task-reminder)
(flag "snow-fort" 62 dm-task-reminder)
(flag "snow-ball" 63 dm-task-reminder)
(flag "snow-bunnies" 64 dm-task-reminder)
(flag "snow-buzzer" 65 dm-task-reminder)
(flag "snow-bumpers" 66 dm-task-reminder)
(flag "snow-cage" 67 dm-task-reminder)
(flag "firecanyon-buzzer" 68 dm-task-reminder)
(flag "firecanyon-end" 69 dm-task-reminder)
(flag "citadel-sage-green" 70 dm-task-reminder)
(flag "citadel-sage-blue" 71 dm-task-reminder)
(flag "citadel-sage-red" 72 dm-task-reminder)
(flag "citadel-sage-yellow" 73 dm-task-reminder)
(flag "village3-extra1" 74 dm-task-reminder)
(flag "village1-buzzer" 75 dm-task-reminder)
(flag "village2-buzzer" 76 dm-task-reminder)
(flag "village3-buzzer" 77 dm-task-reminder)
(flag "cave-gnawers" 78 dm-task-reminder)
(flag "cave-dark-crystals" 79 dm-task-reminder)
(flag "cave-dark-climb" 80 dm-task-reminder)
(flag "cave-robot-climb" 81 dm-task-reminder)
(flag "cave-swing-poles" 82 dm-task-reminder)
(flag "cave-spider-tunnel" 83 dm-task-reminder)
(flag "cave-platforms" 84 dm-task-reminder)
(flag "cave-buzzer" 85 dm-task-reminder)
(flag "ogre-boss" 86 dm-task-reminder)
(flag "ogre-end" 87 dm-task-reminder)
(flag "ogre-buzzer" 88 dm-task-reminder)
(flag "lavatube-end" 89 dm-task-reminder)
(flag "lavatube-buzzer" 90 dm-task-reminder)
(flag "citadel-buzzer" 91 dm-task-reminder)
(flag "training-gimmie" 92 dm-task-reminder)
(flag "training-door" 93 dm-task-reminder)
(flag "training-climb" 94 dm-task-reminder)
(flag "training-buzzer" 95 dm-task-reminder)
(flag "village3-miner-money1" 96 dm-task-reminder)
(flag "village3-miner-money2" 97 dm-task-reminder)
(flag "village3-miner-money3" 98 dm-task-reminder)
(flag "village3-miner-money4" 99 dm-task-reminder)
(flag "village3-oracle-money1" 100 dm-task-reminder)
(flag "village3-oracle-money2" 101 dm-task-reminder)
(flag "firecanyon-assistant" 102 dm-task-reminder)
(flag "village2-levitator" 103 dm-task-reminder)
(flag "swamp-arm" 104 dm-task-reminder)
(flag "village3-button" 105 dm-task-reminder)
(flag "red-eggtop" 106 dm-task-reminder)
(flag "lavatube-balls" 107 dm-task-reminder)
(flag "lavatube-start" 108 dm-task-reminder)
(flag "intro" 109 dm-task-reminder)
(flag "ogre-secret" 110 dm-task-reminder)
(flag "village4-button" 111 dm-task-reminder)
(flag "finalboss-movies" 112 dm-task-reminder)
(flag "plunger-lurker-hit" 113 dm-task-reminder)
(flag "leaving-misty" 114 dm-task-reminder)
(flag "assistant-village3" 115 dm-task-reminder)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-reward-speech-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-reward-speech page to menu."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-reward-speech"
#f
#f
(flag "jungle-eggtop" 2 dm-task-reward-speech)
(flag "jungle-lurkerm" 3 dm-task-reward-speech)
(flag "jungle-tower" 4 dm-task-reward-speech)
(flag "jungle-fishgame" 5 dm-task-reward-speech)
(flag "jungle-plant" 6 dm-task-reward-speech)
(flag "jungle-buzzer" 7 dm-task-reward-speech)
(flag "jungle-canyon-end" 8 dm-task-reward-speech)
(flag "jungle-temple-door" 9 dm-task-reward-speech)
(flag "village1-yakow" 10 dm-task-reward-speech)
(flag "village1-mayor-money" 11 dm-task-reward-speech)
(flag "village1-uncle-money" 12 dm-task-reward-speech)
(flag "village1-oracle-money1" 13 dm-task-reward-speech)
(flag "village1-oracle-money2" 14 dm-task-reward-speech)
(flag "beach-ecorocks" 15 dm-task-reward-speech)
(flag "beach-pelican" 16 dm-task-reward-speech)
(flag "beach-flutflut" 17 dm-task-reward-speech)
(flag "beach-seagull" 18 dm-task-reward-speech)
(flag "beach-cannon" 19 dm-task-reward-speech)
(flag "beach-buzzer" 20 dm-task-reward-speech)
(flag "beach-gimmie" 21 dm-task-reward-speech)
(flag "beach-sentinel" 22 dm-task-reward-speech)
(flag "misty-muse" 23 dm-task-reward-speech)
(flag "misty-boat" 24 dm-task-reward-speech)
(flag "misty-warehouse" 25 dm-task-reward-speech)
(flag "misty-cannon" 26 dm-task-reward-speech)
(flag "misty-bike" 27 dm-task-reward-speech)
(flag "misty-buzzer" 28 dm-task-reward-speech)
(flag "misty-bike-jump" 29 dm-task-reward-speech)
(flag "misty-eco-challenge" 30 dm-task-reward-speech)
(flag "village2-gambler-money" 31 dm-task-reward-speech)
(flag "village2-geologist-money" 32 dm-task-reward-speech)
(flag "village2-warrior-money" 33 dm-task-reward-speech)
(flag "village2-oracle-money1" 34 dm-task-reward-speech)
(flag "village2-oracle-money2" 35 dm-task-reward-speech)
(flag "swamp-billy" 36 dm-task-reward-speech)
(flag "swamp-flutflut" 37 dm-task-reward-speech)
(flag "swamp-battle" 38 dm-task-reward-speech)
(flag "swamp-tether-1" 39 dm-task-reward-speech)
(flag "swamp-tether-2" 40 dm-task-reward-speech)
(flag "swamp-tether-3" 41 dm-task-reward-speech)
(flag "swamp-tether-4" 42 dm-task-reward-speech)
(flag "swamp-buzzer" 43 dm-task-reward-speech)
(flag "sunken-platforms" 44 dm-task-reward-speech)
(flag "sunken-pipe" 45 dm-task-reward-speech)
(flag "sunken-slide" 46 dm-task-reward-speech)
(flag "sunken-room" 47 dm-task-reward-speech)
(flag "sunken-sharks" 48 dm-task-reward-speech)
(flag "sunken-buzzer" 49 dm-task-reward-speech)
(flag "sunken-top-of-helix" 50 dm-task-reward-speech)
(flag "sunken-spinning-room" 51 dm-task-reward-speech)
(flag "rolling-race" 52 dm-task-reward-speech)
(flag "rolling-robbers" 53 dm-task-reward-speech)
(flag "rolling-moles" 54 dm-task-reward-speech)
(flag "rolling-plants" 55 dm-task-reward-speech)
(flag "rolling-lake" 56 dm-task-reward-speech)
(flag "rolling-buzzer" 57 dm-task-reward-speech)
(flag "rolling-ring-chase-1" 58 dm-task-reward-speech)
(flag "rolling-ring-chase-2" 59 dm-task-reward-speech)
(flag "snow-eggtop" 60 dm-task-reward-speech)
(flag "snow-ram" 61 dm-task-reward-speech)
(flag "snow-fort" 62 dm-task-reward-speech)
(flag "snow-ball" 63 dm-task-reward-speech)
(flag "snow-bunnies" 64 dm-task-reward-speech)
(flag "snow-buzzer" 65 dm-task-reward-speech)
(flag "snow-bumpers" 66 dm-task-reward-speech)
(flag "snow-cage" 67 dm-task-reward-speech)
(flag "firecanyon-buzzer" 68 dm-task-reward-speech)
(flag "firecanyon-end" 69 dm-task-reward-speech)
(flag "citadel-sage-green" 70 dm-task-reward-speech)
(flag "citadel-sage-blue" 71 dm-task-reward-speech)
(flag "citadel-sage-red" 72 dm-task-reward-speech)
(flag "citadel-sage-yellow" 73 dm-task-reward-speech)
(flag "village3-extra1" 74 dm-task-reward-speech)
(flag "village1-buzzer" 75 dm-task-reward-speech)
(flag "village2-buzzer" 76 dm-task-reward-speech)
(flag "village3-buzzer" 77 dm-task-reward-speech)
(flag "cave-gnawers" 78 dm-task-reward-speech)
(flag "cave-dark-crystals" 79 dm-task-reward-speech)
(flag "cave-dark-climb" 80 dm-task-reward-speech)
(flag "cave-robot-climb" 81 dm-task-reward-speech)
(flag "cave-swing-poles" 82 dm-task-reward-speech)
(flag "cave-spider-tunnel" 83 dm-task-reward-speech)
(flag "cave-platforms" 84 dm-task-reward-speech)
(flag "cave-buzzer" 85 dm-task-reward-speech)
(flag "ogre-boss" 86 dm-task-reward-speech)
(flag "ogre-end" 87 dm-task-reward-speech)
(flag "ogre-buzzer" 88 dm-task-reward-speech)
(flag "lavatube-end" 89 dm-task-reward-speech)
(flag "lavatube-buzzer" 90 dm-task-reward-speech)
(flag "citadel-buzzer" 91 dm-task-reward-speech)
(flag "training-gimmie" 92 dm-task-reward-speech)
(flag "training-door" 93 dm-task-reward-speech)
(flag "training-climb" 94 dm-task-reward-speech)
(flag "training-buzzer" 95 dm-task-reward-speech)
(flag "village3-miner-money1" 96 dm-task-reward-speech)
(flag "village3-miner-money2" 97 dm-task-reward-speech)
(flag "village3-miner-money3" 98 dm-task-reward-speech)
(flag "village3-miner-money4" 99 dm-task-reward-speech)
(flag "village3-oracle-money1" 100 dm-task-reward-speech)
(flag "village3-oracle-money2" 101 dm-task-reward-speech)
(flag "firecanyon-assistant" 102 dm-task-reward-speech)
(flag "village2-levitator" 103 dm-task-reward-speech)
(flag "swamp-arm" 104 dm-task-reward-speech)
(flag "village3-button" 105 dm-task-reward-speech)
(flag "red-eggtop" 106 dm-task-reward-speech)
(flag "lavatube-balls" 107 dm-task-reward-speech)
(flag "lavatube-start" 108 dm-task-reward-speech)
(flag "intro" 109 dm-task-reward-speech)
(flag "ogre-secret" 110 dm-task-reward-speech)
(flag "village4-button" 111 dm-task-reward-speech)
(flag "finalboss-movies" 112 dm-task-reward-speech)
(flag "plunger-lurker-hit" 113 dm-task-reward-speech)
(flag "leaving-misty" 114 dm-task-reward-speech)
(flag "assistant-village3" 115 dm-task-reward-speech)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun debug-menu-make-task-need-resolution-menu ((menu debug-menu) (context debug-menu-context))
"Append the need-resolution page to menu. Closing a stage here also hands out the fuel cell."
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "need-resolution"
#f
#f
(flag "jungle-eggtop" 2 dm-task-resolution)
(flag "jungle-lurkerm" 3 dm-task-resolution)
(flag "jungle-tower" 4 dm-task-resolution)
(flag "jungle-fishgame" 5 dm-task-resolution)
(flag "jungle-plant" 6 dm-task-resolution)
(flag "jungle-buzzer" 7 dm-task-resolution)
(flag "jungle-canyon-end" 8 dm-task-resolution)
(flag "jungle-temple-door" 9 dm-task-resolution)
(flag "village1-yakow" 10 dm-task-resolution)
(flag "village1-mayor-money" 11 dm-task-resolution)
(flag "village1-uncle-money" 12 dm-task-resolution)
(flag "village1-oracle-money1" 13 dm-task-resolution)
(flag "village1-oracle-money2" 14 dm-task-resolution)
(flag "beach-ecorocks" 15 dm-task-resolution)
(flag "beach-pelican" 16 dm-task-resolution)
(flag "beach-flutflut" 17 dm-task-resolution)
(flag "beach-seagull" 18 dm-task-resolution)
(flag "beach-cannon" 19 dm-task-resolution)
(flag "beach-buzzer" 20 dm-task-resolution)
(flag "beach-gimmie" 21 dm-task-resolution)
(flag "beach-sentinel" 22 dm-task-resolution)
(flag "misty-muse" 23 dm-task-resolution)
(flag "misty-boat" 24 dm-task-resolution)
(flag "misty-warehouse" 25 dm-task-resolution)
(flag "misty-cannon" 26 dm-task-resolution)
(flag "misty-bike" 27 dm-task-resolution)
(flag "misty-buzzer" 28 dm-task-resolution)
(flag "misty-bike-jump" 29 dm-task-resolution)
(flag "misty-eco-challenge" 30 dm-task-resolution)
(flag "village2-gambler-money" 31 dm-task-resolution)
(flag "village2-geologist-money" 32 dm-task-resolution)
(flag "village2-warrior-money" 33 dm-task-resolution)
(flag "village2-oracle-money1" 34 dm-task-resolution)
(flag "village2-oracle-money2" 35 dm-task-resolution)
(flag "swamp-billy" 36 dm-task-resolution)
(flag "swamp-flutflut" 37 dm-task-resolution)
(flag "swamp-battle" 38 dm-task-resolution)
(flag "swamp-tether-1" 39 dm-task-resolution)
(flag "swamp-tether-2" 40 dm-task-resolution)
(flag "swamp-tether-3" 41 dm-task-resolution)
(flag "swamp-tether-4" 42 dm-task-resolution)
(flag "swamp-buzzer" 43 dm-task-resolution)
(flag "sunken-platforms" 44 dm-task-resolution)
(flag "sunken-pipe" 45 dm-task-resolution)
(flag "sunken-slide" 46 dm-task-resolution)
(flag "sunken-room" 47 dm-task-resolution)
(flag "sunken-sharks" 48 dm-task-resolution)
(flag "sunken-buzzer" 49 dm-task-resolution)
(flag "sunken-top-of-helix" 50 dm-task-resolution)
(flag "sunken-spinning-room" 51 dm-task-resolution)
(flag "rolling-race" 52 dm-task-resolution)
(flag "rolling-robbers" 53 dm-task-resolution)
(flag "rolling-moles" 54 dm-task-resolution)
(flag "rolling-plants" 55 dm-task-resolution)
(flag "rolling-lake" 56 dm-task-resolution)
(flag "rolling-buzzer" 57 dm-task-resolution)
(flag "rolling-ring-chase-1" 58 dm-task-resolution)
(flag "rolling-ring-chase-2" 59 dm-task-resolution)
(flag "snow-eggtop" 60 dm-task-resolution)
(flag "snow-ram" 61 dm-task-resolution)
(flag "snow-fort" 62 dm-task-resolution)
(flag "snow-ball" 63 dm-task-resolution)
(flag "snow-bunnies" 64 dm-task-resolution)
(flag "snow-buzzer" 65 dm-task-resolution)
(flag "snow-bumpers" 66 dm-task-resolution)
(flag "snow-cage" 67 dm-task-resolution)
(flag "firecanyon-buzzer" 68 dm-task-resolution)
(flag "firecanyon-end" 69 dm-task-resolution)
(flag "citadel-sage-green" 70 dm-task-resolution)
(flag "citadel-sage-blue" 71 dm-task-resolution)
(flag "citadel-sage-red" 72 dm-task-resolution)
(flag "citadel-sage-yellow" 73 dm-task-resolution)
(flag "village3-extra1" 74 dm-task-resolution)
(flag "village1-buzzer" 75 dm-task-resolution)
(flag "village2-buzzer" 76 dm-task-resolution)
(flag "village3-buzzer" 77 dm-task-resolution)
(flag "cave-gnawers" 78 dm-task-resolution)
(flag "cave-dark-crystals" 79 dm-task-resolution)
(flag "cave-dark-climb" 80 dm-task-resolution)
(flag "cave-robot-climb" 81 dm-task-resolution)
(flag "cave-swing-poles" 82 dm-task-resolution)
(flag "cave-spider-tunnel" 83 dm-task-resolution)
(flag "cave-platforms" 84 dm-task-resolution)
(flag "cave-buzzer" 85 dm-task-resolution)
(flag "ogre-boss" 86 dm-task-resolution)
(flag "ogre-end" 87 dm-task-resolution)
(flag "ogre-buzzer" 88 dm-task-resolution)
(flag "lavatube-end" 89 dm-task-resolution)
(flag "lavatube-buzzer" 90 dm-task-resolution)
(flag "citadel-buzzer" 91 dm-task-resolution)
(flag "training-gimmie" 92 dm-task-resolution)
(flag "training-door" 93 dm-task-resolution)
(flag "training-climb" 94 dm-task-resolution)
(flag "training-buzzer" 95 dm-task-resolution)
(flag "village3-miner-money1" 96 dm-task-resolution)
(flag "village3-miner-money2" 97 dm-task-resolution)
(flag "village3-miner-money3" 98 dm-task-resolution)
(flag "village3-miner-money4" 99 dm-task-resolution)
(flag "village3-oracle-money1" 100 dm-task-resolution)
(flag "village3-oracle-money2" 101 dm-task-resolution)
(flag "firecanyon-assistant" 102 dm-task-resolution)
(flag "village2-levitator" 103 dm-task-resolution)
(flag "swamp-arm" 104 dm-task-resolution)
(flag "village3-button" 105 dm-task-resolution)
(flag "red-eggtop" 106 dm-task-resolution)
(flag "lavatube-balls" 107 dm-task-resolution)
(flag "lavatube-start" 108 dm-task-resolution)
(flag "intro" 109 dm-task-resolution)
(flag "ogre-secret" 110 dm-task-resolution)
(flag "village4-button" 111 dm-task-resolution)
(flag "finalboss-movies" 112 dm-task-resolution)
(flag "plunger-lurker-hit" 113 dm-task-resolution)
(flag "leaving-misty" 114 dm-task-resolution)
(flag "assistant-village3" 115 dm-task-resolution)
#f
#f
#f
#f
#f
#f
#f
#f)))
(none))
(defun dm-task-get-money ((id int) (msg debug-menu-msg))
"Give the player the money one task rewards, and report whether they already hold that much."
(if (= msg (debug-menu-msg press)) (send-event *target* 'get-pickup (pickup-type money) (-> *GAME-bank* money-task-inc)))
(>= (the-as float (send-event *target* 'query 'pickup (pickup-type money))) (-> *GAME-bank* money-task-inc)))
(defun dm-give-all-cells ((id int) (msg debug-menu-msg))
"Give the player every fuel cell and close the need-resolution stage of all 100 tasks. Reports
whether they are all closed already."
(when (= msg (debug-menu-msg press))
(dotimes (i 100)
(send-event *target* 'get-pickup (pickup-type fuel-cell) (the float (+ i 2)))
(close-specific-task! (the-as game-task (+ i 2)) (task-status need-resolution))))
(dotimes (i 100)
(if (not (task-closed? (the-as game-task (+ i 2)) (task-status need-resolution))) (return #f)))
#t)
(defun dm-give-cell ((task game-task))
"Give the player the fuel cell for task and close its need-resolution stage."
(send-event *target* 'get-pickup (pickup-type fuel-cell) (the float task))
(close-specific-task! task (task-status need-resolution))
(none))
(defun dm-levitator-ready ((id int) (msg debug-menu-msg))
"Set up the state the village2 levitator task expects: close its introduction and first reminder,
and hand out every cell up to sunken-sharks. Reports whether the task is waiting on its reward
speech."
(when (= msg (debug-menu-msg press))
(close-specific-task! (game-task village2-levitator) (task-status need-introduction))
(close-specific-task! (game-task village2-levitator) (task-status need-reminder-a))
(dm-give-cell (game-task jungle-eggtop))
(dm-give-cell (game-task jungle-lurkerm))
(dm-give-cell (game-task jungle-tower))
(dm-give-cell (game-task jungle-fishgame))
(dm-give-cell (game-task jungle-plant))
(dm-give-cell (game-task jungle-buzzer))
(dm-give-cell (game-task jungle-canyon-end))
(dm-give-cell (game-task jungle-temple-door))
(dm-give-cell (game-task village1-yakow))
(dm-give-cell (game-task village1-mayor-money))
(dm-give-cell (game-task village1-uncle-money))
(dm-give-cell (game-task village1-oracle-money1))
(dm-give-cell (game-task village1-oracle-money2))
(dm-give-cell (game-task beach-ecorocks))
(dm-give-cell (game-task beach-pelican))
(dm-give-cell (game-task beach-flutflut))
(dm-give-cell (game-task beach-seagull))
(dm-give-cell (game-task beach-cannon))
(dm-give-cell (game-task beach-buzzer))
(dm-give-cell (game-task beach-gimmie))
(dm-give-cell (game-task beach-sentinel))
(dm-give-cell (game-task misty-muse))
(dm-give-cell (game-task misty-boat))
(dm-give-cell (game-task misty-warehouse))
(dm-give-cell (game-task misty-cannon))
(dm-give-cell (game-task misty-bike))
(dm-give-cell (game-task misty-buzzer))
(dm-give-cell (game-task misty-bike-jump))
(dm-give-cell (game-task misty-eco-challenge))
(dm-give-cell (game-task village2-gambler-money))
(dm-give-cell (game-task village2-geologist-money))
(dm-give-cell (game-task village2-oracle-money1))
(dm-give-cell (game-task village2-oracle-money2))
(dm-give-cell (game-task swamp-billy))
(dm-give-cell (game-task swamp-flutflut))
(dm-give-cell (game-task swamp-battle))
(dm-give-cell (game-task swamp-tether-1))
(dm-give-cell (game-task swamp-tether-2))
(dm-give-cell (game-task swamp-tether-3))
(dm-give-cell (game-task swamp-tether-4))
(dm-give-cell (game-task swamp-buzzer))
(dm-give-cell (game-task sunken-platforms))
(dm-give-cell (game-task sunken-pipe))
(dm-give-cell (game-task sunken-slide))
(dm-give-cell (game-task sunken-room))
(dm-give-cell (game-task sunken-sharks)))
(= (get-task-status (game-task village2-levitator)) (task-status need-reward-speech)))
(defun dm-lavabike-ready ((id int) (msg debug-menu-msg))
"Hand out every cell up to village2-buzzer, which is what the lavatube start task requires.
Reports whether that task is waiting on its reward speech."
(when (= msg (debug-menu-msg press))
(dm-give-cell (game-task jungle-eggtop))
(dm-give-cell (game-task jungle-lurkerm))
(dm-give-cell (game-task jungle-tower))
(dm-give-cell (game-task jungle-fishgame))
(dm-give-cell (game-task jungle-plant))
(dm-give-cell (game-task jungle-buzzer))
(dm-give-cell (game-task jungle-canyon-end))
(dm-give-cell (game-task jungle-temple-door))
(dm-give-cell (game-task village1-yakow))
(dm-give-cell (game-task village1-mayor-money))
(dm-give-cell (game-task village1-uncle-money))
(dm-give-cell (game-task village1-oracle-money1))
(dm-give-cell (game-task village1-oracle-money2))
(dm-give-cell (game-task beach-ecorocks))
(dm-give-cell (game-task beach-pelican))
(dm-give-cell (game-task beach-flutflut))
(dm-give-cell (game-task beach-seagull))
(dm-give-cell (game-task beach-cannon))
(dm-give-cell (game-task beach-buzzer))
(dm-give-cell (game-task beach-gimmie))
(dm-give-cell (game-task beach-sentinel))
(dm-give-cell (game-task misty-muse))
(dm-give-cell (game-task misty-boat))
(dm-give-cell (game-task misty-warehouse))
(dm-give-cell (game-task misty-cannon))
(dm-give-cell (game-task misty-bike))
(dm-give-cell (game-task misty-buzzer))
(dm-give-cell (game-task misty-bike-jump))
(dm-give-cell (game-task misty-eco-challenge))
(dm-give-cell (game-task village2-gambler-money))
(dm-give-cell (game-task village2-geologist-money))
(dm-give-cell (game-task village2-warrior-money))
(dm-give-cell (game-task village2-oracle-money1))
(dm-give-cell (game-task village2-oracle-money2))
(dm-give-cell (game-task swamp-billy))
(dm-give-cell (game-task swamp-flutflut))
(dm-give-cell (game-task swamp-battle))
(dm-give-cell (game-task swamp-tether-1))
(dm-give-cell (game-task swamp-tether-2))
(dm-give-cell (game-task swamp-tether-3))
(dm-give-cell (game-task swamp-tether-4))
(dm-give-cell (game-task swamp-buzzer))
(dm-give-cell (game-task sunken-platforms))
(dm-give-cell (game-task sunken-pipe))
(dm-give-cell (game-task sunken-slide))
(dm-give-cell (game-task sunken-room))
(dm-give-cell (game-task sunken-sharks))
(dm-give-cell (game-task sunken-buzzer))
(dm-give-cell (game-task sunken-top-of-helix))
(dm-give-cell (game-task sunken-spinning-room))
(dm-give-cell (game-task rolling-race))
(dm-give-cell (game-task rolling-robbers))
(dm-give-cell (game-task rolling-moles))
(dm-give-cell (game-task rolling-plants))
(dm-give-cell (game-task rolling-lake))
(dm-give-cell (game-task rolling-buzzer))
(dm-give-cell (game-task rolling-ring-chase-1))
(dm-give-cell (game-task rolling-ring-chase-2))
(dm-give-cell (game-task snow-eggtop))
(dm-give-cell (game-task snow-ram))
(dm-give-cell (game-task snow-fort))
(dm-give-cell (game-task snow-ball))
(dm-give-cell (game-task snow-bunnies))
(dm-give-cell (game-task snow-buzzer))
(dm-give-cell (game-task snow-bumpers))
(dm-give-cell (game-task snow-cage))
(dm-give-cell (game-task firecanyon-buzzer))
(dm-give-cell (game-task firecanyon-end))
(dm-give-cell (game-task citadel-sage-green))
(dm-give-cell (game-task citadel-sage-blue))
(dm-give-cell (game-task citadel-sage-red))
(dm-give-cell (game-task citadel-sage-yellow))
(dm-give-cell (game-task village3-extra1))
(dm-give-cell (game-task village1-buzzer))
(dm-give-cell (game-task village2-buzzer)))
(= (get-task-status (game-task lavatube-start)) (task-status need-reward-speech)))
(defun debug-menu-make-task-menu ((context debug-menu-context))
"Build the Task page and return the item that opens it."
(let* ((menu (new 'debug 'debug-menu context "Task menu"))
(task-item (new 'debug 'debug-menu-item-submenu "Task" menu)))
(debug-menu-append-item menu (new 'debug 'debug-menu-item-flag "enough money" #f dm-task-get-money))
(debug-menu-append-item menu (new 'debug 'debug-menu-item-flag "levitator ready" #f dm-levitator-ready))
(debug-menu-append-item menu (new 'debug 'debug-menu-item-flag "lavabike ready" #f dm-lavabike-ready))
(debug-menu-append-item menu (new 'debug 'debug-menu-item-flag "all cells" #f dm-give-all-cells))
(debug-menu-make-task-unknown-menu menu context)
(debug-menu-make-task-need-hint-menu menu context)
(debug-menu-make-task-need-introduction-menu menu context)
(debug-menu-make-task-need-reminder-a-menu menu context)
(debug-menu-make-task-need-reminder-menu menu context)
(debug-menu-make-task-need-reward-speech-menu menu context)
(debug-menu-make-task-need-resolution-menu menu context)
task-item))
(defun dm-anim-tester-flag-func ((id symbol) (msg debug-menu-msg))
"Anim Tester flags. Toggles apply-align or show-joint-info on the running tester and reports the
bit, or reports #f when no tester is running."
(when *anim-tester*
(case id
(('at-apply-align)
(if (= msg (debug-menu-msg press)) (logxor! (-> *anim-tester* 0 flags) (anim-tester-flags at-apply-align)))
(return (logtest? (-> *anim-tester* 0 flags) (anim-tester-flags at-apply-align))))
(('at-show-joint-info)
(if (= msg (debug-menu-msg press)) (logxor! (-> *anim-tester* 0 flags) (anim-tester-flags at-show-joint-info)))
(return (logtest? (-> *anim-tester* 0 flags) (anim-tester-flags at-show-joint-info))))))
#f)
(defun dm-anim-tester-func ((id symbol) (msg debug-menu-msg))
"Anim Tester commands. Starts the tester if it is not running, then forwards a pick or save
request to it, or points the camera at it. The pick commands hide the debug menu so the tester
can use the pad."
(if (not *anim-tester*) (anim-tester-start))
(when *anim-tester*
(cond
((= id 'at-pick-object)
(send-event (ppointer->process *anim-tester*) 'pick-object)
(set! (-> *debug-menu-context* is-hidden) #t))
((= id 'at-pick-joint-anim)
(send-event (ppointer->process *anim-tester*) 'pick-joint-anim)
(set! (-> *debug-menu-context* is-hidden) #t))
((= id 'at-pick-sequence)
(send-event (ppointer->process *anim-tester*) 'pick-sequence)
(set! (-> *debug-menu-context* is-hidden) #t))
((= id 'at-save-sequences) (send-event (ppointer->process *anim-tester*) 'save-sequences))
((= id 'at-cam-stick) (set! *camera-orbit-target* *anim-tester*) (send-event *camera* 'change-state cam-orbit 0))
((= id 'at-cam-free-floating) (send-event *camera* 'change-state cam-free-floating 0))))
(none))
(defun build-continue-menu ((menu debug-menu) (info game-info))
"Fill menu with one entry per continue point of every level in *level-load-list*. info is unused."
(let ((levels *level-load-list*))
(while (not (null? levels))
(let ((continues (-> (the-as level-load-info (-> (the-as symbol (car levels)) value)) continues)))
(while (not (null? continues))
(let* ((continue-info (the-as continue-point (car continues)))
(item (new 'debug 'debug-menu-item-flag (-> continue-info name) (-> continue-info name) dm-current-continue)))
(debug-menu-append-item menu item))
(set! continues (cdr continues))))
(set! levels (cdr levels))))
menu)
(defun debug-menu-context-make-default-menus ((context debug-menu-context))
"Build the whole debug menu into context and install it as the root menu."
(let ((menu (new 'debug 'debug-menu context "Main menu")))
(debug-menu-context-set-root-menu context menu)
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Artist"
(flag "Poly Stats" *stats-poly* dm-boolean-toggle-pick-func)
(flag "Memory Stats" *stats-memory* dm-boolean-toggle-pick-func)
(flag "Memory Stats Short" *stats-memory-short* dm-boolean-toggle-pick-func)
(flag "Ground Stats" *display-ground-stats* dm-boolean-toggle-pick-func)
(flag "All Visible" *artist-all-visible* dm-boolean-toggle-pick-func)
(flag "Flip Visible" *artist-flip-visible* dm-boolean-toggle-pick-func)
(flag "Fix Visible" *artist-fix-visible* dm-boolean-toggle-pick-func)
(flag "Fix Frustum" *artist-fix-frustum* dm-boolean-toggle-pick-func)
(flag "Error Spheres" *artist-error-spheres* dm-boolean-toggle-pick-func)
(flag "Use menu subdiv" *artist-use-menu-subdiv* dm-boolean-toggle-pick-func)
(float-var "Subdiv Close" close dm-subdiv-float 10 1 #t 1 200 1)
(float-var "Subdiv Far" far dm-subdiv-float 10 1 #t 1 200 1)
(function "Target Start" #f ,(lambda () (start 'debug (get-or-create-continue! *game-info*))))
(function "Target Stop" #f ,(lambda () (stop 'debug)))
(menu "Anim Tester"
(int-var "Speed" anim-speed dm-subdiv-int 10 10 #t -300 1000)
(flag "Apply Align" at-apply-align dm-anim-tester-flag-func)
(flag "Show Joint Inf" at-show-joint-info dm-anim-tester-flag-func)
(function "Camera Face" at-cam-stick dm-anim-tester-func)
(function "Camera Free" at-cam-free-floating dm-anim-tester-func)
(function "Pick Object" at-pick-object dm-anim-tester-func)
(function "Pick Joint Anim" at-pick-joint-anim dm-anim-tester-func)
(function "Pick Sequence" at-pick-sequence dm-anim-tester-func)
(function "Save Sequences" at-save-sequences dm-anim-tester-func))
(flag "Show Entity Errors" *display-entity-errors* dm-boolean-toggle-pick-func)
(flag "Sprite Info" *display-sprite-info* dm-boolean-toggle-pick-func)
(flag "Time of Day" #f dm-time-of-day-pick-func)
(flag "Preload Anims" *preload-spool-anims* dm-boolean-toggle-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Game"
(function "New Game" #f ,(lambda () (initialize! *game-info* 'game (the-as game-save #f) (the-as string #f)) (none)))
(function "New Life" #f ,(lambda () (initialize! *game-info* 'die (the-as game-save #f) (the-as string #f)) (none)))
(function "Reset Game"
#f
,(lambda ()
(set! (-> *game-info* mode) 'debug)
(initialize! *game-info* 'game (the-as game-save #f) (the-as string #f))
(none)))
(function "Reset Actors" #f ,(lambda () (reset-actors 'debug) (none)))
(function "Save Game" #f ,(lambda () (auto-save-command 'save 0 0 *default-pool*) (none)))
(function "Load Game" #f ,(lambda () (auto-save-command 'restore 0 0 *default-pool*) (none)))
(flag "Target"
#f
,(lambda ((id int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(if *target* (stop 'debug) (start 'debug (get-or-create-continue! *game-info*))))
*target*))
(flag "Game Mode" play dm-game-mode-pick-func)
(flag "Debug Mode" debug dm-game-mode-pick-func)
(menu "Continue")
(menu "Settings"
(float-var "sfx-volume"
#f
,(lambda ((id int) (msg debug-menu-msg) (value float))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default sfx-volume) value)
(-> *setting-control* default sfx-volume)))
2
1
#t
0
100
0)
(float-var "music-volume"
#f
,(lambda ((id int) (msg debug-menu-msg) (value float))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default music-volume) value)
(-> *setting-control* default music-volume)))
2
1
#t
0
100
0)
(float-var "dialog-volume"
#f
,(lambda ((id int) (msg debug-menu-msg) (value float))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default dialog-volume) value)
(-> *setting-control* default dialog-volume)))
2
1
#t
0
100
0)
(menu "Language"
(flag "english" 0 dm-setting-language)
(flag "japanese" 5 dm-setting-language)
(flag "french" 1 dm-setting-language)
(flag "german" 2 dm-setting-language)
(flag "spanish" 3 dm-setting-language)
(flag "italian" 4 dm-setting-language)
(flag "uk-english" 6 dm-setting-language))
(flag "play-hints "
#f
,(lambda ((id int) (msg debug-menu-msg))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default play-hints) (not (-> *setting-control* default play-hints))))
(-> *setting-control* default play-hints)))
(flag "vibration"
#f
,(lambda ((id int) (msg debug-menu-msg))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default vibration) (not (-> *setting-control* default vibration))))
(-> *setting-control* default vibration)))
(flag "border-mode"
#f
,(lambda ((id int) (msg debug-menu-msg))
(if (= msg (debug-menu-msg press))
(set! (-> *setting-control* default border-mode) (not (-> *setting-control* default border-mode))))
(-> *setting-control* default border-mode)))))))
(let ((continue-menu (debug-menu-find-from-template context '("Game" "Continue"))))
(build-continue-menu continue-menu *game-info*))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Stats"
(flag "Poly" *stats-poly* dm-boolean-toggle-pick-func)
(flag "Collide" *stats-collide* dm-boolean-toggle-pick-func)
(flag "Bsp" *stats-bsp* dm-boolean-toggle-pick-func)
(flag "Buffer" *stats-buffer* dm-boolean-toggle-pick-func)
(flag "Target" *stats-target* dm-boolean-toggle-pick-func)
(flag "Dma test" *stats-dma-test* dm-boolean-toggle-pick-func)
(flag "Blerc" *stats-blerc* dm-boolean-toggle-pick-func)
(flag "Perf" *display-perf-stats* dm-boolean-toggle-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Render"
(flag "sky" 1 dm-vu1-user-toggle-pick-func)
(flag "ocean" 2 dm-vu1-user-toggle-pick-func)
(flag "ocean-wave" 4 dm-vu1-user-toggle-pick-func)
(flag "TFRAG TIE TEXTURES" #x1 dm-texture-user-toggle-pick-func)
(flag "tfrag" 8 dm-vu1-user-toggle-pick-func)
(flag "tie-near" 16 dm-vu1-user-toggle-pick-func)
(flag "tie" 32 dm-vu1-user-toggle-pick-func)
(flag "generic" 64 dm-vu1-user-toggle-pick-func)
(flag "generic-tie" *generic-tie* dm-boolean-toggle-pick-func)
(flag "PRIS TEXTURES" #x2 dm-texture-user-toggle-pick-func)
(flag "merc" 128 dm-vu1-user-toggle-pick-func)
(flag "SHRUB TEXTURES" #x4 dm-texture-user-toggle-pick-func)
(flag "shrub-near" 512 dm-vu1-user-toggle-pick-func)
(flag "shrubbery" 256 dm-vu1-user-toggle-pick-func)
(flag "billboard" 1024 dm-vu1-user-toggle-pick-func)
(flag "trans-shrubbery" 2048 dm-vu1-user-toggle-pick-func)
(flag "ALPHA TEXTURES" 1 dm-texture-user-toggle-pick-func)
(flag "trans-tfrag" 4096 dm-vu1-user-toggle-pick-func)
(flag "sprite" 8192 dm-vu1-user-toggle-pick-func)
(flag "shadow" 16384 dm-vu1-user-toggle-pick-func)
(flag "shadow-debug" *shadow-debug* dm-boolean-toggle-pick-func)
(flag "WATER TEXTURES" 2 dm-texture-user-toggle-pick-func)
(flag "depth-cue" 32768 dm-vu1-user-toggle-pick-func)
(flag "all on" 262143 dm-vu1-user-set-pick-func)
(flag "all off" 196608 dm-vu1-user-set-pick-func)
(flag "all textures on" #x1f dm-texture-user-set-pick-func)
(flag "all textures off" 0 dm-texture-user-set-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Collision"
(flag "Collide Stats" *stats-collide* dm-boolean-toggle-pick-func)
(flag "Collision Marks" *display-collision-marks* dm-boolean-toggle-pick-func)
(flag "Collision Cache" *display-collide-cache* dm-boolean-toggle-pick-func)
(flag "Render Collision" *display-render-collision* dm-boolean-toggle-pick-func)
(flag "Hipri Collision Marks" *display-hipri-collision-marks* dm-boolean-toggle-pick-func)
(flag "Edge Collision Marks" *display-edge-collision-marks* dm-boolean-toggle-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Display"
(flag "Profile" *display-profile* dm-boolean-toggle-pick-func)
(flag "Ticks" *profile-ticks* dm-boolean-toggle-pick-func)
(flag "File Info" *display-file-info* dm-boolean-toggle-pick-func)
(flag "Level Spheres" *display-level-spheres* dm-boolean-toggle-pick-func)
(flag "Collision Marks" *display-collision-marks* dm-boolean-toggle-pick-func)
(flag "Collision Cache" *display-collide-cache* dm-boolean-toggle-pick-func)
(flag "Hipri Collision Marks" *display-hipri-collision-marks* dm-boolean-toggle-pick-func)
(flag "Edge Collision Marks" *display-edge-collision-marks* dm-boolean-toggle-pick-func)
(flag "Target Marks" *display-target-marks* dm-boolean-toggle-pick-func)
(flag "Target Stats" *stats-target* dm-boolean-toggle-pick-func)
(flag "Entity Lights" *display-lights* dm-boolean-toggle-pick-func)
(flag "Camera Marks" *display-camera-marks* dm-boolean-toggle-pick-func)
(flag "Camera Info" *display-camera-info* dm-boolean-toggle-pick-func)
(flag "Geometry Marks" *display-geo-marks* dm-boolean-toggle-pick-func)
(flag "Nav Marks" *display-nav-marks* dm-boolean-toggle-pick-func)
(flag "Path Marks" *display-path-marks* dm-boolean-toggle-pick-func)
(flag "Vol Marks" *display-vol-marks* dm-boolean-toggle-pick-func)
(menu "Ambient Marks"
(flag "Ambient Hint Marks" *display-ambient-hint-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Sound Marks" *display-ambient-sound-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Poi Marks" *display-ambient-poi-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Light Marks" *display-ambient-light-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Dark Marks" *display-ambient-dark-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Weather Off Marks" *display-ambient-weather-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Ocean Off Marks" *display-ambient-ocean-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Ocean Near Off Marks" *display-ambient-ocean-near-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Music" *display-ambient-music-marks* dm-boolean-toggle-pick-func))
(menu "Actor Marks"
(flag "off" #f dm-actor-marks-pick-func)
(flag "on" #t dm-actor-marks-pick-func)
(flag "full" full dm-actor-marks-pick-func)
(flag "process" process dm-actor-marks-pick-func))
(menu "Actor Vis"
(flag "off" #f dm-actor-vis-pick-func)
(flag "box" box dm-actor-vis-pick-func)
(flag "sphere" sphere dm-actor-vis-pick-func)
(flag "all" #t dm-actor-vis-pick-func))
(flag "Art Control" *display-art-control* dm-boolean-toggle-pick-func)
(flag "Instance Info" *display-instance-info* dm-boolean-toggle-pick-func)
(menu "strip lines"
(flag "strippable" 1 dm-strip-lines-toggle-pick-func)
(flag "convertible" 2 dm-strip-lines-toggle-pick-func)
(flag "edgeable" 4 dm-strip-lines-toggle-pick-func)
(flag "ordinary" 8 dm-strip-lines-toggle-pick-func)
(flag "color mismatch" 16 dm-strip-lines-toggle-pick-func)
(flag "shader mismatch" 32 dm-strip-lines-toggle-pick-func)
(flag "uv mismatch" 64 dm-strip-lines-toggle-pick-func)
(flag "too big" 128 dm-strip-lines-toggle-pick-func)
(flag "good" 3 dm-strip-lines-set-pick-func)
(flag "bad" 240 dm-strip-lines-set-pick-func)
(flag "all edges" 255 dm-strip-lines-set-pick-func)
(flag "strips" 256 dm-strip-lines-set-pick-func)
(flag "frags" 512 dm-strip-lines-set-pick-func)
(flag "none" 0 dm-strip-lines-set-pick-func))
(menu "collision mesh"
(flag "wall" 1024 dm-strip-lines-toggle-pick-func)
(flag "ground" 2048 dm-strip-lines-toggle-pick-func)
(flag "all" 3072 dm-strip-lines-set-pick-func)
(flag "none" 0 dm-strip-lines-set-pick-func))
(flag "Texture Download" *display-texture-download* dm-boolean-toggle-pick-func)
(flag "Level Border" *display-level-border* dm-boolean-toggle-pick-func)
(flag "Split Boxes" *display-split-boxes* dm-boolean-toggle-pick-func)
(flag "Split Box Info" *display-split-box-info* dm-boolean-toggle-pick-func)
(flag "Load boundaries" *display-load-boundaries* dm-boolean-toggle-pick-func)
(flag "Memcard Info" *display-memcard-info* dm-boolean-toggle-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Actor"
(flag "Spawn Actors" *spawn-actors* dm-boolean-toggle-pick-func)
(function "Reset Actors" #f ,(lambda () (reset-actors 'debug) (none)))
(menu "Actor Compaction"
(flag "off" #f dm-compact-actor-pick-func)
(flag "on" #t dm-compact-actor-pick-func)
(flag "debug" debug dm-compact-actor-pick-func))
(flag "Ambients" *execute-ambients* dm-boolean-toggle-pick-func)
(flag "Ambient Hint Marks" *display-ambient-hint-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Sound Marks" *display-ambient-sound-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Poi Marks" *display-ambient-poi-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Light Marks" *display-ambient-light-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Dark Marks" *display-ambient-dark-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Weather Off Marks" *display-ambient-weather-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Ocean Off Marks" *display-ambient-ocean-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Ocean Near Off Marks" *display-ambient-ocean-near-off-marks* dm-boolean-toggle-pick-func)
(flag "Ambient Music" *display-ambient-music-marks* dm-boolean-toggle-pick-func)
(menu "Actor Marks"
(flag "off" #f dm-actor-marks-pick-func)
(flag "on" #t dm-actor-marks-pick-func)
(flag "full" full dm-actor-marks-pick-func)
(flag "process" process dm-actor-marks-pick-func))
(menu "Actor Vis"
(flag "off" #f dm-actor-vis-pick-func)
(flag "box" box dm-actor-vis-pick-func)
(flag "sphere" sphere dm-actor-vis-pick-func)
(flag "all" #t dm-actor-vis-pick-func))
(flag "Actor Vis" *vis-actors* dm-boolean-toggle-pick-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Target"
(flag "Target Stats" *stats-target* dm-boolean-toggle-pick-func)
(function "Play" #f ,(lambda () (play #t #t)))
(function "Start" #f ,(lambda () (the-as int (start 'debug (get-or-create-continue! *game-info*)))))
(function "Stop" #f ,(lambda () (stop 'debug)))
(flag "Invulnerable"
#f
,(lambda ((id int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(if *target* (logxor! (-> *target* state-flags) (state-flags invulnerable))))
(the-as symbol (and *target* (logtest? (-> *target* state-flags) (state-flags invulnerable))))))
(function "Reset Trans"
#f
,(lambda ()
(when *target*
(position-in-front-of-camera! (target-pos 0) (meters 10) (meters 1))
(vector-zero! (-> *target* control transv))
(quaternion-identity! (-> *target* control quat))
(quaternion-identity! (-> *target* control quat-for-control))
(quaternion-identity! (-> *target* control dir-targ)))))
(function "Zero Trans"
#f
,(lambda ()
(when *target*
(set-vector! (-> *target* control trans) 0.0 (meters 40) 0.0 1.0)
(vector-zero! (-> *target* control transv))
(quaternion-identity! (-> *target* control quat))
(quaternion-identity! (-> *target* control quat-for-control))
(quaternion-identity! (-> *target* control dir-targ)))))
(menu "Mode"
(function "normal" #f ,(lambda () (send-event *target* 'end-mode)))
(function "racing" #f ,(lambda () (send-event *target* 'change-mode 'racing #f)))
(function "snowball" #f ,(lambda () (send-event *target* 'change-mode 'snowball #f))))
(flag "Slow Frame Rate" *slow-frame-rate* dm-boolean-toggle-pick-func)
(function "Print Pos"
#f
,(lambda ()
(let ((pos (target-pos 0))) (format #t "~6,,2m ~6,,2m ~6,,2m~%" (-> pos x) (-> pos y) (-> pos z)))
0
(none)))
(function "Save Continue" #f ,(lambda () (if *target* (trsq->continue-point (-> *target* control))) (none))))))
(debug-menu-append-item menu (debug-menu-make-camera-menu context))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Subdiv"
(flag "Textured" 0 dm-subdiv-draw-func)
(flag "Outline" 1 dm-subdiv-draw-func)
(flag "Gouraud" 2 dm-subdiv-draw-func)
(flag "Hack" 3 dm-subdiv-draw-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Ocean Subdiv"
(flag "Textured" 0 dm-ocean-subdiv-draw-func)
(flag "Outline" 1 dm-ocean-subdiv-draw-func)
(flag "Gouraud" 2 dm-ocean-subdiv-draw-func))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Time of day"
(flag "7am sunrise" 0 dm-time-of-day-func)
(flag "9am morning" 1 dm-time-of-day-func)
(flag "12pm noon" 2 dm-time-of-day-func)
(flag "3pm afternoon" 3 dm-time-of-day-func)
(flag "6pm sunset" 4 dm-time-of-day-func)
(flag "7pm twilight" 5 dm-time-of-day-func)
(flag "11pm evening" 6 dm-time-of-day-func)
(flag "4am green sun" 7 dm-time-of-day-func)
(flag "on" 8 dm-time-of-day-func)
(flag "Effects" *time-of-day-effects* dm-boolean-toggle-pick-func)
(flag "Fast" *time-of-day-fast* dm-time-of-day-func2))))
(debug-menu-append-item menu
(debug-menu-make-from-template context
'(menu "Sound"
(flag "Effect Debug" *debug-effect-control* dm-boolean-toggle-pick-func)
(flag "Amb Snd Marks" *display-ambient-sound-marks* dm-boolean-toggle-pick-func)
(flag "Amb Snd Class" *ambient-sound-class* dm-boolean-toggle-pick-func)
(flag "Amb Spheres" *execute-ambients* dm-boolean-toggle-pick-func)
(flag "Sound channels" *display-iop-info* dm-boolean-toggle-pick-func)
(function "List Sounds" #f ,(lambda () (list-sounds))))))
(debug-menu-append-item menu (debug-menu-make-shader-menu context))
(debug-menu-append-item menu (debug-menu-make-instance-menu context))
(debug-menu-append-item menu (debug-menu-make-task-menu context)))
context)
(define *popup-menu-context* (new 'debug 'debug-menu-context))
(defun popup-menu-context-make-default-menus ((context debug-menu-context))
"Build the popup menu into context: the few entries reachable by holding L3 on the pause screen."
(debug-menu-make-from-template context
'(main-menu "Popup"
(flag "Cam 1" pad-1 dm-cam-externalize)
(flag "Target"
#f
,(lambda ((id int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(if *target* (stop 'debug) (start 'debug (get-or-create-continue! *game-info*))))
*target*))
(flag "Game"
#f
,(lambda ((id int) (msg debug-menu-msg))
(when (= msg (debug-menu-msg press))
(let ((mode (-> *game-info* mode)))
(set! (-> *game-info* mode)
(cond
((= mode 'play) 'debug)
((= mode 'debug) 'play)
(else (-> *game-info* mode))))))
(= (-> *game-info* mode) 'play)))
(function "Clean"
#f
,(lambda ((id int) (msg debug-menu-msg))
(if (time-of-day-setup #f) (time-of-day-setup #t))
(set! *display-entity-errors* #f)
(set! *display-profile* #f)
(set! *display-actor-marks* #f)
#f))
(flag "Stats" *stats-target* dm-boolean-toggle-pick-func)
(function "Reset" #f ,(lambda () (reset-actors 'debug) (none)))))
context)
(debug-menu-context-make-default-menus *debug-menu-context*)
(popup-menu-context-make-default-menus *popup-menu-context*)
(defun menu-respond-to-pause ()
"Called while the pause screen is up. Activates the popup menu when L3 is held and the main menu
otherwise, and deactivates both once the game is no longer paused."
(case *master-mode*
(('menu)
(if (cpad-hold? 0 l3)
(debug-menu-context-send-msg *popup-menu-context* (debug-menu-msg activate) (debug-menu-dest activation))
(debug-menu-context-send-msg *debug-menu-context* (debug-menu-msg activate) (debug-menu-dest activation))))
(else
(debug-menu-context-send-msg *debug-menu-context* (debug-menu-msg deactivate) (debug-menu-dest activation))
(debug-menu-context-send-msg *popup-menu-context* (debug-menu-msg deactivate) (debug-menu-dest activation))))
#f)
(defun *menu-hook* ()
"Per-frame entry point for both debug menu contexts."
(debug-menus-handler *debug-menu-context*)
(debug-menus-handler *popup-menu-context*))