;;-*-Lisp-*-
(in-package goal)
(bundles "ENGINE.CGO" "GAME.CGO")
(require "engine/ui/progress/progress-h.gc")
(require "engine/ui/text-h.gc")
(require "engine/game/task/game-task-h.gc")

;; This file contains the layouts for all of the menus.

;; options in the start menu options
(define *main-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id game-options)
            :scale #t
            :param3 (game-option-menu game-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id graphic-options)
            :scale #t
            :param3 (game-option-menu graphic-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id sound-options)
            :scale #t
            :param3 (game-option-menu sound-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id load-game)
            :scale #t
            :param3 (game-option-menu load-game))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id save-game)
            :scale #t
            :param3 (game-option-menu save-game))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id quit-game)
            :scale #t
            :param3 (game-option-menu quit))
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *title*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id new-game)
            :scale #t
            :param3 (game-option-menu save-game-title))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id load-game)
            :scale #t
            :param3 (game-option-menu load-game))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id options)
            :scale #t
            :param3 (game-option-menu settings-title))
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id game-options)
            :scale #t
            :param3 (game-option-menu game-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id graphic-options)
            :scale #t
            :param3 (game-option-menu graphic-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id sound-options)
            :scale #t
            :param3 (game-option-menu sound-settings))
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *main-options-demo*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id game-options)
            :scale #t
            :param3 (game-option-menu game-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id graphic-options)
            :scale #t
            :param3 (game-option-menu graphic-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id sound-options)
            :scale #t
            :param3 (game-option-menu sound-settings))
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *main-options-demo-shared*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id game-options)
            :scale #t
            :param3 (game-option-menu game-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id graphic-options)
            :scale #t
            :param3 (game-option-menu graphic-settings))
       (new 'static
            'game-option
            :option-type (game-option-type menu)
            :name (text-id sound-options)
            :scale #t
            :param3 (game-option-menu sound-settings))
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id exit-demo) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *game-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id vibrations) :scale #t)
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id play-hints) :scale #t)
       (new 'static 'game-option :option-type (game-option-type language) :name (text-id language) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *game-options-japan*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id vibrations) :scale #t)
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id play-hints) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *game-options-demo*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id vibrations) :scale #t)
       (new 'static 'game-option :option-type (game-option-type on-off) :name (text-id play-hints) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *graphic-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type center-screen) :name (text-id center-screen) :scale #t)
       (new 'static 'game-option :option-type (game-option-type aspect-ratio) :name (text-id aspect-ratio) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *graphic-title-options-pal*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type center-screen) :name (text-id center-screen) :scale #t)
       (new 'static 'game-option :option-type (game-option-type video-mode) :name (text-id video-mode) :scale #t)
       (new 'static 'game-option :option-type (game-option-type aspect-ratio) :name (text-id aspect-ratio) :scale #t)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *sound-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :name (text-id sfx-volume) :scale #t :param2 100.0)
       (new 'static 'game-option :name (text-id music-volume) :scale #t :param2 100.0)
       (new 'static 'game-option :name (text-id speech-volume) :scale #t :param2 100.0)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #t)))

(define *yes-no-options*
  (new 'static 'boxed-array :type game-option (new 'static 'game-option :option-type (game-option-type yes-no) :scale #f)))

(define *ok-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id ok) :scale #f)))

(define *load-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #f)))

(define *save-options*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #f)))

(define *save-options-title*
  (new 'static
       'boxed-array
       :type
       game-option
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id continue-without-saving) :scale #f)
       (new 'static 'game-option :option-type (game-option-type button) :name (text-id back) :scale #f)))

;; maps options to a progress screen
;; the length matches with `(progress-screen max)`
(define *options-remap*
  (new 'static 'boxed-array :type (array game-option) :length 0 :allocated-length (#if (not PC_PORT) 35 68)))

;; added in PC port
(defenum level-task-data-index
  :type int32
  (training 0)
  (village1 1)
  (beach 2)
  (jungle 3)
  (misty 4)
  (firecanyon 5)
  (village2 6)
  (sunken 7)
  (swamp 8)
  (rolling 9)
  (ogre 10)
  (village3 11)
  (snow 12)
  (cave 13)
  (lavatube 14)
  (citadel 15)
  (max 16))

;; maps level-info indices to the appropriate offset in *level-task-data*
(define *level-task-data-remap*
  (new 'static
       'boxed-array
       :type
       int32
       (level-task-data-index training)
       (level-task-data-index village1)
       (level-task-data-index beach)
       (level-task-data-index jungle) ;; jungle?
       (level-task-data-index jungle) ;; jungleb?
       (level-task-data-index misty)
       (level-task-data-index firecanyon)
       (level-task-data-index village2)
       (level-task-data-index sunken) ;; sunken?
       (level-task-data-index sunken) ;; sunkenb?
       (level-task-data-index swamp)
       (level-task-data-index rolling)
       (level-task-data-index ogre)
       (level-task-data-index village3)
       (level-task-data-index snow)
       (level-task-data-index cave) ;; maincave?
       (level-task-data-index cave) ;; robocave?
       (level-task-data-index cave) ;; darkcave?
       (level-task-data-index lavatube)
       (level-task-data-index citadel) ;; citadel?
       (level-task-data-index citadel) ;; finalboss?
       (level-task-data-index misty) ;; demo?
       (level-task-data-index misty) ;; intro?
       ))

;; maps goal language ID to its name string ID
(define *language-name-remap*
  (new 'static
       'boxed-array
       :type
       text-id
       (text-id english)
       (text-id french)
       (text-id german)
       (text-id spanish)
       (text-id italian)
       (text-id japanese)))

;; all level tasks
(define *level-task-data*
  (new 'static
       'boxed-array
       :type
       level-tasks-info
       (new 'static
            'level-tasks-info
            :level-name-id (text-id training-level-name)
            :text-group-index 1
            :nb-of-tasks 4
            :buzzer-task-index 3
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task training-gimmie)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id training-gimmie-task-name)
                           (text-id training-gimmie-task-name)
                           (text-id training-gimmie-task-name)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task training-door)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id training-door-task-name)
                           (text-id training-door-task-name)
                           (text-id training-door-task-name)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task training-climb)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id training-climb-task-name)
                           (text-id training-climb-task-name)
                           (text-id training-climb-task-name)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task training-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id training-buzzer-task-name)
                           (text-id training-buzzer-task-name)
                           (text-id training-buzzer-task-name)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id village1-level-name)
            :text-group-index 1
            :nb-of-tasks 6
            :buzzer-task-index 5
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-mayor-money)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village1-mayor-money)
                           (text-id village1-mayor-money)
                           (text-id village1-mayor-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-uncle-money)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village1-uncle-money)
                           (text-id village1-uncle-money)
                           (text-id village1-uncle-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-yakow)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village1-yakow-herd)
                           (text-id village1-yakow-herd)
                           (text-id village1-yakow-return)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-oracle-money1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village1-oracle)
                           (text-id village1-oracle)
                           (text-id village1-oracle)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-oracle-money2)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village1-oracle)
                           (text-id village1-oracle)
                           (text-id village1-oracle)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village1-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-buzzer) (text-id beach-buzzer) (text-id beach-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id beach-level-name)
            :text-group-index 1
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-ecorocks)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-ecorocks) (text-id beach-ecorocks) (text-id beach-ecorocks) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-flutflut)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id beach-flutflut-push)
                           (text-id beach-flutflut-push)
                           (text-id beach-flutflut-meet)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-pelican)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-pelican) (text-id beach-pelican) (text-id beach-pelican) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-seagull)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-seagull) (text-id beach-seagull) (text-id beach-seagull-get) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-cannon)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-cannon) (text-id beach-cannon) (text-id beach-cannon) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-gimmie)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-gimmie) (text-id beach-gimmie) (text-id beach-gimmie) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-sentinel)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-sentinel) (text-id beach-sentinel) (text-id beach-sentinel) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task beach-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-buzzer) (text-id beach-buzzer) (text-id beach-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id jungle-level-name)
            :text-group-index 1
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-lurkerm)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id jungle-lurkerm-unblock)
                           (text-id jungle-lurkerm-connect)
                           (text-id jungle-lurkerm-return)
                           (text-id zero))
                      :text-index-when-resolved 1)
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-tower)
                      :task-name
                      (new 'static 'array text-id 4 (text-id jungle-tower) (text-id jungle-tower) (text-id jungle-tower) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-eggtop)
                      :task-name
                      (new 'static 'array text-id 4 (text-id jungle-eggtop) (text-id jungle-eggtop) (text-id jungle-eggtop) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-plant)
                      :task-name
                      (new 'static 'array text-id 4 (text-id jungle-plant) (text-id jungle-plant) (text-id jungle-plant) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-fishgame)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id jungle-fishgame)
                           (text-id jungle-fishgame)
                           (text-id jungle-fishgame)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-canyon-end)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id jungle-canyon-end)
                           (text-id jungle-canyon-end)
                           (text-id jungle-canyon-end)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-temple-door)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id jungle-temple-door)
                           (text-id jungle-temple-door)
                           (text-id jungle-temple-door)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task jungle-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-buzzer) (text-id beach-buzzer) (text-id beach-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id misty-level-name)
            :text-group-index 1
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-muse)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id misty-muse-catch)
                           (text-id misty-muse-catch)
                           (text-id misty-muse-return)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-boat)
                      :task-name
                      (new 'static 'array text-id 4 (text-id misty-boat) (text-id misty-boat) (text-id misty-boat) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-cannon)
                      :task-name
                      (new 'static 'array text-id 4 (text-id misty-cannon) (text-id misty-cannon) (text-id misty-cannon) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-warehouse)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id misty-return-to-pool)
                           (text-id misty-return-to-pool)
                           (text-id misty-return-to-pool)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-bike)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id misty-find-transpad)
                           (text-id misty-balloon-lurkers)
                           (text-id misty-find-transpad)
                           (text-id zero))
                      :text-index-when-resolved 1)
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-bike-jump)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id misty-bike-jump)
                           (text-id misty-bike-jump)
                           (text-id misty-bike-jump)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-eco-challenge)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id misty-eco-challenge)
                           (text-id misty-eco-challenge)
                           (text-id misty-eco-challenge)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task misty-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id beach-buzzer) (text-id beach-buzzer) (text-id beach-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id firecanyon-level-name)
            :text-group-index 5
            :nb-of-tasks 2
            :buzzer-task-index 1
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task firecanyon-end)
                      :task-name
                      (new 'static 'array text-id 4 (text-id firecanyon-end) (text-id firecanyon-end) (text-id firecanyon-end) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task firecanyon-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id firecanyon-buzzer)
                           (text-id firecanyon-buzzer)
                           (text-id firecanyon-buzzer)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id village2-level-name)
            :text-group-index 2
            :nb-of-tasks 6
            :buzzer-task-index 5
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-gambler-money)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village2-gambler-money)
                           (text-id village2-gambler-money)
                           (text-id village2-gambler-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-geologist-money)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village2-geologist-money)
                           (text-id village2-geologist-money)
                           (text-id village2-geologist-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-warrior-money)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village2-warrior-money)
                           (text-id village2-warrior-money)
                           (text-id village2-warrior-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-oracle-money1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village2-oracle-money)
                           (text-id village2-oracle-money)
                           (text-id village2-oracle-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-oracle-money2)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village2-oracle-money)
                           (text-id village2-oracle-money)
                           (text-id village2-oracle-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village2-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id generic-buzzer) (text-id generic-buzzer) (text-id generic-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id sunken-level-name)
            :text-group-index 2
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-room)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id sunken-elevator-raise)
                           (text-id sunken-elevator-raise)
                           (text-id sunken-elevator-get-to-roof)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-pipe)
                      :task-name
                      (new 'static 'array text-id 4 (text-id sunken-pipe) (text-id sunken-pipe) (text-id sunken-pipe) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-slide)
                      :task-name
                      (new 'static 'array text-id 4 (text-id sunken-slide) (text-id sunken-slide) (text-id sunken-slide) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-sharks)
                      :task-name
                      (new 'static 'array text-id 4 (text-id sunken-pool) (text-id sunken-pool) (text-id sunken-pool) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-platforms)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id sunken-platforms)
                           (text-id sunken-platforms)
                           (text-id sunken-platforms)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-top-of-helix)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id sunken-climb-tube)
                           (text-id sunken-climb-tube)
                           (text-id sunken-climb-tube)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-spinning-room)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id sunken-spinning-room)
                           (text-id sunken-spinning-room)
                           (text-id sunken-spinning-room)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task sunken-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id generic-buzzer) (text-id generic-buzzer) (text-id generic-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id swamp-level-name)
            :text-group-index 2
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-flutflut)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-flutflut) (text-id swamp-flutflut) (text-id swamp-flutflut) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-billy)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-billy) (text-id swamp-billy) (text-id swamp-billy) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-battle)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-battle) (text-id swamp-battle) (text-id swamp-battle) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-tether-4)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-tether) (text-id swamp-tether) (text-id swamp-tether) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-tether-1)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-tether) (text-id swamp-tether) (text-id swamp-tether) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-tether-2)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-tether) (text-id swamp-tether) (text-id swamp-tether) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-tether-3)
                      :task-name
                      (new 'static 'array text-id 4 (text-id swamp-tether) (text-id swamp-tether) (text-id swamp-tether) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task swamp-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id generic-buzzer) (text-id generic-buzzer) (text-id generic-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id rolling-level-name)
            :text-group-index 2
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-moles)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id rolling-moles)
                           (text-id rolling-moles)
                           (text-id rolling-moles-return)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-robbers)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id rolling-robbers)
                           (text-id rolling-robbers)
                           (text-id rolling-robbers)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-race)
                      :task-name
                      (new 'static 'array text-id 4 (text-id rolling-race) (text-id rolling-race) (text-id rolling-race-return) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-lake)
                      :task-name
                      (new 'static 'array text-id 4 (text-id rolling-lake) (text-id rolling-lake) (text-id rolling-lake) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-plants)
                      :task-name
                      (new 'static 'array text-id 4 (text-id rolling-plants) (text-id rolling-plants) (text-id rolling-plants) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-ring-chase-1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id rolling-ring-chase-1)
                           (text-id rolling-ring-chase-1)
                           (text-id rolling-ring-chase-1)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-ring-chase-2)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id rolling-ring-chase-2)
                           (text-id rolling-ring-chase-2)
                           (text-id rolling-ring-chase-2)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task rolling-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id generic-buzzer) (text-id generic-buzzer) (text-id generic-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id ogre-level-name)
            :text-group-index 6
            :nb-of-tasks 4
            :buzzer-task-index 3
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task ogre-boss)
                      :task-name
                      (new 'static 'array text-id 4 (text-id ogre-boss) (text-id ogre-boss) (text-id ogre-boss) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task ogre-end)
                      :task-name
                      (new 'static 'array text-id 4 (text-id ogre-end) (text-id ogre-end) (text-id ogre-end) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task ogre-secret)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id hidden-power-cell)
                           (text-id hidden-power-cell)
                           (text-id hidden-power-cell)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task ogre-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id ogre-buzzer) (text-id ogre-buzzer) (text-id ogre-buzzer) (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id village3-level-name)
            :text-group-index 3
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-miner-money1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-miner-money2)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-miner-money3)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-miner-money4)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id village3-miner-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-oracle-money1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-oracle-money)
                           (text-id village3-oracle-money)
                           (text-id village3-oracle-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-oracle-money2)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-oracle-money)
                           (text-id village3-oracle-money)
                           (text-id village3-oracle-money)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-extra1)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id hidden-power-cell)
                           (text-id hidden-power-cell)
                           (text-id hidden-power-cell)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task village3-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id snow-level-name)
            :text-group-index 3
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-eggtop)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-eggtop) (text-id snow-eggtop) (text-id snow-eggtop) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-ram)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id snow-ram-3-left)
                           (text-id snow-ram-2-left)
                           (text-id snow-ram-1-left)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-bumpers)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-bumpers) (text-id snow-bumpers) (text-id snow-bumpers) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-cage)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-cage) (text-id snow-cage) (text-id snow-cage) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-fort)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-fort) (text-id snow-fort) (text-id snow-fort) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-ball)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-ball) (text-id snow-ball) (text-id snow-ball) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-bunnies)
                      :task-name
                      (new 'static 'array text-id 4 (text-id snow-bunnies) (text-id snow-bunnies) (text-id snow-bunnies) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task snow-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id cave-level-name)
            :text-group-index 3
            :nb-of-tasks 8
            :buzzer-task-index 7
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-gnawers)
                      :task-name
                      (new 'static 'array text-id 4 (text-id cave-gnawers) (text-id cave-gnawers) (text-id cave-gnawers) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-dark-crystals)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id cave-dark-crystals)
                           (text-id cave-dark-crystals)
                           (text-id cave-dark-crystals)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-dark-climb)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id cave-dark-climb)
                           (text-id cave-dark-climb)
                           (text-id cave-dark-climb)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-robot-climb)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id cave-robot-climb)
                           (text-id cave-robot-climb)
                           (text-id cave-robot-climb)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-swing-poles)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id cave-swing-poles)
                           (text-id cave-swing-poles)
                           (text-id cave-swing-poles)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-spider-tunnel)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id cave-spider-tunnel)
                           (text-id cave-spider-tunnel)
                           (text-id cave-spider-tunnel)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-platforms)
                      :task-name
                      (new 'static 'array text-id 4 (text-id cave-platforms) (text-id cave-platforms) (text-id cave-platforms) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task cave-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id village3-buzzer)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id lavatube-level-name)
            :text-group-index 3
            :nb-of-tasks 2
            :buzzer-task-index 1
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task lavatube-end)
                      :task-name
                      (new 'static 'array text-id 4 (text-id lavatube-end) (text-id lavatube-end) (text-id lavatube-end) (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task lavatube-buzzer)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id lavatube-buzzer)
                           (text-id lavatube-buzzer)
                           (text-id lavatube-buzzer)
                           (text-id zero)))))
       (new 'static
            'level-tasks-info
            :level-name-id (text-id citadel-level-name)
            :text-group-index 4
            :nb-of-tasks 5
            :buzzer-task-index 4
            :task-info
            (new 'static
                 'array
                 task-info-data
                 8
                 (new 'static
                      'task-info-data
                      :task-id (game-task citadel-sage-blue)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id citadel-sage-blue)
                           (text-id citadel-sage-blue)
                           (text-id citadel-sage-blue)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task citadel-sage-red)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id citadel-sage-red)
                           (text-id citadel-sage-red)
                           (text-id citadel-sage-red)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task citadel-sage-yellow)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id citadel-sage-yellow)
                           (text-id citadel-sage-yellow)
                           (text-id citadel-sage-yellow)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task citadel-sage-green)
                      :task-name
                      (new 'static
                           'array
                           text-id
                           4
                           (text-id citadel-sage-green)
                           (text-id citadel-sage-green)
                           (text-id citadel-sage-green)
                           (text-id zero)))
                 (new 'static
                      'task-info-data
                      :task-id (game-task citadel-buzzer)
                      :task-name
                      (new 'static 'array text-id 4 (text-id citadel-buzzer) (text-id citadel-buzzer) (text-id citadel-buzzer) (text-id zero)))))))

;; goes down by 24 or 23 every time
(define *task-egg-starting-x* (new 'static 'boxed-array :type int32 218 194 171 147 124 100 77 53 30))

(define *game-counts* (the-as game-count-info #f))
