jak-project/goal_src/jak2/engine/game/main.gc

818 lines
27 KiB
Common Lisp
Raw Normal View History

;;-*-Lisp-*-
(in-package goal)
;; name: main.gc
;; name in dgo: main
;; dgos: ENGINE, GAME
;; DECOMP BEGINS
(defun set-letterbox-frames ((arg0 time-frame))
"Set the remaining time until letterboxing is removed.
This uses the current clock ratio of the process and the game-clock.
This overrides any previous letterboxing."
(with-pp
(set! (-> *game-info* letterbox-time)
(+ (-> *display* base-clock frame-counter)
(the int (/ (* (the float arg0) (-> *display* game-clock clock-ratio)) (-> pp clock clock-ratio)))
)
)
(none)
)
)
(defun letterbox ()
"Draw letterbox bars."
(let* ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf))
(gp-0 (-> s5-0 base))
)
(draw-sprite2d-xy-absolute s5-0 0 0 512 46 (new 'static 'rgba :a #x80))
(draw-sprite2d-xy-absolute s5-0 0 370 512 47 (new 'static 'rgba :a #x80))
(let ((a3-2 (-> s5-0 base)))
(let ((v1-7 (the-as dma-packet (-> s5-0 base))))
(set! (-> v1-7 dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> v1-7 vif0) (new 'static 'vif-tag))
(set! (-> v1-7 vif1) (new 'static 'vif-tag))
(set! (-> s5-0 base) (the-as pointer (&+ v1-7 16)))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) bucket-group)
(bucket-id screen-filter)
gp-0
(the-as (pointer dma-tag) a3-2)
)
)
)
(none)
)
(defun set-blackout-frames ((arg0 time-frame))
"Set the remaining time until blackout is removed.
Unlike letterbox, this only can increase the time, unless
you request 0, in which case blackout is disabled immediately"
(with-pp
(if (zero? arg0)
(set! (-> *game-info* blackout-time) (-> *display* base-clock frame-counter))
(set! (-> *game-info* blackout-time)
(the-as time-frame
(max (-> *game-info* blackout-time)
(+ (-> *display* base-clock frame-counter)
(the int (/ (* (the float arg0) (-> *display* game-clock clock-ratio)) (-> pp clock clock-ratio)))
arg0
)
)
)
)
)
(none)
)
)
(defun blackout ()
"Draw blackout over the whole screen.
This isn't used - instead they adjust some GS setting to fade the whole
screen to black, which is much faster than drawing over the entire screen."
(let* ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf))
(gp-0 (-> s5-0 base))
)
(draw-sprite2d-xy-absolute s5-0 0 0 512 416 (new 'static 'rgba :a #x80))
(let ((a3-1 (-> s5-0 base)))
(let ((v1-6 (the-as object (-> s5-0 base))))
(set! (-> (the-as dma-packet v1-6) dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> (the-as dma-packet v1-6) vif0) (new 'static 'vif-tag))
(set! (-> (the-as dma-packet v1-6) vif1) (new 'static 'vif-tag))
(set! (-> s5-0 base) (&+ (the-as pointer v1-6) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) bucket-group)
(bucket-id debug-no-zbuf2)
gp-0
(the-as (pointer dma-tag) a3-1)
)
)
)
(none)
)
(defun paused? ()
"Are we paused, or in some menu that should make us pause?"
(or (= *master-mode* 'pause) (= *master-mode* 'progress) (= *master-mode* 'menu) (= *master-mode* 'freeze))
)
(defun movie? ()
"Are we in a movie?"
(logtest? (-> *kernel-context* prevent-from-run) (process-mask movie))
)
(defun demo? ()
"Are we a demo version?"
(or (= *kernel-boot-message* 'demo) (= *kernel-boot-message* 'demo-shared))
)
;; the "master-mode" is a single "mode" for the game:
;; - 'game: normal play
;; - 'pause: select pause (with PAUSE on screen)
;; - 'freeze: a pause, but without PAUSE on screen
;; - 'menu: debug menu system open
;; - 'progress: progress menu open (start menu)
(define *last-master-mode* 'game)
(defun set-master-mode ((arg0 symbol))
"Change the master mode, updating pause masks in the kernel/sound system as needed."
(when (!= arg0 *master-mode*)
(set! *last-master-mode* *master-mode*)
(set! *master-mode* arg0)
;; transition stuff:
(case *master-mode*
(('pause)
;; entering pause, set pause bit in masks
(if (not *debug-pause*)
(logior! (-> *setting-control* user-default process-mask) (process-mask pause))
)
(logclear! (-> *setting-control* user-default process-mask) (process-mask freeze menu))
(set! *pause-lock* #f)
(sound-group-pause (sound-group sfx music dialog sog3 ambient dialog2 sog6 sog7))
(set! (-> *game-info* pause-start-time) (-> *display* real-clock frame-counter))
)
(('freeze)
(logior! (-> *setting-control* user-default process-mask) (process-mask freeze))
(logclear! (-> *setting-control* user-default process-mask) (process-mask pause menu))
(sound-group-pause (sound-group sfx ambient))
(set! (-> *game-info* pause-start-time) (-> *display* real-clock frame-counter))
)
(('menu)
(logior! (-> *setting-control* user-default process-mask) (process-mask menu))
(logclear! (-> *setting-control* user-default process-mask) (process-mask freeze pause progress))
(sound-group-pause (sound-group sfx music dialog sog3 ambient dialog2 sog6 sog7))
(set! *pause-lock* #f)
)
(('progress)
;; entering progress, start the process
(logclear! (-> *setting-control* user-default process-mask) (process-mask freeze pause menu))
(sound-group-pause (sound-group sfx music dialog sog3 ambient dialog2 sog6 sog7))
(when (not *progress-process*)
(activate-progress *dproc* 'main)
(if (not *progress-process*) ;; process didn't start, back to game.
(set-master-mode 'game)
)
)
(set! (-> *game-info* pause-start-time) (-> *display* real-clock frame-counter))
)
(('game)
(logclear! (-> *setting-control* user-default process-mask) (process-mask freeze pause menu))
(sound-group-continue (sound-group sfx music dialog sog3 ambient dialog2 sog6 sog7))
)
)
;; update from setting-control to kernel
(apply-settings *setting-control*)
)
;; tell the debug menu system we changed modes.
(if *debug-segment*
(menu-respond-to-pause)
)
0
(none)
)
(defun pause-allowed? ()
"Are you allowed to pause?"
(not (or (< (-> *display* base-clock frame-counter) (-> *game-info* blackout-time))
(!= (-> *setting-control* user-current bg-a) 0.0)
(!= (-> *setting-control* user-current bg-a-force) 0.0)
(not (-> *setting-control* user-current allow-pause))
(handle->process (-> *game-info* auto-save-proc))
(= *master-mode* 'freeze)
(not *target*)
*master-exit*
(not *common-text*)
)
)
)
(defun toggle-pause ()
"Update the current master mode because a pause has been requested.
This can reject the transition, or decide to go to any mode."
(case *master-mode*
(('game)
(set-master-mode
(cond
((and (logtest? (-> *cpad-list* cpads 0 valid) 128)
*target*
(>= (-> *display* base-clock frame-counter) (-> *game-info* blackout-time))
(= (-> *setting-control* user-current bg-a) 0.0)
(and (= (-> *setting-control* user-current bg-a-force) 0.0)
(< (seconds 1003) (-> *display* real-clock frame-counter))
)
)
;; in 'game, controller fell out, target is spawned, can pause if it's allowed, and not in progress.
(if (or *progress-process* (not (-> *setting-control* user-current allow-pause)))
*master-mode*
'pause
)
)
;; game -> debug menu when pressing select/start with L3.
((and (cpad-pressed? 0 select start) (cpad-hold? 0 l3) *debug-segment*)
'menu
)
;; select in debug pauses (also check R2 here for the frame-advance feature)
((and (or (cpad-hold? 0 select) (cpad-hold? 0 r2)) *debug-segment*)
'pause
)
;; not debugging, not pressing start, should pause if possible
((and (not *debug-segment*) (zero? (logand (-> *cpad-list* cpads 0 button0-abs 0) (pad-buttons start))))
(if (pause-allowed?)
'pause
*master-mode* ;; and if we can't, reject
)
)
;; if we can't open progress, fall back to pause
((not (progress-allowed?))
(if (pause-allowed?)
'pause
*master-mode* ;; otherwise reject
)
)
((cpad-hold? 0 start) ;; finally, if we're pressing start and pausing is impossible, open progress
'progress
)
(else
*master-mode* ;; otherwise reject
)
)
)
)
(('menu)
(set-master-mode (cond
((and *debug-segment* (cpad-hold? 0 l3) (cpad-pressed? 0 select start))
'menu
)
((cpad-hold? 0 select r2)
(if *debug-segment*
'pause
*master-mode*
)
)
((cpad-hold? 0 r3 r2 triangle circle)
'game
)
((cpad-hold? 0 start)
'game
)
(else
*master-mode*
)
)
)
(set! *pause-lock* #f)
)
(('pause)
(set-master-mode (cond
((and (cpad-pressed? 0 select start) (cpad-hold? 0 l3) *debug-segment*)
'menu
)
((and (not *debug-segment*) (cpad-hold? 0 select))
'game
)
((and *cheat-mode* (cpad-hold? 0 select r2))
'game
)
((cpad-hold? 0 start)
'game
)
(else
*master-mode*
)
)
)
(set! *pause-lock* (and *cheat-mode* (cpad-hold? 0 r2)))
)
(('freeze)
(set-master-mode (if (and (cpad-pressed? 0 select start) (cpad-hold? 0 l3) *debug-segment*)
'menu
*master-mode*
)
)
)
(('progress)
(if (cpad-hold? 0 start)
(hide-progress-screen)
)
(set! *pause-lock* (and *cheat-mode* (cpad-hold? 0 r2)))
)
)
0
)
;; TODO screen filter
(define *cheat-temp* (the-as (pointer int32) (malloc 'global 20)))
(define *master-exit* #f)
(define *progress-cheat* #f)
(define *first-boot* #t)
;; TODO cheats
;; Rough loop outline:
;; (while *run*
;; - suspend ;; runs actors
;; - display-loop-main ;; runs the drawing/per frame updates
;; - per-frame updates for level, global effets
;; - draw-hook ;; generates DMA data
;; - sync-path ;; waits for previous frame to finish render
;; - end-display
;; - swap-display
;; - display-frame-finish
;; - display-sync
;; - display-frame-start
;; )
(defun end-display ((arg0 display))
"Update debug drawing:
- debug draws (triangles, spheres, etc)
- profile bars
- file info
- console
- other info (iop, memcard, pause)
This function runs after DMA sync.
It's not clear why they did this - in the Jak 1 PC port, it is fine to move this to before sync.
Possibly they wanted to leave the bus alone for graphics DMA."
;; DMA buffer for memory usage counting.
(let ((s5-0 (-> (if *debug-segment*
(-> arg0 frames (-> arg0 on-screen) debug-buf)
(-> arg0 frames (-> arg0 on-screen) global-buf)
)
base
)
)
)
;; debug draw, profile bars, deci count, file info
(when *debug-segment*
;; do all debug drawing.
(debug-draw-buffers)
(with-dma-buffer-add-bucket ((s3-0 (-> arg0 frames (-> arg0 on-screen) debug-buf)) (bucket-id debug-no-zbuf2))
(when (or *display-profile* *stats-profile-bars*)
(setup-categories! (-> arg0 frames (-> arg0 on-screen) profile-array))
(let ((a2-0 7))
(if *display-profile*
(draw-bars! *profile-array* s3-0 a2-0)
)
)
(if (and (!= *master-mode* 'menu) *stats-profile-bars*)
(draw-text! *profile-array*)
)
)
(when *display-deci-count*
(let ((s2-0 draw-string-xy))
(format (clear *temp-string*) "~D" *deci-count*)
(s2-0 *temp-string* s3-0 448 210 (font-color default-#cddbcd) (font-flags shadow))
)
)
(display-file-info)
)
)
;; draw console buffer
(let ((buf (if *debug-segment*
(-> arg0 frames (-> arg0 on-screen) debug-buf)
(-> arg0 frames (-> arg0 on-screen) global-buf)
)
)
)
(with-dma-buffer-add-bucket ((s3-0 buf) (bucket-id debug-no-zbuf2))
(if (and (= *master-mode* 'pause)
(and (!= *cheat-mode* 'camera) (or (zero? *screen-shot-work*) (= (-> *screen-shot-work* count) -1)))
)
(draw-string-xy
"pause or something like that" ;;(lookup-text! *common-text* (game-text-id pause) #f)
buf
256
(if (< (-> *display* base-clock frame-counter) (-> *game-info* letterbox-time))
352
320
)
(font-color precursor-#ec3b00)
(font-flags shadow kerning middle large)
)
)
(let ((s2-2 (the int (-> *font-context* origin y))))
(cond
((or (movie?) (< (-> *display* base-clock frame-counter) (-> *game-info* letterbox-time)))
(+! s2-2 56)
)
(*display-profile*
(+! s2-2 48)
)
)
(when (or (zero? *screen-shot-work*) (= (-> *screen-shot-work* count) -1))
(let* ((v1-82
(draw-string-xy
*stdcon0*
buf
(the int (-> *font-context* origin x))
s2-2
(font-color default-#cddbcd)
(font-flags shadow)
)
)
(a3-6 (+ s2-2 (the int (* 2.0 (the-as float (-> v1-82 b))))))
)
(draw-string-xy
*stdcon1*
buf
(the int (-> *font-context* origin x))
a3-6
(font-color default-#cddbcd)
(font-flags shadow)
)
)
)
)
(if *display-iop-info*
(show-iop-info buf)
)
(if *display-memcard-info*
(show-mc-info buf)
)
)
)
(let ((v1-101 *dma-mem-usage*))
(when (nonzero? v1-101)
(set! (-> v1-101 length) (max 88 (-> v1-101 length)))
(set! (-> v1-101 data 87 name) "debug")
(+! (-> v1-101 data 87 count) 1)
(+! (-> v1-101 data 87 used) (&-
(-> (if *debug-segment*
(-> arg0 frames (-> arg0 on-screen) debug-buf)
(-> arg0 frames (-> arg0 on-screen) global-buf)
)
base
)
(the-as uint s5-0)
)
)
(set! (-> v1-101 data 87 total) (-> v1-101 data 87 used))
)
)
)
(set! *stdcon* (clear *stdcon0*))
0
(none)
)
(defun display-loop-main ((arg0 display))
"Run the engine.
This function is called after actors update."
(local-vars (a0-94 int) (a0-96 int))
(with-pp
; ;; LOAD LEVEL
(if (-> *level* loading-level)
(load-continue (-> *level* loading-level))
)
; ;; Run blerc to modify foreground models
; (with-profiler 'merc *profile-merc-color*
; (blerc-execute)
; (blerc-init)
; )
; ;; Run other merc effects that modify vertices
; (texscroll-execute)
; (ripple-execute)
; (region-execute)
;; final call to update joints before drawing.
; (with-profiler 'joints *profile-joints-color*
; (execute-math-engine)
; )
;; execute the debug hook before doing the big updates
(with-profiler 'debug *profile-debug-color*
(let* ((s5-5 *debug-hook*)
(t9-12 (car s5-5)))
(while (not (null? s5-5))
((the-as (function none) t9-12))
(set! s5-5 (cdr s5-5))
(set! t9-12 (car s5-5))
)
)
; (main-cheats)
)
;; using the position of the in-game camera, update visiblity and matrices for rendering.
(with-profiler 'camera *profile-camera-color*
(update-camera)
)
;; map texture stuff
; (update *bigmap*)
;; continue loading level
(if (-> *level* loading-level)
(load-continue (-> *level* loading-level))
)
;; drawing - this runs foreground/background drawing.
(with-profiler 'draw-hook *profile-draw-hook-color*
(*draw-hook*)
)
;; another level load
(if (-> *level* loading-level)
(load-continue (-> *level* loading-level))
)
; (if *display-color-bars*
; (draw-color-bars)
; )
;; draw and update menus
(with-profiler 'menu-hook *profile-menu-hook-color*
(*menu-hook*)
)
;; load text files as needed from the menu update
; (load-level-text-files -1)
;; post-processing filter drawing
; (if (-> *screen-filter* draw?)
; (draw *screen-filter*)
; )
;; letterbox drawing
; (when (or (movie?) (< (-> *display* base-clock frame-counter) (-> *game-info* letterbox-time)))
; (if (< (-> *game-info* letterbox-time) (-> *display* base-clock frame-counter))
; (set! (-> *game-info* letterbox-time) (-> *display* base-clock frame-counter))
; )
; (if (and (= (-> *setting-control* user-current aspect-ratio) 'aspect4x3)
; (or (zero? *screen-shot-work*) (= (-> *screen-shot-work* count) -1))
; )
; (letterbox)
; )
; )
;; blackout drawing
; (when (-> *setting-control* user-current render)
; (if (< (-> *display* base-clock frame-counter) (-> *game-info* blackout-time))
; (set! (-> *setting-control* user-default bg-a-force) 1.0)
; (set! (-> *setting-control* user-default bg-a-force) 0.0)
; )
; )
;; generate DMA data for doing the main blit
; (blit-displays)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; END of normal frame
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; and we're done with the main frame! end profiling/stat collection
(when *debug-segment*
(let ((s5-13 (-> arg0 frames (-> arg0 on-screen) profile-array data 0)))
(when (and *dproc* *debug-segment*)
(let* ((v1-294 (+ (-> s5-13 depth) -1))
(s4-12 (-> s5-13 segment v1-294))
(s3-12 (-> s5-13 base-time))
)
(when (>= v1-294 0)
(set! (-> s4-12 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s3-12))))
(+! (-> s5-13 depth) -1)
)
)
)
)
0
(read! (-> *perf-stats* data (perf-stat-bucket all-code)))
)
;; now wait for the previous frame to finish rendering...
(when (nonzero? (sync-path 0 0))
(*dma-timeout-hook*)
(reset-vif1-path)
)
;; debug drawing
(end-display arg0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; display the frame, and start a new one!
;; this will kick off the next dma transfer
(swap-display arg0)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; start profiling for the new frame
(when *debug-segment*
(start-frame! (-> arg0 frames (-> arg0 on-screen) profile-array data 0))
;(reset! (-> *perf-stats* data (perf-stat-bucket all-code)))
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; START of next frame
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; a few things before the actor updates...
; (set! (-> *time-of-day-context* title-updated) #f)
;; update teleport counter
; (set! *teleport* #f)
; (when (nonzero? *teleport-count*)
; (set! *teleport* #t)
; (set! *teleport-count* (+ *teleport-count* -1))
; )
;; update particles (we're racing the DMA transfer again, do this asap)
; (let ((gp-1 (-> pp clock)))
; (set! (-> pp clock) (-> *display* part-clock))
; (process-particles)
; (set! (-> pp clock) gp-1)
; )
;; set up VU0's VIF for collision code run by actors
; (dma-send
; (the-as dma-bank #x10008000)
; (the-as uint (-> *collide-vif0-init* data))
; (the-as uint (/ (-> *collide-vif0-init* length) 4))
; )
;; send sound commands to IOP
; (swap-sound-buffers (ear-trans 0) (ear-trans 1) (camera-pos) (camera-angle))
;; advance streaming animation
; (str-play-kick)
;; handle spawning/despawning as needed.
(level-update *level*)
;; do some memory card operations, check auto-save
; (mc-run)
; (auto-save-check)
(none)
)
)
(defbehavior display-loop process ()
(stack-size-set! (-> self main-thread) 512)
;; spawn the matrix process. This is responsible for doing the first pass through joints
; (process-spawn-function
; process
; (lambda :behavior process
; ()
; (logclear! (-> self mask) (process-mask freeze pause menu progress entity))
; (until #f
; (when *debug-segment*
; (let ((gp-0 (-> *display* frames (-> *display* on-screen) profile-array data 0))
; (v1-9 'joints)
; (s5-0 *profile-joints-color*)
; )
; (when (and *dproc* *debug-segment*)
; (let ((s4-0 (-> gp-0 data (-> gp-0 count))))
; (let ((s3-0 (-> gp-0 base-time)))
; (set! (-> s4-0 name) v1-9)
; (set! (-> s4-0 start-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s3-0))))
; )
; (set! (-> s4-0 depth) (the-as uint (-> gp-0 depth)))
; (set! (-> s4-0 color) s5-0)
; (set! (-> gp-0 segment (-> gp-0 depth)) s4-0)
; )
; (+! (-> gp-0 count) 1)
; (+! (-> gp-0 depth) 1)
; (set! (-> gp-0 max-depth) (max (-> gp-0 max-depth) (-> gp-0 depth)))
; )
; )
; 0
; )
; (execute-math-engine)
; (when *debug-segment*
; (let ((gp-1 (-> *display* frames (-> *display* on-screen) profile-array data 0)))
; (when (and *dproc* *debug-segment*)
; (let* ((v1-33 (+ (-> gp-1 depth) -1))
; (s5-1 (-> gp-1 segment v1-33))
; (s4-1 (-> gp-1 base-time))
; )
; (when (>= v1-33 0)
; (set! (-> s5-1 end-time) (the-as int (- (timer-count (the-as timer-bank #x10000800)) (the-as uint s4-1))))
; (+! (-> gp-1 depth) -1)
; )
; )
; )
; )
; 0
; )
; (suspend)
; )
; #f
; (none)
; )
; :name "matrix"
; :from *4k-dead-pool*
; :to *mid-pool*
; )
(let ((gp-1 *display*))
(set! *teleport* #t)
; (update *setting-control*)
[decomp] Decompile some time-of-day stuff, support new style Jak 2 time of day (#1943) - Add "tfrag-water" tfrag tree support (may just be the same as Jak 1's 'dirt' for the settings) - Add "tfrag-trans" tfrag tree support, reusing "trans-tfrag" from jak 1. - Add a hack to `LinkedObjectFileCreation` to handle `oracle`, which is accidentally multiply defined as a type leftover from jak 1 (an entity in village1), and level info for jak 2. - Add `VI1.DGO` - add `time-of-day.gc`, and a few other stub functions so it works - Set up some time of day stuff in GOAL for jak 2/PC renderers - Clean up time of day in c++ renderers, support the more complicated weight system used by jak 2 (backward compatible with jak 1, thankfully) The mood functions now run, so this could cause problems if they rely on stuff we don't have yet. But it seems fine for ctysluma and prison for now. ![image](https://user-images.githubusercontent.com/48171810/194719441-d185f59c-19dc-4cd3-a5c4-00b0cfe1d6c3.png) ![image](https://user-images.githubusercontent.com/48171810/194719449-6e051bf3-0750-42e5-a654-901313dbe479.png) ![image](https://user-images.githubusercontent.com/48171810/194719455-3ca6793e-873a-449a-8e85-9c20ffeb4da3.png) ![image](https://user-images.githubusercontent.com/48171810/194719461-8f27af17-4434-4492-96cd-8c5eec6eafdf.png) ![image](https://user-images.githubusercontent.com/48171810/194719468-720715b9-985a-4acf-928c-eab948cfcb03.png) ![image](https://user-images.githubusercontent.com/48171810/194719486-bfb91e83-f6ca-4585-80ad-3b2c0cbbd5af.png) ![image](https://user-images.githubusercontent.com/48171810/194719492-df065d2f-cb5a-47e3-a248-f5317c42082f.png) ![image](https://user-images.githubusercontent.com/48171810/194719507-91e1f477-ecfe-4d6c-b744-5f24646255ca.png)
2022-10-08 13:33:03 -04:00
(init-time-of-day-context *time-of-day-context*)
(format 0 "about to display-sync~%")
(display-sync gp-1)
(format 0 "about to swap-display~%")
(swap-display gp-1)
(format 0 "about to install-handler~%")
(install-handler 3 vblank-handler) ;; TODO: this never gets called.
; *touching-list*
; ((method-of-type touching-list touching-list-method-10))
; (prepare *collide-rider-pool*)
; (update-actor-hash)
; (blerc-init)
; (dma-send
; (the-as dma-bank #x10008000)
; (the-as uint (-> *collide-vif0-init* data))
; (the-as uint (/ (-> *collide-vif0-init* length) 4))
; )
(suspend)
(set! (-> *setting-control* user-default bg-a) 0.0)
(set! (-> gp-1 frames 0 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800))))
(set! (-> gp-1 frames 1 start-time) (the-as time-frame (timer-count (the-as timer-bank #x10000800))))
(set! (-> gp-1 dog-ratio) 1.0)
(while *run*
(display-loop-main gp-1)
(with-profiler 'actors *profile-actors-color*
(suspend)
)
)
)
(set! *dproc* #f)
(format 0 "display is off #<#x~X>.~%" self)
0
)
(defun on ((arg0 symbol))
"Start the display loop."
(when (not *dproc*)
(when (not arg0)
(if (= (-> *level* level0 status) 'inactive)
(bg 'halfpipe)
)
)
(set! *run* #t)
(set! *dproc* (ppointer->process (process-spawn-function
process
display-loop
:name "display"
:from *4k-dead-pool*
:to *display-pool*
:stack *kernel-dram-stack*
)
)
)
(format 0 "SKIP: level activation in on~%")
(cond
((or (level-get-with-status *level* 'loaded)
(level-get-with-status *level* 'alive)
(level-get-with-status *level* 'active)
)
(activate-levels! *level*)
; (when (not arg0)
; (let ((gp-1 (entity-by-type camera-start)))
; (when (and gp-1 (type? gp-1 entity-actor))
; (while (not (camera-teleport-to-entity gp-1))
; (suspend)
; )
; )
; )
; )
; (if (and (= *kernel-boot-message* 'art-group) *kernel-boot-art-group*)
; (anim-tester-add-object *kernel-boot-art-group*)
; )
)
(else
(format 0 "startup failed, killing dproc~%")
(kill-by-name "display" *active-pool*)
(set! *dproc* #f)
)
)
)
*dproc*
)
(defun off ()
(stop 'debug)
(dotimes (gp-0 (-> *level* length))
(let ((a0-2 (-> *level* level gp-0)))
(if (= (-> a0-2 status) 'active)
(deactivate a0-2)
)
)
)
(set! *run* #f)
0
)