fix a game bug and add a new compiler feature (#1758)

* dont crash on inline static value array

* [goalc] add support for non-static inline arrays of values

* add a kernel group to jak1

* move and cleanup pc debug code

* random cleanup in `hud-classes`

* pc port fix for gondola spools

* format

* address feedback (wow it was actually just changing 1 line all along...)

* minor decomp cleanup

* ref test
This commit is contained in:
ManDude
2022-08-15 23:46:29 +01:00
committed by GitHub
parent 4dd0c8bf2c
commit dee8feb003
14 changed files with 134 additions and 177 deletions
+1 -1
View File
@@ -21051,7 +21051,7 @@
(define-extern death-movie-remap (function int int int))
(define-extern pov-camera-init-by-other (function vector skeleton-group string pov-camera-flag process-drawable pair none :behavior pov-camera)) ;; TODO - not confirmed -- sunken-elevator
(define-extern target-hit-effect (function attack-info none :behavior target))
(define-extern target-hit-setup-anim (function attack-info object :behavior target))
(define-extern target-hit-setup-anim (function attack-info none :behavior target))
(define-extern target-hit-move (function attack-info symbol (function none :behavior target) float none :behavior target))
(define-extern target-hit-orient (function attack-info vector symbol :behavior target))
(define-extern target-hit-push (function vector matrix float float attack-info object :behavior target))
+5
View File
@@ -878,6 +878,11 @@
`(make-group "iso")
)
(defmacro mkr ()
"Make kernel"
`(make-group "kernel")
)
(defmacro mng ()
"Make engine"
`(make-group "engine")
+9
View File
@@ -246,3 +246,12 @@
(defmacro real-current-time ()
`(-> *display* real-frame-counter)
)
;; debug stuff really
(defmacro get-screen-x (frac)
`(the int (* ,frac 512)))
(defmacro get-screen-y (frac)
`(the int (* ,frac 224)))
+4 -21
View File
@@ -714,25 +714,13 @@
(('back)
(when (not (ja-group? eichar-hit-from-back-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-1 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-1 (the-as art-joint-anim eichar-hit-from-back-ja) num-func-identity)
(let ((f0-0 0.0))
(set! (-> gp-1 frame-num) f0-0)
f0-0
)
)
(ja :group! eichar-hit-from-back-ja :num! min)
)
)
(('up 'up-forward)
(when (not (ja-group? eichar-hit-up-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-2 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-2 (the-as art-joint-anim eichar-hit-up-ja) num-func-identity)
(let ((f0-1 0.0))
(set! (-> gp-2 frame-num) f0-1)
f0-1
)
)
(ja :group! eichar-hit-up-ja :num! min)
)
)
(('air 'jump)
@@ -752,16 +740,11 @@
(else
(when (not (ja-group? eichar-hit-from-front-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-5 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-5 (the-as art-joint-anim eichar-hit-from-front-ja) num-func-identity)
(let ((f0-10 0.0))
(set! (-> gp-5 frame-num) f0-10)
f0-10
)
)
(ja :group! eichar-hit-from-front-ja :num! min)
)
)
)
(none)
)
(defbehavior target-hit-move target ((arg0 attack-info) (arg1 symbol) (arg2 (function none :behavior target)) (arg3 float))
+10 -31
View File
@@ -742,38 +742,17 @@
(let ((t9-0 (method-of-type hud draw-hud)))
(t9-0 obj)
)
(let* ((s5-0 (-> *display* frames (-> *display* on-screen) frame global-buf))
(gp-0 (-> s5-0 base))
)
(let ((s4-0 draw-string-xy))
(format (clear *temp-string*) "~D" (-> obj value))
(s4-0
*temp-string*
s5-0
(+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset)))
(/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset))
(the int (-> *video-parms* relative-y-scale))
(with-dma-buffer-add-bucket ((buf (-> (current-frame) global-buf))
(bucket-id debug))
(draw-string-xy (string-format "~D" (-> obj value)) buf
(+ (-> obj text-x) (* (-> obj x-sgn) (-> obj offset)))
(/ (* (+ (-> obj text-y) (* (-> obj y-sgn) (-> obj offset)) (-> obj y-offset))
(the int (-> *video-parms* relative-y-scale))
)
2
)
2
)
(font-color dark-yellow)
(font-flags shadow kerning large)
)
)
(let ((a3-7 (-> s5-0 base)))
(let ((v1-8 (the-as dma-packet (-> s5-0 base))))
(set! (-> v1-8 dma) (new 'static 'dma-tag :id (dma-tag-id next)))
(set! (-> v1-8 vif0) (new 'static 'vif-tag))
(set! (-> v1-8 vif1) (new 'static 'vif-tag))
(set! (-> s5-0 base) (&+ (the-as pointer v1-8) 16))
)
(dma-bucket-insert-tag
(-> *display* frames (-> *display* on-screen) frame bucket-group)
(bucket-id debug)
gp-0
(the-as (pointer dma-tag) a3-7)
)
)
(font-color dark-yellow)
(font-flags shadow kerning large))
)
0
(none)
@@ -1,61 +0,0 @@
;;-*-Lisp-*-
(in-package goal)
;; This script creates a simple process that draws text demonstrating
;; all of GOAL's color constants to the on-screen debug output.
;; Create somewhere for the handle to the process to live. See https://open-goal.github.io/docs/reference/process_and_state
;; as well as kernel/gstate.gc
(define *color-display-handle* (new 'static 'handle))
(set! *color-display-handle* (the handle #f))
(defun-debug start-display-text-colors ()
"Spawn an onscreen string displaying all possible colors"
(if (not (handle->process *color-display-handle*))
(let ((disp-proc
(process-spawn-function process :name 'display-proc
(lambda :behavior process ()
(stack-size-set! (-> self main-thread) 256)
(loop
;; These constants live in engine/gfx/font-h.gc
(format *stdcon* "~0k~%~%
~0L 0 default ~1L 1 white
~2L 2 gray ~3L 3 orange-red
~4L 4 bright-orange-red ~5L 5 bright-orange-red
~6L 6 bright-green ~7L 7 dark-blue
~8L 8 light-blue ~9L 9 dark-pink
~10L10 lighter-blue ~11L11 dark-light-blue
~12L12 dim-white ~13L13 dim-gray
~14L14 orange-red-2 ~15L15 yellow-green
~16L16 dark-green ~17L17 another-gray
~18L18 dark-dark-green ~19L19 flat-dark-purple
~20L20 flat-yellow ~21L21 blue-white
~22L22 pad-back ~23L23 pad-shine
~24L24 pad-square ~25L25 pad-circle
~26L26 pad-triangle ~27L27 pad-x
~28L28 lighter-lighter-blue ~29L29 yellow-orange
~30L30 yellow-green-2 ~31L31 another-light-blue
~32L32 light-yellow ~33L33 red-orange
~34L34 another-orange-red~0L~%
alternate names
~3L3 red ~4L4 red2 ~5L5 yellow ~6L6 green ~7L7 blue
~10L10 cyan ~33L33 red-reverse ~34L34 red-obverse~0L"
)
(suspend)
)
)
)
))
(set! *color-display-handle* (ppointer->handle disp-proc))
)
;; else
(format #t "Colors are already being displayed")
)
)
(defun-debug stop-display-text-colors ()
"Kill the example text color display"
(kill-by-name 'display-proc *active-pool*)
)
+8
View File
@@ -400,6 +400,14 @@
;;;;;;;;;;;;;;;;;;;;;
;; kernel Group
;;;;;;;;;;;;;;;;;;;;;
;; the kernel group is a group of files required to boot the game kernel
(group "kernel" "$OUT/iso/KERNEL.CGO")
;;;;;;;;;;;;;;;;;;;;;
;; engine Group
;;;;;;;;;;;;;;;;;;;;;
@@ -152,7 +152,15 @@
(not (movie?))
(not (level-hint-displayed?))
(>= (- (-> *display* base-frame-counter) (-> self state-time)) (seconds 3))
(file-status *art-control* (-> self anim name) 0)
;; pc port note : fix gondola spool not loading because it's "too far away" (technically)
(#if (not PC_PORT)
(file-status *art-control* (-> self anim name) 0)
(begin
(spool-push *art-control* (-> self anim name) 0 self (vector-vector-distance
(vector<-cspace! (new 'stack-no-clear 'vector) (-> self node-list data 3))
(target-pos 0)))
(file-status *art-control* (-> self anim name) 0))
)
)
)
(let ((s3-0 (get-reminder (get-task-control (game-task village3-button)) 2))
@@ -0,0 +1,52 @@
;;-*-Lisp-*-
(in-package goal)
;; This script creates a simple process that draws text demonstrating
;; all of GOAL's color constants to the on-screen debug output.
;; Create somewhere for the handle to the process to live. See https://open-goal.github.io/docs/reference/process_and_state
;; as well as kernel/gstate.gc
(define *color-displays* (new 'global 'inline-array 'handle 1))
(defmacro get-color-display-handle ()
`(-> *color-displays* 0))
(set! (get-color-display-handle) INVALID_HANDLE)
;; font-color is from font-h.gc
(defun font-color->string ((val font-color))
"return the name of the font-color"
(enum->string font-color val)
)
(defun draw-all-font-colors ()
"draws all font color names onscreen"
(with-dma-buffer-add-bucket ((buf (-> (current-frame) debug-buf))
(bucket-id debug-no-zbuf))
(dotimes (i 48)
(draw-string-xy (string-format "~2D ~S" i (font-color->string (the font-color i))) buf
(+ 4 (* (get-screen-x 0.5) (mod i 2))) (+ 8 (* 8 (/ i 2))) (the font-color i) (font-flags shadow)))
)
)
(defun start-display-text-colors ()
"Spawn an onscreen string displaying all possible colors"
(if (handle->process (get-color-display-handle))
(format #t "Colors are already being displayed")
;; else
(set! (get-color-display-handle)
(ppointer->handle (process-spawn-function process :name 'display-proc
(lambda :behavior process ()
(loop
(draw-all-font-colors)
(suspend))
)
)))
)
)
(defun-debug stop-display-text-colors ()
"Kill the example text color display"
(kill-by-name 'display-proc *active-pool*)
)
@@ -8,11 +8,9 @@
;; To run this:
#|
(make-group "iso") ;; build the game
(lt) ;; connect to the runtime
(lg) ;; have the runtime load the game engine
(test-play) ;; start the game loop
(ml "goal_src/pc_debug/font-encode-test.gc") ;; build and load this file.
(mi) ;; build the game
(lt) ;; connect to the runtime
(ml "goal_src/jak1/pc/util/font-encode-test.gc") ;; build and load this file.
|#
@@ -30,8 +28,8 @@
;;;; functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define *font-string* (new 'global 'string 64 (the-as string #f)))
(define *font-string-ex* "")
(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 ()
@@ -40,9 +38,6 @@
(unless (process-by-name 'font-encode *active-pool*)
(process-spawn-function process :name 'font-encode
(lambda :behavior process ()
(stack-size-set! (-> self main-thread) 768)
(let ((fnt (new 'stack 'font-context *font-default-matrix* FONT_ENCODE_TEXT_LEFT FONT_ENCODE_TEXT_Y 0.0
(font-color orange-red) (font-flags shadow kerning large middle)))
)
@@ -54,27 +49,20 @@
(suspend)
(if (or (cpad-pressed? 0 left) (cpad-hold? 0 l1))
(-! *font-string-val* 1)
)
(-! *font-string-val* 1))
(if (or (cpad-pressed? 0 right) (cpad-hold? 0 r1))
(+! *font-string-val* 1)
)
(if (< *font-string-val* 1)
(set! *font-string-val* 1)
)
(if (> *font-string-val* #x1ff)
(set! *font-string-val* #x1ff)
)
(+! *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) (mod *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) (mod *font-string-val* 256))
(set! (-> *font-string* data 0) (logand *font-string-val* #xff))
(set! (-> *font-string* data 1) 0)
)
)
@@ -82,11 +70,12 @@
(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)
(set-origin! fnt FONT_ENCODE_TEXT_LEFT (+ FONT_ENCODE_TEXT_Y 32))
(print-game-text *font-string-ex* 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)
(print-game-text (string-format "#x~x" *font-string-val*) fnt #f 128 12)
)
)
@@ -10,11 +10,9 @@
;; To run this:
#|
(make-group "iso") ;; build the game
(lt) ;; connect to the runtime
(lg) ;; have the runtime load the game engine
(test-play) ;; start the game loop
(ml "goal_src/pc_debug/pc-pad-utils.gc") ;; build and load this file.
(mi) ;; build the game
(lt) ;; connect to the runtime
(ml "goal_src/jak1/pc/util/pc-pad-utils.gc") ;; build and load this file.
|#
@@ -30,12 +28,12 @@
)
(define *pc-pad-proc-list* (new 'static 'pc-pad-proc-list))
(set! (-> *pc-pad-proc-list* show) (the handle #f))
(set! (-> *pc-pad-proc-list* input) (the handle #f))
(set! (-> *pc-pad-proc-list* show) INVALID_HANDLE)
(set! (-> *pc-pad-proc-list* input) INVALID_HANDLE)
;; a pc pad process
(deftype pc-pad-proc (process)
((state-time int64)
((state-time time-frame)
(input-index uint64)
(pad-idx int64)
)
+5 -3
View File
@@ -1052,7 +1052,7 @@ StaticResult Compiler::fill_static_inline_array(const goos::Object& form,
// get all arguments now
auto args = get_list_as_vector(rest);
if (args.size() < 4) {
throw_compiler_error(form, "new static boxed array must have type and min-size arguments");
throw_compiler_error(form, "new static inline array must have type and min-size arguments");
}
auto content_type = parse_typespec(args.at(2), env);
s64 min_size = get_constant_integer_or_error(args.at(3), env);
@@ -1060,8 +1060,10 @@ StaticResult Compiler::fill_static_inline_array(const goos::Object& form,
auto inline_array_type = m_ts.make_inline_array_typespec(content_type);
auto deref_info = m_ts.get_deref_info(inline_array_type);
ASSERT(deref_info.can_deref);
ASSERT(!deref_info.mem_deref);
if (!deref_info.can_deref || deref_info.mem_deref) {
throw_compiler_error(form, "new static inline array of type {} is currently not supported",
content_type.print());
}
auto obj = std::make_unique<StaticStructure>(seg);
obj->set_offset(is_basic(content_type) ? 4 : 0);
obj->data.resize(length * deref_info.stride);
+6 -5
View File
@@ -982,8 +982,9 @@ Val* Compiler::compile_heap_new(const goos::Object& form,
throw_compiler_error(form, "new array form got more arguments than expected");
}
auto ts = is_inline ? m_ts.make_inline_array_typespec(elt_type)
: m_ts.make_pointer_typespec(elt_type);
auto ts = is_inline && m_ts.lookup_type(elt_type)->is_reference()
? m_ts.make_inline_array_typespec(elt_type)
: m_ts.make_pointer_typespec(elt_type);
auto info = m_ts.get_deref_info(ts);
if (!info.can_deref) {
throw_compiler_error(form, "Cannot make an {} of {}\n", main_type.print(), ts.print());
@@ -1003,9 +1004,9 @@ Val* Compiler::compile_heap_new(const goos::Object& form,
args.push_back(array_size);
}
auto array = compile_real_function_call(form, malloc_func, args, env);
array->set_type(ts);
return array;
auto new_array = compile_real_function_call(form, malloc_func, args, env);
new_array->set_type(ts);
return new_array;
} else {
bool got_content_type = false; // for boxed array
std::string content_type; // for boxed array.
+5 -21
View File
@@ -713,30 +713,19 @@
)
;; definition for function target-hit-setup-anim
;; INFO: Return type mismatch object vs none.
(defbehavior target-hit-setup-anim target ((arg0 attack-info))
(case (-> arg0 angle)
(('back)
(when (not (ja-group? eichar-hit-from-back-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-1 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-1 (the-as art-joint-anim eichar-hit-from-back-ja) num-func-identity)
(let ((f0-0 0.0))
(set! (-> gp-1 frame-num) f0-0)
f0-0
)
)
(ja :group! eichar-hit-from-back-ja :num! min)
)
)
(('up 'up-forward)
(when (not (ja-group? eichar-hit-up-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-2 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-2 (the-as art-joint-anim eichar-hit-up-ja) num-func-identity)
(let ((f0-1 0.0))
(set! (-> gp-2 frame-num) f0-1)
f0-1
)
)
(ja :group! eichar-hit-up-ja :num! min)
)
)
(('air 'jump)
@@ -756,16 +745,11 @@
(else
(when (not (ja-group? eichar-hit-from-front-ja))
(ja-channel-push! 1 (seconds 0.075))
(let ((gp-5 (-> self skel root-channel 0)))
(joint-control-channel-group-eval! gp-5 (the-as art-joint-anim eichar-hit-from-front-ja) num-func-identity)
(let ((f0-10 0.0))
(set! (-> gp-5 frame-num) f0-10)
f0-10
)
)
(ja :group! eichar-hit-from-front-ja :num! min)
)
)
)
(none)
)
;; definition for function target-hit-move