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

;; name: res-h.gc
;; name in dgo: res-h
;; dgos: GAME

(deftype res-tag-pair (uint64)
  "The indices of two [[res-tag]]s. If the specific key-frame time is in between two
   res-tags, this type is used to return the indices of the first res-tag before and after
   the specified time."
  ((lo  int32 :offset 0)
   (hi  int32 :offset 32)
   )
  ;; made-up type
  )


;; +++res-lump-flags
(defenum res-lump-flags
  :type uint16
  :bitfield #t
  (sorted 0)
  (rlf1 1)
  )
;; ---res-lump-flags


(define-extern *res-static-buf* pointer)

;; DECOMP BEGINS

(deftype res-tag (uint128)
  "Metadata about a property in a [[res-lump]], such as name, element type and element count."
  ((name        symbol :offset   0 :size  32)
   (key-frame   float  :offset  32 :size  32)
   (elt-type    type   :offset  64 :size  32)
   (data-offset uint16 :offset  96 :size  16)
   (elt-count   uint32 :offset 112 :size  15)
   (inlined?    uint8  :offset 127 :size   1)
   )
  )

(deftype res-lump (basic)
  "A collection of [[res-tag]]s and their data."
  ((length            int32)
   (allocated-length  int16)
   (flags             res-lump-flags)
   (data-base         pointer)
   (data-top          pointer)
   (data-size         int32)
   (extra             entity-links)
   (tag               (pointer res-tag))
   )
  (:methods
    (new (symbol type int int) _type_)
    (get-property-data (_type_ symbol symbol float pointer (pointer res-tag) pointer) pointer :no-virtual)
    (get-property-struct (_type_ symbol symbol float structure (pointer res-tag) pointer) structure :no-virtual)
    (get-property-value (_type_ symbol symbol float uint128 (pointer res-tag) pointer) uint128 :no-virtual)
    (get-property-value-float (_type_ symbol symbol float float (pointer res-tag) pointer) float)
    (get-tag-index-data (_type_ int) pointer)
    (get-tag-data (_type_ res-tag) pointer)
    (allocate-data-memory-for-tag! (_type_ res-tag) res-tag)
    (sort! (_type_) _type_)
    (add-data! (_type_ res-tag pointer) res-lump)
    (add-32bit-data! (_type_ res-tag object) res-lump)
    (lookup-tag-idx (_type_ symbol symbol float) res-tag-pair :no-virtual)
    (make-property-data (_type_ float res-tag-pair pointer) pointer)
    (get-curve-data! (_type_ curve symbol symbol float) symbol)
    )
  )


(define *res-key-string* (new 'global 'string 64 (the-as string #f)))
