; SPDX-FileCopyrightText: 2023 Jummit
;
; SPDX-License-Identifier: GPL-3.0-or-later

(local {: new-world} (require :world))
(local {: new-opponent-select} (require :opponent_select))
(local {: new-tutorial} (require :tutorial))
(local {: new-credits} (require :credits))
(local {: draw-cards :kinds card-kinds} (require :cards))
(local {: select-with-mouse : perform-select} (require :select))
(local {: slide} (require :slide))
(local {: decay} (require :decay))

(fn draw-title-screen []
  (do
    (_G.cls 8)
    (_G.rect 0 30 250 75 9)
    (_G.print "TIC-80:\nACCESS BATTLERS" 36 39 13 false 2)))

(fn emit [entities]
  (each [_ entity (ipairs entities)]
    (case entity
      (where {:emitter {:wait ?wait : delay : emission}}
             (or (= ?wait nil) (= ?wait 0)))
      (do
        (table.insert entities (emission))
        (set entity.emitter.wait delay))
      {:emitter {: wait}}
      (set entity.emitter.wait (- wait 1)))))

(fn emitter [direction x y]
  {:emitter {:delay 20
             :emission (fn []
                         {:card {:owner (math.random 1 2)
                                 :kind (. card-kinds
                                          (math.random 1 (length card-kinds)))
                                 :open true}
                          :sliding {:x direction}
                          : x
                          : y
                          :decay-in 250})}})

(fn draw-selected [world]
  (each [_ entity (ipairs world)]
    (case entity
      {:selected true : x : y}
      (_G.print ">" (- x 8) y 13))))

(fn draw-text [world]
  (each [_ entity (ipairs world)]
    (case entity
      {: text : x : y}
      (_G.print text x y 13))))

(fn new-title-screen []
  (_G.music 1)
  (local world (new-world [draw-title-screen
                           draw-cards
                           draw-text
                           draw-selected
                           slide
                           emit
                           decay
                           select-with-mouse
                           perform-select]
                          [{:title-screen {:selected 1}}
                           (emitter 1 -8 10)
                           (emitter -1 238 114)]))
  (each [i [text world-fn] (ipairs [["1 Player" new-opponent-select]
                                    ["2 Players" new-opponent-select]
                                    ["How to Play"
                                     (fn [] (new-tutorial world))]
                                    [:Credits (fn [] (new-credits world))]])]
    (table.insert world {:on-select (fn [] (set world.next (world-fn)))
                         :x 80
                         :y (+ 60 (* i 8))
                         :w 100
                         :h 8
                         : text}))
  world)

{: new-title-screen}