2022-04-11 18:38:54 -04:00
;;-*-Lisp-*-
( in-package goal )
#|
Code for the progress menu in the PC port. The original code is still loaded, this just has some overriden functions.
| #
;;---------------------------
;;---------------------------
;; pc menu extra stuff
( defconstant PROGRESS_PC_PAGE_HEIGHT 7 )
( defconstant PROGRESS_SCROLL_DIR_UP -1 )
( defconstant PROGRESS_SCROLL_DIR_DOWN 1 )
( defconstant GAME_MIN_RES_MULT 0.5 )
( deftype progress-scroll ( structure )
( ( transition float )
( start-index int16 )
( real-index int16 )
( direction int8 )
( last-screen progress-screen )
)
)
( define *progress-scroll* ( new 'static 'progress-scroll ) )
( defmacro progress-scrolling? ( ) ` ( < ( -> *progress-scroll* transition ) 1.0 ) )
( defmacro progress-scrolling-up? ( ) ` ( and ( progress-scrolling? ) ( = ( -> *progress-scroll* direction ) PROGRESS_SCROLL_DIR_UP ) ) )
( defmacro progress-scrolling-down? ( ) ` ( and ( progress-scrolling? ) ( = ( -> *progress-scroll* direction ) PROGRESS_SCROLL_DIR_DOWN ) ) )
( defconstant *progress-scroll-start* ( -> *progress-scroll* start-index ) )
( defconstant *progress-scroll-end* ( + -1 PROGRESS_PC_PAGE_HEIGHT ( -> *progress-scroll* start-index ) ) )
( defmacro progress-scroll-reset ( )
"resets scroll. nothing will be scrolling, as if it had finished."
` ( begin
( set! ( -> *progress-scroll* transition ) 1.0 )
( set! ( -> *progress-scroll* direction ) 0 )
( set! ( -> *progress-scroll* start-index ) 0 ) ) )
( defmacro progress-scroll-up! ( )
` ( begin
( set! ( -> *progress-scroll* transition ) 0.0 )
( set! ( -> *progress-scroll* direction ) PROGRESS_SCROLL_DIR_UP )
( 1-! ( -> *progress-scroll* start-index ) ) ) )
( defmacro progress-scroll-down! ( )
` ( begin
( set! ( -> *progress-scroll* transition ) 0.0 )
( set! ( -> *progress-scroll* direction ) PROGRESS_SCROLL_DIR_DOWN )
( 1+! ( -> *progress-scroll* start-index ) ) ) )
2023-01-30 19:11:57 -05:00
( defun progress-fast-save-and-start-speedrun ( ( category speedrun-category ) )
"saves to first slot, updates last-slot-saved for cursor, then starts speedrun"
( set! ( -> *progress-state* last-slot-saved ) 0 )
( auto-save-command 'save 0 0 *default-pool* )
( start-speedrun category )
)
2022-04-11 18:38:54 -04:00
2022-08-21 18:13:47 -04:00
;; used in title logo
( define *quit-to-title* # f )
2022-04-11 18:38:54 -04:00
;; ############################
;; CAROUSELL STUFF
;; ############################
( deftype progress-carousell-state ( structure )
( ( int-backup int )
( symbol-backup symbol )
2023-06-07 20:04:16 -04:00
( subtitle-backup pc-language )
2022-04-11 18:38:54 -04:00
( aspect-native-choice symbol )
2023-04-07 23:32:35 -04:00
( current-carousell ( array text-id ) )
2022-07-14 21:37:03 -04:00
2022-04-11 18:38:54 -04:00
( selection int )
( direction symbol )
( transition symbol )
( x-offset int32 )
)
)
( define *progress-carousell* ( new 'static 'progress-carousell-state ) )
2022-06-04 14:53:49 -04:00
( defmacro def-progress-carousell ( name texts )
2023-04-07 23:32:35 -04:00
` ( define , name ( new 'static 'boxed-array :type text-id
,@ ( apply ( lambda ( x ) ` ( text-id , x ) ) texts )
2022-06-04 14:53:49 -04:00
) )
)
2022-04-11 18:38:54 -04:00
2022-06-04 14:53:49 -04:00
;; all carousells
( def-progress-carousell *carousell-display-mode* ( windowed fullscreen borderless ) )
( def-progress-carousell *carousell-msaa* ( off 2-times 4-times 8-times 16-times ) )
( def-progress-carousell *carousell-lod-bg* ( lod-high lod-low ) )
( def-progress-carousell *carousell-lod-fg* ( lod-high lod-low lod-ps2 ) )
( def-progress-carousell *carousell-speaker* ( speaker-always speaker-never speaker-auto ) )
2022-06-25 11:05:20 -04:00
( def-progress-carousell *carousell-frame-rate-150fps* ( 60fps 100fps 150fps ) )
( def-progress-carousell *carousell-frame-rate-100fps* ( 60fps 100fps ) )
( define *carousell-frame-rate* *carousell-frame-rate-150fps* )
2022-04-11 18:38:54 -04:00
2023-06-04 15:34:37 -04:00
;; pad remap stuff
( define *progress-pad-timeout* ( the-as time-frame 0 ) ) ;; timeout for remap buttons
2022-04-11 18:38:54 -04:00
2022-07-12 18:00:52 -04:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; MENU OPTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-11 18:38:54 -04:00
2022-07-18 19:54:38 -04:00
( define *main-options-pc* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id game-options ) :scale # t :param3 ( game-option-menu game-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id graphic-options ) :scale # t :param3 ( game-option-menu graphic-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id sound-options ) :scale # t :param3 ( game-option-menu sound-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id load-game ) :scale # t :param3 ( game-option-menu load-game ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id save-game ) :scale # t :param3 ( game-option-menu save-game ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id disable-auto-save ) :scale # t :param3 ( game-option-menu memcard-disable-auto-save ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id quit-game ) :scale # t :param3 ( game-option-menu quit ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-07-03 17:27:55 -04:00
)
)
2022-07-18 19:54:38 -04:00
( define *main-options-secrets* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id game-options ) :scale # t :param3 ( game-option-menu game-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id graphic-options ) :scale # t :param3 ( game-option-menu graphic-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id sound-options ) :scale # t :param3 ( game-option-menu sound-settings ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id load-game ) :scale # t :param3 ( game-option-menu load-game ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id save-game ) :scale # t :param3 ( game-option-menu save-game ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id disable-auto-save ) :scale # t :param3 ( game-option-menu memcard-disable-auto-save ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id secrets ) :scale # t :param3 ( game-option-menu secrets ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id quit-game ) :scale # t :param3 ( game-option-menu quit ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-07-18 19:54:38 -04:00
)
)
2022-06-04 14:53:49 -04:00
( define *game-options-pc* ( new 'static 'boxed-array :type game-option
2023-06-04 15:34:37 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-options ) :scale # t :param3 ( game-option-menu input-options ) )
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id play-hints ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id subtitles ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id hinttitles ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type language ) :name ( text-id language ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type language-subtitles ) :name ( text-id subtitles-language ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type language-text ) :name ( text-id text-language ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type speaker ) :name ( text-id subtitles-speaker ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id misc-options ) :scale # t :param3 ( game-option-menu misc-options ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-04-11 18:38:54 -04:00
)
)
2022-06-04 14:53:49 -04:00
( define *graphic-options-pc* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id game-resolution ) :scale # t :param3 ( game-option-menu resolution ) )
( new 'static 'game-option :option-type ( game-option-type display-mode ) :name ( text-id display-mode ) :scale # t )
2023-06-04 15:34:37 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id display ) :scale # t :param3 ( game-option-menu monitor )
:option-disabled-func ( lambda ( ) ( = ( -> *pc-settings* display-mode ) 'windowed ) ) )
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id vsync ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id aspect-ratio ) :scale # t :param3 ( game-option-menu aspect-ratio ) )
( new 'static 'game-option :option-type ( game-option-type msaa ) :name ( text-id msaa ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type frame-rate ) :name ( text-id frame-rate ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id ps2-options ) :scale # t :param3 ( game-option-menu gfx-ps2-options ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-04-11 18:38:54 -04:00
)
)
2022-06-25 11:05:20 -04:00
( define *graphic-options-no-frame-rate-pc* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id game-resolution ) :scale # t :param3 ( game-option-menu resolution ) )
( new 'static 'game-option :option-type ( game-option-type display-mode ) :name ( text-id display-mode ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id vsync ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id aspect-ratio ) :scale # t :param3 ( game-option-menu aspect-ratio ) )
( new 'static 'game-option :option-type ( game-option-type msaa ) :name ( text-id msaa ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id ps2-options ) :scale # t :param3 ( game-option-menu gfx-ps2-options ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-06-25 11:05:20 -04:00
)
)
2023-06-04 15:34:37 -04:00
( define *sound-options-pc* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id sfx-volume ) :scale # t :param1 0.0 :param2 100.0 :slider-step-size 1.0 )
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id music-volume ) :scale # t :param1 0.0 :param2 100.0 :slider-step-size 1.0 )
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id speech-volume ) :scale # t :param1 0.0 :param2 100.0 :slider-step-size 1.0 )
;(new 'static 'game-option :option-type (game-option-type on-off) :name (text-id music-fadein) :scale #t)
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
( define *camera-options* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type normal-inverted ) :name ( text-id camera-controls-first-horz ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type normal-inverted ) :name ( text-id camera-controls-first-vert ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type normal-inverted ) :name ( text-id camera-controls-third-horz ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type normal-inverted ) :name ( text-id camera-controls-third-vert ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type confirmation ) :name ( text-id restore-defaults ) :scale # t
2023-06-13 14:26:44 -04:00
:on-confirm ( lambda ( ) ( reset-camera *pc-settings* # t ) ( none ) ) )
2023-06-04 15:34:37 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
( define *controller-options* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-select-controller ) :scale # t :param3 ( game-option-menu select-controller ) )
2023-06-23 15:35:32 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id vibrations ) :scale # t :option-disabled-func ( lambda ( ) ( not ( pc-current-controller-has-rumble? ) ) ) )
2023-06-04 15:34:37 -04:00
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id input-opts-analog-deadzone ) :scale # t :param1 0.0 :param2 1.0
:slider-step-size 0.01 :slider-show-decimal? # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-ignore-controller-win-focus ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set-ignore-controller-in-bg! *pc-settings* val-sym )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-controller-led-reflect-hp ) :scale # t
:option-disabled-func ( lambda ( ) ( not ( pc-current-controller-has-led? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-controller-led-reflect-eco ) :scale # t
:option-disabled-func ( lambda ( ) ( not ( pc-current-controller-has-led? ) ) ) )
2023-06-13 14:26:44 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-controller-led-reflect-heat ) :scale # t
:option-disabled-func ( lambda ( ) ( not ( pc-current-controller-has-led? ) ) ) )
2023-06-04 15:34:37 -04:00
( new 'static 'game-option :option-type ( game-option-type confirmation ) :name ( text-id restore-defaults ) :scale # t
:on-confirm ( lambda ( )
2023-06-13 14:26:44 -04:00
( reset-input *pc-settings* 'controller # t )
2023-06-04 15:34:37 -04:00
( set-ignore-controller-in-bg! *pc-settings* ( -> *pc-settings* ignore-controller-win-unfocused? ) )
( none ) ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
( define *mouse-options* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-mouse-enable-camera ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set! ( -> *pc-settings* mouse-camera? ) val-sym )
( update-mouse-controls! *pc-settings* )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id input-opts-mouse-horizontal-sens ) :scale # t
:param1 -30.0 :param2 30.0 :slider-step-size 0.25 :slider-show-decimal? # t
:on-confirm ( lambda ( )
( update-mouse-controls! *pc-settings* )
( none ) )
:option-disabled-func ( lambda ( ) ( not ( -> *pc-settings* mouse-camera? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type slider ) :name ( text-id input-opts-mouse-vertical-sens ) :scale # t
:param1 -30.0 :param2 30.0 :slider-step-size 0.25 :slider-show-decimal? # t
:on-confirm ( lambda ( )
( update-mouse-controls! *pc-settings* )
( none ) )
:option-disabled-func ( lambda ( ) ( not ( -> *pc-settings* mouse-camera? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-mouse-enable-movement ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set! ( -> *pc-settings* mouse-movement? ) val-sym )
( update-mouse-controls! *pc-settings* )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type confirmation ) :name ( text-id restore-defaults ) :scale # t
:on-confirm ( lambda ( )
2023-06-13 14:26:44 -04:00
( reset-input *pc-settings* 'mouse # t )
2023-06-04 15:34:37 -04:00
( update-mouse-controls! *pc-settings* )
( none ) ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
( define *reassign-binds-options* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-binds-controller ) :scale # t :param3 ( game-option-menu controller-binds )
:option-disabled-func ( lambda ( ) ( <= ( pc-get-controller-count ) 0 ) ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-binds-keyboard ) :scale # t :param3 ( game-option-menu keyboard-binds )
:option-disabled-func ( lambda ( ) ( not ( -> *pc-settings* keyboard-enabled? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-binds-mouse ) :scale # t :param3 ( game-option-menu mouse-binds )
:option-disabled-func ( lambda ( ) ( not ( -> *pc-settings* mouse-enabled? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
( define *input-options* ( new 'static 'boxed-array :type game-option
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id camera-options ) :scale # t :param3 ( game-option-menu camera-options ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-controller-opts ) :scale # t :param3 ( game-option-menu controller-options )
:option-disabled-func ( lambda ( ) ( <= ( pc-get-controller-count ) 0 ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-enable-kb ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set-enable-keyboard! *pc-settings* val-sym )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-enable-mouse ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set! ( -> *pc-settings* mouse-enabled? ) val-sym )
( update-mouse-controls! *pc-settings* )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-mouse-opts ) :scale # t :param3 ( game-option-menu mouse-options )
:option-disabled-func ( lambda ( ) ( not ( -> *pc-settings* mouse-enabled? ) ) ) )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id input-opts-auto-hide-cursor ) :scale # t
:on-change ( lambda ( ( val object ) )
( let ( ( val-sym ( the-as symbol val ) ) )
( set! ( -> *pc-settings* auto-hide-cursor? ) val-sym )
( update-mouse-controls! *pc-settings* )
( none ) ) ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id input-opts-reassign-binds ) :scale # t :param3 ( game-option-menu reassign-binds-options ) )
( new 'static 'game-option :option-type ( game-option-type confirmation ) :name ( text-id restore-defaults ) :scale # t
:on-confirm ( lambda ( )
2023-06-13 14:26:44 -04:00
( reset-input *pc-settings* 'input # t )
2023-06-04 15:34:37 -04:00
( set-enable-keyboard! *pc-settings* ( -> *pc-settings* keyboard-enabled? ) )
( update-mouse-controls! *pc-settings* )
( none ) ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t ) ) )
2022-06-04 14:53:49 -04:00
( define *misc-options* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id money-starburst ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id discord-rpc ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id cutscene-skips ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id speedrunner-mode ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-04-11 18:38:54 -04:00
)
)
2022-06-04 14:53:49 -04:00
( define *gfx-ps2-options* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type lod-bg ) :name ( text-id lod-bg ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type lod-fg ) :name ( text-id lod-fg ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id ps2-parts ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id force-envmap ) :scale # t )
2023-06-13 14:26:44 -04:00
( new 'static 'game-option :option-type ( game-option-type on-off ) :name ( text-id force-actors ) :scale # t )
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-04-11 18:38:54 -04:00
)
)
2023-06-04 15:34:37 -04:00
;; TODO - aspect ratios are hard-coded
2022-06-04 14:53:49 -04:00
( define *aspect-ratio-options* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id fit-to-screen ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect-fmt ) :param1 4.0 :param2 3.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect-fmt ) :param1 16.0 :param2 9.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect4x3-ps2 ) :param1 -1.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect16x9-ps2 ) :param1 -2.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect-fmt ) :param1 16.0 :param2 10.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect-fmt ) :param1 21.0 :param2 9.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type aspect-new ) :name ( text-id aspect-fmt ) :param1 64.0 :param2 27.0 :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-04-11 18:38:54 -04:00
)
)
2022-06-04 14:53:49 -04:00
( define *title-pc* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id new-game ) :scale # t :param3 ( game-option-menu save-game-title ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id load-game ) :scale # t :param3 ( game-option-menu load-game ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id options ) :scale # t :param3 ( game-option-menu settings-title ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id secrets ) :scale # t :param3 ( game-option-menu secrets ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id quit-game ) :scale # t :param3 ( game-option-menu quit-title ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-06-02 21:40:37 -04:00
)
)
2023-01-30 19:11:57 -05:00
( define *speedrun-options*
( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-reset-current-run ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-new-full-game ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id speedrun-new-individual-level ) :scale # t :param3 ( game-option-menu speedrun-il-options ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id speedrun-new-cat-ext ) :scale # t :param3 ( game-option-menu speedrun-cat-ext-options ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2023-01-30 19:11:57 -05:00
)
)
( define *speedrun-il-options*
( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-training ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-village1 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-beach ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-jungle ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-misty ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-firecanyon ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-village2 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-sunken ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-swamp ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-rolling ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-ogre ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-village3 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-snow ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-cave ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-lavatube ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-il-citadel ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2023-01-30 19:11:57 -05:00
)
)
2023-02-26 13:42:24 -05:00
( define *speedrun-cat-ext-options*
( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-new-full-game ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-new-game-plus ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-hub1-100 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-hub2-100 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-hub3-100 ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id speedrun-all-cutscenes ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2023-02-26 13:42:24 -05:00
)
)
2022-07-18 19:54:38 -04:00
( define *secrets-title* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id music-player ) :scale # t :param3 ( game-option-menu music-player ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id cheats ) :scale # t :param3 ( game-option-menu cheats ) )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-07-18 19:54:38 -04:00
)
)
( define *secrets* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id cheats ) :scale # t :param3 ( game-option-menu cheats ) )
( new 'static 'game-option :option-type ( game-option-type menu ) :name ( text-id checkpoint-select ) :scale # t :param3 ( game-option-menu checkpoint-select )
2023-01-30 19:11:57 -05:00
:option-disabled-func ( lambda ( ) ( not ( task-closed? ( game-task finalboss-movies ) ( task-status need-reminder ) ) ) ) )
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2023-01-30 19:11:57 -05:00
)
)
( define *checkpoint-select-options*
( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id training-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id village1-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id beach-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id jungle-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id misty-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id firecanyon-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id village2-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id sunken-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id swamp-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id rolling-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id ogre-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id village3-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id snow-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id cave-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id lavatube-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id citadel-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id finalboss-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-07-18 19:54:38 -04:00
)
)
( define *cheats* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-sidekick-alt ) :scale # t :param1 5.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-big-head ) :scale # t :param1 9.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-small-head ) :scale # t :param1 10.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-big-fist ) :scale # t :param1 11.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-big-head-npc ) :scale # t :param1 16.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-tunes ) :scale # t :param1 6.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-sky ) :scale # t :param1 7.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-huge-head ) :scale # t :param1 15.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-mirror ) :scale # t :param1 8.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-eco-yellow ) :scale # t :param1 3.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-eco-blue ) :scale # t :param1 2.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-eco-red ) :scale # t :param1 1.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-eco-green ) :scale # t :param1 0.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-invinc ) :scale # t :param1 4.0 )
( new 'static 'game-option :option-type ( game-option-type cheat-toggle ) :name ( text-id cheat-no-tex ) :scale # t :param1 12.0 )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-06-04 14:53:49 -04:00
)
)
( define *music-player-options* ( new 'static 'boxed-array :type game-option
2023-04-07 23:32:35 -04:00
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id village1-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id beach-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id jungle-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id fishgame ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id jungleb-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id misty-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id firecanyon-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id village2-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id rolling-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id swamp-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id sunken-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id ogre-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id ogreboss ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id village3-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id snow-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id cave-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id lavatube-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id citadel-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id finalboss-level-name ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id credits ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button-music ) :name ( text-id danger-mus ) :scale # t )
( new 'static 'game-option :option-type ( game-option-type button ) :name ( text-id back ) :scale # t )
2022-06-04 14:53:49 -04:00
)
)
2022-07-12 18:00:52 -04:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DATA LISTS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-06-04 14:53:49 -04:00
( define *music-list* ' ( village1 beach jungle fishgame jungleb misty firecanyon
village2 rolling swamp sunken ogre ogreboss
village3 snow maincave lavatube
citadel finalboss credits danger ) )
( define *progress-music* -1 )
( defmacro progress-get-music-by-index ( idx )
` ( the symbol ( ref *music-list* , idx ) ) )
( defmacro progress-reset-music-parms ( )
` ( begin
( set! *progress-music* -1 )
( set! *progress-flava* -1 ) ) )
( defmacro static-text-list-array ( &rest texts )
2023-04-07 23:32:35 -04:00
` ( new 'static 'boxed-array :type text-id
,@ ( apply ( lambda ( x ) ` ( text-id , x ) ) texts )
2022-06-04 14:53:49 -04:00
)
)
2023-04-07 23:32:35 -04:00
( define *music-flava-name-list* ( new 'static 'boxed-array :type ( array text-id )
2022-06-04 14:53:49 -04:00
( static-text-list-array village1-level-name flava-vi1-unused0 flava-sage flava-sage-hut flava-birdlady flava-farmer flava-assistant flava-mayor flava-sculptor flava-explorer flava-dock )
( static-text-list-array beach-level-name flava-bea-sentinel flava-bea-cannon flava-bea-grotto flava-birdlady )
( static-text-list-array jungle-level-name flava-jun-temple-exit flava-jun-lurkerm flava-jun-temple-top )
( static-text-list-array fishgame )
( static-text-list-array jungleb-level-name flava-jub-eggtop flava-jub-plant-boss )
( static-text-list-array misty-level-name flava-mis-battle flava-mis-boat flava-racer flava-mis-unused0 )
2022-07-03 17:25:28 -04:00
( static-text-list-array firecanyon-level-name flava-racer flava-fic-unused0 )
2022-06-04 14:53:49 -04:00
( static-text-list-array village2-level-name flava-sage flava-assistant flava-warrior flava-geologist flava-gambler flava-levitator )
( static-text-list-array rolling-level-name flava-rol-gorge )
( static-text-list-array swamp-level-name flava-swa-game flava-swa-launcher flava-swa-battle flava-flutflut )
( static-text-list-array sunken-level-name )
( static-text-list-array ogre-level-name flava-ogr-middle flava-ogr-end )
( static-text-list-array ogreboss )
( static-text-list-array village3-level-name flava-vi3-miners flava-sage flava-assistant flava-vi3-mai flava-vi3-sno )
2022-07-03 17:25:28 -04:00
( static-text-list-array snow-level-name flava-sno-battle flava-flutflut flava-sno-cave flava-sno-fort flava-sno-balls )
2022-06-04 14:53:49 -04:00
( static-text-list-array cave-level-name flava-mai-rob flava-mai-rob-top flava-mai-mai flava-mai-dar )
( static-text-list-array zero lavatube-level-name flava-lav-middle flava-lav-end )
( static-text-list-array citadel-level-name flava-sage flava-assistant flava-cit-yellowsage flava-cit-redsage flava-cit-bluesage flava-cit-hub )
( static-text-list-array finalboss-level-name flava-fin-middle flava-fin-end )
( static-text-list-array credits flava-credits-middle flava-credits-end )
( static-text-list-array danger-mus )
) )
2022-07-12 18:00:52 -04:00
2022-08-06 11:57:19 -04:00
( defmacro def-language-remap-info ( name langs )
2023-06-07 20:04:16 -04:00
` ( define , name ( quote , ( apply ( lambda ( x ) ` ( ( the binteger ( text-id , x ) ) ( the binteger ( pc-language , x ) ) ) ) langs ) ) )
2022-07-12 18:00:52 -04:00
)
2022-08-06 11:57:19 -04:00
( def-language-remap-info *language-remap-info-pc*
2023-05-14 01:28:13 -04:00
( english uk-english french german spanish italian japanese portuguese br-portuguese swedish finnish danish norwegian dutch hungarian catalan icelandic ) )
2022-07-12 18:00:52 -04:00
( define *text-languages* ( static-text-list-array
2023-05-14 01:28:13 -04:00
english uk-english french german spanish italian japanese portuguese br-portuguese swedish finnish danish norwegian dutch hungarian ) )
2022-07-12 18:00:52 -04:00
( define *subtitle-languages* ( static-text-list-array
2023-06-30 00:00:37 -04:00
english uk-english french german spanish italian br-portuguese swedish finnish danish dutch ) )
2022-07-12 18:00:52 -04:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; DYNAMIC MENU THINGS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2022-04-11 18:38:54 -04:00
( define-perm *temp-options-alloced* symbol # f )
;; this is to avoid changing the value of *temp-options* or reallocating the options when reloading file
( unless *temp-options-alloced*
( define *temp-options* ( new 'static 'boxed-array :type game-option :length 200 :allocated-length 200 ) )
( dotimes ( i ( -> *temp-options* length ) )
( set! ( -> *temp-options* i ) ( new 'global 'game-option ) ) )
( true! *temp-options-alloced* ) )
2022-06-04 14:53:49 -04:00
( defmacro add-flava-player-option ( text-id flava )
2022-08-06 11:57:19 -04:00
"add a music player w/ flava button to *temp-options* with specified size"
2022-06-04 14:53:49 -04:00
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option option-type ) ( game-option-type button-flava ) )
( set! ( -> option name ) , text-id )
( set! ( -> option param1 ) ( the float , flava ) )
( set! ( -> option scale ) # t )
2022-07-14 21:37:03 -04:00
2022-06-04 14:53:49 -04:00
( 1+! ( -> *temp-options* length ) )
)
)
2022-04-11 18:38:54 -04:00
( defmacro add-back-option ( )
"add *back-button* to *temp-options*"
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option option-type ) ( game-option-type button ) )
2023-04-07 23:32:35 -04:00
( set! ( -> option name ) ( text-id back ) )
2022-04-11 18:38:54 -04:00
( set! ( -> option scale ) # t )
2023-06-04 15:34:37 -04:00
( 1+! ( -> *temp-options* length ) ) ) )
2022-07-14 21:37:03 -04:00
2023-06-04 15:34:37 -04:00
( defmacro add-message-option ( text )
"adds an option that isn't selectable but displays some text"
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option option-type ) ( game-option-type button ) )
( set! ( -> option option-disabled-func ) ( lambda ( ) # t ) )
( set! ( -> option name ) , text )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) ) ) )
2022-04-11 18:38:54 -04:00
2023-06-04 15:34:37 -04:00
( defmacro add-resolution-option ( x y )
"add a resolution button to *temp-options* with specified size"
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option option-type ) ( game-option-type resolution ) )
( set! ( -> option option-disabled-func ) # f )
( set! ( -> option name ) ( text-id resolution-fmt ) )
( set! ( -> option param1 ) ( the float , x ) )
( set! ( -> option param2 ) ( the float , y ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) ) ) )
2022-07-14 21:37:03 -04:00
2023-06-04 15:34:37 -04:00
( defun build-resolution-options ( )
2022-04-11 18:38:54 -04:00
( set! ( -> *temp-options* length ) 0 )
2023-06-04 15:34:37 -04:00
;; Enumerate the available resolutions from C++
( let ( ( window-width 0 )
( window-height 0 )
( window-aspect-ratio 0.0 )
( num-resolutions ( pc-get-num-resolutions ) )
( num-resolutions-added 0 ) )
( when ( > num-resolutions 0 )
( pc-get-window-size ( the-as ( pointer int32 ) ( & window-width ) ) ( the-as ( pointer int32 ) ( & window-height ) ) )
( set! window-aspect-ratio ( / ( the float window-width ) ( the float window-height ) ) )
( dotimes ( i num-resolutions )
( let ( ( res-width 0 )
( res-height 0 )
( res-aspect-ratio 0.0 ) )
( pc-get-resolution i ( & res-width ) ( & res-height ) )
( set! res-aspect-ratio ( / ( the float res-width ) ( the float res-height ) ) )
;; Ignore those that aren't relevant to the current window's aspect ratio
;; we only do this when we aren't in windowed mode, because in windowed mode
;; you are using the resolution menu to change it...so it doesn't make sense to base it on the size
;;
;; Additionally, always show the PS2 resolutions or else they are never going to be seen due to the aspect ratio difference
( when ( or ( = ( pc-get-display-mode ) 'windowed )
( and ( = res-width 512 ) ( or ( = res-height 448 ) ( = res-height 224 ) ) )
( < ( fabs ( - window-aspect-ratio res-aspect-ratio ) ) 0.1 ) )
( add-resolution-option res-width res-height )
( 1+! num-resolutions-added ) ) ) ) )
;; If all we displayed was the 2 PS2 resolutions, inform them they have a weird aspect ratio
( when ( < num-resolutions-added 3 )
( add-message-option ( text-id progress-no-other-resolution-options ) ) )
)
( add-back-option ) )
2022-04-11 18:38:54 -04:00
2022-06-04 14:53:49 -04:00
( defun build-flava-player-options ( ( mus-idx int ) )
2022-07-14 21:37:03 -04:00
2022-06-04 14:53:49 -04:00
( set! ( -> *temp-options* length ) 0 )
2022-07-14 21:37:03 -04:00
2022-06-04 14:53:49 -04:00
( dotimes ( i ( -> *music-flava-name-list* mus-idx length ) )
( if ( nonzero? ( -> *music-flava-name-list* mus-idx i ) )
( add-flava-player-option ( -> *music-flava-name-list* mus-idx i ) i )
)
)
( add-back-option )
2022-07-14 21:37:03 -04:00
2022-06-04 14:53:49 -04:00
*temp-options*
)
2023-06-04 15:34:37 -04:00
( defmacro add-monitor-option ( text-id display-id )
"add a display button to *temp-options* with specified size"
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) )
( name ( pc-get-display-name , display-id ) ) )
( set! ( -> option option-type ) ( game-option-type monitor ) )
;; Use the name of the display if it's available
( if name
( set! ( -> option name-override ) name )
( set! ( -> option name ) , text-id ) )
( set! ( -> option param1 ) ( the float , display-id ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) )
)
)
2022-07-31 13:31:17 -04:00
( defun build-monitor-options ( )
( set! ( -> *temp-options* length ) 0 )
2023-06-04 15:34:37 -04:00
( dotimes ( i ( pc-get-display-count ) )
( add-monitor-option ( text-id display-fmt ) i ) )
( add-back-option )
*temp-options* )
2022-07-31 13:31:17 -04:00
2023-06-04 15:34:37 -04:00
( defmacro add-controller-option ( text-id controller-id )
"add a controller option to *temp-options* with specified size"
` ( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) )
( name ( pc-get-controller-name , controller-id ) ) )
( set! ( -> option option-type ) ( game-option-type controller ) )
;; Use the name of the controller if it's available
( if name
( set! ( -> option name-override ) name )
( set! ( -> option name ) , text-id ) )
( set! ( -> option param1 ) ( the float , controller-id ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) )
)
)
2022-09-02 11:50:10 -04:00
2023-06-04 15:34:37 -04:00
( defun build-controller-options ( )
" Dynamically creates menu options for selecting your controller.
Will attempt to use the name of the controller, but will fallback to a generic number otherwise "
( set! ( -> *temp-options* length ) 0 )
( dotimes ( i ( pc-get-controller-count ) )
( add-controller-option ( text-id input-opts-generic-controller ) i )
)
2022-07-31 13:31:17 -04:00
( add-back-option )
2022-08-06 11:57:19 -04:00
*temp-options* )
2022-04-11 18:38:54 -04:00
2023-06-04 15:34:37 -04:00
( define *analog-bind-names* ( new 'static 'boxed-array :type string "L ANALOG LEFT" "L ANALOG RIGHT" "L ANALOG UP" "L ANALOG DOWN" "R ANALOG LEFT" "R ANALOG RIGHT" "R ANALOG UP" "R ANALOG DOWN" ) )
( define *button-bind-names* ( new 'static 'boxed-array :type string "SELECT" "L3" "R3" "START"
"DPAD UP" "DPAD RIGHT" "DPAD DOWN" "DPAD LEFT" "L2" "R2" "L1" "R1" "TRIANGLE" "CIRCLE" "CROSS" "SQUARE" ) )
;; TODO - make a common function for these dynamic menus instead of the duplication / macros
( defun build-binding-reassignment-options ( ( screen progress-screen ) )
"Dynamically creates menu options for reassigning bindings for controllers/mice/keyboard"
( set! ( -> *temp-options* length ) 0 )
;; initialize binding options
;; for controllers and mice, dont allow analog rebindings
;; for keyboards, allow analog binding
( when ( = screen ( progress-screen keyboard-binds ) )
;; Add analog bindings
( dotimes ( i 4 )
;; two for each direction (low/high)
( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option bind-info port ) 0 )
;; only for keyboards
( set! ( -> option bind-info device-type ) 1 )
( set! ( -> option bind-info for-buttons? ) # f )
( set! ( -> option bind-info input-idx ) i )
( set! ( -> option bind-info analog-min-range? ) # t )
( set! ( -> option option-type ) ( game-option-type binding-assignment ) )
( set! ( -> option name-override ) ( -> *analog-bind-names* ( * i 2 ) ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) )
)
( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option bind-info port ) 0 )
;; only for keyboards
( set! ( -> option bind-info device-type ) 1 )
( set! ( -> option bind-info for-buttons? ) # f )
( set! ( -> option bind-info input-idx ) i )
( set! ( -> option bind-info analog-min-range? ) # f )
( set! ( -> option option-type ) ( game-option-type binding-assignment ) )
( set! ( -> option name-override ) ( -> *analog-bind-names* ( + 1 ( * i 2 ) ) ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) )
)
) )
;; Add Button bindings
( dotimes ( i 16 )
( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option bind-info port ) 0 )
( case screen
( ( ( progress-screen controller-binds ) )
( set! ( -> option bind-info device-type ) 0 ) )
( ( ( progress-screen keyboard-binds ) )
( set! ( -> option bind-info device-type ) 1 ) )
( ( ( progress-screen mouse-binds ) )
( set! ( -> option bind-info device-type ) 2 ) ) )
( set! ( -> option bind-info for-buttons? ) # t )
( set! ( -> option bind-info input-idx ) i )
( set! ( -> option bind-info analog-min-range? ) # f )
( set! ( -> option option-type ) ( game-option-type binding-assignment ) )
( set! ( -> option name-override ) ( -> *button-bind-names* i ) )
( set! ( -> option scale ) # t )
( 1+! ( -> *temp-options* length ) )
)
)
;; We add a restore defaults button at the bottom of each binding menu
( let ( ( option ( -> *temp-options* ( length *temp-options* ) ) ) )
( set! ( -> option option-type ) ( game-option-type confirmation ) )
( set! ( -> option name ) ( text-id restore-defaults ) )
( set! ( -> option scale ) # t )
;; No closures :(
( case screen
;; NOTE - assumes only port 0
( ( ( progress-screen controller-binds ) )
( set! ( -> option on-confirm ) ( lambda ( ) ( pc-reset-bindings-to-defaults! 0 0 ) ( none ) ) ) )
( ( ( progress-screen keyboard-binds ) )
( set! ( -> option on-confirm ) ( lambda ( ) ( pc-reset-bindings-to-defaults! 0 1 ) ( none ) ) ) )
( ( ( progress-screen mouse-binds ) )
( set! ( -> option on-confirm ) ( lambda ( ) ( pc-reset-bindings-to-defaults! 0 2 ) ( none ) ) ) ) )
( 1+! ( -> *temp-options* length ) )
)
( add-back-option )
*temp-options* )
2022-07-12 18:00:52 -04:00
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CAROUSELL FUNCTIONS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2023-06-07 20:04:16 -04:00
( defun get-language-name ( ( lang pc-language ) )
2023-04-07 23:32:35 -04:00
"get the text-id from a lang"
2022-07-12 18:00:52 -04:00
( dolist ( item *language-remap-info-pc* )
2023-06-07 20:04:16 -04:00
( when ( = lang ( the pc-language ( / ( the int ( cadr ( car item ) ) ) 8 ) ) )
2023-04-07 23:32:35 -04:00
( return ( the text-id ( / ( the int ( car ( car item ) ) ) 8 ) ) ) )
2022-07-12 18:00:52 -04:00
)
2023-04-07 23:32:35 -04:00
( text-id zero )
2022-07-12 18:00:52 -04:00
)
2023-04-07 23:32:35 -04:00
( defun print-string-in-carousell ( ( arg0 text-id ) ( arg1 font-context ) ( arg2 int ) ( arg3 symbol ) )
2022-04-11 18:38:54 -04:00
( let ( ( s5-0 ( if arg3
arg2
( - arg2 )
)
)
)
( +! ( -> arg1 origin x ) ( the float s5-0 ) )
( let ( ( f30-0 ( - 1.0 ( * 0.0033333334 ( the float arg2 ) ) ) ) )
( print-game-text-scaled ( lookup-text! *common-text* arg0 # f ) f30-0 arg1 ( the int ( * 128.0 f30-0 ) ) )
)
( set! ( -> arg1 origin x ) ( - ( -> arg1 origin x ) ( the float s5-0 ) ) )
)
( set! ( -> arg1 color ) ( font-color default ) )
arg1
)
2023-04-07 23:32:35 -04:00
( defun progress-draw-carousell-from-string-list ( ( options ( array text-id ) ) ( font font-context ) ( y-off int ) ( new-val int ) )
2022-04-11 18:38:54 -04:00
"yep."
2022-07-14 21:37:03 -04:00
2022-04-11 18:38:54 -04:00
( let ( ( old-lang ( -> *progress-carousell* selection ) )
( new-lang new-val )
( max-lang ( length options ) )
)
( if ( -> *progress-carousell* transition )
( seekl! ( -> *progress-carousell* x-offset ) 200 ( the int ( * 10.0 ( -> *display* time-adjust-ratio ) ) ) ) )
( when ( >= ( -> *progress-carousell* x-offset ) 100 )
( set! ( -> *progress-carousell* selection ) new-lang )
( set! old-lang new-lang )
( set! ( -> *progress-carousell* transition ) # f )
( set! ( -> *progress-carousell* x-offset ) 0 )
)
( set! ( -> font origin y ) ( the float ( + y-off 3 ) ) )
2023-05-24 01:57:05 -04:00
( set-color! font ( font-color progress-blue ) )
2022-04-11 18:38:54 -04:00
0
( let ( ( next-lang ( mod ( + old-lang 1 ) max-lang ) )
( prev-lang ( mod ( + max-lang -1 old-lang ) max-lang ) )
;; these are used during the transition since it technically allows you to see 4 langs at once.
( next2-lang ( mod ( + old-lang 2 ) max-lang ) )
( prev2-lang ( mod ( + max-lang -2 old-lang ) max-lang ) )
)
( cond
( ( -> *progress-carousell* direction )
( let ( ( a2-22 ( - 200 ( + ( -> *progress-carousell* x-offset ) 100 ) ) ) )
( print-string-in-carousell ( -> options prev-lang ) font a2-22 # f )
)
2023-05-24 01:57:05 -04:00
( set-color! font ( font-color progress-blue ) )
2022-04-11 18:38:54 -04:00
( let ( ( a2-23 ( + ( -> *progress-carousell* x-offset ) 100 ) ) )
( cond
( ( < a2-23 150 )
( print-string-in-carousell ( -> options next-lang ) font a2-23 # t )
)
( else
( let ( ( a2-24 ( - 200 ( -> *progress-carousell* x-offset ) ) ) )
( print-string-in-carousell ( -> options prev2-lang ) font a2-24 # f )
)
)
)
)
)
( else
( let ( ( a2-25 ( + ( -> *progress-carousell* x-offset ) 100 ) ) )
( cond
( ( < a2-25 150 )
( print-string-in-carousell ( -> options prev-lang ) font a2-25 # f )
)
( else
( let ( ( a2-26 ( - 200 ( -> *progress-carousell* x-offset ) ) ) )
( print-string-in-carousell ( -> options next2-lang ) font a2-26 # t )
)
)
)
)
2023-05-24 01:57:05 -04:00
( set-color! font ( font-color progress-blue ) )
2022-04-11 18:38:54 -04:00
( let ( ( a2-27 ( - 200 ( + ( -> *progress-carousell* x-offset ) 100 ) ) ) )
( print-string-in-carousell ( -> options next-lang ) font a2-27 # t )
)
)
)
)
( if ( not ( -> *progress-carousell* transition ) )
2023-05-24 01:57:05 -04:00
( set-color! font ( font-color progress-selected ) ) )
2022-04-11 18:38:54 -04:00
( print-string-in-carousell ( -> options old-lang ) font ( -> *progress-carousell* x-offset ) ( -> *progress-carousell* direction ) )
)
)
;;---------------------------
;;---------------------------
;; function overrides
( defun init-game-options ( ( obj progress ) )
"Set the options for all of the menus."
;; start off by making them all invalid
( dotimes ( i ( progress-screen max ) )
( set! ( -> *options-remap* i ) # f )
)
2022-08-06 11:57:19 -04:00
;; give cheats
( when ( task-closed? ( game-task finalboss-movies ) ( task-status need-reminder ) )
2022-08-20 10:30:37 -04:00
( logior! ( -> *pc-settings* cheats-known ) ( pc-cheats sidekick-blue tunes sky big-head small-head big-fist big-head-npc ) )
2022-08-06 11:57:19 -04:00
( when ( >= ( calculate-completion ( the progress # f ) ) 100.0 )
2022-08-20 10:30:37 -04:00
( logior! ( -> *pc-settings* cheats-known ) ( pc-cheats invinc eco-blue eco-red eco-green eco-yellow huge-head mirror no-tex ) ) ) )
2022-08-06 11:57:19 -04:00
2022-04-11 18:38:54 -04:00
;; set up options for each screen
2022-07-18 19:54:38 -04:00
( set! ( -> *options-remap* ( progress-screen settings ) ) ( if ( or *cheat-mode* ( nonzero? ( -> *pc-settings* cheats-known ) ) )
*main-options-secrets*
*main-options-pc* ) )
2022-04-11 18:38:54 -04:00
( set! ( -> *options-remap* ( progress-screen game-settings ) ) *game-options-pc* )
2023-06-04 15:34:37 -04:00
( let ( ( max-refresh-rate ( pc-get-active-display-refresh-rate ) ) )
2022-06-25 11:05:20 -04:00
( cond
2023-06-04 15:34:37 -04:00
( ( > max-refresh-rate 100 )
2022-06-25 11:05:20 -04:00
( set! ( -> *options-remap* ( progress-screen graphic-settings ) ) *graphic-options-pc* )
( set! *carousell-frame-rate* *carousell-frame-rate-150fps* )
)
( ( > max-refresh-rate 60 )
( set! ( -> *options-remap* ( progress-screen graphic-settings ) ) *graphic-options-pc* )
( set! *carousell-frame-rate* *carousell-frame-rate-100fps* )
)
( else
( set! ( -> *options-remap* ( progress-screen graphic-settings ) ) *graphic-options-no-frame-rate-pc* )
)
) )
2022-04-11 18:38:54 -04:00
2023-06-04 15:34:37 -04:00
( set! ( -> *options-remap* ( progress-screen sound-settings ) ) *sound-options-pc* )
( set! ( -> *options-remap* ( progress-screen memcard-no-space ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-not-inserted ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-not-formatted ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-format ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen memcard-data-exists ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen memcard-insert ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen load-game ) ) *load-options* )
( set! ( -> *options-remap* ( progress-screen save-game ) ) *save-options* )
( set! ( -> *options-remap* ( progress-screen save-game-title ) ) *save-options-title* )
( set! ( -> *options-remap* ( progress-screen memcard-error-loading ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-error-saving ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-error-formatting ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-error-creating ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-auto-save-error ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-removed ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen memcard-no-data ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen title ) ) *title-pc* )
( set! ( -> *options-remap* ( progress-screen settings-title ) ) *options* )
( set! ( -> *options-remap* ( progress-screen auto-save ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen pal-change-to-60hz ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen pal-now-60hz ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen no-disc ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen bad-disc ) ) *ok-options* )
( set! ( -> *options-remap* ( progress-screen quit ) ) *yes-no-options* )
2022-04-11 18:38:54 -04:00
;; our screens!
2022-07-03 17:27:55 -04:00
( set! ( -> *options-remap* ( progress-screen aspect-msg ) ) *yes-no-options* )
2023-06-04 15:34:37 -04:00
( set! ( -> *options-remap* ( progress-screen input-options ) ) *input-options* )
2022-07-03 17:27:55 -04:00
( set! ( -> *options-remap* ( progress-screen camera-options ) ) *camera-options* )
2023-06-04 15:34:37 -04:00
( set! ( -> *options-remap* ( progress-screen controller-options ) ) *controller-options* )
( set! ( -> *options-remap* ( progress-screen mouse-options ) ) *mouse-options* )
( set! ( -> *options-remap* ( progress-screen reassign-binds-options ) ) *reassign-binds-options* )
( set! ( -> *options-remap* ( progress-screen select-controller ) ) *temp-options* )
2023-06-13 14:26:44 -04:00
( set! ( -> *options-remap* ( progress-screen controller-binds ) ) *temp-options* )
( set! ( -> *options-remap* ( progress-screen keyboard-binds ) ) *temp-options* )
( set! ( -> *options-remap* ( progress-screen mouse-binds ) ) *temp-options* )
2023-06-04 15:34:37 -04:00
2022-07-03 17:27:55 -04:00
( set! ( -> *options-remap* ( progress-screen misc-options ) ) *misc-options* )
( set! ( -> *options-remap* ( progress-screen gfx-ps2-options ) ) *gfx-ps2-options* )
( set! ( -> *options-remap* ( progress-screen resolution ) ) *temp-options* )
( set! ( -> *options-remap* ( progress-screen aspect-ratio ) ) *aspect-ratio-options* )
( set! ( -> *options-remap* ( progress-screen quit-title ) ) *yes-no-options* )
2022-07-18 19:54:38 -04:00
( set! ( -> *options-remap* ( progress-screen secrets ) ) *secrets-title* )
( set! ( -> *options-remap* ( progress-screen cheats ) ) *cheats* )
2023-06-04 15:34:37 -04:00
( set! ( -> *options-remap* ( progress-screen checkpoint-select ) ) *checkpoint-select-options* )
2022-07-03 17:27:55 -04:00
( set! ( -> *options-remap* ( progress-screen music-player ) ) *music-player-options* )
( set! ( -> *options-remap* ( progress-screen flava-player ) ) *temp-options* )
( set! ( -> *options-remap* ( progress-screen memcard-disable-auto-save ) ) *yes-no-options* )
( set! ( -> *options-remap* ( progress-screen memcard-auto-save-disabled ) ) *ok-options* )
2022-07-31 13:31:17 -04:00
( set! ( -> *options-remap* ( progress-screen monitor ) ) *temp-options* )
2023-01-30 19:11:57 -05:00
( set! ( -> *options-remap* ( progress-screen speedrun-options ) ) *speedrun-options* )
( set! ( -> *options-remap* ( progress-screen speedrun-il-options ) ) *speedrun-il-options* )
2023-06-04 15:34:37 -04:00
( set! ( -> *options-remap* ( progress-screen speedrun-cat-ext-options ) ) *speedrun-cat-ext-options* )
2022-07-14 21:37:03 -04:00
2022-04-11 18:38:54 -04:00
;; set default params
( set! ( -> *progress-state* aspect-ratio-choice ) ( get-aspect-ratio ) )
( set! ( -> *progress-state* video-mode-choice ) ( get-video-mode ) )
( set! ( -> *progress-state* yes-no-choice ) # f )
2022-07-14 21:37:03 -04:00
2022-04-11 18:38:54 -04:00
;; set variable pointers
( set! ( -> *game-options* 1 value-to-modify ) ( &-> *setting-control* default play-hints ) )
( set! ( -> *game-options* 2 value-to-modify ) ( &-> *setting-control* default language ) )
( set! ( -> *game-options-japan* 0 value-to-modify ) ( &-> *setting-control* default vibration ) )
( set! ( -> *game-options-japan* 1 value-to-modify ) ( &-> *setting-control* default play-hints ) )
( set! ( -> *game-options-demo* 0 value-to-modify ) ( &-> *setting-control* default vibration ) )
( set! ( -> *game-options-demo* 1 value-to-modify ) ( &-> *setting-control* default play-hints ) )
( set! ( -> *graphic-options* 1 value-to-modify ) ( &-> *progress-state* aspect-ratio-choice ) )
( set! ( -> *sound-options* 0 value-to-modify ) ( &-> *setting-control* default sfx-volume ) )
( set! ( -> *sound-options* 1 value-to-modify ) ( &-> *setting-control* default music-volume ) )
( set! ( -> *sound-options* 2 value-to-modify ) ( &-> *setting-control* default dialog-volume ) )
( set! ( -> *yes-no-options* 0 value-to-modify ) ( &-> *progress-state* yes-no-choice ) )
2023-06-04 15:34:37 -04:00
2022-04-11 18:38:54 -04:00
;; our options!
2022-07-05 13:49:37 -04:00
( set! ( -> *game-options-pc* 1 value-to-modify ) ( &-> *setting-control* default play-hints ) )
2022-07-12 18:00:52 -04:00
( set! ( -> *game-options-pc* 2 value-to-modify ) ( &-> *pc-settings* subtitles? ) )
( set! ( -> *game-options-pc* 3 value-to-modify ) ( &-> *pc-settings* hinttitles? ) )
( set! ( -> *game-options-pc* 4 value-to-modify ) ( &-> *setting-control* default language ) )
( set! ( -> *game-options-pc* 5 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
( set! ( -> *game-options-pc* 6 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
( set! ( -> *game-options-pc* 7 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
2022-09-02 18:15:42 -04:00
2022-04-11 18:38:54 -04:00
( set! ( -> *graphic-options-pc* 1 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
2022-07-31 13:31:17 -04:00
( set! ( -> *graphic-options-pc* 2 value-to-modify ) ( &-> *pc-settings* monitor ) )
( set! ( -> *graphic-options-pc* 3 value-to-modify ) ( &-> *pc-settings* vsync? ) )
2022-07-14 21:37:03 -04:00
( set! ( -> *graphic-options-pc* 5 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
2022-07-31 13:31:17 -04:00
( set! ( -> *graphic-options-pc* 6 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
2022-09-02 18:15:42 -04:00
;; disable changes to frame-rate while in speedrunner mode
2023-06-04 15:34:37 -04:00
;; todo move this to the creation
2022-09-02 18:15:42 -04:00
( set! ( -> *graphic-options-pc* 6 option-disabled-func ) ( lambda ( ) ( -> *pc-settings* speedrunner-mode? ) ) )
2022-06-25 11:05:20 -04:00
( set! ( -> *graphic-options-no-frame-rate-pc* 1 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
( set! ( -> *graphic-options-no-frame-rate-pc* 2 value-to-modify ) ( &-> *pc-settings* vsync? ) )
2022-07-16 01:00:19 -04:00
( set! ( -> *graphic-options-no-frame-rate-pc* 4 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
2022-09-02 18:15:42 -04:00
2022-07-16 01:00:19 -04:00
( set! ( -> *misc-options* 0 value-to-modify ) ( &-> *pc-settings* money-starburst? ) )
( set! ( -> *misc-options* 1 value-to-modify ) ( &-> *pc-settings* discord-rpc? ) )
2023-01-24 15:22:47 -05:00
( set! ( -> *misc-options* 2 value-to-modify ) ( &-> *pc-settings* skip-movies? ) )
2022-09-02 18:15:42 -04:00
( set! ( -> *misc-options* 3 value-to-modify ) ( &-> *pc-settings* speedrunner-mode? ) )
2022-05-23 15:56:42 -04:00
( set! ( -> *camera-options* 0 value-to-modify ) ( &-> *pc-settings* first-camera-h-inverted? ) )
( set! ( -> *camera-options* 1 value-to-modify ) ( &-> *pc-settings* first-camera-v-inverted? ) )
( set! ( -> *camera-options* 2 value-to-modify ) ( &-> *pc-settings* third-camera-h-inverted? ) )
( set! ( -> *camera-options* 3 value-to-modify ) ( &-> *pc-settings* third-camera-v-inverted? ) )
2022-09-02 18:15:42 -04:00
2023-06-04 15:34:37 -04:00
;; input options
( set! ( -> *controller-options* 1 value-to-modify ) ( &-> *setting-control* default vibration ) )
( set! ( -> *controller-options* 2 value-to-modify ) ( &-> *pc-settings* stick-deadzone ) )
( set! ( -> *controller-options* 3 value-to-modify ) ( &-> *pc-settings* ignore-controller-win-unfocused? ) )
( set! ( -> *controller-options* 4 value-to-modify ) ( &-> *pc-settings* controller-hp-led? ) )
( set! ( -> *controller-options* 5 value-to-modify ) ( &-> *pc-settings* controller-eco-led? ) )
2023-06-13 14:26:44 -04:00
( set! ( -> *controller-options* 6 value-to-modify ) ( &-> *pc-settings* controller-heat-led? ) )
2023-06-04 15:34:37 -04:00
( set! ( -> *mouse-options* 0 value-to-modify ) ( &-> *pc-settings* mouse-camera? ) )
( set! ( -> *mouse-options* 1 value-to-modify ) ( &-> *pc-settings* mouse-xsens ) )
( set! ( -> *mouse-options* 2 value-to-modify ) ( &-> *pc-settings* mouse-ysens ) )
( set! ( -> *mouse-options* 3 value-to-modify ) ( &-> *pc-settings* mouse-movement? ) )
( set! ( -> *input-options* 2 value-to-modify ) ( &-> *pc-settings* keyboard-enabled? ) )
( set! ( -> *input-options* 3 value-to-modify ) ( &-> *pc-settings* mouse-enabled? ) )
( set! ( -> *input-options* 5 value-to-modify ) ( &-> *pc-settings* auto-hide-cursor? ) )
2022-04-11 18:38:54 -04:00
( set! ( -> *gfx-ps2-options* 0 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
( set! ( -> *gfx-ps2-options* 1 value-to-modify ) ( &-> *progress-carousell* int-backup ) )
( set! ( -> *gfx-ps2-options* 2 value-to-modify ) ( &-> *pc-settings* ps2-parts? ) )
2023-01-24 15:22:47 -05:00
( set! ( -> *gfx-ps2-options* 3 value-to-modify ) ( &-> *pc-settings* force-envmap? ) )
2023-07-29 13:30:37 -04:00
( set! ( -> *gfx-ps2-options* 4 value-to-modify ) ( &-> *pc-settings* ps2-actor-vis? ) )
2022-09-02 18:15:42 -04:00
2022-04-11 18:38:54 -04:00
( set! ( -> *sound-options-pc* 0 value-to-modify ) ( &-> *setting-control* default sfx-volume ) )
( set! ( -> *sound-options-pc* 1 value-to-modify ) ( &-> *setting-control* default music-volume ) )
( set! ( -> *sound-options-pc* 2 value-to-modify ) ( &-> *setting-control* default dialog-volume ) )
2022-08-20 10:30:37 -04:00
( dotimes ( i ( 1- ( -> *cheats* length ) ) )
( set! ( -> *cheats* i value-to-modify ) ( &-> *progress-carousell* symbol-backup ) )
)
2022-07-12 18:00:52 -04:00
;(set! (-> *sound-options-pc* 3 value-to-modify) (&-> *pc-settings* music-fadein?))
2022-07-18 19:54:38 -04:00
2022-04-11 18:38:54 -04:00
( set! ( -> *progress-carousell* aspect-native-choice ) ( -> *pc-settings* use-vis? ) )
2022-07-14 21:37:03 -04:00
2022-04-11 18:38:54 -04:00
;; scroll stuff!
( progress-scroll-reset )
2022-07-18 19:54:38 -04:00
2022-04-11 18:38:54 -04:00
( none )
)
( defmethod respond-common progress ( ( obj progress ) )
" common logic for navigating the progress menu.
this is the overriden version, purged of no longer necessary code and with additional new code. "
;; read memcard
( mc-get-slot-info 0 *progress-save-info* )
( set! ( -> obj card-info ) *progress-save-info* )
;; build custom dynamic menus
( case ( -> obj display-state )
( ( ( progress-screen resolution ) )
;; TODO infinite scrolling
2023-06-04 15:34:37 -04:00
( build-resolution-options )
2022-04-11 18:38:54 -04:00
)
2022-06-04 14:53:49 -04:00
( ( ( progress-screen flava-player ) )
( build-flava-player-options *progress-music* )
)
2022-07-18 19:54:38 -04:00
( ( ( progress-screen secrets ) )
( if ( = ( -> obj display-state-stack 0 ) ( progress-screen title ) )
( set! ( -> *options-remap* ( -> obj display-state ) ) *secrets-title* )
( set! ( -> *options-remap* ( -> obj display-state ) ) *secrets* ) )
2022-07-03 17:27:55 -04:00
)
2022-07-31 13:31:17 -04:00
( ( ( progress-screen monitor ) )
( build-monitor-options )
)
2023-06-04 15:34:37 -04:00
( ( ( progress-screen select-controller ) )
( build-controller-options )
)
( ( ( progress-screen controller-binds ) ( progress-screen keyboard-binds ) ( progress-screen mouse-binds ) )
( build-binding-reassignment-options ( -> obj display-state ) )
)
2022-04-11 18:38:54 -04:00
)
;; run nav code
( let ( ( options ( -> *options-remap* ( -> obj display-state ) ) ) )
;; snap scroll if oob
( when ( > ( length options ) PROGRESS_PC_PAGE_HEIGHT )
( set! ( -> *progress-scroll* start-index ) ( max ( -> *progress-scroll* start-index )
( - ( -> obj option-index ) ( + PROGRESS_PC_PAGE_HEIGHT -2 ) ) ) )
)
( when ( and options ( not ( or ( progress-scrolling? ) ( -> obj in-transition ) ) ) )
;; only respond to inputs when transition is done (and also there's options at all)
( cond
( ( cpad-pressed? 0 up )
;; pressed up
;; original code checked hold and then press, because hold can be used during center screen option. which we don't use.
( when ( not ( -> obj selected-option ) )
( if ( != ( length options ) 1 )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-up-down" )
2022-04-11 18:38:54 -04:00
)
( set! ( -> obj last-option-index-change ) ( -> *display* real-frame-counter ) )
( cond
( ( > ( -> obj option-index ) 0 )
( 1-! ( -> obj option-index ) )
( when ( and ( > ( length options ) PROGRESS_PC_PAGE_HEIGHT ) ( < ( -> obj option-index ) *progress-scroll-start* ) )
( progress-scroll-up! )
)
)
( else
( set! ( -> obj option-index ) ( 1- ( length options ) ) )
( set! ( -> *progress-scroll* start-index ) ( max 0 ( - ( length options ) PROGRESS_PC_PAGE_HEIGHT -1 ) ) )
)
)
)
)
( ( cpad-pressed? 0 down )
;; pressed down.
( when ( not ( -> obj selected-option ) )
( if ( != ( length options ) 1 )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-up-down" )
2022-04-11 18:38:54 -04:00
)
( set! ( -> obj last-option-index-change ) ( -> *display* real-frame-counter ) )
( cond
( ( < ( -> obj option-index ) ( 1- ( length options ) ) )
( 1+! ( -> obj option-index ) )
( when ( and ( > ( length options ) PROGRESS_PC_PAGE_HEIGHT ) ( >= ( -> obj option-index ) *progress-scroll-end* ) )
( progress-scroll-down! )
)
)
( else
( set! ( -> obj option-index ) 0 )
( set! ( -> *progress-scroll* start-index ) 0 )
)
)
)
)
( ( cpad-hold? 0 left )
;; holding left. sliders use hold.
( cond
( ( cpad-pressed? 0 left )
;; navigate left.
( when ( or ( -> obj selected-option ) ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type yes-no ) ) )
( let ( ( sound? # f ) )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type on-off )
( game-option-type yes-no )
2022-05-23 15:56:42 -04:00
( game-option-type normal-inverted )
2022-07-18 19:54:38 -04:00
( game-option-type aspect-native )
( game-option-type cheat-toggle ) )
2022-04-11 18:38:54 -04:00
;; pressed left on an on/off yes/no option
( when ( not ( -> ( the-as ( pointer uint32 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
;; it was on 'off' or 'no'
( set! sound? # t )
2023-06-04 15:34:37 -04:00
;; vibrate if this toggles vibration.
;; TODO - get this working
( when ( = ( -> options ( -> obj option-index ) name ) ( text-id vibrations ) )
( cpad-set-buzz! ( -> *cpad-list* cpads 0 ) 1 255 ( seconds 0.3 ) ) )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
;; if the option has an explicit on-change function, call it
( if ( nonzero? ( -> options ( -> obj option-index ) on-change ) )
( ( -> options ( -> obj option-index ) on-change ) # t )
;; set to yes
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) # t ) )
2022-04-11 18:38:54 -04:00
)
( ( ( game-option-type aspect-ratio ) )
( set! sound? ( = ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 'aspect16x9 ) )
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 'aspect4x3 )
)
( ( ( game-option-type language ) )
;; language selection. if not on first language, go back. if on first language, go to last.
( if ( > ( the-as int ( -> ( the-as ( pointer uint64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ) 0 )
( +! ( -> ( the-as ( pointer uint64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) -1 )
( set! ( -> ( the-as ( pointer int64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 5 )
)
;; language was updated.
( set! ( -> obj language-transition ) # t )
( set! ( -> obj language-direction ) # t )
( set! sound? # t )
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type confirmation ) )
( set! sound? ( != ( -> *progress-state* on-off-backup ) # t ) )
( set! ( -> *progress-state* on-off-backup ) # t ) )
2022-04-11 18:38:54 -04:00
( ( ( game-option-type display-mode )
( game-option-type msaa )
( game-option-type lod-bg )
( game-option-type lod-fg )
( game-option-type speaker )
2022-06-24 00:43:57 -04:00
( game-option-type frame-rate )
2022-07-12 18:00:52 -04:00
( game-option-type language-subtitles )
( game-option-type language-text )
2022-04-11 18:38:54 -04:00
)
;; a carousell like language
( if ( > ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 0 )
( +! ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) -1 )
( set! ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ( 1- ( length ( -> *progress-carousell* current-carousell ) ) ) )
)
;; updated.
( set! ( -> *progress-carousell* transition ) # t )
( set! ( -> *progress-carousell* direction ) # t )
( set! sound? # t )
)
)
( if sound?
2022-06-13 18:39:22 -04:00
( sound-play "cursor-l-r" )
2022-04-11 18:38:54 -04:00
)
)
)
)
( else
;; holding left
( when ( -> obj selected-option )
( let ( ( sound? # f ) )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type slider ) )
;; slider is selected
( cond
( ( >= ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
2023-06-04 15:34:37 -04:00
( + ( -> options ( -> obj option-index ) slider-step-size ) ( -> options ( -> obj option-index ) param1 ) ) )
2022-04-11 18:38:54 -04:00
;; we're 1 above minimum, so reduce by 1
( set! ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
2023-06-04 15:34:37 -04:00
( - ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> options ( -> obj option-index ) slider-step-size ) ) )
2022-04-11 18:38:54 -04:00
( set! sound? # t )
)
( ( < ( -> options ( -> obj option-index ) param1 )
;; not at least 1 above minimum, just set to minimum (why not just use max or something!!)
( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
( set! ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> options ( -> obj option-index ) param1 ) )
( set! sound? # t )
)
)
)
)
;; play sound
( when sound?
( let ( ( vol 100.0 ) )
( case ( -> options ( -> obj option-index ) name )
2023-04-07 23:32:35 -04:00
( ( ( text-id music-volume ) ( text-id speech-volume ) )
2022-04-11 18:38:54 -04:00
( set! vol ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
)
( when ( < ( seconds 0.3 ) ( - ( -> *display* real-frame-counter ) ( -> *progress-state* last-slider-sound ) ) )
( set! ( -> *progress-state* last-slider-sound ) ( -> *display* real-frame-counter ) )
2022-06-13 18:39:22 -04:00
( sound-play "slider2001" :vol vol )
2022-04-11 18:38:54 -04:00
)
)
)
)
)
)
)
)
( ( cpad-hold? 0 right )
;; holding right
( cond
( ( cpad-pressed? 0 right )
;; pressed right
( when ( or ( -> obj selected-option ) ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type yes-no ) ) )
( let ( ( sound? # f ) )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type on-off )
( game-option-type yes-no )
2022-05-23 15:56:42 -04:00
( game-option-type normal-inverted )
2022-04-11 18:38:54 -04:00
( game-option-type aspect-native )
2022-07-18 19:54:38 -04:00
( game-option-type cheat-toggle ) )
2022-04-11 18:38:54 -04:00
;; play sound if it was on 'yes' because we're going to 'no' now
( set! sound? ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
2023-06-04 15:34:37 -04:00
;; if the option has an explicit on-change function, call it
( if ( nonzero? ( -> options ( -> obj option-index ) on-change ) )
( ( -> options ( -> obj option-index ) on-change ) # f )
;; set to no
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) # f ) )
2022-04-11 18:38:54 -04:00
)
( ( ( game-option-type aspect-ratio ) )
;; same shit different toilet
( set! sound? ( = ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 'aspect4x3 ) )
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 'aspect16x9 )
)
( ( ( game-option-type language ) )
;; same thing as before. if at last, go to first. otherwise, keep going forward.
( if ( < ( the-as int ( -> ( the-as ( pointer uint64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ) 5 )
( 1+! ( -> ( the-as ( pointer uint64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
( set! ( -> ( the-as ( pointer int64 ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 0 )
)
( set! ( -> obj language-transition ) # t )
( set! ( -> obj language-direction ) # f )
( set! sound? # t )
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type confirmation ) )
( set! sound? ( != ( -> *progress-state* on-off-backup ) # f ) )
( set! ( -> *progress-state* on-off-backup ) # f ) )
2022-04-11 18:38:54 -04:00
( ( ( game-option-type display-mode )
( game-option-type msaa )
( game-option-type lod-bg )
( game-option-type lod-fg )
( game-option-type speaker )
2022-06-24 00:43:57 -04:00
( game-option-type frame-rate )
2022-07-12 18:00:52 -04:00
( game-option-type language-subtitles )
( game-option-type language-text )
2022-04-11 18:38:54 -04:00
)
;; same thing as before. if at last, go to first. otherwise, keep going forward.
( if ( < ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ( 1- ( length ( -> *progress-carousell* current-carousell ) ) ) )
( 1+! ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
( set! ( -> ( the-as ( pointer int ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) 0 )
)
( set! ( -> *progress-carousell* transition ) # t )
( set! ( -> *progress-carousell* direction ) # f )
( set! sound? # t )
)
)
;; play sound if desired
( if sound?
2022-06-13 18:39:22 -04:00
( sound-play "cursor-l-r" )
2022-04-11 18:38:54 -04:00
)
)
)
)
( else
;; holding right, but didnt just press it. same slider stuff as before
( when ( -> obj selected-option )
( let ( ( sound? # f ) )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type slider ) )
( cond
2023-06-04 15:34:37 -04:00
( ( >= ( - ( -> options ( -> obj option-index ) param2 )
( -> options ( -> obj option-index ) slider-step-size ) )
2022-04-11 18:38:54 -04:00
( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
( set! ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
2023-06-04 15:34:37 -04:00
( + ( -> options ( -> obj option-index ) slider-step-size )
( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ) )
2022-04-11 18:38:54 -04:00
( set! sound? # t )
)
( ( < ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> options ( -> obj option-index ) param2 ) )
( set! ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> options ( -> obj option-index ) param2 ) )
( set! sound? # t )
)
)
)
)
( when sound?
( let ( ( vol 100.0 ) )
( case ( -> options ( -> obj option-index ) name )
2023-04-07 23:32:35 -04:00
( ( ( text-id music-volume ) ( text-id speech-volume ) )
2022-04-11 18:38:54 -04:00
( set! vol ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
)
( when ( < ( seconds 0.3 ) ( - ( -> *display* real-frame-counter ) ( -> *progress-state* last-slider-sound ) ) )
( set! ( -> *progress-state* last-slider-sound ) ( -> *display* real-frame-counter ) )
2022-06-13 18:39:22 -04:00
( sound-play "slider2001" :vol vol )
2022-04-11 18:38:54 -04:00
)
)
)
)
)
)
)
)
( ( or ( cpad-pressed? 0 square ) ( cpad-pressed? 0 triangle ) )
;; pressed square or triangle, cancel out!
( cond
( ( -> obj selected-option )
;; an option is selected. AHHH!!! just restore to whatever was on the backup
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type slider ) )
( set! ( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> *progress-state* slider-backup ) )
)
( ( ( game-option-type language ) )
( set! ( -> ( the-as ( pointer language-enum ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> *progress-state* language-backup ) )
)
2022-05-23 15:56:42 -04:00
( ( ( game-option-type on-off ) ( game-option-type normal-inverted ) )
2022-04-11 18:38:54 -04:00
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( -> *progress-state* on-off-backup ) )
)
)
;; ding
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-04-11 18:38:54 -04:00
( set! ( -> obj selected-option ) # f )
)
( ( or ( can-go-back? obj )
( = ( -> obj display-state ) ( progress-screen load-game ) )
( = ( -> obj display-state ) ( progress-screen save-game ) )
( = ( -> obj display-state ) ( progress-screen save-game-title ) )
)
;; no option selected, go back
( cpad-clear! 0 square )
( cpad-clear! 0 triangle )
( if ( = ( -> obj display-state ) ( progress-screen settings ) )
2022-06-13 18:39:22 -04:00
( sound-play "menu-stats" )
( sound-play "cursor-options" )
2022-04-11 18:38:54 -04:00
)
2022-06-04 14:53:49 -04:00
( when ( = ( -> obj display-state ) ( progress-screen music-player ) )
2022-06-13 18:39:22 -04:00
( sound-group-pause ( sound-group music ) )
2022-06-04 14:53:49 -04:00
( progress-reset-music-parms ) )
2022-04-11 18:38:54 -04:00
( load-level-text-files ( -> *level-task-data* ( -> obj display-level-index ) text-group-index ) )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( or ( cpad-pressed? 0 x ) ( cpad-pressed? 0 circle ) )
;; pressed x or circle. advance!
2022-09-02 18:15:42 -04:00
;; first check if the option is disabled, if so leave early and do nothing
2023-06-04 15:34:37 -04:00
( when ( and ( nonzero? ( -> options ( -> obj option-index ) option-disabled-func ) )
( != ( -> options ( -> obj option-index ) option-disabled-func ) # f )
2022-09-02 18:15:42 -04:00
( ( -> options ( -> obj option-index ) option-disabled-func ) ) )
( sound-play "menu-stats" )
( return # f ) )
2022-04-11 18:38:54 -04:00
( cond
( ( not ( -> obj selected-option ) )
;; no option already selected.
( cond
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type menu ) )
;; go to a menu
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
2022-07-18 19:54:38 -04:00
( cond
( ( and ( not ( -> *setting-control* default auto-save ) )
2023-04-07 23:32:35 -04:00
( = ( text-id disable-auto-save ) ( -> options ( -> obj option-index ) name ) ) )
2022-07-18 19:54:38 -04:00
( sound-play "cursor-options" )
2022-04-11 18:38:54 -04:00
)
2022-07-18 19:54:38 -04:00
( else
2022-06-04 14:53:49 -04:00
( push! obj )
2022-06-13 18:39:22 -04:00
( sound-play "select-option" )
2022-07-18 19:54:38 -04:00
( set! ( -> obj next-display-state ) ( the-as progress-screen ( -> options ( -> obj option-index ) param3 ) ) )
( case ( -> obj next-display-state )
( ( ( progress-screen load-game ) ( progress-screen save-game ) ( progress-screen save-game-title ) )
( set! ( -> obj next-display-state ) ( set-memcard-screen obj ( -> obj next-display-state ) ) )
)
)
2022-06-04 14:53:49 -04:00
)
2022-07-18 19:54:38 -04:00
)
2022-06-04 14:53:49 -04:00
)
2022-04-11 18:38:54 -04:00
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type button ) )
;; a button. what?
( case ( -> options ( -> obj option-index ) name )
2023-04-07 23:32:35 -04:00
( ( ( text-id exit-demo ) )
2022-04-11 18:38:54 -04:00
;; exit demo!
( set! *master-exit* 'force )
( set-master-mode 'game )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id back ) )
2022-04-11 18:38:54 -04:00
;; go back!
( if ( = ( -> obj display-state ) ( progress-screen settings ) )
2022-06-13 18:39:22 -04:00
( sound-play "menu-stats" )
( sound-play "cursor-options" )
2022-04-11 18:38:54 -04:00
)
2022-06-04 14:53:49 -04:00
( when ( = ( -> obj display-state ) ( progress-screen music-player ) )
2022-06-13 18:39:22 -04:00
( sound-group-pause ( sound-group music ) )
2022-06-04 14:53:49 -04:00
( progress-reset-music-parms ) )
2022-04-11 18:38:54 -04:00
( load-level-text-files ( -> *level-task-data* ( -> obj display-level-index ) text-group-index ) )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
2023-01-30 19:11:57 -05:00
;; LEVEL SELECT
2023-04-07 23:32:35 -04:00
( ( ( text-id training-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "game-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id village1-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "village1-warp" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id beach-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "beach-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id jungle-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "jungle-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id misty-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "misty-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id firecanyon-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "firecanyon-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id village2-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "village2-warp" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id sunken-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "sunken-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id swamp-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "swamp-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id rolling-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "rolling-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id ogre-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "ogre-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id village3-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "village3-warp" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id snow-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "snow-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id cave-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "maincave-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id lavatube-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "lavatube-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id citadel-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "citadel-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id finalboss-level-name ) )
2023-01-30 19:11:57 -05:00
( set! ( -> *game-info* current-continue ) ( get-continue-by-name *game-info* "finalboss-start" ) )
( initialize! *game-info* 'die ( the-as game-save # f ) ( the-as string # f ) )
)
;; SPEEDRUNS
;; Restart current run
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-reset-current-run ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( the-as speedrun-category # f ) )
)
;; Full game runs
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-new-full-game ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category full-game ) )
)
;; Individual Levels
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-training ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-training ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-village1 ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-village1 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-beach ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-beach ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-jungle ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-jungle ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-misty ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-misty ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-firecanyon ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-firecanyon ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-village2 ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-village2 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-sunken ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-sunken ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-swamp ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-swamp ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-rolling ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-rolling ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-ogre ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-ogre ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-village3 ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-village3 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-snow ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-snow ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-cave ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-cave ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-lavatube ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-lavatube ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-il-citadel ) )
2023-01-30 19:11:57 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category il-citadel ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-new-game-plus ) )
2023-02-26 13:42:24 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category new-game-plus ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-hub1-100 ) )
2023-02-26 13:42:24 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category hub1-100 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-hub2-100 ) )
2023-02-26 13:42:24 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category hub2-100 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-hub3-100 ) )
2023-02-26 13:42:24 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category hub3-100 ) )
)
2023-04-07 23:32:35 -04:00
( ( ( text-id speedrun-all-cutscenes ) )
2023-02-26 13:42:24 -05:00
( progress-fast-save-and-start-speedrun ( speedrun-category all-cutscenes ) )
)
2022-05-23 15:56:42 -04:00
)
2022-07-08 19:23:44 -04:00
( commit-to-file *pc-settings* )
2022-04-11 18:38:54 -04:00
;; other behaviors are hardcoded elsewhere because screw you.
)
2022-07-18 19:54:38 -04:00
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type button-music ) )
;; go to the music+flava player
( when ( find-music-log ( progress-get-music-by-index ( -> obj option-index ) ) )
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( set! *progress-music* ( -> obj option-index ) )
( push! obj )
( sound-play "select-option" )
( set! ( -> obj next-display-state ) ( progress-screen flava-player ) )
)
)
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type button-flava ) )
;; set flava
( when ( find-flava-log ( progress-get-music-by-index *progress-music* ) ( the int ( -> options ( -> obj option-index ) param1 ) ) )
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( set-setting *setting-control* obj 'music ( progress-get-music-by-index *progress-music* ) 0.0 0 )
( set! *progress-flava* ( the int ( -> options ( -> obj option-index ) param1 ) ) )
( sound-group-continue ( sound-group music ) )
( sound-play "select-option" )
)
)
2022-04-11 18:38:54 -04:00
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type resolution ) )
;; resolution button. change resolution!
( let ( ( newx ( the int ( -> options ( -> obj option-index ) param1 ) ) )
( newy ( the int ( -> options ( -> obj option-index ) param2 ) ) ) )
2023-06-13 14:26:44 -04:00
( set-size! *pc-settings* newx newy # t ) )
2022-04-11 18:38:54 -04:00
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-04-11 18:38:54 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
2022-07-08 19:23:44 -04:00
( commit-to-file *pc-settings* )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
;; TODO - might be able to simplify this with the new on-change func
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type controller ) )
( let ( ( controller-id ( the int ( -> options ( -> obj option-index ) param1 ) ) ) )
;; NOTE - for now, we only manage port 0 in the progress menu
( pc-set-controller! controller-id 0 )
)
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( sound-play "cursor-options" )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
( commit-to-file *pc-settings* )
)
2022-07-31 13:31:17 -04:00
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type monitor ) )
;; monitor button
( let ( ( monitor ( the int ( -> options ( -> obj option-index ) param1 ) ) ) )
( set-monitor! *pc-settings* monitor )
)
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( sound-play "cursor-options" )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
( commit-to-file *pc-settings* )
)
2022-04-11 18:38:54 -04:00
( ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type aspect-new ) )
2022-06-12 17:05:46 -04:00
;; aspect ratio button.
2022-04-11 18:38:54 -04:00
( let ( ( newx ( the int ( -> options ( -> obj option-index ) param1 ) ) )
( newy ( the int ( -> options ( -> obj option-index ) param2 ) ) ) )
2022-07-05 13:49:37 -04:00
( cond
2023-04-07 23:32:35 -04:00
( ( = ( -> options ( -> obj option-index ) name ) ( text-id fit-to-screen ) )
2022-07-05 13:49:37 -04:00
( set-aspect! *pc-settings* 4 3 )
( false! ( -> *pc-settings* use-vis? ) )
( set-aspect-ratio 'aspect4x3 )
( true! ( -> *pc-settings* aspect-ratio-auto? ) )
)
( ( = newx -1.0 )
( set-aspect! *pc-settings* 4 3 )
( true! ( -> *pc-settings* use-vis? ) )
( set! ( -> *setting-control* default aspect-ratio ) 'aspect4x3 )
( set-aspect-ratio 'aspect4x3 )
)
( ( = newx -2.0 )
( set-aspect! *pc-settings* 4 3 )
( true! ( -> *pc-settings* use-vis? ) )
( set! ( -> *setting-control* default aspect-ratio ) 'aspect16x9 )
( set-aspect-ratio 'aspect16x9 )
)
( else
( set-aspect! *pc-settings* newx newy ) ) ) )
2022-04-11 18:38:54 -04:00
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-07-08 19:23:44 -04:00
( commit-to-file *pc-settings* )
2022-04-11 18:38:54 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
2022-07-18 19:54:38 -04:00
( ( and ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type cheat-toggle ) )
( not ( logtest? ( -> *pc-settings* cheats-known ) ( ash 1 ( the int ( -> options ( -> obj option-index ) param1 ) ) ) ) ) )
( sound-play "cursor-options" )
( if ( and ( = *cheat-mode* 'debug ) ( cpad-hold? 0 l1 ) ( cpad-hold? 0 r1 ) )
( logior! ( -> *pc-settings* cheats-known ) ( ash 1 ( the int ( -> options ( -> obj option-index ) param1 ) ) ) ) )
)
2022-04-11 18:38:54 -04:00
( ( != ( -> options ( -> obj option-index ) option-type ) ( game-option-type yes-no ) )
;; not yes-no
;; set backups! we're entering some toggle or whatever
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type slider ) )
( set! ( -> *progress-state* slider-backup )
( -> ( the-as ( pointer float ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
( ( ( game-option-type language ) )
( set! ( -> *progress-state* language-backup )
( -> ( the-as ( pointer language-enum ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
2022-05-23 15:56:42 -04:00
( ( ( game-option-type on-off ) ( game-option-type normal-inverted ) )
2022-04-11 18:38:54 -04:00
( set! ( -> *progress-state* on-off-backup )
( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type confirmation ) )
( set! ( -> *progress-state* on-off-backup ) # f ) )
( ( ( game-option-type binding-assignment ) )
( set! *progress-pad-timeout* ( -> *display* real-frame-counter ) )
;; Inform the C++ side to start listening for input
( pc-set-waiting-for-bind! ( -> options ( -> obj option-index ) bind-info device-type )
( not ( -> options ( -> obj option-index ) bind-info for-buttons? ) )
( -> options ( -> obj option-index ) bind-info analog-min-range? )
( -> options ( -> obj option-index ) bind-info input-idx ) )
)
2022-07-18 19:54:38 -04:00
( ( ( game-option-type cheat-toggle ) )
( set! ( -> *progress-state* on-off-backup ) ( logtest? ( -> *pc-settings* cheats ) ( ash 1 ( the int ( -> options ( -> obj option-index ) param1 ) ) ) ) )
( set! ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) ( -> *progress-state* on-off-backup ) )
)
2022-04-11 18:38:54 -04:00
( ( ( game-option-type display-mode ) )
;; display-mode just reuses language stuff
2023-06-04 15:34:37 -04:00
( case ( pc-get-display-mode )
2022-04-11 18:38:54 -04:00
( ( 'windowed # f ) ( set! ( -> *progress-carousell* int-backup ) 0 ) )
( ( 'fullscreen # t ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( ( 'borderless ) ( set! ( -> *progress-carousell* int-backup ) 2 ) )
)
)
( ( ( game-option-type msaa ) )
( case ( -> *pc-settings* gfx-msaa )
( ( 2 ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( ( 4 ) ( set! ( -> *progress-carousell* int-backup ) 2 ) )
( ( 8 ) ( set! ( -> *progress-carousell* int-backup ) 3 ) )
( ( 16 ) ( set! ( -> *progress-carousell* int-backup ) 4 ) )
( else ( set! ( -> *progress-carousell* int-backup ) 0 ) )
)
)
( ( ( game-option-type lod-bg ) )
( case ( -> *pc-settings* lod-force-tfrag )
( ( 0 ) ( set! ( -> *progress-carousell* int-backup ) 0 ) )
( ( 1 2 ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( else ( set! ( -> *progress-carousell* int-backup ) 2 ) )
)
)
( ( ( game-option-type lod-fg ) )
( cond
( ( -> *pc-settings* ps2-lod-dist? ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( else ( set! ( -> *progress-carousell* int-backup ) 0 ) )
)
)
( ( ( game-option-type speaker ) )
( case ( -> *pc-settings* subtitle-speaker? )
( ( # t ) ( set! ( -> *progress-carousell* int-backup ) 0 ) )
( ( # f ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( ( 'auto ) ( set! ( -> *progress-carousell* int-backup ) 2 ) )
)
)
2022-06-24 00:43:57 -04:00
( ( ( game-option-type frame-rate ) )
2022-08-02 18:48:10 -04:00
( case ( -> *pc-settings* target-fps )
( ( 60 ) ( set! ( -> *progress-carousell* int-backup ) 0 ) )
( ( 100 ) ( set! ( -> *progress-carousell* int-backup ) 1 ) )
( ( 150 ) ( set! ( -> *progress-carousell* int-backup ) 2 ) )
2022-06-24 00:43:57 -04:00
)
)
2022-07-12 18:00:52 -04:00
( ( ( game-option-type language-subtitles ) )
( let ( ( cur-lang ( get-language-name ( -> *pc-settings* subtitle-language ) ) ) )
( dotimes ( i ( -> *subtitle-languages* length ) )
( if ( = ( -> *subtitle-languages* i ) cur-lang )
( set! ( -> *progress-carousell* int-backup ) i ) )
) )
)
( ( ( game-option-type language-text ) )
( let ( ( cur-lang ( get-language-name ( -> *pc-settings* text-language ) ) ) )
( dotimes ( i ( -> *text-languages* length ) )
( if ( = ( -> *text-languages* i ) cur-lang )
( set! ( -> *progress-carousell* int-backup ) i ) )
) )
)
2022-04-11 18:38:54 -04:00
)
2022-06-13 18:39:22 -04:00
( sound-play "select-option" )
2022-04-11 18:38:54 -04:00
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( set! ( -> obj selected-option ) # t )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type language ) )
( set! ( -> obj language-selection ) ( -> *setting-control* current language ) )
( set! ( -> obj language-direction ) # t )
( set! ( -> obj language-transition ) # f )
( set! ( -> obj language-x-offset ) 0 )
)
( else
( set! ( -> *progress-carousell* selection ) ( -> *progress-carousell* int-backup ) )
( set! ( -> *progress-carousell* direction ) # t )
( set! ( -> *progress-carousell* transition ) # f )
( set! ( -> *progress-carousell* x-offset ) 0 )
( case ( -> options ( -> obj option-index ) option-type )
( ( ( game-option-type display-mode ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-display-mode* ) )
( ( ( game-option-type msaa ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-msaa* ) )
( ( ( game-option-type lod-bg ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-lod-bg* ) )
( ( ( game-option-type lod-fg ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-lod-bg* ) )
( ( ( game-option-type speaker ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-speaker* ) )
2022-06-24 00:43:57 -04:00
( ( ( game-option-type frame-rate ) ) ( set! ( -> *progress-carousell* current-carousell ) *carousell-frame-rate* ) )
2022-07-12 18:00:52 -04:00
( ( ( game-option-type language-subtitles ) ) ( set! ( -> *progress-carousell* current-carousell ) *subtitle-languages* ) )
( ( ( game-option-type language-text ) ) ( set! ( -> *progress-carousell* current-carousell ) *text-languages* ) )
2022-04-11 18:38:54 -04:00
)
)
)
)
)
)
( else
;; an option was selected. write stuff!
2023-06-04 15:34:37 -04:00
( if ( = ( -> options ( -> obj option-index ) option-type ) ( game-option-type confirmation ) )
( if ( -> *progress-state* on-off-backup )
( sound-play "menu-stats" )
( sound-play "cursor-options" ) )
( sound-play "start-options" ) )
2022-04-11 18:38:54 -04:00
( set! ( -> obj selected-option ) # f )
( case ( -> options ( -> obj option-index ) option-type )
2022-07-18 19:54:38 -04:00
( ( ( game-option-type cheat-toggle ) )
2022-08-10 18:35:34 -04:00
( let ( ( the-cheat ( ash 1 ( the int ( -> options ( -> obj option-index ) param1 ) ) ) ) )
( cond
( ( -> ( the ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) )
( logior! ( -> *pc-settings* cheats ) the-cheat ) )
( else
( logclear! ( -> *pc-settings* cheats ) the-cheat )
( when ( and *target* ( = the-cheat ( pc-cheats invinc ) ) )
( logclear! ( -> *target* state-flags ) ( state-flags invulnerable ) ) ) ) )
)
2022-07-18 19:54:38 -04:00
)
2022-04-11 18:38:54 -04:00
( ( ( game-option-type aspect-ratio ) )
;; aspect ratio is first written to the backup. so this is for applying the change if we went through with it.
( set! ( -> *setting-control* default aspect-ratio ) ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
)
( ( ( game-option-type aspect-native ) )
( set! ( -> *pc-settings* use-vis? ) ( -> ( the-as ( pointer symbol ) ( -> options ( -> obj option-index ) value-to-modify ) ) ) )
( if ( -> *pc-settings* use-vis? )
( set! ( -> *setting-control* current aspect-ratio ) # f )
( set-aspect! *pc-settings* ( -> *pc-settings* aspect-custom-x ) ( -> *pc-settings* aspect-custom-y ) ) )
)
( ( ( game-option-type display-mode ) )
;; same thing.
( case ( -> *progress-carousell* int-backup )
2023-06-13 14:26:44 -04:00
( ( 0 ) ( set-display-mode! *pc-settings* 'windowed # t ) )
( ( 1 ) ( set-display-mode! *pc-settings* 'fullscreen # t ) )
( ( 2 ) ( set-display-mode! *pc-settings* 'borderless # t ) )
2022-04-11 18:38:54 -04:00
)
)
( ( ( game-option-type msaa ) )
( case ( -> *progress-carousell* int-backup )
( ( 0 ) ( set! ( -> *pc-settings* gfx-msaa ) 1 ) )
( ( 1 ) ( set! ( -> *pc-settings* gfx-msaa ) 2 ) )
( ( 2 ) ( set! ( -> *pc-settings* gfx-msaa ) 4 ) )
( ( 3 ) ( set! ( -> *pc-settings* gfx-msaa ) 8 ) )
( ( 4 ) ( set! ( -> *pc-settings* gfx-msaa ) 16 ) )
)
)
( ( ( game-option-type lod-bg ) )
( case ( -> *progress-carousell* int-backup )
( ( 0 ) ( set! ( -> *pc-settings* lod-force-tfrag ) 0 ) ( set! ( -> *pc-settings* lod-force-tie ) 0 ) )
( ( 1 ) ( set! ( -> *pc-settings* lod-force-tfrag ) 2 ) ( set! ( -> *pc-settings* lod-force-tie ) 2 ) )
( ( 2 ) ( set! ( -> *pc-settings* lod-force-tfrag ) 2 ) ( set! ( -> *pc-settings* lod-force-tie ) 3 ) )
)
)
( ( ( game-option-type lod-fg ) )
( case ( -> *progress-carousell* int-backup )
( ( 0 ) ( set! ( -> *pc-settings* lod-force-actor ) 0 ) ( set! ( -> *pc-settings* ps2-lod-dist? ) # f ) )
( ( 1 ) ( set! ( -> *pc-settings* lod-force-actor ) 0 ) ( set! ( -> *pc-settings* ps2-lod-dist? ) # t ) )
)
)
( ( ( game-option-type language-subtitles ) )
2022-07-12 18:00:52 -04:00
( let ( ( lang ( assoc ( the binteger ( -> *subtitle-languages* ( -> *progress-carousell* int-backup ) ) ) *language-remap-info-pc* ) ) )
2023-06-07 20:04:16 -04:00
( set! ( -> *pc-settings* subtitle-language ) ( the pc-language ( / ( the int ( cadr lang ) ) 8 ) ) )
2022-07-12 18:00:52 -04:00
)
)
( ( ( game-option-type language-text ) )
( let ( ( lang ( assoc ( the binteger ( -> *text-languages* ( -> *progress-carousell* int-backup ) ) ) *language-remap-info-pc* ) ) )
2023-06-07 20:04:16 -04:00
( set! ( -> *pc-settings* text-language ) ( the pc-language ( / ( the int ( cadr lang ) ) 8 ) ) )
2022-07-12 18:00:52 -04:00
)
( if ( not ( -> *progress-carousell* transition ) )
( load-level-text-files ( -> obj display-level-index ) ) )
2022-04-11 18:38:54 -04:00
)
( ( ( game-option-type speaker ) )
;; same thing.
( case ( -> *progress-carousell* int-backup )
( ( 0 ) ( set! ( -> *pc-settings* subtitle-speaker? ) # t ) )
( ( 1 ) ( set! ( -> *pc-settings* subtitle-speaker? ) # f ) )
( ( 2 ) ( set! ( -> *pc-settings* subtitle-speaker? ) 'auto ) )
)
)
2022-06-24 00:43:57 -04:00
( ( ( game-option-type frame-rate ) )
( case ( -> *progress-carousell* int-backup )
2023-06-13 14:26:44 -04:00
( ( 0 ) ( set-frame-rate! *pc-settings* 60 # t ) )
( ( 1 ) ( set-frame-rate! *pc-settings* 100 # t ) )
( ( 2 ) ( set-frame-rate! *pc-settings* 150 # t ) )
2022-06-24 00:43:57 -04:00
)
( set-video-mode ( -> *setting-control* default video-mode ) )
)
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
;; if the option has a `on-confirm` function, run it
( when ( nonzero? ( -> options ( -> obj option-index ) on-confirm ) )
( ( -> options ( -> obj option-index ) on-confirm ) ) )
2022-07-08 19:23:44 -04:00
( commit-to-file *pc-settings* )
2022-04-11 18:38:54 -04:00
)
)
)
)
)
)
( none )
)
2022-06-02 21:40:37 -04:00
( defmethod respond-memcard progress ( ( obj progress ) )
"logic for handling input in memcard screens."
2022-07-14 21:37:03 -04:00
2022-06-02 21:40:37 -04:00
( let ( ( s5-0 ( -> obj card-info ) ) )
( when ( and s5-0 ( not ( -> obj in-transition ) ) )
( when ( or ( cpad-pressed? 0 x ) ( cpad-pressed? 0 circle ) )
( cpad-clear! 0 x )
( cpad-clear! 0 circle )
( case ( -> obj display-state )
( ( ( progress-screen load-game ) )
( cond
( ( < ( -> obj option-index ) 4 )
( when ( nonzero? ( -> s5-0 file ( -> obj option-index ) present ) )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> *progress-state* which ) ( -> obj option-index ) )
( set! ( -> obj next-display-state ) ( progress-screen memcard-loading ) )
)
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen save-game ) ( progress-screen save-game-title ) )
( cond
( ( < ( -> obj option-index ) 4 )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> *progress-state* which ) ( -> obj option-index ) )
2022-08-20 10:41:03 -04:00
;; save slot selected
2022-06-02 21:40:37 -04:00
( if ( zero? ( -> s5-0 file ( -> obj option-index ) present ) )
( set! ( -> obj next-display-state ) ( progress-screen memcard-saving ) )
( set! ( -> obj next-display-state ) ( progress-screen memcard-data-exists ) )
)
)
2022-08-20 10:41:03 -04:00
;; continue without saving
2022-06-02 21:40:37 -04:00
( ( and ( = ( -> obj display-state ) ( progress-screen save-game-title ) ) ( = ( -> obj option-index ) 4 ) )
2022-06-13 18:39:22 -04:00
( sound-play "starts-options" )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( set! ( -> *game-info* mode ) 'play )
2023-08-02 19:44:54 -04:00
( if ( = ( -> *pc-settings* speedrunner-mode? ) # t )
;; Start a new game differently if speedrunning mode is active
( speedrun-start-full-game-run )
;; start the game normally
( initialize! *game-info* 'game ( the-as game-save # f ) "intro-start" ) )
( set-master-mode 'game ) )
2022-06-02 21:40:37 -04:00
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen memcard-insert ) )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
( ( ( progress-screen memcard-data-exists ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen memcard-saving ) )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( if ( = ( -> obj display-state-stack 0 ) ( progress-screen title ) )
( set! ( -> obj next-display-state ) ( progress-screen save-game-title ) )
( set! ( -> obj next-display-state ) ( progress-screen save-game ) )
)
)
)
)
( ( ( progress-screen memcard-no-data ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen memcard-creating ) )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( set! ( -> *game-info* mode ) 'play )
2022-08-20 10:41:03 -04:00
;; Start a new game differently if speedrunning mode is active
2022-09-02 18:15:42 -04:00
( cond ( ( -> *pc-settings* speedrunner-mode? )
2023-01-30 19:11:57 -05:00
( speedrun-start-full-game-run ) )
2022-09-02 18:15:42 -04:00
;; start the game normally
( else
( initialize! *game-info* 'game ( the-as game-save # f ) "intro-start" ) ) )
2022-06-02 21:40:37 -04:00
( set-master-mode 'game )
)
)
)
( ( ( progress-screen memcard-no-space )
( progress-screen memcard-not-inserted )
( progress-screen memcard-not-formatted )
)
( cond
( ( = ( -> obj display-state-stack 0 ) ( progress-screen title ) )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( set! ( -> *game-info* mode ) 'play )
2022-08-20 10:41:03 -04:00
;; Start a new game differently if speedrunning mode is active
2022-09-02 18:15:42 -04:00
( cond ( ( -> *pc-settings* speedrunner-mode? )
2023-01-30 19:11:57 -05:00
( speedrun-start-full-game-run ) )
2022-09-02 18:15:42 -04:00
;; start the game normally
( else
( initialize! *game-info* 'game ( the-as game-save # f ) "intro-start" ) ) )
2022-06-02 21:40:37 -04:00
( set-master-mode 'game )
)
( ( nonzero? ( -> obj display-state-stack 0 ) )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set-master-mode 'game )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen memcard-error-loading )
( progress-screen memcard-error-saving )
( progress-screen memcard-error-formatting )
( progress-screen memcard-error-creating )
( progress-screen memcard-auto-save-error )
( progress-screen memcard-removed )
( progress-screen auto-save )
2022-07-03 17:27:55 -04:00
( progress-screen memcard-auto-save-disabled )
2022-06-02 21:40:37 -04:00
)
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
( ( ( progress-screen pal-change-to-60hz ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> *setting-control* default video-mode ) ( -> *progress-state* video-mode-choice ) )
( set! ( -> obj video-mode-timeout ) ( -> *display* real-frame-counter ) )
( set! ( -> obj next-display-state ) ( progress-screen pal-now-60hz ) )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> *progress-state* video-mode-choice ) 'pal )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen pal-now-60hz ) )
( cond
( ( not ( -> *progress-state* yes-no-choice ) )
( set! ( -> *progress-state* video-mode-choice ) 'pal )
( set! ( -> *setting-control* default video-mode ) ( -> *progress-state* video-mode-choice ) )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
)
)
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
( ( ( progress-screen no-disc ) ( progress-screen bad-disc ) )
( when ( is-cd-in? )
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
( ( ( progress-screen quit ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-08-21 18:13:47 -04:00
( set! *quit-to-title* # t )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( set! ( -> *game-info* mode ) 'play )
( initialize! *game-info* 'game ( the-as game-save # f ) "title-start" )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen memcard-format ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen memcard-formatting ) )
)
( ( = ( -> obj display-state-stack 0 ) ( progress-screen title ) )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( set! ( -> *game-info* mode ) 'play )
2022-08-20 10:41:03 -04:00
;; Start a new game differently if speedrunning mode is active
2022-09-02 18:15:42 -04:00
( cond ( ( -> *pc-settings* speedrunner-mode? )
2023-01-30 19:11:57 -05:00
( speedrun-start-full-game-run ) )
2022-09-02 18:15:42 -04:00
;; start the game normally
( else
( initialize! *game-info* 'game ( the-as game-save # f ) "intro-start" ) ) )
2022-06-02 21:40:37 -04:00
( set-master-mode 'game )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
( ( ( progress-screen quit-title ) )
( cond
( ( -> *progress-state* yes-no-choice )
2022-06-13 18:39:22 -04:00
( sound-play "start-options" )
2022-08-03 21:51:13 -04:00
( commit-to-file *pc-settings* )
2022-06-02 21:40:37 -04:00
( sound-volume-off )
( kernel-shutdown )
)
( else
2022-06-13 18:39:22 -04:00
( sound-play "cursor-options" )
2022-06-02 21:40:37 -04:00
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
2022-07-03 17:27:55 -04:00
( ( ( progress-screen memcard-disable-auto-save ) )
( cond
( ( -> *progress-state* yes-no-choice )
( sound-play "start-options" )
( set! ( -> *setting-control* default auto-save ) # f )
( set! ( -> obj next-display-state ) ( progress-screen memcard-auto-save-disabled ) )
)
( else
( sound-play "cursor-options" )
( set! ( -> obj next-display-state ) ( progress-screen invalid ) )
)
)
)
2022-06-02 21:40:37 -04:00
)
)
)
)
0
( none )
)
2022-04-11 18:38:54 -04:00
( defmethod draw-options progress ( ( obj progress ) ( arg0 int ) ( arg1 int ) ( arg2 float ) )
"common logic for drawing options menus."
( let ( ( options ( -> *options-remap* ( -> obj display-state ) ) ) )
( when options
;; this menu has options to draw omg
( let* ( ( line-amt ( if ( > ( length options ) PROGRESS_PC_PAGE_HEIGHT ) ( 1- PROGRESS_PC_PAGE_HEIGHT ) ( length options ) ) )
( y-off ( - arg0 ( / ( * arg1 line-amt ) 2 ) ) )
( option-count 0 )
( unkx 27 )
( unk2 0 )
( font ( new 'stack 'font-context *font-default-matrix* 0 0 0.0 ( font-color default ) ( font-flags shadow kerning ) ) )
2023-04-07 23:32:35 -04:00
( locked-str ( lookup-text! *common-text* ( text-id locked ) # f ) )
2022-04-11 18:38:54 -04:00
)
;; set the common params for the text drawing
( set-width! font 370 )
( set-height! font 25 )
( set! ( -> font flags ) ( font-flags shadow kerning middle left large ) )
2022-06-04 14:53:49 -04:00
;; set scroll arrow sprite vertical position right now
( set! ( -> obj particles 32 init-pos y ) ( the float ( * 2 ( - y-off 20 ) ) ) )
2022-04-11 18:38:54 -04:00
;; when scrolling we draw an extra line
( cond
( ( progress-scrolling-down? ) ( set! y-off ( + ( - y-off arg1 ) ( * ( the float arg1 ) ( - 1.0 ( -> *progress-scroll* transition ) ) ) ) ) )
( ( progress-scrolling-up? ) ( set! y-off ( + ( - y-off arg1 ) ( * ( the float arg1 ) ( -> *progress-scroll* transition ) ) ) ) )
)
( let ( ( draw-arrows ( and ( not ( -> obj in-transition ) )
( = ( -> obj next-state name ) 'progress-normal )
( > ( length options ) PROGRESS_PC_PAGE_HEIGHT )
( < ( mod ( -> *display* real-frame-counter ) ( seconds 0.2 ) ) ( seconds 0.1 ) ) ) )
( draw-prev ( < 0 *progress-scroll-start* ) )
( draw-next ( > ( length options ) *progress-scroll-end* ) ) )
( set! ( -> obj particles 32 init-pos x ) ( the float ( if ( and draw-arrows draw-prev )
( - 195 ( -> *progress-process* 0 left-x-offset ) )
-320
) ) )
( set! ( -> obj particles 33 init-pos x ) ( the float ( if ( and draw-arrows draw-next )
( - 195 ( -> *progress-process* 0 left-x-offset ) )
-320
) ) )
)
2022-06-04 14:53:49 -04:00
;; cheating a bit and putting some screen-specific code here. it's not a big deal.
( case ( -> obj display-state )
( ( ( progress-screen music-player ) )
( set-color! font ( font-color default ) )
2022-06-25 11:05:20 -04:00
( set-origin! font ( - 17 ( -> obj left-x-offset ) ) 14 )
2022-06-04 14:53:49 -04:00
( set-scale! font ( * 0.6 ( -> obj transition-percentage-invert ) ) )
2023-04-07 23:32:35 -04:00
( print-game-text ( lookup-text! *common-text* ( text-id select-level ) # f ) font # f ( the int ( * 128.0 ( -> obj transition-percentage-invert ) ) ) 22 )
2022-06-04 14:53:49 -04:00
)
( ( ( progress-screen flava-player ) )
( set-color! font ( font-color default ) )
2022-06-25 11:05:20 -04:00
( set-origin! font ( - 17 ( -> obj left-x-offset ) ) 14 )
2022-06-04 14:53:49 -04:00
( set-scale! font ( * 0.6 ( -> obj transition-percentage-invert ) ) )
2023-04-07 23:32:35 -04:00
( print-game-text ( lookup-text! *common-text* ( text-id select-flava ) # f ) font # f ( the int ( * 128.0 ( -> obj transition-percentage-invert ) ) ) 22 )
2022-06-04 14:53:49 -04:00
)
)
2022-04-11 18:38:54 -04:00
( dotimes ( index ( length options ) )
2023-06-04 15:34:37 -04:00
( let ( ( option-str ( the string # f ) ) ;; the option text
( option-x 17 )
( option-y y-off )
( locked? # f )
)
;; Check if the option should be disabled
( when ( and ( nonzero? ( -> options index option-disabled-func ) )
( != ( -> options index option-disabled-func ) # f )
( ( -> options index option-disabled-func ) ) )
( set! locked? # t ) )
( case ( -> options index option-type )
( ( ( game-option-type yes-no ) )
;; yes-no option. text is either '->YES<- NO' or 'YES ->NO<-', not the most robust but this option is a strange hack anyway.
( if ( -> ( the-as ( pointer uint32 ) ( -> options index value-to-modify ) ) )
( set! option-str ( string-format "~30L~S~0L ~S" ( lookup-text! *common-text* ( text-id yes ) # f ) ( lookup-text! *common-text* ( text-id no ) # f ) ) )
( set! option-str ( string-format "~0L~S ~30L~S" ( lookup-text! *common-text* ( text-id yes ) # f ) ( lookup-text! *common-text* ( text-id no ) # f ) ) )
)
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
;; menu option or simple button. just draw its text!
( ( ( game-option-type menu ) ( game-option-type button ) )
( if ( nonzero? ( -> options index name ) )
( set! option-str ( lookup-text! *common-text* ( -> options index name ) # f ) )
( set! option-str # f ) )
;; if autosave disabled, update text and lock it
( when ( and ( not ( -> *setting-control* default auto-save ) )
( = ( text-id disable-auto-save ) ( -> options index name ) ) )
( set! option-str ( lookup-text! *common-text* ( text-id auto-save-disabled ) # f ) )
( true! locked? ) )
;; checkpoint-select only unlocked after beating finalboss
( when ( and ( not ( task-closed? ( game-task finalboss-movies ) ( task-status need-reminder ) ) )
( = ( text-id checkpoint-select ) ( -> options index name ) ) )
( set! option-str ( lookup-text! *common-text* ( text-id cheat-req-beat-game ) # f ) )
( true! locked? ) )
)
( ( ( game-option-type button-music ) )
;; a button for the music player. has the text "locked" sometimes!
( if ( and ( nonzero? ( -> options index name ) ) ( find-music-log ( progress-get-music-by-index index ) ) )
( set! option-str ( lookup-text! *common-text* ( -> options index name ) # f ) )
( set! option-str locked-str )
)
)
( ( ( game-option-type button-flava ) )
;; a button for the flava player. has the text "locked" sometimes!
( if ( and ( nonzero? ( -> options index name ) ) ( find-flava-log ( progress-get-music-by-index *progress-music* ) ( the int ( -> options index param1 ) ) ) )
( set! option-str ( lookup-text! *common-text* ( -> options index name ) # f ) )
( set! option-str locked-str )
)
)
( ( ( game-option-type resolution ) ( game-option-type aspect-new ) )
;; resolution settings
( set! option-str ( string-format ( lookup-text! *common-text* ( -> options index name ) # f )
( the int ( -> options index param1 ) ) ( the int ( -> options index param2 ) ) ) )
)
( ( ( game-option-type monitor ) )
;; monitor list
( if ( nonzero? ( -> options index name-override ) )
( set! option-str
( string-format "~S (~D)"
( -> options index name-override )
( + 1 ( the int ( -> options index param1 ) ) ) ) )
( set! option-str
( string-format ( lookup-text! *common-text* ( -> options index name ) # f )
( + 1 ( the int ( -> options index param1 ) ) ) ) ) )
)
( ( ( game-option-type controller ) )
;; controller list
( if ( nonzero? ( -> options index name-override ) )
( set! option-str
( string-format "~S (~D)"
( -> options index name-override )
( + 1 ( the int ( -> options index param1 ) ) ) ) )
( set! option-str
( string-format ( lookup-text! *common-text* ( -> options index name ) # f )
( + 1 ( the int ( -> options index param1 ) ) ) ) ) )
)
( else
( cond
( ( and ( -> obj selected-option ) ( = ( -> obj option-index ) index ) )
;; this option is SELECTED!
( set-color! font ( font-color default ) )
( set! ( -> font origin x ) ( the float ( - option-x ( -> obj left-x-offset ) ) ) )
( set! ( -> font origin y ) ( the float ( + y-off -8 ) ) )
( set-scale! font 0.6 )
;; we use the binding name for the selected text header
( if ( = ( -> options index option-type ) ( game-option-type binding-assignment ) )
;; display timeout in seconds
( let ( ( time-left ( the int ( + 11.0 ( * ( / 1.0 TICKS_PER_SECOND ) ( * -1.0 ( - ( -> *display* real-frame-counter ) *progress-pad-timeout* ) ) ) ) ) ) )
;; if the timeout is over, unselect the option
( when ( <= time-left 0 )
( set! ( -> obj selected-option ) # f )
( sound-play "menu-stats" )
( pc-stop-waiting-for-bind! ) )
( when ( not ( pc-waiting-for-bind? ) )
( set! ( -> obj selected-option ) # f )
( sound-play "cursor-options" ) )
( print-game-text ( string-format "~S (~4L~D~0L)" ( -> options index name-override ) time-left ) font # f 128 22 ) )
( print-game-text ( lookup-text! *common-text* ( -> options index name ) # f ) font # f 128 22 ) )
( set! option-y ( + y-off 7 ) )
( case ( -> options index option-type )
( ( ( game-option-type slider ) )
;; draw a slider and its text.
;; this ugliness is just decompiler stuff. all it does is fade the alpha according to value.
( let* ( ( v1-82 ( the-as uint #x8000ffff ) )
;; calculate the percentage of the bar based on the actual range, instead of assuming 0-100
;; low = param1 / high = param2
;; (actual + abs(low)) / (high + abs(low)) = percentage
( percentage ( / ( + ( -> ( the-as ( pointer float ) ( -> options index value-to-modify ) ) )
( fabs ( -> options index param1 ) ) )
( + ( -> options index param2 )
( fabs ( -> options index param1 ) ) ) ) )
( a0-34 ( logior ( logand v1-82 -256 ) ( shr ( shl ( the int ( + 64.0 ( * 191.0 percentage ) ) ) 56 ) 56 ) ) )
( color ( logior ( logand a0-34 -65281 ) ( shr ( shl ( shr ( shl a0-34 56 ) 56 ) 56 ) 48 ) ) )
)
( draw-percent-bar ( - 75 ( -> obj left-x-offset ) ) ( + y-off 8 ) percentage ( the-as rgba color ) )
( set! option-x ( + ( the int ( * 2.5 ( * 100.0 percentage ) ) )
-100 ) )
)
( if ( = ( -> options index slider-show-decimal? ) # t )
( set! option-str ( string-format "~,,1f" ( -> ( the-as ( pointer float ) ( -> options index value-to-modify ) ) ) ) )
( set! option-str ( string-format "~D" ( the int ( -> ( the-as ( pointer float ) ( -> options index value-to-modify ) ) ) ) ) ) )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type on-off )
( game-option-type normal-inverted )
( game-option-type aspect-native )
)
;; on-off option or some other toggle. same logic as yes-no. changed to cut down code duping.
( let ( ( on-str ( case ( -> options index option-type )
( ( ( game-option-type on-off ) ( game-option-type aspect-native ) )
( lookup-text! *common-text* ( text-id on ) # f ) )
( ( ( game-option-type normal-inverted ) )
( lookup-text! *common-text* ( text-id inverted ) # f ) ) ) )
( off-str ( case ( -> options index option-type )
( ( ( game-option-type on-off ) ( game-option-type aspect-native ) )
( lookup-text! *common-text* ( text-id off ) # f ) )
( ( ( game-option-type normal-inverted ) )
( lookup-text! *common-text* ( text-id normal ) # f ) ) ) ) )
( if ( -> ( the-as ( pointer symbol ) ( -> options index value-to-modify ) ) )
( set! option-str ( string-format "~30L~S~0L ~S" on-str off-str ) )
( set! option-str ( string-format "~0L~S ~30L~S" on-str off-str ) ) ) )
)
;; the same as yes-no, but we aren't changing an underlying value.
( ( ( game-option-type confirmation ) )
( if ( -> *progress-state* on-off-backup )
( set! option-str ( string-format "~30L~S~0L ~S" ( lookup-text! *common-text* ( text-id yes ) # f ) ( lookup-text! *common-text* ( text-id no ) # f ) ) )
( set! option-str ( string-format "~0L~S ~30L~S" ( lookup-text! *common-text* ( text-id yes ) # f ) ( lookup-text! *common-text* ( text-id no ) # f ) ) ) ) )
( ( ( game-option-type cheat-toggle ) )
2022-04-11 18:38:54 -04:00
( if ( -> ( the-as ( pointer symbol ) ( -> options index value-to-modify ) ) )
2023-06-04 15:34:37 -04:00
( set! option-str ( string-format "~30L~S~0L ~S" ( lookup-text! *common-text* ( text-id on ) # f ) ( lookup-text! *common-text* ( text-id off ) # f ) ) )
( set! option-str ( string-format "~0L~S ~30L~S" ( lookup-text! *common-text* ( text-id on ) # f ) ( lookup-text! *common-text* ( text-id off ) # f ) ) )
2022-04-11 18:38:54 -04:00
)
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type binding-assignment ) )
( let ( ( bind ( pc-get-current-bind ( -> options index bind-info ) ) ) )
( cond
( ( = bind # f )
( set! option-str ( string-format "~S" ( lookup-text! *common-text* ( text-id input-opts-binds-unset ) # f ) ) ) )
( ( string= bind "unknown" )
( set! option-str ( string-format "~S" ( lookup-text! *common-text* ( text-id input-opts-binds-unknown ) # f ) ) ) )
( else
( set! option-str ( string-format "~S" bind ) ) ) ) ) )
( ( ( game-option-type display-mode )
( game-option-type msaa )
( game-option-type lod-bg )
( game-option-type lod-fg )
( game-option-type speaker )
( game-option-type frame-rate )
( game-option-type language-subtitles )
( game-option-type language-text )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
;; crunched down to one generic function.
( progress-draw-carousell-from-string-list ( -> *progress-carousell* current-carousell ) font y-off ( -> ( the-as ( pointer int ) ( -> options index value-to-modify ) ) ) )
)
( ( ( game-option-type language ) )
;; language carousell. who knew this could be so complicated.
( let ( ( old-lang ( -> obj language-selection ) )
( new-lang ( -> ( the-as ( pointer language-enum ) ( -> options index value-to-modify ) ) ) )
( max-lang 6 )
)
( if ( -> obj language-transition )
( seekl! ( -> obj language-x-offset ) 200 ( the int ( * 10.0 ( -> *display* time-adjust-ratio ) ) ) ) )
( when ( >= ( -> obj language-x-offset ) 100 )
( set! ( -> obj language-selection ) new-lang )
( set! old-lang new-lang )
( set! ( -> obj language-transition ) # f )
( set! ( -> obj language-x-offset ) 0 )
)
( set! ( -> font origin y ) ( the float ( + y-off 3 ) ) )
( set-color! font ( font-color progress-blue ) )
0
( let ( ( next-lang ( mod ( + old-lang 1 ) max-lang ) )
( prev-lang ( mod ( + max-lang -1 old-lang ) max-lang ) )
;; these are used during the transition since it technically allows you to see 4 langs at once.
( next2-lang ( mod ( + old-lang 2 ) max-lang ) )
( prev2-lang ( mod ( + max-lang -2 old-lang ) max-lang ) )
)
( cond
( ( -> obj language-direction )
( let ( ( a2-22 ( - 200 ( + ( -> obj language-x-offset ) 100 ) ) ) )
( print-language-name prev-lang font a2-22 # f )
)
( set-color! font ( font-color progress-blue ) )
( let ( ( a2-23 ( + ( -> obj language-x-offset ) 100 ) ) )
2022-04-11 18:38:54 -04:00
( cond
2023-06-04 15:34:37 -04:00
( ( < a2-23 150 )
( print-language-name ( the int next-lang ) font a2-23 # t )
)
2022-04-11 18:38:54 -04:00
( else
2023-06-04 15:34:37 -04:00
( let ( ( a2-24 ( - 200 ( -> obj language-x-offset ) ) ) )
( print-language-name prev2-lang font a2-24 # f )
2022-04-11 18:38:54 -04:00
)
)
)
)
2023-06-04 15:34:37 -04:00
)
( else
( let ( ( a2-25 ( + ( -> obj language-x-offset ) 100 ) ) )
( cond
( ( < a2-25 150 )
( print-language-name prev-lang font a2-25 # f )
)
( else
( let ( ( a2-26 ( - 200 ( -> obj language-x-offset ) ) ) )
( print-language-name ( the int next2-lang ) font a2-26 # t )
)
)
)
)
( set-color! font ( font-color progress-blue ) )
( let ( ( a2-27 ( - 200 ( + ( -> obj language-x-offset ) 100 ) ) ) )
( print-language-name ( the int next-lang ) font a2-27 # t )
)
2022-04-11 18:38:54 -04:00
)
)
)
2023-06-04 15:34:37 -04:00
( if ( not ( -> obj language-transition ) )
( set-color! font ( font-color progress-selected ) ) )
( print-language-name ( the-as int old-lang ) font ( -> obj language-x-offset ) ( -> obj language-direction ) )
) )
( ( ( game-option-type aspect-ratio ) )
;; same as on-off but checks a different symbol
( if ( = ( -> ( the-as ( pointer symbol ) ( -> options index value-to-modify ) ) ) 'aspect4x3 )
( set! option-str ( string-format "~30L~S~0L ~S" ( lookup-text! *common-text* ( text-id 4x3 ) # f ) ( lookup-text! *common-text* ( text-id 16x9 ) # f ) ) )
( set! option-str ( string-format "~0L~S ~30L~S" ( lookup-text! *common-text* ( text-id 4x3 ) # f ) ( lookup-text! *common-text* ( text-id 16x9 ) # f ) ) )
)
2022-04-11 18:38:54 -04:00
)
)
2023-06-04 15:34:37 -04:00
)
( else
;; this option is not selected :-(
( case ( -> options index option-type )
( ( ( game-option-type slider )
( game-option-type aspect-ratio )
( game-option-type display-mode )
( game-option-type msaa )
( game-option-type lod-bg )
( game-option-type lod-fg )
( game-option-type speaker )
( game-option-type frame-rate )
( game-option-type normal-inverted )
( game-option-type confirmation )
)
;; slider and aspect ratio options just show their text
( set! option-str ( lookup-text! *common-text* ( -> options index name ) # f ) )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type on-off ) ( game-option-type aspect-native ) )
;; on-off options show their text + on or off
( set! option-str ( string-format "~S: ~S" ( lookup-text! *common-text* ( -> options index name ) # f )
( if ( -> ( the-as ( pointer uint32 ) ( -> options index value-to-modify ) ) )
( lookup-text! *common-text* ( text-id on ) # f )
( lookup-text! *common-text* ( text-id off ) # f )
) ) )
)
( ( ( game-option-type binding-assignment ) )
;; binding assignment options show their input + the current binding
( let ( ( bind ( pc-get-current-bind ( -> options index bind-info ) ) ) )
( cond
( ( = bind # f )
( set! option-str ( string-format "~S: ~10L~S~0L"
( -> options index name-override )
( lookup-text! *common-text* ( text-id input-opts-binds-unset ) # f ) ) ) )
( ( string= bind "unknown" )
( set! option-str ( string-format "~S: ~10L~S~0L"
( -> options index name-override )
( lookup-text! *common-text* ( text-id input-opts-binds-unknown ) # f ) ) ) )
( else
( set! option-str ( string-format "~S: ~10L~S~0L"
( -> options index name-override )
bind ) ) ) ) ) )
( ( ( game-option-type cheat-toggle ) )
( cond
( ( not ( logtest? ( -> *pc-settings* cheats-known ) ( ash 1 ( the int ( -> options index param1 ) ) ) ) )
( true! locked? )
( case ( ash 1 ( the int ( -> options index param1 ) ) )
( ( ( pc-cheats eco-blue )
( pc-cheats eco-green )
( pc-cheats eco-red )
( pc-cheats eco-yellow )
( pc-cheats invinc )
( pc-cheats huge-head )
( pc-cheats mirror )
( pc-cheats no-tex )
)
( set! option-str ( lookup-text! *common-text* ( text-id cheat-req-100-percent ) # f ) ) )
( ( ( pc-cheats sky )
( pc-cheats sidekick-blue )
( pc-cheats tunes )
( pc-cheats big-head )
( pc-cheats small-head )
( pc-cheats big-fist )
( pc-cheats big-head-npc )
)
( set! option-str ( lookup-text! *common-text* ( text-id cheat-req-beat-game ) # f ) ) )
( else
;; (format 0 "weird case ~f #x~x~%" (-> options index param1) (ash 1 (the int (-> options index param1))))
( set! option-str locked-str ) )
)
)
( else
( set! option-str ( string-format "~S: ~S" ( lookup-text! *common-text* ( -> options index name ) # f )
( if ( logtest? ( -> *pc-settings* cheats ) ( ash 1 ( the int ( -> options index param1 ) ) ) )
( lookup-text! *common-text* ( text-id on ) # f )
( lookup-text! *common-text* ( text-id off ) # f )
) ) )
)
2022-07-18 19:54:38 -04:00
)
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
( ( ( game-option-type language ) )
;; language options show their text + language name
( set! option-str ( string-format "~S: ~S" ( lookup-text! *common-text* ( -> options index name ) # f )
( lookup-text! *common-text* ( -> *language-name-remap* ( -> ( the-as ( pointer uint64 ) ( -> options index value-to-modify ) ) ) ) # f ) ) )
)
( ( ( game-option-type language-subtitles ) )
( set! option-str ( string-format "~S: ~S" ( lookup-text! *common-text* ( -> options index name ) # f )
( lookup-text! *common-text* ( get-language-name ( -> *pc-settings* subtitle-language ) ) # f ) ) )
)
( ( ( game-option-type language-text ) )
( set! option-str ( string-format "~S: ~S" ( lookup-text! *common-text* ( -> options index name ) # f )
( lookup-text! *common-text* ( get-language-name ( -> *pc-settings* text-language ) ) # f ) ) )
)
)
)
) )
)
( when ( or ( <= ( length options ) PROGRESS_PC_PAGE_HEIGHT )
( and ( not ( progress-scrolling? ) )
( >= index *progress-scroll-start* )
( < index *progress-scroll-end* ) )
( and ( progress-scrolling-down? )
( >= index ( 1- *progress-scroll-start* ) )
( < index *progress-scroll-end* ) )
( and ( progress-scrolling-up? )
( >= index *progress-scroll-start* )
( < index ( 1+ *progress-scroll-end* ) ) )
)
( when option-str
;; draw the actual text!
( let ( ( f0-23 ( -> obj transition-percentage-invert ) )
( scroll-amt ( -> *progress-scroll* transition ) ) )
( cond
( ( or ( and ( progress-scrolling-up? ) ( = index *progress-scroll-start* ) )
( and ( progress-scrolling-down? ) ( = index ( 1- *progress-scroll-end* ) ) ) )
)
( ( or ( and ( progress-scrolling-down? ) ( = index ( 1- *progress-scroll-start* ) ) )
( and ( progress-scrolling-up? ) ( = index *progress-scroll-end* ) ) )
( set! scroll-amt ( - 1.0 scroll-amt ) )
)
( else
( set! scroll-amt 1.0 )
)
)
( set-color! font ( cond
( ( and ( != index ( -> obj option-index ) )
( or locked? ( = locked-str option-str ) ) )
;; for "locked" options!
( font-color menu-invalid ) )
( ( and ( = index ( -> obj option-index ) )
( not ( or ( progress-scrolling? ) ( -> obj in-transition ) ) ) )
( font-color progress-selected ) )
( else
( font-color default ) )
) )
( set! ( -> font origin x ) ( the float ( - option-x ( -> obj left-x-offset ) ) ) )
( set! ( -> font origin y ) ( the float ( the int ( * ( the float option-y ) ( if ( -> options index scale )
f0-23
1.0
) ) ) ) )
( set-scale! font ( * arg2 f0-23 scroll-amt ) )
( print-game-text option-str font # f ( the int ( * 128.0 f0-23 scroll-amt ) ) 22 )
2022-04-11 18:38:54 -04:00
)
)
2023-06-04 15:34:37 -04:00
( +! y-off arg1 )
( +! option-count 1 )
)
) )
2022-04-11 18:38:54 -04:00
)
)
)
0
( none )
)
2023-01-30 19:11:57 -05:00
( defun draw-memcard-speedrun-options ( ( obj progress ) ( arg0 font-context ) )
( set-scale! arg0 0.85 )
( set-flags! arg0 ( font-flags shadow kerning middle left large ) )
( set-origin! arg0 ( - 20 ( -> obj left-x-offset ) ) 30 )
( set-width! arg0 360 )
2023-05-24 01:57:05 -04:00
( set-color! arg0 ( font-color progress-blue ) )
2023-01-30 19:11:57 -05:00
( set-height! arg0 20 )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id speedrun-options-heading ) # f )
2023-01-30 19:11:57 -05:00
( -> obj transition-percentage-invert ) arg0 128 )
( set-scale! arg0 0.6 )
( set-flags! arg0 ( font-flags shadow kerning middle left large ) )
( set-origin! arg0 ( - 20 ( -> obj left-x-offset ) ) 60 )
( set-width! arg0 360 )
( set-height! arg0 20 )
2023-05-24 01:57:05 -04:00
( set-color! arg0 ( font-color progress-yellow ) )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id speedrun-options-warning ) # f )
2023-01-30 19:11:57 -05:00
( -> obj transition-percentage-invert ) arg0 128 )
0 )
2022-07-03 17:27:55 -04:00
( defun draw-memcard-auto-save-disabled ( ( obj progress ) ( arg0 font-context ) )
( set-scale! arg0 0.6 )
( set-flags! arg0 ( font-flags shadow kerning middle left large ) )
( set-origin! arg0 ( - 20 ( -> obj left-x-offset ) ) 38 )
( set-width! arg0 360 )
( set-height! arg0 20 )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id autosave-disabled-title ) # f )
2022-07-03 17:27:55 -04:00
( -> obj transition-percentage-invert ) arg0 128 )
( set! ( -> arg0 origin y ) 72.0 )
( set-width! arg0 360 )
( set-height! arg0 60 )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id autosave-disabled-msg ) # f )
2022-07-03 17:27:55 -04:00
( -> obj transition-percentage-invert ) arg0 128 )
( set-scale! arg0 0.65 )
( set! ( -> arg0 origin y ) 120.0 )
( set-height! arg0 60 )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id continue? ) # f )
2022-07-03 17:27:55 -04:00
( -> obj transition-percentage-invert ) arg0 128 )
0 )
( defun draw-memcard-disable-auto-save ( ( obj progress ) ( arg0 font-context ) )
( set-origin! arg0 ( - 50 ( -> obj left-x-offset ) ) 70 )
( set-scale! arg0 0.6 )
( set-width! arg0 300 )
( set-height! arg0 40 )
( set-flags! arg0 ( font-flags shadow kerning middle left large ) )
2023-04-07 23:32:35 -04:00
( print-game-text-scaled ( lookup-text! *common-text* ( text-id disable-auto-save-query ) # f )
2022-07-03 17:27:55 -04:00
( -> obj transition-percentage-invert ) arg0 128 )
0 )
2022-06-02 21:40:37 -04:00
( defmethod draw-notice-screen progress ( ( obj progress ) )
( hide-progress-icons )
( when *common-text*
( let ( ( a1-1 ( new 'stack 'font-context *font-default-matrix* ( - 70 ( -> obj left-x-offset ) ) 10 0.0
( font-color default ) ( font-flags shadow kerning ) ) ) )
( case ( -> obj display-state )
( ( ( progress-screen memcard-format ) )
( draw-memcard-format obj a1-1 )
)
( ( ( progress-screen memcard-no-space )
( progress-screen memcard-not-inserted )
( progress-screen memcard-not-formatted )
)
( draw-memcard-storage-error obj a1-1 )
)
( ( ( progress-screen memcard-data-exists ) )
( draw-memcard-data-exists obj a1-1 )
)
( ( ( progress-screen memcard-no-data ) )
( draw-memcard-no-data obj a1-1 )
)
( ( ( progress-screen memcard-loading )
( progress-screen memcard-saving )
( progress-screen memcard-formatting )
( progress-screen memcard-creating )
)
( draw-memcard-accessing obj a1-1 )
)
( ( ( progress-screen memcard-insert ) )
( draw-memcard-insert obj a1-1 )
)
( ( ( progress-screen load-game ) ( progress-screen save-game ) ( progress-screen save-game-title ) )
( draw-memcard-file-select obj a1-1 )
)
( ( ( progress-screen memcard-auto-save-error ) )
( draw-memcard-auto-save-error obj a1-1 )
)
( ( ( progress-screen memcard-removed ) )
( draw-memcard-removed obj a1-1 )
)
( ( ( progress-screen memcard-error-loading )
( progress-screen memcard-error-saving )
( progress-screen memcard-error-formatting )
( progress-screen memcard-error-creating )
)
( draw-memcard-error obj a1-1 )
)
( ( ( progress-screen auto-save ) )
( draw-auto-save obj a1-1 )
)
( ( ( progress-screen pal-change-to-60hz ) )
( draw-pal-change-to-60hz obj a1-1 )
)
( ( ( progress-screen pal-now-60hz ) )
( draw-pal-now-60hz obj a1-1 )
)
( ( ( progress-screen no-disc ) )
( draw-no-disc obj a1-1 )
)
( ( ( progress-screen bad-disc ) )
( draw-bad-disc obj a1-1 )
)
( ( ( progress-screen quit ) ( progress-screen quit-title ) )
( draw-quit obj a1-1 )
)
2022-07-03 17:27:55 -04:00
( ( ( progress-screen memcard-disable-auto-save ) )
( draw-memcard-disable-auto-save obj a1-1 )
)
( ( ( progress-screen memcard-auto-save-disabled ) )
( draw-memcard-auto-save-disabled obj a1-1 )
)
2023-01-30 19:11:57 -05:00
( ( ( progress-screen speedrun-options ) )
( draw-memcard-speedrun-options obj a1-1 )
)
2022-06-02 21:40:37 -04:00
)
)
)
0
( none )
)
2022-04-11 18:38:54 -04:00
;; override the post handler for progress-normal
2022-07-14 21:37:03 -04:00
( set! ( -> progress-normal post )
2022-04-11 18:38:54 -04:00
( lambda :behavior progress ( )
( when ( progress-scrolling? )
2022-07-12 18:00:52 -04:00
( seek! ( -> *progress-scroll* transition ) 1.0 ( * ( / 1.75 512 ) ( -> self transition-speed ) ( -> *display* time-adjust-ratio ) ) )
2022-04-11 18:38:54 -04:00
)
( when ( != ( -> self display-state ) ( -> *progress-scroll* last-screen ) )
( progress-scroll-reset )
( set! ( -> *progress-scroll* last-screen ) ( -> self display-state ) )
)
;; draw the menus!!
( let* ( ( a1-0 ( -> self display-level-index ) )
( gp-0 ( -> *level-task-data* a1-0 ) )
( unk # t )
( stats? # f )
)
( case ( -> self display-state )
( ( ( progress-screen fuel-cell ) )
( set! stats? # t )
( draw-fuel-cell-screen self a1-0 )
)
( ( ( progress-screen money ) )
( set! stats? # t )
( draw-money-screen self a1-0 )
)
( ( ( progress-screen buzzer ) )
( set! stats? # t )
( draw-buzzer-screen self a1-0 )
)
( ( ( progress-screen graphic-settings )
( progress-screen settings-title )
( progress-screen title )
2022-07-12 18:00:52 -04:00
( progress-screen sound-settings )
2022-04-11 18:38:54 -04:00
( progress-screen game-ps2-options )
( progress-screen resolution )
( progress-screen aspect-ratio )
2022-06-04 14:53:49 -04:00
( progress-screen secrets )
2022-07-18 19:54:38 -04:00
( progress-screen cheats )
2022-07-31 13:31:17 -04:00
( progress-screen monitor )
2022-04-11 18:38:54 -04:00
)
( hide-progress-icons )
( draw-options self 115 25 0.82 )
)
2022-10-22 13:26:50 -04:00
( ( ( progress-screen settings )
( progress-screen settings-title )
)
( hide-progress-icons )
( draw-options self 115 25 0.78 )
)
2022-07-12 18:00:52 -04:00
( ( ( progress-screen misc-options ) )
( hide-progress-icons )
( draw-options self 115 25 0.79 )
)
2022-06-04 14:53:49 -04:00
( ( ( progress-screen music-player ) )
( hide-progress-icons )
( draw-options self 128 21 0.82 )
)
( ( ( progress-screen flava-player ) )
( hide-progress-icons )
( draw-options self 128 21 0.82 )
)
2023-01-30 19:11:57 -05:00
( ( ( progress-screen speedrun-options ) )
( hide-progress-icons )
( draw-notice-screen self )
( draw-options self 155 25 0.65 )
)
2023-02-26 13:42:24 -05:00
( ( ( progress-screen camera-options ) ( progress-screen checkpoint-select ) ( progress-screen speedrun-il-options ) ( progress-screen speedrun-cat-ext-options ) )
2022-04-11 18:38:54 -04:00
;; camera options lines are a bit too big
( hide-progress-icons )
2022-06-04 14:53:49 -04:00
( draw-options self 115 25 0.65 )
2022-04-11 18:38:54 -04:00
)
2023-06-04 15:34:37 -04:00
( ( ( progress-screen input-options )
( progress-screen select-controller )
( progress-screen controller-binds )
( progress-screen keyboard-binds )
( progress-screen mouse-binds )
( progress-screen controller-options )
( progress-screen mouse-options )
( progress-screen reassign-binds-options ) )
( hide-progress-icons )
( draw-options self 115 25 0.65 )
)
2022-04-11 18:38:54 -04:00
( ( ( progress-screen gfx-ps2-options ) )
( hide-progress-icons )
2023-01-24 15:22:47 -05:00
( draw-options self 115 25 0.67 )
2022-04-11 18:38:54 -04:00
)
2022-07-12 18:00:52 -04:00
( ( ( progress-screen game-settings ) )
2022-04-11 18:38:54 -04:00
( hide-progress-icons )
2022-10-22 13:26:50 -04:00
( draw-options self 115 25 0.70 )
2022-04-11 18:38:54 -04:00
)
( ( ( progress-screen memcard-removed ) ( progress-screen memcard-auto-save-error ) )
( draw-notice-screen self )
( draw-options self 192 0 0.82 )
)
2022-07-03 17:27:55 -04:00
( ( ( progress-screen memcard-no-data ) ( progress-screen memcard-auto-save-disabled ) )
2022-04-11 18:38:54 -04:00
( draw-notice-screen self )
( draw-options self 165 0 0.82 )
)
( ( ( progress-screen memcard-format ) )
( draw-notice-screen self )
( draw-options self 172 0 0.82 )
)
( ( ( progress-screen memcard-no-space )
( progress-screen memcard-not-inserted )
( progress-screen memcard-not-formatted )
)
( draw-notice-screen self )
( draw-options self 195 0 0.82 )
)
( ( ( progress-screen memcard-error-loading )
( progress-screen memcard-error-saving )
( progress-screen memcard-error-formatting )
( progress-screen memcard-error-creating )
( progress-screen memcard-auto-save-error )
( progress-screen auto-save ) ( progress-screen load-game ) ( progress-screen save-game )
)
( draw-notice-screen self )
( draw-options self 190 0 0.82 )
)
( ( ( progress-screen no-disc ) ( progress-screen bad-disc ) )
( draw-notice-screen self )
( if ( is-cd-in? )
( draw-options self 170 0 0.82 )
)
)
2022-07-03 17:27:55 -04:00
( ( ( progress-screen quit )
( progress-screen quit-title )
( progress-screen memcard-disable-auto-save ) )
2022-04-11 18:38:54 -04:00
( draw-notice-screen self )
( draw-options self 110 0 0.82 )
)
( ( ( progress-screen memcard-insert ) )
( draw-notice-screen self )
( draw-options self 165 0 0.82 )
)
( ( ( progress-screen memcard-data-exists ) )
( draw-notice-screen self )
( draw-options self 168 0 0.82 )
)
( ( ( progress-screen memcard-loading )
( progress-screen memcard-saving )
( progress-screen memcard-formatting )
( progress-screen memcard-creating )
)
( draw-notice-screen self )
)
( ( ( progress-screen save-game-title ) )
( draw-notice-screen self )
( draw-options self 169 15 0.6 )
)
2023-06-04 15:34:37 -04:00
( else
( format 0 "PROGRESS - You forgot to add a `progress-screen` case to draw options!" ) )
2022-04-11 18:38:54 -04:00
)
( when stats?
( let* ( ( v1-98 ( cond ( ( -> self stat-transition ) 0 )
( ( = ( -> self level-transition ) 1 ) ( - ( -> self transition-offset ) ) )
( else ( -> self transition-offset ) )
) )
( f30-0 ( the-as float ( if ( -> self stat-transition )
1.0
( -> self transition-percentage-invert )
) ) )
( s5-1 ( new 'stack 'font-context *font-default-matrix*
( - 32 ( -> self left-x-offset ) )
( the int ( * ( + 42.0 ( the float ( / v1-98 2 ) ) ) f30-0 ) )
8325000.0
2023-05-24 01:57:05 -04:00
( font-color progress-blue )
2022-04-11 18:38:54 -04:00
( font-flags shadow kerning )
) )
)
( set-width! s5-1 328 )
( set-height! s5-1 45 )
( set! ( -> s5-1 flags ) ( font-flags shadow kerning middle left large ) )
( print-game-text-scaled ( lookup-text! *common-text* ( -> gp-0 level-name-id ) # f ) f30-0 s5-1 ( the int ( * 128.0 f30-0 ) ) )
)
)
)
( case ( -> self display-state )
( ( ( progress-screen fuel-cell ) ( progress-screen money ) ( progress-screen buzzer ) )
( draw-progress self )
)
)
( adjust-sprites self )
( adjust-icons self )
( none )
) )
;; override the enter handler for progress-going-out
2022-07-14 21:37:03 -04:00
( set! ( -> progress-going-out enter )
2022-04-11 18:38:54 -04:00
( lambda :behavior progress ( )
2022-06-13 18:39:22 -04:00
( sound-play "menu-close" )
2022-04-11 18:38:54 -04:00
( hide-progress-icons )
2022-06-12 12:23:08 -04:00
( remove-setting! 'music )
( apply-settings *setting-control* )
2022-06-04 14:53:49 -04:00
( progress-reset-music-parms )
2022-04-11 18:38:54 -04:00
( commit-to-file *pc-settings* )
( set! ( -> self particles 3 init-pos x ) -320.0 )
( set! ( -> self particles 4 init-pos x ) -320.0 )
( set! ( -> self particles 32 init-pos x ) -320.0 )
( set! ( -> self particles 33 init-pos x ) -320.0 )
( case ( -> self display-state )
( ( ( progress-screen load-game ) ( progress-screen save-game ) ( progress-screen save-game-title ) )
( set! ( -> self transition-speed ) 30.0 )
)
)
( none )
) )
2022-05-31 22:19:37 -04:00
;; these need to be overridden as well
( set! ( -> progress-going-out post ) ( -> progress-normal post ) )
( set! ( -> progress-coming-in post ) ( -> progress-normal post ) )
2022-04-11 18:38:54 -04:00
2022-06-02 21:40:37 -04:00
;; override this as well...
( set! ( -> progress-normal code )
( lambda :behavior progress ( )
( loop
( when ( and ( cpad-hold? 0 l1 ) ( cpad-hold? 0 r1 ) *cheat-mode* )
( when ( and ( < ( -> self task-index ) ( -> *level-task-data* ( -> self display-level-index ) nb-of-tasks ) )
( >= ( -> self task-index ) 0 )
)
( let ( ( gp-0 ( -> *level-task-data* ( -> self display-level-index ) task-info ( -> self task-index ) task-id ) ) )
( close-specific-task! gp-0 ( task-status need-resolution ) )
2023-01-30 19:11:57 -05:00
( send-event *target* 'get-pickup ( pickup-type fuel-cell ) ( the float gp-0 ) )
2022-06-02 21:40:37 -04:00
)
)
)
( if ( and ( = ( -> self display-state ) ( -> self next-display-state ) )
( = ( -> self display-level-index ) ( -> self next-level-index ) )
)
( seekl!
( -> self transition-offset )
0
( * ( the int ( * ( -> self transition-speed ) ( -> *display* time-adjust-ratio ) ) )
( if ( or ( -> self stat-transition ) ( nonzero? ( -> self level-transition ) ) )
2
1
)
)
)
( seekl!
( -> self transition-offset )
512
( * ( the int ( * ( -> self transition-speed ) ( -> *display* time-adjust-ratio ) ) )
( if ( or ( -> self stat-transition ) ( nonzero? ( -> self level-transition ) ) )
2
1
)
)
)
)
( set-transition-progress! self ( -> self transition-offset ) )
( set! ( -> self in-transition ) ( or ( -> self force-transition ) ( nonzero? ( -> self transition-offset ) ) ) )
( when ( and ( not ( handle->process ( -> *game-info* auto-save-proc ) ) )
( or ( -> self force-transition ) ( -> self in-transition ) )
( >= ( -> self transition-offset ) ( if ( and ( zero? ( -> self level-transition ) )
( nonzero? ( -> self next-display-state ) )
( != ( -> self next-display-state ) 1 )
( != ( -> self next-display-state ) 2 )
)
512
256
)
)
)
( if ( >= ( the-as int ( -> self next-display-state ) ) 0 )
( enter! self ( -> self next-display-state ) 0 )
( pop! self )
)
( set! ( -> self display-level-index ) ( -> self next-level-index ) )
( when ( nonzero? ( -> self level-transition ) )
( set! ( -> self task-index ) ( get-next-task-up -1 ( -> self display-level-index ) ) )
( case ( -> self level-transition )
( ( 1 )
( set! ( -> self level-transition ) 2 )
)
( ( 2 )
( set! ( -> self level-transition ) 1 )
)
)
)
( set! ( -> self force-transition ) # f )
)
( when ( zero? ( -> self transition-offset ) )
( set! ( -> self stat-transition ) # f )
( set! ( -> self level-transition ) 0 )
0
)
( let ( ( gp-1 # f ) )
( let ( ( v1-62 # f ) )
( case ( -> self display-state )
( ( ( progress-screen fuel-cell ) ( progress-screen money ) ( progress-screen buzzer ) )
( let ( ( s5-0 ( -> self display-level-index ) ) )
( when ( and ( < ( mod ( -> *display* real-frame-counter ) ( seconds 0.2 ) ) ( seconds 0.1 ) )
( zero? ( -> *progress-process* 0 in-out-position ) )
( not ( -> self in-transition ) )
( zero? ( -> self transition-offset ) )
)
( set! gp-1 ( != s5-0 ( get-next-level-up s5-0 ) ) )
( set! v1-62 ( != s5-0 ( get-next-level-down s5-0 ) ) )
)
)
)
)
( set! ( -> self particles 3 init-pos x ) ( the float ( if v1-62
( - 195 ( -> *progress-process* 0 left-x-offset ) )
-320
)
)
)
)
( set! ( -> self particles 4 init-pos x ) ( the float ( if gp-1
( - 195 ( -> *progress-process* 0 left-x-offset ) )
-320
)
)
)
)
( respond-common self )
( set! ( -> self next-display-state ) ( set-memcard-screen self ( -> self next-display-state ) ) )
( let ( ( v1-74 ( -> self display-state ) ) )
( cond
( ( or ( = v1-74 ( progress-screen fuel-cell ) )
( or ( = v1-74 ( progress-screen money ) ) ( = v1-74 ( progress-screen buzzer ) ) )
)
( respond-progress self )
)
( ( or ( = v1-74 ( progress-screen memcard-no-space ) )
( = v1-74 ( progress-screen memcard-format ) )
( = v1-74 ( progress-screen memcard-data-exists ) )
( = v1-74 ( progress-screen memcard-insert ) )
( = v1-74 ( progress-screen load-game ) )
( = v1-74 ( progress-screen save-game ) )
( = v1-74 ( progress-screen save-game-title ) )
( = v1-74 ( progress-screen memcard-error-loading ) )
( = v1-74 ( progress-screen memcard-error-saving ) )
( = v1-74 ( progress-screen memcard-error-formatting ) )
( = v1-74 ( progress-screen memcard-error-creating ) )
( = v1-74 ( progress-screen memcard-auto-save-error ) )
( = v1-74 ( progress-screen memcard-removed ) )
( = v1-74 ( progress-screen memcard-no-data ) )
( = v1-74 ( progress-screen memcard-not-inserted ) )
( = v1-74 ( progress-screen memcard-not-formatted ) )
( = v1-74 ( progress-screen auto-save ) )
( = v1-74 ( progress-screen pal-change-to-60hz ) )
( = v1-74 ( progress-screen pal-now-60hz ) )
( = v1-74 ( progress-screen no-disc ) )
( = v1-74 ( progress-screen bad-disc ) )
( = v1-74 ( progress-screen quit ) )
( = v1-74 ( progress-screen quit-title ) )
2022-07-03 17:27:55 -04:00
( = v1-74 ( progress-screen memcard-auto-save-disabled ) )
( = v1-74 ( progress-screen memcard-disable-auto-save ) )
2022-06-02 21:40:37 -04:00
)
( respond-memcard self )
)
)
)
( suspend )
)
( none )
)
)