mirror of
https://github.com/open-goal/jak-project
synced 2026-08-02 00:34:13 -04:00
d1ece445d4
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.
98 lines
3.0 KiB
Common Lisp
98 lines
3.0 KiB
Common Lisp
;;-*-Lisp-*-
|
|
(in-package goal)
|
|
|
|
(require "kernel/gstate.gc")
|
|
(require "engine/ps2/pad.gc")
|
|
|
|
|
|
|
|
;; This file is used for debugging and testing the large font encoding.
|
|
;; This file should *not* be included as part of any packages, it should be manually loaded by the user.
|
|
|
|
;; To run this:
|
|
|
|
#|
|
|
(mi) ;; build the game
|
|
(lt) ;; connect to the runtime
|
|
(ml "goal_src/jak1/pc/util/font-encode-test.gc") ;; build and load this file.
|
|
|#
|
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;; constants
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(defconstant FONT_ENCODE_TEXT_LEFT 56)
|
|
(defconstant FONT_ENCODE_TEXT_Y 80)
|
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
;;;; functions
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
(define *font-string* (new 'global 'string 64 (the string #f)))
|
|
(define *font-string-ex* (the string #f))
|
|
(define *font-string-val* #x96)
|
|
|
|
(defun-debug font-encode-test-start ()
|
|
"start the encode test proc"
|
|
|
|
(unless (process-by-name 'font-encode *active-pool*)
|
|
(process-spawn-function process :name 'font-encode
|
|
(lambda :behavior process ()
|
|
(let ((fnt (new 'stack 'font-context *font-default-matrix* FONT_ENCODE_TEXT_LEFT FONT_ENCODE_TEXT_Y 0.0
|
|
(font-color red) (font-flags shadow kerning large middle)))
|
|
)
|
|
|
|
(set-width! fnt 400)
|
|
(set-height! fnt 100)
|
|
|
|
(loop
|
|
(suspend)
|
|
|
|
(if (or (cpad-pressed? 0 left) (cpad-hold? 0 l1))
|
|
(-! *font-string-val* 1))
|
|
(if (or (cpad-pressed? 0 right) (cpad-hold? 0 r1))
|
|
(+! *font-string-val* 1))
|
|
(minmax! *font-string-val* 1 #x1ff)
|
|
|
|
(clear *font-string*)
|
|
(cond
|
|
((>= *font-string-val* #x100)
|
|
(set! (-> *font-string* data 0) (/ *font-string-val* 256))
|
|
(set! (-> *font-string* data 1) (logand *font-string-val* #xff))
|
|
(set! (-> *font-string* data 2) 0)
|
|
)
|
|
(else
|
|
(set! (-> *font-string* data 0) (logand *font-string-val* #xff))
|
|
(set! (-> *font-string* data 1) 0)
|
|
)
|
|
)
|
|
|
|
(set-origin! fnt FONT_ENCODE_TEXT_LEFT FONT_ENCODE_TEXT_Y)
|
|
(set-flags! fnt (font-flags shadow kerning large middle))
|
|
(print-game-text *font-string* fnt #f 128 24)
|
|
(when *font-string-ex*
|
|
(set-origin! fnt FONT_ENCODE_TEXT_LEFT (+ FONT_ENCODE_TEXT_Y 32))
|
|
(print-game-text *font-string-ex* fnt #f 128 24))
|
|
(set-origin! fnt FONT_ENCODE_TEXT_LEFT (- FONT_ENCODE_TEXT_Y 16))
|
|
(set-flags! fnt (font-flags shadow kerning middle))
|
|
(print-game-text (string-format "#x~x" *font-string-val*) fnt #f 128 12)
|
|
)
|
|
)
|
|
|
|
)
|
|
)
|
|
)
|
|
)
|
|
|
|
(defun-debug font-encode-test-stop ()
|
|
"stop the encode test proc"
|
|
|
|
(kill-by-name 'font-encode *active-pool*)
|
|
)
|
|
|
|
|