mirror of
https://github.com/open-goal/jak-project
synced 2026-08-07 10:16:45 -04:00
219 lines
6.6 KiB
Common Lisp
219 lines
6.6 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
(bundles "ENGINE.CGO" "GAME.CGO")
|
|
(require "engine/entity/entity-h.gc")
|
|
|
|
;; The *entity-info* table contains some simple information that can be used to
|
|
;; spawn a process for an entity.
|
|
;; :ptype the type of the process
|
|
;; :package the package that must be loaded (not used?)
|
|
;; :art-group the art that must be loaded
|
|
;; :pool the pool that the process should be allocated from
|
|
;; :heap-size the required size for the process heap
|
|
|
|
;; This table was much larger in the demo and was reduced for the final game. The actor birth path
|
|
;; uses heap-size to size each process heap; the other fields retain the package, art, and pool
|
|
;; requirements that go with the process type.
|
|
|
|
(define *entity-info*
|
|
(new 'static
|
|
'boxed-array
|
|
:type
|
|
entity-info
|
|
:length 19
|
|
:allocated-length 19
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref sage-finalboss :method-count 53)
|
|
:package "l1"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x8000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref robotboss :method-count 21)
|
|
:package "l1"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x8000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref assistant-levitator :method-count 53)
|
|
:package "l1"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x8000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref babak :method-count 76)
|
|
:package "l1"
|
|
:art-group
|
|
'("babak")
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x2800)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref racer :method-count 24)
|
|
:package "game"
|
|
:art-group
|
|
'("racer")
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x4000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref springbox :method-count 20)
|
|
:package "game"
|
|
:art-group
|
|
'("bounceytarp")
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1400)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref launcher :method-count 20)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x400)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref pickup-spawner :method-count 30)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref bucket :method-count 30)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref barrel :method-count 30)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref crate :method-count 30)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref orb-cache-top :method-count 29)
|
|
:package "game"
|
|
:art-group
|
|
'("orb-cache-top")
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref eco :method-count 31)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref ecovent :method-count 21)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref fuel-cell :method-count 31)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1400)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref buzzer :method-count 31)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x1000)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref money :method-count 31)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00
|
|
;; og:preserve-this CHANGED from 2k!!
|
|
)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref water-vol :method-count 30)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #xc00)
|
|
(new 'static
|
|
'entity-info
|
|
:ptype
|
|
(type-ref target-start :method-count 15)
|
|
:package "game"
|
|
:art-group
|
|
'()
|
|
:pool '*16k-dead-pool*
|
|
:heap-size #x400)))
|
|
|
|
(defun entity-info-lookup ((entity-type type))
|
|
"Find the spawn metadata for entity-type. A successful search replaces the inherited
|
|
process-tree method in slot 13 with the matching entity-info pointer, so later lookups can return
|
|
it directly. Store #f and return #f when the type has no table entry."
|
|
(the-as entity-info
|
|
(cond
|
|
((nonzero? (-> entity-type method-table 13))
|
|
;; Return the entity info already cached in the method table.
|
|
(-> entity-type method-table 13))
|
|
(else
|
|
;; Search the table.
|
|
(let ((info-table *entity-info*))
|
|
(dotimes (i (-> info-table length))
|
|
(when (= entity-type (-> info-table i ptype))
|
|
;; Cache a successful lookup in method slot 13.
|
|
(set! (-> entity-type method-table 13) (the-as function (-> info-table i)))
|
|
(return (the-as entity-info (-> info-table i))))))
|
|
;; Record the miss and return #f.
|
|
(set! (-> entity-type method-table 13) #f)
|
|
#f))))
|