jak-project/goal_src/jak1/levels/citadel/assistant-citadel.gc
Tyler Wilding d1ece445d4
Dependency graph work - Part 1 - Preliminary work (#3505)
Relates to #1353 

This adds no new functionality or overhead to the compiler, yet. This is
the preliminary work that has:
- added code to the compiler in several spots to flag when something is
used without being properly required/imported/whatever (disabled by
default)
- that was used to generate project wide file dependencies (some
circulars were manually fixed)
- then that graph underwent a transitive reduction and the result was
written to all `jak1` source files.

The next step will be making this actually produce and use a dependency
graph. Some of the reasons why I'm working on this:
- eliminates more `game.gp` boilerplate. This includes the `.gd` files
to some extent (`*-ag` files and `tpage` files will still need to be
handled) this is the point of the new `bundles` form. This should make
it even easier to add a new file into the source tree.
- a build order that is actually informed from something real and
compiler warnings that tell you when you are using something that won't
be available at build time.
- narrows the search space for doing LSP actions -- like searching for
references. Since it would be way too much work to store in the compiler
every location where every symbol/function/etc is used, I have to do
ad-hoc searches. By having a dependency graph i can significantly reduce
that search space.
- opens the doors for common shared code with a legitimate pattern.
Right now jak 2 shares code from the jak 1 folder. This is basically a
hack -- but by having an explicit require syntax, it would be possible
to reference arbitrary file paths, such as a `common` folder.

Some stats:
- Jak 1 has about 2500 edges between files, including transitives
- With transitives reduced at the source code level, each file seems to
have a modest amount of explicit requirements.

Known issues:
- Tracking the location for where `defmacro`s and virtual state
definitions were defined (and therefore the file) is still problematic.
Because those forms are in a macro environment, the reader does not
track them. I'm wondering if a workaround could be to search the
reader's text_db by not just the `goos::Object` but by the text
position. But for the purposes of finishing this work, I just statically
analyzed and searched the code with throwaway python code.
2024-05-12 12:37:59 -04:00

124 lines
3.6 KiB
Common Lisp

;;-*-Lisp-*-
(in-package goal)
(bundles "CIT.DGO")
(require "engine/common-obs/process-taskable.gc")
;; name: assistant-citadel.gc
;; name in dgo: assistant-citadel
;; dgos: CIT, L1
;; DECOMP BEGINS
(deftype assistant-lavatube-end (process-taskable)
()
)
(defskelgroup *assistant-lavatube-end-sg* assistant-lavatube-end assistant-lavatube-end-lod0-jg assistant-lavatube-end-idle-ja
((assistant-lavatube-end-lod0-mg (meters 999999)))
:bounds (static-spherem 0 0 0 4)
:shadow assistant-lavatube-end-shadow-mg
)
(defmethod play-anim! ((this assistant-lavatube-end) (arg0 symbol))
(case (current-status (-> this tasks))
(((task-status unknown) (task-status need-hint))
(new 'static 'spool-anim :name "assistant-lavatube-end-resolution" :index 4 :parts 11 :command-list '())
)
(((task-status need-reward-speech))
(if arg0
(close-current! (-> this tasks))
)
(new 'static 'spool-anim
:name "assistant-lavatube-end-resolution"
:index 4
:parts 11
:command-list '((61 joint "cameraB")
(151 joint "camera")
(226 joint "cameraB")
(273 joint "camera")
(316 joint "cameraB")
(451 joint "camera")
(651 joint "cameraB")
(786 joint "camera")
(888 joint "cameraB")
(1011 joint "camera")
(1011 shadow target #f)
(1140 shadow target #t)
(1191 joint "cameraB")
)
)
)
(else
(if arg0
(format
0
"ERROR: <GMJ>: ~S playing anim for task status ~S~%"
(-> this name)
(task-status->string (current-status (-> this tasks)))
)
)
(get-art-elem this)
)
)
)
(defmethod get-art-elem ((this assistant-lavatube-end))
(-> this draw art-group data 3)
)
(defstate hidden (assistant-lavatube-end)
:virtual #t
:trans (behavior ()
(process-taskable-method-33 self)
((-> (method-of-type process-taskable hidden) trans))
(when (and (and *target* (>= 61440.0 (vector-vector-distance (-> self root trans) (-> *target* control trans))))
(not (closed? (-> self tasks) (game-task village4-button) (task-status need-reward-speech)))
)
)
)
)
(defstate idle (assistant-lavatube-end)
:virtual #t
:enter (behavior ()
((-> (method-of-type process-taskable idle) enter))
(case (get-task-status (game-task village4-button))
(((task-status need-reward-speech))
(send-event self 'play-anim)
)
)
)
:code (behavior ()
(loop
(when (!= (ja-group) (get-art-elem self))
(ja-channel-push! 1 (seconds 0.05))
(ja :group! assistant-lavatube-end-idle-ja)
)
(ja-no-eval :group! (ja-group) :num! (seek!) :frame-num 0.0)
(until (ja-done? 0)
(suspend)
(ja :num! (seek!))
)
)
)
)
(defmethod should-display? ((this assistant-lavatube-end))
(first-any (-> this tasks) #t)
(let ((v1-3 (current-status (-> this tasks))))
(and (or (= v1-3 (task-status need-reward-speech)) (= v1-3 (task-status invalid)))
(not (task-closed? (game-task citadel-sage-green) (task-status need-hint)))
)
)
)
(defmethod init-from-entity! ((this assistant-lavatube-end) (arg0 entity-actor))
(process-taskable-method-40 this arg0 *assistant-lavatube-end-sg* 3 29 (new 'static 'vector :w 4096.0) 5)
(set! (-> this tasks) (get-task-control (game-task village4-button)))
(first-any (-> this tasks) #t)
(process-taskable-method-42 this)
(none)
)