dl.ss
#lang scheme
(require "fake-typed.ss")

(define-struct: bulletdl ([type : (U 'vertical 'horizontal)]
                          [top : (Option action)]))

(define-struct: bullet ([direction : (Option direction)]
                        [speed : (Option speed)]
                        [params : (Vectorof Expression)]
                        [action : (Option action)]))

(define-type-alias action (U seqn repeat fire changeSpeed changeDirection accel wait vanish))

(define-struct: seqn ([actions : (Listof action)]))

(define-struct: fire ([direction : (Option direction)]
                      [speed : (Option speed)]
                      [bullet : bullet]))

(define-struct: changeDirection ([direction : direction]
                                 [frames : Expression]))

(define-struct: changeSpeed ([speed : speed]
                             [frames : Expression]))

(define-struct: accel ([horizontal : (Option horizontal)]
                       [vertical : (Option vertical)]
                       [frames : Expression]))

(define-struct: wait ([frames : Expression]))

(define-struct: vanish ())

(define-struct: repeat ([times : Expression]
                        [action : action]))

(define-struct: direction ([type : (U 'aim 'absolute 'relative 'sequence)]
                           [degrees : Expression]))

(define-struct: speed ([type : (U 'absolute 'relative 'sequence)]
                       [units : Expression]))

(define-struct: horizontal ([type : (U 'absolute 'relative 'sequence)]
                            [units : Expression]))

(define-struct: vertical ([type : (U 'absolute 'relative 'sequence)]
                          [units : Expression]))

(define-struct: stalled-params ([evector : (Vectorof Expression)]
                                [inner : action]))

(define-struct: saved-params ([pvector : (Vectorof Number)]
                              [inner : action]))

(define-struct: Expression ([value-or-fun : (U Number (Number (Vectorof Number) -> Number))]))

(provide (all-defined-out))