;;-*-Lisp-*-
(in-package goal)

;; definition for method 9 of type setting-data
(defmethod update-from-engine setting-data ((obj setting-data) (arg0 engine))
  (let ((conn (the-as connection (-> arg0 alive-list-end)))
        (s4-0 (-> arg0 alive-list-end prev0))
        )
    (while (!= (the-as connectable conn) (-> arg0 alive-list))
      (case (-> conn param0)
        (('border-mode)
         (set! (-> obj border-mode) (the-as symbol (-> conn param1)))
         )
        (('allow-look-around)
         (set! (-> obj allow-look-around) (the-as symbol (-> conn param1)))
         )
        (('ocean-off)
         (set! (-> obj ocean-off) (the-as symbol (-> conn param1)))
         )
        (('music)
         (set! (-> obj music) (the-as symbol (-> conn param1)))
         )
        (('process-mask)
         (case (the-as object (-> conn param1))
           (('set)
            (logior! (-> obj process-mask) (the-as int (-> conn param3)))
            )
           (('clear)
            (logclear! (-> obj process-mask) (the-as uint (-> conn param3)))
            )
           (('abs)
            (set! (-> obj process-mask) (the-as process-mask (the-as int (-> conn param3))))
            )
           )
         )
        (('sfx-volume)
         (when (or (zero? (logand (-> *kernel-context* prevent-from-run) (process-mask progress)))
                   (= (get-process conn) (ppointer->process *progress-process*))
                   )
           (case (the-as symbol (-> conn param1))
             (('rel)
              (set! (-> obj sfx-volume) (* 0.01 (the-as float (-> conn param2)) (-> obj sfx-volume)))
              )
             (else
               (set! (-> obj sfx-volume) (the-as float (-> conn param2)))
               )
             )
           )
         )
        (('music-volume)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj music-volume) (* 0.01 (the-as float (-> conn param2)) (-> obj music-volume)))
            )
           (else
             (set! (-> obj music-volume) (the-as float (-> conn param2)))
             )
           )
         )
        (('ambient-volume)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj ambient-volume) (* 0.01 (the-as float (-> conn param2)) (-> obj ambient-volume)))
            )
           (else
             (set! (-> obj ambient-volume) (the-as float (-> conn param2)))
             )
           )
         )
        (('dialog-volume)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj dialog-volume) (* 0.01 (the-as float (-> conn param2)) (-> obj dialog-volume)))
            )
           (else
             (set! (-> obj dialog-volume) (the-as float (-> conn param2)))
             )
           )
         )
        (('sfx-volume-movie)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj sfx-volume-movie) (* 0.01 (the-as float (-> conn param2)) (-> obj sfx-volume-movie)))
            )
           (else
             (set! (-> obj sfx-volume-movie) (the-as float (-> conn param2)))
             )
           )
         )
        (('music-volume-movie)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj music-volume-movie) (* 0.01 (the-as float (-> conn param2)) (-> obj music-volume-movie)))
            )
           (else
             (set! (-> obj music-volume-movie) (the-as float (-> conn param2)))
             )
           )
         )
        (('ambient-volume-movie)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj ambient-volume-movie) (* 0.01 (the-as float (-> conn param2)) (-> obj ambient-volume-movie)))
            )
           (else
             (set! (-> obj ambient-volume-movie) (the-as float (-> conn param2)))
             )
           )
         )
        (('dialog-volume-hint)
         (case (the-as symbol (-> conn param1))
           (('rel)
            (set! (-> obj dialog-volume-hint) (* 0.01 (the-as float (-> conn param2)) (-> obj dialog-volume-hint)))
            )
           (else
             (set! (-> obj dialog-volume-hint) (the-as float (-> conn param2)))
             )
           )
         )
        (('sound-flava)
         (when (>= (the-as float (-> conn param2)) (-> obj sound-flava-priority))
           (set! (-> obj sound-flava) (the-as uint (the-as int (-> conn param3))))
           (set! (-> obj sound-flava-priority) (the-as float (-> conn param2)))
           )
         )
        (('bg-r)
         (set! (-> obj bg-r) (the-as float (-> conn param2)))
         )
        (('bg-g)
         (set! (-> obj bg-g) (the-as float (-> conn param2)))
         )
        (('bg-b)
         (set! (-> obj bg-b) (the-as float (-> conn param2)))
         )
        (('bg-a)
         (set! (-> obj bg-a) (the-as float (-> conn param2)))
         )
        (('bg-a-speed)
         (set! (-> obj bg-a-speed) (the-as float (-> conn param2)))
         )
        (('bg-a-force)
         (set! (-> obj bg-a-force) (the-as float (-> conn param2)))
         )
        (('language)
         (set! (-> obj language) (the-as language-enum (the-as int (-> conn param3))))
         )
        (('vibration)
         (set! (-> obj vibration) (the-as symbol (-> conn param1)))
         )
        (('auto-save)
         (set! (-> obj auto-save) (the-as symbol (-> conn param1)))
         )
        (('allow-pause)
         (set! (-> obj allow-pause) (the-as symbol (-> conn param1)))
         )
        (('allow-progress)
         (set! (-> obj allow-progress) (the-as symbol (-> conn param1)))
         )
        (('play-hints)
         (set! (-> obj play-hints) (the-as symbol (-> conn param1)))
         )
        (('movie)
         (set! (-> obj movie) (the-as (pointer progress) (-> conn param1)))
         )
        (('talking)
         (set! (-> obj talking) (the-as (pointer progress) (-> conn param1)))
         )
        (('spooling)
         (set! (-> obj spooling) (the-as (pointer progress) (-> conn param1)))
         )
        (('hint)
         (set! (-> obj hint) (the-as (pointer process) (-> conn param1)))
         )
        (('ambient)
         (set! (-> obj ambient) (the-as (pointer progress) (-> conn param1)))
         )
        (('common-page)
         (case (the-as object (-> conn param1))
           (('set)
            (logior! (-> obj common-page) (the-as int (-> conn param3)))
            )
           (('clear)
            (logclear! (-> obj common-page) (the-as uint (-> conn param3)))
            )
           )
         )
        )
      (set! conn (the-as connection s4-0))
      (set! s4-0 (-> (the-as connectable conn) prev0))
      )
    )
  obj
  )

;; definition for method 9 of type setting-control
;; INFO: Return type mismatch int vs none.
(defmethod add-setting setting-control ((obj setting-control) (arg0 process) (arg1 symbol) (arg2 object) (arg3 object) (arg4 object))
  (add-connection (-> obj engine) arg0 arg1 arg2 arg3 arg4)
  0
  (none)
  )

;; definition for method 10 of type setting-control
;; INFO: Return type mismatch int vs none.
(defmethod set-setting setting-control ((obj setting-control) (arg0 process) (arg1 symbol) (arg2 object) (arg3 object) (arg4 object))
  (remove-setting obj arg0 arg1)
  (add-connection (-> obj engine) arg0 arg1 arg2 arg3 arg4)
  0
  (none)
  )

;; definition for method 11 of type setting-control
;; INFO: Return type mismatch int vs none.
(defmethod remove-setting setting-control ((obj setting-control) (arg0 process) (arg1 symbol))
  (when arg0
    (let ((s5-0 (-> obj engine))
          (s4-0 (-> arg0 connection-list next1))
          )
      (while s4-0
        (if (and (belongs-to-engine? (the-as connection s4-0) s5-0)
                 (or (= arg1 #t) (= arg1 (-> (the-as connection s4-0) param0)))
                 )
            (move-to-dead (the-as connection s4-0))
            )
        (set! s4-0 (-> s4-0 next1))
        )
      )
    )
  0
  (none)
  )

;; definition for method 12 of type setting-control
(defmethod apply-settings setting-control ((obj setting-control))
  (let ((gp-0 (-> obj current)))
    (let ((s5-0 (-> obj target)))
      (mem-copy! (the-as pointer s5-0) (the-as pointer (-> obj default)) 196)
      (set! (-> s5-0 ambient-volume) (* 0.01 (-> obj default ambient-volume) (-> obj default sfx-volume)))
      (update-from-engine s5-0 (-> obj engine))
      (set! (-> gp-0 border-mode) (-> s5-0 border-mode))
      (set! (-> gp-0 common-page) (-> s5-0 common-page))
      (set! (-> gp-0 vibration) (-> s5-0 vibration))
      (set! (-> gp-0 auto-save) (-> s5-0 auto-save))
      (set! (-> gp-0 play-hints) (-> s5-0 play-hints))
      (set! (-> gp-0 movie) (-> s5-0 movie))
      (set! (-> gp-0 talking) (-> s5-0 talking))
      (set! (-> gp-0 spooling) (-> s5-0 spooling))
      (set! (-> gp-0 hint) (-> s5-0 hint))
      (set! (-> gp-0 ambient) (-> s5-0 ambient))
      (set! (-> gp-0 allow-pause) (-> s5-0 allow-pause))
      (set! (-> gp-0 allow-progress) (-> s5-0 allow-progress))
      (set! (-> gp-0 allow-look-around) (-> s5-0 allow-look-around))
      (set! (-> gp-0 ocean-off) (-> s5-0 ocean-off))
      (set! (-> gp-0 ambient-volume-movie) (-> s5-0 ambient-volume-movie))
      (set! (-> gp-0 music-volume-movie) (-> s5-0 music-volume-movie))
      (set! (-> gp-0 sfx-volume-movie) (-> s5-0 sfx-volume-movie))
      (set! (-> gp-0 dialog-volume-hint) (-> s5-0 dialog-volume-hint))
      (set! (-> gp-0 process-mask) (-> s5-0 process-mask))
      )
    (set! (-> *kernel-context* prevent-from-run) (-> gp-0 process-mask))
    gp-0
    )
  )

;; definition for method 13 of type setting-control
(defmethod update setting-control ((obj setting-control))
  (apply-settings obj)
  (let ((gp-0 (-> obj current)))
    (let ((s5-1 (-> obj target)))
      (when *sound-player-enable*
        (when (!= (-> gp-0 sfx-volume) (-> s5-1 sfx-volume))
          (seek! (-> gp-0 sfx-volume) (-> s5-1 sfx-volume) (* 100.0 (-> *display* seconds-per-frame)))
          (sound-set-volume (sound-group sfx) (-> gp-0 sfx-volume))
          )
        (when (!= (-> gp-0 music-volume) (-> s5-1 music-volume))
          (seek! (-> gp-0 music-volume) (-> s5-1 music-volume) (* 100.0 (-> *display* seconds-per-frame)))
          (sound-set-volume (sound-group music) (-> gp-0 music-volume))
          )
        (when (!= (-> gp-0 dialog-volume) (-> s5-1 dialog-volume))
          (seek! (-> gp-0 dialog-volume) (-> s5-1 dialog-volume) (* 100.0 (-> *display* seconds-per-frame)))
          (sound-set-volume (sound-group dialog) (-> gp-0 dialog-volume))
          )
        (when (!= (-> gp-0 ambient-volume) (-> s5-1 ambient-volume))
          (seek! (-> gp-0 ambient-volume) (-> s5-1 ambient-volume) (* 100.0 (-> *display* seconds-per-frame)))
          (sound-set-volume (sound-group ambient) (-> gp-0 ambient-volume))
          )
        )
      (when (!= (-> gp-0 language) (-> s5-1 language))
        (set! (-> gp-0 language) (-> s5-1 language))
        (set-language (-> gp-0 language))
        )
      (when (and (!= (-> s5-1 music) (-> gp-0 music))
                 (and (< 0.0 (-> *setting-control* current music-volume)) (zero? (rpc-busy? 1)) *sound-bank-1* *sound-bank-2*)
                 )
        (cond
          ((-> s5-1 music)
           (format 0 "Load music ~A~%" (-> s5-1 music))
           (sound-music-load (string->sound-name (symbol->string (-> s5-1 music))))
           )
          (else
            (format 0 "Unload music~%")
            (sound-music-unload)
            )
          )
        (set! (-> gp-0 music) (-> s5-1 music))
        )
      (set! (-> s5-1 sound-flava)
            (the-as uint (flava-lookup (-> gp-0 music) (the-as music-flava (-> s5-1 sound-flava))))
            )
      (set! (-> gp-0 sound-flava) (-> s5-1 sound-flava))
      (if *sound-player-enable*
          (sound-set-flava (-> gp-0 sound-flava))
          )
      (when (!= (-> gp-0 aspect-ratio) (-> s5-1 aspect-ratio))
        (set! (-> gp-0 aspect-ratio) (-> s5-1 aspect-ratio))
        (set-aspect-ratio (-> gp-0 aspect-ratio))
        )
      (when (!= (-> gp-0 video-mode) (-> s5-1 video-mode))
        (set! (-> gp-0 video-mode) (-> s5-1 video-mode))
        (set-video-mode (-> gp-0 video-mode))
        )
      (when (!= (-> gp-0 screenx) (-> s5-1 screenx))
        (set! (-> gp-0 screenx) (-> s5-1 screenx))
        (set! (-> *video-parms* display-dx) (/ (-> s5-1 screenx) 2))
        (set! (-> *video-parms* set-video-mode) #t)
        )
      (when (!= (-> gp-0 screeny) (-> s5-1 screeny))
        (set! (-> gp-0 screeny) (-> s5-1 screeny))
        (set! (-> *video-parms* display-dy) (* (/ (-> s5-1 screeny) 2) 2))
        (set! (-> *video-parms* set-video-mode) #t)
        )
      (set! (-> gp-0 bg-a-speed) (-> s5-1 bg-a-speed))
      (set! (-> gp-0 bg-a-force) (-> s5-1 bg-a-force))
      (set! (-> gp-0 bg-r) (-> s5-1 bg-r))
      (set! (-> gp-0 bg-g) (-> s5-1 bg-g))
      (set! (-> gp-0 bg-b) (-> s5-1 bg-b))
      (seek! (-> gp-0 bg-a) (-> s5-1 bg-a) (* (-> s5-1 bg-a-speed) (-> *display* seconds-per-frame)))
      )
    (let ((v1-60 (-> *display* frames (-> *display* on-screen) display))
          (f0-39 (-> gp-0 bg-a))
          )
      (if (!= (-> gp-0 bg-a-force) 0.0)
          (set! f0-39 (-> gp-0 bg-a-force))
          )
      (set! (-> v1-60 bgcolor r) (the int (* 255.0 (-> gp-0 bg-r))))
      (set! (-> v1-60 bgcolor g) (the int (* 255.0 (-> gp-0 bg-g))))
      (set! (-> v1-60 bgcolor b) (the int (* 255.0 (-> gp-0 bg-b))))
      (set! (-> v1-60 pmode alp) (the int (* 255.0 (- 1.0 f0-39))))
      )
    (set! (-> *level* border?) (-> gp-0 border-mode))
    (set! (-> *texture-pool* common-page-mask) (-> gp-0 common-page))
    (set! (-> *cpad-list* cpads 0 buzz) (-> gp-0 vibration))
    (case (-> gp-0 ocean-off)
      ((#t)
       (set! *ocean-off* #t)
       )
      (('mid)
       (set! *ocean-mid-off* #t)
       )
      (('near)
       (set! *ocean-near-off* #t)
       )
      )
    gp-0
    )
  )

;; failed to figure out what this is:
(when (zero? *setting-control*)
  (set! *setting-control* (new 'global 'setting-control 32))
  (let ((gp-0 (-> *setting-control* default))
        (s5-0 (-> *setting-control* current))
        )
    (let ((f0-2 (* 0.01 (the float (scf-get-volume)))))
      (set! (-> gp-0 ocean-off) #f)
      (set! (-> gp-0 allow-look-around) #t)
      (set! (-> gp-0 border-mode) #f)
      (set! (-> gp-0 sfx-volume) (the float (* 5 (the int (+ 0.5 (* 15.0 f0-2))))))
      (set! (-> gp-0 music-volume) (the float (* 5 (the int (+ 0.5 (* 13.0 f0-2))))))
      (set! (-> gp-0 dialog-volume) (the float (* 5 (the int (+ 0.5 (* 20.0 f0-2))))))
      (set! (-> gp-0 ambient-volume) (the float (* 5 (the int (+ 0.5 (* 15.0 f0-2))))))
      (set! (-> gp-0 sfx-volume-movie) (the float (* 5 (the int (+ 0.5 (* 11.0 f0-2))))))
      (set! (-> gp-0 music-volume-movie) (the float (* 5 (the int (+ 0.5 (* 13.0 f0-2))))))
      (set! (-> gp-0 ambient-volume-movie) (the float (* 5 (the int (+ 0.5 (* 11.0 f0-2))))))
      (set! (-> gp-0 dialog-volume-hint) (the float (* 5 (the int (+ 0.5 (* 16.0 f0-2))))))
      )
    (set! (-> gp-0 language) (scf-get-language))
    (set! (-> gp-0 process-mask) (process-mask execute sleep))
    (set! (-> gp-0 screenx) 0)
    (set! (-> gp-0 screeny) 0)
    (set! (-> gp-0 vibration) #t)
    (set! (-> gp-0 auto-save) #f)
    (set! (-> gp-0 play-hints) #t)
    (set! (-> gp-0 movie) (the-as (pointer process) #f))
    (set! (-> gp-0 talking) (the-as (pointer process) #f))
    (set! (-> gp-0 spooling) (the-as (pointer process) #f))
    (set! (-> gp-0 hint) (the-as (pointer process) #f))
    (set! (-> gp-0 ambient) (the-as (pointer process) #f))
    (set! (-> gp-0 sound-flava) (the-as uint 49))
    (set! (-> gp-0 sound-flava-priority) 0.0)
    (set! (-> gp-0 music) #f)
    (set! (-> gp-0 bg-a-speed) 8.0)
    (set! (-> gp-0 allow-pause) #t)
    (set! (-> gp-0 allow-progress) #t)
    (case (scf-get-aspect)
      ((2)
       (set! (-> gp-0 aspect-ratio) 'aspect16x9)
       )
      (else
        (set! (-> gp-0 aspect-ratio) 'aspect4x3)
        )
      )
    (if (zero? *boot-video-mode*)
        (set! (-> gp-0 video-mode) 'ntsc)
        (set! (-> gp-0 video-mode) 'pal)
        )
    (set! (-> s5-0 sfx-volume) (+ -1.0 (-> gp-0 sfx-volume)))
    (set! (-> s5-0 music-volume) (+ -1.0 (-> gp-0 music-volume)))
    (set! (-> s5-0 dialog-volume) (+ -1.0 (-> gp-0 dialog-volume)))
    (set! (-> s5-0 ambient-volume) (+ -1.0 (-> gp-0 ambient-volume)))
    (set! (-> s5-0 sfx-volume-movie) (-> gp-0 sfx-volume-movie))
    (set! (-> s5-0 music-volume-movie) (-> gp-0 music-volume-movie))
    (set! (-> s5-0 ambient-volume-movie) (-> gp-0 ambient-volume-movie))
    (set! (-> s5-0 dialog-volume-hint) (-> gp-0 dialog-volume-hint))
    (set! (-> s5-0 language) (+ (-> gp-0 language) -1))
    (set! (-> s5-0 aspect-ratio) #f)
    (set! (-> s5-0 video-mode) #f)
    (set! (-> s5-0 music) #f)
    (set! (-> s5-0 bg-a-speed) (-> gp-0 bg-a-speed))
    (set! (-> s5-0 allow-pause) (-> gp-0 allow-pause))
    (set! (-> s5-0 allow-progress) (-> gp-0 allow-progress))
    (set! (-> s5-0 allow-look-around) (-> gp-0 allow-look-around))
    (set! (-> s5-0 ocean-off) (-> gp-0 ocean-off))
    )
  )
