mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
911a8e32a4
* clean up some types * clean up settings
483 lines
18 KiB
Common Lisp
483 lines
18 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
;; name: settings.gc
|
|
;; name in dgo: settings
|
|
;; dgos: GAME, ENGINE
|
|
|
|
|
|
(defmethod update-from-engine setting-data ((obj setting-data) (arg0 engine))
|
|
"this goes through the list of desired setting changes in
|
|
the engine/connection list and updates the setting-data"
|
|
(let ((conn (the-as connection (-> arg0 alive-list-end)))
|
|
(s4-0 (-> arg0 alive-list-end prev0))
|
|
)
|
|
(while (!= (the-as connectable conn) (-> arg0 alive-list))
|
|
(case (-> conn param0)
|
|
(('border-mode)
|
|
(set! (-> obj border-mode) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('allow-look-around)
|
|
(set! (-> obj allow-look-around) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('ocean-off)
|
|
(set! (-> obj ocean-off) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('music)
|
|
(set! (-> obj music) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('process-mask)
|
|
(case (-> conn param1)
|
|
(('set)
|
|
(logior! (-> obj process-mask) (the-as process-mask (-> conn param3)))
|
|
)
|
|
(('clear)
|
|
(logclear! (-> obj process-mask) (the-as process-mask (-> conn param3)))
|
|
)
|
|
(('abs)
|
|
(set! (-> obj process-mask) (the-as process-mask (-> conn param3)))
|
|
)
|
|
)
|
|
)
|
|
(('sfx-volume)
|
|
(when (or (zero? (logand (-> *kernel-context* prevent-from-run) (process-mask progress)))
|
|
(= (get-process conn) (ppointer->process *progress-process*))
|
|
)
|
|
(let ((v1-20 (the-as symbol (-> conn param1))))
|
|
(if (= v1-20 'rel)
|
|
(set! (-> obj sfx-volume)
|
|
(* (* 0.01 (the-as float (-> conn param2))) (-> obj sfx-volume))
|
|
)
|
|
(set! (-> obj sfx-volume) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(('music-volume)
|
|
(let ((v1-25 (the-as symbol (-> conn param1))))
|
|
(if (= v1-25 'rel)
|
|
(set! (-> obj music-volume)
|
|
(* (* 0.01 (the-as float (-> conn param2))) (-> obj music-volume))
|
|
)
|
|
(set! (-> obj music-volume) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('ambient-volume)
|
|
(let ((v1-30 (the-as symbol (-> conn param1))))
|
|
(if (= v1-30 'rel)
|
|
(set! (-> obj ambient-volume)
|
|
(* (* 0.01 (the-as float (-> conn param2))) (-> obj ambient-volume))
|
|
)
|
|
(set! (-> obj ambient-volume) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('dialog-volume)
|
|
(let ((v1-35 (the-as symbol (-> conn param1))))
|
|
(if (= v1-35 'rel)
|
|
(set! (-> obj dialog-volume)
|
|
(* (* 0.01 (the-as float (-> conn param2))) (-> obj dialog-volume))
|
|
)
|
|
(set! (-> obj dialog-volume) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('sfx-volume-movie)
|
|
(let ((v1-40 (the-as symbol (-> conn param1))))
|
|
(if (= v1-40 'rel)
|
|
(set! (-> obj sfx-volume-movie)
|
|
(* (* 0.01 (the-as float (-> conn param2))) (-> obj sfx-volume-movie))
|
|
)
|
|
(set! (-> obj sfx-volume-movie) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('music-volume-movie)
|
|
(let ((v1-45 (the-as symbol (-> conn param1))))
|
|
(if (= v1-45 'rel)
|
|
(set! (-> obj music-volume-movie)
|
|
(* (* 0.01 (the-as float (-> conn param2)))
|
|
(-> obj music-volume-movie)
|
|
)
|
|
)
|
|
(set! (-> obj music-volume-movie) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('ambient-volume-movie)
|
|
(let ((v1-50 (the-as symbol (-> conn param1))))
|
|
(if (= v1-50 'rel)
|
|
(set! (-> obj ambient-volume-movie)
|
|
(* (* 0.01 (the-as float (-> conn param2)))
|
|
(-> obj ambient-volume-movie)
|
|
)
|
|
)
|
|
(set! (-> obj ambient-volume-movie) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('dialog-volume-hint)
|
|
(let ((v1-55 (the-as symbol (-> conn param1))))
|
|
(if (= v1-55 'rel)
|
|
(set! (-> obj dialog-volume-hint)
|
|
(* (* 0.01 (the-as float (-> conn param2)))
|
|
(-> obj dialog-volume-hint)
|
|
)
|
|
)
|
|
(set! (-> obj dialog-volume-hint) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
)
|
|
(('sound-flava)
|
|
(when (>= (the-as float (-> conn param2)) (-> obj sound-flava-priority))
|
|
(set! (-> obj sound-flava) (the-as uint (the-as int (-> conn param3))))
|
|
(set! (-> obj sound-flava-priority) (the-as float (-> conn param2)))
|
|
)
|
|
)
|
|
(('bg-r)
|
|
(set! (-> obj bg-r) (the-as float (-> conn param2)))
|
|
)
|
|
(('bg-g)
|
|
(set! (-> obj bg-g) (the-as float (-> conn param2)))
|
|
)
|
|
(('bg-b)
|
|
(set! (-> obj bg-b) (the-as float (-> conn param2)))
|
|
)
|
|
(('bg-a)
|
|
(set! (-> obj bg-a) (the-as float (-> conn param2)))
|
|
)
|
|
(('bg-a-speed)
|
|
(set! (-> obj bg-a-speed) (the-as float (-> conn param2)))
|
|
)
|
|
(('bg-a-force)
|
|
(set! (-> obj bg-a-force) (the-as float (-> conn param2)))
|
|
)
|
|
(('language)
|
|
(set! (-> obj language) (the-as language-enum (-> conn param3)))
|
|
)
|
|
(('vibration)
|
|
(set! (-> obj vibration) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('auto-save)
|
|
(set! (-> obj auto-save) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('allow-pause)
|
|
(set! (-> obj allow-pause) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('allow-progress)
|
|
(set! (-> obj allow-progress) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('play-hints)
|
|
(set! (-> obj play-hints) (the-as symbol (-> conn param1)))
|
|
)
|
|
(('movie)
|
|
(set! (-> obj movie) (the-as (pointer progress) (-> conn param1)))
|
|
)
|
|
(('talking)
|
|
(set! (-> obj talking) (the-as (pointer progress) (-> conn param1)))
|
|
)
|
|
(('spooling)
|
|
(set! (-> obj spooling) (the-as (pointer progress) (-> conn param1)))
|
|
)
|
|
(('hint)
|
|
(set! (-> obj hint) (the-as (pointer process) (-> conn param1)))
|
|
)
|
|
(('ambient)
|
|
(set! (-> obj ambient) (the-as (pointer progress) (-> conn param1)))
|
|
)
|
|
(('common-page)
|
|
(case (-> conn param1)
|
|
(('set)
|
|
(logior! (-> obj common-page) (the-as int (-> conn param3)))
|
|
)
|
|
(('clear)
|
|
(logclear! (-> obj common-page) (the-as int (-> conn param3)))
|
|
)
|
|
)
|
|
)
|
|
)
|
|
(set! conn (the-as connection s4-0))
|
|
(set! s4-0 (-> (the-as connectable conn) prev0))
|
|
)
|
|
)
|
|
obj
|
|
)
|
|
|
|
(defmethod push-setting! setting-control ((obj setting-control) (arg0 process) (arg1 symbol) (arg2 object) (arg3 object) (arg4 object))
|
|
"Set the setting. The set is linked to this process and will be reverted if the process dies"
|
|
(add-connection (-> obj engine) arg0 arg1 arg2 arg3 arg4)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod set-setting! setting-control ((obj setting-control) (arg0 process) (arg1 symbol) (arg2 symbol) (arg3 float) (arg4 int))
|
|
"Replace all settings from this process with this one."
|
|
(clear-pending-settings-from-process obj arg0 arg1)
|
|
(add-connection (-> obj engine) arg0 arg1 arg2 arg3 arg4)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
(defmethod clear-pending-settings-from-process setting-control ((obj setting-control) (arg0 process) (arg1 symbol))
|
|
"Remove requests to change settings from the given process."
|
|
(when arg0
|
|
(let ((s5-0 (-> obj engine))
|
|
(s4-0 (-> arg0 connection-list next1))
|
|
)
|
|
(while s4-0
|
|
(if
|
|
(and
|
|
((method-of-type connection belongs-to-engine?)
|
|
(the-as connection s4-0)
|
|
s5-0
|
|
)
|
|
(or (= arg1 #t) (= arg1 (-> (the-as connection s4-0) param0)))
|
|
)
|
|
((method-of-type connection move-to-dead) (the-as connection s4-0))
|
|
)
|
|
(set! s4-0 (-> s4-0 next1))
|
|
)
|
|
)
|
|
)
|
|
0
|
|
(none)
|
|
)
|
|
|
|
|
|
(defmethod copy-settings-from-target! setting-control ((obj setting-control))
|
|
"Update the current settings. This only updates settings that are 'safe' to do multiple times per frame."
|
|
(let ((gp-0 (-> obj current)))
|
|
(let ((s5-0 (-> obj target)))
|
|
;; set the settings to default
|
|
(mem-copy! (the-as pointer s5-0) (the-as pointer (-> obj default)) 196)
|
|
;; hack
|
|
(set! (-> s5-0 ambient-volume)
|
|
(* (* 0.01 (-> obj default ambient-volume)) (-> obj default sfx-volume))
|
|
)
|
|
;; apply requesting changes
|
|
(update-from-engine s5-0 (-> obj engine))
|
|
;; copy those settings to current.
|
|
(set! (-> gp-0 border-mode) (-> s5-0 border-mode))
|
|
(set! (-> gp-0 common-page) (-> s5-0 common-page))
|
|
(set! (-> gp-0 vibration) (-> s5-0 vibration))
|
|
(set! (-> gp-0 auto-save) (-> s5-0 auto-save))
|
|
(set! (-> gp-0 play-hints) (-> s5-0 play-hints))
|
|
(set! (-> gp-0 movie) (-> s5-0 movie))
|
|
(set! (-> gp-0 talking) (-> s5-0 talking))
|
|
(set! (-> gp-0 spooling) (-> s5-0 spooling))
|
|
(set! (-> gp-0 hint) (-> s5-0 hint))
|
|
(set! (-> gp-0 ambient) (-> s5-0 ambient))
|
|
(set! (-> gp-0 allow-pause) (-> s5-0 allow-pause))
|
|
(set! (-> gp-0 allow-progress) (-> s5-0 allow-progress))
|
|
(set! (-> gp-0 allow-look-around) (-> s5-0 allow-look-around))
|
|
(set! (-> gp-0 ocean-off) (-> s5-0 ocean-off))
|
|
(set! (-> gp-0 ambient-volume-movie) (-> s5-0 ambient-volume-movie))
|
|
(set! (-> gp-0 music-volume-movie) (-> s5-0 music-volume-movie))
|
|
(set! (-> gp-0 sfx-volume-movie) (-> s5-0 sfx-volume-movie))
|
|
(set! (-> gp-0 dialog-volume-hint) (-> s5-0 dialog-volume-hint))
|
|
(set! (-> gp-0 process-mask) (-> s5-0 process-mask))
|
|
)
|
|
(set! (-> *kernel-context* prevent-from-run) (-> gp-0 process-mask))
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
|
|
(defmethod update-per-frame-settings! setting-control ((obj setting-control))
|
|
"Do a per-frame update of all settings"
|
|
;; compute all settings
|
|
(copy-settings-from-target! obj)
|
|
|
|
;; now handle the special ones.
|
|
(let ((gp-0 (-> obj current)))
|
|
(let ((s5-1 (-> obj target)))
|
|
;; the volume change is done slowly
|
|
(when *sound-player-enable*
|
|
(when (!= (-> gp-0 sfx-volume) (-> s5-1 sfx-volume))
|
|
(seek! (-> gp-0 sfx-volume) (-> s5-1 sfx-volume) (* 100.0 (-> *display* seconds-per-frame)))
|
|
(sound-set-volume (the-as uint 1) (-> gp-0 sfx-volume))
|
|
)
|
|
(when (!= (-> gp-0 music-volume) (-> s5-1 music-volume))
|
|
(seek! (-> gp-0 music-volume) (-> s5-1 music-volume) (* 100.0 (-> *display* seconds-per-frame)))
|
|
(sound-set-volume (the-as uint 2) (-> gp-0 music-volume))
|
|
)
|
|
(when (!= (-> gp-0 dialog-volume) (-> s5-1 dialog-volume))
|
|
(seek! (-> gp-0 dialog-volume) (-> s5-1 dialog-volume) (* 100.0 (-> *display* seconds-per-frame)))
|
|
(sound-set-volume (the-as uint 4) (-> gp-0 dialog-volume))
|
|
)
|
|
(when (!= (-> gp-0 ambient-volume) (-> s5-1 ambient-volume))
|
|
(seek! (-> gp-0 ambient-volume) (-> s5-1 ambient-volume) (* 100.0 (-> *display* seconds-per-frame)))
|
|
(sound-set-volume (the-as uint 16) (-> gp-0 ambient-volume))
|
|
)
|
|
)
|
|
;; send language change to the IOP.
|
|
(when (!= (-> gp-0 language) (-> s5-1 language))
|
|
(set! (-> gp-0 language) (-> s5-1 language))
|
|
(set-language (-> gp-0 language))
|
|
)
|
|
|
|
;; try to load music
|
|
(when (and (!= (-> s5-1 music) (-> gp-0 music))
|
|
(and (< 0.0 (-> *setting-control* current music-volume))
|
|
(zero? (rpc-busy? 1))
|
|
*sound-bank-1*
|
|
*sound-bank-2*
|
|
)
|
|
)
|
|
(cond
|
|
((-> s5-1 music)
|
|
(format 0 "Load music ~A~%" (-> s5-1 music))
|
|
(sound-music-load (string->sound-name (symbol->string (-> s5-1 music))))
|
|
)
|
|
(else
|
|
(format 0 "Unload music~%")
|
|
(sound-music-unload)
|
|
)
|
|
)
|
|
(set! (-> gp-0 music) (-> s5-1 music))
|
|
)
|
|
|
|
;; set sound flava
|
|
(set! (-> s5-1 sound-flava) (the-as uint (flava-lookup (-> gp-0 music) (the-as int (-> s5-1 sound-flava)))))
|
|
(set! (-> gp-0 sound-flava) (-> s5-1 sound-flava))
|
|
(if *sound-player-enable*
|
|
(sound-set-flava (-> gp-0 sound-flava))
|
|
)
|
|
|
|
;; update display settings
|
|
(when (!= (-> gp-0 aspect-ratio) (-> s5-1 aspect-ratio))
|
|
(set! (-> gp-0 aspect-ratio) (-> s5-1 aspect-ratio))
|
|
(set-aspect-ratio (-> gp-0 aspect-ratio))
|
|
)
|
|
(when (!= (-> gp-0 video-mode) (-> s5-1 video-mode))
|
|
(set! (-> gp-0 video-mode) (-> s5-1 video-mode))
|
|
(set-video-mode (-> gp-0 video-mode))
|
|
)
|
|
(when (!= (-> gp-0 screenx) (-> s5-1 screenx))
|
|
(set! (-> gp-0 screenx) (-> s5-1 screenx))
|
|
(set! (-> *video-parms* display-dx) (/ (-> s5-1 screenx) 2))
|
|
(set! (-> *video-parms* set-video-mode) #t)
|
|
)
|
|
(when (!= (-> gp-0 screeny) (-> s5-1 screeny))
|
|
(set! (-> gp-0 screeny) (-> s5-1 screeny))
|
|
(set! (-> *video-parms* display-dy) (* (/ (-> s5-1 screeny) 2) 2))
|
|
(set! (-> *video-parms* set-video-mode) #t)
|
|
)
|
|
|
|
;; update display bg color
|
|
(set! (-> gp-0 bg-a-speed) (-> s5-1 bg-a-speed))
|
|
(set! (-> gp-0 bg-a-force) (-> s5-1 bg-a-force))
|
|
(set! (-> gp-0 bg-r) (-> s5-1 bg-r))
|
|
(set! (-> gp-0 bg-g) (-> s5-1 bg-g))
|
|
(set! (-> gp-0 bg-b) (-> s5-1 bg-b))
|
|
(seek! (-> gp-0 bg-a) (-> s5-1 bg-a) (* (-> s5-1 bg-a-speed) (-> *display* seconds-per-frame)))
|
|
)
|
|
(let ((v1-60 (-> *display* frames (-> *display* on-screen) display))
|
|
(f0-39 (-> gp-0 bg-a))
|
|
)
|
|
(if (!= (-> gp-0 bg-a-force) 0.0)
|
|
(set! f0-39 (-> gp-0 bg-a-force))
|
|
)
|
|
(set! (-> v1-60 bgcolor r) (the int (* 255.0 (-> gp-0 bg-r))))
|
|
(set! (-> v1-60 bgcolor g) (the int (* 255.0 (-> gp-0 bg-g))))
|
|
(set! (-> v1-60 bgcolor b) (the int (* 255.0 (-> gp-0 bg-b))))
|
|
(set! (-> v1-60 pmode alp) (the int (* 255.0 (- 1.0 f0-39))))
|
|
)
|
|
|
|
;; ??
|
|
(set! (-> *level* border?) (-> gp-0 border-mode))
|
|
;; common pool texture page mask
|
|
(set! (-> *texture-pool* common-page-mask) (-> gp-0 common-page))
|
|
(set! (-> *cpad-list* cpads 0 buzz) (-> gp-0 vibration))
|
|
|
|
(case (-> gp-0 ocean-off)
|
|
((#t)
|
|
(set! *ocean-off* #t)
|
|
)
|
|
(('mid)
|
|
(set! *ocean-mid-off* #t)
|
|
)
|
|
(('near)
|
|
(set! *ocean-near-off* #t)
|
|
)
|
|
)
|
|
gp-0
|
|
)
|
|
)
|
|
|
|
|
|
(when (zero? *setting-control*)
|
|
(set! *setting-control* (new 'global 'setting-control 32))
|
|
(let ((gp-0 (-> *setting-control* default))
|
|
(s5-0 (-> *setting-control* current))
|
|
)
|
|
(let ((f0-2 (* 0.01 (the float (scf-get-volume)))))
|
|
(set! (-> gp-0 ocean-off) #f)
|
|
(set! (-> gp-0 allow-look-around) #t)
|
|
(set! (-> gp-0 border-mode) #f)
|
|
(set! (-> gp-0 sfx-volume) (the float (* 5 (the int (+ 0.5 (* 15.0 f0-2))))))
|
|
(set! (-> gp-0 music-volume) (the float (* 5 (the int (+ 0.5 (* 13.0 f0-2))))))
|
|
(set! (-> gp-0 dialog-volume) (the float (* 5 (the int (+ 0.5 (* 20.0 f0-2))))))
|
|
(set! (-> gp-0 ambient-volume) (the float (* 5 (the int (+ 0.5 (* 15.0 f0-2))))))
|
|
(set! (-> gp-0 sfx-volume-movie) (the float (* 5 (the int (+ 0.5 (* 11.0 f0-2))))))
|
|
(set! (-> gp-0 music-volume-movie) (the float (* 5 (the int (+ 0.5 (* 13.0 f0-2))))))
|
|
(set! (-> gp-0 ambient-volume-movie) (the float (* 5 (the int (+ 0.5 (* 11.0 f0-2))))))
|
|
(set! (-> gp-0 dialog-volume-hint) (the float (* 5 (the int (+ 0.5 (* 16.0 f0-2))))))
|
|
)
|
|
(set! (-> gp-0 language) (scf-get-language))
|
|
(set! (-> gp-0 process-mask) (process-mask execute sleep))
|
|
(set! (-> gp-0 screenx) 0)
|
|
(set! (-> gp-0 screeny) 0)
|
|
(set! (-> gp-0 vibration) #t)
|
|
(set! (-> gp-0 auto-save) #f)
|
|
(set! (-> gp-0 play-hints) #t)
|
|
(set! (-> gp-0 movie) (the-as (pointer process) #f))
|
|
(set! (-> gp-0 talking) (the-as (pointer process) #f))
|
|
(set! (-> gp-0 spooling) (the-as (pointer process) #f))
|
|
(set! (-> gp-0 hint) (the-as (pointer process) #f))
|
|
(set! (-> gp-0 ambient) (the-as (pointer process) #f))
|
|
(set! (-> gp-0 sound-flava) (the-as uint 49))
|
|
(set! (-> gp-0 sound-flava-priority) 0.0)
|
|
(set! (-> gp-0 music) #f)
|
|
(set! (-> gp-0 bg-a-speed) 8.0)
|
|
(set! (-> gp-0 allow-pause) #t)
|
|
(set! (-> gp-0 allow-progress) #t)
|
|
(let ((v1-27 (scf-get-aspect)))
|
|
(if (= v1-27 2)
|
|
(set! (-> gp-0 aspect-ratio) 'aspect16x9)
|
|
(set! (-> gp-0 aspect-ratio) 'aspect4x3)
|
|
)
|
|
)
|
|
(if (zero? *boot-video-mode*)
|
|
(set! (-> gp-0 video-mode) 'ntsc)
|
|
(set! (-> gp-0 video-mode) 'pal)
|
|
)
|
|
(set! (-> s5-0 sfx-volume) (+ -1.0 (-> gp-0 sfx-volume)))
|
|
(set! (-> s5-0 music-volume) (+ -1.0 (-> gp-0 music-volume)))
|
|
(set! (-> s5-0 dialog-volume) (+ -1.0 (-> gp-0 dialog-volume)))
|
|
(set! (-> s5-0 ambient-volume) (+ -1.0 (-> gp-0 ambient-volume)))
|
|
(set! (-> s5-0 sfx-volume-movie) (-> gp-0 sfx-volume-movie))
|
|
(set! (-> s5-0 music-volume-movie) (-> gp-0 music-volume-movie))
|
|
(set! (-> s5-0 ambient-volume-movie) (-> gp-0 ambient-volume-movie))
|
|
(set! (-> s5-0 dialog-volume-hint) (-> gp-0 dialog-volume-hint))
|
|
(set! (-> s5-0 language) (+ (-> gp-0 language) -1))
|
|
(set! (-> s5-0 aspect-ratio) #f)
|
|
(set! (-> s5-0 video-mode) #f)
|
|
(set! (-> s5-0 music) #f)
|
|
(set! (-> s5-0 bg-a-speed) (-> gp-0 bg-a-speed))
|
|
(set! (-> s5-0 allow-pause) (-> gp-0 allow-pause))
|
|
(set! (-> s5-0 allow-progress) (-> gp-0 allow-progress))
|
|
(set! (-> s5-0 allow-look-around) (-> gp-0 allow-look-around))
|
|
(set! (-> s5-0 ocean-off) (-> gp-0 ocean-off))
|
|
)
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|