;;-*-Lisp-*- (in-package goal) #| Additional PC port specific file for overriding/expanding the progress menu This gives us more freedom to write code how we want. |# (defun draw-previous-next ((arg0 menu-highscores-option) (arg1 font-context) (arg2 symbol)) (local-vars (sv-16 string) (sv-32 int)) (let ((s3-0 370)) (case (get-aspect-ratio) (('aspect4x3) (set! (-> arg1 origin x) 73.0) (set! (-> arg1 origin y) 308.0) (set! (-> arg1 width) 359.0) (set! (-> arg1 height) 185.0) ) (('aspect16x9) (set! (-> arg1 origin x) 82.0) (set! (-> arg1 origin y) 328.0) (set! (-> arg1 width) 355.0) (set! (-> arg1 height) 185.0) (set! s3-0 350) ) ) (when (not (-> *pc-settings* use-vis?)) (set! s3-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s3-0))) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x)))) ) (set-flags! arg1 (font-flags kerning large)) (set-color! arg1 (progress-selected 200)) (set-scale! arg1 0.6) (when (or (> (-> arg0 page-index) 0) arg2) (print-game-text (string-format "~C~S" 163 (lookup-text! *common-text* (text-id progress-next) #f)) arg1 #f 44 (bucket-id progress)) ) (set! arg2 (or (!= (-> arg0 page-index) (+ (-> arg0 num-pages) -1)) arg2)) (when arg2 (set-flags! arg1 (font-flags kerning right large)) (+! (-> arg1 origin x) (the float s3-0)) (print-game-text (string-format "~S~C" (lookup-text! *common-text* (text-id progress-next) #f) 161) arg1 #f 44 (bucket-id progress)) ) ) 0 (none) ) (deftype highscore-cup-draw-params (structure) ((cup-scale float) (cup-y int16) (y-on-later-pages int16) (cup-x int16) (font-scale float) (font-scale-on-later-pages float))) (define *highscore-cup-draw-params* (new 'static 'inline-array highscore-cup-draw-params 8 (new 'static 'highscore-cup-draw-params :cup-scale 0.25 :cup-y 174 :y-on-later-pages 180 :cup-x 112 :font-scale -1.0 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.22 :cup-y 197 :y-on-later-pages 195 :cup-x 111 :font-scale 0.5 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.20 :cup-y 217 :y-on-later-pages 210 :cup-x 110 :font-scale 0.4 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.15 :cup-y 232 :y-on-later-pages 225 :cup-x 109 :font-scale 0.3 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.15 :cup-y 244 :y-on-later-pages 239 :cup-x 109 :font-scale -1.0 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.15 :cup-y 256 :y-on-later-pages 253 :cup-x 109 :font-scale -1.0 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.15 :cup-y 268 :y-on-later-pages 266 :cup-x 109 :font-scale -1.0 :font-scale-on-later-pages 0.4) (new 'static 'highscore-cup-draw-params :cup-scale 0.15 :cup-y 280 :y-on-later-pages 280 :cup-x 109 :font-scale -1.0 :font-scale-on-later-pages 0.4))) (defun str-print-time-pc ((time float) (omit-milliseconds? symbol)) "Basically the same as str-print-time, but with hours support and can omit milliseconds uses letters for the units instead of colons which can be ambiguous" (let* ((hours (the int (/ time 3600))) (minutes (the int (/ (- time (* 3600.0 hours)) 60))) (seconds (the int (- time (* 3600.0 hours) (* 60.0 minutes)))) (milliseconds (the int (* 1000.0 (- time (the int time)))))) (clear *temp-string*) (when (> hours 0) (format *temp-string* "~Dh" hours)) (format *temp-string* "~Dm" minutes) (format *temp-string* "~Ds" seconds) (when (not omit-milliseconds?) (format *temp-string* "~Dms" milliseconds))) *temp-string*) (defun get-highscore-type ((highscore-index-arg int)) "Given a highscore index, return it's type as a symbol @param highscore-index-arg something @returns The type, as as symbol." (let ((highscore-type 'game)) (let ((highscore-index highscore-index-arg)) (cond ((and (>= highscore-index 0) (<= highscore-index 4)) (set! highscore-type 'game)) ((and (>= highscore-index 5) (<= highscore-index 12)) (set! highscore-type 'race)) ((= highscore-index 13) (set! highscore-type 'game)) ((and (>= highscore-index 15) (<= highscore-index 20)) (set! highscore-type 'speedrun)))) highscore-type)) (defun print-highscore-pc ((highscore-row print-highscore-obj) (name string)) (local-vars (font-ctx font-context) (cup-x-offset float) (sv-24 int) (sv-32 int)) (set! font-ctx (-> highscore-row context)) (set! cup-x-offset (-> highscore-row interp)) (set! sv-24 50) (set! sv-32 (if (= (get-aspect-ratio) 'aspect4x3) 320 300)) (when (not (-> *pc-settings* use-vis?)) (set! sv-32 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-32))) (set! sv-24 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-24)))) (set-flags! font-ctx (font-flags kerning large)) (+! (-> font-ctx origin x) (the float sv-24)) (let* ((draw-params (-> *highscore-cup-draw-params* (-> highscore-row place))) (cup-x (-> draw-params cup-x))) ;; correct cup x (when (not (-> *pc-settings* use-vis?)) (set! cup-x (adjust-game-x (the float cup-x)))) ;; set font scale (if (> (-> *progress-pc-generic-store* current-highscore-page-index) 0) (set-scale! font-ctx (-> draw-params font-scale-on-later-pages)) (if (> (-> draw-params font-scale) 0) (set-scale! font-ctx (-> draw-params font-scale)))) ;; move font down (when (< 0 (-> highscore-row place)) (if (> (-> *progress-pc-generic-store* current-highscore-page-index) 0) (+! (-> font-ctx origin y) (the float (- (-> draw-params y-on-later-pages) (-> *highscore-cup-draw-params* (1- (-> highscore-row place)) y-on-later-pages)))) (+! (-> font-ctx origin y) (the float (- (-> draw-params cup-y) (-> *highscore-cup-draw-params* (1- (-> highscore-row place)) cup-y)))))) ;; print highscore text (if (and (nonzero? name) (!= name #f)) (print-game-text (string-format "~S" name) font-ctx #f 44 (bucket-id progress)) (print-game-text (string-format "~S" (lookup-text! *common-text* (-> (new 'static 'boxed-array :type text-id (text-id progress-highscores-1st) (text-id progress-highscores-2nd) (text-id progress-highscores-3rd) (text-id progress-highscores-4th) (text-id progress-highscores-5th) (text-id progress-highscores-6th) (text-id progress-highscores-7th) (text-id progress-highscores-8th)) (-> highscore-row place)) #f)) font-ctx #f 44 (bucket-id progress))) ;; draw cup icon if we're not the previous page (cond ;; Just draw the cup based on the index if we're involving external times, it's not that complicated ((and (-> *pc-settings* speedrunner-mode?) (= (-> *progress-pc-generic-store* current-highscore-page-index) 0)) ;; TODO - enum (let ((place (case (-> highscore-row place) ((0) 3) ((1) 2) ((2) 1) (else 0)))) (draw-highscore-cup (-> highscore-row self) place (+ (the int cup-x-offset) cup-x) (-> draw-params cup-y) (-> draw-params cup-scale) (-> highscore-row local-scale)))) (else (when (and (= (-> *progress-pc-generic-store* current-highscore-page-index) 0) (not (-> highscore-row previous))) (draw-highscore-cup (-> highscore-row self) (eval-highscore highscore-row) (+ (the int cup-x-offset) cup-x) (-> draw-params cup-y) (-> draw-params cup-scale) (-> highscore-row local-scale)))))) (+! (-> font-ctx origin x) (the float sv-32)) (set-flags! font-ctx (font-flags kerning right large)) (cond ((-> highscore-row game-score) (print-game-text (string-format "~D" (the int (-> highscore-row score))) font-ctx #f 44 (bucket-id progress))) (else (print-game-text (str-print-time-pc (-> highscore-row score) (= 'speedrun (get-highscore-type (-> highscore-row index)))) font-ctx #f 44 (bucket-id progress)))) (set-flags! font-ctx (font-flags kerning large)) (set! (-> font-ctx origin x) (- (-> font-ctx origin x) (the float (+ sv-24 sv-32))))) (defun highscore-available? ((highscore-index int)) (let ((available? #f)) (let ((index highscore-index)) (cond ((zero? index) (set! available? #t)) ((= index 1) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node city-yellow-gun-training-introduction) flags) (game-task-node-flag closed)))) ((= index 2) (set! available? (logtest? (-> *game-info* secrets) (game-secrets gungame-blue)))) ((= index 3) (set! available? (logtest? (-> *game-info* secrets) (game-secrets gungame-dark)))) ((= index 4) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node stadium-board1-introduction) flags) (game-task-node-flag closed)))) ((= index 5) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node stadium-race-class3-introduction) flags) (game-task-node-flag closed)))) ((= index 6) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node stadium-race-class2-introduction) flags) (game-task-node-flag closed)))) ((= index 7) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node stadium-race-class1-introduction) flags) (game-task-node-flag closed)))) ((= index 8) (set! available? (or (logtest? (-> *game-info* sub-task-list (game-task-node city-burning-bush-race-port-introduction) flags) (game-task-node-flag closed)) (open? (-> *game-info* sub-task-list (game-task-node city-burning-bush-race-port-introduction)))))) ((= index 9) (set! available? (or (logtest? (-> *game-info* sub-task-list (game-task-node city-burning-bush-race-errol-introduction) flags) (game-task-node-flag closed)) (open? (-> *game-info* sub-task-list (game-task-node city-burning-bush-race-errol-introduction)))))) ((= index 10) (set! available? (logtest? (-> *game-info* secrets) (game-secrets reverse-races)))) ((= index 11) (set! available? (logtest? (-> *game-info* secrets) (game-secrets reverse-races)))) ((= index 12) (set! available? (logtest? (-> *game-info* secrets) (game-secrets reverse-races)))) ((= index 13) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node city-play-onin-game-introduction) flags) (game-task-node-flag closed)))) ((= index 14) (set! available? (logtest? (-> *game-info* sub-task-list (game-task-node city-whack-introduction) flags) (game-task-node-flag closed)))) ((and (>= index 15) (<= index 20)) (set! available? (and (-> *pc-settings* speedrunner-mode?)))))) available?)) (defun get-highscore-text ((highscore-index int)) (let ((id (text-id progress-highscores-header-race))) (let ((index highscore-index)) (cond ((and (>= index 0) (<= index 3)) (set! id (text-id progress-highscores-header-guncourse))) ((= index 4) (set! id (text-id progress-highscores-header-jetboard))) ((and (>= index 5) (<= index 12)) (set! id (text-id progress-highscores-header-race))) ((= index 13) (set! id (text-id progress-highscores-header-onin))) ((= index 14) (set! id (text-id progress-highscores-header-metalhead-mash))) ((and (>= index 15) (<= index 20)) (set! id (text-id progress-highscores-header-speedrun))))) (the-as text-id id))) (defun get-highscore-text-sub ((highscore-index int)) (let ((id (text-id progress-highscores-subheader-class1))) (let ((index highscore-index)) (cond ((zero? index) (set! id (text-id progress-highscores-subheader-scattergun))) ((= index 1) (set! id (text-id progress-highscores-subheader-blaster))) ((= index 2) (set! id (text-id progress-highscores-subheader-vulcan))) ((= index 3) (set! id (text-id progress-highscores-subheader-peacemaker))) ((= index 4) (set! id (text-id progress-highscores-subheader-stadium))) ((= index 5) (set! id (text-id progress-highscores-subheader-class3))) ((= index 6) (set! id (text-id progress-highscores-subheader-class2))) ((= index 7) (set! id (text-id progress-highscores-subheader-class1))) ((= index 8) (set! id (text-id progress-highscores-subheader-portrace))) ((= index 9) (set! id (text-id progress-highscores-subheader-cityrace))) ((= index 10) (set! id (text-id progress-highscores-subheader-class3-reverse))) ((= index 11) (set! id (text-id progress-highscores-subheader-class2-reverse))) ((= index 12) (set! id (text-id progress-highscores-subheader-class1-reverse))) ((= index 13) (set! id (text-id progress-highscores-subheader-oninstent))) ((= index 14) (set! id (text-id progress-highscores-subheader-hiphog))) ((= index 15) (set! id (text-id progress-highscores-subheader-speedrun-any))) ((= index 16) (set! id (text-id progress-highscores-subheader-speedrun-anyhoverless))) ((= index 17) (set! id (text-id progress-highscores-subheader-speedrun-allmissions))) ((= index 18) (set! id (text-id progress-highscores-subheader-speedrun-100))) ((= index 19) (set! id (text-id progress-highscores-subheader-speedrun-anyorbs))) ((= index 20) (set! id (text-id progress-highscores-subheader-speedrun-anyhero))))) (the-as text-id id))) (defun get-highscore-icon ((highscore-index int)) (let ((texture (new 'static 'texture-id :index #x10 :page #xc93))) (let ((index highscore-index)) (cond ((zero? index) (set! texture (new 'static 'texture-id :index #x10 :page #xc93))) ((= index 1) (set! texture (new 'static 'texture-id :index #x12 :page #xc93))) ((= index 2) (set! texture (new 'static 'texture-id :index #x13 :page #xc93))) ((= index 3) (set! texture (new 'static 'texture-id :index #x11 :page #xc93))) ((= index 4) (set! texture (new 'static 'texture-id :index #xe :page #xc93))) ((and (>= index 5) (<= index 12)) (set! texture (new 'static 'texture-id :index #x1 :page #xc93))) ((= index 13) (set! texture (new 'static 'texture-id :index #x16 :page #xc93))) ((= index 14) (set! texture (new 'static 'texture-id :index #x17 :page #xc93))) ;; TODO - maybe i can lookup some unique icons for the categories? Maybe some of the bigmap ones? for now just the jetboard because fast ((and (>= index 15) (<= index 20)) (set! texture (new 'static 'texture-id :index #xe :page #xc93))))) (the-as texture-id texture))) (defun get-num-highscores () (let ((count 0)) (dotimes (max-highscores (if (-> *pc-settings* speedrunner-mode?) 21 15)) (when (highscore-available? max-highscores) (+! count 1))) count)) (defun get-next-highscore ((current-highscore-index int)) (let ((max-highscores (if (-> *pc-settings* speedrunner-mode?) 21 15)) (index-change 1) (selected-index -1)) (+ current-highscore-index index-change) (while (and (= selected-index -1) (< index-change max-highscores)) (let ((s2-0 (+ current-highscore-index index-change))) (+! index-change 1) (when (highscore-available? (mod s2-0 max-highscores)) (set! selected-index (mod s2-0 max-highscores))))) (when (= selected-index -1) (set! selected-index current-highscore-index)) selected-index)) (defun get-prev-highscore ((current-highscore-index int)) (let ((max-highscores (if (-> *pc-settings* speedrunner-mode?) 21 15)) (index-change 1) (selected-index -1)) (+ current-highscore-index index-change) (while (and (= selected-index -1) (< index-change max-highscores)) (let ((curr-index (- current-highscore-index index-change))) (+! index-change 1) (when (< curr-index 0) (set! curr-index (+ max-highscores curr-index))) (let ((highscore-available-fn highscore-available?) (normalized-index (abs curr-index))) (when (highscore-available-fn normalized-index) (set! selected-index (abs curr-index)))))) (when (= selected-index -1) (set! selected-index current-highscore-index)) selected-index)) (defun get-highscore-icon-scale ((highscore-index int)) (let ((scale 1.0) (guncourse-scale 0.6) (race-scale 0.8)) (cond ((and (>= highscore-index 0) (<= highscore-index 3)) (set! scale guncourse-scale)) ((= highscore-index 4) (set! scale 0.5)) ((and (>= highscore-index 5) (<= highscore-index 12)) (set! scale race-scale)) ((= highscore-index 13) (set! scale 0.7)) ((= highscore-index 14) (set! scale 0.7)) ((and (>= highscore-index 15) (<= highscore-index 20)) (set! scale 0.5))) scale)) (defun get-highscore-icon-xoffset ((highscore-index int)) (cond ((not (-> *pc-settings* use-vis?)) (adjust-game-x 435.0)) ((= (get-aspect-ratio) 'aspect4x3) 435) (else 410))) ;; TODO: ;; - nothing found ;; - API error (defun progress-pc-get-external-time ((highscore-index int) (row-index int)) (case highscore-index ((0) (pc-get-external-highscore "scatter" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((1) (pc-get-external-highscore "blaster" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((2) (pc-get-external-highscore "vulcan" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((3) (pc-get-external-highscore "peacemaker" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((4) (pc-get-external-highscore "jetboard" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((5) (pc-get-external-race-time "class3" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((6) (pc-get-external-race-time "class2" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((7) (pc-get-external-race-time "class1" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((8) (pc-get-external-race-time "port" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((9) (pc-get-external-race-time "erol" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((10) (pc-get-external-race-time "class3rev" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((11) (pc-get-external-race-time "class2rev" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((12) (pc-get-external-race-time "class1rev" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((13) (pc-get-external-highscore "onin" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((14) (pc-get-external-highscore "mash" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((15) (pc-get-external-speedrun-time "any" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((16) (pc-get-external-speedrun-time "anyhoverless" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((17) (pc-get-external-speedrun-time "allmissions" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((18) (pc-get-external-speedrun-time "100" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((19) (pc-get-external-speedrun-time "anyorbs" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))) ((20) (pc-get-external-speedrun-time "anyhero" row-index *pc-cpp-temp-string* (&-> *progress-pc-generic-store* custom-highscore-score))))) (defun draw-highscore-page-up-down-arrows ((font-ctx font-context) (draw-up? symbol) (draw-down? symbol)) (let ((new-x-pos 58.0) (new-y-pos-up 105) (new-y-pos-down 190) (new-scale 0.5) (old-scale (-> font-ctx scale)) (old-x-pos (-> font-ctx origin x)) (old-y-pos (-> font-ctx origin y))) (when (= (get-aspect-ratio) 'aspect16x9) (set! new-x-pos 251.5) (set! new-y-pos-up 75) (set! new-y-pos-down 265)) (set! (-> font-ctx scale) new-scale) (when draw-up? (set! (-> font-ctx origin x) (the float new-x-pos)) (set! (-> font-ctx origin y) (the float new-y-pos-up)) (let ((print-text-fn print-game-text)) (format (clear *temp-string*) "~33L~C" 160) (print-text-fn *temp-string* font-ctx #f 44 (bucket-id progress)))) (when draw-down? (set! (-> font-ctx origin x) (the float new-x-pos)) (set! (-> font-ctx origin y) (the float (+ new-y-pos-up new-y-pos-down))) (let ((print-text-fn-1 print-game-text)) (format (clear *temp-string*) "~33L~C" 162) (print-text-fn-1 *temp-string* font-ctx #f 44 (bucket-id progress)))) (set! (-> font-ctx origin x) old-x-pos) (set! (-> font-ctx origin y) old-y-pos) (set! (-> font-ctx scale) old-scale)) (none)) (defun progress-pc-local-entry-label ((highscore-index int)) (if (and (>= highscore-index 5) (<= highscore-index 12)) (text-id progress-highscores-local-time) (text-id progress-highscores-local-score))) (defun progress-pc-get-next-score ((highscore-index int) (rows-already-printed int)) "Fetches the next valid score, merges with local scores. Score will be returned, name will be in [[*pc-cpp-temp-string*]] this is a bit inefficient, but it lets us avoid keeping track of state" (let ((return-next-value? #f) (local-index 0) (external-index 0) (max-local-times (progress-pc-get-num-nonzero-local-scores highscore-index)) (max-external-times (progress-pc-max-external-scores highscore-index)) (times-enumerated 0) (local-score-ptr (get-game-score-ref *game-info* (get-highscore-score highscore-index)))) ;; first check if we should return the next value (while (< times-enumerated (progress-pc-max-highscore-rows highscore-index)) (when (>= times-enumerated rows-already-printed) (set! return-next-value? #t)) (cond ;; case where both arrays have times remaining ((and (< local-index max-local-times) (< external-index max-external-times)) (progress-pc-get-external-time highscore-index external-index) (cond ((> (-> local-score-ptr local-index) (-> *progress-pc-generic-store* custom-highscore-score)) ;; local score is higher, use the local one (if return-next-value? (begin (clear *pc-cpp-temp-string*) (format *pc-cpp-temp-string* "~S~S" "~[~1L" (lookup-text! *common-text* (progress-pc-local-entry-label highscore-index) #f)) (return (-> local-score-ptr local-index))) (inc! local-index))) (else ;; otherwise, use the external one (if return-next-value? (begin (return (-> *progress-pc-generic-store* custom-highscore-score))) (inc! external-index))))) ;; case where we only have local times left ((< local-index max-local-times) (if return-next-value? (begin (clear *pc-cpp-temp-string*) (format *pc-cpp-temp-string* "~S~S" "~[~1L" (lookup-text! *common-text* (progress-pc-local-entry-label highscore-index) #f)) (return (-> local-score-ptr local-index))) (inc! local-index))) ;; case where we only have external times left ((< external-index max-external-times) (progress-pc-get-external-time highscore-index external-index) (if return-next-value? (return (-> *progress-pc-generic-store* custom-highscore-score)) (inc! external-index)))) (inc! times-enumerated)) -1.0)) (defmethod draw-option ((this menu-highscores-option) (progress progress) (font-ctx font-context) (option-index int) (selected? symbol)) (let ((alpha (fmax 0.0 (* 2.0 (- 0.5 (-> progress menu-transition))))) (padding 20.0) (icon-scale 0.22) (line-width 395.0) (old-font-origin-x (-> font-ctx origin x)) (ui-boundary (new 'stack-no-clear 'hud-box)) (highscore-row (new 'stack 'print-highscore-obj)) (row-width 0.0) (unknown-todo 0.0)) (if (not (-> *pc-settings* use-vis?)) (*! padding (-> *pc-settings* aspect-ratio-reciprocal))) (if (not (-> *pc-settings* use-vis?)) (*! line-width (-> *pc-settings* aspect-ratio-reciprocal))) (set! row-width (* (-> progress sliding) line-width)) (set! unknown-todo (* (-> progress sliding-off) (-> this slide-dir) line-width)) (cond ((or (= *pc-waiting-on-rpc?* #t) (not (-> *bigmap* progress-minimap))) (draw-busy-loading font-ctx)) (else ;; initial font parameters (set! (-> font-ctx alpha) alpha) (set-scale! font-ctx 1.0) (set-flags! font-ctx (font-flags kerning middle large)) (set-color! font-ctx (font-color progress)) ;; set up for decoration text (set! (-> font-ctx origin x) 59.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x))))) (set! (-> font-ctx origin y) 78.0) (set! (-> font-ctx width) line-width) (set! (-> font-ctx height) 215.0) ;; set the scissor region (begin-scissor ui-boundary progress) ;; set up for highscore icon (set! (-> this sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x3 :page #xc93))) (set! (-> this sprites 0 flags) (the-as uint 4)) (set! (-> this sprites 0 scale-x) icon-scale) (set! (-> this sprites 0 scale-y) icon-scale) (let ((icon-sprite (-> this sprites 0 color2))) (set! (-> icon-sprite 0) 128) (set! (-> icon-sprite 1) 128) (set! (-> icon-sprite 2) 128) (set! (-> icon-sprite 3) (the int (* 128.0 alpha))) ) (set! (-> this sprites 0 pos z) #xfffff0) (set! (-> this sprites 0 pos w) 0) ;; draw decoration text (if (text-language? spanish) (draw-decoration this font-ctx alpha (text-id progress-root-highscores) #t 0.8) (draw-decoration this font-ctx alpha (text-id progress-root-highscores) #t 0.95)) ;; draw scrolling arrows if applicable (when (> (progress-pc-max-highscore-rows (-> this page-index)) 8) (draw-highscore-page-up-down-arrows font-ctx (> (-> *progress-pc-generic-store* current-highscore-page-index) 0) (< (* (inc (-> *progress-pc-generic-store* current-highscore-page-index)) 8) (progress-pc-max-highscore-rows (-> this page-index))))) ;; draw highscore title (e.g 'Gun Course') (set-scale! font-ctx 0.6) (set! (-> font-ctx height) 185.0) (+! (-> font-ctx origin y) 46.0) (set! (-> font-ctx origin x) 65.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x))))) (set-width! font-ctx 367) (set-flags! font-ctx (font-flags kerning large)) (set-color! font-ctx (font-color progress-force-selected)) (set! (-> font-ctx origin x) (+ padding row-width (-> font-ctx origin x))) (set-scale! font-ctx 0.75) (when (text-language? german) (set-scale! font-ctx 0.69)) (when (text-language? french) (set-scale! font-ctx 0.72)) (when (text-language? spanish) (set-scale! font-ctx 0.65)) (print-game-text (string-format "~S" (lookup-text! *common-text* (get-highscore-text (-> this page-index)) #f)) font-ctx #f 44 (bucket-id progress)) ;; now draw highscore subtitle (e.g 'Scatter Gun') (+! (-> font-ctx origin y) 25.0) (set-scale! font-ctx 0.6) (when (text-language? french spanish) (set-scale! font-ctx 0.58)) (print-game-text (string-format "~S" (lookup-text! *common-text* (get-highscore-text-sub (-> this page-index)) #f)) font-ctx #f 44 (bucket-id progress)) ;; draw highscore icon (set! (-> font-ctx origin x) (- (-> font-ctx origin x) (+ padding row-width))) (+! (-> font-ctx origin y) 25.0) (draw-highscore-icon this (get-highscore-icon (-> this page-index)) (the int (+ (the float (get-highscore-icon-xoffset (-> this page-index))) row-width)) (get-highscore-icon-yoffset (-> this page-index)) (get-highscore-icon-scale (-> this page-index))) ;; print the scores now. (set! old-font-origin-x (-> font-ctx origin x)) (set-color! font-ctx (font-color progress)) (+! (-> font-ctx origin x) row-width) (set-scale! font-ctx 0.6) (let ((score-ptr (get-game-score-ref *game-info* (get-highscore-score (-> this page-index))))) (set! (-> highscore-row index) (-> this page-index)) (set! (-> highscore-row previous) #f) (set! (-> highscore-row self) this) (case (get-highscore-type (-> this page-index)) (('game) (set! (-> highscore-row game-score) #t)) (('race) (set! (-> highscore-row game-score) #f)) (('speedrun) (set! (-> highscore-row game-score) #f))) (set! (-> highscore-row context) font-ctx) (set! (-> highscore-row local-scale) alpha) (set! (-> highscore-row interp) row-width) ;; retrieve the scores and draw them (if (-> *pc-settings* speedrunner-mode?) (cond ((= (get-highscore-type (-> this page-index)) 'speedrun) ;; speedruns are easy, there are no local times (dotimes (row-index 8) (let ((run-index (+ row-index (* (-> *progress-pc-generic-store* current-highscore-page-index) 8)))) ;; fetch the info (progress-pc-get-external-time (-> this page-index) run-index) (set! (-> highscore-row place) row-index) (set! (-> highscore-row score) (-> *progress-pc-generic-store* custom-highscore-score)) (when (> (-> *progress-pc-generic-store* custom-highscore-score) 0) (print-highscore-pc highscore-row *pc-cpp-temp-string*))))) (else ;; races and highscores are a bit more tricky as they may have local times ;; so we merge them so you can see how you locally stack up against the competition (dotimes (row-index 8) (let* ((num-rows-already-printed (+ row-index (* (-> *progress-pc-generic-store* current-highscore-page-index) 8))) (score (progress-pc-get-next-score (-> this page-index) num-rows-already-printed))) (set! (-> highscore-row place) row-index) (set! (-> highscore-row score) score) (when (> score 0) (print-highscore-pc highscore-row *pc-cpp-temp-string*)))))) (dotimes (row-index 8) (set! (-> highscore-row place) row-index) (set! (-> highscore-row score) (-> score-ptr row-index)) (print-highscore-pc highscore-row (the-as string #f))))) (set! (-> font-ctx origin x) old-font-origin-x) ;; draw the previous highscore that was seen ;; note that we only need to know what the last one was ;; since the screen only needs to draw 2 highscores at any given time anyway ;; reset font parameters (set-scale! font-ctx 0.6) (set! (-> font-ctx origin x) 59.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x))))) (set! (-> font-ctx origin y) 78.0) (set! (-> font-ctx width) line-width) (set! (-> font-ctx height) 215.0) (set-scale! font-ctx 0.5) (set! (-> font-ctx height) 185.0) (+! (-> font-ctx origin y) 46.0) (set! (-> font-ctx origin x) 80.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x))))) (set! (-> this sprites 0 pos z) #xffffff) (set! (-> font-ctx width) line-width) (set-flags! font-ctx (font-flags kerning large)) (set-color! font-ctx (font-color progress-force-selected)) (set! (-> font-ctx origin x) (+ padding unknown-todo (-> font-ctx origin x))) (set-scale! font-ctx 0.75) (when (text-language? german) (set-scale! font-ctx 0.69)) (when (text-language? french) (set-scale! font-ctx 0.72)) (when (text-language? spanish) (set-scale! font-ctx 0.65)) (print-game-text (string-format "~S" (lookup-text! *common-text* (get-highscore-text (-> this prev-page-index)) #f)) font-ctx #f 44 (bucket-id progress)) (+! (-> font-ctx origin y) 25.0) (set-scale! font-ctx 0.6) (when (text-language? french spanish) (set-scale! font-ctx 0.58)) (print-game-text (string-format "~S" (lookup-text! *common-text* (get-highscore-text-sub (-> this prev-page-index)) #f)) font-ctx #f 44 (bucket-id progress)) (set! (-> font-ctx origin x) (- (-> font-ctx origin x) (+ padding unknown-todo))) (+! (-> font-ctx origin y) 25.0) (draw-highscore-icon this (get-highscore-icon (-> this prev-page-index)) (the int (+ (the float (get-highscore-icon-xoffset (-> this page-index))) unknown-todo)) (get-highscore-icon-yoffset (-> this page-index)) (get-highscore-icon-scale (-> this page-index))) (set! old-font-origin-x (-> font-ctx origin x)) (set-color! font-ctx (font-color progress)) (+! (-> font-ctx origin x) unknown-todo) (set-scale! font-ctx 0.6) (when (< 1 (get-num-highscores)) (let ((gp-11 (get-game-score-ref *game-info* (get-highscore-score (-> this prev-page-index))))) (set! (-> highscore-row index) (-> this prev-page-index)) (set! (-> highscore-row previous) #t) (set! (-> highscore-row self) this) (case (get-highscore-type (-> this prev-page-index)) (('game) (set! (-> highscore-row game-score) #t)) (('race) (set! (-> highscore-row game-score) #f))) (set! (-> highscore-row context) font-ctx) (set! (-> highscore-row local-scale) alpha) (set! (-> highscore-row interp) row-width) ;; TODO - update this section (dotimes (s5-10 8) (set! (-> highscore-row place) s5-10) (set! (-> highscore-row score) (-> gp-11 s5-10)) (print-highscore-pc highscore-row (the-as string #f)))) (set! (-> font-ctx origin x) old-font-origin-x) (set-scale! font-ctx 0.6)) (when (< 1 (get-num-highscores)) (draw-previous-next this font-ctx #t)) (end-scissor ui-boundary 1.0)))) (none)) (defmethod draw-option ((obj menu-slider-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (local-vars (sv-48 int) (sv-64 int) (sv-80 int) (sv-96 int) (sv-112 int) (sv-128 pointer) (sv-160 rgba) (sv-176 dma-buffer) (sv-208 pointer) (sv-240 rgba) (sv-256 dma-buffer) ) (let ((s5-0 arg1) (gp-0 arg2) (bar-width 230.0) (bar-width-max 240) (icon-right-offset 242) ) (let ((f30-0 (* 2.0 (- 0.5 (-> arg0 menu-transition))))) (set! sv-48 128) (let ((s1-0 sv-48) (s0-0 9) (s2-0 157) (f28-0 2.0) (s3-0 252) ) (set! sv-64 20) (set! sv-80 0) (set! sv-96 112) (set! sv-112 127) (if (< f30-0 0.0) (set! f30-0 0.0) ) (set! (-> s5-0 alpha) f30-0) (cond ((not (-> *bigmap* progress-minimap)) (draw-busy-loading s5-0) (return 0) ) (else (set-scale! s5-0 0.6) (+! (-> s5-0 origin y) 20.0) (case (get-aspect-ratio) (('aspect4x3) (set! s2-0 157) (let ((v1-17 gp-0)) (cond ((zero? v1-17) (+! (-> s5-0 origin y) -24.0) (+! s2-0 -9) ) ((= v1-17 1) (+! (-> s5-0 origin y) -9.0) (+! s2-0 43) ) ((= v1-17 2) (+! (-> s5-0 origin y) 6.0) (+! s2-0 96) ) ) ) ) (('aspect16x9) (set! s2-0 172) (set! f28-0 2.62) (set! s0-0 5) (set! s3-0 250) (let ((v1-28 gp-0)) (cond ((zero? v1-28) (+! (-> s5-0 origin y) -20.0) (+! s2-0 -20) ) ((= v1-28 1) (+! (-> s5-0 origin y) 2.0) (+! s2-0 40) ) ((= v1-28 2) (+! (-> s5-0 origin y) 30.0) (+! s2-0 105) ) ) ) ) ) (when (not (-> *pc-settings* use-vis?)) (set! sv-48 (adjust-game-x (the float sv-48))) (set! s1-0 (adjust-game-x (the float s1-0))) (*! bar-width (-> *pc-settings* aspect-ratio-reciprocal)) (set! bar-width-max (the int (* (-> *pc-settings* aspect-ratio-reciprocal) bar-width-max))) (set! icon-right-offset (the int (* (-> *pc-settings* aspect-ratio-reciprocal) icon-right-offset))) (set! sv-64 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-64))) (set! s0-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s0-0))) (set! s3-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s3-0))) ) (set-flags! s5-0 (font-flags kerning large)) (set! (-> s5-0 origin x) (the float sv-48)) (cond (arg3 (set! sv-128 (-> obj value-to-modify)) (+! (-> s5-0 origin y) -8.0) (set-color! s5-0 (font-color progress-force-selected)) (draw-highlight (the int (+ -2.0 (-> s5-0 origin y))) 52 f30-0) (print-game-text (lookup-text! *common-text* (-> obj name) #f) s5-0 #f 44 (bucket-id progress)) (set! sv-160 (new 'static 'rgba :r (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-128)))) :g (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-128)))) :b (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-128)))) :a (the int (* 128.0 f30-0)))) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #xb :page #xc93))) (set! (-> obj sprites 0 scale-x) f28-0) (set! (-> obj sprites 0 scale-y) 0.7) (let ((v1-57 (-> obj sprites 0 color2))) (set! (-> v1-57 0) 128) (set! (-> v1-57 1) 128) (set! (-> v1-57 2) 128) (set! (-> v1-57 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 0 pos z) #x3fffff) (set! (-> obj sprites 0 pos w) 0) (set! (-> obj sprites 1 tex) (lookup-texture-by-id (new 'static 'texture-id :index #xc :page #xc93))) (set! (-> obj sprites 1 scale-x) 0.2) (set! (-> obj sprites 1 scale-y) 1.33) (let ((v1-62 (-> obj sprites 1 color2))) (set! (-> v1-62 0) 128) (set! (-> v1-62 1) 128) (set! (-> v1-62 2) 128) (set! (-> v1-62 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 1 pos z) #x3fffff) (set! (-> obj sprites 1 pos w) 0) (set! (-> obj sprites 2 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x3e :page #xc93))) (set! (-> obj sprites 2 scale-x) 1.0) (set! (-> obj sprites 2 scale-y) 1.0) (let ((v1-67 (-> obj sprites 2 color2))) (set! (-> v1-67 0) sv-80) (set! (-> v1-67 1) sv-96) (set! (-> v1-67 2) sv-112) (set! (-> v1-67 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 2 pos z) #xffffff) (set! (-> obj sprites 2 pos w) 0) (set! (-> obj sprites 3 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x3f :page #xc93))) (set! (-> obj sprites 3 scale-x) 1.0) (set! (-> obj sprites 3 scale-y) 1.0) (let ((v1-72 (-> obj sprites 3 color2))) (set! (-> v1-72 0) sv-80) (set! (-> v1-72 1) sv-96) (set! (-> v1-72 2) sv-112) (set! (-> v1-72 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 3 pos z) #xffffff) (set! (-> obj sprites 3 pos w) 0) (set-hud-piece-position! (-> obj sprites 0) s1-0 s2-0) (set-hud-piece-position! (-> obj sprites 1) (+ s1-0 (the int (* bar-width (-> (the-as (pointer float) sv-128))))) (+ s2-0 -4) ) (set-hud-piece-position! (-> obj sprites 2) (- s1-0 sv-64) (+ s2-0 -4)) (set-hud-piece-position! (-> obj sprites 3) (+ sv-64 icon-right-offset s1-0) (+ s2-0 -4)) (with-dma-buffer-add-bucket ((sv-176 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress)) (draw (-> obj sprites 0) sv-176 (-> *level* default-level)) (draw-sprite2d-xy sv-176 (+ s1-0 s0-0 (the int (* bar-width (-> (the-as (pointer float) sv-128))))) (+ s2-0 7) (- bar-width-max (the int (* bar-width (-> (the-as (pointer float) sv-128))))) 9 sv-160 ) (draw (-> obj sprites 1) sv-176 (-> *level* default-level)) (draw (-> obj sprites 2) sv-176 (-> *level* default-level)) (draw (-> obj sprites 3) sv-176 (-> *level* default-level)) ) (+! (-> s5-0 origin x) (the float s3-0)) (set-flags! s5-0 (font-flags kerning right large)) (print-game-text (string-format "~D%" (the int (* 100.0 (-> (the-as (pointer float) sv-128))))) s5-0 #f 44 (bucket-id progress)) (set-flags! s5-0 (font-flags kerning large)) ) (else (set! sv-208 (-> obj value-to-modify)) (+! (-> s5-0 origin y) -8.0) (when (text-language? german french) (set-scale! s5-0 0.56) ) (if (= (-> arg0 option-index) gp-0) (draw-highlight (the int (+ -2.0 (-> s5-0 origin y))) 24 f30-0) ) (print-game-text (lookup-text! *common-text* (-> obj name) #f) s5-0 #f 44 (bucket-id progress)) (set! sv-240 (new 'static 'rgba :r (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-208)))) :g (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-208)))) :b (the int (* 0.0 f30-0 (-> (the-as (pointer float) sv-208)))) :a (the int (* 128.0 f30-0)))) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #xb :page #xc93))) (set! (-> obj sprites 0 scale-x) f28-0) (set! (-> obj sprites 0 scale-y) 0.7) (let ((v1-140 (-> obj sprites 0 color2))) (set! (-> v1-140 0) 128) (set! (-> v1-140 1) 128) (set! (-> v1-140 2) 128) (set! (-> v1-140 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 0 pos z) #x3fffff) (set! (-> obj sprites 0 pos w) 0) (set! (-> obj sprites 1 tex) (lookup-texture-by-id (new 'static 'texture-id :index #xc :page #xc93))) (set! (-> obj sprites 1 scale-x) 0.2) (set! (-> obj sprites 1 scale-y) 1.33) (let ((v1-145 (-> obj sprites 1 color2))) (set! (-> v1-145 0) 128) (set! (-> v1-145 1) 128) (set! (-> v1-145 2) 128) (set! (-> v1-145 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 1 pos z) #x3fffff) (set! (-> obj sprites 1 pos w) 0) (set! (-> obj sprites 2 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x3e :page #xc93))) (set! (-> obj sprites 2 scale-x) 1.0) (set! (-> obj sprites 2 scale-y) 1.0) (let ((v1-150 (-> obj sprites 2 color2))) (set! (-> v1-150 0) sv-80) (set! (-> v1-150 1) sv-96) (set! (-> v1-150 2) sv-112) (set! (-> v1-150 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 2 pos z) #xffffff) (set! (-> obj sprites 2 pos w) 0) (set! (-> obj sprites 3 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x3f :page #xc93))) (set! (-> obj sprites 3 scale-x) 1.0) (set! (-> obj sprites 3 scale-y) 1.0) (let ((v1-155 (-> obj sprites 3 color2))) (set! (-> v1-155 0) sv-80) (set! (-> v1-155 1) sv-96) (set! (-> v1-155 2) sv-112) (set! (-> v1-155 3) (the int (* 128.0 f30-0))) ) (set! (-> obj sprites 3 pos z) #xffffff) (set! (-> obj sprites 3 pos w) 0) (set-hud-piece-position! (-> obj sprites 0) s1-0 s2-0) (set-hud-piece-position! (-> obj sprites 1) (+ s1-0 (the int (* bar-width (-> (the-as (pointer float) sv-208))))) (+ s2-0 -4) ) (set-hud-piece-position! (-> obj sprites 2) (- s1-0 sv-64) (+ s2-0 -4)) (set-hud-piece-position! (-> obj sprites 3) (+ sv-64 icon-right-offset s1-0) (+ s2-0 -4)) (with-dma-buffer-add-bucket ((sv-256 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress)) (draw (-> obj sprites 0) sv-256 (-> *level* default-level)) (draw-sprite2d-xy sv-256 (+ s1-0 s0-0 (the int (* bar-width (-> (the-as (pointer float) sv-208))))) (+ s2-0 7) (- bar-width-max (the int (* bar-width (-> (the-as (pointer float) sv-208))))) 9 sv-240 ) (draw (-> obj sprites 1) sv-256 (-> *level* default-level)) (draw (-> obj sprites 2) sv-256 (-> *level* default-level)) (draw (-> obj sprites 3) sv-256 (-> *level* default-level)) ) (+! (-> s5-0 origin x) (the float s3-0)) (set-flags! s5-0 (font-flags kerning right large)) (print-game-text (string-format "~D%" (the int (* 100.0 (-> (the-as (pointer float) sv-208))))) s5-0 #f 44 (bucket-id progress)) (set-flags! s5-0 (font-flags kerning large)) ) ) (if (zero? gp-0) (draw-sound-options-decoration obj s5-0 f30-0 (text-id progress-root-sound-options) #f) ) ) ) ) ) ) 0 (none) ) ;; TODO - some naming is bad here in a few spots, cleanup once i understand it more (defmethod draw-option ((obj menu-missions-option) (progress progress) (font-ctx font-context) (arg3 int) (arg4 symbol)) (local-vars (f0-50 float) (font-alpha float) (task-info-idx int) (game-task-idx int) (sv-32 int) (sv-40 int) (num-task-info int) (default-y-origin-4x3 int) (sv-256 float) (line-height float) (inprogress-task-info game-task-node-info) (completed-task-info game-task-node-info) (found-closed-task? symbol) (hud-bounds hud-box) (font-y-pos float) (font-scale float) ) (set! font-alpha (* 2.0 (- 0.5 (-> progress menu-transition)))) (set! task-info-idx 1) (set! game-task-idx 0) (set! sv-32 0) (set! sv-40 0) (set! num-task-info 0) (set! default-y-origin-4x3 95) (set! sv-256 (* 395.0 (-> progress sliding))) (set! line-height (* 44.0 (-> progress sliding-height))) (set! inprogress-task-info (new 'stack 'game-task-node-info)) (set! completed-task-info (new 'stack 'game-task-node-info)) (set! found-closed-task? #t) (set! hud-bounds (new 'stack-no-clear 'hud-box)) (set! font-y-pos (-> font-ctx origin y)) (set! font-scale (-> font-ctx scale)) (set! (-> *progress-state* current-task-index) (length (-> *game-info* sub-task-list))) (set! (-> *progress-state* current-line-index) -1) (set! (-> *progress-state* current-task) (the-as uint -1)) (set! (-> *progress-state* first-closed-line-index) -1) (set! (-> *progress-state* extra-text-state) -1) (set! (-> *progress-state* num-open-tasks-found) 0) (set! (-> *progress-state* num-closed-tasks-found) 0) (if (< font-alpha 0.0) (set! font-alpha (the-as float 0.0)) ) (set! (-> font-ctx alpha) font-alpha) (set! (-> *game-info* mission-list 0) inprogress-task-info) (set! (-> inprogress-task-info description) (text-id progress-missions-in-progress)) (set! (-> completed-task-info description) (text-id progress-missions-completed)) (while (< game-task-idx (length (-> *game-info* sub-task-list))) (let ((task-info (find-mission-text-at-index game-task-idx)) (game-task-info-array (-> *game-info* mission-list)) ) (when (!= task-info #f) (when (and (logtest? (-> task-info flags) (game-task-node-flag closed)) found-closed-task?) (set! found-closed-task? (the-as symbol #f)) (set! (-> game-task-info-array task-info-idx) completed-task-info) (set! task-info-idx (+ task-info-idx 1)) ) (set! (-> game-task-info-array task-info-idx) task-info) (set! task-info-idx (+ task-info-idx 1)) ) ) (set! game-task-idx (+ game-task-idx 1)) ) (set! num-task-info task-info-idx) (set! (-> *progress-state* total-num-tasks) task-info-idx) (sort-task-node-result num-task-info) (let ((font-ctx-1 font-ctx)) (set! (-> font-ctx-1 width) 395.0) ) (set! (-> font-ctx origin x) 60.0) (set! (-> font-ctx origin y) 80.0) (set-color! font-ctx (font-color progress)) (when (not (-> *pc-settings* use-vis?)) ;; added to fix widescreen (*! (-> font-ctx width) (-> *pc-settings* aspect-ratio-reciprocal)) (set! (-> font-ctx origin x) (the float (adjust-game-x (-> font-ctx origin x)))) ) (let ((page-idx (-> obj page-index))) (cond ((zero? page-idx) (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) ((= page-idx 1) (draw-missions-decoration obj font-ctx font-alpha (text-id progress-root-missions)) ) ) ) (begin-scissor-missions hud-bounds) (set-flags! font-ctx (font-flags kerning large)) (if (-> *pc-settings* use-vis?) (+! (-> font-ctx origin x) 20.0) (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) (+! (-> font-ctx origin x) 20.0) (case (get-aspect-ratio) (('aspect16x9) (set! (-> font-ctx origin y) 80.0) ) (('aspect4x3) (set! (-> font-ctx origin y) (the float default-y-origin-4x3)) ) ) (let ((font-ctx-4 font-ctx)) (set! (-> font-ctx-4 scale) font-scale) ) (when (zero? (-> obj page-index)) (set! game-task-idx (-> obj task-line-index)) (set! task-info-idx 0) (let ((y-offset (+ default-y-origin-4x3 44))) (set! default-y-origin-4x3 y-offset) (set! (-> font-ctx origin y) (the float (+ y-offset (the int line-height)))) ) (set! (-> font-ctx width) 340.0) (set! (-> font-ctx height) 44.0) (when (!= line-height 0.0) (set! (-> *progress-state* missions-total-spacing) 0.0) (dotimes (game-task-idx-2 game-task-idx) (let* ((game-task-info-2 (-> *game-info* mission-list game-task-idx-2)) (task-text-id (if (and (logtest? (-> game-task-info-2 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> game-task-info-2 task)) ) (-> *game-info* play-list (-> game-task-info-2 task) text-name) (-> game-task-info-2 description) ) ) (line-text (lookup-text! *common-text* task-text-id #f)) (line-padding 3.0) (print-game-text-fn print-game-text) ) (format (clear *temp-string*) "~S" line-text) (set! (-> *progress-state* missions-total-spacing) (+ line-padding (print-game-text-fn *temp-string* font-ctx #t 44 (bucket-id progress)) (-> *progress-state* missions-total-spacing) ) ) ) ) ) (set! default-y-origin-4x3 (- default-y-origin-4x3 (the int (-> *progress-state* missions-total-spacing)))) (cond ((< (-> progress sliding-height) 0.0) (let* ((game-task-info-3 (-> *game-info* mission-list game-task-idx)) (task-text-id-2 (if (and (logtest? (-> game-task-info-3 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> game-task-info-3 task)) ) (-> *game-info* play-list (-> game-task-info-3 task) text-name) (-> game-task-info-3 description) ) ) (line-text-2 (lookup-text! *common-text* task-text-id-2 #f)) ) 0.0 (let ((line-padding-2 3.0) (print-game-text-fn-2 print-game-text) ) (format (clear *temp-string*) "~S" line-text-2) (let ((f0-36 (+ line-padding-2 (print-game-text-fn-2 *temp-string* font-ctx #t 44 (bucket-id progress))))) (set! line-height (* (-> progress sliding-height) f0-36)) ) ) ) ) (else (let* ((s4-4 (-> *game-info* mission-list (+ game-task-idx -1))) (a1-27 (if (and (logtest? (-> s4-4 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-4 task))) (-> *game-info* play-list (-> s4-4 task) text-name) (-> s4-4 description) ) ) (s4-5 (lookup-text! *common-text* a1-27 #f)) ) 0.0 (let ((f30-2 3.0) (s3-4 print-game-text) ) (format (clear *temp-string*) "~S" s4-5) (let ((f0-40 (+ f30-2 (s3-4 *temp-string* font-ctx #t 44 (bucket-id progress))))) (set! line-height (* (-> progress sliding-height) f0-40)) ) ) ) ) ) (set! (-> font-ctx origin y) (the float (+ default-y-origin-4x3 (the int line-height)))) (while (and (< task-info-idx num-task-info) (< task-info-idx (+ game-task-idx 10))) (let* ((s4-6 (-> *game-info* mission-list task-info-idx)) (s3-5 (if (and (logtest? (-> s4-6 flags) (game-task-node-flag closed)) (task-complete? *game-info* (-> s4-6 task))) (-> *game-info* play-list (-> s4-6 task) text-name) (-> s4-6 description) ) ) (s5-1 (lookup-text! *common-text* s3-5 #f)) ) 0.0 (set! f0-50 (cond ((>= task-info-idx (+ game-task-idx -1)) (when (and (!= s3-5 381) (!= s3-5 380)) (let ((s3-6 print-game-text)) (format (clear *temp-string*) "~S" (lookup-text! *common-text* (if (logtest? (-> s4-6 flags) (game-task-node-flag closed)) (text-id progress-missions-icon-completed) (text-id progress-missions-icon-todo) ) #f ) ) (s3-6 *temp-string* font-ctx #f 44 (bucket-id progress)) ) ) (if (-> *pc-settings* use-vis?) (+! (-> font-ctx origin x) 20.0) (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 20.0))) (let ((f30-3 3.0) (s4-7 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) (set! f0-50 (+ f30-3 (s4-7 *temp-string* font-ctx #f 44 (bucket-id progress)))) ) (if (-> *pc-settings* use-vis?) (+! (-> font-ctx origin x) -20.0) (+! (-> font-ctx origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -20.0))) f0-50 ) (else (let ((f30-4 3.0) (s4-8 print-game-text) ) (format (clear *temp-string*) "~S" s5-1) (+ f30-4 (s4-8 *temp-string* font-ctx #t 44 (bucket-id progress))) ) ) ) ) ) (let ((v1-142 (+ default-y-origin-4x3 (the int f0-50)))) (set! default-y-origin-4x3 v1-142) (set! (-> font-ctx origin y) (the float (+ v1-142 (the int line-height)))) ) (set! task-info-idx (+ task-info-idx 1)) ) (if (zero? (-> *progress-state* total-num-tasks)) (print-game-text (lookup-text! *common-text* (text-id progress-missions-none) #f) font-ctx #f 44 (bucket-id progress) ) ) ) (end-scissor-missions hud-bounds 1.0) (draw-missions-up-down font-ctx) 0 (none) ) (defun draw-secret-list ((arg0 secret-item-option) (arg1 progress) (arg2 font-context) (arg3 int) (arg4 symbol) (arg5 float)) (let ((s4-0 (and arg4 (= arg3 1)))) 380.0 270.0 (set! (-> arg2 origin x) 100.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg2 origin x) (the float (adjust-game-x (-> arg2 origin x))))) (cond ((= s4-0 #t) (cond ((= (-> arg0 can-toggle) 'auto) ) ((not (-> arg0 can-toggle)) (case (get-aspect-ratio) (('aspect4x3) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg2 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -25.0)) (+! (-> arg2 origin x) -25.0)) ) (('aspect16x9) (+! (-> arg2 origin x) -10.0) ) ) (when (text-language? german) (set-scale! arg2 0.43) ) (print-game-text (lookup-text! *common-text* (text-id progress-secrets-go-to-title-screen) #f) arg2 #f 44 (bucket-id progress) ) ) ((and (= (-> arg0 can-toggle) #t) (logtest? (-> *game-info* secrets) (-> arg0 flag))) (set! (-> arg1 selected-option) #f) (logclear! (-> *game-info* secrets) (-> arg0 flag)) ) ((and (= (-> arg0 can-toggle) #t) (not (logtest? (-> *game-info* secrets) (-> arg0 flag)))) (logior! (-> *game-info* secrets) (-> arg0 flag)) (set! (-> arg1 selected-option) #f) ) ) ) (else (set-color! arg2 (if (= arg3 1) (progress-selected 0) (font-color progress))) (set! (-> arg2 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 75 90 ) ) ) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg2 origin x) (the float (adjust-game-x (-> arg2 origin x))))) (cond ((logtest? (-> *game-info* sub-task-list (-> arg0 avail-after) flags) (game-task-node-flag closed)) (print-game-text (string-format "~S" (lookup-text! *common-text* (-> arg0 name) #f)) arg2 #f 44 (bucket-id progress)) ) (else (print-game-text (string-format "????????") arg2 #f 44 (bucket-id progress)) ) ) (set! (-> arg2 origin x) 360.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg2 origin x) (the float (adjust-game-x (-> arg2 origin x))))) (set-color! arg2 (font-color progress)) ) ) (cond ((and (not s4-0) (not (logtest? (-> *game-info* purchase-secrets) (-> arg0 flag)))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg2 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 50)) (+! (-> arg2 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 50 45 )))) (print-game-text (string-format "~D" (-> arg0 cost)) arg2 #f 44 (bucket-id progress)) ) ((and (not s4-0) (= (-> arg0 can-toggle) #t) (logtest? (-> *game-info* secrets) (-> arg0 flag))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg2 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 50)) (+! (-> arg2 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 50 45 )))) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-on) #f)) arg2 #f 44 (bucket-id progress)) ) ((and (not s4-0) (= (-> arg0 can-toggle) #t) (not (logtest? (-> *game-info* secrets) (-> arg0 flag)))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg2 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 50)) (+! (-> arg2 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 50 45 )))) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-off) #f)) arg2 #f 44 (bucket-id progress)) ) ((and (not s4-0) (!= (-> arg0 can-toggle) #t)) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg2 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 80)) (+! (-> arg2 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 80 70 )))) (set-flags! arg2 (font-flags kerning right large)) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-secrets-unlocked) #f)) arg2 #f 44 (bucket-id progress)) (set-flags! arg2 (font-flags kerning large)) ) ) ) (none) ) (defun draw-cheat-list ((info pc-cheat-info) (progress progress) (font font-context) (draw-selected int) (selected? symbol) (sliding-y float)) (let ((selected-page? (and selected? (= draw-selected 1))) (revealed? (logtest? (-> *pc-settings* cheats-revealed) (-> info flag))) (purchased? (logtest? (-> *pc-settings* cheats-purchased) (-> info flag))) (unlocked? (logtest? (-> *pc-settings* cheats-unlocked) (-> info flag))) ) 380.0 270.0 (set! (-> font origin x) 100.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font origin x) (the float (adjust-game-x (-> font origin x))))) (cond ((= selected-page? #t) (set! (-> font origin y) 180.0) (set-height! font 116) (set-flags! font (font-flags kerning large middle middle-vert)) (case (get-aspect-ratio) (('aspect4x3) (if (not (-> *pc-settings* use-vis?)) (+! (-> font origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -25.0)) (+! (-> font origin x) -25.0)) ) (('aspect16x9) (+! (-> font origin x) -10.0) ) ) (cond ((and purchased? (not unlocked?)) (let ((unlock-text (lookup-text! *common-text* (-> info unlock) #f))) (print-game-text (case (-> info unlock) (((text-id progress-cheats-turbo-board-unlock)) (string-format unlock-text (lookup-text! *common-text* (text-id progress-missions-sewer-board) #f) (-> *pc-cheat-state* sewer-valve-target-seconds))) (((text-id progress-cheats-health-bars-unlock)) (string-format unlock-text (-> *pc-cheat-state* kill-civvie-target))) (((text-id progress-cheats-vehicle-health-bars-unlock)) (string-format unlock-text (-> *pc-cheat-state* kill-car-target))) (else unlock-text) ) font #f 44 (bucket-id progress))) ) ((= (-> info can-toggle) 'auto) ) (unlocked? (print-game-text (lookup-text! *common-text* (text-id progress-secrets-go-to-title-screen) #f) font #f 44 (bucket-id progress)) ) ) (set-flags! font (font-flags kerning large)) ) (else (set-color! font (if (= draw-selected 1) (progress-selected 0) (font-color progress))) (set! (-> font origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 75 90 ) ) ) (if (not (-> *pc-settings* use-vis?)) (set! (-> font origin x) (the float (adjust-game-x (-> font origin x))))) (cond (revealed? (print-game-text (string-format "~S" (lookup-text! *common-text* (-> info name) #f)) font #f 44 (bucket-id progress)) ) (else (print-game-text (string-format "????????") font #f 44 (bucket-id progress)) ) ) (set! (-> font origin x) 360.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> font origin x) (the float (adjust-game-x (-> font origin x))))) (set-color! font (font-color progress)) ) ) (when (not selected-page?) (cond ((and (= (-> info skill) 0) (not revealed?)) ;; no cost, not discovered yet ;; draw nothing! ) ((or (not revealed?) (not purchased?)) ;; has cost, but not discovered yet OR discovered, but needs more skill ;; show cost. (if (not (-> *pc-settings* use-vis?)) (+! (-> font origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 50)) (+! (-> font origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 50 45 )))) (print-game-text (string-format "~D" (-> info skill)) font #f 44 (bucket-id progress)) ) ((not unlocked?) ;; revealed and can afford, but not unlocked (if (not (-> *pc-settings* use-vis?)) (+! (-> font origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 80)) (+! (-> font origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 80 70 )))) (set-flags! font (font-flags kerning right large)) (print-game-text (lookup-text! *common-text* (text-id progress-cheats-locked) #f) font #f 44 (bucket-id progress)) (set-flags! font (font-flags kerning large)) ) ;; --- from here on, the cheat is fully unlocked! --- ((= (-> info can-toggle) #t) ;; simple on-off switch (if (not (-> *pc-settings* use-vis?)) (+! (-> font origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 50)) (+! (-> font origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 50 45 )))) (print-game-text (string-format "~S" (lookup-text! *common-text* (if (logtest? (-> *pc-settings* cheats) (-> info flag)) (text-id progress-on) (text-id progress-off)) #f)) font #f 44 (bucket-id progress)) ) (else ;; automatically unlocked cheat, e.g. extra menu (if (not (-> *pc-settings* use-vis?)) (+! (-> font origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 80)) (+! (-> font origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 80 70 )))) (set-flags! font (font-flags kerning right large)) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-secrets-unlocked) #f)) font #f 44 (bucket-id progress)) (set-flags! font (font-flags kerning large)) ) ) ) ) 0) (defmethod draw-option ((this menu-secret-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (let* ( (sv-16 (* 2.0 (- 0.5 (-> arg0 menu-transition)))) (hero? (logtest? (-> *game-info* secrets) (game-secrets hero-mode))) (sv-24 (the int (-> *game-info* skill-total))) (sv-32 395.0) (sv-36 25.0) (min-item (if (not hero?) 0 (-> this num-items) ) ) (max-item (if (not hero?) (-> this num-items) (+ (-> this num-items) (-> this num-hero-items)) ) ) (sliding-y (* (-> arg0 sliding) sv-36)) (item (-> this item-index)) (prev (-> this prev-item-index)) (num-pc-items (-> *pc-cheats-list* length)) (sv-120 (new 'stack-no-clear 'hud-box)) (item-y 205) (cheats-pad 1.3)) (if (< sv-16 0.0) (set! sv-16 (the-as float 0.0)) ) (cond ((or (not (-> *bigmap* progress-minimap)) (< (-> this item-index) min-item) (< (+ max-item num-pc-items) (-> this item-index))) (draw-busy-loading arg1) ) (else (if (not (-> *pc-settings* use-vis?)) (*! sv-32 (-> *pc-settings* aspect-ratio-reciprocal))) (set! (-> this sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x5 :page #xc93))) (set! (-> this sprites 0 flags) (the-as uint 4)) (set! (-> this sprites 0 scale-x) 0.64) (set! (-> this sprites 0 scale-y) 0.64) (let ((v1-32 (-> this sprites 0 color2))) (set! (-> v1-32 0) 128) (set! (-> v1-32 1) 128) (set! (-> v1-32 2) 128) (set! (-> v1-32 3) (the int (* 128.0 sv-16))) ) (set! (-> this sprites 0 pos z) #xffffff) (set! (-> this sprites 0 pos w) 0) (if (not (-> *pc-settings* use-vis?)) (set-hud-piece-position! (-> this sprites 0) (adjust-game-x 100.0) 128) (set-hud-piece-position! (-> this sprites 0) 100 128)) (with-dma-buffer-add-bucket ((s3-0 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> this sprites 0) s3-0 (-> *level* default-level)) ) (set! (-> arg1 alpha) sv-16) (set-flags! arg1 (font-flags kerning middle large)) (set-color! arg1 (font-color progress)) (set! (-> arg1 origin x) 59.0) (set! (-> arg1 width) sv-32) (set! (-> arg1 height) sv-36) (set-scale! arg1 1.0) (set! (-> arg1 origin y) 82.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x))))) (draw-decoration-secrets this arg1 sv-16 (text-id progress-root-secrets)) (set-scale! arg1 0.45) (when (text-language? japanese korean) ;; og:preserve-this text-language patch (set-scale! arg1 0.53) ) (case (get-aspect-ratio) (('aspect4x3) (set-height! arg1 185) (set! (-> arg1 origin y) 133.0) ) (('aspect16x9) (set-height! arg1 185) (set! (-> arg1 origin y) 133.0) ) ) (set-flags! arg1 (font-flags kerning large)) (set! (-> arg1 origin x) 100.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x))))) (print-game-text (string-format "x~D ~S" sv-24 (lookup-text! *common-text* (text-id progress-secrets-orb-label) #f)) arg1 #f 44 (bucket-id progress)) (set! (-> arg1 origin x) 100.0) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x))))) (set! (-> arg1 width) (if (= (get-aspect-ratio) 'aspect16x9) 332.0 366.0)) (if (not (-> *pc-settings* use-vis?)) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal))) (begin-scissor-secret sv-120 arg0) (case (get-aspect-ratio) (('aspect16x9) (set! item-y 195) ) ) (cond (arg3 (set! (-> arg1 origin y) (the float (+ (the int sliding-y) 25 item-y))) (if (< item max-item) (draw-secret-list (-> this secret-items item) arg0 arg1 1 arg3 sliding-y) (draw-cheat-list (-> *pc-cheats-list* (- item max-item)) arg0 arg1 1 arg3 sliding-y)) ) ((>= (- item prev) 0) (draw-highlight (+ item-y 22) 22 sv-16) (dotimes (i 7) (let* ((this-item (+ item -3 i))) (when (and (>= this-item min-item) (< this-item (+ max-item num-pc-items))) (set! (-> arg1 origin y) (the float (+ (the int sliding-y) (+ -50 (* i 25)) item-y))) (cond ((and (< this-item max-item) (= item max-item)) ;; slide more when transitioning between secrets and cheats (-! (-> arg1 origin y) (* (- 1.0 (-> arg0 sliding)) sv-36 cheats-pad)) ) ((and (< this-item max-item) (> item max-item)) ;; otherwise just offset, if we're in the cheats page. (-! (-> arg1 origin y) (* cheats-pad 25)) ) ((and (>= this-item max-item) (= item max-item)) ;; slide more when transitioning (+! (-> arg1 origin y) (* (-> arg0 sliding) sv-36 cheats-pad)) ) ((and (>= this-item max-item) (< item max-item)) ;; for the cheats - offset when not in them (+! (-> arg1 origin y) (* cheats-pad 25)) ) ) (when (= this-item max-item) ;; also draw section header (protect ((-> arg1 origin x) (-> arg1 origin y)) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x 100.0))) (set! (-> arg1 origin x) (if (= (get-aspect-ratio) 'aspect4x3) 100.0 115.0))) (-! (-> arg1 origin y) (+ (* (/ (- cheats-pad 1.0) 2) 25) 25)) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-cheats) #f)) arg1 #f 44 (bucket-id progress)) ) ) (if (< this-item max-item) (draw-secret-list (-> this secret-items this-item) arg0 arg1 0 arg3 sliding-y) (draw-cheat-list (-> *pc-cheats-list* (- this-item max-item)) arg0 arg1 0 arg3 sliding-y))) )) ) (else (draw-highlight (+ item-y 22) 22 sv-16) (dotimes (i 7) (let* ((this-item (+ item -2 i))) (when (and (>= this-item min-item) (< this-item (+ max-item num-pc-items))) (set! (-> arg1 origin y) (the float (+ (the int sliding-y) (+ -25 (* i 25)) item-y))) (cond ((and (< this-item max-item) (= item (1- max-item))) ;; slide more when transitioning between secrets and cheats (-! (-> arg1 origin y) (* (- (-> arg0 sliding)) sv-36 cheats-pad)) ) ((and (< this-item max-item) (>= item max-item)) ;; otherwise just offset, if we're in the cheats page. (-! (-> arg1 origin y) (* cheats-pad 25)) ) ((and (>= this-item max-item) (= item (1- max-item))) ;; slide more when transitioning (+! (-> arg1 origin y) (* (- 1.0 (- (-> arg0 sliding))) sv-36 cheats-pad)) ) ((and (>= this-item max-item) (< item max-item)) ;; for the cheats - offset when not in them (+! (-> arg1 origin y) (* cheats-pad 25)) ) ) (when (= this-item max-item) ;; also draw section header (protect ((-> arg1 origin x) (-> arg1 origin y)) (if (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x 100.0))) (set! (-> arg1 origin x) (if (= (get-aspect-ratio) 'aspect4x3) 100.0 115.0))) (-! (-> arg1 origin y) (+ (* (/ (- cheats-pad 1.0) 2) 25) 25)) (print-game-text (string-format "~S" (lookup-text! *common-text* (text-id progress-cheats) #f)) arg1 #f 44 (bucket-id progress)) ) ) (if (< this-item max-item) (draw-secret-list (-> this secret-items this-item) arg0 arg1 0 arg3 sliding-y) (draw-cheat-list (-> *pc-cheats-list* (- this-item max-item)) arg0 arg1 0 arg3 sliding-y))) )) ) ) (end-scissor-secret sv-120 1.0) (draw-up-down arg1) ) ) 0 (none) )) (defmethod draw-option ((this menu-unlocked-menu-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (let ((secrets (memcard-unlocked-secrets? #t)) (cheats (-> *pc-settings* cheats)) (alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) ) (if (< alpha 0.0) (set! alpha 0.0) ) (set-scale! arg1 0.6) (set-alpha! arg1 alpha) (when (nonzero? (-> this name)) (cond ((= arg2 (-> arg0 option-index)) (progress-selected 0) (draw-highlight (the int (+ 8.0 (-> arg1 origin y))) 24 alpha) ) (else (font-color progress) ) ) (+! (-> arg1 origin y) 8.0) (let ((available-text (lookup-text! *common-text* (-> this name) #f)) (locked-text (string-format "?????????"))) (case (-> this name) (((text-id progress-main-secrets-scrapbook)) (if (logtest? secrets (game-secrets scrap-book-1)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-mega-scrapbook)) (if (logtest? secrets (game-secrets scrap-book-2)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-scrapbook-3)) (if (logtest? secrets (game-secrets scrap-book-3)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-sceneplayer-1)) (if (logtest? secrets (game-secrets scene-player-1)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-sceneplayer-2)) (if (logtest? secrets (game-secrets scene-player-2)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-sceneplayer-3)) (if (logtest? secrets (game-secrets scene-player-3)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-hero-mode)) (if (logtest? secrets (game-secrets hero-mode)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-main-secrets-levelselect)) (if (logtest? secrets (game-secrets level-select)) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) (((text-id progress-music-player)) (if (pc-cheats? cheats music-player) (print-game-text available-text arg1 #f 44 (bucket-id progress)) (print-game-text locked-text arg1 #f 44 (bucket-id progress))) ) )) ) ) 0 (none) ) (defmacro adjust-x-if-needed (x) "adjust an x screen coord if ps2 vis is disabled" `(if (not (-> *pc-settings* use-vis?)) (adjust-game-x (the float ,x)) ,x)) (defmethod draw-option ((obj menu-memcard-slot-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (local-vars (sv-16 float) (sv-20 int) (sv-24 float) (sv-28 float) (sv-32 float) (sv-36 float) (sv-40 int) (sv-48 int) (sv-56 int) (sv-64 int) (sv-72 int) (sv-80 int) (sv-88 int) (sv-96 string) (sv-112 int) ) (set! sv-16 (* 2.0 (- 0.5 (-> arg0 menu-transition)))) (set! sv-20 (-> arg0 option-index)) (set! sv-24 (-> arg1 origin x)) (set! sv-28 (-> arg1 origin y)) (set! sv-32 (-> arg1 width)) (set! sv-36 (-> arg1 height)) (set! sv-40 (if (= (get-aspect-ratio) 'aspect4x3) 300 305 ) ) (set! sv-48 (if (= (get-aspect-ratio) 'aspect4x3) 140 140 ) ) (set! sv-56 (if (= (get-aspect-ratio) 'aspect4x3) 64 48 ) ) (set! sv-64 69) (set! sv-72 110) (set! sv-80 176) (set! sv-88 54) (if (< sv-16 0.0) (set! sv-16 (the-as float 0.0)) ) (set! (-> arg1 alpha) sv-16) (cond ((not (-> *bigmap* progress-minimap)) (draw-busy-loading arg1) (return 0) ) (else (when (not (-> *pc-settings* use-vis?)) (set! sv-40 (the int (adjust-game-x (the float sv-40)))) (set! sv-56 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-56))) ) (let ((s2-3 arg1)) (set! (-> s2-3 color) (if (= arg2 sv-20) (the-as font-color (the-as int (progress-selected 0))) (font-color progress) ) ) ) (cond ((= *save-options-title* (-> arg0 current-options)) (set! (-> arg1 origin y) 80.0) (set! (-> arg1 height) 52.0) (+! (-> arg1 origin y) (the float (* 42 (+ arg2 1)))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -100.0)) (+! (-> arg1 origin x) -100.0)) ) (else (case (get-aspect-ratio) (('aspect16x9) (set! (-> arg1 origin y) 74.0) (set! (-> arg1 height) 42.0) (+! (-> arg1 origin y) (the float (* 60 (+ arg2 1)))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -90.0)) (+! (-> arg1 origin x) -90.0)) ) (('aspect4x3) (set! (-> arg1 origin y) 74.0) (set! (-> arg1 height) 42.0) (+! (-> arg1 origin y) (the float (* 54 (+ arg2 1)))) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -90.0)) (+! (-> arg1 origin x) -90.0)) ) ) ) ) (set-vector! (-> obj box 0 color) 64 128 128 (the int (* 128.0 sv-16))) (when (= arg2 sv-20) (cond ((!= *save-options-title* (-> arg0 current-options)) (case (get-aspect-ratio) (('aspect16x9) (set! sv-64 79) (set! sv-72 110) (set! sv-80 166) (set! sv-88 62) ) ) (when (not (-> *pc-settings* use-vis?)) (set! sv-64 (the int (adjust-game-x (the float sv-64)))) (set! sv-80 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-80))) ) (draw-savegame-box obj (the float sv-64) (the float (+ sv-64 sv-80)) (the float (+ sv-72 (* sv-88 arg2))) (the float (+ sv-72 (* sv-88 arg2))) ) (when (!= arg2 3) (draw-savegame-box obj (the float sv-64) (the float (+ sv-64 sv-80)) (the float (+ sv-72 sv-88 (* sv-88 arg2))) (the float (+ sv-72 sv-88 (* sv-88 arg2))) ) (draw-savegame-box obj (the float (+ sv-64 sv-80)) (the float (+ sv-64 sv-80)) (the float (+ sv-72 sv-88 (* sv-88 arg2))) (the float (+ (* sv-88 4) 2 sv-72)) ) ) (draw-savegame-box obj (the float (+ sv-64 sv-80)) (the float (+ sv-64 sv-80)) (the float sv-72) (the float (+ sv-72 (* sv-88 arg2))) ) (with-dma-buffer-add-bucket ((s1-0 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s1-0 sv-64 (+ sv-72 (* sv-88 arg2)) sv-80 sv-88 (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 sv-16))) ) ) ) ((= *save-options-title* (-> arg0 current-options)) (set! sv-88 42) (let ((v0-13 (get-aspect-ratio))) (when (= v0-13 'aspect16x9) (set! sv-64 79) (set! sv-72 110) (set! sv-80 166) (set! sv-88 42) (draw-savegame-box obj (the float (+ sv-64 sv-80)) (the float (+ sv-64 sv-80)) (the float (+ sv-72 sv-88 (* sv-88 arg2))) (the float (+ sv-72 (* 6 sv-88))) ) ) ) (when (not (-> *pc-settings* use-vis?)) (set! sv-64 (the int (adjust-game-x (the float sv-64)))) (set! sv-80 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) sv-80))) ) (draw-savegame-box obj (the float sv-64) (the float (+ sv-64 sv-80)) (the float (+ sv-72 (* sv-88 arg2))) (the float (+ sv-72 (* sv-88 arg2))) ) (when (!= arg2 4) (draw-savegame-box obj (the float sv-64) (the float (+ sv-64 sv-80)) (the float (+ sv-72 sv-88 (* sv-88 arg2))) (the float (+ sv-72 sv-88 (* sv-88 arg2))) ) (draw-savegame-box obj (the float (+ sv-64 sv-80)) (the float (+ sv-64 sv-80)) (the float (+ sv-72 sv-88 (* sv-88 arg2))) (the float (+ (* 5 sv-88) 2 sv-72)) ) ) (draw-savegame-box obj (the float (+ sv-64 sv-80)) (the float (+ sv-64 sv-80)) (the float sv-72) (the float (+ sv-72 (* sv-88 arg2))) ) (with-dma-buffer-add-bucket ((s1-1 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s1-1 sv-64 (+ sv-72 (* sv-88 arg2)) sv-80 sv-88 (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 sv-16))) ) ) ) ) ) (cond ((and *progress-save-info* (= (-> *progress-save-info* formatted) 1) (= (-> *progress-save-info* inited) 1) (= (-> *progress-save-info* file arg2 present) 1) ) (cond ((= arg2 sv-20) (set-scale! arg1 0.8) ) (else (set-scale! arg1 0.6) ) ) (set-flags! arg1 (font-flags kerning large)) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 100)) (+! (-> arg1 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 100 105 )))) (print-game-text (string-format "~S ~D" (lookup-text! *common-text* (text-id progress-unknown-game) #f) (+ arg2 1)) arg1 #f 44 (bucket-id progress)) (set-color! arg1 (font-color progress)) (set! (-> arg1 origin x) 250.0) (set! (-> arg1 origin y) 110.0) (set! (-> arg1 width) 170.0) (set! (-> arg1 height) 190.0) (when (not (-> *pc-settings* use-vis?)) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x))))) (let ((s2-8 (-> *progress-save-info* file arg2 level-index))) (when (= arg2 sv-20) (let ((v1-199 (-> obj sprites 0 color2))) (set! (-> v1-199 0) 128) (set! (-> v1-199 1) 128) (set! (-> v1-199 2) 128) (set! (-> v1-199 3) (the int (* 128.0 sv-16))) ) (let ((v1-200 (-> obj sprites 1 color2))) (set! (-> v1-200 0) 128) (set! (-> v1-200 1) 128) (set! (-> v1-200 2) 128) (set! (-> v1-200 3) (the int (* 128.0 sv-16))) ) (set! (-> obj sprites 1 pos z) #xffffff) (set! (-> obj sprites 1 pos w) 1) (set! (-> obj sprites 1 tex) (lookup-texture-by-id (get-level-icon-id-01 s2-8))) (set! (-> obj sprites 1 scale-x) 1.0) (set! (-> obj sprites 1 scale-y) 1.0) (set-hud-piece-position! (-> obj sprites 1) sv-40 sv-48) (let ((v1-205 (-> obj sprites 2 color2))) (set! (-> v1-205 0) 128) (set! (-> v1-205 1) 128) (set! (-> v1-205 2) 128) (set! (-> v1-205 3) (the int (* 128.0 sv-16))) ) (set! (-> obj sprites 2 pos z) #xffffff) (set! (-> obj sprites 2 pos w) 1) (set! (-> obj sprites 2 tex) (lookup-texture-by-id (get-level-icon-id-02 s2-8))) (set! (-> obj sprites 2 scale-x) 1.0) (set! (-> obj sprites 2 scale-y) 1.0) (set-hud-piece-position! (-> obj sprites 2) (+ sv-40 sv-56) sv-48) (let ((v1-211 (-> obj sprites 3 color2))) (set! (-> v1-211 0) 128) (set! (-> v1-211 1) 128) (set! (-> v1-211 2) 128) (set! (-> v1-211 3) (the int (* 128.0 sv-16))) ) (set! (-> obj sprites 3 pos z) #xffffff) (set! (-> obj sprites 3 pos w) 1) (set! (-> obj sprites 3 tex) (lookup-texture-by-id (get-level-icon-id-03 s2-8))) (set! (-> obj sprites 3 scale-x) 1.0) (set! (-> obj sprites 3 scale-y) 1.0) (set-hud-piece-position! (-> obj sprites 3) sv-40 (+ sv-48 64)) (let ((v1-217 (-> obj sprites 4 color2))) (set! (-> v1-217 0) 128) (set! (-> v1-217 1) 128) (set! (-> v1-217 2) 128) (set! (-> v1-217 3) (the int (* 128.0 sv-16))) ) (set! (-> obj sprites 4 pos z) #xffffff) (set! (-> obj sprites 4 pos w) 1) (set! (-> obj sprites 4 tex) (lookup-texture-by-id (get-level-icon-id-04 s2-8))) (set! (-> obj sprites 4 scale-x) 1.0) (set! (-> obj sprites 4 scale-y) 1.0) (set-hud-piece-position! (-> obj sprites 4) (+ sv-40 sv-56) (+ sv-48 64)) (with-dma-buffer-add-bucket ((s1-7 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 1) s1-7 (-> *level* default-level)) (draw (-> obj sprites 2) s1-7 (-> *level* default-level)) (draw (-> obj sprites 3) s1-7 (-> *level* default-level)) (draw (-> obj sprites 4) s1-7 (-> *level* default-level)) ) (set-scale! arg1 0.6) (set! (-> arg1 origin x) 265.0) (set! (-> arg1 origin y) 263.0) (set! (-> arg1 width) 170.0) (set! (-> arg1 height) 52.0) (when (not (-> *pc-settings* use-vis?)) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x))))) (set! (-> obj sprites 0 scale-x) 0.7) (set! (-> obj sprites 0 scale-y) 0.7) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x4 :page #xc93))) (set-hud-piece-position! (-> obj sprites 0) (adjust-x-if-needed 265) 263) (with-dma-buffer-add-bucket ((s1-8 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) s1-8 (-> *level* default-level)) ) (+! (-> arg1 origin y) 1.0) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 28)) (+! (-> arg1 origin x) 28.0)) (let* ((v1-272 (-> *progress-save-info* file arg2 game-time0)) (v1-273 (logior (shl (-> *progress-save-info* file arg2 game-time1) 32) v1-272)) (s2-11 (/ (the-as int v1-273) #x107ac0)) ) (set! sv-112 (/ (mod (the-as int v1-273) #x107ac0) #x4650)) (print-game-text (string-format "~2,'0D:~2,'0D" s2-11 sv-112) arg1 #f 44 (bucket-id progress)) ) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x6 :page #xc93))) (set-hud-piece-position! (-> obj sprites 0) (adjust-x-if-needed 368) 263) (with-dma-buffer-add-bucket ((s1-10 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) s1-10 (-> *level* default-level)) ) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 100)) (+! (-> arg1 origin x) 100.0)) (print-game-text (string-format "~D%" (the int (-> *progress-save-info* file arg2 completion-percentage))) arg1 #f 44 (bucket-id progress)) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x5 :page #xc93))) (set-hud-piece-position! (-> obj sprites 0) (adjust-x-if-needed 368) 289) (with-dma-buffer-add-bucket ((s1-12 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) s1-12 (-> *level* default-level)) ) (+! (-> arg1 origin y) 28.0) (print-game-text (string-format "~D" (the int (-> *progress-save-info* file arg2 skill-count))) arg1 #f 44 (bucket-id progress)) (set! (-> obj sprites 0 scale-x) 0.6) (set! (-> obj sprites 0 scale-y) 0.6) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x82 :page #xc93))) (set-hud-piece-position! (-> obj sprites 0) (adjust-x-if-needed 253) 290) (with-dma-buffer-add-bucket ((s1-14 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) s1-14 (-> *level* default-level)) ) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -100)) (+! (-> arg1 origin x) -100.0)) (print-game-text (string-format "~D" (the int (-> *progress-save-info* file arg2 gem-count))) arg1 #f 44 (bucket-id progress)) ) ) ) ((and *progress-save-info* (= (-> *progress-save-info* formatted) 1) (= (-> *progress-save-info* inited) 1) (zero? (-> *progress-save-info* file arg2 present)) ) (cond ((= arg2 sv-20) (set-scale! arg1 0.8) ) (else (set-scale! arg1 0.6) ) ) (set-flags! arg1 (font-flags kerning large)) (if (not (-> *pc-settings* use-vis?)) (+! (-> arg1 origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 100)) (+! (-> arg1 origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 100 105 )))) (print-game-text (lookup-text! *common-text* (text-id progress-slot-empty) #f) arg1 #f 44 (bucket-id progress) ) ) ) (set! (-> arg1 origin x) sv-24) (set! (-> arg1 origin y) sv-28) (set! (-> arg1 width) sv-32) (set! (-> arg1 height) sv-36) (if (zero? arg2) (draw-decoration-load-save obj arg1 sv-16 (if (= (-> arg0 current) 'select-load) (text-id progress-select-file-to-load) (text-id progress-select-file-to-save) ) ) ) ) ) 0 (none) ) (defmethod draw-option ((this menu-sub-menu-option) (arg0 progress) (fnt font-context) (arg2 int) (arg3 symbol)) (let ((alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) (y (the int (+ -1.0 (-> fnt origin y)))) (height 22) ) (if (< alpha 0.0) (set! alpha 0.0) ) (set! (-> fnt alpha) alpha) (set-scale! fnt 0.6) (cond ((= *title-pc* (-> arg0 current-options)) (set-scale! fnt 0.65) (set! (-> fnt height) 25.0) (set! height 28) (-! y 4) (when (memcard-unlocked-secrets? #f) (-! (-> fnt origin y) 30.0) (set! height 28) (-! y 31) ) ) ((= *options-pc* (-> arg0 current-options)) (-! (-> fnt origin y) 20.0) (set-scale! fnt 0.85) (set! (-> fnt height) 40.0) (set! height 37) (-! y 28) ) ) (when (nonzero? (-> this name)) (set-color! fnt (if (= arg2 (-> arg0 option-index)) (the font-color (the int (progress-selected 0))) (font-color progress) ) ) (cond ((= arg2 (-> arg0 option-index)) (set-color! fnt (progress-selected 0)) ) (else (set-color! fnt (font-color progress)) ) ) (if (and (and (= arg2 (-> arg0 option-index)) (!= 298 (-> this name))) (not (and (= (-> this name) (text-id progress-root-secrets)) (= *title-pc* (-> arg0 current-options)) (not (memcard-unlocked-secrets? #f)) (= (-> arg0 option-index) 3) ) ) ) (draw-highlight y height alpha) ) (cond ((= *save-options-title* (-> arg0 current-options)) (cond ((= (-> this name) (text-id progress-continue-without-saving)) (cond ((= arg2 (-> arg0 option-index)) (set-scale! fnt 0.5) ) (else (set-scale! fnt 0.45) ) ) (+! (-> fnt origin y) -120.0) (if (not (-> *pc-settings* use-vis?)) (-! (-> fnt origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) 10)) (-! (-> fnt origin x) (the float (if (= (get-aspect-ratio) 'aspect4x3) 10 5 )))) (set! (-> fnt width) (the float (if (= (get-aspect-ratio) 'aspect4x3) 180 170 ) ) ) (set! (-> fnt height) 260.0) (if (not (-> *pc-settings* use-vis?)) (*! (-> fnt width) (-> *pc-settings* aspect-ratio-reciprocal))) (print-game-text (lookup-text! *common-text* (-> this name) #f) fnt #f 44 (bucket-id progress)) (when (= arg2 (-> arg0 option-index)) (let ((s4-1 69) (s2-4 110) (s3-1 176) (s1-1 42) ) (case (get-aspect-ratio) (('aspect16x9) (set! s4-1 79) (set! s2-4 110) (set! s3-1 166) (set! s1-1 42) (with-dma-buffer-add-bucket ((sv-16 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw-sprite2d-xy sv-16 s4-1 (+ (* s1-1 arg2) 8 s1-1 s2-4) s3-1 (+ s1-1 -8) (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 alpha))) ) ) ) ) (when (not (-> *pc-settings* use-vis?)) (set! s4-1 (adjust-game-x (the float s4-1))) (set! s3-1 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s3-1))) ) (set-vector! (-> this box 0 color) 64 128 128 (the int (* 128.0 alpha))) (draw-savegame-box this (the float s4-1) (the float (+ s4-1 s3-1)) (the float (+ s2-4 (* s1-1 arg2))) (the float (+ s2-4 (* s1-1 arg2))) ) (draw-savegame-box this (the float (+ s4-1 s3-1)) (the float (+ s4-1 s3-1)) (the float s2-4) (the float (+ s2-4 (* s1-1 arg2))) ) (with-dma-buffer-add-bucket ((s0-3 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s0-3 s4-1 (+ s2-4 (* s1-1 arg2)) s3-1 (+ s1-1 8) (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 alpha))) ) ) ) ) ) (else (if (not (-> *pc-settings* use-vis?)) (+! (-> fnt origin x) (* (-> *pc-settings* aspect-ratio-reciprocal) -100.0)) (+! (-> fnt origin x) -100.0)) (set! (-> fnt origin y) (+ -35.0 (-> fnt origin y))) ) ) ) ((= *load-save-options* (-> arg0 current-options)) (+! (-> fnt origin x) -100.0) (+! (-> fnt origin y) -25.0) (print-menu-text (lookup-text! *common-text* (-> this name) #f) (-> this scale) fnt arg0) ) ((and (= *title-pc* (-> arg0 current-options)) (= (text-id progress-root-secrets) (-> this name)) (memcard-unlocked-secrets? #f) ) (print-game-text (lookup-text! *common-text* (-> this name) #f) fnt #f 44 (bucket-id progress)) ) ((!= (-> this name) (text-id progress-root-secrets)) (print-game-text (lookup-text! *common-text* (-> this name) #f) fnt #f 44 (bucket-id progress)) ) ) ) ) 0 (none) ) (defmethod draw-option ((obj menu-icon-info-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (set! (-> arg1 alpha) (- 1.0 (-> arg0 menu-transition))) (set-color! arg1 (font-color progress)) (set-scale! arg1 0.5) (set! (-> *bigmap* auto-save-icon-flag) #t) (set! (-> obj sprites 0 tex) (lookup-texture-by-id (new 'static 'texture-id :index #x48 :page #x67a))) (set! (-> obj sprites 0 scale-x) 1.0) (set! (-> obj sprites 0 scale-y) 1.0) (let ((v1-6 (-> obj sprites 0 color2))) (set! (-> v1-6 0) 128) (set! (-> v1-6 1) 128) (set! (-> v1-6 2) 128) (set! (-> v1-6 3) (the int (* 128.0 (- 1.0 (-> arg0 menu-transition))))) ) (set! (-> obj sprites 0 pos z) #xffffff) (set! (-> obj sprites 0 pos w) 0) (set-hud-piece-position! (the-as hud-sprite (-> obj sprites)) (adjust-x-if-needed 240) 160) (with-dma-buffer-add-bucket ((s3-0 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) s3-0 (-> *level* default-level)) ) (set-flags! arg1 (font-flags kerning middle middle-vert large)) (set! (-> arg1 origin x) 90.0) (set! (-> arg1 origin y) 80.0) (set-width! arg1 330) (set-height! arg1 85) (when (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x)))) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) ) (print-game-text (lookup-text! *common-text* (text-id progress-autosave-explanation) #f) arg1 #f 44 (bucket-id progress) ) (+! (-> arg1 origin y) 115.0) (set-height! arg1 95) (print-game-text (lookup-text! *common-text* (text-id progress-autosave-dont-remove) #f) arg1 #f 44 (bucket-id progress) ) (+! (-> arg1 origin y) 90.0) (set-height! arg1 50) (set-color! arg1 (progress-selected 0)) (draw-highlight (the int (+ 12.0 (-> arg1 origin y))) 24 (-> arg1 alpha)) (print-game-text (lookup-text! *common-text* (text-id progress-unknown-continue) #f) arg1 #f 44 (bucket-id progress) ) 0 (none) ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; CUSTOM MENU OPTIONS ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun draw-decoration-aspect-ratio-custom ((arg0 menu-option) (arg1 font-context) (arg2 float) (arg3 text-id) (arg5 float)) (let ((gp-0 70) (s5-0 120) (sv-48 87) (s3-0 375) (s2-0 210) (sv-64 0) ) (case (get-aspect-ratio) (('aspect4x3) (set! gp-0 69) (set! s5-0 129) (set! sv-48 80) (set! s3-0 375) (set! s2-0 210) ) (('aspect16x9) (set! gp-0 79) (set! s5-0 129) (set! sv-48 68) (set! s3-0 356) (set! s2-0 244) ) ) (when (not (-> *pc-settings* use-vis?)) (set! gp-0 (the int (adjust-game-x (the float gp-0)))) (set! s3-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s3-0))) ) (set-scale! arg1 arg5) (set! (-> arg1 origin y) (the float sv-48)) (set! (-> arg1 height) 50.0) (set-color! arg1 (font-color progress)) (set-flags! arg1 (font-flags kerning middle middle-vert large)) (print-game-text (lookup-text! *common-text* arg3 #f) arg1 #f 44 (bucket-id progress)) (set-vector! (-> arg0 box 0 color) 64 128 128 (the int (* 128.0 arg2))) (draw-savegame-box arg0 (the float gp-0) (the float (+ gp-0 s3-0)) (the float s5-0) (the float s5-0)) (with-dma-buffer-add-bucket ((s0-1 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s0-1 gp-0 s5-0 s3-0 s2-0 (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 arg2))) ) ) ) ) (defun draw-highlight-aspect ((x int) (y int) (w int) (h int) (alpha float)) "draw the highlight for a number in the aspect ratio screen" (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (when (not (-> *pc-settings* use-vis?)) (set! x (adjust-game-x (the float x))) (set! w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) w))) ) (draw-sprite2d-xy buf x y w h (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 alpha)))) ) ) (defun draw-highlight-music-player ((x int) (y int) (w int) (h int) (alpha float)) "draw the highlight for a number in the music player screen" (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw-sprite2d-xy buf x y w h (new 'static 'rgba :r #x40 :g #x80 :b #x80 :a (the int (* 64.0 alpha)))) ) ) (defun draw-up-down-aspect ((font font-context) (y-up float) (y-down float)) (protect ((-> font origin x) (-> font origin y) (-> font scale)) (let ((start-y (-> font origin y))) (set-scale! font 0.5) (set! (-> font origin y) (- start-y y-up)) (print-game-text (string-format "~33L~C" 160) font #f 44 (bucket-id progress)) (set! (-> font origin y) (+ start-y y-down)) (print-game-text (string-format "~33L~C" 162) font #f 44 (bucket-id progress)) ) ) 0) (defmacro swap-confirm? () "is the confirm button swapped from X?" `(and (language? japanese korean) (case (scf-get-territory) ((GAME_TERRITORY_SCEI GAME_TERRITORY_SCEK) #t) (else #f)))) (defmethod draw-option ((obj menu-aspect-ratio-custom-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (let* ((alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) (middle-pad 15.0) (middle-pad-uncorrected middle-pad) (numbers-y 206.0) (numbers-text-y (- numbers-y 44.0)) (hilite-width 36) (hilite-height 16) (hilite-y-ofs 6) (hilite-height-total (+ hilite-height (* 2 hilite-y-ofs))) (font-w 100) (font-w-corrected (if (not (-> *pc-settings* use-vis?)) (the int (* (-> *pc-settings* aspect-ratio-reciprocal) font-w)) font-w)) ) (max! alpha 0.0) (set! (-> arg1 alpha) alpha) (set-flags! arg1 (font-flags kerning middle large)) (set-scale! arg1 0.65) (set-color! arg1 (font-color progress)) (set! (-> arg1 origin y) 80.0) (if (not (-> *pc-settings* use-vis?)) (*! middle-pad (-> *pc-settings* aspect-ratio-reciprocal))) (protect ((-> arg1 origin x) (-> arg1 width)) (set-scale! arg1 0.6) (set-width! arg1 50) (set! (-> arg1 origin y) numbers-y) (set! (-> arg1 origin x) (- 256.0 25)) (print-game-text "x" arg1 #f 44 (bucket-id progress)) (set-width! arg1 font-w-corrected) (set-scale! arg1 0.6) (set! (-> arg1 origin y) numbers-y) (set! (-> arg1 origin x) (- 256.0 middle-pad font-w-corrected)) (cond ((= 0 (-> *progress-state-pc* aspect-ratio-ratio-index)) (draw-highlight-aspect (- (the int (+ (- 256.0 middle-pad-uncorrected font-w) (/ font-w 2))) (/ hilite-width 2)) (- (the int (-> arg1 origin y)) hilite-y-ofs) hilite-width hilite-height-total alpha) (set-color! arg1 (progress-selected 0)) (draw-up-down-aspect arg1 21.0 25.0)) (else (set-color! arg1 (font-color progress))) ) (print-game-text (string-format "~D" (-> *pc-settings* aspect-custom-x)) arg1 #f 44 (bucket-id progress)) (set-scale! arg1 0.55) (set-color! arg1 (font-color progress)) (set! (-> arg1 origin y) numbers-text-y) (print-game-text (lookup-text! *common-text* (text-id progress-aspect-ratio-custom-width) #f) arg1 #f 44 (bucket-id progress)) (set-scale! arg1 0.6) (set! (-> arg1 origin y) numbers-y) (set! (-> arg1 origin x) (+ 256.0 middle-pad)) (cond ((= 1 (-> *progress-state-pc* aspect-ratio-ratio-index)) (draw-highlight-aspect (- (the int (+ (+ 256.0 middle-pad-uncorrected) (/ font-w 2))) (/ hilite-width 2)) (- (the int (-> arg1 origin y)) hilite-y-ofs) hilite-width hilite-height-total alpha) (set-color! arg1 (progress-selected 0)) (draw-up-down-aspect arg1 21.0 25.0)) (else (set-color! arg1 (font-color progress))) ) (print-game-text (string-format "~D" (-> *pc-settings* aspect-custom-y)) arg1 #f 44 (bucket-id progress)) (set-scale! arg1 0.55) (set-color! arg1 (font-color progress)) (set! (-> arg1 origin y) numbers-text-y) (print-game-text (lookup-text! *common-text* (text-id progress-aspect-ratio-custom-height) #f) arg1 #f 44 (bucket-id progress)) ) (set! (-> arg1 origin y) 289.0) (cond ((< (/ (the float (-> *pc-settings* aspect-custom-x)) (the float (-> *pc-settings* aspect-custom-y))) (/ 4.0 3.0)) (set-scale! arg1 0.5) (set-color! arg1 (font-color red)) (when (and (< (/ (the float (-> *pc-settings* aspect-custom-x)) (the float (-> *pc-settings* aspect-custom-y))) (/ 4.0 3.0)) (< (mod (-> *display* real-clock frame-counter) (seconds 1.2)) (seconds 1.0))) (print-game-text (lookup-text! *common-text* (text-id progress-aspect-ratio-custom-warn) #f) arg1 #f 44 (bucket-id progress)) ) ) (else (set-scale! arg1 0.55) (set-color! arg1 (font-color progress)) (print-game-text (lookup-text! *common-text* (if (not (swap-confirm?)) (text-id progress-aspect-ratio-custom-pad-x) (text-id progress-aspect-ratio-custom-pad-circle)) #f) arg1 #f 44 (bucket-id progress)) ) ) (when-not-drawn-decoration (draw-decoration-aspect-ratio-custom obj arg1 alpha (text-id progress-aspect-ratio-custom-title) 0.55)) ) 0 (none) ) (defmethod draw-option ((obj menu-frame-rate-disclaimer-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (set! (-> arg1 alpha) (- 1.0 (-> arg0 menu-transition))) (set-color! arg1 (font-color red)) (set-scale! arg1 0.8) (set-flags! arg1 (font-flags kerning middle middle-vert large)) (set! (-> arg1 origin x) 90.0) (set! (-> arg1 origin y) 72.0) (set-width! arg1 330) (set-height! arg1 85) (when (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x)))) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) ) (when (< (mod (-> *display* real-clock frame-counter) (seconds 1.2)) (seconds 1.0)) (print-game-text (lookup-text! *common-text* (text-id progress-fps-disclaimer-warning) #f) arg1 #f 44 (bucket-id progress))) (+! (-> arg1 origin y) 80.0) (set-scale! arg1 0.45) (set-color! arg1 (font-color progress)) (print-game-text (lookup-text! *common-text* (text-id progress-fps-disclaimer) #f) arg1 #f 44 (bucket-id progress)) (+! (-> arg1 origin y) 65.0) (set-scale! arg1 0.55) (set-height! arg1 95) (print-game-text (lookup-text! *common-text* (text-id progress-memcard-continue?) #f) arg1 #f 44 (bucket-id progress)) (+! (-> arg1 origin y) 58.0) (set-scale! arg1 0.5) (set-height! arg1 50) (set-color! arg1 (progress-selected 0)) (when (time-elapsed? (-> *progress-state-pc* frame-rate-disclaimer-time) (seconds 3)) (draw-highlight (the int (+ 13.0 (-> arg1 origin y))) 18 (-> arg1 alpha)) (draw-yes-no arg0 arg1)) 0 (none) ) (defmethod draw-option ((this menu-exit-game-option) (progress progress) (fnt font-context) (arg2 int) (selected symbol)) (let ((alpha (* 2.0 (- 0.5 (-> progress menu-transition)))) (y (the int (+ -1.0 (-> fnt origin y)))) (height 22) ) (if (< alpha 0.0) (set! alpha 0.0) ) (set! (-> fnt alpha) alpha) (set-scale! fnt 0.65) (set! (-> fnt height) 25.0) (set! height 28) (when (not (memcard-unlocked-secrets? #f)) (-! (-> fnt origin y) 45.0) (-! y 49) ) (when (memcard-unlocked-secrets? #f) (-! (-> fnt origin y) 35.0) (-! y 38) ) (when (nonzero? (-> this name)) (set-color! fnt (if (= arg2 (-> progress option-index)) (the font-color (the int (progress-selected 0))) (font-color progress) ) ) (cond ((= arg2 (-> progress option-index)) (set-color! fnt (progress-selected 0)) (draw-highlight y height alpha) ) (else (set-color! fnt (font-color progress)) ) ) (if selected (set-color! fnt (font-color progress-force-selected))) (print-game-text (lookup-text! *common-text* (-> this name) #f) fnt #f 44 (bucket-id progress)) (let ((choice (&-> *progress-state* yes-no-choice)) (str (the string #f))) (set! str (cond (selected (set-color! fnt (font-color progress-force-selected)) (when (memcard-unlocked-secrets? #f) (draw-highlight (the int (+ 24.0 (-> fnt origin y))) 24 (-> fnt alpha)) (+! (-> fnt origin y) 24.0) (set-scale! fnt 0.55) ) (when (not (memcard-unlocked-secrets? #f)) (draw-highlight (the int (+ 23.0 (-> fnt origin y))) 23 (-> fnt alpha)) (+! (-> fnt origin y) 23.0) (set-scale! fnt 0.60) ) (cond ((-> choice 0) (format (clear *temp-string*) "~33L~S~32L ~S" (lookup-text! *common-text* (text-id progress-yes) #f) (lookup-text! *common-text* (text-id progress-no) #f) ) (set! str *temp-string*) ) (else (format (clear *temp-string*) "~32L~S ~33L~S~1L" (lookup-text! *common-text* (text-id progress-yes) #f) (lookup-text! *common-text* (text-id progress-no) #f) ) (set! str *temp-string*) ) ) str ) (else (clear *temp-string*) ) ) ) (print-game-text str fnt #f 44 (bucket-id progress)) ) ) ) (none) ) (defun begin-scissor-music-player ((box hud-box)) (cond ((= (get-aspect-ratio) 'aspect16x9) (set! (-> box min x) 19.0) (set! (-> box min y) 129.0) (set! (-> box max x) 274.0) (set! (-> box max y) 304.0) ) (else (set! (-> box min x) 70.0) (set! (-> box min y) 129.0) (set! (-> box max x) 268.0) (set! (-> box max y) 270.0) ) ) (#when PC_PORT (set! (-> box min x) (the float (the int (adjust-game-x (-> box min x))))) (set! (-> box max x) (the float (the int (adjust-game-x (-> box max x))))) ) (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (setup-scissor box buf) ) 0 ) (defun end-scissor-music-player ((box hud-box)) (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (restore-scissor box buf) ) 0 ) (defun draw-decoration-music-player ((arg0 menu-option) (arg1 font-context) (arg2 float) (arg3 text-id) (arg5 float) (box hud-box)) (let ((list-x (the int (-> box min x))) (list-y (the int (-> box min y))) (title-x 70) (title-y 80) (list-w (the int (- (-> box max x) (-> box min x)))) (list-h (the int (- (-> box max y) (-> box min y)))) (full-w 375) (full-h 199) ) (case (get-aspect-ratio) (('aspect16x9) (set! title-y 69) (set! full-w 355) (set! full-h 233) (*! arg5 1.25) ) ) (when (not (-> *pc-settings* use-vis?)) (set! title-x (the int (adjust-game-x (the float title-x)))) (set! full-w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) full-w))) ) (set-scale! arg1 arg5) (set-origin! arg1 title-x title-y) (set! (-> arg1 width) 375.0) (set! (-> arg1 height) 48.0) (when (not (-> *pc-settings* use-vis?)) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) ) (set-color! arg1 (font-color progress)) (set-flags! arg1 (font-flags kerning middle middle-vert large)) (print-game-text (lookup-text! *common-text* arg3 #f) arg1 #f 44 (bucket-id progress)) (set-vector! (-> arg0 box 0 color) 64 128 128 (the int (* 128.0 arg2))) (draw-savegame-box arg0 (the float list-x) (the float (+ list-x full-w)) (the float list-y) (the float list-y)) (draw-savegame-box arg0 (the float list-x) (the float (+ list-x list-w)) (the float (+ list-y list-h)) (the float (+ list-y list-h))) (draw-savegame-box arg0 (the float (+ list-x list-w)) (the float (+ list-x list-w)) (the float list-y) (the float (+ list-y full-h))) (with-dma-buffer-add-bucket ((s0-1 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s0-1 list-x list-y list-w list-h (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 arg2))) ) ) ) ) (defun draw-up-down-music-player ((font font-context) (box hud-box)) (protect ((-> font origin x) (-> font origin y) (-> font scale) (-> font width) (-> font height)) (let ((start-y (-> font origin y))) (set-scale! font 0.5) (set! (-> font width) (- (-> box max x) (-> box min x))) (set! (-> font height) 16.0) (set-flags! font (font-flags kerning large middle)) (set! (-> font origin x) (-> box min x)) (set! (-> font origin y) (- (-> box min y) (-> font height))) (print-game-text (string-format "~33L~C" 160) font #f 44 (bucket-id progress)) (set! (-> font origin y) (+ 3.0 (-> box max y))) (print-game-text (string-format "~33L~C" 162) font #f 44 (bucket-id progress)) ) ) 0) (defmacro set-hud-sprite-attributes! (sprite &key (r 128) &key (g 128) &key (b 128) &key (a 1.0) &key x &key y &key (z #xffffff) &key (w 1) &key tex &key (scale-x 1.0) &key (scale-y 1.0) ) (with-gensyms (col) `(begin (let ((,col (-> ,sprite color2))) (set! (-> ,col 0) ,r) (set! (-> ,col 1) ,g) (set! (-> ,col 2) ,b) (set! (-> ,col 3) (the int (* 128.0 ,a))) ) (set! (-> ,sprite pos z) ,z) (set! (-> ,sprite pos w) ,w) (set! (-> ,sprite tex) ,tex) (set! (-> ,sprite scale-x) ,scale-x) (set! (-> ,sprite scale-y) ,scale-y) (set-hud-piece-position! ,sprite ,x ,y) ))) (defmethod draw-option ((obj menu-music-player-option) (arg0 progress) (arg1 font-context) (arg2 int) (arg3 symbol)) (let* ((alpha (* 2.0 (- 0.5 (-> arg0 menu-transition)))) (y-pad-top 11) (text-height 23) (old-y 0.0) (list-text-y (+ (- (-> obj current-scroll)) y-pad-top)) (max-lines 8) (tab-music 6.0) (tab-flava 12.0) (box (new 'stack 'hud-box)) (flava-text-list (new 'static 'boxed-array :type text-id (text-id progress-music-player-flava-default) (text-id progress-music-player-flava-gun) (text-id progress-music-player-flava-board) (text-id progress-music-player-flava-mech) (text-id progress-music-player-flava-darkjak) (text-id progress-music-player-flava-pilot) ))) (max! alpha 0.0) (set! (-> arg1 alpha) alpha) (when (not (-> *pc-settings* use-vis?)) (*! tab-music (-> *pc-settings* aspect-ratio-reciprocal)) (*! tab-flava (-> *pc-settings* aspect-ratio-reciprocal)) ;(set! danger-w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) danger-w))) ) (set-flags! arg1 (font-flags kerning large)) (set-scale! arg1 0.6) (set-color! arg1 (font-color progress)) (begin-scissor-music-player box) (+! list-text-y (-> box min y)) (set-scale! arg1 0.45) (set! (-> arg1 origin x) (+ (-> box min x) tab-music)) ;(format *stdcon* "m: ~D f: ~D scroll: ~f~%" (-> obj music-index) (-> obj flava-index) (-> obj current-scroll)) (dotimes (i (-> *music-player-tracks* length)) (set! (-> arg1 origin y) (set! old-y list-text-y)) (set! (-> arg1 width) (- (-> box max x) (-> box min x))) (cond ((= i (-> obj music-index)) (+! list-text-y text-height) (cond ((-> *progress-state-pc* music-player-selected) ;; restore these later (let* ((flava-bits (the-as int (-> *music-player-tracks* i flava))) (flava-count (count-bits flava-bits)) (flava-text-height (the int (* (/ 0.42 0.45) text-height)))) ;; draw highlight first (draw-highlight-music-player (the int (-> box min x)) (the int (+ -6.0 (-> arg1 origin y))) (the int (- (-> box max x) (-> box min x))) (+ text-height (* flava-count flava-text-height)) alpha) ;; draw text for each flava! (protect ((-> arg1 origin x) (-> arg1 origin y) (-> arg1 scale)) (set-scale! arg1 0.42) (+! (-> arg1 origin x) tab-flava) (set! (-> arg1 origin y) list-text-y) (dotimes (f flava-count) (if (= f (-> obj flava-index)) (set-color! arg1 (progress-selected 0)) (set-color! arg1 (font-color progress))) (let ((flava (bit-on-offset flava-bits f))) (if (flava-unlocked? flava) (print-game-text (lookup-text! *common-text* (-> flava-text-list (bit-on-offset flava-bits f)) #f) arg1 #f 44 (bucket-id progress)) (print-game-text (lookup-text! *common-text* (text-id progress-music-player-locked) #f) arg1 #f 44 (bucket-id progress))) ) (+! (-> arg1 origin y) flava-text-height) ) ) ;; advance list height (+! list-text-y (* flava-count flava-text-height)) ;; set color to selected (set-color! arg1 (font-color progress-force-selected)) )) (else (set-color! arg1 (progress-selected 0)) (draw-highlight-music-player (the int (-> box min x)) (the int (+ -6.0 (-> arg1 origin y))) (the int (- (-> box max x) (-> box min x))) text-height alpha) )) (when (< (-> arg1 origin y) (+ (-> box min y) y-pad-top)) (set! (-> obj current-scroll) (seek-ease (-> obj current-scroll) (+ (-> obj current-scroll) (- (-> arg1 origin y) (+ (-> box min y) y-pad-top))) (if (-> *progress-state-pc* music-player-selected) 999999.0 (* 0.1 text-height (-> arg0 clock time-adjust-ratio))) (* 0.3 text-height) (* 0.01 text-height (-> arg0 clock time-adjust-ratio))))) (when (> list-text-y (-> box max y)) (set! (-> obj current-scroll) (seek-ease (-> obj current-scroll) (+ (-> obj current-scroll) (- list-text-y (-> box max y))) (if (-> *progress-state-pc* music-player-selected) 999999.0 (* 0.1 text-height (-> arg0 clock time-adjust-ratio))) (* 0.3 text-height) (* 0.01 text-height (-> arg0 clock time-adjust-ratio))))) ) (else (+! list-text-y text-height) (set-color! arg1 (font-color progress)) ) ) (if (get-bit (-> *pc-settings* music-unlocked) i) (print-game-text (lookup-text! *common-text* (-> *music-player-tracks* i text) #f) arg1 #f 44 (bucket-id progress)) (print-game-text (lookup-text! *common-text* (text-id progress-music-player-locked) #f) arg1 #f 44 (bucket-id progress))) ) (if (< (- list-text-y (-> box max y)) 0.0) (+! (-> obj current-scroll) (- list-text-y (-> box max y)))) (unless (-> *progress-state-pc* music-player-selected) (max! (-> obj max-scroll) (-> obj current-scroll))) (end-scissor-music-player box) ;; draw right panel text (let ((icon-x 0) (icon-y 174) (icon-w (if (= (get-aspect-ratio) 'aspect4x3) 64 48)) (icon-h 64) (icon-scale 0.7) (icon-id 0) (danger-pad 8.0) (danger-w 73) (arrow-w 14) (danger-text-list (new 'static 'boxed-array :type text-id (text-id progress-music-player-danger-0) (text-id progress-music-player-danger-1) (text-id progress-music-player-danger-2) (text-id progress-music-player-danger-3) ))) (set-flags! arg1 (font-flags kerning middle large)) (case (get-aspect-ratio) (('aspect16x9) (set-origin! arg1 281 160) (set-width! arg1 144) (set! icon-y 190) ) (else (set-origin! arg1 278 144) (set-width! arg1 158) ) ) (when (not (-> *pc-settings* use-vis?)) (set! (-> arg1 origin x) (the float (adjust-game-x (-> arg1 origin x)))) (*! danger-pad (-> *pc-settings* aspect-ratio-reciprocal)) (*! (-> arg1 width) (-> *pc-settings* aspect-ratio-reciprocal)) (set! icon-w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) icon-w))) (set! danger-w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) danger-w))) (set! arrow-w (the int (* (-> *pc-settings* aspect-ratio-reciprocal) arrow-w))) ) (set-height! arg1 40) (set-scale! arg1 0.42) (set-color! arg1 (font-color progress)) (when (-> *progress-state-pc* music-player-track) (print-game-text (lookup-text! *common-text* (text-id progress-music-player-now-playing) #f) arg1 #f 44 (bucket-id progress))) (set-flags! arg1 (font-flags kerning middle middle-vert large)) (+! (-> arg1 origin y) 110.0) (set-scale! arg1 0.48) (cond ((-> *progress-state-pc* music-player-track) (set! icon-id (-> *progress-state-pc* music-player-track icon)) ;; use this icon ID (print-game-text (lookup-text! *common-text* (-> *progress-state-pc* music-player-track text) #f) arg1 #f 44 (bucket-id progress)) ;; print flava if needed too (when (nonzero? (-> *progress-state-pc* music-player-track flava)) (+! (-> arg1 origin y) 36.0) (set-scale! arg1 0.42) (print-game-text (lookup-text! *common-text* (-> flava-text-list (-> *progress-state-pc* music-player-flava)) #f) arg1 #f 44 (bucket-id progress)) ) ) (else (print-game-text (lookup-text! *common-text* (text-id progress-music-player-no-track) #f) arg1 #f 44 (bucket-id progress)) ) ) ;; draw right panel icon (set! icon-x (the int (+ (-> arg1 origin x) (/ (-> arg1 width) 2)))) (set! icon-w (the int (* icon-scale icon-w))) (set! icon-h (the int (* icon-scale icon-h))) ;; center icon. the icon is 96x96 but each sprite is 64x64, hence 1.5 (-! icon-x (the int (/ (* 1.5 icon-w) 2))) (set-hud-sprite-attributes! (-> obj sprites 0) :tex (lookup-texture-by-id (get-level-icon-id-01 icon-id)) :a alpha :scale-x icon-scale :scale-y icon-scale :x icon-x :y icon-y) (set-hud-sprite-attributes! (-> obj sprites 1) :tex (lookup-texture-by-id (get-level-icon-id-02 icon-id)) :a alpha :scale-x icon-scale :scale-y icon-scale :x (+ icon-x icon-w) :y icon-y) (set-hud-sprite-attributes! (-> obj sprites 2) :tex (lookup-texture-by-id (get-level-icon-id-03 icon-id)) :a alpha :scale-x icon-scale :scale-y icon-scale :x icon-x :y (+ icon-y icon-h)) (set-hud-sprite-attributes! (-> obj sprites 3) :tex (lookup-texture-by-id (get-level-icon-id-04 icon-id)) :a alpha :scale-x icon-scale :scale-y icon-scale :x (+ icon-x icon-w) :y (+ icon-y icon-h)) ;; danger scroller (set-scale! arg1 0.42) (set! (-> arg1 origin y) (+ 26.0 (-> box max y))) (set! (-> arg1 origin x) (+ danger-pad (-> box min x))) (set-width! arg1 danger-w) (set-flags! arg1 (font-flags kerning large)) (print-game-text (lookup-text! *common-text* (text-id progress-music-player-danger) #f) arg1 #f 44 (bucket-id progress)) (+! (-> arg1 origin x) (-> arg1 width)) (set-flags! arg1 (font-flags kerning large right)) (set-width! arg1 arrow-w) (+! (-> arg1 origin x) (-> arg1 width)) (set-color! arg1 (progress-selected (seconds 0.5))) (print-game-text (string-format "~33L~C" 163) arg1 #f 44 (bucket-id progress)) (set-flags! arg1 (font-flags kerning large middle)) (set-width! arg1 (the int (- (-> box max x) (-> box min x) danger-w (* arrow-w 2) (* danger-pad 2)))) (set-color! arg1 (font-color progress)) (print-game-text (lookup-text! *common-text* (-> danger-text-list (-> obj excitement)) #f) arg1 #f 44 (bucket-id progress)) (+! (-> arg1 origin x) (-> arg1 width)) (set-flags! arg1 (font-flags kerning large)) (set-width! arg1 arrow-w) (set-color! arg1 (progress-selected (seconds 0.5))) (print-game-text (string-format "~33L~C" 161) arg1 #f 44 (bucket-id progress)) (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (draw (-> obj sprites 0) buf (-> *level* default-level)) (draw (-> obj sprites 1) buf (-> *level* default-level)) (draw (-> obj sprites 2) buf (-> *level* default-level)) (draw (-> obj sprites 3) buf (-> *level* default-level)) ) ) (when-not-drawn-decoration (draw-up-down-music-player arg1 box) (draw-decoration-music-player obj arg1 alpha (-> obj name) 0.7 box)) ) 0 (none)) (defun draw-decoration-resolution ((arg0 menu-option) (arg1 font-context) (arg2 float) (arg3 text-id) (arg5 float)) (let ((gp-0 70) (s5-0 120) (sv-48 87) (s3-0 375) (s2-0 210) (sv-64 0) ) (case (get-aspect-ratio) (('aspect4x3) (set! gp-0 70) (set! s5-0 116) (set! sv-48 84) (set! s3-0 375) (set! s2-0 179) ) (('aspect16x9) (set! gp-0 79) (set! s5-0 108) (set! sv-48 58) (set! s3-0 356) (set! s2-0 185) (set! sv-64 20) ) ) (#when PC_PORT ;; added for better widescreen handling (when (not (-> *pc-settings* use-vis?)) (set! gp-0 (the int (adjust-game-x (the float gp-0)))) (set! s3-0 (the int (* (-> *pc-settings* aspect-ratio-reciprocal) s3-0))) ) ) (set-scale! arg1 arg5) (set! (-> arg1 origin y) (the float sv-48)) (set! (-> arg1 height) 50.0) (set-color! arg1 (font-color progress)) (set-flags! arg1 (font-flags kerning middle large)) (print-game-text (lookup-text! *common-text* arg3 #f) arg1 #f 44 (bucket-id progress)) (set-vector! (-> arg0 box 0 color) 64 128 128 (the int (* 128.0 arg2))) (draw-savegame-box arg0 (the float gp-0) (the float (+ gp-0 s3-0)) (the float s5-0) (the float s5-0)) (+! (-> arg1 origin y) (the float sv-64)) (draw-savegame-box arg0 (the float gp-0) (the float (+ gp-0 s3-0)) (the float (+ s5-0 s2-0)) (the float (+ s5-0 s2-0)) ) (with-dma-buffer-add-bucket ((s0-1 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id particles) ) (draw-sprite2d-xy s0-1 gp-0 s5-0 s3-0 s2-0 (new 'static 'rgba :r #x40 :g #x40 :b #x40 :a (the int (* 64.0 arg2))) ) ) ) ) (defun begin-scissor-resolution ((arg0 hud-box)) (cond ((= (get-aspect-ratio) 'aspect16x9) (set! (-> arg0 min x) 79.0) (set! (-> arg0 min y) 108.0) (set! (-> arg0 max x) 434.0) (set! (-> arg0 max y) 293.0) ) (else (set! (-> arg0 min x) 70.0) (set! (-> arg0 min y) 116.0) (set! (-> arg0 max x) 444.0) (set! (-> arg0 max y) 295.0) ) ) (with-dma-buffer-add-bucket ((s4-0 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (setup-scissor arg0 s4-0) ) 0 ) (defun end-scissor-resolution ((arg0 hud-box) (arg1 float)) (with-dma-buffer-add-bucket ((s5-0 (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id progress) ) (restore-scissor arg0 s5-0) ) 0 ) (defmethod draw-option ((this menu-resolution-option) (the-progress progress) (font font-context) (arg2 int) (arg3 symbol)) (let* ((alpha (* 2.0 (- 0.5 (-> the-progress menu-transition)))) (box (new 'stack 'hud-box)) (height 22) (text-pad 1) (text-height (+ height (* text-pad 2)))) (max! alpha 0.0) (set! (-> font alpha) alpha) (draw-decoration-resolution this font alpha (if (fullscreen?) (text-id progress-game-res-decoration) (text-id progress-window-size-decoration)) 0.65) (begin-scissor-resolution box) (set-flags! font (font-flags kerning large middle)) (cond ((< (-> this selected-index) 0) ;; not sure. ) ((-> this valid?) (set-scale! font 0.6) (set-color! font (font-color progress)) (set! (-> font origin x) (+ (-> box min x) 16)) (set! (-> font width) (- (-> box max x) (-> box min x) (* 16 2))) (set-height! font 60) ;; draw the highlight first (draw-highlight 193 (- height 1) alpha) ;; now scroll and offset the list (if (> (abs (- (-> this scroll-index) (the float (-> this selected-index)))) 2.0) (set! (-> this scroll-index) (the float (-> this selected-index))) (seek-ease! (-> this scroll-index) (the float (-> this selected-index)) (* 0.15 (-> PP clock time-adjust-ratio)) 0.3 (* 0.0015 (-> PP clock time-adjust-ratio)))) (set! (-> font origin y) (- 194.0 (* (-> this scroll-index) text-height) (- text-pad))) ;; now draw the list! (let ((valid-index 0)) (dotimes (i (-> this num-resolutions)) ;; count "valid" resolutions (let ((this-w 0) (this-h 0) (this-aspect 0.0)) (pc-get-resolution i (& this-w) (& this-h)) (set! this-aspect (/ (the float this-w) (the float this-h))) (when (or (= (pc-get-display-mode) 'windowed) (< (fabs (- (-> this win-aspect) this-aspect)) 0.05)) (if (= valid-index (-> this selected-index)) (set-color! font (progress-selected 0)) (set-color! font (font-color progress))) (print-game-text (string-format "~D x ~D" this-w this-h) font #f 44 (bucket-id progress)) (+! (-> font origin y) text-height) (1+! valid-index) )) ) (when (fullscreen?) ;; draw extra hardcoded cases (if (= valid-index (-> this selected-index)) (set-color! font (progress-selected 0)) (set-color! font (font-color progress))) (print-game-text (string-format "~D x ~D" 512 416) font #f 44 (bucket-id progress)) (+! (-> font origin y) text-height) (1+! valid-index) (if (= valid-index (-> this selected-index)) (set-color! font (progress-selected 0)) (set-color! font (font-color progress))) (print-game-text (string-format "~D x ~D" 512 208) font #f 44 (bucket-id progress)) (+! (-> font origin y) text-height) (1+! valid-index) )) ) (else ;; wtf?? just print an ominous warning. (set-scale! font 0.6) (set-color! font (font-color red)) (set! (-> font origin x) (+ (-> box min x) 16)) (set! (-> font origin y) (+ (-> box min y) 120)) (set! (-> font width) (- (-> box max x) (-> box min x) (* 16 2))) (set-height! font 60) (print-game-text (lookup-text! *common-text* (text-id progress-error-no-resolutions) #f) font #f 44 (bucket-id progress)) ) ) (end-scissor-resolution box 1.0) ) 0 (none)) (#when PC_PORT (defun-debug draw-mouse () "draw some extra mouse info" (let ((mx (+ (the int (-> *mouse* posx)) 256)) (my (+ (the int (-> *mouse* posy)) 208))) (format *stdcon* "mouse pos: (~D,~D)~%" mx my) (with-dma-buffer-add-bucket ((buf (-> *display* frames (-> *display* on-screen) global-buf)) (bucket-id debug-no-zbuf2) ) (draw-sprite2d-xy buf 0 my 512 1 (static-rgba #xff #xff #xff #x40)) (draw-sprite2d-xy buf mx 0 1 416 (static-rgba #xff #xff #xff #x40)) ) ) ) (defmacro spawn-draw-mouse-proc () `(process-spawn-function process :name "draw-mouse" :to *display-pool* (lambda :behavior process () (loop (suspend) (draw-mouse)) ))) )