diff --git a/decompiler/config/jak1_ntsc_black_label.jsonc b/decompiler/config/jak1_ntsc_black_label.jsonc index 3017f6d47..6c599c4b6 100644 --- a/decompiler/config/jak1_ntsc_black_label.jsonc +++ b/decompiler/config/jak1_ntsc_black_label.jsonc @@ -5,7 +5,7 @@ // if you want to filter to only some object names. // it will make the decompiler much faster. "allowed_objects": [], - "banned_objects": ["collide-mesh"], + "banned_objects": [], //////////////////////////// // CODE ANALYSIS OPTIONS diff --git a/game/graphics/opengl_renderer/shaders/sprite_3d.vert b/game/graphics/opengl_renderer/shaders/sprite_3d.vert index b584ec030..737bf8e21 100644 --- a/game/graphics/opengl_renderer/shaders/sprite_3d.vert +++ b/game/graphics/opengl_renderer/shaders/sprite_3d.vert @@ -139,7 +139,7 @@ void main() { float sp_sin = sin(quat.z); float sp_cos = cos(quat.z); - vec4 xy0_vf19 = xy_array[vert_id]; + vec4 xy0_vf19 = xy_array[vert_id + flags_matrix.x]; vec4 vf12_rotated = (basis_x * sp_cos) - (basis_y * sp_sin); vec4 vf13_rotated_trans = (basis_x * sp_sin) + (basis_y * sp_cos); diff --git a/goal_src/engine/anim/joint.gc b/goal_src/engine/anim/joint.gc index b3bcfe16c..c5cac6e3f 100644 --- a/goal_src/engine/anim/joint.gc +++ b/goal_src/engine/anim/joint.gc @@ -1148,6 +1148,27 @@ (matrix*! (-> arg0 bone transform) arg1 (-> arg0 parent bone transform)) ) +;; tricky ones: +;; cspace<-parented-transformq-joint! +;; -manually done, could also be mips2c if too slow +;; clear-frame-accumulator +;; - clear 128 bytes + 48*s2 bytes. +;; - probably should be C++. +;; normalize-frame-quaternions +;; - can mips2c +;; decompress-fixed-data-to-accumulator +;; - pretty big, should mips2c (jump table) +;; decompress-frame-data-to-accumulator +;; - pretty big, should mips2c (jump table) +;; decompress-frame-data-pair-to-accumulator +;; - pretty big, should mips2c (jump table) +;; make-joint-jump-tables +;; - gross +;; calc-animation-from-spr +;; - would be nice as goal. + +;; all run by create-interpolated-joint-animation-frame + (defun cspace<-parented-transformq-joint! ((arg0 cspace) (arg1 transformq)) (nop!) ;; the ops in these funcs were scrambled for pipeline optimization. screw that. diff --git a/goal_src/engine/camera/cam-debug.gc b/goal_src/engine/camera/cam-debug.gc index 14c057e63..f081f3b2f 100644 --- a/goal_src/engine/camera/cam-debug.gc +++ b/goal_src/engine/camera/cam-debug.gc @@ -60,4 +60,33 @@ (none) ) (define-extern slave-los-state->string (function slave-los-state string)) -(define-extern cam-debug-reset-coll-tri (function none)) ;; not confirmed \ No newline at end of file +(define-extern cam-debug-reset-coll-tri (function none)) ;; not confirmed + +(when (or (not *camera-old-cpu*) (zero? *camera-old-cpu*)) + (set! *camera-old-cpu* 0) + 0 + ) + +;; failed to figure out what this is: +(when (or (not *camera-old-vu*) (zero? *camera-old-vu*)) + (set! *camera-old-vu* 0) + 0 + ) + +;; failed to figure out what this is: +(when (or (not *camera-old-tfrag-bytes*) (zero? *camera-old-tfrag-bytes*)) + (set! *camera-old-tfrag-bytes* 0) + 0 + ) + +;; definition (perm) for symbol *camera-old-level*, type string +(define-perm *camera-old-level* string (new 'global 'string 128 (the-as string #f))) + +;; definition (perm) for symbol *camera-old-stat-string-tfrag*, type string +(define-perm *camera-old-stat-string-tfrag* string (new 'global 'string 128 (the-as string #f))) + +;; definition (perm) for symbol *camera-old-stat-string-tfrag-near*, type string +(define-perm *camera-old-stat-string-tfrag-near* string (new 'global 'string 128 (the-as string #f))) + +;; definition (perm) for symbol *camera-old-stat-string-total*, type string +(define-perm *camera-old-stat-string-total* string (new 'global 'string 128 (the-as string #f))) diff --git a/goal_src/engine/collide/collide-mesh.gc b/goal_src/engine/collide/collide-mesh.gc index fddab3e2d..04e87f675 100644 --- a/goal_src/engine/collide/collide-mesh.gc +++ b/goal_src/engine/collide/collide-mesh.gc @@ -107,8 +107,8 @@ (defmethod-mips2c "(method 11 collide-mesh)" 11 collide-mesh) -(defmethod-mips2c "(method 14 collide-mesh)" 11 collide-mesh) -(defmethod-mips2c "(method 15 collide-mesh)" 11 collide-mesh) +(defmethod-mips2c "(method 14 collide-mesh)" 14 collide-mesh) +(defmethod-mips2c "(method 15 collide-mesh)" 15 collide-mesh) (defmethod allocate! collide-mesh-cache ((obj collide-mesh-cache) (arg0 int)) (local-vars (a1-2 int) (a2-2 int)) diff --git a/goal_src/engine/collide/collide-shape.gc b/goal_src/engine/collide/collide-shape.gc index a3e968b15..0fa84b140 100644 --- a/goal_src/engine/collide/collide-shape.gc +++ b/goal_src/engine/collide/collide-shape.gc @@ -2177,6 +2177,24 @@ (v1-0 (-> obj cshape)) (a0-1 (-> obj transform-index)) ) + ;; HACK set all bones to identity. Fixes some issues with press O to talk + ;; but doesn't seem to fix mesh issues (may be another bug there) + (#when NO_BONES_HACK + (cond + ((nonzero? a1-1) + (cond + ((>= a0-1 0) + (dotimes (i (-> a1-1 length)) + (matrix-identity! (-> a1-1 data i bone transform)) + (set! (-> a1-1 data i bone transform vector 3 quad) (-> v1-0 trans quad)) + ) + ) + ) + ) + ) + (set! a0-1 -2) + ) + (cond ((nonzero? a1-1) (cond diff --git a/goal_src/engine/draw/drawable.gc b/goal_src/engine/draw/drawable.gc index 5cb1e7872..0571276e6 100644 --- a/goal_src/engine/draw/drawable.gc +++ b/goal_src/engine/draw/drawable.gc @@ -1168,4 +1168,302 @@ (defmethod collide-y-probe drawable ((obj drawable) (arg0 int) (arg1 collide-list)) 0 (none) - ) \ No newline at end of file + ) + +(defmethod collect-ambients drawable ((obj drawable) (arg0 sphere) (arg1 int) (arg2 ambient-list)) + 0 + (none) + ) + +;; definition (debug) for function marks-cam-restore +;; Used lq/sq +(defun-debug marks-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) 1672489.2) + (set! (-> a0-0 y) 60862.703) + (set! (-> a0-0 z) -13051605.0) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) -0.1783) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) 0.9839) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) -0.0629) + (set! (-> a1-0 vector 1 y) 0.9979) + (set! (-> a1-0 vector 1 z) -0.0114) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) -0.9819) + (set! (-> a1-0 vector 2 y) -0.064) + (set! (-> a1-0 vector 2 z) -0.178) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + (send-event *camera* 'set-fov 17294.205) + (clear *camera-old-level*) + (format *camera-old-level* "village3") + (set! *camera-old-cpu* 1219) + (set! *camera-old-vu* 9602) + (set! *camera-old-tfrag-bytes* 0) + (clear *camera-old-stat-string-tfrag*) + (clear *camera-old-stat-string-tfrag-near*) + (clear *camera-old-stat-string-total*) + (let ((v0-7 #t)) + (set! *display-camera-old-stats* v0-7) + v0-7 + ) + ) + +;; definition (debug) for function eddie-cam-restore +;; Used lq/sq +(defun-debug eddie-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) -427963.66) + (set! (-> a0-0 y) 24967.182) + (set! (-> a0-0 z) 339465.53) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) -0.6026) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) 0.7979) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) -0.1522) + (set! (-> a1-0 vector 1 y) 0.9816) + (set! (-> a1-0 vector 1 z) -0.1149) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) -0.7833) + (set! (-> a1-0 vector 2 y) -0.1908) + (set! (-> a1-0 vector 2 z) -0.5915) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + ) + +;; definition (debug) for function gregs-jungle-cam-restore +;; Used lq/sq +(defun-debug gregs-jungle-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) 1399233.0) + (set! (-> a0-0 y) 39027.11) + (set! (-> a0-0 z) -1485580.1) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) 0.9965) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) 0.0829) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) -0.0021) + (set! (-> a1-0 vector 1 y) 0.9996) + (set! (-> a1-0 vector 1 z) 0.0253) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) -0.0829) + (set! (-> a1-0 vector 2 y) -0.0254) + (set! (-> a1-0 vector 2 z) 0.9962) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + (send-event *camera* 'set-fov 11650.845) + (clear *camera-old-level*) + (format *camera-old-level* "jungle") + (set! *camera-old-cpu* 5801) + (set! *camera-old-vu* 9605) + (set! *camera-old-tfrag-bytes* #x1ffee0) + (clear *camera-old-stat-string-tfrag*) + (clear *camera-old-stat-string-tfrag-near*) + (clear *camera-old-stat-string-total*) + ) + +;; definition (debug) for function gregs-village1-cam-restore +;; Used lq/sq +(defun-debug gregs-village1-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) -511224.06) + (set! (-> a0-0 y) 157579.95) + (set! (-> a0-0 z) 764585.25) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) -0.9009) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) -0.4338) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) 0.0984) + (set! (-> a1-0 vector 1 y) 0.9739) + (set! (-> a1-0 vector 1 z) -0.2043) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) 0.4225) + (set! (-> a1-0 vector 2 y) -0.2268) + (set! (-> a1-0 vector 2 z) -0.8774) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + (send-event *camera* 'set-fov 11650.845) + (clear *camera-old-level*) + (format *camera-old-level* "village1") + (set! *camera-old-cpu* 4899) + (set! *camera-old-vu* 9605) + (set! *camera-old-tfrag-bytes* #x24e680) + (clear *camera-old-stat-string-tfrag*) + (clear *camera-old-stat-string-tfrag-near*) + (clear *camera-old-stat-string-total*) + ) + +;; definition (debug) for function gregs-texture-cam-restore +;; Used lq/sq +(defun-debug gregs-texture-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) 1103816.0) + (set! (-> a0-0 y) 96275.71) + (set! (-> a0-0 z) -632064.5) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) 0.4063) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) -0.9137) + (set! (-> a1-0 vector 0 w) 1.0) + (set! (-> a1-0 vector 1 x) 0.2824) + (set! (-> a1-0 vector 1 y) 0.951) + (set! (-> a1-0 vector 1 z) 0.1256) + (set! (-> a1-0 vector 1 w) 1.0) + (set! (-> a1-0 vector 2 x) 0.8689) + (set! (-> a1-0 vector 2 y) -0.3091) + (set! (-> a1-0 vector 2 z) 0.3864) + (set! (-> a1-0 vector 2 w) 1.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + (send-event *camera* 'set-fov 11650.845) + (clear *camera-old-level*) + (format *camera-old-level* "village1") + (set! *camera-old-cpu* 4772) + (set! *camera-old-vu* 9603) + (set! *camera-old-tfrag-bytes* #x22e680) + (clear *camera-old-stat-string-tfrag*) + (clear *camera-old-stat-string-tfrag-near*) + (clear *camera-old-stat-string-total*) + ) + +;; definition (debug) for function gregs-texture2-cam-restore +;; Used lq/sq +(defun-debug gregs-texture2-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) 1954572.9) + (set! (-> a0-0 y) 135123.98) + (set! (-> a0-0 z) -1028725.44) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) 0.2535) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) 0.9673) + (set! (-> a1-0 vector 0 w) 1.0) + (set! (-> a1-0 vector 1 x) -0.1051) + (set! (-> a1-0 vector 1 y) 0.994) + (set! (-> a1-0 vector 1 z) 0.0275) + (set! (-> a1-0 vector 1 w) 1.0) + (set! (-> a1-0 vector 2 x) -0.9615) + (set! (-> a1-0 vector 2 y) -0.1087) + (set! (-> a1-0 vector 2 z) 0.252) + (set! (-> a1-0 vector 2 w) 1.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + (send-event *camera* 'set-fov 11650.845) + (clear *camera-old-level*) + (format *camera-old-level* "village1") + (set! *camera-old-cpu* 4936) + (set! *camera-old-vu* #x4b0c) + (set! *camera-old-tfrag-bytes* #x22e680) + (clear *camera-old-stat-string-tfrag*) + (clear *camera-old-stat-string-tfrag-near*) + (clear *camera-old-stat-string-total*) + ) + +;; definition (debug) for function cave-cam-restore +;; Used lq/sq +(defun-debug cave-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) -1449013.1) + (set! (-> a0-0 y) 15114.015) + (set! (-> a0-0 z) -1621305.5) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) -0.8223) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) -0.5689) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) 0.0076) + (set! (-> a1-0 vector 1 y) 0.9999) + (set! (-> a1-0 vector 1 z) -0.0111) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) 0.5689) + (set! (-> a1-0 vector 2 y) -0.0135) + (set! (-> a1-0 vector 2 z) -0.8222) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + ) + +;; definition (debug) for function paals-cam-restore +;; Used lq/sq +(defun-debug paals-cam-restore () + (let ((a0-0 (new-stack-vector0)) + (a1-0 (new-stack-matrix0)) + ) + (set! (-> a0-0 x) -791260.7) + (set! (-> a0-0 y) 50858.62) + (set! (-> a0-0 z) -163715.47) + (set! (-> a0-0 w) 1.0) + (set! (-> a1-0 vector 0 x) -0.7816) + (set! (-> a1-0 vector 0 y) 0.0) + (set! (-> a1-0 vector 0 z) -0.6236) + (set! (-> a1-0 vector 0 w) 0.0) + (set! (-> a1-0 vector 1 x) 0.0672) + (set! (-> a1-0 vector 1 y) 0.9941) + (set! (-> a1-0 vector 1 z) -0.0843) + (set! (-> a1-0 vector 1 w) 0.0) + (set! (-> a1-0 vector 2 x) 0.62) + (set! (-> a1-0 vector 2 y) -0.1079) + (set! (-> a1-0 vector 2 z) -0.7771) + (set! (-> a1-0 vector 2 w) 0.0) + (set! (-> a1-0 vector 3 x) 0.0) + (set! (-> a1-0 vector 3 y) 0.0) + (set! (-> a1-0 vector 3 z) 0.0) + (set! (-> a1-0 vector 3 w) 1.0) + (debug-set-camera-pos-rot! a0-0 a1-0) + ) + ) + + + + diff --git a/goal_src/engine/entity/entity.gc b/goal_src/engine/entity/entity.gc index cd4b3329f..2ebf8f512 100644 --- a/goal_src/engine/entity/entity.gc +++ b/goal_src/engine/entity/entity.gc @@ -1259,19 +1259,24 @@ (define-extern launcher type) (define-extern warp-gate-switch type) (define-extern lurkercrab type) +(define-extern ecoventrock type) +(define-extern harvester type) +(define-extern yakow type) + (defmacro heap-size-hack (info entity-type) - `(cond - ((type-type? ,entity-type collectable) - #x1000 - ) - (else - (if ,info - (-> ,info heap-size) - #x4000 - ) - ) - ) + #x8000 + ; `(cond + ; ((type-type? ,entity-type collectable) + ; #x1000 + ; ) + ; (else + ; (if ,info + ; (-> ,info heap-size) + ; #x4000 + ; ) + ; ) + ; ) ) (defmethod birth! entity-actor ((obj entity-actor)) @@ -1287,11 +1292,13 @@ (type-type? (-> obj etype) racer) (type-type? (-> obj etype) launcher) (type-type? (-> obj etype) warp-gate-switch) - (type-type? (-> obj etype) lurkercrab) ;; crash on death - ;(type-type? (-> obj etype) crate) - + (type-type? (-> obj etype) lurkercrab) + (type-type? (-> obj etype) crate) + (type-type? (-> obj etype) ecoventrock) + (type-type? (-> obj etype) harvester) + (type-type? (-> obj etype) yakow) ) - ;;(birth-log "rejecting ~A birth because yes (was ~A)~%" obj (-> obj etype)) + ;; (birth-log "rejecting ~A birth because yes (was ~A)~%" obj (-> obj etype)) (logior! (-> obj extra perm status) (entity-perm-status bit-0)) (return obj) ) diff --git a/goal_src/engine/game/collectables.gc b/goal_src/engine/game/collectables.gc index 1d7e58b6a..9729cdf49 100644 --- a/goal_src/engine/game/collectables.gc +++ b/goal_src/engine/game/collectables.gc @@ -2072,7 +2072,7 @@ ) (defmethod initialize fuel-cell ((obj fuel-cell)) - (stack-size-set! (-> obj main-thread) 512) + (stack-size-set! (-> obj main-thread) 1280) ;; was 512 (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player)))) (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) (set! (-> s5-0 reaction) default-collision-reaction) @@ -2432,6 +2432,7 @@ ) (defmethod initialize buzzer ((obj buzzer)) + (stack-size-set! (-> obj main-thread) 512) ;; added (let ((s5-0 (new 'process 'collide-shape-moving obj (collide-list-enum hit-by-player)))) (set! (-> s5-0 dynam) (copy *standard-dynamics* 'process)) (set! (-> s5-0 reaction) default-collision-reaction) diff --git a/goal_src/engine/game/effect-control.gc b/goal_src/engine/game/effect-control.gc index 965ba4461..37d09612d 100644 --- a/goal_src/engine/game/effect-control.gc +++ b/goal_src/engine/game/effect-control.gc @@ -231,25 +231,30 @@ ) (defmethod TODO-RENAME-14 effect-control ((obj effect-control) (arg0 float) (arg1 float) (arg2 float)) - (let ((s2-0 (-> obj name))) - (while (= (-> s2-0 0 name) 'effect-name) - (let ((f0-0 (-> s2-0 0 key-frame))) - (when (or (and (< f0-0 arg1) (< arg0 f0-0)) (= f0-0 arg2)) - (let* ((a0-1 obj) - (t9-0 (method-of-object a0-1 dummy-10)) - (v1-7 (-> obj res)) - (a1-1 (-> s2-0 0)) - ) - (t9-0 - a0-1 - (the-as symbol (-> (the-as (pointer uint32) (&+ (-> v1-7 data-base) (-> a1-1 data-offset))))) - f0-0 - -1 + ;; note: this check was added. I believe in the original game name could be false, and then the + ;; effect-name check below would fail. This did not cause a crash on original hardware because + ;; misaligned 16-byte loads silently align. This causes a crash in opengoal, so we skip it manually. + (when (-> obj name) + (let ((s2-0 (-> obj name))) + (while (= (-> s2-0 0 name) 'effect-name) + (let ((f0-0 (-> s2-0 0 key-frame))) + (when (or (and (< f0-0 arg1) (< arg0 f0-0)) (= f0-0 arg2)) + (let* ((a0-1 obj) + (t9-0 (method-of-object a0-1 dummy-10)) + (v1-7 (-> obj res)) + (a1-1 (-> s2-0 0)) + ) + (t9-0 + a0-1 + (the-as symbol (-> (the-as (pointer uint32) (&+ (-> v1-7 data-base) (-> a1-1 data-offset))))) + f0-0 + -1 + ) ) ) ) + (set! s2-0 (&-> s2-0 1)) ) - (set! s2-0 (&-> s2-0 1)) ) ) 0 diff --git a/goal_src/engine/game/generic-obs.gc b/goal_src/engine/game/generic-obs.gc index cbe348c1b..04dcde4bf 100644 --- a/goal_src/engine/game/generic-obs.gc +++ b/goal_src/engine/game/generic-obs.gc @@ -536,7 +536,7 @@ ) (defbehavior manipy-init manipy ((arg0 vector) (arg1 entity) (arg2 skeleton-group) (arg3 vector)) - (stack-size-set! (-> self main-thread) 128) + (stack-size-set! (-> self main-thread) 256) ;; from 128 (logior! (-> self mask) (process-mask heap-shrunk)) (set! (-> self entity) arg1) (cond @@ -1218,7 +1218,7 @@ ) (defbehavior camera-tracker-init camera-tracker ((arg0 object)) - (stack-size-set! (-> self main-thread) 512) + (stack-size-set! (-> self main-thread) 768) ;; was 512 (logclear! (-> self mask) (process-mask actor-pause movie enemy platform projectile)) (set! (-> self mask-to-clear) (the-as uint #x4a0800)) (set! (-> self grab-target) (the-as handle #f)) diff --git a/goal_src/engine/game/main-h.gc b/goal_src/engine/game/main-h.gc index c36a19653..14cdf3ea2 100644 --- a/goal_src/engine/game/main-h.gc +++ b/goal_src/engine/game/main-h.gc @@ -7,6 +7,7 @@ ;; Global engine settings: (defglobalconstant TARGET_STARTUP_HACKS #t) +(defglobalconstant NO_BONES_HACK #t) (define *stats-poly* #f) (define *stats-memory* #f) (define *stats-memory-short* #f) diff --git a/goal_src/engine/game/main.gc b/goal_src/engine/game/main.gc index 65490d874..2b2c27896 100644 --- a/goal_src/engine/game/main.gc +++ b/goal_src/engine/game/main.gc @@ -530,27 +530,78 @@ (stack-size-set! (-> self main-thread) 512) (let ((disp *display*)) - ;; todo spad terrain context + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + ;; Pre loop initialization + ;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + ;; the size is 0, so this doesn't actually do anything. + ;; (dma-send-to-spr (the-as uint #x70000000) (the-as uint *terrain-context*) (the-as uint 0) #t) (set! *teleport* #t) (update-per-frame-settings! *setting-control*) - ;;(init-time-of-day-context *time-of-day-context*) TODO + (init-time-of-day-context *time-of-day-context*) (display-sync disp) (swap-display disp) - ;; touching list + (free-all-prim-nodes *touching-list*) ;; bler init ;; collide dma (suspend) + + (while *run* - ;; blerc - ;; texscroll - ;; ripple + ;; start immediately after all process updates finish. + + ;; drawing effects to be used in foreground drawing. + ; (blerc-execute) + ; (blerc-init) + ; (texscroll-execute) + ; (ripple-execute) + + ;;;;;;;;;;;;;;;;;;;; + ;; AMBIENT + ;;;;;;;;;;;;;;;;;;;; + + ;; set defaults for weather/music/flava. (set! *weather-off* #f) - ;; music + (let ((v1-13 (-> *game-info* current-continue level))) + (dotimes (a0-8 (-> *level* length)) + (let ((a1-6 (-> *level* level a0-8))) + (when (= (-> a1-6 status) 'active) + (if (and (= (-> a1-6 name) v1-13) (-> *level* play?)) + (set! (-> *setting-control* default music) (-> a1-6 info music-bank)) + ) + ) + ) + ) + ) + (set! (-> *setting-control* default sound-flava) (the-as uint 49)) (set! (-> *setting-control* default sound-flava-priority) 0.0) - ;; do ambients - - (add-ee-profile-frame 'draw :r #x40 :b #x40) + + ;; find any ambients, and execute them. + (when (and *execute-ambients* (not (paused?))) + (if *target* + (set! (-> *target* draw secondary-interp) 0.0) + ) + (let ((s5-1 (sphere<-vector+r! (new 'stack 'sphere) (ear-trans) 0.0))) + (let ((v1-28 (scratchpad-object terrain-context))) + (set! (-> v1-28 work ambient ambient-list num-items) 0) + ) + (dotimes (s4-1 (-> *level* length)) + (let ((v1-32 (-> *level* level s4-1))) + (when (= (-> v1-32 status) 'active) + (collect-ambients (-> v1-32 bsp) s5-1 0 (-> (scratchpad-object terrain-context) work ambient ambient-list)) + ) + ) + ) + + (countdown (s4-2 (-> (scratchpad-object terrain-context) work ambient ambient-list num-items)) + (dummy-18 (-> (scratchpad-object terrain-context) work ambient ambient-list items s4-2) s5-1) + ) + ) + ) + (add-ee-profile-frame 'draw :r #x40 :b #x40) ;; actor update + + ;; do math, before drawing (execute-math-engine) ;; DEBUG PROF (add-ee-profile-frame 'draw :r #x80) @@ -567,8 +618,9 @@ (*menu-hook*) (add-ee-profile-frame 'draw :g #x40) - ;; (make-current-level-available-to-progress) TODO target - ;; update-task-hints + ;; finally, update hints/text + (make-current-level-available-to-progress) + (update-task-hints) (load-level-text-files -1) (add-ee-profile-frame 'unknown-cpu-time) @@ -587,26 +639,18 @@ ;; depth cue ;; screen filter - ;; run letterbox if needed - (when (or (movie?) - (< (the-as int (current-time)) - (the-as int (-> *game-info* letterbox-time)) - ) - ) - (if (< (the-as int (-> *game-info* letterbox-time)) - (the-as int (current-time)) - ) - (set! (-> *game-info* letterbox-time) (current-time)) + ;; add letterbox effect + (when (or (movie?) (< (-> *display* base-frame-counter) (-> *game-info* letterbox-time))) + (if (< (-> *game-info* letterbox-time) (-> *display* base-frame-counter)) + (set! (-> *game-info* letterbox-time) (-> *display* base-frame-counter)) ) (if (= (-> *setting-control* current aspect-ratio) 'aspect4x3) (letterbox) ) ) - ;; do blackout if needed. - (if (< (the-as int (current-time)) - (the-as int (-> *game-info* blackout-time)) - ) + ;; add blackout effect + (if (< (-> *display* base-frame-counter) (-> *game-info* blackout-time)) (set! (-> *setting-control* default bg-a-force) 1.0) (set! (-> *setting-control* default bg-a-force) 0.0) ) @@ -765,8 +809,14 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (swap-display disp) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + (set! (-> *time-of-day-context* title-updated) #f) + (set! *teleport* #f) + (when (nonzero? *teleport-count*) + (set! *teleport* #t) + (set! *teleport-count* (+ *teleport-count* -1)) + ) - ;; teleport stuff ;; perf stats (process-particles) @@ -777,7 +827,7 @@ ;; str play (level-update *level*) ;; also updates settings. (mc-run) - ;; auto save check + (auto-save-check) (#when PC_PORT (update *pc-settings*) diff --git a/goal_src/engine/game/task/process-taskable.gc b/goal_src/engine/game/task/process-taskable.gc index 554588e53..e6abf45ee 100644 --- a/goal_src/engine/game/task/process-taskable.gc +++ b/goal_src/engine/game/task/process-taskable.gc @@ -1159,7 +1159,7 @@ (s0-0 arg4) (s5-0 arg5) ) - (stack-size-set! (-> obj main-thread) 512) + (stack-size-set! (-> obj main-thread) 768) ;; increased from 512 (initialize-collision obj s3-0 s0-0) (process-drawable-from-entity! obj (the-as entity-actor arg0)) (let* ((a0-4 obj) diff --git a/goal_src/engine/gfx/eye.gc b/goal_src/engine/gfx/eye.gc index 3aac5c53a..0d3fa65c4 100644 --- a/goal_src/engine/gfx/eye.gc +++ b/goal_src/engine/gfx/eye.gc @@ -57,4 +57,7 @@ ) (+ *eyes-base-block* (* v1-0 32) a0-4) ) - ) \ No newline at end of file + ) + +(defun merc-eye-anim ((arg0 process-drawable)) + (none)) \ No newline at end of file diff --git a/goal_src/engine/gfx/merc/merc-blend-shape.gc b/goal_src/engine/gfx/merc/merc-blend-shape.gc index 2a74efe1d..4126b99a4 100644 --- a/goal_src/engine/gfx/merc/merc-blend-shape.gc +++ b/goal_src/engine/gfx/merc/merc-blend-shape.gc @@ -118,6 +118,8 @@ ;; todo blerc-execute ;; todo merc-blend-shape -(define-extern merc-blend-shape (function process-drawable object)) +(defun merc-blend-shape ((a process-drawable)) + (the object #f) + ) ;; todo setup-blerc-chains \ No newline at end of file diff --git a/goal_src/engine/gfx/shadow/shadow-cpu.gc b/goal_src/engine/gfx/shadow/shadow-cpu.gc index fe0b98c44..17a7c282b 100644 --- a/goal_src/engine/gfx/shadow/shadow-cpu.gc +++ b/goal_src/engine/gfx/shadow/shadow-cpu.gc @@ -9,4 +9,14 @@ (define-extern *shadow-data* shadow-data) ;; todo -(define *shadow-data* (new 'static 'shadow-data)) \ No newline at end of file +(define *shadow-data* (new 'static 'shadow-data)) + +(defmethod dummy-14 shadow-control ((obj shadow-control)) + (let ((v1-1 (-> *time-of-day-context* current-shadow))) + (set! (-> obj settings shadow-dir x) (-> v1-1 x)) + (set! (-> obj settings shadow-dir y) (-> v1-1 y)) + (set! (-> obj settings shadow-dir z) (-> v1-1 z)) + ) + 0 + (none) + ) \ No newline at end of file diff --git a/goal_src/game.gp b/goal_src/game.gp index 385b6bd25..dd72f9599 100644 --- a/goal_src/game.gp +++ b/goal_src/game.gp @@ -445,6 +445,18 @@ "beach-vis" ) +(copy-strs + "BECANNON" ;; beachcam-cannon + "LRFALLIN" ;; lrocklrg-falling + "PESEXT" ;; pelican-spit-ext + ) +(copy-strs + "FAINTROD" ;; farmer-introduction + "SCINTROD" ;; sculptor-introduction + "BILINTRO" ;; bird-lady-introduction + "MAINTROD" ;; mayor-introduction + ) + ;;;;;;;;;;;;;;;;;;;;; ;; Jungle @@ -576,6 +588,18 @@ "village1-vis" ) +(copy-strs + "ASIBESWI" ;; assistant-introduction-blue-eco-switch + "SAISD1" ;; sage-intro-sequence-d1 + "SAISD2" ;; sage-intro-sequence-d2 + "EXINTROD" ;; explorer-introduction + "FIBRTMIS" ;; fishermans-boat-ride-to-misty + "ASR1BESW" ;; assistant-reminder-1-blue-eco-switch + "ORI1" ;; oracle-intro-1 + "ORRE1" ;; oracle-right-eye-1 + "ORR1" ;; oracle-reminder-1 + "FAR1" ;; farmer-reminder-1 + ) ;;;;;;;;;;;;;;;;;;;;; ;; Jungle temple diff --git a/goal_src/kernel/gkernel-h.gc b/goal_src/kernel/gkernel-h.gc index 37b04b01a..13c1f83fa 100644 --- a/goal_src/kernel/gkernel-h.gc +++ b/goal_src/kernel/gkernel-h.gc @@ -14,6 +14,8 @@ ;; -hardware- +(defglobalconstant KERNEL_DEBUG #t) + ;; the end of the 16 kB fast "scratchpad" memory of the PS2. ;; this memory is mapped to 0x70000000 in the PS2. (defconstant *scratch-memory-top* (the pointer #x70004000)) @@ -38,13 +40,13 @@ ;; another stack size used as a maximum for temporary threads ;; OpenGOAL NOTE: increased to 16kB -(defconstant PROCESS_STACK_SIZE #x4000) +(defconstant PROCESS_STACK_SIZE #x6000) ;; default size of stack to backup for a process (defconstant PROCESS_STACK_SAVE_SIZE 256) ;; the size of the shared heap used by dynamically sized processes -(defconstant PROCESS_HEAP_SIZE (* 984 1024)) +(defconstant PROCESS_HEAP_SIZE (* 3 984 1024)) ;; increased by factor of 3 for PC ;; -system- @@ -557,7 +559,7 @@ ;; suspend the current process. `(rlet ((pp :reg r13 :reset-here #t)) - (#when DEBUG_PRINT_SUSPEND_FAIL + (#when (or DEBUG_PRINT_SUSPEND_FAIL KERNEL_DEBUG) (rlet ((sp :reg rsp :reset-here #t :type int) (off :reg r15 :type uint)) (let* ((sp-goal (- sp off)) diff --git a/goal_src/kernel/gkernel.gc b/goal_src/kernel/gkernel.gc index db76698f2..896ef40e9 100644 --- a/goal_src/kernel/gkernel.gc +++ b/goal_src/kernel/gkernel.gc @@ -1670,6 +1670,12 @@ (let ((trans (new 'process 'cpu-thread obj 'trans PROCESS_STACK_SAVE_SIZE (-> obj main-thread stack-top)))) ;; call the function in the thread. (reset-and-call trans (-> obj trans-hook)) + + (#when KERNEL_DEBUG + (when (!= (-> trans type) cpu-thread) + (format 0 "corrupted stack after trans for ~A~%" obj) + ) + ) ;; remove the cpu-thread (delete trans) ;; check for deadness diff --git a/goal_src/levels/title/title-obs.gc b/goal_src/levels/title/title-obs.gc index af732e4ba..845e28dbb 100644 --- a/goal_src/levels/title/title-obs.gc +++ b/goal_src/levels/title/title-obs.gc @@ -707,7 +707,7 @@ ) (defbehavior logo-init-by-other logo ((arg0 entity) (arg1 vector) (arg2 symbol)) - (stack-size-set! (-> self main-thread) 512) + (stack-size-set! (-> self main-thread) 1024) ;; increased from 512 (logclear! (-> self mask) (process-mask progress)) (set! (-> self entity) arg0) (set! (-> self root) (new 'process 'trsqv)) diff --git a/goal_src/levels/village_common/villagep-obs.gc b/goal_src/levels/village_common/villagep-obs.gc index 547d4e1c4..85e44fe5e 100644 --- a/goal_src/levels/village_common/villagep-obs.gc +++ b/goal_src/levels/village_common/villagep-obs.gc @@ -651,8 +651,14 @@ ) ) ) + ;; note: they appear to be calling this on the wrong object. + ;; this doesn't actually cause any problems but corrupts the type of `float` in the symbol + ;; table because they they write to some field of arg0, which is actually #t and not a + ;; basebutton. The corruption is completely harmless but is annoying because it looks like + ;; a more severe memory corruption problem. So we fix it. (the-as int ((the-as (function basebutton symbol none) (find-parent-method warp-gate-switch 31)) - (the-as basebutton arg0) + ;;(the-as basebutton arg0) + obj arg0 ) ) diff --git a/goalc/debugger/Debugger.cpp b/goalc/debugger/Debugger.cpp index 9a1b504bf..5debe570f 100644 --- a/goalc/debugger/Debugger.cpp +++ b/goalc/debugger/Debugger.cpp @@ -305,7 +305,7 @@ std::vector Debugger::get_backtrace(u64 rip, u64 rsp) { } // attempt to backtrace anyway! if this fails then rip u64 next_rip = 0; - if (!read_memory_if_safe(&next_rip, rsp - m_debug_context.base)) { + if (!read_memory_if_safe(&next_rip, rsp - m_debug_context.base - 8)) { fmt::print("Invalid return address encountered!\n"); break; } @@ -555,7 +555,8 @@ void Debugger::read_symbol_table() { sym_type = sym->type; } else { if (sym_type != sym->type) { - fmt::print("Got bad symbol type. Expected 0x{:x} got 0x{:x}\n", sym_type, sym->type); + fmt::print("Got bad symbol type. Expected 0x{:x} got 0x{:x}: addr 0x{:x}\n", sym_type, + sym->type, offset + st_base + (uint64_t)m_debug_context.base); return; } }