From 3ed009924fb648497e410b274565622beff67559 Mon Sep 17 00:00:00 2001 From: ManDude <7569514+ManDude@users.noreply.github.com> Date: Sat, 30 Apr 2022 19:48:24 +0100 Subject: [PATCH] collision renderer v2 (#1344) * collision renderer v2 * update code * update again! * Update collision.vert * Update collide-target-h.gc * fix code * bleh * gah * minor fixes * fix stupidity * skip filters * fix subtitle that i missed * remove assert that doesn't work! * Update hint-control.gc --- common/custom_data/Tfrag3Data.h | 6 +- common/goos/ParseHelpers.cpp | 11 +- decompiler/config/all-types.gc | 12 +- .../level_extractor/extract_collide_frags.cpp | 39 +- game/assets/jak1/subtitle/game_subtitle_en.gs | 4 + game/graphics/gfx.cpp | 72 ++ game/graphics/gfx.h | 19 + .../graphics/opengl_renderer/BucketRenderer.h | 6 +- .../opengl_renderer/CollideMeshRenderer.cpp | 56 +- .../opengl_renderer/OpenGLRenderer.cpp | 3 +- .../opengl_renderer/shaders/collision.frag | 1 + .../opengl_renderer/shaders/collision.vert | 107 +- game/kernel/kmachine.cpp | 30 +- game/kernel/kmemcard.cpp | 2 +- .../engine/collide/collide-reaction-target.gc | 16 +- goal_src/engine/collide/collide-target-h.gc | 2 +- goal_src/engine/debug/default-menu.gc | 103 +- goal_src/engine/entity/entity.gc | 14 +- goal_src/engine/game/task/hint-control.gc | 953 ++++++++---------- goal_src/engine/gfx/hw/vu1-user-h.gc | 4 +- goal_src/engine/gfx/tfrag/tfrag-methods.gc | 32 +- goal_src/engine/target/logic-target.gc | 10 +- goal_src/engine/target/target-h.gc | 50 +- goal_src/engine/target/target-handler.gc | 20 +- goal_src/engine/target/target.gc | 46 +- goal_src/engine/target/target2.gc | 18 +- goal_src/goal-lib.gc | 20 + goal_src/kernel-defs.gc | 14 +- goal_src/levels/flut_common/target-flut.gc | 8 +- goal_src/levels/jungle/fisher.gc | 2 +- .../racer_common/collide-reaction-racer.gc | 2 +- goal_src/levels/racer_common/racer-states.gc | 4 +- goal_src/levels/racer_common/target-racer.gc | 6 +- goal_src/levels/snow/target-ice.gc | 4 +- goal_src/levels/snow/target-snowball.gc | 2 +- goal_src/levels/sunken/target-tube.gc | 8 +- goal_src/pc/pckernel.gc | 32 +- .../engine/collide/collide-target-h_REF.gc | 2 +- .../reference/engine/gfx/hw/vu1-user-h_REF.gc | 2 +- .../engine/gfx/tfrag/tfrag-methods_REF.gc | 32 +- .../engine/target/logic-target_REF.gc | 10 +- .../engine/target/target-death_REF.gc | 2 +- .../reference/engine/target/target-h_REF.gc | 2 +- .../engine/target/target-handler_REF.gc | 8 +- .../reference/engine/target/target2_REF.gc | 18 +- .../reference/engine/target/target_REF.gc | 44 +- .../levels/flut_common/target-flut_REF.gc | 8 +- .../reference/levels/jungle/fisher_REF.gc | 2 +- .../collide-reaction-racer_REF.gc | 2 +- .../levels/racer_common/racer-states_REF.gc | 4 +- .../levels/racer_common/target-racer_REF.gc | 6 +- .../reference/levels/snow/target-ice_REF.gc | 4 +- .../levels/snow/target-snowball_REF.gc | 2 +- .../levels/sunken/target-tube_REF.gc | 8 +- 54 files changed, 1094 insertions(+), 800 deletions(-) diff --git a/common/custom_data/Tfrag3Data.h b/common/custom_data/Tfrag3Data.h index b40530e482..d0b953455f 100644 --- a/common/custom_data/Tfrag3Data.h +++ b/common/custom_data/Tfrag3Data.h @@ -50,7 +50,7 @@ enum MemoryUsageCategory { NUM_CATEGORIES }; -constexpr int TFRAG3_VERSION = 16; +constexpr int TFRAG3_VERSION = 17; // These vertices should be uploaded to the GPU at load time and don't change struct PreloadedVertex { @@ -315,8 +315,10 @@ struct CollisionMesh { u32 flags; s16 nx, ny, nz; u16 pad; + u32 pat; + u32 pad2; }; - static_assert(sizeof(Vertex) == 24); + static_assert(sizeof(Vertex) == 32); std::vector vertices; void serialize(Serializer& ser); }; diff --git a/common/goos/ParseHelpers.cpp b/common/goos/ParseHelpers.cpp index 9c2f794527..cf69b4385d 100644 --- a/common/goos/ParseHelpers.cpp +++ b/common/goos/ParseHelpers.cpp @@ -1,4 +1,5 @@ #include "ParseHelpers.h" +#include "third-party/fmt/core.h" namespace goos { @@ -44,16 +45,16 @@ bool va_check( std::string* err_string) { ASSERT(args.rest.empty()); if (unnamed.size() != args.unnamed.size()) { - *err_string = "Got " + std::to_string(args.unnamed.size()) + " arguments, but expected " + - std::to_string(unnamed.size()); + *err_string = fmt::format("Got {} arguments, but expected {}", + std::to_string(args.unnamed.size()), std::to_string(unnamed.size())); return false; } for (size_t i = 0; i < unnamed.size(); i++) { if (unnamed[i].has_value() && unnamed[i] != args.unnamed[i].type) { - *err_string = "Argument " + std::to_string(i) + " has type " + - object_type_to_string(args.unnamed[i].type) + " but " + - object_type_to_string(unnamed[i].value()) + " was expected"; + *err_string = fmt::format("Argument {} has type {} but {} was expected\nArgument is: {}", i, + object_type_to_string(args.unnamed[i].type), + object_type_to_string(unnamed[i].value()), args.unnamed[i].print()); return false; } } diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index 7c6bf4547f..f366a19e63 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -3748,7 +3748,7 @@ (shrub-near 12) (billboard 13) (trans-shrubbery 14) - (trans-frag 15) + (trans-tfrag 15) (sprite 16) (shadow 17) (depth-cue 18) @@ -11861,7 +11861,7 @@ (unknown-vector120 vector :inline :offset 18928) ;; from target::(code target-running-attack) (unknown-float150 float :offset 18944) ;; from target::(code target-wheel-flip) (unknown-vector121 vector :inline :offset 18960) ;; from target collide response - (unknown-int60 uint32 :offset 18976) ;; from logic-target::print-target-stats + (wall-pat pat-surface :offset 18976) ;; pat information for wall-check collision (unknown-soundid00 sound-id :offset 18980) ;; from powerups::target-powerup-process (unknown-float141 float :offset 18984) ;; from powerups::target-powerup-process ) @@ -11879,7 +11879,7 @@ ;; - Types (deftype touching-prim (structure) - ((cprim collide-shape-prim :offset-assert 0) ;; a big guess, there's a few that meet this name + ((cprim collide-shape-prim :offset-assert 0) ;; a big guess, there's a few that meet this name (has-tri? symbol :offset-assert 4) (tri collide-tri-result :inline :offset-assert 16) ) @@ -12441,7 +12441,7 @@ target-tube (target-tube-death symbol) (target-tube-jump float float) - (target-tube-hit handle attack-info) + (target-tube-hit symbol attack-info) target-snowball (target-death symbol) (target-clone-anim handle) @@ -20332,7 +20332,7 @@ (define-extern turn-around? (function symbol :behavior target)) (define-extern target-move-dist (function time-frame float :behavior target)) (define-extern target-compute-edge-rider (function none :behavior target)) -(define-extern target-post (function none)) +(define-extern target-post (function none :behavior target)) (define-extern target-swim-post (function none :behavior target)) (define-extern target-no-stick-post (function none :behavior target)) (define-extern target-no-move-post (function none :behavior target)) @@ -20418,7 +20418,7 @@ (define-extern target-bonk-event-handler (function process int symbol event-message-block object :behavior target)) (define-extern target-standard-event-handler (function process int symbol event-message-block object :behavior target)) (define-extern target-send-attack (function process uint uint int int symbol :behavior target)) ;; i suspect the uints are actually structures/basics -(define-extern target-attacked (function symbol attack-info process process (state handle attack-info target) object :behavior target)) ;; unconfirmed, target-tube::(event target-tube-start) +(define-extern target-attacked (function symbol attack-info process process (state symbol attack-info target) object :behavior target)) (define-extern target-apply-tongue (function vector symbol :behavior target)) (define-extern get-intersect-point (function vector touching-prims-entry control-info process vector)) (define-extern target-powerup-effect (function symbol none :behavior target)) diff --git a/decompiler/level_extractor/extract_collide_frags.cpp b/decompiler/level_extractor/extract_collide_frags.cpp index 17bd995dc5..83def6fd4e 100644 --- a/decompiler/level_extractor/extract_collide_frags.cpp +++ b/decompiler/level_extractor/extract_collide_frags.cpp @@ -9,8 +9,15 @@ struct CollideListItem { const level_tools::InstanceTie* inst = nullptr; struct { + struct UnpackedFace { + UnpackedFace(u8 a, u8 b, u8 c) : verts(a, b, c) {} + + math::Vector verts; + u32 pat; + }; + std::vector vu0_buffer; - std::vector> faces; + std::vector faces; } unpacked; }; @@ -68,6 +75,14 @@ s8 deref_s8(const Ref& ref, int byte) { return vals[byte & 3]; } +u8 deref_u8(const Ref& ref, int byte) { + u32 u32_offset = byte / 4; + u32 u32_val = level_tools::deref_u32(ref, u32_offset); + u8 vals[4]; + memcpy(vals, &u32_val, 4); + return vals[byte & 3]; +} + void unpack_part1_collide_list_item(CollideListItem& item) { int in_idx = 0; int out_idx = 0; @@ -184,6 +199,17 @@ void find_faces(CollideListItem& item) { } } +void extract_pats(CollideListItem& item) { + u32 byte_offset = 16 * item.mesh->vertex_data_qwc + item.mesh->strip_data_len; + for (auto& f : item.unpacked.faces) { + auto pat_idx = deref_u8(item.mesh->packed_data, byte_offset++); + + u32 pat = level_tools::deref_u32(item.mesh->pat_array, pat_idx); + // fmt::print("pat @ {} is 0x{:x}\n", pat_idx, pat); + f.pat = pat; + } +} + std::string debug_dump_to_obj(const std::vector& list) { std::vector verts; std::vector> faces; @@ -191,7 +217,7 @@ std::string debug_dump_to_obj(const std::vector& list) { for (auto& item : list) { u32 f_off = verts.size() + 1; for (auto& f : item.unpacked.faces) { - faces.emplace_back(f[0] + f_off, f[1] + f_off, f[2] + f_off); + faces.emplace_back(f.verts[0] + f_off, f.verts[1] + f_off, f.verts[2] + f_off); } for (u32 t = 0; t < item.unpacked.vu0_buffer.size(); t++) { verts.push_back(item.unpacked.vu0_buffer[t] / 65536); @@ -254,6 +280,7 @@ void extract_collide_frags(const level_tools::DrawableTreeCollideFragment* tree, unpack_part1_collide_list_item(frag); unpack_part2_collide_list_item(frag); find_faces(frag); + extract_pats(frag); total_faces += frag.unpacked.faces.size(); } @@ -266,15 +293,17 @@ void extract_collide_frags(const level_tools::DrawableTreeCollideFragment* tree, for (auto& item : all_frags) { for (auto& f : item.unpacked.faces) { - math::Vector4f verts[3] = {item.unpacked.vu0_buffer[f[0]], item.unpacked.vu0_buffer[f[1]], - item.unpacked.vu0_buffer[f[2]]}; + math::Vector4f verts[3] = {item.unpacked.vu0_buffer[f.verts[0]], + item.unpacked.vu0_buffer[f.verts[1]], + item.unpacked.vu0_buffer[f.verts[2]]}; tfrag3::CollisionMesh::Vertex out_verts[3]; set_vertices_for_tri(out_verts, verts); for (int i = 0; i < 3; i++) { + out_verts[i].pat = f.pat; out.collision.vertices.push_back(out_verts[i]); } } } } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/game/assets/jak1/subtitle/game_subtitle_en.gs b/game/assets/jak1/subtitle/game_subtitle_en.gs index fdd6281b5a..98e5515d42 100644 --- a/game/assets/jak1/subtitle/game_subtitle_en.gs +++ b/game/assets/jak1/subtitle/game_subtitle_en.gs @@ -395,6 +395,10 @@ ("sksp0064" :hint #x245 (0 "DAXTER" "WATCH YOUR BACK! YOU REMEMBER WHAT HAPPENED THE LAST TIME WE WERE HERE.")) ("sksp0067" :hint #x249 (0 "DAXTER" "DON'T FALL INTO THE MIST BELOW US! 'CAUSE I DON'T THINK WE'LL MAKE IT BACK.")) ("sksp0059" :hint #x26e (0 "DAXTER" "THIS PLACE GIVES ME THE WILLIES! LET'S KEEP YOU OUT OF THE OOZE, OKAY?")) +("sksp0060" :hint #x26f + (0 "DAXTER" "(WHIMPERS) THIS PLACE GIVES ME THE CREEPS! AND TRUST ME, IT'S A WHOLE NEW EXPERIENCE") + (337 "DAXTER" "WHEN YOU'RE COVERED IN FUZZ!") + ) ("sksp0056" :hint #x27b (0 "DAXTER" "HEY! I SEE THE SCULPTOR'S MUSE!")) ("sksp0062" :hint #x27e (0 "DAXTER" "LET'S PLOW INTO THOSE BALLOON LURKERS AND SHRED 'EM!")) ("sksp0063" :hint #x27f diff --git a/game/graphics/gfx.cpp b/game/graphics/gfx.cpp index 03f08aa6e0..6c7495c3bf 100644 --- a/game/graphics/gfx.cpp +++ b/game/graphics/gfx.cpp @@ -290,4 +290,76 @@ void SetLod(RendererTreeType tree, int lod) { } } +bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) { + int arr_idx = mask_id / 32; + int arr_ofs = mask_id % 32; + + switch (mode) { + case GfxGlobalSettings::CollisionRendererMode::Mode: + return (g_global_settings.collision_mode_mask[arr_idx] >> arr_ofs) & 1; + case GfxGlobalSettings::CollisionRendererMode::Event: + return (g_global_settings.collision_event_mask[arr_idx] >> arr_ofs) & 1; + case GfxGlobalSettings::CollisionRendererMode::Material: + return (g_global_settings.collision_material_mask[arr_idx] >> arr_ofs) & 1; + case GfxGlobalSettings::CollisionRendererMode::Skip: + ASSERT(arr_idx == 0); + return (g_global_settings.collision_skip_mask >> arr_ofs) & 1; + default: + lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, mode, mask_id); + return false; + } +} + +void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) { + int arr_idx = mask_id / 32; + int arr_ofs = mask_id % 32; + + switch (mode) { + case GfxGlobalSettings::CollisionRendererMode::Mode: + g_global_settings.collision_mode_mask[arr_idx] |= 1 << arr_ofs; + break; + case GfxGlobalSettings::CollisionRendererMode::Event: + g_global_settings.collision_event_mask[arr_idx] |= 1 << arr_ofs; + break; + case GfxGlobalSettings::CollisionRendererMode::Material: + g_global_settings.collision_material_mask[arr_idx] |= 1 << arr_ofs; + break; + case GfxGlobalSettings::CollisionRendererMode::Skip: + ASSERT(arr_idx == 0); + g_global_settings.collision_skip_mask |= 1 << arr_ofs; + break; + default: + lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, mode, mask_id); + break; + } +} + +void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id) { + int arr_idx = mask_id / 32; + int arr_ofs = mask_id % 32; + + switch (mode) { + case GfxGlobalSettings::CollisionRendererMode::Mode: + g_global_settings.collision_mode_mask[arr_idx] &= ~(1 << arr_ofs); + break; + case GfxGlobalSettings::CollisionRendererMode::Event: + g_global_settings.collision_event_mask[arr_idx] &= ~(1 << arr_ofs); + break; + case GfxGlobalSettings::CollisionRendererMode::Material: + g_global_settings.collision_material_mask[arr_idx] &= ~(1 << arr_ofs); + break; + case GfxGlobalSettings::CollisionRendererMode::Skip: + ASSERT(arr_idx == 0); + g_global_settings.collision_skip_mask &= ~(1 << arr_ofs); + break; + default: + lg::error("{} invalid params {} {}", __PRETTY_FUNCTION__, mode, mask_id); + break; + } +} + +void CollisionRendererSetMode(GfxGlobalSettings::CollisionRendererMode mode) { + g_global_settings.collision_mode = mode; +} + } // namespace Gfx diff --git a/game/graphics/gfx.h b/game/graphics/gfx.h index ff6985792e..7b8028337b 100644 --- a/game/graphics/gfx.h +++ b/game/graphics/gfx.h @@ -7,6 +7,7 @@ #include #include +#include #include "common/common_types.h" #include "game/kernel/kboot.h" @@ -65,6 +66,9 @@ struct GfxSettings { }; // runtime settings +static constexpr int PAT_MOD_COUNT = 3; +static constexpr int PAT_EVT_COUNT = 7; +static constexpr int PAT_MAT_COUNT = 23; struct GfxGlobalSettings { // note: this is actually the size of the display that ISN'T letterboxed // the excess space is what will be letterboxed away. @@ -77,6 +81,17 @@ struct GfxGlobalSettings { // lod settings, used by bucket renderers int lod_tfrag = 0; int lod_tie = 0; + + // collision renderer settings + bool collision_enable = false; + bool collision_wireframe = true; + + // matching enum in kernel-defs.gc !! + enum CollisionRendererMode { None, Mode, Event, Material, Skip } collision_mode = Mode; + std::array collision_mode_mask = {UINT32_MAX}; + std::array collision_event_mask = {UINT32_MAX}; + std::array collision_material_mask = {UINT32_MAX}; + u32 collision_skip_mask = UINT32_MAX; }; namespace Gfx { @@ -119,5 +134,9 @@ int PadAnalogValue(Pad::Analog analog, int port); // matching enum in kernel-defs.gc !! enum class RendererTreeType { NONE = 0, TFRAG3 = 1, TIE3 = 2, INVALID }; void SetLod(RendererTreeType tree, int lod); +bool CollisionRendererGetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); +void CollisionRendererSetMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); +void CollisionRendererClearMask(GfxGlobalSettings::CollisionRendererMode mode, int mask_id); +void CollisionRendererSetMode(GfxGlobalSettings::CollisionRendererMode mode); } // namespace Gfx diff --git a/game/graphics/opengl_renderer/BucketRenderer.h b/game/graphics/opengl_renderer/BucketRenderer.h index e2c1cc4129..4d4feed35b 100644 --- a/game/graphics/opengl_renderer/BucketRenderer.h +++ b/game/graphics/opengl_renderer/BucketRenderer.h @@ -41,8 +41,8 @@ struct SharedRenderState { bool use_direct2 = true; math::Vector fog_color; float fog_intensity = 1.f; - bool no_multidraw = false; - bool render_collision_mesh = false; + bool no_multidraw = true; + bool render_collision_mesh = true; void reset(); bool has_pc_data = false; @@ -114,4 +114,4 @@ class SkipRenderer : public BucketRenderer { void render(DmaFollower& dma, SharedRenderState* render_state, ScopedProfilerNode& prof) override; bool empty() const override { return true; } void draw_debug_window() override {} -}; \ No newline at end of file +}; diff --git a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp index ac3b5fcfc6..20262c9430 100644 --- a/game/graphics/opengl_renderer/CollideMeshRenderer.cpp +++ b/game/graphics/opengl_renderer/CollideMeshRenderer.cpp @@ -30,23 +30,17 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler for (int i = 0; i < 4; i++) { settings.planes[i] = render_state->camera_planes[i]; } - glUniformMatrix4fv( - glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "camera"), 1, GL_FALSE, - settings.math_camera.data()); - glUniform4f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "hvdf_offset"), - settings.hvdf_offset[0], settings.hvdf_offset[1], settings.hvdf_offset[2], - settings.hvdf_offset[3]); + auto shader = render_state->shaders[ShaderId::COLLISION].id(); + glUniformMatrix4fv(glGetUniformLocation(shader, "camera"), 1, GL_FALSE, + settings.math_camera.data()); + glUniform4f(glGetUniformLocation(shader, "hvdf_offset"), settings.hvdf_offset[0], + settings.hvdf_offset[1], settings.hvdf_offset[2], settings.hvdf_offset[3]); const auto& trans = render_state->camera_pos; - glUniform4f( - glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "camera_position"), - trans[0], trans[1], trans[2], trans[3]); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_constant"), - settings.fog.x()); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_min"), - settings.fog.y()); - glUniform1f(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "fog_max"), - settings.fog.z()); - glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 0); + glUniform4f(glGetUniformLocation(shader, "camera_position"), trans[0], trans[1], trans[2], + trans[3]); + glUniform1f(glGetUniformLocation(shader, "fog_constant"), settings.fog.x()); + glUniform1f(glGetUniformLocation(shader, "fog_min"), settings.fog.y()); + glUniform1f(glGetUniformLocation(shader, "fog_max"), settings.fog.z()); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_GEQUAL); glEnable(GL_BLEND); @@ -58,6 +52,7 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); glEnableVertexAttribArray(2); + glEnableVertexAttribArray(3); glVertexAttribPointer(0, // location 0 in the shader 3, // 3 values per vert GL_FLOAT, // floats @@ -78,20 +73,39 @@ void CollideMeshRenderer::render(SharedRenderState* render_state, ScopedProfiler sizeof(tfrag3::CollisionMesh::Vertex), // stride (void*)offsetof(tfrag3::CollisionMesh::Vertex, nx) // offset (0) ); - glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 0); + glVertexAttribIPointer(3, // location 3 in the shader + 1, // 3 values per vert + GL_UNSIGNED_INT, // u32 + sizeof(tfrag3::CollisionMesh::Vertex), // stride + (void*)offsetof(tfrag3::CollisionMesh::Vertex, pat) // offset (0) + ); + glUniform1i(glGetUniformLocation(shader, "wireframe"), 0); + glUniform1uiv(glGetUniformLocation(shader, "collision_mode_mask"), + Gfx::g_global_settings.collision_mode_mask.size(), + Gfx::g_global_settings.collision_mode_mask.data()); + glUniform1uiv(glGetUniformLocation(shader, "collision_event_mask"), + Gfx::g_global_settings.collision_event_mask.size(), + Gfx::g_global_settings.collision_event_mask.data()); + glUniform1uiv(glGetUniformLocation(shader, "collision_material_mask"), + Gfx::g_global_settings.collision_material_mask.size(), + Gfx::g_global_settings.collision_material_mask.data()); + glUniform1ui(glGetUniformLocation(shader, "collision_skip_mask"), + Gfx::g_global_settings.collision_skip_mask); + glUniform1i(glGetUniformLocation(shader, "mode"), Gfx::g_global_settings.collision_mode); glDrawArrays(GL_TRIANGLES, 0, lev->level->collision.vertices.size()); - bool kDrawWireframe = false; - if (kDrawWireframe) { - glUniform1i(glGetUniformLocation(render_state->shaders[ShaderId::COLLISION].id(), "mode"), 1); + if (Gfx::g_global_settings.collision_wireframe) { + glUniform1i(glGetUniformLocation(shader, "wireframe"), 1); glDisable(GL_BLEND); + glDepthMask(GL_FALSE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawArrays(GL_TRIANGLES, 0, lev->level->collision.vertices.size()); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable(GL_BLEND); + glDepthMask(GL_TRUE); } prof.add_draw_call(); prof.add_tri(lev->level->collision.vertices.size() / 3); } -} \ No newline at end of file +} diff --git a/game/graphics/opengl_renderer/OpenGLRenderer.cpp b/game/graphics/opengl_renderer/OpenGLRenderer.cpp index 3aeec4104f..de43f9203d 100644 --- a/game/graphics/opengl_renderer/OpenGLRenderer.cpp +++ b/game/graphics/opengl_renderer/OpenGLRenderer.cpp @@ -458,7 +458,8 @@ void OpenGLRenderer::dispatch_buckets(DmaFollower dma, ScopedProfilerNode& prof) m_category_times[(int)m_bucket_categories[bucket_id]] += bucket_prof.get_elapsed_time(); // hack to draw the collision mesh in the middle the drawing - if (bucket_id == (int)BucketId::ALPHA_TEX_LEVEL0 - 1 && m_render_state.render_collision_mesh) { + if (bucket_id == (int)BucketId::ALPHA_TEX_LEVEL0 - 1 && m_render_state.render_collision_mesh && + Gfx::g_global_settings.collision_enable) { auto p = prof.make_scoped_child("collision-draw"); m_collide_renderer.render(&m_render_state, p); } diff --git a/game/graphics/opengl_renderer/shaders/collision.frag b/game/graphics/opengl_renderer/shaders/collision.frag index 635a50c276..4d83e7f1da 100644 --- a/game/graphics/opengl_renderer/shaders/collision.frag +++ b/game/graphics/opengl_renderer/shaders/collision.frag @@ -5,5 +5,6 @@ out vec4 color; in vec4 fragment_color; void main() { + if (fragment_color.a <= 0) discard; color = fragment_color; } diff --git a/game/graphics/opengl_renderer/shaders/collision.vert b/game/graphics/opengl_renderer/shaders/collision.vert index 701697b691..d774c5e797 100644 --- a/game/graphics/opengl_renderer/shaders/collision.vert +++ b/game/graphics/opengl_renderer/shaders/collision.vert @@ -3,6 +3,7 @@ layout (location = 0) in vec3 position_in; layout (location = 1) in uint flags; layout (location = 2) in vec3 normal_in; +layout (location = 3) in uint pat; uniform vec4 hvdf_offset; uniform mat4 camera; @@ -10,10 +11,31 @@ uniform vec4 camera_position; uniform float fog_constant; uniform float fog_min; uniform float fog_max; +uniform int wireframe; uniform int mode; out vec4 fragment_color; +const int PAT_MOD_COUNT = 3; +const int PAT_EVT_COUNT = 7; +const int PAT_MAT_COUNT = 23; +uniform uint collision_mode_mask[(PAT_MOD_COUNT + 31) / 32]; +uniform uint collision_event_mask[(PAT_EVT_COUNT + 31) / 32]; +uniform uint collision_material_mask[(PAT_MAT_COUNT + 31) / 32]; +uniform uint collision_skip_mask; + +const int MODE_NONE = 0; +const int MODE_MODE = 1; +const int MODE_EVENT = 2; +const int MODE_MATERIAL = 3; + +uint pat_get_mode(uint p) { return (p >> 3) & 0x7; } +uint pat_get_material(uint p) { return (p >> 6) & 0x3f; } +uint pat_get_event(uint p) { return (p >> 14) & 0x3f; } + +bool logtest(uint a, uint b) { return (a & b) != 0; } +bool logtesta(uint a, uint b) { return (a & b) == b; } + void main() { // Step 3, the camera transform vec4 transformed = -camera[3].xyzw; @@ -30,9 +52,6 @@ void main() { // offset transformed.xyz += hvdf_offset.xyz; - // ftoi4 - //transformed.xyzw *= 16; - // correct xy offset transformed.xy -= (2048.); @@ -51,17 +70,81 @@ void main() { // scissoring area adjust gl_Position.y *= 512.0/448.0; - vec3 to_cam = camera_position.xyz - position_in; - float dist_from_cam = length(to_cam); - vec3 to_cam_n = to_cam / dist_from_cam; - float cam_dot = abs(dot(to_cam_n, normal_in)); + // wireframe check + if (wireframe == 0) { + // lighting check + vec3 to_cam = camera_position.xyz - position_in; + float dist_from_cam = length(to_cam); + vec3 to_cam_n = to_cam / dist_from_cam; + float cam_dot = abs(dot(to_cam_n, normal_in)); - // color - if (mode == 0) { - fragment_color = vec4((normal_in + 1)*.5, 1); + // base colors + fragment_color = vec4(0.5, 0.6, 0.6, 1); fragment_color.xyz *= (pow(cam_dot, 3) + 0.3); + + // pat checks + uint pMode = pat_get_mode(pat); + uint pMat = pat_get_material(pat); + uint pEvent = pat_get_event(pat); + if (logtest(collision_mode_mask[pMode/32], 1 << (pMode & 0x1f)) && + logtest(collision_material_mask[pMat/32], 1 << (pMat & 0x1f)) && + logtest(collision_event_mask[pEvent/32], 1 << (pEvent & 0x1f)) && + logtesta(collision_skip_mask, pat)) { + // fancy colors + if (mode == MODE_MODE) { + switch ( pMode ) { + case 0: fragment_color.rgb *= vec3(1.25, 0.1, 0.1); break; // ground + case 1: fragment_color.rgb *= vec3(0.1, 0.1, 1.0); break; // wall + case 2: fragment_color.rgb *= vec3(1.0, 0.1, 1.0); break; // obstacle + default: fragment_color.rgb = vec3(1, 0, 1); break; + } + } else if (mode == MODE_EVENT) { + switch ( pEvent ) { + case 0: fragment_color.rgb *= vec3(1.0); break; // none + case 1: fragment_color.rgb *= vec3(0.2, 1.0, 1.0); break; // deadly + case 2: fragment_color.rgb *= vec3(0.1, 1.0, 0.1); break; // endlessfall + case 3: fragment_color.rgb *= vec3(1.0, 1.0, 0.1); break; // burn + case 4: fragment_color.rgb *= vec3(0.1, 0.1, 1.0); break; // deadlyup + case 5: fragment_color.rgb *= vec3(1.0, 0.1, 0.5); break; // burnup + case 6: fragment_color.rgb *= vec3(1.0, 0.1, 0.1); break; // melt + default: fragment_color.rgb = vec3(1, 0, 1); break; + } + } else if (mode == MODE_MATERIAL) { + switch ( pMat ) { + case 0: fragment_color.rgb *= vec3(1.0, 0.7, 1.0); break; // stone + case 1: fragment_color.rgb *= vec3(0.1, 2.0, 2.0); break; // ice + case 2: fragment_color.rgb *= vec3(0.75, 0.25, 0.1); break; // quicksand + case 3: fragment_color.rgb *= vec3(0.1, 0.25, 0.75); break; // waterbottom + case 4: fragment_color.rgb *= vec3(0.5, 0.15, 0.1); break; // tar + case 5: fragment_color.rgb *= vec3(2.0, 1.5, 0.5); break; // sand + case 6: fragment_color.rgb *= vec3(1.5, 0.75, 0.1); break; // wood + case 7: fragment_color.rgb *= vec3(0.1, 1.35, 0.1); break; // grass + case 8: fragment_color.rgb *= vec3(1.7, 1.3, 0.1); break; // pcmetal + case 9: fragment_color.rgb *= vec3(1.8); break; // snow + case 10: fragment_color.rgb *= vec3(1.5, 0.2, 1.0); break; // deepsnow + case 11: fragment_color.rgb *= vec3(1.2, 0.5, 0.3); break; // hotcoals + case 12: fragment_color.rgb *= vec3(1.4, 0.1, 0.1); break; // lava + case 13: fragment_color.rgb *= vec3(0.8, 0.3, 0.1); break; // crwood + case 14: fragment_color.rgb *= vec3(1.0, 0.4, 1.0); break; // gravel + case 15: fragment_color.rgb *= vec3(1.5, 0.5, 0.15); break; // dirt + case 16: fragment_color.rgb *= vec3(0.7, 0.7, 1.0); break; // metal + case 17: fragment_color.rgb *= vec3(0.1, 0.1, 1.2); break; // straw + case 18: fragment_color.rgb *= vec3(0.75, 1.75, 0.75); break; // tube + case 19: fragment_color.rgb *= vec3(0.4, 0.1, 0.8); break; // swamp + case 20: fragment_color.rgb *= vec3(0.1, 0.4, 0.8); break; // stopproj + case 21: fragment_color.rgb *= vec3(1.9, 0.1, 1.9); break; // rotate + case 22: fragment_color.rgb *= vec3(1.0); break; // neutral + default: fragment_color.rgb = vec3(1, 0, 1); break; + } + } else { + fragment_color = vec4((normal_in + 1)*.5, 1); + fragment_color.xyz *= (pow(cam_dot, 3) + 0.3); + } + } else { + // filtered out. goodbye! + fragment_color.rgba = vec4(0); + } } else { - fragment_color = vec4(0.0, 0.3, 0.3, 1); + fragment_color = vec4(0.12, 0.12, 0.12, 0.5); } - } diff --git a/game/kernel/kmachine.cpp b/game/kernel/kmachine.cpp index 39ecd64cfd..ebf5a394f5 100644 --- a/game/kernel/kmachine.cpp +++ b/game/kernel/kmachine.cpp @@ -893,8 +893,29 @@ void set_fullscreen(u32 symptr, s64 screen) { } } +void set_collision(u32 symptr) { + Gfx::g_global_settings.collision_enable = symptr != s7.offset; +} + +void set_collision_wireframe(u32 symptr) { + Gfx::g_global_settings.collision_wireframe = symptr != s7.offset; +} + +void set_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, int mask, u32 symptr) { + if (symptr != s7.offset) { + Gfx::CollisionRendererSetMask(mode, mask); + } else { + Gfx::CollisionRendererClearMask(mode, mask); + } +} + +u32 get_collision_mask(GfxGlobalSettings::CollisionRendererMode mode, int mask) { + return Gfx::CollisionRendererGetMask(mode, mask) ? s7.offset + FIX_SYM_TRUE : s7.offset; +} + void InitMachine_PCPort() { // PC Port added functions + make_function_symbol_from_c("__read-ee-timer", (void*)read_ee_timer); make_function_symbol_from_c("__mem-move", (void*)c_memmove); make_function_symbol_from_c("__send-gfx-dma-chain", (void*)send_gfx_dma_chain); @@ -919,9 +940,16 @@ void InitMachine_PCPort() { make_function_symbol_from_c("pc-get-fullscreen", (void*)get_fullscreen); make_function_symbol_from_c("pc-get-screen-size", (void*)get_screen_size); make_function_symbol_from_c("pc-set-window-size", (void*)Gfx::set_window_size); - make_function_symbol_from_c("pc-set-letterbox", (void*)Gfx::set_letterbox); make_function_symbol_from_c("pc-set-fullscreen", (void*)set_fullscreen); + + // graphics things + make_function_symbol_from_c("pc-set-letterbox", (void*)Gfx::set_letterbox); make_function_symbol_from_c("pc-renderer-tree-set-lod", (void*)Gfx::SetLod); + make_function_symbol_from_c("pc-set-collision-mode", (void*)Gfx::CollisionRendererSetMode); + make_function_symbol_from_c("pc-set-collision-mask", (void*)set_collision_mask); + make_function_symbol_from_c("pc-get-collision-mask", (void*)get_collision_mask); + make_function_symbol_from_c("pc-set-collision-wireframe", (void*)set_collision_wireframe); + make_function_symbol_from_c("pc-set-collision", (void*)set_collision); // file related functions make_function_symbol_from_c("pc-filepath-exists?", (void*)filepath_exists); diff --git a/game/kernel/kmemcard.cpp b/game/kernel/kmemcard.cpp index 055f628d43..0863b07f56 100644 --- a/game/kernel/kmemcard.cpp +++ b/game/kernel/kmemcard.cpp @@ -854,7 +854,7 @@ u32 MC_check_result() { * The slot includes the four save slots (8 banks), and a few other files. */ void MC_get_status(s32 slot, Ptr info) { - ASSERT(slot == 0); // no memory cards so only allow "slot 0"!!! + // slot is ignored, so you'll get the same thing regardless of what slot you pick info->handle = 0; info->known = 0; diff --git a/goal_src/engine/collide/collide-reaction-target.gc b/goal_src/engine/collide/collide-reaction-target.gc index b2639497ca..38fabf6480 100644 --- a/goal_src/engine/collide/collide-reaction-target.gc +++ b/goal_src/engine/collide/collide-reaction-target.gc @@ -5,6 +5,8 @@ ;; name in dgo: collide-reaction-target ;; dgos: GAME, ENGINE +;; DECOMP BEGINS + (defun collide-shape-moving-angle-set! ((arg0 collide-shape-moving) (arg1 vector) (arg2 vector)) (set! (-> arg0 surface-normal quad) (-> arg1 quad)) (set! (-> arg0 surface-angle) (vector-dot arg1 (-> arg0 dynam gravity-normal))) @@ -113,7 +115,7 @@ ) ) (set! sv-32 (logior sv-32 128)) - (set! (-> arg0 unknown-dword-coverage) (-> *display* base-frame-counter)) + (set! (-> arg0 unknown-dword-coverage) (the-as int (-> *display* base-frame-counter))) (set! sv-40 (logior sv-40 128)) (set! (-> arg0 unknown-dword21) (-> *display* base-frame-counter)) (let ((f30-0 (vector-dot sv-52 (-> arg0 unknown-vector22))) @@ -299,7 +301,7 @@ (set! (-> arg0 unknown-vector70 quad) (-> arg1 best-tri intersect quad)) (set! (-> arg0 unknown-vector71 quad) (-> arg0 poly-normal quad)) (set! (-> arg0 unknown-vector121 quad) (-> sv-84 quad)) - (set! (-> arg0 unknown-int60) (the-as uint (-> arg1 best-tri pat))) + (set! (-> arg0 wall-pat) (-> arg1 best-tri pat)) (-> arg0 history-data (logand (+ (-> arg0 unknown-halfword00) 127) 127)) (cond (#f @@ -320,7 +322,7 @@ ) ) (and (< 0.0 (vector-dot (-> arg0 ground-poly-normal) arg2)) - (< (- (-> *display* base-frame-counter) (-> arg0 unknown-dword10)) 90) + (< (- (-> *display* base-frame-counter) (-> arg0 unknown-dword10)) (seconds 0.3)) (zero? (logand sv-104 32)) ) ) @@ -375,8 +377,6 @@ (the-as uint sv-96) ) -;; definition for function target-collision-no-reaction -;; INFO: Return type mismatch int vs none. (defun target-collision-no-reaction ((arg0 control-info) (arg1 collide-shape-intersect) (arg2 vector) (arg3 vector)) (if (= (-> arg0 unknown-surface00 mode) 'air) (logior! (-> arg0 reaction-flag) 32) @@ -388,4 +388,8 @@ (set! (-> arg0 unknown-halfword00) (logand (+ (-> arg0 unknown-halfword00) 1) 127)) 0 (none) - ) \ No newline at end of file + ) + + + + diff --git a/goal_src/engine/collide/collide-target-h.gc b/goal_src/engine/collide/collide-target-h.gc index ab5f7ab856..3e5cd0581a 100644 --- a/goal_src/engine/collide/collide-target-h.gc +++ b/goal_src/engine/collide/collide-target-h.gc @@ -185,7 +185,7 @@ (unknown-vector120 vector :inline :offset 18928) ;; from target::(code target-running-attack) (unknown-float150 float :offset 18944) ;; from target::(code target-wheel-flip) (unknown-vector121 vector :inline :offset 18960) ;; from target collide response - (unknown-int60 uint32 :offset 18976) ;; from logic-target::print-target-stats + (wall-pat pat-surface :offset 18976) ;; pat information for wall-check collision (unknown-soundid00 sound-id :offset 18980) ;; from powerups::target-powerup-process (unknown-float141 float :offset 18984) ;; from powerups::target-powerup-process ) diff --git a/goal_src/engine/debug/default-menu.gc b/goal_src/engine/debug/default-menu.gc index 5366cbc32c..61b3a98087 100644 --- a/goal_src/engine/debug/default-menu.gc +++ b/goal_src/engine/debug/default-menu.gc @@ -4253,6 +4253,99 @@ )) ) +(defun dm-toggle-collision-pick-func ((arg symbol) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (cond + ((-> arg value) + (false! (-> arg value)) + (logior! *vu1-enable-user-menu* (vu1-renderer-mask tfrag trans-tfrag tie tie-near)) + (false! *generic-tie*) + ) + (else + (true! (-> arg value)) + (logclear! *vu1-enable-user-menu* (vu1-renderer-mask tfrag trans-tfrag tie tie-near)) + (true! *generic-tie*) + ) + ) + ) + (-> arg value) + ) + +(defun dm-collision-mode-pick-func ((arg pc-collision-mode) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (set! *collision-mode* arg) + ) + (= *collision-mode* arg) + ) + +(defun dm-collision-filter-mode-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode mode) arg (not (pc-get-collision-mask (pc-collision-mode mode) arg))) + ) + (pc-get-collision-mask (pc-collision-mode mode) arg) + ) + +(defun dm-collision-filter-event-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode event) arg (not (pc-get-collision-mask (pc-collision-mode event) arg))) + ) + (pc-get-collision-mask (pc-collision-mode event) arg) + ) + +(defun dm-collision-filter-material-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode material) arg (not (pc-get-collision-mask (pc-collision-mode material) arg))) + ) + (pc-get-collision-mask (pc-collision-mode material) arg) + ) + +(defun dm-collision-filter-skip-pick-func ((arg int) (msg debug-menu-msg)) + (when (= msg (debug-menu-msg press)) + (pc-set-collision-mask (pc-collision-mode skip) arg (not (pc-get-collision-mask (pc-collision-mode skip) arg))) + ) + (pc-get-collision-mask (pc-collision-mode skip) arg) + ) + +(defun debug-menu-make-collision-renderer-menu ((ctx debug-menu-context)) + (let ((menu (new 'debug 'debug-menu ctx "Collision renderer menu"))) + ;; master toggle + (debug-menu-append-item menu (new-dm-bool "Enable" *collision-renderer* dm-toggle-collision-pick-func)) + (debug-menu-append-item menu (new-dm-bool "Wireframe" *collision-wireframe* dm-boolean-toggle-pick-func)) + (debug-menu-append-item menu (new-dm-submenu "Mode" + (let ((mode-menu (new 'debug 'debug-menu ctx "Collision renderer mode menu"))) + (doenum (name val pc-collision-mode) + (debug-menu-append-item mode-menu (new-dm-flag name val dm-collision-mode-pick-func)) + ) + mode-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter mode" + (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter mode menu"))) + (doenum (name val pat-mode) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-mode-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter event" + (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter event menu"))) + (doenum (name val pat-event) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-event-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter material" + (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter material menu"))) + (doenum (name val pat-material) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-material-pick-func)) + ) + filter-menu))) + (debug-menu-append-item menu (new-dm-submenu "Filter skip" + (let ((filter-menu (new 'debug 'debug-menu ctx "Collision renderer filter skip menu"))) + (doenum (name val pc-pat-skip-hack) + (debug-menu-append-item filter-menu (new-dm-flag name val dm-collision-filter-skip-pick-func)) + ) + filter-menu))) + + (new-dm-submenu "Collision renderer" menu) + ) + ) + (defun dm-lod-int ((arg0 int) (arg1 debug-menu-msg) (arg2 int) (arg3 int)) (when (= arg1 (debug-menu-msg press)) (case (/ arg0 8) @@ -4450,11 +4543,11 @@ (flag "Update vis outside bsp" *update-leaf-when-outside-bsp* dm-boolean-toggle-pick-func) (flag "Pad display" #f ,(dm-lambda-boolean-flag (-> *pc-settings* debug-pad-display))) (flag "Display actor bank" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-actor-bank))) + (flag "Heap status" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-heap-status))) + (flag "Bug report" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-bug-report))) + (flag "Text boxes" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-text-box))) (float-var "Actor birth dist" #f ,(dm-lambda-meters-var (-> *ACTOR-bank* birth-dist)) 20 1 #t 0 10000 1) (float-var "Actor pause dist" #f ,(dm-lambda-meters-var (-> *ACTOR-bank* pause-dist)) 20 1 #t 0 10000 1) - (flag "Heap status" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-heap-status))) - (flag "Text boxes" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-text-box))) - (flag "Bug report" #f ,(dm-lambda-boolean-flag (-> *pc-settings* display-bug-report))) (menu "Mood override" (function "-- SIMPLE OVERRIDE" #f nothing) (flag "Palette 0" 0 dm-mood-override-palette-pick-func) @@ -4495,6 +4588,10 @@ (debug-menu-append-item (-> *debug-menu-context* root-menu) other-menu-node) ) + + (debug-menu-append-item (-> (the debug-menu-item-submenu (caddddr (-> *debug-menu-context* root-menu items))) submenu) + (debug-menu-make-collision-renderer-menu *debug-menu-context*)) + ) ) diff --git a/goal_src/engine/entity/entity.gc b/goal_src/engine/entity/entity.gc index 3e9850f526..07ff4918d6 100644 --- a/goal_src/engine/entity/entity.gc +++ b/goal_src/engine/entity/entity.gc @@ -1936,11 +1936,21 @@ (cond ;; some water-height info ((and (= (-> e tag i name) 'water-height) (= (-> e tag i elt-count) 4) (= (-> e tag i elt-type) float)) - (format *debug-temp-string* " ~mm ~mm ~mm ~f" + (format *debug-temp-string* " ~mm ~mm ~mm #x~X" (-> (the (pointer float) data) 0) (-> (the (pointer float) data) 1) (-> (the (pointer float) data) 2) - (-> (the (pointer float) data) 3) + (-> (the (pointer uint32) data) 3) + ) + ) + ;; some water-height info but with 5 elts + ((and (= (-> e tag i name) 'water-height) (= (-> e tag i elt-count) 4) (= (-> e tag i elt-type) float)) + (format *debug-temp-string* " ~mm ~mm ~mm #x~X ~mm" + (-> (the (pointer float) data) 0) + (-> (the (pointer float) data) 1) + (-> (the (pointer float) data) 2) + (-> (the (pointer uint32) data) 3) + (-> (the (pointer float) data) 4) ) ) ;; music flava (music ambients) diff --git a/goal_src/engine/game/task/hint-control.gc b/goal_src/engine/game/task/hint-control.gc index e24e7d4a9d..d72dae155a 100644 --- a/goal_src/engine/game/task/hint-control.gc +++ b/goal_src/engine/game/task/hint-control.gc @@ -5,575 +5,464 @@ ;; name in dgo: hint-control ;; dgos: GAME, ENGINE -;; failed to figure out what this is: -(set! - (-> *game-info* hint-control) - (the-as - (array level-hint-control) - (new - 'static - 'boxed-array - :type level-hint-control :length 25 :allocated-length 25 - (new 'static 'level-hint-control - :id #x917 - :num-attempts-before-playing 1 - :num-success-before-killing 3 - ) - (new 'static 'level-hint-control - :id #x90a - :num-attempts-before-playing 3 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x284 - :num-attempts-before-playing 3 - :num-success-before-killing 3 - ) - (new 'static 'level-hint-control - :id #x285 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :id #x251 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :id #x2af - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x384 - :id #x239 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x5dc - :id #x29d - :num-attempts-before-playing 1 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x384 - :id #x25b - :num-attempts-before-playing 1 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x2a4 - :num-attempts-before-playing 3 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x384 - :id #x2aa - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x5dc - :id #x33a - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x1194 - :id #x34b - :num-attempts-before-playing 3 - :num-success-before-killing 2 - ) - (new 'static 'level-hint-control - :delay-before-playing #x4650 - :id #x34a - :num-attempts-before-playing 3 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x34d - :num-attempts-before-playing 3 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x345 - :num-attempts-before-playing 3 - :num-success-before-killing 2 - ) - (new 'static 'level-hint-control - :id #x352 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x2328 - :id #x347 - :num-attempts-before-playing 3 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :id #x34e - :num-attempts-before-playing 3 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x444 - :num-attempts-before-playing 5 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x384 - :id #x438 - :num-attempts-before-playing 1 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x433 - :num-attempts-before-playing 4 - :num-success-before-killing -1 - ) - (new 'static 'level-hint-control - :id #x70d - :num-attempts-before-playing 1 - :num-success-before-killing 2 - ) - (new 'static 'level-hint-control - :delay-before-playing #x5dc - :id #x806 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - (new 'static 'level-hint-control - :delay-before-playing #x5dc - :id #x809 - :num-attempts-before-playing 1 - :num-success-before-killing 1 - ) - ) - ) - ) +;; DECOMP BEGINS -;; failed to figure out what this is: -(set! - (-> *game-info* task-hint-control) - (new - 'static - 'boxed-array - :type task-hint-control-group :length 16 :allocated-length 16 - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 3 :allocated-length 3 - (new 'static 'task-hint-control - :task (game-task training-gimmie) - :delay #x2bf20 +(set! (-> *game-info* hint-control) (new + 'static + 'boxed-array + :type level-hint-control :length 25 :allocated-length 25 + (new 'static 'level-hint-control + :id + (game-text-id sage-voicebox-hint-crate-iron) + :num-attempts-before-playing 1 + :num-success-before-killing 3 + ) + (new 'static 'level-hint-control + :id + (game-text-id training-more-eco-more-time) + :num-attempts-before-playing 3 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id sidekick-speech-hint-crate-iron) + :num-attempts-before-playing 3 + :num-success-before-killing 3 + ) + (new 'static 'level-hint-control + :id + (game-text-id sidekick-speech-hint-crate-steel) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :id + (game-text-id sidekick-hint-orb-cache-top) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :id + (game-text-id beach-grottopole-increment) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 3) + :id (game-text-id beach-eco-rock-increment) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 5) + :id + (game-text-id jungle-mirrors-break-the-mirror-jak) + :num-attempts-before-playing 1 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 3) + :id + (game-text-id jungle-precursorbridge-hint) + :num-attempts-before-playing 1 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id misty-teetertotter-bonk-dax-tutorial) + :num-attempts-before-playing 3 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 3) + :id (game-text-id misty-bone-bridge-hint) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 5) + :id (game-text-id rolling-dark-plants-hint) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 15) + :id (game-text-id sunken-bully-dive-hint) + :num-attempts-before-playing 3 + :num-success-before-killing 2 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 60) + :id (game-text-id sunken-qbert-plat-hint) + :num-attempts-before-playing 3 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id sunken-blue-eco-charger-all-hint) + :num-attempts-before-playing 3 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id sunken-blue-eco-charger-hint) + :num-attempts-before-playing 3 + :num-success-before-killing 2 + ) + (new 'static 'level-hint-control + :id + (game-text-id swamp-tethers-advice-hint) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 30) + :id + (game-text-id sunken-double-lurker-hint) + :num-attempts-before-playing 3 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :id + (game-text-id sunken-take-it-easy-hot-pipes) + :num-attempts-before-playing 3 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id (game-text-id ram-boss-red-eco-hint) + :num-attempts-before-playing 5 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 3) + :id + (game-text-id darkcave-light-crystal-hint) + :num-attempts-before-playing 1 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id daxter-maybe-you-can-shoot-better-goggles) + :num-attempts-before-playing 4 + :num-success-before-killing -1 + ) + (new 'static 'level-hint-control + :id + (game-text-id lavatube-shoot-the-spheres) + :num-attempts-before-playing 1 + :num-success-before-killing 2 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 5) + :id + (game-text-id citadel-break-generator-hint) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + (new 'static 'level-hint-control + :delay-before-playing (seconds 5) + :id + (game-text-id citadel-break-generators-reminder) + :num-attempts-before-playing 1 + :num-success-before-killing 1 + ) + ) + ) + +(set! (-> *game-info* task-hint-control) + (new + 'static + 'boxed-array + :type task-hint-control-group :length 16 :allocated-length 16 + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 3 :allocated-length 3 + (new 'static 'task-hint-control :task (game-task training-gimmie) :delay (seconds 600)) + (new 'static 'task-hint-control :task (game-task training-door) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task training-climb) :delay (seconds 1800)) + ) + ) + (new 'static 'task-hint-control-group) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 3 :allocated-length 3 + (new 'static 'task-hint-control :task (game-task beach-gimmie) :delay (seconds 900)) + (new 'static 'task-hint-control :task (game-task beach-sentinel) :delay (seconds 1800)) + (new 'static 'task-hint-control :task (game-task beach-cannon) :delay (seconds 2700)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 2 :allocated-length 2 + (new 'static 'task-hint-control :task (game-task jungle-plant) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task jungle-canyon-end) :delay (seconds 2400)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 4 :allocated-length 4 + (new 'static 'task-hint-control :task (game-task misty-boat) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task misty-warehouse) :delay (seconds 1800)) + (new 'static 'task-hint-control :task (game-task misty-bike-jump) :delay (seconds 2400)) + (new 'static 'task-hint-control :task (game-task misty-eco-challenge) :delay (seconds 3000)) + ) + ) + (new 'static 'task-hint-control-group) + (new 'static 'task-hint-control-group) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 3 :allocated-length 3 + (new 'static 'task-hint-control :task (game-task sunken-spinning-room) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task sunken-sharks) :delay (seconds 1800)) + (new 'static 'task-hint-control :task (game-task sunken-slide) :delay (seconds 2400)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 1 :allocated-length 1 + (new 'static 'task-hint-control :task (game-task swamp-battle) :delay (seconds 2400)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 1 :allocated-length 1 + (new 'static 'task-hint-control :task (game-task rolling-lake) :delay (seconds 2400)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 1 :allocated-length 1 + (new 'static 'task-hint-control :task (game-task ogre-secret) :delay (seconds 3600)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 1 :allocated-length 1 + (new 'static 'task-hint-control :task (game-task village3-extra1) :delay (seconds 3600)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 4 :allocated-length 4 + (new 'static 'task-hint-control :task (game-task snow-bumpers) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task snow-cage) :delay (seconds 1800)) + (new 'static 'task-hint-control :task (game-task snow-ball) :delay (seconds 2400)) + (new 'static 'task-hint-control :task (game-task snow-bunnies) :delay (seconds 3000)) + ) + ) + (new 'static 'task-hint-control-group + :tasks + (new + 'static + 'boxed-array + :type task-hint-control :length 4 :allocated-length 4 + (new 'static 'task-hint-control :task (game-task cave-dark-climb) :delay (seconds 1200)) + (new 'static 'task-hint-control :task (game-task cave-robot-climb) :delay (seconds 1800)) + (new 'static 'task-hint-control :task (game-task cave-swing-poles) :delay (seconds 2400)) + (new 'static 'task-hint-control :task (game-task cave-platforms) :delay (seconds 3000)) + ) + ) + (new 'static 'task-hint-control-group) + (new 'static 'task-hint-control-group) + ) ) - (new 'static 'task-hint-control - :task (game-task training-door) - :delay #x57e40 - ) - (new 'static 'task-hint-control - :task (game-task training-climb) - :delay #x83d60 - ) - ) - ) - (new 'static 'task-hint-control-group) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 3 :allocated-length 3 - (new 'static 'task-hint-control - :task (game-task beach-gimmie) - :delay #x41eb0 - ) - (new 'static 'task-hint-control - :task (game-task beach-sentinel) - :delay #x83d60 - ) - (new 'static 'task-hint-control - :task (game-task beach-cannon) - :delay #xc5c10 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 2 :allocated-length 2 - (new 'static 'task-hint-control - :task (game-task jungle-plant) - :delay #x57e40 - ) - (new 'static 'task-hint-control - :task (game-task jungle-canyon-end) - :delay #xafc80 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 4 :allocated-length 4 - (new 'static 'task-hint-control - :task (game-task misty-boat) - :delay #x57e40 - ) - (new 'static 'task-hint-control - :task (game-task misty-warehouse) - :delay #x83d60 - ) - (new 'static 'task-hint-control - :task (game-task misty-bike-jump) - :delay #xafc80 - ) - (new 'static 'task-hint-control - :task (game-task misty-eco-challenge) - :delay #xdbba0 - ) - ) - ) - (new 'static 'task-hint-control-group) - (new 'static 'task-hint-control-group) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 3 :allocated-length 3 - (new 'static 'task-hint-control - :task (game-task sunken-spinning-room) - :delay #x57e40 - ) - (new 'static 'task-hint-control - :task (game-task sunken-sharks) - :delay #x83d60 - ) - (new 'static 'task-hint-control - :task (game-task sunken-slide) - :delay #xafc80 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 1 :allocated-length 1 - (new 'static 'task-hint-control - :task (game-task swamp-battle) - :delay #xafc80 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 1 :allocated-length 1 - (new 'static 'task-hint-control - :task (game-task rolling-lake) - :delay #xafc80 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 1 :allocated-length 1 - (new 'static 'task-hint-control - :task (game-task ogre-secret) - :delay #x107ac0 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 1 :allocated-length 1 - (new 'static 'task-hint-control - :task (game-task village3-extra1) - :delay #x107ac0 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 4 :allocated-length 4 - (new 'static 'task-hint-control - :task (game-task snow-bumpers) - :delay #x57e40 - ) - (new 'static 'task-hint-control :task (game-task snow-cage) :delay #x83d60) - (new 'static 'task-hint-control :task (game-task snow-ball) :delay #xafc80) - (new 'static 'task-hint-control - :task (game-task snow-bunnies) - :delay #xdbba0 - ) - ) - ) - (new 'static 'task-hint-control-group - :tasks - (new - 'static - 'boxed-array - :type task-hint-control :length 4 :allocated-length 4 - (new 'static 'task-hint-control - :task (game-task cave-dark-climb) - :delay #x57e40 - ) - (new 'static 'task-hint-control - :task (game-task cave-robot-climb) - :delay #x83d60 - ) - (new 'static 'task-hint-control - :task (game-task cave-swing-poles) - :delay #xafc80 - ) - (new 'static 'task-hint-control - :task (game-task cave-platforms) - :delay #xdbba0 - ) - ) - ) - (new 'static 'task-hint-control-group) - (new 'static 'task-hint-control-group) - ) - ) -;; definition for function find-hint-control-index (defun find-hint-control-index ((arg0 game-text-id)) (let ((gp-0 -1)) - (let ((v1-2 (length (-> *game-info* hint-control)))) - (dotimes (a0-2 v1-2) - (when (= (-> *game-info* hint-control a0-2 id) arg0) - (set! gp-0 a0-2) - (set! a0-2 v1-2) + (let ((v1-2 (length (-> *game-info* hint-control)))) + (dotimes (a0-2 v1-2) + (when (= (-> *game-info* hint-control a0-2 id) arg0) + (set! gp-0 a0-2) + (set! a0-2 v1-2) + ) + ) ) - ) + gp-0 ) - gp-0 - ) ) -;; definition for function start-hint-timer -;; INFO: Return type mismatch int vs none. (defun start-hint-timer ((arg0 game-text-id)) (let ((v1-0 (find-hint-control-index arg0))) - (when - (and - (>= v1-0 0) - (zero? (-> *game-info* hint-control v1-0 start-time)) - (!= (-> *game-info* hint-control v1-0 num-attempts-before-playing) 1) - ) - (set! - (-> *game-info* hint-control v1-0 start-time) - (-> *display* base-frame-counter) - ) - 0 + (when (and (>= v1-0 0) + (zero? (-> *game-info* hint-control v1-0 start-time)) + (!= (-> *game-info* hint-control v1-0 num-attempts-before-playing) 1) + ) + (set! (-> *game-info* hint-control v1-0 start-time) (-> *display* base-frame-counter)) + 0 + ) ) - ) 0 (none) ) -;; definition for function increment-success-for-hint -;; INFO: Return type mismatch int vs none. (defun increment-success-for-hint ((arg0 game-text-id)) (let ((gp-0 (find-hint-control-index arg0))) - (when (>= gp-0 0) - (set! - (-> *game-info* hint-control gp-0 num-success) - (seekl (-> *game-info* hint-control gp-0 num-success) 127 1) - ) - 0 + (when (>= gp-0 0) + (seekl! (-> *game-info* hint-control gp-0 num-success) 127 1) + 0 + ) ) - ) 0 (none) ) -;; definition for function can-hint-be-played? ;; WARN: disable def twice: 139. This may happen when a cond (no else) is nested inside of another conditional, but it should be rare. (defun can-hint-be-played? ((arg0 game-text-id) (arg1 entity) (arg2 string)) (let ((v1-0 (not (str-is-playing?)))) - (if (and v1-0 (nonzero? arg0)) - (set! v1-0 (not (seen-text? *game-info* arg0))) - ) - (when v1-0 - (when *hint-semaphore* - (set! - v1-0 - (appeared-for-long-enough? (the-as level-hint (ppointer->process *hint-semaphore*))) - ) - 0 - ) - (when - (and - v1-0 - (< - (- (-> *display* base-frame-counter) (-> *game-info* hint-play-time)) - 30 - ) - ) - (set! v1-0 #f) - 0 - ) - (set! - v1-0 - (and - v1-0 - (not (-> *setting-control* current talking)) - (not (-> *setting-control* current spooling)) - (not (-> *setting-control* current hint)) - (not (-> *setting-control* current ambient)) - (>= (-> *display* base-frame-counter) (-> *game-info* blackout-time)) - ) - ) - 0 - ) - (cond - (v1-0 - (let ((v1-16 (find-hint-control-index arg0))) - (cond - ((< v1-16 0) - #t + (if (and v1-0 (nonzero? arg0)) + (set! v1-0 (not (seen-text? *game-info* arg0))) ) - (else - (let ((gp-1 (-> *game-info* hint-control v1-16)) - (a0-24 - (- - (-> *display* base-frame-counter) - (-> *game-info* hint-control v1-16 last-time-called) - ) - ) - (v1-21 #t) - ) - (if (and (= (-> gp-1 num-attempts-before-playing) 1) (< a0-24 30)) - (+! (-> gp-1 start-time) a0-24) - ) - (cond - ((and - (!= (-> gp-1 num-attempts-before-playing) 1) - (nonzero? (-> gp-1 last-time-called)) - (< - (- (-> *display* base-frame-counter) (-> gp-1 last-time-called)) - 150 - ) + (when v1-0 + (when *hint-semaphore* + (set! v1-0 (appeared-for-long-enough? (the-as level-hint (ppointer->process *hint-semaphore*)))) + 0 + ) + (when (and v1-0 (< (- (-> *display* base-frame-counter) (-> *game-info* hint-play-time)) (seconds 0.1))) + (set! v1-0 #f) + 0 + ) + (set! v1-0 (and v1-0 + (not (-> *setting-control* current talking)) + (not (-> *setting-control* current spooling)) + (not (-> *setting-control* current hint)) + (not (-> *setting-control* current ambient)) + (>= (-> *display* base-frame-counter) (-> *game-info* blackout-time)) + ) ) - (set! (-> gp-1 last-time-called) (-> *display* base-frame-counter)) - #f - ) - (else - (set! (-> gp-1 last-time-called) (-> *display* base-frame-counter)) - (when (nonzero? (-> gp-1 delay-before-playing)) - (if - (< - (-> gp-1 start-time) - (the-as int (-> gp-1 delay-before-playing)) - ) - (set! v1-21 #f) - ) - 0 - ) - (cond - (v1-21 - (set! (-> gp-1 num-attempts) (seekl (-> gp-1 num-attempts) 127 1)) - (and - (>= (-> gp-1 num-attempts) (-> gp-1 num-attempts-before-playing)) - (or - (= (-> gp-1 num-success-before-killing) -1) - (< (-> gp-1 num-success) (-> gp-1 num-success-before-killing)) - ) - ) + 0 + ) + (cond + (v1-0 + (let ((v1-16 (find-hint-control-index arg0))) + (cond + ((< v1-16 0) + #t ) (else - #f - ) - ) - ) - ) - ) - ) - ) - ) - ) - (else - #f - ) - ) - ) - ) - -;; definition for function reset-all-hint-controls -;; INFO: Return type mismatch int vs none. -(defun reset-all-hint-controls () - (let ((v1-2 (length (-> *game-info* hint-control)))) - (dotimes (a0-1 v1-2) - (let ((a1-2 (-> *game-info* hint-control a0-1))) - (set! (-> a1-2 start-time) 0) - (set! (-> a1-2 last-time-called) 0) - (set! (-> a1-2 num-attempts) 0) - (set! (-> a1-2 num-success) 0) - ) - 0 - ) - ) - 0 - (none) - ) - -;; definition for function update-task-hints -;; INFO: Return type mismatch int vs none. -(defun update-task-hints () - (when *target* - (let ((a0-0 (+ (-> *target* current-level info index) -1)) - (v1-7 (-> *game-info* task-hint-control)) - ) - (when (and (>= a0-0 0) (< a0-0 (-> *level-task-data-remap* length))) - (let ((a0-3 (-> *level-task-data-remap* a0-0))) - (when (< a0-3 (-> v1-7 length)) - (let ((gp-0 (-> v1-7 a0-3 tasks))) - (when (and (!= gp-0 0) (nonzero? (-> gp-0 length))) - (let ((s5-0 (-> *game-info* in-level-time a0-3))) - (dotimes (s4-0 (-> gp-0 length)) - (case (get-task-status (-> gp-0 s4-0 task)) - (((task-status need-hint) (task-status unknown)) - (if (< (the-as uint (-> gp-0 s4-0 delay)) (the-as uint s5-0)) - (close-specific-task! - (-> gp-0 s4-0 task) - (task-status need-hint) + (let ((gp-1 (-> *game-info* hint-control v1-16)) + (a0-24 (- (-> *display* base-frame-counter) (-> *game-info* hint-control v1-16 last-time-called))) + (v1-21 #t) + ) + (if (and (= (-> gp-1 num-attempts-before-playing) 1) (< a0-24 (seconds 0.1))) + (+! (-> gp-1 start-time) a0-24) + ) + (cond + ((and (!= (-> gp-1 num-attempts-before-playing) 1) + (nonzero? (-> gp-1 last-time-called)) + (< (- (-> *display* base-frame-counter) (-> gp-1 last-time-called)) (seconds 0.5)) + ) + (set! (-> gp-1 last-time-called) (-> *display* base-frame-counter)) + #f + ) + (else + (set! (-> gp-1 last-time-called) (-> *display* base-frame-counter)) + (when (nonzero? (-> gp-1 delay-before-playing)) + (if (< (-> gp-1 start-time) (-> gp-1 delay-before-playing)) + (set! v1-21 #f) + ) + 0 + ) + (cond + (v1-21 + (seekl! (-> gp-1 num-attempts) 127 1) + (and (>= (-> gp-1 num-attempts) (-> gp-1 num-attempts-before-playing)) + (or (= (-> gp-1 num-success-before-killing) -1) + (< (-> gp-1 num-success) (-> gp-1 num-success-before-killing)) + ) + ) + ) + (else + #f + ) + ) + ) + ) + ) + ) + ) + ) + ) + (else + #f + ) + ) + ) + ) + +(defun reset-all-hint-controls () + (let ((v1-2 (length (-> *game-info* hint-control)))) + (dotimes (a0-1 v1-2) + (let ((a1-2 (-> *game-info* hint-control a0-1))) + (set! (-> a1-2 start-time) 0) + (set! (-> a1-2 last-time-called) 0) + (set! (-> a1-2 num-attempts) 0) + (set! (-> a1-2 num-success) 0) + ) + 0 + ) + ) + 0 + (none) + ) + +(defun update-task-hints () + (when *target* + (let ((a0-0 (+ (-> *target* current-level info index) -1)) + (v1-7 (-> *game-info* task-hint-control)) + ) + (when (and (>= a0-0 0) (< a0-0 (-> *level-task-data-remap* length))) + (let ((a0-3 (-> *level-task-data-remap* a0-0))) + (when (< a0-3 (-> v1-7 length)) + (let ((gp-0 (-> v1-7 a0-3 tasks))) + (when (and (!= gp-0 0) (nonzero? (-> gp-0 length))) + (let ((s5-0 (-> *game-info* in-level-time a0-3))) + (dotimes (s4-0 (-> gp-0 length)) + (case (get-task-status (-> gp-0 s4-0 task)) + (((task-status need-hint) (task-status unknown)) + (if (< (the-as uint (-> gp-0 s4-0 delay)) (the-as uint s5-0)) + (close-specific-task! (-> gp-0 s4-0 task) (task-status need-hint)) + ) + ) + ) + ) + ) ) - ) ) ) - ) ) - ) ) - ) ) - ) ) - ) 0 (none) ) diff --git a/goal_src/engine/gfx/hw/vu1-user-h.gc b/goal_src/engine/gfx/hw/vu1-user-h.gc index de2cb3736e..b3a9c8e283 100644 --- a/goal_src/engine/gfx/hw/vu1-user-h.gc +++ b/goal_src/engine/gfx/hw/vu1-user-h.gc @@ -23,7 +23,7 @@ (shrub-near 12) (billboard 13) (trans-shrubbery 14) - (trans-frag 15) + (trans-tfrag 15) (sprite 16) (shadow 17) (depth-cue 18) @@ -45,7 +45,7 @@ shrub-near billboard trans-shrubbery - trans-frag + trans-tfrag sprite shadow depth-cue diff --git a/goal_src/engine/gfx/tfrag/tfrag-methods.gc b/goal_src/engine/gfx/tfrag/tfrag-methods.gc index 543be7f003..c3d4b1f2ed 100644 --- a/goal_src/engine/gfx/tfrag/tfrag-methods.gc +++ b/goal_src/engine/gfx/tfrag/tfrag-methods.gc @@ -207,7 +207,7 @@ (a0-37 int) (sv-16 (pointer uint8)) ) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) #| TODO (when (nonzero? s5-0) @@ -375,7 +375,7 @@ (a0-37 int) (sv-16 (pointer uint8)) ) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) #| TODO (when (nonzero? s5-0) @@ -550,7 +550,7 @@ (a0-37 int) (sv-16 (pointer uint8)) ) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) #| TODO (when (nonzero? s5-0) @@ -850,9 +850,9 @@ ;; INFO: Return type mismatch drawable-tree-trans-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-trans-tfrag ((obj drawable-tree-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) - (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) - (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) + (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) + (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) (let ((v1-12 (-> *tfrag-work* frag-dists quad))) @@ -869,9 +869,9 @@ ;; INFO: Return type mismatch drawable-tree-lowres-trans-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-lowres-trans-tfrag ((obj drawable-tree-lowres-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) - (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) - (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) + (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) + (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) (let ((v1-12 (-> *tfrag-work* frag-dists quad))) @@ -888,9 +888,9 @@ ;; INFO: Return type mismatch drawable-tree-dirt-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-dirt-tfrag ((obj drawable-tree-dirt-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) - (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) - (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) + (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) + (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) (let ((v1-12 (-> *tfrag-work* frag-dists quad))) @@ -907,9 +907,9 @@ ;; INFO: Return type mismatch drawable-tree-ice-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-ice-tfrag ((obj drawable-tree-ice-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) - (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) - (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag)))) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) + (set! (-> *tfrag-work* vu1-enable-tfrag) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) + (set! (-> *tfrag-work* vu1-enable-tfrag-near) (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag)))) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) (let ((v1-12 (-> *tfrag-work* frag-dists quad))) @@ -940,7 +940,7 @@ ;; definition for method 14 of type drawable-inline-array-trans-tfrag ;; INFO: Return type mismatch drawable-inline-array-trans-tfrag vs none. (defmethod collect-stats drawable-inline-array-trans-tfrag ((obj drawable-inline-array-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (dotimes (s5-0 (-> obj length)) (let ((s4-0 (-> obj data s5-0))) (if (vis-cull (-> s4-0 id)) diff --git a/goal_src/engine/target/logic-target.gc b/goal_src/engine/target/logic-target.gc index 4e6f1d8d2f..2b2461b4f2 100644 --- a/goal_src/engine/target/logic-target.gc +++ b/goal_src/engine/target/logic-target.gc @@ -302,11 +302,11 @@ (let ((s4-2 format) (s3-2 arg1) (s2-2 "~0kwall:~6X mode:~-8S material:~-10S event:~S~%") - (s1-2 (-> arg0 control unknown-int60)) - (s0-2 (pat-mode->string (the-as pat-surface (-> arg0 control unknown-int60)))) + (s1-2 (-> arg0 control wall-pat)) + (s0-2 (pat-mode->string (-> arg0 control wall-pat))) ) - (set! sv-96 (pat-material->string (the-as pat-surface (-> arg0 control unknown-int60)))) - (let ((t1-2 (pat-event->string (the-as pat-surface (-> arg0 control unknown-int60))))) + (set! sv-96 (pat-material->string (-> arg0 control wall-pat))) + (let ((t1-2 (pat-event->string (-> arg0 control wall-pat)))) (s4-2 s3-2 s2-2 s1-2 s0-2 sv-96 t1-2) ) ) @@ -1620,7 +1620,7 @@ (none) ) -(defun target-post () +(defbehavior target-post target () (target-real-post) (none) ) diff --git a/goal_src/engine/target/target-h.gc b/goal_src/engine/target/target-h.gc index 9c652801ec..69f2bff3ba 100644 --- a/goal_src/engine/target/target-h.gc +++ b/goal_src/engine/target/target-h.gc @@ -5,47 +5,12 @@ ;; name in dgo: target-h ;; dgos: GAME, ENGINE -;; TODO - for cam-master -(define-extern target-cam-pos (function vector)) -(defun-extern stop symbol int) -(defun-extern start symbol continue-point target) -;; TODO - for mood -(define-extern target-joint-pos (function vector)) ;; TODO - unconfirmed -;; TODO - for logic-target - defined in shadow -(define-extern do-target-shadow (function none :behavior target)) -;; TODO - for logic-target - defined in powerups -(define-extern target-powerup-process (function none :behavior target)) -;; TODO - for logic-target - defined in target-handler -(define-extern target-exit (function none :behavior target)) -(define-extern target-generic-event-handler (function process int symbol event-message-block object :behavior target)) -;; TODO - for logic-target - defined in sidekick -(declare-type sidekick process-drawable) -(define-extern init-sidekick (function none :behavior sidekick)) -;; TODO - for logic-target - defined in target-death -(define-extern mod-var-jump (function symbol symbol symbol vector vector :behavior target)) -(define-extern init-var-jump (function float float vector vector vector vector :behavior target)) ;; 1st and 2nd vectors may be symbols instead? -;; TODO - for target-util -;; TODO - for target-tube -(define-extern target-attacked (function symbol attack-info process process (state handle attack-info target) object :behavior target)) ;; unconfirmed, target-tube::(event target-tube-start) -;; TODO - for racer-states -(define-extern racer-collision-reaction (function control-info collide-shape-intersect vector vector uint)) -;; TODO -for target2 -(define-extern target-falling-anim-trans (function none :behavior target)) ;; unconfirmed - -(declare-type collide-cache basic) (declare-type snowball-info basic) (declare-type tube-info basic) (declare-type racer-info basic) (declare-type flut-info basic) -(declare-type target process-drawable) -(defun-extern start symbol continue-point target) - -;; NOTE - for logic-target - defined in sidekick (declare-type sidekick process-drawable) -;; NOTE - for target-death -(define-extern start-sequence-a (function none)) ;; not confirmed - ;; DECOMP BEGINS (deftype target (process-drawable) @@ -177,7 +142,7 @@ target-title-wait target-tube (target-tube-death symbol) - (target-tube-hit handle attack-info) + (target-tube-hit symbol attack-info) (target-tube-jump float float) (target-tube-start handle) target-turn-around @@ -214,7 +179,18 @@ (define-perm *sidekick* sidekick #f) -0 + +(defun-extern start symbol continue-point target) +(defun-extern stop symbol int) +(define-extern do-target-shadow (function none :behavior target)) +(define-extern target-joint-pos (function vector)) +(define-extern target-cam-pos (function vector)) +(define-extern target-powerup-process (function none :behavior target)) +(define-extern target-exit (function none :behavior target)) +(define-extern target-generic-event-handler (function process int symbol event-message-block object :behavior target)) +(define-extern init-sidekick (function none :behavior sidekick)) +(define-extern racer-collision-reaction (function control-info collide-shape-intersect vector vector uint)) +(define-extern start-sequence-a (function none)) diff --git a/goal_src/engine/target/target-handler.gc b/goal_src/engine/target/target-handler.gc index b2005cf05e..264777d092 100644 --- a/goal_src/engine/target/target-handler.gc +++ b/goal_src/engine/target/target-handler.gc @@ -47,7 +47,7 @@ (if (!= (pickup-collectable! (-> self fact-info-target) (the-as pickup-type s4-0) - (-> (new 'static 'array float 1 0.0) 0) + (the-as float 0.0) (the-as handle #f) ) (pickup-collectable! (-> self fact-info-target) (the-as pickup-type s4-0) f28-0 (process->handle arg0)) @@ -120,7 +120,7 @@ (pickup-collectable! (-> self fact-info-target) (the-as pickup-type (-> arg3 param 1)) - (-> (new 'static 'array float 1 0.0) 0) + (the-as float 0.0) (the-as handle #f) ) ) @@ -298,7 +298,13 @@ ) ) ((= v1-0 'change-state) - (go (the-as (state object object object object target) (-> arg3 param 0)) (-> arg3 param 1) (-> arg3 param 2) (-> arg3 param 3) (-> arg3 param 4)) + (go + (the-as (state object object object object target) (-> arg3 param 0)) + (-> arg3 param 1) + (-> arg3 param 2) + (-> arg3 param 3) + (-> arg3 param 4) + ) ) ) ) @@ -331,7 +337,7 @@ arg0 ) -(defbehavior target-attacked target ((arg0 symbol) (arg1 attack-info) (arg2 process) (arg3 process) (arg4 (state handle attack-info target))) +(defbehavior target-attacked target ((arg0 symbol) (arg1 attack-info) (arg2 process) (arg3 process) (arg4 (state symbol attack-info target))) (when (zero? (logand (-> self state-flags) 8)) (cond ((or (logtest? (-> self state-flags) 112) @@ -433,7 +439,7 @@ (if (and (= (-> self game mode) 'play) (and (>= 1.0 (-> self fact-info-target health)) (= arg0 'attack))) (logior! (-> self state-flags) #x8000) ) - (go arg4 (the-as handle arg0) (-> self attack-info-rec)) + (go arg4 arg0 (-> self attack-info-rec)) ) ) ) @@ -797,7 +803,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-hit) + target-hit ) ) (('shove) @@ -947,7 +953,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-hit) + target-hit ) ) (else diff --git a/goal_src/engine/target/target.gc b/goal_src/engine/target/target.gc index 4a112bb9dc..4eec87b683 100644 --- a/goal_src/engine/target/target.gc +++ b/goal_src/engine/target/target.gc @@ -9,7 +9,7 @@ (define-extern target-state-hook-exit (function none :behavior target)) (define-extern target-effect-exit (function none :behavior target)) -(define-extern target-post (function none)) +(define-extern target-post (function none :behavior target)) (define-extern target-walk-event-handler (function process int symbol event-message-block object :behavior target)) (define-extern target-land-effect (function none :behavior target)) (define-extern target-dangerous-event-handler (function process int symbol event-message-block object :behavior target)) @@ -1018,7 +1018,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-walk (target) @@ -1583,7 +1583,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-turn-around (target) @@ -1725,7 +1725,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defbehavior init-var-jump target ((arg0 float) (arg1 float) (arg2 vector) (arg3 vector) (arg4 vector)) @@ -2039,7 +2039,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-duck-walk (target) @@ -2160,7 +2160,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-jump (target) @@ -2360,7 +2360,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-jump-forward (target) @@ -2418,7 +2418,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-double-jump (target) @@ -2526,7 +2526,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-high-jump (target) @@ -2621,7 +2621,7 @@ :code (-> target-jump code) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-duck-high-jump (target) @@ -2688,7 +2688,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-duck-high-jump-jump (target) @@ -2798,7 +2798,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-falling (target) @@ -2829,7 +2829,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-hit-ground (target) @@ -2935,7 +2935,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-attack (target) @@ -3005,7 +3005,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-running-attack (target) @@ -3312,7 +3312,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-attack-air (target) @@ -3544,7 +3544,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-attack-uppercut (target) @@ -3593,7 +3593,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-attack-uppercut-jump (target) @@ -3704,7 +3704,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-flop (target) @@ -4022,7 +4022,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-flop-hit-ground (target) @@ -4105,7 +4105,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-wheel (target) @@ -4243,7 +4243,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-wheel-flip (target) @@ -4426,7 +4426,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/goal_src/engine/target/target2.gc b/goal_src/engine/target/target2.gc index 608a2f7168..e0e31f8c38 100644 --- a/goal_src/engine/target/target2.gc +++ b/goal_src/engine/target/target2.gc @@ -209,7 +209,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (deftype first-person-hud (process) @@ -529,7 +529,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-look-around (target) @@ -1393,7 +1393,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-pole-flip-forward (target) @@ -1458,7 +1458,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-edge-grab (target) @@ -1899,7 +1899,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (define *yellow-jump-mods* (new 'static 'surface @@ -2147,7 +2147,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-wade-stance (target) @@ -2211,7 +2211,7 @@ :code (-> target-stance code) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-wade-walk (target) @@ -2504,7 +2504,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defbehavior target-swim-tilt target ((arg0 float) (arg1 float) (arg2 float) (arg3 float)) @@ -3253,7 +3253,7 @@ :code (-> target-jump code) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-swim-jump (target) diff --git a/goal_src/goal-lib.gc b/goal_src/goal-lib.gc index 6e24346ad0..728c2566fa 100644 --- a/goal_src/goal-lib.gc +++ b/goal_src/goal-lib.gc @@ -772,6 +772,10 @@ `(car (cdr (cdr (cdr ,arg)))) ) +(defmacro caddddr (arg) + `(car (cdr (cdr (cdr (cdr ,arg))))) + ) + (defmacro dcons (a b) `(new 'debug 'pair ,a ,b) ) @@ -944,6 +948,22 @@ ) ) +(defmacro doenum (bindings &rest body) + "run body while iterating through an enum. + WARNING: enums are NOT A RUNTIME TYPE! There is an UNWOUND loop with body in it!! Use with caution." + ;; (doenum (name-var val-var enum &rest result) &rest body) + + `(begin ,@(apply (lambda (x) + ;; (fmt #t "{}\n" x) + `(let ( + (,(first bindings) ,(symbol->string (car x))) ;; name + (,(second bindings) ,(cdr x)) ;; value + ) + ,@body + )) (get-enum-vals (third bindings)))) + + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; float macros ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; diff --git a/goal_src/kernel-defs.gc b/goal_src/kernel-defs.gc index 074df3a928..6f8d16a942 100644 --- a/goal_src/kernel-defs.gc +++ b/goal_src/kernel-defs.gc @@ -312,6 +312,13 @@ (tie3 2) (invalid)) +(defenum pc-collision-mode + (none 0) + (mode 1) + (event 2) + (material 3) + (skip 4)) + (define-extern __read-ee-timer (function uint)) (define-extern __mem-move (function pointer pointer uint none)) (define-extern __send-gfx-dma-chain (function object object none)) @@ -332,9 +339,14 @@ (define-extern pc-get-window-size (function (pointer int32) (pointer int32) none)) (define-extern pc-get-window-scale (function (pointer float) (pointer float) none)) (define-extern pc-set-window-size (function int int none)) -(define-extern pc-set-letterbox (function int int none)) (define-extern pc-set-fullscreen (function symbol int none)) (define-extern pc-renderer-tree-set-lod (function pc-renderer-tree-type int none)) +(define-extern pc-set-letterbox (function int int none)) +(define-extern pc-set-collision (function symbol none)) +(define-extern pc-set-collision-wireframe (function symbol none)) +(define-extern pc-get-collision-mask (function pc-collision-mode int symbol)) +(define-extern pc-set-collision-mask (function pc-collision-mode int symbol none)) +(define-extern pc-set-collision-mode (function pc-collision-mode none)) (define-extern pc-discord-rpc-update (function discord-info none)) (define-extern pc-discord-rpc-set (function int none)) (define-extern pc-filepath-exists? (function string symbol)) diff --git a/goal_src/levels/flut_common/target-flut.gc b/goal_src/levels/flut_common/target-flut.gc index 2f38a57e99..9ee772d14c 100644 --- a/goal_src/levels/flut_common/target-flut.gc +++ b/goal_src/levels/flut_common/target-flut.gc @@ -380,7 +380,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-flut-hit) + target-flut-hit ) ) (('shove) @@ -465,7 +465,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-flut-hit) + target-flut-hit ) ) (else @@ -616,7 +616,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-flut-stance (target) @@ -2664,7 +2664,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-flut-grab (target) diff --git a/goal_src/levels/jungle/fisher.gc b/goal_src/levels/jungle/fisher.gc index 9e7d3ebff2..52c6df183e 100644 --- a/goal_src/levels/jungle/fisher.gc +++ b/goal_src/levels/jungle/fisher.gc @@ -2346,7 +2346,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/goal_src/levels/racer_common/collide-reaction-racer.gc b/goal_src/levels/racer_common/collide-reaction-racer.gc index 3560ba6d2e..27fb24efd3 100644 --- a/goal_src/levels/racer_common/collide-reaction-racer.gc +++ b/goal_src/levels/racer_common/collide-reaction-racer.gc @@ -113,7 +113,7 @@ (set! (-> arg0 cur-pat mode) 1) (set! (-> arg0 unknown-vector70 quad) (-> arg1 best-tri intersect quad)) (set! (-> arg0 unknown-vector71 quad) (-> arg0 poly-normal quad)) - (set! (-> arg0 unknown-int60) (the-as uint (-> arg1 best-tri pat))) + (set! (-> arg0 wall-pat) (-> arg1 best-tri pat)) (vector-reflect-flat-above! arg2 (-> sv-88 0) sv-84) (cond ((not diff --git a/goal_src/levels/racer_common/racer-states.gc b/goal_src/levels/racer_common/racer-states.gc index ac7b43c374..f4138010ec 100644 --- a/goal_src/levels/racer_common/racer-states.gc +++ b/goal_src/levels/racer_common/racer-states.gc @@ -42,7 +42,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - target-racing-hit + (the-as (state symbol attack-info target) target-racing-hit) ) ) ) @@ -320,7 +320,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defbehavior target-racing-smack-check target () diff --git a/goal_src/levels/racer_common/target-racer.gc b/goal_src/levels/racer_common/target-racer.gc index 47e7993148..fdf5fe7f00 100644 --- a/goal_src/levels/racer_common/target-racer.gc +++ b/goal_src/levels/racer_common/target-racer.gc @@ -957,10 +957,10 @@ ) (when (logtest? (-> self control status) 8) (let* ((gp-8 (racer-find-prop-point (new 'stack-no-clear 'vector) (-> self control unknown-vector70))) - (v1-274 (shr (shl (-> self control unknown-int60) 52) 58)) + (v1-274 (-> self control wall-pat material)) (a1-54 (cond - ((or (= v1-274 16) (= v1-274 8)) + ((or (= v1-274 (pat-material metal)) (= v1-274 (pat-material pcmetal))) (set! (-> *part-id-table* 2226 init-specs 1 initial-valuef) (lerp-scale 0.2 10.0 (-> self control unknown-float01) 0.0 (-> self racer transv-max)) ) @@ -986,7 +986,7 @@ ) (cpad-set-buzz! (-> *cpad-list* cpads 0) 0 51 (seconds 0.05)) (sound-play-by-name - (sound-name-with-material 'zoom-hit (the-as pat-surface (-> self control unknown-int60)) "") + (sound-name-with-material 'zoom-hit (-> self control wall-pat) "") (-> self racer scrape-sound-id) 1024 0 diff --git a/goal_src/levels/snow/target-ice.gc b/goal_src/levels/snow/target-ice.gc index 8b9fc4f15f..92d6aee3b1 100644 --- a/goal_src/levels/snow/target-ice.gc +++ b/goal_src/levels/snow/target-ice.gc @@ -313,7 +313,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-ice-walk (target) @@ -536,7 +536,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/goal_src/levels/snow/target-snowball.gc b/goal_src/levels/snow/target-snowball.gc index 2c19cb557e..2a77c26627 100644 --- a/goal_src/levels/snow/target-snowball.gc +++ b/goal_src/levels/snow/target-snowball.gc @@ -122,7 +122,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-snowball (target) diff --git a/goal_src/levels/sunken/target-tube.gc b/goal_src/levels/sunken/target-tube.gc index 6b2052b2c4..a2d65d56c4 100644 --- a/goal_src/levels/sunken/target-tube.gc +++ b/goal_src/levels/sunken/target-tube.gc @@ -541,7 +541,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defbehavior target-tube-turn-anim target () @@ -759,7 +759,7 @@ :event (-> target-tube-start event) :enter - (behavior ((arg0 handle) (arg1 attack-info)) + (behavior ((arg0 symbol) (arg1 attack-info)) (send-event (handle->process (-> self tube tube)) 'update @@ -780,7 +780,7 @@ (none) ) :code - (behavior ((arg0 handle) (arg1 attack-info)) + (behavior ((arg0 symbol) (arg1 attack-info)) (let ((gp-0 (-> self attack-info))) (set! (-> self state-time) (-> *display* base-frame-counter)) (logior! (-> self state-flags) 8) @@ -870,7 +870,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) (defstate target-tube-death (target) diff --git a/goal_src/pc/pckernel.gc b/goal_src/pc/pckernel.gc index 78b4c9b45f..2cc6d28870 100644 --- a/goal_src/pc/pckernel.gc +++ b/goal_src/pc/pckernel.gc @@ -23,6 +23,28 @@ |# +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;;; global variables +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; collision renderer things. debug only. +(define *collision-renderer* #f) +(define *collision-wireframe* #f) +(define *collision-mode* (pc-collision-mode mode)) + +(defenum pc-pat-skip-hack + :bitfield #t + (noentity 0) + (nocamera 1) + (noedge 2) + (nolineofsight 12) + (unknowncamera 13) + (unknown 15) + ) + + + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; updates ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -76,7 +98,7 @@ (none)) (defmethod update-from-os pc-settings ((obj pc-settings)) - "Update settings from the PC kernel to GOAL." + "Update settings from the C kernel to GOAL." (set! (-> obj os) (pc-get-os)) (pc-get-window-size (&-> obj win-width) (&-> obj win-height)) @@ -120,7 +142,7 @@ (none)) (defmethod update-to-os pc-settings ((obj pc-settings)) - "Update settings from GOAL to the PC kernel." + "Update settings from GOAL to the C kernel." (cond ((-> obj letterbox?) @@ -139,7 +161,11 @@ (pc-renderer-tree-set-lod (pc-renderer-tree-type tie3) (-> obj lod-force-tie)) ) - ;; TODO - save changes + (when *debug-segment* + (pc-set-collision *collision-renderer*) + (pc-set-collision-wireframe *collision-wireframe*) + (pc-set-collision-mode *collision-mode*) + ) (none)) diff --git a/test/decompiler/reference/engine/collide/collide-target-h_REF.gc b/test/decompiler/reference/engine/collide/collide-target-h_REF.gc index cd0ac9f788..81e5e6f2cd 100644 --- a/test/decompiler/reference/engine/collide/collide-target-h_REF.gc +++ b/test/decompiler/reference/engine/collide/collide-target-h_REF.gc @@ -192,7 +192,7 @@ (unknown-vector120 vector :inline :offset 18928) (unknown-float150 float :offset 18944) (unknown-vector121 vector :inline :offset 18960) - (unknown-int60 uint32 :offset 18976) + (wall-pat pat-surface :offset 18976) (unknown-soundid00 sound-id :offset 18980) (unknown-float141 float :offset 18984) ) diff --git a/test/decompiler/reference/engine/gfx/hw/vu1-user-h_REF.gc b/test/decompiler/reference/engine/gfx/hw/vu1-user-h_REF.gc index e4261bbd0c..9635597185 100644 --- a/test/decompiler/reference/engine/gfx/hw/vu1-user-h_REF.gc +++ b/test/decompiler/reference/engine/gfx/hw/vu1-user-h_REF.gc @@ -15,7 +15,7 @@ shrub-near billboard trans-shrubbery - trans-frag + trans-tfrag sprite shadow depth-cue diff --git a/test/decompiler/reference/engine/gfx/tfrag/tfrag-methods_REF.gc b/test/decompiler/reference/engine/gfx/tfrag/tfrag-methods_REF.gc index ec4f991765..760a484ebb 100644 --- a/test/decompiler/reference/engine/gfx/tfrag/tfrag-methods_REF.gc +++ b/test/decompiler/reference/engine/gfx/tfrag/tfrag-methods_REF.gc @@ -284,7 +284,7 @@ ;; WARN: Unsupported inline assembly instruction kind - [mfpc a0, pcr1] (defun draw-drawable-tree-trans-tfrag ((arg0 drawable-tree-trans-tfrag)) (local-vars (a0-18 int) (a0-20 int) (a0-35 int) (a0-37 int) (sv-16 (pointer uint8))) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) (when (nonzero? s5-0) (dotimes (s4-0 s5-0) @@ -497,7 +497,7 @@ ;; WARN: Unsupported inline assembly instruction kind - [mfpc a0, pcr1] (defun draw-drawable-tree-dirt-tfrag ((arg0 drawable-tree-dirt-tfrag)) (local-vars (a0-18 int) (a0-20 int) (a0-35 int) (a0-37 int) (sv-16 (pointer uint8))) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) (when (nonzero? s5-0) (dotimes (s4-0 s5-0) @@ -692,7 +692,7 @@ ;; WARN: Unsupported inline assembly instruction kind - [mfpc a0, pcr1] (defun draw-drawable-tree-ice-tfrag ((arg0 drawable-tree-ice-tfrag)) (local-vars (a0-18 int) (a0-20 int) (a0-35 int) (a0-37 int) (sv-16 (pointer uint8))) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (let ((s5-0 (+ (-> arg0 length) -1))) (when (nonzero? s5-0) (dotimes (s4-0 s5-0) @@ -993,12 +993,12 @@ ;; INFO: Return type mismatch drawable-tree-trans-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-trans-tfrag ((obj drawable-tree-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (set! (-> *tfrag-work* vu1-enable-tfrag) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* vu1-enable-tfrag-near) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) @@ -1016,12 +1016,12 @@ ;; INFO: Return type mismatch drawable-tree-lowres-trans-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-lowres-trans-tfrag ((obj drawable-tree-lowres-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (set! (-> *tfrag-work* vu1-enable-tfrag) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* vu1-enable-tfrag-near) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) @@ -1039,12 +1039,12 @@ ;; INFO: Return type mismatch drawable-tree-dirt-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-dirt-tfrag ((obj drawable-tree-dirt-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (set! (-> *tfrag-work* vu1-enable-tfrag) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* vu1-enable-tfrag-near) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) @@ -1062,12 +1062,12 @@ ;; INFO: Return type mismatch drawable-tree-ice-tfrag vs none. ;; Used lq/sq (defmethod collect-stats drawable-tree-ice-tfrag ((obj drawable-tree-ice-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (set! (-> *tfrag-work* vu1-enable-tfrag) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* vu1-enable-tfrag-near) - (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-frag))) + (the-as int (logand *vu1-enable-user* (vu1-renderer-mask trans-tfrag))) ) (set! (-> *tfrag-work* tr-stat-tfrag) (-> *terrain-stats* trans-tfrag)) (set! (-> *tfrag-work* tr-stat-tfrag-near) (-> *terrain-stats* trans-tfrag-near)) @@ -1099,7 +1099,7 @@ ;; definition for method 14 of type drawable-inline-array-trans-tfrag ;; INFO: Return type mismatch drawable-inline-array-trans-tfrag vs none. (defmethod collect-stats drawable-inline-array-trans-tfrag ((obj drawable-inline-array-trans-tfrag)) - (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-frag)) + (when (logtest? *vu1-enable-user* (vu1-renderer-mask trans-tfrag)) (dotimes (s5-0 (-> obj length)) (let ((s4-0 (-> obj data s5-0))) (if (vis-cull (-> s4-0 id)) diff --git a/test/decompiler/reference/engine/target/logic-target_REF.gc b/test/decompiler/reference/engine/target/logic-target_REF.gc index c742e7d50a..19092c75ca 100644 --- a/test/decompiler/reference/engine/target/logic-target_REF.gc +++ b/test/decompiler/reference/engine/target/logic-target_REF.gc @@ -306,11 +306,11 @@ (let ((s4-2 format) (s3-2 arg1) (s2-2 "~0kwall:~6X mode:~-8S material:~-10S event:~S~%") - (s1-2 (-> arg0 control unknown-int60)) - (s0-2 (pat-mode->string (the-as pat-surface (-> arg0 control unknown-int60)))) + (s1-2 (-> arg0 control wall-pat)) + (s0-2 (pat-mode->string (-> arg0 control wall-pat))) ) - (set! sv-96 (pat-material->string (the-as pat-surface (-> arg0 control unknown-int60)))) - (let ((t1-2 (pat-event->string (the-as pat-surface (-> arg0 control unknown-int60))))) + (set! sv-96 (pat-material->string (-> arg0 control wall-pat))) + (let ((t1-2 (pat-event->string (-> arg0 control wall-pat)))) (s4-2 s3-2 s2-2 s1-2 s0-2 sv-96 t1-2) ) ) @@ -1672,7 +1672,7 @@ ) ;; definition for function target-post -(defun target-post () +(defbehavior target-post target () (target-real-post) (none) ) diff --git a/test/decompiler/reference/engine/target/target-death_REF.gc b/test/decompiler/reference/engine/target/target-death_REF.gc index 0eaad026b4..34dd8dcd1e 100644 --- a/test/decompiler/reference/engine/target/target-death_REF.gc +++ b/test/decompiler/reference/engine/target/target-death_REF.gc @@ -1094,7 +1094,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for symbol *death-spool-array*, type (array spool-anim) diff --git a/test/decompiler/reference/engine/target/target-h_REF.gc b/test/decompiler/reference/engine/target/target-h_REF.gc index 150ff9f9a5..45fec658fa 100644 --- a/test/decompiler/reference/engine/target/target-h_REF.gc +++ b/test/decompiler/reference/engine/target/target-h_REF.gc @@ -131,7 +131,7 @@ target-title-wait target-tube (target-tube-death symbol) - (target-tube-hit handle attack-info) + (target-tube-hit symbol attack-info) (target-tube-jump float float) (target-tube-start handle) target-turn-around diff --git a/test/decompiler/reference/engine/target/target-handler_REF.gc b/test/decompiler/reference/engine/target/target-handler_REF.gc index 84aff6e688..dca48992fd 100644 --- a/test/decompiler/reference/engine/target/target-handler_REF.gc +++ b/test/decompiler/reference/engine/target/target-handler_REF.gc @@ -336,7 +336,7 @@ ) ;; definition for function target-attacked -(defbehavior target-attacked target ((arg0 symbol) (arg1 attack-info) (arg2 process) (arg3 process) (arg4 (state handle attack-info target))) +(defbehavior target-attacked target ((arg0 symbol) (arg1 attack-info) (arg2 process) (arg3 process) (arg4 (state symbol attack-info target))) (when (zero? (logand (-> self state-flags) 8)) (cond ((or (logtest? (-> self state-flags) 112) @@ -438,7 +438,7 @@ (if (and (= (-> self game mode) 'play) (and (>= 1.0 (-> self fact-info-target health)) (= arg0 'attack))) (logior! (-> self state-flags) #x8000) ) - (go arg4 (the-as handle arg0) (-> self attack-info-rec)) + (go arg4 arg0 (-> self attack-info-rec)) ) ) ) @@ -807,7 +807,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-hit) + target-hit ) ) (('shove) @@ -958,7 +958,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-hit) + target-hit ) ) (else diff --git a/test/decompiler/reference/engine/target/target2_REF.gc b/test/decompiler/reference/engine/target/target2_REF.gc index b90c14bd67..1aaa26b352 100644 --- a/test/decompiler/reference/engine/target/target2_REF.gc +++ b/test/decompiler/reference/engine/target/target2_REF.gc @@ -201,7 +201,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition of type first-person-hud @@ -556,7 +556,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -1426,7 +1426,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -1493,7 +1493,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -1938,7 +1938,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for symbol *yellow-jump-mods*, type surface @@ -2189,7 +2189,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2254,7 +2254,7 @@ :code (-> target-stance code) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2548,7 +2548,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for function target-swim-tilt @@ -3303,7 +3303,7 @@ :code (-> target-jump code) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: diff --git a/test/decompiler/reference/engine/target/target_REF.gc b/test/decompiler/reference/engine/target/target_REF.gc index f883b426f8..3994a2df1e 100644 --- a/test/decompiler/reference/engine/target/target_REF.gc +++ b/test/decompiler/reference/engine/target/target_REF.gc @@ -1008,7 +1008,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -1574,7 +1574,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -1718,7 +1718,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for function init-var-jump @@ -2037,7 +2037,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2159,7 +2159,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2360,7 +2360,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2419,7 +2419,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2528,7 +2528,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2624,7 +2624,7 @@ :code (-> target-jump code) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2692,7 +2692,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2803,7 +2803,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2835,7 +2835,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2942,7 +2942,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -3013,7 +3013,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -3321,7 +3321,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -3554,7 +3554,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -3604,7 +3604,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -3716,7 +3716,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -4035,7 +4035,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -4119,7 +4119,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -4258,7 +4258,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -4442,5 +4442,5 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/test/decompiler/reference/levels/flut_common/target-flut_REF.gc b/test/decompiler/reference/levels/flut_common/target-flut_REF.gc index 67a9081976..5752f7e8a1 100644 --- a/test/decompiler/reference/levels/flut_common/target-flut_REF.gc +++ b/test/decompiler/reference/levels/flut_common/target-flut_REF.gc @@ -414,7 +414,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-flut-hit) + target-flut-hit ) ) (('shove) @@ -500,7 +500,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - (the-as (state handle attack-info target) target-flut-hit) + target-flut-hit ) ) (else @@ -652,7 +652,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -2715,7 +2715,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: diff --git a/test/decompiler/reference/levels/jungle/fisher_REF.gc b/test/decompiler/reference/levels/jungle/fisher_REF.gc index 7994410cac..7d664a901f 100644 --- a/test/decompiler/reference/levels/jungle/fisher_REF.gc +++ b/test/decompiler/reference/levels/jungle/fisher_REF.gc @@ -2463,5 +2463,5 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/test/decompiler/reference/levels/racer_common/collide-reaction-racer_REF.gc b/test/decompiler/reference/levels/racer_common/collide-reaction-racer_REF.gc index d31c97d269..41f5e3539c 100644 --- a/test/decompiler/reference/levels/racer_common/collide-reaction-racer_REF.gc +++ b/test/decompiler/reference/levels/racer_common/collide-reaction-racer_REF.gc @@ -110,7 +110,7 @@ (set! (-> arg0 cur-pat mode) 1) (set! (-> arg0 unknown-vector70 quad) (-> arg1 best-tri intersect quad)) (set! (-> arg0 unknown-vector71 quad) (-> arg0 poly-normal quad)) - (set! (-> arg0 unknown-int60) (the-as uint (-> arg1 best-tri pat))) + (set! (-> arg0 wall-pat) (-> arg1 best-tri pat)) (vector-reflect-flat-above! arg2 (-> sv-88 0) sv-84) (cond ((not diff --git a/test/decompiler/reference/levels/racer_common/racer-states_REF.gc b/test/decompiler/reference/levels/racer_common/racer-states_REF.gc index 4e9019fe92..e8df1cd127 100644 --- a/test/decompiler/reference/levels/racer_common/racer-states_REF.gc +++ b/test/decompiler/reference/levels/racer_common/racer-states_REF.gc @@ -35,7 +35,7 @@ (the-as attack-info (-> arg3 param 1)) arg0 (the-as process (-> arg3 param 0)) - target-racing-hit + (the-as (state symbol attack-info target) target-racing-hit) ) ) ) @@ -313,7 +313,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for function target-racing-smack-check diff --git a/test/decompiler/reference/levels/racer_common/target-racer_REF.gc b/test/decompiler/reference/levels/racer_common/target-racer_REF.gc index 87bc1a8a13..d701613932 100644 --- a/test/decompiler/reference/levels/racer_common/target-racer_REF.gc +++ b/test/decompiler/reference/levels/racer_common/target-racer_REF.gc @@ -980,10 +980,10 @@ ) (when (logtest? (-> self control status) 8) (let* ((gp-8 (racer-find-prop-point (new 'stack-no-clear 'vector) (-> self control unknown-vector70))) - (v1-274 (shr (shl (-> self control unknown-int60) 52) 58)) + (v1-274 (-> self control wall-pat material)) (a1-54 (cond - ((or (= v1-274 16) (= v1-274 8)) + ((or (= v1-274 (pat-material metal)) (= v1-274 (pat-material pcmetal))) (set! (-> *part-id-table* 2226 init-specs 1 initial-valuef) (lerp-scale 0.2 10.0 (-> self control unknown-float01) 0.0 (-> self racer transv-max)) ) @@ -1009,7 +1009,7 @@ ) (cpad-set-buzz! (-> *cpad-list* cpads 0) 0 51 (seconds 0.05)) (sound-play-by-name - (sound-name-with-material 'zoom-hit (the-as pat-surface (-> self control unknown-int60)) "") + (sound-name-with-material 'zoom-hit (-> self control wall-pat) "") (-> self racer scrape-sound-id) 1024 0 diff --git a/test/decompiler/reference/levels/snow/target-ice_REF.gc b/test/decompiler/reference/levels/snow/target-ice_REF.gc index f8cd5818d8..f5f838daaf 100644 --- a/test/decompiler/reference/levels/snow/target-ice_REF.gc +++ b/test/decompiler/reference/levels/snow/target-ice_REF.gc @@ -308,7 +308,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: @@ -532,5 +532,5 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) diff --git a/test/decompiler/reference/levels/snow/target-snowball_REF.gc b/test/decompiler/reference/levels/snow/target-snowball_REF.gc index e375917475..d7f2eeb682 100644 --- a/test/decompiler/reference/levels/snow/target-snowball_REF.gc +++ b/test/decompiler/reference/levels/snow/target-snowball_REF.gc @@ -132,7 +132,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: diff --git a/test/decompiler/reference/levels/sunken/target-tube_REF.gc b/test/decompiler/reference/levels/sunken/target-tube_REF.gc index ca020148ce..5754b81a80 100644 --- a/test/decompiler/reference/levels/sunken/target-tube_REF.gc +++ b/test/decompiler/reference/levels/sunken/target-tube_REF.gc @@ -572,7 +572,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; definition for function target-tube-turn-anim @@ -795,7 +795,7 @@ :event (-> target-tube-start event) :enter - (behavior ((arg0 handle) (arg1 attack-info)) + (behavior ((arg0 symbol) (arg1 attack-info)) (send-event (handle->process (-> self tube tube)) 'update @@ -816,7 +816,7 @@ (none) ) :code - (behavior ((arg0 handle) (arg1 attack-info)) + (behavior ((arg0 symbol) (arg1 attack-info)) (let ((gp-0 (-> self attack-info))) (set! (-> self state-time) (-> *display* base-frame-counter)) (logior! (-> self state-flags) 8) @@ -906,7 +906,7 @@ (none) ) :post - (the-as (function none :behavior target) target-post) + target-post ) ;; failed to figure out what this is: