Files
jak-project/goal_src/jak1/engine/entity/entity-table.gc
T
2026-07-26 14:43:53 -04:00

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))))