diff --git a/scripts/update-file-progress.py b/.github/scripts/update-file-progress.py similarity index 70% rename from scripts/update-file-progress.py rename to .github/scripts/update-file-progress.py index b4492c773f..cbdb3b15f7 100644 --- a/scripts/update-file-progress.py +++ b/.github/scripts/update-file-progress.py @@ -1,7 +1,6 @@ import glob src_files = glob.glob("./goal_src/**/*.g[cs]", recursive=True) -data_files = glob.glob("./goal_src/**/*.gd", recursive=True) # Find how many of each have been started @@ -20,12 +19,6 @@ for f in src_files: else: src_files_started = src_files_started + 1 -for f in data_files: - with open(f, "r") as temp_file: - line_count = len(temp_file.readlines()) - if line_count > 7: - data_files_started = data_files_started + 1 - import json with open('./docs/gh-pages-proj/src/config/progress.json', 'r+', encoding='utf-8') as f: data = { @@ -33,9 +26,7 @@ with open('./docs/gh-pages-proj/src/config/progress.json', 'r+', encoding='utf-8 'fileProgress': { 'src_files_total': len(src_files), 'src_files_finished': src_files_finished, - 'src_files_started': src_files_started, - 'data_files_total': len(data_files), - 'data_files_started': data_files_started + 'src_files_started': src_files_started } } } diff --git a/.github/scripts/update-gallery.py b/.github/scripts/update-gallery.py new file mode 100644 index 0000000000..c6bc332feb --- /dev/null +++ b/.github/scripts/update-gallery.py @@ -0,0 +1,63 @@ +import glob +import os +from pathlib import Path +import json + +galleryLinks = { + 'jak1': { + 'name': "Jak 1", + 'media': [], + }, + 'jak2': { + 'name': "Jak 2", + 'media': [], + }, + 'jak3': { + 'name': "Jak 3", + 'media': [], + }, + 'jakx': { + 'name': "Jak X", + 'media': [], + }, + 'misc': { + 'name': "Miscellaneous", + 'media': [], + } +} + +def get_links(key, folder_to_search): + if os.path.isdir(folder_to_search): + files = glob.glob(folder_to_search + "/*.png", recursive=True) + files.extend(glob.glob(folder_to_search + "/*.jpg", recursive=True)) + files.extend(glob.glob(folder_to_search + "/*.jpeg", recursive=True)) + for f in files: + galleryLinks[key]["media"].append({ + 'fileName': os.path.basename(f), + 'timestamp': Path(f).stem.split("_")[1], + 'caption': Path(f).stem.split("_")[0].replace("-", " ").title(), + 'video': False + }) + # get videos potentially + if os.path.exists("{}/videos.json".format(folder_to_search)): + with open("{}/videos.json".format(folder_to_search), 'r') as f: + data = json.load(f) + for video in data: + galleryLinks[key]["media"].append({ + 'link': video["link"].replace("watch?v=", "embed/"), + 'timestamp': video["timestamp"], + 'video': True + }) + # sort by timestamp + galleryLinks[key]["media"].sort(key=lambda x: x["timestamp"], reverse=True) + +get_links('jak1', './docs/gh-pages-proj/src/assets/gallery/jak1') +get_links('jak2', './docs/gh-pages-proj/src/assets/gallery/jak2') +get_links('jak3', './docs/gh-pages-proj/src/assets/gallery/jak3') +get_links('jakx', './docs/gh-pages-proj/src/assets/gallery/jakx') +get_links('misc', './docs/gh-pages-proj/src/assets/gallery/misc') + +with open('./docs/gh-pages-proj/src/config/gallery.json', 'r+', encoding='utf-8') as f: + f.seek(0) + json.dump(galleryLinks, f, ensure_ascii=False, indent=2) + f.truncate() diff --git a/.github/workflows/build-doc-app.yaml b/.github/workflows/build-doc-app.yaml index 5e33b79828..f361a44259 100644 --- a/.github/workflows/build-doc-app.yaml +++ b/.github/workflows/build-doc-app.yaml @@ -21,7 +21,10 @@ jobs: uses: actions/checkout@v2 - name: Update Line Count - run: python ./scripts/update-file-progress.py + run: python ./.github/scripts/update-file-progress.py + + - name: Update Gallery Links + run: python ./.github/scripts/update-gallery.py - name: Update Site run: | diff --git a/.github/workflows/windows-workflow.yaml b/.github/workflows/windows-workflow.yaml index b6e36d381b..f5da63552e 100644 --- a/.github/workflows/windows-workflow.yaml +++ b/.github/workflows/windows-workflow.yaml @@ -48,7 +48,7 @@ jobs: run: git submodule update --init --recursive -j 2 - name: Install Dependencies - run: choco install nasm + run: Choco-Install -PackageName nasm - name: Setup Buildcache uses: mikehardy/buildcache-action@v1.2.2 diff --git a/.gitignore b/.gitignore index c5ce8c560b..76c0d4785f 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ gfx_dumps/* # game stuff game_config/* imgui.ini + +# website stuff +node_modules/ diff --git a/.vscode/settings.json b/.vscode/settings.json index 69a3110e63..08ff5ce5e2 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -48,13 +48,31 @@ } ] }, + "(lwu .., 4\\(..\\).*)(dma-buffer)": { + "filterFileRegex": ".*ir2\\.asm", + "decorations": [ + {}, + { + "overviewRulerColor": "transparent", + "color": "red" + } + ] + }, + "(\\d+\\(sp\\))": { + "filterFileRegex": ".*ir2\\.asm", + "decorations": [ + { + "overviewRulerColor": "transparent", + "color": "#00ff08" + } + ] + }, "(sp, -?\\d+ )": { "filterFileRegex": ".*ir2\\.asm", "decorations": [ { "overviewRulerColor": "transparent", - "color": "#00ff08", - "fontWeight": "bold" + "color": "#00ff08" } ] }, @@ -272,7 +290,18 @@ } ] }, - "(WARN:.*)": { + "(WARN: Unsupported.*)": { + "filterFileRegex": ".*ir2\\.asm", + "decorations": [ + { + "overviewRulerColor": "#ea00ff", + "color": "#ea00ff", + "fontWeight": "bold", + "filterFileRegex": ".*ir2\\.asm" + } + ] + }, + "(WARN: (?!Unsupported).*)": { "filterFileRegex": ".*ir2\\.asm", "decorations": [ { diff --git a/README.md b/README.md index eb13621d99..04acb53d07 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Coverage Status Codacy Badge Discord + PRs

## Table of Contents @@ -17,15 +18,20 @@ - [Table of Contents](#table-of-contents) - [Project Description](#project-description) +- [Current Status](#current-status) +- [What's Next](#whats-next) - [Getting Started - Linux (Ubuntu)](#getting-started---linux-ubuntu) - [Getting Started - Linux (Arch)](#getting-started---linux-arch) - [Getting Started - Nixpkgs](#getting-started---nixpkgs) - [Getting Started - Windows](#getting-started---windows) +- [Building and Running the Game](#building-and-running-the-game) + - [Extract Assets](#extract-assets) + - [Build Game](#build-game) + - [Run Game](#run-game) - [Project Layout](#project-layout) - [Directory Layout](#directory-layout) -- [More Documentation](#more-documentation) -- [ASan Build](#asan-build) - - [On Windows / Visual Studio](#on-windows--visual-studio) + - [On Windows / Visual Studio](#on-windows--visual-studio) + ## Project Description @@ -44,6 +50,8 @@ Our objectives are: We support both Linux and Windows on x86-64. +We have a Discord server where we discuss development. https://discord.gg/BVEHQmm8 + ## Current Status So far, we've decompiled around 341,233 lines of GOAL code, out of an estimated 500,000 total lines and we've started work on an OpenGL renderer. Currently, the main display process (`*dproc*`) runs and sends data to our renderer. We can load textures, text files, and level files. Using keyboard controls, we can open the debug menu and turn on some simple debug visualizations. @@ -138,14 +146,16 @@ nix-build -A packages.x86_64-linux.jak-asan # package with Clang ASan build ## Getting Started - Windows -Install Visual Studio 2019 and get the C++ and CMake tools via the Visual Studio Installer +Install Visual Studio 2022 and get the `Desktop development with C++` workload during the installation process. + +> if you already have visual studio and don't have this installed - open your `Visual Studio Installer` and modify the installation On Windows, it's recommended to get Scoop to use as a package manager, making the follow steps _much_ easier. Follow the steps on the bottom of the homepage here https://scoop.sh/ Once Scoop is installed, run the following command: -```ps1 -scoop install llvm nasm +```sh +scoop install git llvm nasm ``` Initialize the repository's third-party dependencies: @@ -154,17 +164,13 @@ Initialize the repository's third-party dependencies: git submodule update --init --recursive ``` -Open the project as a CMake project, browse for the root level `CMakeLists.txt`: +Open the project as a CMake project. -![](./docs/markdown/imgs/open-cmake-vs.png) +![](./docs/markdown/imgs/windows/open-project.png) -In the toolbar, you should be able to select an individual component to compile, or combine within the root CMakeLists.txt. In the future we will pre-define configurations to make this easier. +Then build the entire project -![](./docs/markdown/imgs/cmake-build-vs.png) - -You may also wish to view the files that pertain to each CMake target, rather than the project as it is normally: - -![](./docs/markdown/imgs/cmake-target-view.png) +![](./docs/markdown/imgs/windows/build-all.png) ## Building and Running the Game @@ -200,7 +206,7 @@ gc> (test-play) (play :use-vis #t :init-game #f) has been called! 0 #x0 0.0000 0 -gc> +gc> ``` Then, in the graphics window, you can use the period key to bring up the debug menu. Controllers also work, using the same mapping as the original game. diff --git a/Taskfile.yml b/Taskfile.yml index a6f5c6a09c..229c5d42d0 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -9,7 +9,7 @@ tasks: ignore_error: true run-game: cmds: - - ./out/build/Release/bin/gk.exe -fakeiso -debug + - ./out/build/Release/bin/gk.exe -fakeiso -debug -v run-game-headless: cmds: - ./out/build/Release/bin/gk.exe -fakeiso -debug -nodisplay diff --git a/common/custom_data/TFrag3Data.cpp b/common/custom_data/TFrag3Data.cpp index 78fcfafa8b..b7f004021f 100644 --- a/common/custom_data/TFrag3Data.cpp +++ b/common/custom_data/TFrag3Data.cpp @@ -11,6 +11,20 @@ void StripDraw::serialize(Serializer& ser) { ser.from_ptr(&num_triangles); } +void InstancedStripDraw::serialize(Serializer& ser) { + ser.from_ptr(&mode); + ser.from_ptr(&tree_tex_id); + ser.from_pod_vector(&vertex_index_stream); + ser.from_pod_vector(&instance_groups); + ser.from_ptr(&num_triangles); +} + +void TieWindInstance::serialize(Serializer& ser) { + ser.from_ptr(&matrix); + ser.from_ptr(&wind_idx); + ser.from_ptr(&stiffness); +} + void TfragTree::serialize(Serializer& ser) { ser.from_ptr(&kind); @@ -38,6 +52,24 @@ void TieTree::serialize(Serializer& ser) { draw.serialize(ser); } + if (ser.is_saving()) { + ser.save(instanced_wind_draws.size()); + } else { + instanced_wind_draws.resize(ser.load()); + } + for (auto& draw : instanced_wind_draws) { + draw.serialize(ser); + } + + if (ser.is_saving()) { + ser.save(instance_info.size()); + } else { + instance_info.resize(ser.load()); + } + for (auto& inst : instance_info) { + inst.serialize(ser); + } + ser.from_pod_vector(&vertices); ser.from_pod_vector(&colors); bvh.serialize(ser); diff --git a/common/custom_data/Tfrag3Data.h b/common/custom_data/Tfrag3Data.h index 00654e46ab..7c19a8eff1 100644 --- a/common/custom_data/Tfrag3Data.h +++ b/common/custom_data/Tfrag3Data.h @@ -1,16 +1,17 @@ #pragma once // Data format for the tfrag3 renderer. +#include #include "common/common_types.h" -#include "common/util/assert.h" #include "common/dma/gs.h" #include "common/util/Serializer.h" #include "common/math/Vector.h" +#include "common/util/assert.h" namespace tfrag3 { -constexpr int TFRAG3_VERSION = 7; +constexpr int TFRAG3_VERSION = 9; // These vertices should be uploaded to the GPU at load time and don't change struct PreloadedVertex { @@ -41,8 +42,8 @@ struct StripDraw { // to do culling, the above vertex stream is grouped. // by following the visgroups and checking the visibility, you can leave out invisible vertices. struct VisGroup { - u32 num = 0; // number of vertex indices in this group - u32 vis_idx = 0; // the visibility group they belong to + u32 num = 0; // number of vertex indices in this group + u32 vis_idx_in_pc_bvh = 0; // the visibility group they belong to (in BVH) }; std::vector vis_groups; @@ -51,12 +52,34 @@ struct StripDraw { void serialize(Serializer& ser); }; +struct InstancedStripDraw { + DrawMode mode; // the OpenGL draw settings. + u32 tree_tex_id = 0; // the texture that should be bound for the draw + + // the list of vertices in the draw. This includes the restart code of UINT32_MAX that OpenGL + // will use to start a new strip. + std::vector vertex_index_stream; + + // the vertex stream above is segmented by instance. + struct InstanceGroup { + u32 num = 0; // number of vertex indices in this group + u32 instance_idx = 0; // the instance they belong to + u32 vis_idx = 0; + }; + std::vector instance_groups; + + // for debug counting. + u32 num_triangles = 0; + void serialize(Serializer& ser); +}; + // node in the BVH. struct VisNode { math::Vector bsphere; // the bounding sphere, in meters (4096 = 1 game meter). w = rad u16 child_id = 0xffff; // the ID of our first child. - u8 num_kids = 0xff; // number of children. The children are consecutive in memory - u8 flags = 0; // flags. If 1, we have a DrawVisNode child, otherwise a leaf. + u16 my_id = 0xffff; + u8 num_kids = 0xff; // number of children. The children are consecutive in memory + u8 flags = 0; // flags. If 1, we have a DrawVisNode child, otherwise a leaf. }; // The leaf nodes don't actually exist in the vector of VisNodes, but instead they are ID's used @@ -114,6 +137,13 @@ struct TfragTree { void serialize(Serializer& ser); }; +struct TieWindInstance { + std::array matrix; + u16 wind_idx; + float stiffness; + void serialize(Serializer& ser); +}; + // A shrub model struct ShrubTree { BVH bvh; @@ -132,7 +162,8 @@ struct TieTree { std::vector vertices; // mesh vertices std::vector colors; // vertex colors (pre-interpolation) - // TODO wind stuff + std::vector instanced_wind_draws; + std::vector instance_info; void serialize(Serializer& ser); }; diff --git a/common/dma/dma.h b/common/dma/dma.h index a4ab7ba959..667c103470 100644 --- a/common/dma/dma.h +++ b/common/dma/dma.h @@ -7,8 +7,8 @@ #include #include -#include "common/util/assert.h" #include "common/common_types.h" +#include "common/util/assert.h" struct DmaStats { double sync_time_ms = 0; @@ -117,4 +117,4 @@ struct VifCodeUnpack { u16 addr_qw; bool is_unsigned; // only care for 8/16 bit data. bool use_tops_flag; // uses double buffering -}; \ No newline at end of file +}; diff --git a/common/dma/gs.h b/common/dma/gs.h index 03a84136d5..00468774fa 100644 --- a/common/dma/gs.h +++ b/common/dma/gs.h @@ -339,7 +339,7 @@ struct AdGifData { u64 tex1_addr; u64 mip_data; u64 mip_addr; - u64 clamp_data; + u64 clamp_data; // can also be zbuf!! u64 clamp_addr; u64 alpha_data; u64 alpha_addr; @@ -366,6 +366,13 @@ class DrawMode { bool get_depth_write_enable() const { return m_val & 0b1; } void enable_depth_write() { m_val = m_val | 0b1; } void disable_depth_write() { m_val = m_val & ~(0b1); } + void set_depth_write_enable(bool x) { + if (x) { + enable_depth_write(); + } else { + disable_depth_write(); + } + } GsTest::ZTest get_depth_test() const { return (GsTest::ZTest)((m_val >> 1) & 0b11); } void set_depth_test(GsTest::ZTest dt) { m_val = (m_val & ~(0b110)) | ((u32)(dt) << 1); } diff --git a/common/goos/Interpreter.cpp b/common/goos/Interpreter.cpp index 62d7ee7a76..46886bc253 100644 --- a/common/goos/Interpreter.cpp +++ b/common/goos/Interpreter.cpp @@ -7,7 +7,7 @@ #include "Interpreter.h" #include "ParseHelpers.h" #include "common/util/FileUtil.h" -#include +#include "third-party/fmt/core.h" namespace goos { Interpreter::Interpreter(const std::string& username) { diff --git a/common/goos/Object.h b/common/goos/Object.h index 134901dc64..e799629005 100644 --- a/common/goos/Object.h +++ b/common/goos/Object.h @@ -41,7 +41,6 @@ */ #include -#include "common/util/assert.h" #include #include #include @@ -50,6 +49,7 @@ #include #include #include "common/common_types.h" +#include "common/util/assert.h" namespace goos { diff --git a/common/goos/PrettyPrinter.cpp b/common/goos/PrettyPrinter.cpp index d1fd9cbbc0..8933b24da7 100644 --- a/common/goos/PrettyPrinter.cpp +++ b/common/goos/PrettyPrinter.cpp @@ -4,7 +4,6 @@ * It is not very good, but significantly better than putting everything on one line */ -#include "common/util/assert.h" #include #include #include @@ -14,6 +13,7 @@ #include "common/log/log.h" #include "common/goos/PrettyPrinter2.h" +#include "common/util/assert.h" namespace pretty_print { diff --git a/common/goos/PrettyPrinter2.cpp b/common/goos/PrettyPrinter2.cpp index 102d790f10..5a6b6f9ccd 100644 --- a/common/goos/PrettyPrinter2.cpp +++ b/common/goos/PrettyPrinter2.cpp @@ -1,7 +1,7 @@ #include "PrettyPrinter2.h" #include "common/common_types.h" -#include "common/util/assert.h" #include "third-party/fmt/core.h" +#include "common/util/assert.h" namespace pretty_print { @@ -11,9 +11,6 @@ namespace v2 { // The previous issues we had with stack overflow only happened when there was a stack frame per // element in a list. -// TODO: there's a different style of splitting that we should do for forms like: -// set!, and, or, <, >, +... where we try leaving operator + one other. - // The main node type. // unlike v1, this nests lists. // these have pointers to parents, so generally not safe to copy. @@ -71,6 +68,19 @@ struct Node { return false; } + std::string debug_to_string() const { + switch (kind) { + case Kind::ATOM: + return fmt::format("[atom {}]", atom_str); + case Kind::LIST: + return "[list]"; + case Kind::IMPROPER_LIST: + return "[improper list]"; + default: + assert(false); + } + } + // how wide is this text? not including the indentation of this subtree. u32 text_len = 0; @@ -193,7 +203,8 @@ void break_list(Node* node) { node->top_line_count = 1; const std::unordered_set sameline_splitters = { - "if", "<", ">", "<=", ">=", "set!", "=", "!=", "+", "-", "*", "/", "the", "->"}; + "if", "<", ">", "<=", ">=", "set!", "=", "!=", "+", "-", "*", + "/", "the", "->", "and", "or", "logand", "logior", "logxor", "+!", "*!", "logtest?"}; if (node->child_nodes.at(0).kind == Node::Kind::LIST) { // ((foo @@ -208,7 +219,7 @@ void break_list(Node* node) { // things with 4 things in the top line: (defmethod node->top_line_count = 4; } else if (name == "until" || name == "while" || name == "dotimes" || name == "countdown" || - name == "when" || name == "behavior" || name == "lambda") { + name == "when" || name == "behavior" || name == "lambda" || name == "defpart") { node->top_line_count = 2; } else if (name == "let" || name == "let*" || name == "rlet") { // special case for things like let. @@ -253,9 +264,9 @@ void break_list(Node* node) { void insert_required_breaks(const std::vector& bfs_order) { const std::unordered_set always_break = { - "when", "defun-debug", "countdown", "case", "defun", "defmethod", - "let", "until", "while", "if", "dotimes", "cond", - "else", "defbehavior", "with-pp", "rlet", "defstate"}; + "when", "defun-debug", "countdown", "case", "defun", "defmethod", "let", + "until", "while", "if", "dotimes", "cond", "else", "defbehavior", + "with-pp", "rlet", "defstate", "behavior", "defpart"}; for (auto node : bfs_order) { if (!node->break_list && node->kind == Node::Kind::LIST && node->child_nodes.at(0).kind == Node::Kind::ATOM) { @@ -328,18 +339,26 @@ void append_node_to_string(const Node* node, int listing_indent = next_indent_level + node->quoted + node->sub_elt_indent; int extra_indent = 0; + int old_indent = listing_indent; + if (node->top_line_count) { + listing_indent -= node->sub_elt_indent; + listing_indent += node->child_nodes.front().kind == Node::Kind::LIST ? 1 : 2; + } for (; node_idx < node->top_line_count; node_idx++) { size_t s0 = str.length(); if (node->kind == Node::Kind::IMPROPER_LIST && &node->child_nodes.at(node_idx) == &node->child_nodes.back()) { str.append(". "); } + // so, if these need to break, they should have a bigger indent. append_node_to_string(&node->child_nodes.at(node_idx), str, 0, listing_indent + extra_indent); - // extra_indent += (str.length() - s0); extra_indent = compute_extra_offset(str, s0, extra_indent); str.push_back(' '); } + if (node->top_line_count) { + listing_indent = old_indent; + } if (node->top_line_count > 0) { str.pop_back(); } diff --git a/common/goos/Reader.cpp b/common/goos/Reader.cpp index 427600c0fc..92088cd534 100644 --- a/common/goos/Reader.cpp +++ b/common/goos/Reader.cpp @@ -217,9 +217,11 @@ std::optional Reader::read_from_stdin(const std::string& prompt, ReplWra /*! * Read a string. */ -Object Reader::read_from_string(const std::string& str, bool add_top_level) { +Object Reader::read_from_string(const std::string& str, + bool add_top_level, + const std::optional& string_name) { // create text fragment and add to the DB - auto textFrag = std::make_shared(str); + auto textFrag = std::make_shared(str, string_name.value_or("Program string")); db.insert(textFrag); // perform read diff --git a/common/goos/Reader.h b/common/goos/Reader.h index 2578fb76ea..7beed321e5 100644 --- a/common/goos/Reader.h +++ b/common/goos/Reader.h @@ -12,7 +12,6 @@ */ #include -#include "common/util/assert.h" #include #include #include @@ -22,6 +21,8 @@ #include "ReplUtils.h" +#include "common/util/assert.h" + namespace goos { /*! @@ -71,7 +72,9 @@ struct Token { class Reader { public: Reader(); - Object read_from_string(const std::string& str, bool add_top_level = true); + Object read_from_string(const std::string& str, + bool add_top_level = true, + const std::optional& string_name = {}); std::optional read_from_stdin(const std::string& prompt, ReplWrapper& repl); Object read_from_file(const std::vector& file_path, bool check_encoding = false); bool check_string_is_valid(const std::string& str) const; diff --git a/common/goos/TextDB.h b/common/goos/TextDB.h index 3418036fa4..b6b62a1140 100644 --- a/common/goos/TextDB.h +++ b/common/goos/TextDB.h @@ -65,9 +65,14 @@ class ReplText : public SourceText { */ class ProgramString : public SourceText { public: - explicit ProgramString(const std::string& text_) : SourceText(text_) {} - std::string get_description() override { return "Program string"; } + explicit ProgramString(const std::string& text_, + const std::string& string_name = "Program string") + : SourceText(text_), m_string_name(string_name) {} + std::string get_description() override { return m_string_name; } ~ProgramString() = default; + + private: + std::string m_string_name; }; /*! diff --git a/common/log/log.cpp b/common/log/log.cpp index dc49353510..5845efb98f 100644 --- a/common/log/log.cpp +++ b/common/log/log.cpp @@ -1,12 +1,12 @@ #include #include -#include "common/util/assert.h" #include #include "third-party/fmt/color.h" #include "log.h" #ifdef _WIN32 // see lg::initialize #include #endif +#include "common/util/assert.h" namespace lg { struct Logger { diff --git a/common/type_system/Type.cpp b/common/type_system/Type.cpp index 1e9f52f83c..6b395a3be7 100644 --- a/common/type_system/Type.cpp +++ b/common/type_system/Type.cpp @@ -4,9 +4,9 @@ */ #include -#include "common/util/assert.h" -#include +#include "third-party/fmt/core.h" #include "Type.h" +#include "common/util/assert.h" namespace { std::string reg_kind_to_string(RegClass kind) { @@ -696,9 +696,9 @@ StructureType::StructureType(std::string parent, std::string StructureType::print() const { std::string result = fmt::format( "[StructureType] {}\n parent: {}\n boxed: {}\n dynamic: {}\n size: {}\n pack: {}\n misalign: " - "{}\n heap-base: {}\n fields:\n", - m_name, m_parent, m_is_boxed, m_dynamic, m_size_in_mem, m_pack, m_allow_misalign, - m_heap_base); + "{}\n heap-base: {}\n stack-singleton: {}\n fields:\n", + m_name, m_parent, m_is_boxed, m_dynamic, m_size_in_mem, m_pack, m_allow_misalign, m_heap_base, + m_always_stack_singleton); for (auto& x : m_fields) { result += " " + x.print() + "\n"; } @@ -727,7 +727,8 @@ bool StructureType::operator==(const Type& other) const { m_pack == p_other->m_pack && m_allow_misalign == p_other->m_allow_misalign && m_offset == p_other->m_offset && - m_idx_of_first_unique_field == p_other->m_idx_of_first_unique_field; + m_idx_of_first_unique_field == p_other->m_idx_of_first_unique_field && + m_always_stack_singleton == p_other->m_always_stack_singleton; // clang-format on } @@ -773,6 +774,11 @@ std::string StructureType::diff_structure_common(const StructureType& other) con result += fmt::format("allow_misalign: {} vs. {}\n", m_allow_misalign, other.m_allow_misalign); } + if (m_always_stack_singleton != other.m_always_stack_singleton) { + result += fmt::format("always_stack_singleton: {} vs. {}\n", m_always_stack_singleton, + other.m_always_stack_singleton); + } + if (m_offset != other.m_offset) { result += fmt::format("offset: {} vs. {}\n", m_offset, other.m_offset); } @@ -906,7 +912,8 @@ bool BasicType::operator==(const Type& other) const { m_allow_misalign == p_other->m_allow_misalign && m_offset == p_other->m_offset && m_idx_of_first_unique_field == p_other->m_idx_of_first_unique_field && - m_final == p_other->m_final; + m_final == p_other->m_final && + m_always_stack_singleton == p_other->m_always_stack_singleton; // clang-format on } diff --git a/common/type_system/Type.h b/common/type_system/Type.h index 2ff45f4b4d..364c11ae9c 100644 --- a/common/type_system/Type.h +++ b/common/type_system/Type.h @@ -7,10 +7,10 @@ #include #include -#include "common/util/assert.h" #include #include "common/goal_constants.h" #include "TypeSpec.h" +#include "common/util/assert.h" class TypeSystem; @@ -275,9 +275,11 @@ class StructureType : public ReferenceType { bool is_dynamic() const { return m_dynamic; } ~StructureType() = default; void set_pack(bool pack) { m_pack = pack; } + void set_always_stack_singleton() { m_always_stack_singleton = true; } void set_heap_base(int hb) { m_heap_base = hb; } bool is_packed() const { return m_pack; } bool is_allowed_misalign() const { return m_allow_misalign; }; + bool is_always_stack_singleton() const { return m_always_stack_singleton; } void set_allow_misalign(bool misalign) { m_allow_misalign = misalign; } void set_gen_inspect(bool gen_inspect) { m_generate_inspect = gen_inspect; } @@ -300,6 +302,7 @@ class StructureType : public ReferenceType { bool m_pack = false; bool m_allow_misalign = false; int m_offset = 0; + bool m_always_stack_singleton = false; size_t m_idx_of_first_unique_field = 0; }; diff --git a/common/type_system/TypeSpec.h b/common/type_system/TypeSpec.h index 0aa5043972..7b2edbad44 100644 --- a/common/type_system/TypeSpec.h +++ b/common/type_system/TypeSpec.h @@ -8,8 +8,8 @@ #include #include #include -#include "common/util/assert.h" #include "common/util/SmallVector.h" +#include "common/util/assert.h" /*! * A :name value modifier to apply to a type. diff --git a/common/type_system/TypeSystem.cpp b/common/type_system/TypeSystem.cpp index d5aec965fc..53bb35429f 100644 --- a/common/type_system/TypeSystem.cpp +++ b/common/type_system/TypeSystem.cpp @@ -5,12 +5,12 @@ * access types, and reverse type lookups. */ -#include "common/util/assert.h" +#include "third-party/fmt/core.h" +#include "third-party/fmt/color.h" #include -#include #include "TypeSystem.h" #include "common/util/math_util.h" -#include "third-party/fmt/color.h" +#include "common/util/assert.h" namespace { template @@ -1615,7 +1615,10 @@ std::string TypeSystem::generate_deftype_footer(const Type* type) const { result.append(" :pack-me\n"); } if (as_structure->is_allowed_misalign()) { - result.append(" :allow-misaligned"); + result.append(" :allow-misaligned\n"); + } + if (as_structure->is_always_stack_singleton()) { + result.append(" :always-stack-singleton\n"); } } diff --git a/common/type_system/deftype.cpp b/common/type_system/deftype.cpp index c0b632b7f1..173523da1b 100644 --- a/common/type_system/deftype.cpp +++ b/common/type_system/deftype.cpp @@ -277,6 +277,7 @@ struct StructureDefResult { bool pack_me = false; bool allow_misaligned = false; bool final = false; + bool always_stack_singleton = false; }; StructureDefResult parse_structure_def(StructureType* type, @@ -347,6 +348,8 @@ StructureDefResult parse_structure_def(StructureType* type, result.allow_misaligned = true; } else if (opt_name == ":final") { result.final = true; + } else if (opt_name == ":always-stack-singleton") { + result.always_stack_singleton = true; } else { throw std::runtime_error("Invalid option in field specification: " + opt_name); } @@ -572,6 +575,13 @@ DeftypeResult parse_deftype(const goos::Object& deftype, TypeSystem* ts) { name); throw std::runtime_error("invalid pack option on basic"); } + if (sr.always_stack_singleton) { + fmt::print( + "[TypeSystem] :always-stack-singleton was set on {}, which is a basic and cannot " + "be a stack singleton\n", + name); + throw std::runtime_error("invalid stack singleton option on basic"); + } new_type->set_heap_base(result.flags.heap_base); if (sr.final) { new_type->set_final(); @@ -592,6 +602,9 @@ DeftypeResult parse_deftype(const goos::Object& deftype, TypeSystem* ts) { if (sr.allow_misaligned) { new_type->set_allow_misalign(true); } + if (sr.always_stack_singleton) { + new_type->set_always_stack_singleton(); + } if (sr.final) { throw std::runtime_error( fmt::format("[TypeSystem] :final option cannot be used on structure type {}", name)); diff --git a/common/util/BinaryReader.h b/common/util/BinaryReader.h index d6d43b0aae..18ce2be386 100644 --- a/common/util/BinaryReader.h +++ b/common/util/BinaryReader.h @@ -7,9 +7,9 @@ #include #include -#include "common/util/assert.h" -#include "common/common_types.h" #include +#include "common/common_types.h" +#include "common/util/assert.h" class BinaryReader { public: diff --git a/common/util/BinaryWriter.h b/common/util/BinaryWriter.h index 7ab17d7106..498aaec9bc 100644 --- a/common/util/BinaryWriter.h +++ b/common/util/BinaryWriter.h @@ -5,11 +5,11 @@ * Write raw data like a stream. */ -#include "common/util/assert.h" #include #include #include #include +#include "common/util/assert.h" struct BinaryWriterRef { size_t offset; diff --git a/common/util/BitUtils.h b/common/util/BitUtils.h index 4d493143a8..88eb015d45 100644 --- a/common/util/BitUtils.h +++ b/common/util/BitUtils.h @@ -1,9 +1,9 @@ #pragma once #include -#include "common/util/assert.h" #include "common/util/Range.h" #include "common/common_types.h" +#include "common/util/assert.h" constexpr int BITS_PER_BYTE = 8; template @@ -93,4 +93,4 @@ inline u32 count_leading_zeros_u32(u32 in) { _BitScanReverse(&result, in); return result; #endif -} \ No newline at end of file +} diff --git a/common/util/FileUtil.cpp b/common/util/FileUtil.cpp index 7a9398e928..5a3004cad3 100644 --- a/common/util/FileUtil.cpp +++ b/common/util/FileUtil.cpp @@ -9,7 +9,6 @@ #include /* defines FILENAME_MAX */ #include #include -#include "common/util/assert.h" #include #include "common/util/BinaryReader.h" #include "BinaryWriter.h" @@ -24,6 +23,7 @@ #include #include #endif +#include "common/util/assert.h" namespace file_util { std::filesystem::path get_user_home_dir() { diff --git a/common/util/FrameLimiter.h b/common/util/FrameLimiter.h new file mode 100644 index 0000000000..3384149e32 --- /dev/null +++ b/common/util/FrameLimiter.h @@ -0,0 +1,36 @@ +#pragma once + +#include "common/util/Timer.h" + +class FrameLimiter { + public: + void run(double target_fps, bool experimental_accurate_lag, double engine_time) { + double target_seconds; + if (experimental_accurate_lag) { + target_seconds = round_to_nearest_60fps(engine_time); + } else { + target_seconds = 1.f / target_fps; + } + double remaining_time = target_seconds - m_timer.getSeconds(); + while (remaining_time > 0) { + if (remaining_time > 0.003) { + std::this_thread::sleep_for(std::chrono::microseconds(int(remaining_time * 1e6 * 0.5))); + } + remaining_time = target_seconds - m_timer.getSeconds(); + } + + m_timer.start(); + } + + private: + double round_to_nearest_60fps(double current) { + double one_frame = 1.f / 60.f; + int frames_missed = (current / one_frame); // rounds down + if (frames_missed > 4) { + frames_missed = 4; + } + return (frames_missed + 1) * one_frame; + } + + Timer m_timer; +}; \ No newline at end of file diff --git a/common/util/Serializer.h b/common/util/Serializer.h index c1b78a6da8..6c72bf848f 100644 --- a/common/util/Serializer.h +++ b/common/util/Serializer.h @@ -1,9 +1,9 @@ #pragma once -#include "common/util/assert.h" #include #include #include +#include "common/util/assert.h" /*! * The Serializer is a tool to load or save data from a buffer. @@ -216,4 +216,4 @@ class Serializer { size_t m_size = 0; size_t m_offset = 0; bool m_writing = false; -}; \ No newline at end of file +}; diff --git a/common/util/SmallVector.h b/common/util/SmallVector.h index f3dffb4831..ab18cfa89e 100644 --- a/common/util/SmallVector.h +++ b/common/util/SmallVector.h @@ -1,11 +1,11 @@ #pragma once -#include #include #include #include #include #include +#include "assert.h" namespace cu { // This might seem stupid, but compiling an empty file with #include takes 0.5 seconds. diff --git a/common/util/Timer.h b/common/util/Timer.h index 3df3830fd3..62fa58d7e0 100644 --- a/common/util/Timer.h +++ b/common/util/Timer.h @@ -1,11 +1,8 @@ #pragma once -#ifndef JAK_V2_TIMER_H -#define JAK_V2_TIMER_H - -#include "common/util/assert.h" #include #include +#include "common/util/assert.h" /*! * Timer for measuring time elapsed with clock_monotonic @@ -45,5 +42,3 @@ class Timer { struct timespec _startTime = {}; }; - -#endif // JAK_V2_TIMER_H diff --git a/common/util/Trie.h b/common/util/Trie.h index 4e633e26e7..f4cf65cc75 100644 --- a/common/util/Trie.h +++ b/common/util/Trie.h @@ -1,8 +1,8 @@ #pragma once -#include "common/util/assert.h" #include #include +#include "common/util/assert.h" /*! * A simple prefix tree. It works similarly to a map, but also supports fast lookups by prefix with @@ -182,4 +182,4 @@ T* Trie::operator[](const std::string& str) { template std::vector Trie::lookup_prefix(const std::string& str) const { return m_root.lookup_prefix(str.c_str()); -} \ No newline at end of file +} diff --git a/common/util/assert.h b/common/util/assert.h index 90a0044c0b..684234a032 100644 --- a/common/util/assert.h +++ b/common/util/assert.h @@ -1,24 +1,19 @@ -#pragma once - /*! * @file assert.h * Wrapper around . + * Make sure this file is always the last one included. */ -#if defined NDEBUG && defined _WIN32 - -#pragma push_macro("NDEBUG") +#if defined NDEBUG #undef NDEBUG #undef assert #include -#pragma pop_macro("NDEBUG") +#define NDEBUG 1 #else #include #endif - -#define ASSERT assert diff --git a/common/util/dgo_util.cpp b/common/util/dgo_util.cpp index b9f73be792..ab68bd5bda 100644 --- a/common/util/dgo_util.cpp +++ b/common/util/dgo_util.cpp @@ -1,8 +1,8 @@ -#include "common/util/assert.h" #include #include "dgo_util.h" #include "common/versions.h" #include "third-party/fmt/core.h" +#include "common/util/assert.h" /*! * Assert false if the char[] has non-null data after the null terminated string. @@ -50,4 +50,4 @@ std::string get_object_file_name(const std::string& original_name, u8* data, int } return original_name; -} \ No newline at end of file +} diff --git a/common/util/json_util.cpp b/common/util/json_util.cpp index a1edd3a499..d5eae65c7a 100644 --- a/common/util/json_util.cpp +++ b/common/util/json_util.cpp @@ -1,6 +1,6 @@ #include "common/log/log.h" -#include "common/util/assert.h" #include "json_util.h" +#include "common/util/assert.h" /*! * Strip out // and / * comments @@ -107,4 +107,4 @@ Range parse_json_optional_integer_range(const nlohmann::json& json) { } else { throw std::runtime_error("Invalid json as input to parse_json_optional_integer_range"); } -} \ No newline at end of file +} diff --git a/common/util/print_float.cpp b/common/util/print_float.cpp index 4227b5d15c..579ba81e64 100644 --- a/common/util/print_float.cpp +++ b/common/util/print_float.cpp @@ -1,7 +1,7 @@ #include #include "third-party/fmt/core.h" -#include "common/common_types.h" +#include "common/goal_constants.h" #include "third-party/dragonbox.h" #include "print_float.h" #include "common/util/assert.h" @@ -19,6 +19,14 @@ std::string float_to_string(float value, bool append_trailing_decimal) { return {buff}; } +/*! + * Wrapper around float_to_string, for printing meters. Unlike float_to_string, it does not append + * decimals by default. + */ +std::string meters_to_string(float value, bool append_trailing_decimal) { + return float_to_string(value / METER_LENGTH, append_trailing_decimal); +} + int float_to_cstr(float value, char* buffer, bool append_trailing_decimal) { assert(std::isfinite(value)); // dragonbox gives us: diff --git a/common/util/print_float.h b/common/util/print_float.h index b208a152e2..3849b7b279 100644 --- a/common/util/print_float.h +++ b/common/util/print_float.h @@ -3,4 +3,5 @@ #include std::string float_to_string(float value, bool append_trailing_decimal = true); -int float_to_cstr(float value, char* buffer, bool append_trailing_decimal = true); \ No newline at end of file +std::string meters_to_string(float value, bool append_trailing_decimal = false); +int float_to_cstr(float value, char* buffer, bool append_trailing_decimal = true); diff --git a/decompiler/CMakeLists.txt b/decompiler/CMakeLists.txt index 324a94c686..b35f9b78d1 100644 --- a/decompiler/CMakeLists.txt +++ b/decompiler/CMakeLists.txt @@ -6,6 +6,7 @@ add_library( analysis/cfg_builder.cpp analysis/expression_build.cpp analysis/final_output.cpp + analysis/find_defpartgroup.cpp analysis/find_defstates.cpp analysis/find_skelgroups.cpp analysis/inline_asm_rewrite.cpp diff --git a/decompiler/Disasm/InstructionDecode.cpp b/decompiler/Disasm/InstructionDecode.cpp index 66448fedd1..e530bcedd0 100644 --- a/decompiler/Disasm/InstructionDecode.cpp +++ b/decompiler/Disasm/InstructionDecode.cpp @@ -5,8 +5,8 @@ */ #include "InstructionDecode.h" -#include "common/util/assert.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" +#include "common/util/assert.h" namespace decompiler { // utility class to extract fields of an opcode. diff --git a/decompiler/Disasm/InstructionMatching.cpp b/decompiler/Disasm/InstructionMatching.cpp index 21eee843fe..c51da30c6b 100644 --- a/decompiler/Disasm/InstructionMatching.cpp +++ b/decompiler/Disasm/InstructionMatching.cpp @@ -3,8 +3,8 @@ * Utilities for checking if an instruction matches some criteria. */ -#include "common/util/assert.h" #include "InstructionMatching.h" +#include "common/util/assert.h" namespace decompiler { /*! diff --git a/decompiler/Disasm/InstructionParser.cpp b/decompiler/Disasm/InstructionParser.cpp index 7bf85de01c..4ef1610408 100644 --- a/decompiler/Disasm/InstructionParser.cpp +++ b/decompiler/Disasm/InstructionParser.cpp @@ -1,9 +1,9 @@ -#include "common/util/assert.h" #include #include #include #include "common/common_types.h" #include "InstructionParser.h" +#include "common/util/assert.h" namespace decompiler { InstructionParser::InstructionParser() { @@ -487,4 +487,4 @@ std::string ParsedProgram::print() { } return result; } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/Disasm/Register.cpp b/decompiler/Disasm/Register.cpp index b7af3c1d0c..fb4df68673 100644 --- a/decompiler/Disasm/Register.cpp +++ b/decompiler/Disasm/Register.cpp @@ -4,9 +4,9 @@ */ #include "Register.h" -#include "common/util/assert.h" #include #include "third-party/fmt/core.h" +#include "common/util/assert.h" namespace decompiler { namespace Reg { diff --git a/decompiler/Disasm/Register.h b/decompiler/Disasm/Register.h index 7cc7b50862..ee8c48a18f 100644 --- a/decompiler/Disasm/Register.h +++ b/decompiler/Disasm/Register.h @@ -6,8 +6,8 @@ */ #include -#include "common/util/assert.h" #include +#include "common/util/assert.h" namespace decompiler { // Namespace for register name constants diff --git a/decompiler/Function/BasicBlocks.cpp b/decompiler/Function/BasicBlocks.cpp index afb107ccbb..9e9095a949 100644 --- a/decompiler/Function/BasicBlocks.cpp +++ b/decompiler/Function/BasicBlocks.cpp @@ -1,8 +1,8 @@ #include -#include "common/util/assert.h" #include "BasicBlocks.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" #include "decompiler/Disasm/InstructionMatching.h" +#include "common/util/assert.h" namespace decompiler { /*! diff --git a/decompiler/Function/CfgVtx.cpp b/decompiler/Function/CfgVtx.cpp index 14c650d739..a9e65ad411 100644 --- a/decompiler/Function/CfgVtx.cpp +++ b/decompiler/Function/CfgVtx.cpp @@ -1,9 +1,9 @@ -#include "common/util/assert.h" #include "common/goos/PrettyPrinter.h" #include "decompiler/Disasm/InstructionMatching.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" #include "CfgVtx.h" #include "Function.h" +#include "common/util/assert.h" namespace decompiler { ///////////////////////////////////////// @@ -1247,6 +1247,43 @@ bool ControlFlowGraph::clean_up_asm_branches() { old_seq->parent_claim(seq); bds->parent_claim(seq); + return false; + } else if (b0_seq && !b1_seq) { + replaced = true; + m_blocks.at(bds->succ_branch->get_first_block_id())->needs_label = true; + + auto* seq = dynamic_cast(b0); + assert(seq); + + if (b0->succ_branch) { + b0->succ_branch->replace_preds_with_and_check({b0}, nullptr); + } + + if (bds->succ_branch) { + // likely delay slots "branch" in this graph. + bds->succ_branch->replace_preds_with_and_check({bds}, nullptr); + } + + seq->seq.push_back(bds); + + seq->seq.push_back(b1); + + for (auto* x : b1->succs()) { + // printf("fix preds of %s\n", x->to_string().c_str()); + x->replace_pred_and_check(b1, seq); + } + seq->succ_branch = b1->succ_branch; + seq->succ_ft = b1->succ_ft; + seq->end_branch = b1->end_branch; + seq->next = b1->next; + if (seq->next) { + seq->next->prev = seq; + } + + // todo - proper trash? + b1->parent_claim(seq); + bds->parent_claim(seq); + return false; } diff --git a/decompiler/Function/CfgVtx.h b/decompiler/Function/CfgVtx.h index 0e5d981194..bc2563e3fd 100644 --- a/decompiler/Function/CfgVtx.h +++ b/decompiler/Function/CfgVtx.h @@ -1,8 +1,5 @@ #pragma once -#ifndef JAK_DISASSEMBLER_CFGVTX_H -#define JAK_DISASSEMBLER_CFGVTX_H - #include #include #include "common/util/assert.h" @@ -394,4 +391,3 @@ std::shared_ptr build_cfg(const LinkedObjectFile& file, const CondWithElseLengthHack& cond_with_else_hack, const std::unordered_set& blocks_ending_in_asm_br); } // namespace decompiler -#endif // JAK_DISASSEMBLER_CFGVTX_H diff --git a/decompiler/Function/Function.cpp b/decompiler/Function/Function.cpp index c85c39fd45..5c09828924 100644 --- a/decompiler/Function/Function.cpp +++ b/decompiler/Function/Function.cpp @@ -1,4 +1,3 @@ -#include "common/util/assert.h" #include #include "Function.h" #include "common/log/log.h" @@ -9,6 +8,7 @@ #include "decompiler/IR/IR.h" #include "decompiler/IR2/Form.h" #include "common/util/BitUtils.h" +#include "common/util/assert.h" namespace decompiler { namespace { @@ -88,7 +88,8 @@ void Function::analyze_prologue(const LinkedObjectFile& file) { // storing s7 on the stack is done by interrupt handlers, which we probably don't want to // support - if (instr.kind == InstructionKind::SD && instr.get_src(0).get_reg() == make_gpr(Reg::S7)) { + if (instr.kind == InstructionKind::SD && instr.get_src(0).get_reg() == make_gpr(Reg::S7) && + instr.get_src(2).get_reg() == make_gpr(Reg::SP)) { lg::warn( "Function {} was flagged as asm due to this instruction: {}. Consider flagging as asm " "in config!", @@ -765,4 +766,4 @@ BlockTopologicalSort Function::bb_topo_sort() { std::string Function::name() const { return guessed_name.to_string(); } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/Function/Warnings.h b/decompiler/Function/Warnings.h index 4bc5d7bfcf..8e4b65dbd8 100644 --- a/decompiler/Function/Warnings.h +++ b/decompiler/Function/Warnings.h @@ -2,9 +2,8 @@ #include #include #include -#include "common/util/assert.h" - #include "third-party/fmt/core.h" +#include "common/util/assert.h" namespace decompiler { class DecompWarnings { @@ -110,4 +109,4 @@ class DecompWarnings { std::vector m_warnings; bool m_used_lq_sq = false; }; -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/IR/IR.h b/decompiler/IR/IR.h index bfee70afb2..ff6588f06c 100644 --- a/decompiler/IR/IR.h +++ b/decompiler/IR/IR.h @@ -1,7 +1,8 @@ +#pragma once + #ifndef JAK_IR_H #define JAK_IR_H -#include "common/util/assert.h" #include #include #include @@ -10,6 +11,7 @@ #include "common/type_system/TypeSpec.h" #include "decompiler/util/DecompilerTypeSystem.h" #include "decompiler/util/TP_Type.h" +#include "common/util/assert.h" namespace goos { class Object; diff --git a/decompiler/IR2/AtomicOp.cpp b/decompiler/IR2/AtomicOp.cpp index 62ce19abc0..f0c0ea12da 100644 --- a/decompiler/IR2/AtomicOp.cpp +++ b/decompiler/IR2/AtomicOp.cpp @@ -1,4 +1,3 @@ -#include "common/util/assert.h" #include #include #include "common/goal_constants.h" @@ -8,6 +7,7 @@ #include "AtomicOp.h" #include "OpenGoalMapping.h" #include "Form.h" +#include "common/util/assert.h" namespace decompiler { ///////////////////////////// @@ -306,6 +306,9 @@ std::string get_simple_expression_op_name(SimpleExpression::Kind kind) { return "vec3dot"; case SimpleExpression::Kind::VECTOR_4_DOT: return "vec4dot"; + case SimpleExpression::Kind::SET_ON_LESS_THAN: + case SimpleExpression::Kind::SET_ON_LESS_THAN_IMM: + return "set-on-less-than"; default: assert(false); return {}; @@ -367,6 +370,9 @@ int get_simple_expression_arg_count(SimpleExpression::Kind kind) { case SimpleExpression::Kind::VECTOR_3_DOT: case SimpleExpression::Kind::VECTOR_4_DOT: return 2; + case SimpleExpression::Kind::SET_ON_LESS_THAN: + case SimpleExpression::Kind::SET_ON_LESS_THAN_IMM: + return 2; default: assert(false); return -1; @@ -512,7 +518,10 @@ AsmOp::AsmOp(Instruction instr, int my_idx) : AtomicOp(my_idx), m_instr(std::mov if (src.is_reg()) { auto reg = src.get_reg(); if (reg.get_kind() == Reg::FPR || reg.get_kind() == Reg::GPR || reg.get_kind() == Reg::VF) { - m_src[i] = RegisterAccess(AccessMode::READ, reg, my_idx, true); + if (reg != Register(Reg::GPR, Reg::R0) || + (m_instr.kind == InstructionKind::PCPYUD || m_instr.kind == InstructionKind::PEXTUW)) { + m_src[i] = RegisterAccess(AccessMode::READ, reg, my_idx, true); + } } } } diff --git a/decompiler/IR2/AtomicOp.h b/decompiler/IR2/AtomicOp.h index 1b1ad95036..e48e7efece 100644 --- a/decompiler/IR2/AtomicOp.h +++ b/decompiler/IR2/AtomicOp.h @@ -2,13 +2,13 @@ #include #include -#include "common/util/assert.h" #include #include "common/goos/Object.h" #include "decompiler/Disasm/Register.h" #include "decompiler/Disasm/Instruction.h" #include "decompiler/IR2/IR2_common.h" #include "Env.h" +#include "common/util/assert.h" namespace decompiler { class FormElement; @@ -235,7 +235,9 @@ class SimpleExpression { VECTOR_CROSS, SUBU_L32_S7, // use SUBU X, src0, s7 to check if lower 32-bits are s7. VECTOR_3_DOT, - VECTOR_4_DOT + VECTOR_4_DOT, + SET_ON_LESS_THAN, + SET_ON_LESS_THAN_IMM }; // how many arguments? diff --git a/decompiler/IR2/AtomicOpTypeAnalysis.cpp b/decompiler/IR2/AtomicOpTypeAnalysis.cpp index 17920ce73f..5f525dccb8 100644 --- a/decompiler/IR2/AtomicOpTypeAnalysis.cpp +++ b/decompiler/IR2/AtomicOpTypeAnalysis.cpp @@ -437,7 +437,8 @@ TP_Type SimpleExpression::get_type_int2(const TypeState& input, return TP_Type::make_from_ts(TypeSpec("int")); } - if (arg0_type.is_product_with(4) && tc(dts, TypeSpec("type"), arg1_type)) { + if (arg0_type.is_product_with(4) && tc(dts, TypeSpec("type"), arg1_type) && + env.func->name() != "overrides-parent-method?") { // dynamic access into the method array with shift, add, offset-load // no need to track the type because we don't know the method index anyway. return TP_Type::make_partial_dyanmic_vtable_access(); @@ -621,12 +622,12 @@ TP_Type SimpleExpression::get_type_int2(const TypeState& input, return TP_Type::make_from_ts(arg0_type.typespec()); } - if (m_kind == Kind::ADD && tc(dts, TypeSpec("structure"), arg0_type) && + if ((m_kind == Kind::ADD || m_kind == Kind::SUB) && tc(dts, TypeSpec("structure"), arg0_type) && arg1_type.is_integer_constant()) { auto type_info = dts.ts.lookup_type(arg0_type.typespec()); - // get next in memory, allow this as &+ - if ((u64)type_info->get_size_in_memory() == arg1_type.get_integer_constant()) { + // get next in memory, allow this as &+/&- + if ((s64)type_info->get_size_in_memory() == std::abs((s64)arg1_type.get_integer_constant())) { return TP_Type::make_from_ts(arg0_type.typespec()); } @@ -827,7 +828,8 @@ TypeState AsmOp::propagate_types_internal(const TypeState& input, } // sllv out, in, r0 - if (m_instr.kind == InstructionKind::SLLV && m_src[1]->reg() == Register(Reg::GPR, Reg::R0)) { + if (m_instr.kind == InstructionKind::SLLV && + instruction().src[1].is_reg(Register(Reg::GPR, Reg::R0))) { auto type = dts.ts.lookup_type(result.get(m_src[0]->reg()).typespec()); auto as_bitfield = dynamic_cast(type); if (as_bitfield) { diff --git a/decompiler/IR2/Env.cpp b/decompiler/IR2/Env.cpp index aecab89250..1c6ad9b379 100644 --- a/decompiler/IR2/Env.cpp +++ b/decompiler/IR2/Env.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include "decompiler/util/DecompilerTypeSystem.h" #include "Env.h" #include "Form.h" #include "decompiler/analysis/atomic_op_builder.h" diff --git a/decompiler/IR2/Env.h b/decompiler/IR2/Env.h index 541ecfa895..be8d55b5fc 100644 --- a/decompiler/IR2/Env.h +++ b/decompiler/IR2/Env.h @@ -2,14 +2,14 @@ #include #include -#include "common/util/assert.h" -#include +#include "common/goos/Object.h" #include "decompiler/util/TP_Type.h" #include "decompiler/util/StackSpillMap.h" #include "decompiler/Disasm/Register.h" #include "decompiler/IR2/IR2_common.h" #include "decompiler/analysis/reg_usage.h" #include "decompiler/config.h" +#include "common/util/assert.h" namespace decompiler { class LinkedObjectFile; @@ -234,4 +234,4 @@ class Env { StackSpillMap m_stack_spill_map; }; -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/IR2/Form.cpp b/decompiler/IR2/Form.cpp index 598152eb6b..adf61071d5 100644 --- a/decompiler/IR2/Form.cpp +++ b/decompiler/IR2/Form.cpp @@ -7,6 +7,7 @@ #include "common/type_system/TypeSystem.h" #include "decompiler/util/DecompilerTypeSystem.h" #include "decompiler/util/data_decompile.h" +#include "decompiler/util/sparticle_decompile.h" #include "common/util/print_float.h" namespace decompiler { @@ -2985,21 +2986,18 @@ goos::Object DefskelgroupElement::to_form_internal(const Env& env) const { std::vector lod_forms; for (const auto& e : m_info.lods) { - auto f_dist = pretty_print::to_symbol(fmt::format( - "(meters {})", float_to_string(e.lod_dist->to_form(env).as_float() / METER_LENGTH, false))); + auto f_dist = pretty_print::to_symbol( + fmt::format("(meters {})", meters_to_string(e.lod_dist->to_form(env).as_float()))); lod_forms.push_back(pretty_print::build_list(e.mgeo->to_form(env), f_dist)); } forms.push_back(pretty_print::build_list(lod_forms)); + forms.push_back(pretty_print::to_symbol(fmt::format( + ":bounds (static-spherem {} {} {} {})", meters_to_string(m_static_info.bounds.x()), + meters_to_string(m_static_info.bounds.y()), meters_to_string(m_static_info.bounds.z()), + meters_to_string(m_static_info.bounds.w())))); forms.push_back(pretty_print::to_symbol( - fmt::format(":bounds (static-spherem {} {} {} {})", - float_to_string(m_static_info.bounds.x() / METER_LENGTH, false), - float_to_string(m_static_info.bounds.y() / METER_LENGTH, false), - float_to_string(m_static_info.bounds.z() / METER_LENGTH, false), - float_to_string(m_static_info.bounds.w() / METER_LENGTH, false)))); - forms.push_back(pretty_print::to_symbol( - fmt::format(":longest-edge (meters {})", - float_to_string(m_static_info.longest_edge / METER_LENGTH, false)))); + fmt::format(":longest-edge (meters {})", meters_to_string(m_static_info.longest_edge)))); if (m_static_info.shadow != 0) { forms.push_back(pretty_print::to_symbol(fmt::format(":shadow {}", m_static_info.shadow))); @@ -3018,6 +3016,149 @@ goos::Object DefskelgroupElement::to_form_internal(const Env& env) const { return pretty_print::build_list(forms); } +//////////////////////////////// +// DefpartgroupElement +//////////////////////////////// + +DefpartgroupElement::DefpartgroupElement(const StaticInfo& data, int group_id) + : m_static_info(data), m_group_id(group_id) {} + +void DefpartgroupElement::apply(const std::function& f) { + f(this); +} + +void DefpartgroupElement::apply_form(const std::function&) {} +void DefpartgroupElement::collect_vars(RegAccessSet&, bool) const {} +void DefpartgroupElement::get_modified_regs(RegSet&) const {} + +goos::Object DefpartgroupElement::to_form_internal(const Env& env) const { + std::vector forms; + forms.push_back(pretty_print::to_symbol(fmt::format("defpartgroup {}", name()))); + forms.push_back(pretty_print::to_symbol(fmt::format(":id {}", m_group_id))); + if (m_static_info.duration != 3000) { + forms.push_back(pretty_print::to_symbol(fmt::format(":duration {}", m_static_info.duration))); + } + if (m_static_info.linger != 1500) { + forms.push_back( + pretty_print::to_symbol(fmt::format(":linger-duration {}", m_static_info.linger))); + } + if (m_static_info.flags != 0) { + auto things = decompile_bitfield_enum_from_int(TypeSpec("sp-group-flag"), env.dts->ts, + m_static_info.flags); + std::string result = ":flags ("; + for (auto& thing : things) { + result += thing; + result += ' '; + } + result.pop_back(); + result += ')'; + forms.push_back(pretty_print::to_symbol(result)); + } + forms.push_back(pretty_print::to_symbol(fmt::format( + ":bounds (static-bspherem {} {} {} {})", meters_to_string(m_static_info.bounds.x()), + meters_to_string(m_static_info.bounds.y()), meters_to_string(m_static_info.bounds.z()), + meters_to_string(m_static_info.bounds.w())))); + + std::vector item_forms; + for (const auto& e : m_static_info.elts) { + s32 launcher = e.part_id; + u16 flags = e.flags; + u16 period = e.period; + u16 length = e.length; + u16 offset = e.offset; + u32 hour_mask = e.hour_mask; + u32 binding = e.binding; + + std::string result = + fmt::format("(sp-item {}", launcher); // use decimal, so it matches array idx + + if (e.fade != 0.0) { + result += fmt::format(" :fade-after (meters {})", meters_to_string(e.fade)); + } + + if (e.falloff != 0.0) { + result += fmt::format(" :falloff-to (meters {})", meters_to_string(e.falloff)); + } + + if (flags) { + auto things = + decompile_bitfield_enum_from_int(TypeSpec("sp-group-item-flag"), env.dts->ts, flags); + result += " :flags ("; + for (auto& thing : things) { + result += thing; + result += ' '; + } + result.pop_back(); + result += ')'; + } + + if (period) { + result += fmt::format(" :period {}", period); + } + + if (length) { + result += fmt::format(" :length {}", length); + } + + if (offset) { + result += fmt::format(" :offset {}", offset); + } + + if (hour_mask) { + result += fmt::format(" :hour-mask #b{:b}", hour_mask); + } + + if (binding) { + result += fmt::format(" :binding {}", binding); + } + + result += ')'; + + item_forms.push_back(pretty_print::to_symbol(result)); + } + if (!item_forms.empty()) { + forms.push_back(pretty_print::to_symbol(":parts")); + forms.push_back(pretty_print::build_list(item_forms)); + } + + return pretty_print::build_list(forms); +} + +//////////////////////////////// +// DefpartElement +//////////////////////////////// + +DefpartElement::DefpartElement(const StaticInfo& data, int id) : m_static_info(data), m_id(id) {} + +void DefpartElement::apply(const std::function& f) { + f(this); +} + +void DefpartElement::apply_form(const std::function&) {} +void DefpartElement::collect_vars(RegAccessSet&, bool) const {} +void DefpartElement::get_modified_regs(RegSet&) const {} + +goos::Object DefpartElement::to_form_internal(const Env& env) const { + std::vector forms; + forms.push_back(pretty_print::to_symbol("defpart")); + forms.push_back(pretty_print::to_symbol(fmt::format("{}", m_id))); + + std::vector item_forms; + for (const auto& e : m_static_info.fields) { + if (e.field_id == 67) { + // sp-end + break; + } + item_forms.push_back(decompile_sparticle_field_init(e, env.dts->ts)); + } + if (!item_forms.empty()) { + forms.push_back(pretty_print::to_symbol(":init-specs")); + forms.push_back(pretty_print::build_list(item_forms)); + } + + return pretty_print::build_list(forms); +} + //////////////////////////////// // ResLumpMacroElement //////////////////////////////// diff --git a/decompiler/IR2/Form.h b/decompiler/IR2/Form.h index 84a927a3d6..15908907a0 100644 --- a/decompiler/IR2/Form.h +++ b/decompiler/IR2/Form.h @@ -12,6 +12,7 @@ #include "common/type_system/state.h" #include "decompiler/IR2/LabelDB.h" #include "common/math/Vector.h" +#include "decompiler/ObjectFile/LinkedWord.h" namespace decompiler { class Form; @@ -571,6 +572,10 @@ class ConditionElement : public FormElement { FormPool& pool, const std::vector& source_forms, const std::vector& types); + FormElement* make_geq_zero_unsigned_check_generic(const Env& env, + FormPool& pool, + const std::vector& source_forms, + const std::vector& types); FormElement* make_geq_zero_signed_check_generic(const Env& env, FormPool& pool, const std::vector& source_forms, @@ -1674,6 +1679,77 @@ class DefskelgroupElement : public FormElement { Info m_info; }; +class DefpartgroupElement : public FormElement { + public: + struct StaticInfo { + u16 duration; + u16 linger; + u16 flags; + std::string name; + math::Vector4f bounds; + + struct PartGroupItem { + u32 part_id; + float fade; + float falloff; + u16 flags; + u16 period; + u16 length; + u16 offset; + u32 hour_mask; + u32 binding; + }; + std::vector elts; + }; + DefpartgroupElement(const StaticInfo& data, int group_id); + + goos::Object to_form_internal(const Env& env) const override; + void apply(const std::function& f) override; + void apply_form(const std::function& f) override; + void collect_vars(RegAccessSet& vars, bool recursive) const override; + void update_from_stack(const Env& env, + FormPool& pool, + FormStack& stack, + std::vector* result, + bool allow_side_effects) override; + void get_modified_regs(RegSet& regs) const override; + + const std::string& name() const { return m_static_info.name; } + + private: + StaticInfo m_static_info; + int m_group_id; +}; + +class DefpartElement : public FormElement { + public: + struct StaticInfo { + struct PartField { + u16 field_id; + u16 flags; + std::vector data; + goos::Object sound_spec; + }; + std::vector fields; + }; + DefpartElement(const StaticInfo& data, int id); + + goos::Object to_form_internal(const Env& env) const override; + void apply(const std::function& f) override; + void apply_form(const std::function& f) override; + void collect_vars(RegAccessSet& vars, bool recursive) const override; + void update_from_stack(const Env& env, + FormPool& pool, + FormStack& stack, + std::vector* result, + bool allow_side_effects) override; + void get_modified_regs(RegSet& regs) const override; + + private: + StaticInfo m_static_info; + int m_id; +}; + class ResLumpMacroElement : public FormElement { public: enum class Kind { DATA, STRUCT, VALUE, INVALID }; diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index cd0ee3421d..056e06210f 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -1065,7 +1065,8 @@ void SimpleExpressionElement::update_from_stack_add_i(const Env& env, result->push_back(pool.alloc_element(args.at(1), rd_ok.addr_of, tokens)); return; } else { - lg::error("Bad is {}\n", args.at(0)->to_string(env)); + // TODO - output error to IR + lg::error("Bad {} at OP: {}\n", args.at(0)->to_string(env), m_my_idx); throw std::runtime_error("Failed to match product_with_constant inline array access 2."); } } @@ -3583,66 +3584,59 @@ FormElement* sc_to_handle_get_proc(ShortCircuitElement* elt, void ShortCircuitElement::push_to_stack(const Env& env, FormPool& pool, FormStack& stack) { mark_popped(); - if (!used_as_value.value_or(false)) { - throw std::runtime_error( - "ShortCircuitElement::push_to_stack not implemented for result not used case."); - + if (already_rewritten) { stack.push_form_element(this, true); - } else { - if (already_rewritten) { - stack.push_form_element(this, true); - return; - } + return; + } - // the first condition is special - auto first_condition = entries.front().condition; - // lets evaluate in on the parent stack... - for (auto x : first_condition->elts()) { - x->push_to_stack(env, pool, stack); - } + // the first condition is special + auto first_condition = entries.front().condition; + // lets evaluate in on the parent stack... + for (auto x : first_condition->elts()) { + x->push_to_stack(env, pool, stack); + } - for (int i = 0; i < int(entries.size()); i++) { - auto& entry = entries.at(i); - if (entry.condition == first_condition) { - entry.condition->clear(); - entry.condition->push_back(stack.pop_back(pool)); + for (int i = 0; i < int(entries.size()); i++) { + auto& entry = entries.at(i); + if (entry.condition == first_condition) { + entry.condition->clear(); + entry.condition->push_back(stack.pop_back(pool)); + } else { + FormStack temp_stack(false); + for (auto& elt : entry.condition->elts()) { + elt->push_to_stack(env, pool, temp_stack); + } + + std::vector new_entries; + if (i == int(entries.size()) - 1) { + new_entries = rewrite_to_get_var(temp_stack, pool, final_result, env); } else { - FormStack temp_stack(false); - for (auto& elt : entry.condition->elts()) { - elt->push_to_stack(env, pool, temp_stack); - } + new_entries = temp_stack.rewrite(pool, env); + } - std::vector new_entries; - if (i == int(entries.size()) - 1) { - new_entries = rewrite_to_get_var(temp_stack, pool, final_result, env); - } else { - new_entries = temp_stack.rewrite(pool, env); - } - - entry.condition->clear(); - for (auto e : new_entries) { - if (dynamic_cast(e)) { - continue; - } - entry.condition->push_back(e); - } - if (entry.condition->elts().empty()) { - entry.condition->push_back(pool.alloc_element()); + entry.condition->clear(); + for (auto e : new_entries) { + if (dynamic_cast(e)) { + continue; } + entry.condition->push_back(e); + } + if (entry.condition->elts().empty()) { + entry.condition->push_back(pool.alloc_element()); } } - - FormElement* to_push = this; - auto as_handle_get = sc_to_handle_get_proc(this, env, pool, stack); - if (as_handle_get) { - to_push = as_handle_get; - } - - assert(used_as_value.has_value()); - stack.push_value_to_reg(final_result, pool.alloc_single_form(nullptr, to_push), true, - env.get_variable_type(final_result, false)); - already_rewritten = true; } + + FormElement* to_push = this; + auto as_handle_get = sc_to_handle_get_proc(this, env, pool, stack); + if (as_handle_get) { + to_push = as_handle_get; + } + + assert(used_as_value.has_value()); + stack.push_value_to_reg(final_result, pool.alloc_single_form(nullptr, to_push), true, + env.get_variable_type(final_result, false)); + already_rewritten = true; } void ShortCircuitElement::update_from_stack(const Env& env, @@ -4029,6 +4023,31 @@ FormElement* ConditionElement::make_geq_zero_signed_check_generic( } } +FormElement* ConditionElement::make_geq_zero_unsigned_check_generic( + const Env& env, + FormPool& pool, + const std::vector& source_forms, + const std::vector& types) { + assert(source_forms.size() == 1); + // (>= (shl (the-as int iter) 62) 0) -> (not (pair? iter)) + + // match (shl [(the-as int [x]) | [x]] 62) + auto shift_match = + match(Matcher::op(GenericOpMatcher::fixed(FixedOperatorKind::SHL), + { + Matcher::match_or({Matcher::cast("uint", Matcher::any(0)), + Matcher::any(0)}), // the val + Matcher::integer(62) // get the bit in the highest position. + }), + source_forms.at(0)); + + auto casted = make_casts_if_needed(source_forms, types, TypeSpec("uint"), pool, env); + auto zero = + pool.alloc_single_element_form(nullptr, SimpleAtom::make_int_constant(0)); + casted.push_back(zero); + return pool.alloc_element(GenericOperator::make_fixed(FixedOperatorKind::GEQ), + casted); +} FormElement* ConditionElement::make_generic(const Env& env, FormPool& pool, const std::vector& source_forms, @@ -4099,6 +4118,10 @@ FormElement* ConditionElement::make_generic(const Env& env, return make_geq_zero_signed_check_generic(env, pool, source_forms, types); } + case IR2_Condition::Kind::GEQ_ZERO_UNSIGNED: { + return make_geq_zero_unsigned_check_generic(env, pool, source_forms, types); + } + case IR2_Condition::Kind::GREATER_THAN_ZERO_UNSIGNED: { auto casted = make_casts_if_needed(source_forms, types, TypeSpec("uint"), pool, env); auto zero = pool.alloc_single_element_form( @@ -4359,13 +4382,10 @@ void push_asm_sllv_to_stack(const AsmOp* op, auto dst = op->dst(); assert(dst.has_value()); - auto sav = op->src(1); - assert(sav.has_value()); - auto arg0_type = env.get_variable_type(*var, true); auto type_info = env.dts->ts.lookup_type(arg0_type); auto bitfield_info = dynamic_cast(type_info); - if (sav->reg() == Register(Reg::GPR, Reg::R0)) { + if (op->instruction().src[1].is_reg(Register(Reg::GPR, Reg::R0))) { if (bitfield_info) { auto base = pop_to_forms({*var}, env, pool, stack, true).at(0); auto read_elt = pool.alloc_element(base, arg0_type); @@ -4881,6 +4901,8 @@ void ArrayFieldAccess::update_with_val(Form* new_val, {reg0_matcher, Matcher::integer(m_expected_stride)}); mult_matcher = Matcher::match_or({Matcher::cast("uint", mult_matcher), mult_matcher}); auto matcher = Matcher::fixed_op(FixedOperatorKind::ADDITION, {mult_matcher, reg1_matcher}); + matcher = Matcher::match_or({matcher, Matcher::fixed_op(FixedOperatorKind::ADDITION_PTR, + {reg1_matcher, mult_matcher})}); auto match_result = match(matcher, new_val); Form* idx = nullptr; Form* base = nullptr; @@ -5355,6 +5377,24 @@ void DefskelgroupElement::update_from_stack(const Env&, result->push_back(this); } +void DefpartgroupElement::update_from_stack(const Env&, + FormPool&, + FormStack&, + std::vector* result, + bool) { + mark_popped(); + result->push_back(this); +} + +void DefpartElement::update_from_stack(const Env&, + FormPool&, + FormStack&, + std::vector* result, + bool) { + mark_popped(); + result->push_back(this); +} + void ResLumpMacroElement::update_from_stack(const Env&, FormPool&, FormStack&, diff --git a/decompiler/IR2/OpenGoalMapping.cpp b/decompiler/IR2/OpenGoalMapping.cpp index 740e6feac4..50d402fb4f 100644 --- a/decompiler/IR2/OpenGoalMapping.cpp +++ b/decompiler/IR2/OpenGoalMapping.cpp @@ -26,7 +26,7 @@ const std::map MIPS_ASM_TO_OPEN_GOAL_FUN {InstructionKind::PAND, {".pand", {}}}, // Parallel Pack - {InstructionKind::PPACH, {".ppach", {}}}, + {InstructionKind::PPACH, {".ppach", {MOD::QWORD_CAST}}}, // Parallel Compares {InstructionKind::PCEQB, {".pceqb", {}}}, @@ -50,6 +50,11 @@ const std::map MIPS_ASM_TO_OPEN_GOAL_FUN // lots of implicit logic in OpenGOAL depending on argument types! {InstructionKind::MFC1, {".mov", {}}}, + {InstructionKind::MOVN, {"move-if-not-zero", {}}}, // s7 special case is handled elsewhere + {InstructionKind::SLT, {"set-on-less-than", {}}}, + {InstructionKind::SLTI, {"set-on-less-than", {}}}, + {InstructionKind::SRA, {"shift-arith-right-32", {}}}, + // ---- COP2 ----- // TODO - VMOVE supports dest, but OpenGOAL does NOT yet! {InstructionKind::VMOVE, {".mov.vf", {MOD::DEST_MASK}}}, @@ -104,9 +109,8 @@ const std::map MIPS_ASM_TO_OPEN_GOAL_FUN {InstructionKind::VABS, {".abs.vf", {MOD::DEST_MASK}}}, // Outer-product - // NOTE - currently it's assumed these groups of instructions will be replaced with 1 - {InstructionKind::VOPMULA, {"TODO.VOPMULA.vf", {}}}, - {InstructionKind::VOPMSUB, {".outer.product.vf", {MOD::SWAP_FIRST_TWO_SOURCE_ARGS}}}, + {InstructionKind::VOPMULA, {".outer.product.a.vf", {}}}, + {InstructionKind::VOPMSUB, {".outer.product.b.vf", {MOD::ACC_THIRD_SRC_ARG}}}, // Division {InstructionKind::VDIV, {".div.vf", {MOD::FTF, MOD::FSF}}}, @@ -152,11 +156,11 @@ bool OpenGOALAsm::Function::allows_modifier(InstructionModifiers mod) { return std::find(modifiers.begin(), modifiers.end(), mod) != modifiers.end(); } -OpenGOALAsm::OpenGOALAsm(Instruction _instr) : instr(_instr) { - if (MIPS_ASM_TO_OPEN_GOAL_FUNCS.count(instr.kind) == 0) { +OpenGOALAsm::OpenGOALAsm(Instruction _instr) : m_instr(_instr) { + if (MIPS_ASM_TO_OPEN_GOAL_FUNCS.count(m_instr.kind) == 0) { valid = false; } else { - func = MIPS_ASM_TO_OPEN_GOAL_FUNCS.at(instr.kind); + func = MIPS_ASM_TO_OPEN_GOAL_FUNCS.at(m_instr.kind); if (func.funcTemplate.rfind("TODO", 0) == 0) { todo = true; } @@ -170,11 +174,11 @@ OpenGOALAsm::OpenGOALAsm(Instruction _instr) : instr(_instr) { OpenGOALAsm::OpenGOALAsm(Instruction _instr, std::optional _dst, const std::vector>& _src) - : instr(_instr), m_dst(_dst), m_src(_src) { - if (MIPS_ASM_TO_OPEN_GOAL_FUNCS.count(instr.kind) == 0) { + : m_instr(_instr), m_dst(_dst), m_src(_src) { + if (MIPS_ASM_TO_OPEN_GOAL_FUNCS.count(m_instr.kind) == 0) { valid = false; } else { - func = MIPS_ASM_TO_OPEN_GOAL_FUNCS.at(instr.kind); + func = MIPS_ASM_TO_OPEN_GOAL_FUNCS.at(m_instr.kind); if (func.funcTemplate.rfind("TODO", 0) == 0) { todo = true; } @@ -189,8 +193,8 @@ std::string OpenGOALAsm::full_function_name() { std::string func_name = func.funcTemplate; // OpenGOAL uses the function name for broadcast specification if (func.allows_modifier(MOD::BROADCAST)) { - if (instr.cop2_bc != 0xff) { - std::string bc = std::string(1, instr.cop2_bc_to_char()); + if (m_instr.cop2_bc != 0xff) { + std::string bc = std::string(1, m_instr.cop2_bc_to_char()); func_name = fmt::format(func_name, bc); } } @@ -203,9 +207,9 @@ std::vector OpenGOALAsm::get_args(const std::vector named_args; bool got_fsf = false; - for (int i = 0; i < instr.n_src; i++) { + for (int i = 0; i < m_instr.n_src; i++) { auto v = m_src.at(i); - InstructionAtom atom = instr.get_src(i); + InstructionAtom atom = m_instr.get_src(i); if (v.has_value()) { // Normal register / constant args @@ -236,7 +240,19 @@ std::vector OpenGOALAsm::get_args(const std::vector OpenGOALAsm::get_args(const std::vector OpenGOALAsm::get_args(const std::vectorreg(), m_dst->idx()); + args.push_back(ra.to_form(env)); + } + args.insert(args.end(), named_args.begin(), named_args.end()); return args; } diff --git a/decompiler/IR2/OpenGoalMapping.h b/decompiler/IR2/OpenGoalMapping.h index 4ae4e3adf6..c66be04e08 100644 --- a/decompiler/IR2/OpenGoalMapping.h +++ b/decompiler/IR2/OpenGoalMapping.h @@ -2,7 +2,6 @@ #include #include -#include "common/util/assert.h" #include #include #include "common/goos/Object.h" @@ -11,6 +10,7 @@ #include "decompiler/IR2/IR2_common.h" #include "Env.h" #include "AtomicOp.h" +#include "common/util/assert.h" namespace decompiler { @@ -23,6 +23,7 @@ struct OpenGOALAsm { OFFSET, SWAP_FIRST_TWO_SOURCE_ARGS, ACC_THIRD_SRC_ARG, + QWORD_CAST, SKIP_IT }; @@ -42,7 +43,7 @@ struct OpenGOALAsm { bool valid = true; bool todo = false; bool skip = false; - Instruction instr; + Instruction m_instr; std::optional m_dst; std::vector> m_src; OpenGOALAsm::Function func; diff --git a/decompiler/IR2/bitfields.h b/decompiler/IR2/bitfields.h index b384d02cbc..79fd4015cb 100644 --- a/decompiler/IR2/bitfields.h +++ b/decompiler/IR2/bitfields.h @@ -1,10 +1,9 @@ #pragma once -#include "common/util/assert.h" - #include "common/common_types.h" #include "decompiler/IR2/Form.h" #include "decompiler/util/data_decompile.h" +#include "common/util/assert.h" namespace decompiler { struct BitfieldManip { diff --git a/decompiler/ObjectFile/LinkedObjectFile.cpp b/decompiler/ObjectFile/LinkedObjectFile.cpp index d00cdf36b1..ed935d025c 100644 --- a/decompiler/ObjectFile/LinkedObjectFile.cpp +++ b/decompiler/ObjectFile/LinkedObjectFile.cpp @@ -4,7 +4,6 @@ */ #include -#include "common/util/assert.h" #include #include #include "decompiler/IR/IR.h" @@ -15,6 +14,7 @@ #include "third-party/json.hpp" #include "common/log/log.h" #include "common/goos/PrettyPrinter.h" +#include "common/util/assert.h" namespace decompiler { /*! diff --git a/decompiler/ObjectFile/LinkedObjectFileCreation.cpp b/decompiler/ObjectFile/LinkedObjectFileCreation.cpp index 2a4454b4cb..58925b0682 100644 --- a/decompiler/ObjectFile/LinkedObjectFileCreation.cpp +++ b/decompiler/ObjectFile/LinkedObjectFileCreation.cpp @@ -4,13 +4,13 @@ * This implements a decoder for the GOAL linking format. */ -#include "common/util/assert.h" #include #include "LinkedObjectFileCreation.h" #include "decompiler/config.h" #include "decompiler/util/DecompilerTypeSystem.h" #include "common/link_types.h" #include "common/util/BitUtils.h" +#include "common/util/assert.h" namespace decompiler { // There are three link versions: diff --git a/decompiler/ObjectFile/LinkedWord.h b/decompiler/ObjectFile/LinkedWord.h index e48d18bd2c..188a99fce8 100644 --- a/decompiler/ObjectFile/LinkedWord.h +++ b/decompiler/ObjectFile/LinkedWord.h @@ -8,8 +8,8 @@ #include #include #include -#include "common/util/assert.h" #include "common/common_types.h" +#include "common/util/assert.h" namespace decompiler { class LinkedWord { diff --git a/decompiler/ObjectFile/ObjectFileDB.cpp b/decompiler/ObjectFile/ObjectFileDB.cpp index 7d201a3753..222680c39d 100644 --- a/decompiler/ObjectFile/ObjectFileDB.cpp +++ b/decompiler/ObjectFile/ObjectFileDB.cpp @@ -376,7 +376,7 @@ std::string pad_string(const std::string& in, size_t length) { } } // namespace -std::string ObjectFileDB::generate_obj_listing() { +std::string ObjectFileDB::generate_obj_listing(const std::unordered_set& merged_objs) { std::string result = "["; std::set all_unique_names; int unique_count = 0; @@ -391,23 +391,25 @@ std::string ObjectFileDB::generate_obj_listing() { dgos.pop_back(); dgos.pop_back(); dgos += "]"; - result += "[\"" + pad_string(x.to_unique_name() + "\", ", 50) + "\"" + + auto name = x.to_unique_name(); + result += "[\"" + pad_string(name + "\", ", 50) + "\"" + pad_string(x.name_in_dgo + "\", ", 50) + std::to_string(x.obj_version) + ", " + dgos + ", \"\"],\n"; unique_count++; - if (all_unique_names.find(x.to_unique_name()) != all_unique_names.end()) { - lg::error("Object file {} appears multiple times with the same name.", x.to_unique_name()); + if (all_unique_names.find(name) != all_unique_names.end() && + merged_objs.find(name) == merged_objs.end()) { + lg::error("Object file {} appears multiple times with the same name.", name); } - all_unique_names.insert(x.to_unique_name()); - } - // this check is extremely important. It makes sure we don't have any repeat names. This could - // be caused by two files with the same name, in the same DGOs, but different data. - if (int(all_unique_names.size()) != unique_count) { - lg::error("Object files are not named properly, data will be lost!"); + all_unique_names.insert(name); } } + // this check is extremely important. It makes sure we don't have any repeat names. This could + // be caused by two files with the same name, in the same DGOs, but different data. + if (int(all_unique_names.size()) != unique_count) { + lg::error("Object files are not named properly, data will be lost!"); + } - if (result.length() >= 2) { + if (unique_count > 0) { result.pop_back(); // kill last new line result.pop_back(); // kill last comma } diff --git a/decompiler/ObjectFile/ObjectFileDB.h b/decompiler/ObjectFile/ObjectFileDB.h index eb6e75ce63..db652bec27 100644 --- a/decompiler/ObjectFile/ObjectFileDB.h +++ b/decompiler/ObjectFile/ObjectFileDB.h @@ -7,7 +7,6 @@ * (there may be different object files with the same name sometimes) */ -#include "common/util/assert.h" #include #include #include @@ -16,6 +15,7 @@ #include "common/common_types.h" #include "decompiler/data/TextureDB.h" #include "decompiler/analysis/symbol_def_map.h" +#include "common/util/assert.h" namespace decompiler { /*! @@ -54,7 +54,7 @@ class ObjectFileDB { const std::vector& str_files, const Config& config); std::string generate_dgo_listing(); - std::string generate_obj_listing(); + std::string generate_obj_listing(const std::unordered_set& merged_objs); void process_link_data(const Config& config); void process_labels(); void find_code(const Config& config); @@ -81,7 +81,7 @@ class ObjectFileDB { void ir2_register_usage_pass(int seg, ObjectFileData& data); void ir2_variable_pass(int seg, ObjectFileData& data); void ir2_cfg_build_pass(int seg, ObjectFileData& data); - void ir2_store_current_forms(int seg); + // void ir2_store_current_forms(int seg); void ir2_build_expressions(int seg, const Config& config, ObjectFileData& data); void ir2_insert_lets(int seg, ObjectFileData& data); void ir2_rewrite_inline_asm_instructions(int seg, ObjectFileData& data); diff --git a/decompiler/ObjectFile/ObjectFileDB_IR2.cpp b/decompiler/ObjectFile/ObjectFileDB_IR2.cpp index c1ed0cb5c3..204d795add 100644 --- a/decompiler/ObjectFile/ObjectFileDB_IR2.cpp +++ b/decompiler/ObjectFile/ObjectFileDB_IR2.cpp @@ -23,6 +23,7 @@ #include "decompiler/analysis/static_refs.h" #include "decompiler/analysis/symbol_def_map.h" #include "decompiler/analysis/find_skelgroups.h" +#include "decompiler/analysis/find_defpartgroup.h" #include "common/goos/PrettyPrinter.h" #include "decompiler/IR2/Form.h" #include "decompiler/analysis/mips2c.h" @@ -60,14 +61,21 @@ void ObjectFileDB::analyze_functions_ir2( ir2_do_segment_analysis_phase2(TOP_LEVEL_SEGMENT, config, data); try { if (data.linked_data.functions_by_seg.size() == 3) { - run_defstate(data.linked_data.functions_by_seg.at(2).front(), skip_states); + run_defpartgroup(data.linked_data.functions_by_seg.at(TOP_LEVEL_SEGMENT).front()); + } + } catch (const std::exception& e) { + lg::error("Failed to find defpartgroups: {}", e.what()); + } + try { + if (data.linked_data.functions_by_seg.size() == 3) { + run_defstate(data.linked_data.functions_by_seg.at(TOP_LEVEL_SEGMENT).front(), skip_states); } } catch (const std::exception& e) { lg::error("Failed to find defstates: {}", e.what()); } try { if (data.linked_data.functions_by_seg.size() == 3) { - run_defskelgroups(data.linked_data.functions_by_seg.at(2).front()); + run_defskelgroups(data.linked_data.functions_by_seg.at(TOP_LEVEL_SEGMENT).front()); } } catch (const std::exception& e) { lg::error("Failed to find defskelgroups: {}", e.what()); diff --git a/decompiler/VuDisasm/VuDisassembler.cpp b/decompiler/VuDisasm/VuDisassembler.cpp index 65e08df739..55f849de02 100644 --- a/decompiler/VuDisasm/VuDisassembler.cpp +++ b/decompiler/VuDisasm/VuDisassembler.cpp @@ -3,8 +3,8 @@ #include "VuDisassembler.h" #include "third-party/fmt/core.h" -#include "common/util/assert.h" #include "common/util/print_float.h" +#include "common/util/assert.h" namespace decompiler { @@ -733,4 +733,4 @@ void VuDisassembler::name_labels() { m_label_names.at(label_idx) = fmt::format("L{}", idx++); } } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/VuDisasm/VuInstruction.cpp b/decompiler/VuDisasm/VuInstruction.cpp index 931c5c2b06..30e8f34f60 100644 --- a/decompiler/VuDisasm/VuInstruction.cpp +++ b/decompiler/VuDisasm/VuInstruction.cpp @@ -1,7 +1,6 @@ -#include "common/util/assert.h" #include "third-party/fmt/core.h" - #include "VuInstruction.h" +#include "common/util/assert.h" namespace decompiler { VuInstructionAtom VuInstructionAtom::make_vf(int idx) { @@ -89,4 +88,4 @@ VuInstruction VuInstruction::make_fp_constant(u32 value) { result.kind = VuInstrK::FP_CONSTANT; return result; } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/analysis/atomic_op_builder.cpp b/decompiler/analysis/atomic_op_builder.cpp index 13a15c3482..1c766d3451 100644 --- a/decompiler/analysis/atomic_op_builder.cpp +++ b/decompiler/analysis/atomic_op_builder.cpp @@ -387,7 +387,7 @@ IR2_BranchDelay get_branch_delay(const Instruction& i0, int idx) { return IR2_BranchDelay(IR2_BranchDelay::Kind::NOP); } else if (is_gpr_3(i0, InstructionKind::OR, {}, rs7(), rr0())) { return IR2_BranchDelay(IR2_BranchDelay::Kind::SET_REG_FALSE, make_dst_var(i0, idx)); - } else if (is_gpr_3(i0, InstructionKind::OR, {}, {}, rr0())) { + } else if (is_gpr_3(i0, InstructionKind::OR, {}, {}, rr0()) && !i0.get_src(0).is_reg(rr0())) { return IR2_BranchDelay(IR2_BranchDelay::Kind::SET_REG_REG, make_dst_var(i0, idx), make_src_var(i0.get_src(0).get_reg(), idx)); } else if (i0.kind == InstructionKind::DADDIU && i0.get_src(0).is_reg(rs7()) && @@ -2201,4 +2201,4 @@ FunctionAtomicOps convert_function_to_atomic_ops( assert(func.basic_blocks.size() == result.block_id_to_first_atomic_op.size()); return result; } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/analysis/find_defpartgroup.cpp b/decompiler/analysis/find_defpartgroup.cpp new file mode 100644 index 0000000000..2007c624c4 --- /dev/null +++ b/decompiler/analysis/find_defpartgroup.cpp @@ -0,0 +1,227 @@ +#include "find_defpartgroup.h" +#include "common/goos/PrettyPrinter.h" +#include "decompiler/IR2/Form.h" +#include "decompiler/IR2/GenericElementMatcher.h" +#include "decompiler/ObjectFile/LinkedObjectFile.h" +#include "decompiler/util/data_decompile.h" + +namespace decompiler { + +namespace { + +const goos::Object& car(const goos::Object* x) { + return x->as_pair()->car; +} + +const goos::Object* cdr(const goos::Object* x) { + return &x->as_pair()->cdr; +} + +void read_static_group_data(DecompiledDataElement* src, + const Env& env, + DefpartgroupElement::StaticInfo& group) { + auto lab = src->label(); + // looks like: + /* + .type sparticle-launch-group +L81: + .word 0xbb80042 + .word 0x405dc + .word L83 + .word L82 + .word 0x0 + .word 0x0 + .word 0x0 + .word 0x0 + .word 0x0 + .word 0x0 + .word 0x47800000 +L82: + */ + + int start_word_idx = (lab.offset / 4) - 1; + auto& words = env.file->words_by_seg.at(lab.target_segment); + + auto& first_word = words.at(start_word_idx); + if (first_word.kind() != LinkedWord::TYPE_PTR || + first_word.symbol_name() != "sparticle-launch-group") { + env.func->warnings.warn_and_throw( + "Reference to sparticle-launch-group bad: invalid type pointer"); + } + + auto& word_1 = words.at(start_word_idx + 1); + s16 len = word_1.data & 0xffff; + group.duration = (word_1.data >> 16) & 0xffff; + auto& word_2 = words.at(start_word_idx + 2); + group.linger = word_2.data & 0xffff; + group.flags = (word_2.data >> 16) & 0xffff; + + auto& string_word = words.at(start_word_idx + 3); + if (string_word.kind() != LinkedWord::PTR) { + env.func->warnings.warn_and_throw( + "Reference to sparticle-launch-group bad: invalid name label"); + } + group.name = env.file->get_goal_string_by_label( + env.file->get_label_by_name(env.file->get_label_name(string_word.label_id()))); + + auto& array_word = words.at(start_word_idx + 4); + if (array_word.kind() != LinkedWord::PTR) { + env.func->warnings.warn_and_throw( + "Reference to sparticle-launch-group bad: invalid array label"); + } + auto& array_lab = env.file->get_label_by_name(env.file->get_label_name(array_word.label_id())); + auto& array_words = env.file->words_by_seg.at(array_lab.target_segment); + int array_start_word_idx = array_lab.offset / 4; + group.elts.clear(); + for (int i = 0; i < len; ++i) { + int item_idx = i * 8 + array_start_word_idx; + auto& item = group.elts.emplace_back(); + item.part_id = array_words.at(item_idx + 0).data; + item.fade = *reinterpret_cast(&array_words.at(item_idx + 1).data); + item.falloff = *reinterpret_cast(&array_words.at(item_idx + 2).data); + item.flags = array_words.at(item_idx + 3).data & 0xffff; + item.period = (array_words.at(item_idx + 3).data >> 16) & 0xffff; + item.length = array_words.at(item_idx + 4).data & 0xffff; + item.offset = (array_words.at(item_idx + 4).data >> 16) & 0xffff; + item.hour_mask = array_words.at(item_idx + 5).data; + item.binding = array_words.at(item_idx + 6).data; + } + + for (int i = 0; i < 4; i++) { + auto& word = words.at(start_word_idx + 8 + i); + if (word.kind() != LinkedWord::PLAIN_DATA) { + env.func->warnings.warn_and_throw("Reference to sparticle-launch-group bad: invalid bounds"); + } + group.bounds[i] = *reinterpret_cast(&word.data); + } +} + +void read_static_part_data(DecompiledDataElement* src, + const Env& env, + DefpartElement::StaticInfo& part) { + auto lab = src->label(); + // looks like: + /* + .type sparticle-launcher +L79: + .word 0x0 + .word 0x0 + .word L80 +L80: + .word 0x1 + .word 0x201200 + .word 0x0 + .word 0x0 + .word 0x10006 + .word 0x3dcccccd + .word 0x0 + .word 0x3f800000 + */ + + int start_word_idx = (lab.offset / 4) - 1; + auto& words = env.file->words_by_seg.at(lab.target_segment); + + auto& first_word = words.at(start_word_idx); + if (first_word.kind() != LinkedWord::TYPE_PTR || + first_word.symbol_name() != "sparticle-launcher") { + env.func->warnings.warn_and_throw("Reference to sparticle-launcher bad: invalid type pointer"); + } + + auto& empty1 = words.at(start_word_idx + 1); + auto& empty2 = words.at(start_word_idx + 2); + if (empty1.kind() != LinkedWord::PLAIN_DATA || empty1.data != 0 || + empty2.kind() != LinkedWord::PLAIN_DATA || empty2.data != 0) { + env.func->warnings.warn_and_throw("Reference to sparticle-launcher bad: accums not empty"); + } + + auto& array_word = words.at(start_word_idx + 3); + if (array_word.kind() != LinkedWord::PTR) { + env.func->warnings.warn_and_throw("Reference to sparticle-launcher bad: invalid array label"); + } + auto& array_lab = env.file->get_label_by_name(env.file->get_label_name(array_word.label_id())); + auto& array_words = env.file->words_by_seg.at(array_lab.target_segment); + int array_start_word_idx = array_lab.offset / 4; + part.fields.clear(); + src->do_decomp(env, env.file); + auto obj = src->to_form(env); + obj = car(cdr(cdr(&obj))); + auto cur_field = cdr(&obj); + for (int i = 0; true; ++i) { + int field_idx = i * 4 + array_start_word_idx; + auto& item = part.fields.emplace_back(); + item.field_id = array_words.at(field_idx + 0).data & 0xffff; + item.flags = (array_words.at(field_idx + 0).data >> 16) & 0xffff; + item.data.push_back(array_words.at(field_idx + 0)); + item.data.push_back(array_words.at(field_idx + 1)); + item.data.push_back(array_words.at(field_idx + 2)); + item.data.push_back(array_words.at(field_idx + 3)); + if (item.field_id == 7) { + auto& fld = car(cur_field); + item.sound_spec = cdr(cdr(cdr(cdr(&fld))))->as_pair()->car; + } + if (item.field_id == 67) { + // sp-end + break; + } + cur_field = cdr(cur_field); + } +} + +} // namespace + +void run_defpartgroup(Function& top_level_func) { + auto& env = top_level_func.ir2.env; + auto& pool = *top_level_func.ir2.form_pool; + if (!top_level_func.ir2.top_form) { + return; + } + top_level_func.ir2.top_form->apply_form([&](Form* form) { + for (auto& fe : form->elts()) { + auto as_set = dynamic_cast(fe); + if (as_set) { + /* Looks something like this: + (set! (-> *part-group-id-table* 188) (new 'static 'sparticle-launch-group + */ + if (as_set->dst()->elts().size() != 1) { + continue; + } + auto dest = dynamic_cast(as_set->dst()->elts().at(0)); + if (!dest) + continue; + if (dest->tokens().size() != 1) + continue; + if (dest->tokens().at(0).kind() != DerefToken::Kind::INTEGER_CONSTANT) + continue; + if (dest->base()->elts().size() != 1) + continue; + auto dest_base = dynamic_cast(dest->base()->elts().at(0)); + if (!dest_base || !dest_base->expr().is_identity() || dest_base->expr().args() < 1) + continue; + auto src = dynamic_cast(as_set->src()->elts().at(0)); + if (!src) + continue; + auto& sym = dest_base->expr().get_arg(0); + if (!sym.is_sym_val()) + continue; + + int id = dest->tokens().at(0).int_constant(); + if (sym.get_str() == "*part-group-id-table*") { + DefpartgroupElement::StaticInfo group; + read_static_group_data(src, env, group); + auto rewritten = pool.alloc_element(group, id); + if (rewritten) { + fe = rewritten; + } + } else if (sym.get_str() == "*part-id-table*") { + DefpartElement::StaticInfo part; + read_static_part_data(src, env, part); + auto rewritten = pool.alloc_element(part, id); + if (rewritten) { + fe = rewritten; + } + } + } + } + }); +} +} // namespace decompiler diff --git a/decompiler/analysis/find_defpartgroup.h b/decompiler/analysis/find_defpartgroup.h new file mode 100644 index 0000000000..bceed3b914 --- /dev/null +++ b/decompiler/analysis/find_defpartgroup.h @@ -0,0 +1,7 @@ +#pragma once + +#include "decompiler/Function/Function.h" + +namespace decompiler { +void run_defpartgroup(Function& top_level_func); +} diff --git a/decompiler/analysis/inline_asm_rewrite.cpp b/decompiler/analysis/inline_asm_rewrite.cpp index 48142ce606..72c4f943b1 100644 --- a/decompiler/analysis/inline_asm_rewrite.cpp +++ b/decompiler/analysis/inline_asm_rewrite.cpp @@ -42,7 +42,7 @@ bool rewrite_inline_asm_instructions(Form* top_level_form, /*lg::warn("[ASM Re-Write] - Unsupported inline assembly instruction kind - [{}]", asmOp.instr.kind);*/ f.warnings.general_warning("Unsupported inline assembly instruction kind - [{}]", - asmOp.instr.to_string(f.ir2.env.file->labels)); + asmOp.m_instr.to_string(f.ir2.env.file->labels)); new_entries.push_back(entry); continue; } else if (asmOp.skip) { diff --git a/decompiler/analysis/mips2c.cpp b/decompiler/analysis/mips2c.cpp index fbb9ada00d..607298db78 100644 --- a/decompiler/analysis/mips2c.cpp +++ b/decompiler/analysis/mips2c.cpp @@ -2,6 +2,7 @@ #include "mips2c.h" +#include "common/symbols.h" #include "common/util/print_float.h" #include "decompiler/Disasm/InstructionMatching.h" #include "decompiler/Function/Function.h" @@ -91,6 +92,8 @@ std::string goal_to_c_function_name(const FunctionName& name) { switch (name.kind) { case FunctionName::FunctionKind::GLOBAL: return goal_to_c_name(name.function_name); + case FunctionName::FunctionKind::METHOD: + return fmt::format("method_{}_{}", name.method_id, goal_to_c_name(name.type_name)); default: assert(false); } @@ -568,8 +571,29 @@ Mips2C_Line handle_generic_op2_u16(const Instruction& i0, const std::string& ins instr_str}; } +Mips2C_Line handle_daddiu(Mips2C_Output& out, const Instruction& i0, const std::string& instr_str) { + if (i0.get_src(1).is_label()) { + return {instr_str, instr_str}; + } else if (i0.get_src(0).is_reg(rs7()) && i0.get_src(1).is_sym("#t")) { + return {fmt::format("c->{}({}, {}, {});", i0.op_name_to_string(), reg_to_name(i0.get_dst(0)), + reg_to_name(i0.get_src(0)), FIX_SYM_TRUE), + instr_str}; + } else if (i0.get_src(0).is_reg(rs7()) && i0.get_src(1).is_sym()) { + out.require_symbol(i0.get_src(1).get_sym()); + return {fmt::format("c->load_symbol_addr({}, cache.{});", reg_to_name(i0.get_dst(0)), + goal_to_c_name(i0.get_src(1).get_sym())), + instr_str}; + } else { + return handle_generic_op2_u16(i0, instr_str); + } +} + Mips2C_Line handle_sw(Mips2C_Output& out, const Instruction& i0, const std::string& instr_str) { if (i0.get_src(1).is_sym() && i0.get_src(2).is_reg(rs7())) { + out.require_symbol(i0.get_src(1).get_sym()); + return {fmt::format("c->store_symbol({}, cache.{});", reg_to_name(i0.get_src(0)), + goal_to_c_name(i0.get_src(1).get_sym())), + instr_str}; return handle_unknown(instr_str); // auto name = i0.get_src(1).get_sym(); // // store into symbol table! @@ -745,12 +769,22 @@ Mips2C_Line handle_likely_branch_bc(const Instruction& i0, const std::string& in switch (i0.kind) { case InstructionKind::BLTZL: return {fmt::format("((s64){}) < 0", reg64_or_zero(i0.get_src(0))), instr_str}; + case InstructionKind::BGEZL: + return {fmt::format("((s64){}) >= 0", reg64_or_zero(i0.get_src(0))), instr_str}; + case InstructionKind::BGTZL: + return {fmt::format("((s64){}) > 0", reg64_or_zero(i0.get_src(0))), instr_str}; case InstructionKind::BNEL: return {fmt::format("((s64){}) != ((s64){})", reg64_or_zero(i0.get_src(0)), reg64_or_zero(i0.get_src(1))), instr_str}; + case InstructionKind::BEQL: + return {fmt::format("((s64){}) == ((s64){})", reg64_or_zero(i0.get_src(0)), + reg64_or_zero(i0.get_src(1))), + instr_str}; case InstructionKind::BC1TL: return {"cop1_bc", instr_str}; + case InstructionKind::BC1FL: + return {"!cop1_bc", instr_str}; default: return handle_unknown(instr_str); } @@ -826,6 +860,18 @@ Mips2C_Line handle_clts(const Instruction& i0, const std::string& instr_string) instr_string}; } +Mips2C_Line handle_cles(const Instruction& i0, const std::string& instr_string) { + return {fmt::format("cop1_bc = c->fprs[{}] <= c->fprs[{}];", reg_to_name(i0.get_src(0)), + reg_to_name(i0.get_src(1))), + instr_string}; +} + +Mips2C_Line handle_ceqs(const Instruction& i0, const std::string& instr_string) { + return {fmt::format("cop1_bc = c->fprs[{}] == c->fprs[{}];", reg_to_name(i0.get_src(0)), + reg_to_name(i0.get_src(1))), + instr_string}; +} + Mips2C_Line handle_pmfhl_lh(const Instruction& i0, const std::string& instr_string) { return {fmt::format("c->pmfhl_lh({});", reg_to_name(i0.get_dst(0))), instr_string}; } @@ -884,12 +930,16 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, return handle_generic_op2_mask(i0, instr_str, "vmove"); case InstructionKind::VITOF0: return handle_generic_op2_mask(i0, instr_str, "vitof0"); + case InstructionKind::VITOF12: + return handle_generic_op2_mask(i0, instr_str, "vitof12"); case InstructionKind::VFTOI0: return handle_generic_op2_mask(i0, instr_str, "vftoi0"); case InstructionKind::VFTOI4: return handle_generic_op2_mask(i0, instr_str, "vftoi4"); case InstructionKind::VFTOI12: return handle_generic_op2_mask(i0, instr_str, "vftoi12"); + case InstructionKind::VABS: + return handle_generic_op2_mask(i0, instr_str, "vabs"); case InstructionKind::VADDQ: return handle_generic_op2_mask(i0, instr_str, "vaddq"); case InstructionKind::ANDI: @@ -915,7 +965,9 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, case InstructionKind::PEXTLB: case InstructionKind::MOVN: case InstructionKind::PEXTUW: + case InstructionKind::PEXTLW: case InstructionKind::PCPYUD: + case InstructionKind::PCPYLD: case InstructionKind::PPACH: case InstructionKind::PINTEH: case InstructionKind::PCGTW: @@ -946,6 +998,7 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, case InstructionKind::AND: return handle_generic_op3(i0, instr_str, "and_"); // and isn't allowed in C++ case InstructionKind::DADDIU: + return handle_daddiu(output, i0, instr_str); case InstructionKind::ADDIU: return handle_generic_op2_u16(i0, instr_str); case InstructionKind::QMTC2: @@ -986,6 +1039,8 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, return handle_generic_op2(i0, instr_str, "mtc1"); case InstructionKind::NEGS: return handle_generic_op2(i0, instr_str, "negs"); + case InstructionKind::MOVS: + return handle_generic_op2(i0, instr_str, "movs"); case InstructionKind::CVTWS: return handle_generic_op2(i0, instr_str, "cvtws"); case InstructionKind::CVTSW: @@ -1001,6 +1056,12 @@ Mips2C_Line handle_normal_instr(Mips2C_Output& output, case InstructionKind::CLTS: output.needs_cop1_bc = true; return handle_clts(i0, instr_str); + case InstructionKind::CLES: + output.needs_cop1_bc = true; + return handle_cles(i0, instr_str); + case InstructionKind::CEQS: + output.needs_cop1_bc = true; + return handle_ceqs(i0, instr_str); case InstructionKind::VWAITQ: return handle_plain_op(i0, instr_str, "vwaitq"); case InstructionKind::VOPMULA: diff --git a/decompiler/analysis/variable_naming.h b/decompiler/analysis/variable_naming.h index cb1a6d5af1..ff4c22c224 100644 --- a/decompiler/analysis/variable_naming.h +++ b/decompiler/analysis/variable_naming.h @@ -20,11 +20,12 @@ #include #include -#include "common/util/assert.h" #include "decompiler/Disasm/Register.h" #include "decompiler/IR2/IR2_common.h" #include "decompiler/util/TP_Type.h" +#include "common/util/assert.h" + namespace decompiler { class Function; diff --git a/decompiler/config.cpp b/decompiler/config.cpp index fdc9f29a96..69b9679972 100644 --- a/decompiler/config.cpp +++ b/decompiler/config.cpp @@ -202,6 +202,12 @@ Config read_config_file(const std::string& path_to_config_file) { config.bad_format_strings = hacks_json.at("bad_format_strings").get>(); + + auto merged = hacks_json.at("expected_merged_objs").get>(); + for (const auto& x : merged) { + config.merged_objects.insert(x); + } + config.levels_to_extract = cfg.at("levels_to_extract").get>(); return config; } diff --git a/decompiler/config.h b/decompiler/config.h index e870fcb2fe..d0c11063c3 100644 --- a/decompiler/config.h +++ b/decompiler/config.h @@ -115,6 +115,7 @@ struct Config { std::unordered_set allowed_objects; std::unordered_set banned_objects; + std::unordered_set merged_objects; std::unordered_map>> register_type_casts_by_function_by_atomic_op_idx; std::unordered_map> diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index b7b9cd2fdf..ea6753d46c 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -399,8 +399,8 @@ ) (deftype res-tag-pair (uint64) - ((lo uint32 :offset 0) - (hi uint32 :offset 32) + ((lo int32 :offset 0) + (hi int32 :offset 32) ) ;; made-up type ) @@ -647,20 +647,24 @@ :bitfield #t :type uint32 (display-marks 0) - (bit1 1) - (bit2 2) - (bit3 3) ;; TODO - nav-enemy::45 - (bit4 4) - (bit5 5) ;; TODO - nav-enemy::45 - (bit6 6) ;; TODO - nav-enemy::45 - (bit7 7) ;; TODO - nav-enemy::45 + (bit1 1) ;; TODO - nav-control::9 + (bit2 2) ;; TODO - nav-control::9 + (bit3 3) ;; TODO - nav-enemy::45 | nav-control::9 + (bit4 4) ;; TODO - nav-control::9 + (bit5 5) ;; TODO - nav-enemy::45 | ;; TODO - nav-control::9 + (bit6 6) ;; TODO - nav-enemy::45 | ;; TODO - nav-control::9 + (bit7 7) ;; TODO - nav-enemy::45 | ;; TODO - nav-control::9 (bit8 8) + (bit9 9) ;; TODO - nav-control::14 | 11 (bit10 10) ;; TODO - nav-enemy::nav-enemy-patrol-post + (bit11 11) ;; TODO - nav-control::28 (bit12 12) ;; TODO - rolling-lightning-mole::(enter nav-enemy-chase fleeing-nav-enemy) (bit13 13) - (bit17 17) - (bit19 19) ;; TODO - nav-enemy::lambda::17 - (bit21 21) + (bit17 17) ;; TODO - nav-control::11 + (bit18 18) ;; TODO - nav-control::11 + (bit19 19) ;; TODO - nav-control::11 | 17 + (bit20 20) ;; TODO - nav-mesh::28 + (bit21 21) ;; TODO - nav-control::19 ) (defenum task-status @@ -980,7 +984,7 @@ (jungleb-eco-vents-opened #x289) (sidekick-speech-crate-steel-break2 #x28e) (sidekick-speech-hint-crate-darkeco2 #x28f) - + (daxter-screaming-jump #x290) (daxter-wahoo-jump #x291) (daxter-get-some #x292) @@ -988,12 +992,12 @@ (collectables-scout-flies-red-boxes #x295) (found-all-scout-flies #x296) (yakow-owed-powercell #x297) - + (jungle-mirrors-tutorial #x29c) (jungle-mirrors-break-the-mirror-jak #x29d) (jungle-mirrors-go-to-the-next-tower #x29f) (jungle-mirrors-follow-the-beam #x2a0) - + (misty-teetertotter-bonk-dax-tutorial #x2a4) (sidekick-hint-misty-get-red-eco #x2a5) @@ -1226,7 +1230,7 @@ (sage-voicebox-hint-crate-iron #x917) (training-warp-gate-blocked #x919) (training-warp-gate-reminder #x91a) - + (training-gimmie-task-name #x91b) (training-buzzer-task-name #x91c) (training-door-task-name #x91d) @@ -1238,14 +1242,6 @@ ) ;; GAME-TEXT-ID ENUM ENDS -;; ---------------------- -;; File - gstring-h -;; Source Path - kernel/gstring-h.gc -;; Containing DGOs - ['KERNEL'] -;; Version - 3 - -;; - Nothing Defined in This File! - ;; ---------------------- ;; File - gkernel-h @@ -1473,6 +1469,7 @@ :method-count-assert 9 :size-assert #x48 :flag-assert #x900000048 + :always-stack-singleton ) ;; - Symbols @@ -1515,6 +1512,9 @@ (:methods (new (symbol type basic int) _type_ 0) ) + (:states + dead-state + empty-state) :size-assert #x70 :method-count-assert 14 :no-runtime-type ;; already defined by kscheme. Don't do it again. @@ -1560,7 +1560,6 @@ ;; - Symbols -(define-extern dead-state (state process)) (define-extern *kernel-context* kernel-context) (define-extern *enable-method-set* int) (define-extern *listener-process* process) @@ -1767,15 +1766,6 @@ (define-extern uint32 type) -;; ---------------------- -;; File - vu1-macros -;; Source Path - engine/ps2/vu1-macros.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - math ;; Source Path - engine/math/math.gc @@ -1974,7 +1964,7 @@ (deftype vector4w-3 (structure) ((data int32 12 :score -9999 :offset-assert 0) (quad uint128 3 :offset 0) - (vector vector4w 3 :inline :offset 0) + (vector vector4w 3 :inline :score 100 :offset 0) ) :method-count-assert 9 :size-assert #x30 @@ -2206,15 +2196,6 @@ (define-extern *zero-vector* vector) -;; ---------------------- -;; File - gravity-h -;; Source Path - engine/physics/gravity-h.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - bounding-box-h ;; Source Path - engine/geometry/bounding-box-h.gc @@ -2423,15 +2404,6 @@ ) -;; ---------------------- -;; File - trigonometry-h -;; Source Path - engine/math/trigonometry-h.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - transformq-h ;; Source Path - engine/math/transformq-h.gc @@ -6524,14 +6496,6 @@ :flag-assert #x900002004 ) -;; ---------------------- -;; File - game-task-h -;; Source Path - engine/game/task/game-task-h.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - ;; ---------------------- ;; File - hint-control-h @@ -7718,7 +7682,8 @@ :method-count-assert 14 :size-assert #xb8 :flag-assert #xe005000b8 - ;; inherited inspect of process + (:states + time-of-day-tick) ) (deftype time-of-day-palette (basic) @@ -9087,16 +9052,18 @@ :flag-assert #x900000002 ) -; (deftype shadow-edge (structure) -; ((ind-0 uint16 :offset-assert 0) -; (ind-1 uint16 :offset-assert 2) -; (tri-0 uint16 :offset-assert 4) -; (tri-1 uint16 :offset-assert 6) -; ) -; :method-count-assert 9 -; :size-assert #x4 -; :flag-assert #x900000004 -; ) +;; Defined twice, the second definition won? +;; the fields here are wrong and need to be corrected assuming that is the case +;; (deftype shadow-edge (structure) +;; ((ind-0 uint16 :offset-assert 0) +;; (ind-1 uint16 :offset-assert 2) +;; (tri-0 uint16 :offset-assert 4) +;; (tri-1 uint16 :offset-assert 6) +;; ) +;; :method-count-assert 9 +;; :size-assert #x4 +;; :flag-assert #x900000008 +;; ) (deftype shadow-tri (structure) ((ind-0 uint8 :offset-assert 0) @@ -9153,15 +9120,6 @@ (define-extern *shadow-debug* symbol) -;; ---------------------- -;; File - shadow-vu1-h -;; Source Path - engine/gfx/shadow/shadow-vu1-h.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - memcard-h ;; Source Path - engine/ps2/memcard-h.gc @@ -9414,7 +9372,7 @@ (load-game! (_type_ game-save) game-save 25) (clear-text-seen! (_type_ game-text-id) none 26) (get-death-count (_type_ symbol) int 27) - (get-health-percent-lost (_type_) float 28) + (get-health-percent-lost (_type_ symbol) float 28) ) ) @@ -9620,7 +9578,7 @@ :size-assert #x30 :flag-assert #xa00000030 (:methods - (dummy-9 (_type_) _type_ 9) + (debug-print-frames (_type_) _type_ 9) ) ) @@ -9653,7 +9611,7 @@ (:methods (new (symbol type int) _type_ 0) (dummy-9 (_type_) float 9) - (dummy-10 (_type_ symbol) int 10) + (debug-print-channels (_type_ symbol) int 10) ) ) @@ -10237,7 +10195,6 @@ ;; - Symbols -(define-extern process-drawable-art-error (state string process-drawable)) (define-extern *FACT-bank* fact-bank) @@ -10289,6 +10246,7 @@ (declare-type sparticle-launch-control basic) (declare-type water-control basic) (declare-type collide-shape basic) +(declare-type nav-control basic) (deftype process-drawable (process) ((root trsqv :offset-assert 112) (node-list cspace-array :offset-assert 116) @@ -10319,6 +10277,9 @@ (dummy-18 (_type_) none 18) (dummy-19 (_type_) none 19) ) + (:states + (process-drawable-art-error string) + process-drawable-idle) ) (deftype process-drawable-reserved (process-drawable) @@ -10446,9 +10407,11 @@ :method-count-assert 20 :size-assert #x114 :flag-assert #x1400b00114 + (:states + manipy-idle) ) -(declare-type sparticle-launch-group structure) +(declare-type sparticle-launch-group basic) (deftype part-spawner (process-drawable) ((mode (pointer sparticle-launch-group) :offset-assert 176) ;; takes a part-spawner as it's first arg in method 9 (enable symbol :offset-assert 180) @@ -10460,8 +10423,10 @@ :size-assert #xd0 :flag-assert #x15006000d0 (:methods - (dummy-20 (_type_) none 20) + (dummy-20 (_type_) symbol 20) ) + (:states + part-spawner-active) ) (deftype part-tracker (process) @@ -10483,6 +10448,8 @@ :method-count-assert 14 :size-assert #xf8 :flag-assert #xe009000f8 + (:states + part-tracker-process) ) (deftype camera-tracker (process) @@ -10514,6 +10481,8 @@ (:methods (dummy-14 (_type_ pair) process 14) ) + (:states + camera-tracker-process) ) (declare-type collide-shape-moving basic) @@ -10522,7 +10491,7 @@ (duration uint64 :offset-assert 176) (target handle :offset-assert 184) (event symbol :offset-assert 192) - (run-function (function none) :offset-assert 196) + (run-function (function object) :offset-assert 196) (callback (function touch-tracker none) :offset-assert 200) (event-mode basic :offset-assert 204) ;; not a basic! ) @@ -10530,6 +10499,8 @@ :method-count-assert 20 :size-assert #xd0 :flag-assert #x14006000d0 + (:states + touch-tracker-idle) ) (deftype swingpole (process) @@ -10542,6 +10513,9 @@ :method-count-assert 14 :size-assert #x98 :flag-assert #xe00300098 + (:states + swingpole-stance + swingpole-active) ) (deftype gui-query (structure) @@ -10580,6 +10554,8 @@ :method-count-assert 14 :size-assert #xc4 :flag-assert #xe006000c4 + (:states + othercam-running) ) (deftype process-hidden (process) @@ -11028,15 +11004,6 @@ (define-extern last-try-to-look-at-data try-to-look-at-info) -;; ---------------------- -;; File - collide-func-h -;; Source Path - engine/collide/collide-func-h.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - collide-mesh-h ;; Source Path - engine/collide/collide-mesh-h.gc @@ -11080,12 +11047,12 @@ :flag-assert #x1000000028 (:methods (debug-draw-tris (_type_ process-drawable int) none 9) - (dummy-10 (_type_ object vector) none 10) ;; what is the second arg!? - (dummy-11 (_type_) none 11) - (dummy-12 (_type_ collide-mesh-cache-tri collide-tri-result vector float) float 12) - (dummy-13 (_type_) none 13) - (dummy-14 (_type_) none 14) - (dummy-15 (_type_) none 15) + (overlap-test (_type_ collide-mesh-cache-tri vector) symbol 10) + (should-push-away-test (_type_ collide-mesh-cache-tri collide-tri-result vector float) float 11) ;; spat + (sphere-on-platform-test (_type_ collide-mesh-cache-tri collide-tri-result vector float) float 12) ;; sopt + (populate-cache! (_type_ collide-mesh-cache-tri matrix) none 13) + (dummy-14 (_type_ object object) none 14) + (dummy-15 (_type_ object object object) none 15) ) ) @@ -11099,7 +11066,7 @@ :size-assert #xa020 :flag-assert #xc0000a020 (:methods - (dummy-9 (_type_) none 9) + (allocate! (_type_ int) int 9) (is-id? (_type_ int) symbol 10) (next-id! (_type_) uint 11) ) @@ -11161,7 +11128,7 @@ (deftype pull-rider-info (structure) ((rider collide-sticky-rider :offset-assert 0) - (rider-cshape collide-shape-prim :offset-assert 4) ;; collide-shape-prim fixes some methods...but this is likely a collide-shape...right (it fixes other methods!) + (rider-cshape collide-shape-moving :offset-assert 4) (rider-delta-ry float :offset-assert 8) (rider-dest vector :inline :offset-assert 16) ) @@ -11211,14 +11178,124 @@ :flag-assert #x900000008 ) + +(defenum collide-kind + :type uint64 + :bitfield #t + (background 0) + (cak-1 1) ;; hit by player + (cak-2 2) ;; usually hit by player + (cak-3 3) ;; hit by others + (target 4) ;; target + (water 5) + (powerup 6) + (crate 7) + (enemy 8) ;; also used for powerups + (wall-object 9) ;; also object. door, pusher (blockers?) + (projectile 10) + (ground-object 11) ;; object, like darkecobarray, platforms + (target-attack 12) ;; all target attacks + (mother-spider 13) + (cak-14 14) ;; unused + (blue-eco-suck 15) ;; manipy, orb-cache-top, + (unknown-16 16) + (unknown-17 17) + (unknown-18 18) + (unknown-19 19) + (unknown-20 20) + (unknown-21 21) + (unknown-22 22) + (unknown-23 23) + (unknown-24 24) + (unknown-25 25) + (unknown-26 26) + (unknown-27 27) + (unknown-28 28) + (unknown-29 29) + (unknown-30 30) + (unknown-31 31) + (unknown-32 32) + (unknown-33 33) + (unknown-34 34) + (unknown-35 35) + (unknown-36 36) + (unknown-37 37) + (unknown-38 38) + (unknown-39 39) + (unknown-40 40) + (unknown-41 41) + (unknown-42 42) + (unknown-43 43) + (unknown-44 44) + (unknown-45 45) + (unknown-46 46) + (unknown-47 47) + (unknown-48 48) + (unknown-49 49) + (unknown-50 50) + (unknown-51 51) + (unknown-52 52) + (unknown-53 53) + (unknown-54 54) + (unknown-55 55) + (unknown-56 56) + (unknown-57 57) + (unknown-58 58) + (unknown-59 59) + (unknown-60 60) + (unknown-61 61) + (unknown-62 62) + (unknown-63 63) + ) + +(defenum collide-action + :type uint32 + :bitfield #t + (solid 0) + (ca-1 1) ;; sticky? + (ca-2 2) ;; target? + (ca-3 3) ;; edge grab related? if set, we can't initiate collision. + (ca-4 4) + (ca-5 5) ;; unused? + (ca-6 6) ;; swing pole, manipy + (ca-7 7) ;; camera + (ca-8 8) ;; swingpole + (ca-9 9) ;; eco vents? + (ca-10 10) + (ca-11 11) + (ca-12 12) + (ca-13 13) + (ca-14 14) + (ca-15 15) ;; manipy + (ca-16 16) + ) + +(defenum collide-offense + :type int8 + (no-offense 0) + (touch 1) ;; just have to touch + (normal-attack 2) ;; any attack (like a normal crate) + (strong-attack 3) ;; hit with zoomer, slide, ground pound/flop, flut attack + (indestructible 4) ;; can't attack it. + ) + +(defenum collide-prim-type + :type int8 + :bitfield #t + (bad -2) + (unk0 0) + (unk1 1) + ) + + (deftype collide-prim-core (structure) - ((world-sphere vector :inline :offset-assert 0) - (collide-as uint64 :offset-assert 16) - (action uint32 :offset-assert 24) - (offense int8 :offset-assert 28) - (prim-type int8 :offset-assert 29) - (extra uint8 2 :offset-assert 30) - (quad uint128 2 :offset 0) + ((world-sphere vector :inline :offset-assert 0) + (collide-as collide-kind :offset-assert 16) + (action collide-action :offset-assert 24) + (offense collide-offense :offset-assert 28) + (prim-type int8 :offset-assert 29) + (extra uint8 2 :offset-assert 30) + (quad uint128 2 :offset 0) ) :method-count-assert 9 :size-assert #x20 @@ -11226,17 +11303,19 @@ ) (declare-type collide-cache-prim structure) +(declare-type collide-shape-prim-group basic) +(declare-type collide-cache basic) (deftype collide-shape-prim (basic) ((cshape collide-shape :offset-assert 4) (prim-id uint32 :offset-assert 8) (transform-index int8 :offset-assert 12) (prim-core collide-prim-core :inline :offset-assert 16) (local-sphere vector :inline :offset-assert 48) - (collide-with uint64 :offset-assert 64) + (collide-with collide-kind :offset-assert 64) (world-sphere vector :inline :offset 16) - (collide-as uint64 :offset 32) - (action uint32 :offset 40) - (offense int8 :offset 44) + (collide-as collide-kind :offset 32) + (action collide-action :offset 40) + (offense collide-offense :offset 44) (prim-type int8 :offset 45) (radius meters :offset 60) ) @@ -11245,25 +11324,25 @@ :flag-assert #x1c00000048 (:methods (new (symbol type collide-shape uint int) _type_ 0) - (dummy-9 (_type_ vector) object 9) ;; ret - symbol | float - (dummy-10 (_type_ uint) collide-shape-prim 10) + (move-by-vector! (_type_ vector) none 9) + (find-prim-by-id (_type_ uint) collide-shape-prim 10) (debug-draw-world-sphere (_type_) symbol 11) - (add-fg-prim-using-box (_type_ process-drawable) none 12) - (add-fg-prim-using-line-sphere (_type_ process-drawable) none 13) - (add-fg-prim-using-y-probe (_type_ process-drawable) none 14) - (overlaps-others-test (_type_) symbol 15) - (dummy-16 () none 16) + (add-fg-prim-using-box (_type_ collide-cache) none 12) + (add-fg-prim-using-line-sphere (_type_ collide-cache) none 13) + (add-fg-prim-using-y-probe (_type_ collide-cache) none 14) + (overlaps-others-test (_type_ overlaps-others-params collide-shape-prim) symbol 15) + (overlaps-others-group (_type_ overlaps-others-params collide-shape-prim-group) symbol 16) (dummy-17 () none 17) (collide-with-collide-cache-prim-mesh (_type_ collide-shape-intersect collide-cache-prim) none 18) (collide-with-collide-cache-prim-sphere (_type_ collide-shape-intersect collide-cache-prim) none 19) - (dummy-20 (_type_ uint) symbol 20) + (add-to-bounding-box (_type_ collide-kind) symbol 20) (num-mesh (_type_ collide-shape-prim) int 21) - (on-platform-test (_type_ _type_ collide-overlap-result float) pat-surface 22) - (should-push-away-test () none 23) - (dummy-24 () none 24) - (dummy-25 (_type_ process-drawable) symbol 25) - (set-collide-as! (_type_ handle) none 26) - (set-collide-with! (_type_ handle) none 27) + (on-platform-test (_type_ collide-shape-prim collide-overlap-result float) none 22) + (should-push-away-test (_type_ collide-shape-prim collide-overlap-result) none 23) + (should-push-away-reverse-test (_type_ collide-shape-prim-group collide-overlap-result) none 24) + (update-transforms! (_type_ process-drawable) symbol 25) + (set-collide-as! (_type_ collide-kind) none 26) + (set-collide-with! (_type_ collide-kind) none 27) ) ) @@ -11282,7 +11361,7 @@ ((mesh collide-mesh :offset-assert 72) (mesh-id int32 :offset-assert 76) (mesh-cache-id uint64 :offset-assert 80) - (mesh-cache-tris uint32 :offset-assert 88) + (mesh-cache-tris (inline-array collide-mesh-cache-tri) :offset-assert 88) ) :method-count-assert 29 :size-assert #x5c @@ -11295,6 +11374,7 @@ (deftype collide-shape-prim-group (collide-shape-prim) ((num-prims int32 :offset-assert 72) + (num-prims-u uint32 :offset 72) (allocated-prims int32 :offset-assert 76) (prim collide-shape-prim 1 :offset-assert 80) (prims collide-shape-prim :dynamic :score 20 :offset 80) ;; added @@ -11305,7 +11385,7 @@ (:methods (new (symbol type collide-shape uint int) _type_ 0) (append-prim (_type_ collide-shape-prim) none 28) - (dummy-29 (_type_ uint) none 29) + (add-to-non-empty-bounding-box (_type_ collide-kind) none 29) ) ) @@ -11322,42 +11402,42 @@ (event-other basic :offset-assert 156) (root-prim collide-shape-prim :offset-assert 160) ;; i think this can be any subtype of collide-shape-prim as well! (riders collide-sticky-rider-group :offset-assert 164) - (backup-collide-as uint64 :offset-assert 168) - (backup-collide-with uint64 :offset-assert 176) + (backup-collide-as collide-kind :offset-assert 168) + (backup-collide-with collide-kind :offset-assert 176) ) :method-count-assert 56 :size-assert #xb8 :flag-assert #x38000000b8 (:methods (new (symbol type process-drawable collide-list-enum) _type_) - (TODO-RENAME-28 (_type_ vector) object 28) ;; ret - symbol | float (CSPG::9) - (dummy-29 (_type_ int) none 29) - (TODO-RENAME-30 (_type_ vector) object 30) ;; ret - symbol | float (CSPG::9) - (dummy-31 (_type_) none 31) - (dummy-32 (_type_ object uint) none 32) - (dummy-33 (_type_ vector uint) none 33) - (dummy-34 (_type_ uint) collide-shape-prim 34) - (dummy-35 (_type_) symbol 35) - (dummy-36 (_type_ bounding-box float uint) symbol 36) - (dummy-37 (_type_ vector) none 37) + (move-by-vector! (_type_ vector) none 28) + (alloc-riders (_type_ int) none 29) + (move-to-point! (_type_ vector) none 30) ;; ret - symbol | float (CSPG::9) + (debug-draw (_type_) none 31) + (fill-cache-for-shape! (_type_ float collide-kind) none 32) + (fill-cache-integrate-and-collide! (_type_ vector collide-kind) none 33) + (find-prim-by-id (_type_ uint) collide-shape-prim 34) + (detect-riders! (_type_) symbol 35) + (build-bounding-box-for-shape (_type_ bounding-box float collide-kind) symbol 36) + (integrate-and-collide! (_type_ vector) none 37) (find-collision-meshes (_type_) symbol 38) - (dummy-39 (_type_ collide-shape collide-overlap-result) symbol 39) - (dummy-40 (_type_ structure) none 40) ;; ?? - I've seen overlaps-others-params | collide-edge-hold-list + (on-platform (_type_ collide-shape collide-overlap-result) symbol 39) + (find-overlapping-shapes (_type_ overlaps-others-params) symbol 40) ;; check if blocked?? (dummy-41 (_type_ attack-info float) vector 41) - (dummy-42 (_type_ collide-shape collide-work) none 42) ; collide-work is a guess - (dummy-43 (_type_ pull-rider-info) none 43) - (dummy-44 (_type_) symbol 44) - (dummy-45 (_type_) symbol 45) + (should-push-away (_type_ collide-shape collide-overlap-result) symbol 42) + (pull-rider! (_type_ pull-rider-info) none 43) + (pull-riders! (_type_) symbol 44) + (do-push-aways! (_type_) symbol 45) (set-root-prim! (_type_ collide-shape-prim) collide-shape-prim 46) - (dummy-47 (_type_) symbol 47) + (update-transforms! (_type_) symbol 47) (clear-collide-with-as (_type_) none 48) (restore-collide-with-as (_type_) none 49) (backup-collide-with-as (_type_) none 50) - (set-root-prim-collide-with! (_type_ handle) none 51) - (set-root-prim-collide-as! (_type_ handle) none 52) - (dummy-53 (_type_ int int int) none 53) - (dummy-54 (_type_ int int) none 54) - (dummy-55 (_type_ process touching-shapes-entry float float float) none 55) + (set-root-prim-collide-with! (_type_ collide-kind) none 51) + (set-root-prim-collide-as! (_type_ collide-kind) none 52) + (set-collide-kinds (_type_ int collide-kind collide-kind) none 53) + (set-collide-offense (_type_ int collide-offense) none 54) + (send-shove-back (_type_ process touching-shapes-entry float float float) none 55) ) ) @@ -11368,7 +11448,7 @@ (poly-pat pat-surface :offset-assert 256) (cur-pat pat-surface :offset-assert 260) (ground-pat pat-surface :offset-assert 264) - (status uint64 :offset-assert 272) + (status uint64 :offset-assert 272) ;; 1: onsurf 2: onground 4: tsurf 8: twall 16: t-ciel 32: t-act ?? 1024: on-water (old-status uint64 :offset-assert 280) (prev-status uint64 :offset-assert 288) (reaction-flag uint32 :offset-assert 296) @@ -11392,15 +11472,15 @@ :size-assert #x1bc :flag-assert #x41000001bc (:methods - (dummy-56 (_type_ pat-surface) none 56) - (dummy-57 (_type_ vector) none 57) + (set-and-handle-pat! (_type_ pat-surface) none 56) + (integrate-no-collide! (_type_ vector) none 57) (dummy-58 (_type_ vector) symbol 58) - (dummy-59 (_type_ vector uint float symbol symbol symbol) none 59) - (dummy-60 (_type_ float float symbol uint) symbol 60) - (TODO-RENAME-61 (_type_ vector vector vector) none 61) - (dummy-62 (_type_ vector float) vector 62) - (dummy-63 (_type_ vector vector float) float 63) - (dummy-64 (_type_ collide-tri-result vector) none 64) + (integrate-for-enemy-with-move-to-ground! (_type_ vector collide-kind float symbol symbol symbol) none 59) + (move-to-ground (_type_ float float symbol collide-kind) symbol 60) + (move-to-ground-point! (_type_ vector vector vector) none 61) + (compute-acc-due-to-gravity (_type_ vector float) vector 62) + (step-collison! (_type_ vector vector float) float 63) + (move-to-tri! (_type_ collide-tri-result vector) none 64) ) ) @@ -11492,7 +11572,7 @@ (unknown-vector51 vector :inline :offset 1200) ;; from - logic-target::build-conversions (unknown-vector52 vector :inline :offset 1216) (unknown-vector53 vector :inline :offset 1232) - (unknown-vector54 vector :inline :offset 1248) + (last-known-safe-ground vector :inline :offset 1248) (unknown-vector55 vector :inline :offset 1264) (unknown-dword10 int64 :offset 1280) ;; from - collide-reaction-target::target-collision-reaction (unknown-dword11 int64 :offset 1288) ;; from - target-util::can-jump? @@ -11503,6 +11583,15 @@ (unknown-float64 float :offset 1316) ;; from - logic-target::target-compute-slopes (unknown-dword20 int64 :offset 1320) ;; from target-util::turn-around? - TODO (unknown-dword21 int64 :offset 1328) ;; from target-util::turn-around? - TODO + (unknown-dword-coverage int64 :offset 1336) + (unknown-float-coverage-0 float :offset 1344) + (unknown-float-coverage-1 float :offset 1348) + (unknown-float-coverage-2 float :offset 1352) + (unknown-u32-coverage-0 uint32 :offset 1356) + (unknown-vector-coverage-0 vector :inline :offset 1376) + (unknown-vector-coverage-1 vector :inline :offset 1392) + (unknown-vector-coverage-2 vector :inline :offset 1440) + (unknown-vector-coverage-3 vector :inline :offset 1472) (unknown-vector60 vector :inline :offset 1456) ;; from - logic-target::add-thrust (unknown-vector61 vector :inline :offset 1504) ;; from - logic-target::add-thrust (unknown-float70 float :offset 1520) ;; from - logic-target::add-thrust @@ -11588,6 +11677,7 @@ (unknown-dword82 int64 :offset 18912) ;; from logic-target::reset-target-state (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 (unknown-soundid00 sound-id :offset 18980) ;; from powerups::target-powerup-process (unknown-float141 float :offset 18984) ;; from powerups::target-powerup-process @@ -11628,10 +11718,10 @@ :size-assert #xe4 :flag-assert #xd000000e4 (:methods - (get-touched-prim (_type_ trsqv touching-prims-entry) collide-shape-prim 9) + (get-touched-prim (_type_ trsqv touching-shapes-entry) collide-shape-prim 9) (dummy-10 () none 10) - (dummy-11 (_type_ vector) vector 11) - (get-touched-tri (_type_ touching-prims-entry touching-prims-entry) collide-tri-result 12) + (get-middle-of-bsphere-overlap (_type_ vector) vector 11) + (get-touched-tri (_type_ collide-shape touching-shapes-entry) collide-tri-result 12) ) ) @@ -11645,7 +11735,7 @@ (:methods (new (symbol type) _type_ 0) (alloc-node (_type_) touching-prims-entry 9) - (get-size (_type_) int 10) + (get-free-node-count (_type_) int 10) (init-list! (_type_) none 11) (free-node (_type_ touching-prims-entry) touching-prims-entry 12) ) @@ -11666,11 +11756,11 @@ (get-touched-shape (_type_ collide-shape) collide-shape 10) (dummy-11 () none 11) (prims-touching? (_type_ collide-shape-moving uint) touching-prims-entry 12) ; this one! - (prims-touching-action? (_type_ collide-shape uint uint) touching-prims-entry 13) - (free-list () none 14) - (free-entry-list (_type_) symbol 15) + (prims-touching-action? (_type_ collide-shape collide-action collide-action) touching-prims-entry 13) + (dummy-14 () none 14) + (free-touching-prims-list (_type_) symbol 15) (get-head (_type_) touching-prims-entry 16) - (unknown1 (_type_ (pointer uint32)) uint 17) + (get-next (_type_ touching-prims-entry) touching-prims-entry 17) ) ) @@ -11684,12 +11774,12 @@ :flag-assert #xf00000208 (:methods (new (symbol type) _type_ 0) - (dummy-9 (_type_ collide-shape-prim collide-shape-prim float collide-shape collide-mesh-cache-tri) none 9) + (add-touching-prims (_type_ collide-shape-prim collide-shape-prim float collide-tri-result collide-tri-result) none 9) (dummy-10 () none 10) - (dummy-11 (_type_ float) none 11) - (dummy-12 (_type_) none 12) + (update-from-step-size (_type_ float) none 11) + (send-events-for-touching-shapes (_type_) none 12) (get-shapes-entry (_type_ collide-shape collide-shape) touching-shapes-entry 13) - (dummy-14 (_type_) none 14) + (free-all-prim-nodes (_type_) none 14) ) ) @@ -11726,7 +11816,7 @@ :flag-assert #xb00000144 (:methods (dummy-9 (_type_) symbol 9) - (dummy-10 (_type_) symbol 10) + (debug-draw (_type_) symbol 10) ) ) @@ -11777,7 +11867,7 @@ :flag-assert #xb00000810 (:methods (debug-draw (_type_) object 9) - (dummy-10 () none 10) + (add-to-list! (_type_ collide-edge-hold-item) none 10) ) ) @@ -11815,17 +11905,17 @@ :size-assert #x2690 :flag-assert #x1400002690 (:methods - (dummy-9 (_type_ collide-edge-hold-list) symbol 9) + (search-for-edges (_type_ collide-edge-hold-list) symbol 9) (debug-draw-edges (_type_) object 10) - (dummy-11 (_type_) none 11) + (debug-draw-tris (_type_) none 11) (debug-draw-sphere (_type_) symbol 12) - (dummy-13 (_type_) none 13) + (compute-center-point! (_type_ collide-edge-edge vector) float 13) (dummy-14 (_type_ vector vector int) float 14) - (dummy-15 (_type_) none 15) - (dummy-16 (_type_) none 16) - (dummy-17 (_type_) none 17) - (dummy-18 (_type_) none 18) - (dummy-19 (_type_ collide-edge-hold-item edge-grab-info) symbol 19) + (find-grabbable-edges! (_type_) none 15) + (find-grabbable-tris! (_type_) none 16) + (should-add-to-list? (_type_ collide-edge-hold-item collide-edge-edge) symbol 17) + (find-best-grab! (_type_ collide-edge-hold-list edge-grab-info) symbol 18) + (check-grab-for-collisions (_type_ collide-edge-hold-item edge-grab-info) symbol 19) ) ) @@ -11941,7 +12031,7 @@ ) (deftype drawable-tree-collide-fragment (drawable-tree) - () + ((data-override drawable-inline-array :offset 32)) :method-count-assert #x12 :size-assert #x24 :flag-assert #x1200000024 @@ -12068,22 +12158,109 @@ :size-assert #x248 ;;#x250 :flag-assert #x1501e00248 ;;#x1501e00250 (:methods - (dummy-20 (_type_ collide-cache) object 20) ;; none or #f + (find-edge-grabs! (_type_ collide-cache) object 20) ;; none or #f ) (:states - (target-racing-get-off handle) - (target-racing-jump float float symbol) - (target-racing-hit handle attack-info) - (target-racing-grab) - (target-racing-clone-anim handle) - (target-racing-get-on handle) - (target-racing-falling) - (target-racing-bounce float float symbol) + (target-jump float float surface) + (target-hit symbol attack-info) + (target-eco-powerup object float) + target-load-wait + target-grab + target-look-around + target-billy-game + (target-racing-start handle) (target-racing-death symbol) - (target-racing-get-off-jump handle) - (target-racing-get-off-hit-ground symbol) - (target-death symbol) + (target-flut-start handle) + (target-snowball-start handle) + (target-tube-start handle) + (target-periscope handle) + (target-fishing handle) + (target-final-door basic handle) + (target-play-anim string handle) + target-edge-grab + (target-pole-cycle handle) + target-swim-stance + target-wade-stance (target-hit-ground symbol) + target-stance + (target-high-jump float float basic) + (target-attack-air symbol) + (target-wheel-flip float float) + target-duck-stance + (target-hit-ground-hard float) + (target-flop-hit-ground symbol) + target-yellow-jump-blast + target-swim-down + (target-flop float float float) + (target-attack-uppercut-jump float float) + target-attack + (target-attack-uppercut float float) + target-yellow-blast + target-wade-walk + target-walk + target-running-attack + (target-duck-high-jump-jump float float symbol) + (target-launch float symbol vector int) + (target-duck-high-jump float float symbol) + (target-double-jump float float) + target-duck-walk + target-ice-walk + target-wheel + target-turn-around + target-stance-ambient + target-ice-stance + target-startup + (target-jump-forward float float) + (target-swim-jump-jump float float surface) + target-swim-up + (target-swim-jump float float) + target-swim-walk + (target-edge-grab-jump float float) + target-edge-grab-off + (target-pole-flip-up-jump float float) + (target-pole-flip-forward-jump float float) + (target-pole-flip-up object object float) + (target-pole-flip-forward float float float) + target-stance-look-around + (target-racing-smack float symbol) + target-racing + target-racing-grab + (target-racing-clone-anim handle) + (target-racing-get-off-hit-ground symbol) + (target-racing-get-off-jump handle) + (target-racing-jump float float symbol) + (target-racing-bounce float float symbol) + target-racing-falling + (target-racing-get-on handle) + (target-racing-get-off handle) + (target-racing-hit handle attack-info) + target-flut-stance + target-flut-grab + (target-flut-clone-anim handle) + (target-flut-get-off-hit-ground symbol) + (target-flut-get-off-jump handle) + (target-flut-death symbol) + target-flut-hit-ground + target-flut-air-attack-hit-ground + (target-flut-jump float float) + target-flut-falling + (target-flut-hit symbol attack-info) + target-flut-walk + (target-flut-air-attack float) + (target-flut-double-jump float float) + target-flut-running-attack + (target-flut-get-on handle) + (target-flut-get-off handle) + target-slide-down + (target-falling symbol) + (target-continue continue-point) + (target-warp-out vector vector) + target-tube + (target-tube-death symbol) + (target-tube-jump float float) + (target-tube-hit handle attack-info) + target-snowball + (target-death symbol) (target-clone-anim handle) target-title target-demo @@ -12103,7 +12280,8 @@ :method-count-assert 20 :size-assert #xcc :flag-assert #x14006000cc - ;; inherited inspect of process-drawable + (:states + sidekick-clone) ) ;; - Symbols @@ -12351,7 +12529,7 @@ (deftype collide-using-spheres-params (structure) ((spheres (pointer sphere) :offset-assert 0) (num-spheres uint32 :offset-assert 4) - (collide-with uint64 :offset-assert 8) + (collide-with collide-kind :offset-assert 8) (proc process-drawable :offset-assert 16) (ignore-pat uint32 :offset-assert 20) ;; flags / bitfield i bet (solid-only basic :offset-assert 24) ;; probably a symbol @@ -12381,14 +12559,14 @@ :size-assert #xc60 :flag-assert #xb00000c60 (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) + (dummy-9 (_type_ object object) symbol 9) + (dummy-10 (_type_ object object) symbol 10) ) ) (deftype collide-puyp-work (structure) ((best-u float :offset-assert 0) - (ignore-pat uint32 :offset-assert 4) + (ignore-pat pat-surface :offset-assert 4) (tri-out collide-tri-result :offset-assert 8) (start-pos vector :inline :offset-assert 16) (move-dist vector :inline :offset-assert 32) @@ -12401,10 +12579,11 @@ (deftype collide-cache-tri (structure) ((vertex vector 3 :inline :offset-assert 0) ;(extra-quad UNKNOWN 16 :offset-assert 48) - (pat uint32 :offset-assert 48) - (prim-index uint16 :offset-assert 52) - (user16 uint16 :offset-assert 54) - (user32 uint32 2 :offset-assert 56) + (extra-quad uint128 :offset 48) + (pat pat-surface :offset 48) + (prim-index uint16 :offset 52) + (user16 uint16 :offset 54) + (user32 uint32 2 :offset 56) ) :method-count-assert 9 :size-assert #x40 @@ -12413,35 +12592,37 @@ (deftype collide-cache-prim (structure) ((prim-core collide-prim-core :inline :offset-assert 0) - ;;(extra-quad UNKNOWN 16 :offset-assert 32) - (ccache collide-cache :offset-assert 32) - (prim (pointer collide-shape-prim) :offset-assert 36) - (first-tri uint16 :offset-assert 40) - (num-tris uint16 :offset-assert 42) - (unused uint8 4 :offset-assert 44) + (extra-quad uint128 :offset-assert 32) + (ccache collide-cache :offset 32) + (prim collide-shape-prim :offset 36) + (first-tri uint16 :offset 40) + (num-tris uint16 :offset 42) + (unused uint8 4 :offset 44) (world-sphere vector :inline :offset 0) - (collide-as uint64 :offset 16) - (action uint32 :offset 24) - (offense int8 :offset 28) - (prim-type int8 :offset 29) + (collide-as collide-kind :offset 16) + (action collide-action :offset 24) + (offense collide-offense :offset 28) + (prim-type int8 :offset 29) ) :method-count-assert 11 :size-assert #x30 :flag-assert #xb00000030 (:methods - (dummy-9 (_type_ collide-mesh-cache-tri collide-prim-core vector float int) float 9) - (dummy-10 (_type_ collide-mesh-cache-tri collide-prim-core vector float int) float 10) + (resolve-moving-sphere-tri (_type_ collide-tri-result collide-prim-core vector float collide-action) float 9) + (resolve-moving-sphere-sphere (_type_ collide-tri-result collide-prim-core vector float collide-action) float 10) ) ) (deftype collide-cache (basic) ((num-tris int32 :offset-assert 4) + ;;(num-tris-u uint32 :offset 4) ;; added (num-prims int32 :offset-assert 8) - (ignore-mask uint32 :offset-assert 12) + (num-prims-u uint32 :offset 8 );; added + (ignore-mask pat-surface :offset-assert 12) (proc process-drawable :offset-assert 16) ;; types: target (collide-box bounding-box :inline :offset-assert 32) (collide-box4w bounding-box4w :inline :offset-assert 64) - (collide-with uint64 :offset-assert 96) + (collide-with collide-kind :offset-assert 96) (prims collide-cache-prim 100 :inline :offset-assert 112) (tris collide-cache-tri 461 :inline :offset-assert 4912) ) @@ -12449,35 +12630,35 @@ :size-assert #x8670 :flag-assert #x2100008670 (:methods - (dummy-9 (_type_) none 9) - (dummy-10 (_type_ vector vector float int process collide-tri-result int) float 10) - (dummy-11 (_type_ collide-using-spheres-params) none 11) - (fill-and-probe-using-y-probe (_type_ vector float uint process collide-tri-result uint) float 12) - (dummy-13 (_type_ bounding-box uint process-drawable uint) none 13) - (dummy-14 (_type_ vector vector float int process int) none 14) - (dummy-15 (_type_ collide-using-spheres-params) none 15) - (dummy-16 (_type_ vector float uint process-drawable uint) none 16) + (debug-draw (_type_) none 9) + (fill-and-probe-using-line-sphere (_type_ vector vector float collide-kind process collide-tri-result int) float 10) + (fill-and-probe-using-spheres (_type_ collide-using-spheres-params) symbol 11) + (fill-and-probe-using-y-probe (_type_ vector float collide-kind process collide-tri-result uint) float 12) + (fill-using-bounding-box (_type_ bounding-box collide-kind process-drawable pat-surface) none 13) + (fill-using-line-sphere (_type_ vector vector float collide-kind process-drawable int) none 14) + (fill-using-spheres (_type_ collide-using-spheres-params) none 15) + (fill-using-y-probe (_type_ vector float collide-kind process-drawable uint) none 16) (initialize (_type_) none 17) - (dummy-18 (_type_ vector vector float int collide-mesh-cache-tri int) float 18) - (probe-using-spheres (_type_) none 19) - (dummy-20 (_type_ vector float uint collide-tri-result uint) float 20) - (dummy-21 (_type_ (function bsp-header int collide-list none) (function collide-cache none)) none 21) ;; second functiom is method 28 - (dummy-22 (_type_) none 22) - (dummy-23 (_type_) none 23) - (dummy-24 (_type_) none 24) - (dummy-25 (_type_ water-control) none 25) ;; or whatever is from 152 in the process passed to 16 - (dummy-26 (_type_) none 26) + (probe-using-line-sphere (_type_ vector vector float collide-kind collide-tri-result int) float 18) + (probe-using-spheres (_type_ collide-using-spheres-params) symbol 19) + (probe-using-y-probe (_type_ vector float collide-kind collide-tri-result uint) float 20) + (fill-from-background (_type_ (function bsp-header int collide-list none) (function collide-cache object none)) none 21) ;; second functiom is method 28 + (fill-from-foreground-using-box (_type_) none 22) + (fill-from-foreground-using-line-sphere (_type_) none 23) + (fill-from-foreground-using-y-probe (_type_) none 24) + (fill-from-water (_type_ water-control) none 25) ;; or whatever is from 152 in the process passed to 16 + (load-mesh-from-spad-in-box (_type_ collide-frag-mesh) none 26) (dummy-27 (_type_) none 27) (dummy-28 (_type_) none 28) (dummy-29 (_type_ collide-frag-mesh) none 29) - (dummy-30 (_type_) none 30) - (dummy-31 (_type_ collide-puyp-work collide-cache-prim) vector 31) - (dummy-32 (_type_) none 32) + (puyp-mesh (_type_ collide-puyp-work collide-cache-prim) none 30) + (puyp-sphere (_type_ collide-puyp-work collide-cache-prim) vector 31) + (unpack-background-collide-mesh (_type_ object object object) none 32) ;; helper for fill from background. ) ) (deftype collide-list-item (structure) - ((mesh basic :offset-assert 0) + ((mesh collide-frag-mesh :offset-assert 0) (inst basic :offset-assert 4) ) :method-count-assert 9 @@ -14348,7 +14529,7 @@ (print-nth-point (_type_ int) none 11) (TODO-RENAME-12 (_type_) none 12) (TODO-RENAME-13 (_type_ int) none 13) - (TODO-RENAME-14 (_type_ vector) none 14) + (TODO-RENAME-14 (_type_ tracking-spline-sampler) none 14) (TODO-RENAME-15 (_type_) none 15) (TODO-RENAME-16 (_type_ float) none 16) (TODO-RENAME-17 (_type_ vector float float symbol) int 17) ; - return value is actually none but they do a manual `return` @@ -14433,7 +14614,8 @@ :method-count-assert 14 :size-assert #x1e0 :flag-assert #xe017001e0 - ;; inherited inspect of process + (:states + cam-combiner-active) ) (deftype camera-slave (process) @@ -14493,7 +14675,33 @@ :method-count-assert 14 :size-assert #xa04 :flag-assert #xe09a00a04 - ;; inherited inspect of process + (:states + cam-circular + cam-standoff-read-entity + cam-spline + *camera-base-mode* + cam-fixed-read-entity + cam-free-floating + cam-fixed + cam-decel + cam-eye + cam-string + cam-standoff + cam-pov + cam-pov180 + cam-pov-track + cam-billy + cam-endlessfall + cam-lookat + cam-stick + cam-bike + cam-point-watch + cam-orbit + cam-launcher-longfall + cam-launcher-shortfall + cam-robotboss + cam-mistycannon + cam-periscope) ) (deftype camera-master (process) @@ -14555,7 +14763,9 @@ :method-count-assert 14 :size-assert #x964 :flag-assert #xe09000964 - ;; inherited inspect of process + (:states + cam-master-active + list-keeper-active) ) ;; - Symbols @@ -14700,8 +14910,8 @@ ((value int32 :offset-assert 112) (value2 int32 :offset-assert 116) (target-value int32 :offset-assert 120) - (last-increment-time uint64 :offset-assert 128) - (last-target-equal-time uint64 :offset-assert 136) + (last-increment-time int64 :offset-assert 128) + (last-target-equal-time int64 :offset-assert 136) (offset int32 :offset-assert 144) (y-offset int32 :offset-assert 148) (next-y-offset int32 :offset-assert 152) @@ -14730,7 +14940,7 @@ :flag-assert #x1b00b00118 ;; inherited inspect of process (:methods - (dummy-14 (_type_) none 14) + (dummy-14 (_type_) symbol 14) (dummy-15 (_type_) none 15) (TODO-RENAME-16 (_type_ int int) none 16) ;; first int seen as a fixed point from racer-info 'heat' (dummy-17 (_type_) none 17) @@ -14744,6 +14954,11 @@ (inc-value (_type_) float 25) (dec-value (_type_) float 26) ) + (:states + hud-arriving + hud-hidden + (hud-leaving int) + hud-in) ) (declare-type hud-pickups hud) @@ -14834,7 +15049,7 @@ (param1 float :offset-assert 24) (param2 float :offset-assert 28) (param3 int32 :offset-assert 32) - (value-to-modify pointer :offset-assert 36) + (value-to-modify pointer :offset-assert 36) ;; pointer to - symbol | ? ) :method-count-assert 9 :size-assert #x28 @@ -14880,6 +15095,7 @@ (bad-disc 33) (quit 34) ) + (deftype progress (process) ((current-debug-string int32 :offset-assert 112) (current-debug-language int32 :offset-assert 116) @@ -14925,7 +15141,7 @@ (total-nb-of-buzzers int32 :offset-assert 288) (card-info mc-slot-info :offset-assert 292) (last-option-index-change int64 :offset-assert 296) - (video-mode-timeout uint64 :offset-assert 304) + (video-mode-timeout int64 :offset-assert 304) (display-state-stack progress-screen 5 :offset-assert 312) (option-index-stack int32 5 :offset-assert 352) (display-state-pos int32 :offset-assert 372) @@ -14988,11 +15204,12 @@ (draw-quit (_type_ font-context) none 58) ) (:states + progress-normal + progress-going-out progress-gone progress-coming-in - progress-going-out progress-waiting - ) + progress-debug) ) ;; - Symbols @@ -15116,6 +15333,7 @@ (adj-poly uint8 3 :offset-assert 4) (pat uint8 :offset-assert 7) ) + :pack-me :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 @@ -15144,10 +15362,10 @@ (next-poly nav-poly :offset-assert 52) (len meters :offset-assert 56) (last-edge int8 :offset-assert 60) - (terminated basic :offset-assert 64) - (reached-dest basic :offset-assert 68) - (hit-boundary basic :offset-assert 72) - (hit-gap basic :offset-assert 76) + (terminated symbol :offset-assert 64) ;; TODO - guesses + (reached-dest symbol :offset-assert 68) ;; TODO - guesses + (hit-boundary symbol :offset-assert 72) ;; TODO - guesses + (hit-gap symbol :offset-assert 76) ;; TODO - guesses ) :method-count-assert 9 :size-assert #x50 @@ -15165,7 +15383,7 @@ ) (deftype clip-travel-vector-to-mesh-return-info (structure) - ((found-boundary basic :offset-assert 0) + ((found-boundary symbol :offset-assert 0) (intersection vector :inline :offset-assert 16) (boundary-normal vector :inline :offset-assert 32) (prev-normal vector :inline :offset-assert 48) @@ -15225,46 +15443,60 @@ (deftype nav-mesh (basic) ((user-list engine :offset-assert 4) - (poly-lookup-history uint8 2 :offset-assert 8) + (poly-lookup-history uint8 2 :offset-assert 8) (debug-time uint8 :offset-assert 10) (static-sphere-count uint8 :offset-assert 11) - (static-sphere uint32 :offset-assert 12) + (static-sphere (inline-array nav-sphere) :offset-assert 12) (bounds sphere :inline :offset-assert 16) (origin vector :inline :offset-assert 32) (cache nav-lookup-elem 4 :inline :offset-assert 48) ;; guess on type (node-count int32 :offset-assert 176) - (nodes uint32 :offset-assert 180) + (nodes (inline-array nav-node) :offset-assert 180) (vertex-count int32 :offset-assert 184) - (vertex (inline-array vector) :offset-assert 188) + (vertex (inline-array nav-vertex) :offset-assert 188) (poly-count int32 :offset-assert 192) - (poly uint32 :offset-assert 196) - (route uint32 :offset-assert 200) + (poly (inline-array nav-poly) :offset-assert 196) + (route (inline-array vector4ub) :offset-assert 200) ;; this is a guess, it's probably wrong -- but its something with a uint8 at offset 0 ) :method-count-assert 30 :size-assert #xcc :flag-assert #x1e000000cc (:methods - (dummy-9 () none 9) - (dummy-10 () none 10) - (dummy-11 () none 11) - (dummy-12 () none 12) - (dummy-13 (_type_) none 13) - (dummy-14 () none 14) - (dummy-15 () none 15) - (dummy-16 () none 16) - (dummy-17 (_type_) none 17) - (dummy-18 () none 18) + (tri-centroid-world (_type_ nav-poly vector) vector 9) ;; finds the centroid of the given triangle, in the "world" coordinate system. + (tri-centroid-local (_type_ nav-poly vector) vector 10) ;; finds the centroid of the given triangle, in the local nav-mesh coordinate system. + (get-adj-poly (_type_ nav-poly nav-poly symbol) nav-poly 11) + (setup-portal (_type_ nav-poly nav-poly nav-route-portal) object 12) ;; sets up a portal between two polys. + (initialize-mesh! (_type_) none 13) + (move-along-nav-ray! (_type_ nav-ray) none 14) ;; think this updates the current position in a nav-ray, and updates which triangle you're in. + ;; this takes in a point/direction/distance, and see what would happen if you tried to move this way. + ;; it returns the distance you can go before one of these happens: + ;; - you reach the destination + ;; - you hit a nav mesh boundary/gap + ;; - you cross 15 triangles. + (try-move-along-ray (_type_ nav-poly vector vector float) meters 15) + (TODO-RENAME-16 (_type_ vector nav-poly vector symbol float clip-travel-vector-to-mesh-return-info) none 16) + (update-route-table (_type_) none 17) ;; (initialization related) + (dummy-18 (_type_ int vector int (pointer int8) int) none 18) ;; something to do with routes. (compute-bounding-box (_type_ vector vector) none 19) - (dummy-20 () none 20) - (dummy-21 () none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 () none 24) - (dummy-25 () none 25) - (dummy-26 () none 26) - (dummy-27 () none 27) - (dummy-28 () none 28) - (dummy-29 () none 29) + (debug-draw-poly (_type_ nav-poly rgba) none 20) ;; TODO - is rgba a vector4w? + (point-in-poly? (_type_ nav-poly vector) symbol 21) ;; is the point inside of the triangle? + (find-opposite-vertices (_type_ nav-poly nav-poly) uint 22) ;; given two triangles that share an edge, get the indices of the two vertices that aren't part of the edge. + (dummy-23 (_type_ nav-poly vector vector vector nav-route-portal) vector 23) + (closest-point-on-boundary (_type_ nav-poly vector vector) vector 24) ;; find the closest point on the perimeter of the triangle. + (project-point-into-tri-3d (_type_ nav-poly vector vector) none 25) ;; will move a 3D point in space to the surface of this nav-poly + ;; Looking from the top down, is the point inside the nav-poly? + ;; - if the point is inside the triangle, returns that point. + ;; - if the point is outside the triangle, move it to the closest point (will be on the edge) + (project-point-into-tri-2d (_type_ nav-poly vector vector) vector 26) + ;; finds which triangle the given point is in. + ;; also has some caching stuff so if you look up the same point multiple times, it won't redo the work. + ;; I _think_ this is only an approximate check that may return #f even if you are inside. + ;; But, if it returns a poly, it will be right. + (find-poly-fast (_type_ vector meters) nav-poly 27) + (find-poly (_type_ vector meters (pointer nav-control-flags)) nav-poly 28) ;; The accurate version of find-poly (tries find-poly-fast first) + ;; checks to see if the triangle is in the mesh or not. + ;; not sure why it's separate from 27 (and such a different implementation). there might be some details I'm missing here. + (is-in-mesh? (_type_ vector float meters) symbol 29) ) ) @@ -15320,31 +15552,31 @@ :flag-assert #x24000000e0 (:methods (new (symbol type collide-shape int float) _type_) - (dummy-9 (_type_) none 9) + (debug-draw (_type_) none 9) (point-in-bounds? (_type_ vector) symbol 10) - (dummy-11 (_type_ vector) none 11) - (dummy-12 () none 12) - (dummy-13 (_type_ vector vector) vector 13) ;; see - puffer::20 + (dummy-11 (_type_ vector) vector 11) + (TODO-RENAME-12 (_type_ nav-gap-info) symbol 12) + (dummy-13 (_type_ vector vector) vector 13) ;; see - puffer::20 | second vector may be clip-travel-vector-to-mesh-return-info though (set-current-poly! (_type_ nav-poly) none 14) (set-target-pos! (_type_ vector) none 15) (dummy-16 (_type_ vector) nav-poly 16) ; see - nav-enemy-test-point-in-nav-mesh? - (dummy-17 (_type_ vector vector) none 17) - (TODO-RENAME-18 (_type_ vector) nav-poly 18) - (dummy-19 (_type_ vector collide-shape-moving vector float) none 19) - (dummy-20 () none 20) - (dummy-21 (_type_ vector) none 21) - (dummy-22 () none 22) - (dummy-23 (_type_ vector check-vector-collision-with-nav-spheres-info) float 23) ;; TODO - unconfirmed + (project-onto-nav-mesh (_type_ vector vector) vector 17) ;; moves point to nav-mesh. + (find-poly (_type_ vector) nav-poly 18) + (dummy-19 (_type_ vector collide-shape-moving vector float) none 19) ;; csm not trsqv? ret not vector? + (project-point-into-tri-3d (_type_ nav-poly vector vector) vector 20) + (TODO-RENAME-21 (_type_ vector) nav-poly 21) + (TODO-RENAME-22 (_type_ vector float) symbol 22) + (dummy-23 (_type_ vector check-vector-collision-with-nav-spheres-info) float 23) ;; TODO - unconfirmed maybe (dummy-23 (_type_ vector matrix) float 23) (dummy-24 (_type_ float clip-travel-vector-to-mesh-return-info) none 24) - (dummy-25 (_type_ vector float) symbol 25) ; see - nav-enemy-test-point-near-nav-mesh? - (dummy-26 (_type_) none 26) - (dummy-27 (_type_) none 27) - (dummy-28 (_type_ int) none 28) + (is-in-mesh? (_type_ vector float) symbol 25) ; see - nav-enemy-test-point-near-nav-mesh? + (TODO-RENAME-26 (_type_) none 26) ;; stub + (TODO-RENAME-27 (_type_) none 27) + (TODO-RENAME-28 (_type_ collide-kind) none 28) (should-display? (_type_) symbol 29) - (dummy-30 () none 30) - (dummy-31 () none 31) - (dummy-32 () none 32) - (dummy-33 () none 33) + (dummy-30 (_type_ vector vector vector) sphere 30) ;; TODO - last arg? - it has a float as the first arg, vector is a total guess + (intersect-ray-line-segment? (_type_ vector vector vector vector) symbol 31) + (TODO-ASM-32 (_type_ vector vector vector vector float) symbol 32) + (TODO-RENAME-33 (_type_ vector vector vector vector float) symbol 33) (dummy-34 () none 34) (dummy-35 (_type_ vector vector vector vector float) none 35) ) @@ -16649,11 +16881,11 @@ ;; - Functions -(define-extern depth-cue-draw-front (function dma-buffer int float float uint int none)) -(define-extern depth-cue-set-stencil function) -(define-extern depth-cue-draw-depth function) -(define-extern depth-cue-calc-z function) -(define-extern depth-cue (function display none)) +(define-extern depth-cue-draw-front (function dma-buffer int float float uint int symbol)) +(define-extern depth-cue-set-stencil (function dma-buffer int int int dma-gif-packet vector4w)) +(define-extern depth-cue-draw-depth (function dma-buffer int float float int int symbol)) +(define-extern depth-cue-calc-z (function float float)) +(define-extern depth-cue (function display pointer)) ;; - Unknowns @@ -16775,15 +17007,6 @@ (define-extern shrub-vu1-block vu-function) -;; ---------------------- -;; File - shrub-work -;; Source Path - engine/gfx/shrub/shrub-work.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - tfrag-near ;; Source Path - engine/gfx/tfrag/tfrag-near.gc @@ -16840,15 +17063,6 @@ (define-extern vis-cull (function int symbol)) -;; ---------------------- -;; File - tfrag-work -;; Source Path - engine/gfx/tfrag/tfrag-work.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - tie ;; Source Path - engine/gfx/tie/tie.gc @@ -16978,24 +17192,6 @@ (define-extern *pke-hack* vector) -;; ---------------------- -;; File - sync-info -;; Source Path - engine/util/sync-info.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - trajectory -;; Source Path - engine/physics/trajectory.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - sparticle-launcher ;; Source Path - engine/sparticle/sparticle-launcher.gc @@ -17318,7 +17514,7 @@ (dummy-42 (_type_) none 42) (TODO-RENAME-43 (_type_) symbol 43) (play-reminder (_type_) symbol 44) - (dummy-45 (_type_) none 45) + (dummy-45 (_type_) symbol 45) (dummy-46 (_type_) none 46) (target-above-threshold? (_type_) symbol 47) (draw-npc-shadow (_type_) none 48) @@ -17978,7 +18174,6 @@ ;; - Symbols -(define-extern time-of-day-tick (state time-of-day-proc)) (define-extern time-of-day-effect (function none)) ;; only 'nothing' is stored here, looks like dead code ;; - Unknowns @@ -18384,19 +18579,19 @@ (define-extern distc (function vector vector float)) (define-extern interpolate (function float float float float float float)) (define-extern collide-upload-vu0 (function none)) -(define-extern collide-probe-instance-tie (function drawable int object int int)) ;; drawable is probably an instance-tie? -(define-extern collide-probe-node (function drawable int int int)) -(define-extern indent-to (function int string)) +(define-extern collide-probe-instance-tie (function object int collide-list int int)) ;; drawable is either an instance-tie or a draw-node inline arrary +(define-extern collide-probe-node (function (inline-array draw-node) int collide-list int)) +(define-extern indent-to (function int none)) (define-extern probe-traverse-inline-array-node (function drawable-inline-array-node int none)) (define-extern probe-traverse-draw-node (function draw-node int none)) (define-extern creates-new-method? (function type int symbol)) -(define-extern overrides-parent-method? (function type type symbol)) +(define-extern overrides-parent-method? (function type int symbol)) (define-extern describe-methods (function type symbol)) -(define-extern probe-traverse-collide-fragment (function collide-fragment int none)) +(define-extern probe-traverse-collide-fragment (function drawable-tree-collide-fragment int none)) (define-extern print-out (function int object)) (define-extern collide-probe-instance-tie-collide-frags (function none)) ;; does nothing -(define-extern collide-probe-collide-fragment-tree-make-list (function drawable-tree-collide-fragment int symbol)) -(define-extern collide-probe-instance-tie-tree-make-list (function drawable-tree-instance-tie int int)) +(define-extern collide-probe-collide-fragment-tree-make-list (function drawable-tree-collide-fragment collide-list none)) +(define-extern collide-probe-instance-tie-tree-make-list (function drawable-tree-instance-tie collide-list int)) (define-extern collide-probe-make-list (function level collide-list none)) (define-extern misty-ambush-height-probe (function vector float float)) (define-extern pke-collide-test (function none)) ;; does nothing @@ -18404,7 +18599,7 @@ ;; - Unknowns (define-extern collide-vu0-block vu-function) ;; unknown type -(define-extern *collide-probe-stack* pointer) ;; scratchpad pointer? +(define-extern *collide-probe-stack* collide-probe-stack) ;; scratchpad pointer? ;; ---------------------- @@ -18520,15 +18715,6 @@ (define-extern *race-track-surface* surface) -;; ---------------------- -;; File - collide-shape-rider -;; Source Path - engine/collide/collide-shape-rider.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - collide ;; Source Path - engine/collide/collide.gc @@ -18723,11 +18909,6 @@ ;; - Symbols (define-extern *cam-res-string* string) -(define-extern cam-circular (state camera-slave)) -(define-extern cam-standoff-read-entity (state camera-slave)) -(define-extern cam-spline (state camera-slave)) -(define-extern *camera-base-mode* (state camera-slave)) -(define-extern cam-fixed-read-entity (state camera-slave)) ;; ---------------------- ;; File - cam-interface @@ -18800,13 +18981,7 @@ ;; - Symbols -(define-extern cam-free-floating (state camera-slave)) -(define-extern cam-master-active (state camera-master)) -(define-extern list-keeper-active (state camera-master)) (define-extern *CAMERA_MASTER-bank* camera-master-bank) -(define-extern cam-fixed (state camera-slave)) -(define-extern cam-decel (state camera-slave)) -(define-extern cam-eye (state camera-slave)) ;; ---------------------- @@ -18937,7 +19112,6 @@ ;; - Symbols -(define-extern cam-string (state camera-slave)) ;; - Unknowns @@ -18946,15 +19120,6 @@ (define-extern *CAM_STRING-bank* cam-string-bank) ;; unknown type (define-extern *CAM_BILLY-bank* cam-billy-bank) ;; unknown type (define-extern *CAM_EYE-bank* cam-eye-bank) ;; unknown type -(define-extern cam-standoff (state camera-slave)) ;; unknown type -(define-extern cam-pov (state camera-slave)) ;; unknown type -(define-extern cam-pov180 (state camera-slave)) ;; unknown type -(define-extern cam-pov-track (state camera-slave)) ;; unknown type -(define-extern cam-billy (state camera-slave)) ;; unknown type -(define-extern cam-endlessfall (state camera-slave)) ;; unknown type -(define-extern cam-lookat (state camera-slave)) ;; unknown type -(define-extern cam-stick (state camera-slave)) ;; unknown type -(define-extern cam-bike (state camera-slave)) ;; unknown type ;; ---------------------- @@ -19031,8 +19196,6 @@ (define-extern *camera-orbit-info* camera-orbit-info) ;; unknown type (define-extern *CAM_ORBIT-bank* CAM_ORBIT-bank) ;; unknown type (define-extern *CAM_POINT_WATCH-bank* cam-point-watch-bank) ;; unknown type -(define-extern cam-point-watch (state camera-slave)) -(define-extern cam-orbit (state camera-slave)) ;; ---------------------- @@ -19047,7 +19210,6 @@ ;; - Symbols -(define-extern cam-combiner-active (state camera-combiner)) ;; ---------------------- @@ -19147,6 +19309,8 @@ :heap-base #x200 :size-assert #x90 :flag-assert #xe02000090 + (:states + cam-layout-active) ) (deftype clm-basic (basic) @@ -19353,7 +19517,6 @@ (define-extern *last-cur-entity* int) ;; unknown type (define-extern *clm-select* clm) ;; unknown type (define-extern *clm* clm) ;; unknown type -(define-extern cam-layout-active (state cam-layout)) ;; unknown type (define-extern *camera-layout-message-ypos* int) ;; unknown type (define-extern *CAM_LAYOUT-bank* cam-layout-bank) ;; unknown type (define-extern *clm-edit* clm) ;; unknown type @@ -19503,7 +19666,7 @@ ;; - Functions (define-extern process-entity-status! (function process entity-perm-status symbol int)) -(define-extern process-grab? (function process symbol :behavior process)) +(define-extern process-grab? (function process symbol :behavior camera-tracker)) (define-extern process-release? (function process symbol :behavior process)) (define-extern ja-post (function none :behavior process-drawable)) (define-extern make-nodes-from-jg (function art-joint-geo pair symbol cspace-array :behavior process-drawable)) @@ -19540,7 +19703,6 @@ (define-extern *valid-con* string) (define-extern *default-skel-template* pair) -(define-extern process-drawable-idle (state process-drawable)) ;; ---------------------- @@ -19666,6 +19828,8 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + med-res-level-idle) ) (deftype launcher (process-drawable) @@ -19681,6 +19845,10 @@ :size-assert #xe4 :heap-base #x80 :flag-assert #x14008000e4 + (:states + launcher-idle + launcher-deactivated + launcher-active) ) ;; - Functions @@ -19702,7 +19870,7 @@ (define-extern clone-anim (function handle int symbol string none :behavior process-drawable)) (define-extern merc-eye-anim (function process-drawable none)) (define-extern ja-anim-done? (function process symbol)) -(define-extern command-get-camera (function object state object)) ;; ret - (state camera) | string | symbol +(define-extern command-get-camera (function object state object)) ;; ret - (state camera) (define-extern camera-anim (function symbol basic entity (pointer process) :behavior camera-tracker)) ;; unused (define-extern camera-tracker-init (function object object :behavior camera-tracker)) ;; TODO - nested SC (define-extern cam-launcher-joystick (function vector :behavior camera-slave)) @@ -19715,20 +19883,7 @@ ;; - Unknowns (define-extern *particle-quat* quaternion) -(define-extern touch-tracker-idle (state touch-tracker)) -(define-extern cam-launcher-longfall (state camera-slave)) -(define-extern cam-launcher-shortfall (state camera-slave)) -(define-extern launcher-idle (state launcher)) -(define-extern launcher-deactivated (state launcher)) -(define-extern launcher-active (state launcher)) -(define-extern part-spawner-active (state part-spawner)) (define-extern *lev-string* string) -(define-extern med-res-level-idle (state med-res-level)) -(define-extern camera-tracker-process (state camera-tracker)) -(define-extern part-tracker-process (state part-tracker)) -(define-extern manipy-idle (state manipy)) -(define-extern swingpole-stance (state swingpole)) -(define-extern swingpole-active (state swingpole)) ;; ---------------------- @@ -19861,8 +20016,6 @@ ;; - Symbols (define-extern *TARGET-bank* target-bank) -(define-extern target-slide-down (state target)) -(define-extern target-falling (state symbol target)) (define-extern *jchar-sg* skeleton-group) (define-extern *target-shadow-control* shadow-control) @@ -19892,7 +20045,7 @@ ;; - Functions (define-extern collide-shape-moving-angle-set! (function collide-shape-moving vector vector none)) -(define-extern target-collision-low-coverage (function control-info collide-shape-intersect vector (pointer int) (pointer int) (pointer symbol) uint)) ;; i think the pointers are lies - TODO +(define-extern target-collision-low-coverage (function control-info collide-shape-intersect vector (pointer uint32) (pointer uint64) (pointer symbol) uint)) ;; i think the pointers are lies - TODO (define-extern poly-find-nearest-edge (function vector (inline-array vector) vector vector vector)) (define-extern target-collision-reaction (function control-info collide-shape-intersect vector vector none)) (define-extern target-collision-no-reaction (function control-info collide-shape-intersect vector vector none)) @@ -19951,7 +20104,6 @@ ;; - Unknowns -(define-extern target-continue (state continue-point target)) ;; ---------------------- @@ -19968,7 +20120,6 @@ ;; - Unknowns (define-extern *sidekick-sg* skeleton-group) -(define-extern sidekick-clone (state sidekick)) ;; unknown type (define-extern *sidekick-remap* pair) ;; unknown type @@ -19986,6 +20137,8 @@ :size-assert #xa04 :heap-base #x9a0 :flag-assert #xe09a00a04 + (:states + cam-voicebox) ) (deftype voicebox (process-drawable) @@ -20014,9 +20167,7 @@ ;; - Unknowns -(define-extern cam-voicebox (state camera-voicebox)) ;; unknown type (define-extern *voicebox-sg* skeleton-group) -(define-extern empty-state (state process)) ;; unknown type ;; ---------------------- @@ -20034,7 +20185,7 @@ (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)) -(define-extern target-shoved (function meters meters process (state target) object :behavior target)) +(define-extern target-shoved (function meters meters process (state object object target) object :behavior target)) (define-extern target-dangerous-event-handler (function process int symbol event-message-block object :behavior target)) (define-extern target-jump-event-handler (function process int symbol event-message-block object :behavior target)) (define-extern target-walk-event-handler (function process int symbol event-message-block object :behavior target)) @@ -20043,25 +20194,6 @@ ;; - Unknowns -(define-extern target-jump (state float float surface target)) ;; unknown type -(define-extern target-hit (state symbol attack-info target)) ;; unknown type -(define-extern target-eco-powerup (state object float target)) ;; unknown type -(define-extern target-load-wait (state target)) ;; unknown type -(define-extern target-grab (state target)) ;; unknown type -(define-extern target-look-around (state target)) ;; unknown type -(define-extern target-billy-game (state target)) ;; unknown type -(define-extern target-racing-start (state handle target)) ;; unknown type -(define-extern target-flut-start (state handle target)) ;; unknown type -(define-extern target-snowball-start (state handle target)) ;; unknown type -(define-extern target-tube-start (state handle target)) ;; unknown type -(define-extern target-periscope (state handle target)) ;; unknown type -(define-extern target-fishing (state handle target)) ;; unknown type -(define-extern target-final-door (state basic handle target)) ;; unknown type -(define-extern target-play-anim (state string handle target)) ;; unknown type -(define-extern target-edge-grab (state target)) ;; unknown type -(define-extern target-pole-cycle (state handle target)) ;; unknown type -(define-extern target-swim-stance (state target)) ;; unknown type -(define-extern target-wade-stance (state target)) ;; unknown type ;; ---------------------- @@ -20082,36 +20214,6 @@ ;; - Unknowns -(define-extern target-hit-ground (state symbol target)) ;; unknown type -(define-extern target-stance (state target)) ;; unknown type -(define-extern target-high-jump (state float float basic target)) ;; TODO - basic is a symbol...but decompiler changes the type -(define-extern target-attack-air (state symbol target)) ;; unknown type -(define-extern target-wheel-flip (state float float target)) ;; unknown type -(define-extern target-duck-stance (state target)) ;; unknown type -(define-extern target-hit-ground-hard (state float target)) ;; unknown type -(define-extern target-flop-hit-ground (state symbol target)) ;; unknown type -(define-extern target-yellow-jump-blast (state target)) ;; unknown type -(define-extern target-swim-down (state target)) ;; unknown type -(define-extern target-flop (state float float float target)) ;; unknown type -(define-extern target-attack-uppercut-jump (state float float target)) ;; unknown type -(define-extern target-attack (state target)) ;; unknown type -(define-extern target-attack-uppercut (state float float target)) ;; unknown type -(define-extern target-yellow-blast (state target)) ;; unknown type -(define-extern target-wade-walk (state target)) ;; unknown type -(define-extern target-walk (state target)) ;; unknown type -(define-extern target-running-attack (state target)) ;; unknown type -(define-extern target-duck-high-jump-jump (state float float symbol target)) ;; unknown type -(define-extern target-launch (state float symbol vector int target)) ;; unknown type -(define-extern target-duck-high-jump (state float float symbol target)) ;; unknown type -(define-extern target-double-jump (state float float target)) ;; unknown type -(define-extern target-duck-walk (state target)) ;; unknown type -(define-extern target-ice-walk (state target)) ;; unknown type -(define-extern target-wheel (state target)) ;; unknown type -(define-extern target-turn-around (state target)) ;; unknown type -(define-extern target-stance-ambient (state target)) ;; unknown type -(define-extern target-ice-stance (state target)) ;; unknown type -(define-extern target-startup (state target)) ;; unknown type -(define-extern target-jump-forward (state float float target)) ;; unknown type ;; ---------------------- ;; File - target2 @@ -20137,6 +20239,11 @@ :flag-assert #xf00300094 (:methods (dumb-15 (_type_) none)) + (:states + hud-normal + hud-coming-in + hud-going-out + hud-waiting) ) ;; - Functions @@ -20153,23 +20260,8 @@ ;; - Unknowns -(define-extern target-swim-jump-jump (state float float surface target)) ;; unknown type -(define-extern target-swim-up (state target)) ;; unknown type -(define-extern target-swim-jump (state float float target)) ;; unknown type -(define-extern target-swim-walk (state target)) ;; unknown type (define-extern *yellow-jump-mods* surface) ;; unknown type -(define-extern target-edge-grab-jump (state float float target)) ;; unknown type -(define-extern target-edge-grab-off (state target)) ;; unknown type -(define-extern target-pole-flip-up-jump (state float float target)) ;; unknown type -(define-extern target-pole-flip-forward-jump (state float float target)) ;; unknown type -(define-extern target-pole-flip-up (state object object float target)) ;; unknown type -(define-extern target-pole-flip-forward (state float float float target)) ;; unknown type (define-extern *fp-hud-stack* pointer) ;; first-person-hud maybe? -(define-extern target-stance-look-around (state target)) ;; unknown type -(define-extern hud-normal (state first-person-hud)) ;; unknown type -(define-extern hud-coming-in (state first-person-hud)) ;; unknown type -(define-extern hud-going-out (state first-person-hud)) ;; unknown type -(define-extern hud-waiting (state first-person-hud)) ;; unknown type ;; ---------------------- @@ -20442,42 +20534,6 @@ (define-extern *generic-effect-mode* int) -;; ---------------------- -;; File - drawable-group -;; Source Path - engine/draw/drawable-group.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - drawable-inline-array -;; Source Path - engine/draw/drawable-inline-array.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - drawable-tree -;; Source Path - engine/draw/drawable-tree.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - prototype -;; Source Path - engine/gfx/tie/prototype.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - main-collide ;; Source Path - engine/collide/main-collide.gc @@ -20578,15 +20634,6 @@ (define-extern *already-printed-exeeded-max-cache-tris* symbol) ;; TODO - not confirmed -;; ---------------------- -;; File - relocate -;; Source Path - engine/entity/relocate.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - memory-usage ;; Source Path - engine/debug/memory-usage.gc @@ -20626,15 +20673,6 @@ (define-extern *vis-actors* symbol) -;; ---------------------- -;; File - path -;; Source Path - engine/nav/path.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - vol ;; Source Path - engine/geometry/vol.gc @@ -20654,158 +20692,149 @@ ;; - Types -; (deftype cfs-travel-vec (structure) -; ((dir vector :inline :offset-assert 0) -; (delta-angle float :offset-assert 16) -; ) -; :method-count-assert 9 -; :size-assert #x14 -; :flag-assert #x900000014 -; ) +(deftype cfs-travel-vec (structure) + ((dir vector :inline :offset-assert 0) + (delta-angle float :offset-assert 16) + ) + :method-count-assert 9 + :size-assert #x14 + :flag-assert #x900000014 + ) -; (deftype cfs-work (structure) -; ((desired-travel-dist float :offset-assert 0) -; (desired-angle float :offset-assert 4) -; (max-dist float :offset-assert 8) -; (old-angle float :offset-assert 12) -; (modified int32 :offset-assert 16) -; (blocked-mask uint64 :offset-assert 24) -; (travel vector :inline :offset-assert 32) -; (current vector :inline :offset-assert 48) -; (new-travel UNKNOWN 2 :offset-assert 64) -; (temp-travel UNKNOWN 2 :offset-assert 128) -; (prev-dir vector :inline :offset-assert 192) -; (attempt-dir vector :inline :offset-assert 208) -; (tangent UNKNOWN 2 :offset-assert 224) -; ) -; :method-count-assert 9 -; :size-assert #x100 -; :flag-assert #x900000100 -; ) +(deftype cfs-work (structure) + ((desired-travel-dist float :offset-assert 0) + (desired-angle float :offset-assert 4) + (max-dist float :offset-assert 8) + (old-angle float :offset-assert 12) + (modified int32 :offset-assert 16) + (blocked-mask uint64 :offset-assert 24) + (travel vector :inline :offset-assert 32) + (current vector :inline :offset-assert 48) + (new-travel cfs-travel-vec 2 :inline :offset-assert 64) + (temp-travel cfs-travel-vec 2 :inline :offset-assert 128) + (prev-dir vector :inline :offset-assert 192) + (attempt-dir vector :inline :offset-assert 208) + (tangent vector 2 :inline :offset-assert 224) + ) + :method-count-assert 9 + :size-assert #x100 + :flag-assert #x900000100 + ) -; (deftype nav-control-cfs-work (structure) -; ((in-dir vector :inline :offset-assert 0) -; (right-dir vector :inline :offset-assert 16) -; (best-dir UNKNOWN 2 :offset-assert 32) -; (temp-dir UNKNOWN 2 :offset-assert 64) -; (away-dir vector :inline :offset-assert 96) -; (best-dir-angle UNKNOWN 2 :offset-assert 112) -; (ignore-mask uint64 :offset-assert 120) -; (initial-ignore-mask uint64 :offset-assert 128) -; (i-sphere int32 :offset-assert 136) -; (i-first-sphere int32 :offset-assert 140) -; (i-inside-sphere int32 :offset-assert 144) -; (inside-sphere-dist float :offset-assert 148) -; (sign float :offset-assert 152) -; (travel-len float :offset-assert 156) -; (dist2 float :offset-assert 160) -; (inside-dist float :offset-assert 164) -; (rand-angle float :offset-assert 168) -; (dir-update basic :offset-assert 172) -; (debug-offset vector :inline :offset-assert 176) -; ) -; :method-count-assert 9 -; :size-assert #xc0 -; :flag-assert #x9000000c0 -; ) +(deftype nav-control-cfs-work (structure) + ((in-dir vector :inline :offset-assert 0) + (right-dir vector :inline :offset-assert 16) + (best-dir vector 2 :inline :offset-assert 32) + (temp-dir vector 2 :inline :offset-assert 64) + (away-dir vector :inline :offset-assert 96) + (best-dir-angle degrees 2 :offset-assert 112) ;; maybe degs? + (ignore-mask uint64 :offset-assert 120) + (initial-ignore-mask uint64 :offset-assert 128) + (i-sphere int32 :offset-assert 136) + (i-first-sphere int32 :offset-assert 140) + (i-inside-sphere int32 :offset-assert 144) + (inside-sphere-dist float :offset-assert 148) + (sign float :offset-assert 152) + (travel-len float :offset-assert 156) + (dist2 float :offset-assert 160) + (inside-dist float :offset-assert 164) + (rand-angle float :offset-assert 168) + (dir-update basic :offset-assert 172) + (debug-offset vector :inline :offset-assert 176) + ) + :method-count-assert 9 + :size-assert #xc0 + :flag-assert #x9000000c0 + ) ;; - Functions -(define-extern test-xz-point-on-line-segment? function) -(define-extern ray-ccw-line-segment-intersection? function) -(define-extern choose-travel-portal-vertex function) -(define-extern init-ray function) -(define-extern ray-line-segment-intersection? function) -(define-extern point-triangle-distance-min function) -(define-extern nav-mesh-update-route-table function) -(define-extern nav-mesh-lookup-route function) -(define-extern nav-ray-test-local? function) -(define-extern init-ray-local function) -(define-extern init-ray-dir-local function) -(define-extern circle-triangle-intersection? function) -(define-extern point-inside-rect? function) -(define-extern recursive-inside-poly function) -(define-extern point-inside-poly? function) -(define-extern vu-point-triangle-intersection? function) -(define-extern pke-nav-hack function) -(define-extern debug-report-nav-stats function) -(define-extern inc-mod3 function) -(define-extern dec-mod3 function) -(define-extern circle-triangle-intersection-proc? function) -(define-extern nav-ray-test function) -(define-extern clip-vector-to-halfspace! function) -(define-extern add-nav-sphere function) -(define-extern add-collide-shape-spheres function) -(define-extern circle-tangent-directions function) -(define-extern find-closest-circle-ray-intersection function) -(define-extern sign-bit function) -(define-extern compute-dir-parm function) -(define-extern debug-nav-validate-current-poly function) -(define-extern start-collect-nav function) -(define-extern end-collect-nav function) -(define-extern nav-sphere-from-cam function) +(define-extern test-xz-point-on-line-segment? (function vector vector vector float symbol)) +(define-extern ray-ccw-line-segment-intersection? (function vector vector vector vector symbol)) +(define-extern choose-travel-portal-vertex (function nav-mesh nav-route-portal nav-poly vector int)) +(define-extern init-ray (function nav-ray symbol)) +(define-extern ray-line-segment-intersection? (function vector vector vector vector symbol)) +(define-extern point-triangle-distance-min (function vector float (inline-array nav-vertex) float)) +(define-extern nav-mesh-update-route-table (function nav-mesh int int uint uint)) +(define-extern nav-mesh-lookup-route (function nav-mesh int int uint)) +(define-extern nav-ray-test-local? (function nav-mesh nav-poly vector vector symbol)) +(define-extern init-ray-local (function nav-ray nav-poly vector vector symbol)) +(define-extern init-ray-dir-local (function nav-ray nav-poly vector vector float symbol)) +(define-extern circle-triangle-intersection? (function vector float (inline-array nav-vertex) symbol)) +(define-extern point-inside-rect? (function nav-node vector float symbol)) +(define-extern recursive-inside-poly (function nav-mesh nav-node vector float int)) ;; unused +(define-extern point-inside-poly? (function nav-mesh uint vector float symbol)) +(define-extern vu-point-triangle-intersection? (function vector vector vector vector symbol)) +(define-extern pke-nav-hack (function none)) +(define-extern debug-report-nav-stats (function none)) ;; empty stub +(define-extern inc-mod3 (function int int)) +(define-extern dec-mod3 (function int int)) +(define-extern circle-triangle-intersection-proc? (function vector float (inline-array nav-vertex) symbol)) +(define-extern nav-ray-test (function nav-mesh nav-poly vector vector meters)) +(define-extern clip-vector-to-halfspace! (function vector float float float float)) +(define-extern add-nav-sphere (function nav-control vector none)) +(define-extern add-collide-shape-spheres (function nav-control collide-shape vector none)) ;; unused +(define-extern circle-tangent-directions (function vector vector vector vector vector)) +(define-extern find-closest-circle-ray-intersection (function vector vector float int (inline-array vector) int int)) ;; last int arg may be a float but...it does a logand with it +(define-extern sign-bit (function int int)) +(define-extern compute-dir-parm (function vector vector vector float)) +(define-extern debug-nav-validate-current-poly (function nav-mesh nav-poly vector symbol)) ;; unused +(define-extern start-collect-nav (function none)) +(define-extern end-collect-nav (function none)) +(define-extern nav-sphere-from-cam (function none)) ;; - Unknowns -;;(define-extern *edge-vert0-table* object) ;; unknown type -;;(define-extern *edge-vert1-table* object) ;; unknown type -;;(define-extern *edge-mask-table* object) ;; unknown type -;;(define-extern *nav-patch-route-table* object) ;; unknown type -;;(define-extern *nav-timer* object) ;; unknown type -;;(define-extern *nav-update-route-table-ray-count* object) ;; unknown type -;;(define-extern *nav-update-route-table-route-count* object) ;; unknown type -;;(define-extern *debug-traverse* object) ;; unknown type -;;(define-extern *debug-tests* object) ;; unknown type -;;(define-extern *color-red* object) ;; unknown type -;;(define-extern *color-blue* object) ;; unknown type -;;(define-extern *color-green* object) ;; unknown type -;;(define-extern *color-cyan* object) ;; unknown type -;;(define-extern *color-yellow* object) ;; unknown type -;;(define-extern *color-white* object) ;; unknown type -;;(define-extern *travel-timer* object) ;; unknown type -;;(define-extern *clip-for-spheres-timer* object) ;; unknown type -;;(define-extern *find-poly-timer* object) ;; unknown type -;;(define-extern *nav-timer-enable* object) ;; unknown type -;;(define-extern *nav-triangle-test-count* object) ;; unknown type -;;(define-extern *nav-last-triangle-test-count* object) ;; unknown type -;;(define-extern *debug-output* object) ;; unknown type -;;(define-extern *debug-nav* object) ;; unknown type -;;(define-extern *debug-nav-ray* object) ;; unknown type -;;(define-extern *debug-ray-offset* object) ;; unknown type -;;(define-extern *debug-nav-travel* object) ;; unknown type -;;(define-extern *color-black* object) ;; unknown type -;;(define-extern *color-gray* object) ;; unknown type -;;(define-extern *color-magenta* object) ;; unknown type -;;(define-extern *color-light-red* object) ;; unknown type -;;(define-extern *color-light-green* object) ;; unknown type -;;(define-extern *color-light-blue* object) ;; unknown type -;;(define-extern *color-light-cyan* object) ;; unknown type -;;(define-extern *color-light-magenta* object) ;; unknown type -;;(define-extern *color-light-yellow* object) ;; unknown type -;;(define-extern *color-dark-red* object) ;; unknown type -;;(define-extern *color-dark-green* object) ;; unknown type -;;(define-extern *color-dark-blue* object) ;; unknown type -;;(define-extern *color-dark-cyan* object) ;; unknown type -;;(define-extern *color-dark-magenta* object) ;; unknown type -;;(define-extern *color-dark-yellow* object) ;; unknown type -;;(define-extern *color-orange* object) ;; unknown type -;;(define-extern *nav-one-third* object) ;; unknown type -;;(define-extern *debug-offset* object) ;; unknown type -;;(define-extern *debug-ray-test* object) ;; unknown type -;;(define-extern *debug-ray-test-capture-mode* object) ;; unknown type -;;(define-extern *debug-ray-test-capture-output* object) ;; unknown type -;;(define-extern *test-ray-start-poly-id* object) ;; unknown type -;;(define-extern *test-ray-src-pos* object) ;; unknown type -;;(define-extern *test-ray-dest-pos* object) ;; unknown type - - -;; ---------------------- -;; File - aligner -;; Source Path - engine/anim/aligner.gc -;; Containing DGOs - ['GAME', 'ENGINE'] -;; Version - 3 - -;; - Nothing Defined in This File! +(define-extern *edge-vert0-table* (array int8)) +(define-extern *edge-vert1-table* (array int8)) +(define-extern *edge-mask-table* (array int8)) +(define-extern *nav-patch-route-table* symbol) +(define-extern *nav-timer* stopwatch) +(define-extern *nav-update-route-table-ray-count* int) +(define-extern *nav-update-route-table-route-count* int) +(define-extern *debug-traverse* int) +(define-extern *debug-tests* int) +(define-extern *color-red* rgba) +(define-extern *color-blue* rgba) +(define-extern *color-green* rgba) +(define-extern *color-cyan* rgba) +(define-extern *color-yellow* rgba) +(define-extern *color-white* rgba) +(define-extern *travel-timer* stopwatch) +(define-extern *clip-for-spheres-timer* stopwatch) +(define-extern *find-poly-timer* stopwatch) +(define-extern *nav-timer-enable* symbol) +(define-extern *nav-triangle-test-count* int) +(define-extern *nav-last-triangle-test-count* int) +(define-extern *debug-output* symbol) ;; TODO - could be wrong +(define-extern *debug-nav* symbol) +(define-extern *debug-nav-ray* nav-ray) +(define-extern *debug-ray-offset* vector) ;; TODO - or some other 4 word type +(define-extern *debug-nav-travel* symbol) ;; TODO - ?? +(define-extern *color-black* rgba) +(define-extern *color-gray* rgba) +(define-extern *color-magenta* rgba) +(define-extern *color-light-red* rgba) +(define-extern *color-light-green* rgba) +(define-extern *color-light-blue* rgba) +(define-extern *color-light-cyan* rgba) +(define-extern *color-light-magenta* rgba) +(define-extern *color-light-yellow* rgba) +(define-extern *color-dark-red* rgba) +(define-extern *color-dark-green* rgba) +(define-extern *color-dark-blue* rgba) +(define-extern *color-dark-cyan* rgba) +(define-extern *color-dark-magenta* rgba) +(define-extern *color-dark-yellow* rgba) +(define-extern *color-orange* rgba) +(define-extern *nav-one-third* vector) +(define-extern *debug-offset* vector) ;; TODO - or some other 4 word type +(define-extern *debug-ray-test* nav-ray) ;; TODO - ?? +(define-extern *debug-ray-test-capture-mode* symbol) ;; TODO - ?? +(define-extern *debug-ray-test-capture-output* symbol) ;; TODO - ?? +(define-extern *test-ray-start-poly-id* int) +(define-extern *test-ray-src-pos* vector) ;; TODO - or some other 4 word type +(define-extern *test-ray-dest-pos* vector) ;; TODO - or some other 4 word type ;; ---------------------- @@ -20904,6 +20933,8 @@ (initialize (_type_) _type_ 20) (initialize-params (_type_ int float) none 21) ) + (:states + (hud-collecting handle)) ) (deftype eco-collectable (collectable) @@ -21000,6 +21031,9 @@ :method-count-assert 31 :size-assert #x19c :flag-assert #x1f0130019c + (:states + (fuel-cell-clone-anim handle) + (fuel-cell-spline-slider handle float float)) ) (deftype buzzer (eco-collectable) @@ -21022,6 +21056,8 @@ :method-count-assert 20 :size-assert #xd4 :flag-assert #x14007000d4 + (:states + ecovalve-idle) ) (deftype vent (process-drawable) @@ -21101,10 +21137,8 @@ ;; - Symbols (define-extern *ecovalve-sg* skeleton-group) -(define-extern ecovalve-idle (state ecovalve)) (define-extern *eco-pill-count* int) (define-extern *buzzer-sg* skeleton-group) -(define-extern fuel-cell-clone-anim (state handle fuel-cell)) (define-extern *fuel-cell-tune-pos* vector) (define-extern *fuel-cell-sg* skeleton-group) (define-extern *money-sg* skeleton-group) @@ -21169,7 +21203,6 @@ ;; - Unknowns -(define-extern othercam-running (state othercam)) ;; ---------------------- @@ -21306,14 +21339,9 @@ ;; - Symbols -(define-extern hud-arriving (state hud)) ;; - Unknowns -(define-extern hud-hidden (state hud)) -(define-extern hud-leaving (state int hud)) -(define-extern hud-in (state hud)) -(define-extern hud-collecting (state handle collectable)) ;; ---------------------- @@ -21535,15 +21563,9 @@ ;; - Unknowns -(define-extern progress-normal (state progress)) -(define-extern progress-going-out (state progress)) -(define-extern progress-gone (state progress)) (define-extern *progress-state* progress-global-state) (define-extern *progress-save-info* mc-slot-info) -(define-extern progress-coming-in (state progress)) (define-extern *progress-stack* (pointer uint8)) -(define-extern progress-waiting (state progress)) -(define-extern progress-debug (state progress)) ;; ---------------------- @@ -21595,7 +21617,7 @@ (define-extern projectile-collision-reaction (function collide-shape-moving collide-shape-intersect vector vector none)) (define-extern projectile-update-velocity-space-wars (function projectile none)) (define-extern find-nearest-attackable (function vector float uint uint vector float projectile)) ;; Whatever te search returns (match from search-info) -(define-extern find-ground-and-draw-shadow (function vector vector float uint process float float none)) +(define-extern find-ground-and-draw-shadow (function vector vector float collide-kind process float float none)) (define-extern spawn-projectile-blue (function target none)) ;; - Unknowns @@ -22065,11 +22087,10 @@ ;; - Unknowns -(define-extern *anim-tester* (pointer anim-tester)) ;; unknown type -(define-extern *ANIM_TESTER-bank* anim-tester-bank) ;; unknown type -(define-extern anim-tester-process (state anim-tester)) ;; unknown type +(define-extern *anim-tester* (pointer anim-tester)) +(define-extern *ANIM_TESTER-bank* anim-tester-bank) (define-extern anim-test-field-highlight-lw (inline-array list-field)) -(define-extern *DISP_LIST-bank* DISP_LIST-bank) ;; unknown type +(define-extern *DISP_LIST-bank* DISP_LIST-bank) (define-extern *debug-menu-context* debug-menu-context) @@ -22084,11 +22105,13 @@ (deftype viewer (process-drawable) ((janim art-joint-anim :offset-assert 176) ) + (:states + viewer-process + ) :method-count-assert 20 :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 - ;; inherited inspect of process-drawable ) ;; - Functions @@ -22101,12 +22124,12 @@ ;; - Unknowns -(define-extern *viewer* viewer) ;; unknown type +(define-extern *viewer* viewer) (define-extern viewer-ja-name string) (define-extern viewer-geo-name string) (define-extern *viewer-sg* skeleton-group) -(define-extern viewer-process (state viewer)) (define-extern viewer-string string) +(define-extern viewer-process (state viewer)) ;; ---------------------- @@ -22134,10 +22157,10 @@ ;; - Unknowns -(define-extern *debug-part-dead-pool* dead-pool) ;; unknown type -(define-extern *part-tester* part-tester) ;; unknown type -(define-extern part-tester-idle (state part-tester)) ;; unknown type -(define-extern *part-tester-name* string) ;; unknown type +(define-extern *debug-part-dead-pool* dead-pool) +(define-extern *part-tester* part-tester) +(define-extern *part-tester-name* string) +(define-extern part-tester-idle (state part-tester)) ;; ---------------------- @@ -22169,7 +22192,7 @@ (define-extern build-instance-list (function object none)) ;; TODO - drawable types aren't complete (define-extern dm-edit-instance-toggle-pick-func (function int debug-menu-msg symbol)) (define-extern dm-boolean-toggle-pick-func (function (pointer symbol) debug-menu-msg symbol)) -(define-extern build-shader-list (function object)) +(define-extern build-shader-list (function none)) (define-extern all-texture-tweak-adjust (function texture-page-dir float none)) ;; TODO - texture related types (define-extern debug-menu-make-camera-mode-menu (function debug-menu debug-menu none)) (define-extern dm-cam-externalize (function symbol debug-menu-msg symbol)) @@ -22219,64 +22242,9 @@ (define-extern *instance-tie-menu* debug-menu) (define-extern *enable-instance-tie-menu* debug-menu) (define-extern *shader-pick-menu* debug-menu) -(define-extern cam-robotboss (state camera-slave)) (define-extern *dm-cam-mode-interpolation* int) -;; ---------------------- -;; File - dir-tpages -;; Source Path - levels/common/dir-tpages.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-463 -;; Source Path - levels/common/tpage-463.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-2 -;; Source Path - levels/common/tpage-2.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-880 -;; Source Path - levels/common/tpage-880.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-256 -;; Source Path - levels/common/tpage-256.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1278 -;; Source Path - levels/common/tpage-1278.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - texture-upload ;; Source Path - levels/common/texture-upload.gc @@ -22288,249 +22256,6 @@ (define-extern *ocean-texture* texture) -;; ---------------------- -;; File - tpage-1032 -;; Source Path - levels/common/tpage-1032.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-62 -;; Source Path - levels/common/tpage-62.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1532 -;; Source Path - levels/common/tpage-1532.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fuel-cell-ag -;; Source Path - levels/common/fuel-cell-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - money-ag -;; Source Path - levels/common/money-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - buzzer-ag -;; Source Path - levels/common/buzzer-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-ART-GAME -;; Source Path - levels/common/ecovalve-ag-ART-GAME.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-BEA -;; Source Path - levels/beach/ecovalve-ag-BEA.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-CIT -;; Source Path - levels/citadel/ecovalve-ag-CIT.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-FIN -;; Source Path - levels/finalboss/ecovalve-ag-FIN.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-JUB-JUN -;; Source Path - levels/jungle_common/ecovalve-ag-JUB-JUN.gd -;; Containing DGOs - ['JUB', 'JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-FIC-OGR -;; Source Path - levels/common/ecovalve-ag-FIC-OGR.gd -;; Containing DGOs - ['FIC', 'OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-LAV -;; Source Path - levels/lavatube/ecovalve-ag-LAV.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-MAI -;; Source Path - levels/maincave/ecovalve-ag-MAI.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-ROB -;; Source Path - levels/robocave/ecovalve-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-ROL -;; Source Path - levels/rolling/ecovalve-ag-ROL.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-SNO -;; Source Path - levels/snow/ecovalve-ag-SNO.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-SUB -;; Source Path - levels/sunkenb/ecovalve-ag-SUB.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-SWA -;; Source Path - levels/swamp/ecovalve-ag-SWA.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecovalve-ag-TRA -;; Source Path - levels/training/ecovalve-ag-TRA.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - crate-ag -;; Source Path - levels/common/crate-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - speaker-ag -;; Source Path - levels/common/speaker-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fuelcell-naked-ag -;; Source Path - levels/common/fuelcell-naked-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-ag -;; Source Path - levels/common/eichar-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sidekick-ag -;; Source Path - levels/common/sidekick-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - deathcam-ag -;; Source Path - levels/common/deathcam-ag.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - game-cnt -;; Source Path - levels/common/game-cnt.gd -;; Containing DGOs - ['GAME', 'ART'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - rigid-body-h ;; Source Path - levels/common/rigid-body-h.gc @@ -23161,7 +22886,6 @@ ;; - Unknowns (define-extern *warp-jump-mods* surface) -(define-extern target-warp-out (state vector vector target)) (define-extern *warp-info* (array string)) (define-extern *generic-button-sg* skeleton-group) @@ -23231,7 +22955,7 @@ ) (deftype joint-exploder-static-params (basic) - ((joints array :offset-assert 4) ;; an array of...what? + ((joints (array joint-exploder-static-joint-params) :offset-assert 4) ) :method-count-assert 9 :size-assert #x8 @@ -23255,13 +22979,13 @@ (deftype joint-exploder-joints (basic) ((num-joints int32 :offset-assert 4) - (joint joint-exploder-joint :dynamic :offset 16) + (joint joint-exploder-joint :dynamic :inline :offset 16) ) :method-count-assert 9 :size-assert #x10 :flag-assert #x900000010 (:methods - (new (symbol _type_ int) _type_ 0)) + (new (symbol type joint-exploder-static-params) _type_ 0)) ) (deftype joint-exploder-list (structure) @@ -23276,7 +23000,8 @@ ) (deftype joint-exploder (process-drawable) - ((die-if-below-y float :offset-assert 176) + ((parent-override (pointer process-drawable) :score 100 :offset 12) + (die-if-below-y float :offset-assert 176) (die-if-beyond-xz-dist-sqrd float :offset-assert 180) (joints joint-exploder-joints :offset-assert 184) (static-params joint-exploder-static-params :offset-assert 188) @@ -23290,26 +23015,27 @@ :heap-base #x1a0 :flag-assert #x1d01a00210 (:methods - (dummy-20 (_type_) none 20) - (dummy-21 (_type_) none 21) - (dummy-22 () none 22) - (dummy-23 () none 23) - (dummy-24 (_type_) none 24) - (dummy-25 () none 25) - (dummy-26 (_type_) none 26) - (dummy-27 (_type_ joint-exploder-list) none 27) - (dummy-28 (_type_) none 28) + (TODO-RENAME-20 (_type_ joint-exploder-list int) int 20) + (TODO-RENAME-21 (_type_ joint-exploder-list joint-exploder-joint) none 21) + (TODO-RENAME-22 (_type_ joint-exploder-list) symbol 22) + (TODO-RENAME-23 (_type_) symbol 23) + (TODO-RENAME-24 (_type_ joint-exploder-list int) int 24) + (TODO-RENAME-25 (_type_ joint-exploder-list) symbol 25) + (TODO-RENAME-26 (_type_ joint-exploder-list int) int 26) + (TODO-RENAME-27 (_type_ joint-exploder-list int) joint-exploder-list 27) + (TODO-RENAME-28 (_type_ joint-exploder-list) none 28) ) + (:states + joint-exploder-shatter) ) ;; - Functions (define-extern joint-exploder-joint-callback (function joint-exploder none)) -(define-extern joint-exploder-init-by-other (function skeleton-group int joint-exploder-static-params joint-exploder-tuning none :behavior joint-exploder)) +(define-extern joint-exploder-init-by-other (function skeleton-group int joint-exploder-static-params joint-exploder-static-params none :behavior joint-exploder)) ;; - Unknowns -(define-extern joint-exploder-shatter (state joint-exploder)) ;; ---------------------- @@ -23326,7 +23052,8 @@ :size-assert #x190 :heap-base #x120 :flag-assert #x4c01200190 - ;; not enough basic ops + (:states + babak-run-to-cannon) ) ;; - Unknowns @@ -23412,13 +23139,13 @@ (:states (orb-cache-top-complete symbol) (orb-cache-top-activate symbol) + (orb-cache-top-idle symbol) ) ) ;; - Unknowns (define-extern *orb-cache-top-sg* skeleton-group) -(define-extern orb-cache-top-idle (state symbol orb-cache-top)) ;; ---------------------- @@ -23800,7 +23527,6 @@ ;; - Unknowns (define-extern *mistycannon-sg* skeleton-group) -(define-extern cam-mistycannon (state camera-slave)) ;; unknown type (define-extern *mistycannon-missile-sg* skeleton-group) @@ -23820,6 +23546,10 @@ :size-assert #x198 :heap-base #x130 :flag-assert #x4c01300198 + (:states + babak-with-cannon-jump-off-cannon + babak-with-cannon-shooting + babak-with-cannon-jump-onto-cannon) ) ;; - Functions @@ -23833,10 +23563,6 @@ ;; - Unknowns -(define-extern babak-with-cannon-jump-off-cannon (state babak-with-cannon)) ;; unknown type -(define-extern babak-with-cannon-shooting (state babak-with-cannon)) ;; unknown type -(define-extern babak-with-cannon-jump-onto-cannon (state babak-with-cannon)) ;; unknown type -(define-extern babak-run-to-cannon (state babak)) ;; unknown type ;; ---------------------- @@ -24524,399 +24250,13 @@ :size-assert #xd0 :heap-base #x60 :flag-assert #x15006000d0 + (:states + beach-part-grotto-1) ) ;; - Unknowns (define-extern sound-beach-waterfall sound-spec) -(define-extern beach-part-grotto-1 (state beach-part)) - - -;; ---------------------- -;; File - tpage-212 -;; Source Path - levels/beach/tpage-212.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-214 -;; Source Path - levels/beach/tpage-214.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-213 -;; Source Path - levels/beach/tpage-213.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-215 -;; Source Path - levels/beach/tpage-215.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - babak-ag -;; Source Path - levels/common/babak-ag.gd -;; Containing DGOs - ['BEA', 'CIT', 'JUN', 'FIC', 'MIS', 'ROB', 'ROL', 'SNO', 'SUB', 'SUN', 'SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - barrel-ag-BEA -;; Source Path - levels/beach/barrel-ag-BEA.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - barrel-ag-VI2 -;; Source Path - levels/village2/barrel-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - beachcam-ag -;; Source Path - levels/beach/beachcam-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bird-lady-ag -;; Source Path - levels/beach/bird-lady-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bird-lady-beach-ag -;; Source Path - levels/beach/bird-lady-beach-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bladeassm-ag -;; Source Path - levels/beach/bladeassm-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecoventrock-ag -;; Source Path - levels/beach/ecoventrock-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflut-ag -;; Source Path - levels/beach/flutflut-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflutegg-ag -;; Source Path - levels/beach/flutflutegg-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - grottopole-ag -;; Source Path - levels/beach/grottopole-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - harvester-ag -;; Source Path - levels/beach/harvester-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - kickrock-ag -;; Source Path - levels/beach/kickrock-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lrocklrg-ag -;; Source Path - levels/beach/lrocklrg-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lurkercrab-ag -;; Source Path - levels/beach/lurkercrab-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lurkerpuppy-ag -;; Source Path - levels/beach/lurkerpuppy-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lurkerworm-ag -;; Source Path - levels/beach/lurkerworm-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mayor-ag -;; Source Path - levels/beach/mayor-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mistycannon-ag -;; Source Path - levels/common/mistycannon-ag.gd -;; Containing DGOs - ['BEA', 'MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-BEA -;; Source Path - levels/beach/orb-cache-top-ag-BEA.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-CIT -;; Source Path - levels/citadel/orb-cache-top-ag-CIT.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-JUN -;; Source Path - levels/jungle/orb-cache-top-ag-JUN.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-MIS -;; Source Path - levels/misty/orb-cache-top-ag-MIS.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-SNO -;; Source Path - levels/snow/orb-cache-top-ag-SNO.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-SUN -;; Source Path - levels/sunken/orb-cache-top-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-VI1 -;; Source Path - levels/village1/orb-cache-top-ag-VI1.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orb-cache-top-ag-VI2 -;; Source Path - levels/village2/orb-cache-top-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pelican-ag -;; Source Path - levels/beach/pelican-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sack-ag-BEA -;; Source Path - levels/beach/sack-ag-BEA.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sack-ag-MIS -;; Source Path - levels/misty/sack-ag-MIS.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sculptor-ag -;; Source Path - levels/beach/sculptor-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sculptor-muse-ag -;; Source Path - levels/beach/sculptor-muse-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - seagull-ag -;; Source Path - levels/beach/seagull-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sharkey-ag-BEA-TRA-VI2 -;; Source Path - levels/common/sharkey-ag-BEA-TRA-VI2.gd -;; Containing DGOs - ['BEA', 'TRA', 'VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sharkey-ag-JUN-MIS -;; Source Path - levels/common/sharkey-ag-JUN-MIS.gd -;; Containing DGOs - ['JUN', 'MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sharkey-ag-SWA -;; Source Path - levels/swamp/sharkey-ag-SWA.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sharkey-ag-VI1 -;; Source Path - levels/village1/sharkey-ag-VI1.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - windmill-one-ag -;; Source Path - levels/beach/windmill-one-ag.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - beach-vis -;; Source Path - levels/beach/beach-vis.gd -;; Containing DGOs - ['BEA'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -25222,6 +24562,8 @@ (init! (_type_) none 20) (dummy-21 (_type_) none 21) ) + (:states + citb-disc-idle) ) (deftype citb-disc-a (citb-disc) @@ -25289,6 +24631,9 @@ :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 + (:states + citb-robotboss-die + citb-robotboss-idle) ) (deftype citb-coil (process-drawable) @@ -25298,6 +24643,10 @@ :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 + (:states + citb-coil-broken + citb-coil-idle + citb-coil-break) ) (deftype citb-hose (process-drawable) @@ -25306,6 +24655,10 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + citb-hose-die + citb-hose-idle + citb-hose-spawn) ) (deftype citb-chains (process-hidden) @@ -25334,6 +24687,10 @@ (init! (_type_) none 20) (dummy-21 (_type_) none 21) ) + (:states + citb-generator-broken + citb-generator-idle + citb-generator-break) ) (deftype citadelcam (process-drawable) @@ -25342,6 +24699,9 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + citadelcam-idle + citadelcam-stair-plats) ) (deftype citb-battlecontroller (battlecontroller) @@ -25360,24 +24720,11 @@ ;; - Unknowns (define-extern *citadelcam-sg* skeleton-group) -(define-extern citadelcam-idle (state citadelcam)) ;; unknown type -(define-extern citadelcam-stair-plats (state citadelcam)) ;; unknown type -(define-extern citb-generator-broken (state citb-generator)) ;; unknown type -(define-extern citb-generator-idle (state citb-generator)) ;; unknown type (define-extern *citb-generator-sg* skeleton-group) (define-extern *citb-generator-broken-sg* skeleton-group) -(define-extern citb-generator-break (state citb-generator)) ;; unknown type (define-extern *citb-hose-sg* skeleton-group) -(define-extern citb-hose-die (state citb-hose)) ;; unknown type -(define-extern citb-hose-idle (state citb-hose)) ;; unknown type -(define-extern citb-hose-spawn (state citb-hose)) ;; unknown type (define-extern *citb-coil-sg* skeleton-group) -(define-extern citb-coil-broken (state citb-coil)) ;; unknown type -(define-extern citb-coil-idle (state citb-coil)) ;; unknown type -(define-extern citb-coil-break (state citb-coil)) ;; unknown type (define-extern *citb-robotboss-sg* skeleton-group) -(define-extern citb-robotboss-die (state citb-robotboss)) ;; unknown type -(define-extern citb-robotboss-idle (state citb-robotboss)) ;; unknown type (define-extern *citb-robotboss-nose-sg* skeleton-group) (define-extern *citb-robotboss-head-sg* skeleton-group) (define-extern *citb-robotboss-gun-sg* skeleton-group) @@ -25393,7 +24740,6 @@ (define-extern *citb-disc-c-sg* skeleton-group) (define-extern *citb-disc-b-sg* skeleton-group) (define-extern *citb-disc-a-sg* skeleton-group) -(define-extern citb-disc-idle (state citb-disc)) ;; unknown type (define-extern *citb-arm-shoulder-b-sg* skeleton-group) (define-extern *citb-arm-shoulder-a-sg* skeleton-group) (define-extern *citb-arm-d-sg* skeleton-group) @@ -25468,6 +24814,8 @@ :heap-base #x2b0 :size-assert #x318 :flag-assert #x2302b00318 + (:states + citb-chain-plat-settle) ) (deftype citb-rotatebox (citb-base-plat) @@ -25506,6 +24854,10 @@ :size-assert #xd0 :heap-base #x60 :flag-assert #x14006000d0 + (:states + citb-firehose-idle + citb-firehose-active + citb-firehose-blast) ) (deftype citb-exit-plat (plat-button) @@ -25517,6 +24869,9 @@ :size-assert #xfc :heap-base #x90 :flag-assert #x21009000fc + (:states + citb-exit-plat-idle + citb-exit-plat-rise) ) ;; - Functions @@ -25526,19 +24881,13 @@ ;; - Unknowns -(define-extern citb-exit-plat-idle (state citb-exit-plat)) (define-extern *citb-exit-plat-sg* skeleton-group) -(define-extern citb-exit-plat-rise (state citb-exit-plat)) (define-extern *citb-firehose-sg* skeleton-group) -(define-extern citb-firehose-idle (state citb-firehose)) -(define-extern citb-firehose-active (state citb-firehose)) -(define-extern citb-firehose-blast (state citb-firehose)) (define-extern *citb-stopbox-sg* skeleton-group) (define-extern *citb-donut-sg* skeleton-group) (define-extern *citb-rotatebox-sg* skeleton-group) (define-extern *citb-chain-plat-sg* skeleton-group) (define-extern *citb-chain-plat-constants* rigid-body-platform-constants) -(define-extern citb-chain-plat-settle (state citb-chain-plat)) (define-extern *plat-citb-sg* skeleton-group) (define-extern *plat-eco-citb-lit-sg* skeleton-group) (define-extern *plat-eco-citb-unlit-sg* skeleton-group) @@ -25766,6 +25115,12 @@ (TODO-RENAME-20 (_type_) none 20) (dummy-21 (_type_) none 21) ) + (:states + drop-plat-spawn + drop-plat-die + drop-plat-idle + drop-plat-drop + (drop-plat-rise draw-control)) ) (deftype handle-inline-array (inline-array-class) @@ -25795,6 +25150,9 @@ :size-assert #x120 :heap-base #xb0 :flag-assert #x1400b00120 + (:states + citb-drop-plat-idle + citb-drop-plat-active) ) ;; - Functions @@ -25807,27 +25165,11 @@ ;; - Unknowns -(define-extern citb-drop-plat-idle (state citb-drop-plat)) -(define-extern citb-drop-plat-active (state citb-drop-plat)) -(define-extern drop-plat-spawn (state drop-plat)) (define-extern *citb-drop-plat-red-sg* skeleton-group) (define-extern *citb-drop-plat-green-sg* skeleton-group) (define-extern *citb-drop-plat-blue-sg* skeleton-group) (define-extern *citb-drop-plat-yellow-sg* skeleton-group) (define-extern *citb-drop-plat-sg* skeleton-group) -(define-extern drop-plat-die (state drop-plat)) -(define-extern drop-plat-idle (state drop-plat)) -(define-extern drop-plat-drop (state drop-plat)) -(define-extern drop-plat-rise (state draw-control drop-plat)) - - -;; ---------------------- -;; File - citb-drop-plat-L1 -;; Source Path - levels/l1_only/citb-drop-plat-L1.gc -;; Containing DGOs - ['L1'] -;; Version - 3 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -25851,366 +25193,6 @@ (define-extern *assistant-lavatube-end-sg* skeleton-group) -;; ---------------------- -;; File - tpage-1415 -;; Source Path - levels/citadel/tpage-1415.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1417 -;; Source Path - levels/citadel/tpage-1417.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1416 -;; Source Path - levels/citadel/tpage-1416.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1414 -;; Source Path - levels/citadel/tpage-1414.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-lavatube-end-ag -;; Source Path - levels/citadel/assistant-lavatube-end-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bluesage-ag -;; Source Path - levels/citadel/bluesage-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citadelcam-ag -;; Source Path - levels/citadel/citadelcam-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-arm-ag -;; Source Path - levels/citadel/citb-arm-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-arm-shoulder-ag -;; Source Path - levels/citadel/citb-arm-shoulder-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-bunny-ag -;; Source Path - levels/citadel/citb-bunny-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-button-ag -;; Source Path - levels/citadel/citb-button-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-chain-plat-ag -;; Source Path - levels/citadel/citb-chain-plat-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-chains-ag -;; Source Path - levels/citadel/citb-chains-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-coil-ag -;; Source Path - levels/citadel/citb-coil-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-disc-ag -;; Source Path - levels/citadel/citb-disc-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-donut-ag -;; Source Path - levels/citadel/citb-donut-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-drop-plat-ag -;; Source Path - levels/citadel/citb-drop-plat-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-exit-plat-ag -;; Source Path - levels/citadel/citb-exit-plat-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-firehose-ag -;; Source Path - levels/citadel/citb-firehose-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-generator-ag -;; Source Path - levels/citadel/citb-generator-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-hose-ag -;; Source Path - levels/citadel/citb-hose-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-iris-door-ag -;; Source Path - levels/citadel/citb-iris-door-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-launcher-ag -;; Source Path - levels/citadel/citb-launcher-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-robotboss-ag -;; Source Path - levels/citadel/citb-robotboss-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-rotatebox-ag -;; Source Path - levels/citadel/citb-rotatebox-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-sagecage-ag -;; Source Path - levels/citadel/citb-sagecage-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citb-stopbox-ag -;; Source Path - levels/citadel/citb-stopbox-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilbro-citadel-ag -;; Source Path - levels/citadel/evilbro-citadel-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilsis-citadel-ag -;; Source Path - levels/citadel/evilsis-citadel-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - green-sagecage-ag -;; Source Path - levels/common/green-sagecage-ag.gd -;; Containing DGOs - ['CIT', 'FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-citb-ag -;; Source Path - levels/citadel/plat-citb-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-citb-ag -;; Source Path - levels/citadel/plat-eco-citb-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - redsage-ag -;; Source Path - levels/citadel/redsage-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warp-gate-switch-ag-CIT -;; Source Path - levels/citadel/warp-gate-switch-ag-CIT.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warp-gate-switch-ag-TRA -;; Source Path - levels/training/warp-gate-switch-ag-TRA.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warp-gate-switch-ag-VI1-VI3 -;; Source Path - levels/common/warp-gate-switch-ag-VI1-VI3.gd -;; Containing DGOs - ['VI1', 'VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warp-gate-switch-ag-VI2 -;; Source Path - levels/village2/warp-gate-switch-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warpgate-ag -;; Source Path - levels/common/warpgate-ag.gd -;; Containing DGOs - ['CIT', 'TRA', 'VI1', 'VI2', 'VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - yellowsage-ag -;; Source Path - levels/citadel/yellowsage-ag.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - citadel-vis -;; Source Path - levels/citadel/citadel-vis.gd -;; Containing DGOs - ['CIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - darkcave-obs ;; Source Path - levels/darkcave/darkcave-obs.gc @@ -26255,188 +25237,6 @@ (declare-type cavecrystal-light-control basic) (define-extern *cavecrystal-sg* skeleton-group) (define-extern *cavecrystal-light-control* cavecrystal-light-control) -(define-extern cavecrystal-idle (state cavecrystal)) -(define-extern cavecrystal-active (state cavecrystal)) - - -;; ---------------------- -;; File - tpage-1306 -;; Source Path - levels/darkcave/tpage-1306.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1307 -;; Source Path - levels/darkcave/tpage-1307.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1305 -;; Source Path - levels/darkcave/tpage-1305.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1304 -;; Source Path - levels/darkcave/tpage-1304.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1352 -;; Source Path - levels/darkcave/tpage-1352.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - baby-spider-ag-DAR -;; Source Path - levels/darkcave/baby-spider-ag-DAR.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - baby-spider-ag-MAI -;; Source Path - levels/maincave/baby-spider-ag-MAI.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - baby-spider-ag-ROB -;; Source Path - levels/robocave/baby-spider-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavecrystal-ag -;; Source Path - levels/darkcave/cavecrystal-ag.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - caveelevator-ag -;; Source Path - levels/cave_common/caveelevator-ag.gd -;; Containing DGOs - ['DAR', 'ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavespatula-darkcave-ag -;; Source Path - levels/darkcave/cavespatula-darkcave-ag.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavetrapdoor-ag-DAR -;; Source Path - levels/darkcave/cavetrapdoor-ag-DAR.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavetrapdoor-ag-MAI -;; Source Path - levels/maincave/cavetrapdoor-ag-MAI.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavetrapdoor-ag-ROB -;; Source Path - levels/robocave/cavetrapdoor-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - dark-crystal-ag -;; Source Path - levels/cave_common/dark-crystal-ag.gd -;; Containing DGOs - ['DAR', 'MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mother-spider-ag -;; Source Path - levels/cave_common/mother-spider-ag.gd -;; Containing DGOs - ['DAR', 'MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - spider-egg-ag-DAR-MAI -;; Source Path - levels/cave_common/spider-egg-ag-DAR-MAI.gd -;; Containing DGOs - ['DAR', 'MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - spider-egg-ag-ROB -;; Source Path - levels/robocave/spider-egg-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-darkcave-ag -;; Source Path - levels/darkcave/water-anim-darkcave-ag.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkcave-vis -;; Source Path - levels/darkcave/darkcave-vis.gd -;; Containing DGOs - ['DAR'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -26450,114 +25250,6 @@ (define-extern static-screen-spawn (function int int int int int symbol target (pointer process))) ;; target may differ -;; ---------------------- -;; File - tpage-1485 -;; Source Path - levels/demo/tpage-1485.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1486 -;; Source Path - levels/demo/tpage-1486.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1487 -;; Source Path - levels/demo/tpage-1487.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1599 -;; Source Path - levels/demo/tpage-1599.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1600 -;; Source Path - levels/demo/tpage-1600.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1601 -;; Source Path - levels/demo/tpage-1601.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1602 -;; Source Path - levels/demo/tpage-1602.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1603 -;; Source Path - levels/demo/tpage-1603.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1604 -;; Source Path - levels/demo/tpage-1604.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1605 -;; Source Path - levels/demo/tpage-1605.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1606 -;; Source Path - levels/demo/tpage-1606.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1607 -;; Source Path - levels/demo/tpage-1607.gd -;; Containing DGOs - ['DEM', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - static-screen ;; Source Path - levels/common/static-screen.gc @@ -26584,33 +25276,6 @@ (define-extern static-screen-init-by-other (function int int int int int symbol none :behavior static-screen)) -;; ---------------------- -;; File - tpage-1480 -;; Source Path - levels/demo/tpage-1480.gd -;; Containing DGOs - ['DEM'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1479 -;; Source Path - levels/demo/tpage-1479.gd -;; Containing DGOs - ['DEM'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - demo-vis -;; Source Path - levels/demo/demo-vis.gd -;; Containing DGOs - ['DEM'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - robotboss-h ;; Source Path - levels/finalboss/robotboss-h.gc @@ -26678,6 +25343,24 @@ (:methods (ease-loc-t (_type_) float 20) ) + (:states + robotboss-blue-wait + robotboss-blue-dark-bomb + robotboss-blue-dark-bomb-wait + robotboss-green + robotboss-green-wait + robotboss-green-dark-bomb + robotboss-green-dark-bomb-wait + robotboss-red + robotboss-red-wait + robotboss-red-dark-bomb + robotboss-red-dark-bomb-wait + robotboss-yellow + robotboss-yellow-wait + robotboss-yellow-dark-bomb + robotboss-white-eco-movie + robotboss-daxter-sacrifice-movie + robotboss-yellow-dark-bomb-wait) ) ;; - Functions @@ -26685,15 +25368,6 @@ (define-extern target-has-all-the-cells? (function symbol)) -;; ---------------------- -;; File - robotboss-part -;; Source Path - levels/finalboss/robotboss-part.gc -;; Containing DGOs - ['FIN', 'L1'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - sage-finalboss-part ;; Source Path - levels/finalboss/sage-finalboss-part.gc @@ -26737,6 +25411,7 @@ light-eco-child-hit-ground light-eco-child-idle light-eco-child-die + light-eco-child-appear ) ) @@ -26759,6 +25434,7 @@ (:states light-eco-mother-discipate light-eco-mother-active + light-eco-mother-appear ) ) @@ -26774,9 +25450,7 @@ ;; - Unknowns (define-extern *light-eco-big-sg* skeleton-group) -(define-extern light-eco-mother-appear (state light-eco-mother)) (define-extern *light-eco-small-sg* skeleton-group) -(define-extern light-eco-child-appear (state light-eco-child)) ;; ---------------------- @@ -26823,6 +25497,8 @@ :size-assert #xe0 :heap-base #x70 :flag-assert #x14007000e0 + (:states + arcing-shot-debug-trajectory) ) (deftype darkecobomb (arcing-shot) @@ -26835,6 +25511,11 @@ :size-assert #xf4 :heap-base #x90 :flag-assert #x14009000f4 + (:states + darkecobomb-idle + darkecobomb-land + darkecobomb-countdown + (darkecobomb-explode symbol)) ) (deftype greenshot (arcing-shot) @@ -26844,6 +25525,8 @@ :size-assert #xe8 :heap-base #x80 :flag-assert #x14008000e8 + (:states + greenshot-idle) ) (deftype redshot (arcing-shot) @@ -26859,6 +25542,10 @@ :size-assert #x130 :heap-base #xc0 :flag-assert #x1400c00130 + (:states + redshot-idle + redshot-wait + redshot-explode) ) (deftype yellowshot (arcing-shot) @@ -26868,6 +25555,8 @@ :size-assert #xe8 :heap-base #x80 :flag-assert #x14008000e8 + (:states + yellowshot-idle) ) ;; - Functions @@ -26888,18 +25577,8 @@ ;; - Unknowns (define-extern *redring-sg* skeleton-group) -(define-extern yellowshot-idle (state yellowshot)) -(define-extern redshot-idle (state redshot)) -(define-extern redshot-wait (state redshot)) -(define-extern redshot-explode (state redshot)) (define-extern *greenshot-sg* skeleton-group) -(define-extern greenshot-idle (state greenshot)) (define-extern *darkecobomb-sg* skeleton-group) -(define-extern darkecobomb-idle (state darkecobomb)) -(define-extern darkecobomb-land (state darkecobomb)) -(define-extern darkecobomb-countdown (state darkecobomb)) -(define-extern darkecobomb-explode (state symbol darkecobomb)) -(define-extern arcing-shot-debug-trajectory (state arcing-shot)) ;; ---------------------- @@ -26927,6 +25606,9 @@ :size-assert #x110 :heap-base #xa0 :flag-assert #x1400a00110 + (:states + ecoclaw-idle + ecoclaw-activate) ) (deftype silodoor (process-drawable) @@ -26964,8 +25646,6 @@ (define-extern *silodoor-sg* skeleton-group) (define-extern *ecoclaw-sg* skeleton-group) (define-extern *ecoclaw* (pointer ecoclaw)) -(define-extern ecoclaw-idle (state ecoclaw)) -(define-extern ecoclaw-activate (state ecoclaw)) (define-extern *med-res-snow1-sg* skeleton-group) @@ -26992,7 +25672,8 @@ (:states green-eco-lurker-appear green-eco-lurker-appear-land - ) + green-eco-lurker-wait-to-appear + green-eco-lurker-tune-spheres) ) (deftype green-eco-lurker-gen (process-drawable) @@ -27004,6 +25685,8 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + spawn-minions) ) ;; - Functions @@ -27013,11 +25696,8 @@ ;; - Unknowns -(define-extern spawn-minions (state green-eco-lurker-gen)) -(define-extern green-eco-lurker-wait-to-appear (state green-eco-lurker)) (define-extern *green-eco-lurker-sg* skeleton-group) (define-extern *green-eco-lurker-nav-enemy-info* nav-enemy-info) -(define-extern green-eco-lurker-tune-spheres (state green-eco-lurker)) ;; ---------------------- @@ -27072,26 +25752,9 @@ ;; - Unknowns -(define-extern robotboss-blue-wait (state robotboss)) -(define-extern robotboss-blue-dark-bomb (state robotboss)) (define-extern *robotboss-blueeco-sg* skeleton-group) -(define-extern robotboss-blue-dark-bomb-wait (state robotboss)) -(define-extern robotboss-green (state robotboss)) -(define-extern robotboss-green-wait (state robotboss)) -(define-extern robotboss-green-dark-bomb (state robotboss)) -(define-extern robotboss-green-dark-bomb-wait (state robotboss)) -(define-extern robotboss-red (state robotboss)) -(define-extern robotboss-red-wait (state robotboss)) -(define-extern robotboss-red-dark-bomb (state robotboss)) (define-extern *robotboss-redeco-sg* skeleton-group) -(define-extern robotboss-red-dark-bomb-wait (state robotboss)) -(define-extern robotboss-yellow (state robotboss)) -(define-extern robotboss-yellow-wait (state robotboss)) -(define-extern robotboss-yellow-dark-bomb (state robotboss)) (define-extern *robotboss-yelloweco-sg* skeleton-group) -(define-extern robotboss-white-eco-movie (state robotboss)) -(define-extern robotboss-daxter-sacrifice-movie (state robotboss)) -(define-extern robotboss-yellow-dark-bomb-wait (state robotboss)) ;; ---------------------- @@ -27192,10 +25855,10 @@ ((part sparticle-launch-control :offset-assert 0) (active symbol :offset-assert 4) ) + :allow-misaligned :method-count-assert 9 :size-assert #x8 :flag-assert #x900000008 - :allow-misaligned ) (deftype sage-finalboss (process-taskable) @@ -27221,6 +25884,8 @@ :size-assert #x270 :heap-base #x200 :flag-assert #x3502000270 + (:states + sage-finalboss-credits) ) ;; - Functions @@ -27232,247 +25897,12 @@ ;; - Unknowns (define-extern *sage-finalboss-sg* skeleton-group) -(define-extern sage-finalboss-credits (state sage-finalboss)) (define-extern *jak-white-sg* skeleton-group) (define-extern *robotboss-cinematic-sg* skeleton-group) (define-extern *plat-eco-finalboss-lit-sg* skeleton-group) (define-extern *plat-eco-finalboss-unlit-sg* skeleton-group) -;; ---------------------- -;; File - sage-finalboss-L1 -;; Source Path - levels/l1_only/sage-finalboss-L1.gc -;; Containing DGOs - ['L1'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1419 -;; Source Path - levels/finalboss/tpage-1419.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1420 -;; Source Path - levels/finalboss/tpage-1420.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-634 -;; Source Path - levels/finalboss/tpage-634.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1418 -;; Source Path - levels/finalboss/tpage-1418.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-545 -;; Source Path - levels/finalboss/tpage-545.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkecobomb-ag -;; Source Path - levels/finalboss/darkecobomb-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ecoclaw-ag -;; Source Path - levels/finalboss/ecoclaw-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - finalbosscam-ag -;; Source Path - levels/finalboss/finalbosscam-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - green-eco-lurker-ag -;; Source Path - levels/finalboss/green-eco-lurker-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - greenshot-ag -;; Source Path - levels/finalboss/greenshot-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jak-white-ag -;; Source Path - levels/finalboss/jak-white-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - light-eco-ag -;; Source Path - levels/finalboss/light-eco-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-finalboss-ag -;; Source Path - levels/finalboss/plat-eco-finalboss-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - power-left-ag -;; Source Path - levels/finalboss/power-left-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - power-right-ag -;; Source Path - levels/finalboss/power-right-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - powercellalt-ag -;; Source Path - levels/finalboss/powercellalt-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - redring-ag -;; Source Path - levels/finalboss/redring-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robotboss-ag -;; Source Path - levels/finalboss/robotboss-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robotboss-blueeco-ag -;; Source Path - levels/finalboss/robotboss-blueeco-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robotboss-cinematic-ag -;; Source Path - levels/finalboss/robotboss-cinematic-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robotboss-redeco-ag -;; Source Path - levels/finalboss/robotboss-redeco-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robotboss-yelloweco-ag -;; Source Path - levels/finalboss/robotboss-yelloweco-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - silodoor-ag -;; Source Path - levels/finalboss/silodoor-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-finalboss-ag -;; Source Path - levels/finalboss/water-anim-finalboss-ag.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - finalboss-vis -;; Source Path - levels/finalboss/finalboss-vis.gd -;; Containing DGOs - ['FIN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - evilbro ;; Source Path - levels/intro/evilbro.gc @@ -27504,69 +25934,6 @@ (define-extern *evilbro-intro-sg* skeleton-group) -;; ---------------------- -;; File - tpage-1455 -;; Source Path - levels/intro/tpage-1455.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1457 -;; Source Path - levels/intro/tpage-1457.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1456 -;; Source Path - levels/intro/tpage-1456.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1454 -;; Source Path - levels/intro/tpage-1454.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilbro-ag -;; Source Path - levels/intro/evilbro-ag.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilsis-ag -;; Source Path - levels/intro/evilsis-ag.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - intro-vis -;; Source Path - levels/intro/intro-vis.gd -;; Containing DGOs - ['INT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - jungleb-obs ;; Source Path - levels/jungleb/jungleb-obs.gc @@ -27584,6 +25951,9 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + (eggtop-close symbol) + eggtop-idle) ) (deftype jng-iris-door (eco-door) @@ -27598,8 +25968,6 @@ (define-extern *jng-iris-door-sg* skeleton-group) (define-extern *eggtop-sg* skeleton-group) -(define-extern eggtop-close (state symbol eggtop)) -(define-extern eggtop-idle (state eggtop)) ;; ---------------------- @@ -27626,21 +25994,13 @@ :size-assert #x100 :heap-base #x90 :flag-assert #x1400900100 + (:states + plat-flip-idle) ) ;; - Unknowns (define-extern *plat-flip-sg* skeleton-group) -(define-extern plat-flip-idle (state plat-flip)) ;; unknown type - - -;; ---------------------- -;; File - plant-boss-main+0-ag -;; Source Path - levels/jungleb/plant-boss-main+0-ag.gd -;; Containing DGOs - ['JUB', 'L1'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -27788,159 +26148,6 @@ (define-extern *plant-boss-arm-sg* skeleton-group) -;; ---------------------- -;; File - tpage-485 -;; Source Path - levels/jungleb/tpage-485.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-510 -;; Source Path - levels/jungleb/tpage-510.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-507 -;; Source Path - levels/jungleb/tpage-507.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-966 -;; Source Path - levels/jungleb/tpage-966.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - aphid-lurker-ag -;; Source Path - levels/jungleb/aphid-lurker-ag.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkvine-ag-JUB -;; Source Path - levels/jungleb/darkvine-ag-JUB.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkvine-ag-JUN -;; Source Path - levels/jungle/darkvine-ag-JUN.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eggtop-ag -;; Source Path - levels/jungleb/eggtop-ag.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jng-iris-door-ag-JUB -;; Source Path - levels/jungleb/jng-iris-door-ag-JUB.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jng-iris-door-ag-TRA -;; Source Path - levels/training/jng-iris-door-ag-TRA.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plant-boss-ag -;; Source Path - levels/jungleb/plant-boss-ag.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-flip-ag -;; Source Path - levels/jungleb/plat-flip-ag.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-jungleb-ag -;; Source Path - levels/jungleb/plat-jungleb-ag.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jungleb-vis -;; Source Path - levels/jungleb/jungleb-vis.gd -;; Containing DGOs - ['JUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-fish+0-ag-JUN -;; Source Path - levels/jungle/eichar-fish+0-ag-JUN.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-fish+0-ag-JUNGLE -;; Source Path - levels/l1_only/eichar-fish+0-ag-JUNGLE.gd -;; Containing DGOs - ['JUNGLE'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-fish+0-ag-L1 -;; Source Path - levels/l1_only/eichar-fish+0-ag-L1.gd -;; Containing DGOs - ['L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - jungle-elevator ;; Source Path - levels/jungle/jungle-elevator.gc @@ -27977,15 +26184,15 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 - ;; inherited inspect of process-drawable + (:states + bouncer-wait + bouncer-fire + bouncer-smush) ) ;; - Unknowns (define-extern *bouncer-sg* skeleton-group) -(define-extern bouncer-wait (state springbox)) ;; unknown type -(define-extern bouncer-fire (state springbox)) ;; unknown type -(define-extern bouncer-smush (state springbox)) ;; unknown type ;; ---------------------- @@ -28115,6 +26322,10 @@ :size-assert #xd4 :heap-base #x70 :flag-assert #x14007000d4 + (:states + (darkvine-die symbol) + darkvine-idle + darkvine-retreat) ) ;; - Functions @@ -28124,9 +26335,6 @@ ;; - Unknowns (define-extern *darkvine-sg* skeleton-group) -(define-extern darkvine-die (state symbol darkvine)) ;; unknown type -(define-extern darkvine-idle (state darkvine)) ;; unknown type -(define-extern darkvine-retreat (state darkvine)) ;; unknown type ;; ---------------------- @@ -28162,6 +26370,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + towertop-idle) ) (deftype lurkerm-tall-sail (process-drawable) @@ -28173,6 +26383,8 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 + (:states + lurkerm-tall-sail-idle) ) (deftype lurkerm-short-sail (process-drawable) @@ -28184,6 +26396,8 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 + (:states + lurkerm-short-sail-idle) ) (deftype lurkerm-piston (process-drawable) @@ -28198,6 +26412,8 @@ :size-assert #xe8 :heap-base #x80 :flag-assert #x14008000e8 + (:states + lurkerm-piston-idle) ) (deftype accordian (process-drawable) @@ -28208,6 +26424,8 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 + (:states + accordian-idle) ) (deftype junglecam (process-hidden) @@ -28236,6 +26454,10 @@ :size-assert #x110 :heap-base #xa0 :flag-assert #x1400a00110 + (:states + (precurbridge-active symbol) + precurbridge-idle + precurbridge-activate) ) (deftype maindoor (process-drawable) @@ -28246,6 +26468,9 @@ :size-assert #xc0 :heap-base #x50 :flag-assert #x14005000c0 + (:states + (maindoor-open symbol) + (maindoor-closed symbol)) ) (deftype sidedoor (eco-door) @@ -28266,6 +26491,8 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + jngpusher-idle) ) (deftype jungle-water (water-anim) @@ -28280,26 +26507,15 @@ (define-extern ripple-for-jungle-water ripple-wave-set) ;; unknown type (define-extern *jngpusher-sg* skeleton-group) -(define-extern jngpusher-idle (state jngpusher)) ;; unknown type (define-extern *sidedoor-sg* skeleton-group) (define-extern *maindoor-sg* skeleton-group) -(define-extern maindoor-open (state symbol maindoor)) ;; unknown type -(define-extern maindoor-closed (state symbol maindoor)) ;; unknown type (define-extern *precurbridge-sg* skeleton-group) -(define-extern precurbridge-active (state symbol precurbridge)) ;; unknown type -(define-extern precurbridge-idle (state precurbridge)) ;; unknown type (define-extern *junglecam-sg* skeleton-group) -(define-extern precurbridge-activate (state precurbridge)) ;; unknown type (define-extern *accordian-sg* skeleton-group) -(define-extern accordian-idle (state accordian)) ;; unknown type (define-extern *lurkerm-piston-sg* skeleton-group) -(define-extern lurkerm-piston-idle (state lurkerm-piston)) ;; unknown type (define-extern *lurkerm-short-sail-sg* skeleton-group) -(define-extern lurkerm-short-sail-idle (state lurkerm-short-sail)) ;; unknown type (define-extern *lurkerm-tall-sail-sg* skeleton-group) -(define-extern lurkerm-tall-sail-idle (state lurkerm-tall-sail)) ;; unknown type (define-extern *towertop-sg* skeleton-group) -(define-extern towertop-idle (state towertop)) ;; unknown type (define-extern *logtrap-sg* skeleton-group) (define-extern *med-res-firecanyon-sg* skeleton-group) (define-extern *jungle-camera-sg* skeleton-group) @@ -28389,7 +26605,7 @@ :heap-base #x50 :flag-assert #x14005000c0 (:states - (reflector-mirror-broken) + (reflector-mirror-broken symbol) (reflector-mirror-idle)) ) @@ -28418,7 +26634,6 @@ (define-extern *reflector-mirror-sg* skeleton-group) (define-extern *reflector-mirror-break-sg* skeleton-group) (define-extern *periscope-base-sg* skeleton-group) -(define-extern cam-periscope (state camera-slave)) ;; unknown type (define-extern *periscope-mirror-sg* skeleton-group) @@ -28509,6 +26724,9 @@ :size-assert #x260 :heap-base #x1f0 :flag-assert #x3501f00260 + (:states + fisher-playing + fisher-done) ) (deftype fisher-fish (process-drawable) @@ -28523,7 +26741,10 @@ :size-assert #xd4 :heap-base #x70 :flag-assert #x14007000d4 - ;; inherited inspect of process-drawable + (:states + fisher-fish-fall + fisher-fish-caught + fisher-fish-die) ) ;; - Functions @@ -28540,24 +26761,10 @@ (define-extern *fish-net-sg* skeleton-group) (define-extern *fisher-sg* skeleton-group) (define-extern *FISHER-bank* fisher-bank) ;; unknown type -(define-extern fisher-playing (state fisher)) ;; unknown type (define-extern *fisher-params* (array (inline-array fisher-params))) ;; unknown type -(define-extern fisher-done (state fisher)) ;; unknown type (define-extern *catch-fishc-sg* skeleton-group) (define-extern *catch-fishb-sg* skeleton-group) (define-extern *catch-fisha-sg* skeleton-group) -(define-extern fisher-fish-fall (state fisher-fish)) ;; unknown type -(define-extern fisher-fish-caught (state fisher-fish)) ;; unknown type -(define-extern fisher-fish-die (state fisher-fish)) ;; unknown type - - -;; ---------------------- -;; File - fisher-JUNGLE-L1 -;; Source Path - levels/jungle/fisher-JUNGLE-L1.gc -;; Containing DGOs - ['JUNGLE', 'L1'] -;; Version - 3 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -28597,347 +26804,15 @@ :size-assert #xc4 :heap-base #x60 :flag-assert #x14006000c4 + (:states + (launcherdoor-open symbol) +(launcherdoor-closed symbol)) ) ;; - Unknowns (define-extern *launcherdoor-maincave-sg* skeleton-group) (define-extern *launcherdoor-sg* skeleton-group) -(define-extern launcherdoor-open (state symbol launcherdoor)) ;; unknown type -(define-extern launcherdoor-closed (state symbol launcherdoor)) ;; unknown type - - -;; ---------------------- -;; File - tpage-385 -;; Source Path - levels/jungle/tpage-385.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-531 -;; Source Path - levels/jungle/tpage-531.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-386 -;; Source Path - levels/jungle/tpage-386.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-388 -;; Source Path - levels/jungle/tpage-388.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-765 -;; Source Path - levels/jungle/tpage-765.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - accordian-ag -;; Source Path - levels/jungle/accordian-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bounceytarp-ag -;; Source Path - levels/jungle/bounceytarp-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - catch-fisha-ag -;; Source Path - levels/jungle/catch-fisha-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - catch-fishb-ag -;; Source Path - levels/jungle/catch-fishb-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - catch-fishc-ag -;; Source Path - levels/jungle/catch-fishc-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fish-net-ag -;; Source Path - levels/jungle/fish-net-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fisher-ag -;; Source Path - levels/jungle/fisher-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - hopper-ag -;; Source Path - levels/jungle/hopper-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - junglecam-ag -;; Source Path - levels/jungle/junglecam-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - junglefish-ag -;; Source Path - levels/jungle/junglefish-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - junglesnake-ag -;; Source Path - levels/jungle/junglesnake-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - launcherdoor-ag-JUN -;; Source Path - levels/jungle/launcherdoor-ag-JUN.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - launcherdoor-ag-SUN -;; Source Path - levels/sunken/launcherdoor-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - logtrap-ag -;; Source Path - levels/jungle/logtrap-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lurkerm-piston-ag -;; Source Path - levels/jungle/lurkerm-piston-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lurkerm-tall-sail-ag -;; Source Path - levels/jungle/lurkerm-tall-sail-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - maindoor-ag -;; Source Path - levels/jungle/maindoor-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-firecanyon-ag -;; Source Path - levels/jungle/medres-firecanyon-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - periscope-ag -;; Source Path - levels/jungle/periscope-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-button-ag -;; Source Path - levels/jungle/plat-button-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-ag-JUN -;; Source Path - levels/jungle/plat-eco-ag-JUN.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-ag-MIS -;; Source Path - levels/misty/plat-eco-ag-MIS.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-ag-ROB -;; Source Path - levels/robocave/plat-eco-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-eco-ag-TRA -;; Source Path - levels/training/plat-eco-ag-TRA.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - precurbridge-ag -;; Source Path - levels/jungle/precurbridge-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - reflector-mirror-ag -;; Source Path - levels/jungle/reflector-mirror-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ropebridge-52-ag -;; Source Path - levels/jungle/ropebridge-52-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ropebridge-70-ag -;; Source Path - levels/jungle/ropebridge-70-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sidedoor-ag -;; Source Path - levels/jungle/sidedoor-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - towertop-ag -;; Source Path - levels/jungle/towertop-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-jungle-ag -;; Source Path - levels/jungle/water-anim-jungle-ag.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jungle-vis -;; Source Path - levels/jungle/jungle-vis.gd -;; Containing DGOs - ['JUN'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -29073,15 +26948,6 @@ (define-extern *balloon-sg* skeleton-group) -;; ---------------------- -;; File - target-racer-h-FIC-LAV-MIS-OGR-ROL -;; Source Path - levels/racer_common/target-racer-h-FIC-LAV-MIS-OGR-ROL.gc -;; Containing DGOs - ['FIC', 'LAV', 'MIS', 'OGR', 'ROL'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - racer-part ;; Source Path - levels/racer_common/racer-part.gc @@ -29191,20 +27057,10 @@ ;; - Unknowns -(define-extern target-racing-smack (state float symbol target)) ;; unknown type (define-extern *racer-mods* surface) ;; unknown type (define-extern *racer-air-mods* surface) ;; unknown type -;; ---------------------- -;; File - target-racer-FIC-LAV-MIS-OGR-ROL -;; Source Path - levels/racer_common/target-racer-FIC-LAV-MIS-OGR-ROL.gc -;; Containing DGOs - ['FIC', 'LAV', 'MIS', 'OGR', 'ROL'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - racer-states-L1-RACERP ;; Source Path - levels/l1_only/racer-states-L1-RACERP.gc @@ -29217,53 +27073,6 @@ ;; - Unknowns -(define-extern target-racing (state target)) -(define-extern target-racing-grab (state target)) -(define-extern target-racing-clone-anim (state handle target)) -(define-extern target-racing-get-off-hit-ground (state symbol target)) -(define-extern target-racing-get-off-jump (state handle target)) -(define-extern target-racing-jump (state float float symbol target)) -(define-extern target-racing-bounce (state float float symbol target)) -(define-extern target-racing-falling (state target)) -(define-extern target-racing-get-on (state handle target)) -(define-extern target-racing-get-off (state handle target)) -(define-extern target-racing-hit (state handle attack-info target)) - - -;; ---------------------- -;; File - racer-states-FIC-LAV-MIS-OGR-ROL -;; Source Path - levels/racer_common/racer-states-FIC-LAV-MIS-OGR-ROL.gc -;; Containing DGOs - ['FIC', 'LAV', 'MIS', 'OGR', 'ROL'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - collide-reaction-racer -;; Source Path - levels/racer_common/collide-reaction-racer.gc -;; Containing DGOs - ['L1', 'FIC', 'LAV', 'MIS', 'OGR', 'RACERP', 'ROL'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-racer+0-ag -;; Source Path - levels/racer_common/eichar-racer+0-ag.gd -;; Containing DGOs - ['L1', 'FIC', 'LAV', 'MIS', 'OGR', 'RACERP', 'ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1119 -;; Source Path - levels/racer_common/tpage-1119.gd -;; Containing DGOs - ['L1', 'FIC', 'LAV', 'MIS', 'OGR', 'RACERP', 'ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -29280,6 +27089,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + blocking-plane-idle) ) ;; - Functions @@ -29289,16 +27100,6 @@ ;; - Unknowns (define-extern *ef-plane-sg* skeleton-group) -(define-extern blocking-plane-idle (state blocking-plane)) - - -;; ---------------------- -;; File - flut-part -;; Source Path - levels/flut_common/flut-part.gc -;; Containing DGOs - ['L1', 'SNO', 'SWA'] -;; Version - 3 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -29389,38 +27190,12 @@ ;; - Unknowns -(define-extern target-flut-stance (state target)) ;; unknown type -(define-extern target-flut-grab (state target)) ;; unknown type -(define-extern target-flut-clone-anim (state handle target)) ;; unknown type -(define-extern target-flut-get-off-hit-ground (state symbol target)) ;; unknown type -(define-extern target-flut-get-off-jump (state handle target)) ;; unknown type -(define-extern target-flut-death (state symbol target)) ;; unknown type -(define-extern target-flut-hit-ground (state target)) ;; unknown type (define-extern *flut-air-attack-mods* surface) ;; unknown type -(define-extern target-flut-air-attack-hit-ground (state target)) ;; unknown type -(define-extern target-flut-jump (state float float target)) ;; unknown type (define-extern *FLUT-bank* flut-bank) ;; unknown type -(define-extern target-flut-falling (state target)) ;; unknown type (define-extern *flut-run-attack-mods* surface) ;; unknown type -(define-extern target-flut-hit (state symbol attack-info target)) ;; unknown type (define-extern *flut-jump-mods* surface) ;; unknown type -(define-extern target-flut-walk (state target)) ;; unknown type (define-extern *flut-walk-mods* surface) ;; unknown type -(define-extern target-flut-air-attack (state float target)) ;; unknown type (define-extern *flut-double-jump-mods* surface) ;; unknown type -(define-extern target-flut-double-jump (state float float target)) ;; unknown type -(define-extern target-flut-running-attack (state target)) ;; unknown type -(define-extern target-flut-get-on (state handle target)) ;; unknown type -(define-extern target-flut-get-off (state handle target)) ;; unknown type - - -;; ---------------------- -;; File - eichar-flut+0-ag -;; Source Path - levels/flut_common/eichar-flut+0-ag.gd -;; Containing DGOs - ['L1', 'SNO', 'SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! ;; ---------------------- @@ -29579,7 +27354,15 @@ :size-assert #x120 :heap-base #xb0 :flag-assert #x1400b00120 - ;; inherited inspect of process-drawable + (:states + yakow-graze + yakow-idle + yakow-run-away + yakow-graze-kicked + (yakow-walk-to vector) + yakow-notice + yakow-kicked + yakow-die) ) ;; - Functions @@ -29601,15 +27384,7 @@ (define-extern *YAKOW-bank* yakow-bank) (define-extern *yakow-sg* skeleton-group) -(define-extern yakow-graze (state yakow)) -(define-extern yakow-idle (state yakow)) -(define-extern yakow-run-away (state yakow)) -(define-extern yakow-graze-kicked (state yakow)) -(define-extern yakow-walk-to (state vector yakow)) -(define-extern yakow-notice (state yakow)) -(define-extern yakow-kicked (state yakow)) (define-extern *village1cam-sg* skeleton-group) -(define-extern yakow-die (state yakow)) ;; ---------------------- @@ -29632,6 +27407,8 @@ :size-assert #xe8 :heap-base #x80 :flag-assert #x14008000e8 + (:states + windmill-sail-idle) ) (deftype sagesail (process-drawable) @@ -29644,6 +27421,8 @@ :size-assert #xe0 :heap-base #x70 :flag-assert #x14007000e0 + (:states + sagesail-idle) ) (deftype windspinner (process-drawable) @@ -29656,6 +27435,8 @@ :size-assert #xd8 :heap-base #x70 :flag-assert #x14007000d8 + (:states + windspinner-idle) ) (deftype mayorgears (process-drawable) @@ -29665,6 +27446,8 @@ :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 + (:states + mayorgears-idle) ) (deftype reflector-middle (process-drawable) @@ -29675,6 +27458,8 @@ :size-assert #xd0 :heap-base #x60 :flag-assert #x14006000d0 + (:states + reflector-middle-idle) ) (deftype reflector-end (process-drawable) @@ -29683,6 +27468,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + reflector-end-idle) ) (deftype villa-starfish (process-drawable) @@ -29692,6 +27479,8 @@ :size-assert #xb1 :heap-base #x50 :flag-assert #x14005000b1 + (:states + villa-starfish-idle) ) (deftype starfish (nav-enemy) @@ -29700,6 +27489,9 @@ :size-assert #x190 :heap-base #x120 :flag-assert #x4c01200190 + (:states + starfish-idle + starfish-patrol) ) (deftype village-fish (process-drawable) @@ -29709,6 +27501,8 @@ :size-assert #xb1 :heap-base #x50 :flag-assert #x14005000b1 + (:states + village-fish-idle) ) (deftype villa-fisha (village-fish) @@ -29745,6 +27539,8 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + hutlamp-idle) ) (deftype revcycleprop (process-drawable) @@ -29791,24 +27587,13 @@ (define-extern *revcycle-sg* skeleton-group) (define-extern *revcycleprop-sg* skeleton-group) (define-extern *hutlamp-sg* skeleton-group) -(define-extern hutlamp-idle (state hutlamp)) ;; unknown type -(define-extern village-fish-idle (state village-fish)) ;; unknown type -(define-extern villa-starfish-idle (state villa-starfish)) ;; unknown type -(define-extern starfish-idle (state starfish)) ;; unknown type (define-extern *starfish-sg* skeleton-group) (define-extern *starfish-nav-enemy-info* nav-enemy-info) -(define-extern starfish-patrol (state starfish)) ;; unknown type -(define-extern reflector-end-idle (state reflector-end)) ;; unknown type (define-extern *reflector-middle-sg* skeleton-group) -(define-extern reflector-middle-idle (state reflector-middle)) ;; unknown type (define-extern *mayorgears-sg* skeleton-group) -(define-extern mayorgears-idle (state mayorgears)) ;; unknown type (define-extern *windspinner-sg* skeleton-group) -(define-extern windspinner-idle (state windspinner)) ;; unknown type (define-extern *sagesail-sg* skeleton-group) -(define-extern sagesail-idle (state sagesail)) ;; unknown type (define-extern *windmill-sail-sg* skeleton-group) -(define-extern windmill-sail-idle (state windmill-sail)) ;; unknown type (define-extern *med-res-jungle-sg* skeleton-group) (define-extern *med-res-jungle1-sg* skeleton-group) (define-extern *med-res-jungle2-sg* skeleton-group) @@ -29823,15 +27608,6 @@ (define-extern *med-res-training-sg* skeleton-group) -;; ---------------------- -;; File - village-obs-VI1 -;; Source Path - levels/village1/village-obs-VI1.gc -;; Containing DGOs - ['VI1'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - fishermans-boat ;; Source Path - levels/village1/fishermans-boat.gc @@ -29931,6 +27707,17 @@ :size-assert #x520 :heap-base #x4b0 :flag-assert #x2304b00520 + (:states + fishermans-boat-docked-village + fishermans-boat-docked-misty + fishermans-boat-player-control + fishermans-boat-entering-village + fishermans-boat-entering-misty + fishermans-boat-ride-to-village1 + fishermans-boat-ride-to-misty + fishermans-boat-leaving-village + fishermans-boat-leaving-misty + fishermans-boat-measurements) ) ;; - Functions @@ -29949,22 +27736,12 @@ ;; - Unknowns -(define-extern fishermans-boat-docked-village (state fishermans-boat)) ;; unknown type (define-extern *fb-evilbro-sg* skeleton-group) (define-extern *fb-evilsis-sg* skeleton-group) -(define-extern fishermans-boat-docked-misty (state fishermans-boat)) ;; unknown type (define-extern *fishermans-boat-sg* skeleton-group) (define-extern *boat-turning-radius-table* (pointer float)) ;; unknown type (define-extern *boat-throttle-control-table* (pointer float)) ;; unknown type (define-extern *fishermans-boat-constants* rigid-body-platform-constants) ;; unknown type -(define-extern fishermans-boat-player-control (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-entering-village (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-entering-misty (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-ride-to-village1 (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-ride-to-misty (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-leaving-village (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-leaving-misty (state fishermans-boat)) ;; unknown type -(define-extern fishermans-boat-measurements (state fishermans-boat)) ;; unknown type ;; ---------------------- @@ -30305,6 +28082,10 @@ :heap-base #x50 :size-assert #xc0 :flag-assert #x14005000c0 + (:states + (silostep-rise symbol) + silostep-idle + silostep-camera) ) (deftype rounddoor (eco-door) @@ -30323,9 +28104,6 @@ (define-extern *rounddoor-sg* skeleton-group) (define-extern *silostep-sg* skeleton-group) -(define-extern silostep-rise (state symbol silostep)) -(define-extern silostep-idle (state silostep)) -(define-extern silostep-camera (state silostep)) ;; ---------------------- @@ -30344,6 +28122,8 @@ :size-assert #xd0 :heap-base #x60 :flag-assert #x14006000d0 + (:states + keg-conveyor-idle) ) (deftype keg-conveyor-paddle (process-drawable) @@ -30355,6 +28135,8 @@ :size-assert #xbc :heap-base #x50 :flag-assert #x14005000bc + (:states + keg-conveyor-paddle-idle) ) (deftype keg (process-drawable) @@ -30370,6 +28152,12 @@ :size-assert #x104 :heap-base #xa0 :flag-assert #x1400a00104 + (:states + keg-on-paddle + keg-die + keg-in-chute + keg-on-path + keg-paddle-to-path) ) ;; - Functions @@ -30386,16 +28174,9 @@ ;; - Unknowns (define-extern *keg-conveyor-sg* skeleton-group) -(define-extern keg-conveyor-idle (state keg-conveyor)) ;; unknown type (define-extern *keg-conveyor-paddle-sg* skeleton-group) -(define-extern keg-conveyor-paddle-idle (state keg-conveyor-paddle)) ;; unknown type (define-extern *keg-conveyor-keg-spawn-table* (array int8)) ;; unknown type (define-extern *keg-sg* skeleton-group) -(define-extern keg-on-paddle (state keg)) ;; unknown type -(define-extern keg-die (state keg)) ;; unknown type -(define-extern keg-in-chute (state keg)) ;; unknown type -(define-extern keg-on-path (state keg)) ;; unknown type -(define-extern keg-paddle-to-path (state keg)) ;; unknown type ;; ---------------------- @@ -30445,6 +28226,10 @@ :size-assert #x200 :heap-base #x190 :flag-assert #x4c01900200 + (:states + muse-idle + muse-caught + ) ) (deftype point-on-path-segment-info (structure) @@ -30471,8 +28256,6 @@ (define-extern *muse-sg* skeleton-group) (define-extern *muse-nav-enemy-info* nav-enemy-info) -(define-extern muse-idle (state muse)) ;; unknown type -(define-extern muse-caught (state muse)) ;; unknown type ;; ---------------------- @@ -30490,6 +28273,8 @@ :size-assert #x198 :heap-base #x130 :flag-assert #x4c01300198 + (:states + bonelurker-stun) ) ;; - Functions @@ -30503,7 +28288,6 @@ (define-extern *bonelurker-sg* skeleton-group) (define-extern *bonelurker-nav-enemy-info* nav-enemy-info) -(define-extern bonelurker-stun (state bonelurker)) ;; unknown type ;; ---------------------- @@ -30523,6 +28307,7 @@ :flag-assert #x14004000b0 (:states quicksandlurker-missile-impact + quicksandlurker-missile-idle ) ) @@ -30556,6 +28341,8 @@ quicksandlurker-track quicksandlurker-attack quicksandlurker-popup + quicksandlurker-idle + quicksandlurker-yawn ) ) @@ -30575,9 +28362,6 @@ ;; - Unknowns (define-extern *quicksandlurker-sg* skeleton-group) -(define-extern quicksandlurker-idle (state quicksandlurker)) ;; unknown type -(define-extern quicksandlurker-missile-idle (state quicksandlurker-missile)) ;; unknown type -(define-extern quicksandlurker-yawn (state quicksandlurker)) ;; unknown type ;; ---------------------- @@ -30597,6 +28381,10 @@ :heap-base #x50 :size-assert #xbc :flag-assert #x14005000bc + (:states + teetertotter-idle + teetertotter-launch + teetertotter-bend) ) ;; - Functions @@ -30606,9 +28394,6 @@ ;; - Unknowns (define-extern *teetertotter-sg* skeleton-group) -(define-extern teetertotter-idle (state teetertotter)) -(define-extern teetertotter-launch (state teetertotter)) -(define-extern teetertotter-bend (state teetertotter)) ;; ---------------------- @@ -30639,8 +28424,9 @@ (deftype balloonlurker (rigid-body-platform) ((explosion-force-position vector :inline :offset-assert 736) (explosion-force vector :inline :offset-assert 752) - (explosion basic :offset-assert 768) ;; ?? + (explosion symbol :offset-assert 768) (explosion-joint-index uint16 2 :offset-assert 772) + (explosion-joint-index-bytes int8 4 :offset 772) ;; added overlay (vulnerable symbol :offset-assert 776) (water-y float :offset-assert 780) (propeller joint-mod-set-local :offset-assert 784) @@ -30664,6 +28450,10 @@ :size-assert #x369 :heap-base #x300 :flag-assert #x2303000369 + (:states + balloonlurker-patrol + balloonlurker-die + (balloonlurker-mine-explode int)) ) (deftype balloonlurker-pilot (process-drawable) @@ -30677,6 +28467,9 @@ (dummy-20 (_type_) none 20) (dummy-21 (_type_) none 21) ) + (:states + balloonlurker-pilot-idle + balloonlurker-pilot-die) ) ;; - Functions @@ -30693,16 +28486,11 @@ ;; - Unknowns -(define-extern balloonlurker-patrol (state balloonlurker)) ;; unknown type (define-extern *balloonlurker-sg* skeleton-group) (define-extern *balloonlurker-constants* rigid-body-platform-constants) ;; unknown type -(define-extern balloonlurker-pilot-idle (state balloonlurker-pilot)) ;; unknown type (define-extern *balloonlurker-pilot-sg* skeleton-group) -(define-extern balloonlurker-pilot-die (state balloonlurker-pilot)) ;; unknown type (define-extern *BALLOONLURKER-bank* balloonlurker-bank) ;; unknown type -(define-extern balloonlurker-die (state balloonlurker)) ;; unknown type (define-extern *balloonlurker-rudder-joint-home* vector) ;; unknown type -(define-extern balloonlurker-mine-explode (state int balloonlurker)) ;; unknown type ;; ---------------------- @@ -30873,6 +28661,9 @@ :heap-base #x290 :size-assert #x2f2 :flag-assert #x23029002f2 + (:states + pontoon-die + pontoon-hidden) ) (deftype pontoonfive (pontoon) @@ -30898,6 +28689,9 @@ :size-assert #xb1 :heap-base #x50 :flag-assert #x14005000b1 + (:states + allpontoons-idle + (allpontoons-be-clone handle)) ) (deftype fireboulder (process-drawable) @@ -30909,6 +28703,10 @@ :size-assert #xb9 :heap-base #x50 :flag-assert #x14005000b9 + (:states + fireboulder-idle + fireboulder-hover + (fireboulder-be-clone handle)) ) (deftype ceilingflag (process-drawable) @@ -30917,6 +28715,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + ceilingflag-idle) ) (deftype exit-chamber-dummy (process-drawable) @@ -30930,6 +28730,9 @@ (:methods (skip-reminder? (_type_) symbol 20) ) + (:states + exit-chamber-dummy-wait-to-appear + exit-chamber-dummy-idle ) ) (deftype ogreboss-village2 (process-drawable) @@ -30939,6 +28742,9 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 + (:states + ogreboss-village2-idle + ogreboss-village2-throw) ) (deftype villageb-ogreboss (ogreboss-village2) @@ -30975,41 +28781,20 @@ (define-extern ripple-for-villageb-water ripple-wave-set) ;; unknown type (define-extern *ogreboss-village2-sg* skeleton-group) -(define-extern ogreboss-village2-idle (state ogreboss-village2)) ;; unknown type -(define-extern ogreboss-village2-throw (state ogreboss-village2)) ;; unknown type (define-extern *fireboulder-sg* skeleton-group) (define-extern *exit-chamber-dummy-sg* skeleton-group) -(define-extern exit-chamber-dummy-wait-to-appear (state exit-chamber-dummy)) ;; unknown type -(define-extern exit-chamber-dummy-idle (state exit-chamber-dummy)) ;; unknown type (define-extern *ceilingflag-sg* skeleton-group) -(define-extern ceilingflag-idle (state ceilingflag)) ;; unknown type -(define-extern fireboulder-idle (state fireboulder)) ;; unknown type -(define-extern fireboulder-hover (state fireboulder)) ;; unknown type -(define-extern fireboulder-be-clone (state handle fireboulder)) ;; unknown type (define-extern *allpontoons-sg* skeleton-group) -(define-extern allpontoons-idle (state allpontoons)) ;; unknown type -(define-extern allpontoons-be-clone (state handle allpontoons)) ;; unknown type (define-extern *pontoonten-sg* skeleton-group) (define-extern *pontoonten-constants* rigid-body-platform-constants) ;; unknown type (define-extern *pontoonfive-sg* skeleton-group) (define-extern *pontoonfive-constants* rigid-body-platform-constants) ;; unknown type -(define-extern pontoon-die (state pontoon)) ;; unknown type -(define-extern pontoon-hidden (state pontoon)) ;; unknown type (define-extern *village2cam-sg* skeleton-group) (define-extern *med-res-rolling-sg* skeleton-group) (define-extern *med-res-rolling1-sg* skeleton-group) (define-extern *med-res-village2-sg* skeleton-group) -;; ---------------------- -;; File - village2-part2 -;; Source Path - levels/village2/village2-part2.gc -;; Containing DGOs - ['L1', 'VI2'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - gambler ;; Source Path - levels/village2/gambler.gc @@ -31187,6 +28972,11 @@ :size-assert #xf4 :heap-base #x90 :flag-assert #x14009000f4 + (:states + swamp-tetherrock-die + swamp-tetherrock-hide + swamp-tetherrock-idle + swamp-tetherrock-break) ) (deftype precursor-arm (process-drawable) @@ -31204,6 +28994,10 @@ :size-assert #x114 :heap-base #xb0 :flag-assert #x1400b00114 + (:states + precursor-arm-idle + precursor-arm-die + precursor-arm-sink) ) (declare-type swamp-blimp process-drawable) @@ -31229,6 +29023,11 @@ (:methods (dummy-20 (_type_) basic 20) ;; ret - entity-actor | symbol ) + (:states + swamp-rope-idle-rock + swamp-rope-idle-arm + swamp-rope-break) + ) (deftype swamp-blimp (process-drawable) @@ -31254,6 +29053,9 @@ :size-assert #x260 :heap-base #x1f0 :flag-assert #x1401f00260 + (:states + swamp-blimp-idle + swamp-blimp-bye-bye) ) ;; - Functions @@ -31272,22 +29074,10 @@ ;; - Unknowns (define-extern *swamp-blimp-sg* skeleton-group) -(define-extern swamp-blimp-idle (state swamp-blimp)) ;; unknown type -(define-extern swamp-blimp-bye-bye (state swamp-blimp)) ;; unknown type (define-extern *SWAMP_BLIMP-bank* swamp-blimp-bank) ;; unknown type (define-extern *swamp-rope-sg* skeleton-group) -(define-extern swamp-rope-idle-rock (state swamp-rope)) ;; unknown type -(define-extern swamp-rope-idle-arm (state swamp-rope)) ;; unknown type -(define-extern swamp-rope-break (state swamp-rope)) ;; unknown type (define-extern *precursor-arm-sg* skeleton-group) -(define-extern precursor-arm-idle (state precursor-arm)) ;; unknown type -(define-extern precursor-arm-die (state precursor-arm)) ;; unknown type -(define-extern precursor-arm-sink (state precursor-arm)) ;; unknown type (define-extern *swamp-tetherrock-sg* skeleton-group) -(define-extern swamp-tetherrock-die (state swamp-tetherrock)) ;; unknown type -(define-extern swamp-tetherrock-hide (state swamp-tetherrock)) ;; unknown type -(define-extern swamp-tetherrock-idle (state swamp-tetherrock)) ;; unknown type -(define-extern swamp-tetherrock-break (state swamp-tetherrock)) ;; unknown type (define-extern *swamp-tetherrock-explode-sg* skeleton-group) @@ -31363,6 +29153,8 @@ :size-assert #x190 :heap-base #x120 :flag-assert #x3501200190 + (:states + just-particles) ) ;; - Functions @@ -31374,7 +29166,6 @@ ;; - Unknowns (define-extern *assistant-village2-sg* skeleton-group) -(define-extern just-particles (state assistant-levitator)) (define-extern *jaws-sg* skeleton-group) @@ -31423,6 +29214,8 @@ (:methods (init! (_type_) symbol 20) ) + (:states + swamp-spike-idle) ) (deftype swampgate (swamp-spike) @@ -31431,6 +29224,9 @@ :size-assert #xc0 :heap-base #x50 :flag-assert #x15005000c0 + (:states + swamp-spike-gate-down + swamp-spike-gate-up) ) (deftype balance-plat (process-drawable) @@ -31446,6 +29242,8 @@ :size-assert #xc8 :heap-base #x60 :flag-assert #x14006000c8 + (:states + balance-plat-idle) ) (deftype swamp-rock (process-drawable) @@ -31454,6 +29252,9 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + swamp-rock-idle + swamp-rock-break) ) (deftype tar-plat (rigid-body-platform) @@ -31502,13 +29303,7 @@ (define-extern *tar-plat-sg* skeleton-group) (define-extern *tar-plat-constants* rigid-body-platform-constants) ;; unknown type (define-extern *swamp-rock-sg* skeleton-group) -(define-extern swamp-rock-idle (state swamp-rock)) ;; unknown type -(define-extern swamp-rock-break (state swamp-rock)) ;; unknown type (define-extern *balance-plat-sg* skeleton-group) -(define-extern balance-plat-idle (state balance-plat)) ;; unknown type -(define-extern swamp-spike-gate-down (state swampgate)) ;; unknown type -(define-extern swamp-spike-gate-up (state swampgate)) ;; unknown type -(define-extern swamp-spike-idle (state swamp-spike)) ;; unknown type (define-extern *swamp-spike-sg* skeleton-group) @@ -31550,6 +29345,9 @@ :size-assert #x10b :heap-base #xa0 :flag-assert #x1400a0010b + (:states + swamp-bat-idle + swamp-bat-launch-slaves) ) (deftype swamp-bat-slave (process-drawable) @@ -31573,6 +29371,13 @@ (:methods (dummy-20 (_type_) float 20) ) + (:states + swamp-bat-slave-idle + swamp-bat-slave-return + swamp-bat-slave-strafe + swamp-bat-slave-swoop + (swamp-bat-slave-die handle) + swamp-bat-slave-launch) ) ;; - Functions @@ -31591,15 +29396,7 @@ ;; - Unknowns -(define-extern swamp-bat-idle (state swamp-bat)) ;; unknown type -(define-extern swamp-bat-launch-slaves (state swamp-bat)) ;; unknown type (define-extern *swamp-bat-slave-sg* skeleton-group) -(define-extern swamp-bat-slave-idle (state swamp-bat-slave)) ;; unknown type -(define-extern swamp-bat-slave-return (state swamp-bat-slave)) ;; unknown type -(define-extern swamp-bat-slave-strafe (state swamp-bat-slave)) ;; unknown type -(define-extern swamp-bat-slave-swoop (state swamp-bat-slave)) ;; unknown type -(define-extern swamp-bat-slave-die (state handle swamp-bat-slave)) ;; unknown type -(define-extern swamp-bat-slave-launch (state swamp-bat-slave)) ;; unknown type ;; ---------------------- @@ -31629,7 +29426,8 @@ :size-assert #x1f0 :heap-base #x180 :flag-assert #x4c018001f0 - ;; inherited inspect of nav-enemy + (:states + swamp-rat-spawn) ) ;; - Functions @@ -31642,7 +29440,6 @@ ;; - Unknowns -(define-extern swamp-rat-spawn (state swamp-rat)) ;; unknown type (define-extern *swamp-rat-sg* skeleton-group) (define-extern *swamp-rat-nav-enemy-info* nav-enemy-info) @@ -31674,6 +29471,12 @@ :size-assert #xd4 :heap-base #x70 :flag-assert #x14007000d4 + (:states + swamp-rat-nest-idle + swamp-rat-nest-active + swamp-rat-nest-gestate + swamp-rat-nest-die + swamp-rat-nest-victory) ) (deftype swamp-rat-nest-dummy (process-drawable) @@ -31693,6 +29496,11 @@ (dummy-20 (_type_) none 20) (dummy-21 (_type_) int 21) ) + (:states + swamp-rat-nest-dummy-idle + swamp-rat-nest-dummy-hit + swamp-rat-nest-dummy-die + swamp-rat-nest-dummy-shake) ) (deftype swamp-rat-nest-dummy-a (swamp-rat-nest-dummy) @@ -31722,7 +29530,7 @@ ;; - Functions (define-extern swamp-rat-nest-check-dummy (function none :behavior swamp-rat-nest)) -(define-extern swamp-rat-nest-spawn-rat (function (pointer process) :behavior swamp-rat-nest)) +(define-extern swamp-rat-nest-spawn-rat (function (pointer process) :behavior swamp-rat-nest)) ;; this needs a t2 symbol arg to pass to swamp-rat-init-from-other...but (define-extern swamp-rat-nest-dummy-init-by-other (function swamp-rat-nest-dummy none :behavior swamp-rat-nest-dummy)) (define-extern swamp-rat-nest-pick-spawn-joint (function int :behavior swamp-rat-nest)) (define-extern swamp-rat-nest-dummy-take-damage (function int int :behavior swamp-rat-nest-dummy)) @@ -31735,15 +29543,6 @@ (define-extern *swamp-rat-nest-dummy-c-sg* skeleton-group) (define-extern *swamp-rat-nest-dummy-b-sg* skeleton-group) (define-extern *swamp-rat-nest-dummy-a-sg* skeleton-group) -(define-extern swamp-rat-nest-idle (state swamp-rat-nest)) ;; unknown type -(define-extern swamp-rat-nest-active (state swamp-rat-nest)) ;; unknown type -(define-extern swamp-rat-nest-gestate (state swamp-rat-nest)) ;; unknown type -(define-extern swamp-rat-nest-die (state swamp-rat-nest)) ;; unknown type -(define-extern swamp-rat-nest-victory (state swamp-rat-nest)) ;; unknown type -(define-extern swamp-rat-nest-dummy-idle (state swamp-rat-nest-dummy)) ;; unknown type -(define-extern swamp-rat-nest-dummy-hit (state swamp-rat-nest-dummy)) ;; unknown type -(define-extern swamp-rat-nest-dummy-die (state swamp-rat-nest-dummy)) ;; unknown type -(define-extern swamp-rat-nest-dummy-shake (state swamp-rat-nest-dummy)) ;; unknown type ;; ---------------------- @@ -32211,18 +30010,19 @@ (dummy-20 (_type_) none 20) (dummy-21 (_type_) symbol 21) ) + (:states + dark-crystal-spawn-fuel-cell + dark-crystal-idle + dark-crystal-explode + dark-crystal-activate) ) ;; - Unknowns (define-extern *dark-crystal-sg* skeleton-group) -(define-extern dark-crystal-spawn-fuel-cell (state dark-crystal)) ;; unknown type -(define-extern dark-crystal-idle (state dark-crystal)) ;; unknown type (define-extern *dark-crystal-explode-sg* skeleton-group) (define-extern *dark-crystal-exploder-params* joint-exploder-static-params) ;; unknown type (define-extern *dark-crystal-flash-delays* (array int32)) ;; unknown type -(define-extern dark-crystal-explode (state dark-crystal)) ;; unknown type -(define-extern dark-crystal-activate (state dark-crystal)) ;; unknown type ;; ---------------------- @@ -32620,6 +30420,15 @@ (dummy-29 (_type_ int vector vector) float 29) (dummy-30 (_type_ process-drawable) uint 30) ) + (:states + gnawer-put-items-at-dest + gnawer-chewing-on-post + gnawer-give-fuel-cell + gnawer-dying-give-pickups + gnawer-wait-to-run + gnawer-die + gnawer-run + gnawer-retreat-into-post) ) ;; - Functions @@ -32630,15 +30439,7 @@ ;; - Unknowns (define-extern *gnawer-sg* skeleton-group) -(define-extern gnawer-put-items-at-dest (state gnawer)) ;; unknown type -(define-extern gnawer-chewing-on-post (state gnawer)) ;; unknown type (define-extern *gnawer-segment-infos* (inline-array gnawer-segment-info)) ;; unknown type -(define-extern gnawer-give-fuel-cell (state gnawer)) ;; unknown type -(define-extern gnawer-dying-give-pickups (state gnawer)) ;; unknown type -(define-extern gnawer-wait-to-run (state gnawer)) ;; unknown type -(define-extern gnawer-die (state gnawer)) ;; unknown type -(define-extern gnawer-run (state gnawer)) ;; unknown type -(define-extern gnawer-retreat-into-post (state gnawer)) ;; unknown type (define-extern *gnawer-segment-sg* skeleton-group) @@ -32691,6 +30492,15 @@ (dummy-26 (_type_) symbol 26) (dummy-27 (_type_) object 27) ) + (:states + driller-lurker-idle-drilling + driller-lurker-patrol + (driller-lurker-chase symbol) + driller-lurker-jammed-standing + driller-lurker-attack + driller-lurker-patrol-pause + driller-lurker-die + driller-lurker-debug-play-anims) ) ;; - Functions @@ -32701,14 +30511,6 @@ (define-extern *driller-lurker-sg* skeleton-group) (define-extern *driller-lurker-shadow-control* shadow-control) ;; unknown type -(define-extern driller-lurker-idle-drilling (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-patrol (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-chase (state symbol driller-lurker)) ;; unknown type -(define-extern driller-lurker-jammed-standing (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-attack (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-patrol-pause (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-die (state driller-lurker)) ;; unknown type -(define-extern driller-lurker-debug-play-anims (state driller-lurker)) ;; unknown type ;; ---------------------- @@ -32728,42 +30530,6 @@ ) -;; ---------------------- -;; File - sunken-part2 -;; Source Path - levels/sunken/sunken-part2.gc -;; Containing DGOs - ['L1', 'SUN', 'SUNKEN'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunken-part3 -;; Source Path - levels/sunken/sunken-part3.gc -;; Containing DGOs - ['L1', 'SUN', 'SUNKEN'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunken-part4 -;; Source Path - levels/sunken/sunken-part4.gc -;; Containing DGOs - ['L1', 'SUN', 'SUNKEN'] -;; Version - 3 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunken-part5 -;; Source Path - levels/sunken/sunken-part5.gc -;; Containing DGOs - ['L1', 'SUN', 'SUNKEN'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - target-tube ;; Source Path - levels/sunken/target-tube.gc @@ -32803,7 +30569,7 @@ ) (deftype slide-control (process-drawable) - ((target uint64 :offset-assert 176) + ((target handle :offset-assert 176) (pos float :offset-assert 184) (trans vector :inline :offset-assert 192) (rot vector :inline :offset-assert 208) @@ -32821,8 +30587,8 @@ ;; - Functions -(define-extern find-target-point function) -(define-extern distance-from-tangent function) +(define-extern find-target-point (function vector float :behavior slide-control)) +(define-extern distance-from-tangent (function path-control float vector vector vector vector float)) (define-extern target-tube-post (function none :behavior target)) (define-extern target-tube-turn-anim (function none :behavior target)) (define-extern tube-thrust (function float float none :behavior target)) @@ -32830,35 +30596,13 @@ ;; - Unknowns -(define-extern target-tube (state target)) ;; unknown type -(define-extern target-tube-death (state target)) ;; unknown type (define-extern *tube-jump-mods* surface) ;; unknown type -(define-extern target-tube-jump (state target)) ;; unknown type (define-extern *tube-mods* surface) ;; unknown type (define-extern *tube-surface* surface) ;; unknown type -(define-extern target-tube-hit (state target)) ;; unknown type (define-extern *tube-hit-mods* surface) ;; unknown type (define-extern *TUBE-bank* tube-bank) ;; unknown type -;; ---------------------- -;; File - eichar-tube+0-ag-L1-SUNKEN -;; Source Path - levels/l1_only/eichar-tube+0-ag-L1-SUNKEN.gd -;; Containing DGOs - ['L1', 'SUNKEN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-tube+0-ag-SUN -;; Source Path - levels/sunken/eichar-tube+0-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - sunken-obs ;; Source Path - levels/sunken/sunken-obs.gc @@ -32900,13 +30644,14 @@ :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 + (:states + seaweed-idle) ) ;; - Unknowns (define-extern *seaweed-sg* skeleton-group) (define-extern *seaweed* seaweed) ;; unknown type -(define-extern seaweed-idle (state seaweed)) ;; unknown type (define-extern *side-to-side-plat-sg* skeleton-group) (define-extern *sunkencam-sg* skeleton-group) @@ -32964,6 +30709,11 @@ (:methods (TODO-RENAME-27 (_type_ symbol) none 27) ) + (:states + square-platform-lowered + square-platform-rising + square-platform-lowering + square-platform-raised) ) (deftype square-platform-button (basebutton) @@ -32989,17 +30739,14 @@ :size-assert #x100 :heap-base #x90 :flag-assert #x1400900100 + (:states + square-platform-master-idle + square-platform-master-activate) ) ;; - Unknowns -(define-extern square-platform-master-idle (state square-platform-master)) ;; unknown type -(define-extern square-platform-master-activate (state square-platform-master)) ;; unknown type (define-extern *square-platform-sg* skeleton-group) -(define-extern square-platform-lowered (state square-platform)) ;; unknown type -(define-extern square-platform-rising (state square-platform)) ;; unknown type -(define-extern square-platform-lowering (state square-platform)) ;; unknown type -(define-extern square-platform-raised (state square-platform)) ;; unknown type ;; ---------------------- @@ -33067,6 +30814,8 @@ (:methods (dummy-20 (_type_ vector vector) none 20) ) + (:states + orbit-plat-bottom-idle) ) (deftype orbit-plat (baseplat) @@ -33086,6 +30835,13 @@ (dummy-27 (_type_) symbol 27) (dummy-28 (_type_) symbol 28) ) + (:states + orbit-plat-wait-for-other + orbit-plat-idle + orbit-plat-riding + orbit-plat-rotating + orbit-plat-still + orbit-plat-reset) ) ;; - Functions @@ -33097,14 +30853,7 @@ ;; - Unknowns (define-extern *orbit-plat-sg* skeleton-group) -(define-extern orbit-plat-wait-for-other (state orbit-plat)) ;; unknown type -(define-extern orbit-plat-idle (state orbit-plat)) ;; unknown type -(define-extern orbit-plat-riding (state orbit-plat)) ;; unknown type -(define-extern orbit-plat-rotating (state orbit-plat)) ;; unknown type -(define-extern orbit-plat-still (state orbit-plat)) ;; unknown type -(define-extern orbit-plat-reset (state orbit-plat)) ;; unknown type (define-extern *orbit-plat-bottom-sg* skeleton-group) -(define-extern orbit-plat-bottom-idle (state orbit-plat-bottom)) ;; unknown type ;; ---------------------- @@ -33125,6 +30874,8 @@ :size-assert #x8c :heap-base #x20 :flag-assert #xe0020008c + (:states + wedge-plat-master-idle) ) (deftype wedge-plat (baseplat) @@ -33139,6 +30890,9 @@ (:methods (dummy-27 (_type_) symbol 27) ) + (:states + wedge-plat-idle + wedge-plat-tip) ) (deftype wedge-plat-outer (wedge-plat) @@ -33147,16 +30901,14 @@ :size-assert #xf0 :heap-base #x80 :flag-assert #x1c008000f0 + (:states + wedge-plat-outer-idle + wedge-plat-outer-tip) ) ;; - Unknowns (define-extern *wedge-plat-sg* skeleton-group) -(define-extern wedge-plat-outer-idle (state wedge-plat-outer)) ;; unknown type -(define-extern wedge-plat-outer-tip (state wedge-plat-outer)) ;; unknown type -(define-extern wedge-plat-idle (state wedge-plat)) ;; unknown type -(define-extern wedge-plat-tip (state wedge-plat)) ;; unknown type -(define-extern wedge-plat-master-idle (state wedge-plat-master)) ;; unknown type (define-extern *wedge-plat-outer-sg* skeleton-group) @@ -33180,16 +30932,17 @@ :size-assert #xf0 :heap-base #x80 :flag-assert #x14008000f0 + (:states + wall-plat-sync-idle + wall-plat-retracted + wall-plat-retracting + wall-plat-extended + wall-plat-extending) ) ;; - Unknowns (define-extern *wall-plat-sg* skeleton-group) -(define-extern wall-plat-sync-idle (state wall-plat)) ;; unknown type -(define-extern wall-plat-retracted (state wall-plat)) ;; unknown type -(define-extern wall-plat-retracting (state wall-plat)) ;; unknown type -(define-extern wall-plat-extended (state wall-plat)) ;; unknown type -(define-extern wall-plat-extending (state wall-plat)) ;; unknown type ;; ---------------------- @@ -33219,6 +30972,10 @@ :size-assert #x300 :heap-base #x290 :flag-assert #x2302900300 + (:states + qbert-plat-wait-for-master + qbert-plat-on-mimic + qbert-plat-on-die) ) (deftype qbert-plat-master (process-drawable) @@ -33241,6 +30998,10 @@ (:methods (plat-state-set? (_type_ uint) symbol 20) ) + (:states + qbert-plat-master-wait-for-door + qbert-plat-master-idle + (qbert-plat-master-do-door symbol)) ) ;; - Functions @@ -33250,15 +31011,9 @@ ;; - Unknowns -(define-extern qbert-plat-master-wait-for-door (state qbert-plat-master)) ;; unknown type -(define-extern qbert-plat-master-idle (state qbert-plat-master)) ;; unknown type -(define-extern qbert-plat-master-do-door (state symbol qbert-plat-master)) ;; unknown type -(define-extern qbert-plat-wait-for-master (state qbert-plat)) ;; unknown type (define-extern *qbert-plat-sg* skeleton-group) (define-extern *qbert-plat-constants* rigid-body-platform-constants) ;; unknown type (define-extern *qbert-plat-on-sg* skeleton-group) -(define-extern qbert-plat-on-mimic (state qbert-plat)) ;; unknown type -(define-extern qbert-plat-on-die (state qbert-plat)) ;; unknown type ;; ---------------------- @@ -33844,6 +31599,11 @@ (dummy-30 (_type_) vector 30) (dummy-31 (_type_) vector 31) ) + (:states + puffer-idle + puffer-patrol + puffer-attack + puffer-die) ) (deftype pick-patrol-point-away-from-buddy-work (structure) @@ -33868,10 +31628,6 @@ (define-extern *puffer-sg* skeleton-group) (define-extern *puffer-mean-sg* skeleton-group) -(define-extern puffer-idle (state puffer)) ;; unknown type -(define-extern puffer-patrol (state puffer)) ;; unknown type -(define-extern puffer-attack (state puffer)) ;; unknown type -(define-extern puffer-die (state puffer)) ;; unknown type ;; ---------------------- @@ -33912,6 +31668,8 @@ (TODO-RENAME-26 (_type_) float 26) (TODO-RENAME-27 (_type_) float 27) ) + (:states + sunkenfisha-idle) ) ;; - Functions @@ -33920,7 +31678,6 @@ ;; - Unknowns -(define-extern sunkenfisha-idle (state sunkenfisha)) ;; unknown type (define-extern *sunkenfisha-red-yellow-sg* skeleton-group) (define-extern *sunkenfisha-yellow-blue-sg* skeleton-group) (define-extern *sunkenfisha-yellow-eye-sg* skeleton-group) @@ -34178,7 +31935,8 @@ :size-assert #x20c :heap-base #x1a0 :flag-assert #x4c01a0020c - ;; inherited inspect of nav-enemy + (:states + fleeing-nav-enemy-debug) ) (deftype lightning-mole (fleeing-nav-enemy) @@ -34189,6 +31947,14 @@ :size-assert #x224 :heap-base #x1c0 :flag-assert #x4c01c00224 + (:states + lightning-mole-gone + lightning-mole-hiding + lightning-mole-yelp + lightning-mole-head-for-hole + lightning-mole-dive + lightning-mole-debug-run + lightning-mole-debug-blend) ) (deftype peeper (process-drawable) @@ -34197,17 +31963,22 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + peeper-up + peeper-down + peeper-hide + peeper-wait) ) ;; - Functions (define-extern lightning-mole-task-complete? (function symbol :behavior lightning-mole)) (define-extern fleeing-nav-enemy-clip-travel (function fleeing-nav-enemy vector symbol)) -(define-extern fleeing-nav-enemy-adjust-travel (function fleeing-nav-enemy vector)) +(define-extern fleeing-nav-enemy-adjust-travel (function fleeing-nav-enemy object vector)) ;; unused second arg (define-extern fleeing-nav-enemy-chase-post-func (function float :behavior fleeing-nav-enemy)) (define-extern fleeing-nav-enemy-adjust-nav-info (function float :behavior fleeing-nav-enemy)) -(define-extern find-adjacent-bounds-one function) -(define-extern find-adjacent-bounds (function basic clip-travel-vector-to-mesh-return-info none)) +(define-extern find-adjacent-bounds-one (function nav-mesh nav-poly int (array int8) (array int8) vector symbol)) +(define-extern find-adjacent-bounds (function nav-mesh clip-travel-vector-to-mesh-return-info none)) (define-extern fleeing-nav-enemy-chase-post (function none :behavior fleeing-nav-enemy)) (define-extern lightning-mole-hole-post (function none :behavior lightning-mole)) (define-extern lightning-mole-run-code (function none :behavior lightning-mole)) @@ -34217,20 +31988,8 @@ ;; - Unknowns (define-extern *lightning-mole-sg* skeleton-group) -(define-extern peeper-up (state peeper)) ;; unknown type -(define-extern peeper-down (state peeper)) ;; unknown type -(define-extern peeper-hide (state peeper)) ;; unknown type -(define-extern peeper-wait (state peeper)) ;; unknown type (define-extern *lightning-mole-nav-enemy-info* nav-enemy-info) -(define-extern lightning-mole-gone (state lightning-mole)) ;; unknown type -(define-extern lightning-mole-hiding (state lightning-mole)) ;; unknown type -(define-extern lightning-mole-yelp (state lightning-mole)) ;; unknown type (define-extern *lightning-mole-hole* vector) ;; unknown type -(define-extern lightning-mole-head-for-hole (state lightning-mole)) ;; unknown type -(define-extern lightning-mole-dive (state lightning-mole)) ;; unknown type -(define-extern lightning-mole-debug-run (state lightning-mole)) ;; unknown type -(define-extern fleeing-nav-enemy-debug (state fleeing-nav-enemy)) ;; unknown type -(define-extern lightning-mole-debug-blend (state lightning-mole)) ;; unknown type ;; ---------------------- @@ -34288,7 +32047,6 @@ ;; - Unknowns (define-extern *robber-sg* skeleton-group) -(define-extern fuel-cell-spline-slider (state handle float float fuel-cell)) ;; unknown type ;; ---------------------- @@ -34346,6 +32104,9 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + balloon-idle + balloon-popping) ) (deftype spike (process-drawable) @@ -34356,6 +32117,10 @@ :size-assert #xb4 :heap-base #x50 :flag-assert #x14005000b4 + (:states + spike-down + spike-idle + spike-up) ) (deftype crate-darkeco-cluster (process-drawable) @@ -34374,11 +32139,6 @@ (define-extern *crate-darkeco-cluster-sg* skeleton-group) (define-extern *spike-sg* skeleton-group) -(define-extern spike-down (state spike)) ;; unknown type -(define-extern spike-idle (state spike)) ;; unknown type -(define-extern spike-up (state spike)) ;; unknown type -(define-extern balloon-idle (state balloon)) ;; unknown type -(define-extern balloon-popping (state balloon)) ;; unknown type ;; ---------------------- @@ -34407,27 +32167,37 @@ ;; - Types (deftype ogreboss-super-boulder (process-drawable) - ((root-override basic :score 100 :offset 112) + ((parent-override (pointer process-drawable) :score 100 :offset 12) + (root-override collide-shape-moving :score 100 :offset 112) (orig-pos vector :inline :offset-assert 176) (src-pos vector :inline :offset-assert 192) (spin-axis vector :inline :offset-assert 208) - (joint basic :offset-assert 224) + (joint joint-mod-blend-local :offset-assert 224) (speed float :offset-assert 228) (size float :offset-assert 232) (grow-rate float :offset-assert 236) - (lava basic :offset-assert 240) + (lava entity-actor :offset-assert 240) (sound-id sound-id :offset-assert 244) - (hit-boss basic :offset-assert 248) + (hit-boss symbol :offset-assert 248) (tumble-quat quaternion :inline :offset-assert 256) ) :method-count-assert 20 :heap-base #xa0 :size-assert #x110 :flag-assert #x1400a00110 + (:states + ogreboss-super-boulder-idle + ogreboss-super-boulder-roll + ogreboss-super-boulder-land + ogreboss-super-boulder-throw + ogreboss-super-boulder-hit + ogreboss-super-boulder-die + ogreboss-super-boulder-killed-player) ) (deftype ogreboss-bounce-boulder (process-drawable) - ((root-override basic :score 100 :offset 112) + ((parent-override (pointer ogreboss-super-boulder) :score 100 :offset 12) + (root-override collide-shape-moving :score 100 :offset 112) (src-pos vector :inline :offset-assert 176) (side-dir vector :inline :offset-assert 192) (side-pos float :offset-assert 208) @@ -34438,10 +32208,13 @@ :heap-base #x70 :size-assert #xd9 :flag-assert #x14007000d9 + (:states + ogreboss-bounce-boulder-idle) ) (deftype ogreboss-missile (process-drawable) - ((root-override basic :score 100 :offset 112) + ((parent-override (pointer process-drawable) :score 100 :offset 12) + (root-override collide-shape-moving :score 100 :offset 112) (trajectory trajectory :inline :offset-assert 176) (src-pos vector :inline :offset-assert 224) (dest-pos vector :inline :offset-assert 240) @@ -34454,6 +32227,10 @@ :heap-base #xc0 :size-assert #x128 :flag-assert #x1400c00128 + (:states + ogreboss-missile-idle + ogreboss-missile-impact + ogreboss-missile-seek) ) (deftype ogreboss-missile-init-data (structure) @@ -34470,19 +32247,21 @@ ) (deftype ogreboss (process-drawable) - ((root-override basic :score 100 :offset 112) + ((root-override collide-shape :score 100 :offset 112) (old-player-transform transformq :inline :offset-assert 176) (level float :offset-assert 224) (difficulty float :offset-assert 228) - (boulder int64 :offset-assert 232) - (column int64 :offset-assert 240) + (boulder handle :offset-assert 232) + (column handle :offset-assert 240) (z-plane vector :inline :offset-assert 256) (far-pos vector :inline :offset-assert 272) (near-pos vector :inline :offset-assert 288) (side-dir vector :inline :offset-assert 304) - (target-offset-array vector 3 :inline :offset-assert 320) ;; maybe not vectors - (target-actor-array basic 3 :offset-assert 368) - (target-blast-radius-array basic 3 :offset-assert 380) + (target-offset-array vector 3 :inline :offset-assert 320) + (target-offset-array-2 vector :inline :offset 336) ;; added because accessing doesn't work nicely otherwise TODO + (target-offset-array-3 vector :inline :offset 352) ;; added because accessing doesn't work nicely otherwise TODO + (target-actor-array entity-actor 3 :offset-assert 368) + (target-blast-radius-array float 3 :offset-assert 380) (shuffle-pos float :offset-assert 392) (target-count int8 :offset-assert 396) (hit-count int8 :offset-assert 397) @@ -34491,86 +32270,76 @@ (try-count uint8 :offset-assert 400) (hit-time int64 :offset-assert 408) (grow-time float :offset-assert 416) - (lava basic :offset-assert 420) - (vulnerable basic :offset-assert 424) - (bridge-assembled basic :offset-assert 428) - (at-near-spot basic :offset-assert 432) - (submerged basic :offset-assert 436) - (try-counted basic :offset-assert 440) + (lava entity-actor :offset-assert 420) + (vulnerable symbol :offset-assert 424) + (bridge-assembled symbol :offset-assert 428) + (at-near-spot symbol :offset-assert 432) + (submerged symbol :offset-assert 436) + (try-counted symbol :offset-assert 440) ) :method-count-assert 20 :heap-base #x150 :size-assert #x1bc :flag-assert #x14015001bc + (:states + ogreboss-dead + ogreboss-idle + ogreboss-die + ogreboss-stage1 + ogreboss-stage3-throw + ogreboss-stage3-shuffle + ogreboss-stage3-hit + ogreboss-stage2 + ogreboss-wait-for-player + ogreboss-intro) ) ;; - Functions -(define-extern ogreboss-get-targets function) -(define-extern ogreboss-reset-camera function) -(define-extern ogreboss-trigger-steps function) -(define-extern ogreboss-submerge function) -(define-extern ogreboss-post function) -(define-extern ogreboss-spawn-super-boulder function) -(define-extern ogreboss-update-shuffling function) -(define-extern ogreboss-player-inside-range? function) -(define-extern ogreboss-super-boulder-init-by-other function) -(define-extern ogreboss-set-stage2-camera function) -(define-extern ogreboss-move-far function) -(define-extern ogreboss-roll-boulder function) -(define-extern ogreboss-update-super-boulder function) -(define-extern ogreboss-blend-hit-anim function) -(define-extern ogreboss-bounce-boulder-init-by-other function) -(define-extern ogreboss-set-stage1-camera function) -(define-extern ogreboss-move-near function) -(define-extern ogreboss-shoot-boulder function) -(define-extern ogreboss-inc-try-count function) -(define-extern ogreboss-emerge function) -(define-extern ogreboss-pick-target function) -(define-extern ogreboss-missile-init-by-other function) -(define-extern ogreboss-idle-loop function) -(define-extern ogreboss-super-boulder-impact-effect function) -(define-extern ogreboss-super-boulder-play-hit-anim function) -(define-extern ogreboss-rock-explosion-effect function) -(define-extern ogreboss-missile-scale-explosion function) -(define-extern ogreboss-super-boulder-event-handler function) -(define-extern ogreboss-bounce-boulder-event-handler function) -(define-extern ogreboss-debug-adjust-difficulty function) -(define-extern ogreboss-attack-event-handler function) +(define-extern ogreboss-get-targets (function none :behavior ogreboss)) +(define-extern ogreboss-reset-camera (function none)) +(define-extern ogreboss-trigger-steps (function symbol :behavior ogreboss)) +(define-extern ogreboss-submerge (function int float none :behavior ogreboss)) +(define-extern ogreboss-post (function none :behavior ogreboss)) +(define-extern ogreboss-spawn-super-boulder (function none :behavior ogreboss)) +(define-extern ogreboss-update-shuffling (function none :behavior ogreboss)) +(define-extern ogreboss-player-inside-range? (function float symbol :behavior ogreboss)) +(define-extern ogreboss-super-boulder-init-by-other (function vector float entity none :behavior ogreboss-super-boulder)) +(define-extern ogreboss-set-stage2-camera (function none)) +(define-extern ogreboss-move-far (function int float none :behavior ogreboss)) +(define-extern ogreboss-roll-boulder (function none :behavior ogreboss)) +(define-extern ogreboss-update-super-boulder (function none :behavior ogreboss)) +(define-extern ogreboss-blend-hit-anim (function none :behavior ogreboss)) +(define-extern ogreboss-bounce-boulder-init-by-other (function int entity none :behavior ogreboss-bounce-boulder)) +(define-extern ogreboss-set-stage1-camera (function none)) +(define-extern ogreboss-move-near (function basic float none :behavior ogreboss)) +(define-extern ogreboss-shoot-boulder (function int none :behavior ogreboss)) +(define-extern ogreboss-inc-try-count (function none :behavior ogreboss)) +(define-extern ogreboss-emerge (function float none :behavior ogreboss)) +(define-extern ogreboss-pick-target (function int :behavior ogreboss)) +(define-extern ogreboss-missile-init-by-other (function ogreboss-missile-init-data entity none :behavior ogreboss-missile)) +(define-extern ogreboss-idle-loop (function none :behavior ogreboss)) +(define-extern ogreboss-super-boulder-impact-effect (function none :behavior ogreboss-super-boulder)) +(define-extern ogreboss-super-boulder-play-hit-anim (function object :behavior ogreboss-super-boulder)) +(define-extern ogreboss-rock-explosion-effect (function basic handle)) +(define-extern ogreboss-missile-scale-explosion (function handle none)) +(define-extern ogreboss-super-boulder-event-handler (function process int symbol event-message-block object :behavior ogreboss-super-boulder)) +(define-extern ogreboss-bounce-boulder-event-handler (function process int symbol event-message-block object :behavior ogreboss-bounce-boulder)) +(define-extern ogreboss-debug-adjust-difficulty (function none)) +(define-extern ogreboss-attack-event-handler (function process int symbol event-message-block object :behavior ogreboss)) ;; - Unknowns (define-extern *ogreboss-sg* skeleton-group) (define-extern *ogreboss* ogreboss) ;; unknown type -(define-extern ogreboss-dead (state ogreboss)) ;; unknown type -(define-extern ogreboss-idle (state ogreboss)) ;; unknown type -(define-extern ogreboss-die (state ogreboss)) ;; unknown type -(define-extern ogreboss-stage1 (state ogreboss)) ;; unknown type -(define-extern ogreboss-stage3-throw (state ogreboss)) ;; unknown type -(define-extern ogreboss-stage3-shuffle (state ogreboss)) ;; unknown type -(define-extern ogreboss-stage3-hit (state ogreboss)) ;; unknown type -(define-extern ogreboss-stage2 (state ogreboss)) ;; unknown type (define-extern *ogreboss-cam-sg* skeleton-group) -(define-extern ogreboss-wait-for-player (state ogreboss)) ;; unknown type -(define-extern ogreboss-intro (state ogreboss)) ;; unknown type (define-extern *ogreboss-column-sg* skeleton-group) (define-extern *ogreboss-bounce-boulder-sg* skeleton-group) -(define-extern ogreboss-bounce-boulder-idle (state ogreboss-bounce-boulder)) ;; unknown type (define-extern *ogreboss-super-boulder-sg* skeleton-group) -(define-extern ogreboss-super-boulder-idle (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-roll (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-land (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-throw (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-hit (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-die (state ogreboss-super-boulder)) ;; unknown type -(define-extern ogreboss-super-boulder-killed-player (state ogreboss-super-boulder)) ;; unknown type (define-extern *ogreboss-shoot-boulder-sg* skeleton-group) (define-extern *ogreboss-missile-shadow-control* shadow-control) ;; unknown type -(define-extern ogreboss-missile-idle (state ogreboss-missile)) ;; unknown type (define-extern *ogreboss-shoot-boulder-break-sg* skeleton-group) -(define-extern ogreboss-missile-impact (state ogreboss-missile)) ;; unknown type (define-extern *ogreboss-shadow-control* shadow-control) ;; unknown type -(define-extern ogreboss-missile-seek (state ogreboss-missile)) ;; unknown type ;; ---------------------- @@ -34688,6 +32457,11 @@ :size-assert #xd1 :heap-base #x70 :flag-assert #x14007000d1 + (:states + ogre-bridge-activated + ogre-bridge-idle + ogre-bridge-break + ogre-bridge-activate) ) (deftype ogre-bridgeend (process-drawable) @@ -34696,6 +32470,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + ogre-bridgeend-idle) ) (deftype ogre-lava (water-anim) @@ -34716,6 +32492,9 @@ :size-assert #xd1 :heap-base #x70 :flag-assert #x14007000d1 + (:states + shortcut-boulder-idle + shortcut-boulder-break) ) ;; - Functions @@ -34726,17 +32505,10 @@ (define-extern *shortcut-boulder-whole-sg* skeleton-group) (define-extern *shortcut-boulder-broken-sg* skeleton-group) -(define-extern shortcut-boulder-idle (state shortcut-boulder)) ;; unknown type -(define-extern shortcut-boulder-break (state shortcut-boulder)) ;; unknown type (define-extern ripple-for-ogre-lava ripple-wave-set) ;; unknown type (define-extern *ogre-bridgeend-sg* skeleton-group) -(define-extern ogre-bridgeend-idle (state ogre-bridgeend)) ;; unknown type (define-extern *ogre-bridge-sg* skeleton-group) (define-extern *ogre-bridge-joint-array* (array uint8)) ;; unknown type -(define-extern ogre-bridge-activated (state ogre-bridge)) ;; unknown type -(define-extern ogre-bridge-idle (state ogre-bridge)) ;; unknown type -(define-extern ogre-bridge-break (state ogre-bridge)) ;; unknown type -(define-extern ogre-bridge-activate (state ogre-bridge)) ;; unknown type (define-extern *ogre-isle-d-sg* skeleton-group) (define-extern *ogre-isle-b-sg* skeleton-group) (define-extern *ogre-isle-constants* rigid-body-platform-constants) ;; unknown type @@ -34766,6 +32538,11 @@ :size-assert #xb8 :heap-base #x50 :flag-assert #x14005000b8 + (:states + plunger-lurker-die + plunger-lurker-idle + plunger-lurker-flee + plunger-lurker-plunge) ) (deftype flying-lurker (process-drawable) @@ -34796,6 +32573,13 @@ (:methods (dummy-20 (_type_) none 20) ) + (:states + flying-lurker-die + flying-lurker-idle + flying-lurker-start + (flying-lurker-clone handle string) + flying-lurker-sleep + flying-lurker-fly) ) ;; - Functions @@ -34813,18 +32597,8 @@ ;; - Unknowns (define-extern *flying-lurker-sg* skeleton-group) -(define-extern flying-lurker-die (state flying-lurker)) -(define-extern flying-lurker-idle (state flying-lurker)) -(define-extern flying-lurker-start (state flying-lurker)) -(define-extern flying-lurker-clone (state handle string flying-lurker)) -(define-extern flying-lurker-sleep (state flying-lurker)) (define-extern *ogrecam-sg* skeleton-group) -(define-extern flying-lurker-fly (state flying-lurker)) (define-extern *plunger-lurker-sg* skeleton-group) -(define-extern plunger-lurker-die (state plunger-lurker)) -(define-extern plunger-lurker-idle (state plunger-lurker)) -(define-extern plunger-lurker-flee (state plunger-lurker)) -(define-extern plunger-lurker-plunge (state plunger-lurker)) ;; ---------------------- @@ -35116,15 +32890,16 @@ :size-assert #xd5 :heap-base #x70 :flag-assert #x14007000d5 + (:states + (spider-egg-idle symbol) + spider-egg-hatch + spider-egg-die) ) ;; - Unknowns (define-extern *spider-egg-unbroken-sg* skeleton-group) (define-extern *spider-egg-broken-sg* skeleton-group) -(define-extern spider-egg-idle (state symbol spider-egg)) ;; unknown type -(define-extern spider-egg-hatch (state spider-egg)) ;; unknown type -(define-extern spider-egg-die (state spider-egg)) ;; unknown type ;; ---------------------- @@ -35173,19 +32948,9 @@ ;; - Unknowns -(define-extern target-snowball (state target)) ;; unknown type (define-extern *SNOWBALL-bank* snowball-bank) -;; ---------------------- -;; File - target-ice -;; Source Path - levels/snow/target-ice.gc -;; Containing DGOs - ['L1', 'SNO'] -;; Version - 3 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - ice-cube ;; Source Path - levels/snow/ice-cube.gc @@ -35220,6 +32985,18 @@ (dummy-51 (_type_ vector vector) object :replace 51) (dummy-53 (_type_ vector vector) symbol :replace 53) ) + (:states + ice-cube-face-player + ice-cube-tired + ice-cube-retract-spikes + ice-cube-mean-charge-done + ice-cube-mean-turn-to-charge + ice-cube-become-mean + ice-cube-appear-land + ice-cube-appear + ice-cube-trying-to-appear + ice-cube-shatter + ice-cube-mean-charge) ) ;; - Functions @@ -35229,19 +33006,8 @@ ;; - Unknowns (define-extern *ice-cube-break-sg* skeleton-group) -(define-extern ice-cube-face-player (state ice-cube)) ;; unknown type -(define-extern ice-cube-tired (state ice-cube)) ;; unknown type -(define-extern ice-cube-retract-spikes (state ice-cube)) ;; unknown type -(define-extern ice-cube-mean-charge-done (state ice-cube)) ;; unknown type -(define-extern ice-cube-mean-turn-to-charge (state ice-cube)) ;; unknown type -(define-extern ice-cube-become-mean (state ice-cube)) ;; unknown type -(define-extern ice-cube-appear-land (state ice-cube)) ;; unknown type -(define-extern ice-cube-appear (state ice-cube)) ;; unknown type -(define-extern ice-cube-trying-to-appear (state ice-cube)) ;; unknown type (define-extern *ice-cube-sg* skeleton-group) (define-extern *ice-cube-nav-enemy-info* nav-enemy-info) -(define-extern ice-cube-shatter (state ice-cube)) ;; unknown type -(define-extern ice-cube-mean-charge (state ice-cube)) ;; unknown type ;; ---------------------- @@ -35259,6 +33025,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + snow-ball-shadow-idle) ) (deftype snow-ball-junction (structure) @@ -35305,6 +33073,8 @@ (play-landing-sound (_type_ float) sound-id 21) (dummy-22 (_type_ process-drawable) none 22) ) + (:states + snow-ball-roller-idle) ) (deftype snow-ball (process) @@ -35323,6 +33093,8 @@ (dummy-14 (_type_ (inline-array snow-ball-junction) float int) symbol 14) (dummy-15 (_type_ (inline-array snow-ball-junction) int) none 15) ;; TODO - same type as above ) + (:states + snow-ball-idle) ) ;; - Functions @@ -35334,12 +33106,9 @@ ;; - Unknowns -(define-extern snow-ball-idle (state snow-ball)) ;; unknown type (define-extern *snow-ball-sg* skeleton-group) -(define-extern snow-ball-roller-idle (state snow-ball-roller)) ;; unknown type (define-extern *snow-ball-shadow-sg* skeleton-group) (define-extern *snow-ball-shadow-control* shadow-control) ;; unknown type -(define-extern snow-ball-shadow-idle (state snow-ball-shadow)) ;; unknown type ;; ---------------------- @@ -35523,6 +33292,14 @@ :size-assert #x180 :heap-base #x110 :flag-assert #x2101100180 + (:states + elevator-idle-at-cave + elevator-travel-to-cave + elevator-idle-at-fort + elevator-travel-to-fort + flutflut-plat-hidden-idle + flutflut-plat-hide + flutflut-plat-appear) ) (deftype snow-button (process-drawable) @@ -35537,6 +33314,10 @@ :size-assert #xf0 :heap-base #x80 :flag-assert #x14008000f0 + (:states + snow-button-up-idle + snow-button-deactivate + snow-button-activate) ) (deftype flutflut-plat-small (flutflut-plat) @@ -35568,17 +33349,7 @@ (define-extern *flutflut-plat-large-sg* skeleton-group) (define-extern *flutflut-plat-med-sg* skeleton-group) (define-extern *flutflut-plat-small-sg* skeleton-group) -(define-extern elevator-idle-at-cave (state flutflut-plat)) ;; unknown type -(define-extern elevator-travel-to-cave (state flutflut-plat)) ;; unknown type -(define-extern elevator-idle-at-fort (state flutflut-plat)) ;; unknown type -(define-extern elevator-travel-to-fort (state flutflut-plat)) ;; unknown type -(define-extern flutflut-plat-hidden-idle (state flutflut-plat)) ;; unknown type -(define-extern flutflut-plat-hide (state flutflut-plat)) ;; unknown type -(define-extern flutflut-plat-appear (state flutflut-plat)) ;; unknown type (define-extern *snow-button-sg* skeleton-group) -(define-extern snow-button-up-idle (state snow-button)) ;; unknown type -(define-extern snow-button-deactivate (state snow-button)) ;; unknown type -(define-extern snow-button-activate (state snow-button)) ;; unknown type ;; ---------------------- @@ -35604,16 +33375,17 @@ (dummy-20 (_type_) none 20) (shove-player (_type_ process-drawable) none 21) ) + (:states + snow-bumper-spawn-fuel-cell + snow-bumper-inactive-idle + snow-bumper-active-far-idle + snow-bumper-deactivate + snow-bumper-active-close-idle) ) ;; - Unknowns (define-extern *snow-bumper-sg* skeleton-group) -(define-extern snow-bumper-spawn-fuel-cell (state snow-bumper)) ;; unknown type -(define-extern snow-bumper-inactive-idle (state snow-bumper)) ;; unknown type -(define-extern snow-bumper-active-far-idle (state snow-bumper)) ;; unknown type -(define-extern snow-bumper-deactivate (state snow-bumper)) ;; unknown type -(define-extern snow-bumper-active-close-idle (state snow-bumper)) ;; unknown type ;; ---------------------- @@ -35642,6 +33414,10 @@ (dummy-21 (_type_) object 21) (dummy-22 (_type_) symbol 22) ) + (:states + ram-fun-idle + ram-idle + ram-give-fuel-cell) ) @@ -35667,6 +33443,9 @@ :size-assert #x1d0 :heap-base #x160 :flag-assert #x1d016001d0 + (:states + ram-boss-proj-launch + ram-boss-proj-growing) ) (deftype ram-boss (nav-enemy) @@ -35690,6 +33469,19 @@ :size-assert #x1f4 :heap-base #x190 :flag-assert #x4c019001f4 + (:states + ram-boss-tracking + ram-boss-nav-resume + ram-boss-throw + ram-boss-nav-start + ram-boss-jump-down-hit-ground + (ram-boss-jump-down basic vector) + (ram-boss-already-down basic vector) + ram-boss-idle + ram-boss-lose-shield + ram-boss-up-defend-block + ram-boss-forward-defend-block + ram-boss-show-anims) ) ;; - Functions @@ -35700,23 +33492,9 @@ ;; - Unknowns -(define-extern ram-boss-tracking (state ram-boss)) ;; unknown type (define-extern *ram-boss-nav-enemy-info-no-shield* nav-enemy-info) ;; unknown type -(define-extern ram-boss-nav-resume (state ram-boss)) ;; unknown type -(define-extern ram-boss-throw (state ram-boss)) ;; unknown type -(define-extern ram-boss-nav-start (state ram-boss)) ;; unknown type -(define-extern ram-boss-jump-down-hit-ground (state ram-boss)) ;; unknown type -(define-extern ram-boss-jump-down (state basic vector ram-boss)) ;; unknown type -(define-extern ram-boss-already-down (state basic vector ram-boss)) ;; unknown type -(define-extern ram-boss-idle (state ram-boss)) ;; unknown type (define-extern *ram-boss-sg* skeleton-group) (define-extern *ram-boss-nav-enemy-info* nav-enemy-info) -(define-extern ram-boss-lose-shield (state ram-boss)) ;; unknown type -(define-extern ram-boss-up-defend-block (state ram-boss)) ;; unknown type -(define-extern ram-boss-forward-defend-block (state ram-boss)) ;; unknown type -(define-extern ram-boss-proj-launch (state ram-boss-proj)) ;; unknown type -(define-extern ram-boss-proj-growing (state ram-boss-proj)) ;; unknown type -(define-extern ram-boss-show-anims (state ram-boss)) ;; unknown type ;; ---------------------- @@ -35728,9 +33506,6 @@ ;; - Unknowns (define-extern *ram-sg* skeleton-group) -(define-extern ram-fun-idle (state ram)) ;; unknown type -(define-extern ram-idle (state ram)) ;; unknown type -(define-extern ram-give-fuel-cell (state ram)) ;; unknown type ;; ---------------------- @@ -35771,6 +33546,10 @@ :size-assert #x198 :heap-base #x130 :flag-assert #x4c01300198 + (:states + yeti-slave-appear-jump-up + yeti-slave-appear-land + yeti-slave-show-anims) ) (deftype yeti (process-drawable) @@ -35790,6 +33569,10 @@ (TODO-RENAME-20 (_type_ vector vector) symbol 20) (aggro? (_type_ vector) symbol 21) ) + (:states + yeti-resuming-start + yeti-first-time-start + yeti-idle) ) ;; - Functions @@ -35799,60 +33582,8 @@ ;; - Unknowns -(define-extern yeti-resuming-start (state yeti)) ;; unknown type -(define-extern yeti-first-time-start (state yeti)) ;; unknown type -(define-extern yeti-idle (state yeti)) ;; unknown type -(define-extern yeti-slave-appear-jump-up (state yeti-slave)) ;; unknown type (define-extern *yeti-sg* skeleton-group) (define-extern *yeti-nav-enemy-info* nav-enemy-info) -(define-extern yeti-slave-appear-land (state yeti-slave)) ;; unknown type -(define-extern yeti-slave-show-anims (state yeti-slave)) ;; unknown type - - -;; ---------------------- -;; File - eichar-pole+0-ag-L1 -;; Source Path - levels/l1_only/eichar-pole+0-ag-L1.gd -;; Containing DGOs - ['L1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-pole+0-ag-ROB -;; Source Path - levels/rolling/eichar-pole+0-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-pole+0-ag-SNO -;; Source Path - levels/snow/eichar-pole+0-ag-SNO.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-pole+0-ag-SWA -;; Source Path - levels/swamp/eichar-pole+0-ag-SWA.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - eichar-ice+0-ag -;; Source Path - levels/snow/eichar-ice+0-ag.gd -;; Containing DGOs - ['L1', 'SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - ;; ---------------------- ;; File - lavatube-obs @@ -35868,6 +33599,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavabase-idle) ) (deftype lavafall (process-drawable) @@ -35876,6 +33609,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavafall-idle) ) (deftype lavashortcut (process-drawable) @@ -35884,6 +33619,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavashortcut-idle) ) (deftype darkecobarrel-leak (structure) @@ -35919,6 +33656,9 @@ :size-assert #x1b0 :heap-base #x140 :flag-assert #x14014001b0 + (:states + darkecobarrel-mover-move + darkecobarrel-mover-die) ) (deftype darkecobarrel (darkecobarrel-base) @@ -35930,6 +33670,8 @@ :size-assert #xc8 :heap-base #x60 :flag-assert #x14006000c8 + (:states + darkecobarrel-spawner) ) (deftype lavafallsewera (process-drawable) @@ -35938,6 +33680,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavafallsewera-idle) ) (deftype lavafallsewerb (process-drawable) @@ -35946,6 +33690,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavafallsewerb-idle) ) (deftype chainmine (process-drawable) @@ -35988,6 +33734,8 @@ :size-assert #xb0 :heap-base #x40 :flag-assert #x14004000b0 + (:states + lavayellowtarp-idle) ) ;; - Functions @@ -36004,24 +33752,15 @@ ;; - Unknowns (define-extern *lavayellowtarp-sg* skeleton-group) -(define-extern lavayellowtarp-idle (state lavayellowtarp)) ;; unknown type (define-extern ripple-for-lavatube-lava ripple-wave-set) ;; unknown type (define-extern *lavaballoon-sg* skeleton-group) (define-extern *chainmine-sg* skeleton-group) (define-extern *lavafallsewerb-sg* skeleton-group) -(define-extern lavafallsewerb-idle (state lavafallsewerb)) ;; unknown type (define-extern *lavafallsewera-sg* skeleton-group) -(define-extern lavafallsewera-idle (state lavafallsewera)) ;; unknown type -(define-extern darkecobarrel-spawner (state darkecobarrel)) ;; unknown type -(define-extern darkecobarrel-mover-move (state darkecobarrel-mover)) ;; unknown type -(define-extern darkecobarrel-mover-die (state darkecobarrel-mover)) ;; unknown type (define-extern *darkecobarrel-sg* skeleton-group) (define-extern *lavashortcut-sg* skeleton-group) -(define-extern lavashortcut-idle (state lavashortcut)) ;; unknown type (define-extern *lavafall-sg* skeleton-group) -(define-extern lavafall-idle (state lavafall)) ;; unknown type (define-extern *lavabase-sg* skeleton-group) -(define-extern lavabase-idle (state lavabase)) ;; unknown type ;; ---------------------- @@ -36189,1905 +33928,6 @@ (define-extern *assistant-lavatube-start-sg* skeleton-group) -;; ---------------------- -;; File - tpage-815 -;; Source Path - levels/firecanyon/tpage-815.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-822 -;; Source Path - levels/firecanyon/tpage-822.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-854 -;; Source Path - levels/firecanyon/tpage-854.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1123 -;; Source Path - levels/firecanyon/tpage-1123.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-firecanyon-ag -;; Source Path - levels/firecanyon/assistant-firecanyon-ag.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - balloon-ag -;; Source Path - levels/firecanyon/balloon-ag.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - crate-darkeco-cluster-ag-FIC -;; Source Path - levels/firecanyon/crate-darkeco-cluster-ag-FIC.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - crate-darkeco-cluster-ag-OGR -;; Source Path - levels/ogre/crate-darkeco-cluster-ag-OGR.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ef-plane-ag-FIC-LAV-OGR-ROL-SNO-SWA -;; Source Path - levels/common/ef-plane-ag-FIC-LAV-OGR-ROL-SNO-SWA.gd -;; Containing DGOs - ['FIC', 'LAV', 'OGR', 'ROL', 'SNO', 'SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ef-plane-ag-MIS -;; Source Path - levels/misty/ef-plane-ag-MIS.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - racer-ag-FIC-ROL -;; Source Path - levels/common/racer-ag-FIC-ROL.gd -;; Containing DGOs - ['FIC', 'ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - racer-ag-LAV -;; Source Path - levels/lavatube/racer-ag-LAV.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - racer-ag-MIS -;; Source Path - levels/misty/racer-ag-MIS.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - racer-ag-OGR -;; Source Path - levels/ogre/racer-ag-OGR.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - spike-ag -;; Source Path - levels/firecanyon/spike-ag.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - firecanyon-vis -;; Source Path - levels/firecanyon/firecanyon-vis.gd -;; Containing DGOs - ['FIC'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1338 -;; Source Path - levels/lavatube/tpage-1338.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1340 -;; Source Path - levels/lavatube/tpage-1340.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1339 -;; Source Path - levels/lavatube/tpage-1339.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1337 -;; Source Path - levels/lavatube/tpage-1337.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-lavatube-start-ag -;; Source Path - levels/lavatube/assistant-lavatube-start-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - chainmine-ag -;; Source Path - levels/lavatube/chainmine-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkecobarrel-ag -;; Source Path - levels/lavatube/darkecobarrel-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - energyarm-ag -;; Source Path - levels/lavatube/energyarm-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - energyball-ag -;; Source Path - levels/lavatube/energyball-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - energybase-ag -;; Source Path - levels/lavatube/energybase-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - energydoor-ag -;; Source Path - levels/lavatube/energydoor-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - energyhub-ag -;; Source Path - levels/lavatube/energyhub-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavaballoon-ag -;; Source Path - levels/lavatube/lavaballoon-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavabase-ag -;; Source Path - levels/lavatube/lavabase-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavafall-ag -;; Source Path - levels/lavatube/lavafall-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavafallsewera-ag -;; Source Path - levels/lavatube/lavafallsewera-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavafallsewerb-ag -;; Source Path - levels/lavatube/lavafallsewerb-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavashortcut-ag -;; Source Path - levels/lavatube/lavashortcut-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavayellowtarp-ag -;; Source Path - levels/lavatube/lavayellowtarp-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-lavatube-ag -;; Source Path - levels/lavatube/water-anim-lavatube-ag.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavatube-vis -;; Source Path - levels/lavatube/lavatube-vis.gd -;; Containing DGOs - ['LAV'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1313 -;; Source Path - levels/maincave/tpage-1313.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1315 -;; Source Path - levels/maincave/tpage-1315.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1314 -;; Source Path - levels/maincave/tpage-1314.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1312 -;; Source Path - levels/maincave/tpage-1312.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-767 -;; Source Path - levels/maincave/tpage-767.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - driller-lurker-ag -;; Source Path - levels/cave_common/driller-lurker-ag.gd -;; Containing DGOs - ['MAI', 'ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - gnawer-ag -;; Source Path - levels/maincave/gnawer-ag.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - launcherdoor-maincave-ag -;; Source Path - levels/maincave/launcherdoor-maincave-ag.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - maincavecam-ag -;; Source Path - levels/maincave/maincavecam-ag.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-ag-MAI -;; Source Path - levels/maincave/plat-ag-MAI.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-ag-ROB -;; Source Path - levels/robocave/plat-ag-ROB.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - spiderwebs-ag -;; Source Path - levels/cave_common/spiderwebs-ag.gd -;; Containing DGOs - ['MAI', 'ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-maincave-ag -;; Source Path - levels/maincave/water-anim-maincave-ag.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-maincave-water-ag -;; Source Path - levels/maincave/water-anim-maincave-water-ag.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - maincave-vis -;; Source Path - levels/maincave/maincave-vis.gd -;; Containing DGOs - ['MAI'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-516 -;; Source Path - levels/misty/tpage-516.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-521 -;; Source Path - levels/misty/tpage-521.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-518 -;; Source Path - levels/misty/tpage-518.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-520 -;; Source Path - levels/misty/tpage-520.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - balloonlurker-ag -;; Source Path - levels/misty/balloonlurker-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - boatpaddle-ag -;; Source Path - levels/misty/boatpaddle-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bonelurker-ag -;; Source Path - levels/misty/bonelurker-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - breakaway-left-ag -;; Source Path - levels/misty/breakaway-left-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - breakaway-mid-ag -;; Source Path - levels/misty/breakaway-mid-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - breakaway-right-ag -;; Source Path - levels/misty/breakaway-right-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - darkecocan-ag -;; Source Path - levels/misty/darkecocan-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - keg-ag -;; Source Path - levels/misty/keg-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - keg-conveyor-ag -;; Source Path - levels/misty/keg-conveyor-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - keg-conveyor-paddle-ag -;; Source Path - levels/misty/keg-conveyor-paddle-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mis-bone-bridge-ag -;; Source Path - levels/misty/mis-bone-bridge-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mis-bone-platform-ag -;; Source Path - levels/misty/mis-bone-platform-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mistycam-ag -;; Source Path - levels/misty/mistycam-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - muse-ag -;; Source Path - levels/misty/muse-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - quicksandlurker-ag -;; Source Path - levels/misty/quicksandlurker-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ropebridge-36-ag -;; Source Path - levels/misty/ropebridge-36-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - rounddoor-ag -;; Source Path - levels/misty/rounddoor-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sidekick-human-ag -;; Source Path - levels/misty/sidekick-human-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - silostep-ag -;; Source Path - levels/misty/silostep-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - teetertotter-ag -;; Source Path - levels/misty/teetertotter-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-misty-ag -;; Source Path - levels/misty/water-anim-misty-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - wheel-ag -;; Source Path - levels/misty/wheel-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - windturbine-ag -;; Source Path - levels/misty/windturbine-ag.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - misty-vis -;; Source Path - levels/misty/misty-vis.gd -;; Containing DGOs - ['MIS'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-875 -;; Source Path - levels/ogre/tpage-875.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-967 -;; Source Path - levels/ogre/tpage-967.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-884 -;; Source Path - levels/ogre/tpage-884.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1117 -;; Source Path - levels/ogre/tpage-1117.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flying-lurker-ag -;; Source Path - levels/ogre/flying-lurker-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-snow-ag -;; Source Path - levels/ogre/medres-snow-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogre-bridge-ag -;; Source Path - levels/ogre/ogre-bridge-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogre-bridgeend-ag -;; Source Path - levels/ogre/ogre-bridgeend-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogre-isle-ag -;; Source Path - levels/ogre/ogre-isle-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogre-step-ag -;; Source Path - levels/ogre/ogre-step-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogreboss-ag -;; Source Path - levels/ogre/ogreboss-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogrecam-ag -;; Source Path - levels/ogre/ogrecam-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plunger-lurker-ag -;; Source Path - levels/ogre/plunger-lurker-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - shortcut-boulder-ag -;; Source Path - levels/ogre/shortcut-boulder-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tntbarrel-ag -;; Source Path - levels/ogre/tntbarrel-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-ogre-ag -;; Source Path - levels/ogre/water-anim-ogre-ag.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogre-vis -;; Source Path - levels/ogre/ogre-vis.gd -;; Containing DGOs - ['OGR'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1318 -;; Source Path - levels/robocave/tpage-1318.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1319 -;; Source Path - levels/robocave/tpage-1319.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1317 -;; Source Path - levels/robocave/tpage-1317.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1316 -;; Source Path - levels/robocave/tpage-1316.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavecrusher-ag -;; Source Path - levels/robocave/cavecrusher-ag.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavespatulatwo-ag -;; Source Path - levels/robocave/cavespatulatwo-ag.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-robocave-ag -;; Source Path - levels/robocave/water-anim-robocave-ag.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robocave-vis -;; Source Path - levels/robocave/robocave-vis.gd -;; Containing DGOs - ['ROB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-923 -;; Source Path - levels/rolling/tpage-923.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-926 -;; Source Path - levels/rolling/tpage-926.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-924 -;; Source Path - levels/rolling/tpage-924.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-925 -;; Source Path - levels/rolling/tpage-925.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1353 -;; Source Path - levels/rolling/tpage-1353.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - dark-plant-ag -;; Source Path - levels/rolling/dark-plant-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - happy-plant-ag -;; Source Path - levels/rolling/happy-plant-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lightning-mole-ag -;; Source Path - levels/rolling/lightning-mole-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pusher-ag -;; Source Path - levels/rolling/pusher-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - race-ring-ag -;; Source Path - levels/rolling/race-ring-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - robber-ag -;; Source Path - levels/rolling/robber-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - rolling-start-ag -;; Source Path - levels/rolling/rolling-start-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - rollingcam-ag -;; Source Path - levels/rolling/rollingcam-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-rolling-ag -;; Source Path - levels/rolling/water-anim-rolling-ag.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - rolling-vis -;; Source Path - levels/rolling/rolling-vis.gd -;; Containing DGOs - ['ROL'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-710 -;; Source Path - levels/snow/tpage-710.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-842 -;; Source Path - levels/snow/tpage-842.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-711 -;; Source Path - levels/snow/tpage-711.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-712 -;; Source Path - levels/snow/tpage-712.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flut-saddle-ag-SNO -;; Source Path - levels/snow/flut-saddle-ag-SNO.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flut-saddle-ag-SWA -;; Source Path - levels/swamp/flut-saddle-ag-SWA.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflut-plat-large-ag -;; Source Path - levels/snow/flutflut-plat-large-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflut-plat-med-ag -;; Source Path - levels/snow/flutflut-plat-med-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflut-plat-small-ag -;; Source Path - levels/snow/flutflut-plat-small-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ice-cube-ag -;; Source Path - levels/snow/ice-cube-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ice-cube-break-ag -;; Source Path - levels/snow/ice-cube-break-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ram-ag -;; Source Path - levels/snow/ram-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ram-boss-ag -;; Source Path - levels/snow/ram-boss-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-ball-ag -;; Source Path - levels/snow/snow-ball-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-bridge-36-ag -;; Source Path - levels/snow/snow-bridge-36-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-bumper-ag -;; Source Path - levels/snow/snow-bumper-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-bunny-ag -;; Source Path - levels/snow/snow-bunny-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-button-ag -;; Source Path - levels/snow/snow-button-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-eggtop-ag -;; Source Path - levels/snow/snow-eggtop-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-fort-gate-ag -;; Source Path - levels/snow/snow-fort-gate-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-gears-ag -;; Source Path - levels/snow/snow-gears-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-log-ag -;; Source Path - levels/snow/snow-log-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-spatula-ag -;; Source Path - levels/snow/snow-spatula-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-switch-ag -;; Source Path - levels/snow/snow-switch-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snowcam-ag -;; Source Path - levels/snow/snowcam-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snowpusher-ag -;; Source Path - levels/snow/snowpusher-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - yeti-ag -;; Source Path - levels/snow/yeti-ag.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - snow-vis -;; Source Path - levels/snow/snow-vis.gd -;; Containing DGOs - ['SNO'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-163 -;; Source Path - levels/sunkenb/tpage-163.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-164 -;; Source Path - levels/sunkenb/tpage-164.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-166 -;; Source Path - levels/sunkenb/tpage-166.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-162 -;; Source Path - levels/sunkenb/tpage-162.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-764 -;; Source Path - levels/sunkenb/tpage-764.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - blue-eco-charger-ag -;; Source Path - levels/sunkenb/blue-eco-charger-ag.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - blue-eco-charger-orb-ag -;; Source Path - levels/sunkenb/blue-eco-charger-orb-ag.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - bully-ag -;; Source Path - levels/sunken_common/bully-ag.gd -;; Containing DGOs - ['SUB', 'SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - floating-launcher-ag -;; Source Path - levels/sunkenb/floating-launcher-ag.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - helix-button-ag -;; Source Path - levels/sunkenb/helix-button-ag.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - helix-slide-door-ag -;; Source Path - levels/sunkenb/helix-slide-door-ag.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - shover-ag-SUB -;; Source Path - levels/sunkenb/shover-ag-SUB.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - shover-ag-SUN -;; Source Path - levels/sunken/shover-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - steam-cap-ag-SUB -;; Source Path - levels/sunkenb/steam-cap-ag-SUB.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - steam-cap-ag-SUN -;; Source Path - levels/sunken/steam-cap-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunkencam-ag-SUB -;; Source Path - levels/sunkenb/sunkencam-ag-SUB.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunkencam-ag-SUN -;; Source Path - levels/sunken/sunkencam-ag-SUN.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunkenfisha-ag -;; Source Path - levels/sunken_common/sunkenfisha-ag.gd -;; Containing DGOs - ['SUB', 'SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - wall-plat-ag -;; Source Path - levels/sunken_common/wall-plat-ag.gd -;; Containing DGOs - ['SUB', 'SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-sunken-ag -;; Source Path - levels/sunken_common/water-anim-sunken-ag.gd -;; Containing DGOs - ['SUB', 'SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-sunken-dark-eco-ag -;; Source Path - levels/sunken_common/water-anim-sunken-dark-eco-ag.gd -;; Containing DGOs - ['SUB', 'SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunkenb-vis -;; Source Path - levels/sunkenb/sunkenb-vis.gd -;; Containing DGOs - ['SUB'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-661 -;; Source Path - levels/sunken/tpage-661.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-663 -;; Source Path - levels/sunken/tpage-663.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-714 -;; Source Path - levels/sunken/tpage-714.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-662 -;; Source Path - levels/sunken/tpage-662.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-766 -;; Source Path - levels/sunken/tpage-766.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - double-lurker-ag -;; Source Path - levels/sunken/double-lurker-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - double-lurker-top-ag -;; Source Path - levels/sunken/double-lurker-top-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - exit-chamber-ag -;; Source Path - levels/sunken/exit-chamber-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - generic-button-ag -;; Source Path - levels/sunken/generic-button-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orbit-plat-ag -;; Source Path - levels/sunken/orbit-plat-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - orbit-plat-bottom-ag -;; Source Path - levels/sunken/orbit-plat-bottom-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - plat-sunken-ag -;; Source Path - levels/sunken/plat-sunken-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - puffer-ag -;; Source Path - levels/sunken/puffer-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - qbert-plat-ag -;; Source Path - levels/sunken/qbert-plat-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - qbert-plat-on-ag -;; Source Path - levels/sunken/qbert-plat-on-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - seaweed-ag -;; Source Path - levels/sunken/seaweed-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - side-to-side-plat-ag -;; Source Path - levels/sunken/side-to-side-plat-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - square-platform-ag -;; Source Path - levels/sunken/square-platform-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sun-iris-door-ag -;; Source Path - levels/sunken/sun-iris-door-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - wedge-plat-ag -;; Source Path - levels/sunken/wedge-plat-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - wedge-plat-outer-ag -;; Source Path - levels/sunken/wedge-plat-outer-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - whirlpool-ag -;; Source Path - levels/sunken/whirlpool-ag.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunken-vis -;; Source Path - levels/sunken/sunken-vis.gd -;; Containing DGOs - ['SUN'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-358 -;; Source Path - levels/swamp/tpage-358.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-659 -;; Source Path - levels/swamp/tpage-659.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-629 -;; Source Path - levels/swamp/tpage-629.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-630 -;; Source Path - levels/swamp/tpage-630.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - balance-plat-ag -;; Source Path - levels/swamp/balance-plat-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - billy-ag -;; Source Path - levels/swamp/billy-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - billy-sidekick-ag -;; Source Path - levels/swamp/billy-sidekick-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - farthy-snack-ag -;; Source Path - levels/swamp/farthy-snack-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - kermit-ag -;; Source Path - levels/swamp/kermit-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-bat-ag -;; Source Path - levels/swamp/swamp-bat-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-rat-ag -;; Source Path - levels/swamp/swamp-rat-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-rat-nest-ag -;; Source Path - levels/swamp/swamp-rat-nest-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-rock-ag -;; Source Path - levels/swamp/swamp-rock-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-spike-ag -;; Source Path - levels/swamp/swamp-spike-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swampcam-ag-SWA -;; Source Path - levels/swamp/swampcam-ag-SWA.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swampcam-ag-VI2 -;; Source Path - levels/village2/swampcam-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tar-plat-ag -;; Source Path - levels/swamp/tar-plat-ag.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-vis -;; Source Path - levels/swamp/swamp-vis.gd -;; Containing DGOs - ['SWA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - title-obs ;; Source Path - levels/title/title-obs.gc @@ -38151,1095 +33991,6 @@ (define-extern *logo-black-sg* skeleton-group) -;; ---------------------- -;; File - tpage-1609 -;; Source Path - levels/title/tpage-1609.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-416 -;; Source Path - levels/title/tpage-416.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-415 -;; Source Path - levels/title/tpage-415.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-397 -;; Source Path - levels/title/tpage-397.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1499 -;; Source Path - levels/title/tpage-1499.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - logo-ag -;; Source Path - levels/title/logo-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - logo-black-ag -;; Source Path - levels/title/logo-black-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - logo-cam-ag -;; Source Path - levels/title/logo-cam-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - logo-volumes-ag -;; Source Path - levels/title/logo-volumes-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ndi-ag -;; Source Path - levels/title/ndi-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ndi-cam-ag -;; Source Path - levels/title/ndi-cam-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ndi-volumes-ag -;; Source Path - levels/title/ndi-volumes-ag.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - title-vis -;; Source Path - levels/title/title-vis.gd -;; Containing DGOs - ['TIT'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1309 -;; Source Path - levels/training/tpage-1309.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1311 -;; Source Path - levels/training/tpage-1311.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1310 -;; Source Path - levels/training/tpage-1310.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1308 -;; Source Path - levels/training/tpage-1308.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-775 -;; Source Path - levels/training/tpage-775.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pontoonfive-ag-TRA -;; Source Path - levels/training/pontoonfive-ag-TRA.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pontoonfive-ag-VI2 -;; Source Path - levels/village2/pontoonfive-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - scarecrow-a-ag -;; Source Path - levels/training/scarecrow-a-ag.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - scarecrow-b-ag -;; Source Path - levels/training/scarecrow-b-ag.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - trainingcam-ag -;; Source Path - levels/training/trainingcam-ag.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-training-ag -;; Source Path - levels/training/water-anim-training-ag.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - training-vis -;; Source Path - levels/training/training-vis.gd -;; Containing DGOs - ['TRA'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-398 -;; Source Path - levels/village1/tpage-398.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-400 -;; Source Path - levels/village1/tpage-400.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-399 -;; Source Path - levels/village1/tpage-399.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-401 -;; Source Path - levels/village1/tpage-401.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1470 -;; Source Path - levels/village1/tpage-1470.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-ag -;; Source Path - levels/village1/assistant-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilplant-ag -;; Source Path - levels/village1/evilplant-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - explorer-ag -;; Source Path - levels/village1/explorer-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - farmer-ag -;; Source Path - levels/village1/farmer-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fishermans-boat-ag -;; Source Path - levels/village1/fishermans-boat-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - hutlamp-ag -;; Source Path - levels/village1/hutlamp-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - mayorgears-ag -;; Source Path - levels/village1/mayorgears-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-beach-ag -;; Source Path - levels/village1/medres-beach-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-beach1-ag -;; Source Path - levels/village1/medres-beach1-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-beach2-ag -;; Source Path - levels/village1/medres-beach2-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-beach3-ag -;; Source Path - levels/village1/medres-beach3-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-jungle-ag -;; Source Path - levels/village1/medres-jungle-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-jungle1-ag -;; Source Path - levels/village1/medres-jungle1-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-jungle2-ag -;; Source Path - levels/village1/medres-jungle2-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-misty-ag -;; Source Path - levels/village1/medres-misty-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-training-ag -;; Source Path - levels/village1/medres-training-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-village11-ag -;; Source Path - levels/village1/medres-village11-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-village12-ag -;; Source Path - levels/village1/medres-village12-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-village13-ag -;; Source Path - levels/village1/medres-village13-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - oracle-ag-VI1 -;; Source Path - levels/village1/oracle-ag-VI1.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - oracle-ag-VI2 -;; Source Path - levels/village2/oracle-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - oracle-ag-VI3 -;; Source Path - levels/village3/oracle-ag-VI3.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - reflector-middle-ag -;; Source Path - levels/village1/reflector-middle-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - revcycle-ag -;; Source Path - levels/village1/revcycle-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - revcycleprop-ag -;; Source Path - levels/village1/revcycleprop-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ropebridge-32-ag -;; Source Path - levels/village1/ropebridge-32-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sage-ag -;; Source Path - levels/village1/sage-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sagesail-ag -;; Source Path - levels/village1/sagesail-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - villa-starfish-ag -;; Source Path - levels/village1/villa-starfish-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village-cam-ag-VI1 -;; Source Path - levels/village1/village-cam-ag-VI1.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village-cam-ag-VI2 -;; Source Path - levels/village2/village-cam-ag-VI2.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village-cam-ag-VI3 -;; Source Path - levels/village3/village-cam-ag-VI3.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village1cam-ag -;; Source Path - levels/village1/village1cam-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-village1-ag -;; Source Path - levels/village1/water-anim-village1-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - windmill-sail-ag -;; Source Path - levels/village1/windmill-sail-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - windspinner-ag -;; Source Path - levels/village1/windspinner-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - yakow-ag -;; Source Path - levels/village1/yakow-ag.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village1-vis -;; Source Path - levels/village1/village1-vis.gd -;; Containing DGOs - ['VI1'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-919 -;; Source Path - levels/village2/tpage-919.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-922 -;; Source Path - levels/village2/tpage-922.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-920 -;; Source Path - levels/village2/tpage-920.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-921 -;; Source Path - levels/village2/tpage-921.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1476 -;; Source Path - levels/village2/tpage-1476.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - allpontoons-ag -;; Source Path - levels/village2/allpontoons-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-village2-ag -;; Source Path - levels/village2/assistant-village2-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ceilingflag-ag -;; Source Path - levels/village2/ceilingflag-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - exit-chamber-dummy-ag -;; Source Path - levels/village2/exit-chamber-dummy-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - fireboulder-ag -;; Source Path - levels/village2/fireboulder-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - flutflut-bluehut-ag -;; Source Path - levels/village2/flutflut-bluehut-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - gambler-ag -;; Source Path - levels/village2/gambler-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - geologist-ag -;; Source Path - levels/village2/geologist-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - jaws-ag -;; Source Path - levels/village2/jaws-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-rolling-ag -;; Source Path - levels/village2/medres-rolling-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-rolling1-ag -;; Source Path - levels/village2/medres-rolling1-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-village2-ag -;; Source Path - levels/village2/medres-village2-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - ogreboss-village2-ag -;; Source Path - levels/village2/ogreboss-village2-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pontoonten-ag -;; Source Path - levels/village2/pontoonten-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - precursor-arm-ag -;; Source Path - levels/village2/precursor-arm-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sage-bluehut-ag -;; Source Path - levels/village2/sage-bluehut-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sunken-elevator-ag -;; Source Path - levels/village2/sunken-elevator-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-blimp-ag -;; Source Path - levels/village2/swamp-blimp-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-rope-ag -;; Source Path - levels/village2/swamp-rope-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-tetherrock-ag -;; Source Path - levels/village2/swamp-tetherrock-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - swamp-tetherrock-explode-ag -;; Source Path - levels/village2/swamp-tetherrock-explode-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village2cam-ag -;; Source Path - levels/village2/village2cam-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - warrior-ag -;; Source Path - levels/village2/warrior-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-village2-ag -;; Source Path - levels/village2/water-anim-village2-ag.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village2-vis -;; Source Path - levels/village2/village2-vis.gd -;; Containing DGOs - ['VI2'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1208 -;; Source Path - levels/village3/tpage-1208.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1210 -;; Source Path - levels/village3/tpage-1210.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1209 -;; Source Path - levels/village3/tpage-1209.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - tpage-1194 -;; Source Path - levels/village3/tpage-1194.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - assistant-village3-ag -;; Source Path - levels/village3/assistant-village3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - cavegem-ag -;; Source Path - levels/village3/cavegem-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilbro-village3-ag -;; Source Path - levels/village3/evilbro-village3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - evilsis-village3-ag -;; Source Path - levels/village3/evilsis-village3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - gondola-ag -;; Source Path - levels/village3/gondola-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - gondolacables-ag -;; Source Path - levels/village3/gondolacables-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - lavaspoutdrip-ag -;; Source Path - levels/village3/lavaspoutdrip-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-finalboss-ag -;; Source Path - levels/village3/medres-finalboss-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-ogre-ag -;; Source Path - levels/village3/medres-ogre-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-ogre2-ag -;; Source Path - levels/village3/medres-ogre2-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - medres-ogre3-ag -;; Source Path - levels/village3/medres-ogre3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - minecartsteel-ag -;; Source Path - levels/village3/minecartsteel-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - minershort-ag -;; Source Path - levels/village3/minershort-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - minertall-ag -;; Source Path - levels/village3/minertall-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - pistons-ag -;; Source Path - levels/village3/pistons-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - sage-village3-ag -;; Source Path - levels/village3/sage-village3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - vil3-bridge-36-ag -;; Source Path - levels/village3/vil3-bridge-36-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - water-anim-village3-ag -;; Source Path - levels/village3/water-anim-village3-ag.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - -;; ---------------------- -;; File - village3-vis -;; Source Path - levels/village3/village3-vis.gd -;; Containing DGOs - ['VI3'] -;; Version - 4 - -;; - Nothing Defined in This File! - - ;; ---------------------- ;; File - lava ;; Source Path - old/lava/lava.gc diff --git a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc index 60e3aed3c4..d0cde97a74 100644 --- a/decompiler/config/jak1_ntsc_black_label/hacks.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/hacks.jsonc @@ -233,35 +233,26 @@ "collide-probe-node", // CFG // collide-edge-grab - "(method 13 collide-edge-work)", // CFG - "(method 17 collide-edge-work)", // CFG + // CFG + // CFG "(method 15 collide-edge-work)", // CFG - "(method 16 collide-edge-work)", // CFG - "(method 9 edge-grab-info)", // CFG - "(method 18 collide-edge-work)", // CFG - "(method 10 collide-edge-hold-list)", // CFG + // CFG + // CFG + // CFG + // CFG - // collide-shape - "(method 15 collide-shape-prim-mesh)", // CFG - "(method 15 collide-shape-prim-sphere)", // CFG - "(method 16 collide-shape-prim)", // CFG - "(method 15 collide-shape-prim-group)", // CFG - "(method 18 collide-shape-prim-sphere)", - "(method 23 collide-shape-prim-sphere)", // CFG - "(method 23 collide-shape-prim-mesh)", // BUG - crash in variable pass - "(method 24 collide-shape-prim)", // CFG - "(method 23 collide-shape-prim-group)", // CFG - "(method 42 collide-shape)", // CFG + + "(method 12 collide-mesh)", // process-drawable BUG "cspace-inspect-tree", - "(method 19 process-drawable)", + //"(method 19 process-drawable)", // ambient "ambient-inspect", // target BUG - "target-falling-anim-trans", // CFG resolution + //"target-falling-anim-trans", // CFG resolution // target2 BUG "look-for-points-of-interest", // Failed to split nested sc - looks like dead code to me @@ -269,29 +260,20 @@ // collide-cache "(method 10 collide-puss-work)", // CFG "(method 9 collide-puss-work)", // decompiler crash - "(method 19 collide-cache)", // decompiler crash - "(method 10 collide-cache-prim)", // CFG - "(method 9 collide-cache-prim)", // CFG - "(method 30 collide-cache)", // unsupported asm - c.le.s - "(method 13 collide-shape-prim-group)", // CFG - "(method 13 collide-shape-prim-mesh)", // CFG - "(method 14 collide-shape-prim-group)", // CFG - "(method 14 collide-shape-prim-mesh)", // CFG - "(method 12 collide-shape-prim-group)", // CFG - "(method 12 collide-shape-prim-mesh)", // CFG - "(method 27 collide-cache)", // CFG - "(method 14 collide-cache)", // CFG - "(method 28 collide-cache)", // CFG - "(method 26 collide-cache)", // CFG - "(method 21 collide-cache)", // CFG + // decompiler crash + + // CFG + // CFG + // CFG + // "(method 14 collide-cache)", // CFG + // CFG + // "(method 26 collide-cache)", // CFG + //"(method 21 collide-cache)", // CFG "(method 32 collide-cache)", // CFG // memory-usage BUG //"(method 14 level)", - // navigate BUG - "(method 32 nav-control)", - // ocean "draw-large-polygon-ocean", // CFG @@ -305,10 +287,7 @@ // all unchecked and in level DGO code "(anon-function 21 plant-boss)", // CFG "target-flut-falling-anim-trans", // CFG failure - "(anon-function 2 target-tube)", - "(anon-function 5 orbit-plat)", // CFG - "(anon-function 2 ogreboss)" - + "(anon-function 5 orbit-plat)" // CFG ], // these functions use pairs and the decompiler @@ -394,7 +373,8 @@ "ERROR: ~A in spool anim loop for ~A ~D, but not loaded.~": 3, "~0k~5d/~d ~6d/~d ~6d/~d ": 6, "~0k~s~%": 1, - "money ~A was killed in pickup~%": 0 + "money ~A was killed in pickup~%": 0, + " id address name aid tsk lev status x y z address name state heap flags~%": 3 }, "blocks_ending_in_asm_branch": { @@ -478,7 +458,48 @@ "birth-pickup-at-point": [0], "draw-bones": [0, 1, 2, 8, 81], "draw-bones-hud": [7, 8], - "(method 16 drawable-tree)": [7, 9, 10] + "(method 16 drawable-tree)": [7, 9, 10], + "(method 21 collide-cache)" : [3, 5, 19, 20,24,25,28,29], + "(method 14 collide-cache)" : [0, 1,2, 3, 4, 5], + "(method 9 collide-mesh-cache)" : [0, 1, 2, 5], + "(method 42 collide-shape)" : [0, 1, 2, 3, 4, 7], + "(method 23 collide-shape-prim-group)" : [1, 2, 3, 4, 5], + "(method 23 collide-shape-prim-mesh)" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], + "(method 23 collide-shape-prim-sphere)" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], + "(method 18 collide-shape-prim-sphere)" : [1, 3,4, 5, 7], + "(method 45 collide-shape)" : [0, 16, 42, 67, 92], + "(method 24 collide-shape-prim)" : [2, 3, 4, 5, 1], + "(method 20 collide-shape-prim-group)" : [11], + "(method 28 collide-shape-prim-mesh)" : [10], + "(method 40 collide-shape)": [0, 2,5,6,7, 11,12, 28, 43, 58, 63], + "(method 15 collide-shape-prim-group)" : [1, 2, 3, 4, 5, 6], + "(method 16 collide-shape-prim)" : [1, 2, 3, 4, 5, 6], + "(method 15 collide-shape-prim-sphere)" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19], + "(method 15 collide-shape-prim-mesh)" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 29], + "(method 35 collide-shape)" : [1], + "(method 22 collide-cache)":[2, 3, 4, 13, 14, 15, 23, 24, 25, 33, 34, 35], + "(method 12 collide-shape-prim-sphere)" : [0, 1], + "(method 12 collide-shape-prim-group)" : [1, 2, 3, 4], + "(method 24 collide-cache)" : [2, 3, 4, 13, 14, 15, 23, 24, 25, 33, 34, 35], + "(method 14 collide-shape-prim-sphere)" : [0, 1, 2, 3], + "(method 14 collide-shape-prim-group)" : [0, 1, 2, 3, 4], + "(method 23 collide-cache)" : [2, 3, 4, 13, 14, 15, 23, 24, 25, 33, 34, 35], + "(method 13 collide-shape-prim-sphere)" : [0, 1, 2], + "(method 13 collide-shape-prim-group)" : [0, 1, 2,3,4], + "(method 19 collide-cache)" : [0, 1, 3, 4, 5, 18, 19], + "(method 10 collide-mesh)" : [1, 2, 4, 5], + "target-falling-anim-trans" : [5, 6], + "(method 19 process-drawable)" : [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], + "(anon-function 9 racer)" : [75], + "(method 13 collide-edge-work)" : [0, 2], + "(method 17 collide-edge-work)" : [0, 1, 2, 3, 4], + "(method 9 edge-grab-info)" : [15, 16, 18, 19, 21, 22, 24], +// "(method 18 collide-edge-work)" : [1, 2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24], + "target-falling-anim-trans" : [5, 6], + "(method 27 nav-mesh)" : [8], + "(method 32 nav-control)": [12, 21, 32], + "start-collect-nav": [0], + "end-collect-nav": [0] }, // Sometimes the game might use format strings that are fetched dynamically, @@ -526,13 +547,73 @@ "time-of-day-interp-colors-scratch", "normalize-frame-quaternions", "collide-do-primitives", - "moving-sphere-triangle-intersect" + "moving-sphere-triangle-intersect", + "(method 12 collide-mesh)", + "(method 11 collide-mesh)", + "collide-probe-node", + "collide-probe-instance-tie", + "(method 32 collide-cache)", + "(method 28 collide-cache)", + "(method 26 collide-cache)", + "(method 27 collide-cache)", + "(method 29 collide-cache)", + "(method 12 collide-shape-prim-mesh)", + "(method 14 collide-shape-prim-mesh)", + "(method 13 collide-shape-prim-mesh)", + "(method 30 collide-cache)", + "(method 9 collide-cache-prim)", + "(method 10 collide-cache-prim)", + "(method 9 collide-puss-work)", + "(method 10 collide-puss-work)", + + // these could easily be goal, but probably faster/easier this way. + "(method 14 collide-mesh)", + "(method 15 collide-mesh)", + + "(method 16 collide-edge-work)", + "(method 10 collide-edge-hold-list)", + "(method 15 collide-edge-work)", + "(method 18 collide-edge-work)" ], // there are some missing textures. I don't know what the game actually does here. // the format for entries is [level, tpage, index] "missing_textures": [ ["finalboss", 1419, 3] + ], + + // some object files have garbage pad data at the end which makes the decompiler + // assume they must be different files, such as the art group for orb-cache-top. + // this just suppresses a message. + "expected_merged_objs": [ + "orb-cache-top-ag", + "ecovalve-ag", + "barrel-ag", + "sack-ag", + "sharkey-ag", + "warp-gate-switch-ag", + "baby-spider-ag", + "cavetrapdoor-ag", + "spider-egg-ag", + "darkvine-ag", + "jng-iris-door-ag", + "eichar-fish+0-ag", + "launcherdoor-ag", + "plat-eco-ag", + "eichar-tube+0-ag", + "eichar-pole+0-ag", + "crate-darkeco-cluster-ag", + "ef-plane-ag", + "racer-ag", + "flut-saddle-ag", + "shover-ag", + "steam-cap-ag", + "sunkencam-ag", + "swampcam-ag", + "pontoonfive-ag", + "oracle-ag", + "village-cam-ag", + "plat-ag" ] } diff --git a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc index 996b7df69b..5e988abce7 100644 --- a/decompiler/config/jak1_ntsc_black_label/label_types.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/label_types.jsonc @@ -1609,11 +1609,17 @@ "rolling-lightning-mole": [ ["L181", "vector"], - ["L185", "rgba", true], - ["L186", "rgba", true], - ["L187", "rgba", true], - ["L189", "rgba", true], - ["L195", "vector"] + ["L185", "vector4w"], + ["L186", "vector4w"], + ["L187", "vector4w"], + ["L189", "vector4w"], + ["L195", "vector"], + ["L201", "vector4w"], + ["L202", "vector4w"], + ["L203", "vector4w"], + ["L204", "vector4w"], + ["L205", "vector4w"], + ["L206", "vector4w"] ], "rolling-robber": [ @@ -1624,7 +1630,95 @@ ], "ogreboss": [ - ["L525", "uint64", true], + ["L359", "attack-info"], + ["L367", "attack-info"], + ["L370", "attack-info"], + ["L371", "attack-info"], + ["L384", "(pointer float)", 1], + ["L384", "(pointer float)", 1], + ["L385", "(pointer float)", 1], + ["L386", "(pointer float)", 1], + ["L387", "(pointer float)", 1], + ["L388", "(pointer float)", 1], + ["L389", "(pointer float)", 1], + ["L390", "float", true], + ["L391", "float", true], + ["L392", "float", true], + ["L393", "float", true], + ["L394", "float", true], + ["L395", "float", true], + ["L396", "float", true], + ["L397", "float", true], + ["L398", "float", true], + ["L399", "float", true], + ["L400", "float", true], + ["L401", "float", true], + ["L402", "float", true], + ["L403", "float", true], + ["L404", "float", true], + ["L405", "float", true], + ["L406", "float", true], + ["L407", "float", true], + ["L408", "float", true], + ["L409", "float", true], + ["L410", "float", true], + ["L411", "float", true], + ["L412", "float", true], + ["L413", "float", true], + ["L414", "float", true], + ["L415", "float", true], + ["L416", "float", true], + ["L417", "float", true], + ["L418", "float", true], + ["L419", "float", true], + ["L420", "float", true], + ["L421", "float", true], + ["L422", "float", true], + ["L423", "float", true], + ["L424", "float", true], + ["L425", "float", true], + ["L426", "float", true], + ["L427", "float", true], + ["L428", "float", true], + ["L429", "float", true], + ["L430", "float", true], + ["L431", "float", true], + ["L432", "float", true], + ["L433", "float", true], + ["L434", "float", true], + ["L435", "float", true], + ["L436", "float", true], + ["L437", "float", true], + ["L438", "float", true], + ["L439", "float", true], + ["L440", "float", true], + ["L441", "float", true], + ["L442", "float", true], + ["L443", "float", true], + ["L444", "float", true], + ["L445", "float", true], + ["L446", "float", true], + ["L447", "float", true], + ["L448", "float", true], + ["L449", "float", true], + ["L450", "float", true], + ["L451", "float", true], + ["L452", "float", true], + ["L453", "float", true], + ["L454", "float", true], + ["L455", "float", true], + ["L456", "float", true], + ["L457", "float", true], + ["L458", "float", true], + ["L459", "float", true], + ["L460", "(pointer float)", 1], + ["L461", "rgba", true], + ["L462", "uint64", true], + ["L463", "uint64", true], + ["L464", "uint64", true], + ["L465", "uint64", true], + ["L466", "uint64", true], + ["L525", "float", true], ["L526", "uint64", true], ["L527", "uint64", true], ["L528", "uint64", true], @@ -1632,11 +1726,6 @@ ["L530", "uint64", true] ], - "mother-spider": [ - ["L301", "(inline-array mother-spider-leg-info)", 8], - ["L302", "(inline-array mother-spider-thread)", 9] - ], - "target-flut": [ ["L399", "attack-info"], ["L406", "float", true], @@ -1674,8 +1763,8 @@ ["L438", "float", true], ["L439", "float", true], ["L440", "float", true], - ["L441", "float", true], - ["L442", "float", true], + ["L441", "(pointer float)", 1], + ["L442", "(pointer float)", 1], ["L443", "float", true], ["L444", "float", true], ["L445", "float", true], @@ -1850,7 +1939,7 @@ ["L414", "attack-info"], ["L415", "attack-info"], ["L416", "attack-info"], - ["L417", "attack-info"], + ["L417", "vector"], ["L418", "attack-info"], ["L419", "attack-info"], ["L420", "vector"], @@ -1878,7 +1967,8 @@ ], "collide-cache": [ - ["L304", "vector"] + ["L304", "vector"], + ["L303", "vector4w"] ], "load-boundary-data": [ @@ -1996,6 +2086,31 @@ ["L38", "vector"] ], + "depth-cue": [ + ["L17", "depth-cue-work"] + ], + + "navigate": [ + ["L402", "vector"], + ["L403", "vector"], + ["L404", "vector"], + ["L405", "vector"], + ["L406", "vector"], + ["L422", "vector"], + ["L419", "(pointer uint8)", 4], + ["L425", "float", true], + ["L426", "float", true], + ["L429", "float", true], + ["L430", "float", true], + ["L436", "float", true], + ["L438", "float", true], + ["L444", "float", true], + ["L442", "float", true], + ["L520", "vector"], + ["L522", "float", true], // TODO - meters + ["L523", "float", true] // TODO - meters + ], + "shrubbery": [ ["L133", "vu-function"] ], diff --git a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc index 8c9e844ab7..a9d510b5a8 100644 --- a/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/stack_structures.jsonc @@ -696,7 +696,7 @@ [48, "collide-tri-result"] ], - "(method 20 collide-cache)": [[16, "vector"]], + "(method 20 collide-cache)": [[16, "collide-puyp-work"]], "(method 12 wobbler)": [[16, "vector"]], @@ -1802,7 +1802,7 @@ [160, "vector"] ], - "(method 18 collide-cache)": [[16, "collide-cache-prim"]], + "(method 18 collide-cache)": [[16, "collide-puls-work"]], "kill-current-level-hint": [[16, "event-message-block"]], "(exit level-hint-sidekick)": [[16, "event-message-block"]], @@ -4139,7 +4139,7 @@ ], "(method 9 touching-list)": [ - [16, "touching-shapes-entry"] + [16, "add-prims-touching-work"] ], "(method 11 touching-prims-entry)": [ @@ -4147,7 +4147,7 @@ ], "(method 35 collide-shape)": [ - [16, "pull-rider-info"], + [16, "collide-overlap-result"], [128, "matrix"], [192, "event-message-block"], [272, "collide-overlap-result"], @@ -4196,11 +4196,11 @@ "(method 59 collide-shape-moving)": [ [16, "collide-tri-result"], - [112, "touching-shapes-entry"] + [112, "overlaps-others-params"] ], "(method 58 collide-shape-moving)": [ - [16, "touching-shapes-entry"] + [16, "overlaps-others-params"] ], "simple-collision-reaction": [ @@ -4256,16 +4256,16 @@ ], "(method 45 collide-shape)": [ - [16, "collide-work"], + [16, "collide-overlap-result"], [128, "vector"], [144, "vector"], - [160, "collide-work"], + [160, "collide-overlap-result"], [272, "vector"], [288, "vector"], - [304, "collide-work"], + [304, "collide-overlap-result"], [416, "vector"], [432, "vector"], - [448, "collide-work"], + [448, "collide-overlap-result"], [560, "vector"], [576, "vector"] ], @@ -4366,7 +4366,7 @@ "target-collision-reaction": [ [16, "vector"], [32, "vector"], - [48, "vector"], + [48, "matrix"], [112, "vector"], [128, "vector"], [144, "vector"], @@ -4415,12 +4415,12 @@ "find-ground-point": [ [16, "vector"], - [32, "collide-mesh-cache-tri"], + [32, "collide-tri-result"], [128, "bounding-box"], [160, "vector"] ], - "(method 19 collide-shape-prim-sphere)": [[16, "collide-mesh-cache-tri"]], + "(method 19 collide-shape-prim-sphere)": [[16, "collide-tri-result"]], "(method 37 collide-shape)": [[16, "vector"]], "starts": [ @@ -6017,5 +6017,341 @@ [16, "event-message-block"] ], + "(trans joint-exploder-shatter)": [ + [16, "bounding-box"] + ], + + "(method 22 joint-exploder)": [ + [16, "vector"], + [32, "collide-tri-result"] + ], + + "(enter target-tube-hit)": [ + [16, "event-message-block"] + ], + + "(event slide-control-ride slide-control)": [ + [16, "event-message-block"] + ], + + "(code target-tube-death)": [ + [16, "vector"] + ], + + "(code target-tube-hit)": [ + [16, "vector"], + [32, "vector"], + [48, "vector"], + [64, "vector"], + [80, "vector"] + ], + + "find-target-point": [ + [16, "vector"], + [32, "vector"], + [48, "vector"] + ], + + "(trans slide-control-watch slide-control)": [ + [16, "vector"], + [32, "event-message-block"] + ], + + "distance-from-tangent": [ + [16, "vector"], + [32, "vector"], + [48, "vector"] + ], + + "(method 14 collide-cache)" : [ + [16, "bounding-box"] + ], + + "(method 23 collide-shape-prim-mesh)" :[ + [16, "collide-tri-result"] + ], + + "(method 23 collide-shape-prim-sphere)" : [ + [16, "vector"], + [32, "vector"], + [48, "collide-tri-result"], + [144, "vector"], + [160, "vector"] + ], + + "(method 18 collide-shape-prim-sphere)" : [ + [16, "collide-tri-result"] + ], + "target-collision-low-coverage" : [ + [64, "collide-tri-result"], + [176, "vector"], + [192, "vector"], + [224, "vector"], + [240, "vector"], + [256, "vector"], + [288, "vector"] + ], + + "(code ogreboss-missile-idle)": [ + [16, "vector"], + [32, "vector"], + [48, "collide-tri-result"] + ], + + "(code ogreboss-missile-seek)": [ + [16, "vector"], + [32, "vector"], + [48, "collide-tri-result"] + ], + + "ogreboss-rock-explosion-effect": [ + [16, "event-message-block"] + ], + + "(code ogreboss-dead)": [ + [16, "event-message-block"], + [96, "vector"] + ], + + "ogreboss-shoot-boulder": [ + [16, "ogreboss-missile-init-data"], + [48, "vector"] + ], + + "(code ogreboss-die)": [ + [16, "event-message-block"] + ], + + "(code ogreboss-stage3-hit)": [ + [16, "event-message-block"] + ], + + "ogreboss-trigger-steps": [ + [16, "event-message-block"] + ], + + "(code ogreboss-stage3-throw)": [ + [16, "event-message-block"] + ], + + "ogreboss-attack-event-handler": [ + [16, "event-message-block"] + ], + + "(exit ogreboss-stage3-shuffle)": [ + [16, "event-message-block"] + ], + + "(trans ogreboss-stage3-shuffle)": [ + [16, "event-message-block"] + ], + + "ogreboss-submerge": [ + [16, "event-message-block"] + ], + + "ogreboss-post": [ + [16, "event-message-block"] + ], + + "ogreboss-emerge": [ + [16, "event-message-block"] + ], + + "(code ogreboss-intro)": [ + [16, "event-message-block"] + ], + + "ogreboss-bounce-boulder-event-handler": [ + [16, "event-message-block"] + ], + + "(enter ogreboss-idle)": [ + [16, "event-message-block"] + ], + + "ogreboss-super-boulder-event-handler": [ + [16, "event-message-block"] + ], + + "(code ogreboss-super-boulder-roll)": [ + [16, "event-message-block"] + ], + + "(code ogreboss-missile-impact)": [ + [16, "overlaps-others-params"] + ], + + "(event ogreboss-missile-impact)": [ + [16, "event-message-block"], + [96, "vector"], + [112, "vector"], + [128, "vector"], + [224, "vector"] + ], + + "(method 18 collide-edge-work)": [ + [16, "pbhp-stack-vars"] + ], + + "(method 9 edge-grab-info)": [ + [16, "collide-using-spheres-params"], + [48, "event-message-block"] + ], + + "(method 20 nav-mesh)": [ + [16, "vector"], + [32, "vector"] + ], + + "nav-ray-test": [ + [16, "vector"], + [32, "vector"] + ], + + "circle-tangent-directions": [ + [16, "vector"], + [32, "vector"], + [48, "vector"], + [64, "vector"] + ], + + "(method 18 nav-control)": [ + [16, "vector"] + ], + "(method 9 nav-control)": [ + [16, "vector"], + [32, "vector"], + [48, "vector"], + [64, "vector"], + [80, "vector"], + [96, "vector"], + [112, "vector"], + [128, "vector"], + [144, "vector"], + [160, "vector"], + [176, "vector"] + ], + "(method 11 nav-control)": [ + [16, "vector"], + [32, "nav-gap-info"], + [64, "event-message-block"] + ], + "(method 12 nav-control)": [ + [16, "vector"] + ], + "(method 13 nav-mesh)": [ + [16, "vector"] + ], + "(method 18 nav-mesh)": [ + [16, "vector"] + ], + "(method 24 nav-control)": [ + [16, "vector"] + ], + "(method 24 nav-mesh)": [ + [16, "vector"], + [32, "vector"] + ], + "(method 22 nav-control)": [ + [16, "vector"] + ], + "(method 17 nav-control)": [ + [16, "vector"] + ], + "(method 19 nav-control)": [ + [16, "vector"], + [32, "vector"] + ], + "(method 17 nav-mesh)": [ + [16, "vector"], + [32, "vector"], + [48, ["array", "int8", 256]] + ], + "(method 25 nav-mesh)": [ + [16, "vector"], + [32, "matrix"] + ], + "debug-nav-validate-current-poly": [ + [16, "vector"] + ], + "(method 13 nav-control)": [ + [16, "vector"], + [32, "vector"], + [48, "vector"], + [64, "nav-route-portal"], // nav-poly | nav-route-portal | nav-route-portal + [112, "vector"], + [128, "clip-travel-vector-to-mesh-return-info"], + [288, "vector"] + ], + + "(method 28 nav-mesh)": [ + [16, ["inline-array", "nav-vertex", 3]] + ], + + "choose-travel-portal-vertex": [ + [16, "nav-route-portal"] + ], + + "(method 33 nav-control)": [ + [16, "event-message-block"] + ], + + "(method 27 nav-control)": [ + [16, "nav-ray"] + ], + "(method 16 nav-mesh)": [ + [16, "nav-ray"] + ], + + "(method 29 nav-mesh)": [ + [16, ["inline-array", "nav-vertex", 6]] + ], + + "find-closest-circle-ray-intersection": [ + [16, "vector"] + ], + + "(method 20 nav-control)": [ + [16, "vector"] + ], + "(method 21 nav-control)": [ + [16, "vector"] + ], + "(method 23 nav-control)": [ + [16, "vector"], + [32, "vector"], + [48, "vector"] + ], + "(method 16 nav-control)": [ + [16, "vector"] + ], + "(method 25 nav-control)": [ + [16, "vector"] + ], + "(method 28 nav-control)": [ + [16, "vector"] + ], + + "(method 35 nav-control)": [ + [16, "vector"] + ], + + "(method 15 nav-mesh)": [ + [16, "nav-ray"] + ], + + "nav-ray-test-local?": [ + [16, "nav-ray"] + ], + + "find-adjacent-bounds": [ + [16, "vector"] + ], + + "(method 32 nav-control)": [ + [16, "nav-control-cfs-work"] + ], + "placeholder-do-not-add-below!": [] } diff --git a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc index cfd85de6c3..911a13f61e 100644 --- a/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/type_casts.jsonc @@ -811,30 +811,10 @@ [[115, 154], "s3", "continue-point"] ], "(method 20 level)": [[[43, 45], "s3", "ramdisk-rpc-fill"]], - "(anon-function 29 process-drawable)": [[[0, 999], "s6", "process-drawable"]], - "ja-done?": [[[0, 999], "s6", "process-drawable"]], - "ja-min?": [[[0, 999], "s6", "process-drawable"]], - "ja-max?": [[[0, 999], "s6", "process-drawable"]], - "ja-num-frames": [[[0, 999], "s6", "process-drawable"]], - "ja-frame-num": [[[0, 999], "s6", "process-drawable"]], - "ja-aframe-num": [[[0, 999], "s6", "process-drawable"]], - "ja-aframe": [[[0, 999], "s6", "process-drawable"]], - "ja-step": [[[0, 999], "s6", "process-drawable"]], - "ja-channel-set!": [[[0, 999], "s6", "process-drawable"]], - "ja-channel-push!": [[[0, 999], "s6", "process-drawable"]], - "ja-group-size": [[[0, 999], "s6", "process-drawable"]], - "ja-eval": [[[0, 999], "s6", "process-drawable"]], - "ja-blend-eval": [[[0, 999], "s6", "process-drawable"]], "ja-post": [ - [[0, 999], "s6", "process-drawable"], [54, "a1", "process"] ], - "transform-post": [[[0, 999], "s6", "process-drawable"]], - "rider-trans": [[[0, 999], "s6", "process-drawable"]], - "rider-post": [[[0, 999], "s6", "process-drawable"]], - "pusher-post": [[[0, 999], "s6", "process-drawable"]], - "process-drawable-delay-player": [[[0, 999], "s6", "process-drawable"]], "upload-generic-shrub": [ [[3, 13], "t0", "dma-packet"], @@ -1494,45 +1474,34 @@ ], "cam-standard-event-handler": [ - [[0, 999], "s6", "camera-slave"], [[16, 30], "s5", "state"], [41, "a0", "vector"], [[5, 8], "t9", "(function object)"], [[19, 22], "t9", "(function object)"], [[30, 32], "t9", "(function object)"] ], - "cam-curve-pos": [[[0, 224], "s6", "camera-slave"]], - "cam-combiner-init": [[[0, 999], "s6", "camera-combiner"]], - - "(code cam-combiner-active)": [[[0, 999], "s6", "camera-combiner"]], "(event cam-combiner-active)": [ [10, "a0", "vector"], - [[0, 20], "s6", "camera-slave"], - [[20, 231], "s6", "camera-combiner"], [[99, 127], "gp", "camera-slave"], [[187, 231], "gp", "camera-slave"] ], - "cam-master-init": [[[0, 999], "s6", "camera-master"]], - "cam-curve-setup": [[[0, 82], "s6", "camera-slave"]], "(method 15 tracking-spline)": [ [[57, 59], "a2", "vector"], [[57, 59], "a3", "vector"] ], + "(method 16 tracking-spline)": [ [[40, 42], "a0", "vector"], [[40, 42], "a1", "vector"] ], - "cam-slave-init-vars": [[[0, 999], "s6", "camera-slave"]], - "cam-slave-get-vector-with-offset": [[[52, 65], "s3", "vector"]], "cam-slave-go": [[[3, 6], "t9", "(function object)"]], "cam-slave-init": [ - [[0, 999], "s6", "camera-slave"], [[47, 50], "t9", "(function object object)"], [[54, 58], "t9", "(function object object)"] ], @@ -2314,6 +2283,8 @@ "(method 14 level-group)": [ [[54, 164], "s1", "process-drawable"], + [[107, 127], "s0", "(pointer int32)"], + [[153, 162], "v0", "symbol"], [[319, 342], "s0", "process-drawable"], [368, "v1", "(pointer process-drawable)"], [[384, 494], "s5", "process-drawable"] @@ -2327,8 +2298,6 @@ "(method 27 entity-ambient)": [[[15, 250], "s5", "symbol"]], - "cam-master-effect": [[[0, 999], "s6", "camera-master"]], - "birth-func-vector-orient": [[[7, 24], "s3", "sprite-vec-data-2d"]], "process-drawable-burn-effect": [ @@ -4002,23 +3971,26 @@ "(method 32 sage-finalboss)": [ [[241, 245], "v1", "manipy"], - [[309, 313], "v1", "manipy"] + [[309, 313], "v1", "manipy"], + [313, "v1", "silodoor"] ], "(trans play-anim sage-finalboss)": [ - [[179, 183], "a0", "manipy"], - [[216, 220], "a0", "manipy"], - [[295, 299], "a1", "manipy"], - [[334, 338], "a1", "manipy"], - [[371, 375], "a1", "manipy"], - [391, "v0", "final-door"], - [396, "v0", "final-door"] - ], - - "(method 7 sage-finalboss)": [ - [2, "v1", "(inline-array sage-finalboss-particle)"], - [6, "v1", "(inline-array sage-finalboss-particle)"], - [10, "v1", "(inline-array sage-finalboss-particle)"] + [186, "v1", "process-drawable"], + [223, "v1", "process-drawable"], + [300, "v1", "process-drawable"], + [339, "v1", "process-drawable"], + [376, "v1", "process-drawable"], + [399, "gp", "final-door"], + [401, "a0", "final-door"] + // [[179, 183], "a0", "manipy"], + // [[182, 187], "v1", "manipy"], + // [[216, 220], "a0", "manipy"], + // [[295, 299], "a1", "manipy"], + // [[334, 338], "a1", "manipy"], + // [[371, 375], "a1", "manipy"], + // [391, "v0", "final-door"], + // [396, "v0", "final-door"] ], "(trans fisher-done)": [[[41, 46], "v1", "dma-packet"]], @@ -4222,10 +4194,6 @@ [63, "t9", "(function cspace basic basic int)"] ], - "process-grab?": [ - [18, "s6", "camera-tracker"] - ], - "joint-control-copy!": [ [8, "a0", "pointer"], [8, "a2", "pointer"] @@ -5655,19 +5623,19 @@ ], "(method 14 touching-list)": [ - [5, "s5", "touching-shapes-entry"], - [10, "s5", "touching-shapes-entry"] + [[0,11], "s5", "touching-shapes-entry"] ], "(method 13 touching-list)": [ - [5, "v0", "touching-shapes-entry"], - [10, "v0", "touching-shapes-entry"], - [17, "v0", "touching-shapes-entry"], - [26, "v0", "touching-shapes-entry"], - [46, "v0", "touching-shapes-entry"], - [47, "v0", "touching-shapes-entry"], - [48, "v0", "touching-shapes-entry"], - [50, "v0", "touching-shapes-entry"] + [[0, 51], "v0", "touching-shapes-entry"] + // [5, "v0", "touching-shapes-entry"], + // [10, "v0", "touching-shapes-entry"], + // [17, "v0", "touching-shapes-entry"], + // [26, "v0", "touching-shapes-entry"], + // [46, "v0", "touching-shapes-entry"], + // [47, "v0", "touching-shapes-entry"], + // [48, "v0", "touching-shapes-entry"], + // [50, "v0", "touching-shapes-entry"] ], "(method 11 touching-list)": [ @@ -5729,17 +5697,15 @@ ], "(method 28 collide-shape-prim-mesh)": [ - [27, "s4", "collide-shape-prim-group"] + [[22,45], "s4", "(array collide-mesh)"] ], "(method 53 collide-shape)": [ - [26, "a1", "collide-shape-prim-group"], - [36, "v1", "collide-shape-prim-group"] + [[24, 40], "v1", "collide-shape-prim-group"] ], "(method 54 collide-shape)": [ - [22, "a1", "collide-shape-prim-group"], - [29, "v1", "collide-shape-prim-group"] + [[18, 33], "v1", "collide-shape-prim-group"] ], "(method 45 collide-shape)": [ @@ -5772,16 +5738,14 @@ ], "(method 9 collide-edge-work)": [ - [10, "s3", "collide-edge-edge"], - [16, "s4", "collide-edge-hold-item"], - [46, "s4", "(inline-array collide-edge-hold-item)"], - [48, "s3", "(inline-array collide-edge-edge)"] + [[5, 52], "s3", "collide-edge-edge"], + [[5, 52], "s4", "collide-edge-hold-item"] ], "(method 19 collide-edge-work)": [ [150, "a1", "int"], - [150, "v1", "int"], - [[149, 162], "a0", "collide-shape-prim-group"] + [150, "v1", "int"] + //[[149, 162], "a0", "collide-shape-prim-group"] ], "collide-probe-make-list": [ @@ -5829,16 +5793,13 @@ ], "(method 9 collide-cache)": [ - [5, "gp", "collide-cache-tri"], - [19, "gp", "collide-cache-tri"], - [20, "gp", "collide-cache-tri"], - [21, "gp", "collide-cache-tri"], - [23, "gp", "(inline-array collide-cache-tri)"], - [33, "gp", "collide-cache-prim"], + [[1,29], "gp", "collide-cache-tri"], + [[29,56], "gp", "collide-cache-prim"], [35, "gp", "collide-cache-prim"], [50, "gp", "collide-cache-prim"], [51, "gp", "collide-cache-prim"], - [55, "gp", "(inline-array collide-cache-prim)"] + [55, "gp", "collide-cache-prim"], + [36, "v1", "collide-shape-prim-sphere"] ], "(method 9 collide-mesh)": [ @@ -5847,7 +5808,8 @@ ], "(method 22 collide-shape-prim-mesh)": [ - [10, "s4", "collide-shape-prim-group"] + [10, "s4", "collide-shape-prim-group"], + [41, "s4", "collide-shape-prim-group"] ], "(method 44 collide-shape)": [ @@ -7393,6 +7355,473 @@ [31, "s4", "energyarm"] ], + "(method 0 joint-exploder-tuning)": [ + [[6, 50], "v0", "joint-exploder-tuning"] + ], + + "(method 23 joint-exploder)": [ + [[12, 102], "s3", "joint-exploder-joint"], + [[144, 146], "v1", "joint-exploder-list"], + [148, "v1", "matrix"], + [152, "v1", "matrix"] + ], + + "(method 20 joint-exploder)": [ + [[8, 10], "a3", "joint-exploder-joint"], + [15, "v1", "joint-exploder-joint"] + ], + + "(method 27 joint-exploder)": [ + [41, "s0", "joint-exploder-joint"], + [90, "s0", "joint-exploder-joint"], + [139, "s0", "joint-exploder-joint"] + ], + + "(method 25 joint-exploder)": [ + [[16, 54], "s2", "joint-exploder-joint"] + ], + + "(method 22 joint-exploder)": [ + [[18, 78], "s5", "joint-exploder-joint"] + ], + + "joint-exploder-joint-callback": [ + [[10, 18], "v1", "joint-exploder-joint"] + ], + + "(method 24 joint-exploder)": [ + [[12, 19], "v1", "joint-exploder-joint"] + ], + + "(method 26 joint-exploder)": [ + [[5, 8], "a2", "joint-exploder-joint"], + [18, "v1", "joint-exploder-joint"], + [28, "v1", "joint-exploder-joint"] + ], + + "racer-effects": [ + [739, "v0", "sound-rpc-set-param"] + ], + + "(code target-tube)": [ + [31, "v1", "art-joint-anim"] + ], + + "(event slide-control-ride slide-control)": [ + [24, "gp", "process-drawable"], + [31, "v1", "vector"], + [35, "v1", "vector"], + [39, "v1", "vector"] + ], + + "(code target-tube-start)": [ + [110, "v1", "float"] + ], + + "depth-cue-set-stencil": [ + [[1, 7], "t1", "dma-packet"], + [[10, 16], "t1", "gs-gif-tag"], + [27, "t1", "(pointer gs-xy-offset)"], + [29, "t1", "(pointer gs-reg64)"], + [34, "t1", "(pointer gs-frame)"], + [36, "t1", "(pointer gs-reg64)"], + [38, "t1", "(pointer gs-test)"], + [40, "t1", "(pointer gs-reg64)"], + [[43, 53], "a3", "(inline-array vector4w)"], + [[52, 80], "v0", "(inline-array vector4w)"] + ], + + "depth-cue-draw-front": [ + [[26, 32], "t6", "dma-packet"], + [[33, 41], "t6", "gs-gif-tag"], + [49, "t6", "(pointer gs-xy-offset)"], + [51, "t6", "(pointer gs-reg64)"], + [56, "t6", "(pointer gs-frame)"], + [58, "t6", "(pointer gs-reg64)"], + [64, "t6", "(pointer gs-tex0)"], + [66, "t6", "(pointer gs-reg64)"], + [68, "t6", "(pointer gs-test)"], + [70, "t6", "(pointer gs-reg64)"], + [71, "t6", "(pointer gs-alpha)"], + [73, "t6", "(pointer gs-reg64)"], + [[76, 109], "t5", "(inline-array vector4w)"], + [112, "t5", "depth-cue-work"], + [[115, 121], "t6", "dma-packet"], + [[122, 130], "t6", "gs-gif-tag"], + [137, "t6", "(pointer gs-xy-offset)"], + [139, "t6", "(pointer gs-reg64)"], + [144, "t6", "(pointer gs-frame)"], + [146, "t6", "(pointer gs-reg64)"], + [148, "t6", "(pointer gs-texa)"], + [150, "t6", "(pointer gs-reg64)"], + [156, "t6", "(pointer gs-tex0)"], + [158, "t6", "(pointer gs-reg64)"], + [160, "t6", "(pointer gs-alpha)"], + [162, "t6", "(pointer gs-reg64)"], + [[165, 190], "t5", "(inline-array vector4w)"], + [[191, 201], "t5", "vector4w"], + [201, "t5", "depth-cue-work"] + ], + + "depth-cue-draw-depth": [ + [[26, 32], "t6", "dma-packet"], + [[33, 41], "t6", "gs-gif-tag"], + [49, "t6", "(pointer gs-xy-offset)"], + [51, "t6", "(pointer gs-reg64)"], + [56, "t6", "(pointer gs-frame)"], + [58, "t6", "(pointer gs-reg64)"], + [64, "t6", "(pointer gs-tex0)"], + [66, "t6", "(pointer gs-reg64)"], + [68, "t6", "(pointer gs-test)"], + [70, "t6", "(pointer gs-reg64)"], + [[73, 106], "t5", "(inline-array vector4w)"], + [109, "t5", "depth-cue-work"], + [[112, 118], "t6", "dma-packet"], + [[121, 127], "t6", "gs-gif-tag"], + [134, "t6", "(pointer gs-xy-offset)"], + [136, "t6", "(pointer gs-reg64)"], + [141, "t6", "(pointer gs-frame)"], + [143, "t6", "(pointer gs-reg64)"], + [149, "t6", "(pointer gs-tex0)"], + [151, "t6", "(pointer gs-reg64)"], + [153, "t6", "(pointer gs-test)"], + [155, "t6", "(pointer gs-reg64)"], + [[158, 183], "t5", "(inline-array vector4w)"], + [[184, 193], "t5", "vector4w"], + [194, "t5", "depth-cue-work"] + ], + + "depth-cue": [ + [[22, 28], "a2", "dma-packet"], + [[31, 37], "a2", "gs-gif-tag"], + [42, "a2", "(pointer gs-test)"], + [44, "a2", "(pointer gs-reg64)"], + [46, "a2", "(pointer gs-zbuf)"], + [48, "a2", "(pointer gs-reg64)"], + [50, "a2", "(pointer gs-reg64)"], + [52, "a2", "(pointer gs-reg64)"], + [53, "a2", "(pointer gs-tex1)"], + [55, "a2", "(pointer gs-reg64)"], + [62, "a2", "(pointer gs-clamp)"], + [64, "a2", "(pointer gs-reg64)"], + [66, "a2", "(pointer gs-reg64)"], + [68, "a2", "(pointer gs-reg64)"], + [[94, 100], "a0", "dma-packet"], + [[103, 109], "a0", "gs-gif-tag"], + [120, "a0", "(pointer gs-xy-offset)"], + [122, "a0", "(pointer gs-reg64)"], + [127, "a0", "(pointer gs-frame)"], + [129, "a0", "(pointer gs-reg64)"], + [[133, 138], "v1", "dma-packet"] + ], + + "collide-probe-collide-fragment-tree-make-list": [ + [5, "v1", "drawable-inline-array-node"] + ], + + "collide-probe-instance-tie-tree-make-list": [ + [[5,7], "v1", "drawable-inline-array-node"], + [[18,20], "v1", "drawable-inline-array-instance-tie"] + ], + + "collide-upload-vu0": [ + [16, "a0", "dma-packet"], + [17, "a0", "(pointer uint64)"] + ], + + "collide-probe-make-list": [ + [[20, 22], "v1", "drawable-inline-array-node"], + [[31, 33], "v1", "drawable-inline-array-instance-tie"], + [[47, 49], "v1", "drawable-inline-array-node"] + ], + + "(method 21 collide-cache)": [ + [114, "a0", "(pointer int32)"], + [156, "t0", "(pointer int32)"], + [190, "v1", "(pointer int32)"], + [147, "v1", "collide-list-item"], + [148, "v1", "collide-list-item"], + [[91, 95], "v1", "dma-packet"], + [[112, 141], "v1", "dma-bank-spr"], + [[154, 188], "a2", "dma-bank-spr"], + [[217, 227], "s3", "collide-list-item"] + ], + + "(method 23 collide-shape-prim-sphere)": [ + [[74,114], "s4", "collide-shape-prim-mesh"] + ], + + "(method 13 collide-mesh)" : [ + [[0, 60], "a3", "(inline-array vector)"], + [[61, 123], "v1", "collide-mesh-tri"] + ], + + "(method 20 collide-shape-prim-group)": [ + [5, "gp", "pointer"], + [6, "v1", "(pointer collide-shape-prim)"], + [[7,14], "a0", "collide-shape-prim"], + [32, "gp", "pointer"], + [33, "v1", "(pointer collide-shape-prim)"], + [[34,40], "a0", "collide-shape-prim"], + [[40, 46], "a0", "collide-shape-prim-group"] + ], + + "(method 29 collide-shape-prim-group)" : [ + [5, "gp", "pointer"], + [6, "v1", "(pointer collide-shape-prim)"], + [[13, 19], "a0", "collide-shape-prim-group"] + ], + + "(method 40 collide-shape)" : [ + [21, "a0", "connection"], + [[22,40], "a0", "collide-shape-moving"], + [85, "a0", "connection"], + [[86, 104], "a0", "collide-shape-moving"], + [147, "a0", "connection"], + [[148, 166], "a0", "collide-shape-moving"], + [209, "a0", "connection"], + [[210, 228], "a0", "collide-shape-moving"] + ], + + "(method 15 collide-shape-prim-sphere)" : [ + [[16, 55], "gp", "collide-shape-prim-mesh"] + ], + + "(method 25 collide-cache)" : [ + [[83, 104], "a2", "(inline-array collide-cache-tri)"] + ], + + "(method 22 collide-cache)" : [ + [14, "v1", "connection"], + [[15,31], "v1", "collide-shape"], + [74, "v1", "connection"], + [[75, 91], "v1", "collide-shape"], + [130, "v1", "connection"], + [[131, 148], "v1", "collide-shape"], + [187, "v1", "connection"], + [[188, 205], "v1", "collide-shape"] + ], + + "(method 12 collide-shape-prim-sphere)" : [ + [[13, 23], "t0", "collide-cache-prim"] + ], + + "(method 24 collide-cache)" : [ + [14, "v1", "connection"], + [[15,31], "v1", "collide-shape"], + [74, "v1", "connection"], + [[75, 91], "v1", "collide-shape"], + [130, "v1", "connection"], + [[131, 148], "v1", "collide-shape"], + [187, "v1", "connection"], + [[188, 205], "v1", "collide-shape"] + ], + + "(method 14 collide-shape-prim-sphere)" : [ + [[11, 23], "t0", "collide-cache-prim"] + ], + + "(method 23 collide-cache)" : [ + [20, "v1", "connection"], + [[21,43], "v1", "collide-shape"], + [86, "v1", "connection"], + [[87,109], "v1", "collide-shape"], + [148, "v1", "connection"], + [[149, 174], "v1", "collide-shape"], + [211, "v1", "connection"], + [[212, 235], "v1", "collide-shape"] + ], + + "(method 13 collide-shape-prim-sphere)" : [ + [[11, 23], "t0", "collide-cache-prim"] + ], + + "(method 31 collide-cache)" : [ + [22, "v1", "collide-shape-prim-sphere"] + ], + + "(method 19 collide-cache)" : [ + [[52, 94], "s4", "collide-cache-prim"], + [[1, 100], "s5", "collide-puss-work"] + ], + + "ogreboss-rock-explosion-effect": [ + [83, "v1", "manipy"] + ], + + "ogreboss-missile-scale-explosion": [ + [11, "gp", "process-drawable"], + [22, "gp", "process-drawable"] + ], + + "(event ogreboss-missile-impact)": [ + [76, "t1", "target"] + ], + + "(code ogreboss-super-boulder-throw)": [ + [16, "v1", "art-joint-anim"] + ], + + "ogreboss-emerge": [ + [47, "v1", "art-joint-anim"] + ], + + "(code ogreboss-die)": [ + [35, "v1", "art-joint-anim"] + ], + + "ogreboss-super-boulder-play-hit-anim": [ + [15, "v1", "art-joint-anim"] + ], + + "(code ogreboss-stage3-hit)": [ + [47, "v1", "art-joint-anim"] + ], + + "(code ogreboss-stage3-throw)": [ + [33, "v1", "art-joint-anim"], + [89, "v1", "art-joint-anim"] + ], + + "ogreboss-shoot-boulder": [ + [41, "a1", "process-drawable"] + ], + + "(method 7 ogreboss-super-boulder)": [ + [14, "t9", "(function process-drawable int process-drawable)"] + ], + + "ogreboss-bounce-boulder-init-by-other": [ + [112, "v1", "float"] + ], + + "(code ogreboss-stage3-shuffle)": [ + [33, "v1", "art-joint-anim"], + [121, "v1", "art-joint-anim"], + [177, "v1", "art-joint-anim"], + [247, "v1", "art-joint-anim"], + [299, "v1", "art-joint-anim"], + [355, "v1", "art-joint-anim"], + [425, "v1", "art-joint-anim"] + ], + + "(code ogreboss-stage2)": [ + [26, "v1", "art-joint-anim"], + [104, "v1", "art-joint-anim"], + [158, "v1", "art-joint-anim"] + ], + + "ogreboss-update-super-boulder": [ + [12, "a1", "ogreboss-super-boulder"] + ], + + "(trans ogreboss-stage3-shuffle)": [ + [13, "v1", "ogreboss-super-boulder"] + ], + + "(code ogreboss-stage1)": [ + [36, "v1", "art-joint-anim"], + [93, "v1", "art-joint-anim"], + [172, "v1", "art-joint-anim"], + [273, "v1", "art-joint-anim"], + [329, "v1", "art-joint-anim"], + [386, "v1", "art-joint-anim"] + ], + + "(code ogreboss-bounce-boulder-idle)": [ + [81, "v1", "art-joint-anim"] + ], + + "ogreboss-idle-loop": [ + [145, "v1", "art-joint-anim"], + [206, "v1", "art-joint-anim"], + [261, "v1", "art-joint-anim"] + ], + + "(code ogreboss-super-boulder-roll)": [ + [123, "v1", "art-joint-anim"] + ], + + "(code ogreboss-intro)": [ + [92, "v1", "art-joint-anim"] + ], + + "ogreboss-submerge": [ + [130, "v1", "art-joint-anim"] + ], + + "ogreboss-pick-target": [ + [31, "s3", "process-drawable"] + ], + + "(method 29 progress)": [ + [290, "a0", "(pointer symbol)"], + [299, "v1", "(pointer symbol)"], + [308, "a0", "(pointer symbol)"], + [317, "v1", "(pointer symbol)"], + [326, "a0", "(pointer symbol)"], + [589, "a0", "(pointer symbol)"], + [599, "v1", "(pointer symbol)"], + [608, "a1", "(pointer symbol)"], + [617, "v1", "(pointer symbol)"], + [626, "a1", "(pointer symbol)"], + [894, "a0", "(pointer symbol)"], + [921, "a0", "(pointer symbol)"] + ], + + "(method 9 edge-grab-info)": [ + [23, "a0", "int"], + [[24,31], "s5", "collide-shape-prim"], + [29, "a0", "process-drawable"], + [156, "s5", "collide-shape-prim"] + ], + "circle-triangle-intersection-proc?": [ + [[113, 134], "v1", "vector"] + ], + + "(method 28 nav-control)": [ + [170, "v1", "connection"], + [[170, 245], "s0", "collide-shape"] + ], + + "(method 29 nav-mesh)": [ + [38, "v1", "int"], + [40, "v1", "int"], + [41, "v1", "int"], + [64, "f1", "float"], + [63, "v1", "float"] + ], + + "nav-mesh-update-route-table": [ + [19, "a3", "(pointer uint8)"], + [24, "a0", "(pointer uint8)"] + ], + + "nav-mesh-lookup-route": [ + [6, "a0", "(pointer uint8)"] + ], + + "(method 11 nav-mesh)": [ + [12, "a2", "(pointer uint8)"] + ], + + "(method 12 nav-mesh)": [ + [13, "a2", "(pointer uint8)"] + ], + + "recursive-inside-poly": [ + [16, "a0", "(pointer nav-node)"], + [29, "v1", "(pointer nav-node)"] + ], + + "entity-nav-login": [ + ["_stack_", 16, "res-tag"] + ], + + "(method 18 nav-mesh)": [ + [34, "v1", "nav-poly"] + ], + "test-func": [ [7, "f1", "float"] ], diff --git a/decompiler/config/jak1_ntsc_black_label/var_names.jsonc b/decompiler/config/jak1_ntsc_black_label/var_names.jsonc index e85211bf95..fa2f5e6ced 100644 --- a/decompiler/config/jak1_ntsc_black_label/var_names.jsonc +++ b/decompiler/config/jak1_ntsc_black_label/var_names.jsonc @@ -3355,7 +3355,7 @@ "(method 18 bsp-header)": { "vars": { - "a2-0": "existing-actor-count", + "a2-0": "actor-count", "s4-0": "birth-idx", "a0-4": "idx-to-birth", "v1-25": "actor-to-birth", @@ -3530,7 +3530,9 @@ "(method 14 level-group)": { "vars": { - "s1-1": ["s1-1", "process-drawable"] + "s0-1": ["s0-1", "(pointer int32)"], + "s1-1": ["s1-1", "process-drawable"], + "v0-10": ["v0-10", "symbol"] } }, @@ -3607,12 +3609,6 @@ } }, - "(method 7 sage-finalboss)": { - "vars": { - "v1-0": ["v1-0", "(inline-array sage-finalboss-particle)"] - } - }, - "(code robotboss-white-eco-movie)": { "vars": { "gp-1": ["gp-1", "handle"] @@ -3936,5 +3932,45 @@ } }, + "(method 13 touching-list)": { + "vars": { + "v0-0": ["v0-0", "touching-shapes-entry"] + } + }, + + "(method 11 touching-list)": { + "vars": { + "s5-0": ["s5-0", "touching-shapes-entry"] + } + }, + + "recursive-inside-poly": { + "vars": { + "a1-2": ["a1-2", "nav-node"] + } + }, + + "vu-point-triangle-intersection?": { + "vars": { + "v1-0": ["v1-0", "int"], + "a0-1": ["a0-1", "int"], + "a1-1": ["a1-1", "int"] + } + }, + + "point-inside-poly?": { + "vars": { + "v1-6": ["v1-6", "int"], + "a0-3": ["a0-3", "int"], + "a1-6": ["a1-6", "int"] + } + }, + + "(method 29 nav-mesh)": { + "vars": { + "v1-10": ["v1-10", "int"] + } + }, + "aaaaaaaaaaaaaaaaaaaaaaa": {} } diff --git a/decompiler/data/LinkedWordReader.h b/decompiler/data/LinkedWordReader.h index 6fadcee561..88df49ce92 100644 --- a/decompiler/data/LinkedWordReader.h +++ b/decompiler/data/LinkedWordReader.h @@ -1,11 +1,11 @@ #pragma once -#include "common/util/assert.h" #include #include #include #include #include "common/common_types.h" #include "decompiler/ObjectFile/LinkedWord.h" +#include "common/util/assert.h" namespace decompiler { class LinkedWordReader { @@ -41,4 +41,4 @@ class LinkedWordReader { const std::vector* m_words = nullptr; u32 m_offset = 0; }; -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/data/StrFileReader.cpp b/decompiler/data/StrFileReader.cpp index e90c5beb05..3bbfd07eb0 100644 --- a/decompiler/data/StrFileReader.cpp +++ b/decompiler/data/StrFileReader.cpp @@ -3,12 +3,12 @@ * Utility class to read a .STR file and extract the full file name. */ -#include "common/util/assert.h" #include #include "common/util/FileUtil.h" #include "game/common/overlord_common.h" #include "game/common/str_rpc_types.h" #include "StrFileReader.h" +#include "common/util/assert.h" namespace decompiler { StrFileReader::StrFileReader(const std::string& file_path) { @@ -180,4 +180,4 @@ std::string StrFileReader::get_full_name(const std::string& short_name) const { return result; } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/data/TextureDB.cpp b/decompiler/data/TextureDB.cpp index 5e69b5050f..6cda1fa408 100644 --- a/decompiler/data/TextureDB.cpp +++ b/decompiler/data/TextureDB.cpp @@ -1,7 +1,7 @@ #include "TextureDB.h" -#include "common/util/assert.h" #include "third-party/fmt/core.h" +#include "common/util/assert.h" namespace decompiler { @@ -37,4 +37,4 @@ void TextureDB::add_texture(u32 tpage, } } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/data/game_text.cpp b/decompiler/data/game_text.cpp index 2b0bcebf2e..2ef704be97 100644 --- a/decompiler/data/game_text.cpp +++ b/decompiler/data/game_text.cpp @@ -107,7 +107,7 @@ GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version) auto string_start = (text_label.offset / 4) - 1; // 8 for type tag and length fields, 1 for null char. for (int j = 0, m = align16(8 + 1 + (int)text.length()) / 4; - j < m && string_start + j < read_words.size(); j++) { + j < m && string_start + j < (int)read_words.size(); j++) { read_words.at(string_start + j)++; } } diff --git a/decompiler/data/tpage.cpp b/decompiler/data/tpage.cpp index 70b8e5b3fa..21523e5cf0 100644 --- a/decompiler/data/tpage.cpp +++ b/decompiler/data/tpage.cpp @@ -14,7 +14,7 @@ * check duplicate names */ -#include +#include "common/util/FileUtil.h" #include "tpage.h" #include "common/versions.h" #include "decompiler/ObjectFile/ObjectFileDB.h" @@ -703,4 +703,4 @@ TPageResultStats process_tpage(ObjectFileData& data, TextureDB& texture_db) { } return stats; } -} // namespace decompiler \ No newline at end of file +} // namespace decompiler diff --git a/decompiler/level_extractor/BspHeader.cpp b/decompiler/level_extractor/BspHeader.cpp index f11c326e35..56704afde0 100644 --- a/decompiler/level_extractor/BspHeader.cpp +++ b/decompiler/level_extractor/BspHeader.cpp @@ -1041,7 +1041,7 @@ void ProxyPrototypeArrayTie::read_from_file(TypedRef ref, prototype_array_tie.read_from_file( get_and_check_ref_to_basic(ref, "prototype-array-tie", "prototype-array-tie", dts), dts, stats); - // TODO wind + wind_vectors = deref_label(get_field_ref(ref, "wind-vectors", dts)); } std::string ProxyPrototypeArrayTie::print(const PrintSettings& settings, int indent) const { diff --git a/decompiler/level_extractor/BspHeader.h b/decompiler/level_extractor/BspHeader.h index 6d40bf572e..6ee2de7e7b 100644 --- a/decompiler/level_extractor/BspHeader.h +++ b/decompiler/level_extractor/BspHeader.h @@ -352,7 +352,7 @@ struct ProxyPrototypeArrayTie { std::string print(const PrintSettings& settings, int indent) const; PrototypeArrayTie prototype_array_tie; - // todo wind vectors. + Ref wind_vectors; }; struct DrawableTreeInstanceTie : public DrawableTree { diff --git a/decompiler/level_extractor/extract_level.cpp b/decompiler/level_extractor/extract_level.cpp index 7a170910ec..113aae95c4 100644 --- a/decompiler/level_extractor/extract_level.cpp +++ b/decompiler/level_extractor/extract_level.cpp @@ -4,6 +4,7 @@ #include "decompiler/level_extractor/BspHeader.h" #include "decompiler/level_extractor/extract_tfrag.h" #include "decompiler/level_extractor/extract_tie.h" +#include "common/util/compress.h" #include "common/util/FileUtil.h" namespace decompiler { @@ -107,8 +108,12 @@ void extract_from_level(ObjectFileDB& db, Serializer ser; tfrag_level.serialize(ser); + auto compressed = + compression::compress_zstd(ser.get_save_result().first, ser.get_save_result().second); + fmt::print("compressed: {} -> {} ({:.2f}%)\n", ser.get_save_result().second, compressed.size(), + 100.f * compressed.size() / ser.get_save_result().second); file_util::write_binary_file(file_util::get_file_path({fmt::format( "assets/{}.fr3", dgo_name.substr(0, dgo_name.length() - 4))}), - ser.get_save_result().first, ser.get_save_result().second); + compressed.data(), compressed.size()); } } // namespace decompiler diff --git a/decompiler/level_extractor/extract_tfrag.cpp b/decompiler/level_extractor/extract_tfrag.cpp index a05b5e9651..5e2b556909 100644 --- a/decompiler/level_extractor/extract_tfrag.cpp +++ b/decompiler/level_extractor/extract_tfrag.cpp @@ -1,10 +1,10 @@ #include "extract_tfrag.h" #include "common/dma/dma.h" -#include "common/util/assert.h" #include "decompiler/util/Error.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" #include "common/util/FileUtil.h" #include "common/dma/gs.h" +#include "common/util/assert.h" namespace decompiler { namespace { @@ -117,6 +117,7 @@ VisNodeTree extract_vis_data(const level_tools::DrawableTreeTfrag* tree, u16 fir } vis.num_kids = elt.child_count; vis.flags = elt.flags; + vis.my_id = elt.id; assert(vis.flags == expecting_leaves ? 0 : 1); assert(vis.num_kids > 0); assert(vis.num_kids <= 8); @@ -2036,8 +2037,8 @@ void make_tfrag3_data(std::map>& draws, for (auto& strip : draw.strips) { tfrag3::StripDraw::VisGroup vgroup; - vgroup.vis_idx = strip.tfrag_id; // associate with the tfrag for culling - vgroup.num = strip.verts.size() + 1; // one for the primitive restart! + vgroup.vis_idx_in_pc_bvh = strip.tfrag_id; // associate with the tfrag for culling + vgroup.num = strip.verts.size() + 1; // one for the primitive restart! tdraw.num_triangles += strip.verts.size() - 2; for (auto& vert : strip.verts) { @@ -2114,6 +2115,19 @@ void extract_time_of_day(const level_tools::DrawableTreeTfrag* tree, tfrag3::Tfr } } +void merge_groups(std::vector& grps) { + std::vector result; + result.push_back(grps.at(0)); + for (size_t i = 1; i < grps.size(); i++) { + if (grps[i].vis_idx_in_pc_bvh == result.back().vis_idx_in_pc_bvh) { + result.back().num += grps[i].num; + } else { + result.push_back(grps[i]); + } + } + std::swap(result, grps); +} + } // namespace void extract_tfrag(const level_tools::DrawableTreeTfrag* tree, @@ -2183,13 +2197,14 @@ void extract_tfrag(const level_tools::DrawableTreeTfrag* tree, for (auto& draw : this_tree.draws) { for (auto& str : draw.vis_groups) { - auto it = tfrag_parents.find(str.vis_idx); + auto it = tfrag_parents.find(str.vis_idx_in_pc_bvh); if (it == tfrag_parents.end()) { - str.vis_idx = UINT32_MAX; + str.vis_idx_in_pc_bvh = UINT32_MAX; } else { - str.vis_idx = it->second; + str.vis_idx_in_pc_bvh = it->second; } } + merge_groups(draw.vis_groups); } out.tfrag_trees.push_back(this_tree); } diff --git a/decompiler/level_extractor/extract_tfrag.h b/decompiler/level_extractor/extract_tfrag.h index 985d43826c..dbe176661b 100644 --- a/decompiler/level_extractor/extract_tfrag.h +++ b/decompiler/level_extractor/extract_tfrag.h @@ -20,15 +20,6 @@ struct VisNodeTree { bool only_children = false; }; -// The final result -struct ExtractedTFragmentTree { - // TFragmentKind kind = TFragmentKind::INVALID; - VisNodeTree vis_nodes; - - u16 num_tfrags = 0; - u16 tfrag_base_idx = 0; -}; - // will pool textures with others already in out. void extract_tfrag(const level_tools::DrawableTreeTfrag* tree, const std::string& debug_name, diff --git a/decompiler/level_extractor/extract_tie.cpp b/decompiler/level_extractor/extract_tie.cpp index 6bfb1cc24f..3e82cd0c41 100644 --- a/decompiler/level_extractor/extract_tie.cpp +++ b/decompiler/level_extractor/extract_tie.cpp @@ -126,6 +126,7 @@ void extract_vis_data(const level_tools::DrawableTreeInstanceTie* tree, } vis.num_kids = elt.child_count; vis.flags = elt.flags; + vis.my_id = elt.id; assert(vis.flags == expecting_leaves ? 0 : 1); assert(vis.num_kids > 0); assert(vis.num_kids <= 8); @@ -167,32 +168,28 @@ void extract_vis_data(const level_tools::DrawableTreeInstanceTie* tree, } } +// Each TIE prototype is broken up into "fragments". These "fragments" have some maximum size based +// on the VU memory limit, so an instance may have multiple fragments, depending on how many +// vertices are in the model. + +// Each instance has different set of time of day colors per fragment in the prototype. +// this type contains the indicies of these colors. +// For the PC port we combine all colors into a single "big palette". +// this stores the indices as indices into the original game's per fragment palette. +// and an offset for where this palette is located in the big palette. struct TieInstanceFragInfo { // the color index table uploaded to VU. // this contains indices into the shared palette. std::vector color_indices; + // in the PC port format, we upload a single giant time of day color. this points to the offset + // of the colors from this frag instance. u16 color_index_offset_in_big_palette = -1; - - math::Vector lq_colors_ui(u32 qw) const { - // note: this includes the unpack - assert(qw >= 204); - qw -= 204; - qw *= 4; - assert(qw + 4 <= color_indices.size()); - math::Vector result; - for (int i = 0; i < 4; i++) { - result[i] = color_indices.at(qw + i); - } - return result; - } }; +// Each TIE instance has one of these. This is reorganized/unpacked data from the instance-tie type. struct TieInstanceInfo { // The index of the prototype (the geometry) that is used by this instance - // note: we're going to trust that this lines up with bucket. - // if this assumption is wrong, we'll be drawing with the wrong model and it will be super - // obvious. u16 prototype_idx = 0; // our bsphere's index in the BVH tree @@ -202,33 +199,44 @@ struct TieInstanceInfo { // actually cull using the tree) math::Vector4f bsphere; + // the transformation matrix, unpacked from the weird TIE format. + // this can be used to transform points directly to world-space points that work + // with the normal math camera stuff. std::array mat; + // this value is stashed inside the above matrix. It tells which "wind" we should use + // we just need to pass this along to the C++ rendering code. u16 wind_index = 0; - float unknown_wind_related_value = 0.f; // w of the first mat vec. - std::vector frags; // per-instance per-fragment info + std::vector frags; // per-instance per-fragment info (just colors) }; +// The 5 qw of adgif data contains draw settings, and they also snuck in some extra data. struct AdgifInfo { - u32 first_w; - u32 second_w; - u32 third_w; - u32 combo_tex; - u64 alpha_val; - u64 clamp_val; + // secret stuff they snuck in + u32 first_w; // VU memory offset + u32 second_w; // some size + u32 third_w; // unused, at least for not-near TIE + + // the draw settings we care about: + u32 combo_tex; // PC texture ID + u64 alpha_val; // alpha blend settings + u64 clamp_val; // texture clamp settings }; +// When the prototype is uploaded, it places a bunch of strgif tags in VU memory. +// we'll need to remember where these are. struct StrGifInfo { - u16 address; - u16 nloop; - u16 mode; // not yet fully understood, but can allow the use of other templates. - bool eop; + u16 address; // vu memory address + u16 nloop; // the nloop field of this strgif (how much to send) + u16 mode; // not yet fully understood, but can allow the use of other templates + bool eop; // end of packet flag }; +// data per vertex in a tie prototype struct TieProtoVertex { - math::Vector pos; - math::Vector tex; + math::Vector pos; // position + math::Vector tex; // texture coordinate // NOTE: this is a double lookup. // first you look up the index in the _instance_ color table @@ -236,26 +244,34 @@ struct TieProtoVertex { u32 color_index_index; }; +// a tie fragment is made up of strips. Each strip has a single adgif info, and vertices +// the vertices make up a triangle strip struct TieStrip { AdgifInfo adgif; std::vector verts; }; +// the tie fragment +// this is a per-prototype (all instances share the same TieFrags) struct TieFrag { - bool has_magic_tex0_bit = false; - std::vector adgifs; + bool has_magic_tex0_bit = false; // use decal mode (todo) + std::vector + adgifs; // the adgifs that come with this tiefrag (different strips can hve different) - std::vector other_gif_data; - std::vector points_data; - std::vector point_sizes; + std::vector other_gif_data; // data sent from EE asm code, sizes/offsets/metadata + std::vector points_data; // data sent from EE asm code, actual vertex data + // number of "dverts" expected from game's metadata. we check our extraction from this. u32 expected_dverts = 0; + // all the strips in this fragment std::vector strips; - // this contains vertices, key is the start of the actual xyzf/st/rgbaq data for it. + // this contains vertices, key is the address of the actual xyzf/st/rgbaq data in VU1 memory + // after the prototype program runs std::unordered_map vertex_by_dest_addr; + // simulate a load in the points data (using vu mem addr) math::Vector lq_points(u32 qw) const { assert(qw >= 50); qw -= 50; @@ -265,6 +281,8 @@ struct TieFrag { return result; } + // simulate a load from points, but don't die if we load past the end + // this can happen when pipelining. math::Vector lq_points_allow_past_end(u32 qw) const { assert(qw >= 50); qw -= 50; @@ -277,6 +295,8 @@ struct TieFrag { } } + // store data into points. annoyingly the points have to be unpacked + // and they are modified in place. void sq_points(u32 qw, const math::Vector4f& data) { assert(qw >= 50); qw -= 50; @@ -284,6 +304,7 @@ struct TieFrag { memcpy(points_data.data() + (qw * 16), data.data(), 16); } + // do a ilw from the other gif data. u16 ilw_other_gif(u32 qw, u32 offset) const { // unpacked with v8. int qwi = qw; @@ -292,6 +313,7 @@ struct TieFrag { return other_gif_data.at(qwi * 4 + offset); } + // reg values from the prototype program that are used by the instance program. struct ProgramInfo { std::vector adgif_offset_in_gif_buf_qw; std::vector str_gifs; @@ -310,16 +332,21 @@ struct TieFrag { } prog_info; }; +// main instance type +// unlike the GOAL type, we store all instances info in here too. struct TieProtoInfo { std::string name; std::vector instances; bool uses_generic = false; - float stiffness = 0; + float stiffness = 0; // wind u32 generic_flag; - std::vector time_of_day_colors; - std::vector frags; + std::vector time_of_day_colors; // c++ type for time of day data + std::vector frags; // the fragments of the prototype }; +/*! + * Convert TIE packed matrix to normal one. this was figured out from the EE asm. + */ std::array extract_tie_matrix(const u16* data) { std::array result; for (int i = 0; i < 4; i++) { @@ -341,27 +368,52 @@ std::array extract_tie_matrix(const u16* data) { return result; } +// geometry we use (todo, should really look at this) constexpr int GEOM_IDX = 1; // todo 0 or 1?? +/*! + * Confirm that the initial value of all wind vectors is 0. + * If this is true, we don't have to actually save them to the fr3 file, we can just create + * a bunch of 0 vectors in the TIE setup. + */ +void check_wind_vectors_zero(const std::vector& protos, Ref wind_ref) { + u16 max_wind = 0; + for (auto& proto : protos) { + for (auto& inst : proto.instances) { + max_wind = std::max(inst.wind_index, max_wind); + } + } + u32 wind_words = max_wind; + wind_words *= 4; + for (size_t i = 0; i < wind_words; i++) { + auto& word = wind_ref.data->words_by_seg.at(wind_ref.seg).at(wind_ref.byte_offset / 4 + i); + assert(word.kind() == LinkedWord::PLAIN_DATA); + assert(word.data == 0); + } +} + +// get per-instance info from the level data std::vector collect_instance_info( const level_tools::DrawableInlineArrayInstanceTie* instances, const std::vector* protos) { std::vector result; + + // loop over instances in level for (auto& instance : instances->instances) { + // copy basic data. TieInstanceInfo info; info.prototype_idx = instance.bucket_index; info.vis_id = instance.id; for (int i = 0; i < 4; i++) { info.bsphere[i] = instance.bsphere.data[i]; } + // from ee asm info.mat = extract_tie_matrix(instance.origin.data); info.mat[3][0] += info.bsphere[0]; info.mat[3][1] += info.bsphere[1]; info.mat[3][2] += info.bsphere[2]; info.wind_index = instance.wind_index; - // there's a value stashed here that we can get rid of - // it is related to wind. - info.unknown_wind_related_value = info.mat[0][3]; + info.mat[0][3] = 0.f; // each fragment has its own color data (3 dmatags) @@ -374,10 +426,15 @@ std::vector collect_instance_info( // and this is only the indices.... there's yet another lookup on the VU auto& proto = protos->at(info.prototype_idx); u32 offset_bytes = proto.base_qw[GEOM_IDX] * 16; + // loop over frags. this is only the per-instance info so only colors indices. We know the + // location/layout of the color data from the EE asm code. for (int frag_idx = 0; frag_idx < proto.frag_count[GEOM_IDX]; frag_idx++) { TieInstanceFragInfo frag_info; + // read the number of quadwords u32 num_color_qwc = proto.color_index_qwc.at(proto.index_start[GEOM_IDX] + frag_idx); + // loop over 4-byte words for (u32 i = 0; i < num_color_qwc * 4; i++) { + // loop over bytes in word for (u32 j = 0; j < 4; j++) { frag_info.color_indices.push_back( instance.color_indices.data->words_by_seg.at(instance.color_indices.seg) @@ -387,6 +444,7 @@ std::vector collect_instance_info( } info.frags.push_back(std::move(frag_info)); assert(info.frags.back().color_indices.size() > 0); + offset_bytes += num_color_qwc * 16; } @@ -399,6 +457,10 @@ std::vector collect_instance_info( return result; } +/*! + * adgif shader texture id's can be "remapped". I think it allows textures to be shared. + * So far we haven't seen this feature used, but we do have the texture map and we check it here. + */ u32 remap_texture(u32 original, const std::vector& map) { auto masked = original & 0xffffff00; for (auto& t : map) { @@ -411,6 +473,9 @@ u32 remap_texture(u32 original, const std::vector& ma return original; } +/*! + * Update per-proto information. + */ void update_proto_info(std::vector* out, const std::vector& map, const TextureDB& tdb, @@ -419,12 +484,18 @@ void update_proto_info(std::vector* out, for (size_t i = 0; i < protos.size(); i++) { const auto& proto = protos[i]; auto& info = out->at(i); + // the flags can either be 0 or 2. assert(proto.flags == 0 || proto.flags == 2); + // flag of 2 means it should use the generic renderer (determined from EE asm) + // for now, we ignore this and use TIE on everything. info.uses_generic = (proto.flags == 2); + // for debug, remember the name info.name = proto.name; + // wind "stiffness" nonzero value means it has the wind effect info.stiffness = proto.stiffness; info.generic_flag = proto.flags & 2; - + // the actual colors (rgba) used by time of day interpolation + // there are "height" colors. Each color is actually 8 colors that are interpolated. info.time_of_day_colors.resize(proto.time_of_day.height); for (int k = 0; k < (int)proto.time_of_day.height; k++) { for (int j = 0; j < 8; j++) { @@ -432,20 +503,41 @@ void update_proto_info(std::vector* out, } } + // loop over fragments in the proto. This is the actual mesh data data and drawing settings for (int frag_idx = 0; frag_idx < proto.frag_count[GEOM_IDX]; frag_idx++) { TieFrag frag_info; + + // loop over adgif shaders for (int tex_idx = 0; tex_idx < proto.geometry[GEOM_IDX].tie_fragments.at(frag_idx).tex_count / 5; tex_idx++) { + // this adgif shader data is modified in the real game by the login methods. + // all TIE things have pretty normal adgif shaders + + // all the useful adgif data will be saved into this AdgifInfo AdgifInfo adgif; + + // pointer to the level data auto& gif_data = proto.geometry[GEOM_IDX].tie_fragments[frag_idx].gif_data; + + // address for the first adgif shader qw. u8 ra_tex0 = gif_data.at(16 * (tex_idx * 5 + 0) + 8); + // data for the first adgif shader qw. u64 ra_tex0_val; memcpy(&ra_tex0_val, &gif_data.at(16 * (tex_idx * 5 + 0)), 8); + + // always expecting TEX0_1 assert(ra_tex0 == (u8)GsRegisterAddress::TEX0_1); + + // the value is overwritten by the login function. We don't care about this value, it's + // specific to the PS2's texture system. assert(ra_tex0_val == 0 || ra_tex0_val == 0x800000000); // note: decal + // the original value is a flag. this means to use decal texture mode (todo) frag_info.has_magic_tex0_bit = ra_tex0_val == 0x800000000; + // there's also a hidden value in the unused bits of the a+d data. it'll be used by the + // VU program. memcpy(&adgif.first_w, &gif_data.at(16 * (tex_idx * 5 + 0) + 12), 4); + // Second adgif. Similar to the first, except the original data value is a texture ID. u8 ra_tex1 = gif_data.at(16 * (tex_idx * 5 + 1) + 8); u64 ra_tex1_val; memcpy(&ra_tex1_val, &gif_data.at(16 * (tex_idx * 5 + 1)), 8); @@ -453,34 +545,41 @@ void update_proto_info(std::vector* out, assert(ra_tex1_val == 0x120); // some flag u32 original_tex; memcpy(&original_tex, &gif_data.at(16 * (tex_idx * 5 + 1) + 8), 4); + // try remapping it u32 new_tex = remap_texture(original_tex, map); if (original_tex != new_tex) { fmt::print("map from 0x{:x} to 0x{:x}\n", original_tex, new_tex); } + // texture the texture page/texture index, and convert to a PC port texture ID u32 tpage = new_tex >> 20; u32 tidx = (new_tex >> 8) & 0b1111'1111'1111; u32 tex_combo = (((u32)tpage) << 16) | tidx; + // look up the texture to make sure it's valid auto tex = tdb.textures.find(tex_combo); assert(tex != tdb.textures.end()); + // remember the texture id adgif.combo_tex = tex_combo; + // and the hidden value in the unused a+d memcpy(&adgif.second_w, &gif_data.at(16 * (tex_idx * 5 + 1) + 12), 4); - + // todo: figure out if this matters if (ra_tex0_val == 0x800000000) { fmt::print("texture {} in {} has weird tex setting\n", tex->second.name, proto.name); } + // mipmap settings. we ignore, but get the hidden value u8 ra_mip = gif_data.at(16 * (tex_idx * 5 + 2) + 8); assert(ra_mip == (u8)GsRegisterAddress::MIPTBP1_1); memcpy(&adgif.third_w, &gif_data.at(16 * (tex_idx * 5 + 2) + 12), 4); - // who cares about the value + // clamp settings. we care about these. no hidden value. u8 ra_clamp = gif_data.at(16 * (tex_idx * 5 + 3) + 8); assert(ra_clamp == (u8)GsRegisterAddress::CLAMP_1); u64 clamp; memcpy(&clamp, &gif_data.at(16 * (tex_idx * 5 + 3)), 8); adgif.clamp_val = clamp; + // alpha settings. we care about these, but no hidden value u8 ra_alpha = gif_data.at(16 * (tex_idx * 5 + 4) + 8); assert(ra_alpha == (u8)GsRegisterAddress::ALPHA_1); u64 alpha; @@ -488,7 +587,12 @@ void update_proto_info(std::vector* out, adgif.alpha_val = alpha; frag_info.adgifs.push_back(adgif); } + + // they store a vertex count. we later use this to sanity check out mesh extraction frag_info.expected_dverts = proto.geometry[GEOM_IDX].tie_fragments[frag_idx].num_dverts; + + // each frag also has "other" data. This is some index data that the VU program uses. + // it comes in gif_data, after tex_qwc (determined from EE program) int tex_qwc = proto.geometry[GEOM_IDX].tie_fragments.at(frag_idx).tex_count; int other_qwc = proto.geometry[GEOM_IDX].tie_fragments.at(frag_idx).gif_count; frag_info.other_gif_data.resize(16 * other_qwc); @@ -496,6 +600,8 @@ void update_proto_info(std::vector* out, proto.geometry[GEOM_IDX].tie_fragments[frag_idx].gif_data.data() + (16 * tex_qwc), 16 * other_qwc); + // each frag's "point" data. These are stored as int16's, but get unpacked to 32-bit ints by + // the VIF. (determined from EE program) const auto& pr = proto.geometry[GEOM_IDX].tie_fragments[frag_idx].point_ref; int in_qw = pr.size() / 16; int out_qw = in_qw * 2; @@ -508,16 +614,15 @@ void update_proto_info(std::vector* out, } } - // just for debug - for (int g = 0; g < 4; g++) { - frag_info.point_sizes.push_back(proto.geometry[g].tie_fragments[frag_idx].point_ref.size()); - } - info.frags.push_back(std::move(frag_info)); } } } +// List of dma tags from the EE code. +// upload-palette/upload-model happen per prototype. +// (palette may happen per prototype, model per geometry, but we only use 1 geom) + // upload-palette-0: just a flusha // no data @@ -538,9 +643,12 @@ void update_proto_info(std::vector* out, // points // upload-model-3 -// mscal 6 +// mscal 6 <- this runs a VU program that unpacks the model data // call the models! +// These upload-color's happen per instance. They only happen after the upload-palette/model's +// happen for the given model. + // upload-color-0 // 6 qw of matrix plus flag stuff // to 198 (relative to TOP) @@ -549,9 +657,13 @@ void update_proto_info(std::vector* out, // to 204 unsigned (relative to TOP) // upload-color-2/ret -// mscal 0 +// mscal 0 <- this runs a VU program that generates GS data to draw the instance. // MEMORY MAP of TIE +// these are quadword addresses. +// some things are double/triple buffered. +// we ignore this for the most part and by convention use the lower address. + // 0 gif tags // extra gifs // 32 model @@ -574,6 +686,9 @@ void update_proto_info(std::vector* out, // 973 atest-tra // 974 atest-def +// the vu program emulation will fill out the vertex positions/draw settings for each instance. + +// helper functions for the vu programs math::Vector4f itof0(const math::Vector4f& vec) { math::Vector4f result; for (int i = 0; i < 4; i++) { @@ -1561,38 +1676,49 @@ void emulate_tie_instance_program(std::vector& protos) { } } -// makes per-prototype meshes +// the final step of the VU program emulation is the "xgkick" instruction. +// there is a signal xgkick per fragment and it goes through the entire gif buf, hitting +// strgifs and adgifs. We look at the memory map for each frag and figure out which strips +// go with which adgifs, then copy vertices void emulate_kicks(std::vector& protos) { for (auto& proto : protos) { for (auto& frag : proto.frags) { + // we iterate over both adgifs/stgifs. sometimes you can have multiple strgifs that use the + // same adgif. But we never expect to see multiple adgifs in a row. auto adgif_it = frag.prog_info.adgif_offset_in_gif_buf_qw.begin(); auto adgif_end = frag.prog_info.adgif_offset_in_gif_buf_qw.end(); auto str_it = frag.prog_info.str_gifs.begin(); auto str_end = frag.prog_info.str_gifs.end(); + // but, we should always start with an adgif (otherwise we'd use the draw settings from + // the last model, which we don't know) assert(frag.prog_info.adgif_offset_in_gif_buf_qw.at(0) == 0); + // and we expect that the VU program placed all adgifs somewhere assert(frag.prog_info.adgif_offset_in_gif_buf_qw.size() == frag.adgifs.size()); + const AdgifInfo* adgif_info = nullptr; int expected_next_tag = 0; // loop over strgifs while (str_it != str_end) { - // try advance adgif + // try to see if we got a adgif here if (adgif_it != adgif_end && (*adgif_it) == expected_next_tag) { + // yep int idx = adgif_it - frag.prog_info.adgif_offset_in_gif_buf_qw.begin(); adgif_info = &frag.adgifs.at(idx); - // fmt::print("using adgif {}\n", *adgif_it); + // the next strgif should come 6 qw's after expected_next_tag += 6; adgif_it++; } assert(adgif_info); - // fmt::print("strip: {}\n", str_it->address); + // make sure the next str is where we expect assert(expected_next_tag == str_it->address); + // the next tag (either str/adgif) should be located at the end of this tag's data. expected_next_tag += 3 * str_it->nloop + 1; // here we have the right str and adgif. - // kinda stupid, but we have to guess the base address of the gifbuf + // kinda stupid, but we have to guess the base address of the gifbuf we're using. // 286 gifbuf // 470 gifbuf again // 654 ?? @@ -1605,12 +1731,15 @@ void emulate_kicks(std::vector& protos) { base_address = 470; } - // now, vertices! + // now, we can add the vertices! frag.strips.emplace_back(); auto& strip = frag.strips.back(); strip.adgif = *adgif_info; + // loop over all the vertices the strgif says we'll have for (int vtx = 0; vtx < str_it->nloop; vtx++) { + // compute the address of this vertex (stored after the strgif) u32 vtx_addr = str_it->address + 1 + (3 * vtx) + base_address; + // and grab it from the vertex map we made earlier. strip.verts.push_back(frag.vertex_by_dest_addr.at(vtx_addr)); } @@ -1622,6 +1751,11 @@ void emulate_kicks(std::vector& protos) { } } +// from here on, we are mostly converting the "info" formats to the C++ renderer format (tfrag3) + +/*! + * Just used to debug, save a proto as an .obj mesh file. + */ std::string debug_dump_proto_to_obj(const TieProtoInfo& proto) { std::vector> verts; std::vector> tcs; @@ -1678,16 +1812,12 @@ std::string debug_dump_proto_to_obj(const TieProtoInfo& proto) { return result; } +/*! + * Transform a point in a prototype to the actual point location in the game world. + */ math::Vector transform_tie(const std::array mat, const math::Vector3f& pt) { auto temp = mat[0] * pt.x() + mat[1] * pt.y() + mat[2] * pt.z() + mat[3]; - - // math::Vector4f temp; - // temp.x() = pt.x(); - // temp.y() = pt.y(); - // temp.z() = pt.z(); - // temp += mat[3]; - math::Vector3f result; result.x() = temp.x(); result.y() = temp.y(); @@ -1695,6 +1825,10 @@ math::Vector transform_tie(const std::array mat, return result; } +/*! + * Dump the entire tie tree to an obj. Used to debug the transform_tie function. If we get this + * right, it should fit in with .obj's produced from the tfrag debug. + */ std::string dump_full_to_obj(const std::vector& protos) { std::vector> verts; std::vector> tcs; @@ -1774,6 +1908,7 @@ struct BigPalette { std::vector colors; }; +// combine all individual time of day palettes into one giant one. BigPalette make_big_palette(std::vector& protos) { BigPalette result; @@ -1800,6 +1935,9 @@ BigPalette make_big_palette(std::vector& protos) { return result; } +/*! + * Given a current draw mode, update the alpha settings from a gs-alpha register value. + */ void update_mode_from_alpha1(u64 val, DrawMode& mode) { GsAlpha reg(val); if (reg.a_mode() == GsAlpha::BlendMode::SOURCE && reg.b_mode() == GsAlpha::BlendMode::DEST && @@ -1837,13 +1975,19 @@ void update_mode_from_alpha1(u64 val, DrawMode& mode) { fmt::print("unsupported blend: a {} b {} c {} d {}\n", (int)reg.a_mode(), (int)reg.b_mode(), (int)reg.c_mode(), (int)reg.d_mode()); mode.set_alpha_blend(DrawMode::AlphaBlend::SRC_DST_SRC_DST); - // assert(false); + assert(false); } } +/*! + * Convert adgif info into a C++ renderer DrawMode. + */ DrawMode process_draw_mode(const AdgifInfo& info, bool use_atest, bool use_decal) { DrawMode mode; + // some of these are set up once as part of tie initialization mode.set_alpha_test(DrawMode::AlphaTest::GEQUAL); + + // the atest giftag is set up at the end of the VU program. if (use_atest) { mode.enable_at(); mode.set_aref(0x26); @@ -1855,13 +1999,17 @@ DrawMode process_draw_mode(const AdgifInfo& info, bool use_atest, bool use_decal if (use_decal) { mode.enable_decal(); } + // set up once. mode.enable_depth_write(); mode.enable_zt(); // :zte #x1 mode.set_depth_test(GsTest::ZTest::GEQUAL); // :ztst (gs-ztest greater-equal)) mode.disable_ab(); mode.set_alpha_blend(DrawMode::AlphaBlend::SRC_DST_SRC_DST); + // the alpha matters update_mode_from_alpha1(info.alpha_val, mode); + + // the clamp matters if (!(info.clamp_val == 0b101 || info.clamp_val == 0 || info.clamp_val == 1 || info.clamp_val == 0b100)) { fmt::print("clamp: 0x{:x}\n", info.clamp_val); @@ -1874,27 +2022,49 @@ DrawMode process_draw_mode(const AdgifInfo& info, bool use_atest, bool use_decal return mode; } -// we need the lev to pool textures with tfrag. +/*! + * Convert TieProtoInfo's to C++ renderer format + */ void add_vertices_and_static_draw(tfrag3::TieTree& tree, tfrag3::Level& lev, const TextureDB& tdb, const std::vector& protos) { - // our current approach for static draws is just to flatten to giant mesh. - - std::unordered_map> draws_by_tex; - - std::unordered_map interp_hack_colors; + // our current approach for static draws is just to flatten to giant mesh, except for wind stuff. + // this map sorts these two types of draws by texture. + std::unordered_map> static_draws_by_tex; + std::unordered_map> wind_draws_by_tex; + // loop over all prototypes for (auto& proto : protos) { + // bool using_wind = true; // hack, for testing + bool using_wind = proto.stiffness != 0.f; + + // loop over instances of the prototypes for (auto& inst : proto.instances) { + // if we're using wind, we use the instanced renderer, which requires some extra info + // and we should remember which instance ID we are. + // Note: this is different from the game's instance index - we don't draw everything instanced + // so the non-instanced models don't get a C++ renderer instance ID + u32 wind_instance_idx = tree.instance_info.size(); + if (using_wind) { + tfrag3::TieWindInstance wind_instance_info; + wind_instance_info.wind_idx = inst.wind_index; // which wind value to apply in the table + wind_instance_info.stiffness = proto.stiffness; // wind stiffness (how much we move) + wind_instance_info.matrix = inst.mat; // instance transformation matrix. + tree.instance_info.push_back(wind_instance_info); + } + + // loop over fragments of the prototype for (size_t frag_idx = 0; frag_idx < proto.frags.size(); frag_idx++) { - auto& frag = proto.frags[frag_idx]; - auto& ifrag = inst.frags.at(frag_idx); + auto& frag = proto.frags[frag_idx]; // shared info for all instances of this frag + auto& ifrag = inst.frags.at(frag_idx); // color info for this instance of the frag + // loop over triangle strips within the fragment for (auto& strip : frag.strips) { // what texture are we using? u32 combo_tex = strip.adgif.combo_tex; - // try looking it up in the existing textures + // try looking it up in the existing textures that we have in the C++ renderer data. + // (this is shared with tfrag) u32 idx_in_lev_data = UINT32_MAX; for (u32 i = 0; i < lev.textures.size(); i++) { if (lev.textures[i].combo_id == combo_tex) { @@ -1904,10 +2074,10 @@ void add_vertices_and_static_draw(tfrag3::TieTree& tree, } if (idx_in_lev_data == UINT32_MAX) { - // didn't find it, have to add a new one + // didn't find it, have to add a new one texture. auto tex_it = tdb.textures.find(combo_tex); if (tex_it == tdb.textures.end()) { - bool ok_to_miss = false; // TODO + bool ok_to_miss = false; // for TIE, there's no missing textures. if (ok_to_miss) { // we're missing a texture, just use the first one. tex_it = tdb.textures.begin(); @@ -1922,6 +2092,7 @@ void add_vertices_and_static_draw(tfrag3::TieTree& tree, assert(false); } } + // add a new texture to the level data idx_in_lev_data = lev.textures.size(); lev.textures.emplace_back(); auto& new_tex = lev.textures.back(); @@ -1937,68 +2108,162 @@ void add_vertices_and_static_draw(tfrag3::TieTree& tree, DrawMode mode = process_draw_mode(strip.adgif, frag.prog_info.misc_x == 0, frag.has_magic_tex0_bit); - // okay, we now have a texture and draw mode, let's see if we can add to an existing... - auto existing_draws_in_tex = draws_by_tex.find(idx_in_lev_data); - tfrag3::StripDraw* draw_to_add_to = nullptr; - if (existing_draws_in_tex != draws_by_tex.end()) { - for (auto idx : existing_draws_in_tex->second) { - if (tree.static_draws.at(idx).mode == mode) { - draw_to_add_to = &tree.static_draws[idx]; + if (using_wind) { + // okay, we now have a texture and draw mode, let's see if we can add to an existing... + auto existing_draws_in_tex = wind_draws_by_tex.find(idx_in_lev_data); + tfrag3::InstancedStripDraw* draw_to_add_to = nullptr; + if (existing_draws_in_tex != wind_draws_by_tex.end()) { + for (auto idx : existing_draws_in_tex->second) { + if (tree.instanced_wind_draws.at(idx).mode == mode) { + draw_to_add_to = &tree.instanced_wind_draws[idx]; + } } } - } - if (!draw_to_add_to) { - // nope, need to create a new draw - tree.static_draws.emplace_back(); - draws_by_tex[idx_in_lev_data].push_back(tree.static_draws.size() - 1); - draw_to_add_to = &tree.static_draws.back(); - draw_to_add_to->mode = mode; - draw_to_add_to->tree_tex_id = idx_in_lev_data; - } - - // now we have a draw, time to add vertices - tfrag3::StripDraw::VisGroup vgroup; - vgroup.vis_idx = inst.vis_id; // associate with the tfrag for culling - vgroup.num = strip.verts.size() + 1; // one for the primitive restart! - draw_to_add_to->num_triangles += strip.verts.size() - 2; - for (auto& vert : strip.verts) { - tfrag3::PreloadedVertex vtx; - // todo fields - auto tf = transform_tie(inst.mat, vert.pos); - vtx.x = tf.x(); - vtx.y = tf.y(); - vtx.z = tf.z(); - vtx.s = vert.tex.x(); - vtx.t = vert.tex.y(); - vtx.q = vert.tex.z(); - // if this is true, we can remove a divide in the shader - assert(vtx.q == 1.f); - if (vert.color_index_index == UINT32_MAX) { - vtx.color_index = 0; - } else { - vtx.color_index = ifrag.color_indices.at(vert.color_index_index); - assert(vert.color_index_index < ifrag.color_indices.size()); - vtx.color_index += ifrag.color_index_offset_in_big_palette; + if (!draw_to_add_to) { + // nope no existing draw for these settings, need to create a new draw + tree.instanced_wind_draws.emplace_back(); + wind_draws_by_tex[idx_in_lev_data].push_back(tree.instanced_wind_draws.size() - 1); + draw_to_add_to = &tree.instanced_wind_draws.back(); + draw_to_add_to->mode = mode; + draw_to_add_to->tree_tex_id = idx_in_lev_data; } - size_t vert_idx = tree.vertices.size(); - tree.vertices.push_back(vtx); - draw_to_add_to->vertex_index_stream.push_back(vert_idx); + // now we have a draw, time to add vertices. We make a vertex "group" which is a group + // of vertices that the renderer can decide to not draw based on visibility data. + tfrag3::InstancedStripDraw::InstanceGroup igroup; + // needs to be associated with this instance. + igroup.vis_idx = inst.vis_id; // associate with the instance for culling + // number of vertices. The +1 is for the primitive restart index, which tells opengl + // that the triangle strip is done. + igroup.num = strip.verts.size() + 1; + // groups for instances also need the instance idx to grab the appropriate wind/matrix + // data. + igroup.instance_idx = wind_instance_idx; + draw_to_add_to->num_triangles += strip.verts.size() - 2; + // note: this is a bit wasteful to duplicate the xyz/stq. + for (auto& vert : strip.verts) { + tfrag3::PreloadedVertex vtx; + vtx.x = vert.pos.x(); + vtx.y = vert.pos.y(); + vtx.z = vert.pos.z(); + vtx.s = vert.tex.x(); + vtx.t = vert.tex.y(); + vtx.q = vert.tex.z(); + // if this is true, we can remove a divide in the shader + assert(vtx.q == 1.f); + if (vert.color_index_index == UINT32_MAX) { + vtx.color_index = 0; + } else { + vtx.color_index = ifrag.color_indices.at(vert.color_index_index); + assert(vert.color_index_index < ifrag.color_indices.size()); + vtx.color_index += ifrag.color_index_offset_in_big_palette; + } + + size_t vert_idx = tree.vertices.size(); + tree.vertices.push_back(vtx); + draw_to_add_to->vertex_index_stream.push_back(vert_idx); + } + // the primitive restart index + draw_to_add_to->vertex_index_stream.push_back(UINT32_MAX); + draw_to_add_to->instance_groups.push_back(igroup); + } else { + // okay, we now have a texture and draw mode, let's see if we can add to an existing... + auto existing_draws_in_tex = static_draws_by_tex.find(idx_in_lev_data); + tfrag3::StripDraw* draw_to_add_to = nullptr; + if (existing_draws_in_tex != static_draws_by_tex.end()) { + for (auto idx : existing_draws_in_tex->second) { + if (tree.static_draws.at(idx).mode == mode) { + draw_to_add_to = &tree.static_draws[idx]; + } + } + } + + if (!draw_to_add_to) { + // nope, need to create a new draw + tree.static_draws.emplace_back(); + static_draws_by_tex[idx_in_lev_data].push_back(tree.static_draws.size() - 1); + draw_to_add_to = &tree.static_draws.back(); + draw_to_add_to->mode = mode; + draw_to_add_to->tree_tex_id = idx_in_lev_data; + } + + // now we have a draw, time to add vertices + tfrag3::StripDraw::VisGroup vgroup; + vgroup.vis_idx_in_pc_bvh = inst.vis_id; // associate with the instance for culling + vgroup.num = strip.verts.size() + 1; // one for the primitive restart! + draw_to_add_to->num_triangles += strip.verts.size() - 2; + for (auto& vert : strip.verts) { + tfrag3::PreloadedVertex vtx; + // todo fields + auto tf = transform_tie(inst.mat, vert.pos); + vtx.x = tf.x(); + vtx.y = tf.y(); + vtx.z = tf.z(); + vtx.s = vert.tex.x(); + vtx.t = vert.tex.y(); + vtx.q = vert.tex.z(); + // if this is true, we can remove a divide in the shader + assert(vtx.q == 1.f); + if (vert.color_index_index == UINT32_MAX) { + vtx.color_index = 0; + } else { + vtx.color_index = ifrag.color_indices.at(vert.color_index_index); + assert(vert.color_index_index < ifrag.color_indices.size()); + vtx.color_index += ifrag.color_index_offset_in_big_palette; + } + + size_t vert_idx = tree.vertices.size(); + tree.vertices.push_back(vtx); + draw_to_add_to->vertex_index_stream.push_back(vert_idx); + } + draw_to_add_to->vertex_index_stream.push_back(UINT32_MAX); + draw_to_add_to->vis_groups.push_back(vgroup); } - draw_to_add_to->vertex_index_stream.push_back(UINT32_MAX); - draw_to_add_to->vis_groups.push_back(vgroup); } } } } + // sort draws by texture. no idea if this really matters, but will reduce the number of + // times the renderer changes textures. it at least makes the rendererdoc debugging easier. std::stable_sort(tree.static_draws.begin(), tree.static_draws.end(), [](const tfrag3::StripDraw& a, const tfrag3::StripDraw& b) { return a.tree_tex_id < b.tree_tex_id; }); } +/*! + * The groups are created per-fragment, but usually you have a few fragments per instance, so there + * are often consecutive groups that can be merged. + */ +void merge_groups(std::vector& grps) { + std::vector result; + result.push_back(grps.at(0)); + for (size_t i = 1; i < grps.size(); i++) { + if (grps[i].vis_idx == result.back().vis_idx && + grps[i].instance_idx == result.back().instance_idx) { + result.back().num += grps[i].num; + } else { + result.push_back(grps[i]); + } + } + std::swap(result, grps); +} + +void merge_groups(std::vector& grps) { + std::vector result; + result.push_back(grps.at(0)); + for (size_t i = 1; i < grps.size(); i++) { + if (grps[i].vis_idx_in_pc_bvh == result.back().vis_idx_in_pc_bvh) { + result.back().num += grps[i].num; + } else { + result.push_back(grps[i]); + } + } + std::swap(result, grps); +} + void extract_tie(const level_tools::DrawableTreeInstanceTie* tree, const std::string& debug_name, const std::vector& tex_map, @@ -2028,7 +2293,9 @@ void extract_tie(const level_tools::DrawableTreeInstanceTie* tree, // parent of between 1 and 8 instances. extract_vis_data(tree, as_instance_array->instances.front().id, this_tree); - // map of instance ID to its parent. We'll need this later. + // we use the index of the instance in the instance list as its index. But this is different + // from its visibility index. This map goes from instance index to the parent node in the vis + // tree. later, we can use this to remap from instance idx to the visiblity node index. std::unordered_map instance_parents; for (size_t node_idx = 0; node_idx < this_tree.bvh.vis_nodes.size(); node_idx++) { const auto& node = this_tree.bvh.vis_nodes[node_idx]; @@ -2039,31 +2306,49 @@ void extract_tie(const level_tools::DrawableTreeInstanceTie* tree, } } + // convert level format data to a nicer format auto info = collect_instance_info(as_instance_array, &tree->prototypes.prototype_array_tie.data); update_proto_info(&info, tex_map, tex_db, tree->prototypes.prototype_array_tie.data); - // debug_print_info(info); + check_wind_vectors_zero(info, tree->prototypes.wind_vectors); + // determine draws from VU program emulate_tie_prototype_program(info); emulate_tie_instance_program(info); emulate_kicks(info); + // debug save to .obj if (dump_level) { auto dir = file_util::get_file_path({fmt::format("debug_out/tie-{}/", debug_name)}); file_util::create_dir_if_needed(dir); for (auto& proto : info) { auto data = debug_dump_proto_to_obj(proto); file_util::write_text_file(fmt::format("{}/{}.obj", dir, proto.name), data); - // file_util::create_dir_if_needed() } auto full = dump_full_to_obj(info); file_util::write_text_file(fmt::format("{}/ALL.obj", dir), full); } + // create time of day data. auto full_palette = make_big_palette(info); + + // create draws add_vertices_and_static_draw(this_tree, out, tex_db, info); + // remap vis indices and merge for (auto& draw : this_tree.static_draws) { for (auto& str : draw.vis_groups) { + auto it = instance_parents.find(str.vis_idx_in_pc_bvh); + if (it == instance_parents.end()) { + str.vis_idx_in_pc_bvh = UINT32_MAX; + } else { + str.vis_idx_in_pc_bvh = it->second; + } + } + merge_groups(draw.vis_groups); + } + + for (auto& draw : this_tree.instanced_wind_draws) { + for (auto& str : draw.instance_groups) { auto it = instance_parents.find(str.vis_idx); if (it == instance_parents.end()) { str.vis_idx = UINT32_MAX; @@ -2071,6 +2356,8 @@ void extract_tie(const level_tools::DrawableTreeInstanceTie* tree, str.vis_idx = it->second; } } + + merge_groups(draw.instance_groups); } this_tree.colors = full_palette.colors; diff --git a/decompiler/main.cpp b/decompiler/main.cpp index 5504820ce7..988ad9682d 100644 --- a/decompiler/main.cpp +++ b/decompiler/main.cpp @@ -74,7 +74,7 @@ int main(int argc, char** argv) { db.generate_dgo_listing()); // write out object file map (used for future decompilations, if desired) file_util::write_text_file(file_util::combine_path(out_folder, "obj.txt"), - db.generate_obj_listing()); + db.generate_obj_listing(config.merged_objects)); // dump raw objs if (config.dump_objs) { diff --git a/decompiler/util/DataParser.cpp b/decompiler/util/DataParser.cpp index e149307fb4..784848b5ec 100644 --- a/decompiler/util/DataParser.cpp +++ b/decompiler/util/DataParser.cpp @@ -1,7 +1,7 @@ #include -#include "common/util/assert.h" #include "DataParser.h" #include "third-party/fmt/core.h" +#include "common/util/assert.h" /* * Allowable lines: diff --git a/decompiler/util/TP_Type.h b/decompiler/util/TP_Type.h index fe8330a39a..961fbb3d3c 100644 --- a/decompiler/util/TP_Type.h +++ b/decompiler/util/TP_Type.h @@ -1,11 +1,11 @@ #pragma once #include -#include "common/util/assert.h" #include #include "common/log/log.h" #include "common/type_system/TypeSpec.h" #include "common/common_types.h" #include "decompiler/Disasm/Register.h" +#include "common/util/assert.h" namespace decompiler { /*! diff --git a/decompiler/util/data_decompile.cpp b/decompiler/util/data_decompile.cpp index dda1028096..f81a230c5e 100644 --- a/decompiler/util/data_decompile.cpp +++ b/decompiler/util/data_decompile.cpp @@ -336,8 +336,9 @@ goos::Object decomp_ref_to_inline_array_guess_size( // verify the stride matches the type system auto elt_type_info = ts.lookup_type(array_elt_type); - assert(stride == align(elt_type_info->get_size_in_memory(), - elt_type_info->get_inline_array_stride_alignment())); + int ye = align(elt_type_info->get_size_in_memory(), + elt_type_info->get_inline_array_stride_alignment()); + assert(stride == ye); // the input is the location of the data field. // we expect that to be a label: @@ -450,6 +451,39 @@ goos::Object sp_field_init_spec_decompile(const std::vector& words, file, TypeSpec("sp-field-init-spec"), 16); } +goos::Object nav_mesh_vertex_arr_decompile(const std::vector& words, + const std::vector& labels, + int my_seg, + int field_location, + const TypeSystem& ts, + const std::vector>& all_words, + const LinkedObjectFile* file) { + return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words, + file, TypeSpec("nav-vertex"), 16); +} + +goos::Object nav_mesh_poly_arr_decompile(const std::vector& words, + const std::vector& labels, + int my_seg, + int field_location, + const TypeSystem& ts, + const std::vector>& all_words, + const LinkedObjectFile* file) { + return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words, + file, TypeSpec("nav-poly"), 8); +} + +goos::Object nav_mesh_route_arr_decompile(const std::vector& words, + const std::vector& labels, + int my_seg, + int field_location, + const TypeSystem& ts, + const std::vector>& all_words, + const LinkedObjectFile* file) { + return decomp_ref_to_inline_array_guess_size(words, labels, my_seg, field_location, ts, all_words, + file, TypeSpec("vector4ub"), 4); +} + goos::Object sp_launch_grp_launcher_decompile(const std::vector& words, const std::vector& labels, int my_seg, @@ -676,6 +710,18 @@ goos::Object decompile_structure(const TypeSpec& type, field_defs_out.emplace_back( field.name(), sp_field_init_spec_decompile(obj_words, labels, label.target_segment, field_start, ts, words, file)); + } else if (field.name() == "vertex" && type.print() == "nav-mesh") { + field_defs_out.emplace_back( + field.name(), nav_mesh_vertex_arr_decompile(obj_words, labels, label.target_segment, + field_start, ts, words, file)); + } else if (field.name() == "poly" && type.print() == "nav-mesh") { + field_defs_out.emplace_back( + field.name(), nav_mesh_poly_arr_decompile(obj_words, labels, label.target_segment, + field_start, ts, words, file)); + } else if (field.name() == "route" && type.print() == "nav-mesh") { + field_defs_out.emplace_back( + field.name(), nav_mesh_route_arr_decompile(obj_words, labels, label.target_segment, + field_start, ts, words, file)); } else if (field.name() == "launcher" && type.print() == "sparticle-launch-group") { field_defs_out.emplace_back(field.name(), sp_launch_grp_launcher_decompile( obj_words, labels, label.target_segment, diff --git a/decompiler/util/sparticle_decompile.cpp b/decompiler/util/sparticle_decompile.cpp index 2ab775e831..a43a213538 100644 --- a/decompiler/util/sparticle_decompile.cpp +++ b/decompiler/util/sparticle_decompile.cpp @@ -104,6 +104,7 @@ enum class FieldKind { FUNCTION, USERDATA, ROT_X, + SOUND_SPEC, INVALID }; @@ -120,12 +121,12 @@ const SparticleFieldDecomp field_kinds[68] = { {true, FieldKind::FUNCTION}, // SPT_BIRTH_FUNC = 4 {false}, // SPT_JOINT/REFPOINT = 5 {true, FieldKind::FLOAT_WITH_RAND}, // SPT_NUM = 6 - {true, FieldKind::NO_FANCY_DECOMP}, // SPT_SOUND = 7 + {true, FieldKind::SOUND_SPEC}, // SPT_SOUND = 7 {false}, // MISC_FIELDS_END = 8 {false}, // SPRITE_FIELDS_START = 9 {true, FieldKind::METER_WITH_RAND}, // SPT_X = 10 {true, FieldKind::METER_WITH_RAND}, // SPT_Y = 11 - {true, FieldKind::FLOAT_WITH_RAND}, // SPT_Z = 12 + {true, FieldKind::METER_WITH_RAND}, // SPT_Z = 12 {true, FieldKind::METER_WITH_RAND}, // SPT_SCALE_X = 13 {true, FieldKind::ROT_X}, // SPT_ROT_X = 14 {true, FieldKind::DEGREES_WITH_RAND}, // SPT_ROT_Y = 15 @@ -386,10 +387,10 @@ goos::Object decompile_sparticle_float_meters_with_rand_init(const std::vector& /*words*/, + const std::string& field_name, + const std::string& flag_name, + const goos::Object& original) { + assert(field_name == "spt-sound"); + assert(flag_name == "plain-v2"); + return pretty_print::build_list("sp-sound", original); +} + goos::Object decompile_sparticle_group_item(const TypeSpec& type, const DecompilerLabel& label, const std::vector& labels, @@ -466,8 +474,8 @@ goos::Object decompile_sparticle_group_item(const TypeSpec& type, // binding s32 launcher = word_as_s32(obj_words.at(0)); - float fade_after_meters = word_as_float(obj_words.at(1)) / METER_LENGTH; - float falloff_to_meters = word_as_float(obj_words.at(2)) / METER_LENGTH; + float fade_after = word_as_float(obj_words.at(1)); + float falloff_to = word_as_float(obj_words.at(2)); u32 fp = word_as_s32(obj_words.at(3)); u16 flags = fp & 0xffff; u16 period = fp >> 16; @@ -480,12 +488,12 @@ goos::Object decompile_sparticle_group_item(const TypeSpec& type, std::string result = fmt::format("(sp-item {}", launcher); // use decimal, so it matches array idx - if (fade_after_meters != 0.0) { - result += fmt::format(" :fade-after (meters {})", float_to_string(fade_after_meters)); + if (fade_after != 0.0) { + result += fmt::format(" :fade-after (meters {})", meters_to_string(fade_after)); } - if (falloff_to_meters != 0.0) { - result += fmt::format(" :falloff-to (meters {})", float_to_string(falloff_to_meters)); + if (falloff_to != 0.0) { + result += fmt::format(" :falloff-to (meters {})", meters_to_string(falloff_to)); } if (flags) { @@ -595,6 +603,7 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type, case FieldKind::LAUNCHER_BY_ID: result = decompile_sparticle_launcher_by_id(obj_words, field_name, flag_name); break; + case FieldKind::SOUND_SPEC: case FieldKind::NO_FANCY_DECOMP: result = normal; break; @@ -615,6 +624,91 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type, // fmt::print("Result: {}\n\n", result.print()); return result; } + +goos::Object decompile_sparticle_userdata_assert(const std::vector& words, + const std::string& field_name, + const std::string& flag_name) { + if (flag_name == "int-with-rand" || flag_name == "float-with-rand") { + return decompile_sparticle_float_with_rand_init(words, field_name, flag_name); + } else { + assert(false); + } +} + +goos::Object decompile_sparticle_field_init(const DefpartElement::StaticInfo::PartField& field, + const TypeSystem& ts) { + auto field_id = field.field_id; + auto flags = field.flags; + + assert(field_id <= (u32)FieldId::SPT_END); + auto field_name = decompile_int_enum_from_int(TypeSpec("sp-field-id"), ts, field_id); + const auto& field_info = field_kinds[field_id]; + if (!field_info.known) { + throw std::runtime_error("Unknown sparticle field: " + field_name); + } + + auto flag_name = decompile_int_enum_from_int(TypeSpec("sp-flag"), ts, flags); + goos::Object result; + + if (flag_name == "copy-from-other-field") { + result = decompile_sparticle_from_other(field.data, field_name, flag_name); + } else { + switch (field_info.kind) { + case FieldKind::TEXTURE_ID: + result = decompile_sparticle_tex_field_init(field.data, ts, field_name, flag_name); + break; + case FieldKind::FLOAT_WITH_RAND: + result = decompile_sparticle_float_with_rand_init(field.data, field_name, flag_name); + break; + case FieldKind::METER_WITH_RAND: + result = decompile_sparticle_float_meters_with_rand_init(field.data, field_name, flag_name); + break; + case FieldKind::DEGREES_WITH_RAND: + result = + decompile_sparticle_float_degrees_with_rand_init(field.data, field_name, flag_name); + break; + // case FieldKind::INT_WITH_RAND: + // result = decompile_sparticle_int_with_rand_init(field.data, field_name, + // flag_name); break; + case FieldKind::PLAIN_INT_WITH_RANDS: + result = decompile_sparticle_int_with_rand_init(field.data, field_name, flag_name); + break; + case FieldKind::PLAIN_INT: + result = decompile_sparticle_int_init(field.data, field_name, flag_name); + break; + case FieldKind::CPUINFO_FLAGS: + result = decompile_sparticle_flags(field.data, ts, field_name, flag_name); + break; + case FieldKind::END_FLAG: + result = decompile_sparticle_end(field.data, field_name, flag_name); + break; + case FieldKind::LAUNCHER_BY_ID: + result = decompile_sparticle_launcher_by_id(field.data, field_name, flag_name); + break; + case FieldKind::NO_FANCY_DECOMP: + assert(false); + break; + case FieldKind::FUNCTION: + result = decompile_sparticle_func(field.data, field_name, flag_name); + break; + case FieldKind::USERDATA: + result = decompile_sparticle_userdata_assert(field.data, field_name, flag_name); + break; + case FieldKind::ROT_X: + result = decompile_sparticle_rot_x(field.data, field_name, flag_name); + break; + case FieldKind::SOUND_SPEC: + result = + decompile_sparticle_sound_spec(field.data, field_name, flag_name, field.sound_spec); + break; + default: + assert(false); + } + } + + // fmt::print("Result: {}\n\n", result.print()); + return result; +} } // namespace decompiler /* diff --git a/decompiler/util/sparticle_decompile.h b/decompiler/util/sparticle_decompile.h index 7f5fbaa71a..6d6118cbd9 100644 --- a/decompiler/util/sparticle_decompile.h +++ b/decompiler/util/sparticle_decompile.h @@ -4,6 +4,7 @@ #include "common/type_system/TypeSpec.h" #include "decompiler/Disasm/DecompilerLabel.h" #include "decompiler/ObjectFile/LinkedObjectFile.h" +#include "decompiler/IR2/Form.h" namespace decompiler { goos::Object decompile_sparticle_field_init(const TypeSpec& type, @@ -12,6 +13,8 @@ goos::Object decompile_sparticle_field_init(const TypeSpec& type, const std::vector>& words, const TypeSystem& ts, const LinkedObjectFile* file); +goos::Object decompile_sparticle_field_init(const DefpartElement::StaticInfo::PartField& field, + const TypeSystem& ts); goos::Object decompile_sparticle_group_item(const TypeSpec& type, const DecompilerLabel& label, const std::vector& labels, diff --git a/docs/css/about.9eebd12b.css b/docs/css/about.9eebd12b.css deleted file mode 100644 index ce28f8ffbb..0000000000 --- a/docs/css/about.9eebd12b.css +++ /dev/null @@ -1 +0,0 @@ -.bg-img[data-v-6003c7cf]{background-image:url(../img/background.787a296e.jpg);background-repeat:no-repeat;background-position:50%;background-size:cover;min-height:50vh}.wrapped-pre[data-v-6003c7cf]{word-wrap:normal;white-space:pre-wrap;font-family:Roboto,sans-serif!important}.v-btn:not(.v-btn--outlined).accent,.v-btn:not(.v-btn--outlined).error,.v-btn:not(.v-btn--outlined).info,.v-btn:not(.v-btn--outlined).primary,.v-btn:not(.v-btn--outlined).secondary,.v-btn:not(.v-btn--outlined).success,.v-btn:not(.v-btn--outlined).warning{color:#fff}.theme--light.v-btn{color:rgba(0,0,0,.87)}.theme--light.v-btn.v-btn--disabled,.theme--light.v-btn.v-btn--disabled .v-btn__loading,.theme--light.v-btn.v-btn--disabled .v-icon{color:rgba(0,0,0,.26)!important}.theme--light.v-btn.v-btn--disabled.v-btn--has-bg{background-color:rgba(0,0,0,.12)!important}.theme--light.v-btn.v-btn--has-bg{background-color:#f5f5f5}.theme--light.v-btn.v-btn--outlined.v-btn--text{border-color:rgba(0,0,0,.12)}.theme--light.v-btn.v-btn--icon{color:rgba(0,0,0,.54)}.theme--light.v-btn:hover:before{opacity:.08}.theme--light.v-btn:focus:before{opacity:.24}.theme--light.v-btn--active:before,.theme--light.v-btn--active:hover:before{opacity:.18}.theme--light.v-btn--active:focus:before{opacity:.16}.theme--dark.v-btn{color:#fff}.theme--dark.v-btn.v-btn--disabled,.theme--dark.v-btn.v-btn--disabled .v-btn__loading,.theme--dark.v-btn.v-btn--disabled .v-icon{color:hsla(0,0%,100%,.3)!important}.theme--dark.v-btn.v-btn--disabled.v-btn--has-bg{background-color:hsla(0,0%,100%,.12)!important}.theme--dark.v-btn.v-btn--has-bg{background-color:#272727}.theme--dark.v-btn.v-btn--outlined.v-btn--text{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-btn.v-btn--icon{color:#fff}.theme--dark.v-btn:hover:before{opacity:.08}.theme--dark.v-btn:focus:before{opacity:.24}.theme--dark.v-btn--active:before,.theme--dark.v-btn--active:hover:before{opacity:.18}.theme--dark.v-btn--active:focus:before{opacity:.32}.v-btn{align-items:center;border-radius:4px;display:inline-flex;flex:0 0 auto;font-weight:500;letter-spacing:.0892857143em;justify-content:center;outline:0;position:relative;text-decoration:none;text-indent:.0892857143em;text-transform:uppercase;transition-duration:.28s;transition-property:box-shadow,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.v-btn.v-size--x-small{font-size:.625rem}.v-btn.v-size--small{font-size:.75rem}.v-btn.v-size--default,.v-btn.v-size--large{font-size:.875rem}.v-btn.v-size--x-large{font-size:1rem}.v-btn:before{background-color:currentColor;border-radius:inherit;bottom:0;color:inherit;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-btn:not(.v-btn--disabled){will-change:box-shadow}.v-btn:not(.v-btn--round).v-size--x-small{height:20px;min-width:36px;padding:0 8.8888888889px}.v-btn:not(.v-btn--round).v-size--small{height:28px;min-width:50px;padding:0 12.4444444444px}.v-btn:not(.v-btn--round).v-size--default{height:36px;min-width:64px;padding:0 16px}.v-btn:not(.v-btn--round).v-size--large{height:44px;min-width:78px;padding:0 19.5555555556px}.v-btn:not(.v-btn--round).v-size--x-large{height:52px;min-width:92px;padding:0 23.1111111111px}.v-btn>.v-btn__content .v-icon{color:inherit}.v-btn__content{align-items:center;color:inherit;display:flex;flex:1 0 auto;justify-content:inherit;line-height:normal;position:relative;transition:inherit;transition-property:opacity}.v-btn__content .v-icon.v-icon--left,.v-btn__content .v-icon.v-icon--right{font-size:18px;height:18px;width:18px}.v-application--is-ltr .v-btn__content .v-icon--left{margin-left:-4px;margin-right:8px}.v-application--is-ltr .v-btn__content .v-icon--right,.v-application--is-rtl .v-btn__content .v-icon--left{margin-left:8px;margin-right:-4px}.v-application--is-rtl .v-btn__content .v-icon--right{margin-left:-4px;margin-right:8px}.v-btn__loader{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.v-btn--absolute.v-btn--right,.v-btn--fixed.v-btn--right{right:16px}.v-btn--absolute.v-btn--left,.v-btn--fixed.v-btn--left{left:16px}.v-btn--absolute.v-btn--top,.v-btn--fixed.v-btn--top{top:16px}.v-btn--absolute.v-btn--bottom,.v-btn--fixed.v-btn--bottom{bottom:16px}.v-btn--absolute{position:absolute}.v-btn--fixed{position:fixed}.v-btn--block{display:flex;flex:1 0 auto;min-width:100%!important;max-width:auto}.v-btn--is-elevated{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:after{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:after{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:active{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.v-btn--disabled{pointer-events:none}.v-btn--fab,.v-btn--icon{min-height:0;min-width:0;padding:0}.v-btn--fab.v-size--x-small .v-icon,.v-btn--icon.v-size--x-small .v-icon{height:18px;font-size:18px;width:18px}.v-btn--fab.v-size--default .v-icon,.v-btn--fab.v-size--small .v-icon,.v-btn--icon.v-size--default .v-icon,.v-btn--icon.v-size--small .v-icon{height:24px;font-size:24px;width:24px}.v-btn--fab.v-size--large .v-icon,.v-btn--icon.v-size--large .v-icon{height:28px;font-size:28px;width:28px}.v-btn--fab.v-size--x-large .v-icon,.v-btn--icon.v-size--x-large .v-icon{height:32px;font-size:32px;width:32px}.v-btn--icon.v-size--x-small{height:20px;width:20px}.v-btn--icon.v-size--small{height:28px;width:28px}.v-btn--icon.v-size--default{height:36px;width:36px}.v-btn--icon.v-size--large{height:44px;width:44px}.v-btn--icon.v-size--x-large{height:52px;width:52px}.v-btn--fab.v-btn--absolute,.v-btn--fab.v-btn--fixed{z-index:4}.v-btn--fab.v-size--x-small{height:32px;width:32px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--bottom{bottom:-16px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--top{top:-16px}.v-btn--fab.v-size--small{height:40px;width:40px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--bottom{bottom:-20px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--top{top:-20px}.v-btn--fab.v-size--default{height:56px;width:56px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--bottom{bottom:-28px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--top{top:-28px}.v-btn--fab.v-size--large{height:64px;width:64px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--bottom{bottom:-32px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--top{top:-32px}.v-btn--fab.v-size--x-large{height:72px;width:72px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--bottom{bottom:-36px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--top{top:-36px}.v-btn--loading{pointer-events:none;transition:none}.v-btn--loading .v-btn__content{opacity:0}.v-btn--outlined{border:thin solid currentColor}.v-btn--plain:before{display:none}.v-btn--plain:not(.v-btn--active):not(.v-btn--loading):not(:focus):not(:hover) .v-btn__content{opacity:.62}.v-btn--round{border-radius:50%}.v-btn--rounded{border-radius:28px}.v-btn--tile{border-radius:0}.theme--light.v-sheet{background-color:#fff;border-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-sheet--outlined{border:thin solid rgba(0,0,0,.12)}.theme--dark.v-sheet{background-color:#1e1e1e;border-color:#1e1e1e;color:#fff}.theme--dark.v-sheet--outlined{border:thin solid hsla(0,0%,100%,.12)}.v-sheet{border-radius:0}.v-sheet:not(.v-sheet--outlined){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-sheet--shaped{border-radius:24px 0}.v-ripple__container{border-radius:inherit;width:100%;height:100%;z-index:0;contain:strict}.v-ripple__animation,.v-ripple__container{color:inherit;position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}.v-ripple__animation{border-radius:50%;background:currentColor;opacity:0;will-change:transform,opacity}.v-ripple__animation--enter{transition:none}.v-ripple__animation--in{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .1s cubic-bezier(.4,0,.2,1)}.v-ripple__animation--out{transition:opacity .3s cubic-bezier(.4,0,.2,1)}.v-progress-circular{position:relative;display:inline-flex;vertical-align:middle;justify-content:center;align-items:center}.v-progress-circular>svg{width:100%;height:100%;margin:auto;position:absolute;top:0;bottom:0;left:0;right:0;z-index:0}.v-progress-circular--indeterminate>svg{-webkit-animation:progress-circular-rotate 1.4s linear infinite;animation:progress-circular-rotate 1.4s linear infinite;transform-origin:center center;transition:all .2s ease-in-out}.v-progress-circular--indeterminate .v-progress-circular__overlay{-webkit-animation:progress-circular-dash 1.4s ease-in-out infinite;animation:progress-circular-dash 1.4s ease-in-out infinite;stroke-linecap:round;stroke-dasharray:80,200;stroke-dashoffset:0px}.v-progress-circular__info{align-items:center;display:flex;justify-content:center}.v-progress-circular__underlay{stroke:hsla(0,0%,62%,.4);z-index:1}.v-progress-circular__overlay{stroke:currentColor;z-index:2;transition:all .6s ease-in-out}@-webkit-keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-125px}}@keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-125px}}@-webkit-keyframes progress-circular-rotate{to{transform:rotate(1turn)}}@keyframes progress-circular-rotate{to{transform:rotate(1turn)}}.theme--light.v-card{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-card .v-card__subtitle,.theme--light.v-card>.v-card__text{color:rgba(0,0,0,.6)}.theme--dark.v-card{background-color:#1e1e1e;color:#fff}.theme--dark.v-card .v-card__subtitle,.theme--dark.v-card>.v-card__text{color:hsla(0,0%,100%,.7)}.v-sheet.v-card{border-radius:4px}.v-sheet.v-card:not(.v-sheet--outlined){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-sheet.v-card.v-sheet--shaped{border-radius:24px 4px}.v-card{border-width:thin;display:block;max-width:100%;outline:none;text-decoration:none;transition-property:box-shadow,opacity;overflow-wrap:break-word;position:relative;white-space:normal}.v-card>.v-card__progress+:not(.v-btn):not(.v-chip),.v-card>:first-child:not(.v-btn):not(.v-chip){border-top-left-radius:inherit;border-top-right-radius:inherit}.v-card>:last-child:not(.v-btn):not(.v-chip){border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-card__progress{top:0;left:0;right:0;overflow:hidden}.v-card__subtitle+.v-card__text{padding-top:0}.v-card__subtitle,.v-card__text{font-size:.875rem;font-weight:400;line-height:1.375rem;letter-spacing:.0071428571em}.v-card__subtitle,.v-card__text,.v-card__title{padding:16px}.v-card__title{align-items:center;display:flex;flex-wrap:wrap;font-size:1.25rem;font-weight:500;letter-spacing:.0125em;line-height:2rem;word-break:break-all}.v-card__title+.v-card__subtitle,.v-card__title+.v-card__text{padding-top:0}.v-card__title+.v-card__subtitle{margin-top:-16px}.v-card__text{width:100%}.v-card__actions{align-items:center;display:flex;padding:8px}.v-card__actions>.v-btn.v-btn{padding:0 8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn+.v-btn{margin-left:8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--left{margin-left:4px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--right{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn+.v-btn{margin-right:8px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--left{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--right{margin-left:4px}.v-card--flat{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-sheet.v-card--hover{cursor:pointer;transition:box-shadow .4s cubic-bezier(.25,.8,.25,1)}.v-sheet.v-card--hover:focus,.v-sheet.v-card--hover:hover{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-card--link,.v-card--link .v-chip{cursor:pointer}.v-card--link:focus:before{opacity:.08}.v-card--link:before{background:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s}.v-card--disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-card--disabled>:not(.v-card__progress){opacity:.6;transition:inherit}.v-card--loading{overflow:hidden}.v-card--raised{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.theme--light.v-progress-linear{color:rgba(0,0,0,.87)}.theme--dark.v-progress-linear{color:#fff}.v-progress-linear{background:transparent;overflow:hidden;position:relative;transition:.2s cubic-bezier(.4,0,.6,1);width:100%}.v-progress-linear__buffer{height:inherit;left:0;position:absolute;top:0;transition:inherit;width:100%}.v-progress-linear--reverse .v-progress-linear__buffer{left:auto;right:0}.v-progress-linear__background{bottom:0;left:0;position:absolute;top:0;transition:inherit}.v-progress-linear--reverse .v-progress-linear__background{left:auto;right:0}.v-progress-linear__content{align-items:center;display:flex;height:100%;left:0;justify-content:center;position:absolute;top:0;width:100%}.v-progress-linear--reverse .v-progress-linear__content{left:auto;right:0}.v-progress-linear__determinate{height:inherit;left:0;position:absolute;transition:inherit}.v-progress-linear--reverse .v-progress-linear__determinate{left:auto;right:0}.v-progress-linear .v-progress-linear__indeterminate .long,.v-progress-linear .v-progress-linear__indeterminate .short{background-color:inherit;bottom:0;height:inherit;left:0;position:absolute;right:auto;top:0;width:auto;will-change:left,right}.v-progress-linear .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-ltr;animation-name:indeterminate-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-ltr;animation-name:indeterminate-short-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--reverse .v-progress-linear__indeterminate .long,.v-progress-linear--reverse .v-progress-linear__indeterminate .short{left:auto;right:0}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-rtl;animation-name:indeterminate-rtl}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-rtl;animation-name:indeterminate-short-rtl}.v-progress-linear__stream{-webkit-animation:stream-ltr .25s linear infinite;animation:stream-ltr .25s linear infinite;border-color:currentColor;border-top:4px dotted;bottom:0;left:auto;right:-8px;opacity:.3;pointer-events:none;position:absolute;top:calc(50% - 2px);transition:inherit}.v-progress-linear--reverse .v-progress-linear__stream{-webkit-animation:stream-rtl .25s linear infinite;animation:stream-rtl .25s linear infinite;left:-8px;right:auto}.v-progress-linear__wrapper{overflow:hidden;position:relative;transition:inherit}.v-progress-linear--absolute,.v-progress-linear--fixed{left:0;z-index:1}.v-progress-linear--absolute{position:absolute}.v-progress-linear--fixed{position:fixed}.v-progress-linear--reactive .v-progress-linear__content{pointer-events:none}.v-progress-linear--rounded{border-radius:4px}.v-progress-linear--striped .v-progress-linear__determinate{background-image:linear-gradient(135deg,hsla(0,0%,100%,.25) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.25) 0,hsla(0,0%,100%,.25) 75%,transparent 0,transparent);background-size:40px 40px;background-repeat:repeat}.v-progress-linear--query .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-ltr;animation-name:query-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-ltr;animation-name:query-short-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-rtl;animation-name:query-rtl}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-rtl;animation-name:query-short-rtl}@-webkit-keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@-webkit-keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@-webkit-keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@-webkit-keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@-webkit-keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@-webkit-keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@-webkit-keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@-webkit-keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@-webkit-keyframes stream-ltr{to{transform:translateX(-8px)}}@keyframes stream-ltr{to{transform:translateX(-8px)}}@-webkit-keyframes stream-rtl{to{transform:translateX(8px)}}@keyframes stream-rtl{to{transform:translateX(8px)}}.container{width:100%;padding:12px;margin-right:auto;margin-left:auto}@media(min-width:960px){.container{max-width:900px}}@media(min-width:1264px){.container{max-width:1185px}}@media(min-width:1904px){.container{max-width:1785px}}.container--fluid{max-width:100%}.row{display:flex;flex-wrap:wrap;flex:1 1 auto;margin:-12px}.row+.row{margin-top:12px}.row+.row--dense{margin-top:4px}.row--dense{margin:-4px}.row--dense>.col,.row--dense>[class*=col-]{padding:4px}.row.no-gutters{margin:0}.row.no-gutters>.col,.row.no-gutters>[class*=col-]{padding:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{width:100%;padding:12px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-3{margin-left:25%}.v-application--is-rtl .offset-3{margin-right:25%}.v-application--is-ltr .offset-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-6{margin-left:50%}.v-application--is-rtl .offset-6{margin-right:50%}.v-application--is-ltr .offset-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-9{margin-left:75%}.v-application--is-rtl .offset-9{margin-right:75%}.v-application--is-ltr .offset-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-11{margin-right:91.6666666667%}@media(min-width:600px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-sm-0{margin-left:0}.v-application--is-rtl .offset-sm-0{margin-right:0}.v-application--is-ltr .offset-sm-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-sm-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-sm-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-sm-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-sm-3{margin-left:25%}.v-application--is-rtl .offset-sm-3{margin-right:25%}.v-application--is-ltr .offset-sm-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-sm-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-sm-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-sm-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-sm-6{margin-left:50%}.v-application--is-rtl .offset-sm-6{margin-right:50%}.v-application--is-ltr .offset-sm-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-sm-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-sm-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-sm-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-sm-9{margin-left:75%}.v-application--is-rtl .offset-sm-9{margin-right:75%}.v-application--is-ltr .offset-sm-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-sm-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-sm-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-sm-11{margin-right:91.6666666667%}}@media(min-width:960px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-md-0{margin-left:0}.v-application--is-rtl .offset-md-0{margin-right:0}.v-application--is-ltr .offset-md-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-md-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-md-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-md-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-md-3{margin-left:25%}.v-application--is-rtl .offset-md-3{margin-right:25%}.v-application--is-ltr .offset-md-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-md-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-md-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-md-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-md-6{margin-left:50%}.v-application--is-rtl .offset-md-6{margin-right:50%}.v-application--is-ltr .offset-md-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-md-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-md-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-md-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-md-9{margin-left:75%}.v-application--is-rtl .offset-md-9{margin-right:75%}.v-application--is-ltr .offset-md-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-md-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-md-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-md-11{margin-right:91.6666666667%}}@media(min-width:1264px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-lg-0{margin-left:0}.v-application--is-rtl .offset-lg-0{margin-right:0}.v-application--is-ltr .offset-lg-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-lg-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-lg-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-lg-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-lg-3{margin-left:25%}.v-application--is-rtl .offset-lg-3{margin-right:25%}.v-application--is-ltr .offset-lg-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-lg-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-lg-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-lg-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-lg-6{margin-left:50%}.v-application--is-rtl .offset-lg-6{margin-right:50%}.v-application--is-ltr .offset-lg-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-lg-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-lg-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-lg-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-lg-9{margin-left:75%}.v-application--is-rtl .offset-lg-9{margin-right:75%}.v-application--is-ltr .offset-lg-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-lg-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-lg-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-lg-11{margin-right:91.6666666667%}}@media(min-width:1904px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-xl-0{margin-left:0}.v-application--is-rtl .offset-xl-0{margin-right:0}.v-application--is-ltr .offset-xl-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-xl-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-xl-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-xl-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-xl-3{margin-left:25%}.v-application--is-rtl .offset-xl-3{margin-right:25%}.v-application--is-ltr .offset-xl-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-xl-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-xl-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-xl-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-xl-6{margin-left:50%}.v-application--is-rtl .offset-xl-6{margin-right:50%}.v-application--is-ltr .offset-xl-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-xl-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-xl-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-xl-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-xl-9{margin-left:75%}.v-application--is-rtl .offset-xl-9{margin-right:75%}.v-application--is-ltr .offset-xl-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-xl-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-xl-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-xl-11{margin-right:91.6666666667%}}.container.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.fill-height{align-items:center;display:flex;flex-wrap:wrap}.container.fill-height>.row{flex:1 1 100%;max-width:calc(100% + 24px)}.container.fill-height>.layout{height:100%;flex:1 1 auto}.container.fill-height>.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.grid-list-xs .layout .flex{padding:1px}.container.grid-list-xs .layout:only-child{margin:-1px}.container.grid-list-xs .layout:not(:only-child){margin:auto -1px}.container.grid-list-xs :not(:only-child) .layout:first-child{margin-top:-1px}.container.grid-list-xs :not(:only-child) .layout:last-child{margin-bottom:-1px}.container.grid-list-sm .layout .flex{padding:2px}.container.grid-list-sm .layout:only-child{margin:-2px}.container.grid-list-sm .layout:not(:only-child){margin:auto -2px}.container.grid-list-sm :not(:only-child) .layout:first-child{margin-top:-2px}.container.grid-list-sm :not(:only-child) .layout:last-child{margin-bottom:-2px}.container.grid-list-md .layout .flex{padding:4px}.container.grid-list-md .layout:only-child{margin:-4px}.container.grid-list-md .layout:not(:only-child){margin:auto -4px}.container.grid-list-md :not(:only-child) .layout:first-child{margin-top:-4px}.container.grid-list-md :not(:only-child) .layout:last-child{margin-bottom:-4px}.container.grid-list-lg .layout .flex{padding:8px}.container.grid-list-lg .layout:only-child{margin:-8px}.container.grid-list-lg .layout:not(:only-child){margin:auto -8px}.container.grid-list-lg :not(:only-child) .layout:first-child{margin-top:-8px}.container.grid-list-lg :not(:only-child) .layout:last-child{margin-bottom:-8px}.container.grid-list-xl .layout .flex{padding:12px}.container.grid-list-xl .layout:only-child{margin:-12px}.container.grid-list-xl .layout:not(:only-child){margin:auto -12px}.container.grid-list-xl :not(:only-child) .layout:first-child{margin-top:-12px}.container.grid-list-xl :not(:only-child) .layout:last-child{margin-bottom:-12px}.layout{display:flex;flex:1 1 auto;flex-wrap:nowrap;min-width:0}.layout.reverse{flex-direction:row-reverse}.layout.column{flex-direction:column}.layout.column.reverse{flex-direction:column-reverse}.layout.column>.flex{max-width:100%}.layout.wrap{flex-wrap:wrap}.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}@media (min-width:0){.flex.xs12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xs12{order:12}.flex.xs11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xs11{order:11}.flex.xs10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xs10{order:10}.flex.xs9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xs9{order:9}.flex.xs8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xs8{order:8}.flex.xs7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xs7{order:7}.flex.xs6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xs6{order:6}.flex.xs5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xs5{order:5}.flex.xs4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xs4{order:4}.flex.xs3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xs3{order:3}.flex.xs2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xs2{order:2}.flex.xs1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xs1{order:1}.v-application--is-ltr .flex.offset-xs12{margin-left:100%}.v-application--is-rtl .flex.offset-xs12{margin-right:100%}.v-application--is-ltr .flex.offset-xs11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xs11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xs10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xs10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xs9{margin-left:75%}.v-application--is-rtl .flex.offset-xs9{margin-right:75%}.v-application--is-ltr .flex.offset-xs8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xs8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xs7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xs7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xs6{margin-left:50%}.v-application--is-rtl .flex.offset-xs6{margin-right:50%}.v-application--is-ltr .flex.offset-xs5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xs5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xs4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xs4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xs3{margin-left:25%}.v-application--is-rtl .flex.offset-xs3{margin-right:25%}.v-application--is-ltr .flex.offset-xs2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xs2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xs1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xs1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xs0{margin-left:0}.v-application--is-rtl .flex.offset-xs0{margin-right:0}}@media (min-width:600px){.flex.sm12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-sm12{order:12}.flex.sm11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-sm11{order:11}.flex.sm10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-sm10{order:10}.flex.sm9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-sm9{order:9}.flex.sm8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-sm8{order:8}.flex.sm7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-sm7{order:7}.flex.sm6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-sm6{order:6}.flex.sm5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-sm5{order:5}.flex.sm4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-sm4{order:4}.flex.sm3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-sm3{order:3}.flex.sm2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-sm2{order:2}.flex.sm1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-sm1{order:1}.v-application--is-ltr .flex.offset-sm12{margin-left:100%}.v-application--is-rtl .flex.offset-sm12{margin-right:100%}.v-application--is-ltr .flex.offset-sm11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-sm11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-sm10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-sm10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-sm9{margin-left:75%}.v-application--is-rtl .flex.offset-sm9{margin-right:75%}.v-application--is-ltr .flex.offset-sm8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-sm8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-sm7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-sm7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-sm6{margin-left:50%}.v-application--is-rtl .flex.offset-sm6{margin-right:50%}.v-application--is-ltr .flex.offset-sm5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-sm5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-sm4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-sm4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-sm3{margin-left:25%}.v-application--is-rtl .flex.offset-sm3{margin-right:25%}.v-application--is-ltr .flex.offset-sm2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-sm2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-sm1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-sm1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-sm0{margin-left:0}.v-application--is-rtl .flex.offset-sm0{margin-right:0}}@media (min-width:960px){.flex.md12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-md12{order:12}.flex.md11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-md11{order:11}.flex.md10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-md10{order:10}.flex.md9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-md9{order:9}.flex.md8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-md8{order:8}.flex.md7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-md7{order:7}.flex.md6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-md6{order:6}.flex.md5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-md5{order:5}.flex.md4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-md4{order:4}.flex.md3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-md3{order:3}.flex.md2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-md2{order:2}.flex.md1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-md1{order:1}.v-application--is-ltr .flex.offset-md12{margin-left:100%}.v-application--is-rtl .flex.offset-md12{margin-right:100%}.v-application--is-ltr .flex.offset-md11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-md11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-md10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-md10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-md9{margin-left:75%}.v-application--is-rtl .flex.offset-md9{margin-right:75%}.v-application--is-ltr .flex.offset-md8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-md8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-md7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-md7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-md6{margin-left:50%}.v-application--is-rtl .flex.offset-md6{margin-right:50%}.v-application--is-ltr .flex.offset-md5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-md5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-md4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-md4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-md3{margin-left:25%}.v-application--is-rtl .flex.offset-md3{margin-right:25%}.v-application--is-ltr .flex.offset-md2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-md2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-md1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-md1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-md0{margin-left:0}.v-application--is-rtl .flex.offset-md0{margin-right:0}}@media (min-width:1264px){.flex.lg12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-lg12{order:12}.flex.lg11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-lg11{order:11}.flex.lg10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-lg10{order:10}.flex.lg9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-lg9{order:9}.flex.lg8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-lg8{order:8}.flex.lg7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-lg7{order:7}.flex.lg6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-lg6{order:6}.flex.lg5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-lg5{order:5}.flex.lg4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-lg4{order:4}.flex.lg3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-lg3{order:3}.flex.lg2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-lg2{order:2}.flex.lg1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-lg1{order:1}.v-application--is-ltr .flex.offset-lg12{margin-left:100%}.v-application--is-rtl .flex.offset-lg12{margin-right:100%}.v-application--is-ltr .flex.offset-lg11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-lg11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-lg10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-lg10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-lg9{margin-left:75%}.v-application--is-rtl .flex.offset-lg9{margin-right:75%}.v-application--is-ltr .flex.offset-lg8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-lg8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-lg7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-lg7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-lg6{margin-left:50%}.v-application--is-rtl .flex.offset-lg6{margin-right:50%}.v-application--is-ltr .flex.offset-lg5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-lg5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-lg4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-lg4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-lg3{margin-left:25%}.v-application--is-rtl .flex.offset-lg3{margin-right:25%}.v-application--is-ltr .flex.offset-lg2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-lg2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-lg1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-lg1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-lg0{margin-left:0}.v-application--is-rtl .flex.offset-lg0{margin-right:0}}@media (min-width:1904px){.flex.xl12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xl12{order:12}.flex.xl11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xl11{order:11}.flex.xl10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xl10{order:10}.flex.xl9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xl9{order:9}.flex.xl8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xl8{order:8}.flex.xl7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xl7{order:7}.flex.xl6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xl6{order:6}.flex.xl5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xl5{order:5}.flex.xl4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xl4{order:4}.flex.xl3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xl3{order:3}.flex.xl2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xl2{order:2}.flex.xl1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xl1{order:1}.v-application--is-ltr .flex.offset-xl12{margin-left:100%}.v-application--is-rtl .flex.offset-xl12{margin-right:100%}.v-application--is-ltr .flex.offset-xl11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xl11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xl10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xl10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xl9{margin-left:75%}.v-application--is-rtl .flex.offset-xl9{margin-right:75%}.v-application--is-ltr .flex.offset-xl8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xl8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xl7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xl7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xl6{margin-left:50%}.v-application--is-rtl .flex.offset-xl6{margin-right:50%}.v-application--is-ltr .flex.offset-xl5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xl5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xl4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xl4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xl3{margin-left:25%}.v-application--is-rtl .flex.offset-xl3{margin-right:25%}.v-application--is-ltr .flex.offset-xl2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xl2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xl1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xl1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xl0{margin-left:0}.v-application--is-rtl .flex.offset-xl0{margin-right:0}}.child-flex>*,.flex{flex:1 1 auto;max-width:100%}.child-flex>.grow-shrink-0,.flex.grow-shrink-0{flex-grow:0;flex-shrink:0}.grow,.spacer{flex-grow:1!important}.grow{flex-shrink:0!important}.shrink{flex-grow:0!important;flex-shrink:1!important}.fill-height{height:100%}.theme--light.v-icon{color:rgba(0,0,0,.54)}.theme--light.v-icon:focus:after{opacity:.12}.theme--light.v-icon.v-icon.v-icon--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-icon{color:#fff}.theme--dark.v-icon:focus:after{opacity:.24}.theme--dark.v-icon.v-icon.v-icon--disabled{color:hsla(0,0%,100%,.5)!important}.v-icon.v-icon{align-items:center;display:inline-flex;font-feature-settings:"liga";font-size:24px;justify-content:center;letter-spacing:normal;line-height:1;position:relative;text-indent:0;transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-icon.v-icon:after{background-color:currentColor;border-radius:50%;content:"";display:inline-block;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transform:scale(1.3);width:100%;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-icon.v-icon--dense{font-size:20px}.v-icon--right{margin-left:8px}.v-icon--left{margin-right:8px}.v-icon.v-icon.v-icon--link{cursor:pointer;outline:none}.v-icon--disabled{pointer-events:none}.v-icon--dense__component,.v-icon--dense__svg{height:20px}.v-icon__component,.v-icon__svg{height:24px;width:24px}.v-icon__svg{fill:currentColor}.theme--light.v-image{color:rgba(0,0,0,.87)}.theme--dark.v-image{color:#fff}.v-image{z-index:0}.v-image__image,.v-image__placeholder{z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%}.v-image__image{background-repeat:no-repeat}.v-image__image--preload{filter:blur(2px)}.v-image__image--contain{background-size:contain}.v-image__image--cover{background-size:cover}.v-responsive{position:relative;overflow:hidden;flex:1 0 auto;max-width:100%;display:flex}.v-responsive__content{flex:1 0 0px;max-width:100%}.v-application--is-ltr .v-responsive__sizer~.v-responsive__content{margin-left:-100%}.v-application--is-rtl .v-responsive__sizer~.v-responsive__content{margin-right:-100%}.v-responsive__sizer{transition:padding-bottom .2s cubic-bezier(.25,.8,.5,1);flex:1 0 0px}.theme--light.v-subheader{color:rgba(0,0,0,.6)}.theme--dark.v-subheader{color:hsla(0,0%,100%,.7)}.v-subheader{align-items:center;display:flex;height:48px;font-size:.875rem;font-weight:400;padding:0 16px 0 16px}.v-subheader--inset{margin-left:56px} \ No newline at end of file diff --git a/docs/css/chunk-21f25f00.css b/docs/css/chunk-21f25f00.css new file mode 100644 index 0000000000..3db2fed246 --- /dev/null +++ b/docs/css/chunk-21f25f00.css @@ -0,0 +1 @@ +.overlay-page-width[data-v-77084e79]{width:100%}.img-caption[data-v-77084e79]{margin:1em;font-weight:700;text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}.video-iframe[data-v-77084e79]{min-height:400px}.theme--light.v-overlay{color:rgba(0,0,0,.87)}.theme--dark.v-overlay{color:#fff}.v-overlay{align-items:center;border-radius:inherit;display:flex;justify-content:center;position:fixed;top:0;left:0;right:0;bottom:0;pointer-events:none;transition:.3s cubic-bezier(.25,.8,.5,1),z-index 1ms}.v-overlay__content{position:relative}.v-overlay__scrim{border-radius:inherit;bottom:0;height:100%;left:0;position:absolute;right:0;top:0;transition:inherit;width:100%;will-change:opacity}.v-overlay--absolute{position:absolute}.v-overlay--active{pointer-events:auto} \ No newline at end of file diff --git a/docs/css/chunk-461a09f2.css b/docs/css/chunk-461a09f2.css new file mode 100644 index 0000000000..aae637e7e0 --- /dev/null +++ b/docs/css/chunk-461a09f2.css @@ -0,0 +1 @@ +.bg-img[data-v-7c2b5787]{background-image:url(../img/background-new.jpg);background-repeat:no-repeat;background-position:50%;background-size:cover;min-height:100vh}.wrapped-pre[data-v-7c2b5787]{word-wrap:normal;white-space:pre-wrap;font-family:Lexend,sans-serif!important}.text-stroke[data-v-7c2b5787]{text-shadow:-1px -1px 0 #000,1px -1px 0 #000,-1px 1px 0 #000,1px 1px 0 #000}.v-avatar{align-items:center;border-radius:50%;display:inline-flex;justify-content:center;line-height:normal;position:relative;text-align:center;vertical-align:middle;overflow:hidden}.v-avatar .v-icon,.v-avatar .v-image,.v-avatar .v-responsive__content,.v-avatar img,.v-avatar svg{border-radius:inherit;display:inline-flex;height:inherit;width:inherit}.v-btn:not(.v-btn--outlined).accent,.v-btn:not(.v-btn--outlined).error,.v-btn:not(.v-btn--outlined).info,.v-btn:not(.v-btn--outlined).primary,.v-btn:not(.v-btn--outlined).secondary,.v-btn:not(.v-btn--outlined).success,.v-btn:not(.v-btn--outlined).warning{color:#fff}.theme--light.v-btn{color:rgba(0,0,0,.87)}.theme--light.v-btn.v-btn--disabled,.theme--light.v-btn.v-btn--disabled .v-btn__loading,.theme--light.v-btn.v-btn--disabled .v-icon{color:rgba(0,0,0,.26)!important}.theme--light.v-btn.v-btn--disabled.v-btn--has-bg{background-color:rgba(0,0,0,.12)!important}.theme--light.v-btn.v-btn--has-bg{background-color:#f5f5f5}.theme--light.v-btn.v-btn--outlined.v-btn--text{border-color:rgba(0,0,0,.12)}.theme--light.v-btn.v-btn--icon{color:rgba(0,0,0,.54)}.theme--light.v-btn:hover:before{opacity:.08}.theme--light.v-btn:focus:before{opacity:.24}.theme--light.v-btn--active:before,.theme--light.v-btn--active:hover:before{opacity:.18}.theme--light.v-btn--active:focus:before{opacity:.16}.theme--dark.v-btn{color:#fff}.theme--dark.v-btn.v-btn--disabled,.theme--dark.v-btn.v-btn--disabled .v-btn__loading,.theme--dark.v-btn.v-btn--disabled .v-icon{color:hsla(0,0%,100%,.3)!important}.theme--dark.v-btn.v-btn--disabled.v-btn--has-bg{background-color:hsla(0,0%,100%,.12)!important}.theme--dark.v-btn.v-btn--has-bg{background-color:#272727}.theme--dark.v-btn.v-btn--outlined.v-btn--text{border-color:hsla(0,0%,100%,.12)}.theme--dark.v-btn.v-btn--icon{color:#fff}.theme--dark.v-btn:hover:before{opacity:.08}.theme--dark.v-btn:focus:before{opacity:.24}.theme--dark.v-btn--active:before,.theme--dark.v-btn--active:hover:before{opacity:.18}.theme--dark.v-btn--active:focus:before{opacity:.32}.v-btn{align-items:center;border-radius:4px;display:inline-flex;flex:0 0 auto;font-weight:500;letter-spacing:.0892857143em;justify-content:center;outline:0;position:relative;text-decoration:none;text-indent:.0892857143em;text-transform:uppercase;transition-duration:.28s;transition-property:box-shadow,transform,opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;white-space:nowrap}.v-btn.v-size--x-small{font-size:.625rem}.v-btn.v-size--small{font-size:.75rem}.v-btn.v-size--default,.v-btn.v-size--large{font-size:.875rem}.v-btn.v-size--x-large{font-size:1rem}.v-btn:before{background-color:currentColor;border-radius:inherit;bottom:0;color:inherit;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-btn:not(.v-btn--disabled){will-change:box-shadow}.v-btn:not(.v-btn--round).v-size--x-small{height:20px;min-width:36px;padding:0 8.8888888889px}.v-btn:not(.v-btn--round).v-size--small{height:28px;min-width:50px;padding:0 12.4444444444px}.v-btn:not(.v-btn--round).v-size--default{height:36px;min-width:64px;padding:0 16px}.v-btn:not(.v-btn--round).v-size--large{height:44px;min-width:78px;padding:0 19.5555555556px}.v-btn:not(.v-btn--round).v-size--x-large{height:52px;min-width:92px;padding:0 23.1111111111px}.v-btn>.v-btn__content .v-icon{color:inherit}.v-btn__content{align-items:center;color:inherit;display:flex;flex:1 0 auto;justify-content:inherit;line-height:normal;position:relative;transition:inherit;transition-property:opacity}.v-btn__content .v-icon.v-icon--left,.v-btn__content .v-icon.v-icon--right{font-size:18px;height:18px;width:18px}.v-application--is-ltr .v-btn__content .v-icon--left{margin-left:-4px;margin-right:8px}.v-application--is-ltr .v-btn__content .v-icon--right,.v-application--is-rtl .v-btn__content .v-icon--left{margin-left:8px;margin-right:-4px}.v-application--is-rtl .v-btn__content .v-icon--right{margin-left:-4px;margin-right:8px}.v-btn__loader{align-items:center;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%}.v-btn--absolute.v-btn--right,.v-btn--fixed.v-btn--right{right:16px}.v-btn--absolute.v-btn--left,.v-btn--fixed.v-btn--left{left:16px}.v-btn--absolute.v-btn--top,.v-btn--fixed.v-btn--top{top:16px}.v-btn--absolute.v-btn--bottom,.v-btn--fixed.v-btn--bottom{bottom:16px}.v-btn--absolute{position:absolute}.v-btn--fixed{position:fixed}.v-btn--block{display:flex;flex:1 0 auto;min-width:100%!important;max-width:auto}.v-btn--is-elevated{box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:after{box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12)}.v-btn--is-elevated:active{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab{box-shadow:0 3px 5px -1px rgba(0,0,0,.2),0 6px 10px 0 rgba(0,0,0,.14),0 1px 18px 0 rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:after{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-btn--is-elevated.v-btn--fab:active{box-shadow:0 7px 8px -4px rgba(0,0,0,.2),0 12px 17px 2px rgba(0,0,0,.14),0 5px 22px 4px rgba(0,0,0,.12)}.v-btn--disabled{pointer-events:none}.v-btn--fab,.v-btn--icon{min-height:0;min-width:0;padding:0}.v-btn--fab.v-size--x-small .v-icon,.v-btn--icon.v-size--x-small .v-icon{height:18px;font-size:18px;width:18px}.v-btn--fab.v-size--default .v-icon,.v-btn--fab.v-size--small .v-icon,.v-btn--icon.v-size--default .v-icon,.v-btn--icon.v-size--small .v-icon{height:24px;font-size:24px;width:24px}.v-btn--fab.v-size--large .v-icon,.v-btn--icon.v-size--large .v-icon{height:28px;font-size:28px;width:28px}.v-btn--fab.v-size--x-large .v-icon,.v-btn--icon.v-size--x-large .v-icon{height:32px;font-size:32px;width:32px}.v-btn--icon.v-size--x-small{height:20px;width:20px}.v-btn--icon.v-size--small{height:28px;width:28px}.v-btn--icon.v-size--default{height:36px;width:36px}.v-btn--icon.v-size--large{height:44px;width:44px}.v-btn--icon.v-size--x-large{height:52px;width:52px}.v-btn--fab.v-btn--absolute,.v-btn--fab.v-btn--fixed{z-index:4}.v-btn--fab.v-size--x-small{height:32px;width:32px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--bottom{bottom:-16px}.v-btn--fab.v-size--x-small.v-btn--absolute.v-btn--top{top:-16px}.v-btn--fab.v-size--small{height:40px;width:40px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--bottom{bottom:-20px}.v-btn--fab.v-size--small.v-btn--absolute.v-btn--top{top:-20px}.v-btn--fab.v-size--default{height:56px;width:56px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--bottom{bottom:-28px}.v-btn--fab.v-size--default.v-btn--absolute.v-btn--top{top:-28px}.v-btn--fab.v-size--large{height:64px;width:64px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--bottom{bottom:-32px}.v-btn--fab.v-size--large.v-btn--absolute.v-btn--top{top:-32px}.v-btn--fab.v-size--x-large{height:72px;width:72px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--bottom{bottom:-36px}.v-btn--fab.v-size--x-large.v-btn--absolute.v-btn--top{top:-36px}.v-btn--loading{pointer-events:none;transition:none}.v-btn--loading .v-btn__content{opacity:0}.v-btn--outlined{border:thin solid currentColor}.v-btn--plain:before{display:none}.v-btn--plain:not(.v-btn--active):not(.v-btn--loading):not(:focus):not(:hover) .v-btn__content{opacity:.62}.v-btn--round{border-radius:50%}.v-btn--rounded{border-radius:28px}.v-btn--tile{border-radius:0}.theme--light.v-sheet{background-color:#fff;border-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-sheet--outlined{border:thin solid rgba(0,0,0,.12)}.theme--dark.v-sheet{background-color:#1e1e1e;border-color:#1e1e1e;color:#fff}.theme--dark.v-sheet--outlined{border:thin solid hsla(0,0%,100%,.12)}.v-sheet{border-radius:0}.v-sheet:not(.v-sheet--outlined){box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)}.v-sheet.v-sheet--shaped{border-radius:24px 0}.v-ripple__container{border-radius:inherit;width:100%;height:100%;z-index:0;contain:strict}.v-ripple__animation,.v-ripple__container{color:inherit;position:absolute;left:0;top:0;overflow:hidden;pointer-events:none}.v-ripple__animation{border-radius:50%;background:currentColor;opacity:0;will-change:transform,opacity}.v-ripple__animation--enter{transition:none}.v-ripple__animation--in{transition:transform .25s cubic-bezier(.4,0,.2,1),opacity .1s cubic-bezier(.4,0,.2,1)}.v-ripple__animation--out{transition:opacity .3s cubic-bezier(.4,0,.2,1)}.theme--light.v-card{background-color:#fff;color:rgba(0,0,0,.87)}.theme--light.v-card .v-card__subtitle,.theme--light.v-card>.v-card__text{color:rgba(0,0,0,.6)}.theme--dark.v-card{background-color:#1e1e1e;color:#fff}.theme--dark.v-card .v-card__subtitle,.theme--dark.v-card>.v-card__text{color:hsla(0,0%,100%,.7)}.v-sheet.v-card{border-radius:4px}.v-sheet.v-card:not(.v-sheet--outlined){box-shadow:0 3px 1px -2px rgba(0,0,0,.2),0 2px 2px 0 rgba(0,0,0,.14),0 1px 5px 0 rgba(0,0,0,.12)}.v-sheet.v-card.v-sheet--shaped{border-radius:24px 4px}.v-card{border-width:thin;display:block;max-width:100%;outline:none;text-decoration:none;transition-property:box-shadow,opacity;overflow-wrap:break-word;position:relative;white-space:normal}.v-card>.v-card__progress+:not(.v-btn):not(.v-chip),.v-card>:first-child:not(.v-btn):not(.v-chip){border-top-left-radius:inherit;border-top-right-radius:inherit}.v-card>:last-child:not(.v-btn):not(.v-chip){border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.v-card__progress{top:0;left:0;right:0;overflow:hidden}.v-card__subtitle+.v-card__text{padding-top:0}.v-card__subtitle,.v-card__text{font-size:.875rem;font-weight:400;line-height:1.375rem;letter-spacing:.0071428571em}.v-card__subtitle,.v-card__text,.v-card__title{padding:16px}.v-card__title{align-items:center;display:flex;flex-wrap:wrap;font-size:1.25rem;font-weight:500;letter-spacing:.0125em;line-height:2rem;word-break:break-all}.v-card__title+.v-card__subtitle,.v-card__title+.v-card__text{padding-top:0}.v-card__title+.v-card__subtitle{margin-top:-16px}.v-card__text{width:100%}.v-card__actions{align-items:center;display:flex;padding:8px}.v-card__actions>.v-btn.v-btn{padding:0 8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn+.v-btn{margin-left:8px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--left{margin-left:4px}.v-application--is-ltr .v-card__actions>.v-btn.v-btn .v-icon--right{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn+.v-btn{margin-right:8px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--left{margin-right:4px}.v-application--is-rtl .v-card__actions>.v-btn.v-btn .v-icon--right{margin-left:4px}.v-card--flat{box-shadow:0 0 0 0 rgba(0,0,0,.2),0 0 0 0 rgba(0,0,0,.14),0 0 0 0 rgba(0,0,0,.12)!important}.v-sheet.v-card--hover{cursor:pointer;transition:box-shadow .4s cubic-bezier(.25,.8,.25,1)}.v-sheet.v-card--hover:focus,.v-sheet.v-card--hover:hover{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.v-card--link,.v-card--link .v-chip{cursor:pointer}.v-card--link:focus:before{opacity:.08}.v-card--link:before{background:currentColor;bottom:0;content:"";left:0;opacity:0;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .2s}.v-card--disabled{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-card--disabled>:not(.v-card__progress){opacity:.6;transition:inherit}.v-card--loading{overflow:hidden}.v-card--raised{box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.theme--light.v-progress-linear{color:rgba(0,0,0,.87)}.theme--dark.v-progress-linear{color:#fff}.v-progress-linear{background:transparent;overflow:hidden;position:relative;transition:.2s cubic-bezier(.4,0,.6,1);width:100%}.v-progress-linear__buffer{height:inherit;left:0;position:absolute;top:0;transition:inherit;width:100%}.v-progress-linear--reverse .v-progress-linear__buffer{left:auto;right:0}.v-progress-linear__background{bottom:0;left:0;position:absolute;top:0;transition:inherit}.v-progress-linear--reverse .v-progress-linear__background{left:auto;right:0}.v-progress-linear__content{align-items:center;display:flex;height:100%;left:0;justify-content:center;position:absolute;top:0;width:100%}.v-progress-linear--reverse .v-progress-linear__content{left:auto;right:0}.v-progress-linear__determinate{height:inherit;left:0;position:absolute;transition:inherit}.v-progress-linear--reverse .v-progress-linear__determinate{left:auto;right:0}.v-progress-linear .v-progress-linear__indeterminate .long,.v-progress-linear .v-progress-linear__indeterminate .short{background-color:inherit;bottom:0;height:inherit;left:0;position:absolute;right:auto;top:0;width:auto;will-change:left,right}.v-progress-linear .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-ltr;animation-name:indeterminate-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-ltr;animation-name:indeterminate-short-ltr;-webkit-animation-duration:2.2s;animation-duration:2.2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--reverse .v-progress-linear__indeterminate .long,.v-progress-linear--reverse .v-progress-linear__indeterminate .short{left:auto;right:0}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:indeterminate-rtl;animation-name:indeterminate-rtl}.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:indeterminate-short-rtl;animation-name:indeterminate-short-rtl}.v-progress-linear__stream{-webkit-animation:stream-ltr .25s linear infinite;animation:stream-ltr .25s linear infinite;border-color:currentColor;border-top:4px dotted;bottom:0;left:auto;right:-8px;opacity:.3;pointer-events:none;position:absolute;top:calc(50% - 2px);transition:inherit}.v-progress-linear--reverse .v-progress-linear__stream{-webkit-animation:stream-rtl .25s linear infinite;animation:stream-rtl .25s linear infinite;left:-8px;right:auto}.v-progress-linear__wrapper{overflow:hidden;position:relative;transition:inherit}.v-progress-linear--absolute,.v-progress-linear--fixed{left:0;z-index:1}.v-progress-linear--absolute{position:absolute}.v-progress-linear--fixed{position:fixed}.v-progress-linear--reactive .v-progress-linear__content{pointer-events:none}.v-progress-linear--rounded{border-radius:4px}.v-progress-linear--striped .v-progress-linear__determinate{background-image:linear-gradient(135deg,hsla(0,0%,100%,.25) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.25) 0,hsla(0,0%,100%,.25) 75%,transparent 0,transparent);background-size:40px 40px;background-repeat:repeat}.v-progress-linear--query .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-ltr;animation-name:query-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-ltr;animation-name:query-short-ltr;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .long{-webkit-animation-name:query-rtl;animation-name:query-rtl}.v-progress-linear--query.v-progress-linear--reverse .v-progress-linear__indeterminate--active .short{-webkit-animation-name:query-short-rtl;animation-name:query-short-rtl}@-webkit-keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@keyframes indeterminate-ltr{0%{left:-90%;right:100%}60%{left:-90%;right:100%}to{left:100%;right:-35%}}@-webkit-keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@keyframes indeterminate-rtl{0%{left:100%;right:-90%}60%{left:100%;right:-90%}to{left:-35%;right:100%}}@-webkit-keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes indeterminate-short-ltr{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@-webkit-keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@keyframes indeterminate-short-rtl{0%{left:100%;right:-200%}60%{left:-8%;right:107%}to{left:-8%;right:107%}}@-webkit-keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@keyframes query-ltr{0%{right:-90%;left:100%}60%{right:-90%;left:100%}to{right:100%;left:-35%}}@-webkit-keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@keyframes query-rtl{0%{right:100%;left:-90%}60%{right:100%;left:-90%}to{right:-35%;left:100%}}@-webkit-keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@keyframes query-short-ltr{0%{right:-200%;left:100%}60%{right:107%;left:-8%}to{right:107%;left:-8%}}@-webkit-keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@keyframes query-short-rtl{0%{right:100%;left:-200%}60%{right:-8%;left:107%}to{right:-8%;left:107%}}@-webkit-keyframes stream-ltr{to{transform:translateX(-8px)}}@keyframes stream-ltr{to{transform:translateX(-8px)}}@-webkit-keyframes stream-rtl{to{transform:translateX(8px)}}@keyframes stream-rtl{to{transform:translateX(8px)}}.theme--light.v-icon{color:rgba(0,0,0,.54)}.theme--light.v-icon:focus:after{opacity:.12}.theme--light.v-icon.v-icon.v-icon--disabled{color:rgba(0,0,0,.38)!important}.theme--dark.v-icon{color:#fff}.theme--dark.v-icon:focus:after{opacity:.24}.theme--dark.v-icon.v-icon.v-icon--disabled{color:hsla(0,0%,100%,.5)!important}.v-icon.v-icon{align-items:center;display:inline-flex;font-feature-settings:"liga";font-size:24px;justify-content:center;letter-spacing:normal;line-height:1;position:relative;text-indent:0;transition:.3s cubic-bezier(.25,.8,.5,1),visibility 0s;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.v-icon.v-icon:after{background-color:currentColor;border-radius:50%;content:"";display:inline-block;height:100%;left:0;opacity:0;pointer-events:none;position:absolute;top:0;transform:scale(1.3);width:100%;transition:opacity .2s cubic-bezier(.4,0,.6,1)}.v-icon.v-icon--dense{font-size:20px}.v-icon--right{margin-left:8px}.v-icon--left{margin-right:8px}.v-icon.v-icon.v-icon--link{cursor:pointer;outline:none}.v-icon--disabled{pointer-events:none}.v-icon--dense__component,.v-icon--dense__svg{height:20px}.v-icon__component,.v-icon__svg{height:24px;width:24px}.v-icon__svg{fill:currentColor}.theme--light.v-timeline:before{background:rgba(0,0,0,.12)}.theme--light.v-timeline .v-timeline-item__dot{background:#fff}.theme--light.v-timeline .v-timeline-item .v-card:before{border-right-color:rgba(0,0,0,.12)}.theme--dark.v-timeline:before{background:hsla(0,0%,100%,.12)}.theme--dark.v-timeline .v-timeline-item__dot{background:#1e1e1e}.theme--dark.v-timeline .v-timeline-item .v-card:before{border-right-color:rgba(0,0,0,.12)}.v-timeline{padding-top:24px;position:relative}.v-timeline:before{bottom:0;content:"";height:100%;position:absolute;top:0;width:2px}.v-timeline-item{display:flex;padding-bottom:24px}.v-timeline-item__body{position:relative;height:100%;flex:1 1 auto}.v-timeline-item__divider{position:relative;min-width:96px;display:flex;align-items:center;justify-content:center}.v-timeline-item__dot{z-index:2;border-radius:50%;box-shadow:0 2px 1px -1px rgba(0,0,0,.2),0 1px 1px 0 rgba(0,0,0,.14),0 1px 3px 0 rgba(0,0,0,.12);height:38px;left:calc(50% - 19px);width:38px}.v-timeline-item__dot .v-timeline-item__inner-dot{height:30px;margin:4px;width:30px}.v-timeline-item__dot--small{height:24px;left:calc(50% - 12px);width:24px}.v-timeline-item__dot--small .v-timeline-item__inner-dot{height:18px;margin:3px;width:18px}.v-timeline-item__dot--large{height:52px;left:calc(50% - 26px);width:52px}.v-timeline-item__dot--large .v-timeline-item__inner-dot{height:42px;margin:5px;width:42px}.v-timeline-item__inner-dot{border-radius:50%;display:flex;justify-content:center;align-items:center}.v-timeline-item__opposite{flex:1 1 auto;align-self:center;max-width:calc(50% - 48px)}.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after,.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before){flex-direction:row-reverse}.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__opposite,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__opposite{text-align:right}.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__opposite,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__opposite{text-align:left}.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__body>.v-card:before,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__body>.v-card:before{transform:rotate(0);left:-10px;right:auto}.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__body>.v-card:before,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__body>.v-card:before{transform:rotate(180deg);left:auto;right:-10px}.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--after .v-timeline-item__body,.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(odd):not(.v-timeline-item--before) .v-timeline-item__body{max-width:calc(50% - 48px)}.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before,.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after){flex-direction:row}.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__opposite,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__opposite{text-align:left}.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__opposite,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__opposite{text-align:right}.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__body>.v-card:before,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__body>.v-card:before{transform:rotate(180deg);right:-10px;left:auto}.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__body>.v-card:before,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__body>.v-card:before{transform:rotate(0);right:auto;left:-10px}.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item--before .v-timeline-item__body,.v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse) .v-timeline-item:nth-child(2n):not(.v-timeline-item--after) .v-timeline-item__body{max-width:calc(50% - 48px)}.v-timeline-item__body>.v-card:not(.v-card--flat):after,.v-timeline-item__body>.v-card:not(.v-card--flat):before{content:"";position:absolute;border-top:10px solid transparent;border-bottom:10px solid transparent;border-right:10px solid #000;top:calc(50% - 10px)}.v-timeline-item__body>.v-card:not(.v-card--flat):after{border-right-color:inherit}.v-timeline-item__body>.v-card:not(.v-card--flat):before{top:calc(50% - 8px)}.v-timeline--align-top .v-timeline-item__dot{align-self:start}.v-timeline--align-top .v-timeline-item__body>.v-card:before{top:12px}.v-timeline--align-top .v-timeline-item__body>.v-card:after{top:10px}.v-application--is-ltr .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse):before{left:calc(50% - 1px);right:auto}.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense):before,.v-application--is-rtl .v-timeline:not(.v-timeline--dense):not(.v-timeline--reverse):before{left:auto;right:calc(50% - 1px)}.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense):before{right:auto;left:calc(50% - 1px)}.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before,.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after){flex-direction:row}.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__opposite,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__opposite{text-align:left}.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__opposite,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__opposite{text-align:right}.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__body>.v-card:before,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__body>.v-card:before{transform:rotate(180deg);right:-10px;left:auto}.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__body>.v-card:before,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__body>.v-card:before{transform:rotate(0);right:auto;left:-10px}.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--before .v-timeline-item__body,.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(odd):not(.v-timeline-item--after) .v-timeline-item__body{max-width:calc(50% - 48px)}.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after,.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before){flex-direction:row-reverse}.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__opposite,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__opposite{text-align:right}.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__opposite,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__opposite{text-align:left}.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__body>.v-card:before,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__body>.v-card:before{transform:rotate(0);left:-10px;right:auto}.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__body>.v-card:before,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__body>.v-card:before{transform:rotate(180deg);left:auto;right:-10px}.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item--after .v-timeline-item__body,.v-timeline--reverse:not(.v-timeline--dense) .v-timeline-item:nth-child(2n):not(.v-timeline-item--before) .v-timeline-item__body{max-width:calc(50% - 48px)}.v-application--is-ltr .v-timeline--reverse.v-timeline--dense:before{right:47px;left:auto}.v-application--is-ltr .v-timeline--dense:not(.v-timeline--reverse):before,.v-application--is-rtl .v-timeline--reverse.v-timeline--dense:before{right:auto;left:47px}.v-application--is-rtl .v-timeline--dense:not(.v-timeline--reverse):before{left:auto;right:47px}.v-timeline--dense .v-timeline-item{flex-direction:row-reverse!important}.v-application--is-ltr .v-timeline--dense .v-timeline-item .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--dense .v-timeline-item .v-timeline-item__body>.v-card:before{transform:rotate(0);left:-10px;right:auto}.v-application--is-rtl .v-timeline--dense .v-timeline-item .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--dense .v-timeline-item .v-timeline-item__body>.v-card:before{transform:rotate(180deg);left:auto;right:-10px}.v-timeline--dense .v-timeline-item__body{max-width:calc(100% - 96px)}.v-timeline--dense .v-timeline-item__opposite{display:none}.v-timeline--reverse.v-timeline--dense .v-timeline-item{flex-direction:row!important}.v-application--is-ltr .v-timeline--reverse.v-timeline--dense .v-timeline-item .v-timeline-item__body .v-card:after,.v-application--is-ltr .v-timeline--reverse.v-timeline--dense .v-timeline-item .v-timeline-item__body>.v-card:before{transform:rotate(180deg);right:-10px;left:auto}.v-application--is-rtl .v-timeline--reverse.v-timeline--dense .v-timeline-item .v-timeline-item__body .v-card:after,.v-application--is-rtl .v-timeline--reverse.v-timeline--dense .v-timeline-item .v-timeline-item__body>.v-card:before{transform:rotate(0);right:auto;left:-10px}.v-timeline-item--fill-dot .v-timeline-item__inner-dot{height:inherit;margin:0;width:inherit} \ No newline at end of file diff --git a/docs/css/chunk-a7b0a1b0.css b/docs/css/chunk-a7b0a1b0.css new file mode 100644 index 0000000000..09bde786ab --- /dev/null +++ b/docs/css/chunk-a7b0a1b0.css @@ -0,0 +1 @@ +.container{width:100%;padding:12px;margin-right:auto;margin-left:auto}@media(min-width:960px){.container{max-width:900px}}@media(min-width:1264px){.container{max-width:1185px}}@media(min-width:1904px){.container{max-width:1785px}}.container--fluid{max-width:100%}.row{display:flex;flex-wrap:wrap;flex:1 1 auto;margin:-12px}.row+.row{margin-top:12px}.row+.row--dense{margin-top:4px}.row--dense{margin:-4px}.row--dense>.col,.row--dense>[class*=col-]{padding:4px}.row.no-gutters{margin:0}.row.no-gutters>.col,.row.no-gutters>[class*=col-]{padding:0}.col,.col-1,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-10,.col-11,.col-12,.col-auto,.col-lg,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-auto,.col-md,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-md-auto,.col-sm,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-auto{width:100%;padding:12px}.col{flex-basis:0;flex-grow:1;max-width:100%}.col-auto{flex:0 0 auto;width:auto;max-width:100%}.col-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-3{margin-left:25%}.v-application--is-rtl .offset-3{margin-right:25%}.v-application--is-ltr .offset-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-6{margin-left:50%}.v-application--is-rtl .offset-6{margin-right:50%}.v-application--is-ltr .offset-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-9{margin-left:75%}.v-application--is-rtl .offset-9{margin-right:75%}.v-application--is-ltr .offset-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-11{margin-right:91.6666666667%}@media(min-width:600px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.col-sm-auto{flex:0 0 auto;width:auto;max-width:100%}.col-sm-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-sm-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-sm-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-sm-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-sm-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-sm-0{margin-left:0}.v-application--is-rtl .offset-sm-0{margin-right:0}.v-application--is-ltr .offset-sm-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-sm-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-sm-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-sm-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-sm-3{margin-left:25%}.v-application--is-rtl .offset-sm-3{margin-right:25%}.v-application--is-ltr .offset-sm-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-sm-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-sm-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-sm-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-sm-6{margin-left:50%}.v-application--is-rtl .offset-sm-6{margin-right:50%}.v-application--is-ltr .offset-sm-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-sm-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-sm-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-sm-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-sm-9{margin-left:75%}.v-application--is-rtl .offset-sm-9{margin-right:75%}.v-application--is-ltr .offset-sm-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-sm-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-sm-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-sm-11{margin-right:91.6666666667%}}@media(min-width:960px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.col-md-auto{flex:0 0 auto;width:auto;max-width:100%}.col-md-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-md-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-md-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-md-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-md-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-md-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-md-0{margin-left:0}.v-application--is-rtl .offset-md-0{margin-right:0}.v-application--is-ltr .offset-md-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-md-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-md-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-md-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-md-3{margin-left:25%}.v-application--is-rtl .offset-md-3{margin-right:25%}.v-application--is-ltr .offset-md-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-md-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-md-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-md-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-md-6{margin-left:50%}.v-application--is-rtl .offset-md-6{margin-right:50%}.v-application--is-ltr .offset-md-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-md-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-md-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-md-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-md-9{margin-left:75%}.v-application--is-rtl .offset-md-9{margin-right:75%}.v-application--is-ltr .offset-md-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-md-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-md-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-md-11{margin-right:91.6666666667%}}@media(min-width:1264px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.col-lg-auto{flex:0 0 auto;width:auto;max-width:100%}.col-lg-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-lg-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-lg-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-lg-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-lg-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-lg-0{margin-left:0}.v-application--is-rtl .offset-lg-0{margin-right:0}.v-application--is-ltr .offset-lg-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-lg-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-lg-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-lg-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-lg-3{margin-left:25%}.v-application--is-rtl .offset-lg-3{margin-right:25%}.v-application--is-ltr .offset-lg-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-lg-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-lg-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-lg-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-lg-6{margin-left:50%}.v-application--is-rtl .offset-lg-6{margin-right:50%}.v-application--is-ltr .offset-lg-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-lg-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-lg-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-lg-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-lg-9{margin-left:75%}.v-application--is-rtl .offset-lg-9{margin-right:75%}.v-application--is-ltr .offset-lg-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-lg-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-lg-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-lg-11{margin-right:91.6666666667%}}@media(min-width:1904px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.col-xl-auto{flex:0 0 auto;width:auto;max-width:100%}.col-xl-1{flex:0 0 8.3333333333%;max-width:8.3333333333%}.col-xl-2{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.3333333333%;max-width:33.3333333333%}.col-xl-5{flex:0 0 41.6666666667%;max-width:41.6666666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.3333333333%;max-width:58.3333333333%}.col-xl-8{flex:0 0 66.6666666667%;max-width:66.6666666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.3333333333%;max-width:83.3333333333%}.col-xl-11{flex:0 0 91.6666666667%;max-width:91.6666666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.v-application--is-ltr .offset-xl-0{margin-left:0}.v-application--is-rtl .offset-xl-0{margin-right:0}.v-application--is-ltr .offset-xl-1{margin-left:8.3333333333%}.v-application--is-rtl .offset-xl-1{margin-right:8.3333333333%}.v-application--is-ltr .offset-xl-2{margin-left:16.6666666667%}.v-application--is-rtl .offset-xl-2{margin-right:16.6666666667%}.v-application--is-ltr .offset-xl-3{margin-left:25%}.v-application--is-rtl .offset-xl-3{margin-right:25%}.v-application--is-ltr .offset-xl-4{margin-left:33.3333333333%}.v-application--is-rtl .offset-xl-4{margin-right:33.3333333333%}.v-application--is-ltr .offset-xl-5{margin-left:41.6666666667%}.v-application--is-rtl .offset-xl-5{margin-right:41.6666666667%}.v-application--is-ltr .offset-xl-6{margin-left:50%}.v-application--is-rtl .offset-xl-6{margin-right:50%}.v-application--is-ltr .offset-xl-7{margin-left:58.3333333333%}.v-application--is-rtl .offset-xl-7{margin-right:58.3333333333%}.v-application--is-ltr .offset-xl-8{margin-left:66.6666666667%}.v-application--is-rtl .offset-xl-8{margin-right:66.6666666667%}.v-application--is-ltr .offset-xl-9{margin-left:75%}.v-application--is-rtl .offset-xl-9{margin-right:75%}.v-application--is-ltr .offset-xl-10{margin-left:83.3333333333%}.v-application--is-rtl .offset-xl-10{margin-right:83.3333333333%}.v-application--is-ltr .offset-xl-11{margin-left:91.6666666667%}.v-application--is-rtl .offset-xl-11{margin-right:91.6666666667%}}.container.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.fill-height{align-items:center;display:flex;flex-wrap:wrap}.container.fill-height>.row{flex:1 1 100%;max-width:calc(100% + 24px)}.container.fill-height>.layout{height:100%;flex:1 1 auto}.container.fill-height>.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}.container.grid-list-xs .layout .flex{padding:1px}.container.grid-list-xs .layout:only-child{margin:-1px}.container.grid-list-xs .layout:not(:only-child){margin:auto -1px}.container.grid-list-xs :not(:only-child) .layout:first-child{margin-top:-1px}.container.grid-list-xs :not(:only-child) .layout:last-child{margin-bottom:-1px}.container.grid-list-sm .layout .flex{padding:2px}.container.grid-list-sm .layout:only-child{margin:-2px}.container.grid-list-sm .layout:not(:only-child){margin:auto -2px}.container.grid-list-sm :not(:only-child) .layout:first-child{margin-top:-2px}.container.grid-list-sm :not(:only-child) .layout:last-child{margin-bottom:-2px}.container.grid-list-md .layout .flex{padding:4px}.container.grid-list-md .layout:only-child{margin:-4px}.container.grid-list-md .layout:not(:only-child){margin:auto -4px}.container.grid-list-md :not(:only-child) .layout:first-child{margin-top:-4px}.container.grid-list-md :not(:only-child) .layout:last-child{margin-bottom:-4px}.container.grid-list-lg .layout .flex{padding:8px}.container.grid-list-lg .layout:only-child{margin:-8px}.container.grid-list-lg .layout:not(:only-child){margin:auto -8px}.container.grid-list-lg :not(:only-child) .layout:first-child{margin-top:-8px}.container.grid-list-lg :not(:only-child) .layout:last-child{margin-bottom:-8px}.container.grid-list-xl .layout .flex{padding:12px}.container.grid-list-xl .layout:only-child{margin:-12px}.container.grid-list-xl .layout:not(:only-child){margin:auto -12px}.container.grid-list-xl :not(:only-child) .layout:first-child{margin-top:-12px}.container.grid-list-xl :not(:only-child) .layout:last-child{margin-bottom:-12px}.layout{display:flex;flex:1 1 auto;flex-wrap:nowrap;min-width:0}.layout.reverse{flex-direction:row-reverse}.layout.column{flex-direction:column}.layout.column.reverse{flex-direction:column-reverse}.layout.column>.flex{max-width:100%}.layout.wrap{flex-wrap:wrap}.layout.grow-shrink-0{flex-grow:0;flex-shrink:0}@media (min-width:0){.flex.xs12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xs12{order:12}.flex.xs11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xs11{order:11}.flex.xs10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xs10{order:10}.flex.xs9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xs9{order:9}.flex.xs8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xs8{order:8}.flex.xs7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xs7{order:7}.flex.xs6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xs6{order:6}.flex.xs5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xs5{order:5}.flex.xs4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xs4{order:4}.flex.xs3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xs3{order:3}.flex.xs2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xs2{order:2}.flex.xs1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xs1{order:1}.v-application--is-ltr .flex.offset-xs12{margin-left:100%}.v-application--is-rtl .flex.offset-xs12{margin-right:100%}.v-application--is-ltr .flex.offset-xs11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xs11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xs10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xs10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xs9{margin-left:75%}.v-application--is-rtl .flex.offset-xs9{margin-right:75%}.v-application--is-ltr .flex.offset-xs8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xs8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xs7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xs7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xs6{margin-left:50%}.v-application--is-rtl .flex.offset-xs6{margin-right:50%}.v-application--is-ltr .flex.offset-xs5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xs5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xs4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xs4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xs3{margin-left:25%}.v-application--is-rtl .flex.offset-xs3{margin-right:25%}.v-application--is-ltr .flex.offset-xs2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xs2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xs1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xs1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xs0{margin-left:0}.v-application--is-rtl .flex.offset-xs0{margin-right:0}}@media (min-width:600px){.flex.sm12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-sm12{order:12}.flex.sm11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-sm11{order:11}.flex.sm10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-sm10{order:10}.flex.sm9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-sm9{order:9}.flex.sm8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-sm8{order:8}.flex.sm7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-sm7{order:7}.flex.sm6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-sm6{order:6}.flex.sm5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-sm5{order:5}.flex.sm4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-sm4{order:4}.flex.sm3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-sm3{order:3}.flex.sm2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-sm2{order:2}.flex.sm1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-sm1{order:1}.v-application--is-ltr .flex.offset-sm12{margin-left:100%}.v-application--is-rtl .flex.offset-sm12{margin-right:100%}.v-application--is-ltr .flex.offset-sm11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-sm11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-sm10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-sm10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-sm9{margin-left:75%}.v-application--is-rtl .flex.offset-sm9{margin-right:75%}.v-application--is-ltr .flex.offset-sm8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-sm8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-sm7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-sm7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-sm6{margin-left:50%}.v-application--is-rtl .flex.offset-sm6{margin-right:50%}.v-application--is-ltr .flex.offset-sm5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-sm5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-sm4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-sm4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-sm3{margin-left:25%}.v-application--is-rtl .flex.offset-sm3{margin-right:25%}.v-application--is-ltr .flex.offset-sm2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-sm2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-sm1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-sm1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-sm0{margin-left:0}.v-application--is-rtl .flex.offset-sm0{margin-right:0}}@media (min-width:960px){.flex.md12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-md12{order:12}.flex.md11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-md11{order:11}.flex.md10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-md10{order:10}.flex.md9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-md9{order:9}.flex.md8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-md8{order:8}.flex.md7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-md7{order:7}.flex.md6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-md6{order:6}.flex.md5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-md5{order:5}.flex.md4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-md4{order:4}.flex.md3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-md3{order:3}.flex.md2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-md2{order:2}.flex.md1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-md1{order:1}.v-application--is-ltr .flex.offset-md12{margin-left:100%}.v-application--is-rtl .flex.offset-md12{margin-right:100%}.v-application--is-ltr .flex.offset-md11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-md11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-md10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-md10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-md9{margin-left:75%}.v-application--is-rtl .flex.offset-md9{margin-right:75%}.v-application--is-ltr .flex.offset-md8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-md8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-md7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-md7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-md6{margin-left:50%}.v-application--is-rtl .flex.offset-md6{margin-right:50%}.v-application--is-ltr .flex.offset-md5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-md5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-md4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-md4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-md3{margin-left:25%}.v-application--is-rtl .flex.offset-md3{margin-right:25%}.v-application--is-ltr .flex.offset-md2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-md2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-md1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-md1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-md0{margin-left:0}.v-application--is-rtl .flex.offset-md0{margin-right:0}}@media (min-width:1264px){.flex.lg12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-lg12{order:12}.flex.lg11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-lg11{order:11}.flex.lg10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-lg10{order:10}.flex.lg9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-lg9{order:9}.flex.lg8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-lg8{order:8}.flex.lg7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-lg7{order:7}.flex.lg6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-lg6{order:6}.flex.lg5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-lg5{order:5}.flex.lg4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-lg4{order:4}.flex.lg3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-lg3{order:3}.flex.lg2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-lg2{order:2}.flex.lg1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-lg1{order:1}.v-application--is-ltr .flex.offset-lg12{margin-left:100%}.v-application--is-rtl .flex.offset-lg12{margin-right:100%}.v-application--is-ltr .flex.offset-lg11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-lg11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-lg10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-lg10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-lg9{margin-left:75%}.v-application--is-rtl .flex.offset-lg9{margin-right:75%}.v-application--is-ltr .flex.offset-lg8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-lg8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-lg7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-lg7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-lg6{margin-left:50%}.v-application--is-rtl .flex.offset-lg6{margin-right:50%}.v-application--is-ltr .flex.offset-lg5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-lg5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-lg4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-lg4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-lg3{margin-left:25%}.v-application--is-rtl .flex.offset-lg3{margin-right:25%}.v-application--is-ltr .flex.offset-lg2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-lg2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-lg1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-lg1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-lg0{margin-left:0}.v-application--is-rtl .flex.offset-lg0{margin-right:0}}@media (min-width:1904px){.flex.xl12{flex-basis:100%;flex-grow:0;max-width:100%}.flex.order-xl12{order:12}.flex.xl11{flex-basis:91.6666666667%;flex-grow:0;max-width:91.6666666667%}.flex.order-xl11{order:11}.flex.xl10{flex-basis:83.3333333333%;flex-grow:0;max-width:83.3333333333%}.flex.order-xl10{order:10}.flex.xl9{flex-basis:75%;flex-grow:0;max-width:75%}.flex.order-xl9{order:9}.flex.xl8{flex-basis:66.6666666667%;flex-grow:0;max-width:66.6666666667%}.flex.order-xl8{order:8}.flex.xl7{flex-basis:58.3333333333%;flex-grow:0;max-width:58.3333333333%}.flex.order-xl7{order:7}.flex.xl6{flex-basis:50%;flex-grow:0;max-width:50%}.flex.order-xl6{order:6}.flex.xl5{flex-basis:41.6666666667%;flex-grow:0;max-width:41.6666666667%}.flex.order-xl5{order:5}.flex.xl4{flex-basis:33.3333333333%;flex-grow:0;max-width:33.3333333333%}.flex.order-xl4{order:4}.flex.xl3{flex-basis:25%;flex-grow:0;max-width:25%}.flex.order-xl3{order:3}.flex.xl2{flex-basis:16.6666666667%;flex-grow:0;max-width:16.6666666667%}.flex.order-xl2{order:2}.flex.xl1{flex-basis:8.3333333333%;flex-grow:0;max-width:8.3333333333%}.flex.order-xl1{order:1}.v-application--is-ltr .flex.offset-xl12{margin-left:100%}.v-application--is-rtl .flex.offset-xl12{margin-right:100%}.v-application--is-ltr .flex.offset-xl11{margin-left:91.6666666667%}.v-application--is-rtl .flex.offset-xl11{margin-right:91.6666666667%}.v-application--is-ltr .flex.offset-xl10{margin-left:83.3333333333%}.v-application--is-rtl .flex.offset-xl10{margin-right:83.3333333333%}.v-application--is-ltr .flex.offset-xl9{margin-left:75%}.v-application--is-rtl .flex.offset-xl9{margin-right:75%}.v-application--is-ltr .flex.offset-xl8{margin-left:66.6666666667%}.v-application--is-rtl .flex.offset-xl8{margin-right:66.6666666667%}.v-application--is-ltr .flex.offset-xl7{margin-left:58.3333333333%}.v-application--is-rtl .flex.offset-xl7{margin-right:58.3333333333%}.v-application--is-ltr .flex.offset-xl6{margin-left:50%}.v-application--is-rtl .flex.offset-xl6{margin-right:50%}.v-application--is-ltr .flex.offset-xl5{margin-left:41.6666666667%}.v-application--is-rtl .flex.offset-xl5{margin-right:41.6666666667%}.v-application--is-ltr .flex.offset-xl4{margin-left:33.3333333333%}.v-application--is-rtl .flex.offset-xl4{margin-right:33.3333333333%}.v-application--is-ltr .flex.offset-xl3{margin-left:25%}.v-application--is-rtl .flex.offset-xl3{margin-right:25%}.v-application--is-ltr .flex.offset-xl2{margin-left:16.6666666667%}.v-application--is-rtl .flex.offset-xl2{margin-right:16.6666666667%}.v-application--is-ltr .flex.offset-xl1{margin-left:8.3333333333%}.v-application--is-rtl .flex.offset-xl1{margin-right:8.3333333333%}.v-application--is-ltr .flex.offset-xl0{margin-left:0}.v-application--is-rtl .flex.offset-xl0{margin-right:0}}.child-flex>*,.flex{flex:1 1 auto;max-width:100%}.child-flex>.grow-shrink-0,.flex.grow-shrink-0{flex-grow:0;flex-shrink:0}.grow,.spacer{flex-grow:1!important}.grow{flex-shrink:0!important}.shrink{flex-grow:0!important;flex-shrink:1!important}.fill-height{height:100%}.theme--light.v-image{color:rgba(0,0,0,.87)}.theme--dark.v-image{color:#fff}.v-image{z-index:0}.v-image__image,.v-image__placeholder{z-index:-1;position:absolute;top:0;left:0;width:100%;height:100%}.v-image__image{background-repeat:no-repeat}.v-image__image--preload{filter:blur(2px)}.v-image__image--contain{background-size:contain}.v-image__image--cover{background-size:cover}.v-progress-circular{position:relative;display:inline-flex;vertical-align:middle;justify-content:center;align-items:center}.v-progress-circular>svg{width:100%;height:100%;margin:auto;position:absolute;top:0;bottom:0;left:0;right:0;z-index:0}.v-progress-circular--indeterminate>svg{-webkit-animation:progress-circular-rotate 1.4s linear infinite;animation:progress-circular-rotate 1.4s linear infinite;transform-origin:center center;transition:all .2s ease-in-out}.v-progress-circular--indeterminate .v-progress-circular__overlay{-webkit-animation:progress-circular-dash 1.4s ease-in-out infinite;animation:progress-circular-dash 1.4s ease-in-out infinite;stroke-linecap:round;stroke-dasharray:80,200;stroke-dashoffset:0px}.v-progress-circular__info{align-items:center;display:flex;justify-content:center}.v-progress-circular__underlay{stroke:hsla(0,0%,62%,.4);z-index:1}.v-progress-circular__overlay{stroke:currentColor;z-index:2;transition:all .6s ease-in-out}@-webkit-keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-125px}}@keyframes progress-circular-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0px}50%{stroke-dasharray:100,200;stroke-dashoffset:-15px}to{stroke-dasharray:100,200;stroke-dashoffset:-125px}}@-webkit-keyframes progress-circular-rotate{to{transform:rotate(1turn)}}@keyframes progress-circular-rotate{to{transform:rotate(1turn)}}.v-responsive{position:relative;overflow:hidden;flex:1 0 auto;max-width:100%;display:flex}.v-responsive__content{flex:1 0 0px;max-width:100%}.v-application--is-ltr .v-responsive__sizer~.v-responsive__content{margin-left:-100%}.v-application--is-rtl .v-responsive__sizer~.v-responsive__content{margin-right:-100%}.v-responsive__sizer{transition:padding-bottom .2s cubic-bezier(.25,.8,.5,1);flex:1 0 0px} \ No newline at end of file diff --git a/docs/css/chunk-vendors.a37b1574.css b/docs/css/chunk-vendors.css similarity index 100% rename from docs/css/chunk-vendors.a37b1574.css rename to docs/css/chunk-vendors.css diff --git a/docs/favicon.png b/docs/favicon.png index d6d299d9db..1bd83ad019 100644 Binary files a/docs/favicon.png and b/docs/favicon.png differ diff --git a/docs/gh-pages-proj/public/favicon.png b/docs/gh-pages-proj/public/favicon.png index d6d299d9db..1bd83ad019 100644 Binary files a/docs/gh-pages-proj/public/favicon.png and b/docs/gh-pages-proj/public/favicon.png differ diff --git a/docs/gh-pages-proj/public/index.html b/docs/gh-pages-proj/public/index.html index 822fae1a52..a52f86ff68 100644 --- a/docs/gh-pages-proj/public/index.html +++ b/docs/gh-pages-proj/public/index.html @@ -5,10 +5,23 @@ - OpenGOAL Tooling - + OpenGOAL - The Jak and Daxter Project + + + +