diff --git a/common/cross_os_debug/xdbg.cpp b/common/cross_os_debug/xdbg.cpp index 8275d82c22..d5baa56529 100644 --- a/common/cross_os_debug/xdbg.cpp +++ b/common/cross_os_debug/xdbg.cpp @@ -119,6 +119,9 @@ bool check_stopped(const ThreadID& tid, SignalInfo* out) { case SIGTRAP: out->kind = SignalInfo::BREAK; break; + case SIGILL: + out->kind = SignalInfo::ILLEGAL_INSTR; + break; default: out->kind = SignalInfo::UNKNOWN; diff --git a/common/cross_os_debug/xdbg.h b/common/cross_os_debug/xdbg.h index 21bfcc4e3c..c3ee3b78e9 100644 --- a/common/cross_os_debug/xdbg.h +++ b/common/cross_os_debug/xdbg.h @@ -83,6 +83,7 @@ struct SignalInfo { SEGFAULT, // access bad memory BREAK, // hit a breakpoint or execute int3 MATH_EXCEPTION, // divide by zero + ILLEGAL_INSTR, // bad instruction UNKNOWN, // some other signal that is unsupported DISAPPEARED, // process disappeared (maybe killed by the user) diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index c498e918c1..27f034be37 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -5099,19 +5099,19 @@ (unload! (_type_) _type_ 12) (bsp-name (_type_) symbol 13) (dummy-14 (_type_ object) memory-usage-block 14) - (dummy-15 (_type_ vector) symbol 15) + (point-in-boxes? (_type_ vector) symbol 15) (update-vis! (_type_ level-vis-info uint uint) symbol 16) (load-continue (_type_) _type_ 17) (load-begin (_type_) _type_ 18) - (login (_type_) _type_ 19) + (login-begin (_type_) _type_ 19) (vis-load (_type_) uint 20) (dummy-21 (_type_) none 21) - (activate (_type_) _type_ 22) + (birth (_type_) _type_ 22) (level-status-set! (_type_ symbol) _type_ 23) - (dummy-24 (_type_) _type_ 24) - (dummy-25 (_type_) int 25) + (load-required-packages (_type_) _type_ 24) + (init-vis (_type_) int 25) (vis-clear (_type_) int 26) - (dummy-27 (_type_ vector string) none 27) + (debug-print-splitbox (_type_ vector string) none 27) (art-group-get-by-name (_type_ string) art-group 28) ) ) @@ -6153,7 +6153,7 @@ (collide-y-probe (_type_ int collide-list) none 12) (collide-ray (_type_ int collide-list) none 13) (dummy-14 (_type_) none 14) - (dummy-15 (_type_ object object) none 15) ;; something debugging + (debug-draw (_type_ drawable object) none 15) (dummy-16 (_type_ object object) object 16) (collect-ambients (_type_ sphere int ambient-list) none 17) ) @@ -6180,6 +6180,9 @@ ((length int16 :offset 6) (data drawable 1 :offset-assert 32) ) + (:methods + (new (symbol type int) _type_) + ) :flag-assert #x1200000024 ) @@ -6262,7 +6265,7 @@ ) (deftype drawable-tree-array (drawable-group) - () + ((trees drawable-tree 1 :offset 32 :score 100)) :flag-assert #x1200000024 ) @@ -7737,7 +7740,7 @@ (login (_type_) _type_ 9) (dummy-10 (_type_ string type) joint 10) (dummy-11 (_type_ string type) int 11) - (dummy-12 (_type_) symbol 12) + (needs-link? (_type_) symbol 12) ) ) @@ -11985,7 +11988,7 @@ (unk-data-5 float :offset-assert 164) (adgifs adgif-shader-array :offset-assert 168) (actor-birth-order (pointer uint32) :offset-assert 172) - (unk-data-7 pointer :offset-assert 176) + (split-box-indices (pointer uint16) :offset-assert 176) (unk-data-8 uint32 55 :offset-assert 180) ) @@ -11995,7 +11998,7 @@ (:methods (relocate (_type_ kheap (pointer uint8)) none :replace 7) (birth (_type_) none 18) - (dummy-19 (_type_) none 19) + (deactivate-entities (_type_) none 19) ) ) @@ -12704,7 +12707,7 @@ (dma-base uint32 :offset 36) (dma-level-1 uint32 :offset 40) (dma-qwc uint32 4 :offset 44) - (shader uint32 :offset 48) + (shader (inline-array adgif-shader) :offset 48) (num-shaders uint8 :offset 52) (num-base-colors uint8 :offset 53) (num-level0-colors uint8 :offset 54) @@ -16500,7 +16503,7 @@ ;; - Functions (define-extern edge-debug-lines function) -(define-extern vis-cull function) +(define-extern vis-cull (function int symbol)) ;; ---------------------- diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index f5977d6b86..dc00ee27e4 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -1787,6 +1787,14 @@ [140, "s1", "(pointer uint128)"] ], + "(method 15 level)": [ + [[21, 60], "v1", "(inline-array box8s)"] + ], + + "(method 27 level)": [ + [[23, 68], "s2", "(inline-array box8s)"] + ], + "unpack-comp-huf": [[[21, 23], "t3", "(pointer uint16)"]], "(method 9 merc-fragment)": [[[13, 161], "s3", "adgif-shader"]], @@ -2287,6 +2295,14 @@ [7, "t9", "(function entity-actor entity-actor)"] ], + "(method 10 drawable-group)": [ + [19, "s5", "drawable-group"] + ], + + "(method 15 drawable-group)": [ + [19, "s5", "drawable-group"] + ], + "(method 14 level-group)": [ [[54, 164], "s1", "process-drawable"], [[319, 342], "s0", "process-drawable"], diff --git a/game/fake_iso.txt b/game/fake_iso.txt index a86e955879..c7f453e868 100644 --- a/game/fake_iso.txt +++ b/game/fake_iso.txt @@ -22,4 +22,5 @@ VI2.DGO out/iso/VI2.DGO VI3.DGO out/iso/VI3.DGO TRA.DGO out/iso/TRA.DGO FIN.DGO out/iso/FIN.DGO -FIC.DGO out/iso/FIC.DGO \ No newline at end of file +FIC.DGO out/iso/FIC.DGO +JUN.DGO out/iso/JUN.DGO \ No newline at end of file diff --git a/game/graphics/opengl_renderer/BucketRenderer.h b/game/graphics/opengl_renderer/BucketRenderer.h index 82a941f2a5..e23e2ce04b 100644 --- a/game/graphics/opengl_renderer/BucketRenderer.h +++ b/game/graphics/opengl_renderer/BucketRenderer.h @@ -15,11 +15,17 @@ enum class BucketId { BUCKET1 = 1, SKY_DRAW = 3, TFRAG_TEX_LEVEL0 = 5, + TFRAG_TEX_LEVEL1 = 12, SHRUB_TEX_LEVEL0 = 19, + SHRUB_TEX_LEVEL1 = 25, ALPHA_TEX_LEVEL0 = 31, - SKY_LEVEL0 = 32, + SKY_BLEND_LEVEL0 = 32, + ALPHA_TEX_LEVEL1 = 38, + SKY_BLEND_LEVEL1 = 39, PRIS_TEX_LEVEL0 = 48, + PRIS_TEX_LEVEL1 = 51, WATER_TEX_LEVEL0 = 57, + WATER_TEX_LEVEL1 = 60, // ... PRE_SPRITE_TEX = 65, // maybe it's just common textures? SPRITE = 66, diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index db2ec2bd80..cbe9e036a2 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -61,11 +61,18 @@ void OpenGLRenderer::init_bucket_renderers() { init_bucket_renderer("bucket0", BucketId::BUCKET0); init_bucket_renderer("sky", BucketId::SKY_DRAW); init_bucket_renderer("tfrag-tex-0", BucketId::TFRAG_TEX_LEVEL0); - init_bucket_renderer("sky-tex-0", BucketId::SKY_LEVEL0); + init_bucket_renderer("tfrag-tex-1", BucketId::TFRAG_TEX_LEVEL1); init_bucket_renderer("shrub-tex-0", BucketId::SHRUB_TEX_LEVEL0); + init_bucket_renderer("shrub-tex-1", BucketId::SHRUB_TEX_LEVEL1); init_bucket_renderer("alpha-tex-0", BucketId::ALPHA_TEX_LEVEL0); + init_bucket_renderer("alpha-tex-1", BucketId::ALPHA_TEX_LEVEL1); + auto sky_blender = std::make_shared(); + init_bucket_renderer("sky-blend-0", BucketId::SKY_BLEND_LEVEL0, sky_blender); + init_bucket_renderer("sky-blend-1", BucketId::SKY_BLEND_LEVEL1, sky_blender); init_bucket_renderer("pris-tex-0", BucketId::PRIS_TEX_LEVEL0); + init_bucket_renderer("pris-tex-1", BucketId::PRIS_TEX_LEVEL1); init_bucket_renderer("water-tex-0", BucketId::WATER_TEX_LEVEL0); + init_bucket_renderer("water-tex-1", BucketId::WATER_TEX_LEVEL1); init_bucket_renderer("pre-sprite-tex", BucketId::PRE_SPRITE_TEX); init_bucket_renderer("sprite", BucketId::SPRITE); init_bucket_renderer("debug-draw-0", BucketId::DEBUG_DRAW_0, 102, diff --git a/game/graphics/opengl_renderer/SkyRenderer.cpp b/game/graphics/opengl_renderer/SkyRenderer.cpp index 933c1e7cb7..f53a1fe1ff 100644 --- a/game/graphics/opengl_renderer/SkyRenderer.cpp +++ b/game/graphics/opengl_renderer/SkyRenderer.cpp @@ -19,8 +19,7 @@ // size of the sky texture is 64x96, but it's actually a 64x64 (clouds) and a 32x32 (sky) -SkyTextureHandler::SkyTextureHandler(const std::string& name, BucketId my_id) - : BucketRenderer(name, my_id) { +SkyBlender::SkyBlender() { // generate textures for sky blending glGenFramebuffers(2, m_framebuffers); glGenTextures(2, m_textures); @@ -70,22 +69,16 @@ SkyTextureHandler::SkyTextureHandler(const std::string& name, BucketId my_id) m_vertex_data[5].y = 1; } -SkyTextureHandler::~SkyTextureHandler() { +SkyBlender::~SkyBlender() { glDeleteFramebuffers(2, m_framebuffers); glDeleteBuffers(1, &m_gl_vertex_buffer); glDeleteTextures(2, m_textures); } -void SkyTextureHandler::handle_sky_copies(DmaFollower& dma, - SharedRenderState* render_state, - ScopedProfilerNode& prof) { - if (!m_enabled) { - while (dma.current_tag().qwc == 6) { - dma.read_and_advance(); - dma.read_and_advance(); - } - return; - } +SkyBlender::Stats SkyBlender::do_sky_blends(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof) { + Stats stats; GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); @@ -201,15 +194,15 @@ void SkyTextureHandler::handle_sky_copies(DmaFollower& dma, if (buffer_idx == 0) { if (is_first_draw) { - m_stats.sky_draws++; + stats.sky_draws++; } else { - m_stats.sky_blends++; + stats.sky_blends++; } } else { if (is_first_draw) { - m_stats.cloud_draws++; + stats.cloud_draws++; } else { - m_stats.cloud_blends++; + stats.cloud_blends++; } } } @@ -241,11 +234,32 @@ void SkyTextureHandler::handle_sky_copies(DmaFollower& dma, glBindFramebuffer(GL_FRAMEBUFFER, old_framebuffer); glBindVertexArray(0); glDeleteVertexArrays(1, &vao); + + return stats; } -void SkyTextureHandler::render(DmaFollower& dma, - SharedRenderState* render_state, - ScopedProfilerNode& prof) { +SkyBlendHandler::SkyBlendHandler(const std::string& name, + BucketId my_id, + std::shared_ptr shared_blender) + : BucketRenderer(name, my_id), m_shared_blender(shared_blender) {} + +void SkyBlendHandler::handle_sky_copies(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof) { + if (!m_enabled) { + while (dma.current_tag().qwc == 6) { + dma.read_and_advance(); + dma.read_and_advance(); + } + return; + } else { + m_stats = m_shared_blender->do_sky_blends(dma, render_state, prof); + } +} + +void SkyBlendHandler::render(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof) { m_stats = {}; // First thing should be a NEXT with two nops. this is a jump from buckets to sprite data auto data0 = dma.read_and_advance(); @@ -288,7 +302,7 @@ void SkyTextureHandler::render(DmaFollower& dma, assert(dma.current_tag_offset() == render_state->next_bucket); } -void SkyTextureHandler::draw_debug_window() { +void SkyBlendHandler::draw_debug_window() { ImGui::Separator(); ImGui::Text("Draw/Blend ( sky ): %d/%d", m_stats.sky_draws, m_stats.sky_blends); ImGui::Text("Draw/Blend (cloud): %d/%d", m_stats.cloud_draws, m_stats.cloud_blends); diff --git a/game/graphics/opengl_renderer/SkyRenderer.h b/game/graphics/opengl_renderer/SkyRenderer.h index 32338b29f1..c8fce2c291 100644 --- a/game/graphics/opengl_renderer/SkyRenderer.h +++ b/game/graphics/opengl_renderer/SkyRenderer.h @@ -3,21 +3,21 @@ #include "game/graphics/opengl_renderer/BucketRenderer.h" #include "game/graphics/opengl_renderer/DirectRenderer.h" -/*! - * Handles texture blending for the sky. - * Will insert the result texture into the texture pool. - */ -class SkyTextureHandler : public BucketRenderer { +class SkyBlender { public: - SkyTextureHandler(const std::string& name, BucketId my_id); - void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; - void draw_debug_window() override; - ~SkyTextureHandler(); + SkyBlender(); + ~SkyBlender(); + + struct Stats { + int sky_draws = 0; + int cloud_draws = 0; + int sky_blends = 0; + int cloud_blends = 0; + }; + + Stats do_sky_blends(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof); private: - void handle_sky_copies(DmaFollower& dma, - SharedRenderState* render_state, - ScopedProfilerNode& prof); GLuint m_framebuffers[2]; // sky, clouds GLuint m_textures[2]; // sky, clouds int m_sizes[2] = {32, 64}; @@ -29,16 +29,30 @@ class SkyTextureHandler : public BucketRenderer { float intensity = 0; }; - struct FrameStats { - int sky_draws = 0; - int cloud_draws = 0; - int sky_blends = 0; - int cloud_blends = 0; - } m_stats; - Vertex m_vertex_data[6]; }; +/*! + * Handles texture blending for the sky. + * Will insert the result texture into the texture pool. + */ +class SkyBlendHandler : public BucketRenderer { + public: + SkyBlendHandler(const std::string& name, + BucketId my_id, + std::shared_ptr shared_blender); + void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; + void draw_debug_window() override; + + private: + void handle_sky_copies(DmaFollower& dma, + SharedRenderState* render_state, + ScopedProfilerNode& prof); + + std::shared_ptr m_shared_blender; + SkyBlender::Stats m_stats; +}; + /*! * Handles sky drawing. */ diff --git a/game/kernel/klink.cpp b/game/kernel/klink.cpp index 464f9dfa7c..d3fc69de67 100644 --- a/game/kernel/klink.cpp +++ b/game/kernel/klink.cpp @@ -64,7 +64,7 @@ void link_control::begin(Ptr object_file, if (link_debug_printfs) { char* goal_name = object_file.cast().c(); - printf("link %s\n", goal_name); + printf("link %s\n", m_object_name); printf("link_control::begin %c%c%c%c\n", goal_name[0], goal_name[1], goal_name[2], goal_name[3]); } diff --git a/game/overlord/srpc.cpp b/game/overlord/srpc.cpp index 7070b27f26..18e22ccefd 100644 --- a/game/overlord/srpc.cpp +++ b/game/overlord/srpc.cpp @@ -71,6 +71,9 @@ void* RPC_Loader(unsigned int /*fno*/, void* data, int size) { } } } break; + case SoundCommand::UNLOAD_BANK: + printf("ignoring unload bank command!\n"); + break; case SoundCommand::GET_IRX_VERSION: { cmd->irx_version.major = IRX_VERSION_MAJOR; cmd->irx_version.minor = IRX_VERSION_MINOR; diff --git a/goal_src/dgos/jun.gd b/goal_src/dgos/jun.gd new file mode 100644 index 0000000000..a5f9992bf2 --- /dev/null +++ b/goal_src/dgos/jun.gd @@ -0,0 +1,52 @@ +("JUN.DGO" + ("eichar-fish+0-ag-JUN.go" "eichar-fish+0") + ("jungle-elevator.o" "jungle-elevator") + ("bouncer.o" "bouncer") + ("hopper.o" "hopper") + ("junglesnake.o" "junglesnake") + ("darkvine.o" "darkvine") + ("jungle-obs.o" "jungle-obs") + ("jungle-mirrors.o" "jungle-mirrors") + ("junglefish.o" "junglefish") + ("fisher-JUN.o" "fisher") + ("jungle-part.o" "jungle-part") + ("launcherdoor.o" "launcherdoor") + ("tpage-385.go" "tpage-385") + ("tpage-531.go" "tpage-531") + ("tpage-386.go" "tpage-386") + ("tpage-388.go" "tpage-388") + ("tpage-765.go" "tpage-765") + ("accordian-ag.go" "accordian") + ("babak-ag.go" "babak") + ("bounceytarp-ag.go" "bounceytarp") + ("catch-fisha-ag.go" "catch-fisha") + ("catch-fishb-ag.go" "catch-fishb") + ("catch-fishc-ag.go" "catch-fishc") + ("darkvine-ag-JUN.go" "darkvine") + ("ecovalve-ag-JUB-JUN.go" "ecovalve") + ("fish-net-ag.go" "fish-net") + ("fisher-ag.go" "fisher") + ("hopper-ag.go" "hopper") + ("junglecam-ag.go" "junglecam") + ("junglefish-ag.go" "junglefish") + ("junglesnake-ag.go" "junglesnake") + ("launcherdoor-ag-JUN.go" "launcherdoor") + ("logtrap-ag.go" "logtrap") + ("lurkerm-piston-ag.go" "lurkerm-piston") + ("lurkerm-tall-sail-ag.go" "lurkerm-tall-sail") + ("maindoor-ag.go" "maindoor") + ("medres-firecanyon-ag.go" "medres-firecanyon") + ("orb-cache-top-ag-JUN.go" "orb-cache-top") + ("periscope-ag.go" "periscope") + ("plat-button-ag.go" "plat-button") + ("plat-eco-ag-JUN.go" "plat-eco") + ("precurbridge-ag.go" "precurbridge") + ("reflector-mirror-ag.go" "reflector-mirror") + ("ropebridge-52-ag.go" "ropebridge-52") + ("ropebridge-70-ag.go" "ropebridge-70") + ("sharkey-ag-JUN-MIS.go" "sharkey") + ("sidedoor-ag.go" "sidedoor") + ("towertop-ag.go" "towertop") + ("water-anim-jungle-ag.go" "water-anim-jungle") + ("jungle-vis.go" "jungle-vis") + ) \ No newline at end of file diff --git a/goal_src/engine/anim/joint.gc b/goal_src/engine/anim/joint.gc index af32fedeee..3c544d12e3 100644 --- a/goal_src/engine/anim/joint.gc +++ b/goal_src/engine/anim/joint.gc @@ -12,4 +12,23 @@ (define-extern joint-control-copy! (function joint-control joint-control joint-control)) -(define-extern joint-control-remap! (function joint-control art-group art-group pair int string object)) \ No newline at end of file +(define-extern joint-control-remap! (function joint-control art-group art-group pair int string object)) + + +(defmethod needs-link? art ((obj art)) + #f + ) + +(defmethod needs-link? art-group ((obj art-group)) + (the-as + symbol + (and + (-> obj length) + (type-type? (-> obj data 0 type) art-joint-anim) + (!= + (-> obj name) + (-> (the-as art-joint-anim (-> obj data 0)) master-art-group-name) + ) + ) + ) + ) \ No newline at end of file diff --git a/goal_src/engine/data/art-h.gc b/goal_src/engine/data/art-h.gc index 824b3fc73a..3ad87d5fe5 100644 --- a/goal_src/engine/data/art-h.gc +++ b/goal_src/engine/data/art-h.gc @@ -132,7 +132,7 @@ (login (_type_) _type_ 9) (dummy-10 (_type_ string type) joint 10) (dummy-11 (_type_ string type) int 11) - (dummy-12 (_type_) symbol 12) + (needs-link? (_type_) symbol 12) ) ) diff --git a/goal_src/engine/draw/drawable-group-h.gc b/goal_src/engine/draw/drawable-group-h.gc index d5c5eb4371..01fb2e91bc 100644 --- a/goal_src/engine/draw/drawable-group-h.gc +++ b/goal_src/engine/draw/drawable-group-h.gc @@ -10,6 +10,9 @@ ((length int16 :offset 6) (data drawable 1 :offset-assert 32) ) + (:methods + (new (symbol type int) _type_) + ) :flag-assert #x1200000024 ) diff --git a/goal_src/engine/draw/drawable-group.gc b/goal_src/engine/draw/drawable-group.gc index 8d6142d433..2dc7dc808c 100644 --- a/goal_src/engine/draw/drawable-group.gc +++ b/goal_src/engine/draw/drawable-group.gc @@ -5,3 +5,111 @@ ;; name in dgo: drawable-group ;; dgos: GAME, ENGINE +(defmethod new drawable-group ((allocation symbol) (type-to-make type) (arg0 int)) + "Allocate a drawable-group with enough room for arg0 drawables" + (let ((v0-0 (object-new allocation type-to-make + (the-as int (+ (-> type-to-make size) (* (+ arg0 -1) 4))) + ) + ) + ) + (set! (-> v0-0 length) arg0) + v0-0 + ) + ) + +(defmethod inspect drawable-group ((obj drawable-group)) + (format #t "[~8x] ~A~%" obj (-> obj type)) + (format #t "~Tid: ~D~%" (-> obj id)) + (format #t "~Tlength: ~D~%" (-> obj length)) + (format #t "~Tdata[~D]: @ #x~X~%" (-> obj length) (-> obj data)) + (dotimes (s5-0 (-> obj length)) + (format #t "~T [~D] ~A~%" s5-0 (-> obj data s5-0)) + ) + obj + ) + +(defmethod print drawable-group ((obj drawable-group)) + (format #t "#<~A @ #x~X [~D]" (-> obj type) obj (-> obj length)) + (dotimes (s5-0 (-> obj length)) + (format #t " ~A" (-> obj data s5-0)) + ) + (format #t ">") + obj + ) + +(defmethod length drawable-group ((obj drawable-group)) + (-> obj length) + ) + +(defmethod asize-of drawable-group ((obj drawable-group)) + (the-as int (+ (-> drawable-group size) (* (+ (-> obj length) -1) 4))) + ) + +(defmethod mem-usage drawable-group ((obj drawable-group) (arg0 memory-usage-block) (arg1 int)) + (set! (-> arg0 length) (max 1 (-> arg0 length))) + (set! (-> arg0 data 0 name) "drawable-group") + (+! (-> arg0 data 0 count) 1) + (let ((v1-6 (asize-of obj))) + (+! (-> arg0 data 0 used) v1-6) + (+! (-> arg0 data 0 total) (logand -16 (+ v1-6 15))) + ) + (dotimes (s3-0 (-> obj length)) + (mem-usage (-> obj data s3-0) arg0 arg1) + ) + obj + ) + +(defmethod login drawable-group ((obj drawable-group)) + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) + +(defmethod draw drawable-group ((obj drawable-group) (arg0 drawable) (arg1 display-frame)) + (when (vis-cull (-> obj id)) + (when (sphere-cull (-> obj bsphere)) + (dotimes (s3-0 (-> obj length)) + (draw (-> obj data s3-0) (-> (the-as drawable-group arg0) data s3-0) arg1) + ) + ) + ) + 0 + (none) + ) + +(defmethod dummy-14 drawable-group ((obj drawable-group)) + (when (vis-cull (-> obj id)) + (when (sphere-cull (-> obj bsphere)) + (dotimes (s5-0 (-> obj length)) + (dummy-14 (-> obj data s5-0)) + ) + ) + ) + 0 + (none) + ) + + +(defmethod debug-draw drawable-group ((obj drawable-group) (arg0 drawable) (arg1 object)) + (when (vis-cull (-> obj id)) + (when (sphere-cull (-> obj bsphere)) + (dotimes (s3-0 (-> obj length)) + (debug-draw + (-> obj data s3-0) + (-> (the-as drawable-group arg0) data s3-0) + arg1 + ) + ) + ) + ) + 0 + (none) + ) + +(defmethod dummy-16 drawable-group ((obj drawable-group) (arg0 object) (arg1 object)) + (dotimes (s4-0 (-> obj length)) + (set! arg1 (dummy-16 (-> obj data s4-0) arg0 arg1)) + ) + arg1 + ) \ No newline at end of file diff --git a/goal_src/engine/draw/drawable-h.gc b/goal_src/engine/draw/drawable-h.gc index a62d1c93c1..3176f83518 100644 --- a/goal_src/engine/draw/drawable-h.gc +++ b/goal_src/engine/draw/drawable-h.gc @@ -29,7 +29,7 @@ (collide-y-probe (_type_ int collide-list) none 12) (collide-ray (_type_ int collide-list) none 13) (dummy-14 (_type_) none 14) - (dummy-15 (_type_ object object) none 15) + (debug-draw (_type_ drawable object) none 15) (dummy-16 (_type_ object object) object 16) (collect-ambients (_type_ sphere int ambient-list) none 17) ) @@ -53,3 +53,4 @@ ;; for anim-tester (define-extern dma-add-process-drawable function) +(define-extern vis-cull (function int symbol)) \ No newline at end of file diff --git a/goal_src/engine/draw/drawable-inline-array.gc b/goal_src/engine/draw/drawable-inline-array.gc index 0cebcbb136..3ad1ab6f05 100644 --- a/goal_src/engine/draw/drawable-inline-array.gc +++ b/goal_src/engine/draw/drawable-inline-array.gc @@ -24,7 +24,7 @@ (none) ) -(defmethod dummy-15 drawable-inline-array ((obj drawable-inline-array) (arg0 object) (arg1 object)) +(defmethod debug-draw drawable-inline-array ((obj drawable-inline-array) (arg0 drawable) (arg1 object)) 0 (none) ) diff --git a/goal_src/engine/draw/drawable-tree-h.gc b/goal_src/engine/draw/drawable-tree-h.gc index b8c966da49..c20219406f 100644 --- a/goal_src/engine/draw/drawable-tree-h.gc +++ b/goal_src/engine/draw/drawable-tree-h.gc @@ -11,6 +11,6 @@ ) (deftype drawable-tree-array (drawable-group) - () + ((trees drawable-tree 1 :offset 32)) :flag-assert #x1200000024 ) diff --git a/goal_src/engine/entity/entity.gc b/goal_src/engine/entity/entity.gc index f370577318..1ca181ce12 100644 --- a/goal_src/engine/entity/entity.gc +++ b/goal_src/engine/entity/entity.gc @@ -1319,7 +1319,206 @@ ) ) ) + + (when *display-split-boxes* + (dotimes (s5-4 (-> obj length)) + (let ((s4-4 (-> obj level s5-4))) + (when (= (-> s4-4 status) 'active) + (when (nonzero? (-> s4-4 bsp boxes)) + (let ((s3-4 (-> s4-4 bsp boxes))) + (countdown (s2-4 (-> s3-4 length)) + (add-debug-box + #t + (bucket-id debug-draw0) + (the-as vector (-> s3-4 data s2-4)) + (the-as vector (+ (the-as uint (-> s3-4 data 0 max)) (* s2-4 32))) + (the-as rgba (if (zero? (-> s4-4 index)) + (the-as uint #x80808000) + (the-as uint #x808080ff) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) (none)) + +;; birth! +;; entity-deactivate-handler +;; kill! +;; birth bsp-header (define-extern process-drawable-from-entity! (function process-drawable res-lump none)) (define-extern entity-birth-no-kill (function entity none)) + +(defmethod run-logic? process-drawable ((obj process-drawable)) + (or + (zero? (logand (-> obj mask) (process-mask actor-pause))) + (or + (>= + (+ (-> *ACTOR-bank* pause-dist) (-> obj root pause-adjust-distance)) + (vector-vector-distance (-> obj root trans) (math-camera-pos)) + ) + (and + (nonzero? (-> obj skel)) + (!= (-> obj skel root-channel 0) (-> obj skel channel)) + ) + (and (nonzero? (-> obj draw)) (logtest? (-> obj draw status) 16)) + ) + ) + ) + +(defmethod deactivate-entities bsp-header ((obj bsp-header)) + (let ((s5-0 (-> obj actors))) + (when (nonzero? s5-0) + (dotimes (s4-0 (-> s5-0 length)) + (let ((s3-0 (-> s5-0 data s4-0 actor))) + (kill! s3-0) + (remove-from-level! s3-0 *level*) + ) + ) + ) + ) + (let ((s5-1 (-> obj cameras))) + (when (nonzero? s5-1) + (dotimes (s4-1 (-> s5-1 length)) + (kill! (-> s5-1 s4-1)) + ) + ) + ) + (let ((s5-2 (-> *entity-pool* child)) + (s4-2 (-> obj level heap base)) + (s3-1 (-> obj level heap top-base)) + ) + (while s5-2 + (let ((s2-0 (ppointer->process s5-2))) + (set! s5-2 (-> s5-2 0 brother)) + (cond + ((-> (the-as process s2-0) entity) + (when (= (-> (the-as process s2-0) entity extra level) (-> obj level)) + (format #t "NOTICE: rogue level entity ~A~% still alive~%" s2-0) + (deactivate s2-0) + ) + ) + ((= (-> s2-0 type) part-tracker) + (let ((v1-28 (the-as part-tracker s2-0))) + (if + (and + (nonzero? (-> v1-28 part)) + (>= (the-as int (-> v1-28 part group)) (the-as int s4-2)) + (< (the-as int (-> v1-28 part group)) (the-as int s3-1)) + ) + (deactivate s2-0) + ) + ) + ) + (else + (let* ((s1-0 s2-0) + (v1-34 + (if + (and + (nonzero? s1-0) + (type-type? (-> s1-0 type) process-drawable) + ) + s1-0 + ) + ) + ) + (when v1-34 + (cond + ((and + (nonzero? (-> (the-as process-drawable v1-34) part)) + (>= + (the-as int (-> (the-as process-drawable v1-34) part group)) + (the-as int s4-2) + ) + (< + (the-as int (-> (the-as process-drawable v1-34) part group)) + (the-as int s3-1) + ) + ) + (format + #t + "NOTICE: rogue null level entity (using part ~A) ~A~% still alive~%" + (-> + (the-as process-drawable (-> (the-as process-drawable v1-34) part)) + brother + ) + s2-0 + ) + (deactivate s2-0) + ) + ((and + (nonzero? (-> (the-as process-drawable v1-34) draw)) + (>= + (the-as int (-> (the-as process-drawable v1-34) draw art-group)) + (the-as int s4-2) + ) + (< + (the-as int (-> (the-as process-drawable v1-34) draw art-group)) + (the-as int s3-1) + ) + ) + (format + #t + "NOTICE: rogue null level entity (using art ~A) ~A~% still alive~%" + (-> + (the-as process-drawable (-> (the-as process-drawable v1-34) draw)) + mask + ) + s2-0 + ) + (deactivate s2-0) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (none) + ) + +(defmethod + update-perm! + entity-perm + ((obj entity-perm) (arg0 symbol) (arg1 entity-perm-status)) + (cond + ((= arg0 'game) + (logclear! (-> obj status) arg1) + ) + ((nonzero? (-> obj task)) + (logclear! + (-> obj status) + (logior (if (logtest? (-> obj status) (entity-perm-status bit-4)) + 524 + 0 + ) + 515 + ) + ) + ) + (else + (logclear! + (-> obj status) + (logior arg1 (if (logtest? (-> obj status) (entity-perm-status bit-4)) + 524 + 0 + ) + ) + ) + ) + ) + (when + (zero? (logand (-> obj status) (entity-perm-status user-set-from-cstage))) + (set! (-> obj user-uint64) (the-as uint 0)) + 0 + ) + obj + ) \ No newline at end of file diff --git a/goal_src/engine/game/main.gc b/goal_src/engine/game/main.gc index 397c4ce501..5b20b2016a 100644 --- a/goal_src/engine/game/main.gc +++ b/goal_src/engine/game/main.gc @@ -656,6 +656,19 @@ ;; added (format *stdcon* "~3Lglobal heap at ~,,2fK remaining~0L~%" (* (1/ 1024) (&- (-> global top) (-> global current)))) + #| + ;; added, prints some level status. + (dotimes (i 2) + (let ((level-heap (-> *level* level i heap))) + (format *stdcon* "~17Llevel ~d: ~A ~A ~,,2fK remaining~0L~%" + i + (-> *level* level i name) + (-> *level* level i status) + (* (1/ 1024) (&- (-> level-heap top) (-> level-heap current))) + ) + ) + ) + |# (display-file-info) ) ;; end dma let diff --git a/goal_src/engine/gfx/tfrag/tfrag-h.gc b/goal_src/engine/gfx/tfrag/tfrag-h.gc index febcc99906..05c4ff5083 100644 --- a/goal_src/engine/gfx/tfrag/tfrag-h.gc +++ b/goal_src/engine/gfx/tfrag/tfrag-h.gc @@ -43,7 +43,7 @@ (dma-base uint32 :offset 36) (dma-level-1 uint32 :offset 40) (dma-qwc uint32 4 :offset-assert 44) - (shader uint32 :offset 48) + (shader (inline-array adgif-shader) :offset 48) (num-shaders uint8 :offset 52) (num-base-colors uint8 :offset 53) (num-level0-colors uint8 :offset 54) diff --git a/goal_src/engine/gfx/tfrag/tfrag.gc b/goal_src/engine/gfx/tfrag/tfrag.gc index d597515566..856f70e9b0 100644 --- a/goal_src/engine/gfx/tfrag/tfrag.gc +++ b/goal_src/engine/gfx/tfrag/tfrag.gc @@ -5,3 +5,16 @@ ;; name in dgo: tfrag ;; dgos: GAME, ENGINE +(defmethod login tfragment ((obj tfragment)) + (dotimes (s5-0 (the-as int (-> obj num-shaders))) + (adgif-shader-login-no-remap (-> obj shader s5-0)) + ) + obj + ) + +(defmethod login drawable-inline-array-tfrag ((obj drawable-inline-array-tfrag)) + (dotimes (s5-0 (-> obj length)) + (login (-> obj data s5-0)) + ) + obj + ) \ No newline at end of file diff --git a/goal_src/engine/gfx/vis/bsp-h.gc b/goal_src/engine/gfx/vis/bsp-h.gc index 50a35d267d..0f9295ea7f 100644 --- a/goal_src/engine/gfx/vis/bsp-h.gc +++ b/goal_src/engine/gfx/vis/bsp-h.gc @@ -62,7 +62,7 @@ (unk-data-5 float :offset-assert 164) (adgifs adgif-shader-array :offset-assert 168) (actor-birth-order (pointer uint32) :offset-assert 172) - (unk-data-7 pointer :offset-assert 176) + (split-box-indices (pointer uint16) :offset-assert 176) (unk-data-8 uint32 55 :offset-assert 180) ) :method-count-assert 20 @@ -71,7 +71,7 @@ (:methods (relocate (_type_ kheap (pointer uint8)) none :replace 7) (birth (_type_) none 18) - (dummy-19 (_type_) none 19) + (deactivate-entities (_type_) none 19) ) ) diff --git a/goal_src/engine/gfx/vis/bsp.gc b/goal_src/engine/gfx/vis/bsp.gc index 18c3dee090..fca06a550f 100644 --- a/goal_src/engine/gfx/vis/bsp.gc +++ b/goal_src/engine/gfx/vis/bsp.gc @@ -129,8 +129,8 @@ (+! (-> mem-use data 57 used) v1-92) (+! (-> mem-use data 57 total) (logand -16 (+ v1-92 15))) ) - ;; add unk-data-7 (reloated to boxes?) - (when (nonzero? (-> obj unk-data-7)) + ;; add box indices + (when (nonzero? (-> obj split-box-indices)) (set! (-> mem-use length) (max 58 (-> mem-use length))) (set! (-> mem-use data 57 name) "bsp-misc") (+! (-> mem-use data 57 count) 1) @@ -326,8 +326,8 @@ (none) ) -(defmethod dummy-15 bsp-header ((obj bsp-header) (arg0 object) (arg1 object)) - "This is some sort of debugging thing. It calls dummy-15 on the drawables +(defmethod debug-draw bsp-header ((obj bsp-header) (arg0 drawable) (arg1 object)) + "This is some sort of debugging thing. It calls debug-draw on the drawables with the scratchpad and vfs set up." (let ((s4-0 (-> obj level))) ;; set up some stuff in the scratchpad @@ -372,7 +372,7 @@ ) ) (let ((a1-3 (-> obj drawable-trees))) - (dummy-15 a1-3 a1-3 arg1) + (debug-draw a1-3 a1-3 arg1) ) (if *debug-segment* (add-frame (-> *display* frames (-> *display* on-screen) frame profile-bar 0) diff --git a/goal_src/engine/level/level-h.gc b/goal_src/engine/level/level-h.gc index 602c0946cc..ba52f2bf1e 100644 --- a/goal_src/engine/level/level-h.gc +++ b/goal_src/engine/level/level-h.gc @@ -157,19 +157,19 @@ (unload! (_type_) _type_ 12) (bsp-name (_type_) symbol 13) (dummy-14 (_type_ object) memory-usage-block 14) - (dummy-15 (_type_ vector) symbol 15) + (point-in-boxes? (_type_ vector) symbol 15) (update-vis! (_type_ level-vis-info uint uint) symbol 16) (load-continue (_type_) _type_ 17) (load-begin (_type_) _type_ 18) - (login (_type_) _type_ 19) + (login-begin (_type_) _type_ 19) (vis-load (_type_) uint 20) (dummy-21 (_type_) none 21) - (activate (_type_) _type_ 22) + (birth (_type_) _type_ 22) (level-status-set! (_type_ symbol) _type_ 23) - (dummy-24 (_type_) _type_ 24) - (dummy-25 (_type_) int 25) + (load-required-packages (_type_) _type_ 24) + (init-vis (_type_) int 25) (vis-clear (_type_) int 26) - (dummy-27 (_type_ vector string) none 27) + (debug-print-splitbox (_type_ vector string) none 27) (art-group-get-by-name (_type_ string) art-group 28) ) ) diff --git a/goal_src/engine/level/level.gc b/goal_src/engine/level/level.gc index 534d3e01fc..6084cb3041 100644 --- a/goal_src/engine/level/level.gc +++ b/goal_src/engine/level/level.gc @@ -5,6 +5,9 @@ ;; name in dgo: level ;; dgos: GAME, ENGINE +;;;;;;;;;;;;;;;;;;;;;; +;; level info/names +;;;;;;;;;;;;;;;;;;;;;; (defun lookup-level-info ((name symbol)) "Get the level-load-info of a level using its name. name can be the level name, the visname or the nickname. First match is returned." @@ -30,6 +33,7 @@ (defmethod load-command-get-index level-group ((obj level-group) (name symbol) (cmd-idx int)) + "Get the n-th load command for the given level." (let ((cmd-lst (-> (lookup-level-info name) alt-load-commands))) (while (nonzero? cmd-idx) (+! cmd-idx -1) @@ -52,6 +56,8 @@ ) (defmethod art-group-get-by-name level ((obj level) (arg0 string)) + "Get the art group in the given level with the given name. + If it doesn't exist, #f." (countdown (i (-> obj art-group art-group-array length)) (if (name= (-> obj art-group art-group-array i name) arg0) (return (-> obj art-group art-group-array i)) @@ -63,22 +69,38 @@ (defmethod bsp-name level ((obj level)) "Get the name of the bsp tree of the level" - (if (and (!= (-> obj status) 'inactive) - (-> obj bsp) - (nonzero? (-> obj bsp name)) - ) - (-> obj bsp name) - (-> obj name) - ) - ) +(if (and (!= (-> obj status) 'inactive) + (-> obj bsp) + (nonzero? (-> obj bsp name)) + ) + (-> obj bsp name) + (-> obj name) + ) +) -(defun add-bsp-drawable ((bsp bsp-header) (arg1 level) (arg2 symbol) (arg3 display-frame)) - ;;(dummy-10 bsp bsp arg3) - ;;(if (nonzero? *display-strip-lines*) - ;; (dummy-15 bsp) - ;; ) + +;;;;;;;;;;;;;;;;;;;;;;;;; +;; BSP +;;;;;;;;;;;;;;;;;;;;;;;;; + +;; The "bsp" is the big data structure that contains the level geometry. + +;; the background draw engine will use this function to draw an entire level's background. +;; The actual drawing is executed with (execute-connections *background-draw-engine* ...) +;; in drawable.gc + +(defun add-bsp-drawable ((arg0 bsp-header) (arg1 level) (arg2 symbol) (arg3 display-frame)) + "Draw a level!" + + ;; do the draw + (draw arg0 arg0 arg3) + + (if (nonzero? *display-strip-lines*) + (debug-draw arg0 arg0 arg3) + ) (none) ) + (defmethod print level ((obj level)) "print a level." @@ -92,8 +114,10 @@ obj ) -;; relocate bsp-header (defmethod relocate bsp-header ((obj bsp-header) (dest-heap kheap) (name (pointer uint8))) + "Handle a bsp file load." + + ;; we expect that we'll have a loading-level set when we link/login a bsp-header (let ((s5-0 (-> *level* loading-level))) (if s5-0 (cond @@ -114,7 +138,8 @@ (the-as bsp-header #f) ) (else - (load-dbg "bsp login: ~A~%" obj) + (load-dbg "bsp relocate: ~A~%" obj) + ;; everything is okay, link the bsp and level. (set! (-> s5-0 bsp) obj) (set! (-> obj level) s5-0) obj @@ -133,16 +158,24 @@ (none) ) -(defmethod dummy-24 level ((obj level)) - (unless (or (not (-> obj bsp)) (= *kernel-boot-mode* 'debug-boot)) - (unless (null? (-> obj info packages)) - (load-package "common" global) - ) +(defmethod load-required-packages level ((obj level)) + "Load required packages for the level. This is mostly useless, but might load common. + This will have no effect most of the time - common is often loaded at boot as part of + game.cgo." + (when (not (or (not (-> obj bsp)) (= *kernel-boot-mode* 'debug-boot))) + (if (not (null? (-> obj info packages))) + (load-package "common" global) + ) ) obj ) +;;;;;;;;;;;;;; +;; vis +;;;;;;;;;;;;;; + (defmethod vis-clear level ((obj level)) + "Clear the visibility info for when the level is loading." (countdown (v1-0 8) (nop!) ;; the usual. (set! (-> obj vis-info v1-0) #f) @@ -194,49 +227,54 @@ 0 ) -(defmethod dummy-25 level ((obj level)) - (unless (or (= (-> obj status) 'inactive) - (not (-> obj bsp)) - ) - (set! (-> obj all-visible?) 'loading) - (let ((s5-0 (-> obj bsp vis-info 0))) - (cond - ((and s5-0 (nonzero? s5-0) (valid? s5-0 level-vis-info #f #f 0)) - (set! (-> obj vis-info 0) s5-0) - (set! (-> s5-0 current-vis-string) (the-as uint -1)) - (set! (-> s5-0 from-bsp) (-> obj bsp)) - (set! (-> s5-0 vis-bits) (-> obj vis-bits)) - (set! (-> s5-0 flags) (logand #xffffffff3fffffff (-> s5-0 flags))) ;; clear #x80000000 and #x40000000 - (set! (-> s5-0 flags) (logior #x20000000 (-> s5-0 flags))) - (set! (-> s5-0 ramdisk) 0) - (set! (-> s5-0 string-block) (the-as uint #f)) - (set! *vis-boot* #t) - ) - (else - (set! (-> obj vis-info 0) #f) - ) - ) - ) - (dotimes (s5-1 6) - (let* ((s3-0 (+ s5-1 1)) - (s4-0 (-> obj bsp vis-info s3-0)) +(defmethod init-vis level ((obj level)) + "Link vis data to level." + (when (not (or (= (-> obj status) 'inactive) (not (-> obj bsp)))) + (set! (-> obj all-visible?) 'loading) + (let ((s5-0 (-> obj bsp vis-info 0))) + (cond + ((and s5-0 (nonzero? s5-0) (valid? s5-0 level-vis-info #f #f 0)) + (set! (-> obj vis-info 0) s5-0) + (set! (-> s5-0 current-vis-string) (the-as uint -1)) + (set! (-> s5-0 from-bsp) (-> obj bsp)) + (set! (-> s5-0 vis-bits) (-> obj vis-bits)) + (set! + (-> s5-0 flags) + (logand (the-as uint #xffffffff3fffffff) (-> s5-0 flags)) ) - (cond - ((and s4-0 (nonzero? s4-0) (valid? s4-0 level-vis-info #f #f 0)) - (set! (-> obj vis-info s3-0) s4-0) - (set! (-> s4-0 current-vis-string) (the-as uint -1)) - (set! (-> s4-0 from-bsp) #f) - (set! (-> s4-0 vis-bits) (-> obj vis-bits)) - (set! (-> s4-0 flags) (logand #xffffffff1fffffff (-> s4-0 flags))) ;; clear #x80000000 and #x40000000 and #x20000000 - (set! *vis-boot* #t) - ) - (else - (set! (-> obj vis-info s3-0) #f) - ) + (set! (-> s5-0 flags) (logior #x20000000 (-> s5-0 flags))) + (set! (-> s5-0 ramdisk) (the-as uint 0)) + (set! (-> s5-0 string-block) (the-as uint #f)) + (set! *vis-boot* #t) + ) + (else + (set! (-> obj vis-info 0) #f) + ) + ) + ) + (dotimes (s5-1 6) + (let* ((s3-0 (+ s5-1 1)) + (s4-0 (-> obj bsp vis-info s3-0)) + ) + (cond + ((and s4-0 (nonzero? s4-0) (valid? s4-0 level-vis-info #f #f 0)) + (set! (-> obj vis-info s3-0) s4-0) + (set! (-> s4-0 current-vis-string) (the-as uint -1)) + (set! (-> s4-0 from-bsp) #f) + (set! (-> s4-0 vis-bits) (-> obj vis-bits)) + (set! + (-> s4-0 flags) + (logand (the-as uint #xffffffff1fffffff) (-> s4-0 flags)) + ) + (set! *vis-boot* #t) + ) + (else + (set! (-> obj vis-info s3-0) #f) + ) + ) + ) ) - ) ) - ) 0 ) @@ -283,6 +321,18 @@ s5-1 ) +;; level status: +;; - inactive: nothing loaded or loading. +;; - loading: level is reserved and in the process of loading. There can only be 1 loading level at a time. +;; when loading, the loading-level heap is set to the appropriate level heap. +;; also, (-> *level* loading-level) points to the level. +;; - loading-bt: loading the "buffer top". This is the big BSP object file, it loads differently. +;; - loading-done: loading is done, but no login/init has started +;; - login: login is in progress +;; - loaded: login is done +;; - alive: level is birthed, etc +;; - active: level is being drawn + (defmethod level-status level-group ((obj level-group) (level-name symbol)) "Get the status of an existing level." @@ -329,7 +379,8 @@ (('loaded) (case (-> obj status) (('loading-done) - (login obj) + ;; will actually put us in login for a bit. + (login-begin obj) ) (('alive 'active) (deactivate obj) @@ -340,11 +391,16 @@ (when *dproc* (case (-> obj status) (('loaded) - (activate obj) + (birth obj) + ;; try again. we will be in alive. + ;; this will do nothing if we want alive, but will activate if we want activate (level-status-set! obj want-status) ) (('alive) (when (and *dproc* (= want-status 'active)) + ;; only if we want to do alive -> active + + ;; will set the level to be drawn. (remove-by-param1 *background-draw-engine* (-> obj bsp)) (add-connection *background-draw-engine* *dproc* (the (function object object object object object) add-bsp-drawable) (-> obj bsp) obj #f) (dotimes (v1-40 9) @@ -439,6 +495,7 @@ (cond ((dgo-load-link (the-as dgo-header a0-26) (-> obj heap) *print-login* #t) (level-status-set! obj 'loading-done) + ;; will start login. (level-status-set! obj 'loaded) ) (else @@ -454,8 +511,13 @@ (defmethod load-begin level ((obj level)) "Start loading the level. Uses 2 megabyte heaps for loading each object." + ;; set the level heap. level code logins called from linker may allocate here (set! loading-level (-> obj heap)) + + ;; relocate method of the bsp will look for this (set! (-> *level* loading-level) obj) + + ;; clear out old stuff (set! (-> *level* log-in-level-bsp) #f) (set! (-> obj nickname) #f) (set! (-> obj bsp) #f) @@ -463,32 +525,51 @@ (set! (-> obj ambient) #f) (set! (-> obj linking) #f) (vis-clear obj) + (set! (-> obj status) 'loading) + + ;; incoming textures should use the level allocator (set! (-> *texture-pool* allocate-func) texture-page-level-allocate) + + ;; build name (if (= (-> obj load-name) (-> obj info visname)) (format (clear *temp-string*) "~S" (-> obj info nickname)) (format (clear *temp-string*) "~S" (-> obj name)) ) (set! (-> *temp-string* data 8) (the-as uint 0)) (format *temp-string* ".DGO") + + ;; reset temporary allocations on level heap (set! (-> obj heap top) (-> obj heap top-base)) + + ;; allocate DGO loading buffers (let ((s4-0 (kmalloc (-> obj heap) (* 2 1024 1024) (kmalloc-flags align-64 top) "dgo-level-buf-2")) (s5-2 (kmalloc (-> obj heap) (* 2 1024 1024) (kmalloc-flags align-64 top) "dgo-level-buf-2")) ) (load-dbg " DGO buffers at #x~X #x~X~%" s4-0 s5-2) + + ;; we expect to load code first, remember where the heap is now. (set! (-> obj code-memory-start) (-> obj heap current)) + (format 0 "-----------> begin load ~A [~S]~%" (-> obj load-name) *temp-string*) + ;; kick off the load! (dgo-load-begin *temp-string* s5-2 s4-0 (the pointer (align64 (-> obj heap current)))) ) obj ) -(defmethod login level ((obj level)) +(defmethod login-begin level ((obj level)) + "Start the login. This is spread over multiple frames." + + ;; done with load, reset the texture page allocator (set! (-> *texture-pool* allocate-func) texture-page-default-allocate) + (cond ((-> obj bsp) (set! (-> *level* log-in-level-bsp) (-> obj bsp)) + ;; login textures (login-level-textures *texture-pool* obj (-> obj bsp texture-page-count) (-> obj bsp texture-ids)) + ;; login shaders (let ((bsp (-> obj bsp))) (when (nonzero? (-> bsp adgifs)) (let ((adgifs (-> bsp adgifs))) @@ -498,12 +579,15 @@ ) ) ) + + ;; set the login state machine at the beginning. (set! (-> *login-state* state) -1) (set! (-> *login-state* pos) (the-as uint 0)) (set! (-> *login-state* elts) (the-as uint 0)) (set! (-> obj status) 'login) ) (else + ;; something went wrong, kill the level. (level-status-set! obj 'inactive) (set! loading-level global) (set! (-> *level* loading-level) (-> *level* level-default)) @@ -513,204 +597,249 @@ ) (defun level-update-after-load ((loaded-level level) (level-login-state login-state)) - "Runs a bunch of logins on various things in a level" - + "Run some small amount of logins. + This will time itself and stop after some time. + When it's done, it will set the status to loaded." (local-vars - (current-timer int) - (initial-timer int) - ) - ;; TODO REMOVE - (goto skip-hard-stuff) - - 0 - (let ((level-drawable-trees (-> loaded-level bsp drawable-trees))) - 0 - ;;(.mfc0 initial-timer Count) - (label cfg-1) - 0 - ;;(.mfc0 current-timer Count) - (let ((elapsed-timer (- current-timer initial-timer))) - (if (< 100000 elapsed-timer) ;; what is this measuring? - (return loaded-level) - ) + (current-timer int) + (v1-154 int) + (initial-timer int) + (sv-16 prototype-bucket-tie) + (sv-32 int) ) - ;; I don't know what this is doing - (let ((current-login-pos (the-as int (-> level-login-state pos)))) - (when (= (-> level-login-state state) -1) - (when (< (the-as int current-login-pos) (-> level-drawable-trees length)) - (let ((current-drawable (the-as drawable-tree (-> level-drawable-trees data (the-as uint current-login-pos))))) - (cond - ((= (-> (the-as drawable current-drawable) type) drawable-tree-tfrag) - (dotimes (idx-in-drawable (-> current-drawable length)) - (cond - ((= (-> current-drawable data idx-in-drawable type) drawable-inline-array-tfrag) - (set! (-> level-login-state elt (-> level-login-state elts)) (-> current-drawable data idx-in-drawable)) - (1+! (-> level-login-state elts)) - ) - (else - (login (-> current-drawable data idx-in-drawable)) - ) - ) - ) - ) - (else - (cond - ((= (-> (the-as drawable current-drawable) type) drawable-tree-instance-tie) - (set! (-> level-login-state elt (-> level-login-state elts)) (the-as drawable current-drawable)) - (1+! (-> level-login-state elts)) - ) - (else - (login (the-as drawable current-drawable)) - ) - ) - ) - ) - ) - (1+! (-> level-login-state elts)) - (goto cfg-1) - ) - (let ((v1-39 (- (the-as uint current-login-pos) (the-as uint (-> level-drawable-trees length))))) - (when (< (the-as int v1-39) (-> loaded-level art-group art-group-array length)) - (let ((s2-2 (-> loaded-level art-group art-group-array v1-39))) - (login s2-2) - (if (dummy-12 s2-2) - (link-art! s2-2) - ) - ) - (1+! (-> level-login-state elts)) - (goto cfg-1) + + ;; there is some logic for not doing the whole login all at once... + ;; for now, we will somewhat ignore that. + + + (let ((level-drawable-trees (-> loaded-level bsp drawable-trees))) + ;;(.mfc0 initial-timer Count) + (label cfg-1) + ;;(.mfc0 current-timer Count) + + ;; this would quit the login function after some amount of time elapsed. + #| + (let ((elapsed-timer (- current-timer initial-timer))) + (when (< #x186a0 elapsed-timer) + (set! loaded-level loaded-level) + (goto cfg-78) ) ) - (set! (-> level-login-state pos) (the-as uint 0)) - (set! (-> level-login-state state) 0) - (goto cfg-1) - ) - (when (< (-> level-login-state state) (the-as int (-> level-login-state elts))) - (let ((s1-1 (-> level-login-state elt (-> level-login-state state)))) - (cond - ((= (-> s1-1 type) drawable-inline-array-tfrag) - (cond - ((< (the-as int current-login-pos) (-> (the-as drawable-inline-array-tfrag s1-1) length)) - (dotimes (s0-0 200) - (when (< (the-as int current-login-pos) (-> (the-as drawable-inline-array-tfrag s1-1) length)) - (login (-> (the-as drawable-inline-array-tfrag s1-1) data (the-as uint current-login-pos))) - (1+! current-login-pos) - ) - ) - (set! (-> level-login-state pos) (the-as uint current-login-pos)) - ) - (else - (set! (-> level-login-state pos) (the-as uint 0)) - (set! current-login-pos (+ (-> level-login-state state) 1)) - (set! (-> level-login-state state) current-login-pos) - ) - ) - ) - ((= (-> s1-1 type) drawable-tree-instance-tie) - (let ((s1-2 (-> (the-as drawable-tree-instance-tie s1-1) prototypes prototype-array-tie))) - (when (< (the-as int current-login-pos) (-> s1-2 length)) - (dotimes (s0-1 10) - (when (< (the-as int current-login-pos) (-> s1-2 length)) - (let ((sv-16 (-> s1-2 array-data (the-as uint current-login-pos)))) - (dotimes (sv-32 4) - (let ((a0-28 (-> sv-16 geometry sv-32))) - (if (nonzero? a0-28) - (login a0-28) + |# + + (let ((current-login-pos (the-as int (-> level-login-state pos)))) + + ;; Login state -1. + ;; in this state, we log in drawables/art-groups that are in referenced in the bsp directly + ;; the current-login-pos in the index of the drawable/art to login. + + (when (= (-> level-login-state state) -1) + ;;(load-dbg "login state -1~%") + + ;; login some drawables. + (when (< current-login-pos (-> level-drawable-trees length)) + (let ((current-drawable (-> level-drawable-trees trees (the-as uint current-login-pos)))) + ;;(load-dbg "login draw: ~A~%" current-drawable) + (cond + ((= (-> current-drawable type) drawable-tree-tfrag) + ;; tfrag! + (dotimes (idx-in-drawable (-> current-drawable length)) + (cond + ((= (-> current-drawable data idx-in-drawable type) drawable-inline-array-tfrag) + ;; we got an array of drawables. instead of iterating/recursing, just add it to the back of the login list. + ;;(load-dbg " tfrag array case~%") + (set! (-> level-login-state elt (-> level-login-state elts)) (-> current-drawable data idx-in-drawable)) + (+! (-> level-login-state elts) 1) ) + (else + ;;(load-dbg " tfrag actual login case~%") + (login (-> current-drawable data idx-in-drawable)) + ) ) - ) - (1+! current-login-pos) ) - ) + ) + ((= (-> current-drawable type) drawable-tree-instance-tie) + ;; tie! add the tree to the list. + ;;(load-dbg " tie tree case~%") + (set! (-> level-login-state elt (-> level-login-state elts)) current-drawable) + (+! (-> level-login-state elts) 1) + ) + (else + ;;(load-dbg " other actual login: ~A~%" (method-of-object current-drawable login)) + (login current-drawable) + ) + ) ) - (set! (-> level-login-state pos) (the-as uint current-login-pos)) - ) - (when (= (the-as uint current-login-pos) (-> s1-2 length)) - (dotimes (s2-3 (-> s1-2 length)) - (let ((s0-2 (-> s1-2 array-data s2-3 envmap-shader))) - (when (nonzero? s0-2) - (adgif-shader-login-no-remap s0-2) - (set! (-> s0-2 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) - (set! (-> s0-2 clamp) (new 'static 'gs-clamp :wms #x1 :wmt #x1)) - (set! (-> s0-2 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) - (set! (-> s0-2 prims 1) (gs-reg64 tex0-1)) - (set! (-> s0-2 prims 3) (gs-reg64 tex1-1)) - (set! (-> s0-2 prims 5) (gs-reg64 miptbp1-1)) - (set! (-> s0-2 clamp-reg) (gs-reg64 clamp-1)) - (set! (-> s0-2 prims 9) (gs-reg64 alpha-1)) + (+! (-> level-login-state pos) 1) + (goto cfg-1) + ) + + ;; this makes the art groups go at the end. + (let ((v1-39 (- (the-as uint current-login-pos) (the-as uint (-> level-drawable-trees length))))) + (when (< (the-as int v1-39) (-> loaded-level art-group art-group-array length)) + (let ((s2-2 (-> loaded-level art-group art-group-array v1-39))) + (login s2-2) + (if (needs-link? s2-2) + (link-art! s2-2) + ) + ) + (+! (-> level-login-state pos) 1) + (goto cfg-1) + ) + ) + + ;; if we got here, we're done with state -1! + (set! (-> level-login-state pos) (the-as uint 0)) + (set! (-> level-login-state state) 0) + (goto cfg-1) + ) + + + ;; login state 0. + ;; we log in children of the drawables from state -1. + (when (< (-> level-login-state state) (the-as int (-> level-login-state elts))) + ;; (load-dbg " login state 0~%") + (let ((s1-1 (-> level-login-state elt (-> level-login-state state)))) + (cond + ((= (-> s1-1 type) drawable-inline-array-tfrag) + ;; (load-dbg " login drawable-inline-array-tfrag: ~A~%" s1-1) + (cond + ((< current-login-pos (-> (the-as drawable-inline-array-tfrag s1-1) length)) + (dotimes (s0-0 200) + (when (< current-login-pos (-> (the-as drawable-inline-array-tfrag s1-1) length)) + ;; (load-dbg " login from drawable-inline-array-tfrag: ~A~%" (-> (the-as drawable-inline-array-tfrag s1-1) data (the-as uint current-login-pos))) + (login (-> (the-as drawable-inline-array-tfrag s1-1) data (the-as uint current-login-pos))) + (set! current-login-pos (the-as int (+ (the-as uint current-login-pos) 1))) + ) + ) + (set! (-> level-login-state pos) (the-as uint current-login-pos)) + ) + (else + (set! (-> level-login-state pos) (the-as uint 0)) + (set! current-login-pos (+ (-> level-login-state state) 1)) + (set! (-> level-login-state state) current-login-pos) + ) + ) + ) + ((= (-> s1-1 type) drawable-tree-instance-tie) + ;;(load-dbg " login drawable-tree-instance-tie: ~A~%" s1-1) + (let ((s1-2 (-> (the-as drawable-tree-instance-tie s1-1) prototypes prototype-array-tie))) + (when (< current-login-pos (-> s1-2 length)) + (dotimes (s0-1 10) + (when (< current-login-pos (-> s1-2 length)) + (set! sv-16 (-> s1-2 array-data (the-as uint current-login-pos))) + (set! sv-32 0) + (while (< sv-32 4) + (let ((a0-28 (-> sv-16 geometry sv-32))) + ;;(load-dbg " login geom: ~A~%" a0-28) + (if (nonzero? a0-28) + (login a0-28) + ) + ) + (set! sv-32 (+ sv-32 1)) + ) + (set! current-login-pos (the-as int (+ (the-as uint current-login-pos) 1))) + ) + ) + (set! (-> level-login-state pos) (the-as uint current-login-pos)) + ) + (when (= (the-as uint current-login-pos) (-> s1-2 length)) + (dotimes (s2-3 (-> s1-2 length)) + (let ((s0-2 (-> s1-2 array-data s2-3 envmap-shader))) + (when (nonzero? s0-2) + ;;(load-dbg " login adgif shader for envmap~%") + (adgif-shader-login-no-remap s0-2) + (set! (-> s0-2 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) + (set! + (-> s0-2 clamp) + (new 'static 'gs-clamp + :wms (gs-tex-wrap-mode clamp) + :wmt (gs-tex-wrap-mode clamp) + ) + ) + (set! (-> s0-2 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s0-2 prims 1) (gs-reg64 tex0-1)) + (set! (-> s0-2 prims 3) (gs-reg64 tex1-1)) + (set! (-> s0-2 prims 5) (gs-reg64 miptbp1-1)) + (set! (-> s0-2 clamp-reg) (gs-reg64 clamp-1)) + (set! (-> s0-2 prims 9) (gs-reg64 alpha-1)) + ) + ) + ) + (set! (-> level-login-state pos) (the-as uint 0)) + (+! (-> level-login-state state) 1) + ) ) ) ) - (set! (-> level-login-state pos) (the-as uint 0)) - (1+! (-> level-login-state state)) - ) ) - ) + (goto cfg-1) ) - ) - (goto cfg-1) - ) - (if (= (-> level-login-state state) (-> level-login-state elts)) - (begin - (let ((v1-115 (-> loaded-level bsp))) - (cond - ((or (zero? (-> v1-115 actors)) - (= (the-as uint current-login-pos) (-> v1-115 actors length)) + + + (when (= (-> level-login-state state) (-> level-login-state elts)) + (let ((v1-115 (-> loaded-level bsp))) + (cond + ((or (zero? (-> v1-115 actors)) (= (the-as uint current-login-pos) (-> v1-115 actors length))) + (set! (-> level-login-state pos) (the-as uint 0)) + (+! (-> level-login-state state) 1) + ) + (else + (let ((a0-36 (-> v1-115 actors data (the-as uint current-login-pos) actor))) + ;; (load-dbg "entity nav login: ~A~%" a0-36) + (entity-nav-login a0-36) + ) + (+! (-> level-login-state pos) 1) + ) + ) ) - (set! (-> level-login-state pos) (the-as uint 0)) - (1+! (-> level-login-state state)) - ) - (else - (let ((a0-36 (-> v1-115 actors data current-login-pos actor))) - (entity-nav-login a0-36) - ) - (1+! (-> level-login-state pos)) - ) + (goto cfg-1) + ) + (when (zero? (the-as uint current-login-pos)) + (set! (-> level-login-state pos) (the-as uint 1)) + (set! loaded-level loaded-level) + (goto cfg-78) ) - ) - (goto cfg-1) - ) - ) - (when (zero? (the-as uint current-login-pos)) - (set! (-> level-login-state pos) (the-as uint 1)) - (return loaded-level) ) ) - ) + + + ;; done! (set! (-> loaded-level nickname) (-> loaded-level bsp nickname)) (if (nonzero? (-> loaded-level bsp nodes)) - (set! *time-of-day-effects* #t) - (set! *time-of-day-effects* #f) - ) + (set! *time-of-day-effects* #t) + (set! *time-of-day-effects* #f) + ) (let ((f0-0 (-> loaded-level bsp unk-data-4)) (f1-0 (-> loaded-level bsp unk-data-5)) ) - (when (and (= f0-0 0.0) (= f1-0 0.0)) - (set! f0-0 (meters 30)) - (set! f1-0 (meters 70)) - ) - (set! (-> *subdivide-settings* close (-> loaded-level index)) f0-0) - (set! (-> *subdivide-settings* far (-> loaded-level index)) f1-0) - (set! (-> *subdivide-settings* close 3) f0-0) - (set! (-> *subdivide-settings* far 3) f1-0) - ) - - (label skip-hard-stuff) - (dummy-25 loaded-level) - (dummy-24 loaded-level) + (when (and (= f0-0 0.0) (= f1-0 0.0)) + (set! f0-0 122880.0) + (set! f1-0 286720.0) + ) + (set! (-> *subdivide-settings* close (-> loaded-level index)) f0-0) + (set! (-> *subdivide-settings* far (-> loaded-level index)) f1-0) + (set! (-> *subdivide-settings* close 3) f0-0) + (set! (-> *subdivide-settings* far 3) f1-0) + ) + + (load-dbg "init-vis~%") + (init-vis loaded-level) + (load-dbg "package load~%") + (load-required-packages loaded-level) (set! (-> loaded-level status) 'loaded) (set! loading-level global) (set! (-> *level* loading-level) (-> *level* level-default)) (set! (-> *level* log-in-level-bsp) #f) - 0 - ;;(.mfc0 v1-154 Count) - ;;(- v1-154 initial-timer) - + ; 0 + ; (.mfc0 v1-154 Count) + ; (- v1-154 initial-timer) + (label cfg-78) loaded-level ) -(defmethod activate level ((obj level)) - "Activate a level! It must be loaded." +(defmethod birth level ((obj level)) + "Birth a level to make it alive! It must be loaded." (case (-> obj status) (('loaded) @@ -723,9 +852,12 @@ (set! (-> *level* loading-level) obj) (birth (-> obj bsp)) (set! (-> obj status) 'alive) - ;; (dummy-15 *game-info*) TODO - ;; (send-event *camera* 'level-activate (-> obj name)) - ;; (send-event *target* 'level-activate (-> obj name)) + (load-dbg "copy perms~%") + (copy-perms-to-level! *game-info* obj) + (load-dbg "send activate~%") + ;; note: this isn't a great name - the level isn't actually activated, just alive. + (send-event *camera* 'level-activate (-> obj name)) + (send-event *target* 'level-activate (-> obj name)) ) ) ) @@ -738,17 +870,31 @@ (case (-> obj status) (('active 'alive) (format 0 "----------- kill ~A (status ~A)~%" obj (-> obj status)) + + ;; copy data from the level to the game-info storage. This will remember permanent level stuff, like + ;; what you collected/completed. (copy-perms-from-level! *game-info* obj) (send-event *camera* 'level-deactivate (-> obj name)) (send-event *target* 'level-deactivate (-> obj name)) + + ;; remove this BSP from the engine. This will stop us from being drawn. (remove-by-param1 *background-draw-engine* (-> obj bsp)) - (dummy-19 (-> obj bsp)) - ;; (kill-all-particles-in-level) TODO + + ;; track down all the entities and kill them + (deactivate-entities (-> obj bsp)) + + ;; kill any remaining particles not associated with a part-tracker + (kill-all-particles-in-level obj) + + ;; clean up our level (set! (-> obj inside-sphere?) #f) (set! (-> obj inside-boxes?) #f) (set! (-> obj meta-inside?) #f) (set! (-> obj force-inside?) #f) + + ;; we're still loaded. (set! (-> obj status) 'loaded) + (set! (-> obj all-visible?) 'loading) ;; clear vis buffers (dotimes (v1-19 128) @@ -774,11 +920,11 @@ (defmethod unload! level ((obj level)) "Unloads the level. This does not free the heap. The level will be made inactive and ready to be loaded some other time." - + (deactivate obj) (when (!= (-> obj status) 'inactive) - - ;; no idea + + ;; if we linked art group, unlink it. (when (or (= (-> obj status) 'loaded) (= (-> obj status) 'alive) (= (-> obj status) 'active) @@ -786,13 +932,13 @@ ) (dotimes (s5-0 (-> obj art-group art-group-array length)) (let ((s4-0 (-> obj art-group art-group-array s5-0))) - (if (dummy-12 s4-0) + (if (needs-link? s4-0) (unlink-art! s4-0) ) - ) + ) ) ) - + ;; turn some things off (set! (-> obj bsp) #f) (set! (-> obj entity) #f) @@ -800,54 +946,65 @@ (set! (-> obj status) 'inactive) (set! (-> obj art-group string-array length) 0) (set! (-> obj art-group art-group-array length) 0) - - ;; unload texture pages? - (let ((s5-1 (-> obj loaded-texture-page-count))) - (while (nonzero? s5-1) - (+! s5-1 -1) - (dotimes (v1-27 32) - (when (= (-> obj loaded-texture-page s5-1) (-> *texture-pool* common-page v1-27)) - (set! (-> *texture-pool* common-page v1-27) (the-as texture-page 0)) - ) - ) - (unload! *texture-pool* (-> obj loaded-texture-page s5-1)) + + ;; unload texture pages + (countdown (s5-1 (-> obj loaded-texture-page-count)) + (dotimes (v1-27 32) + (when (= (-> obj loaded-texture-page s5-1) (-> *texture-pool* common-page v1-27)) + (set! (-> *texture-pool* common-page v1-27) (the-as texture-page 0)) ) ) - + (unload! *texture-pool* (-> obj loaded-texture-page s5-1)) + ) (set! (-> obj loaded-texture-page-count) 0) (unlink-textures-in-heap! *texture-page-dir* (-> obj heap)) - ;; (unlink-part-group-by-heap (-> obj heap)) TODO - ; (dotimes (s5-2 2) - ; (let ((v1-41 (-> *art-control* buffer s5-2 pending-load-file))) - ; (if (and (>= (the-as int v1-41) (the-as int (-> obj heap base))) - ; (< (the-as int v1-41) (the-as int (-> obj heap top-base))) - ; ) - ; (dummy-9 (-> *art-control* buffer s5-2) #f -1 #f 100000000.0) - ; ) - ; ) - ; ) + + ;; unload particle groups that were defined in the level data + (unlink-part-group-by-heap (-> obj heap)) + + ;; if there are any in-progress art loads for this level, kill them. + (dotimes (s5-2 2) + (let ((v1-41 (-> *art-control* buffer s5-2 pending-load-file))) + (if (and (>= (the-as int v1-41) (the-as int (-> obj heap base))) + (< (the-as int v1-41) (the-as int (-> obj heap top-base))) + ) + (set-pending-file + (-> *art-control* buffer s5-2) + (the-as string #f) + -1 + (the-as handle #f) + 100000000.0 + ) + ) + ) + ) + + ;; unload packages (doesn't really do anything.) (let* ((s5-3 (-> obj info packages)) (a0-29 (car s5-3)) ) - (while (not (null? s5-3)) - (case (rtype-of a0-29) - ((symbol) - (unload (symbol->string (the-as symbol a0-29))) - ) - ((string) - (unload (the-as string a0-29)) - ) - ) - (set! s5-3 (cdr s5-3)) - (set! a0-29 (car s5-3)) - ) + (while (not (null? s5-3)) + (case (rtype-of a0-29) + ((symbol) + (unload (symbol->string (the-as symbol a0-29))) + ) + ((string) + (unload (the-as string a0-29)) + ) + ) + (set! s5-3 (cdr s5-3)) + (set! a0-29 (car s5-3)) ) + ) + (vis-clear obj) + + ;; reset the level heap! (let ((v1-64 (-> obj heap))) - (set! (-> v1-64 current) (-> v1-64 base)) - ) - (set! (-> obj code-memory-start) (the pointer 0)) - (set! (-> obj code-memory-end) (the pointer 0)) + (set! (-> v1-64 current) (-> v1-64 base)) + ) + (set! (-> obj code-memory-start) (the-as pointer 0)) + (set! (-> obj code-memory-end) (the-as pointer 0)) (when (= (-> *level* loading-level) obj) (set! loading-level global) (set! (-> *level* loading-level) (-> *level* level-default)) @@ -857,12 +1014,97 @@ obj ) +;; method 27 level + ;; method 10 level (defmethod is-object-visible? level ((obj level) (arg0 int)) - ;; hack! TODO - #t) -;; method 15 level -;; method 27 level + "Is arg0 visible?" + ;; check the vis bits! + (let* (;; lwu v1, 388(a0) + (vis-data (-> obj vis-bits)) + ;; sra a0, a1, 3 + (byte-idx (sar arg0 3)) + ;; daddu v1, a0, v1 + ;; lb v1, 0(v1) + (vis-byte (-> (the (pointer int8) vis-data) byte-idx)) + ;; andi a0, a1, 7 + (bit-idx (logand arg0 #b111)) + ;; addiu a0, a0, 56 + (shift-amount (+ bit-idx 56)) ;; 56 + 8 = 64, to set the sign bit + ;; dsllv v1, v1, a0 + (check-sign-word (the int (shl vis-byte shift-amount))) ;; signed + ) + ;; slt v1, v1, r0 + ;; daddiu v0, s7, 8 + ;; movz v0, s7, v1 + (>= check-sign-word 0) + ) + ) + +(defmethod point-in-boxes? level ((obj level) (arg0 vector)) + "Is this point in the list of level boxes?" + (cond + ((or (not (-> obj bsp)) (zero? (-> obj bsp boxes))) + ;; no boxes or no bsp + #f + ) + ((-> obj force-inside?) + #t + ) + (else + (let* ((a0-1 (-> obj bsp boxes)) + (v1-5 (-> a0-1 data)) + ) + (countdown (a0-2 (-> a0-1 length)) + (if (and (>= (-> arg0 x) (-> v1-5 0 min x)) + (>= (-> arg0 y) (-> v1-5 0 min y)) + (>= (-> arg0 z) (-> v1-5 0 min z)) + (< (-> arg0 x) (-> v1-5 0 max x)) + (< (-> arg0 y) (-> v1-5 0 max y)) + (< (-> arg0 z) (-> v1-5 0 max z)) + ) + #t + ) + (set! v1-5 (the (inline-array box8s) (-> v1-5 1))) + ) + ) + #f + ) + ) + ) + + +(defmethod debug-print-splitbox level ((obj level) (arg0 vector) (arg1 string)) + "Print the current splitbox, if we're in one." + (cond + ((or (not (-> obj bsp)) (zero? (-> obj bsp boxes)) (zero? (-> obj bsp split-box-indices))) + ;; do nothing! + ) + (else + (let* ((s3-0 (-> obj bsp boxes)) + (s2-0 (-> s3-0 data)) + ) + (dotimes (s1-0 (-> s3-0 length)) + (if + (and + (>= (-> arg0 x) (-> s2-0 0 min x)) + (>= (-> arg0 y) (-> s2-0 0 min y)) + (>= (-> arg0 z) (-> s2-0 0 min z)) + (< (-> arg0 x) (-> s2-0 0 max x)) + (< (-> arg0 y) (-> s2-0 0 max y)) + (< (-> arg0 z) (-> s2-0 0 max z)) + ) + (format arg1 " splitbox-~D~%" (-> obj bsp split-box-indices s1-0)) + ) + (set! s2-0 (the (inline-array box8s) (-> s2-0 1))) + ) + ) + ) + ) + 0 + (none) + ) + (defmethod mem-usage level ((obj level) (arg0 memory-usage-block) (arg1 int)) "Get the memory usage for a level." @@ -981,6 +1223,7 @@ 0 ) + (defmethod level-get-with-status level-group ((obj level-group) (status symbol)) (dotimes (i (-> obj length)) (if (= (-> obj level i status) status) @@ -1549,10 +1792,281 @@ ;; method 16 level-group (debug text stuff) (defmethod level-update level-group ((obj level-group)) - ;; todo lots of stuff + + ;; this does nothing... + (camera-pos) + (new 'static 'boxed-array :type symbol :length 0 :allocated-length 2) + + ;; compute the settings for this frame (update-per-frame-settings! *setting-control*) + + ;; run the art loading system (update *art-control* #t) (clear-rec *art-control*) + + ;; run level loading! + (dotimes (s5-0 2) + (load-continue (-> obj level s5-0)) + ) + + ;; compute inside for each level + (dotimes (s5-1 (-> obj length)) + (let ((s4-0 (-> obj level s5-1))) + (when (= (-> s4-0 status) 'active) + (set! (-> s4-0 inside-boxes?) (point-in-boxes? s4-0 (-> *math-camera* trans))) + (set! (-> s4-0 inside-sphere?) (>= (-> s4-0 bsp bsphere w) (-> s4-0 level-distance))) + (if (-> s4-0 inside-boxes?) + (set! (-> s4-0 meta-inside?) #t) + ) + ) + ) + ) + + ;; update load state machine (the level-border one) + (update! *load-state*) + + ;; checkpoint assignment + (dotimes (s5-2 (-> obj length)) + (let ((s4-1 (-> obj level s5-2))) + (when (= (-> s4-1 status) 'active) + (if (and (-> s4-1 inside-boxes?) (not (-> s4-1 other inside-boxes?))) + (set! (-> s4-1 other meta-inside?) #f) + ) + (when (and (null? (-> obj load-commands)) + (= (-> s4-1 nickname) (-> *load-state* vis-nick)) + (!= (-> s4-1 name) (-> *game-info* current-continue level)) + (-> *level* border?) + ) + (let ((s3-0 (the-as continue-point (car (-> s4-1 info continues))))) + (let* ((s2-0 (target-pos 0)) + (s4-2 (-> s4-1 info continues)) + (s1-0 (the-as continue-point (car s4-2))) + ) + (while (not (null? s4-2)) + (if (and (< (vector-vector-distance s2-0 (-> s1-0 trans)) (vector-vector-distance s2-0 (-> s3-0 trans))) + (zero? (-> s1-0 flags)) + ) + (set! s3-0 s1-0) + ) + (set! s4-2 (cdr s4-2)) + (set! s1-0 (the-as continue-point (car s4-2))) + ) + ) + (set-continue! *game-info* s3-0) + ) + ) + ) + ) + ) + + ;; handle visibility stuff + (dotimes (v1-67 (-> obj length)) + (let ((a0-26 (-> obj level v1-67))) + (when (= (-> a0-26 status) 'active) + (set! (-> a0-26 vis-self-index) 0) + (set! (-> a0-26 vis-adj-index) 7) + (when (= (-> a0-26 other status) 'active) + (dotimes (a1-10 8) + (if (and (-> a0-26 vis-info a1-10) + (= (-> a0-26 vis-info a1-10 from-level) (-> a0-26 other load-name)) + ) + (set! (-> a0-26 vis-adj-index) a1-10) + ) + ) + ) + ) + ) + ) + + ;; display level vis info + (when *display-level-border* + (dotimes (s5-3 (-> obj length)) + (let ((s4-3 (-> obj level s5-3))) + (when (= (-> s4-3 status) 'active) + (let ((s3-1 (-> s4-3 bsp current-bsp-back-flags))) + (dotimes (s2-1 6) + (when (and (logtest? s3-1 3) (-> s4-3 vis-info (+ s2-1 1))) + (let + ((v1-88 (lookup-level-info (-> s4-3 vis-info (+ s2-1 1) from-level)))) + (format + *stdcon* + " ~A -> ~A: load: ~A display: ~A~%" + (-> s4-3 name) + (-> v1-88 name) + (logtest? s3-1 1) + (logtest? s3-1 2) + ) + ) + ) + (set! s3-1 (shr s3-1 2)) + ) + ) + ) + ) + ) + ) + + ;; not sure what this does yet... + (dotimes (s5-4 (-> obj length)) + (let ((s4-4 (-> obj level s5-4))) + (when (= (-> s4-4 status) 'active) + (when (and (= (-> s4-4 nickname) (-> *load-state* vis-nick)) + (not (-> s4-4 inside-boxes?)) + ) + (if (and (= *cheat-mode* 'debug) (-> s4-4 other inside-boxes?)) + (format + *stdcon* + "~3LForcing outside of ~A [bad split boxes]~%~0L" + (-> s4-4 other name) + ) + ) + (set! (-> s4-4 other inside-boxes?) #f) + ) + ) + ) + ) + + ;; do the bsp vis stuff. + (cond + ((not (or (-> obj level0 inside-boxes?) (-> obj level1 inside-boxes?))) + (when (or (-> obj level0 vis-info 0) (-> obj level1 vis-info 0)) + (if (= *cheat-mode* 'debug) + (format *stdcon* "~3Loutside of bsp~%~0L") + ) + ) + ) + (else + (dotimes (v1-125 (-> obj length)) + (let ((a0-44 (-> obj level v1-125))) + (when (= (-> a0-44 status) 'active) + (dotimes (a1-17 8) + (let ((a2-18 (-> a0-44 vis-info a1-17))) + (when a2-18 + (set! + (-> a2-18 flags) + (logand (the-as uint #xffffffff7fffffff) (-> a2-18 flags)) + ) + (cond + ((= a1-17 (-> a0-44 vis-self-index)) + (set! (-> a2-18 from-bsp) (-> a0-44 bsp)) + ) + ((= a1-17 (-> a0-44 vis-adj-index)) + (set! (-> a2-18 from-bsp) (-> a0-44 other bsp)) + ) + (else + (set! (-> a2-18 from-bsp) #f) + ) + ) + ) + ) + ) + (cond + ((= (-> a0-44 display?) 'display-self) + (let ((a0-46 (-> a0-44 vis-info (-> a0-44 vis-self-index)))) + (if a0-46 + (set! + (-> a0-46 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-46 flags))) + ) + ) + ) + ) + ((and (-> a0-44 inside-boxes?) (not (-> a0-44 other inside-boxes?))) + (let ((a0-48 (-> a0-44 vis-info (-> a0-44 vis-self-index)))) + (if a0-48 + (set! + (-> a0-48 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-48 flags))) + ) + ) + ) + ) + ((-> a0-44 other inside-boxes?) + (let ((a0-50 (-> a0-44 vis-info (-> a0-44 vis-adj-index)))) + (if a0-50 + (set! + (-> a0-50 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-50 flags))) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + + (when (or *display-level-border* *display-texture-download* *display-split-box-info*) + (when *display-level-border* + (format *stdcon* " want: ~A ~A/~A ~A ~A/~A~%" + (-> *load-state* want 0 name) + (-> *load-state* want 0 display?) + (-> *load-state* want 0 force-vis?) + (-> *load-state* want 1 name) + (-> *load-state* want 1 display?) + (-> *load-state* want 1 force-vis?) + ) + (format *stdcon* " nick ~A cur ~S cont ~A~%~%" + (-> *load-state* vis-nick) + (let ((lev-name (and *target* (-> *target* current-level name)))) + (if lev-name + (symbol->string lev-name) + ) + ) + (-> *game-info* current-continue name) + ) + ; (let ((t9-16 format) + ; (a0-53 *stdcon*) + ; (a1-49 " nick ~A cur ~S cont ~A~%~%") + ; (a2-24 (-> *load-state* vis-nick)) + ; (v1-142 (and *target* (-> *target* current-level name))) + ; ) + ; (t9-16 a0-53 a1-49 a2-24 (if v1-142 + ; (-> + ; (the-as + ; (pointer uint32) + ; (+ #xff38 (the-as int v1-142)) + ; ) + ; ) + ; ) + ; (-> *game-info* current-continue name) + ; ) + ; ) + ) + (dotimes (s5-5 (-> obj length)) + (let ((s4-5 (-> obj level s5-5))) + (when (= (-> s4-5 status) 'active) + (format *stdcon* "~A: ~S ~A~%" + (-> s4-5 name) + (if (point-in-boxes? s4-5 (-> *math-camera* trans)) + "inside" + ) + (-> s4-5 display?) + ) + (when *display-texture-download* + (format *stdcon* " tfrag: ~8,,0m " (-> s4-5 closest-object 0)) + (format *stdcon* " shrub: ~8,,0m " (-> s4-5 closest-object 2)) + (format *stdcon* " alpha: ~8,,0m #x~8X~%"(-> s4-5 closest-object 3) (-> s4-5 texture-mask 8)) + (format *stdcon* " tie: ~8,,0m " (-> s4-5 closest-object 5)) + (format *stdcon* " fg-tf: ~8,,0m " (-> s4-5 closest-object 6)) + (format *stdcon* " fg-pr: ~8,,0m #x~8X~%"(-> s4-5 closest-object 7) (-> s4-5 texture-mask 7)) + (format *stdcon* " tf: ~8D pr: ~8D sh: ~8D al: ~8D wa: ~8D~%~1K" + (-> s4-5 upload-size 0) + (-> s4-5 upload-size 1) + (-> s4-5 upload-size 2) + (-> s4-5 upload-size 3) + (-> s4-5 upload-size 4) + ) + ) + (if *display-split-box-info* + (debug-print-splitbox s4-5 (-> *math-camera* trans) *stdcon*) + ) + ) + ) + ) + ) 0 ) diff --git a/goal_src/examples/debug-draw-example.gc b/goal_src/examples/debug-draw-example.gc index 09b8ce54bd..f97b774bfd 100644 --- a/goal_src/examples/debug-draw-example.gc +++ b/goal_src/examples/debug-draw-example.gc @@ -264,6 +264,10 @@ ) (set! *display-profile* #t) +(set! *display-split-boxes* #t) +(set! *display-level-border* #t) +(set! *display-split-box-info* #t) +(set! *display-deci-count* #t) (defun text-randomizer () (dotimes (i 10000) diff --git a/goal_src/game.gp b/goal_src/game.gp index 1151b10395..075cce0c73 100644 --- a/goal_src/game.gp +++ b/goal_src/game.gp @@ -215,6 +215,7 @@ "out/iso/TRA.DGO" "out/iso/FIN.DGO" "out/iso/FIC.DGO" + "out/iso/JUN.DGO" ) ;;;;;;;;;;;;;;;;;;;;;;;; @@ -245,6 +246,7 @@ "village_common/oracle.gc" "common/blocking-plane.gc" + "common/launcherdoor.gc" "racer_common/target-racer-h-FIC-LAV-MIS-OGR-ROL.gc" "racer_common/racer-part.gc" @@ -327,6 +329,69 @@ "village1-vis" ) +;;;;;;;;;;;;;;;;;;;;; +;; Jungle +;;;;;;;;;;;;;;;;;;;;; + +(cgo "JUN.DGO" + "jun.gd") + +(goal-src-sequence + "levels/jungle/" + :deps ;; no idea what these depend on, make it depend on the whole engine + ("out/obj/default-menu.o") + + "jungle-elevator.gc" + "bouncer.gc" + "hopper.gc" + "junglesnake.gc" + "darkvine.gc" + "jungle-obs.gc" + "jungle-mirrors.gc" + "junglefish.gc" + "fisher-JUN.gc" + "jungle-part.gc" + ) + +(copy-gos + "eichar-fish+0-ag-JUN" + "accordian-ag" + "bounceytarp-ag" + "catch-fisha-ag" + "catch-fishb-ag" + "catch-fishc-ag" + "darkvine-ag-JUN" + "ecovalve-ag-JUB-JUN" + "fish-net-ag" + "fisher-ag" + "hopper-ag" + "junglecam-ag" + "junglefish-ag" + "junglesnake-ag" + "launcherdoor-ag-JUN" + "logtrap-ag" + "lurkerm-piston-ag" + "lurkerm-tall-sail-ag" + "maindoor-ag" + "medres-firecanyon-ag" + "orb-cache-top-ag-JUN" + "periscope-ag" + "plat-button-ag" + "plat-eco-ag-JUN" + "precurbridge-ag" + "reflector-mirror-ag" + "ropebridge-52-ag" + "ropebridge-70-ag" + "sharkey-ag-JUN-MIS" + "sidedoor-ag" + "towertop-ag" + "water-anim-jungle-ag" + "jungle-vis" + ) + +(copy-textures 385 531 386 388 765) + + ;;;;;;;;;;;;;;;;;;;;; ;; Fire Canyon ;;;;;;;;;;;;;;;;;;;;; diff --git a/goalc/debugger/Debugger.cpp b/goalc/debugger/Debugger.cpp index 20951d5c02..02668f65d1 100644 --- a/goalc/debugger/Debugger.cpp +++ b/goalc/debugger/Debugger.cpp @@ -616,6 +616,14 @@ void Debugger::watcher() { printf("Target has disappeared. Maybe it quit or was killed.\n"); handle_disappearance(); break; + case xdbg::SignalInfo::ILLEGAL_INSTR: + printf( + "Target has crashed due to an illegal instruction. Run (:di) to get more " + "information.\n"); + break; + case xdbg::SignalInfo::UNKNOWN: + printf("Target has encountered an unknown signal. Run (:di) to get more information.\n"); + break; default: printf("[Debugger] unhandled signal in watcher: %d\n", int(signal_info.kind)); assert(false); diff --git a/test/decompiler/reference/engine/data/art-h_REF.gc b/test/decompiler/reference/engine/data/art-h_REF.gc index 25c3c3a02f..9739f67049 100644 --- a/test/decompiler/reference/engine/data/art-h_REF.gc +++ b/test/decompiler/reference/engine/data/art-h_REF.gc @@ -232,7 +232,7 @@ (login (_type_) _type_ 9) (dummy-10 (_type_ string type) joint 10) (dummy-11 (_type_ string type) int 11) - (dummy-12 (_type_) symbol 12) + (needs-link? (_type_) symbol 12) ) ) diff --git a/test/decompiler/reference/engine/draw/drawable-group-h_REF.gc b/test/decompiler/reference/engine/draw/drawable-group-h_REF.gc index b32f36c19a..faaa710098 100644 --- a/test/decompiler/reference/engine/draw/drawable-group-h_REF.gc +++ b/test/decompiler/reference/engine/draw/drawable-group-h_REF.gc @@ -9,6 +9,9 @@ :method-count-assert 18 :size-assert #x24 :flag-assert #x1200000024 + (:methods + (new (symbol type int) _type_ 0) + ) ) ;; definition for symbol *collide-nodes*, type int diff --git a/test/decompiler/reference/engine/draw/drawable-h_REF.gc b/test/decompiler/reference/engine/draw/drawable-h_REF.gc index 021b4e1890..029208cd9a 100644 --- a/test/decompiler/reference/engine/draw/drawable-h_REF.gc +++ b/test/decompiler/reference/engine/draw/drawable-h_REF.gc @@ -16,7 +16,7 @@ (collide-y-probe (_type_ int collide-list) none 12) (collide-ray (_type_ int collide-list) none 13) (dummy-14 (_type_) none 14) - (dummy-15 (_type_ object object) none 15) + (debug-draw (_type_ drawable object) none 15) (dummy-16 (_type_ object object) object 16) (collect-ambients (_type_ sphere int ambient-list) none 17) ) diff --git a/test/decompiler/reference/engine/draw/drawable-inline-array_REF.gc b/test/decompiler/reference/engine/draw/drawable-inline-array_REF.gc index cb3ce7e4ec..6054614928 100644 --- a/test/decompiler/reference/engine/draw/drawable-inline-array_REF.gc +++ b/test/decompiler/reference/engine/draw/drawable-inline-array_REF.gc @@ -31,9 +31,9 @@ ;; definition for method 15 of type drawable-inline-array ;; INFO: Return type mismatch int vs none. (defmethod - dummy-15 + debug-draw drawable-inline-array - ((obj drawable-inline-array) (arg0 object) (arg1 object)) + ((obj drawable-inline-array) (arg0 drawable) (arg1 object)) 0 (none) ) diff --git a/test/decompiler/reference/engine/draw/drawable-tree-h_REF.gc b/test/decompiler/reference/engine/draw/drawable-tree-h_REF.gc index 36493a98e0..dcf77bbf12 100644 --- a/test/decompiler/reference/engine/draw/drawable-tree-h_REF.gc +++ b/test/decompiler/reference/engine/draw/drawable-tree-h_REF.gc @@ -11,7 +11,8 @@ ;; definition of type drawable-tree-array (deftype drawable-tree-array (drawable-group) - () + ((trees drawable-tree 1 :offset 32) + ) :method-count-assert 18 :size-assert #x24 :flag-assert #x1200000024 diff --git a/test/decompiler/reference/engine/gfx/tfrag/tfrag-h_REF.gc b/test/decompiler/reference/engine/gfx/tfrag/tfrag-h_REF.gc index 7d56ee9893..42ef7d0f55 100644 --- a/test/decompiler/reference/engine/gfx/tfrag/tfrag-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/tfrag/tfrag-h_REF.gc @@ -55,26 +55,26 @@ ;; definition of type tfragment (deftype tfragment (drawable) - ((color-index uint16 :offset 6) - (debug-data tfragment-debug-data :offset 8) - (color-indices uint32 :offset 12) - (colors uint32 :offset 12) - (dma-chain uint32 3 :offset-assert 32) - (dma-common uint32 :offset 32) - (dma-level-0 uint32 :offset 32) - (dma-base uint32 :offset 36) - (dma-level-1 uint32 :offset 40) - (dma-qwc uint32 4 :offset 44) - (shader uint32 :offset 48) - (num-shaders uint8 :offset 52) - (num-base-colors uint8 :offset 53) - (num-level0-colors uint8 :offset 54) - (num-level1-colors uint8 :offset 55) - (color-offset uint8 :offset 56) - (color-count uint8 :offset 57) - (pad0 uint8 :offset 58) - (pad1 uint8 :offset 59) - (generic generic-tfragment :offset-assert 60) + ((color-index uint16 :offset 6) + (debug-data tfragment-debug-data :offset 8) + (color-indices uint32 :offset 12) + (colors uint32 :offset 12) + (dma-chain uint32 3 :offset-assert 32) + (dma-common uint32 :offset 32) + (dma-level-0 uint32 :offset 32) + (dma-base uint32 :offset 36) + (dma-level-1 uint32 :offset 40) + (dma-qwc uint32 4 :offset 44) + (shader (inline-array adgif-shader) :offset 48) + (num-shaders uint8 :offset 52) + (num-base-colors uint8 :offset 53) + (num-level0-colors uint8 :offset 54) + (num-level1-colors uint8 :offset 55) + (color-offset uint8 :offset 56) + (color-count uint8 :offset 57) + (pad0 uint8 :offset 58) + (pad1 uint8 :offset 59) + (generic generic-tfragment :offset-assert 60) ) :method-count-assert 18 :size-assert #x40 diff --git a/test/decompiler/reference/engine/gfx/vis/bsp-h_REF.gc b/test/decompiler/reference/engine/gfx/vis/bsp-h_REF.gc index 0df962975f..13864502b7 100644 --- a/test/decompiler/reference/engine/gfx/vis/bsp-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/vis/bsp-h_REF.gc @@ -54,7 +54,7 @@ (unk-data-5 float :offset-assert 164) (adgifs adgif-shader-array :offset-assert 168) (actor-birth-order (pointer uint32) :offset-assert 172) - (unk-data-7 pointer :offset-assert 176) + (split-box-indices (pointer uint16) :offset-assert 176) (unk-data-8 uint32 55 :offset-assert 180) ) :method-count-assert 20 @@ -63,7 +63,7 @@ (:methods (relocate (_type_ kheap (pointer uint8)) none :replace 7) (birth (_type_) none 18) - (dummy-19 (_type_) none 19) + (deactivate-entities (_type_) none 19) ) ) diff --git a/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc b/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc index f8942c3494..3c4c95b5f9 100644 --- a/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc +++ b/test/decompiler/reference/engine/gfx/vis/bsp_REF.gc @@ -103,7 +103,7 @@ (+! (-> mem-use data 57 used) v1-92) (+! (-> mem-use data 57 total) (logand -16 (+ v1-92 15))) ) - (when (nonzero? (-> obj unk-data-7)) + (when (nonzero? (-> obj split-box-indices)) (set! (-> mem-use length) (max 58 (-> mem-use length))) (set! (-> mem-use data 57 name) "bsp-misc") (+! (-> mem-use data 57 count) 1) @@ -280,7 +280,7 @@ ;; definition for method 15 of type bsp-header ;; INFO: Return type mismatch profile-frame vs none. -(defmethod dummy-15 bsp-header ((obj bsp-header) (arg0 object) (arg1 object)) +(defmethod debug-draw bsp-header ((obj bsp-header) (arg0 drawable) (arg1 object)) (rlet ((vf16 :class vf) (vf17 :class vf) (vf18 :class vf) @@ -338,7 +338,7 @@ ) ) (let ((a1-3 (-> obj drawable-trees))) - (dummy-15 a1-3 a1-3 arg1) + (debug-draw a1-3 a1-3 arg1) ) (if *debug-segment* (add-frame @@ -453,7 +453,7 @@ (+! (-> *collide-stats* calls) 1) (let ((s4-0 (-> obj drawable-trees))) (dotimes (s3-0 (-> s4-0 length)) - (collide-with-box (-> s4-0 data s3-0) arg0 arg1) + (collide-with-box (-> s4-0 trees s3-0) arg0 arg1) ) ) (none) @@ -468,7 +468,7 @@ (+! (-> *collide-stats* calls) 1) (let ((s4-0 (-> obj drawable-trees))) (dotimes (s3-0 (-> s4-0 length)) - (collide-y-probe (-> s4-0 data s3-0) arg0 arg1) + (collide-y-probe (-> s4-0 trees s3-0) arg0 arg1) ) ) (none) @@ -483,7 +483,7 @@ (+! (-> *collide-stats* calls) 1) (let ((s4-0 (-> obj drawable-trees))) (dotimes (s3-0 (-> s4-0 length)) - (collide-ray (-> s4-0 data s3-0) arg0 arg1) + (collide-ray (-> s4-0 trees s3-0) arg0 arg1) ) ) (none) @@ -497,7 +497,7 @@ ((obj bsp-header) (arg0 sphere) (arg1 int) (arg2 ambient-list)) (let ((s3-0 (-> obj drawable-trees))) (dotimes (s2-0 (-> s3-0 length)) - (collect-ambients (-> s3-0 data s2-0) arg0 arg1 arg2) + (collect-ambients (-> s3-0 trees s2-0) arg0 arg1 arg2) ) ) (none) diff --git a/test/decompiler/reference/engine/level/level-h_REF.gc b/test/decompiler/reference/engine/level/level-h_REF.gc index bedc2eacfb..72929d3704 100644 --- a/test/decompiler/reference/engine/level/level-h_REF.gc +++ b/test/decompiler/reference/engine/level/level-h_REF.gc @@ -191,19 +191,19 @@ (unload! (_type_) _type_ 12) (bsp-name (_type_) symbol 13) (dummy-14 (_type_ object) memory-usage-block 14) - (dummy-15 (_type_ vector) symbol 15) + (point-in-boxes? (_type_ vector) symbol 15) (update-vis! (_type_ level-vis-info uint uint) symbol 16) (load-continue (_type_) _type_ 17) (load-begin (_type_) _type_ 18) - (login (_type_) _type_ 19) + (login-begin (_type_) _type_ 19) (vis-load (_type_) uint 20) (dummy-21 (_type_) none 21) - (activate (_type_) _type_ 22) + (birth (_type_) _type_ 22) (level-status-set! (_type_ symbol) _type_ 23) - (dummy-24 (_type_) _type_ 24) - (dummy-25 (_type_) int 25) + (load-required-packages (_type_) _type_ 24) + (init-vis (_type_) int 25) (vis-clear (_type_) int 26) - (dummy-27 (_type_ vector string) none 27) + (debug-print-splitbox (_type_ vector string) none 27) (art-group-get-by-name (_type_ string) art-group 28) ) ) diff --git a/test/decompiler/reference/engine/level/level_REF.gc b/test/decompiler/reference/engine/level/level_REF.gc new file mode 100644 index 0000000000..cca6850285 --- /dev/null +++ b/test/decompiler/reference/engine/level/level_REF.gc @@ -0,0 +1,2165 @@ +;;-*-Lisp-*- +(in-package goal) + +;; definition for function lookup-level-info +(defun lookup-level-info ((name symbol)) + (let* ((rest *level-load-list*) + (current-sym (car rest)) + ) + (while (not (null? rest)) + (let + ((info (the-as level-load-info (-> (the-as symbol current-sym) value)))) + (if + (or + (= name (-> info name)) + (= name (-> info visname)) + (= name (-> info nickname)) + ) + (return info) + ) + ) + (set! rest (cdr rest)) + (set! current-sym (car rest)) + ) + ) + default-level + ) + +;; definition for method 21 of type level-group +;; INFO: Return type mismatch object vs pair. +(defmethod + load-command-get-index + level-group + ((obj level-group) (name symbol) (cmd-idx int)) + (let ((cmd-lst (-> (lookup-level-info name) alt-load-commands))) + (while (nonzero? cmd-idx) + (+! cmd-idx -1) + (set! cmd-lst (cdr cmd-lst)) + (nop!) + (nop!) + (nop!) + ) + (the-as pair (car cmd-lst)) + ) + ) + +;; definition for function remap-level-name +(defun remap-level-name ((arg0 level-load-info)) + (if (-> *level* vis?) + (-> arg0 visname) + (-> arg0 name) + ) + ) + +;; definition for method 28 of type level +(defmethod art-group-get-by-name level ((obj level) (arg0 string)) + (countdown (s4-0 (-> obj art-group art-group-array length)) + (if (name= (-> obj art-group art-group-array s4-0 name) arg0) + (return (-> obj art-group art-group-array s4-0)) + ) + ) + (the-as art-group #f) + ) + +;; definition for method 13 of type level +(defmethod bsp-name level ((obj level)) + (if + (and + (!= (-> obj status) 'inactive) + (-> obj bsp) + (nonzero? (-> obj bsp name)) + ) + (-> obj bsp name) + (-> obj name) + ) + ) + +;; definition for function add-bsp-drawable +(defun + add-bsp-drawable + ((arg0 bsp-header) (arg1 level) (arg2 symbol) (arg3 display-frame)) + (draw arg0 arg0 arg3) + (if (nonzero? *display-strip-lines*) + (debug-draw arg0 arg0 arg3) + ) + (none) + ) + +;; definition for method 2 of type level +(defmethod print level ((obj level)) + (format + #t + "#<~A ~A ~S @ #x~X>" + (-> obj type) + (-> obj status) + (-> obj name) + obj + ) + obj + ) + +;; definition for method 7 of type bsp-header +;; INFO: Return type mismatch bsp-header vs none. +(defmethod + relocate + bsp-header + ((obj bsp-header) (arg0 kheap) (arg1 (pointer uint8))) + (let ((s5-0 (-> *level* loading-level))) + (if s5-0 + (set! obj (cond + (obj + (cond + ((not (type-type? (-> obj type) bsp-header)) + (format + 0 + "ERROR: level ~A is not a bsp-header.~%" + (-> s5-0 name) + ) + (the-as bsp-header #f) + ) + ((not + (file-info-correct-version? + (-> obj info) + (file-kind level-bt) + 0 + ) + ) + (the-as bsp-header #f) + ) + ((< 2048 (-> obj visible-list-length)) + (format + 0 + "ERROR: level ~A visible-list-length ~d is greater than 2048 (16384 drawables).~%" + (-> s5-0 name) + (-> obj visible-list-length) + ) + (the-as bsp-header #f) + ) + (else + (set! (-> s5-0 bsp) obj) + (set! (-> obj level) s5-0) + obj + ) + ) + ) + (else + (format + 0 + "ERROR: level ~A is not a valid file.~%" + (-> s5-0 name) + ) + (the-as bsp-header #f) + ) + ) + ) + ) + ) + (none) + ) + +;; definition for method 24 of type level +(defmethod load-required-packages level ((obj level)) + (when (not (or (not (-> obj bsp)) (= *kernel-boot-mode* 'debug-boot))) + (if (not (null? (-> obj info packages))) + (load-package "common" global) + ) + ) + obj + ) + +;; definition for method 26 of type level +;; Used lq/sq +(defmethod vis-clear level ((obj level)) + (countdown (v1-0 8) + (nop!) + (set! (-> obj vis-info v1-0) #f) + ) + (dotimes (v1-3 128) + (set! (-> (the-as (pointer int128) (&+ (-> obj vis-bits) (* v1-3 16)))) 0) + ) + (set! (-> obj all-visible?) 'loading) + 0 + ) + +;; definition for method 20 of type level +;; Used lq/sq +(defmethod vis-load level ((obj level)) + (when (zero? (-> obj vis-info (-> obj vis-self-index) ramdisk)) + (let ((v1-10 (-> obj other vis-info (-> obj other vis-self-index)))) + (when (and v1-10 (nonzero? (-> v1-10 ramdisk))) + (set! (-> v1-10 flags) (logand -1073741825 (-> v1-10 flags))) + (set! (-> v1-10 ramdisk) (the-as uint 0)) + 0 + ) + ) + (let + ((s4-0 + (make-file-name (file-kind vis) (the-as string (-> obj nickname)) 0 #f) + ) + (s3-0 (the-as ramdisk-rpc-fill (add-element *ramdisk-rpc*))) + (s5-0 (+ *current-ramdisk-id* 1)) + ) + (set! *current-ramdisk-id* s5-0) + (set! (-> s3-0 filename) (string->sound-name s4-0)) + (set! (-> s3-0 ee-id) s5-0) + (call *ramdisk-rpc* (the-as uint 1) (the-as pointer 0) (the-as uint 0)) + (set! (-> obj vis-info (-> obj vis-self-index) ramdisk) (the-as uint s5-0)) + ) + ) + (-> obj vis-info (-> obj vis-self-index) ramdisk) + ) + +;; definition for function load-vis-info +(defun load-vis-info ((arg0 symbol) (arg1 symbol)) + (dotimes (s4-0 (-> *level* length)) + (let ((s3-0 (-> *level* level s4-0))) + (when (= (-> s3-0 status) 'active) + (when (= arg0 (-> s3-0 nickname)) + (format 0 "Swapping in ~A VIS [dumping ~A]~%" arg0 arg1) + (vis-load s3-0) + ) + ) + ) + ) + 0 + ) + +;; definition for method 25 of type level +(defmethod init-vis level ((obj level)) + (when (not (or (= (-> obj status) 'inactive) (not (-> obj bsp)))) + (set! (-> obj all-visible?) 'loading) + (let ((s5-0 (-> obj bsp vis-info 0))) + (cond + ((and s5-0 (nonzero? s5-0) (valid? s5-0 level-vis-info #f #f 0)) + (set! (-> obj vis-info 0) s5-0) + (set! (-> s5-0 current-vis-string) (the-as uint -1)) + (set! (-> s5-0 from-bsp) (-> obj bsp)) + (set! (-> s5-0 vis-bits) (-> obj vis-bits)) + (set! + (-> s5-0 flags) + (logand (the-as uint #xffffffff3fffffff) (-> s5-0 flags)) + ) + (set! (-> s5-0 flags) (logior #x20000000 (-> s5-0 flags))) + (set! (-> s5-0 ramdisk) (the-as uint 0)) + (set! (-> s5-0 string-block) (the-as uint #f)) + (set! *vis-boot* #t) + ) + (else + (set! (-> obj vis-info 0) #f) + ) + ) + ) + (dotimes (s5-1 6) + (let* ((s3-0 (+ s5-1 1)) + (s4-0 (-> obj bsp vis-info s3-0)) + ) + (cond + ((and s4-0 (nonzero? s4-0) (valid? s4-0 level-vis-info #f #f 0)) + (set! (-> obj vis-info s3-0) s4-0) + (set! (-> s4-0 current-vis-string) (the-as uint -1)) + (set! (-> s4-0 from-bsp) #f) + (set! (-> s4-0 vis-bits) (-> obj vis-bits)) + (set! + (-> s4-0 flags) + (logand (the-as uint #xffffffff1fffffff) (-> s4-0 flags)) + ) + (set! *vis-boot* #t) + ) + (else + (set! (-> obj vis-info s3-0) #f) + ) + ) + ) + ) + ) + 0 + ) + +;; definition for method 11 of type level-group +(defmethod + level-get-for-use + level-group + ((obj level-group) (arg0 symbol) (arg1 symbol)) + (local-vars (s5-1 level)) + (alloc-levels! obj #f) + (let* ((s3-0 (lookup-level-info arg0)) + (s2-0 (remap-level-name s3-0)) + ) + (let ((s1-0 (level-get obj s2-0))) + (when s1-0 + (level-status-set! s1-0 arg1) + (set! s5-1 s1-0) + (goto cfg-10) + ) + ) + (let ((a0-7 (level-get-most-disposable obj))) + (set! s5-1 (if a0-7 + (level-status-set! a0-7 'inactive) + a0-7 + ) + ) + ) + (when (not level) + (format 0 "ERROR: could not find a slot to load ~A into.~%" arg0) + (set! s5-1 (the-as level #f)) + (goto cfg-10) + ) + (set! (-> s5-1 info) s3-0) + (set! (-> s5-1 name) arg0) + (set! (-> s5-1 load-name) s2-0) + ) + (set! (-> s5-1 mood) (the-as mood-context (-> s5-1 info mood value))) + (set! + (-> s5-1 mood-func) + (the-as + (function mood-context float int none) + (-> s5-1 info mood-func value) + ) + ) + (set! (-> s5-1 display?) #f) + (set! (-> s5-1 force-all-visible?) #f) + (set! (-> s5-1 force-inside?) #f) + (level-status-set! s5-1 'loading) + (level-status-set! s5-1 arg1) + (label cfg-10) + s5-1 + ) + +;; definition for method 25 of type level-group +(defmethod level-status level-group ((obj level-group) (arg0 symbol)) + (let ((v1-1 (level-get *level* arg0))) + (if v1-1 + (-> v1-1 status) + ) + ) + ) + +;; definition for method 23 of type level +(defmethod level-status-set! level ((obj level) (arg0 symbol)) + (case arg0 + (('inactive) + (-> obj status) + (unload! obj) + ) + (('loading) + (case (-> obj status) + (('inactive) + (load-begin obj) + ) + ) + ) + (('loading-bt) + (case (-> obj status) + (('loading) + (set! (-> obj status) arg0) + (load-continue obj) + ) + ) + ) + (('loading-done) + (case (-> obj status) + (('loading-bt) + (set! (-> obj status) arg0) + ) + ) + ) + (('loaded) + (case (-> obj status) + (('loading-done) + (login-begin obj) + ) + (('alive 'active) + (deactivate obj) + ) + ) + ) + (('alive 'active) + (when *dproc* + (case (-> obj status) + (('loaded) + (birth obj) + (level-status-set! obj arg0) + ) + (('alive) + (when (and *dproc* (= arg0 'active)) + (remove-by-param1 *background-draw-engine* (-> obj bsp)) + (add-connection + *background-draw-engine* + *dproc* + add-bsp-drawable + (-> obj bsp) + obj + #f + ) + (dotimes (v1-40 9) + (set! (-> obj closest-object v1-40) 0.0) + (set! (-> obj texture-mask v1-40) (the-as uint 0)) + ) + (set! (-> obj level-distance) 0.0) + (set! (-> obj status) 'active) + ) + ) + ) + ) + ) + ) + obj + ) + +;; definition for symbol *login-state*, type login-state +(define *login-state* (new 'global 'login-state)) + +;; definition for symbol *print-login*, type symbol +(define *print-login* #t) + +;; definition for method 17 of type level +(defmethod load-continue level ((obj level)) + (local-vars (sv-16 symbol)) + (when (-> obj linking) + (when (nonzero? (link-resume)) + (set! (-> obj linking) #f) + (case (-> obj status) + (('loading) + (if (not (-> *texture-relocate-later* memcpy)) + (dgo-load-continue (logand -64 (&+ (-> obj heap current) 63))) + ) + ) + (('loading-bt) + (level-status-set! obj 'loading-done) + (level-status-set! obj 'loaded) + ) + ) + ) + (set! obj obj) + (goto cfg-30) + ) + (when (-> *texture-relocate-later* memcpy) + (relocate-later) + (dgo-load-continue (logand -64 (&+ (-> obj heap current) 63))) + (set! obj obj) + (goto cfg-30) + ) + (case (-> obj status) + (('loading) + (set! sv-16 (the-as symbol #f)) + (let ((a0-15 (dgo-load-get-next (& sv-16)))) + (when a0-15 + (cond + ((not sv-16) + (cond + ((dgo-load-link + (the-as dgo-header a0-15) + (-> obj heap) + *print-login* + #f + ) + (if (not (-> *texture-relocate-later* memcpy)) + (dgo-load-continue (logand -64 (&+ (-> obj heap current) 63))) + ) + ) + (else + (set! (-> obj linking) #t) + ) + ) + ) + (else + (set! (-> obj heap top) (-> obj heap top-base)) + (level-status-set! obj 'loading-bt) + ) + ) + ) + ) + ) + (('login) + (level-update-after-load obj *login-state*) + ) + (('loading-bt) + (let ((a0-26 (logand -64 (&+ (-> obj heap current) 63)))) + (cond + ((dgo-load-link (the-as dgo-header a0-26) (-> obj heap) *print-login* #t) + (level-status-set! obj 'loading-done) + (level-status-set! obj 'loaded) + ) + (else + (set! (-> obj linking) #t) + ) + ) + ) + ) + ) + (label cfg-30) + obj + ) + +;; definition for method 18 of type level +(defmethod load-begin level ((obj level)) + (set! loading-level (-> obj heap)) + (set! (-> *level* loading-level) obj) + (set! (-> *level* log-in-level-bsp) #f) + (set! (-> obj nickname) #f) + (set! (-> obj bsp) #f) + (set! (-> obj entity) #f) + (set! (-> obj ambient) #f) + (set! (-> obj linking) #f) + (vis-clear obj) + (set! (-> obj status) 'loading) + (set! (-> *texture-pool* allocate-func) texture-page-level-allocate) + (if (= (-> obj load-name) (-> obj info visname)) + (format (clear *temp-string*) "~S" (-> obj info nickname)) + (format (clear *temp-string*) "~S" (-> obj name)) + ) + (set! (-> *temp-string* data 8) (the-as uint 0)) + (format *temp-string* ".DGO") + (set! (-> obj heap top) (-> obj heap top-base)) + (let + ((s4-0 + (kmalloc + (-> obj heap) + #x200000 + (kmalloc-flags align-64 top) + "dgo-level-buf-2" + ) + ) + (s5-2 + (kmalloc + (-> obj heap) + #x200000 + (kmalloc-flags align-64 top) + "dgo-level-buf-2" + ) + ) + ) + (set! (-> obj code-memory-start) (-> obj heap current)) + (format + 0 + "-----------> begin load ~A [~S]~%" + (-> obj load-name) + *temp-string* + ) + (dgo-load-begin + *temp-string* + s5-2 + s4-0 + (logand -64 (&+ (-> obj heap current) 63)) + ) + ) + obj + ) + +;; definition for method 19 of type level +(defmethod login-begin level ((obj level)) + (set! (-> *texture-pool* allocate-func) texture-page-default-allocate) + (cond + ((-> obj bsp) + (set! (-> *level* log-in-level-bsp) (-> obj bsp)) + (login-level-textures + *texture-pool* + obj + (-> obj bsp texture-page-count) + (-> obj bsp texture-ids) + ) + (let ((v1-7 (-> obj bsp))) + (when (nonzero? (-> v1-7 adgifs)) + (let ((s5-0 (-> v1-7 adgifs))) + (dotimes (s4-0 (-> s5-0 length)) + (adgif-shader-login-no-remap (-> s5-0 data s4-0)) + ) + ) + ) + ) + (set! (-> *login-state* state) -1) + (set! (-> *login-state* pos) (the-as uint 0)) + (set! (-> *login-state* elts) (the-as uint 0)) + (set! (-> obj status) 'login) + ) + (else + (level-status-set! obj 'inactive) + (set! loading-level global) + (set! (-> *level* loading-level) (-> *level* level-default)) + ) + ) + obj + ) + +;; definition for function level-update-after-load +;; WARN: Found some very strange gotos. Check result carefully, this is not well tested. +;; WARN: Unsupported inline assembly instruction kind - [mfc0 s5, Count] +;; WARN: Unsupported inline assembly instruction kind - [mfc0 v1, Count] +;; WARN: Unsupported inline assembly instruction kind - [mfc0 v1, Count] +;; Used lq/sq +(defun + level-update-after-load + ((loaded-level level) (level-login-state login-state)) + (local-vars + (current-timer int) + (v1-154 int) + (initial-timer int) + (sv-16 prototype-bucket-tie) + (sv-32 int) + ) + 0 + (let ((level-drawable-trees (-> loaded-level bsp drawable-trees))) + 0 + (.mfc0 initial-timer Count) + (label cfg-1) + 0 + (.mfc0 current-timer Count) + (let ((elapsed-timer (- current-timer initial-timer))) + (when (< #x186a0 elapsed-timer) + (set! loaded-level loaded-level) + (goto cfg-78) + ) + ) + (let ((current-login-pos (the-as int (-> level-login-state pos)))) + (when (= (-> level-login-state state) -1) + (when (< current-login-pos (-> level-drawable-trees length)) + (let + ((current-drawable + (-> level-drawable-trees trees (the-as uint current-login-pos)) + ) + ) + (cond + ((= (-> current-drawable type) drawable-tree-tfrag) + (dotimes (idx-in-drawable (-> current-drawable length)) + (cond + ((= + (-> current-drawable data idx-in-drawable type) + drawable-inline-array-tfrag + ) + (set! + (-> level-login-state elt (-> level-login-state elts)) + (-> current-drawable data idx-in-drawable) + ) + (+! (-> level-login-state elts) 1) + ) + (else + (login (-> current-drawable data idx-in-drawable)) + ) + ) + ) + ) + ((= (-> current-drawable type) drawable-tree-instance-tie) + (set! + (-> level-login-state elt (-> level-login-state elts)) + current-drawable + ) + (+! (-> level-login-state elts) 1) + ) + (else + (login current-drawable) + ) + ) + ) + (+! (-> level-login-state pos) 1) + (goto cfg-1) + ) + (let + ((v1-39 + (- + (the-as uint current-login-pos) + (the-as uint (-> level-drawable-trees length)) + ) + ) + ) + (when + (< (the-as int v1-39) (-> loaded-level art-group art-group-array length)) + (let ((s2-2 (-> loaded-level art-group art-group-array v1-39))) + (login s2-2) + (if (needs-link? s2-2) + (link-art! s2-2) + ) + ) + (+! (-> level-login-state pos) 1) + (goto cfg-1) + ) + ) + (set! (-> level-login-state pos) (the-as uint 0)) + (set! (-> level-login-state state) 0) + (goto cfg-1) + ) + (when + (< (-> level-login-state state) (the-as int (-> level-login-state elts))) + (let ((s1-1 (-> level-login-state elt (-> level-login-state state)))) + (cond + ((= (-> s1-1 type) drawable-inline-array-tfrag) + (cond + ((< + current-login-pos + (-> (the-as drawable-inline-array-tfrag s1-1) length) + ) + (dotimes (s0-0 200) + (when + (< + current-login-pos + (-> (the-as drawable-inline-array-tfrag s1-1) length) + ) + (login + (-> + (the-as drawable-inline-array-tfrag s1-1) + data + (the-as uint current-login-pos) + ) + ) + (set! + current-login-pos + (the-as int (+ (the-as uint current-login-pos) 1)) + ) + ) + ) + (set! (-> level-login-state pos) (the-as uint current-login-pos)) + ) + (else + (set! (-> level-login-state pos) (the-as uint 0)) + (set! current-login-pos (+ (-> level-login-state state) 1)) + (set! (-> level-login-state state) current-login-pos) + ) + ) + ) + ((= (-> s1-1 type) drawable-tree-instance-tie) + (let + ((s1-2 + (-> + (the-as drawable-tree-instance-tie s1-1) + prototypes + prototype-array-tie + ) + ) + ) + (when (< current-login-pos (-> s1-2 length)) + (dotimes (s0-1 10) + (when (< current-login-pos (-> s1-2 length)) + (set! sv-16 (-> s1-2 array-data (the-as uint current-login-pos))) + (set! sv-32 0) + (while (< sv-32 4) + (let ((a0-28 (-> sv-16 geometry sv-32))) + (if (nonzero? a0-28) + (login a0-28) + ) + ) + (set! sv-32 (+ sv-32 1)) + ) + (set! + current-login-pos + (the-as int (+ (the-as uint current-login-pos) 1)) + ) + ) + ) + (set! (-> level-login-state pos) (the-as uint current-login-pos)) + ) + (when (= (the-as uint current-login-pos) (-> s1-2 length)) + (dotimes (s2-3 (-> s1-2 length)) + (let ((s0-2 (-> s1-2 array-data s2-3 envmap-shader))) + (when (nonzero? s0-2) + (adgif-shader-login-no-remap s0-2) + (set! (-> s0-2 tex1) (new 'static 'gs-tex1 :mmag #x1 :mmin #x1)) + (set! + (-> s0-2 clamp) + (new 'static 'gs-clamp + :wms (gs-tex-wrap-mode clamp) + :wmt (gs-tex-wrap-mode clamp) + ) + ) + (set! (-> s0-2 alpha) (new 'static 'gs-miptbp :tbp1 #x58)) + (set! (-> s0-2 prims 1) (gs-reg64 tex0-1)) + (set! (-> s0-2 prims 3) (gs-reg64 tex1-1)) + (set! (-> s0-2 prims 5) (gs-reg64 miptbp1-1)) + (set! (-> s0-2 clamp-reg) (gs-reg64 clamp-1)) + (set! (-> s0-2 prims 9) (gs-reg64 alpha-1)) + ) + ) + ) + (set! (-> level-login-state pos) (the-as uint 0)) + (+! (-> level-login-state state) 1) + ) + ) + ) + ) + ) + (goto cfg-1) + ) + (when (= (-> level-login-state state) (-> level-login-state elts)) + (let ((v1-115 (-> loaded-level bsp))) + (cond + ((or + (zero? (-> v1-115 actors)) + (= (the-as uint current-login-pos) (-> v1-115 actors length)) + ) + (set! (-> level-login-state pos) (the-as uint 0)) + (+! (-> level-login-state state) 1) + ) + (else + (let + ((a0-36 (-> v1-115 actors data (the-as uint current-login-pos) actor))) + (entity-nav-login a0-36) + ) + (+! (-> level-login-state pos) 1) + ) + ) + ) + (goto cfg-1) + ) + (when (zero? (the-as uint current-login-pos)) + (set! (-> level-login-state pos) (the-as uint 1)) + (set! loaded-level loaded-level) + (goto cfg-78) + ) + ) + ) + (set! (-> loaded-level nickname) (-> loaded-level bsp nickname)) + (if (nonzero? (-> loaded-level bsp nodes)) + (set! *time-of-day-effects* #t) + (set! *time-of-day-effects* #f) + ) + (let ((f0-0 (-> loaded-level bsp unk-data-4)) + (f1-0 (-> loaded-level bsp unk-data-5)) + ) + (when (and (= f0-0 0.0) (= f1-0 0.0)) + (set! f0-0 122880.0) + (set! f1-0 286720.0) + ) + (set! (-> *subdivide-settings* close (-> loaded-level index)) f0-0) + (set! (-> *subdivide-settings* far (-> loaded-level index)) f1-0) + (set! (-> *subdivide-settings* close 3) f0-0) + (set! (-> *subdivide-settings* far 3) f1-0) + ) + (init-vis loaded-level) + (load-required-packages loaded-level) + (set! (-> loaded-level status) 'loaded) + (set! loading-level global) + (set! (-> *level* loading-level) (-> *level* level-default)) + (set! (-> *level* log-in-level-bsp) #f) + 0 + (.mfc0 v1-154 Count) + (- v1-154 initial-timer) + (label cfg-78) + loaded-level + ) + +;; definition for method 22 of type level +(defmethod birth level ((obj level)) + (case (-> obj status) + (('loaded) + (let ((s5-0 loading-level) + (s4-0 (-> *level* loading-level)) + (s3-1 (-> *level* log-in-level-bsp)) + ) + (set! loading-level (-> obj heap)) + (set! (-> *level* log-in-level-bsp) (-> obj bsp)) + (set! (-> *level* loading-level) obj) + (birth (-> obj bsp)) + (set! (-> obj status) 'alive) + (copy-perms-to-level! *game-info* obj) + (send-event *camera* 'level-activate (-> obj name)) + (send-event *target* 'level-activate (-> obj name)) + (set! loading-level s5-0) + (set! (-> *level* loading-level) s4-0) + (set! (-> *level* log-in-level-bsp) s3-1) + ) + ) + ) + obj + ) + +;; definition for method 9 of type level +;; Used lq/sq +(defmethod deactivate level ((obj level)) + (case (-> obj status) + (('active 'alive) + (format 0 "----------- kill ~A (status ~A)~%" obj (-> obj status)) + (copy-perms-from-level! *game-info* obj) + (send-event *camera* 'level-deactivate (-> obj name)) + (send-event *target* 'level-deactivate (-> obj name)) + (remove-by-param1 *background-draw-engine* (-> obj bsp)) + (deactivate-entities (-> obj bsp)) + (kill-all-particles-in-level obj) + (set! (-> obj inside-sphere?) #f) + (set! (-> obj inside-boxes?) #f) + (set! (-> obj meta-inside?) #f) + (set! (-> obj force-inside?) #f) + (set! (-> obj status) 'loaded) + (set! (-> obj all-visible?) 'loading) + (dotimes (v1-19 128) + (set! + (-> (the-as (pointer int128) (&+ (-> obj vis-bits) (* v1-19 16)))) + 0 + ) + ) + (countdown (v1-22 8) + (let ((a0-14 (-> obj vis-info v1-22))) + (if a0-14 + (set! (-> a0-14 current-vis-string) (the-as uint -1)) + ) + ) + ) + ) + ) + (if (= (-> *level* log-in-level-bsp) (-> obj bsp)) + (set! (-> *level* log-in-level-bsp) #f) + ) + obj + ) + +;; definition for method 12 of type level +(defmethod unload! level ((obj level)) + (deactivate obj) + (when (!= (-> obj status) 'inactive) + (when + (or + (= (-> obj status) 'loaded) + (= (-> obj status) 'alive) + (= (-> obj status) 'active) + (= (-> obj status) 'login) + ) + (dotimes (s5-0 (-> obj art-group art-group-array length)) + (let ((s4-0 (-> obj art-group art-group-array s5-0))) + (if (needs-link? s4-0) + (unlink-art! s4-0) + ) + ) + ) + ) + (set! (-> obj bsp) #f) + (set! (-> obj entity) #f) + (set! (-> obj ambient) #f) + (set! (-> obj status) 'inactive) + (set! (-> obj art-group string-array length) 0) + (set! (-> obj art-group art-group-array length) 0) + (countdown (s5-1 (-> obj loaded-texture-page-count)) + (dotimes (v1-27 32) + (when + (= + (-> obj loaded-texture-page s5-1) + (-> *texture-pool* common-page v1-27) + ) + (set! (-> *texture-pool* common-page v1-27) (the-as texture-page 0)) + 0 + ) + ) + (unload! *texture-pool* (-> obj loaded-texture-page s5-1)) + ) + (set! (-> obj loaded-texture-page-count) 0) + (unlink-textures-in-heap! *texture-page-dir* (-> obj heap)) + (unlink-part-group-by-heap (-> obj heap)) + (dotimes (s5-2 2) + (let ((v1-41 (-> *art-control* buffer s5-2 pending-load-file))) + (if + (and + (>= (the-as int v1-41) (the-as int (-> obj heap base))) + (< (the-as int v1-41) (the-as int (-> obj heap top-base))) + ) + (set-pending-file + (-> *art-control* buffer s5-2) + (the-as string #f) + -1 + (the-as handle #f) + 100000000.0 + ) + ) + ) + ) + (let* ((s5-3 (-> obj info packages)) + (a0-29 (car s5-3)) + ) + (while (not (null? s5-3)) + (case (rtype-of a0-29) + ((symbol) + (unload (symbol->string (the-as symbol a0-29))) + ) + ((string) + (unload (the-as string a0-29)) + ) + ) + (set! s5-3 (cdr s5-3)) + (set! a0-29 (car s5-3)) + ) + ) + (vis-clear obj) + (let ((v1-64 (-> obj heap))) + (set! (-> v1-64 current) (-> v1-64 base)) + ) + (set! (-> obj code-memory-start) (the-as pointer 0)) + (set! (-> obj code-memory-end) (the-as pointer 0)) + (when (= (-> *level* loading-level) obj) + (set! loading-level global) + (set! (-> *level* loading-level) (-> *level* level-default)) + (set! (-> *level* log-in-level-bsp) #f) + ) + ) + obj + ) + +;; definition for method 10 of type level +;; WARN: Unsupported inline assembly instruction kind - [sra a0, a1, 3] +;; WARN: Unsupported inline assembly instruction kind - [addiu a0, a0, 56] +(defmethod is-object-visible? level ((obj level) (arg0 int)) + (local-vars (a0-1 int) (a0-3 int)) + (let ((v1-0 (-> obj vis-bits))) + (.sra a0-1 arg0 3) + (let ((v1-2 (-> (the-as (pointer int8) (+ a0-1 (the-as int v1-0)))))) + (let ((a0-2 (logand arg0 7))) + (.addiu a0-3 a0-2 56) + ) + (< (shl v1-2 a0-3) 0) + ) + ) + ) + +;; definition for method 15 of type level +;; INFO: Return type mismatch object vs symbol. +(defmethod point-in-boxes? level ((obj level) (arg0 vector)) + (the-as symbol (cond + ((or (not (-> obj bsp)) (zero? (-> obj bsp boxes))) + #f + ) + ((-> obj force-inside?) + #t + ) + (else + (let* ((a0-1 (-> obj bsp boxes)) + (v1-5 (the-as object (-> a0-1 data))) + ) + (countdown (a0-2 (-> a0-1 length)) + (if + (and + (>= + (-> arg0 x) + (-> (the-as (inline-array box8s) v1-5) 0 min x) + ) + (>= + (-> arg0 y) + (-> (the-as (inline-array box8s) v1-5) 0 min y) + ) + (>= + (-> arg0 z) + (-> (the-as (inline-array box8s) v1-5) 0 min z) + ) + (< + (-> arg0 x) + (-> (the-as (inline-array box8s) v1-5) 0 max x) + ) + (< + (-> arg0 y) + (-> (the-as (inline-array box8s) v1-5) 0 max y) + ) + (< + (-> arg0 z) + (-> (the-as (inline-array box8s) v1-5) 0 max z) + ) + ) + (return (the-as symbol #t)) + ) + (set! v1-5 (-> (the-as (inline-array box8s) v1-5) 1)) + ) + ) + #f + ) + ) + ) + ) + +;; definition for method 27 of type level +;; INFO: Return type mismatch int vs none. +(defmethod debug-print-splitbox level ((obj level) (arg0 vector) (arg1 string)) + (cond + ((or + (not (-> obj bsp)) + (zero? (-> obj bsp boxes)) + (zero? (-> obj bsp split-box-indices)) + ) + ) + (else + (let* ((s3-0 (-> obj bsp boxes)) + (s2-0 (the-as object (-> s3-0 data))) + ) + (dotimes (s1-0 (-> s3-0 length)) + (if + (and + (>= (-> arg0 x) (-> (the-as (inline-array box8s) s2-0) 0 min x)) + (>= (-> arg0 y) (-> (the-as (inline-array box8s) s2-0) 0 min y)) + (>= (-> arg0 z) (-> (the-as (inline-array box8s) s2-0) 0 min z)) + (< (-> arg0 x) (-> (the-as (inline-array box8s) s2-0) 0 max x)) + (< (-> arg0 y) (-> (the-as (inline-array box8s) s2-0) 0 max y)) + (< (-> arg0 z) (-> (the-as (inline-array box8s) s2-0) 0 max z)) + ) + (format arg1 " splitbox-~D~%" (-> obj bsp split-box-indices s1-0)) + ) + (set! s2-0 (-> (the-as (inline-array box8s) s2-0) 1)) + ) + ) + ) + ) + 0 + (none) + ) + +;; definition for method 8 of type level +(defmethod mem-usage level ((obj level) (arg0 memory-usage-block) (arg1 int)) + (when (= (-> obj status) 'active) + (set! (-> arg0 length) (max 65 (-> arg0 length))) + (set! (-> arg0 data 64 name) "entity-links") + (+! (-> arg0 data 64 count) (-> obj entity length)) + (let ((v1-8 (asize-of (-> obj entity)))) + (+! (-> arg0 data 64 used) v1-8) + (+! (-> arg0 data 64 total) (logand -16 (+ v1-8 15))) + ) + (set! (-> arg0 length) (max 65 (-> arg0 length))) + (set! (-> arg0 data 64 name) "ambient-links") + (+! (-> arg0 data 64 count) (-> obj ambient length)) + (let ((v1-18 (asize-of (-> obj ambient)))) + (+! (-> arg0 data 64 used) v1-18) + (+! (-> arg0 data 64 total) (logand -16 (+ v1-18 15))) + ) + (mem-usage (-> obj art-group) arg0 arg1) + (set! (-> arg0 length) (max 64 (-> arg0 length))) + (set! (-> arg0 data 63 name) "level-code") + (+! (-> arg0 data 63 count) 1) + (let + ((v1-30 + (&- (-> obj code-memory-end) (the-as uint (-> obj code-memory-start))) + ) + ) + (+! (-> arg0 data 63 used) v1-30) + (+! (-> arg0 data 63 total) (logand -16 (+ v1-30 15))) + ) + (countdown (s3-0 (-> obj loaded-texture-page-count)) + (mem-usage (-> obj loaded-texture-page s3-0) arg0 arg1) + ) + (countdown (s3-1 8) + (let ((s2-0 (-> obj vis-info s3-1))) + (when s2-0 + (cond + ((zero? s3-1) + (set! (-> arg0 length) (max 60 (-> arg0 length))) + (set! (-> arg0 data 59 name) "bsp-leaf-vis-self") + (+! (-> arg0 data 59 count) 1) + (let ((v1-50 (asize-of s2-0))) + (+! (-> arg0 data 59 used) v1-50) + (+! (-> arg0 data 59 total) (logand -16 (+ v1-50 15))) + ) + ) + (else + (set! (-> arg0 length) (max 61 (-> arg0 length))) + (set! (-> arg0 data 60 name) "bsp-leaf-vis-adj") + (+! (-> arg0 data 60 count) 1) + (let ((v1-61 (+ (asize-of s2-0) (-> s2-0 allocated-length)))) + (+! (-> arg0 data 60 used) v1-61) + (+! (-> arg0 data 60 total) (logand -16 (+ v1-61 15))) + ) + ) + ) + ) + ) + ) + (mem-usage (-> obj bsp) arg0 arg1) + ) + obj + ) + +;; definition for method 18 of type level-group +(defmethod alloc-levels! level-group ((obj level-group) (arg0 symbol)) + (when (zero? (-> *level* level0 heap base)) + (when (nmember "game" *kernel-packages*) + (set! *kernel-packages* (cons "art" *kernel-packages*)) + (set! *kernel-packages* (cons "common" *kernel-packages*)) + ) + (load-package "art" global) + (if arg0 + (load-package "common" global) + ) + (let ((s5-1 (if arg0 + #xa2c000 + #x1900000 + ) + ) + ) + (dotimes (s4-0 2) + (let ((s3-0 (-> obj level s4-0 heap))) + (set! (-> s3-0 base) (malloc 'global s5-1)) + (set! (-> s3-0 current) (-> s3-0 base)) + (set! (-> s3-0 top-base) (&+ (-> s3-0 base) s5-1)) + (set! (-> s3-0 top) (-> s3-0 top-base)) + ) + ) + ) + ) + 0 + ) + +;; definition for method 10 of type level-group +(defmethod level-get-with-status level-group ((obj level-group) (arg0 symbol)) + (dotimes (v1-0 (-> obj length)) + (if (= (-> obj level v1-0 status) arg0) + (return (-> obj level v1-0)) + ) + ) + (the-as level #f) + ) + +;; definition for method 26 of type level-group +(defmethod level-get-most-disposable level-group ((obj level-group)) + (dotimes (v1-0 (-> obj length)) + (case (-> obj level v1-0 status) + (('inactive) + (return (-> obj level v1-0)) + ) + ) + ) + (dotimes (v1-6 (-> obj length)) + (case (-> obj level v1-6 status) + (('loading 'loading-bt) + (return (-> obj level v1-6)) + ) + ) + ) + (dotimes (v1-12 (-> obj length)) + (case (-> obj level v1-12 status) + (('loaded) + (return (-> obj level v1-12)) + ) + ) + ) + (let ((v0-0 (the-as level #f))) + (dotimes (v1-18 (-> obj length)) + (case (-> obj level v1-18 status) + (('active) + (if + (and + (not (-> obj level v1-18 inside-boxes?)) + (or + (not v0-0) + (< (-> obj level v1-18 info priority) (-> v0-0 info priority)) + ) + ) + (set! v0-0 (-> obj level v1-18)) + ) + ) + ) + ) + v0-0 + ) + ) + +;; definition for method 9 of type level-group +(defmethod level-get level-group ((obj level-group) (arg0 symbol)) + (dotimes (v1-0 (-> obj length)) + (if + (and + (!= (-> obj level v1-0 status) 'inactive) + (or + (= (-> obj level v1-0 name) arg0) + (= (-> obj level v1-0 load-name) arg0) + ) + ) + (return (-> obj level v1-0)) + ) + ) + (the-as level #f) + ) + +;; definition for method 20 of type level-group +(defmethod art-group-get-by-name level-group ((obj level-group) (arg0 string)) + (countdown (s4-0 3) + (let ((s3-0 (-> obj level s4-0))) + (countdown (s2-0 (-> s3-0 art-group art-group-array length)) + (if (name= (-> s3-0 art-group art-group-array s2-0 name) arg0) + (return (-> s3-0 art-group art-group-array s2-0)) + ) + ) + ) + ) + (the-as art-group #f) + ) + +;; definition for method 12 of type level-group +(defmethod activate-levels! level-group ((obj level-group)) + (dotimes (s5-0 (-> obj length)) + (level-status-set! (-> obj level s5-0) 'active) + ) + 0 + ) + +;; definition for method 17 of type level-group +(defmethod level-get-target-inside level-group ((obj level-group)) + (let ((s5-0 (target-pos 0))) + (let ((v1-2 (-> *game-info* current-continue level))) + (dotimes (a0-2 (-> obj length)) + (let ((a1-3 (-> obj level a0-2))) + (when (= (-> a1-3 status) 'active) + (if (= (-> a1-3 name) v1-2) + (return a1-3) + ) + ) + ) + ) + ) + (let ((s4-0 (the-as level #f))) + (let ((f30-0 0.0)) + (dotimes (s3-0 (-> obj length)) + (let ((s2-0 (-> obj level s3-0))) + (when (= (-> s2-0 status) 'active) + (let ((f0-0 (vector-vector-distance (-> s2-0 bsp bsphere) s5-0))) + (if (and (-> s2-0 inside-boxes?) (or (not s4-0) (< f0-0 f30-0))) + (set! s4-0 s2-0) + ) + ) + ) + ) + ) + ) + (if s4-0 + (return s4-0) + ) + ) + ) + (dotimes (v1-20 (-> obj length)) + (let ((a0-8 (-> obj level v1-20))) + (when (= (-> a0-8 status) 'active) + (if (-> a0-8 meta-inside?) + (return a0-8) + ) + ) + ) + ) + (let ((v0-1 (the-as level #f))) + (let ((f0-1 0.0)) + (dotimes (v1-23 (-> obj length)) + (let ((a0-13 (-> obj level v1-23))) + (when (= (-> a0-13 status) 'active) + (if (or (not v0-1) (< (-> a0-13 level-distance) f0-1)) + (set! v0-1 a0-13) + ) + ) + ) + ) + ) + v0-1 + ) + ) + +;; definition for method 19 of type level-group +(defmethod load-commands-set! level-group ((obj level-group) (arg0 pair)) + (set! (-> obj load-commands) arg0) + arg0 + ) + +;; definition for method 8 of type level-group +(defmethod + mem-usage + level-group + ((obj level-group) (arg0 memory-usage-block) (arg1 int)) + (dotimes (s3-0 (-> obj length)) + (mem-usage (-> obj level s3-0) arg0 arg1) + ) + obj + ) + +;; definition for function bg +(defun bg ((arg0 symbol)) + (set! *cheat-mode* (if *debug-segment* + 'debug + #f + ) + ) + (let ((v1-2 (lookup-level-info arg0))) + (cond + ((= (-> v1-2 visname) arg0) + (set! (-> *level* vis?) #t) + (set! arg0 (-> v1-2 name)) + ) + (else + (set! (-> *level* vis?) #f) + (set! (-> *kernel-context* low-memory-message) #f) + ) + ) + (let* ((s5-0 (-> v1-2 run-packages)) + (a0-8 (car s5-0)) + ) + (while (not (null? s5-0)) + (case (rtype-of a0-8) + ((symbol) + (load-package (symbol->string (the-as symbol a0-8)) global) + ) + ((string) + (load-package (the-as string a0-8) global) + ) + ) + (set! s5-0 (cdr s5-0)) + (set! a0-8 (car s5-0)) + ) + ) + ) + (let ((gp-1 (level-get-for-use *level* arg0 'active))) + (while + (and + gp-1 + (or + (= (-> gp-1 status) 'loading) + (= (-> gp-1 status) 'loading-bt) + (= (-> gp-1 status) 'login) + ) + (not *dproc*) + ) + (load-continue gp-1) + ) + (vis-load gp-1) + (set! (-> *load-state* vis-nick) (if (-> *level* vis?) + (-> gp-1 nickname) + #f + ) + ) + (set! (-> *load-state* want 0 name) (-> gp-1 name)) + (set! (-> *load-state* want 0 display?) 'display) + (set! (-> *load-state* want 0 force-vis?) #f) + (set! (-> *load-state* want 0 force-inside?) #f) + (set! (-> *load-state* want 1 name) #f) + (set! (-> *load-state* want 1 display?) #f) + (set! (-> *load-state* want 1 force-inside?) #f) + (if (-> gp-1 info continues) + (set-continue! *game-info* (the-as basic (car (-> gp-1 info continues)))) + ) + ) + (activate-levels! *level*) + (set! *print-login* #f) + 0 + ) + +;; definition for function play +(defun play ((arg0 symbol) (arg1 symbol)) + (let* ((v1-0 *kernel-boot-message*) + (s5-0 (cond + ((= v1-0 'play) + (if *debug-segment* + 'village1 + 'title + ) + ) + (else + 'demo + ) + ) + ) + ) + (stop 'play) + (set! (-> *level* vis?) arg0) + (set! (-> *level* want-level) #f) + (set! (-> *level* border?) #t) + (set! (-> *setting-control* default border-mode) #t) + (set! (-> *level* play?) #t) + (alloc-levels! *level* #t) + (set! *display-profile* #f) + (set! *cheat-mode* (if *debug-segment* + 'debug + #f + ) + ) + (set! *time-of-day-fast* #f) + (load-commands-set! *level* '()) + (when *time-of-day-proc* + (set! (-> *time-of-day-proc* 0 time-ratio) 300.0) + (set! (-> *time-of-day-proc* 0 hour) 7) + ) + (set-blackout-frames 6) + (when (not *dproc*) + (reset! *load-state*) + (let ((s4-1 (level-get-for-use *level* s5-0 'active))) + (load-state-want-levels s5-0 #f) + (load-state-want-display-level s5-0 'display) + (load-state-want-vis (-> (lookup-level-info s5-0) nickname)) + (while + (and + s4-1 + (or + (= (-> s4-1 status) 'loading) + (= (-> s4-1 status) 'loading-bt) + (= (-> s4-1 status) 'login) + ) + ) + (set-blackout-frames 6) + (load-continue s4-1) + ) + ) + ) + (set! *print-login* #f) + (level-status-set! (level-get *level* s5-0) 'active) + ) + (on #t) + (if arg1 + (initialize! *game-info* 'game (the-as game-save #f) (the-as string #f)) + ) + 0 + ) + +;; definition for function update-sound-banks +(defun update-sound-banks () + (if (nonzero? (rpc-busy? 1)) + (return 0) + ) + (let ((gp-0 #f) + (s5-0 #f) + ) + (dotimes (s4-0 (-> *level* length)) + (let ((v1-5 (-> *level* level s4-0))) + (when (= (-> v1-5 status) 'active) + (let* ((s3-0 (-> v1-5 info sound-banks)) + (t0-0 (the-as symbol (car s3-0))) + ) + (while (not (null? s3-0)) + (cond + ((or (= gp-0 t0-0) (= s5-0 t0-0) (-> *setting-control* current movie)) + ) + ((not gp-0) + (set! gp-0 t0-0) + ) + ((not s5-0) + (set! s5-0 t0-0) + ) + (else + (format + 0 + "ERROR: Soundbanks ~A, ~A and ~A all required~%" + gp-0 + s5-0 + t0-0 + ) + ) + ) + (set! s3-0 (cdr s3-0)) + (set! t0-0 (the-as symbol (car s3-0))) + ) + ) + ) + ) + ) + (when (and gp-0 (!= gp-0 *sound-bank-1*) (!= gp-0 *sound-bank-2*)) + (when (not *sound-bank-1*) + (format 0 "Load soundbank ~A~%" gp-0) + (sound-bank-load (string->sound-name (symbol->string gp-0))) + (set! *sound-bank-1* gp-0) + (return 0) + ) + (when (not *sound-bank-2*) + (format 0 "Load soundbank ~A~%" gp-0) + (sound-bank-load (string->sound-name (symbol->string gp-0))) + (set! *sound-bank-2* gp-0) + (return 0) + ) + (when (!= *sound-bank-1* s5-0) + (format 0 "Unload soundbank ~A~%" *sound-bank-1*) + (sound-bank-unload (string->sound-name (symbol->string *sound-bank-1*))) + (set! *sound-bank-1* #f) + (return 0) + ) + (when (!= *sound-bank-2* s5-0) + (format 0 "Unload soundbank ~A~%" *sound-bank-2*) + (sound-bank-unload (string->sound-name (symbol->string *sound-bank-2*))) + (set! *sound-bank-2* #f) + (return 0) + ) + ) + (when (and s5-0 (!= s5-0 *sound-bank-1*) (!= s5-0 *sound-bank-2*)) + (when (not *sound-bank-1*) + (format 0 "Load soundbank ~A~%" s5-0) + (sound-bank-load (string->sound-name (symbol->string s5-0))) + (set! *sound-bank-1* s5-0) + (return 0) + ) + (when (not *sound-bank-2*) + (format 0 "Load soundbank ~A~%" s5-0) + (sound-bank-load (string->sound-name (symbol->string s5-0))) + (set! *sound-bank-2* s5-0) + (return 0) + ) + (when (!= *sound-bank-1* gp-0) + (format 0 "Unload soundbank ~A~%" *sound-bank-1*) + (sound-bank-unload (string->sound-name (symbol->string *sound-bank-1*))) + (set! *sound-bank-1* #f) + (return 0) + ) + (when (!= *sound-bank-2* gp-0) + (format 0 "Unload soundbank ~A~%" *sound-bank-2*) + (sound-bank-unload (string->sound-name (symbol->string *sound-bank-2*))) + (set! *sound-bank-2* #f) + (return 0) + ) + ) + ) + 0 + ) + +;; definition for method 10 of type load-state +(defmethod update! load-state ((obj load-state)) + (update-sound-banks) + (let ((v1-0 #f)) + (dotimes (s5-0 2) + (let ((s4-0 (-> *level* level s5-0))) + (when (!= (-> s4-0 status) 'inactive) + (let ((a0-6 #f)) + (dotimes (a1-2 2) + (if (= (-> s4-0 name) (-> obj want a1-2 name)) + (set! a0-6 #t) + ) + ) + (when (not a0-6) + (format 0 "Discarding level ~A~%" (-> s4-0 name)) + (level-status-set! s4-0 'inactive) + (set! v1-0 #t) + ) + ) + ) + ) + ) + (let ((s5-1 #f)) + (if + (and + (= (-> *level* level0 status) 'inactive) + (= (-> *level* level1 status) 'inactive) + ) + (set! s5-1 #t) + ) + (if v1-0 + (return 0) + ) + (let ((a0-20 #f) + (v1-5 #f) + ) + (when (-> obj want 0 name) + (set! a0-20 #t) + (dotimes (a1-12 3) + (let ((a2-9 (-> *level* level a1-12))) + (if + (and + (!= (-> a2-9 status) 'inactive) + (= (-> a2-9 name) (-> obj want 0 name)) + ) + (set! a0-20 #f) + ) + ) + ) + ) + (when (-> obj want 1 name) + (set! v1-5 #t) + (dotimes (a1-17 3) + (let ((a2-17 (-> *level* level a1-17))) + (if + (and + (!= (-> a2-17 status) 'inactive) + (= (-> a2-17 name) (-> obj want 1 name)) + ) + (set! v1-5 #f) + ) + ) + ) + ) + (let ((s4-1 -1)) + (cond + ((and a0-20 v1-5) + (set! s4-1 0) + (if (and (-> obj want 1 display?) (not (-> obj want 0 display?))) + (set! s4-1 1) + ) + ) + (a0-20 + (set! s4-1 0) + ) + (v1-5 + (set! s4-1 1) + ) + ) + (when (!= s4-1 -1) + (when (or s5-1 (not (check-busy *load-dgo-rpc*))) + (format 0 "Adding level ~A~%" (-> obj want s4-1 name)) + (let + ((s3-0 (level-get-for-use *level* (-> obj want s4-1 name) 'loaded))) + (when (and s5-1 (-> obj want s4-1 display?)) + (format 0 "Waiting for level to load~%") + (while + (or + (= (-> s3-0 status) 'loading) + (= (-> s3-0 status) 'loading-bt) + (= (-> s3-0 status) 'login) + ) + (load-continue s3-0) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (dotimes (s5-2 2) + (when (-> obj want s5-2 name) + (dotimes (s4-2 3) + (let ((s3-1 (-> *level* level s4-2))) + (when (!= (-> s3-1 status) 'inactive) + (when (= (-> s3-1 name) (-> obj want s5-2 name)) + (when (!= (-> s3-1 display?) (-> obj want s5-2 display?)) + (cond + ((not (-> s3-1 display?)) + (cond + ((or (= (-> s3-1 status) 'loaded) (= (-> s3-1 status) 'active)) + (format + 0 + "Displaying level ~A [~A]~%" + (-> obj want s5-2 name) + (-> obj want s5-2 display?) + ) + (level-get-for-use *level* (-> s3-1 info name) 'active) + (set! (-> s3-1 display?) (-> obj want s5-2 display?)) + ) + (else + (if + (and + (-> s3-1 info wait-for-load) + (!= (-> obj want s5-2 display?) 'display-no-wait) + ) + (send-event *target* 'loading) + ) + (if (= *cheat-mode* 'debug) + (format + *stdcon* + "display on for ~A but level is loading~%" + (-> obj want s5-2 name) + ) + ) + ) + ) + ) + ((not (-> obj want s5-2 display?)) + (set! (-> s3-1 display?) #f) + (format 0 "Turning level ~A off~%" (-> s3-1 name)) + (deactivate s3-1) + ) + (else + (format + 0 + "Setting level ~A display command to ~A~%" + (-> obj want s5-2 name) + (-> obj want s5-2 display?) + ) + (set! (-> s3-1 display?) (-> obj want s5-2 display?)) + ) + ) + ) + (when (!= (-> s3-1 force-all-visible?) (-> obj want s5-2 force-vis?)) + (set! (-> s3-1 force-all-visible?) (-> obj want s5-2 force-vis?)) + (format + 0 + "Setting force-all-visible?[~A] to ~A~%" + (-> obj want s5-2 name) + (-> obj want s5-2 force-vis?) + ) + ) + (when (!= (-> s3-1 force-inside?) (-> obj want s5-2 force-inside?)) + (set! (-> s3-1 force-inside?) (-> obj want s5-2 force-inside?)) + (format + 0 + "Setting force-inside?[~A] to ~A~%" + (-> obj want s5-2 name) + (-> obj want s5-2 force-inside?) + ) + ) + ) + ) + ) + ) + ) + ) + (let ((s5-3 #f)) + (dotimes (v1-121 (-> *level* length)) + (let ((a0-55 (-> *level* level v1-121))) + (when (= (-> a0-55 status) 'active) + (if (nonzero? (-> a0-55 vis-info (-> a0-55 vis-self-index) ramdisk)) + (set! s5-3 (-> a0-55 nickname)) + ) + ) + ) + ) + (when (and (!= s5-3 (-> obj vis-nick)) (-> *level* vis?)) + (when (-> obj vis-nick) + (dotimes (s4-3 (-> *level* length)) + (let ((v1-133 (-> *level* level s4-3))) + (when (= (-> v1-133 status) 'active) + (if + (and + (= (-> v1-133 nickname) (-> obj vis-nick)) + (-> v1-133 inside-boxes?) + ) + (load-vis-info (-> obj vis-nick) s5-3) + ) + ) + ) + ) + ) + ) + ) + 0 + ) + +;; definition for method 16 of type level-group +(defmethod level-update level-group ((obj level-group)) + (camera-pos) + (new 'static 'boxed-array :type symbol :length 0 :allocated-length 2) + (update-per-frame-settings! *setting-control*) + (update *art-control* #t) + (clear-rec *art-control*) + (dotimes (s5-0 2) + (load-continue (-> obj level s5-0)) + ) + (dotimes (s5-1 (-> obj length)) + (let ((s4-0 (-> obj level s5-1))) + (when (= (-> s4-0 status) 'active) + (set! + (-> s4-0 inside-boxes?) + (point-in-boxes? s4-0 (-> *math-camera* trans)) + ) + (set! + (-> s4-0 inside-sphere?) + (>= (-> s4-0 bsp bsphere w) (-> s4-0 level-distance)) + ) + (if (-> s4-0 inside-boxes?) + (set! (-> s4-0 meta-inside?) #t) + ) + ) + ) + ) + (update! *load-state*) + (dotimes (s5-2 (-> obj length)) + (let ((s4-1 (-> obj level s5-2))) + (when (= (-> s4-1 status) 'active) + (if (and (-> s4-1 inside-boxes?) (not (-> s4-1 other inside-boxes?))) + (set! (-> s4-1 other meta-inside?) #f) + ) + (when + (and + (null? (-> obj load-commands)) + (= (-> s4-1 nickname) (-> *load-state* vis-nick)) + (!= (-> s4-1 name) (-> *game-info* current-continue level)) + (-> *level* border?) + ) + (let ((s3-0 (the-as continue-point (car (-> s4-1 info continues))))) + (let* ((s2-0 (target-pos 0)) + (s4-2 (-> s4-1 info continues)) + (s1-0 (the-as continue-point (car s4-2))) + ) + (while (not (null? s4-2)) + (if + (and + (< + (vector-vector-distance s2-0 (-> s1-0 trans)) + (vector-vector-distance s2-0 (-> s3-0 trans)) + ) + (zero? (-> s1-0 flags)) + ) + (set! s3-0 s1-0) + ) + (set! s4-2 (cdr s4-2)) + (set! s1-0 (the-as continue-point (car s4-2))) + ) + ) + (set-continue! *game-info* s3-0) + ) + ) + ) + ) + ) + (dotimes (v1-67 (-> obj length)) + (let ((a0-26 (-> obj level v1-67))) + (when (= (-> a0-26 status) 'active) + (set! (-> a0-26 vis-self-index) 0) + (set! (-> a0-26 vis-adj-index) 7) + (when (= (-> a0-26 other status) 'active) + (dotimes (a1-10 8) + (if + (and + (-> a0-26 vis-info a1-10) + (= (-> a0-26 vis-info a1-10 from-level) (-> a0-26 other load-name)) + ) + (set! (-> a0-26 vis-adj-index) a1-10) + ) + ) + ) + ) + ) + ) + (when *display-level-border* + (dotimes (s5-3 (-> obj length)) + (let ((s4-3 (-> obj level s5-3))) + (when (= (-> s4-3 status) 'active) + (let ((s3-1 (-> s4-3 bsp current-bsp-back-flags))) + (dotimes (s2-1 6) + (when (and (logtest? s3-1 3) (-> s4-3 vis-info (+ s2-1 1))) + (let + ((v1-88 (lookup-level-info (-> s4-3 vis-info (+ s2-1 1) from-level)))) + (format + *stdcon* + " ~A -> ~A: load: ~A display: ~A~%" + (-> s4-3 name) + (-> v1-88 name) + (logtest? s3-1 1) + (logtest? s3-1 2) + ) + ) + ) + (set! s3-1 (shr s3-1 2)) + ) + ) + ) + ) + ) + ) + (dotimes (s5-4 (-> obj length)) + (let ((s4-4 (-> obj level s5-4))) + (when (= (-> s4-4 status) 'active) + (when + (and + (= (-> s4-4 nickname) (-> *load-state* vis-nick)) + (not (-> s4-4 inside-boxes?)) + ) + (if (and (= *cheat-mode* 'debug) (-> s4-4 other inside-boxes?)) + (format + *stdcon* + "~3LForcing outside of ~A [bad split boxes]~%~0L" + (-> s4-4 other name) + ) + ) + (set! (-> s4-4 other inside-boxes?) #f) + ) + ) + ) + ) + (cond + ((not (or (-> obj level0 inside-boxes?) (-> obj level1 inside-boxes?))) + (when (or (-> obj level0 vis-info 0) (-> obj level1 vis-info 0)) + (if (= *cheat-mode* 'debug) + (format *stdcon* "~3Loutside of bsp~%~0L") + ) + ) + ) + (else + (dotimes (v1-125 (-> obj length)) + (let ((a0-44 (-> obj level v1-125))) + (when (= (-> a0-44 status) 'active) + (dotimes (a1-17 8) + (let ((a2-18 (-> a0-44 vis-info a1-17))) + (when a2-18 + (set! + (-> a2-18 flags) + (logand (the-as uint #xffffffff7fffffff) (-> a2-18 flags)) + ) + (cond + ((= a1-17 (-> a0-44 vis-self-index)) + (set! (-> a2-18 from-bsp) (-> a0-44 bsp)) + ) + ((= a1-17 (-> a0-44 vis-adj-index)) + (set! (-> a2-18 from-bsp) (-> a0-44 other bsp)) + ) + (else + (set! (-> a2-18 from-bsp) #f) + ) + ) + ) + ) + ) + (cond + ((= (-> a0-44 display?) 'display-self) + (let ((a0-46 (-> a0-44 vis-info (-> a0-44 vis-self-index)))) + (if a0-46 + (set! + (-> a0-46 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-46 flags))) + ) + ) + ) + ) + ((and (-> a0-44 inside-boxes?) (not (-> a0-44 other inside-boxes?))) + (let ((a0-48 (-> a0-44 vis-info (-> a0-44 vis-self-index)))) + (if a0-48 + (set! + (-> a0-48 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-48 flags))) + ) + ) + ) + ) + ((-> a0-44 other inside-boxes?) + (let ((a0-50 (-> a0-44 vis-info (-> a0-44 vis-adj-index)))) + (if a0-50 + (set! + (-> a0-50 flags) + (the-as uint (logior (shl #x8000 16) (-> a0-50 flags))) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + (when + (or + *display-level-border* + *display-texture-download* + *display-split-box-info* + ) + (when *display-level-border* + (format + *stdcon* + " want: ~A ~A/~A ~A ~A/~A~%" + (-> *load-state* want 0 name) + (-> *load-state* want 0 display?) + (-> *load-state* want 0 force-vis?) + (-> *load-state* want 1 name) + (-> *load-state* want 1 display?) + (-> *load-state* want 1 force-vis?) + ) + (let ((t9-16 format) + (a0-53 *stdcon*) + (a1-49 " nick ~A cur ~S cont ~A~%~%") + (a2-24 (-> *load-state* vis-nick)) + (v1-142 (and *target* (-> *target* current-level name))) + ) + (t9-16 a0-53 a1-49 a2-24 (if v1-142 + (-> + (the-as + (pointer uint32) + (+ #xff38 (the-as int v1-142)) + ) + ) + ) + (-> *game-info* current-continue name) + ) + ) + ) + (dotimes (s5-5 (-> obj length)) + (let ((s4-5 (-> obj level s5-5))) + (when (= (-> s4-5 status) 'active) + (format + *stdcon* + "~A: ~S ~A~%" + (-> s4-5 name) + (if (point-in-boxes? s4-5 (-> *math-camera* trans)) + "inside" + ) + (-> s4-5 display?) + ) + (when *display-texture-download* + (format *stdcon* " tfrag: ~8,,0m " (-> s4-5 closest-object 0)) + (format *stdcon* " shrub: ~8,,0m " (-> s4-5 closest-object 2)) + (format + *stdcon* + " alpha: ~8,,0m #x~8X~%" + (-> s4-5 closest-object 3) + (-> s4-5 texture-mask 8) + ) + (format *stdcon* " tie: ~8,,0m " (-> s4-5 closest-object 5)) + (format *stdcon* " fg-tf: ~8,,0m " (-> s4-5 closest-object 6)) + (format + *stdcon* + " fg-pr: ~8,,0m #x~8X~%" + (-> s4-5 closest-object 7) + (-> s4-5 texture-mask 7) + ) + (format + *stdcon* + " tf: ~8D pr: ~8D sh: ~8D al: ~8D wa: ~8D~%~1K" + (-> s4-5 upload-size 0) + (-> s4-5 upload-size 1) + (-> s4-5 upload-size 2) + (-> s4-5 upload-size 3) + (-> s4-5 upload-size 4) + ) + ) + (if *display-split-box-info* + (debug-print-splitbox s4-5 (-> *math-camera* trans) *stdcon*) + ) + ) + ) + ) + ) + 0 + ) + +;; definition (debug) for function show-level +(defun-debug show-level ((arg0 symbol)) + (set! (-> *setting-control* default border-mode) #t) + (load-state-want-levels (-> (level-get-target-inside *level*) name) arg0) + (load-state-want-display-level arg0 'display) + 0 + ) + +;; failed to figure out what this is: +(when (zero? (-> *level* level0 art-group)) + (let ((gp-0 *level*)) + (set! (-> gp-0 vis?) #f) + (set! (-> gp-0 loading-level) (-> gp-0 level-default)) + (set! + (-> gp-0 level0 art-group) + (new 'global 'load-dir-art-group 50 (-> gp-0 level0)) + ) + (set! + (-> gp-0 level0 foreground-draw-engine 0) + (new 'global 'engine 'draw 280) + ) + (set! + (-> gp-0 level0 foreground-draw-engine 1) + (new 'global 'engine 'draw 280) + ) + (set! + (-> gp-0 level0 foreground-draw-engine 2) + (new 'global 'engine 'draw 16) + ) + (set! + (-> gp-0 level1 art-group) + (new 'global 'load-dir-art-group 50 (-> gp-0 level1)) + ) + (set! + (-> gp-0 level1 foreground-draw-engine 0) + (new 'global 'engine 'draw 280) + ) + (set! + (-> gp-0 level1 foreground-draw-engine 1) + (new 'global 'engine 'draw 280) + ) + (set! + (-> gp-0 level1 foreground-draw-engine 2) + (new 'global 'engine 'draw 16) + ) + (set! + (-> gp-0 level-default art-group) + (new 'global 'load-dir-art-group 50 (-> gp-0 level1)) + ) + (set! + (-> gp-0 level-default foreground-draw-engine 0) + (new 'global 'engine 'draw 280) + ) + (set! + (-> gp-0 level-default foreground-draw-engine 1) + (new 'global 'engine 'draw 10) + ) + (set! (-> gp-0 level0 other) (-> gp-0 level1)) + (set! (-> gp-0 level1 other) (-> gp-0 level0)) + (set! (-> gp-0 level-default other) #f) + (dotimes (s5-0 2) + (let ((s4-0 (-> gp-0 level s5-0))) + (set! (-> s4-0 vis-bits) (malloc 'global 2048)) + (vis-clear s4-0) + ) + ) + (dotimes (v1-36 3) + (let ((a0-50 (-> gp-0 level v1-36))) + (set! (-> a0-50 linking) #f) + (dotimes (a1-46 3) + (set! (-> a0-50 foreground-sink-group a1-46 level) a0-50) + ) + ) + ) + ) + ) + + + + diff --git a/test/offline/config.jsonc b/test/offline/config.jsonc index e13261f105..eb8c3923e7 100644 --- a/test/offline/config.jsonc +++ b/test/offline/config.jsonc @@ -112,6 +112,9 @@ // decompiler BUG "level-hint-task-process", + "(method 26 level)", + "(method 9 level)", + "(method 10 level)", // asm // cam-states "cam-los-collide", // vector-dot involving the stack