mirror of
https://github.com/open-goal/jak-project.git
synced 2026-11-07 09:26:09 -10:00
Compare commits
35
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
21d27233d2 | ||
|
|
75b7f2b3ab | ||
|
|
f1b3de907c | ||
|
|
3d20187fd3 | ||
|
|
33f364db4a | ||
|
|
c7db3c9adb | ||
|
|
94684e32f6 | ||
|
|
e4aa2b260c | ||
|
|
d2a4685b70 | ||
|
|
6076aab5a9 | ||
|
|
cbabe7b7ef | ||
|
|
32c3cf7397 | ||
|
|
b6c8430c0b | ||
|
|
abc82729ad | ||
|
|
fd1976dcc8 | ||
|
|
25df2f95ed | ||
|
|
f68700f196 | ||
|
|
ed028a4e8a | ||
|
|
efb21c3e8c | ||
|
|
d6f33ab506 | ||
|
|
76e8eeca35 | ||
|
|
6445b4a50a | ||
|
|
24c9aa9f93 | ||
|
|
9f0be81a23 | ||
|
|
9bd79e5d8a | ||
|
|
64b3bb9068 | ||
|
|
712cdfbaa2 | ||
|
|
31c3733673 | ||
|
|
d04ac9d787 | ||
|
|
76e4bcb8bc | ||
|
|
613a8b22cd | ||
|
|
78c14a9532 | ||
|
|
a42c071996 | ||
|
|
450b9449fe | ||
|
|
90ee91fcf0 |
No files matched your search
@@ -0,0 +1,14 @@
|
||||
# Contributing Guidelines
|
||||
|
||||
Thanks for being interested in contributing to our project in some way. To keep things brief, here are the quick notes.
|
||||
|
||||
## Policies
|
||||
|
||||
- Review our [AI usage policy](https://github.com/open-goal/jak-project/blob/master/AI_POLICY.md)
|
||||
- No Android or mobile related contributions will be accepted, we aren't interested.
|
||||
|
||||
## The Hopefully Obvious
|
||||
|
||||
- Try to ensure your changes are well tested, clean and organized
|
||||
- Be respectful, don't act like someone you would never want to associate with
|
||||
- Be aware that depending on what you submit, it may not merge soon or ever depending on what it is. Don't take this personally -- reach out to us first to see if there is an appetite first before investing massive amounts of time into it.
|
||||
@@ -1,5 +1,8 @@
|
||||
blank_issues_enabled: true
|
||||
contact_links:
|
||||
- name: AI Usage Policy
|
||||
url: https://github.com/open-goal/jak-project/blob/master/AI_POLICY.md
|
||||
about: Please follow the template and do not copy-paste AI generated output as your issue description.
|
||||
- name: Feature Requests and Ideas
|
||||
url: https://github.com/open-goal/jak-project/discussions/new/choose
|
||||
about: Please use the discussion board to bring up feature requests and ideas. If there is interest in them, they can then be converted to an issue(s).
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<!--
|
||||
Please be familiar with:
|
||||
- the AI Usage Policy - https://github.com/open-goal/jak-project/blob/master/AI_POLICY.md
|
||||
- and the rest of the contributing guidelines - https://github.com/open-goal/jak-project/blob/master/.github/CONTRIBUTING.md
|
||||
-->
|
||||
@@ -26,7 +26,7 @@ jobs:
|
||||
libxi-dev zip ninja-build libgl1-mesa-dev libssl-dev
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: linux-ubuntu-22.04--Release-linux-clang-static-${{ github.sha }}
|
||||
@@ -88,7 +88,7 @@ jobs:
|
||||
ls -l ./out/jak2
|
||||
ls -l ./out/jak3
|
||||
set +e
|
||||
python ./scripts/gsrc/compare-compilation-outputs.py --base "./out/jak1/obj.master,./out/jak2/obj.master,./out/jak3/obj.master" --compare "./out/jak1/obj.pr,./out/jak2/obj.pr,./out/jak3/obj.pr" --markdown
|
||||
python ./scripts/ci/compare-compilation-outputs.py --base "./out/jak1/obj.master,./out/jak2/obj.master,./out/jak3/obj.master" --compare "./out/jak1/obj.pr,./out/jak2/obj.pr,./out/jak3/obj.pr" --markdown
|
||||
SCRIPT_EXIT_CODE=$?
|
||||
cat ./comp-diff-report.md >> $GITHUB_STEP_SUMMARY
|
||||
if [ "$SCRIPT_EXIT_CODE" -ne 0 ]; then
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
run: python ./scripts/ci/lint-trailing-whitespace.py
|
||||
|
||||
- name: Check for Unresolved Conflicts
|
||||
run: python ./scripts/gsrc/check-for-conflicts.py
|
||||
run: python ./scripts/ci/check-for-conflicts.py
|
||||
|
||||
- name: Check for Incorrect Asserts
|
||||
run: python ./scripts/ci/check-for-asserts.py
|
||||
|
||||
@@ -43,7 +43,7 @@ jobs:
|
||||
libxi-dev zip ninja-build libgl1-mesa-dev libssl-dev
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: linux-ubuntu-22.04-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
@@ -34,7 +34,7 @@ jobs:
|
||||
sudo update-alternatives --set g++ /usr/bin/g++-10
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: linux-ubuntu-22.04-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
@@ -45,7 +45,7 @@ jobs:
|
||||
echo "OPENSSL_ROOT_DIR=$(brew --prefix openssl@3)" >> $GITHUB_ENV
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: macos-15-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
echo "OPENSSL_ROOT_DIR=$(brew --prefix openssl@3)" >> $GITHUB_ENV
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: macos-15-intel-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
@@ -36,6 +36,7 @@ jobs:
|
||||
COMMENT_ID: ${{ github.event.comment.user.id }}
|
||||
COMMENT: ${{ github.event.comment.body }}
|
||||
PR_NUMBER: ${{ github.event.issue.number }}
|
||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
set -e
|
||||
|
||||
@@ -70,6 +71,7 @@ jobs:
|
||||
SHA=$(gh api repos/${{ github.repository }}/pulls/$PR_NUMBER --jq '.head.sha')
|
||||
if [ "$COMMENT" = "ok to test" ] && grep -Fxq "$COMMENT_ID" ./.tmp-ci/allowlist.txt; then
|
||||
is_trusted=true
|
||||
gh pr comment "${{ github.event.issue.number }}" --body "Offline tests running: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -91,6 +93,14 @@ jobs:
|
||||
ref: ${{ needs.validate-author.outputs.sha }}
|
||||
clean: false
|
||||
|
||||
- name: Cleanup Potential Outputs
|
||||
run: |
|
||||
rm -r ./ci-artifacts || true
|
||||
rm -rf ./iso_data/jak1/* || true
|
||||
rm -rf ./iso_data/jak2/* || true
|
||||
rm -rf ./iso_data/jak3/* || true
|
||||
rm -rf ./iso_data/jakx/* || true
|
||||
|
||||
- name: Build Binaries
|
||||
run: |
|
||||
cmake -B build --preset="Release-linux-clang-static" -DCMAKE_SHARED_LINKER_FLAGS="-fuse-ld=lld" -DCMAKE_EXE_LINKER_FLAGS="-fuse-ld=lld" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
|
||||
@@ -134,6 +144,16 @@ jobs:
|
||||
rm -r ./data/iso_data || true
|
||||
rm -r ./data/decompiler_out || true
|
||||
|
||||
# - name: Install Jak X
|
||||
# run: |
|
||||
# cd ./ci-artifacts
|
||||
# ./extractor ~/isos/jak3_ntsc.iso --game jakx --extract --validate --proj-path "$PWD/data"
|
||||
# ./extractor ~/isos/jak3_ntsc.iso --game jakx --decompile --proj-path "$PWD/data"
|
||||
# ./extractor ~/isos/jak3_ntsc.iso --game jakx --compile --proj-path "$PWD/data"
|
||||
# rm -r ./data/out || true
|
||||
# rm -r ./data/iso_data || true
|
||||
# rm -r ./data/decompiler_out || true
|
||||
|
||||
- name: Cleanup Installation
|
||||
run: |
|
||||
rm -r ./ci-artifacts || true
|
||||
@@ -158,3 +178,10 @@ jobs:
|
||||
task set-game-jak3
|
||||
task offline-tests
|
||||
rm -rf ./iso_data/jak3/*
|
||||
|
||||
- name: Run Offline Tests - Jak X
|
||||
run: |
|
||||
7z x ~/isos/jakx_ntsc.iso -o./iso_data/jakx -aos
|
||||
task set-game-jakx
|
||||
task offline-tests
|
||||
rm -rf ./iso_data/jakx/*
|
||||
@@ -12,6 +12,10 @@ on:
|
||||
- patch
|
||||
- minor
|
||||
- major
|
||||
release_version:
|
||||
description: 'Explicit release version (e.g. 0.3.8). If set, skips automatic version bump.'
|
||||
required: false
|
||||
type: string
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -25,23 +29,48 @@ jobs:
|
||||
steps:
|
||||
# Docs - https://github.com/mathieudutour/github-tag-action
|
||||
- name: Bump Version and Push Tag
|
||||
if: github.repository == 'open-goal/jak-project'
|
||||
if: github.repository == 'open-goal/jak-project' && !inputs.release_version
|
||||
id: tag_version
|
||||
uses: mathieudutour/github-tag-action@v6.2
|
||||
uses: mathieudutour/github-tag-action@v7
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
tag_prefix: v
|
||||
default_bump: ${{ github.event.inputs.bump }}
|
||||
default_bump: ${{ inputs.bump }}
|
||||
|
||||
- name: Create Explicit Tag
|
||||
if: inputs.release_version
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
gh api \
|
||||
--method POST \
|
||||
"/repos/${{ github.repository }}/git/refs" \
|
||||
-f "ref=refs/tags/v${{ inputs.release_version }}" \
|
||||
-f "sha=${{ github.sha }}"
|
||||
|
||||
- name: Create Release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: gh release create ${{ steps.tag_version.outputs.new_tag }} --generate-notes --draft --repo ${{ github.repository }}
|
||||
run: |
|
||||
if [ -n "${{ inputs.release_version }}" ]; then
|
||||
TAG="v${{ inputs.release_version }}"
|
||||
else
|
||||
TAG="${{ steps.tag_version.outputs.new_tag }}"
|
||||
fi
|
||||
|
||||
gh release create "$TAG" \
|
||||
--generate-notes \
|
||||
--draft \
|
||||
--repo "${{ github.repository }}"
|
||||
|
||||
- name: Output new tag
|
||||
id: set_tag
|
||||
run: |
|
||||
echo "new_tag=${{ steps.tag_version.outputs.new_tag }}" >> $GITHUB_OUTPUT
|
||||
if [ -n "${{ inputs.release_version }}" ]; then
|
||||
echo "new_tag=v${{ inputs.release_version }}" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "new_tag=${{ steps.tag_version.outputs.new_tag }}" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
|
||||
# Windows
|
||||
build_windows_clang:
|
||||
|
||||
@@ -46,7 +46,7 @@ jobs:
|
||||
}
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: windows-2022-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
@@ -31,7 +31,7 @@ jobs:
|
||||
}
|
||||
|
||||
- name: Setup sccache
|
||||
uses: hendrikmuhs/[email protected]3
|
||||
uses: hendrikmuhs/[email protected]4
|
||||
with:
|
||||
variant: sccache
|
||||
key: windows-2022-${{ inputs.cachePrefix }}-${{ inputs.cmakePreset }}-${{ github.sha }}
|
||||
|
||||
+1
-1
@@ -88,4 +88,4 @@ __pycache__/
|
||||
unifont-15.0.03.ttf
|
||||
*.diff
|
||||
goalc-report.html
|
||||
_new-all-types.gc
|
||||
_new-all-types.gc
|
||||
@@ -0,0 +1,32 @@
|
||||
# AI Usage Policy
|
||||
|
||||
The OpenGOAL project has some strict rules regarding AI usage and contributions:
|
||||
|
||||
## There are Humans Here
|
||||
|
||||
Please remember that OpenGOAL is maintained by humans, for zero financial gain (infact, it's been at a substantial _loss_).
|
||||
|
||||
Every discussion, issue, and pull request is read and reviewed by humans (and sometimes machines, too). It is a boundary point at which people interact with each other and the work done. It is rude and disrespectful to approach this boundary with low-effort, unqualified work, since it puts the burden of validation on the maintainer.
|
||||
|
||||
If you disagree with these rules and guidelines, do not waste both of our time arguing over them. Move on to another project that aligns with your ideals instead, plenty exist, now more than ever. If you are the type to hurl insults at us because of how we have chose to maintain our project that we have poured over a-half-a-decade of our time and passion into, then your use of AI is the least of our reasons for why we want nothing to do with you.
|
||||
|
||||
## General Rules / Etiquette
|
||||
|
||||
- **All AI usage in any form must be disclosed.** You must state the tool you used (e.g. Claude Code, Cursor, Amp) along with the extent that the work was AI-assisted.
|
||||
- **No commits authored/co-authored by AI agents will be merged.** We currently have no commits in `master` that are associated with Claude, Copilot, etc., and we would like to keep it that way. Constructing and organizing the commits yourself is a useful step for succeeding at the next requirement. We also have no interest in giving these companies free advertising or being directly associated with them.
|
||||
- The following rules can be summarized with the new term gaining popularity of [don't be a meat proxy](https://dontbeameatproxy.com/):
|
||||
- **The human-in-the-loop must fully understand all code.** If you can't explain what your changes do and how they interact with the greater system without the aid of AI tools, do not contribute to this project.
|
||||
- **Issues, discussions and pull requests can use AI assistance (provided they don't violate other rules) but must have a full human-in-the-loop.** This means that any content generated with AI must have been reviewed and edited by a human before submission, this includes the issue or PR description. AI is very good at being overly verbose and including noise that distracts from the main point. **Humans must do their research and trim this down, ideally communicating with their own words.**
|
||||
- **No AI-generated media is allowed (art, images, videos, audio, etc.).** Text and code are the only acceptable AI-generated content, per the other rules in this policy.
|
||||
- **Bad AI drivers will be denounced.** People who produce bad contributions that are clearly AI (slop) will have future contributions blocked, we don't have the time or the motivation to deal with this. Additionally, this block list will be public and may be used by other projects to be aware of bad actors. We love to help junior developers learn and grow, but if you're interested in that then don't use AI, and we'll help you. I'm sorry that bad AI drivers have ruined this for you.
|
||||
|
||||
## OpenGOAL / Decompilation Project Specific Rules
|
||||
|
||||
- **Accidentally committing game assets / data will result in an immediate ban from the project.** This is something we have zero tolerance on going forward. The repository already has all of the relevant spots gitignored properly, but AI agent tools seem to love to put these sensitive files randomly in new folders and then when people don't make the commits themselves, they push up thousands of these sensitive files unknowingly. This is careless behaviour that shows a lack of regard for the previous rules and worst of all puts the project in legal jeopardy. This has never been a problem when only humans were involved, this is not a high bar to meet.
|
||||
- **No AI generated contributions to `/goal_src/` (the actual decompiled game code) from new contributors.** Sorry to gatekeep, but there are several reasons for this:
|
||||
1. We successfully finished decompiling Jak 1, Jak 2, and Jak 3 without AI assistance, there is no reason to reach for an LLM for the last game (Jak X) when our decompilation tools are already heavily mature. We would like to be able to say that all four games were decompiled the traditional way, especially since projects like these work via very loose legal gray areas / precedents for reverse-engineering. It is anyone's guess at this point what will happen to all of these new AI-powered decompilation projects in the near-future and we have no reason to risk it after how successful and diligent we have been for many years.
|
||||
2. The goal of our project is not to just get the games running on PC, as so many recent decompilation projects seem to have as their main focus. Our goal has always been to understand the game's code and to clean it up as we go along so it can be easily read by humans, modified and extended. This cannot be achieved using LLMs when you do not have the hard-earned experience of actually working with GOAL code. While it is impressive with what it can do, we've already seen it lie, hack together and justify incorrect fixes, and mislead people with giant blocks of comments -- with no experience you cannot discern these things, and it should not be someone else's burden to do so.
|
||||
3. Probably most importantly, changes to this code can easily cause new bugs for users, bugs that we have no interest in solving, especially if they are things we've already fixed in the past. This is just an inconvenience for us and our users, we've already started to see the decline in other decomp projects where they are shipping broken AI features, we aren't interested in following suit.
|
||||
- **No Android/Mobile support related contributions.** No one on the team is interested in being involved in the Android or other mobile ecosystems and maintaining those release/distribution processes, etc. Such contributions will be rejected.
|
||||
- **No LLM powered translation or localizaton efforts.** We have already seen the low quality outputs of AI assisted localization, with people having to comb through and fix obvious mistakes that were never proof-read. We are taking the stance that no translations are better than bad machine translations. They also create the false impression that the translations are complete, potentially discouraging or making it harder for actual human translators to make a contribution (instead of having a list of things left to translate, they have to search through a list of things that were "done" potentially incorrectly).
|
||||
- **No massive refactors or additions to enable or enhance low percentage user base support**. Such examples would include a Metal or DirectX renderer. These sorts of things are large undertakings and come with a significant maintenance burden while only making an impact for <1% of our user base. History shows that unfortunately these sorts of contributions are not made by people that will assist long-term with fixing bugs, but even if they were to break the mold and fix every bug that users report, it really isn't worth the effort. Since the beginning we have made the decision to not support every possible user's configuration to strike a good balance between the developer experience and supporting the majority of users, for example, requiring things like AVX support and a modern OpenGL version, we are sticking by this decision. If your big feature is essentially only going to be used by you and a handful of other users or you just want to experiment, then it does not need to be in the mainline distributed project.
|
||||
+3
-3
@@ -278,9 +278,6 @@ build_third_party_lib(fmt fmt)
|
||||
# build common library
|
||||
add_subdirectory(common)
|
||||
|
||||
# build decompiler
|
||||
add_subdirectory(decompiler)
|
||||
|
||||
# cubeb - audio
|
||||
build_third_party_lib(cubeb cubeb)
|
||||
|
||||
@@ -313,6 +310,9 @@ add_subdirectory(goalc)
|
||||
# build standalone tools
|
||||
add_subdirectory(tools)
|
||||
|
||||
# build decompiler
|
||||
add_subdirectory(decompiler)
|
||||
|
||||
# build the gtest libraries
|
||||
if(WIN32)
|
||||
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
|
||||
|
||||
+3
-8
@@ -141,6 +141,9 @@ tasks:
|
||||
decomp-file:
|
||||
cmds:
|
||||
- '{{.DECOMP_BIN_RELEASE_DIR}}/decompiler "./decompiler/config/{{.DECOMP_CONFIG}}" "./iso_data" "./decompiler_out" --version "{{.DECOMP_CONFIG_VERSION}}" --config-override ''{"decompile_code": true, "levels_extract": false, "allowed_objects": ["{{.FILE}}"]}'''
|
||||
decomp-files:
|
||||
cmds:
|
||||
- '{{.DECOMP_BIN_RELEASE_DIR}}/decompiler "./decompiler/config/{{.DECOMP_CONFIG}}" "./iso_data" "./decompiler_out" --version "{{.DECOMP_CONFIG_VERSION}}" --config-override ''{"decompile_code": true, "levels_extract": false, "allowed_objects": {{.FILES}}}'''
|
||||
decomp-clean:
|
||||
cmds:
|
||||
- '{{.PYTHON}} ./scripts/tasks/clean-decomp.py --game "{{.GAME}}"'
|
||||
@@ -158,14 +161,6 @@ tasks:
|
||||
- task: decomp-file
|
||||
- '{{.PYTHON}} ./scripts/gsrc/update-from-decomp.py --game "{{.GAME}}" --file "{{.FILE}}"'
|
||||
- task: lint-gsrc-file
|
||||
copy-common-naming:
|
||||
cmds:
|
||||
- '{{.PYTHON}} ./scripts/gsrc/copy-common-naming.py --file "{{.FILE}}" --decompiler "{{.DECOMP_BIN_RELEASE_DIR}}/decompiler"'
|
||||
- task: format-json
|
||||
copy-common-naming-from-refs:
|
||||
cmds:
|
||||
- '{{.PYTHON}} ./scripts/gsrc/copy-common-naming.py --update-names-from-refs --decompiler "{{.DECOMP_BIN_RELEASE_DIR}}/decompiler"'
|
||||
- task: format-json
|
||||
# ASSET RIPPING
|
||||
rip-textures:
|
||||
cmds:
|
||||
|
||||
@@ -176,7 +176,8 @@ bool socket_timed_out() {
|
||||
return errno == EAGAIN;
|
||||
#elif _WIN32
|
||||
auto err = WSAGetLastError();
|
||||
return err == WSAETIMEDOUT;
|
||||
// some Windows builds report WSA_IO_PENDING when an SO_RCVTIMEO recv times out
|
||||
return err == WSAETIMEDOUT || err == WSA_IO_PENDING;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ struct Logger {
|
||||
};
|
||||
|
||||
Logger gLogger;
|
||||
thread_local std::string* tl_print_capture = nullptr;
|
||||
|
||||
namespace internal {
|
||||
const char* log_level_names[] = {"trace", "debug", "info", "warn", "error", "die", "die"};
|
||||
@@ -95,6 +96,10 @@ void log_message(level log_level, LogTime& now, const char* message) {
|
||||
}
|
||||
|
||||
void log_print(const char* message) {
|
||||
if (tl_print_capture) {
|
||||
tl_print_capture->append(message);
|
||||
return;
|
||||
}
|
||||
{
|
||||
// We always immediately flush prints because since it has no associated level
|
||||
// it could be anything from a fatal error to a useless debug log.
|
||||
@@ -214,6 +219,10 @@ void disable_ansi_colors() {
|
||||
gLogger.disable_colors = true;
|
||||
}
|
||||
|
||||
void set_thread_print_capture(std::string* buffer) {
|
||||
tl_print_capture = buffer;
|
||||
}
|
||||
|
||||
void initialize() {
|
||||
ASSERT(!gLogger.initialized);
|
||||
|
||||
|
||||
@@ -50,6 +50,8 @@ void set_file_level(level log_level);
|
||||
void set_stdout_level(level log_level);
|
||||
void set_max_debug_levels();
|
||||
void disable_ansi_colors();
|
||||
// while set, prints from the calling thread are appended to buffer instead of being output
|
||||
void set_thread_print_capture(std::string* buffer);
|
||||
void initialize();
|
||||
void finish();
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ std::pair<SubtitleMetadataFile, SubtitleFile> convert_v1_to_v2(
|
||||
new_meta.frame_end = 0; // unused by v1
|
||||
new_meta.offscreen = true;
|
||||
new_meta.speaker = line_meta.speaker;
|
||||
new_meta.merge = false;
|
||||
new_scene_meta.lines.push_back(new_meta);
|
||||
if (line_meta.clear) {
|
||||
scene_lines.push_back("");
|
||||
|
||||
@@ -139,10 +139,16 @@ void try_reverse_lookup_array_like(const FieldReverseLookupInput& input,
|
||||
ASSERT(di.mem_deref); // it's accessing a pointer.
|
||||
auto elt_type = di.result_type;
|
||||
|
||||
if (input.stride) {
|
||||
if (input.has_stride()) {
|
||||
// variable access to the array.
|
||||
// this is an array of values, nothing inline, so we must get an _exact_ match for this to work.
|
||||
if (input.stride != di.stride) {
|
||||
int var_id = -1;
|
||||
if (input.stride == di.stride && !input.stride2) {
|
||||
var_id = 0;
|
||||
} else if (input.stride2 == di.stride && !input.stride) {
|
||||
var_id = 1;
|
||||
}
|
||||
if (var_id == -1) {
|
||||
// mismatched array strides, fail!
|
||||
return;
|
||||
}
|
||||
@@ -158,6 +164,7 @@ void try_reverse_lookup_array_like(const FieldReverseLookupInput& input,
|
||||
ReverseLookupNode variable_node;
|
||||
variable_node.prev = parent;
|
||||
variable_node.token.kind = FieldReverseLookupOutput::Token::Kind::VAR_IDX;
|
||||
variable_node.token.idx = var_id;
|
||||
|
||||
if (input.deref.has_value()) {
|
||||
// input did a load or store, we need to check the size/signed/kind.
|
||||
@@ -250,14 +257,29 @@ void try_reverse_lookup_inline_array(const FieldReverseLookupInput& input,
|
||||
ASSERT(di.can_deref);
|
||||
ASSERT(!di.mem_deref);
|
||||
|
||||
if (input.stride && input.stride == di.stride && input.offset < di.stride) {
|
||||
int var_id = -1;
|
||||
if (input.stride && input.stride == di.stride) {
|
||||
var_id = 0;
|
||||
} else if (input.stride2 && input.stride2 == di.stride) {
|
||||
var_id = 1;
|
||||
}
|
||||
|
||||
if (var_id != -1 && input.offset < di.stride) {
|
||||
// variable lookup.
|
||||
ReverseLookupNode var_idx_node;
|
||||
var_idx_node.prev = parent;
|
||||
|
||||
var_idx_node.token.kind = FieldReverseLookupOutput::Token::Kind::VAR_IDX;
|
||||
var_idx_node.token.idx = var_id;
|
||||
|
||||
if (input.offset == 0 && !input.deref.has_value()) {
|
||||
FieldReverseLookupInput next_input;
|
||||
next_input.deref = input.deref;
|
||||
next_input.stride = var_id == 0 ? 0 : input.stride;
|
||||
next_input.stride2 = var_id == 1 ? 0 : input.stride2;
|
||||
next_input.offset = input.offset; // includes the offset.
|
||||
next_input.base_type = di.result_type;
|
||||
|
||||
if (input.offset == 0 && !input.deref.has_value() && !next_input.has_stride()) {
|
||||
// put the element first, to match the old behavior.
|
||||
output->results.emplace_back(false, di.result_type, var_idx_node.to_vector());
|
||||
// keep trying!
|
||||
@@ -267,11 +289,6 @@ void try_reverse_lookup_inline_array(const FieldReverseLookupInput& input,
|
||||
return;
|
||||
}
|
||||
|
||||
FieldReverseLookupInput next_input;
|
||||
next_input.deref = input.deref;
|
||||
next_input.stride = 0;
|
||||
next_input.offset = input.offset; // includes the offset.
|
||||
next_input.base_type = di.result_type;
|
||||
try_reverse_lookup(next_input, ts, &var_idx_node, output, max_count);
|
||||
return;
|
||||
}
|
||||
@@ -288,7 +305,7 @@ void try_reverse_lookup_inline_array(const FieldReverseLookupInput& input,
|
||||
const_idx_node.token.kind = FieldReverseLookupOutput::Token::Kind::CONSTANT_IDX;
|
||||
const_idx_node.token.idx = elt_idx;
|
||||
|
||||
if (offset_into_elt == 0 && !input.deref.has_value() && !input.stride) {
|
||||
if (offset_into_elt == 0 && !input.deref.has_value() && !input.has_stride()) {
|
||||
// just get an element (possibly zero, and we want to include the 0 if so)
|
||||
// for the degenerate inline-array case, it seems more likely that we get the zeroth object
|
||||
// rather than the array, so this goes before that case.
|
||||
@@ -300,7 +317,7 @@ void try_reverse_lookup_inline_array(const FieldReverseLookupInput& input,
|
||||
}
|
||||
|
||||
// can we just return the array?
|
||||
if (offset_into_elt == 0 && !input.deref.has_value() && elt_idx == 0 && !input.stride) {
|
||||
if (offset_into_elt == 0 && !input.deref.has_value() && elt_idx == 0 && !input.has_stride()) {
|
||||
auto parent_vec = parent_to_vector(parent);
|
||||
if (!parent_vec.empty()) {
|
||||
output->results.emplace_back(false, input.base_type, parent_to_vector(parent));
|
||||
@@ -316,6 +333,7 @@ void try_reverse_lookup_inline_array(const FieldReverseLookupInput& input,
|
||||
FieldReverseLookupInput next_input;
|
||||
next_input.deref = input.deref;
|
||||
next_input.stride = input.stride;
|
||||
next_input.stride2 = input.stride2;
|
||||
next_input.offset = offset_into_elt;
|
||||
next_input.base_type = di.result_type;
|
||||
try_reverse_lookup(next_input, ts, &const_idx_node, output, max_count);
|
||||
@@ -383,7 +401,7 @@ void try_reverse_lookup_other(const FieldReverseLookupInput& input,
|
||||
continue; // try another field!
|
||||
}
|
||||
// it's a match, just access the field like normal!
|
||||
if (input.stride) {
|
||||
if (input.has_stride()) {
|
||||
continue;
|
||||
}
|
||||
ReverseLookupNode node;
|
||||
@@ -394,7 +412,7 @@ void try_reverse_lookup_other(const FieldReverseLookupInput& input,
|
||||
} else {
|
||||
// needs a deref, offset is 0, didn't do a deref.
|
||||
// we're taking the address
|
||||
if (input.stride) {
|
||||
if (input.has_stride()) {
|
||||
continue;
|
||||
}
|
||||
ReverseLookupNode node;
|
||||
@@ -422,7 +440,7 @@ void try_reverse_lookup_other(const FieldReverseLookupInput& input,
|
||||
expected_offset_into_field = ts.lookup_type(field.type())->get_offset();
|
||||
}
|
||||
if (offset_into_field == expected_offset_into_field && !input.deref.has_value() &&
|
||||
!input.stride) {
|
||||
!input.has_stride()) {
|
||||
ReverseLookupNode node;
|
||||
node.prev = parent;
|
||||
node.token = token;
|
||||
@@ -433,6 +451,7 @@ void try_reverse_lookup_other(const FieldReverseLookupInput& input,
|
||||
next_input.deref = input.deref;
|
||||
next_input.offset = offset_into_field - expected_offset_into_field;
|
||||
next_input.stride = input.stride;
|
||||
next_input.stride2 = input.stride2;
|
||||
next_input.base_type = field_deref.type;
|
||||
ReverseLookupNode node;
|
||||
node.prev = parent;
|
||||
|
||||
@@ -2173,7 +2173,9 @@ std::optional<std::string> find_best_field_in_structure(const TypeSystem& ts,
|
||||
"In type {}, type size was 0 for array field {} of type {}, check that the type "
|
||||
"is fully defined.",
|
||||
st->get_name(), field.name(), field.type().print()));
|
||||
int array_idx = rel_offset / type->get_size_in_memory();
|
||||
int inline_stride =
|
||||
align(type->get_size_in_memory(), type->get_inline_array_stride_alignment());
|
||||
int array_idx = rel_offset / inline_stride;
|
||||
if (!field.is_inline() &&
|
||||
field.offset() + field.array_size() * type->get_load_size() > offset) {
|
||||
if (rel_offset % type->get_load_size() == 0) {
|
||||
@@ -2185,13 +2187,12 @@ std::optional<std::string> find_best_field_in_structure(const TypeSystem& ts,
|
||||
}
|
||||
}
|
||||
} else if (field.is_inline() &&
|
||||
field.offset() + field.array_size() * type->get_size_in_memory() > offset) {
|
||||
if (field.type() == requesting_field.type() &&
|
||||
rel_offset % type->get_size_in_memory() == 0) {
|
||||
field.offset() + field.array_size() * inline_stride > offset) {
|
||||
if (field.type() == requesting_field.type() && rel_offset % inline_stride == 0) {
|
||||
// same type
|
||||
best_exact_arr.first = &field;
|
||||
best_exact_arr.second = array_idx;
|
||||
} else if (requesting_field.is_array() && rel_offset % type->get_size_in_memory() == 0 &&
|
||||
} else if (requesting_field.is_array() && rel_offset % inline_stride == 0 &&
|
||||
array_idx == 0) {
|
||||
// starts at the same offset as another array. just use the field with nothing extra
|
||||
best_exact = &field;
|
||||
@@ -2200,9 +2201,8 @@ std::optional<std::string> find_best_field_in_structure(const TypeSystem& ts,
|
||||
if (f_type && field.offset() + f_type->get_size_in_memory() > offset) {
|
||||
// struct that encompasses this field
|
||||
// simply search that structure for the field we want, offset by the field's offset
|
||||
auto best_field_in_struct =
|
||||
find_best_field_in_structure(ts, f_type, rel_offset % type->get_size_in_memory(),
|
||||
requesting_field, want_fixed, 0);
|
||||
auto best_field_in_struct = find_best_field_in_structure(
|
||||
ts, f_type, rel_offset % inline_stride, requesting_field, want_fixed, 0);
|
||||
if (best_field_in_struct) {
|
||||
best_struct_field_deref = best_field_in_struct;
|
||||
best_struct_arr.first = &field;
|
||||
|
||||
@@ -68,7 +68,10 @@ struct FieldReverseLookupInput {
|
||||
std::optional<DerefKind> deref = std::nullopt; // if we actually access memory
|
||||
int offset = 0; // if we apply a constant offset
|
||||
int stride = 0; // if we are doing a + (idx * stride)
|
||||
int stride2 = 0; // a + (idx * stride) + (idx2 * stride2)
|
||||
TypeSpec base_type; // the type of the thing we're accessing
|
||||
|
||||
bool has_stride() const { return stride || stride2; }
|
||||
};
|
||||
|
||||
constexpr double CONSTANT_INDEX_SCORE = -10.0;
|
||||
@@ -77,7 +80,7 @@ struct FieldReverseLookupOutput {
|
||||
struct Token {
|
||||
enum class Kind { FIELD, CONSTANT_IDX, VAR_IDX } kind;
|
||||
std::string name;
|
||||
int idx = -1;
|
||||
int idx = -1; // 0 for an index from stride and 1 from stride2
|
||||
double field_score = 0.0;
|
||||
|
||||
double score() {
|
||||
|
||||
@@ -13,6 +13,8 @@ void SimpleThreadGroup::run(const std::function<void(int)>& func, int num_runs,
|
||||
// copy the function, in case the user gives us a temporary function.
|
||||
m_func = func;
|
||||
|
||||
num_workers = std::min<int>(num_workers, std::thread::hardware_concurrency());
|
||||
|
||||
int start_idx = 0;
|
||||
for (int thread_idx = 0; thread_idx < num_workers; thread_idx++) {
|
||||
int end_idx = ((thread_idx + 1) * num_runs) / num_workers;
|
||||
|
||||
+141
-45
@@ -1,5 +1,6 @@
|
||||
#include "gltf_util.h"
|
||||
|
||||
#include "algorithm"
|
||||
#include "image_resize.h"
|
||||
|
||||
#include "common/log/log.h"
|
||||
@@ -185,6 +186,46 @@ std::vector<JointsAndWeights> extract_and_flatten_joints_and_weights(
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::vector<math::Vector<u8, 4>> colors_from_attribute(const tinygltf::Model& model, int attrib) {
|
||||
const auto attrib_accessor = model.accessors[attrib];
|
||||
const auto& buffer_view = model.bufferViews[attrib_accessor.bufferView];
|
||||
const auto& buffer = model.buffers[buffer_view.buffer];
|
||||
const auto data_ptr = buffer.data.data() + buffer_view.byteOffset + attrib_accessor.byteOffset;
|
||||
const auto byte_stride = attrib_accessor.ByteStride(buffer_view);
|
||||
const auto count = attrib_accessor.count;
|
||||
std::vector<math::Vector<u8, 4>> colors;
|
||||
|
||||
switch (attrib_accessor.type) {
|
||||
case TINYGLTF_TYPE_VEC4:
|
||||
switch (attrib_accessor.componentType) {
|
||||
case TINYGLTF_COMPONENT_TYPE_FLOAT:
|
||||
colors = extract_color_from_vec4_float(data_ptr, count, byte_stride);
|
||||
break;
|
||||
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT:
|
||||
colors = extract_color_from_vec4_u16(data_ptr, count, byte_stride);
|
||||
break;
|
||||
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE:
|
||||
colors = extract_color_from_vec4_u8(data_ptr, count, byte_stride);
|
||||
break;
|
||||
default:
|
||||
lg::die("Unknown type for {}", attrib_accessor.componentType);
|
||||
}
|
||||
break;
|
||||
case TINYGLTF_TYPE_VEC3:
|
||||
switch (attrib_accessor.componentType) {
|
||||
case TINYGLTF_COMPONENT_TYPE_FLOAT:
|
||||
colors = extract_color_from_vec3_float(data_ptr, count, byte_stride);
|
||||
break;
|
||||
default:
|
||||
lg::die("Unknown component type for vec3 color {}", attrib_accessor.componentType);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lg::die("Unknown attribute type for color {}", attrib_accessor.type);
|
||||
}
|
||||
return colors;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Extract positions, colors, and normals from a mesh.
|
||||
*/
|
||||
@@ -195,7 +236,7 @@ ExtractedVertices gltf_vertices(const tinygltf::Model& model,
|
||||
bool get_normals,
|
||||
const std::string& debug_name) {
|
||||
std::vector<tfrag3::PreloadedVertex> result;
|
||||
std::vector<math::Vector<u8, 4>> vtx_colors;
|
||||
std::vector<math::Vector<u8, 32>> vtx_colors;
|
||||
|
||||
{
|
||||
const auto& position_attrib = attributes.find("POSITION");
|
||||
@@ -225,54 +266,108 @@ ExtractedVertices gltf_vertices(const tinygltf::Model& model,
|
||||
new_vert.z = v_w.z() * 4096;
|
||||
}
|
||||
}
|
||||
|
||||
if (get_colors) {
|
||||
const auto& color_attrib = attributes.find("COLOR_0");
|
||||
if (color_attrib == attributes.end()) {
|
||||
lg::error("Mesh {} didn't have any colors, using white", debug_name);
|
||||
for (size_t i = 0; i < result.size(); i++) {
|
||||
vtx_colors.emplace_back(0x80, 0x80, 0x80, 0xff);
|
||||
}
|
||||
} else {
|
||||
const auto attrib_accessor = model.accessors[color_attrib->second];
|
||||
const auto& buffer_view = model.bufferViews[attrib_accessor.bufferView];
|
||||
const auto& buffer = model.buffers[buffer_view.buffer];
|
||||
const auto data_ptr =
|
||||
buffer.data.data() + buffer_view.byteOffset + attrib_accessor.byteOffset;
|
||||
const auto byte_stride = attrib_accessor.ByteStride(buffer_view);
|
||||
const auto count = attrib_accessor.count;
|
||||
std::vector<math::Vector<u8, 4>> colors;
|
||||
std::array<std::pair<std::string, std::optional<std::vector<math::Vector<u8, 4>>>>, 8>
|
||||
times_of_day = {{{"_SUNRISE", std::nullopt},
|
||||
{"_MORNING", std::nullopt},
|
||||
{"_NOON", std::nullopt},
|
||||
{"_AFTERNOON", std::nullopt},
|
||||
{"_SUNSET", std::nullopt},
|
||||
{"_TWILIGHT", std::nullopt},
|
||||
{"_EVENING", std::nullopt},
|
||||
{"_GREENSUN", std::nullopt}}};
|
||||
std::optional<std::vector<math::Vector<u8, 4>>> color0 = std::nullopt;
|
||||
vtx_colors.resize(result.size());
|
||||
bool found_one = false;
|
||||
bool found_all = true;
|
||||
|
||||
switch (attrib_accessor.type) {
|
||||
case TINYGLTF_TYPE_VEC4:
|
||||
switch (attrib_accessor.componentType) {
|
||||
case TINYGLTF_COMPONENT_TYPE_FLOAT:
|
||||
colors = extract_color_from_vec4_float(data_ptr, count, byte_stride);
|
||||
break;
|
||||
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_SHORT:
|
||||
colors = extract_color_from_vec4_u16(data_ptr, count, byte_stride);
|
||||
break;
|
||||
case TINYGLTF_COMPONENT_TYPE_UNSIGNED_BYTE:
|
||||
colors = extract_color_from_vec4_u8(data_ptr, count, byte_stride);
|
||||
break;
|
||||
default:
|
||||
lg::die("Unknown type for COLOR_0: {}", attrib_accessor.componentType);
|
||||
for (auto& slot : times_of_day) {
|
||||
if (const auto attr_val = attributes.find(slot.first); attr_val != attributes.end()) {
|
||||
slot.second = colors_from_attribute(model, attr_val->second);
|
||||
found_one = true;
|
||||
} else {
|
||||
found_all = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_one) {
|
||||
if (const auto color0_iter = attributes.find("COLOR_0"); color0_iter != attributes.end()) {
|
||||
color0 = colors_from_attribute(model, color0_iter->second);
|
||||
lg::warn("{} had colors but no times of day, using COLOR_0.", debug_name);
|
||||
} else {
|
||||
const u32 WHITE_COLOR =
|
||||
0xFF808080; // Because of little-endianness, FF is at the largest address in memory.
|
||||
for (auto& vtx_color : vtx_colors) {
|
||||
// Write white into the color slot for all times of day.
|
||||
for (u8 byte_offset = 0; byte_offset < 32; byte_offset += 4) {
|
||||
u8* target_ptr = vtx_color.data() + byte_offset;
|
||||
std::memcpy(target_ptr, &WHITE_COLOR, sizeof(u32));
|
||||
}
|
||||
break;
|
||||
case TINYGLTF_TYPE_VEC3:
|
||||
switch (attrib_accessor.componentType) {
|
||||
case TINYGLTF_COMPONENT_TYPE_FLOAT:
|
||||
colors = extract_color_from_vec3_float(data_ptr, count, byte_stride);
|
||||
break;
|
||||
default:
|
||||
lg::die("unkonwn component type for vec3 color {}", attrib_accessor.componentType);
|
||||
}
|
||||
lg::error("{} didn't have any colors, using white.", debug_name);
|
||||
}
|
||||
}
|
||||
|
||||
if (found_one || color0.has_value()) {
|
||||
if (found_all) {
|
||||
lg::info("{} had all times of day.", debug_name);
|
||||
} else if (found_one) {
|
||||
std::string log_string = "";
|
||||
for (size_t slot_index = 0; slot_index < times_of_day.size(); ++slot_index) {
|
||||
auto& slot = times_of_day[slot_index];
|
||||
std::string time_name = slot.first;
|
||||
std::string value_name;
|
||||
if (slot.second.has_value()) {
|
||||
value_name = slot.first;
|
||||
} else { // If this time_of_day lacks a color, use color of closest time of day.
|
||||
for (int i = 1; !slot.second.has_value(); ++i) { // Takes at most 4 iterations.
|
||||
// Look forward and backward for closest time of day color.
|
||||
int neg_index = (slot_index - i + 8) % 8;
|
||||
int pos_index = (slot_index + i + 8) % 8;
|
||||
|
||||
if (const auto& neg_slot = times_of_day[neg_index];
|
||||
attributes.contains(neg_slot.first)) {
|
||||
slot.second = neg_slot.second.value();
|
||||
value_name = neg_slot.first;
|
||||
} else if (const auto& pos_slot = times_of_day[pos_index];
|
||||
attributes.contains(pos_slot.first)) {
|
||||
slot.second = pos_slot.second.value();
|
||||
value_name = pos_slot.first;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
lg::die("unknown attribute type for color {}", attrib_accessor.type);
|
||||
time_name = time_name.substr(1);
|
||||
std::transform(time_name.begin(), time_name.end(), time_name.begin(),
|
||||
[](unsigned char c) { return std::tolower(c); });
|
||||
if (time_name == "greensun")
|
||||
time_name = "green sun";
|
||||
std::string mapping = time_name + ":" + value_name;
|
||||
log_string += log_string.empty() ? mapping : ", " + mapping;
|
||||
}
|
||||
lg::warn("{} missing some times of day, using {}", debug_name, log_string);
|
||||
}
|
||||
|
||||
vtx_colors.insert(vtx_colors.end(), colors.begin(), colors.end());
|
||||
// Create iterators to colors for each time of day.
|
||||
std::array<std::vector<math::Vector<u8, 4>>::const_iterator, 8> iters;
|
||||
for (int time = 0; time < 8; ++time) {
|
||||
const std::vector<math::Vector<u8, 4>>& time_color = times_of_day[time].second.has_value()
|
||||
? times_of_day[time].second.value()
|
||||
: color0.value();
|
||||
|
||||
iters[time] = time_color.begin();
|
||||
}
|
||||
|
||||
// Write the color for each time of day into vtx_colors.
|
||||
for (auto& vtx_color : vtx_colors) {
|
||||
for (int slot_index = 0; slot_index < 8; ++slot_index) {
|
||||
u8* target_ptr = vtx_color.data() + (4 * slot_index);
|
||||
auto& color_iter = iters[slot_index];
|
||||
const u8* source_ptr = color_iter->data();
|
||||
std::memcpy(target_ptr, source_ptr, sizeof(u32));
|
||||
|
||||
++color_iter; // Advance the iterator for this time of day.
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -755,14 +850,15 @@ std::size_t TieFullVertex::hash::operator()(const TieFullVertex& x) const {
|
||||
return tfrag3::PackedTieVertices::Vertex::hash()(x.vertex) ^ std::hash<u16>()(x.color_index);
|
||||
}
|
||||
|
||||
tfrag3::PackedTimeOfDay pack_time_of_day(const std::vector<math::Vector<u8, 4>>& color_palette) {
|
||||
tfrag3::PackedTimeOfDay pack_time_of_day(const std::vector<math::Vector<u8, 32>>& color_palette) {
|
||||
tfrag3::PackedTimeOfDay colors;
|
||||
colors.color_count = (color_palette.size() + 3) & (~3);
|
||||
colors.data.resize(colors.color_count * 8 * 4);
|
||||
for (u32 color_index = 0; color_index < color_palette.size(); color_index++) {
|
||||
for (u32 palette = 0; palette < 8; palette++) {
|
||||
for (u32 channel = 0; channel < 4; channel++) {
|
||||
colors.read(color_index, palette, channel) = color_palette[color_index][channel];
|
||||
colors.read(color_index, palette, channel) =
|
||||
color_palette[color_index][4 * palette + channel];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ std::vector<JointsAndWeights> extract_and_flatten_joints_and_weights(
|
||||
|
||||
struct ExtractedVertices {
|
||||
std::vector<tfrag3::PreloadedVertex> vtx;
|
||||
std::vector<math::Vector<u8, 4>> vtx_colors;
|
||||
std::vector<math::Vector<u8, 32>> vtx_colors;
|
||||
std::vector<math::Vector3f> normals;
|
||||
};
|
||||
|
||||
@@ -178,13 +178,13 @@ math::Matrix4f matrix_from_trs(const math::Vector3f& trans,
|
||||
const math::Vector4f& quat,
|
||||
const math::Vector3f& scale);
|
||||
|
||||
tfrag3::PackedTimeOfDay pack_time_of_day(const std::vector<math::Vector<u8, 4>>& color_palette);
|
||||
tfrag3::PackedTimeOfDay pack_time_of_day(const std::vector<math::Vector<u8, 32>>& color_palette);
|
||||
|
||||
struct MercExtractData {
|
||||
TexturePool tex_pool;
|
||||
std::vector<u32> new_indices;
|
||||
std::vector<tfrag3::PreloadedVertex> new_vertices;
|
||||
std::vector<math::Vector<u8, 4>> new_colors;
|
||||
std::vector<math::Vector<u8, 32>> new_colors;
|
||||
std::vector<math::Vector3f> normals;
|
||||
std::vector<JointsAndWeights> joints_and_weights;
|
||||
tfrag3::MercModel new_model;
|
||||
|
||||
@@ -101,6 +101,7 @@ target_link_libraries(decomp
|
||||
stb_image
|
||||
xdelta3
|
||||
tiny_gltf
|
||||
sound
|
||||
)
|
||||
|
||||
add_executable(decompiler
|
||||
@@ -112,7 +113,9 @@ target_link_libraries(decompiler
|
||||
lzokay
|
||||
fmt
|
||||
stb_image
|
||||
tiny_gltf)
|
||||
tiny_gltf
|
||||
sound
|
||||
)
|
||||
|
||||
|
||||
add_executable(extractor
|
||||
@@ -125,4 +128,6 @@ target_link_libraries(extractor
|
||||
fmt
|
||||
compiler
|
||||
stb_image
|
||||
tiny_gltf)
|
||||
tiny_gltf
|
||||
sound
|
||||
)
|
||||
@@ -32,6 +32,70 @@ Register get_expected_fpr_backup(int n, int total) {
|
||||
return fpr_backups.at((total - 1) - n);
|
||||
}
|
||||
|
||||
/*!
|
||||
* sd s7, 16(sp)
|
||||
* bgezal r0, L
|
||||
* sll r0, r0, 0
|
||||
* L26:
|
||||
* sd fp, 8(sp) ;; not done by interrupt handlers
|
||||
* daddiu fp, ra, -20
|
||||
* lw s7, L24(fp)
|
||||
* lw s7, 0(s7)
|
||||
* daddiu s7, s7, -8 ;; -16 in jak 1
|
||||
*/
|
||||
int match_called_from_c_prologue(const std::vector<Instruction>& instrs,
|
||||
const LinkedObjectFile& file,
|
||||
int start_word,
|
||||
int idx,
|
||||
bool* fp_backed_up) {
|
||||
if (idx + 7 >= int(instrs.size()) ||
|
||||
!is_no_link_gpr_store(instrs.at(idx), 8, make_gpr(Reg::S7), 16, make_gpr(Reg::SP))) {
|
||||
return -1;
|
||||
}
|
||||
idx++;
|
||||
|
||||
// branch to the instruction after the delay slot to get the pc in ra
|
||||
const auto& bgezal = instrs.at(idx);
|
||||
if (bgezal.kind != InstructionKind::BGEZAL || bgezal.get_src(0).get_reg() != make_gpr(Reg::R0)) {
|
||||
return -1;
|
||||
}
|
||||
int ra_idx = idx + 2;
|
||||
const auto& target = file.labels.at(bgezal.get_label_target());
|
||||
if (target.offset != (start_word + ra_idx) * 4 || !is_nop(instrs.at(idx + 1))) {
|
||||
return -1;
|
||||
}
|
||||
idx = ra_idx;
|
||||
|
||||
*fp_backed_up = is_no_link_gpr_store(instrs.at(idx), 8, make_gpr(Reg::FP), 8, make_gpr(Reg::SP));
|
||||
if (*fp_backed_up) {
|
||||
idx++;
|
||||
}
|
||||
|
||||
if (!is_gpr_2_imm_int(instrs.at(idx), InstructionKind::DADDIU, make_gpr(Reg::FP),
|
||||
make_gpr(Reg::RA), -(ra_idx - 1) * 4)) {
|
||||
return -1;
|
||||
}
|
||||
idx++;
|
||||
|
||||
const auto& s7_ptr = instrs.at(idx);
|
||||
if (s7_ptr.kind != InstructionKind::LW || s7_ptr.get_dst(0).get_reg() != make_gpr(Reg::S7) ||
|
||||
!s7_ptr.get_src(0).is_label() || s7_ptr.get_src(1).get_reg() != make_gpr(Reg::FP)) {
|
||||
return -1;
|
||||
}
|
||||
idx++;
|
||||
|
||||
if (!is_no_ll_gpr_load(instrs.at(idx), 4, true, make_gpr(Reg::S7), 0, make_gpr(Reg::S7))) {
|
||||
return -1;
|
||||
}
|
||||
idx++;
|
||||
|
||||
if (!is_gpr_2_imm_int(instrs.at(idx), InstructionKind::DADDIU, make_gpr(Reg::S7),
|
||||
make_gpr(Reg::S7), {})) {
|
||||
return -1;
|
||||
}
|
||||
return idx + 1;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
Function::Function(int _start_word, int _end_word, GameVersion version)
|
||||
@@ -86,11 +150,26 @@ void Function::analyze_prologue(const LinkedObjectFile& file) {
|
||||
idx++;
|
||||
}
|
||||
|
||||
{
|
||||
// check for C callees and interrupt handlers (they back up s7 on the stack and restore it
|
||||
// later)
|
||||
bool c_fp_backed_up = false;
|
||||
int c_prologue_end = -1;
|
||||
if (prologue.ra_backed_up) {
|
||||
c_prologue_end =
|
||||
match_called_from_c_prologue(instructions, file, start_word, idx, &c_fp_backed_up);
|
||||
}
|
||||
if (c_prologue_end != -1) {
|
||||
prologue.called_from_c = true;
|
||||
prologue.fp_set = true;
|
||||
if (c_fp_backed_up) {
|
||||
prologue.fp_backed_up = true;
|
||||
prologue.fp_backup_offset = 8;
|
||||
}
|
||||
idx = c_prologue_end;
|
||||
} else {
|
||||
auto& instr = instructions.at(idx);
|
||||
|
||||
// storing s7 on the stack is done by interrupt handlers, which we probably don't want to
|
||||
// support
|
||||
// anything else storing s7 on the stack is probably asm
|
||||
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(
|
||||
@@ -104,7 +183,8 @@ void Function::analyze_prologue(const LinkedObjectFile& file) {
|
||||
}
|
||||
|
||||
// next is fp backup
|
||||
if (is_no_link_gpr_store(instructions.at(idx), 8, Register(Reg::GPR, Reg::FP), {},
|
||||
if (!prologue.called_from_c &&
|
||||
is_no_link_gpr_store(instructions.at(idx), 8, Register(Reg::GPR, Reg::FP), {},
|
||||
Register(Reg::GPR, Reg::SP))) {
|
||||
prologue.fp_backed_up = true;
|
||||
prologue.fp_backup_offset = get_gpr_store_offset_as_int(instructions.at(idx));
|
||||
@@ -269,9 +349,6 @@ void Function::analyze_prologue(const LinkedObjectFile& file) {
|
||||
ASSERT(prologue.total_stack_usage == total_stack);
|
||||
}
|
||||
|
||||
// it's fine to have the entire first basic block be the prologue - you could loop back to the
|
||||
// first instruction past the prologue.
|
||||
ASSERT(basic_blocks.at(0).end_word >= prologue_end);
|
||||
resize_first_block(prologue_end, file);
|
||||
prologue.decoded = true;
|
||||
|
||||
@@ -279,10 +356,9 @@ void Function::analyze_prologue(const LinkedObjectFile& file) {
|
||||
}
|
||||
|
||||
void Function::resize_first_block(int new_start, const LinkedObjectFile&) {
|
||||
basic_blocks.at(0).start_word = new_start;
|
||||
|
||||
if (basic_blocks.size() >= 2 && basic_blocks.at(1).start_word == new_start) {
|
||||
// block 1 is now zero size, so we should eliminate it
|
||||
// the prologue of a function called from C spans two blocks because of the bgezal.
|
||||
while (basic_blocks.size() >= 2 && basic_blocks.at(1).start_word <= new_start) {
|
||||
// block 0 is entirely prologue, so merge it into block 1
|
||||
auto& block0 = basic_blocks.at(0);
|
||||
auto& block1 = basic_blocks.at(1);
|
||||
block0.succ_ft = block1.succ_ft;
|
||||
@@ -309,6 +385,9 @@ void Function::resize_first_block(int new_start, const LinkedObjectFile&) {
|
||||
}
|
||||
basic_blocks.pop_back();
|
||||
}
|
||||
|
||||
ASSERT(basic_blocks.at(0).end_word >= new_start);
|
||||
basic_blocks.at(0).start_word = new_start;
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -389,6 +468,13 @@ void Function::check_epilogue(const LinkedObjectFile& file) {
|
||||
ASSERT(is_jr_ra(instructions.at(idx)));
|
||||
idx--;
|
||||
|
||||
if (prologue.called_from_c && instructions.at(idx).kind == InstructionKind::EI) {
|
||||
idx--;
|
||||
ASSERT(instructions.at(idx).kind == InstructionKind::SYNCL);
|
||||
idx--;
|
||||
prologue.interrupt_handler = true;
|
||||
}
|
||||
|
||||
// restore gprs
|
||||
for (int i = 0; i < prologue.n_gpr_backup; i++) {
|
||||
int gpr_idx = prologue.n_gpr_backup - (1 + i);
|
||||
@@ -416,6 +502,13 @@ void Function::check_epilogue(const LinkedObjectFile& file) {
|
||||
idx--;
|
||||
}
|
||||
|
||||
// restore s7
|
||||
if (prologue.called_from_c) {
|
||||
ASSERT(
|
||||
is_no_ll_gpr_load(instructions.at(idx), 8, true, make_gpr(Reg::S7), 16, make_gpr(Reg::SP)));
|
||||
idx--;
|
||||
}
|
||||
|
||||
// restore ra
|
||||
if (prologue.ra_backed_up) {
|
||||
ASSERT(is_no_ll_gpr_load(instructions.at(idx), 8, true, make_gpr(Reg::RA),
|
||||
@@ -428,6 +521,12 @@ void Function::check_epilogue(const LinkedObjectFile& file) {
|
||||
basic_blocks.back().end_word = idx + 1;
|
||||
prologue.epilogue_ok = true;
|
||||
epilogue_start = idx + 1;
|
||||
|
||||
if (prologue.interrupt_handler) {
|
||||
warnings.info("Interrupt handler");
|
||||
} else if (prologue.called_from_c) {
|
||||
warnings.info("Called from C");
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
|
||||
@@ -161,6 +161,11 @@ class Function {
|
||||
|
||||
bool fp_set = false;
|
||||
|
||||
// callbacks and interrupt handlers back up s7 and rebuild s7/fp themselves
|
||||
bool called_from_c = false;
|
||||
// re-enables interrupts in the epilogue
|
||||
bool interrupt_handler = false;
|
||||
|
||||
int n_gpr_backup = 0;
|
||||
int gpr_backup_offset = -1;
|
||||
|
||||
|
||||
@@ -22,6 +22,42 @@ RegClass get_reg_kind(const Register& r) {
|
||||
return RegClass::INVALID;
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* Try to resolve obj + (idx * stride) + (idx2 * stride2) as an access into a 2d array.
|
||||
*/
|
||||
ArrayFieldAccess* try_2d_array_access(const TP_Type& input_type,
|
||||
const IR2_RegOffset& ro,
|
||||
const DerefKind& dk,
|
||||
const Env& env,
|
||||
FormPool& pool,
|
||||
TypeSpec* result_type) {
|
||||
const auto& [stride, stride2] = input_type.get_sum_multipliers();
|
||||
FieldReverseLookupInput rd_in;
|
||||
rd_in.deref = dk;
|
||||
rd_in.base_type = input_type.get_obj_plus_const_mult_typespec();
|
||||
rd_in.stride = stride;
|
||||
rd_in.stride2 = stride2;
|
||||
rd_in.offset = ro.offset + input_type.get_sum_constant();
|
||||
auto rd = env.dts->ts.reverse_field_lookup(rd_in);
|
||||
if (!rd.success) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<DerefToken> tokens;
|
||||
std::vector<int> index_strides;
|
||||
for (auto& token : rd.tokens) {
|
||||
tokens.push_back(to_token(token));
|
||||
if (token.kind == FieldReverseLookupOutput::Token::Kind::VAR_IDX) {
|
||||
index_strides.push_back(token.idx == 0 ? stride : stride2);
|
||||
}
|
||||
}
|
||||
auto access = pool.alloc_element<ArrayFieldAccess>(ro.var, tokens, 1, ro.offset,
|
||||
input_type.flipped_add_order());
|
||||
access->set_index_strides(index_strides, input_type.get_sum_constant());
|
||||
*result_type = rd.result_type;
|
||||
return access;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
ConditionElement* BranchOp::get_condition_as_form(FormPool& pool, const Env& env) const {
|
||||
@@ -367,7 +403,20 @@ FormElement* StoreOp::get_as_form(FormPool& pool, const Env& env) const {
|
||||
}
|
||||
}
|
||||
|
||||
if (input_type.kind == TP_Type::Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT) {
|
||||
if (input_type.has_sum_multipliers()) {
|
||||
DerefKind dk;
|
||||
dk.is_store = true;
|
||||
dk.reg_kind = get_reg_kind(ro.reg);
|
||||
dk.size = m_size;
|
||||
TypeSpec result_type;
|
||||
if (auto access = try_2d_array_access(input_type, ro, dk, env, pool, &result_type)) {
|
||||
return pool.alloc_element<StoreArrayAccess>(
|
||||
access, m_value.as_expr(), m_my_idx, ro.var,
|
||||
get_typecast_for_atom(m_value, env, coerce_to_reg_type(result_type), m_my_idx));
|
||||
}
|
||||
}
|
||||
|
||||
if (input_type.is_plain_product_plus_obj()) {
|
||||
FieldReverseLookupInput rd_in;
|
||||
DerefKind dk;
|
||||
dk.is_store = true;
|
||||
@@ -608,7 +657,19 @@ Form* LoadVarOp::get_load_src(FormPool& pool, const Env& env) const {
|
||||
return pool.alloc_single_element_form<DynamicMethodAccess>(nullptr, ro.var);
|
||||
}
|
||||
|
||||
if (input_type.kind == TP_Type::Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT) {
|
||||
if (input_type.has_sum_multipliers()) {
|
||||
DerefKind dk;
|
||||
dk.is_store = false;
|
||||
dk.reg_kind = get_reg_kind(ro.reg);
|
||||
dk.sign_extend = m_kind == Kind::SIGNED;
|
||||
dk.size = m_size;
|
||||
TypeSpec result_type;
|
||||
if (auto access = try_2d_array_access(input_type, ro, dk, env, pool, &result_type)) {
|
||||
return pool.alloc_single_form(nullptr, access);
|
||||
}
|
||||
}
|
||||
|
||||
if (input_type.is_plain_product_plus_obj()) {
|
||||
FieldReverseLookupInput rd_in;
|
||||
DerefKind dk;
|
||||
dk.is_store = false;
|
||||
|
||||
@@ -904,6 +904,11 @@ TypeState AsmOp::propagate_types_internal(const TypeState& input,
|
||||
result.get(m_dst->reg()) = TP_Type::make_from_ts(coerce_to_reg_type(field.type()));
|
||||
return result;
|
||||
}
|
||||
if (m_instr.src[1].get_imm() > 0 &&
|
||||
dts.ts.tc(TypeSpec("integer"), result.get(m_src[0]->reg()).typespec())) {
|
||||
result.get(m_dst->reg()) = TP_Type::make_from_ts("uint");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
if (m_dst.has_value()) {
|
||||
@@ -1008,9 +1013,11 @@ TP_Type LoadVarOp::get_src_type(const TypeState& input,
|
||||
if (method_id == GOAL_NEW_METHOD) {
|
||||
return TP_Type::make_non_object_new(method_type, TypeSpec(type_name));
|
||||
} else if (input_type.kind == TP_Type::Kind::TYPE_OF_TYPE_NO_VIRTUAL) {
|
||||
return TP_Type::make_non_virtual_method(method_type, TypeSpec(type_name), method_id);
|
||||
return TP_Type::make_non_virtual_method(method_type, TypeSpec(type_name), method_id,
|
||||
method_info.name);
|
||||
} else {
|
||||
return TP_Type::make_virtual_method(method_type, TypeSpec(type_name), method_id);
|
||||
return TP_Type::make_virtual_method(method_type, TypeSpec(type_name), method_id,
|
||||
method_info.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1023,7 +1030,8 @@ TP_Type LoadVarOp::get_src_type(const TypeState& input,
|
||||
if (method_id != GOAL_NEW_METHOD && method_id != GOAL_RELOC_METHOD) {
|
||||
// this can get us the wrong thing for `new` methods. And maybe relocate?
|
||||
return TP_Type::make_non_virtual_method(
|
||||
method_info.type.substitute_for_method_call("object"), TypeSpec("object"), method_id);
|
||||
method_info.type.substitute_for_method_call("object"), TypeSpec("object"), method_id,
|
||||
method_info.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1314,6 +1314,23 @@ class DerefElement : public FormElement {
|
||||
std::vector<DerefToken> m_tokens;
|
||||
};
|
||||
|
||||
struct Match2dIndices {
|
||||
Form* idx[2] = {nullptr, nullptr};
|
||||
Form* base = nullptr;
|
||||
};
|
||||
|
||||
/*!
|
||||
* find the two indices of (+ (* idx stride) (* idx2 stride2) constant [base]).
|
||||
*/
|
||||
std::optional<Match2dIndices> match_2d_indices(Form* in,
|
||||
const std::vector<int>& strides,
|
||||
s64 constant,
|
||||
bool with_base,
|
||||
const Env& env,
|
||||
FormPool& pool);
|
||||
std::vector<DerefToken> fill_2d_index_placeholders(const std::vector<DerefToken>& tokens,
|
||||
const Match2dIndices& match);
|
||||
|
||||
class ArrayFieldAccess : public FormElement {
|
||||
public:
|
||||
ArrayFieldAccess(RegisterAccess source,
|
||||
@@ -1340,12 +1357,24 @@ class ArrayFieldAccess : public FormElement {
|
||||
|
||||
bool flipped() const { return m_flipped; }
|
||||
|
||||
void set_index_strides(std::vector<int> strides, s64 constant) {
|
||||
m_index_strides = std::move(strides);
|
||||
m_index_constant = constant;
|
||||
}
|
||||
|
||||
private:
|
||||
void update_with_val_2d(Form* new_val,
|
||||
const Env& env,
|
||||
FormPool& pool,
|
||||
std::vector<FormElement*>* result);
|
||||
|
||||
RegisterAccess m_source;
|
||||
std::vector<DerefToken> m_deref_tokens;
|
||||
int m_expected_stride = -1;
|
||||
int m_constant_offset = -1;
|
||||
bool m_flipped = false;
|
||||
std::vector<int> m_index_strides;
|
||||
s64 m_index_constant = 0;
|
||||
};
|
||||
|
||||
class StorePlainDeref : public FormElement {
|
||||
|
||||
@@ -902,9 +902,11 @@ void SimpleExpressionElement::update_from_stack_gpr_to_fpr(const Env& env,
|
||||
std::vector<FormElement*>* result,
|
||||
bool allow_side_effects) {
|
||||
auto src = m_expr.get_arg(0);
|
||||
auto src_type = env.get_types_before_op(src.var().idx()).get(src.var().reg());
|
||||
auto src_is_float = false;
|
||||
std::vector<FormElement*> src_fes;
|
||||
if (src.is_var()) {
|
||||
auto src_type = env.get_types_before_op(src.var().idx()).get(src.var().reg());
|
||||
src_is_float = env.dts->ts.tc(TypeSpec("float"), src_type.typespec());
|
||||
auto forms = pop_to_forms({src.var()}, env, pool, stack, allow_side_effects);
|
||||
for (auto x : forms.at(0)->elts()) {
|
||||
src_fes.push_back(x);
|
||||
@@ -916,7 +918,7 @@ void SimpleExpressionElement::update_from_stack_gpr_to_fpr(const Env& env,
|
||||
// set ourself to identity.
|
||||
m_expr = src.as_expr();
|
||||
|
||||
if (env.dts->ts.tc(TypeSpec("float"), src_type.typespec())) {
|
||||
if (src_is_float) {
|
||||
// got a float as an input, we can convert it to an FPR with no effect.
|
||||
for (auto x : src_fes) {
|
||||
result->push_back(x);
|
||||
@@ -932,6 +934,12 @@ void SimpleExpressionElement::update_from_stack_gpr_to_fpr(const Env& env,
|
||||
if (proper_float(flt)) {
|
||||
result->push_back(pool.alloc_element<ConstantFloatElement>(flt));
|
||||
return;
|
||||
} else if (frm->to_string(env) == "#x7f800000") {
|
||||
auto cast = pool.alloc_element<CastElement>(TypeSpec("float"), frm);
|
||||
env.func->warnings.warning("op {}: float inf {} moved to fpr", m_my_idx,
|
||||
frm->to_string(env), cast->to_string(env));
|
||||
result->push_back(cast);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1153,6 +1161,11 @@ void SimpleExpressionElement::update_from_stack_si_1(const Env& env,
|
||||
make_cast_if_needed(arg, in_type, TypeSpec("int"), pool, env)));
|
||||
}
|
||||
|
||||
namespace {
|
||||
Form* strip_int_or_uint_cast(Form* in);
|
||||
Form* match_index_product(Form* in, int stride);
|
||||
} // namespace
|
||||
|
||||
void SimpleExpressionElement::update_from_stack_add_i(const Env& env,
|
||||
FormPool& pool,
|
||||
FormStack& stack,
|
||||
@@ -1437,6 +1450,80 @@ void SimpleExpressionElement::update_from_stack_add_i(const Env& env,
|
||||
throw std::runtime_error("Failed to match product_with_constant inline array access 2.");
|
||||
}
|
||||
}
|
||||
} else if ((arg1_type.is_product() && arg0_type.has_field_origin()) ||
|
||||
(arg0_type.is_product() && arg1_type.has_field_origin())) {
|
||||
// (+ (+ obj C1) (* idx C2)), where obj + C1 was already turned into a field access.
|
||||
// same path as the element access with index 0.
|
||||
bool field_first = arg1_type.is_product() && arg0_type.has_field_origin();
|
||||
const auto& field_type = field_first ? arg0_type : arg1_type;
|
||||
int stride = (field_first ? arg1_type : arg0_type).get_multiplier();
|
||||
auto elt = lookup_array_element_from_field(env.dts->ts, field_type, stride);
|
||||
auto idx = match_index_product(args.at(field_first ? 1 : 0), stride);
|
||||
auto deref =
|
||||
strip_int_or_uint_cast(args.at(field_first ? 0 : 1))->try_as_element<DerefElement>();
|
||||
if (elt && idx && deref && !deref->is_addr_of() &&
|
||||
deref->tokens().size() >= elt->tokens.size()) {
|
||||
const auto& old_tokens = deref->tokens();
|
||||
size_t start = old_tokens.size() - elt->tokens.size();
|
||||
std::vector<DerefToken> tokens(old_tokens.begin(), old_tokens.begin() + start);
|
||||
bool same_path = true;
|
||||
for (size_t i = 0; i < elt->tokens.size() && same_path; i++) {
|
||||
const auto& tok = elt->tokens.at(i);
|
||||
const auto& old_tok = old_tokens.at(start + i);
|
||||
switch (tok.kind) {
|
||||
case FieldReverseLookupOutput::Token::Kind::FIELD:
|
||||
same_path = old_tok.is_field_name(tok.name);
|
||||
tokens.push_back(old_tok);
|
||||
break;
|
||||
case FieldReverseLookupOutput::Token::Kind::CONSTANT_IDX:
|
||||
same_path = old_tok.is_int(tok.idx);
|
||||
tokens.push_back(old_tok);
|
||||
break;
|
||||
case FieldReverseLookupOutput::Token::Kind::VAR_IDX:
|
||||
same_path = old_tok.is_int(0);
|
||||
tokens.push_back(DerefToken::make_int_expr(idx));
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (same_path) {
|
||||
result->push_back(pool.alloc_element<DerefElement>(deref->base(), false, tokens));
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (elt) {
|
||||
auto sum = pool.alloc_single_element_form<GenericElement>(
|
||||
nullptr, GenericOperator::make_fixed(FixedOperatorKind::ADDITION_PTR),
|
||||
args.at(field_first ? 0 : 1), args.at(field_first ? 1 : 0));
|
||||
result->push_back(
|
||||
pool.alloc_element<CastElement>(coerce_to_reg_type(elt->result_type), sum));
|
||||
return;
|
||||
}
|
||||
} else if (arg0_type.kind == TP_Type::Kind::PRODUCT_SUM ||
|
||||
arg1_type.kind == TP_Type::Kind::PRODUCT_SUM) {
|
||||
bool sum_first = arg0_type.kind == TP_Type::Kind::PRODUCT_SUM;
|
||||
const auto& sum_type = sum_first ? arg0_type : arg1_type;
|
||||
const auto& base_type = sum_first ? arg1_type : arg0_type;
|
||||
auto elt = lookup_2d_array_element(env.dts->ts, base_type.typespec(), sum_type);
|
||||
if (elt && base_type.kind == TP_Type::Kind::TYPESPEC) {
|
||||
std::vector<int> strides;
|
||||
const auto& [stride, stride2] = sum_type.get_product_sum_multipliers();
|
||||
for (auto& tok : elt->tokens) {
|
||||
if (tok.kind == FieldReverseLookupOutput::Token::Kind::VAR_IDX) {
|
||||
strides.push_back(tok.idx == 0 ? stride : stride2);
|
||||
}
|
||||
}
|
||||
auto match = match_2d_indices(args.at(sum_first ? 0 : 1), strides,
|
||||
sum_type.get_sum_constant(), false, env, pool);
|
||||
if (!match) {
|
||||
throw std::runtime_error(fmt::format("Failed to match 2d array access with add: {}",
|
||||
args.at(sum_first ? 0 : 1)->to_string(env)));
|
||||
}
|
||||
result->push_back(pool.alloc_element<DerefElement>(
|
||||
cast_stack_slot_var_if_needed(args.at(sum_first ? 1 : 0), base_type.typespec(), pool,
|
||||
env),
|
||||
false, fill_2d_index_placeholders(to_tokens(elt->tokens), *match)));
|
||||
return;
|
||||
}
|
||||
} else if (arg0_type.kind == TP_Type::Kind::INTEGER_CONSTANT) {
|
||||
// try to see if this is valid, from the type system.
|
||||
FieldReverseLookupInput input;
|
||||
@@ -1912,6 +1999,104 @@ Form* strip_int_or_uint_cast(Form* in) {
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace {
|
||||
/*!
|
||||
* match (* idx stride) or (* stride idx) and return idx.
|
||||
*/
|
||||
Form* match_index_product(Form* in, int stride) {
|
||||
auto stride_matcher =
|
||||
Matcher::match_or({Matcher::cast("uint", Matcher::integer(stride)),
|
||||
Matcher::cast("int", Matcher::integer(stride)), Matcher::integer(stride)});
|
||||
auto idx_matcher = Matcher::match_or({Matcher::cast("uint", Matcher::any(0)),
|
||||
Matcher::cast("int", Matcher::any(0)), Matcher::any(0)});
|
||||
auto mult_matcher = Matcher::match_or(
|
||||
{Matcher::op_fixed(FixedOperatorKind::MULTIPLICATION, {idx_matcher, stride_matcher}),
|
||||
Matcher::op_fixed(FixedOperatorKind::MULTIPLICATION, {stride_matcher, idx_matcher})});
|
||||
mult_matcher = Matcher::match_or(
|
||||
{Matcher::cast("uint", mult_matcher), Matcher::cast("int", mult_matcher), mult_matcher});
|
||||
auto mr = match(mult_matcher, in);
|
||||
return mr.matched ? mr.maps.forms.at(0) : nullptr;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
std::optional<Match2dIndices> match_2d_indices(Form* in,
|
||||
const std::vector<int>& strides,
|
||||
s64 constant,
|
||||
bool with_base,
|
||||
const Env& env,
|
||||
FormPool& pool) {
|
||||
ASSERT(strides.size() == 2 && strides.at(0) != strides.at(1));
|
||||
int unit_slot = strides.at(0) == 1 ? 0 : (strides.at(1) == 1 ? 1 : -1);
|
||||
if (unit_slot != -1 && with_base) {
|
||||
return std::nullopt;
|
||||
}
|
||||
std::vector<Form*> terms;
|
||||
std::function<void(Form*)> flatten = [&](Form* f) {
|
||||
auto as_generic = strip_int_or_uint_cast(f)->try_as_element<GenericElement>();
|
||||
if (as_generic && (as_generic->op().is_fixed(FixedOperatorKind::ADDITION) ||
|
||||
as_generic->op().is_fixed(FixedOperatorKind::ADDITION_PTR))) {
|
||||
for (auto elt : as_generic->elts()) {
|
||||
flatten(elt);
|
||||
}
|
||||
} else {
|
||||
terms.push_back(f);
|
||||
}
|
||||
};
|
||||
flatten(in);
|
||||
|
||||
Match2dIndices result;
|
||||
s64 found_constant = 0;
|
||||
std::vector<Form*> unit_terms;
|
||||
for (auto term : terms) {
|
||||
bool used = false;
|
||||
for (int i = 0; i < 2 && !used; i++) {
|
||||
if (!result.idx[i] && i != unit_slot) {
|
||||
result.idx[i] = match_index_product(term, strides.at(i));
|
||||
used = result.idx[i];
|
||||
}
|
||||
}
|
||||
if (used) {
|
||||
continue;
|
||||
}
|
||||
if (auto as_int = get_goal_integer_constant(strip_int_or_uint_cast(term), env)) {
|
||||
found_constant += *as_int;
|
||||
} else if (unit_slot != -1) {
|
||||
unit_terms.push_back(strip_int_or_uint_cast(term));
|
||||
} else if (with_base && !result.base) {
|
||||
result.base = strip_int_or_uint_cast(term);
|
||||
} else {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
|
||||
if (unit_terms.size() == 1) {
|
||||
result.idx[unit_slot] = unit_terms.front();
|
||||
} else if (unit_terms.size() > 1) {
|
||||
result.idx[unit_slot] = pool.alloc_single_element_form<GenericElement>(
|
||||
nullptr, GenericOperator::make_fixed(FixedOperatorKind::ADDITION), unit_terms);
|
||||
}
|
||||
|
||||
if (!result.idx[0] || !result.idx[1] || (with_base && !result.base) ||
|
||||
found_constant != constant) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
std::vector<DerefToken> fill_2d_index_placeholders(const std::vector<DerefToken>& tokens,
|
||||
const Match2dIndices& match) {
|
||||
std::vector<DerefToken> result = tokens;
|
||||
int placeholder = 0;
|
||||
for (auto& x : result) {
|
||||
if (x.kind() == DerefToken::Kind::EXPRESSION_PLACEHOLDER) {
|
||||
ASSERT(placeholder < 2);
|
||||
x = DerefToken::make_int_expr(match.idx[placeholder++]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
FormElement* SimpleExpressionElement::update_from_stack_logor_or_logand_helper(
|
||||
const Env& env,
|
||||
FixedOperatorKind kind,
|
||||
@@ -1950,6 +2135,13 @@ FormElement* SimpleExpressionElement::update_from_stack_logor_or_logand_helper(
|
||||
bitfield_info =
|
||||
dynamic_cast<BitFieldType*>(env.dts->ts.lookup_type(arg0_reg_type.get_bitfield_type()));
|
||||
ASSERT(bitfield_info);
|
||||
} else if (arg0_reg_type.kind == TP_Type::Kind::TYPESPEC) {
|
||||
// the variable isn't a bitfield, but it's cast to one here.
|
||||
bitfield_info =
|
||||
dynamic_cast<BitFieldType*>(env.dts->ts.lookup_type(arg0_reg_type.typespec()));
|
||||
if (bitfield_info) {
|
||||
bitfield_type = arg0_reg_type.typespec();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6288,6 +6480,21 @@ void ReturnElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta
|
||||
|
||||
namespace {
|
||||
|
||||
bool is_zero_extended_32(const Env& env, const RegisterAccess& var) {
|
||||
const auto& ops = env.func->ir2.atomic_ops->ops;
|
||||
const auto& defs = env.get_use_def_info(var).defs;
|
||||
if (defs.empty()) {
|
||||
return false;
|
||||
}
|
||||
for (const auto& def : defs) {
|
||||
auto load = dynamic_cast<const LoadVarOp*>(ops.at(def.op_id).get());
|
||||
if (!load || load->kind() != LoadVarOp::Kind::UNSIGNED || load->size() > 4) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void push_asm_srl_to_stack(const AsmOp* op,
|
||||
FormElement* form_elt,
|
||||
const Env& env,
|
||||
@@ -6325,6 +6532,19 @@ void push_asm_srl_to_stack(const AsmOp* op,
|
||||
ASSERT(other); // should immediately get a field.
|
||||
stack.push_value_to_reg(*dst, pool.alloc_single_form(nullptr, other), true,
|
||||
env.get_variable_type(*dst, true));
|
||||
} else if (integer > 0 && env.dts->ts.tc(TypeSpec("integer"), arg0_type)) {
|
||||
// srl shifts the lower 32 bits, the result is always zero-extended.
|
||||
Form* low = src_var;
|
||||
if (!is_zero_extended_32(env, *var)) {
|
||||
low = pool.form<GenericElement>(
|
||||
GenericOperator::make_fixed(FixedOperatorKind::LOGAND), src_var,
|
||||
pool.form<SimpleAtomElement>(SimpleAtom::make_int_constant(UINT32_MAX)));
|
||||
}
|
||||
auto shr = pool.alloc_element<GenericElement>(
|
||||
GenericOperator::make_fixed(FixedOperatorKind::SHR), low,
|
||||
pool.form<SimpleAtomElement>(SimpleAtom::make_int_constant(integer)));
|
||||
stack.push_value_to_reg(*dst, pool.alloc_single_form(nullptr, shr), true,
|
||||
env.get_variable_type(*dst, true));
|
||||
} else {
|
||||
stack.push_form_element(form_elt, true);
|
||||
// throw std::runtime_error(
|
||||
@@ -6711,11 +6931,48 @@ void DynamicMethodAccess::update_from_stack(const Env& env,
|
||||
// ArrayFieldAccess
|
||||
////////////////////////
|
||||
|
||||
/*!
|
||||
* Rebuild an access into a 2d array from (+ (* idx stride) (* idx2 stride2) constant base), in any
|
||||
* order and nesting.
|
||||
*/
|
||||
void ArrayFieldAccess::update_with_val_2d(Form* new_val,
|
||||
const Env& env,
|
||||
FormPool& pool,
|
||||
std::vector<FormElement*>* result) {
|
||||
std::optional<Match2dIndices> match;
|
||||
if (std::find(m_index_strides.begin(), m_index_strides.end(), 1) != m_index_strides.end()) {
|
||||
// the base can't be told apart from a stride 1 index, so use the order of the last add.
|
||||
auto as_generic = strip_int_or_uint_cast(new_val)->try_as_element<GenericElement>();
|
||||
if (as_generic && as_generic->elts().size() == 2 &&
|
||||
(as_generic->op().is_fixed(FixedOperatorKind::ADDITION) ||
|
||||
as_generic->op().is_fixed(FixedOperatorKind::ADDITION_PTR))) {
|
||||
auto base = as_generic->elts().at(m_flipped ? 1 : 0);
|
||||
auto rest = as_generic->elts().at(m_flipped ? 0 : 1);
|
||||
match = match_2d_indices(rest, m_index_strides, m_index_constant, false, env, pool);
|
||||
if (match) {
|
||||
match->base = strip_int_or_uint_cast(base);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
match = match_2d_indices(new_val, m_index_strides, m_index_constant, true, env, pool);
|
||||
}
|
||||
if (!match) {
|
||||
throw std::runtime_error("Failed to match 2d array access: " + new_val->to_string(env));
|
||||
}
|
||||
result->push_back(pool.alloc_element<DerefElement>(
|
||||
match->base, false, fill_2d_index_placeholders(m_deref_tokens, *match)));
|
||||
}
|
||||
|
||||
void ArrayFieldAccess::update_with_val(Form* new_val,
|
||||
const Env& env,
|
||||
FormPool& pool,
|
||||
std::vector<FormElement*>* result,
|
||||
bool) {
|
||||
if (!m_index_strides.empty()) {
|
||||
update_with_val_2d(new_val, env, pool, result);
|
||||
return;
|
||||
}
|
||||
|
||||
int power_of_two = 0;
|
||||
|
||||
if (m_constant_offset == 0) {
|
||||
|
||||
@@ -356,6 +356,52 @@ std::optional<BitFieldDef> get_bitfield_initial_set(Form* form,
|
||||
return {};
|
||||
}
|
||||
|
||||
/*!
|
||||
* Setting a field to a field of another bitfield:
|
||||
* (shl (the-as int (-> other g)) 8) or just (-> other r) for a field at bit 0.
|
||||
* Only allowed if the field we read fits in the field we set
|
||||
*/
|
||||
std::optional<BitFieldDef> get_bitfield_set_from_field_read(Form* value,
|
||||
const BitField& field,
|
||||
int offset_in_bitfield,
|
||||
const TypeSystem& ts,
|
||||
const Env& env) {
|
||||
Form* read = strip_int_or_uint_cast(value);
|
||||
int shift = 0;
|
||||
auto shl_matcher = Matcher::op(GenericOpMatcher::fixed(FixedOperatorKind::SHL),
|
||||
{Matcher::any(0), Matcher::any_integer(1)});
|
||||
auto mr = match(shl_matcher, read);
|
||||
if (mr.matched) {
|
||||
read = strip_int_or_uint_cast(mr.maps.forms.at(0));
|
||||
shift = mr.maps.ints.at(1);
|
||||
}
|
||||
if (shift != field.offset() - offset_in_bitfield) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
auto deref = read->try_as_element<DerefElement>();
|
||||
if (!deref || deref->is_addr_of() || deref->tokens().size() != 1 ||
|
||||
deref->tokens().front().kind() != DerefToken::Kind::FIELD_NAME) {
|
||||
return std::nullopt;
|
||||
}
|
||||
auto base = form_as_atom(deref->base());
|
||||
if (!base || !base->is_var()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
auto read_type =
|
||||
dynamic_cast<BitFieldType*>(ts.lookup_type(env.get_variable_type(base->var(), true)));
|
||||
BitField read_field;
|
||||
if (!read_type || !read_type->lookup_field(deref->tokens().front().field_name(), &read_field) ||
|
||||
read_field.size() > field.size()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
BitFieldDef def;
|
||||
def.value = read;
|
||||
def.field_name = field.name();
|
||||
def.is_signed = false;
|
||||
return def;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
void BitfieldAccessElement::push_pcpyud(const TypeSystem& ts, FormPool& pool, const Env& /*env*/) {
|
||||
@@ -490,8 +536,11 @@ FormElement* BitfieldAccessElement::push_step(const BitfieldManip step,
|
||||
int size = 64 - step.amount;
|
||||
int start_bit = end_bit - size;
|
||||
bool neg = false;
|
||||
int neg_shift = 0;
|
||||
if (start_bit < 0) {
|
||||
// throw std::runtime_error("push_step: Bad bitfield start bit");
|
||||
// the field ends up shifted left by however much the right shift fell short.
|
||||
neg_shift = -start_bit;
|
||||
size += start_bit;
|
||||
start_bit = 0;
|
||||
neg = true;
|
||||
@@ -509,7 +558,7 @@ FormElement* BitfieldAccessElement::push_step(const BitfieldManip step,
|
||||
auto result = pool.alloc_element<GenericElement>(
|
||||
GenericOperator::make_fixed(FixedOperatorKind::SHL),
|
||||
pool.form<CastElement>(TypeSpec("int"), pool.alloc_single_form(nullptr, deref)),
|
||||
pool.form<SimpleAtomElement>(SimpleAtom::make_int_constant(64 - step.amount)));
|
||||
pool.form<SimpleAtomElement>(SimpleAtom::make_int_constant(neg_shift)));
|
||||
return result;
|
||||
} else {
|
||||
return deref;
|
||||
@@ -621,6 +670,9 @@ FormElement* BitfieldAccessElement::push_step(const BitfieldManip step,
|
||||
ASSERT(field);
|
||||
|
||||
auto val = get_bitfield_initial_set(step.value, as_bitfield, ts, pcpyud_offset);
|
||||
if (!val) {
|
||||
val = get_bitfield_set_from_field_read(step.value, *field, pcpyud_offset, ts, env);
|
||||
}
|
||||
|
||||
if (!val) {
|
||||
throw std::runtime_error(
|
||||
@@ -781,6 +833,81 @@ Form* cast_sound_name(FormPool& pool, const Env& env, Form* in) {
|
||||
return pool.form<ConstantTokenElement>(fmt::format("(static-sound-name \"{}\")", name));
|
||||
}
|
||||
|
||||
std::optional<std::vector<Form*>> masked_sets_to_logior_args(const BitFieldType* type_info,
|
||||
Form* in,
|
||||
FormPool& pool,
|
||||
const Env& env) {
|
||||
auto any_matcher = [](int i) {
|
||||
return Matcher::match_or({Matcher::cast("uint", Matcher::any(i)),
|
||||
Matcher::cast("int", Matcher::any(i)), Matcher::any(i)});
|
||||
};
|
||||
auto clear_matcher =
|
||||
Matcher::op_fixed(FixedOperatorKind::LOGAND, {any_matcher(0), any_matcher(1)});
|
||||
auto set_matcher = Matcher::match_or(
|
||||
{Matcher::op_fixed(FixedOperatorKind::LOGIOR, {clear_matcher, any_matcher(2)}),
|
||||
Matcher::op_fixed(FixedOperatorKind::LOGIOR, {any_matcher(2), clear_matcher})});
|
||||
|
||||
struct FieldSet {
|
||||
u64 mask;
|
||||
Form* value;
|
||||
};
|
||||
std::vector<FieldSet> sets;
|
||||
Form* base = strip_int_or_uint_cast(in);
|
||||
while (true) {
|
||||
auto mr = match(set_matcher, base);
|
||||
if (!mr.matched) {
|
||||
break;
|
||||
}
|
||||
auto mask = get_goal_integer_constant(strip_int_or_uint_cast(mr.maps.forms.at(1)), env);
|
||||
if (!mask) {
|
||||
break;
|
||||
}
|
||||
sets.push_back({*mask, mr.maps.forms.at(2)});
|
||||
base = strip_int_or_uint_cast(mr.maps.forms.at(0));
|
||||
}
|
||||
|
||||
auto constant = get_goal_integer_constant(base, env);
|
||||
if (sets.empty() || !constant) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
u64 constant_bits = *constant;
|
||||
u64 dynamic_bits = 0;
|
||||
std::vector<Form*> dynamic_values;
|
||||
// innermost set first
|
||||
for (auto it = sets.rbegin(); it != sets.rend(); ++it) {
|
||||
auto& set = *it;
|
||||
if (dynamic_bits & ~set.mask) {
|
||||
// clears a field we already set, not a static def.
|
||||
return std::nullopt;
|
||||
}
|
||||
constant_bits &= set.mask;
|
||||
|
||||
auto value = strip_int_or_uint_cast(set.value);
|
||||
auto value_constant = get_goal_integer_constant(value, env);
|
||||
if (value_constant) {
|
||||
if (*value_constant & set.mask) {
|
||||
return std::nullopt;
|
||||
}
|
||||
constant_bits |= *value_constant;
|
||||
continue;
|
||||
}
|
||||
|
||||
auto field = find_field_from_mask(env.dts->ts, type_info, ~set.mask, false);
|
||||
auto def = get_bitfield_initial_set(value, type_info, env.dts->ts, 0);
|
||||
if (!field || !def || def->field_name != field->name()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
dynamic_bits |= ~set.mask;
|
||||
dynamic_values.push_back(set.value);
|
||||
}
|
||||
|
||||
std::vector<Form*> args = {
|
||||
pool.form<SimpleAtomElement>(SimpleAtom::make_int_constant(constant_bits))};
|
||||
args.insert(args.end(), dynamic_values.begin(), dynamic_values.end());
|
||||
return args;
|
||||
}
|
||||
|
||||
std::optional<std::vector<BitFieldDef>> get_field_defs_from_expr(const BitFieldType* type_info,
|
||||
Form* in,
|
||||
const TypeSpec& typespec,
|
||||
@@ -789,7 +916,11 @@ std::optional<std::vector<BitFieldDef>> get_field_defs_from_expr(const BitFieldT
|
||||
std::optional<int> offset) {
|
||||
auto in_as_generic = strip_int_or_uint_cast(in)->try_as_element<GenericElement>();
|
||||
std::vector<Form*> args;
|
||||
if (in_as_generic && in_as_generic->op().is_fixed(FixedOperatorKind::LOGIOR)) {
|
||||
auto masked_args =
|
||||
offset.value_or(0) == 0 ? masked_sets_to_logior_args(type_info, in, pool, env) : std::nullopt;
|
||||
if (masked_args) {
|
||||
args = *masked_args;
|
||||
} else if (in_as_generic && in_as_generic->op().is_fixed(FixedOperatorKind::LOGIOR)) {
|
||||
args = compact_nested_logiors(in_as_generic, env);
|
||||
} else {
|
||||
args = {strip_int_or_uint_cast(in)};
|
||||
|
||||
@@ -388,12 +388,20 @@ class ObjectFileDB {
|
||||
[[maybe_unused]] int fn = 0;
|
||||
if (data.linked_data.segments == 3) {
|
||||
for (size_t j = data.linked_data.functions_by_seg.at(seg).size(); j-- > 0;) {
|
||||
f(data.linked_data.functions_by_seg.at(seg).at(j));
|
||||
auto& func = data.linked_data.functions_by_seg.at(seg).at(j);
|
||||
if (ir2_function_filter && &func != ir2_function_filter) {
|
||||
continue;
|
||||
}
|
||||
f(func);
|
||||
fn++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if set, ir2 passes only run on this function (used to re-analyze one function
|
||||
// for the asm branch permuter)
|
||||
const Function* ir2_function_filter = nullptr;
|
||||
|
||||
// Danger: after adding all object files, we assume that the vector never reallocates.
|
||||
std::unordered_map<std::string, std::vector<ObjectFileData>> obj_files_by_name;
|
||||
std::unordered_map<std::string, std::vector<ObjectFileRecord>> obj_files_by_dgo;
|
||||
|
||||
@@ -578,7 +578,7 @@ int get_start_idx_process(Function& function,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind ::IDENTITY,
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind::IDENTITY,
|
||||
Register(Reg::GPR, Reg::GP), Register(Reg::GPR, Reg::GP))) {
|
||||
lg::print("[iim] op 2 bad in {}: {}\n", aos.ops.at(op_idx)->to_string(env), function.name());
|
||||
return -1;
|
||||
@@ -764,7 +764,7 @@ int get_start_idx(Function& function,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind ::IDENTITY,
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind::IDENTITY,
|
||||
Register(Reg::GPR, Reg::GP), Register(Reg::GPR, Reg::GP))) {
|
||||
lg::print("[iim] op 2 bad in {}: {}\n", aos.ops.at(op_idx)->to_string(env), function.name());
|
||||
return -1;
|
||||
@@ -827,7 +827,7 @@ int get_start_idx(Function& function,
|
||||
}
|
||||
op_idx++;
|
||||
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind ::IDENTITY,
|
||||
if (!is_op_2(aos.ops.at(op_idx).get(), SimpleExpression::Kind::IDENTITY,
|
||||
Register(Reg::GPR, Reg::A2), Register(Reg::GPR, Reg::GP))) {
|
||||
lg::print("[iim] op 8 bad in {}: {}\n", aos.ops.at(op_idx)->to_string(env), function.name());
|
||||
return -1;
|
||||
|
||||
@@ -181,8 +181,14 @@ void clean_up_return_final(const Function& f, ReturnElement* ir) {
|
||||
ASSERT(dead);
|
||||
auto src = dynamic_cast<SimpleExpressionElement*>(dead->src()->try_as_single_element());
|
||||
ASSERT(src);
|
||||
ASSERT(src->expr().is_identity() && src->expr().get_arg(0).is_int() &&
|
||||
src->expr().get_arg(0).get_int() == 0);
|
||||
auto ok = src->expr().is_identity() && src->expr().get_arg(0).is_int() &&
|
||||
src->expr().get_arg(0).get_int() == 0;
|
||||
if (!ok) {
|
||||
throw std::runtime_error(
|
||||
fmt::format("secondary assertion hit in `clean_up_return_final` in function: {} ",
|
||||
f.guessed_name.to_string()));
|
||||
}
|
||||
ASSERT(ok);
|
||||
ir->dead_code = nullptr;
|
||||
}
|
||||
|
||||
|
||||
@@ -336,6 +336,9 @@ Config make_config_via_json(nlohmann::json& json) {
|
||||
if (json.contains("rip_streamed_audio")) {
|
||||
config.rip_streamed_audio = json.at("rip_streamed_audio").get<bool>();
|
||||
}
|
||||
if (json.contains("rip_music")) {
|
||||
config.rip_music = json.at("rip_music").get<bool>();
|
||||
}
|
||||
|
||||
if (inputs_json.contains("animated_textures")) {
|
||||
config.animated_textures =
|
||||
|
||||
@@ -177,6 +177,7 @@ struct Config {
|
||||
bool levels_extract;
|
||||
bool save_texture_pngs = false;
|
||||
bool rip_streamed_audio = false;
|
||||
bool rip_music = false;
|
||||
|
||||
DecompileHacks hacks;
|
||||
|
||||
|
||||
@@ -3790,7 +3790,7 @@
|
||||
|
||||
(deftype vif-bank (structure)
|
||||
((stat uint32 :offset-assert 0)
|
||||
(fbrst uint32 :offset 16)
|
||||
(fbrst vif-fbrst :offset 16)
|
||||
(err vif-err :offset 32)
|
||||
(mark uint32 :offset 48)
|
||||
(cycle uint32 :offset 64)
|
||||
|
||||
@@ -127,9 +127,12 @@
|
||||
// save game textures as .png files to decompiler_out/<game>/textures
|
||||
"save_texture_pngs": false,
|
||||
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio/sfx and decompiler_out/<game>/audio/voice_lines
|
||||
"rip_streamed_audio": false,
|
||||
|
||||
// whether or not to dump out music files to decompiler_out/<game>/audio/music
|
||||
"rip_music": false,
|
||||
|
||||
////////////////////////////
|
||||
// PATCHING OPTIONS
|
||||
////////////////////////////
|
||||
|
||||
@@ -90,11 +90,6 @@
|
||||
"symlink2", // F: asm branching
|
||||
"dma-sync-hang",
|
||||
|
||||
// display
|
||||
"vblank-handler", // F: weird asm for interrupt handler
|
||||
"vif1-handler", // F: weird asm for interrupt handler
|
||||
"vif1-handler-debug",
|
||||
|
||||
// texture
|
||||
"adgif-shader<-texture!",
|
||||
|
||||
|
||||
@@ -6165,5 +6165,13 @@
|
||||
"target-collision-low-coverage": [
|
||||
["_stack_", 32, "cshape-reaction-flags"],
|
||||
["_stack_", 40, "cshape-moving-flags"]
|
||||
],
|
||||
"vif1-handler-debug": [
|
||||
[47, "v1", "vif-bank"],
|
||||
[50, "a0", "vif-bank"]
|
||||
],
|
||||
"vif1-handler": [
|
||||
[1, "v1", "vif-bank"],
|
||||
[4, "a0", "vif-bank"]
|
||||
]
|
||||
}
|
||||
@@ -3066,7 +3066,7 @@
|
||||
|
||||
(deftype vif-bank (structure)
|
||||
((stat uint32 :offset-assert 0)
|
||||
(fbrst uint32 :offset 16)
|
||||
(fbrst vif-fbrst :offset 16)
|
||||
(err vif-err :offset 32)
|
||||
(mark uint32 :offset 48)
|
||||
(cycle uint32 :offset 64)
|
||||
@@ -34427,7 +34427,7 @@ Consists of a header and a list of [[merc-effect]]s."
|
||||
"Incremented everytime a metric is sampled
|
||||
@see [[timer0-handler]]"
|
||||
int)
|
||||
(define-extern timer0-handler (function none))
|
||||
(define-extern timer0-handler (function int int int none))
|
||||
(define-extern sampler-start
|
||||
"Reset the [[timer-bank]] EE registers.
|
||||
- If [[*sampler-mem*]] is undefined, allocate 16.7MB in the debug segment
|
||||
|
||||
@@ -133,9 +133,12 @@
|
||||
// save game textures as .png files to decompiler_out/<game>/textures
|
||||
"save_texture_pngs": false,
|
||||
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio/sfx and decompiler_out/<game>/audio/voice_lines
|
||||
"rip_streamed_audio": false,
|
||||
|
||||
// whether or not to dump out music files to decompiler_out/<game>/audio/music
|
||||
"rip_music": false,
|
||||
|
||||
////////////////////////////
|
||||
// PATCHING OPTIONS
|
||||
////////////////////////////
|
||||
|
||||
@@ -367,7 +367,6 @@
|
||||
[[35, 37], "a3", "qword"],
|
||||
[[35, 37], "a2", "qword"]
|
||||
],
|
||||
"(top-level-login eye-h)": [[[69, 77], "a1", "eye-control"]],
|
||||
"entity-actor-lookup": [["_stack_", 16, "res-tag"]],
|
||||
"entity-actor-count": [["_stack_", 16, "res-tag"]],
|
||||
"(method 0 path-control)": [["_stack_", 16, "res-tag"]],
|
||||
@@ -10020,7 +10019,8 @@
|
||||
[111, "v1", "shadow-dcache"],
|
||||
[116, "a0", "uint32"],
|
||||
[[188, 246], "gp", "shadow-dcache"],
|
||||
[93, "v1", "shadow-dcache"]
|
||||
[93, "v1", "shadow-dcache"],
|
||||
[123, "a1", "gs-rgbaq"]
|
||||
],
|
||||
"(method 40 battle)": [[26, "v0", "enemy-option"]],
|
||||
"(method 9 texture-anim)": [
|
||||
@@ -10157,5 +10157,16 @@
|
||||
],
|
||||
"(method 206 hal)": [[32, "a2", "bot"]],
|
||||
"(method 209 hal)": [[32, "v1", "bot"]],
|
||||
"(method 220 hal)": [[29, "v1", "bot"]]
|
||||
"(method 220 hal)": [[29, "v1", "bot"]],
|
||||
"vif1-handler": [
|
||||
[1, "v1", "vif-bank"],
|
||||
[4, "a0", "vif-bank"]
|
||||
],
|
||||
"vif1-handler-debug": [
|
||||
[2, "a0", "vif-bank"],
|
||||
[9, "a1", "timer-bank"],
|
||||
[48, "v1", "vif-bank"],
|
||||
[51, "a0", "vif-bank"]
|
||||
],
|
||||
"timer0-handler": [[17, "a0", "timer-bank"]]
|
||||
}
|
||||
@@ -4369,6 +4369,12 @@
|
||||
"s3-1": ["points", "(inline-array vector)"]
|
||||
}
|
||||
},
|
||||
"(method 10 menu-slider-option)": {
|
||||
"vars": {
|
||||
"sv-160": ["sv-160", "rgba"],
|
||||
"sv-240": ["sv-240", "rgba"]
|
||||
}
|
||||
},
|
||||
"(method 10 menu-missions-option)": {
|
||||
"args": ["this", "progress", "font-ctx", "arg3", "arg4"],
|
||||
"vars": {
|
||||
|
||||
@@ -3199,7 +3199,7 @@
|
||||
|
||||
(deftype vif-bank (structure)
|
||||
((stat uint32 :offset-assert 0)
|
||||
(fbrst uint32 :offset 16)
|
||||
(fbrst vif-fbrst :offset 16)
|
||||
(err vif-err :offset 32)
|
||||
(mark uint32 :offset 48)
|
||||
(cycle uint32 :offset 64)
|
||||
@@ -41044,7 +41044,7 @@
|
||||
(define-extern *sampler-mem* pointer)
|
||||
(define-extern *sampler-compare* uint)
|
||||
(define-extern *sampler-count* int)
|
||||
(define-extern timer0-handler (function none))
|
||||
(define-extern timer0-handler (function int int int none))
|
||||
(define-extern sampler-start (function none))
|
||||
(define-extern sampler-stop (function none))
|
||||
|
||||
|
||||
@@ -132,7 +132,7 @@
|
||||
// save game textures as .png files to decompiler_out/<game>/textures
|
||||
"save_texture_pngs": false,
|
||||
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio/sfx and decompiler_out/<game>/audio/voice_lines
|
||||
"rip_streamed_audio": false,
|
||||
|
||||
////////////////////////////
|
||||
|
||||
@@ -329,7 +329,6 @@
|
||||
],
|
||||
"joint-mod-blend-local-callback": [[[1, 28], "gp", "joint-mod-blend-local"]],
|
||||
"joint-mod-blend-world-callback": [[[1, 150], "gp", "joint-mod-blend-world"]],
|
||||
"(top-level-login eye-h)": [[77, "a3", "eye-control"]],
|
||||
"entity-actor-lookup": [["_stack_", 16, "res-tag"]],
|
||||
"entity-actor-count": [["_stack_", 16, "res-tag"]],
|
||||
"(method 3 collide-query)": [
|
||||
@@ -3708,6 +3707,7 @@
|
||||
[101, "s1", "process-focusable"],
|
||||
[113, "s1", "process-focusable"]
|
||||
],
|
||||
"(method 21 gravity-ring)": [[160, "s4", "rgba"]],
|
||||
"process-drawable-shock-effect-bullseye": [[85, "a0", "lightning-tracker"]],
|
||||
"(method 14 level-group)": [
|
||||
[62, "a0", "entity-actor"],
|
||||
@@ -4425,14 +4425,18 @@
|
||||
[5, "a0", "region-prim-area"]
|
||||
],
|
||||
"(method 9 region)": [
|
||||
[[55, 60], "a0", "drawable-region-prim"],
|
||||
[46, "a0", "drawable-inline-array-region-prim"],
|
||||
[77, "a0", "drawable-inline-array-region-prim"],
|
||||
[58, "v1", "region-prim-area"],
|
||||
[4, "a0", "region-prim-area"],
|
||||
[50, "v1", "drawable-region-prim"]
|
||||
[4, "a0", "region-prim-area"]
|
||||
],
|
||||
"(method 17 drawable-tree-region-prim)": [
|
||||
[[23, 28], "a0", "drawable-region-prim"],
|
||||
[4, "a0", "region-prim-area"]
|
||||
[23, "a0", "drawable-region-prim"],
|
||||
[27, "a0", "drawable-region-prim"],
|
||||
[21, "a0", "drawable-inline-array-region-prim"],
|
||||
[42, "a0", "drawable-inline-array-region-prim"],
|
||||
[4, "a0", "region-prim-area"],
|
||||
[26, "v1", "region-prim-area"]
|
||||
],
|
||||
"command-get-trans": [
|
||||
[40, "v1", "process-drawable"],
|
||||
@@ -6002,6 +6006,7 @@
|
||||
"(code opening sew-fence-gate)": [[18, "v1", "art-joint-anim"]],
|
||||
"(code open sew-fence-gate)": [[10, "v1", "art-joint-anim"]],
|
||||
"(code active sew-move-turret)": [[109, "v1", "art-joint-anim"]],
|
||||
"(method 161 sew-laser-turret)": [[28, "s0", "rgba"]],
|
||||
"(method 162 sew-laser-turret)": [
|
||||
[41, "v1", "process-focusable"],
|
||||
[45, "v1", "process-focusable"],
|
||||
@@ -9769,10 +9774,6 @@
|
||||
[62, "a0", "vector"],
|
||||
[51, "a0", "vector"]
|
||||
],
|
||||
"(method 20 rope-system)": [
|
||||
[11, "a1", "vector"],
|
||||
[16, "a1", "vector"]
|
||||
],
|
||||
"(code preparing-for-launch desert-rescue-transport)": [
|
||||
[10, "v1", "art-joint-anim"]
|
||||
],
|
||||
@@ -11405,7 +11406,8 @@
|
||||
[114, "v1", "shadow-dcache"],
|
||||
[119, "a0", "uint32"],
|
||||
[[191, 249], "gp", "shadow-dcache"],
|
||||
[96, "v1", "shadow-dcache"]
|
||||
[96, "v1", "shadow-dcache"],
|
||||
[126, "a1", "gs-rgbaq"]
|
||||
],
|
||||
"real-fog-texture-anim-func": [[[6, 160], "s2", "(pointer uint32)"]],
|
||||
"(method 22 bigmap)": [
|
||||
@@ -11891,5 +11893,16 @@
|
||||
[24, "a0", "timer-bank"],
|
||||
[1, "v1", "timer-bank"]
|
||||
],
|
||||
"(method 11 blow-tower-path-cursor)": [["_stack_", 52, "float"]]
|
||||
"(method 11 blow-tower-path-cursor)": [["_stack_", 52, "float"]],
|
||||
"vif1-handler-debug": [
|
||||
[2, "a0", "vif-bank"],
|
||||
[9, "a1", "timer-bank"],
|
||||
[48, "v1", "vif-bank"],
|
||||
[51, "a0", "vif-bank"]
|
||||
],
|
||||
"vif1-handler": [
|
||||
[1, "v1", "vif-bank"],
|
||||
[4, "a0", "vif-bank"]
|
||||
],
|
||||
"timer0-handler": [[17, "a0", "timer-bank"]]
|
||||
}
|
||||
@@ -2187,5 +2187,10 @@
|
||||
"s3-0": "player-scores",
|
||||
"s5-0": "player-rank-counts"
|
||||
}
|
||||
},
|
||||
"(method 21 gravity-ring)": {
|
||||
"vars": {
|
||||
"s4-1": ["s4-1", "rgba"]
|
||||
}
|
||||
}
|
||||
}
|
||||
+6463
-5768
File diff suppressed because it is too large.
Load diff
@@ -24,7 +24,7 @@
|
||||
// this generates a huge amount of output if you run it on the entire game.
|
||||
"disassemble_data": false,
|
||||
// unpack textures to assets folder
|
||||
"process_tpages": false,
|
||||
"process_tpages": true,
|
||||
// write goal imports for tpages and textures
|
||||
"write_tpage_imports": false,
|
||||
// unpack game text to assets folder
|
||||
@@ -38,12 +38,10 @@
|
||||
// write out a json file containing the art info mapping, run this with all objects allowed
|
||||
"dump_art_group_info": false,
|
||||
// write out a json file containing the joint node mapping, run this with all objects allowed
|
||||
// TODO - not done yet
|
||||
"dump_joint_geo_info": false,
|
||||
// write out a json file containing tpage and texture mappings, run with all objects allowed
|
||||
"dump_tex_info": false,
|
||||
// write out a json file containing the part group table, run with all objects allowed
|
||||
// TODO - not done yet
|
||||
"dump_part_group_table": false,
|
||||
// set to false to skip adding .STR files to the decompiler database
|
||||
"read_spools": false,
|
||||
@@ -110,7 +108,7 @@
|
||||
"rip_collision": false,
|
||||
// save game textures as .png files to decompiler_out/<game>/textures
|
||||
"save_texture_pngs": false,
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio
|
||||
// whether or not to dump out streamed audio files to decompiler_out/<game>/audio/sfx and decompiler_out/<game>/audio/voice_lines
|
||||
"rip_streamed_audio": false,
|
||||
////////////////////////////
|
||||
// PATCHING OPTIONS
|
||||
|
||||
@@ -1,5 +1,40 @@
|
||||
{
|
||||
"profile": [[3, "(function profile-segment-array profile-collapse none)"]],
|
||||
"level-info": [
|
||||
[0, "(function int)"],
|
||||
[1, "(function int)"],
|
||||
[2, "(function int)"],
|
||||
[3, "(function int)"],
|
||||
[4, "(function int)"]
|
||||
],
|
||||
"vehicle-debris": [[15, "(function collide-shape-prim none)"]],
|
||||
"title-obs": [
|
||||
[7, "(function process-tree symbol)"],
|
||||
[30, "(function external-art-buffer none)"]
|
||||
],
|
||||
"gsound": [
|
||||
[3, "(function sound-id)"],
|
||||
[5, "(function none)"]
|
||||
],
|
||||
"pov-camera": [
|
||||
[
|
||||
7,
|
||||
"(function process int symbol event-message-block object :behavior pov-camera)"
|
||||
]
|
||||
],
|
||||
"debris": [[4, "(function pair)"]],
|
||||
"nav-control": [
|
||||
[0, "(function object nav-control none)"],
|
||||
[1, "(function object nav-control none)"],
|
||||
[2, "(function object nav-control none)"],
|
||||
[3, "(function object nav-control none)"],
|
||||
[4, "(function object nav-control none)"],
|
||||
[5, "(function object nav-control none)"],
|
||||
[6, "(function object nav-control none)"],
|
||||
[7, "(function object nav-control none)"],
|
||||
[8, "(function object nav-control none)"],
|
||||
[9, "(function object nav-control none)"]
|
||||
],
|
||||
"default-menu": [
|
||||
[3, "(function object)"],
|
||||
[4, "(function object)"],
|
||||
@@ -11,12 +46,13 @@
|
||||
[10, "(function object)"],
|
||||
[11, "(function object)"],
|
||||
[12, "(function object)"],
|
||||
[13, "(function object)"],
|
||||
[13, "(function int debug-menu-msg object)"],
|
||||
[14, "(function object)"],
|
||||
[15, "(function object)"],
|
||||
[16, "(function object)"],
|
||||
[17, "(function object)"],
|
||||
[18, "(function int debug-menu-msg float object)"],
|
||||
[19, "(function none)"],
|
||||
[20, "(function object)"],
|
||||
[21, "(function object)"],
|
||||
[22, "(function object)"],
|
||||
@@ -37,7 +73,7 @@
|
||||
[37, "(function int debug-menu-msg float object)"],
|
||||
[38, "(function int debug-menu-msg float object)"],
|
||||
[39, "(function int debug-menu-msg float object)"],
|
||||
[40, "(function object)"],
|
||||
[40, "(function int debug-menu-msg float object)"],
|
||||
[41, "(function object)"],
|
||||
[42, "(function int debug-menu-msg float object)"],
|
||||
[43, "(function int debug-menu-msg float object)"],
|
||||
@@ -204,17 +240,17 @@
|
||||
[204, "(function int debug-menu-msg float object)"],
|
||||
[205, "(function int debug-menu-msg float object)"],
|
||||
[206, "(function int debug-menu-msg float object)"],
|
||||
[207, "(function int debug-menu-msg float object)"],
|
||||
[207, "(function symbol debug-menu-msg float float object)"],
|
||||
[208, "(function symbol debug-menu-msg float float object)"],
|
||||
[209, "(function int debug-menu-msg float object)"],
|
||||
[210, "(function symbol debug-menu-msg float object)"],
|
||||
[210, "(function symbol debug-menu-msg float int object)"],
|
||||
[211, "(function symbol debug-menu-msg float float object)"],
|
||||
[212, "(function int debug-menu-msg float object)"],
|
||||
[213, "(function int debug-menu-msg float object)"],
|
||||
[214, "(function int debug-menu-msg float object)"],
|
||||
[212, "(function symbol debug-menu-msg float float object)"],
|
||||
[213, "(function symbol debug-menu-msg float float object)"],
|
||||
[214, "(function symbol debug-menu-msg float float object)"],
|
||||
[215, "(function symbol debug-menu-msg float float object)"],
|
||||
[216, "(function symbol debug-menu-msg float float object)"],
|
||||
[217, "(function int debug-menu-msg float object)"],
|
||||
[217, "(function symbol debug-menu-msg float int object)"],
|
||||
[218, "(function symbol debug-menu-msg float float object)"],
|
||||
[219, "(function symbol debug-menu-msg float float object)"],
|
||||
[220, "(function symbol debug-menu-msg float float object)"],
|
||||
@@ -237,15 +273,211 @@
|
||||
[237, "(function symbol debug-menu-msg float float object)"],
|
||||
[239, "(function symbol debug-menu-msg object)"],
|
||||
[240, "(function int debug-menu-msg float object)"],
|
||||
[241, "(function int debug-menu-msg float object)"],
|
||||
[242, "(function int debug-menu-msg float object)"],
|
||||
[243, "(function int debug-menu-msg float object)"],
|
||||
[241, "(function debug-menu debug-menu object)"],
|
||||
[242, "(function debug-menu debug-menu object)"],
|
||||
[243, "(function debug-menu debug-menu object)"],
|
||||
[244, "(function debug-menu debug-menu symbol)"],
|
||||
[245, "(function debug-menu debug-menu symbol)"],
|
||||
[246, "(function debug-menu debug-menu symbol)"],
|
||||
[247, "(function debug-menu debug-menu symbol)"]
|
||||
],
|
||||
"main": [
|
||||
[17, "(function int none)"],
|
||||
[15, "(function none)"],
|
||||
[14, "(function none)"],
|
||||
[13, "(function none)"],
|
||||
[5, "(function process-tree symbol)"],
|
||||
[3, "(function symbol :behavior process)"]
|
||||
],
|
||||
"memory-usage": [
|
||||
[2, "(function process-drawable symbol)"],
|
||||
[3, "(function basic symbol)"]
|
||||
],
|
||||
"intro-scenes2": [
|
||||
[0, "(function none :behavior scene-player)"],
|
||||
[1, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"intro-scenes": [
|
||||
[0, "(function none :behavior scene-player)"],
|
||||
[1, "(function none :behavior scene-player)"],
|
||||
[2, "(function none :behavior scene-player)"],
|
||||
[3, "(function none :behavior scene-player)"],
|
||||
[4, "(function none :behavior scene-player)"],
|
||||
[5, "(function none :behavior scene-player)"],
|
||||
[6, "(function none :behavior scene-player)"],
|
||||
[7, "(function none :behavior scene-player)"],
|
||||
[8, "(function none :behavior scene-player)"],
|
||||
[9, "(function none :behavior scene-player)"],
|
||||
[10, "(function none :behavior scene-player)"],
|
||||
[11, "(function none :behavior scene-player)"],
|
||||
[12, "(function none :behavior scene-player)"],
|
||||
[13, "(function none :behavior scene-player)"],
|
||||
[14, "(function none :behavior scene-player)"],
|
||||
[15, "(function none :behavior scene-player)"],
|
||||
[16, "(function none :behavior scene-player)"],
|
||||
[17, "(function none :behavior scene-player)"],
|
||||
[18, "(function none :behavior scene-player)"],
|
||||
[19, "(function none :behavior scene-player)"],
|
||||
[20, "(function none :behavior scene-player)"],
|
||||
[21, "(function none :behavior scene-player)"],
|
||||
[22, "(function none :behavior scene-player)"],
|
||||
[23, "(function none :behavior scene-player)"],
|
||||
[24, "(function none :behavior scene-player)"],
|
||||
[25, "(function none :behavior scene-player)"],
|
||||
[26, "(function none :behavior scene-player)"],
|
||||
[27, "(function none :behavior scene-player)"],
|
||||
[28, "(function none :behavior scene-player)"],
|
||||
[29, "(function none :behavior scene-player)"],
|
||||
[30, "(function none :behavior scene-player)"],
|
||||
[31, "(function none :behavior scene-player)"],
|
||||
[32, "(function none :behavior scene-player)"],
|
||||
[33, "(function none :behavior scene-player)"],
|
||||
[34, "(function none :behavior scene-player)"],
|
||||
[35, "(function none :behavior scene-player)"],
|
||||
[36, "(function none :behavior scene-player)"],
|
||||
[37, "(function none :behavior scene-player)"],
|
||||
[38, "(function none :behavior scene-player)"],
|
||||
[39, "(function none :behavior scene-player)"],
|
||||
[40, "(function none :behavior scene-player)"],
|
||||
[41, "(function none :behavior scene-player)"],
|
||||
[42, "(function none :behavior scene-player)"],
|
||||
[43, "(function none :behavior scene-player)"],
|
||||
[44, "(function none :behavior scene-player)"],
|
||||
[45, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"intro-scenes3": [
|
||||
[0, "(function none :behavior scene-player)"],
|
||||
[1, "(function none :behavior scene-player)"],
|
||||
[2, "(function none :behavior scene-player)"],
|
||||
[3, "(function none :behavior scene-player)"],
|
||||
[4, "(function none :behavior scene-player)"],
|
||||
[5, "(function none :behavior scene-player)"],
|
||||
[6, "(function none :behavior scene-player)"],
|
||||
[7, "(function none :behavior scene-player)"],
|
||||
[8, "(function none :behavior scene-player)"],
|
||||
[9, "(function none :behavior scene-player)"],
|
||||
[10, "(function none :behavior scene-player)"],
|
||||
[11, "(function none :behavior scene-player)"],
|
||||
[12, "(function none :behavior scene-player)"],
|
||||
[13, "(function none :behavior scene-player)"],
|
||||
[14, "(function none :behavior scene-player)"],
|
||||
[15, "(function none :behavior scene-player)"],
|
||||
[16, "(function none :behavior scene-player)"],
|
||||
[17, "(function none :behavior scene-player)"],
|
||||
[18, "(function none :behavior scene-player)"],
|
||||
[19, "(function none :behavior scene-player)"],
|
||||
[20, "(function none :behavior scene-player)"],
|
||||
[21, "(function none :behavior scene-player)"],
|
||||
[22, "(function none :behavior scene-player)"],
|
||||
[23, "(function none :behavior scene-player)"],
|
||||
[24, "(function none :behavior scene-player)"],
|
||||
[25, "(function none :behavior scene-player)"],
|
||||
[26, "(function none :behavior scene-player)"],
|
||||
[27, "(function none :behavior scene-player)"],
|
||||
[28, "(function none :behavior scene-player)"],
|
||||
[29, "(function none :behavior scene-player)"],
|
||||
[30, "(function none :behavior scene-player)"],
|
||||
[31, "(function none :behavior scene-player)"],
|
||||
[32, "(function none :behavior scene-player)"],
|
||||
[33, "(function none :behavior scene-player)"],
|
||||
[34, "(function none :behavior scene-player)"],
|
||||
[35, "(function none :behavior scene-player)"],
|
||||
[36, "(function none :behavior scene-player)"],
|
||||
[37, "(function none :behavior scene-player)"],
|
||||
[38, "(function none :behavior scene-player)"],
|
||||
[39, "(function none :behavior scene-player)"],
|
||||
[40, "(function none :behavior scene-player)"],
|
||||
[41, "(function none :behavior scene-player)"],
|
||||
[42, "(function none :behavior scene-player)"],
|
||||
[43, "(function none :behavior scene-player)"],
|
||||
[44, "(function none :behavior scene-player)"],
|
||||
[45, "(function none :behavior scene-player)"],
|
||||
[46, "(function none :behavior scene-player)"],
|
||||
[47, "(function none :behavior scene-player)"],
|
||||
[48, "(function none :behavior scene-player)"],
|
||||
[49, "(function none :behavior scene-player)"],
|
||||
[50, "(function none :behavior scene-player)"],
|
||||
[51, "(function none :behavior scene-player)"],
|
||||
[52, "(function none :behavior scene-player)"],
|
||||
[53, "(function none :behavior scene-player)"],
|
||||
[54, "(function none :behavior scene-player)"],
|
||||
[55, "(function none :behavior scene-player)"],
|
||||
[56, "(function none :behavior scene-player)"],
|
||||
[57, "(function none :behavior scene-player)"],
|
||||
[58, "(function none :behavior scene-player)"],
|
||||
[59, "(function none :behavior scene-player)"],
|
||||
[60, "(function none :behavior scene-player)"],
|
||||
[61, "(function none :behavior scene-player)"],
|
||||
[62, "(function none :behavior scene-player)"],
|
||||
[63, "(function none :behavior scene-player)"],
|
||||
[64, "(function none :behavior scene-player)"],
|
||||
[65, "(function none :behavior scene-player)"],
|
||||
[66, "(function none :behavior scene-player)"],
|
||||
[67, "(function none :behavior scene-player)"],
|
||||
[68, "(function none :behavior scene-player)"],
|
||||
[69, "(function none :behavior scene-player)"],
|
||||
[70, "(function none :behavior scene-player)"],
|
||||
[71, "(function none :behavior scene-player)"],
|
||||
[72, "(function none :behavior scene-player)"],
|
||||
[73, "(function none :behavior scene-player)"],
|
||||
[74, "(function none :behavior scene-player)"],
|
||||
[75, "(function none :behavior scene-player)"],
|
||||
[76, "(function none :behavior scene-player)"],
|
||||
[77, "(function none :behavior scene-player)"],
|
||||
[78, "(function none :behavior scene-player)"],
|
||||
[79, "(function none :behavior scene-player)"],
|
||||
[80, "(function none :behavior scene-player)"],
|
||||
[81, "(function none :behavior scene-player)"],
|
||||
[82, "(function none :behavior scene-player)"],
|
||||
[83, "(function none :behavior scene-player)"],
|
||||
[84, "(function none :behavior scene-player)"],
|
||||
[85, "(function none :behavior scene-player)"],
|
||||
[86, "(function none :behavior scene-player)"],
|
||||
[87, "(function none :behavior scene-player)"],
|
||||
[88, "(function none :behavior scene-player)"],
|
||||
[89, "(function none :behavior scene-player)"],
|
||||
[90, "(function none :behavior scene-player)"],
|
||||
[91, "(function none :behavior scene-player)"],
|
||||
[92, "(function none :behavior scene-player)"],
|
||||
[93, "(function none :behavior scene-player)"],
|
||||
[94, "(function none :behavior scene-player)"],
|
||||
[95, "(function none :behavior scene-player)"],
|
||||
[96, "(function none :behavior scene-player)"],
|
||||
[97, "(function none :behavior scene-player)"],
|
||||
[98, "(function none :behavior scene-player)"],
|
||||
[99, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"editable-player": [
|
||||
[0, "(function object)"],
|
||||
[3, "(function object int float object)"],
|
||||
[4, "(function object int symbol)"],
|
||||
[32, "(function editable editable-region symbol)"],
|
||||
[33, "(function editable editable-region symbol)"],
|
||||
[36, "(function editable symbol)"]
|
||||
],
|
||||
"joint-mod": [[21, "(function cspace transformq none)"]],
|
||||
"merc-death": [[3, "(function time-frame :behavior process-drawable)"]],
|
||||
"trajectory": [[15, "(function trajectory none)"]]
|
||||
"editable": [[101, "(function object editable-filter)"]],
|
||||
"wvehicle-wheel": [[18, "(function collide-shape-prim none)"]],
|
||||
"trajectory": [[15, "(function trajectory none)"]],
|
||||
"settings": [
|
||||
[13, "(function engine-pers connection-pers object object symbol)"],
|
||||
[6, "(function engine-pers connection-pers object object symbol)"]
|
||||
],
|
||||
"game-info": [
|
||||
[6, "(function string symbol :behavior process)"],
|
||||
[
|
||||
14,
|
||||
"(function symbol symbol continue-point game-save object :behavior process)"
|
||||
]
|
||||
],
|
||||
"entity": [
|
||||
[11, "(function process object)"],
|
||||
[12, "(function process object)"],
|
||||
[18, "(function process object)"],
|
||||
[64, "(function process-drawable object)"],
|
||||
[68, "(function process-drawable handle)"]
|
||||
],
|
||||
"target-death": [[1, "(function continue-point target)"]],
|
||||
"credits-obs": [[7, "(function process symbol)"]]
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
{"adv-event-panel-ag":[[4,"adv-event-panel-exita-ja"],[3,"adv-event-panel-entera-ja"],[2,"adv-event-panel-idle-ja"],[1,"adv-event-panel-lod0-mg"],[0,"adv-event-panel-lod0-jg"]],"antenna-all-ag":[[2,"antenna-all-idle-ja"],[1,"antenna-all-lod0-mg"],[0,"antenna-all-lod0-jg"]],"ash-hr-cred-ag":[[3,"ash-hr-cred-turntable-ja"],[2,"ash-hr-cred-shadow-mg"],[1,"ash-hr-cred-lod0-mg"],[0,"ash-hr-cred-lod0-jg"]],"atoll-dish-ag":[[2,"atoll-dish-idle-ja"],[1,"atoll-dish-lod0-mg"],[0,"atoll-dish-lod0-jg"]],"atoll-rotor-ag":[[2,"atoll-rotor-idle-ja"],[1,"atoll-rotor-lod0-mg"],[0,"atoll-rotor-lod0-jg"]],"body-parts-tab-ag":[[4,"body-parts-tab-exita-ja"],[3,"body-parts-tab-entera-ja"],[2,"body-parts-tab-idle-ja"],[1,"body-parts-tab-lod0-mg"],[0,"body-parts-tab-lod0-jg"]],"bottom-bar-ag":[[6,"bottom-bar-exitb-ja"],[5,"bottom-bar-exita-ja"],[4,"bottom-bar-enterb-ja"],[3,"bottom-bar-entera-ja"],[2,"bottom-bar-idle-ja"],[1,"bottom-bar-lod0-mg"],[0,"bottom-bar-lod0-jg"]],"brd-pool-water-ag":[[2,"brd-pool-water-idle-ja"],[1,"brd-pool-water-lod0-mg"],[0,"brd-pool-water-lod0-jg"]],"car-color-tab-ag":[[4,"car-color-tab-exita-ja"],[3,"car-color-tab-entera-ja"],[2,"car-color-tab-idle-ja"],[1,"car-color-tab-lod0-mg"],[0,"car-color-tab-lod0-jg"]],"car-interior-ag":[[3,"car-interior-idle-ja"],[2,"car-interior-lod1-mg"],[1,"car-interior-lod0-mg"],[0,"car-interior-lod0-jg"]],"car-vert-tab-ag":[[4,"car-vert-tab-exita-ja"],[3,"car-vert-tab-entera-ja"],[2,"car-vert-tab-idle-ja"],[1,"car-vert-tab-lod0-mg"],[0,"car-vert-tab-lod0-jg"]],"cash-bar-ag":[[4,"cash-bar-exita-ja"],[3,"cash-bar-entera-ja"],[2,"cash-bar-idle-ja"],[1,"cash-bar-lod0-mg"],[0,"cash-bar-lod0-jg"]],"character-select-ag":[[4,"character-select-exitrb-ja"],[3,"character-select-entera-ja"],[2,"character-select-idle-ja"],[1,"character-select-lod0-mg"],[0,"character-select-lod0-jg"]],"cliffs-fence-debris-ag":[[7,"cliffs-fence-debris-railc-lod0-mg"],[6,"cliffs-fence-debris-railc-lod0-jg"],[5,"cliffs-fence-debris-railb-lod0-mg"],[4,"cliffs-fence-debris-railb-lod0-jg"],[3,"cliffs-fence-debris-raila-lod0-mg"],[2,"cliffs-fence-debris-raila-lod0-jg"],[1,"cliffs-fence-debris-post-lod0-mg"],[0,"cliffs-fence-debris-post-lod0-jg"]],"cliffs-wood-fence-a-ag":[[2,"cliffs-wood-fence-a-idle-ja"],[1,"cliffs-wood-fence-a-lod0-mg"],[0,"cliffs-wood-fence-a-lod0-jg"]],"cliffs-wood-fence-b-ag":[[2,"cliffs-wood-fence-b-idle-ja"],[1,"cliffs-wood-fence-b-lod0-mg"],[0,"cliffs-wood-fence-b-lod0-jg"]],"cliffs-wood-fence-c-ag":[[2,"cliffs-wood-fence-c-idle-ja"],[1,"cliffs-wood-fence-c-lod0-mg"],[0,"cliffs-wood-fence-c-lod0-jg"]],"cliffs-wood-fence-d-ag":[[2,"cliffs-wood-fence-d-idle-ja"],[1,"cliffs-wood-fence-d-lod0-mg"],[0,"cliffs-wood-fence-d-lod0-jg"]],"coli-atlas-base-ag":[[14,"coli-atlas-base-b-idle-ja"],[13,"coli-atlas-base-b-lod2-mg"],[12,"coli-atlas-base-b-lod1-mg"],[11,"coli-atlas-base-b-lod0-mg"],[10,"coli-atlas-base-b-lod0-jg"],[9,"coli-atlas-base-a-idle-ja"],[8,"coli-atlas-base-a-lod2-mg"],[7,"coli-atlas-base-a-lod1-mg"],[6,"coli-atlas-base-a-lod0-mg"],[5,"coli-atlas-base-a-lod0-jg"],[4,"coli-atlas-base-idle-ja"],[3,"coli-atlas-base-lod2-mg"],[2,"coli-atlas-base-lod1-mg"],[1,"coli-atlas-base-lod0-mg"],[0,"coli-atlas-base-lod0-jg"]],"coli-atlas-break-ag":[[8,"coli-atlas-break-b-idle-ja"],[7,"coli-atlas-break-b-lod0-mg"],[6,"coli-atlas-break-b-lod0-jg"],[5,"coli-atlas-break-a-idle-ja"],[4,"coli-atlas-break-a-lod0-mg"],[3,"coli-atlas-break-a-lod0-jg"],[2,"coli-atlas-break-idle-ja"],[1,"coli-atlas-break-lod0-mg"],[0,"coli-atlas-break-lod0-jg"]],"coli-atlas-globe-ag":[[4,"coli-atlas-globe-idle-ja"],[3,"coli-atlas-globe-lod2-mg"],[2,"coli-atlas-globe-lod1-mg"],[1,"coli-atlas-globe-lod0-mg"],[0,"coli-atlas-globe-lod0-jg"]],"coli-atlas-pillar-ag":[[4,"coli-atlas-pillar-idle-ja"],[3,"coli-atlas-pillar-lod2-mg"],[2,"coli-atlas-pillar-lod1-mg"],[1,"coli-atlas-pillar-lod0-mg"],[0,"coli-atlas-pillar-lod0-jg"]],"coli-atlas-statue-ag":[[4,"coli-atlas-statue-idle-ja"],[3,"coli-atlas-statue-lod2-mg"],[2,"coli-atlas-statue-lod1-mg"],[1,"coli-atlas-statue-lod0-mg"],[0,"coli-atlas-statue-lod0-jg"]],"coli-ball-collision-ag":[[2,"coli-ball-collision-idle-ja"],[1,"coli-ball-collision-lod0-mg"],[0,"coli-ball-collision-lod0-jg"]],"coli-bowl-a-ag":[[4,"coli-bowl-a-idle-ja"],[3,"coli-bowl-a-lod2-mg"],[2,"coli-bowl-a-lod1-mg"],[1,"coli-bowl-a-lod0-mg"],[0,"coli-bowl-a-lod0-jg"]],"coli-bowl-a-debris-ag":[[5,"coli-bowl-a-debris-c-lod0-mg"],[4,"coli-bowl-a-debris-c-lod0-jg"],[3,"coli-bowl-a-debris-b-lod0-mg"],[2,"coli-bowl-a-debris-b-lod0-jg"],[1,"coli-bowl-a-debris-a-lod0-mg"],[0,"coli-bowl-a-debris-a-lod0-jg"]],"coli-bowl-hanger-ag":[[4,"coli-bowl-hanger-idle-ja"],[3,"coli-bowl-hanger-lod2-mg"],[2,"coli-bowl-hanger-lod1-mg"],[1,"coli-bowl-hanger-lod0-mg"],[0,"coli-bowl-hanger-lod0-jg"]],"coli-bowl-hanger-debris-ag":[[5,"coli-bowl-hanger-debris-c-lod0-mg"],[4,"coli-bowl-hanger-debris-c-lod0-jg"],[3,"coli-bowl-hanger-debris-b-lod0-mg"],[2,"coli-bowl-hanger-debris-b-lod0-jg"],[1,"coli-bowl-hanger-debris-a-lod0-mg"],[0,"coli-bowl-Line truncated
|
||||
{"adv-event-panel-ag":[[0,"adv-event-panel-lod0-jg"],[1,"adv-event-panel-lod0-mg"],[2,"adv-event-panel-idle-ja"],[3,"adv-event-panel-entera-ja"],[4,"adv-event-panel-exita-ja"]],"antenna-all-ag":[[0,"antenna-all-lod0-jg"],[1,"antenna-all-lod0-mg"],[2,"antenna-all-idle-ja"]],"ash-hr-cred-ag":[[0,"ash-hr-cred-lod0-jg"],[1,"ash-hr-cred-lod0-mg"],[2,"ash-hr-cred-shadow-mg"],[3,"ash-hr-cred-turntable-ja"]],"atoll-dish-ag":[[0,"atoll-dish-lod0-jg"],[1,"atoll-dish-lod0-mg"],[2,"atoll-dish-idle-ja"]],"atoll-rotor-ag":[[0,"atoll-rotor-lod0-jg"],[1,"atoll-rotor-lod0-mg"],[2,"atoll-rotor-idle-ja"]],"body-parts-tab-ag":[[0,"body-parts-tab-lod0-jg"],[1,"body-parts-tab-lod0-mg"],[2,"body-parts-tab-idle-ja"],[3,"body-parts-tab-entera-ja"],[4,"body-parts-tab-exita-ja"]],"bottom-bar-ag":[[0,"bottom-bar-lod0-jg"],[1,"bottom-bar-lod0-mg"],[2,"bottom-bar-idle-ja"],[3,"bottom-bar-entera-ja"],[4,"bottom-bar-enterb-ja"],[5,"bottom-bar-exita-ja"],[6,"bottom-bar-exitb-ja"]],"brd-pool-water-ag":[[0,"brd-pool-water-lod0-jg"],[1,"brd-pool-water-lod0-mg"],[2,"brd-pool-water-idle-ja"]],"car-color-tab-ag":[[0,"car-color-tab-lod0-jg"],[1,"car-color-tab-lod0-mg"],[2,"car-color-tab-idle-ja"],[3,"car-color-tab-entera-ja"],[4,"car-color-tab-exita-ja"]],"car-interior-ag":[[0,"car-interior-lod0-jg"],[1,"car-interior-lod0-mg"],[2,"car-interior-lod1-mg"],[3,"car-interior-idle-ja"]],"car-vert-tab-ag":[[0,"car-vert-tab-lod0-jg"],[1,"car-vert-tab-lod0-mg"],[2,"car-vert-tab-idle-ja"],[3,"car-vert-tab-entera-ja"],[4,"car-vert-tab-exita-ja"]],"cash-bar-ag":[[0,"cash-bar-lod0-jg"],[1,"cash-bar-lod0-mg"],[2,"cash-bar-idle-ja"],[3,"cash-bar-entera-ja"],[4,"cash-bar-exita-ja"]],"character-select-ag":[[0,"character-select-lod0-jg"],[1,"character-select-lod0-mg"],[2,"character-select-idle-ja"],[3,"character-select-entera-ja"],[4,"character-select-exitrb-ja"]],"cliffs-fence-debris-ag":[[0,"cliffs-fence-debris-post-lod0-jg"],[1,"cliffs-fence-debris-post-lod0-mg"],[2,"cliffs-fence-debris-raila-lod0-jg"],[3,"cliffs-fence-debris-raila-lod0-mg"],[4,"cliffs-fence-debris-railb-lod0-jg"],[5,"cliffs-fence-debris-railb-lod0-mg"],[6,"cliffs-fence-debris-railc-lod0-jg"],[7,"cliffs-fence-debris-railc-lod0-mg"]],"cliffs-wood-fence-a-ag":[[0,"cliffs-wood-fence-a-lod0-jg"],[1,"cliffs-wood-fence-a-lod0-mg"],[2,"cliffs-wood-fence-a-idle-ja"]],"cliffs-wood-fence-b-ag":[[0,"cliffs-wood-fence-b-lod0-jg"],[1,"cliffs-wood-fence-b-lod0-mg"],[2,"cliffs-wood-fence-b-idle-ja"]],"cliffs-wood-fence-c-ag":[[0,"cliffs-wood-fence-c-lod0-jg"],[1,"cliffs-wood-fence-c-lod0-mg"],[2,"cliffs-wood-fence-c-idle-ja"]],"cliffs-wood-fence-d-ag":[[0,"cliffs-wood-fence-d-lod0-jg"],[1,"cliffs-wood-fence-d-lod0-mg"],[2,"cliffs-wood-fence-d-idle-ja"]],"coli-atlas-base-ag":[[0,"coli-atlas-base-lod0-jg"],[1,"coli-atlas-base-lod0-mg"],[2,"coli-atlas-base-lod1-mg"],[3,"coli-atlas-base-lod2-mg"],[4,"coli-atlas-base-idle-ja"],[5,"coli-atlas-base-a-lod0-jg"],[6,"coli-atlas-base-a-lod0-mg"],[7,"coli-atlas-base-a-lod1-mg"],[8,"coli-atlas-base-a-lod2-mg"],[9,"coli-atlas-base-a-idle-ja"],[10,"coli-atlas-base-b-lod0-jg"],[11,"coli-atlas-base-b-lod0-mg"],[12,"coli-atlas-base-b-lod1-mg"],[13,"coli-atlas-base-b-lod2-mg"],[14,"coli-atlas-base-b-idle-ja"]],"coli-atlas-break-ag":[[0,"coli-atlas-break-lod0-jg"],[1,"coli-atlas-break-lod0-mg"],[2,"coli-atlas-break-idle-ja"],[3,"coli-atlas-break-a-lod0-jg"],[4,"coli-atlas-break-a-lod0-mg"],[5,"coli-atlas-break-a-idle-ja"],[6,"coli-atlas-break-b-lod0-jg"],[7,"coli-atlas-break-b-lod0-mg"],[8,"coli-atlas-break-b-idle-ja"]],"coli-atlas-globe-ag":[[0,"coli-atlas-globe-lod0-jg"],[1,"coli-atlas-globe-lod0-mg"],[2,"coli-atlas-globe-lod1-mg"],[3,"coli-atlas-globe-lod2-mg"],[4,"coli-atlas-globe-idle-ja"]],"coli-atlas-pillar-ag":[[0,"coli-atlas-pillar-lod0-jg"],[1,"coli-atlas-pillar-lod0-mg"],[2,"coli-atlas-pillar-lod1-mg"],[3,"coli-atlas-pillar-lod2-mg"],[4,"coli-atlas-pillar-idle-ja"]],"coli-atlas-statue-ag":[[0,"coli-atlas-statue-lod0-jg"],[1,"coli-atlas-statue-lod0-mg"],[2,"coli-atlas-statue-lod1-mg"],[3,"coli-atlas-statue-lod2-mg"],[4,"coli-atlas-statue-idle-ja"]],"coli-ball-collision-ag":[[0,"coli-ball-collision-lod0-jg"],[1,"coli-ball-collision-lod0-mg"],[2,"coli-ball-collision-idle-ja"]],"coli-bowl-a-ag":[[0,"coli-bowl-a-lod0-jg"],[1,"coli-bowl-a-lod0-mg"],[2,"coli-bowl-a-lod1-mg"],[3,"coli-bowl-a-lod2-mg"],[4,"coli-bowl-a-idle-ja"]],"coli-bowl-a-debris-ag":[[0,"coli-bowl-a-debris-a-lod0-jg"],[1,"coli-bowl-a-debris-a-lod0-mg"],[2,"coli-bowl-a-debris-b-lod0-jg"],[3,"coli-bowl-a-debris-b-lod0-mg"],[4,"coli-bowl-a-debris-c-lod0-jg"],[5,"coli-bowl-a-debris-c-lod0-mg"]],"coli-bowl-hanger-ag":[[0,"coli-bowl-hanger-lod0-jg"],[1,"coli-bowl-hanger-lod0-mg"],[2,"coli-bowl-hanger-lod1-mg"],[3,"coli-bowl-hanger-lod2-mg"],[4,"coli-bowl-hanger-idle-ja"]],"coli-bowl-hanger-debris-ag":[[0,"coli-bowl-hanger-debris-a-lod0-jg"],[1,"coli-bowl-hanger-debris-a-lod0-mg"],[2,"coli-bowl-hanger-debris-b-lod0-jg"],[3,"coli-bowl-hanger-debris-b-lod0-mg"],[4,"coli-bowl-hanger-debris-c-lod0-jg"],[5,"coli-bowl-Line truncated
|
||||
@@ -19,7 +19,7 @@
|
||||
"(method 22 level)",
|
||||
"(method 11 medius-cache)",
|
||||
"(method 13 race-line)",
|
||||
"(method 11 collide-mesh)",
|
||||
"adgif-shader<-texture!",
|
||||
"symlink2",
|
||||
"(method 17 bounding-box)",
|
||||
"quad-copy!",
|
||||
@@ -34,14 +34,28 @@
|
||||
"generic-light-proc",
|
||||
"memcpy",
|
||||
"dma-count-until-done",
|
||||
"blerc-a-fragment"
|
||||
"test-to-from-spr",
|
||||
"test-from-spr",
|
||||
"test-to-spr",
|
||||
"test-seq-read",
|
||||
"test-worst-read",
|
||||
"test-seq-write",
|
||||
"test-worst-write",
|
||||
"blerc-a-fragment",
|
||||
"get-current-room-name-and-info"
|
||||
],
|
||||
"pair_functions_by_name": [
|
||||
"update-time-of-day",
|
||||
"ref",
|
||||
"ref&",
|
||||
"(method 4 pair)",
|
||||
// "(method 28 editable)",
|
||||
"execute-select",
|
||||
// "(method 29 editable)",
|
||||
// "(method 25 editable)",
|
||||
"last",
|
||||
"member",
|
||||
"display-loop-main",
|
||||
"nmember",
|
||||
"cspace-inspect-tree",
|
||||
"assoc",
|
||||
@@ -58,6 +72,7 @@
|
||||
"delete-car!",
|
||||
"insert-cons!",
|
||||
"debug-menu-rebuild",
|
||||
"(method 8 process-tree)",
|
||||
"debug-menu-find-from-template",
|
||||
"debug-menu-render",
|
||||
"debug-menu-context-select-next-or-prev-item",
|
||||
@@ -72,17 +87,61 @@
|
||||
"~0kfrags = ~d~256hfrags/call = ~f~%": 2,
|
||||
"~0ktris = ~d~256htris/frag = ~f~%": 2,
|
||||
"~0koutput = ~d~256houtput/call = ~f~%": 2,
|
||||
"~0knodes = ~d~256hnodes/call = ~f~%": 2
|
||||
"~0knodes = ~d~256hnodes/call = ~f~%": 2,
|
||||
"~0K~Name~130HID~+50HVol~+15HPitch~+24HPan~+18HEar~+24HDist~%": 0,
|
||||
"~130H~5D ~4D ~5D ~4D ~3D ~5,,0M~%": 6,
|
||||
"music-volume=~220h~f~%": 1,
|
||||
"dialog-volume=~220h~f~%": 1,
|
||||
"music-volume-during-speech=~220h~f~%": 1,
|
||||
"sfx-volume-during-speech=~220h~f~%": 1,
|
||||
"music-volume-ducked-by-sound=~220h~f~%": 1,
|
||||
"music-seek-speed=~220h~f~%": 1,
|
||||
"~%final music-volume: ~220h~f~%": 1,
|
||||
"final sfx-volume: ~220h~f~%": 1,
|
||||
"sfx-volume=~220h~f~%": 1
|
||||
},
|
||||
"blocks_ending_in_asm_branch": {
|
||||
"(method 82 vehicle)": [
|
||||
0, 1, 4, 5, 7, 12, 36, 37, 38, 40, 41, 43, 44, 46, 58, 62, 63, 65, 66, 70,
|
||||
71, 73, 74, 81, 84, 87, 88, 92, 93, 95, 96, 98, 102, 103, 105, 106, 110,
|
||||
111, 113, 114, 116, 117, 118, 119, 121, 122, 127
|
||||
],
|
||||
"(method 16 sparticle-launch-control)": [
|
||||
17, 18, 25, 35, 36, 39, 40, 41, 43, 44, 45, 48, 62, 65, 69, 70, 74, 75,
|
||||
79, 80, 91, 92, 93, 95, 96, 97, 100, 102
|
||||
],
|
||||
"(method 13 collide-shape-prim)": [5, 6],
|
||||
"(method 12 collide-shape-prim-group)": [5, 6],
|
||||
"(method 40 collide-shape)": [3, 9, 12, 18, 20, 22, 23, 26, 27, 30, 32],
|
||||
"(method 45 collide-shape)": [33],
|
||||
"(method 36 collide-shape)": [8, 9],
|
||||
"(method 15 collide-shape-prim-sphere)": [1, 2, 4],
|
||||
"(method 18 collide-shape-prim-sphere)": [0, 1, 2, 3, 4],
|
||||
"upload-vis-bits": [2, 6, 3, 0],
|
||||
"(method 21 nav-control)": [7, 15, 16, 32, 33, 34, 35, 45, 48],
|
||||
"(method 19 nav-mesh)": [9, 18, 19, 35, 36, 37, 38, 58, 61, 62, 64, 65, 68],
|
||||
"(method 41 nav-state)": [8, 9, 10, 11, 18, 19, 21],
|
||||
"(method 26 grid-hash)": [39, 35, 22, 15],
|
||||
"(method 16 collide-shape-prim-sphere)": [1, 2],
|
||||
"(method 17 nav-mesh-editable)": [0, 1, 2, 7, 9, 24, 28, 33],
|
||||
"load-game-text-info": [20, 21, 22, 24, 25, 26],
|
||||
"(method 18 mysql-nav-graph)": [0, 1, 2, 3, 4, 7, 9],
|
||||
"dm-play-task-with-continue": [0, 1, 2, 3, 4, 6],
|
||||
"(method 18 nav-control)": [11, 12, 19, 20, 31, 34],
|
||||
"(method 19 nav-control)": [9, 10],
|
||||
"find-closest-circle-ray-intersection": [0, 4, 15, 16, 17, 18],
|
||||
"cam-helper-temp": [38, 40],
|
||||
"level-remap-texture": [2, 3, 4, 5, 6],
|
||||
"bsp-camera-asm": [1, 2, 3, 4, 6, 7],
|
||||
"get-car-skel-part": [0, 1, 2, 4],
|
||||
"(method 9 curve-color-fast)": [0, 1],
|
||||
"evaluate-color-curve-fast": [0, 1],
|
||||
"sqlpipe-query": [21],
|
||||
"find-offending-process-focusable": [16, 19],
|
||||
"(method 10 simple-sprite-system)": [0],
|
||||
"(method 9 editable-region)": [63],
|
||||
"find-nearest-entity": [7, 9],
|
||||
"(method 49 process-drawable)": [2, 3, 7, 27, 28, 30],
|
||||
"(method 42 collide-shape)": [0, 1, 2, 3, 4, 7],
|
||||
"(method 18 collide-shape-prim-mesh)": [2, 3, 4, 5, 6, 7],
|
||||
"(method 12 collide-shape-prim-sphere)": [
|
||||
@@ -92,22 +151,35 @@
|
||||
"(method 12 collide-shape-prim-mesh)": [
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
|
||||
],
|
||||
"(method 11 collide-mesh)": [2, 4],
|
||||
"(method 12 collide-mesh-cache)": [0, 1, 2, 3, 4, 5],
|
||||
"(method 10 collide-mesh)": [2],
|
||||
"add-debug-line-sphere": [0],
|
||||
"add-debug-box-with-transform": [0, 3],
|
||||
"unpack-comp-rle": [1, 3, 5, 6],
|
||||
"should-push-away-test-mesh": [2, 4],
|
||||
"unpack-comp-huf": [2, 4, 5, 6, 7, 8, 9],
|
||||
"unpack-comp-lzo": [
|
||||
0, 1, 4, 5, 6, 7, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28,
|
||||
29, 30, 31, 32, 33, 34, 35, 39, 43, 45
|
||||
],
|
||||
"(method 16 level)": [0, 1, 5, 13, 14, 15],
|
||||
"draw-drawable-tree-instance-shrub": [5, 7, 9, 11]
|
||||
"draw-drawable-tree-instance-shrub": [5, 7, 9, 11],
|
||||
"get-host-by-name": [17],
|
||||
"(anon-function 3 game-save)": [15, 16],
|
||||
"(anon-function 24 game-save)": [5],
|
||||
"draw-actor-marks": [8],
|
||||
"(method 13 collide-cache)": [7, 9],
|
||||
"(method 22 collide-cache)": [11, 12, 27, 28]
|
||||
},
|
||||
"dynamic_format_arg_counts": {
|
||||
"(trans auto-idle)": [[265, 1]],
|
||||
"(trans idle nav-mesh-editor)": [[525, 0]],
|
||||
"locate-sub": [[68, 3]]
|
||||
},
|
||||
"dynamic_format_arg_counts": {},
|
||||
"mips2c_functions_by_name": [
|
||||
"get-string-length-asm",
|
||||
"draw-string3d-asm",
|
||||
"draw-string-asm-packed",
|
||||
"collide-do-primitives",
|
||||
"moving-sphere-triangle-intersect",
|
||||
"calc-animation-from-spr",
|
||||
@@ -129,34 +201,39 @@
|
||||
"draw-large-polygon",
|
||||
"render-sky-quad",
|
||||
"render-sky-tri",
|
||||
"(method 17 sky-work)",
|
||||
"(method 32 sky-work)",
|
||||
"(method 31 sky-work)",
|
||||
// "(method 34 sky-work)", causes mips2c to assert
|
||||
"(method 29 sky-work)",
|
||||
"(method 30 sky-work)",
|
||||
// "(method 35 sky-work)", causes mips2c to assert
|
||||
"(method 16 sky-work)", // yes
|
||||
"(method 17 sky-work)", // yes
|
||||
"(method 28 sky-work)", // yes
|
||||
"(method 29 sky-work)", // yes
|
||||
"(method 30 sky-work)", // yes
|
||||
"(method 32 sky-work)", // yes
|
||||
"(method 33 sky-work)", // yes
|
||||
"(method 11 collide-hash)",
|
||||
"(method 12 collide-hash)",
|
||||
"fill-bg-using-box-new",
|
||||
"fill-bg-using-line-sphere-new",
|
||||
"(method 12 collide-mesh)",
|
||||
"(method 11 collide-mesh)",
|
||||
"(method 14 collide-mesh)",
|
||||
"(method 15 collide-mesh)",
|
||||
"cspace<-parented-transformq-joint!",
|
||||
"(method 13 collide-mesh)",
|
||||
"draw-large-polygon-ocean",
|
||||
"render-ocean-quad",
|
||||
"init-ocean-far-regs",
|
||||
"(method 15 ocean)",
|
||||
"(method 19 grid-hash)",
|
||||
"(method 20 grid-hash)",
|
||||
"(method 21 grid-hash)",
|
||||
"(method 22 grid-hash)",
|
||||
"(method 28 sphere-hash)",
|
||||
"(method 33 sphere-hash)",
|
||||
"(method 24 grid-hash)",
|
||||
"(method 35 sphere-hash)", // yes
|
||||
"(method 31 sphere-hash)", // yes
|
||||
"(method 34 sphere-hash)", // yes
|
||||
"(method 35 spatial-hash)", // yes
|
||||
"(method 40 spatial-hash)", // yes
|
||||
"(method 38 spatial-hash)", // yes
|
||||
"(method 34 spatial-hash)", // yes
|
||||
"(method 32 sphere-hash)",
|
||||
"(method 30 sphere-hash)",
|
||||
"(method 32 spatial-hash)",
|
||||
"(method 34 spatial-hash)",
|
||||
"(method 35 spatial-hash)",
|
||||
"(method 36 spatial-hash)",
|
||||
"(method 37 spatial-hash)",
|
||||
"(method 10 collide-shape-prim-mesh)",
|
||||
"(method 10 collide-shape-prim-sphere)",
|
||||
"(method 10 collide-shape-prim-group)",
|
||||
@@ -182,7 +259,7 @@
|
||||
"(method 17 nav-engine)",
|
||||
"(method 18 nav-engine)",
|
||||
"(method 21 nav-engine)",
|
||||
"(method 39 nav-state)",
|
||||
"(method 39 nav-state)", // yes
|
||||
"setup-blerc-chains-for-one-fragment",
|
||||
"blerc-execute",
|
||||
"ripple-create-wave-table",
|
||||
|
||||
@@ -1 +1 @@
|
||||
{"adv-event-panel-lod0-jg":[[8,"bottomright"],[7,"topleft"],[6,"selectscreentype"],[5,"select_screen"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"antenna-all-lod0-jg":[[8,"tail_b"],[7,"tail_a"],[6,"flag_d"],[5,"flag_c"],[4,"flag_b"],[3,"flag_a"],[2,"prejoint"],[1,"align"]],"ash-hr-cred-lod0-jg":[[89,"gun"],[88,"holster"],[87,"RlegDangle1_A"],[86,"RlegDangle2_A"],[85,"RlegDangle3_A"],[84,"Rball"],[83,"LlegDangle3_A"],[82,"LlegDangle2_A"],[81,"LlegDangle1_A"],[80,"Lball"],[79,"rcollar_C"],[78,"rcollar_B"],[77,"rcollar_A"],[76,"lcollar_C"],[75,"lcollar_B"],[74,"lcollar_A"],[73,"rtit_A"],[72,"ltit_A"],[71,"RpinkyC"],[70,"RpinkyB"],[69,"RpinkyA"],[68,"RringC"],[67,"RringB"],[66,"RringA"],[65,"RmiddleC"],[64,"RmiddleB"],[63,"RmiddleA"],[62,"RindexC"],[61,"RindexB"],[60,"RindexA"],[59,"RthumbC"],[58,"RthumbB"],[57,"RthumbA"],[56,"LpinkyC"],[55,"LpinkyB"],[54,"LpinkyA"],[53,"LringC"],[52,"LringB"],[51,"LringA"],[50,"LmiddleC"],[49,"LmiddleB"],[48,"LmiddleA"],[47,"LindexC"],[46,"LindexB"],[45,"LindexA"],[44,"LthumbC"],[43,"LthumbB"],[42,"LthumbA"],[41,"hairM_C"],[40,"hairM_B"],[39,"hairM_A1"],[38,"hairL2_C"],[37,"hairL2_B"],[36,"hairL2_A"],[35,"hairL1_C"],[34,"hairL1_B"],[33,"hairL1_A"],[32,"hairR2_C"],[31,"hairR2_B"],[30,"hairR2_A"],[29,"hairR1_C"],[28,"hairR1_B"],[27,"hairR1_A"],[26,"Rear_C"],[25,"Rear_B"],[24,"Lear_C"],[23,"Lear_B"],[22,"Rankle"],[21,"Rknee"],[20,"Rthigh"],[19,"Lankle"],[18,"Lknee"],[17,"Lthigh"],[16,"hips"],[15,"Rhand"],[14,"Relbow"],[13,"Rshoulder"],[12,"Lhand"],[11,"Lelbow"],[10,"Lshoulder"],[9,"Rear_A"],[8,"Lear_A"],[7,"head"],[6,"neck"],[5,"chest"],[4,"stomach"],[3,"main"],[2,"prejoint"],[1,"align"]],"atoll-dish-lod0-jg":[[4,"Yrotation"],[3,"main"],[2,"prejoint"],[1,"align"]],"atoll-rotor-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"body-parts-tab-lod0-jg":[[9,"bottomright"],[8,"topleft"],[7,"mapscreentype"],[6,"map_screen"],[5,"arm"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"bottom-bar-lod0-jg":[[14,"bottomright3"],[13,"topleft3"],[12,"bottomright2"],[11,"topleft2"],[10,"bottomright1"],[9,"topleft1"],[8,"bottomright"],[7,"topleft"],[6,"bottombartype"],[5,"bottom_bar"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"brd-pool-water-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"car-color-tab-lod0-jg":[[13,"color"],[12,"tri2"],[11,"tri1"],[10,"tri0"],[9,"bottomright"],[8,"topleft"],[7,"mapscreentype"],[6,"map_screen"],[5,"arm"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"car-interior-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"car-vert-tab-lod0-jg":[[9,"bottomright"],[8,"topleft"],[7,"mapscreentype"],[6,"map_screen"],[5,"arm"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"cash-bar-lod0-jg":[[9,"bottomright2"],[8,"topleft2"],[7,"bottomright"],[6,"topleft"],[5,"cash_bar"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"character-select-lod0-jg":[[10,"bottomright_type"],[9,"topleft_type"],[8,"bottomright"],[7,"topleft"],[6,"mapscreentype"],[5,"map_screen"],[4,"main"],[3,"cam"],[2,"prejoint"],[1,"align"]],"cliffs-fence-debris-post-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-fence-debris-raila-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-fence-debris-railb-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-fence-debris-railc-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-wood-fence-a-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-wood-fence-b-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-wood-fence-c-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"cliffs-wood-fence-d-lod0-jg":[[3,"main"],[2,"prejoint"],[1,"align"]],"coli-atlas-base-a-lod0-jg":[[4,"coli_atlas_base_dust"],[3,"main"],[2,"prejoint"],[1,"align"]],"coli-atlas-base-b-lod0-jg":[[4,"coli_atlas_base_dust"],[3,"main"],[2,"prejoint"],[1,"align"]],"coli-atlas-base-lod0-jg":[[4,"coli_atlas_base_dust"],[3,"main"],[2,"prejoint"],[1,"align"]],"coli-atlas-break-a-lod0-jg":[[52,"ax"],[51,"aw"],[50,"av"],[49,"au"],[48,"at"],[47,"as"],[46,"ar"],[45,"aq"],[44,"ap"],[43,"ao"],[42,"an"],[41,"am"],[40,"al"],[39,"ak"],[38,"aj"],[37,"ai"],[36,"ah"],[35,"ag"],[34,"af"],[33,"ae"],[32,"ad"],[31,"ac"],[30,"ab"],[29,"aa"],[28,"z"],[27,"y"],[26,"x"],[25,"w"],[24,"v"],[23,"u"],[22,"t"],[21,"s"],[20,"r"],[19,"q"],[18,"p"],[17,"o"],[16,"n"],[15,"m"],[14,"l"],[13,"k"],[12,"j"],[11,"i"],[10,"h"],[9,"g"],[8,"f"],[7,"e"],[6,"d"],[5,"c"],[4,"b"],[3,"a"],[2,"prejoint"],[1,"align"]],"coli-atlas-break-b-lod0-jg":[[52,"cv"],[51,"cu"],[50,"ct"],[49,"cs"],[48,"cr"],[47,"cq"],[46,"cp"],[45,"co"],[44,"cn"],[43,"cm"],[42,"cl"],[41,"ck"],[40,"cj"],[39,"ci"],[38,"ch"],[37,"cg"],[36,"cf"],[35,"ce"],[34,"cd"],[33,"cc"],[32,"cb"],[31,"ca"],[30,"bz"],[29,"by"],[28,"bx"],[27,"bw"],[26,"bv"],[25,"bu"],[24,"bt"],[23,"bs"],[22,"br"],[21,"bq"],[20,"bp"],[19,"bo"],[18,"bn"],[17,"bm"],[16,"bl"],[15,"bk"],[14,"bj"],[13,"bi"],[12,"bh"],[11,"bg"],[10,"bf"],[9,"be"],[8,"bd"],[7,"bc"],[6,"bb"],[5,"ba"],[4,"az"],[3,"ay"],[2,"prejoint"],[1,"align"]],"coli-atlas-break-lod0-jg":[[94,"atlas_break"Line truncated
|
||||
{"adv-event-panel-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"select_screen"],[6,"selectscreentype"],[7,"topleft"],[8,"bottomright"]],"antenna-all-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"flag_a"],[4,"flag_b"],[5,"flag_c"],[6,"flag_d"],[7,"tail_a"],[8,"tail_b"]],"ash-hr-cred-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"],[4,"stomach"],[5,"chest"],[6,"neck"],[7,"head"],[8,"Lear_A"],[9,"Rear_A"],[10,"Lshoulder"],[11,"Lelbow"],[12,"Lhand"],[13,"Rshoulder"],[14,"Relbow"],[15,"Rhand"],[16,"hips"],[17,"Lthigh"],[18,"Lknee"],[19,"Lankle"],[20,"Rthigh"],[21,"Rknee"],[22,"Rankle"],[23,"Lear_B"],[24,"Lear_C"],[25,"Rear_B"],[26,"Rear_C"],[27,"hairR1_A"],[28,"hairR1_B"],[29,"hairR1_C"],[30,"hairR2_A"],[31,"hairR2_B"],[32,"hairR2_C"],[33,"hairL1_A"],[34,"hairL1_B"],[35,"hairL1_C"],[36,"hairL2_A"],[37,"hairL2_B"],[38,"hairL2_C"],[39,"hairM_A1"],[40,"hairM_B"],[41,"hairM_C"],[42,"LthumbA"],[43,"LthumbB"],[44,"LthumbC"],[45,"LindexA"],[46,"LindexB"],[47,"LindexC"],[48,"LmiddleA"],[49,"LmiddleB"],[50,"LmiddleC"],[51,"LringA"],[52,"LringB"],[53,"LringC"],[54,"LpinkyA"],[55,"LpinkyB"],[56,"LpinkyC"],[57,"RthumbA"],[58,"RthumbB"],[59,"RthumbC"],[60,"RindexA"],[61,"RindexB"],[62,"RindexC"],[63,"RmiddleA"],[64,"RmiddleB"],[65,"RmiddleC"],[66,"RringA"],[67,"RringB"],[68,"RringC"],[69,"RpinkyA"],[70,"RpinkyB"],[71,"RpinkyC"],[72,"ltit_A"],[73,"rtit_A"],[74,"lcollar_A"],[75,"lcollar_B"],[76,"lcollar_C"],[77,"rcollar_A"],[78,"rcollar_B"],[79,"rcollar_C"],[80,"Lball"],[81,"LlegDangle1_A"],[82,"LlegDangle2_A"],[83,"LlegDangle3_A"],[84,"Rball"],[85,"RlegDangle3_A"],[86,"RlegDangle2_A"],[87,"RlegDangle1_A"],[88,"holster"],[89,"gun"]],"atoll-dish-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"],[4,"Yrotation"]],"atoll-rotor-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"body-parts-tab-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"arm"],[6,"map_screen"],[7,"mapscreentype"],[8,"topleft"],[9,"bottomright"]],"bottom-bar-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"bottom_bar"],[6,"bottombartype"],[7,"topleft"],[8,"bottomright"],[9,"topleft1"],[10,"bottomright1"],[11,"topleft2"],[12,"bottomright2"],[13,"topleft3"],[14,"bottomright3"]],"brd-pool-water-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"car-color-tab-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"arm"],[6,"map_screen"],[7,"mapscreentype"],[8,"topleft"],[9,"bottomright"],[10,"tri0"],[11,"tri1"],[12,"tri2"],[13,"color"]],"car-interior-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"car-vert-tab-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"arm"],[6,"map_screen"],[7,"mapscreentype"],[8,"topleft"],[9,"bottomright"]],"cash-bar-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"cash_bar"],[6,"topleft"],[7,"bottomright"],[8,"topleft2"],[9,"bottomright2"]],"character-select-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"cam"],[4,"main"],[5,"map_screen"],[6,"mapscreentype"],[7,"topleft"],[8,"bottomright"],[9,"topleft_type"],[10,"bottomright_type"]],"cliffs-fence-debris-post-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-fence-debris-raila-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-fence-debris-railb-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-fence-debris-railc-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-wood-fence-a-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-wood-fence-b-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-wood-fence-c-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"cliffs-wood-fence-d-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"]],"coli-atlas-base-a-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"],[4,"coli_atlas_base_dust"]],"coli-atlas-base-b-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"],[4,"coli_atlas_base_dust"]],"coli-atlas-base-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"main"],[4,"coli_atlas_base_dust"]],"coli-atlas-break-a-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"a"],[4,"b"],[5,"c"],[6,"d"],[7,"e"],[8,"f"],[9,"g"],[10,"h"],[11,"i"],[12,"j"],[13,"k"],[14,"l"],[15,"m"],[16,"n"],[17,"o"],[18,"p"],[19,"q"],[20,"r"],[21,"s"],[22,"t"],[23,"u"],[24,"v"],[25,"w"],[26,"x"],[27,"y"],[28,"z"],[29,"aa"],[30,"ab"],[31,"ac"],[32,"ad"],[33,"ae"],[34,"af"],[35,"ag"],[36,"ah"],[37,"ai"],[38,"aj"],[39,"ak"],[40,"al"],[41,"am"],[42,"an"],[43,"ao"],[44,"ap"],[45,"aq"],[46,"ar"],[47,"as"],[48,"at"],[49,"au"],[50,"av"],[51,"aw"],[52,"ax"]],"coli-atlas-break-b-lod0-jg":[[1,"align"],[2,"prejoint"],[3,"ay"],[4,"az"],[5,"ba"],[6,"bb"],[7,"bc"],[8,"bd"],[9,"be"],[10,"bf"],[11,"bg"],[12,"bh"],[13,"bi"],[14,"bj"],[15,"bk"],[16,"bl"],[17,"bm"],[18,"bn"],[19,"bo"],[20,"bp"],[21,"bq"],[22,"br"],[23,"bs"],[24,"bt"],[25,"bu"],[26,"bv"],[27,"bw"],[28,"bx"],[29,"by"],[30,"bz"],[31,"ca"],[32,"cb"],[33,"cc"],[34,"cd"],[35,"ce"],[36,"cf"],[37,"cg"],[38,"ch"],[39,"ci"],[40,"cj"],[41,"ck"],[42,"cl"],[43,"cm"],[44,"cn"],[45,"co"],[46,"cp"],[47,"cq"],[48,"cr"],[49,"cs"],[50,"ct"],[51,"cu"],[52,"cv"]],"coli-atlas-break-lod0-jg":[[1,"align"],[2,"pLine truncated
|
||||
@@ -2,6 +2,15 @@
|
||||
"ambient-h": [["L1", "(inline-array talker-speech-class)", 233]],
|
||||
"pat-h": [["L1", "(inline-array pat-mode-info)", 4]],
|
||||
"foreground-h": [["L4", "(pointer bucket-id-16)", 462]],
|
||||
"tfrag-methods": [
|
||||
["L92", "(inline-array tfrag-init-data)", 10],
|
||||
["L93", "(pointer bucket-id)", 12],
|
||||
["L94", "(pointer bucket-id)", 12],
|
||||
["L95", "(pointer bucket-id)", 12],
|
||||
["L96", "(pointer bucket-id)", 12],
|
||||
["L98", "(pointer bucket-id)", 12],
|
||||
["L99", "(pointer bucket-id)", 12]
|
||||
],
|
||||
"joint-mod": [["L212", "(inline-array vector)", 3]],
|
||||
"texture-anim-h": [["L1", "(pointer uint8)", 256]],
|
||||
"process-nettable-h": [["L13", "(pointer uint32)", 95]],
|
||||
@@ -12,6 +21,10 @@
|
||||
"timer-h": [["L15", "(pointer uint32)", 12]],
|
||||
"game-task-h": [["L178", "(pointer text-id)", 24]],
|
||||
"profile": [["L3", "(inline-array profile-spec)", 13]],
|
||||
"net-mgr-h": [
|
||||
["L12", "(inline-array net-aux-msg-handler)", 12],
|
||||
["L11", "(pointer uint32)", 512]
|
||||
],
|
||||
"task-control-h": [
|
||||
["L971", "uint64", true],
|
||||
["L973", "uint64", true],
|
||||
@@ -32,12 +45,12 @@
|
||||
["L70", "(pointer uint32)", 256],
|
||||
["L69", "(pointer uint32)", 256],
|
||||
["L68", "(pointer uint32)", 256],
|
||||
["L72", "(pointer uint32)", 12]
|
||||
["L72", "(inline-array mem-buffer)", 4]
|
||||
],
|
||||
"sprite": [["L52", "dma-packet"]],
|
||||
"headset-h": [
|
||||
["L8", "(pointer uint8)", 512],
|
||||
["L7", "(pointer uint8)", 512],
|
||||
["L8", "(pointer uint16)", 256],
|
||||
["L7", "(pointer uint16)", 256],
|
||||
["L6", "(pointer uint8)", 100],
|
||||
["L5", "(pointer uint8)", 160],
|
||||
["L4", "(pointer uint8)", 160],
|
||||
@@ -780,5 +793,395 @@
|
||||
["L295", "vector"],
|
||||
["L294", "vector"]
|
||||
],
|
||||
"net-time-trial-h": [["L5", "(inline-array timetrial-snapshot)", 938]]
|
||||
"net-time-trial-h": [["L5", "(inline-array timetrial-snapshot)", 938]],
|
||||
"process-drawable": [
|
||||
["L472", "vector"],
|
||||
["L471", "vector"]
|
||||
],
|
||||
"sprite-glow": [["L27", "dma-packet"]],
|
||||
"merc-blend-shape": [["L71", "(pointer int16)", 40]],
|
||||
"generic-merc": [["L178", "(inline-array invinitdata)", 8]],
|
||||
"ocean-trans-tables": [
|
||||
["L1", "(inline-array vector)", 4],
|
||||
["L2", "(pointer float)", 160],
|
||||
["L3", "(pointer float)", 100],
|
||||
["L4", "(pointer float)", 72],
|
||||
["L5", "(pointer float)", 72],
|
||||
["L6", "(pointer float)", 72],
|
||||
["L7", "(pointer float)", 72],
|
||||
["L8", "(pointer float)", 44],
|
||||
["L9", "(pointer float)", 44],
|
||||
["L10", "(pointer float)", 44],
|
||||
["L11", "(pointer float)", 44],
|
||||
["L12", "(pointer float)", 40],
|
||||
["L13", "(pointer float)", 40],
|
||||
["L14", "(pointer float)", 40],
|
||||
["L15", "(pointer float)", 40],
|
||||
["L16", "(pointer float)", 28],
|
||||
["L17", "(pointer float)", 28],
|
||||
["L18", "(pointer float)", 28],
|
||||
["L19", "(pointer float)", 28]
|
||||
],
|
||||
"intro-scenes2": [["L1142", "uint64", true]],
|
||||
"camera-facing-quad": [["L11", "vector"]],
|
||||
"credits-obs": [
|
||||
["L194", "cloth-params"],
|
||||
["L193", "cloth-params"],
|
||||
["L191", "cloth-params"],
|
||||
["L190", "cloth-params"],
|
||||
["L189", "cloth-params"]
|
||||
],
|
||||
"net-mgr-medius-clans-h": [
|
||||
["L351", "(pointer uint32)", 9],
|
||||
["L350", "(pointer uint8)", 200]
|
||||
],
|
||||
"car-tables": [["L1", "(pointer uint16)", 11]],
|
||||
"nav-control": [
|
||||
["L527", "uint64", true],
|
||||
["L526", "uint64", true]
|
||||
],
|
||||
"game-save": [["L532", "(pointer uint64)", 2]],
|
||||
"game-info": [
|
||||
["L309", "uint64", true],
|
||||
["L310", "uint64", true],
|
||||
["L311", "uint64", true],
|
||||
["L265", "uint64", true]
|
||||
],
|
||||
"entity": [["L450", "(pointer handle)", 1]],
|
||||
"part-tester": [
|
||||
["L166", "uint64", true],
|
||||
["L164", "uint64", true],
|
||||
["L165", "uint64", true],
|
||||
["L157", "uint64", true]
|
||||
],
|
||||
"cam-states": [
|
||||
["L689", "uint64", true],
|
||||
["L690", "uint64", true],
|
||||
["L688", "uint64", true],
|
||||
["L691", "uint64", true]
|
||||
],
|
||||
"udp-layer": [["L123", "(pointer uint32)", 256]],
|
||||
"headset": [
|
||||
["L167", "(pointer uint32)", 200],
|
||||
["L168", "(pointer uint32)", 200],
|
||||
["L169", "(pointer uint32)", 200],
|
||||
["L170", "(pointer uint32)", 200]
|
||||
],
|
||||
"net-aux-voice": [
|
||||
["L115", "(pointer int32)", 16],
|
||||
["L119", "(pointer int32)", 256]
|
||||
],
|
||||
"mem-buffer": [
|
||||
["L10", "vector"],
|
||||
["L9", "vector"]
|
||||
],
|
||||
"pad": [["L116", "(pointer uint32)", 192]],
|
||||
"keyboard": [["L273", "(pointer uint32)", 32]],
|
||||
"3d-menu-elements": [
|
||||
["L283", "uint64", true],
|
||||
["L282", "uint64", true],
|
||||
["L216", "vector"]
|
||||
],
|
||||
"wcar-bear": [
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"]
|
||||
],
|
||||
"wcar-bobcat": [
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"]
|
||||
],
|
||||
"wcar-cheetah": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-cougar": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-daxtermobile": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-falcon": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-gila": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-leopard": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-mongoose": [
|
||||
["L104", "vector"],
|
||||
["L103", "vector"],
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"]
|
||||
],
|
||||
"wcar-panther": [
|
||||
["L103", "vector"],
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"]
|
||||
],
|
||||
"wcar-possum": [
|
||||
["L103", "vector"],
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"]
|
||||
],
|
||||
"wcar-snake": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-tiger": [
|
||||
["L102", "vector"],
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"]
|
||||
],
|
||||
"wcar-wolf": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"wcar-wombat": [
|
||||
["L101", "vector"],
|
||||
["L100", "vector"],
|
||||
["L99", "vector"],
|
||||
["L98", "vector"],
|
||||
["L97", "vector"],
|
||||
["L96", "vector"],
|
||||
["L95", "vector"]
|
||||
],
|
||||
"cam-layout": [
|
||||
["L893", "uint64", true],
|
||||
["L899", "uint64", true],
|
||||
["L898", "uint64", true],
|
||||
["L892", "uint64", true],
|
||||
["L895", "uint64", true],
|
||||
["L894", "uint64", true],
|
||||
["L897", "uint64", true],
|
||||
["L896", "uint64", true],
|
||||
["L802", "rgba", true],
|
||||
["L800", "rgba", true],
|
||||
["L798", "rgba", true],
|
||||
["L796", "rgba", true],
|
||||
["L794", "rgba", true],
|
||||
["L792", "rgba", true],
|
||||
["L889", "uint64", true],
|
||||
["L785", "vector"],
|
||||
["L802", "vector4w"],
|
||||
["L800", "vector4w"],
|
||||
["L798", "vector4w"],
|
||||
["L796", "vector4w"],
|
||||
["L794", "vector4w"],
|
||||
["L792", "vector4w"]
|
||||
],
|
||||
"cam-states-dbg": [
|
||||
["L60", "vector"],
|
||||
["L59", "vector"]
|
||||
],
|
||||
"coliseum-obs": [
|
||||
["L18", "vector"],
|
||||
["L17", "vector"]
|
||||
],
|
||||
"garage-obs": [
|
||||
["L110", "vector"],
|
||||
["L111", "vector"]
|
||||
],
|
||||
"kras-obs": [["L148", "attack-info"]],
|
||||
"peak-obs": [["L90", "attack-info"]],
|
||||
"snow-obs": [
|
||||
["L16", "vector"],
|
||||
["L15", "vector"]
|
||||
],
|
||||
"title-obs": [
|
||||
["L226", "uint64", true],
|
||||
["L226", "handle-wrapper"]
|
||||
],
|
||||
"loader": [
|
||||
["L1450", "uint64", true],
|
||||
["L1450", "uint64", true],
|
||||
["L1229", "string"]
|
||||
],
|
||||
"hud": [["L145", "vector"]],
|
||||
"lobby-net-h": [
|
||||
["L110", "(pointer uint32)", 84],
|
||||
["L114", "(pointer uint32)", 3840],
|
||||
["L115", "(pointer uint32)", 3840],
|
||||
["L116", "(pointer uint32)", 3840],
|
||||
["L117", "(pointer uint32)", 64],
|
||||
["L146", "uint64", true],
|
||||
["L148", "uint64", true],
|
||||
["L147", "uint64", true],
|
||||
["L145", "uint64", true],
|
||||
["L144", "uint64", true],
|
||||
["L119", "uint64", true]
|
||||
],
|
||||
"default-menu": [
|
||||
["L6893", "uint64", true],
|
||||
["L6899", "uint64", true],
|
||||
["L6236", "attack-info"],
|
||||
["L6242", "attack-info"],
|
||||
["L6896", "uint64", true],
|
||||
["L6894", "uint64", true],
|
||||
["L6895", "uint64", true],
|
||||
["L6898", "uint64", true],
|
||||
["L6897", "uint64", true]
|
||||
],
|
||||
"collide-cache": [["L220", "vector"]],
|
||||
"collide-shape": [
|
||||
["L323", "vector"],
|
||||
["L321", "vector"],
|
||||
["L314", "attack-info"]
|
||||
],
|
||||
"mood-funcs": [
|
||||
["L52", "uint64", true],
|
||||
["L53", "uint64", true]
|
||||
],
|
||||
"mood-funcs2": [["L47", "uint64", true]],
|
||||
"ocean": [["L137", "(pointer bucket-id)", 2]],
|
||||
"texture-anim-tables": [
|
||||
["L163", "uint64", true],
|
||||
["L152", "uint64", true],
|
||||
["L151", "uint64", true],
|
||||
["L150", "uint64", true]
|
||||
],
|
||||
"main": [["L564", "(pointer time-frame)", 2]],
|
||||
"net-mgr-muis": [
|
||||
["L83", "(pointer int32)", 32],
|
||||
["L82", "(pointer int32)", 32],
|
||||
["L81", "(pointer int32)", 32]
|
||||
],
|
||||
"nav-graph-editor": [
|
||||
["L480", "vector"],
|
||||
["L479", "vector"],
|
||||
["L478", "vector"],
|
||||
["L477", "vector"],
|
||||
["L476", "vector"],
|
||||
["L475", "vector"],
|
||||
["L474", "vector"],
|
||||
["L473", "vector"]
|
||||
],
|
||||
"nav-mesh-editor": [
|
||||
["L567", "uint64", true],
|
||||
["L511", "(inline-array triangulation-vert)", 256],
|
||||
["L510", "(inline-array triangulation-vert)", 256],
|
||||
["L562", "(pointer int32)", 1024],
|
||||
["L564", "uint64", true],
|
||||
["L563", "(inline-array vector)", 1024]
|
||||
],
|
||||
"lightning": [
|
||||
["L93", "uint64", true],
|
||||
["L93", "vector4w"]
|
||||
],
|
||||
"editable-player": [
|
||||
["L1515", "(inline-array vector4w)", 4],
|
||||
["L1551", "uint64", true]
|
||||
],
|
||||
"editable": [
|
||||
["L748", "rgba", true],
|
||||
["L749", "rgba", true],
|
||||
["L750", "rgba", true],
|
||||
["L751", "rgba", true],
|
||||
["L752", "rgba", true],
|
||||
["L753", "rgba", true],
|
||||
["L754", "rgba", true],
|
||||
["L755", "rgba", true],
|
||||
["L756", "rgba", true],
|
||||
["L757", "rgba", true],
|
||||
["L747", "uint64", true],
|
||||
["L705", "vector"]
|
||||
],
|
||||
"net-mgr-medius-rooms": [["L128", "(pointer uint8)", 128]],
|
||||
"net-mgr-playback": [["L59", "(inline-array vector4ub)", 128]],
|
||||
"net-mgr-sysmsg": [["L9", "(pointer int32)", 256]],
|
||||
"rigid-body-surface": [["L1", "(inline-array rigid-body-surface)", 8]],
|
||||
"vehicle-reticle": [
|
||||
["L343", "rgba", true],
|
||||
["L342", "rgba", true]
|
||||
],
|
||||
"wvehicle-states": [
|
||||
["L160", "vector"],
|
||||
["L159", "vector"]
|
||||
],
|
||||
"menumap-part": [["L197", "(pointer rgba)", 8]],
|
||||
"wvehicle-weapons-part": [["L142", "(pointer rgba)", 8]],
|
||||
"font": [["L474", "uint64", true]],
|
||||
"vehicle-net": [["L152", "(pointer int32)", 6]],
|
||||
"sky-tng": [
|
||||
["L134", "uint64", true],
|
||||
["L130", "uint64", true],
|
||||
["L133", "uint64", true],
|
||||
["L132", "uint64", true],
|
||||
["L131", "uint64", true],
|
||||
["L129", "vector"],
|
||||
["L128", "vector"],
|
||||
["L127", "vector"]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
[[65,"group-intro-car-explo-closeup"],[1,"group-rain-screend-drop-real"],[457,"group-sewer-spray"],[66,"group-outro-car-explo-closeup"],[393,"group-ship-fireworks"],[2,"group-stars"],[67,"group-intro-opening-debris-smoke"],[3,"group-sun"],[451,"group-temple-lava-firebelch"],[68,"group-intro-opening-debris-fire"],[387,"group-sewerwater-falls-splash"],[4,"group-green-sun"],[5,"group-moon"],[397,"group-kras-waterfall-casino-splash"],[6,"group-red-eco-strike-ground"],[7,"group-red-eco-spinkick"],[407,"group-docks-drainwater"],[8,"group-eco-blue"],[9,"group-eco-blue-collect"],[401,"group-kras-neon-sign-c"],[10,"group-part-vent-blue-active"],[11,"group-part-vent-blue-inactive"],[395,"group-pump-gas-leak"],[12,"group-eco-red"],[13,"group-eco-red-collect"],[405,"group-docks-sand-dump"],[14,"group-part-vent-red-active"],[15,"group-part-vent-red-inactive"],[415,"group-drome-bridge-night-glow-blinking"],[16,"group-part-vent-yellow-active"],[17,"group-part-vent-yellow-inactive"],[409,"group-docks-red-hangar-light"],[18,"group-eco-yellow"],[19,"group-eco-yellow-collect"],[403,"group-docks-drops-splash"],[20,"group-fuel-cell-starburst"],[21,"group-money-starburst"],[413,"group-drome-mist"],[22,"group-buzzer-effect"],[23,"group-blue-collect"],[487,"group-desert-dust-devil"],[24,"group-yellow-collect"],[25,"group-red-collect"],[26,"group-part-water-splash"],[27,"group-part-water-splash-small"],[411,"group-docks-rig-light-lamp"],[28,"group-blue-hit-ground-effect"],[29,"spartacus-group-glow-steady"],[485,"group-desert-hanging-fire"],[30,"spartacus-group-night-glow-steady"],[31,"spartacus-group-glow-blinking"],[431,"group-peak-blowing-snow-powder"],[32,"spartacus-group-night-glow-blinking"],[33,"spartacus-group-fire-tiny"],[425,"group-snow-icebreak-c"],[34,"spartacus-group-fire-small"],[35,"spartacus-group-fire-medium"],[419,"group-drome-waterfall-mist-medium-fall"],[36,"spartacus-group-fire-large"],[37,"spartacus-group-fire-huge"],[429,"group-snowball-moving"],[38,"spartacus-group-steam"],[39,"spartacus-group-chimney-smoke"],[439,"group-canyon-ocean-splash"],[40,"spartacus-group-chimney-double-smoke"],[41,"spartacus-group-water-splash"],[433,"group-peak-billowing-snow-curl-large"],[42,"group-vehicle-part-fire-trail-wheel"],[43,"group-vehicle-part-fire-trail-panels"],[427,"group-cliffs-fence-dust-small"],[44,"group-vehicle-part-fire-trail-bits"],[45,"group-vehicle-part-fire-trail-chasis"],[437,"group-canyon-leaf-fall"],[46,"group-vehicle-explosion"],[47,"group-vehicle-engine-start"],[447,"group-temple-lavasplash"],[48,"group-forcefield-burst"],[53,"group-jakx-fire"],[445,"group-temple-waterfalls-splash"],[54,"group-jakx-fire-thin"],[55,"group-jakx-huge-explosion"],[391,"group-firework3-burst"],[56,"group-intro-opening-missile-thrust"],[57,"group-intro-opening-missile-smoke"],[385,"group-haven-gen-light"],[58,"group-intro-opening-muzzle-flash"],[59,"group-intro-opening-bullet-sparks"],[443,"group-temple-lamp-light"],[60,"group-intro-opening-bullet-sparks-local"],[61,"group-intro-vehicle-tire-skid"],[389,"group-firework1-burst"],[62,"group-intro-vehicle-tire-skid-stop"],[63,"group-intro-vehicle-tire-skid-brake"],[463,"group-garage-steam"],[64,"group-outro-vehicle-tire-skid"],[69,"group-intro-opening-debris-fire-glow"],[461,"group-sewer-splash"],[70,"group-outro-crash-b-fire"],[71,"group-outro-b-rising-smoke"],[471,"group-garage-screen-small-btm"],[72,"group-outro-b-car-steam"],[73,"group-outro-b-dripping-gas"],[465,"group-garage-panellight-yellow"],[74,"group-outro-b-car-fire"],[75,"group-outro-b-final-explosion"],[459,"group-sewer-drip"],[76,"group-outro-crash-b-wheel"],[77,"group-intro-vehicle-roll-fire"],[469,"group-garage-screen-big"],[78,"group-intro-vehicle-roll-glow"],[79,"group-intro-debris-landing-dust"],[80,"group-intro-debris-landing-sparks"],[81,"group-intro-car-little-explo"],[473,"group-garage-smalltv-glow"],[82,"group-intro-barrel-dust"],[83,"group-intro-vehicle-tunnel-dust"],[467,"group-garage-panellight-purple"],[84,"group-intro-mine-tunnel-burning-car"],[85,"group-intro-mine-tunnel-burning-car-smoke"],[477,"group-desisle-ocean-splash"],[86,"group-intro-mine-tunnel-burning-car-glow"],[87,"group-intro-tunnel-mine-glow"],[88,"group-intro-mine-landing-sparks"],[89,"group-intro-mine-landing-dust"],[90,"group-intro-mine-tunnel-car-explosion"],[91,"group-intro-vehicle-tire-skid-smoke"],[475,"group-kcross-fence-dust"],[92,"group-intro-vehicle-tire-skid-smoke2"],[93,"group-intro-car-explosion-wall"],[94,"group-intro-railing-collision"],[95,"group-intro-car-splash-far"],[495,"group-desert-waterfall-mist-fall"],[96,"group-intro-car-water-splash"],[97,"group-intro-fishtank-bubbles"],[489,"group-desert-palace-fire-beacon"],[98,"group-rustyh-pouring-liquid"],[99,"group-rustyh-pouring-liquid2"],[100,"group-rustyh-splashing-liquid"],[101,"group-rustyh-splashing-liquid-fog"],[493,"group-stronghold-torchfire"],[102,"group-rustyh-flying-liquid"],[103,"group-rustyh-big-splashing-liquid"],[503,"group-fishtank-bubbles"],[104,"grouLine truncated
|
||||
@@ -99,7 +99,7 @@
|
||||
"spt-func-rocket": [[16, "vector"]],
|
||||
"(method 115 wcar-base)": [
|
||||
[16, "matrix"],
|
||||
[64, "collide-query"]
|
||||
[64, "wcar-added-stack-type1"]
|
||||
],
|
||||
"(method 41 nav-mesh)": [
|
||||
[16, "vector"],
|
||||
@@ -165,10 +165,7 @@
|
||||
[80, "vector"]
|
||||
],
|
||||
"update-mood-exterior": [[16, "vector"]],
|
||||
"(method 25 mem-buffer)": [
|
||||
[16, "quaternion"],
|
||||
[16, "quaternion"]
|
||||
],
|
||||
"(method 25 mem-buffer)": [[16, ["inline-array", "quaternion", 1]]],
|
||||
"joint-mod-joint-set*-world-handler": [[16, "matrix"]],
|
||||
"add-debug-box": [
|
||||
[16, "vector"],
|
||||
@@ -242,5 +239,617 @@
|
||||
[240, "vector"]
|
||||
],
|
||||
"(method 14 ragdoll)": [[144, "vector"]],
|
||||
"(method 10 ragdoll)": [[16, "vector"]]
|
||||
"(method 10 ragdoll)": [[16, "vector"]],
|
||||
"(code get-heap auto-save)": [
|
||||
[16, ["array", "int32", 2]],
|
||||
[32, ["array", "int32", 2]]
|
||||
],
|
||||
"(method 23 game-info)": [[16, ["array", "int16", 512]]],
|
||||
"vis-dist-additional-ok?": [[16, ["array", "int32", 1]]],
|
||||
"(method 30 path-control)": [
|
||||
[16, ["array", "float", 129]],
|
||||
[544, "vector"],
|
||||
[560, "vector"]
|
||||
],
|
||||
"(method 28 path-control)": [
|
||||
[80, "vector"],
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"]
|
||||
],
|
||||
"aux-voice-running": [
|
||||
[64, "medius-world-report"],
|
||||
[16, ["array", "int32", 2]]
|
||||
],
|
||||
"(method 21 load-state)": [
|
||||
[16, ["inline-array", "level-buffer-state", 18]],
|
||||
[592, ["inline-array", "level-buffer-state", 18]]
|
||||
],
|
||||
"(method 9 level-bounding-box)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 46 process-drawable)": [
|
||||
[16, "collide-query"],
|
||||
[560, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(method 9 joint-control)": [[16, "vector"]],
|
||||
"(anon-function 1 intro-scenes2)": [[16, "vehicle-spawn-params"]],
|
||||
"(method 91 construction-object)": [[16, "vector"]],
|
||||
"slave-set-rotation!": [
|
||||
[96, "vector"],
|
||||
[112, "matrix"],
|
||||
[176, "vector"]
|
||||
],
|
||||
"(method 18 tracking-spline)": [[16, "tracking-spline-sampler"]],
|
||||
"master-track-target": [[16, "vector"]],
|
||||
"(method 10 end-credits-character-viewer)": [[16, "event-message-block"]],
|
||||
"(code running end-credits-character-viewer)": [
|
||||
[16, "event-message-block"],
|
||||
[96, ["array", "symbol", 18]],
|
||||
[176, "vehicle-spawn-params"]
|
||||
],
|
||||
"cam-helper-temp": [[16, ["inline-array", "vector", 3]]],
|
||||
"draw-grid": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"]
|
||||
],
|
||||
"(code cam-combiner-active)": [[16, "vector"]],
|
||||
"(method 36 spatial-hash)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 17 sphere-hash)": [[16, "vector"]],
|
||||
"(method 33 sphere-hash)": [[16, "vector"]],
|
||||
"lightning-uniform-gen": [[16, "vector"]],
|
||||
"lightning-trail-uniform-gen": [[16, "vector"]],
|
||||
"lightning-trail-fractal-gen": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"]
|
||||
],
|
||||
"target-generic-event-handler": [[16, "event-message-block"]],
|
||||
"(method 12 nav-engine)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"debug-nav-validate-current-poly": [[16, "vector"]],
|
||||
"(method 15 nav-link-search-info)": [[32, "vector"]],
|
||||
"(method 14 nav-control)": [[16, "vector"]],
|
||||
"(method 18 nav-control)": [[16, "nav-control-cfs-work"]],
|
||||
"(method 19 nav-control)": [[16, "nav-control-cfs-work"]],
|
||||
"circle-tangent-directions": [[48, "vector"]],
|
||||
"(method 40 nav-state)": [
|
||||
[128, ["inline-array", "vector", 1]],
|
||||
[144, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(method 53 nav-state)": [
|
||||
[16, "vector"],
|
||||
[32, "nav-route-portal"],
|
||||
[80, ["inline-array", "vector", 3]],
|
||||
[192, "matrix"],
|
||||
[224, "nav-route-portal"]
|
||||
],
|
||||
"(method 9 nav-control)": [[16, "vector"]],
|
||||
"(method 16 debris-group)": [
|
||||
[64, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"debris-group-init-by-other": [[16, "vector"]],
|
||||
"merc-blend-shape": [[16, ["array", "int16", 128]]],
|
||||
"add-debug-flat-triangle-noclip": [[16, ["inline-array", "vector4w", 9]]],
|
||||
"(trans idle keyboard-control)": [[16, "symbol"]], // ?
|
||||
"update-stuff": [[16, "quaternion"]],
|
||||
"activate-bar": [[16, "vector"]],
|
||||
"(method 10 collide-mesh)": [[16, "oot-work"]],
|
||||
"camera-teleport-to-location": [[16, "matrix"]],
|
||||
"camera-teleport-to-entity": [[16, "matrix"]],
|
||||
"init-for-transform": [
|
||||
[16, "matrix"],
|
||||
[80, "matrix"],
|
||||
[192, "vector"]
|
||||
],
|
||||
"should-push-away-test-mesh": [[16, "oot-work"]],
|
||||
"(method 115 v-bear)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-bobcat)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-cheetah)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-drone)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-falcon)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"clmf-pos-rot": [[112, "matrix"]],
|
||||
"(method 9 actor-hash-buckets)": [
|
||||
[16, ["inline-array", "vector", 2]],
|
||||
[48, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(method 115 v-wombat)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-wolf)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-tiger)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-snake)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-possum)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-panther)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-mongoose)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-leopard)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-gila)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-daxtermobile)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"(method 115 v-cougar)": [
|
||||
[16, "quaternion"],
|
||||
[32, ["inline-array", "quaternion", 2]]
|
||||
],
|
||||
"cam-layout-entity-info": [[208, "vector"]],
|
||||
"(code cam-point-watch)": [[16, "vector"]],
|
||||
"cam-mouse-input": [[64, "vector"]],
|
||||
"add-a-bunch": [[16, "vector"]],
|
||||
"projectile-bounce-falling-post": [[16, "collide-query"]],
|
||||
"(method 69 projectile)": [[16, "collide-query"]],
|
||||
"projectile-update-velocity-add-gravity": [[16, "vector"]],
|
||||
"projectile-update-velocity-space-wars": [
|
||||
[16, "vector"],
|
||||
[64, "vector"]
|
||||
],
|
||||
"(method 71 construction-object)": [[80, "cquery-with-pad"]],
|
||||
"(method 18 ragdoll)": [[16, "collide-query"]],
|
||||
"(event idle can-leaves-floor)": [[16, ["inline-array", "matrix", 1]]],
|
||||
"(enter dropped ctf-flag)": [
|
||||
[16, "task-arrow-params"],
|
||||
[80, "vector"]
|
||||
],
|
||||
"flag-fall": [[560, "vector"]],
|
||||
"(exit carried ctf-flag)": [[16, "event-message-block"]],
|
||||
"(enter idle ctf-flag)": [[80, "vector"]],
|
||||
"(method 45 jungle-stone-snake-head)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spawn-flame": [[16, "jungle-obs-stack-var0"]],
|
||||
"(post idle kras-fireworks-ship-a)": [[16, ["inline-array", "vector", 1]]],
|
||||
"(method 23 mysql-nav-graph)": [[16, ["inline-array", "vector", 5]]],
|
||||
"(post idle wm-fireworks-ship)": [[16, ["inline-array", "vector", 1]]],
|
||||
"(code explode peak-snowball)": [[32, "quaternion"]],
|
||||
"(method 71 peak-snowball)": [
|
||||
[16, "vector"],
|
||||
[32, ["inline-array", "collide-query", 1]]
|
||||
],
|
||||
"(method 10 visvol-edit-info)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 9 camera-facing-quad)": [[16, "camera-facing-quad-stackvar0"]],
|
||||
"(method 16 collide-cache)": [[16, "collide-puls-work"]],
|
||||
"test-closest-pt-in-triangle": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"]
|
||||
],
|
||||
"(method 14 collide-cache)": [[16, "bounding-box"]],
|
||||
"(method 20 collide-cache)": [[16, "matrix"]],
|
||||
"col-rend-draw": [[16, "matrix"]],
|
||||
"(method 63 collide-shape-moving)": [[48, "vector"]],
|
||||
"cshape-reaction-default": [[16, "vector"]],
|
||||
"(method 10 editable-plane)": [[16, ["inline-array", "vector", 4]]],
|
||||
"(method 13 editable-plane)": [[64, ["inline-array", "vector", 4]]],
|
||||
"(method 10 editable-face)": [[16, ["inline-array", "vector", 6]]],
|
||||
"(method 31 editable-face)": [
|
||||
[16, ["inline-array", "vector", 6]],
|
||||
[112, ["inline-array", "vector", 6]],
|
||||
[240, ["array", "editable-point", 6]],
|
||||
[304, "matrix"]
|
||||
],
|
||||
"(method 14 editable-face)": [
|
||||
[64, ["inline-array", "vector", 4]],
|
||||
[208, ["inline-array", "vector", 6]],
|
||||
[304, ["inline-array", "vector", 6]],
|
||||
[416, "vector"],
|
||||
[448, "vector"]
|
||||
],
|
||||
"(method 13 editable-face)": [[64, ["inline-array", "vector", 6]]],
|
||||
"(method 37 editable-face)": [[16, ["inline-array", "vector", 6]]],
|
||||
"(method 13 editable-array)": [
|
||||
[96, "vector"],
|
||||
[160, "vector"]
|
||||
],
|
||||
"cshape-reaction-update-state": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 70 wvehicle)": [[32, "update-engine-mix-state-work"]],
|
||||
"find-nearest-focusable": [[48, "vector"]],
|
||||
"(method 55 joint-exploder)": [[16, "bounding-box"]],
|
||||
"(method 53 ocean)": [[16, "vector"]],
|
||||
"(method 47 ocean)": [[16, "vector"]],
|
||||
"(method 40 ocean)": [[16, "vector"]],
|
||||
"(method 29 ocean)": [[16, "vector"]],
|
||||
"(method 30 ocean)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 54 ocean)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 55 ocean)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 56 ocean)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 57 ocean)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 13 ocean)": [[16, "vector"]],
|
||||
"update-camera": [[16, "camera-free-floating-move-info"]],
|
||||
"(method 92 construction-object)": [[16, "sprite-glow-data"]],
|
||||
"(code getting-universe-information net-mgr)": [
|
||||
[16, "medius-server-world-status-response"]
|
||||
],
|
||||
"camera-slave-debug": [
|
||||
[48, "matrix"],
|
||||
[144, "vector"]
|
||||
],
|
||||
"cam-layout-save-interesting": [[16, "vector"]],
|
||||
"cam-layout-save-align": [[16, "vector"]],
|
||||
"cam-layout-save-pivot": [[16, "vector"]],
|
||||
"cam-layout-entity-volume-info-create": [
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"],
|
||||
[80, "vector"],
|
||||
[96, "vector"],
|
||||
[128, "vector"],
|
||||
[144, "vector"]
|
||||
],
|
||||
"(method 59 nav-graph-editor)": [[16, "nav-poly"]],
|
||||
"(method 32 nav-graph-editor)": [[16, ["inline-array", "vector", 4]]],
|
||||
"(method 33 nav-graph-editor)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 30 nav-graph-editor)": [
|
||||
[32, "vector"],
|
||||
[48, ["inline-array", "vector", 2]],
|
||||
[112, "vector"],
|
||||
[128, "vector"],
|
||||
[144, "vector"]
|
||||
],
|
||||
"(method 36 nav-graph-editor)": [[16, ["inline-array", "vector", 4]]],
|
||||
"(method 38 nav-graph-editor)": [
|
||||
[80, "vector"],
|
||||
[656, "nav-poly"],
|
||||
[880, ["inline-array", "vector", 4]]
|
||||
],
|
||||
"(method 50 nav-graph-editor)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 48 nav-graph-editor)": [
|
||||
[48, "vector"],
|
||||
[96, "vector"],
|
||||
[128, "vector"]
|
||||
],
|
||||
"(method 14 nav-mesh-editable)": [
|
||||
[16, ["inline-array", "vector", 4]],
|
||||
[80, ["inline-array", "vector", 4]]
|
||||
],
|
||||
"(method 34 nav-graph-editor)": [
|
||||
[16, "vector"],
|
||||
[48, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(post draw-closest-minimap nav-graph-editor)": [
|
||||
[64, ["inline-array", "vector", 4]]
|
||||
],
|
||||
"update-height": [[16, "vector"]],
|
||||
"snap-level-navmesh": [
|
||||
[16, "vector"],
|
||||
[64, "vector"]
|
||||
],
|
||||
"(method 12 nav-mesh-editable)": [[32, "vector"]],
|
||||
"(method 15 nav-mesh-editable)": [[16, "vector"]],
|
||||
"(method 16 nav-mesh-editable)": [
|
||||
[16, "vector"],
|
||||
[48, "vector"]
|
||||
],
|
||||
"(method 10 nav-mesh-poly)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"],
|
||||
[80, "vector"],
|
||||
[96, "vector"],
|
||||
[112, "vector"],
|
||||
[128, "vector"]
|
||||
],
|
||||
"(method 52 nav-mesh-editor)": [[80, "vector"]],
|
||||
"(trans idle nav-mesh-editor)": [[16, "event-message-block"]],
|
||||
"(method 25 grid-hash)": [
|
||||
[16, "grid-hash-box"],
|
||||
[32, "grid-hash-box"],
|
||||
[48, "vector"],
|
||||
[64, "vector"]
|
||||
],
|
||||
"(method 26 grid-hash)": [[16, "vector"]],
|
||||
"(method 11 grid-hash)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 13 grid-hash)": [[16, "sphere"]],
|
||||
"(method 22 editable)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 14 editable-point)": [
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[80, ["inline-array", "vector", 4]]
|
||||
],
|
||||
"execute-mouse-move": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"],
|
||||
[80, "vector"],
|
||||
[112, "vector"]
|
||||
],
|
||||
"insert-wall": [[32, ["array", "int32", 2]]],
|
||||
"insert-box": [[32, ["array", "int32", 8]]],
|
||||
"(method 21 editable-entity)": [[80, "vector"]],
|
||||
"(method 51 editable-player)": [[16, "vector"]],
|
||||
"update-manipulator-position": [[16, "vector"]],
|
||||
"(code playing-playback-game net-mgr)": [
|
||||
[16, "event-message-block"],
|
||||
[96, "mem-buffer"]
|
||||
],
|
||||
"texture-anim-layer-draw": [
|
||||
[16, "matrix"],
|
||||
[80, "matrix"],
|
||||
[144, "matrix"],
|
||||
[208, "matrix"]
|
||||
],
|
||||
"handle-sys-msg": [[96, "medius-chat-fwd-message"]],
|
||||
"real-fog-texture-anim-func": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 220 wvehicle)": [
|
||||
[16, "vector"],
|
||||
[32, ["inline-array", "vector", 3]]
|
||||
],
|
||||
"wv-player-post-move-update": [[16, "event-message-block"]],
|
||||
"(method 133 wvehicle)": [[16, "vector"]],
|
||||
"(method 87 vehicle-wheel)": [[16, "rigid-body-move-work"]],
|
||||
"(method 68 wvehicle)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 229 wvehicle)": [[16, "matrix"]],
|
||||
"player-wait-control-hook": [[16, "vehicle-controls"]],
|
||||
"(enter explode wvehicle)": [
|
||||
[16, "event-message-block"],
|
||||
[96, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(post explode wvehicle)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(enter explode-into-nothing wvehicle)": [[16, "explosion-init-params"]],
|
||||
"(method 235 wvehicle)": [[32, ["inline-array", "vector", 3]]],
|
||||
"(method 234 wvehicle)": [
|
||||
[32, ["inline-array", "vector", 3]],
|
||||
[80, "vector"],
|
||||
[96, "vector4s-3"]
|
||||
],
|
||||
"spt-func-birth-on-height-die-drip-sewer": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-birth-on-die4": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-birth-on-die3": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-birth-on-die2": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-birth-on-die1": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-birth-on-height-die-drops": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"part-jungle-bird10-path": [
|
||||
[80, "vector"],
|
||||
[96, "vector"]
|
||||
],
|
||||
"part-jungle-bird9-path": [[80, "vector"]],
|
||||
"spt-func-birth-on-pop": [[16, "vector"]],
|
||||
"spt-func-birth-on-height-die": [[16, "vector"]],
|
||||
"spt-func-birth-on-height-die-drip": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 16 nav-link-search-info)": [
|
||||
[16, "vector"],
|
||||
[48, "vector"]
|
||||
],
|
||||
"(method 41 nav-control)": [
|
||||
[16, "vector"],
|
||||
[48, ["inline-array", "vector", 2]]
|
||||
],
|
||||
"(method 11 nav-control)": [[16, "nav-poly"]],
|
||||
"(method 51 nav-state)": [[16, "nav-ray"]],
|
||||
"(method 54 nav-state)": [[112, "nav-ray"]],
|
||||
"(method 11 nav-state)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 24 nav-state)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 28 nav-state)": [[208, "vector"]],
|
||||
"(method 34 nav-state)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 31 nav-state)": [[112, "nav-ray"]],
|
||||
"(method 32 nav-state)": [[16, "nav-control-cfs-work"]],
|
||||
"(method 37 nav-state)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(anon-function 9 nav-control)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(anon-function 4 nav-control)": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 19 nav-mesh)": [[16, "nav-ray"]],
|
||||
"(method 21 nav-control)": [[16, "nav-ray"]],
|
||||
"(post idle peak-snowball)": [
|
||||
[48, "peak-obs-stackvar0"],
|
||||
[128, ["inline-array", "vector", 3]]
|
||||
],
|
||||
"(method 17 peak-snowball)": [[48, "peak-obs-stackvar0"]],
|
||||
"(method 71 coli-atlas-globe)": [
|
||||
[16, ["inline-array", "collide-query", 1]],
|
||||
[560, ["inline-array", "vector", 3]]
|
||||
],
|
||||
"(method 82 coli-atlas-globe)": [
|
||||
[16, "rigid-body-impact"],
|
||||
[96, "vector"]
|
||||
],
|
||||
"(method 80 coli-atlas-globe)": [[32, "peak-obs-stackvar0"]],
|
||||
"(method 45 kras-pump-break)": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"(method 52 palm-tree)": [
|
||||
[16, "vector"],
|
||||
[32, "desarena-obs-stackvar0"]
|
||||
],
|
||||
"(method 55 palm-tree)": [[16, "vector"]],
|
||||
"(event vibrate palm-tree)": [[16, "vector"]],
|
||||
"(event idle palm-tree)": [[16, "vector"]],
|
||||
"part-menumap-bird1-path": [[80, "vector"]],
|
||||
"part-menumap-bird2-path": [[80, "vector"]],
|
||||
"part-menumap-bird3-path": [[80, "vector"]],
|
||||
"part-menumap-bird4-path": [[80, "vector"]],
|
||||
"part-menumap-bird5-path": [[80, "vector"]],
|
||||
"part-menumap-bird6-path": [[80, "vector"]],
|
||||
"part-menumap-bird7-path": [[80, "vector"]],
|
||||
"part-menumap-bird8-path": [[80, "vector"]],
|
||||
"part-menumap-bird9-path": [[80, "vector"]],
|
||||
"part-menumap-bird10-path": [[80, "vector"]],
|
||||
"spt-func-menumap-rocket": [[16, "vector"]],
|
||||
"spt-func-menumap-birth-on-die4": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-menumap-birth-on-die3": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-menumap-birth-on-die2": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"spt-func-menumap-birth-on-die1": [
|
||||
[16, "vector"],
|
||||
[32, "vector"]
|
||||
],
|
||||
"birth-func-vws-adopt-velocity": [[16, "vector"]],
|
||||
"check-scorp-shell-level1": [[16, "vector"]],
|
||||
"check-scorp-shell-level2": [[16, "vector"]],
|
||||
"update-engine-mix-state": [[32, "vehicle-wheel-init-params"]],
|
||||
"(method 52 garage-turntable)": [
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "vector"],
|
||||
[80, ["inline-array", "vector", 18]]
|
||||
],
|
||||
"(enter explode kras-pump-break-proxy)": [[16, "event-message-block"]],
|
||||
"(method 249 wvehicle)": [[16, "race-line-query-info"]],
|
||||
"(method 65 vehicle-debris)": [[16, "vehicle-hardpoint-info"]],
|
||||
"(method 87 vehicle-debris)": [[16, ["inline-array", "collide-query", 1]]],
|
||||
"(method 185 vehicle)": [[16, "vector"]],
|
||||
"(method 136 vehicle)": [[16, ["inline-array", "vector", 2]]],
|
||||
"test-vehicle-weapon": [[16, "event-message-block"]],
|
||||
"sound-name->string": [[16, ["array", "uint8", 16]]],
|
||||
"string->sound-name": [[16, ["array", "sound-name", 1]]],
|
||||
"vehicle-draw-thruster": [[16, "vehicle-thruster-work"]],
|
||||
"(method 45 collide-shape)": [[16, "do-push-aways-work"]],
|
||||
"(method 50 collide-shape)": [
|
||||
[32, "vector"],
|
||||
[48, "vector"]
|
||||
],
|
||||
"(method 18 collide-shape-prim-mesh)": [[16, "collide-tri-result"]],
|
||||
"(method 18 collide-shape-prim-sphere)": [
|
||||
[48, ["inline-array", "vector", 6]]
|
||||
],
|
||||
"(method 65 collide-shape-moving)": [[576, ["inline-array", "vector", 2]]],
|
||||
"(anon-function 5 gsound)": [
|
||||
[16, ["array", "symbol", 4]],
|
||||
[32, ["array", "symbol", 4]]
|
||||
],
|
||||
"doppler-pitch-shift": [[16, ["inline-array", "vector", 2]]],
|
||||
"(method 113 vehicle)": [[16, "vehicle-stack-type3"]],
|
||||
"(code target-intro)": [[16, "vector"]],
|
||||
"particle-adgif-callback": [[16, ["inline-array", "vector", 4]]],
|
||||
"sp-adjust-launch": [[16, "matrix"]],
|
||||
"sp-launch-particles-death": [[16, "matrix"]],
|
||||
"sp-relaunch-setup-fields": [[16, "matrix"]],
|
||||
"sparticle-rotate-to-vel-3d": [[16, "vector"]],
|
||||
"sparticle-respawn-heights": [[16, "vector"]],
|
||||
"sparticle-respawn-timer": [[16, "vector"]],
|
||||
"sparticle-3d-rotate-xz-to-camera": [[16, "vector"]],
|
||||
"spt-func-relative-pos": [
|
||||
[16, "vector"],
|
||||
[32, "vector"],
|
||||
[48, "vector"],
|
||||
[64, "matrix"],
|
||||
[128, "matrix"],
|
||||
[192, "matrix"]
|
||||
],
|
||||
"spt-func-turn-to-vel-radial": [[16, "vector"]],
|
||||
"(method 54 collectoid-draw)": [[16, ["inline-array", "vector", 2]]],
|
||||
"drop-collectoids": [[16, "net-powerup-spawn-params"]],
|
||||
"(method 15 sparticle-launch-control)": [[16, "sphere"]],
|
||||
"execute-part-engine": [[112, "matrix"]],
|
||||
"(method 17 collide-shape-prim-mesh)": [[16, "collide-tri-result"]],
|
||||
"update-time-of-day": [[16, "vector"]]
|
||||
}
|
||||
@@ -1 +1 @@
|
||||
[[2147418112,{"idx":0,"name":"placeholder-white","tpage_name":"placeholder"}],[261029888,{"idx":0,"name":"snob-dirt-ground-01","tpage_name":"snobowlx-vis-alpha"}],[260898816,{"idx":0,"name":"kcro-ground-layover-a","tpage_name":"kcross-vis-alpha"}],[260702209,{"idx":1,"name":"snow-ground-overlay-01","tpage_name":"snowx-vis-alpha"}],[260702208,{"idx":0,"name":"snow-ground-overlay-02","tpage_name":"snowx-vis-alpha"}],[260571136,{"idx":0,"name":"peak-ground-snow-overlay-01","tpage_name":"peakb-vis-alpha"}],[260440064,{"idx":0,"name":"ice-snowoverlay-01","tpage_name":"icec-vis-alpha"}],[259981321,{"idx":9,"name":"pecker-yellowfur","tpage_name":"peccred-pris2"}],[259981320,{"idx":8,"name":"pecker-wingtop","tpage_name":"peccred-pris2"}],[259981319,{"idx":7,"name":"pecker-wingbottom","tpage_name":"peccred-pris2"}],[259981318,{"idx":6,"name":"pecker-teeth","tpage_name":"peccred-pris2"}],[259981317,{"idx":5,"name":"pecker-tail","tpage_name":"peccred-pris2"}],[259981316,{"idx":4,"name":"pecker-plume","tpage_name":"peccred-pris2"}],[259981314,{"idx":2,"name":"pecker-eyelid","tpage_name":"peccred-pris2"}],[259784705,{"idx":1,"name":"charHOLD","tpage_name":"thbcred-pris2"}],[259784704,{"idx":0,"name":"bam-eyelight","tpage_name":"thbcred-pris2"}],[259653673,{"idx":41,"name":"bam-eyelight","tpage_name":"ashcred-pris2"}],[259653672,{"idx":40,"name":"ashelin-whitestrap","tpage_name":"ashcred-pris2"}],[259653670,{"idx":38,"name":"ashelin-shortsleg","tpage_name":"ashcred-pris2"}],[259653669,{"idx":37,"name":"ashelin-shortscuff","tpage_name":"ashcred-pris2"}],[259653668,{"idx":36,"name":"ashelin-shortsback","tpage_name":"ashcred-pris2"}],[259653663,{"idx":31,"name":"ashelin-lowerlegging","tpage_name":"ashcred-pris2"}],[259653662,{"idx":30,"name":"ashelin-jacketrt","tpage_name":"ashcred-pris2"}],[259653661,{"idx":29,"name":"ashelin-jacketbody","tpage_name":"ashcred-pris2"}],[259653660,{"idx":28,"name":"ashelin-jacketbelt-end","tpage_name":"ashcred-pris2"}],[259653659,{"idx":27,"name":"ashelin-jacketbelt","tpage_name":"ashcred-pris2"}],[259653658,{"idx":26,"name":"ashelin-jacketback","tpage_name":"ashcred-pris2"}],[259653649,{"idx":17,"name":"ashelin-gunbarrel-01","tpage_name":"ashcred-pris2"}],[259653648,{"idx":16,"name":"ashelin-goggle","tpage_name":"ashcred-pris2"}],[259653647,{"idx":15,"name":"ashelin-glove","tpage_name":"ashcred-pris2"}],[259653646,{"idx":14,"name":"ashelin-face","tpage_name":"ashcred-pris2"}],[259653645,{"idx":13,"name":"ashelin-eyelid","tpage_name":"ashcred-pris2"}],[259653644,{"idx":12,"name":"ashelin-eyebrow","tpage_name":"ashcred-pris2"}],[259653643,{"idx":11,"name":"ashelin-eye","tpage_name":"ashcred-pris2"}],[259653642,{"idx":10,"name":"ashelin-collar","tpage_name":"ashcred-pris2"}],[259653641,{"idx":9,"name":"ashelin-chest","tpage_name":"ashcred-pris2"}],[259653640,{"idx":8,"name":"ashelin-buckle","tpage_name":"ashcred-pris2"}],[259653639,{"idx":7,"name":"ashelin-brownstrap","tpage_name":"ashcred-pris2"}],[259653638,{"idx":6,"name":"ashelin-bra","tpage_name":"ashcred-pris2"}],[259653637,{"idx":5,"name":"ashelin-boottop","tpage_name":"ashcred-pris2"}],[259653633,{"idx":1,"name":"ashelin-beltbuckle","tpage_name":"ashcred-pris2"}],[259457042,{"idx":18,"name":"daxterlense","tpage_name":"daxcred-pris2"}],[259457040,{"idx":16,"name":"daxterheadwidenew","tpage_name":"daxcred-pris2"}],[259457039,{"idx":15,"name":"daxtergoggles","tpage_name":"daxcred-pris2"}],[259457038,{"idx":14,"name":"daxterfoot-bottom","tpage_name":"daxcred-pris2"}],[259457037,{"idx":13,"name":"daxterfoot","tpage_name":"daxcred-pris2"}],[259457036,{"idx":12,"name":"daxterfinger","tpage_name":"daxcred-pris2"}],[259457035,{"idx":11,"name":"daxterear","tpage_name":"daxcred-pris2"}],[259457034,{"idx":10,"name":"daxterbolt","tpage_name":"daxcred-pris2"}],[259457033,{"idx":9,"name":"daxterbodyshort-eix","tpage_name":"daxcred-pris2"}],[259457032,{"idx":8,"name":"daxterarm","tpage_name":"daxcred-pris2"}],[259457031,{"idx":7,"name":"daxter-pants","tpage_name":"daxcred-pris2"}],[259457030,{"idx":6,"name":"daxter-orange","tpage_name":"daxcred-pris2"}],[259457029,{"idx":5,"name":"daxter-furhilite","tpage_name":"daxcred-pris2"}],[259457028,{"idx":4,"name":"daxter-eyelid","tpage_name":"daxcred-pris2"}],[259457027,{"idx":3,"name":"daxter-belt-02","tpage_name":"daxcred-pris2"}],[259457026,{"idx":2,"name":"daxter-belt-01","tpage_name":"daxcred-pris2"}],[259457025,{"idx":1,"name":"bam-hairhilite","tpage_name":"daxcred-pris2"}],[259457024,{"idx":0,"name":"bam-eyelight","tpage_name":"daxcred-pris2"}],[259391510,{"idx":22,"name":"gt-blitz-zipper-01","tpage_name":"gtbcred-pris2"}],[259391504,{"idx":16,"name":"gt-blitz-jacketsleeve","tpage_name":"gtbcred-pris2"}],[259391503,{"idx":15,"name":"gt-blitz-jacketdetails","tpage_name":"gtbcred-pris2"}],[259391502,{"idx":14,"name":"gt-blitz-jacketbody","tpage_name":"gtbcred-pris2"}],[259391501,{"idx":13,"name":"gt-blitz-handpalm","tpage_name":"gtbcred-pris2"}],[259391497,{"idx":9,"name":"gt-blitz-facenew","tpage_name"Line truncated
|
||||
[[197918735,{"idx":15,"name":"drome-concrete-01","tpage_name":"dromec-vis-tfrag"}],[176816166,{"idx":38,"name":"temple-a-sndstn-dtl03","tpage_name":"templex-vis-tfrag"}],[198770738,{"idx":50,"name":"atoll-sand-patch","tpage_name":"atollx-vis-tfrag"}],[257949719,{"idx":23,"name":"thug-a-maskb-leather-02","tpage_name":"thacred-pris2"}],[261029888,{"idx":0,"name":"snob-dirt-ground-01","tpage_name":"snobowlx-vis-alpha"}],[152174599,{"idx":7,"name":"time-freeze-circle-purple","tpage_name":"sprgstbx-pris"}],[227016705,{"idx":1,"name":"time-freeze-cage-cap","tpage_name":"peaktbox-pris"}],[242810881,{"idx":1,"name":"hud-rank-taryn-02","tpage_name":"tarlev-minimap"}],[172949579,{"idx":75,"name":"ice-snow-drift-01","tpage_name":"iceb-vis-tfrag"}],[111214641,{"idx":49,"name":"city-sideframe-plain","tpage_name":"havenx-vis-tfrag"}],[63111168,{"idx":0,"name":"city-slum-wire","tpage_name":"havena-vis-shrub"}],[186580996,{"idx":4,"name":"time-freeze-circle-purple","tpage_name":"cnsptbox-pris"}],[259457032,{"idx":8,"name":"daxterarm","tpage_name":"daxcred-pris2"}],[2147418112,{"idx":0,"name":"placeholder-white","tpage_name":"placeholder"}],[254148641,{"idx":33,"name":"kras-sign-b-neon-22","tpage_name":"dockkras-alpha"}],[169476150,{"idx":54,"name":"docks-blue-paint-04","tpage_name":"docksb-vis-tfrag"}],[194248727,{"idx":23,"name":"peak-precursor-bot-stuff-01","tpage_name":"icetourw-tfrag"}],[201195533,{"idx":13,"name":"haven-train-turbine-side","tpage_name":"dromdocx-vis-pris"}],[118358033,{"idx":17,"name":"kcro-metal-pipe-02","tpage_name":"kcross-vis-shrub"}],[148111378,{"idx":18,"name":"des-red-rock-01","tpage_name":"canyond-vis-tfrag"}],[111214705,{"idx":113,"name":"city-dirtywood","tpage_name":"havenx-vis-tfrag"}],[179896397,{"idx":77,"name":"peak-precursor-bot-01","tpage_name":"icebergx-vis-tfrag"}],[720925,{"idx":29,"name":"loadsave-screen","tpage_name":"level-default-shrub"}],[259653661,{"idx":29,"name":"ashelin-jacketbody","tpage_name":"ashcred-pris2"}],[173408268,{"idx":12,"name":"train-hanger-arrow-dest","tpage_name":"dockss-water"}],[167968769,{"idx":1,"name":"this-way-arrow-02","tpage_name":"jungles-water"}],[254935079,{"idx":39,"name":"jakx-jacketstraps-01","tpage_name":"jakcred-pris2"}],[155123728,{"idx":16,"name":"sewer-plate-03","tpage_name":"sewerf-vis-tfrag"}],[177799179,{"idx":11,"name":"peak-snow-treesnow","tpage_name":"peakd-vis-tfrag"}],[161546254,{"idx":14,"name":"jungle-bird-15","tpage_name":"havtours-sprite"}],[175570965,{"idx":21,"name":"temple-a-sndstn-trm06","tpage_name":"templeb-vis-tfrag"}],[86114313,{"idx":9,"name":"m-raptor-thigh","tpage_name":"deshunt2-pris"}],[260898816,{"idx":0,"name":"kcro-ground-layover-a","tpage_name":"kcross-vis-alpha"}],[42467354,{"idx":26,"name":"jungle-bark-green","tpage_name":"jungled-vis-tfrag"}],[25559065,{"idx":25,"name":"kras-metal-09","tpage_name":"krasx-vis-tfrag"}],[159776769,{"idx":1,"name":"artifact-blue-glow-01","tpage_name":"kcrosart-tfrag"}],[115605594,{"idx":90,"name":"city-inda-wallbase","tpage_name":"haveny-vis-tfrag"}],[108462081,{"idx":1,"name":"desa-stillwater","tpage_name":"desarenx-vis-water"}],[257949733,{"idx":37,"name":"thug-a-teeth","tpage_name":"thacred-pris2"}],[169214028,{"idx":76,"name":"docks-a-dup-sfalt-03","tpage_name":"docksa-vis-tfrag"}],[179044438,{"idx":86,"name":"peak-fm-rocktosnow-02","tpage_name":"peakx-vis-tfrag"}],[191102987,{"idx":11,"name":"world-map-tracks-02","tpage_name":"menumap-pris"}],[201195521,{"idx":1,"name":"haven-train-brown-bar","tpage_name":"dromdocx-vis-pris"}],[160038971,{"idx":59,"name":"can-cart","tpage_name":"canyonx-vis-tfrag"}],[41943088,{"idx":48,"name":"jungle-stone-block-tunnel-02","tpage_name":"junglee-vis-tfrag"}],[223215619,{"idx":3,"name":"this-way-scan","tpage_name":"temples-water"}],[118030402,{"idx":66,"name":"grg-wall-05","tpage_name":"garageb-tfrag"}],[128450699,{"idx":139,"name":"cty-fence","tpage_name":"havsewy-vis-tfrag"}],[260702209,{"idx":1,"name":"snow-ground-overlay-01","tpage_name":"snowx-vis-alpha"}],[191103010,{"idx":34,"name":"worldmap-kcro-metal-plate-01","tpage_name":"menumap-pris"}],[25559058,{"idx":18,"name":"kras-temp-neon-blue","tpage_name":"krasx-vis-tfrag"}],[142868487,{"idx":7,"name":"iscreen-metal-pipe-04","tpage_name":"garage-pris"}],[180617217,{"idx":1,"name":"artifact-blue-glow-01","tpage_name":"disleart-tfrag"}],[147390466,{"idx":2,"name":"spar-stone-top","tpage_name":"sparguse-vis-tfrag"}],[130482205,{"idx":29,"name":"sew-metal-33","tpage_name":"sewerx-vis-tfrag"}],[199229446,{"idx":6,"name":"atoll-ribbed","tpage_name":"atoll-vis-shrub"}],[260702208,{"idx":0,"name":"snow-ground-overlay-02","tpage_name":"snowx-vis-alpha"}],[50921549,{"idx":77,"name":"wstlander-02-shirt","tpage_name":"rustyh-pris"}],[201195530,{"idx":10,"name":"haven-train-orange-trim","tpage_name":"dromdocx-vis-pris"}],[178192476,{"idx":92,"name":"ice-rock-wall-01","tpage_name":"icex-vis-tfrag"}],[194248704,{"idx":0,"name":"peak-precursor-siding-02","tpage_name":"icetourw-tfrag"}],[104923198,{"idx":Line truncated
|
||||
File diff suppressed because it is too large.
Load diff
@@ -515,5 +515,49 @@
|
||||
},
|
||||
"vector-rad<-vector-deg/2!": {
|
||||
"args": ["out", "in"]
|
||||
},
|
||||
"(method 23 setting-control)": {
|
||||
"vars": {
|
||||
"s5-0": "user-cur",
|
||||
"s4-0": "user-targ"
|
||||
}
|
||||
},
|
||||
"(top-level-login settings)": {
|
||||
"vars": {
|
||||
"gp-0": "user-def",
|
||||
"s5-0": "user-cur"
|
||||
}
|
||||
},
|
||||
"(method 0 ambient-sound)": {
|
||||
"vars": {
|
||||
"sv-32": ["name", "sound-name"]
|
||||
}
|
||||
},
|
||||
"(method 18 load-state)": {
|
||||
"vars": {
|
||||
"s4-0": "script-ctxt"
|
||||
}
|
||||
},
|
||||
"(method 15 level-group)": {
|
||||
"vars": {
|
||||
"v0-8": ["v0-8", "(inline-array vector)"]
|
||||
}
|
||||
},
|
||||
"(method 10 cam-setting-data)": {
|
||||
"vars": {
|
||||
"a0-6": ["a0-6", "handle"],
|
||||
"a0-128": ["a0-128", "handle"],
|
||||
"a0-132": ["a0-132", "handle"]
|
||||
}
|
||||
},
|
||||
"(method 10 user-setting-data)": {
|
||||
"vars": {
|
||||
"v1-57": ["v1-57", "handle"]
|
||||
}
|
||||
},
|
||||
"(method 17 gui-control)": {
|
||||
"vars": {
|
||||
"v0-0": ["v0-0", "gui-status"]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,17 @@
|
||||
|
||||
#include "streamed_audio.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "common/audio/audio_formats.h"
|
||||
#include "common/log/log.h"
|
||||
#include "common/util/BinaryReader.h"
|
||||
#include "common/util/FileUtil.h"
|
||||
#include "common/util/string_util.h"
|
||||
|
||||
#include "game/sound/989snd/fakeplayer.h"
|
||||
#include "game/sound/989snd/musicbank.h"
|
||||
#include "game/sound/989snd/sfxblock.h"
|
||||
#include "game/sound/common/flava.h"
|
||||
#include "game/sound/common/sound_types.h"
|
||||
|
||||
#include "fmt/format.h"
|
||||
#include "third-party/json.hpp"
|
||||
@@ -209,6 +215,16 @@ std::string remove_trailing_spaces(const std::string& in) {
|
||||
}
|
||||
return short_name;
|
||||
}
|
||||
// List of characters that cannot occur in filenames on some platforms.
|
||||
const std::set<char> banned_chars = {'<', '>', ':', '"', '/', '\\', '|', '?', '*', '^'};
|
||||
std::string sanitize_name(const std::string& in) {
|
||||
auto copy = remove_trailing_spaces(in);
|
||||
for (auto& ch : copy) {
|
||||
if (banned_chars.contains(ch))
|
||||
ch = '_';
|
||||
}
|
||||
return copy;
|
||||
}
|
||||
|
||||
struct AudioFileInfo {
|
||||
std::string filename;
|
||||
@@ -253,6 +269,202 @@ AudioFileInfo process_audio_file(const fs::path& output_folder,
|
||||
((double)left_samples.size() + (double)right_samples.size()) / header.sample_rate};
|
||||
}
|
||||
|
||||
size_t find_bank_offset(const std::vector<u8>& d) {
|
||||
auto u32_at = [&](size_t p) {
|
||||
u32 v = 0;
|
||||
std::memcpy(&v, d.data() + p, sizeof(v));
|
||||
return v;
|
||||
};
|
||||
auto is_fourcc = [&](size_t p, const char* cc) {
|
||||
return p + 4 <= d.size() && d[p] == static_cast<u8>(cc[0]) &&
|
||||
d[p + 1] == static_cast<u8>(cc[1]) && d[p + 2] == static_cast<u8>(cc[2]) &&
|
||||
d[p + 3] == static_cast<u8>(cc[3]);
|
||||
};
|
||||
|
||||
for (size_t off = 0; off + 16 <= d.size(); off += 2048) {
|
||||
const u32 type = u32_at(off);
|
||||
if (type != 1 && type != 3) {
|
||||
continue;
|
||||
}
|
||||
const u32 num_chunks = u32_at(off + 4);
|
||||
if (num_chunks < 2 || num_chunks > 3 ||
|
||||
off + 8 + static_cast<size_t>(num_chunks) * 8 > d.size()) {
|
||||
continue;
|
||||
}
|
||||
bool chunks_ok = true;
|
||||
for (u32 i = 0; i < num_chunks; i++) {
|
||||
const u32 coff = u32_at(off + 8 + i * 8);
|
||||
const u32 csz = u32_at(off + 8 + i * 8 + 4);
|
||||
if (off + static_cast<size_t>(coff) + csz > d.size()) {
|
||||
chunks_ok = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (chunks_ok &&
|
||||
(is_fourcc(off + u32_at(off + 8), "SBlk") || is_fourcc(off + u32_at(off + 8), "SBv2"))) {
|
||||
return off;
|
||||
}
|
||||
}
|
||||
return SIZE_MAX;
|
||||
}
|
||||
|
||||
void parse_jak1_name_table(const std::vector<u8>& d,
|
||||
size_t limit,
|
||||
std::string& bank_name,
|
||||
std::vector<std::string>& names) {
|
||||
bank_name.clear();
|
||||
names.clear();
|
||||
if (limit < 0x18 || limit > d.size()) {
|
||||
return;
|
||||
}
|
||||
auto read_name16 = [&](size_t p) {
|
||||
char buf[17];
|
||||
std::memcpy(buf, d.data() + p, 16);
|
||||
buf[16] = 0;
|
||||
return std::string(buf);
|
||||
};
|
||||
u32 count = 0;
|
||||
std::memcpy(&count, d.data() + 0x14, sizeof(count));
|
||||
|
||||
bank_name = read_name16(0);
|
||||
size_t pos = 0x18;
|
||||
for (u32 i = 0; i < count && pos + 20 <= limit; i++, pos += 20) {
|
||||
names.push_back(read_name16(pos));
|
||||
}
|
||||
}
|
||||
|
||||
void process_music(const fs::path& output_path, const fs::path& input_dir) {
|
||||
auto dir = input_dir / "MUS";
|
||||
std::vector<fs::path> musFiles = file_util::find_files_in_dir(dir, std::regex(".*\\.MUS"));
|
||||
double audio_len = 0.f;
|
||||
|
||||
const flava::FlavaSet dummyFlava = {0, {{"default", 0}}, false};
|
||||
|
||||
// Create a fake player that will generate the samples to play the music tracks exactly as they
|
||||
// are in the games :)
|
||||
snd::FakePlayer fakeplayer;
|
||||
std::vector<s16> left_samples, right_samples;
|
||||
// Generate at most five minutes worth of music for each variation of each track.
|
||||
const s64 FIVE_MINUTES = snd::SAMPLE_RATE * 300;
|
||||
left_samples.reserve(FIVE_MINUTES);
|
||||
right_samples.reserve(FIVE_MINUTES);
|
||||
for (auto& mus : musFiles) {
|
||||
auto mus_name = remove_trailing_spaces(mus.filename().replace_extension("").string());
|
||||
auto data = file_util::read_binary_file(mus);
|
||||
|
||||
// Skip TWEAKVAL which is not a real musicbank
|
||||
if (mus_name == "TWEAKVAL")
|
||||
continue;
|
||||
|
||||
const size_t bank_offset = find_bank_offset(data); // Find where the music bank starts
|
||||
if (bank_offset == SIZE_MAX) {
|
||||
lg::error("'{}' is not a valid .MUS bank.", mus_name);
|
||||
return;
|
||||
}
|
||||
|
||||
auto output_folder = output_path / mus_name;
|
||||
file_util::create_dir_if_needed(output_folder);
|
||||
snd::MusicBank* bank =
|
||||
(snd::MusicBank*)fakeplayer.LoadBank(std::span<u8>(data).subspan(bank_offset));
|
||||
|
||||
auto flava_set = flava::lookup(mus_name);
|
||||
if (!flava_set)
|
||||
flava_set = &dummyFlava;
|
||||
for (auto& flavaVariant : flava_set->variants) {
|
||||
const auto variantName = std::string(flavaVariant.name);
|
||||
if (variantName == "none")
|
||||
continue;
|
||||
// Turn off repetition for music. 0 means sound will repeat, 1 means it won't.
|
||||
bank->Sounds[0].Repeats = 1;
|
||||
fakeplayer.PlaySound(bank, 0, snd::MAX_VOLUME, 0, 0, 0);
|
||||
if (flavaVariant.value > 0) {
|
||||
// Play for a tenth of a second before setting the register, then clear left/right samples
|
||||
// so they don't get added to track. This seems to help ensure that the correct flava
|
||||
// actually plays.
|
||||
fakeplayer.Tick(left_samples, right_samples, snd::SAMPLE_RATE / 10);
|
||||
fakeplayer.SetSoundReg(flava_set->reg, flavaVariant.value);
|
||||
left_samples.clear();
|
||||
right_samples.clear();
|
||||
}
|
||||
fakeplayer.Tick(left_samples, right_samples, FIVE_MINUTES);
|
||||
|
||||
auto file_name = variantName == "default" ? mus_name : mus_name + '_' + variantName;
|
||||
file_name = fmt::format("{}.wav", file_name);
|
||||
write_wave_file(left_samples, right_samples, snd::SAMPLE_RATE, output_folder / file_name);
|
||||
audio_len += left_samples.size() / (float)snd::SAMPLE_RATE;
|
||||
|
||||
left_samples.clear();
|
||||
right_samples.clear();
|
||||
fakeplayer.StopSound();
|
||||
}
|
||||
|
||||
fakeplayer.UnloadBank(bank);
|
||||
lg::info("File {}, total {:.2f} minutes", mus.filename().string(), audio_len / 60.0);
|
||||
}
|
||||
}
|
||||
|
||||
void process_sfx(const fs::path& output_path, const fs::path& input_dir) {
|
||||
auto dir = input_dir / "SBK";
|
||||
std::vector<fs::path> sbkFiles = file_util::find_files_in_dir(dir, std::regex(".*\\.SBK"));
|
||||
double audio_len = 0.f;
|
||||
|
||||
// Create a fake player that will generate the samples to play the sounds exactly as they are in
|
||||
// the games :)
|
||||
snd::FakePlayer fakeplayer;
|
||||
std::vector<s16> left_samples, right_samples;
|
||||
const s64 TEN_SECONDS = snd::SAMPLE_RATE * 10;
|
||||
left_samples.reserve(TEN_SECONDS);
|
||||
right_samples.reserve(TEN_SECONDS);
|
||||
for (auto& sbk : sbkFiles) {
|
||||
auto sbk_name = sbk.filename().replace_extension("");
|
||||
auto data = file_util::read_binary_file(sbk);
|
||||
|
||||
const size_t bank_offset = find_bank_offset(data); // Find where the sfx bank starts
|
||||
std::vector<std::string> sfx_names;
|
||||
if (bank_offset == SIZE_MAX) {
|
||||
lg::error("'{}' is not a valid .SBK bank.", sbk_name.string());
|
||||
return;
|
||||
}
|
||||
if (bank_offset > 0) {
|
||||
std::string bank_name;
|
||||
parse_jak1_name_table(data, bank_offset, bank_name, sfx_names);
|
||||
}
|
||||
|
||||
auto output_folder = output_path / sbk_name;
|
||||
file_util::create_dir_if_needed(output_folder);
|
||||
snd::SFXBlock* block =
|
||||
(snd::SFXBlock*)fakeplayer.LoadBank(std::span<u8>(data).subspan(bank_offset));
|
||||
|
||||
std::map<u32, std::string> names_by_index;
|
||||
for (const auto& [name, index] : block->Names) {
|
||||
names_by_index.insert({index, name});
|
||||
}
|
||||
|
||||
for (u32 sound_index = 0; sound_index < block->Sounds.size(); ++sound_index) {
|
||||
fakeplayer.PlaySound(block, sound_index, snd::MAX_VOLUME, 0, 0, 0);
|
||||
fakeplayer.Tick(left_samples, right_samples, TEN_SECONDS);
|
||||
|
||||
std::string name;
|
||||
if (auto it = names_by_index.find(sound_index); it != names_by_index.end())
|
||||
name = it->second;
|
||||
else if (sound_index < sfx_names.size())
|
||||
name = sfx_names[sound_index];
|
||||
else
|
||||
name = "sound" + std::to_string(sound_index);
|
||||
|
||||
auto file_name = fmt::format("{}.wav", sanitize_name(name));
|
||||
write_wave_file(left_samples, right_samples, snd::SAMPLE_RATE, output_folder / file_name);
|
||||
audio_len += left_samples.size() / (float)snd::SAMPLE_RATE;
|
||||
|
||||
left_samples.clear();
|
||||
right_samples.clear();
|
||||
}
|
||||
|
||||
fakeplayer.UnloadBank(block);
|
||||
lg::info("File {}, total {:.2f} minutes", sbk.filename().string(), audio_len / 60.0);
|
||||
}
|
||||
}
|
||||
|
||||
void process_streamed_audio(const decompiler::Config& config,
|
||||
const fs::path& output_path,
|
||||
const fs::path& input_dir,
|
||||
|
||||
@@ -12,4 +12,7 @@ void process_streamed_audio(const Config& config,
|
||||
const fs::path& output_path,
|
||||
const fs::path& input_dir,
|
||||
const std::vector<std::string>& audio_files);
|
||||
}
|
||||
|
||||
void process_sfx(const fs::path& output_path, const fs::path& input_dir);
|
||||
void process_music(const fs::path& output_path, const fs::path& input_dir);
|
||||
} // namespace decompiler
|
||||
@@ -161,6 +161,11 @@ int run_decompilation_process(decompiler::Config config,
|
||||
db.dts.jg_info = config.jg_info_dump;
|
||||
}
|
||||
} else {
|
||||
if (config.dump_art_group_info || config.dump_joint_geo_info) {
|
||||
lg::error(
|
||||
"`dump_art_group_info` or `dump_joint_geo_info` enabled WITHOUT enabling "
|
||||
"`process_art_groups`");
|
||||
}
|
||||
lg::error("`process_art_groups` was false and no art-group-info dump was provided!");
|
||||
return 1;
|
||||
}
|
||||
@@ -308,11 +313,20 @@ int run_decompilation_process(decompiler::Config config,
|
||||
|
||||
lg::info("[Mem] After extraction: {} MB", get_peak_rss() / (1024 * 1024));
|
||||
|
||||
if (config.rip_streamed_audio) {
|
||||
if (config.rip_streamed_audio || config.rip_music) {
|
||||
auto streaming_audio_out = out_folder / "audio";
|
||||
file_util::create_dir_if_needed(streaming_audio_out);
|
||||
process_streamed_audio(config, streaming_audio_out, in_folder,
|
||||
config.streamed_audio_file_names);
|
||||
|
||||
if (config.rip_streamed_audio) {
|
||||
process_streamed_audio(config, streaming_audio_out / "voice_lines", in_folder,
|
||||
config.streamed_audio_file_names);
|
||||
process_sfx(streaming_audio_out / "sfx", in_folder);
|
||||
}
|
||||
// Rip music for jak 1 or jak 2
|
||||
if (config.rip_music &&
|
||||
(config.game_version == GameVersion::Jak1 || config.game_version == GameVersion::Jak2)) {
|
||||
process_music(streaming_audio_out / "music", in_folder);
|
||||
}
|
||||
}
|
||||
|
||||
lg::info("Decompiler has finished successfully in {:.2f} seconds.", decomp_timer.getSeconds());
|
||||
|
||||
@@ -134,11 +134,13 @@ ExtractorErrorCode decompile(const fs::path& in_folder,
|
||||
const std::unordered_map<std::string, GameIsoFlags> game_iso_flag_names = {
|
||||
{"jak1-black-label", FLAG_JAK1_BLACK_LABEL}};
|
||||
|
||||
ExtractorErrorCode compile(const fs::path& iso_data_path, const std::string& data_subfolder) {
|
||||
ExtractorErrorCode compile(const fs::path& iso_data_path,
|
||||
const std::string& data_subfolder,
|
||||
emitter::InstructionSet instr_str) {
|
||||
// Determine which config to use from the database
|
||||
const auto version_info = get_version_info_or_default(iso_data_path);
|
||||
|
||||
Compiler compiler(game_name_to_version(version_info.game_name), emitter::InstructionSet::X86);
|
||||
Compiler compiler(game_name_to_version(version_info.game_name), instr_str);
|
||||
compiler.make_system().set_constant("*iso-data*", absolute(iso_data_path).string());
|
||||
compiler.make_system().set_constant("*use-iso-data-path*", true);
|
||||
file_util::set_iso_data_dir(absolute(iso_data_path));
|
||||
@@ -190,6 +192,11 @@ int main(int argc, char** argv) {
|
||||
bool flag_folder = false;
|
||||
std::string game_name = "jak1";
|
||||
std::string decomp_config_override = "{}";
|
||||
#if defined(__aarch64__) || defined(_M_ARM64)
|
||||
std::string instr_set_name = "arm64";
|
||||
#else
|
||||
std::string instr_set_name = "x86";
|
||||
#endif
|
||||
|
||||
lg::initialize();
|
||||
|
||||
@@ -213,10 +220,22 @@ int main(int argc, char** argv) {
|
||||
app.add_flag("-c,--compile", flag_compile, "Compile the game");
|
||||
app.add_flag("-p,--play", flag_play, "Play the game");
|
||||
app.add_flag("-f,--folder", flag_folder, "Take ISO input from a folder");
|
||||
app.add_option("--instruction-set", instr_set_name,
|
||||
"Select the x86 or ARM64 code generation backend.");
|
||||
define_common_cli_arguments(app);
|
||||
app.validate_positionals();
|
||||
CLI11_PARSE(app, argc, argv);
|
||||
|
||||
emitter::InstructionSet instr_set;
|
||||
if (instr_set_name == "x86") {
|
||||
instr_set = emitter::InstructionSet::X86;
|
||||
} else if (instr_set_name == "arm64") {
|
||||
instr_set = emitter::InstructionSet::ARM64;
|
||||
} else {
|
||||
lg::error("Instruction set '{}' must be 'x86' or 'arm64'", instr_set_name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
lg::info("Working Directory - {}", fs::current_path().string());
|
||||
|
||||
// If no flag is set, we default to running everything
|
||||
@@ -391,7 +410,7 @@ int main(int argc, char** argv) {
|
||||
}
|
||||
|
||||
if (flag_compile) {
|
||||
const auto status_code = compile(iso_data_path, data_subfolder);
|
||||
const auto status_code = compile(iso_data_path, data_subfolder, instr_set);
|
||||
if (status_code != ExtractorErrorCode::SUCCESS) {
|
||||
return static_cast<int>(status_code);
|
||||
}
|
||||
|
||||
@@ -1132,6 +1132,15 @@ void types2_for_add(types2::Type& type_out,
|
||||
return;
|
||||
}
|
||||
|
||||
// propagate integer math: a * C1 + b * C2 + C3
|
||||
if (arg1_type.is_integer_constant() && arg0_type.kind == TP_Type::Kind::PRODUCT_SUM) {
|
||||
const auto& [mult, mult2] = arg0_type.get_product_sum_multipliers();
|
||||
type_out.type = TP_Type::make_from_product_sum(
|
||||
mult, mult2, arg0_type.typespec(),
|
||||
arg0_type.get_sum_constant() + arg1_type.get_integer_constant());
|
||||
return;
|
||||
}
|
||||
|
||||
// propagate integer math: a + C1
|
||||
if (arg1_type.is_integer_constant() && is_int_or_uint(dts, arg0_type)) {
|
||||
TypeSpec sum_type = arg0_type.typespec();
|
||||
@@ -1202,6 +1211,35 @@ void types2_for_add(types2::Type& type_out,
|
||||
}
|
||||
}
|
||||
|
||||
// a * C1 + b * C2 (+ C3), possibly the two indices of a 2d array access.
|
||||
{
|
||||
auto as_product = [&](const TP_Type& t, int64_t* mult, int64_t* constant) {
|
||||
if (t.is_product()) {
|
||||
*mult = t.get_multiplier();
|
||||
*constant = 0;
|
||||
return true;
|
||||
}
|
||||
if (t.kind == TP_Type::Kind::INTEGER_CONSTANT_PLUS_VAR_MULT) {
|
||||
*mult = t.get_mult_int_constant();
|
||||
*constant = t.get_add_int_constant();
|
||||
return true;
|
||||
}
|
||||
if (t.kind == TP_Type::Kind::TYPESPEC && is_int_or_uint(dts, t)) {
|
||||
*mult = 1;
|
||||
*constant = 0;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
int64_t mult0, mult1, constant0, constant1;
|
||||
if (as_product(arg0_type, &mult0, &constant0) && as_product(arg1_type, &mult1, &constant1) &&
|
||||
mult0 != mult1) {
|
||||
type_out.type =
|
||||
TP_Type::make_from_product_sum(mult0, mult1, arg0_type.typespec(), constant0 + constant1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (common_int2_case(type_out, dts, arg0_type, arg1_type)) {
|
||||
return;
|
||||
}
|
||||
@@ -1218,11 +1256,14 @@ void types2_for_add(types2::Type& type_out,
|
||||
if (out.success) {
|
||||
if (out.results.size() == 1) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(out.results.front().result_type));
|
||||
return;
|
||||
} else {
|
||||
types2_from_ambiguous_deref(output_instr, type_out, out.results, extras.tags_locked);
|
||||
return;
|
||||
}
|
||||
if (!out.results.front().addr_of && type_out.type &&
|
||||
type_out.type->kind == TP_Type::Kind::TYPESPEC) {
|
||||
type_out.type->set_field_origin(arg0_type.typespec(), arg1.get_int());
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1281,6 +1322,20 @@ void types2_for_add(types2::Type& type_out,
|
||||
}
|
||||
}
|
||||
|
||||
// (+ (+ obj C1) (* a C2)), with obj + C1 already resolved to an element field access
|
||||
if (arg1_type.is_product()) {
|
||||
if (auto elt = lookup_array_element_from_field(dts.ts, arg0_type, arg1_type.get_multiplier())) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(elt->result_type));
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (arg0_type.is_product()) {
|
||||
if (auto elt = lookup_array_element_from_field(dts.ts, arg1_type, arg0_type.get_multiplier())) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(elt->result_type));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (arg0_type.is_product() && arg1_type.kind == TP_Type::Kind::TYPESPEC) {
|
||||
type_out.type =
|
||||
TP_Type::make_object_plus_product(arg1_type.typespec(), arg0_type.get_multiplier(), true);
|
||||
@@ -1368,6 +1423,15 @@ void types2_for_add(types2::Type& type_out,
|
||||
type_out.type = TP_Type::make_from_integer_constant_plus_var(
|
||||
arg0_type.get_integer_constant(), arg1_type.typespec(), sum_type);
|
||||
return;
|
||||
} else if (arg0_type.kind == TP_Type::Kind::PRODUCT_SUM) {
|
||||
if (auto elt = lookup_2d_array_element(dts.ts, arg1_type.typespec(), arg0_type)) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(elt->result_type));
|
||||
return;
|
||||
}
|
||||
const auto& [mult, mult2] = arg0_type.get_product_sum_multipliers();
|
||||
type_out.type = TP_Type::make_object_plus_product_sum(arg1_type.typespec(), mult, mult2,
|
||||
arg0_type.get_sum_constant(), true);
|
||||
return;
|
||||
} else {
|
||||
type_out.type = TP_Type::make_object_plus_product(arg1_type.typespec(), 1, true);
|
||||
return;
|
||||
@@ -1375,6 +1439,17 @@ void types2_for_add(types2::Type& type_out,
|
||||
}
|
||||
}
|
||||
|
||||
if (arg1_type.kind == TP_Type::Kind::PRODUCT_SUM && tc(dts, TypeSpec("structure"), arg0_type)) {
|
||||
if (auto elt = lookup_2d_array_element(dts.ts, arg0_type.typespec(), arg1_type)) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(elt->result_type));
|
||||
return;
|
||||
}
|
||||
const auto& [mult, mult2] = arg1_type.get_product_sum_multipliers();
|
||||
type_out.type = TP_Type::make_object_plus_product_sum(arg0_type.typespec(), mult, mult2,
|
||||
arg1_type.get_sum_constant(), false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (env.version >= GameVersion::Jak2 && tc(dts, TypeSpec("symbol"), arg1_type) &&
|
||||
is_int_or_uint(dts, arg0_type)) {
|
||||
if (arg0_type.is_integer_constant(jak2::SYM_TO_STRING_OFFSET)) {
|
||||
@@ -1753,6 +1828,11 @@ void AsmOp::propagate_types2(types2::Instruction& instr,
|
||||
out[m_dst->reg()]->type = TP_Type::make_from_ts(coerce_to_reg_type(field.type()));
|
||||
return;
|
||||
}
|
||||
if (m_instr.src[1].get_imm() > 0 &&
|
||||
dts.ts.tc(TypeSpec("integer"), src_type->type->typespec())) {
|
||||
out[m_dst->reg()]->type = TP_Type::make_from_ts("uint");
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1964,8 +2044,8 @@ bool load_var_op_determine_type(types2::Type& type_out,
|
||||
return true;
|
||||
} else if (input_type.kind == TP_Type::Kind::TYPE_OF_TYPE_NO_VIRTUAL) {
|
||||
// normal non-virtual method access
|
||||
type_out.type =
|
||||
TP_Type::make_non_virtual_method(method_type, TypeSpec(type_name), method_id);
|
||||
type_out.type = TP_Type::make_non_virtual_method(method_type, TypeSpec(type_name),
|
||||
method_id, method_info.name);
|
||||
return true;
|
||||
} else {
|
||||
// normal virtual method access.
|
||||
@@ -1991,7 +2071,8 @@ bool load_var_op_determine_type(types2::Type& type_out,
|
||||
}
|
||||
}
|
||||
// nope
|
||||
type_out.type = TP_Type::make_virtual_method(method_type, TypeSpec(type_name), method_id);
|
||||
type_out.type = TP_Type::make_virtual_method(method_type, TypeSpec(type_name), method_id,
|
||||
method_info.name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -2015,13 +2096,33 @@ bool load_var_op_determine_type(types2::Type& type_out,
|
||||
if (method_id != GOAL_NEW_METHOD && method_id != GOAL_RELOC_METHOD) {
|
||||
// this can get us the wrong thing for `new` methods. And maybe relocate?
|
||||
type_out.type = TP_Type::make_non_virtual_method(
|
||||
method_info.type.substitute_for_method_call("object"), TypeSpec("object"), method_id);
|
||||
method_info.type.substitute_for_method_call("object"), TypeSpec("object"), method_id,
|
||||
method_info.name);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (input_type.kind == TP_Type::Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT) {
|
||||
if (input_type.has_sum_multipliers()) {
|
||||
FieldReverseLookupInput rd_in;
|
||||
DerefKind dk;
|
||||
dk.is_store = false;
|
||||
dk.reg_kind = get_reg_kind(ro.reg);
|
||||
dk.sign_extend = op.kind() == LoadVarOp::Kind::SIGNED;
|
||||
dk.size = op.size();
|
||||
rd_in.deref = dk;
|
||||
rd_in.base_type = input_type.get_obj_plus_const_mult_typespec();
|
||||
rd_in.stride = input_type.get_sum_multipliers().first;
|
||||
rd_in.stride2 = input_type.get_sum_multipliers().second;
|
||||
rd_in.offset = ro.offset + input_type.get_sum_constant();
|
||||
auto rd = dts.ts.reverse_field_lookup(rd_in);
|
||||
if (rd.success) {
|
||||
type_out.type = TP_Type::make_from_ts(coerce_to_reg_type(rd.result_type));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
if (input_type.is_plain_product_plus_obj()) {
|
||||
FieldReverseLookupInput rd_in;
|
||||
DerefKind dk;
|
||||
dk.is_store = false;
|
||||
|
||||
@@ -374,6 +374,7 @@ TP_Type DecompilerTypeSystem::tp_lca(const TP_Type& existing,
|
||||
}
|
||||
|
||||
case TP_Type::Kind::INTEGER_CONSTANT_PLUS_VAR_MULT:
|
||||
case TP_Type::Kind::PRODUCT_SUM:
|
||||
// a bit lazy here, but I don't think you can ever merge these.
|
||||
*changed = true;
|
||||
return TP_Type::make_from_ts("int");
|
||||
@@ -587,4 +588,52 @@ bool DecompilerTypeSystem::should_attempt_cast_simplify(const TypeSpec& expected
|
||||
|
||||
return !ts.tc(expected, actual);
|
||||
}
|
||||
|
||||
std::optional<FieldReverseLookupOutput> lookup_2d_array_element(const TypeSystem& ts,
|
||||
const TypeSpec& base_type,
|
||||
const TP_Type& product_sum) {
|
||||
FieldReverseLookupInput rd_in;
|
||||
rd_in.base_type = base_type;
|
||||
rd_in.stride = product_sum.get_product_sum_multipliers().first;
|
||||
rd_in.stride2 = product_sum.get_product_sum_multipliers().second;
|
||||
rd_in.offset = product_sum.get_sum_constant();
|
||||
auto rd = ts.reverse_field_lookup(rd_in);
|
||||
if (!rd.success || rd.addr_of) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return rd;
|
||||
}
|
||||
|
||||
std::optional<FieldReverseLookupOutput> lookup_array_element_from_field(const TypeSystem& ts,
|
||||
const TP_Type& field_addr,
|
||||
int stride) {
|
||||
if (!field_addr.has_field_origin()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
FieldReverseLookupInput rd_in;
|
||||
rd_in.base_type = field_addr.field_origin_type();
|
||||
rd_in.offset = field_addr.field_origin_offset();
|
||||
auto field_rd = ts.reverse_field_lookup(rd_in);
|
||||
rd_in.stride = stride;
|
||||
auto rd = ts.reverse_field_lookup(rd_in);
|
||||
if (!rd.success || rd.addr_of || !rd.has_variable_token() || !field_rd.success ||
|
||||
field_rd.tokens.size() != rd.tokens.size()) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < rd.tokens.size(); i++) {
|
||||
const auto& tok = rd.tokens.at(i);
|
||||
const auto& field_tok = field_rd.tokens.at(i);
|
||||
bool same = tok.kind == FieldReverseLookupOutput::Token::Kind::VAR_IDX
|
||||
? field_tok.kind == FieldReverseLookupOutput::Token::Kind::CONSTANT_IDX &&
|
||||
field_tok.idx == 0
|
||||
: tok.kind == field_tok.kind && tok.name == field_tok.name &&
|
||||
(tok.kind != FieldReverseLookupOutput::Token::Kind::CONSTANT_IDX ||
|
||||
tok.idx == field_tok.idx);
|
||||
if (!same) {
|
||||
return std::nullopt;
|
||||
}
|
||||
}
|
||||
return rd;
|
||||
}
|
||||
} // namespace decompiler
|
||||
@@ -1,5 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <optional>
|
||||
|
||||
#include "common/goos/Reader.h"
|
||||
#include "common/goos/TextDB.h"
|
||||
#include "common/type_system/TypeSystem.h"
|
||||
@@ -104,4 +106,11 @@ class DecompilerTypeSystem {
|
||||
GameVersion m_version;
|
||||
mutable goos::Reader m_reader;
|
||||
};
|
||||
|
||||
std::optional<FieldReverseLookupOutput> lookup_2d_array_element(const TypeSystem& ts,
|
||||
const TypeSpec& base_type,
|
||||
const TP_Type& product_sum);
|
||||
std::optional<FieldReverseLookupOutput> lookup_array_element_from_field(const TypeSystem& ts,
|
||||
const TP_Type& field_addr,
|
||||
int stride);
|
||||
} // namespace decompiler
|
||||
@@ -41,6 +41,10 @@ std::string TP_Type::print() const {
|
||||
case Kind::PRODUCT_WITH_CONSTANT:
|
||||
return fmt::format("<value x {}>", m_int);
|
||||
case Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT:
|
||||
if (m_sum_multipliers.first) {
|
||||
return fmt::format("<{} + {} + (value x {}) + (value x {})>", m_ts.print(), m_sum_constant,
|
||||
m_sum_multipliers.first, m_sum_multipliers.second);
|
||||
}
|
||||
return fmt::format("<{} + (value x {})>", m_ts.print(), m_int);
|
||||
case Kind::OBJECT_NEW_METHOD:
|
||||
return fmt::format("<(object-new) for {}>", m_ts.print());
|
||||
@@ -56,12 +60,17 @@ std::string TP_Type::print() const {
|
||||
return fmt::format("<integer {} + {}>", m_int, m_ts.print());
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR_MULT:
|
||||
return fmt::format("<integer {} + ({} x {})>", m_int, m_extra_multiplier, m_ts.print());
|
||||
case Kind::PRODUCT_SUM:
|
||||
return fmt::format("<integer {} + (value x {}) + (value x {})>", m_sum_constant, m_int,
|
||||
m_extra_multiplier);
|
||||
case Kind::DYNAMIC_METHOD_ACCESS:
|
||||
return fmt::format("<dynamic-method-access>");
|
||||
case Kind::VIRTUAL_METHOD:
|
||||
return fmt::format("<vmethod {}>", m_ts.print());
|
||||
return fmt::format("<vmethod({}:{}) {}>", m_method_id,
|
||||
m_method_name.empty() ? "?" : m_method_name, m_ts.print());
|
||||
case Kind::NON_VIRTUAL_METHOD:
|
||||
return fmt::format("<method {}>", m_ts.print());
|
||||
return fmt::format("<method({}:{}) {}>", m_method_id,
|
||||
m_method_name.empty() ? "?" : m_method_name, m_ts.print());
|
||||
case Kind::LEFT_SHIFTED_BITFIELD:
|
||||
if (m_pcpyud) {
|
||||
return fmt::format("(<{}> << {}) :u", m_ts.print(), m_int);
|
||||
@@ -100,7 +109,8 @@ bool TP_Type::operator==(const TP_Type& other) const {
|
||||
|
||||
switch (kind) {
|
||||
case Kind::TYPESPEC:
|
||||
return m_ts == other.m_ts;
|
||||
return m_ts == other.m_ts && m_field_origin_type == other.m_field_origin_type &&
|
||||
m_field_origin_offset == other.m_field_origin_offset;
|
||||
case Kind::TYPE_OF_TYPE_OR_CHILD:
|
||||
return m_ts == other.m_ts;
|
||||
case Kind::TYPE_OF_TYPE_NO_VIRTUAL:
|
||||
@@ -116,7 +126,8 @@ bool TP_Type::operator==(const TP_Type& other) const {
|
||||
case Kind::PRODUCT_WITH_CONSTANT:
|
||||
return m_int == other.m_int;
|
||||
case Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT:
|
||||
return m_ts == other.m_ts && m_int == other.m_int;
|
||||
return m_ts == other.m_ts && m_int == other.m_int &&
|
||||
m_sum_multipliers == other.m_sum_multipliers && m_sum_constant == other.m_sum_constant;
|
||||
case Kind::OBJECT_NEW_METHOD:
|
||||
return m_ts == other.m_ts;
|
||||
case Kind::NON_OBJECT_NEW_METHOD:
|
||||
@@ -135,6 +146,10 @@ bool TP_Type::operator==(const TP_Type& other) const {
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR_MULT:
|
||||
return m_int == other.m_int && m_ts == other.m_ts &&
|
||||
m_extra_multiplier == other.m_extra_multiplier;
|
||||
case Kind::PRODUCT_SUM:
|
||||
return m_int == other.m_int && m_ts == other.m_ts &&
|
||||
m_extra_multiplier == other.m_extra_multiplier &&
|
||||
m_sum_constant == other.m_sum_constant;
|
||||
case Kind::LEFT_SHIFTED_BITFIELD:
|
||||
return m_int == other.m_int && m_ts == other.m_ts && m_pcpyud == other.m_pcpyud;
|
||||
case Kind::PCPYUD_BITFIELD:
|
||||
@@ -194,6 +209,7 @@ TypeSpec TP_Type::typespec() const {
|
||||
case Kind::INTEGER_CONSTANT:
|
||||
return TypeSpec("int");
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR_MULT:
|
||||
case Kind::PRODUCT_SUM:
|
||||
return m_ts;
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR:
|
||||
return m_method_from_type;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "common/type_system/TypeSpec.h"
|
||||
@@ -32,6 +33,7 @@ class TP_Type {
|
||||
INTEGER_CONSTANT, // a constant integer.
|
||||
INTEGER_CONSTANT_PLUS_VAR, // constant + variable. for dynamic addr of
|
||||
INTEGER_CONSTANT_PLUS_VAR_MULT, // like var + 100 + 12 * var2
|
||||
PRODUCT_SUM, // constant + (val * multiplier) + (val2 * multiplier2)
|
||||
DYNAMIC_METHOD_ACCESS, // partial access into a
|
||||
VIRTUAL_METHOD,
|
||||
NON_VIRTUAL_METHOD,
|
||||
@@ -68,6 +70,7 @@ class TP_Type {
|
||||
case Kind::INTEGER_CONSTANT:
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR:
|
||||
case Kind::INTEGER_CONSTANT_PLUS_VAR_MULT:
|
||||
case Kind::PRODUCT_SUM:
|
||||
case Kind::VIRTUAL_METHOD:
|
||||
case Kind::NON_VIRTUAL_METHOD:
|
||||
case Kind::LEFT_SHIFTED_BITFIELD:
|
||||
@@ -134,23 +137,27 @@ class TP_Type {
|
||||
|
||||
static TP_Type make_virtual_method(const TypeSpec& method_type,
|
||||
const TypeSpec& obj_type,
|
||||
int method_id) {
|
||||
int method_id,
|
||||
const std::string& method_name = {}) {
|
||||
TP_Type result;
|
||||
result.kind = Kind::VIRTUAL_METHOD;
|
||||
result.m_ts = method_type;
|
||||
result.m_method_from_type = obj_type;
|
||||
result.m_method_id = method_id;
|
||||
result.m_method_name = method_name;
|
||||
return result;
|
||||
}
|
||||
|
||||
static TP_Type make_non_virtual_method(const TypeSpec& method_type,
|
||||
const TypeSpec& obj_type,
|
||||
int method_id) {
|
||||
int method_id,
|
||||
const std::string& method_name = {}) {
|
||||
TP_Type result;
|
||||
result.kind = Kind::NON_VIRTUAL_METHOD;
|
||||
result.m_method_from_type = obj_type;
|
||||
result.m_ts = method_type;
|
||||
result.m_method_id = method_id;
|
||||
result.m_method_name = method_name;
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -231,6 +238,19 @@ class TP_Type {
|
||||
return result;
|
||||
}
|
||||
|
||||
static TP_Type make_from_product_sum(int64_t multiplier,
|
||||
int64_t multiplier2,
|
||||
const TypeSpec& ts,
|
||||
int64_t constant = 0) {
|
||||
TP_Type result;
|
||||
result.kind = Kind::PRODUCT_SUM;
|
||||
result.m_int = multiplier;
|
||||
result.m_extra_multiplier = multiplier2;
|
||||
result.m_ts = ts;
|
||||
result.m_sum_constant = constant;
|
||||
return result;
|
||||
}
|
||||
|
||||
static TP_Type make_partial_dyanmic_vtable_access() {
|
||||
TP_Type result;
|
||||
result.kind = Kind::DYNAMIC_METHOD_ACCESS;
|
||||
@@ -264,6 +284,20 @@ class TP_Type {
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
* obj + constant + (val * multiplier) + (val2 * multiplier2), 2d array access
|
||||
*/
|
||||
static TP_Type make_object_plus_product_sum(const TypeSpec& ts,
|
||||
int64_t multiplier,
|
||||
int64_t multiplier2,
|
||||
int64_t constant,
|
||||
bool flipped) {
|
||||
TP_Type result = make_object_plus_product(ts, 1, flipped);
|
||||
result.m_sum_multipliers = {multiplier, multiplier2};
|
||||
result.m_sum_constant = constant;
|
||||
return result;
|
||||
}
|
||||
|
||||
static TP_Type make_from_left_shift_bitfield(const TypeSpec& ts, int amount, bool pcpyud) {
|
||||
TP_Type result;
|
||||
result.kind = Kind::LEFT_SHIFTED_BITFIELD;
|
||||
@@ -371,6 +405,42 @@ class TP_Type {
|
||||
return m_extra_multiplier;
|
||||
}
|
||||
|
||||
std::pair<int64_t, int64_t> get_product_sum_multipliers() const {
|
||||
ASSERT(kind == Kind::PRODUCT_SUM);
|
||||
return {m_int, m_extra_multiplier};
|
||||
}
|
||||
|
||||
bool has_sum_multipliers() const {
|
||||
return kind == Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT && m_sum_multipliers.first;
|
||||
}
|
||||
|
||||
const std::pair<int64_t, int64_t>& get_sum_multipliers() const {
|
||||
ASSERT(has_sum_multipliers());
|
||||
return m_sum_multipliers;
|
||||
}
|
||||
|
||||
void set_field_origin(const TypeSpec& base_type, int offset) {
|
||||
ASSERT(kind == Kind::TYPESPEC);
|
||||
m_field_origin_type = base_type;
|
||||
m_field_origin_offset = offset;
|
||||
}
|
||||
|
||||
bool has_field_origin() const {
|
||||
return kind == Kind::TYPESPEC && m_field_origin_type != TypeSpec();
|
||||
}
|
||||
|
||||
const TypeSpec& field_origin_type() const { return m_field_origin_type; }
|
||||
int field_origin_offset() const { return m_field_origin_offset; }
|
||||
|
||||
int64_t get_sum_constant() const {
|
||||
ASSERT(kind == Kind::PRODUCT_SUM || has_sum_multipliers());
|
||||
return m_sum_constant;
|
||||
}
|
||||
|
||||
bool is_plain_product_plus_obj() const {
|
||||
return kind == Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT && !m_sum_constant;
|
||||
}
|
||||
|
||||
int get_left_shift() const {
|
||||
ASSERT(kind == Kind::LEFT_SHIFTED_BITFIELD);
|
||||
return m_int;
|
||||
@@ -402,6 +472,8 @@ class TP_Type {
|
||||
return m_method_id;
|
||||
}
|
||||
|
||||
const std::string& method_name() const { return m_method_name; }
|
||||
|
||||
bool flipped_add_order() const {
|
||||
ASSERT(kind == Kind::OBJECT_PLUS_PRODUCT_WITH_CONSTANT);
|
||||
return m_flipped_order;
|
||||
@@ -416,12 +488,17 @@ class TP_Type {
|
||||
TypeSpec m_ts;
|
||||
TypeSpec m_method_from_type; // hack, also stores sum type.
|
||||
int m_method_id = -1;
|
||||
std::string m_method_name;
|
||||
std::string m_str;
|
||||
int64_t m_int = 0;
|
||||
bool m_pcpyud = false; // have we extracted the top doubleword of a bitfield?
|
||||
bool m_flipped_order = false;
|
||||
|
||||
int64_t m_extra_multiplier = 0;
|
||||
std::pair<int64_t, int64_t> m_sum_multipliers = {0, 0};
|
||||
int64_t m_sum_constant = 0;
|
||||
TypeSpec m_field_origin_type;
|
||||
int m_field_origin_offset = 0;
|
||||
};
|
||||
|
||||
class TypeState {
|
||||
|
||||
@@ -1073,6 +1073,8 @@ const std::unordered_map<
|
||||
}},
|
||||
{GameVersion::JakX,
|
||||
{
|
||||
{"actor-hash-bucket",
|
||||
{{"data", ArrayFieldDecompMeta(TypeSpec("actor-cshape-ptr"), 16)}}},
|
||||
{"ocean-near-indices",
|
||||
{{"data", ArrayFieldDecompMeta(TypeSpec("ocean-near-index"), 32)}}},
|
||||
{"ocean-mid-masks", {{"data", ArrayFieldDecompMeta(TypeSpec("ocean-mid-mask"), 8)}}},
|
||||
@@ -1082,6 +1084,8 @@ const std::unordered_map<
|
||||
{{"init-specs", ArrayFieldDecompMeta(TypeSpec("sp-field-init-spec"), 16)}}},
|
||||
{"sparticle-launch-group",
|
||||
{{"launcher", ArrayFieldDecompMeta(TypeSpec("sparticle-group-item"), 32)}}},
|
||||
{"simple-sprite-system",
|
||||
{{"data", ArrayFieldDecompMeta(TypeSpec("sprite-glow-data"), 64)}}},
|
||||
{"continue-point",
|
||||
{{"want", ArrayFieldDecompMeta(TypeSpec("level-buffer-state-small"), 8)}}},
|
||||
{"vehicle-sound-info",
|
||||
@@ -1104,6 +1108,16 @@ const std::unordered_map<
|
||||
{
|
||||
{"local-pos-array", ArrayFieldDecompMeta(TypeSpec("vector"), 16)},
|
||||
}},
|
||||
{"attackable-hash",
|
||||
{
|
||||
{"procs", ArrayFieldDecompMeta(TypeSpec("handle"),
|
||||
8,
|
||||
ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)},
|
||||
{"trans", ArrayFieldDecompMeta(TypeSpec("vector"), 16)},
|
||||
{"masks", ArrayFieldDecompMeta(TypeSpec("uint32"),
|
||||
4,
|
||||
ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)},
|
||||
}},
|
||||
}}};
|
||||
|
||||
goos::Object decompile_structure(const TypeSpec& type,
|
||||
|
||||
@@ -47,7 +47,7 @@ The decompiler will output code and other data intended to be inspected by human
|
||||
|
||||
You must have a copy of the PS2 game and place all files from the DVD inside a folder corresponding to the game within `iso_data` folder (`jak1` for Jak 1 Black Label, etc.), as seen in this picture:
|
||||
|
||||

|
||||

|
||||
|
||||
The decompiler will extract assets to the `assets` folder. These assets will be used by the compiler when building the port, and you may want to turn asset extraction off after running it once.
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
"0115": "<FLAG_ITALIAN> Italiano",
|
||||
"0116": "<FLAG_KOREA> <LANGUAGE_KOREAN>",
|
||||
"0117": "<FLAG_JAPAN> にほんご",
|
||||
"0118": "Proporcje ekranu",
|
||||
"0118": "Proporcje Ekranu",
|
||||
"0119": "Progressive Scan",
|
||||
"011a": "Tryb Wideo",
|
||||
"011b": "Ustawienia Gry",
|
||||
@@ -137,8 +137,8 @@
|
||||
"0187": "Chcesz zagrać jeszcze raz?",
|
||||
"0188": "Zadanie Wykonane",
|
||||
"0189": "Misja Nieudana",
|
||||
"018a": "Jeszcze raz?",
|
||||
"018b": "Ekran teraz zmieni się na 60Hz",
|
||||
"018a": "Spróbować ponownie?",
|
||||
"018b": "Ekran zmieni się teraz na 60Hz",
|
||||
"018c": "Ekran teraz zmieni się na Progressive Scan",
|
||||
"018d": "Jeśli obraz nie jest wyświetlany prawidłowo, to znaczy że twój ekran nie wspiera tego trybu",
|
||||
"018e": "W takim wypadku proszę poczekać 10s, a ekran zmieni się z powrotem",
|
||||
@@ -154,7 +154,7 @@
|
||||
"019f": "Zapisywanie danych",
|
||||
"01a0": "Wczytywanie danych",
|
||||
"01a1": "Formatowanie",
|
||||
"01a2": "Tworzenie zapisanego stanu rozgrywki",
|
||||
"01a2": "Tworzenie zapisu stanu rozgrywki",
|
||||
"01a4": "Stan rozgrywki Jak II już istnieje w wybranym zapisie",
|
||||
"01a5": "Czy chcesz nadpisać ten zapis?",
|
||||
"01a6": "Sformatować?",
|
||||
@@ -288,10 +288,10 @@
|
||||
"022b": "Wciśnij <PAD_R1> aby strzelać",
|
||||
"022c": "<PAD_DPAD_UP> chowa broń",
|
||||
"022d": "<PAD_DPAD_UP> lub <PAD_R1> wyciąga broń",
|
||||
"022e": "Wciśnij <PAD_> aby zacząć trening ze Strzelbą?",
|
||||
"022e": "Wciśnij <PAD_> aby zacząć trening ze Strzelbą",
|
||||
"022f": "<PAD_> = trening ze Strzelbą~%<PAD_SQUARE> = trening Furii Wulkanu",
|
||||
"0230": "Wciśnij <PAD_DPAD_DOWN> aby zmienić broń",
|
||||
"0231": "Wciśnij <PAD_> aby zacząć trening ze Zmiataczem?",
|
||||
"0231": "Wciśnij <PAD_> aby zacząć trening ze Zmiataczem",
|
||||
"0232": "<PAD_> = trening ze Zmiataczem~%<PAD_SQUARE> = trening z Rozjemcą",
|
||||
"0233": "Kopnij cel a potem wciśnij <PAD_R1> aby wykonać szybką kombinację strzałów",
|
||||
"0234": "Strzelaj w skrzynie",
|
||||
@@ -515,4 +515,4 @@
|
||||
"030e": "Napisy Wyłączone",
|
||||
"030f": "Deska Odrzutowa",
|
||||
"0310": "Kontynuuj"
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@
|
||||
(file-json 0 jak3 "common" '("game/assets/jak3/text/game_custom_text_en-US.json"))
|
||||
(file-json 1 jak3 "common" '("game/assets/jak3/text/game_custom_text_fr-FR.json" "game/assets/jak3/text/game_base_text_fr-FR.json"))
|
||||
(file-json 2 jak3 "common" '("game/assets/jak3/text/game_custom_text_de-DE.json"))
|
||||
(file-json 3 jak2 "common" '("game/assets/jak3/text/game_custom_text_es-ES.json"))
|
||||
(file-json 3 jak3 "common" '("game/assets/jak3/text/game_custom_text_es-ES.json"))
|
||||
(file-json 4 jak3 "common" '("game/assets/jak3/text/game_custom_text_it-IT.json"))
|
||||
;; 5 is commentary
|
||||
(file-json 6 jak3 "common" '("game/assets/jak3/text/game_custom_text_ja-JP.json"))
|
||||
@@ -24,16 +24,16 @@
|
||||
(file-json 11 jak3 "common" '("game/assets/jak3/text/game_custom_text_en-GB.json"))
|
||||
;; custom languages
|
||||
(file-json 12 jak3 "common" '("game/assets/jak3/text/game_custom_text_fi-FI.json" "game/assets/jak3/text/game_base_text_fi-FI.json"))
|
||||
(file-json 13 jak3 "common" '("game/assets/jak2/text/game_custom_text_sv-SE.json"))
|
||||
(file-json 14 jak3 "common" '("game/assets/jak2/text/game_custom_text_da-DK.json"))
|
||||
(file-json 15 jak3 "common" '("game/assets/jak2/text/game_custom_text_no-NO.json"))
|
||||
(file-json 16 jak3 "common" '("game/assets/jak2/text/game_custom_text_pt-BR.json"))
|
||||
(file-json 17 jak3 "common" '("game/assets/jak2/text/game_custom_text_hu-HU.json"))
|
||||
(file-json 18 jak3 "common" '("game/assets/jak2/text/game_custom_text_ca-ES.json"))
|
||||
(file-json 19 jak3 "common" '("game/assets/jak2/text/game_custom_text_is-IS.json"))
|
||||
(file-json 20 jak3 "common" '("game/assets/jak2/text/game_custom_text_pl-PL.json"))
|
||||
(file-json 21 jak3 "common" '("game/assets/jak2/text/game_custom_text_lt-LT.json"))
|
||||
(file-json 22 jak3 "common" '("game/assets/jak2/text/game_custom_text_cs-CZ.json"))
|
||||
(file-json 23 jak3 "common" '("game/assets/jak2/text/game_custom_text_hr-HR.json"))
|
||||
(file-json 24 jak3 "common" '("game/assets/jak2/text/game_custom_text_gl-ES.json"))
|
||||
(file-json 13 jak3 "common" '("game/assets/jak3/text/game_custom_text_sv-SE.json"))
|
||||
(file-json 14 jak3 "common" '("game/assets/jak3/text/game_custom_text_da-DK.json"))
|
||||
(file-json 15 jak3 "common" '("game/assets/jak3/text/game_custom_text_no-NO.json"))
|
||||
(file-json 16 jak3 "common" '("game/assets/jak3/text/game_custom_text_pt-BR.json"))
|
||||
(file-json 17 jak3 "common" '("game/assets/jak3/text/game_custom_text_hu-HU.json"))
|
||||
(file-json 18 jak3 "common" '("game/assets/jak3/text/game_custom_text_ca-ES.json"))
|
||||
(file-json 19 jak3 "common" '("game/assets/jak3/text/game_custom_text_is-IS.json"))
|
||||
(file-json 20 jak3 "common" '("game/assets/jak3/text/game_custom_text_pl-PL.json" "game/assets/jak3/text/game_base_text_pl-PL.json"))
|
||||
(file-json 21 jak3 "common" '("game/assets/jak3/text/game_custom_text_lt-LT.json"))
|
||||
(file-json 22 jak3 "common" '("game/assets/jak3/text/game_custom_text_cs-CZ.json"))
|
||||
(file-json 23 jak3 "common" '("game/assets/jak3/text/game_custom_text_hr-HR.json"))
|
||||
(file-json 24 jak3 "common" '("game/assets/jak3/text/game_custom_text_gl-ES.json"))
|
||||
)
|
||||
@@ -0,0 +1,891 @@
|
||||
{
|
||||
"0001": "Wyjdź",
|
||||
"0002": "Pauza~",
|
||||
"0003": "Język Napisów",
|
||||
"0004": "Tryb Dźwięku",
|
||||
"0005": "Mono",
|
||||
"0006": "Stereo",
|
||||
"0007": "Surround",
|
||||
"0008": "Głośność Efektów",
|
||||
"0009": "Głośność Muzyki",
|
||||
"000a": "Głośność Dialogów",
|
||||
"000b": "Język",
|
||||
"000c": "Wibracje",
|
||||
"000d": "Wskazówki Podczas Rozgrywki",
|
||||
"000e": "Wyśrodkuj Ekran",
|
||||
"000f": "Wł",
|
||||
"0010": "Wył",
|
||||
"0011": "Ruszaj Przyciskiem Kierunkowym",
|
||||
"0012": "<FLAG_USA> English",
|
||||
"0013": "<FLAG_FRANCE> Français",
|
||||
"0014": "<FLAG_GERMAN> Deutsch",
|
||||
"0015": "<FLAG_SPAIN> Español",
|
||||
"0016": "<FLAG_ITALIAN> Italiano",
|
||||
"0017": "<FLAG_KOREA> <LANGUAGE_KOREAN>",
|
||||
"0018": "<FLAG_JAPAN> にほんご",
|
||||
"0019": "Proporcje Ekranu",
|
||||
"001a": "Progressive Scan",
|
||||
"001b": "Tryb Wideo",
|
||||
"001c": "Ustawienia Gry",
|
||||
"001d": "Ustawienia Grafiki",
|
||||
"001e": "Ustawienia Dźwięku",
|
||||
"001f": "4:3",
|
||||
"0020": "16:9",
|
||||
"0021": "60Hz",
|
||||
"0022": "50Hz",
|
||||
"0023": "Jak 3",
|
||||
"0024": "Wyjdź z Demo",
|
||||
"0025": "Tak",
|
||||
"0026": "Nie",
|
||||
"0027": "Wstecz",
|
||||
"0028": "OK",
|
||||
"0029": "Następny",
|
||||
"002a": "Poprzedni",
|
||||
"002b": "Kontynuuj bez zapisywania",
|
||||
"002c": "Wybierz plik do zapisu",
|
||||
"002d": "Wybierz plik do wczytania",
|
||||
"002e": "Wczytaj Grę",
|
||||
"002f": "Zapisz Grę",
|
||||
"0030": "Puste",
|
||||
"0031": "Ustawienia",
|
||||
"0032": "Nowa Gra",
|
||||
"0033": "Wciśnij przycisk START",
|
||||
"0034": "Wyjdź z Gry",
|
||||
"0035": "Pokaż Mapę",
|
||||
"0036": "Wybierz Start",
|
||||
"0037": "Rekordy",
|
||||
"0038": "1. Miejsce",
|
||||
"0039": "2. Miejsce",
|
||||
"003a": "3. Miejsce",
|
||||
"003b": "4. Miejsce",
|
||||
"003c": "5. Miejsce",
|
||||
"003d": "6. Miejsce",
|
||||
"003e": "7. Miejsce",
|
||||
"003f": "8. Miejsce",
|
||||
"0040": "Kierowca NYFE",
|
||||
"0041": "Klasa 1",
|
||||
"0042": "Klasa 2",
|
||||
"0043": "Klasa 3",
|
||||
"0044": "Kurs Strzelecki",
|
||||
"0049": "Gra Onin",
|
||||
"004a": "Metalołbowa Miazga",
|
||||
"004b": "Gra Deski Odrzutowej",
|
||||
"004c": "Namiot Onin",
|
||||
"004d": "Knajpa Wypasiony Wieprz",
|
||||
"0052": "Wyścig w Porcie",
|
||||
"0053": "Wyścig w Mieście",
|
||||
"0054": "Sekrety",
|
||||
"0055": "Odblokowane",
|
||||
"0056": "Przełącz bródkę Jaka",
|
||||
"0057": "Lustrzane odbicie Świata",
|
||||
"0058": "Nieskończona Amunicja",
|
||||
"0059": "Nieśmiertelność",
|
||||
"005a": "Tryb Bohatera",
|
||||
"005b": "Odtw. Scen Akt 1",
|
||||
"005c": "Odtw. Scen Akt 2",
|
||||
"005d": "Odtw. Scen Akt 3",
|
||||
"005e": "Album z Wycinkami",
|
||||
"005f": "Wielki Album z Wycinkami",
|
||||
"0060": "Album z Wycinkami 3",
|
||||
"0061": "Wybór Poziomu",
|
||||
"0062": "Nieskończony Mroczny Jak",
|
||||
"0063": "Kurs Furii Wulkanu",
|
||||
"0065": "Odwrócone Wyścigi",
|
||||
"0066": "Tryb Wielkiej Głowy",
|
||||
"0067": "Tryb Małej Głowy",
|
||||
"0068": "Dostępne",
|
||||
"0069": "Zebrane",
|
||||
"006a": "Misje",
|
||||
"006b": "Wybierz Pre-Start",
|
||||
"006c": "Misje Demo",
|
||||
"006d": "Wybierz Scenę",
|
||||
"006e": "Napisy",
|
||||
"006f": "Powtórz Misję",
|
||||
"0072": "Brak",
|
||||
"0073": "Gra",
|
||||
"0074": "Powtórz/Wyjdź",
|
||||
"0075": "Kup",
|
||||
"0076": "Wygrana",
|
||||
"0077": "Przegrana",
|
||||
"0078": "Całk. czas",
|
||||
"0079": "Okrążenie",
|
||||
"007a": "Wciśnij <PAD_SQUARE> aby zresetować",
|
||||
"007b": "Zajęty",
|
||||
"007c": "Wciśnij <PAD_X> aby kontynuować",
|
||||
"007d": "____~%Misji Ukończonych",
|
||||
"007e": "Misje w Trakcie",
|
||||
"007f": "Powtórzyć?",
|
||||
"0080": "Sekret Dostępny na Ekranie Tytułowym",
|
||||
"0081": "<PAD_X> = Tak, <PAD_TRIANGLE> = Nie",
|
||||
"0082": "Wciśnij <PAD_TRIANGLE> żeby porozmawiać.",
|
||||
"0083": "Wciśnij <PAD_TRIANGLE> żeby użyć.",
|
||||
"0084": "Wciśnij <PAD_TRIANGLE> żeby się przenieść.",
|
||||
"0085": "Użyj Przycisków Kierunkowych, aby wybrać poziom.",
|
||||
"0086": "Wciśnij <PAD_TRIANGLE> aby wyjść.",
|
||||
"0087": "Wciśnij <PAD_TRIANGLE> żeby zagrać.",
|
||||
"0088": "Chcesz zagrać jeszcze raz?",
|
||||
"0089": "Zadanie Wykonane",
|
||||
"008a": "Misja Nieudana",
|
||||
"008b": "Spróbować ponownie?",
|
||||
"008c": "Ekran zmieni się teraz na 60Hz",
|
||||
"008d": "Ekran zmieni się teraz na Progressive Scan",
|
||||
"008e": "Jeśli obraz nie jest wyświetlany prawidłowo, to znaczy że twój ekran nie wspiera tego trybu",
|
||||
"008f": "W takim wypadku proszę poczekać 10s, a ekran zmieni się z powrotem",
|
||||
"0090": "Ekran jest teraz w trybie 60hz",
|
||||
"0091": "Ekran jest teraz w trybie Progressive Scan",
|
||||
"0092": "Czy chcesz zachować ten tryb?",
|
||||
"0093": "Płyta została usunięta",
|
||||
"0094": "Proszę włożyć płytę Jak 3 aby kontynuować rozgrywkę",
|
||||
"0095": "Błąd podczas odczytu danych",
|
||||
"0096": "Proszę sprawdzić płytę Jak 3 i spróbować ponownie",
|
||||
"0097": "Czy na pewno chcesz wyjść?",
|
||||
"0098": "Czy chcesz rozpocząć rozgrywkę?",
|
||||
"00a0": "Zapisywanie danych",
|
||||
"00a1": "Wczytywanie danych",
|
||||
"00a2": "Formatowanie",
|
||||
"00a3": "Tworzenie zapisu stanu rozgrywki",
|
||||
"00a5": "Stan rozgrywki Jak 3 już istnieje w wybranym zapisie",
|
||||
"00a6": "Czy chcesz nadpisać ten zapis?",
|
||||
"00a7": "Sformatować?",
|
||||
"00a8": "Kontynuować?",
|
||||
"00a9": "Wrócić?",
|
||||
"00aa": "Błąd podczas wczytywania",
|
||||
"00ab": "Błąd podczas zapisywania",
|
||||
"00ac": "Błąd podczas formatowania",
|
||||
"00ad": "Błąd podczas tworzenia nowego zapisu",
|
||||
"00b1": "Autozapis został wyłączony",
|
||||
"00b2": "Użyj opcji zapisu gry aby ręcznie zapisać grę i włączyć funkcję Autozapisu",
|
||||
"00b4": "Czy chciałbyś utworzyć zapisany stan Jak II?",
|
||||
"00b5": "Gdy pojawi się następująca ikona, twój postęp jest zapisywany",
|
||||
"012c": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby strzelać",
|
||||
"012d": "<PAD_DPAD_UP> chowa broń",
|
||||
"012e": "<PAD_DPAD_UP> lub ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H wyciąga broń",
|
||||
"012f": "Wciśnij <PAD_X> aby zacząć trening ze Strzelbą",
|
||||
"0130": "<PAD_X> = trening ze Strzelbą~%<PAD_SQUARE> = trening Furii Wulkanu",
|
||||
"0131": "Wciśnij <PAD_DPAD_DOWN> aby zmienić broń",
|
||||
"0132": "Wciśnij <PAD_X> aby zacząć trening ze Zmiataczem",
|
||||
"0134": "Kopnij cel a potem wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby wykonać szybką kombinację strzałów",
|
||||
"0135": "Strzelaj w skrzynie",
|
||||
"0136": "Cel",
|
||||
"0137": "Złoto",
|
||||
"0138": "Srebro",
|
||||
"0139": "Brąz",
|
||||
"013a": "Wciśnij ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H aby wejść na deskę",
|
||||
"013b": "Skok : wciśnij <PAD_X>",
|
||||
"013c": "Skok w kuckach : wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H potem <PAD_X>",
|
||||
"013d": "Doładowany skok : wciśnij <PAD_X> tuż po wylądowaniu ze skoku",
|
||||
"013e": "Grind : wciśnij <PAD_SQUARE> i <PAD_ANALOG_ANY> na Desce",
|
||||
"013f": "Obrót : wciśnij <PAD_X> potem ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H i <PAD_ANALOG_LEFT_RIGHT>",
|
||||
"0140": "Flip : wciśnij <PAD_X> potem ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H i <PAD_ANALOG_UP_DOWN>",
|
||||
"0141": "Trik : wciśnij <PAD_X> potem ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H i <PAD_ANALOG_ANY>",
|
||||
"0142": "Grind z przejściem w Trik z powrotem w Grind dają dużą ilość punktów",
|
||||
"0143": "Aktywuj sędziego aby rozpocząć wyzwanie",
|
||||
"0144": "Spróbuj ponownie!",
|
||||
"0145": "Wróć do garażu",
|
||||
"0147": "Wciśnij ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H aby zmienić poziom unoszenia się nad ziemią",
|
||||
"0155": "Sony Computer Entertainment America~%przedstawia",
|
||||
"0156": "Sony Computer Entertainment Europe~%przedstawia",
|
||||
"0157": "Sony Computer Entertainment Korea~%przedstawia",
|
||||
"0158": "Sony Computer Entertainment Inc.~%przedstawia",
|
||||
"01b8": "Pustkowie Express",
|
||||
"0207": "<ICON_MISSION_COMPLETE>",
|
||||
"0208": "<ICON_MISSION_TODO>",
|
||||
"0209": "<FLAG_UK> English",
|
||||
"020a": "Wciśnij <PAD_SQUARE> Aby Przełączać Widoczność Napisów",
|
||||
"020b": "Napisy Włączone",
|
||||
"020c": "Napisy Wyłączone",
|
||||
"020d": "Deska Odrzutowa",
|
||||
"020e": "Kontynuuj",
|
||||
"03bf": "Strzelba",
|
||||
"03c0": "Zmiatacz",
|
||||
"03c1": "Furia Wulkanu",
|
||||
"03c2": "Rozjemca",
|
||||
"03c3": "Stadion",
|
||||
"03c4": "Klasa 1 - Odwrócona",
|
||||
"03c5": "Klasa 2 - Odwrócona",
|
||||
"03c6": "Klasa 3 - Odwrócona",
|
||||
"03c7": "Kurs Rozjemcy",
|
||||
"03c8": "<ICON_MISSION_TODO>",
|
||||
"03c9": "<ICON_MISSION_COMPLETE>",
|
||||
"03d1": "<PAD_X> = trening ze Zmiataczem~%<PAD_SQUARE> = trening z Rozjemcą",
|
||||
"0408": "Wciśnij <PAD_X> aby skoczyć",
|
||||
"0409": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H podczas ruchu, aby wykonać przewrót",
|
||||
"040a": "Wciśnij <PAD_X> potem <PAD_X> ponownie w powietrzu",
|
||||
"040b": "Wciśnij <PAD_SQUARE> lub <PAD_CIRCLE> aby zaatakować",
|
||||
"040c": "Wykonaj przewrót (~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H+ <PAD_ANALOG_ANY>, a potem wciśnij <PAD_X> żeby wykonać daleki skok",
|
||||
"040d": "Podskocz i wciśnij <PAD_SQUARE> w powietrzu",
|
||||
"040e": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H potem wciśnij <PAD_X> żeby wykonać wyższy skok",
|
||||
"0443": "Zbadaj Kopalnię Eco",
|
||||
"0444": "Eskortuj Pociąg z Bombą",
|
||||
"0445": "Aktywuj Astro-skop w Lesie",
|
||||
"0446": "Ukończ Trening na Arenie",
|
||||
"0447": "Zdobądź 1-szy Amulet Wojenny",
|
||||
"0448": "Złap Kango-szczury",
|
||||
"0449": "Znajdź Przełącznik w Kanałach",
|
||||
"044b": "Wyścig po Artefakty",
|
||||
"044c": "Zniszcz Obronę Fabryki Wojennej",
|
||||
"044d": "Zniszcz Jaja w Gnieździe",
|
||||
"044e": "Zniszcz Barierę Strzel-botem",
|
||||
"044f": "Wciśnij <PAD_CIRCLE> aby zostawić szlak zielonego eco",
|
||||
"0450": "Wciśnij <PAD_CIRCLE> aby kopnąć z półobrotu",
|
||||
"0451": "Wciśnij <PAD_SQUARE> aby użyć pięści do ataku",
|
||||
"0452": "Podczas pływania, wciśnij i przytrzymaj <PAD_CIRCLE> aby się zanurzyć",
|
||||
"0453": "Odblokuj Satelitę",
|
||||
"0454": "Pokonaj Kleivera w Wyścigu na Pustyni",
|
||||
"0456": "Zniszcz Metalowe Bestie",
|
||||
"0457": "Zdobądź 2-gi Amulet Wojenny",
|
||||
"0458": "Pokonaj Maruderów na Arenie",
|
||||
"0459": "Zgromadź Dzikie Skoczki",
|
||||
"045a": "Uratuj Mieszkańców Pustkowia",
|
||||
"045b": "Ukończ Wyzwanie Wieżyczki",
|
||||
"045c": "Wdrap się na Wieżę Świątyni Mnichów",
|
||||
"045d": "Znajdź Wyrocznię w Świątyni Mnichów",
|
||||
"045e": "Ukończ Próby Świątyni Mnichów",
|
||||
"045f": "Poleć do Wulkanu",
|
||||
"0460": "Znajdź Satelitę w Wulkanie",
|
||||
"0461": "Obroń Ashelin w Oazie",
|
||||
"0462": "Pokonaj Robota Prekursorów Vegera",
|
||||
"0463": "Pokonaj Mnichów w Wyścigu Skoczków",
|
||||
"0464": "Przejedź Podziemnymi Torami w Katakumbach",
|
||||
"0465": "Użyj przycisków <PAD_X> <PAD_SQUARE> <PAD_CIRCLE> i <PAD_TRIANGLE> aby zniszczyć symbole",
|
||||
"0466": "Wciśnij <PAD_TRIANGLE> aby zsiąść ze Skoczka",
|
||||
"0467": "Wciśnij <PAD_SQUARE> aby wykonać szarżę",
|
||||
"0468": "Wciśnij <PAD_SQUARE> aby zawrócić",
|
||||
"0469": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby wystrzelić z broni pojazdu",
|
||||
"046a": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H aby podskoczyć pojazdem",
|
||||
"046b": "Strzel w cele aby obniżyć tory",
|
||||
"053d": "Strzel w most aby go obniżyć",
|
||||
"053e": "Wciśnij ~Y~3L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~3L~+32H<PAD_PART_DPAD_R>~Z~+56H kilkukrotnie kierunek aby zmienić tryby broni",
|
||||
"0546": "Pudło",
|
||||
"0547": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H aby wystrzelić bombę",
|
||||
"0548": "Obejrzyj Introdukcję",
|
||||
"0549": "Dotrzyj do Portu przez Kanały",
|
||||
"054a": "Zniszcz Nadchodzące Strzel-boty",
|
||||
"054b": "Zniszcz Barierę Pociskiem",
|
||||
"054c": "Ukończ Kurs Strzelecki 1",
|
||||
"054d": "Zniszcz Armaty Snajperskie",
|
||||
"054e": "Dotrzyj do Obszaru z Metalowymi Łbami przez Kanały",
|
||||
"054f": "Zniszcz Zbiorniki Mrocznego Eco",
|
||||
"0550": "Zabij Mroczne Rośliny w Lesie",
|
||||
"0551": "Zniszcz Sieć Eco z Jinx",
|
||||
"0552": "Przejmij Pojazd Eco",
|
||||
"0553": "Obroń Port przed Atakiem",
|
||||
"0554": "Ukończ Kurs Strzelecki 2",
|
||||
"0555": "Obroń Siedzibę przed Atakiem",
|
||||
"0556": "Znajdź Szyfr w Sieci Eco",
|
||||
"0557": "Zniszcz Metalo-nogi w Gnieździe",
|
||||
"0558": "Dogoń Metalowe Bestie",
|
||||
"0559": "Obroń Główną Bramę Spargus",
|
||||
"055a": "Zniszcz Twierdzę Maruderów",
|
||||
"055b": "Wyścig po Kolejne Artefakty",
|
||||
"055c": "Ukończ Wyzwania Pierścieni Filarów",
|
||||
"055d": "Zniszcz Systemy Obronne Fabryki",
|
||||
"055e": "Pokonaj Bossa Cyber-Errola",
|
||||
"055f": "Uratuj Seema w Świątyni",
|
||||
"0562": "Obroń Spargus przed Atakiem",
|
||||
"0563": "Zniszcz Tarczę Mrocznego Statku",
|
||||
"0564": "Wyważ Drzwi Wieży",
|
||||
"0565": "Zniszcz Wieżę Metalowych Łbów",
|
||||
"0566": "Dotrzyj do Katakumb przez Ruiny Pałacu",
|
||||
"0567": "Przedrzyj Się przez Ruiny",
|
||||
"0568": "Dotrzyj do Rdzenia Prekursorów",
|
||||
"0569": "Zniszcz Mroczny Statek",
|
||||
"056a": "Zniszcz Finałowego Bossa",
|
||||
"056b": "Otrzymujesz~%<COLOR_YELLOW>Modyfikację Zmiatacza",
|
||||
"056c": "Otrzymujesz~%<COLOR_RED>Falowstrząs",
|
||||
"056d": "Otrzymujesz~%<COLOR_YELLOW>Wiązkodbijacz",
|
||||
"056e": "Strzel w Zamknięte Pierścienie aby je Aktywować",
|
||||
"056f": "Wciśnij <PAD_DPAD_UP> dwukrotnie aby wybrać Falowstrząs",
|
||||
"0570": "Introdukcja",
|
||||
"0571": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H następnie puść aby wykonać super wysoki skok",
|
||||
"0572": "Wyzwanie Wieżyczki Kleivera",
|
||||
"0573": "Twój Czas",
|
||||
"0574": "Najlepszy Czas",
|
||||
"0575": "Najlepsze Czasy",
|
||||
"0576": "Otrzymujesz Naramienniki",
|
||||
"0577": "Otrzymujesz~%<COLOR_BLUE>Furię Wulkanu",
|
||||
"0578": "Otrzymujesz~%<COLOR_YELLOW>Żyrozrywacz",
|
||||
"0579": "Otrzymujesz Nowy Pancerz",
|
||||
"057a": "Otrzymujesz Nagolenniki",
|
||||
"057b": "Otrzymujesz Napierśnik",
|
||||
"057c": "Otrzymujesz~%<COLOR_BLUE>Władcę Grzmotu",
|
||||
"057d": "Otrzymujesz~%<COLOR_BLUE>Laser Iglasty",
|
||||
"057e": "Otrzymujesz~%<COLOR_RED>Wyrzutnię Plazmitu",
|
||||
"057f": "Otrzymujesz Deskę Odrzutową",
|
||||
"0580": "Otrzymujesz~%<COLOR_PINK>Rozjemcę",
|
||||
"0581": "Otrzymujesz~%<COLOR_PINK>Inwerter Masy",
|
||||
"0582": "Otrzymujesz~%<COLOR_PINK>Supernovę",
|
||||
"0583": "Przytrzymaj <PAD_X> aby przyspieszyć",
|
||||
"0584": "Wciśnij <PAD_SQUARE> aby zahamować",
|
||||
"0585": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H żeby spojrzeć w lewo",
|
||||
"0586": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H żeby spojrzeć w prawo",
|
||||
"0587": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H żeby się obejrzeć za siebie",
|
||||
"0588": "Przytrzymaj <PAD_SQUARE> żeby wrzucić wsteczny",
|
||||
"0589": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H żeby podskoczyć",
|
||||
"058a": "Popchnij <PAD_ANALOG_LEFT_RIGHT> w bok i wciśnij <PAD_CIRCLE> aby skręcić z poślizgiem",
|
||||
"058b": "Popchnij <PAD_ANALOG_LEFT_RIGHT> w bok i wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H aby podskoczyć w miejscu",
|
||||
"058c": "Wciśnij ~Y~3L<PAD_PART_DPAD_L>~Z~22L~+17H~-13V<PAD_PART_DPAD_U>~Z~22L~+17H~+14V<PAD_PART_DPAD_D>~Z~22L~+32H<PAD_PART_DPAD_R>~Z~+56H aby wybrać Furię Wulkanu",
|
||||
"058d": "Wciśnij ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H żeby odpalić turbo przyspieszenie",
|
||||
"058e": "Niech Rozpoczną Się Igrzyska!",
|
||||
"058f": "Arena Się Rozgrzewa",
|
||||
"0590": "Jak Zdobywa Amulet Bitewny",
|
||||
"0591": "Jak Poznaje Kleivera",
|
||||
"0592": "Jak Poznaje Seema",
|
||||
"0593": "Ostrzeżenie Seema",
|
||||
"0594": "Wyzwanie Wyścigowe Kleivera",
|
||||
"0595": "Damas Wysyła Jaka po Artefakty",
|
||||
"0596": "Jak Zdobywa Pancerz",
|
||||
"0597": "Daxter Staje Się Przekąską",
|
||||
"0598": "Dzienna Gwiazda Zbliża Się",
|
||||
"0599": "Kleiver Nienawidzi Metalowych Łbów",
|
||||
"059a": "Twarz z Przeszłości",
|
||||
"059b": "Arena Czeka!",
|
||||
"059c": "Jak Imponuje Damasowi",
|
||||
"059d": "Nie Znałem Swojego Ojca",
|
||||
"059e": "Pierwsza Jaszczurka Złapana",
|
||||
"059f": "Bułka z Masłem, Skarbie!",
|
||||
"05a0": "Jak Zdobywa Kolejny Pojazd",
|
||||
"05a1": "Jak Zostaje Wysłany na Misję Ratunkową",
|
||||
"05a3": "Jak Znajduje Lotnię",
|
||||
"05a4": "Daxter Się Zawiesił",
|
||||
"05a6": "Veger Obiecuje",
|
||||
"05a7": "Wyrocznia Przemawia",
|
||||
"05a8": "Gierka z Bronią Kleivera",
|
||||
"05a9": "Jak Zdobywa Kolejny Kryształ",
|
||||
"05aa": "To Walka na Śmierć i Życie",
|
||||
"05ab": "Sig Tego Nie Zrobi",
|
||||
"05ac": "Jak i Sig Zostają Ukarani",
|
||||
"05ad": "Ashelin Chce Żeby Jak Wrócił",
|
||||
"05ae": "Mam Już Dość Ratowania Świata",
|
||||
"05af": "Pieczęć Jaka Otwiera Drzwi",
|
||||
"05b0": "Jak Zdobywa Moc Światła",
|
||||
"05b1": "Jak Znajduje Tory w Katakumbach",
|
||||
"05b2": "Kopalnia Eco Mara",
|
||||
"05b3": "Materiały Wybuchowe Gotowe",
|
||||
"05b4": "Drzwi Robią Bum!",
|
||||
"05b5": "Pokręcone Marzenia Vegera",
|
||||
"05b6": "Chłopaki Wrócili do Miasta",
|
||||
"05b7": "Samos i Keira Witają Jaka",
|
||||
"05b8": "Jak Zjeżdża Windą w Porcie",
|
||||
"05b9": "Torn jest Zaskoczony",
|
||||
"05ba": "Kaszka z Mleczkiem",
|
||||
"05bb": "Perfekcyjne Zejście Daxtera... Prawie",
|
||||
"05bc": "Tess i Daxter Znów Razem",
|
||||
"05bd": "Tess Pokazuje Pazur",
|
||||
"05be": "Torn Daje Misję",
|
||||
"05bf": "Mroczna, Brudna, Niebezpieczna",
|
||||
"05c0": "Ulepszenie Pięści Jaka",
|
||||
"05c1": "Jak Wysadza Ścianę",
|
||||
"05c2": "Jak Wysadza Kolejną Barierę",
|
||||
"05c3": "Zakochani po Uszy",
|
||||
"05c4": "Dajcie im Popalić Chłopcy",
|
||||
"05c5": "Wydrosica Obrywa",
|
||||
"05c6": "Wielki Ścisk",
|
||||
"05c7": "Sig i Jak Uderzają w Gniazdo",
|
||||
"05c8": "Trudne Pytania dla Siga",
|
||||
"05c9": "Damas Otwiera Swoje Serce",
|
||||
"05ca": "Kleiver Wyprzedaje Towar",
|
||||
"05cb": "Sig Wysyła Jaka na Pustynię",
|
||||
"05cc": "Wyrocznia Daje Nadzieję",
|
||||
"05cd": "Jinx ma Plan",
|
||||
"05ce": "Jak to Swój Chłop",
|
||||
"05cf": "Daxternator Powrócił!",
|
||||
"05d0": "Veger Zostaje Upokorzony",
|
||||
"05d1": "Vin Powrócił!",
|
||||
"05d2": "Daxter Pobiera",
|
||||
"05d3": "Wielki Nalot",
|
||||
"05d4": "Jak Odlatuje",
|
||||
"05d5": "Wchodzę!",
|
||||
"05d6": "Errol Znalazł Nowych Przyjaciół",
|
||||
"05d7": "Errol Ucieka",
|
||||
"05d8": "Świątynia Zostaje Zaatakowana!",
|
||||
"05d9": "Seem Ma Wyjątkowy Prezent",
|
||||
"05da": "Witaj w Klanie",
|
||||
"05db": "Jak Łączy Się z Mrocznym Statkiem",
|
||||
"05dc": "Nasz Bohater!",
|
||||
"05dd": "Daxter Zgrywa Bohatera",
|
||||
"05de": "Gotowy do akcji?",
|
||||
"05df": "Katakumby to Jedyna Nadzieja",
|
||||
"05e0": "Damas na Ratunek",
|
||||
"05e1": "Znajdź Mojego Syna...",
|
||||
"05e2": "Robi Się Coraz Dziwniej",
|
||||
"05e3": "Potworny Ładunek",
|
||||
"05e4": "Praca Bohatera Nigdy Się Nie Kończy",
|
||||
"05e5": "Wszechświat Wzywa",
|
||||
"05e6": "Podążaj za migającymi zielonymi ikonami na mapie",
|
||||
"05e7": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby naładować następnie puść aby wykonać Mroczne Uderzenie",
|
||||
"05e8": "Podjedź blisko Skoczka",
|
||||
"05e9": "Zaprowadź Skoczka z powrotem do zagrody",
|
||||
"05ea": "Jak Wpada w Zasadzkę",
|
||||
"05eb": "Nauka Jazdy",
|
||||
"05ec": "Kontrast/Jasność",
|
||||
"05ed": "Kontrast",
|
||||
"05ee": "Jasność",
|
||||
"05f0": "Ustawienia Obrazu",
|
||||
"05f1": "Śmierć Otacza Kryształy",
|
||||
"05f2": "Otrzymujesz~%Regenerację Świetlistego Jaka",
|
||||
"05f3": "Otrzymujesz~%Błyskawiczne Zamrożenie Świetlistego Jaka",
|
||||
"05f5": "Otrzymujesz~%Lot Świetlistego Jaka",
|
||||
"05f6": "<COLOR_BLUE>Regeneracja Świetlistego Jaka: ~%<COLOR_WHITE>Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H i Wciśnij <PAD_TRIANGLE>",
|
||||
"05f7": "<COLOR_CYAN>Błyskawiczne Zamrożenie Świetlistego Jaka:~%<COLOR_WHITE>Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H i Wciśnij <PAD_SQUARE>",
|
||||
"05f8": "<COLOR_BLUE>Tarcza Świetlistego Jaka: ~%<COLOR_WHITE>Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H i Wciśnij <PAD_CIRCLE>",
|
||||
"05f9": "<COLOR_CYAN>Lot Świetlistego Jaka: ~%<COLOR_WHITE>Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H i Wciśnij <PAD_X>",
|
||||
"05fa": "Pozioma Kontrola Kamery",
|
||||
"05fb": "Pionowa Kontrola Kamery",
|
||||
"05fc": "Domyślna",
|
||||
"05fd": "Odwrócona",
|
||||
"05fe": "Ustawienia Kamery",
|
||||
"05ff": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H i Wciśnij <PAD_X> aby wykonać Wzmocniony Skok",
|
||||
"0600": "Wciśnij ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H aby przywołać Mroczną Moc",
|
||||
"0601": "Podstawowe Ruchy",
|
||||
"0602": "<PAD_X>: Skok",
|
||||
"0603": "<PAD_CIRCLE>: Kopnięcie",
|
||||
"0604": "<PAD_SQUARE>: Cios",
|
||||
"0605": "<PAD_TRIANGLE>: Użyj/Rozmawiaj",
|
||||
"0606": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H: Kucnięcie",
|
||||
"0607": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H: Użyj Mrocznych/Świetlistych Mocy",
|
||||
"0608": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H: Strzał",
|
||||
"0609": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H: Użyj Deski",
|
||||
"060a": "~Y~3L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~3L~+32H<PAD_PART_DPAD_R>~Z~+56H: Wybór Broni",
|
||||
"060b": "Zaawansowane Ruchy",
|
||||
"060c": "<PAD_X> + <PAD_X>: Podwójny Skok",
|
||||
"060d": "<PAD_ANALOG_ANY> + ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H: Przewrót",
|
||||
"060e": "<PAD_X> + <PAD_SQUARE>: Zanurkowanie z Wyskoku",
|
||||
"060f": "<PAD_X> + <PAD_CIRCLE>: Kopniak z Wyskoku",
|
||||
"0610": "Przyrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H + <PAD_X>: Wysoki Skok z Kucnięcia",
|
||||
"0611": "Przewrót + <PAD_X>: Długi Skok",
|
||||
"0612": "<PAD_SQUARE> + <PAD_X>: Podbródkowy",
|
||||
"0613": "Wciśnij ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H aby zejść z Deski",
|
||||
"0614": "Otrzymujesz~%Tarczę Świetlistego Jaka",
|
||||
"0615": "Otrzymujesz Generator Wiązki",
|
||||
"0616": "Otrzymujesz Holo Kostkę",
|
||||
"0617": "Otrzymujesz Pryzmat",
|
||||
"0618": "Otrzymujesz Reflektor",
|
||||
"0619": "Otrzymujesz Mapę Czasu",
|
||||
"061a": "Otrzymujesz~%Kryształ Świetlistego Eco",
|
||||
"061b": "Otrzymujesz~%Kryształ Mrocznego Eco",
|
||||
"061c": "~Y~1L~~~Z~41L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~42L<FLAG_PART_HORZ_STRIPE_BOTTOM>~]~-1H~Y~1L~~~Z~41L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~42L<FLAG_PART_HORZ_STRIPE_BOTTOM>~Z~+26H Русский",
|
||||
"061d": "Wciśnij <PAD_TRIANGLE> aby wymienić ~D Klejnoty z Czaszek",
|
||||
"061e": "<COLOR_CYAN>Lot Świetlistego Jaka: ~%<COLOR_WHITE>Podskocz następnie klikaj <PAD_X> aby Machać Skrzydłami",
|
||||
"061f": "Machaj rytmicznie żeby lecieć jak najdłużej",
|
||||
"0620": "Wyścigi",
|
||||
"0621": "Wyścig na Pustyni",
|
||||
"0622": "Próba Czasowa",
|
||||
"0623": "Wyzwania na Pustyni",
|
||||
"0624": "Wyzwanie Skokowe",
|
||||
"0625": "Wyzwanie Walki 1",
|
||||
"0626": "Wyzwanie Walki 2",
|
||||
"0627": "Wyzwanie Walki 3",
|
||||
"0628": "Czas w Powietrzu~%Łącznie",
|
||||
"0629": "Czas w Powietrzu~%z Jednego Skoku",
|
||||
"062a": "Pokonany Dystans~%Łącznie",
|
||||
"062b": "Pokonany Dystans~%z Jednego Skoku",
|
||||
"062c": "Wyzwanie Przewrotowe",
|
||||
"062d": "Sterowanie",
|
||||
"062e": "Sprawdź Satelitę",
|
||||
"0630": "Porozmawiaj z Damasem",
|
||||
"0631": "Porozmawiaj z Seemem",
|
||||
"0632": "Udaj Się na Arenę",
|
||||
"0633": "Pokonaj Mroczną Satelitę",
|
||||
"0634": "Ścigaj Się z Powrotem do Miasta",
|
||||
"0635": "Wróć do Spargus",
|
||||
"0636": "Dotrzyj do Świątyni Mnichów",
|
||||
"0637": "Znajdź Ashelin w Oazie",
|
||||
"0638": "Porozmawiaj z Tornem w Niegrzecznej Wydrosicy",
|
||||
"0639": "Porozmawiaj z Tess na Strzelnicy",
|
||||
"063a": "Przyprowadź Pojazd do Niegrzecznej Wydrosicy",
|
||||
"063b": "Dotrzyj do Siedziby Wolności",
|
||||
"063d": "Znajdź Elektrownię",
|
||||
"063e": "Porozamiwaj z Sigiem",
|
||||
"063f": "Sprawdź Astro-skop",
|
||||
"0640": "Znajdź myśliwiec HellCat",
|
||||
"0641": "Zbadaj Fabrykę Wojenną",
|
||||
"0642": "Porozmawiaj z Samosem",
|
||||
"0643": "Jak Wygrywa Wyścig",
|
||||
"0644": "Jak Patrzy w Górę",
|
||||
"0645": "Daxter Schodzi",
|
||||
"0646": "Daxter Wybiera Ścieżkę",
|
||||
"0647": "Daxter Wraca",
|
||||
"0648": "Daxter i Jak Znów Są Razem",
|
||||
"0649": "Sig Oczyszcza Drogę",
|
||||
"064a": "Jak Zdobywa Więcej Pancerza",
|
||||
"064b": "Robota Czeka Niespodzianka!",
|
||||
"064c": "Robot Obrywa",
|
||||
"064d": "Jak Znajduje Zniszczone Miasto",
|
||||
"064e": "Zajmę Się Tym!",
|
||||
"064f": "W Głąb Otchłani",
|
||||
"0650": "Z Deszczu Pod Rynnę",
|
||||
"0651": "Jaka Porywa Fala",
|
||||
"0652": "Zjeżdżamy w Dół",
|
||||
"0653": "Na Ostatnie Piętro Proszę",
|
||||
"0654": "W Górę i w Drogę!",
|
||||
"0655": "Wyjdźmy na Powierzchnię",
|
||||
"0656": "Przejażdżka",
|
||||
"0657": "Więcej Pancerza!",
|
||||
"0658": "Daxter Robi Swoje",
|
||||
"0659": "Daxter Zwisa",
|
||||
"065a": "Daxter Idzie Solo",
|
||||
"065b": "Potęga Wydrosicy",
|
||||
"065c": "Jak Zdobywa Kolejną Świetlistą Moc",
|
||||
"065d": "Errol Wyjawia Swój Plan",
|
||||
"065e": "Samos i Onin Wskazują Drogę",
|
||||
"065f": "O Mały Włos",
|
||||
"0660": "Im są więksi...",
|
||||
"0661": "Awaryjne Lądowanie!",
|
||||
"0662": "Skończmy To",
|
||||
"0663": "Jak Idzie po Swoje",
|
||||
"0664": "Bohaterowie Powstają",
|
||||
"0665": "Lądowanie w Piekle",
|
||||
"0666": "Wyruszanie do Miasta",
|
||||
"0667": "Lądowanie w Piachu",
|
||||
"0668": "Filar się Podnosi!",
|
||||
"0669": "<PAD_X> + <PAD_X>",
|
||||
"066a": "<PAD_ANALOG_ANY> + ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H",
|
||||
"066b": "<PAD_X> + <PAD_SQUARE>",
|
||||
"066c": "<PAD_X> + <PAD_CIRCLE>",
|
||||
"066d": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H + <PAD_X>",
|
||||
"066e": "Przewrót + <PAD_X>",
|
||||
"066f": "<PAD_SQUARE> + <PAD_X>",
|
||||
"0670": "Podwójny Skok",
|
||||
"0671": "Przewrót",
|
||||
"0672": "Zanurkowanie z Wyskoku",
|
||||
"0673": "Kopniak z Wyskoku",
|
||||
"0674": "Wysoki Skok z Kucnięcia",
|
||||
"0675": "Długi Skok",
|
||||
"0676": "Podbródkowy",
|
||||
"0677": "Ruchy z Bronią",
|
||||
"0678": "<PAD_X> + <PAD_CIRCLE> + ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"0679": "Zaatakuj Przeciwnika, potem ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"067a": "~Y~3L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~3L~+32H<PAD_PART_DPAD_R>~Z~+56H~%Continue pressing ~Y~3L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~3L~+32H<PAD_PART_DPAD_R>~Z~+56H w tym samym kierunku, aby przełączać tryby",
|
||||
"067b": "360 Fala Szybkich Strzałów",
|
||||
"067c": "Fala Szybkich Strzałów",
|
||||
"067d": "Wciskaj dalej ~Y~3L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~3L~+32H<PAD_PART_DPAD_R>~Z~+56H w tym samym kierunku, aby przełączać tryby",
|
||||
"067e": "<PAD_X>",
|
||||
"067f": "<PAD_CIRCLE>",
|
||||
"0680": "<PAD_SQUARE>",
|
||||
"0681": "<PAD_TRIANGLE>",
|
||||
"0682": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H",
|
||||
"0683": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H",
|
||||
"0684": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"0685": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H",
|
||||
"0686": "Skok",
|
||||
"0687": "Kopniak",
|
||||
"0688": "Cios",
|
||||
"0689": "Użyj/Rozmawiaj",
|
||||
"068a": "Kucnięcie",
|
||||
"068b": "Użyj Mrocznych/Świetlistych Mocy",
|
||||
"068c": "Strzał",
|
||||
"068d": "Użyj Deski",
|
||||
"068e": "Wybór Broni",
|
||||
"068f": "Ruchy na Desce",
|
||||
"0690": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H potem <PAD_X>",
|
||||
"0691": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H + <PAD_ANALOG_ANY>",
|
||||
"0692": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H + <PAD_ANALOG_ANY>",
|
||||
"0693": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H",
|
||||
"0694": "Doładowany Wzmocniony Skok",
|
||||
"0695": "Flip/Obrót",
|
||||
"0696": "Trik",
|
||||
"0697": "Zejście",
|
||||
"0698": "Sterowanie Pojazdem",
|
||||
"0699": "<PAD_X>",
|
||||
"069a": "<PAD_CIRCLE>",
|
||||
"069b": "<PAD_SQUARE>",
|
||||
"069c": "<PAD_TRIANGLE>",
|
||||
"069d": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"069e": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H",
|
||||
"069f": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H",
|
||||
"06a0": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H",
|
||||
"06a1": "Gaz",
|
||||
"06a2": "Hamulec Ręczny",
|
||||
"06a3": "Hamulec",
|
||||
"06a4": "Wyjście z Pojazdu",
|
||||
"06a5": "Wystrzał z Broni",
|
||||
"06a6": "Turbo",
|
||||
"06a7": "Skok",
|
||||
"06a8": "Widok z Tyłu",
|
||||
"06a9": "Ruchy Mrocznego Jaka",
|
||||
"06aa": "<PAD_X> + <PAD_SQUARE>",
|
||||
"06ab": "<PAD_SQUARE> + <PAD_X>",
|
||||
"06ac": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"06ad": "Mroczna Bomba",
|
||||
"06ae": "Mroczny Wybuch",
|
||||
"06af": "Mroczny Strzał",
|
||||
"06b0": "Ruchy Świetlistego Jaka",
|
||||
"06b1": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H + <PAD_TRIANGLE>",
|
||||
"06b2": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H + <PAD_SQUARE>",
|
||||
"06b3": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H + <PAD_CIRCLE>~%W Trybie Tarczy, Przytrzymaj <PAD_CIRCLE> aby aktywować Tarczę",
|
||||
"06b4": "W Trybie Tarczy, Przytrzymaj <PAD_CIRCLE> aby aktywować Tarczę",
|
||||
"06b5": "Przytrzymaj ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H + <PAD_X>~%W Trybie Latania, Wciskaj <PAD_X> aby Machać Skrzydłami",
|
||||
"06b6": "W Trybie Latania, Wciskaj <PAD_X> aby Machać Skrzydłami",
|
||||
"06b7": "Regeneracja Świetlistego Jaka",
|
||||
"06b8": "Błyskawiczne Zamrożenie Świetlistego Jaka",
|
||||
"06b9": "Tarcza Świetlistego Jaka",
|
||||
"06ba": "Lot Świetlistego Jaka",
|
||||
"06bb": " ",
|
||||
"06bc": "Wróć do Menu Głównego",
|
||||
"06bd": "::",
|
||||
"06be": "Spotkaj Się ze Starymi Przyjaciółmi",
|
||||
"06bf": "Porozmawiaj z Tornem w Lidze Wolności",
|
||||
"06c0": "Wróć do Spargus",
|
||||
"06c1": "Język Dźwięku",
|
||||
"06c2": "",
|
||||
"06c3": "Twardy Szczeniak",
|
||||
"06c4": "Piaskowy Rekin",
|
||||
"06c5": "Miażdzyciel Gil",
|
||||
"06c6": "Wydmoskoczek",
|
||||
"06c7": "Poszukiwacz Ognia",
|
||||
"06c8": "Taran-Dożer",
|
||||
"06c9": "Pyłowy Demon",
|
||||
"06ca": "Pustynny Krzykacz",
|
||||
"06de": "Ochroń Cywili!",
|
||||
"06df": "Aby aktywować posąg, uderz pięścią lub kopnij go w nos",
|
||||
"06e0": "Strzelba",
|
||||
"06e1": "Falowstrząs",
|
||||
"06e2": "Wyrzutnia Plazmitu",
|
||||
"06e3": "Modyfikacja Strzelby",
|
||||
"06e4": "Wiązkodbijacz",
|
||||
"06e5": "Żyrozrywacz",
|
||||
"06e6": "Furia Wulkanu",
|
||||
"06e7": "Władca Grzmotu",
|
||||
"06e8": "Laser Iglasty",
|
||||
"06e9": "Rozjemca",
|
||||
"06ea": "Inwerter Masy",
|
||||
"06eb": "Supernova",
|
||||
"06ec": "Naramienniki",
|
||||
"06ed": "Nagolenniki",
|
||||
"06ee": "Ochraniacze Barków",
|
||||
"06ef": "Napierśnik",
|
||||
"06f0": "Twardy Szczeniak",
|
||||
"06f1": "Piaskowy Rekin",
|
||||
"06f2": "Miażdzyciel Gil",
|
||||
"06f3": "Wydmoskoczek",
|
||||
"06f4": "Poszukiwacz Ognia",
|
||||
"06f5": "Taran-Dożer",
|
||||
"06f6": "Pyłowy Demon",
|
||||
"06f7": "Pustynny Krzykacz",
|
||||
"06f8": "Deska Odrzutowa",
|
||||
"06f9": "Mroczna Niewidzialność",
|
||||
"06fa": "Mroczny Strzał",
|
||||
"06fb": "Świetlista Regeneracja",
|
||||
"06fc": "Świetliste Zamrożenie",
|
||||
"06fd": "Świetlista Tarcza",
|
||||
"06fe": "Świetlisty Lot",
|
||||
"06ff": "Pierwsza Część Amuletu Wojennego",
|
||||
"0700": "Druga Część Amuletu Wojennego",
|
||||
"0701": "Cały Amulet Wojenny",
|
||||
"0702": "Przepustka od Bramy w Spargus",
|
||||
"0703": "Pieczęć Mara",
|
||||
"0704": "Glif Szyfru",
|
||||
"0705": "Holo Kostka",
|
||||
"0706": "Reflektor Kwantowy",
|
||||
"0707": "Pryzmat",
|
||||
"0708": "Generator Wiązki",
|
||||
"0709": "Mapa Czasu",
|
||||
"070a": "Kryształ Świetlistego Eco",
|
||||
"070b": "Kryształ Mrocznego Eco",
|
||||
"070c": "Sfera Mocy Eco",
|
||||
"070d": "Strzelba to broń o szerokim zasięgu rażenia i niskiej szybkostrzelności Doskonale nadaje się do eliminowania przeciwników z bliskiej odległości.",
|
||||
"070e": "Falowstrząs wystrzeliwuję falę w obszarze 360 stopni dookoła broni Przytrzymanie przycisku ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H naładuje broń i zwiększy obszar rażenia.",
|
||||
"070f": "Wyrzutnia Plazmitu wystrzeliwuje potężny granat który zniszczy wszystkich wrogów stojących w jego eksplozji.",
|
||||
"0775": "Mapa Niedostępna",
|
||||
"0776": "<COLOR_BLUE>Tarcza Świetlistego Jaka: ~%<COLOR_WHITE>Jako Świetlisty Jak Przytrzymaj <PAD_CIRCLE> aby użyć tarczy",
|
||||
"0778": "Moc Ochrony",
|
||||
"0779": "Wciśnij <PAD_TRIANGLE> aby użyć",
|
||||
"077a": "Zbiegli Maruderzy",
|
||||
"077b": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby podnieść obiekty",
|
||||
"077c": "Wciśnij <PAD_SQUARE> aby rzucać trzymanymi obiektami",
|
||||
"078d": "Porozmawiaj z Kleiverem",
|
||||
"07b3": "Nieskończone Turbo w Pojazdach",
|
||||
"07b4": "Jako Mroczny Jak, przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby naładować potem puść aby wykonać Mroczny Strzał",
|
||||
"07b5": "Pojazdów Zniszczonych",
|
||||
"07b8": "<FLAG_PORTUGUAL> Português",
|
||||
"07b9": "Przytrzymaj <PAD_X> aby przyspieszyć",
|
||||
"07ba": "Stać cię na zakup nowych sekretów!",
|
||||
"07bb": "Jak",
|
||||
"07bc": "Jak II",
|
||||
"07bd": "Jak 3",
|
||||
"07be": "Daxter",
|
||||
"07bf": "Pecker",
|
||||
"07c0": "Torn",
|
||||
"07c1": "Ashelin",
|
||||
"07c2": "Tess",
|
||||
"07c3": "Użyj <COLOR_RED>Falowstrząsu",
|
||||
"07c4": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby naładować potem puść aby wystrzelić większy wybuch",
|
||||
"07c7": "Komentarz",
|
||||
"07c8": "Dutch",
|
||||
"07cb": "Ekwipunek",
|
||||
"07cc": "Koniec Czasu",
|
||||
"07cd": "Łącznych Przewrotów",
|
||||
"07ce": "Łączny Dystans",
|
||||
"07cf": "Najlepszy Dystans",
|
||||
"07d0": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H",
|
||||
"07d1": "~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H",
|
||||
"07d2": "Komentarz",
|
||||
"07d3": "Komentarz Animatora",
|
||||
"07d4": "Komentarz Dyrektora Kreatywnego",
|
||||
"07d5": "Szybkie Filmy",
|
||||
"07d6": "Wolne Filmy",
|
||||
"07d7": "Statystyki Gry",
|
||||
"07d8": "Pielucha Kleivera",
|
||||
"07d9": "Zwiększona Pojemność <COLOR_PAD-CIRCLE>Czerwonego~] Magazynka",
|
||||
"07da": "Zwiększona Pojemność <COLOR_YELLOW>Żółtego~] Magazynka",
|
||||
"07db": "Zwiększona Pojemność <COLOR_CYAN>Niebieskiego~] Magazynka",
|
||||
"07dc": "Zwiększona Pojemność <COLOR_PINK>Mrocznego~] Magazynka",
|
||||
"07dd": "Modyfikacja Studnia Grawitacyjna",
|
||||
"07de": "Kursy Strzeleckie Ratchet and Clank",
|
||||
"07df": "Nieskończony Świetlisty Jak",
|
||||
"07e0": "Zła Pogoda",
|
||||
"07e1": "Szybka Pora Dzienna",
|
||||
"07e2": "Graj jako Jak II",
|
||||
"07e3": "Jak 3 Przeglądarka Modeli",
|
||||
"07e4": "Jak II Przeglądarka Modeli",
|
||||
"07e5": "Jak and Daxter Przeglądarka Modeli",
|
||||
"07e6": "Wciśnij <PAD_X> aby rozpocząć Trening Falowstrząsu",
|
||||
"07e7": "Wciśnij <PAD_X> aby rozpocząć Trening Wiązkodbijacza",
|
||||
"07e8": "<PAD_X> = Trening Falowstrząsu~%<PAD_SQUARE> = Kurs Strzelecki Ratcheta",
|
||||
"07e9": "<PAD_X> = Trening Wiązkodbijacza~%<PAD_SQUARE> = Kurs Strzelecki Clanka",
|
||||
"07ea": "Pielucha Kleivera",
|
||||
"07f6": "Zabójstwa",
|
||||
"07f7": "Kleiver",
|
||||
"07f8": "Samos",
|
||||
"07f9": "Seem",
|
||||
"07fa": "Keira",
|
||||
"07fb": "Dureń Wydrosica",
|
||||
"07fc": "Tess Wydrosica",
|
||||
"07fd": "Sig",
|
||||
"07fe": "Lider Wydrosica",
|
||||
"07ff": "Surfer Wydrosica",
|
||||
"0800": "Veger Wydrosica",
|
||||
"0801": "Onin",
|
||||
"0802": "Damas",
|
||||
"0803": "Jinx",
|
||||
"0804": "Cyber Errol",
|
||||
"0805": "Hrabia Veger",
|
||||
"0806": "Występują...",
|
||||
"0807": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby położyć trzymane obiekty",
|
||||
"0808": "<PAD_X> + <PAD_SQUARE>+<PAD_X>",
|
||||
"0809": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+4H~+3V<PAD_PART_L1_NAME>~Z~+38H + <PAD_SQUARE>",
|
||||
"080a": "Super Skok z Nura",
|
||||
"080b": "Podbródkowy z Przykucu",
|
||||
"080c": "<PAD_TRIANGLE> (obok Posągu Prekursora,",
|
||||
"080d": "Mroczna Niewidzialność",
|
||||
"0816": "Baron Praxis",
|
||||
"0817": "Młody Samos",
|
||||
"0818": "Brutter",
|
||||
"0819": "Strażnik Krimzon",
|
||||
"081a": "Flut Flut",
|
||||
"081b": "Burmistrz",
|
||||
"081c": "Czerwony Mędrzec",
|
||||
"081d": "Rzeźbiarz",
|
||||
"081e": "Oryginalny Daxter",
|
||||
"081f": "Żółty Mędrzec",
|
||||
"0820": "Wojownik",
|
||||
"0821": "Geolożka",
|
||||
"0822": "Hazardzista",
|
||||
"0823": "Gordy",
|
||||
"0824": "Willard",
|
||||
"0825": "Klaww",
|
||||
"0826": "Ornitolożka",
|
||||
"0827": "Niebieski Mędrzec",
|
||||
"0828": "Gol",
|
||||
"0829": "Maia",
|
||||
"082a": "Poszukiwacz Przygód",
|
||||
"082b": "Farmer",
|
||||
"082c": "Rybak",
|
||||
"082d": "Krokopies",
|
||||
"082e": "Młody Jak",
|
||||
"082f": "Kor",
|
||||
"0830": "Errol",
|
||||
"0831": "Lurker",
|
||||
"0832": "Bagniak Billy",
|
||||
"0833": "Twój Dystans",
|
||||
"0834": "Ulepszenia Broni",
|
||||
"0835": "____~%Oszustwa",
|
||||
"0836": "____~%Ulepszenia Pojazdów",
|
||||
"0837": "____~%Szalone Rzeczy",
|
||||
"0838": "____~%Galeria Sztuki",
|
||||
"0839": "____~%Opcje dla Ekspertów",
|
||||
"083a": "Niedostępne",
|
||||
"083b": "Ulepszenie Szybkostrzelności <COLOR_PAD-CIRCLE>Strzelby~]",
|
||||
"083c": "Ulepszenie Obrażeń <COLOR_PAD-CIRCLE>Falowstrząsu~]",
|
||||
"083d": "Wydajność Amunicji <COLOR_PAD-CIRCLE>Wyrzutni Plazmitu~]",
|
||||
"083e": "Ulepszenie Obrażeń <COLOR_YELLOW>Zmiatacza~]",
|
||||
"083f": "Zwiększona Liczba Odbić <COLOR_YELLOW>Wiązkodbijacza~]",
|
||||
"0840": "Ulepszenie Czasu Trwania <COLOR_YELLOW>Żyrozrywacza~]",
|
||||
"0841": "Ulepszenie Obrażeń <COLOR_CYAN>Furii Wulkanu~]",
|
||||
"0842": "Robospięcie <COLOR_CYAN>Władcy Grzmotu~] ",
|
||||
"0843": "Wydajność Amunicji <COLOR_CYAN>Lasera Iglastego~]",
|
||||
"0844": "Zwiększone Pole Rażenia <COLOR_PINK>Rozjemcy~]",
|
||||
"0845": "Ulepszenie Czasu Trwania <COLOR_PINK>Inwertera Masy~]",
|
||||
"0846": "Wydajność Amunicji <COLOR_PINK>Supernovy~]",
|
||||
"0847": "Odblokuj <COLOR_ORANGE>Poszukiwacza Ognia",
|
||||
"0848": "Odblokuj <COLOR_ORANGE>Pyłowego Demona",
|
||||
"0849": "Odblokuj <COLOR_ORANGE>Pustynnego Krzykacza",
|
||||
"084a": "Zwiększ Wytrzymałość Pojazdu",
|
||||
"084b": "Turbo Deska na Pustyni",
|
||||
"084c": "Samonaprowadzające Ataki Mrocznego Jaka",
|
||||
"084d": "Spodnie dla Daxtera",
|
||||
"084e": "Wybór Poziomu Akt 1",
|
||||
"084f": "Wybór Poziomu Akt 2",
|
||||
"0850": "Wybór Poziomu Akt 3",
|
||||
"0851": "Niewidzialność Mrocznego Jaka na <PAD_TRIANGLE>",
|
||||
"0852": "Anuluj",
|
||||
"0853": "Kup",
|
||||
"0856": "Cena",
|
||||
"0857": "Dostępne są nowe sekrety!",
|
||||
"0858": "Sekrety wciąż są dostępne do kupienia!",
|
||||
"085a": "Mroczna Bomba: <PAD_X> + <PAD_SQUARE>",
|
||||
"085f": "Przyprowadź~%<COLOR_YELLOW>Piaskowego Rekina",
|
||||
"0860": "Przyprowadź~%<COLOR_YELLOW>Piaskowego Rekina,~%<COLOR_YELLOW>Poszukiwacza Ognia,~%<COLOR_YELLOW>Pyłowego Demona~%<COLOR_WHITE>lub~%<COLOR_YELLOW>Pustynnego Krzykacza",
|
||||
"0861": "Dodatkowy~%Czas",
|
||||
"0862": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby automatycznie strzelać",
|
||||
"0863": "Użyte Artefakty Prekursorów",
|
||||
"0864": "Przytrzymaj <PAD_CIRCLE> aby użyć Tarczy",
|
||||
"0866": "Wynik",
|
||||
"0867": "Pojazdy",
|
||||
"0868": "Pancerz",
|
||||
"0869": "Moce Mrocznego Jaka",
|
||||
"086a": "Moce Świetlistego Jaka",
|
||||
"086c": "Przedmioty",
|
||||
"086d": "Mroczna Bomba",
|
||||
"086e": "Mroczny Wybuch",
|
||||
"086f": "Modyfikacje Broni Przemianowej",
|
||||
"0870": "Amulet Wojenny",
|
||||
"0871": "Gra z Satelitą",
|
||||
"0872": "Próba Czasowa na Torze Wyścigowym",
|
||||
"0873": "Bieg przez Pustkowie",
|
||||
"0874": "Czas w Powietrzu~%z Jednego Skoku",
|
||||
"0875": "Czas w Powietrzu~%Łącznie",
|
||||
"0876": "Pokonany Dystans~%z Jednego Skoku",
|
||||
"0877": "Pokonany Dystans~%Łącznie",
|
||||
"0878": "Wyzwanie Przewrotowe",
|
||||
"0879": "Gra z Wieżyczką w Spargus",
|
||||
"087a": "Wyzwanie Deski Odrzutowej",
|
||||
"087b": "Kurs Strzelecki~%Wiązkodbijacza",
|
||||
"087c": "Kurs Strzelecki~%Falowstrząsu",
|
||||
"087d": "Kurs Strzelecki Ratcheta",
|
||||
"087e": "Kurs Strzelecki Clanka",
|
||||
"087f": "Gra z Siatką Eco",
|
||||
"0880": "Wyzwanie Maruderów",
|
||||
"0883": "~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_L2_NAME>~Z~+38H + <PAD_ANALOG_ANY>",
|
||||
"0884": "Chwyć",
|
||||
"0885": "Przytrzymaj ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H aby naładować potem puść aby wystrzelić",
|
||||
"0886": "Wciśnij ~Y~22L~-2H~-12V<PAD_PART_SHOULDER_TOP_LEFT><PAD_PART_SHOULDER_TOP_RIGHT>~Z~22L~-2H~+17V<PAD_PART_SHOULDER_BOTTOM_LEFT><PAD_PART_SHOULDER_BOTTOM_RIGHT>~Z~43L~+6H~+3V<PAD_PART_R1_NAME>~Z~+38H ponownie żeby Żyrozrywacz zawisnął w powietrzu",
|
||||
"0887": "Zablokowane",
|
||||
"0888": "Użyj turbo ~Y~22L~-2H~-6V<PAD_PART_TRIGGER_TOP_LEFT><PAD_PART_TRIGGER_TOP_RIGHT>~Z~22L~-2H~+16V<PAD_PART_TRIGGER_BOTTOM_LEFT><PAD_PART_TRIGGER_BOTTOM_RIGHT>~Z~43L~+5H~-2V<PAD_PART_R2_NAME>~Z~+38H aby niszczyć przeszkody",
|
||||
"088a": "Wyląduj Obrót o 360 stopni",
|
||||
"088b": "<PAD_TRIANGLE>",
|
||||
"088c": "Przyspieszenie",
|
||||
"088d": "Szybki Wsteczny",
|
||||
"088e": "Intro - Zaatakowani",
|
||||
"088f": "Intro - Ratunek",
|
||||
"0891": "Pierwsze Wrażenia",
|
||||
"0892": "GRATULACJE!~%Znaleziono wszystkie 600 Kul Prekursorów!~%Ciesz się nowym, stylowym wdziankiem Jaka.",
|
||||
"0893": "Krew",
|
||||
"0894": "Vin",
|
||||
"0895": "Ukończono",
|
||||
"0896": "Zapisz stan w Trybie Bohatera",
|
||||
"0897": "Aby włączyć Tryb Bohatera, zapisz swój obecny stan gry i następnie załaduj stan w Trybie Bohatera z menu Wczytywania Gry.",
|
||||
"0898": "Porozmawiaj z Ashelin",
|
||||
"0899": "Wciśnij <PAD_X> aby Zaakceptować"
|
||||
}
|
||||
@@ -403,6 +403,7 @@
|
||||
030000006d04000011c2000000000000,Logitech WingMan Cordless,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b5,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b2,righttrigger:b7,rightx:a3,righty:a4,x:b4,platform:Windows,
|
||||
030000006d0400000ac2000000000000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Windows,
|
||||
03000000380700005645000000000000,Lynx,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
030000004e3700001101000000000000,M64 Pro Controller,+rightx:b8,+righty:b6,-rightx:b7,-righty:b5,a:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b4,start:b9,x:b1,platform:Windows,
|
||||
03000000222200006000000000000000,Macally,a:b1,b:b2,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b33,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700003888000000000000,Mad Catz Arcade Fightstick TE S Plus PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008532000000000000,Mad Catz Arcade Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
@@ -550,7 +551,7 @@
|
||||
03000000250900000500000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.8,dpleft:h0.4,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b0,y:b3,platform:Windows,
|
||||
030000004c0500006802000000000000,PS3 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b10,lefttrigger:a3~,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:a4~,rightx:a2,righty:a5,start:b8,x:b3,y:b0,platform:Windows,
|
||||
030000004f1f00000800000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000632500007505000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000632500007505000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000888800000803000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b9,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Windows,
|
||||
03000000888800000804000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Windows,
|
||||
030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
@@ -1023,6 +1024,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
030000006d0400001ac2000004000000,Logitech Precision,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004e3700001101000000020000,M64 Pro Controller,+rightx:b8,+righty:b6,-rightx:b7,-righty:b5,a:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b4,start:b9,x:b1,platform:Mac OS X,
|
||||
03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
@@ -1193,6 +1195,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000373500002210000030020000,GameSir G7 Pro,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
|
||||
03000000373500004110000000010000,GameSir Nova Lite,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
|
||||
0300000037350000411000001b010000,GameSir Nova Lite,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:a5,righttrigger:a4,platform:Mac OS X,
|
||||
|
||||
# Linux
|
||||
03000000c82d00001930000011010000,8BitDo 64,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,platform:Linux,
|
||||
@@ -1235,6 +1240,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000c82d00000020000000000000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
06000000c82d00000020000006010000,8BitDo Pro 2 for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c82d00000960000011010000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
05000000c82d00000960000000010000,8BitDo Pro 3,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b16,paddle3:b2,paddle4:b5,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
03000000c82d00000331000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
@@ -1274,7 +1280,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000c82d00001530000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000c82d00001630000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000c82d00001730000011010000,8BitDo Ultimate C,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
06000000c82d00000320000007010000,8BitDo Ultimate Controller for Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c82d00002520000014010000,8BitDo Ultimate C Xbox Controller,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux
|
||||
06000000c82d00000320000007010000,8BitDo Ultimate C Xbox Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c82d00001920000014010000,8BitDo Ultimate Mini Wired Controller for Xbox,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux
|
||||
03000000c82d00000121000011010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000c82d00000121000000010000,8BitDo Xbox One SN30 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux,
|
||||
@@ -1296,7 +1304,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000020500000913000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000373500000710000010010000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000373500004610000001000000,Anbernic RG P01,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
19000000010000000100000000010000,Anbernic RG28XX Controller,a:b4,b:b3,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b7,leftstick:b12,misc1:b1,rightshoulder:b8,rightstick:b13,start:b10,x:b5,y:b6,platform:Linux,
|
||||
03000000190e00000110000010010000,Aquaplus Piece,a:b1,b:b0,back:b3,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b2,platform:Linux,
|
||||
03000000790000003018000011010000,Arcade Fightstick F300,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000a30c00002700000011010000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
||||
@@ -1317,6 +1324,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
05000000503200000210000045010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,
|
||||
05000000503200000210000046010000,Atari VCS Modern Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b3,y:b2,platform:Linux,
|
||||
05000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:-a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Linux,
|
||||
03000000e30500003207000000010000,Austgame Twin Pad,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
|
||||
030000008a3500000201000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000008a3500000202000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000008a3500000302000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
@@ -1357,6 +1365,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000006f0e00008001000011010000,Faceoff Pro Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000852100000201000010010000,FF GP1,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
05000000b40400001224000001010000,Flydigi APEX 4,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b20,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000d73700001424000004010000,Flydigi Direwolf 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b12,paddle2:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000b40400001224000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b2,paddle1:b16,paddle2:b17,paddle3:b14,paddle4:b15,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b14,paddle1:b2,paddle2:b5,paddle3:b16,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
@@ -1378,6 +1387,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
030000006f0e0000b20200000f010000,PDP Xbox One Controller,a:b0,b:b1,y:b3,x:b2,start:b7,back:b6,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:b12,dpleft:b14,dpdown:b13,dpright:b15,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||
03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000f025000021c1000010010000,Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000f0250000c283000010010000,Gioteck VX2 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
@@ -1436,7 +1446,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000000d0f0000f600000001000000,Horipad Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000341a000005f7000010010000,HuiJia GameCube Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux,
|
||||
05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux,
|
||||
03000000242e00002811000000010000,Hyperkin Competitor,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux,
|
||||
03000000790000004e95000010010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Linux,
|
||||
03000000242e00006a38000010010000,Hyperkin Trooper 2,a:b0,b:b1,back:b4,leftshoulder:b2,leftx:a0,lefty:a1,rightshoulder:b3,start:b5,platform:Linux,
|
||||
03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000f00300008d03000011010000,HyperX Clutch,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
@@ -1483,6 +1495,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000006d04000019c2000010010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000006d0400000ac2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,rightx:a3,righty:a4,x:b3,y:b4,platform:Linux,
|
||||
030000006d04000011c2000010010000,Logitech WingMan RumblePad,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b10,rightx:a3,righty:a4,start:b8,x:b3,y:b4,platform:Linux,
|
||||
050000004e3700001101000000020000,M64 Pro Controller,+rightx:b8,+righty:b6,-rightx:b7,-righty:b5,a:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b2,leftx:a0,lefty:a1,rightshoulder:b4,start:b9,x:b1,platform:Linux,
|
||||
05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
@@ -1603,7 +1616,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
05000000550900001472000001000000,NVIDIA Controller,a:b0,b:b1,back:b14,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b16,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Linux,
|
||||
030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000451300000830000010010000,Nyko CORE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
19000000010000000100000001010000,ODROID Go 2,a:b1,b:b0,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,guide:b10,leftshoulder:b4,leftstick:b12,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b13,righttrigger:b14,start:b15,x:b2,y:b3,platform:Linux,
|
||||
19000000010000000200000011000000,ODROID Go 2,a:b1,b:b0,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b12,leftshoulder:b4,leftstick:b14,lefttrigger:b13,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b16,start:b17,x:b2,y:b3,platform:Linux,
|
||||
05000000362800000100000002010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
|
||||
05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux,
|
||||
@@ -1727,6 +1739,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000321500000b10000011010000,Razer Wolverine PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
0300000032150000140a000001010000,Razer Wolverine Ultimate Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
0300000032150000290a000001010000,Razer Wolverine V2 Xbox,a:b0,b:b1,x:b2,y:b3,back:b6,guide:b8,start:b7,leftstick:b9,rightstick:b10,leftshoulder:b4,rightshoulder:b5,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,platform:Linux,
|
||||
030000000d0f0000c100000010010000,Retro Bit Legacy16,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b12,leftshoulder:b4,lefttrigger:b6,misc1:b13,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000632500007805000011010000,Retro Fighters D6,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
@@ -1779,7 +1792,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000666600006706000000010000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux,
|
||||
03000000d9040000160f000000010000,Sony PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||
030000004c050000da0c000011010000,Sony PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
||||
030000004c050000da0c000011010000,Sony PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000004c0500003713000011010000,Sony PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1838,6 +1851,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
05000000f51000008f01000001000000,Turtle Beach Rematch Nintendo Switch Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000100800000100000010010000,Twin PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000c0160000e105000010010000,Ultimate Atari Fight Stick,a:b1,b:b2,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b4,righttrigger:b5,start:b8,x:b0,y:b3,platform:Linux,
|
||||
030000006f0e00001211000010010000,Unico MVS Mini Pad,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000151900005678000010010000,Uniplay U6,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000790000000600000007010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,
|
||||
@@ -2140,7 +2154,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000fffe3f80,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b2,y:b17,platform:Android,
|
||||
050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
|
||||
@@ -1,181 +1,3 @@
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_12_collide_mesh {
|
||||
struct Cache {
|
||||
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
// nop // sll r0, r0, 0
|
||||
get_fake_spad_addr2(t0, cache.fake_scratchpad_data, 0, c);// lui t0, 28672
|
||||
c->lwu(v1, 8, a0); // lwu v1, 8(a0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lwu(a3, 12, a0); // lwu a3, 12(a0)
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L7
|
||||
c->lqc2(vf1, 0, a2); // lqc2 vf1, 0(a2)
|
||||
if (bc) {goto block_3;} // branch non-likely
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf2, 16, a2); // lqc2 vf2, 16(a2)
|
||||
c->daddiu(t0, t0, -64); // daddiu t0, t0, -64
|
||||
c->lqc2(vf3, 32, a2); // lqc2 vf3, 32(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf4, 48, a2); // lqc2 vf4, 48(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf5, 0, a3); // lqc2 vf5, 0(a3)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf6, 16, a3); // lqc2 vf6, 16(a3)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf7, 32, a3); // lqc2 vf7, 32(a3)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf8, 48, a3); // lqc2 vf8, 48(a3)
|
||||
|
||||
block_2:
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->daddiu(a3, a3, 64); // daddiu a3, a3, 64
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
||||
c->daddiu(t0, t0, 64); // daddiu t0, t0, 64
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf3, vf5); // vmaddz.xyzw vf9, vf3, vf5
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf5, 0, a3); // lqc2 vf5, 0(a3)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf3, vf6); // vmaddz.xyzw vf10, vf3, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf6, 16, a3); // lqc2 vf6, 16(a3)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf3, vf7); // vmaddz.xyzw vf11, vf3, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf7, 32, a3); // lqc2 vf7, 32(a3)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf3, vf8); // vmaddz.xyzw vf12, vf3, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf8, 48, a3); // lqc2 vf8, 48(a3)
|
||||
c->daddiu(v1, v1, -4); // daddiu v1, v1, -4
|
||||
c->sqc2(vf9, 0, t0); // sqc2 vf9, 0(t0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf10, 16, t0); // sqc2 vf10, 16(t0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf11, 32, t0); // sqc2 vf11, 32(t0)
|
||||
bc = ((s64)c->sgpr64(v1)) > 0; // bgtz v1, L6
|
||||
c->sqc2(vf12, 48, t0); // sqc2 vf12, 48(t0)
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
|
||||
block_3:
|
||||
c->daddiu(v1, a0, 28); // daddiu v1, a0, 28
|
||||
// nop // sll r0, r0, 0
|
||||
get_fake_spad_addr2(a2, cache.fake_scratchpad_data, 0, c);// lui a2, 28672
|
||||
c->lwu(a0, 4, a0); // lwu a0, 4(a0)
|
||||
bc = c->sgpr64(a0) == 0; // beq a0, r0, L9
|
||||
c->lbu(t0, 0, v1); // lbu t0, 0(v1)
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->daddiu(a1, a1, -96); // daddiu a1, a1, -96
|
||||
c->lbu(a3, 1, v1); // lbu a3, 1(v1)
|
||||
c->dsll(t0, t0, 4); // dsll t0, t0, 4
|
||||
c->lbu(t2, 2, v1); // lbu t2, 2(v1)
|
||||
c->dsll(t1, a3, 4); // dsll t1, a3, 4
|
||||
c->lwu(a3, 4, v1); // lwu a3, 4(v1)
|
||||
c->dsll(t2, t2, 4); // dsll t2, t2, 4
|
||||
c->daddu(t0, t0, a2); // daddu t0, t0, a2
|
||||
c->daddu(t1, t1, a2); // daddu t1, t1, a2
|
||||
c->daddu(t2, t2, a2); // daddu t2, t2, a2
|
||||
|
||||
block_5:
|
||||
c->daddiu(a0, a0, -1); // daddiu a0, a0, -1
|
||||
c->lqc2(vf1, 0, t0); // lqc2 vf1, 0(t0)
|
||||
c->daddiu(v1, v1, 8); // daddiu v1, v1, 8
|
||||
c->lqc2(vf2, 0, t1); // lqc2 vf2, 0(t1)
|
||||
c->daddiu(a1, a1, 96); // daddiu a1, a1, 96
|
||||
c->lqc2(vf3, 0, t2); // lqc2 vf3, 0(t2)
|
||||
c->vsub(DEST::xyzw, vf4, vf2, vf1); // vsub.xyzw vf4, vf2, vf1
|
||||
c->sqc2(vf1, 0, a1); // sqc2 vf1, 0(a1)
|
||||
c->vmini(DEST::xyzw, vf8, vf1, vf2); // vmini.xyzw vf8, vf1, vf2
|
||||
c->sqc2(vf2, 16, a1); // sqc2 vf2, 16(a1)
|
||||
c->vsub(DEST::xyzw, vf5, vf3, vf1); // vsub.xyzw vf5, vf3, vf1
|
||||
c->sqc2(vf3, 32, a1); // sqc2 vf3, 32(a1)
|
||||
c->vmax(DEST::xyzw, vf9, vf1, vf2); // vmax.xyzw vf9, vf1, vf2
|
||||
c->lbu(t1, 0, v1); // lbu t1, 0(v1)
|
||||
c->vopmula(vf4, vf5); // vopmula.xyz acc, vf4, vf5
|
||||
c->lbu(t2, 1, v1); // lbu t2, 1(v1)
|
||||
c->vopmsub(vf6, vf5, vf4); // vopmsub.xyz vf6, vf5, vf4
|
||||
c->lbu(t0, 2, v1); // lbu t0, 2(v1)
|
||||
c->vmul(DEST::xyzw, vf7, vf6, vf6); // vmul.xyzw vf7, vf6, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmini(DEST::xyzw, vf8, vf8, vf3); // vmini.xyzw vf8, vf8, vf3
|
||||
c->dsll(t1, t1, 4); // dsll t1, t1, 4
|
||||
c->vmax(DEST::xyzw, vf9, vf9, vf3); // vmax.xyzw vf9, vf9, vf3
|
||||
c->dsll(t2, t2, 4); // dsll t2, t2, 4
|
||||
c->vmula_bc(DEST::w, BC::x, vf0, vf7); // vmulax.w acc, vf0, vf7
|
||||
c->dsll(t3, t0, 4); // dsll t3, t0, 4
|
||||
c->vmadda_bc(DEST::w, BC::y, vf0, vf7); // vmadday.w acc, vf0, vf7
|
||||
c->daddu(t0, t1, a2); // daddu t0, t1, a2
|
||||
c->vmadd_bc(DEST::w, BC::z, vf7, vf0, vf7); // vmaddz.w vf7, vf0, vf7
|
||||
c->daddu(t1, t2, a2); // daddu t1, t2, a2
|
||||
c->vrsqrt(vf0, BC::w, vf7, BC::w); // vrsqrt Q, vf0.w, vf7.w
|
||||
c->daddu(t2, t3, a2); // daddu t2, t3, a2
|
||||
c->vftoi0(DEST::xyzw, vf8, vf8); // vftoi0.xyzw vf8, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf9, vf9); // vftoi0.xyzw vf9, vf9
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf8, 64, a1); // sqc2 vf8, 64(a1)
|
||||
c->vwaitq(); // vwaitq
|
||||
c->sqc2(vf9, 80, a1); // sqc2 vf9, 80(a1)
|
||||
c->vmulq(DEST::xyz, vf6, vf6); // vmulq.xyz vf6, vf6, Q
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf6, 48, a1); // sqc2 vf6, 48(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(a3, 60, a1); // sw a3, 60(a1)
|
||||
bc = c->sgpr64(a0) != 0; // bne a0, r0, L8
|
||||
c->lwu(a3, 4, v1); // lwu a3, 4(v1)
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
|
||||
block_6:
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
||||
gLinkedFunctionTable.reg("(method 12 collide-mesh)", execute, 512);
|
||||
}
|
||||
|
||||
} // namespace method_12_collide_mesh
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -483,4 +305,421 @@ void link() {
|
||||
}
|
||||
|
||||
} // namespace method_14_collide_mesh
|
||||
} // namespace Mips2C
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_11_collide_mesh {
|
||||
struct Cache {
|
||||
void* closest_pt_in_triangle; // closest-pt-in-triangle
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
bool cop1_bc = false;
|
||||
c->daddiu(sp, sp, -160); // daddiu sp, sp, -160
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s1, 64, sp); // sq s1, 64(sp)
|
||||
c->sq(s2, 80, sp); // sq s2, 80(sp)
|
||||
c->sq(s3, 96, sp); // sq s3, 96(sp)
|
||||
c->sq(s4, 112, sp); // sq s4, 112(sp)
|
||||
c->sq(s5, 128, sp); // sq s5, 128(sp)
|
||||
c->sq(gp, 144, sp); // sq gp, 144(sp)
|
||||
c->mov64(gp, a2); // or gp, a2, r0
|
||||
c->mov64(s5, a3); // or s5, a3, r0
|
||||
c->mov64(s3, t0); // or s3, t0, r0
|
||||
c->daddiu(s4, sp, 16); // daddiu s4, sp, 16
|
||||
c->lui(v1, 17141); // lui v1, 17141
|
||||
c->ori(v1, v1, 49807); // ori v1, v1, 49807
|
||||
// nop // sll r0, r0, 0
|
||||
c->mov64(s2, a1); // or s2, a1, r0
|
||||
c->lqc2(vf3, 0, s5); // lqc2 vf3, 0(s5)
|
||||
c->mov128_vf_gpr(vf14, v1); // qmtc2.i vf14, v1
|
||||
c->lwu(s1, 4, a0); // lwu s1, 4(a0)
|
||||
c->vadd_bc(DEST::w, BC::x, vf3, vf3, vf14); // vaddx.w vf3, vf3, vf14
|
||||
// nop // sll r0, r0, 0
|
||||
c->vsub_bc(DEST::xyzw, BC::w, vf12, vf3, vf3); // vsubw.xyzw vf12, vf3, vf3
|
||||
// nop // sll r0, r0, 0
|
||||
c->vadd_bc(DEST::xyzw, BC::w, vf13, vf3, vf3); // vaddw.xyzw vf13, vf3, vf3
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf12, vf12); // vftoi0.xyzw vf12, vf12
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf13, vf13); // vftoi0.xyzw vf13, vf13
|
||||
// nop // sll r0, r0, 0
|
||||
c->mov128_gpr_vf(v1, vf12); // qmfc2.i v1, vf12
|
||||
c->sqc2(vf12, 16, s4); // sqc2 vf12, 16(s4)
|
||||
c->mov128_gpr_vf(a0, vf13); // qmfc2.i a0, vf13
|
||||
c->sqc2(vf13, 32, s4); // sqc2 vf13, 32(s4)
|
||||
|
||||
block_1:
|
||||
bc = c->sgpr64(s1) == 0; // beq s1, r0, L34
|
||||
c->lwu(a2, 60, s2); // lwu a2, 60(s2)
|
||||
if (bc) {goto block_14;} // branch non-likely
|
||||
|
||||
c->addiu(a3, r0, 896); // addiu a3, r0, 896
|
||||
c->addiu(a1, r0, 0); // addiu a1, r0, 0
|
||||
c->and_(a2, a2, a3); // and a2, a2, a3
|
||||
c->addiu(a3, r0, 256); // addiu a3, r0, 256
|
||||
bc = c->sgpr64(a2) == c->sgpr64(a1); // beq a2, a1, L32
|
||||
c->daddiu(s1, s1, -1); // daddiu s1, s1, -1
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
if (((s64)c->sgpr64(a2)) != ((s64)c->sgpr64(a3))) {// bnel a2, a3, L31
|
||||
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
||||
goto block_1;
|
||||
}
|
||||
|
||||
block_5:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a2, 64, s2); // lq a2, 64(s2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(a1, 80, s2); // lq a1, 80(s2)
|
||||
c->pcgtw(a2, a2, a0); // pcgtw a2, a2, a0
|
||||
c->mfc1(r0, f31); // mfc1 r0, f31
|
||||
c->pcgtw(a1, v1, a1); // pcgtw a1, v1, a1
|
||||
c->mfc1(r0, f31); // mfc1 r0, f31
|
||||
c->por(a1, a2, a1); // por a1, a2, a1
|
||||
// nop // sll r0, r0, 0
|
||||
c->ppach(a1, r0, a1); // ppach a1, r0, a1
|
||||
c->mfc1(r0, f31); // mfc1 r0, f31
|
||||
c->dsll(a1, a1, 16); // dsll a1, a1, 16
|
||||
// nop // sll r0, r0, 0
|
||||
if (((s64)c->sgpr64(a1)) != ((s64)0)) { // bnel a1, r0, L31
|
||||
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
||||
goto block_1;
|
||||
}
|
||||
|
||||
block_7:
|
||||
c->load_symbol2(t9, cache.closest_pt_in_triangle);// lw t9, closest-pt-in-triangle(s7)
|
||||
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
||||
c->mov64(a1, s5); // or a1, s5, r0
|
||||
c->daddu(a2, r0, s2); // daddu a2, r0, s2
|
||||
c->daddiu(a3, s2, 48); // daddiu a3, s2, 48
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->lqc2(vf2, 0, s4); // lqc2 vf2, 0(s4)
|
||||
c->lqc2(vf3, 0, s5); // lqc2 vf3, 0(s5)
|
||||
c->lqc2(vf1, 48, s2); // lqc2 vf1, 48(s2)
|
||||
c->lq(v1, 16, s4); // lq v1, 16(s4)
|
||||
c->lq(a0, 32, s4); // lq a0, 32(s4)
|
||||
c->vsub(DEST::xyzw, vf4, vf3, vf2); // vsub.xyzw vf4, vf3, vf2
|
||||
c->lwu(a1, 60, s2); // lwu a1, 60(s2)
|
||||
c->vmul(DEST::xyzw, vf5, vf4, vf1); // vmul.xyzw vf5, vf4, vf1
|
||||
c->lqc2(vf7, 0, s2); // lqc2 vf7, 0(s2)
|
||||
c->vmul(DEST::xyzw, vf6, vf4, vf4); // vmul.xyzw vf6, vf4, vf4
|
||||
c->lqc2(vf8, 16, s2); // lqc2 vf8, 16(s2)
|
||||
c->vmove(DEST::w, vf1, vf0); // vmove.w vf1, vf0
|
||||
c->lqc2(vf9, 32, s2); // lqc2 vf9, 32(s2)
|
||||
c->vadd_bc(DEST::y, BC::x, vf5, vf5, vf5); // vaddx.y vf5, vf5, vf5
|
||||
c->daddiu(s2, s2, 96); // daddiu s2, s2, 96
|
||||
c->vadd_bc(DEST::x, BC::y, vf6, vf6, vf6); // vaddy.x vf6, vf6, vf6
|
||||
c->mtc1(f5, s3); // mtc1 f5, s3
|
||||
c->vadd_bc(DEST::y, BC::z, vf5, vf5, vf5); // vaddz.y vf5, vf5, vf5
|
||||
c->lui(a2, 17141); // lui a2, 17141
|
||||
c->ori(a2, a2, 49807); // ori a2, a2, 49807
|
||||
c->mtc1(f3, a2); // mtc1 f3, a2
|
||||
c->vadd_bc(DEST::x, BC::z, vf6, vf6, vf6); // vaddz.x vf6, vf6, vf6
|
||||
c->lui(a2, -15232); // lui a2, -15232
|
||||
c->mtc1(f4, a2); // mtc1 f4, a2
|
||||
c->vsqrt(vf6, BC::x); // vsqrt Q, vf6.x
|
||||
c->mov128_gpr_vf(a2, vf5); // qmfc2.i a2, vf5
|
||||
c->vwaitq(); // vwaitq
|
||||
c->lwc1(f1, 12, s5); // lwc1 f1, 12(s5)
|
||||
c->vaddq(DEST::x, vf6, vf0); // vaddq.x vf6, vf0, Q
|
||||
c->vmove(DEST::xyzw, vf10, vf6); // vmove.xyzw vf10, vf6
|
||||
if (((s64)c->sgpr64(a2)) < 0) { // bltzl a2, L33
|
||||
c->vsub(DEST::xyzw, vf10, vf0, vf10); // vsub.xyzw vf10, vf0, vf10
|
||||
goto block_9;
|
||||
}
|
||||
|
||||
block_9:
|
||||
c->mov128_gpr_vf(a2, vf10); // qmfc2.i a2, vf10
|
||||
c->mtc1(f2, a2); // mtc1 f2, a2
|
||||
c->subs(f2, f2, f1); // sub.s f2, f2, f1
|
||||
cop1_bc = c->fprs[f5] < c->fprs[f2]; // c.lt.s f5, f2
|
||||
bc = cop1_bc; // bc1t L31
|
||||
c->vdiv(vf0, BC::w, vf6, BC::x); // vdiv Q, vf0.w, vf6.x
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
cop1_bc = c->fprs[f3] <= c->fprs[f2]; // c.le.s f3, f2
|
||||
bc = cop1_bc; // bc1t L31
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
cop1_bc = c->fprs[f2] <= c->fprs[f4]; // c.le.s f2, f4
|
||||
bc = cop1_bc; // bc1t L31
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->vwaitq(); // vwaitq
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmulq(DEST::xyzw, vf11, vf4); // vmulq.xyzw vf11, vf4, Q
|
||||
c->lui(a2, 16180); // lui a2, 16180
|
||||
c->ori(a2, a2, 65012); // ori a2, a2, 65012
|
||||
c->mtc1(f6, a2); // mtc1 f6, a2
|
||||
c->vmul(DEST::xyzw, vf5, vf11, vf1); // vmul.xyzw vf5, vf11, vf1
|
||||
c->vadd_bc(DEST::x, BC::y, vf5, vf5, vf5); // vaddy.x vf5, vf5, vf5
|
||||
c->vadd_bc(DEST::x, BC::z, vf5, vf5, vf5); // vaddz.x vf5, vf5, vf5
|
||||
c->mov128_gpr_vf(a2, vf5); // qmfc2.i a2, vf5
|
||||
c->mtc1(f7, a2); // mtc1 f7, a2
|
||||
cop1_bc = c->fprs[f7] < c->fprs[f6]; // c.lt.s f7, f6
|
||||
bc = cop1_bc; // bc1t L31
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->mfc1(s3, f2); // mfc1 s3, f2
|
||||
c->sqc2(vf7, 0, gp); // sqc2 vf7, 0(gp)
|
||||
c->sqc2(vf8, 16, gp); // sqc2 vf8, 16(gp)
|
||||
c->sqc2(vf9, 32, gp); // sqc2 vf9, 32(gp)
|
||||
c->sqc2(vf2, 48, gp); // sqc2 vf2, 48(gp)
|
||||
c->sqc2(vf1, 64, gp); // sqc2 vf1, 64(gp)
|
||||
//beq r0, r0, L31 // beq r0, r0, L31
|
||||
c->sw(a1, 80, gp); // sw a1, 80(gp)
|
||||
goto block_1; // branch always
|
||||
|
||||
|
||||
block_14:
|
||||
c->mov64(v0, s3); // or v0, s3, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 144, sp); // lq gp, 144(sp)
|
||||
c->lq(s5, 128, sp); // lq s5, 128(sp)
|
||||
c->lq(s4, 112, sp); // lq s4, 112(sp)
|
||||
c->lq(s3, 96, sp); // lq s3, 96(sp)
|
||||
c->lq(s2, 80, sp); // lq s2, 80(sp)
|
||||
c->lq(s1, 64, sp); // lq s1, 64(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 160); // daddiu sp, sp, 160
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.closest_pt_in_triangle = intern_from_c(-1, 0, "closest-pt-in-triangle").c();
|
||||
gLinkedFunctionTable.reg("(method 11 collide-mesh)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_11_collide_mesh
|
||||
} // namespace Mips2C
|
||||
// add method_11_collide_mesh::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_11_collide_mesh { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_13_collide_mesh {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
c->lwu(v1, 12, a0); // lwu v1, 12(a0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lwu(a0, 8, a0); // lwu a0, 8(a0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf1, 0, a1); // lqc2 vf1, 0(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf2, 16, a1); // lqc2 vf2, 16(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf3, 32, a1); // lqc2 vf3, 32(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf4, 48, a1); // lqc2 vf4, 48(a1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
||||
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
||||
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
||||
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf13, vf5); // vftoi0.xyzw vf13, vf5
|
||||
c->sqc2(vf5, 0, a2); // sqc2 vf5, 0(a2)
|
||||
c->vftoi0(DEST::xyzw, vf14, vf6); // vftoi0.xyzw vf14, vf6
|
||||
c->sqc2(vf6, 32, a2); // sqc2 vf6, 32(a2)
|
||||
c->vftoi0(DEST::xyzw, vf15, vf7); // vftoi0.xyzw vf15, vf7
|
||||
c->sqc2(vf7, 64, a2); // sqc2 vf7, 64(a2)
|
||||
c->vftoi0(DEST::xyzw, vf16, vf8); // vftoi0.xyzw vf16, vf8
|
||||
c->sqc2(vf8, 96, a2); // sqc2 vf8, 96(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf13, 16, a2); // sqc2 vf13, 16(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
||||
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
||||
c->sqc2(vf15, 80, a2); // sqc2 vf15, 80(a2)
|
||||
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L25
|
||||
c->sqc2(vf16, 112, a2); // sqc2 vf16, 112(a2)
|
||||
if (bc) {goto block_3;} // branch non-likely
|
||||
|
||||
|
||||
block_1:
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf5, 0, v1); // lqc2 vf5, 0(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf9); // vmaddax.xyzw acc, vf1, vf9
|
||||
c->lqc2(vf6, 16, v1); // lqc2 vf6, 16(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf9); // vmadday.xyzw acc, vf2, vf9
|
||||
c->lqc2(vf7, 32, v1); // lqc2 vf7, 32(v1)
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf9, vf3, vf9); // vmaddz.xyzw vf9, vf3, vf9
|
||||
c->lqc2(vf8, 48, v1); // lqc2 vf8, 48(v1)
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf10); // vmaddax.xyzw acc, vf1, vf10
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf10); // vmadday.xyzw acc, vf2, vf10
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf10, vf3, vf10); // vmaddz.xyzw vf10, vf3, vf10
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf11); // vmaddax.xyzw acc, vf1, vf11
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf11); // vmadday.xyzw acc, vf2, vf11
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf11, vf3, vf11); // vmaddz.xyzw vf11, vf3, vf11
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf12); // vmaddax.xyzw acc, vf1, vf12
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf12); // vmadday.xyzw acc, vf2, vf12
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf12, vf3, vf12); // vmaddz.xyzw vf12, vf3, vf12
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf17, vf9); // vftoi0.xyzw vf17, vf9
|
||||
c->sqc2(vf9, 128, a2); // sqc2 vf9, 128(a2)
|
||||
c->vftoi0(DEST::xyzw, vf18, vf10); // vftoi0.xyzw vf18, vf10
|
||||
c->sqc2(vf10, 160, a2); // sqc2 vf10, 160(a2)
|
||||
c->vftoi0(DEST::xyzw, vf19, vf11); // vftoi0.xyzw vf19, vf11
|
||||
c->sqc2(vf11, 192, a2); // sqc2 vf11, 192(a2)
|
||||
c->vftoi0(DEST::xyzw, vf20, vf12); // vftoi0.xyzw vf20, vf12
|
||||
c->sqc2(vf12, 224, a2); // sqc2 vf12, 224(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf17, 144, a2); // sqc2 vf17, 144(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->sqc2(vf18, 176, a2); // sqc2 vf18, 176(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf19, 208, a2); // sqc2 vf19, 208(a2)
|
||||
bc = ((s64)c->sgpr64(a0)) <= 0; // blez a0, L25
|
||||
c->sqc2(vf20, 240, a2); // sqc2 vf20, 240(a2)
|
||||
if (bc) {goto block_3;} // branch non-likely
|
||||
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->lqc2(vf9, 64, v1); // lqc2 vf9, 64(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf5); // vmaddax.xyzw acc, vf1, vf5
|
||||
c->lqc2(vf10, 80, v1); // lqc2 vf10, 80(v1)
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf5); // vmadday.xyzw acc, vf2, vf5
|
||||
c->lqc2(vf11, 96, v1); // lqc2 vf11, 96(v1)
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf5, vf3, vf5); // vmaddz.xyzw vf5, vf3, vf5
|
||||
c->lqc2(vf12, 112, v1); // lqc2 vf12, 112(v1)
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
c->daddiu(a2, a2, 256); // daddiu a2, a2, 256
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf6); // vmaddax.xyzw acc, vf1, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf6); // vmadday.xyzw acc, vf2, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf6, vf3, vf6); // vmaddz.xyzw vf6, vf3, vf6
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf7); // vmaddax.xyzw acc, vf1, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf7); // vmadday.xyzw acc, vf2, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf7, vf3, vf7); // vmaddz.xyzw vf7, vf3, vf7
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmula_bc(DEST::xyzw, BC::w, vf4, vf0); // vmulaw.xyzw acc, vf4, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::x, vf1, vf8); // vmaddax.xyzw acc, vf1, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf2, vf8); // vmadday.xyzw acc, vf2, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmadd_bc(DEST::xyzw, BC::z, vf8, vf3, vf8); // vmaddz.xyzw vf8, vf3, vf8
|
||||
// nop // sll r0, r0, 0
|
||||
c->vftoi0(DEST::xyzw, vf13, vf5); // vftoi0.xyzw vf13, vf5
|
||||
c->sqc2(vf5, 0, a2); // sqc2 vf5, 0(a2)
|
||||
c->vftoi0(DEST::xyzw, vf14, vf6); // vftoi0.xyzw vf14, vf6
|
||||
c->sqc2(vf6, 32, a2); // sqc2 vf6, 32(a2)
|
||||
c->vftoi0(DEST::xyzw, vf15, vf7); // vftoi0.xyzw vf15, vf7
|
||||
c->sqc2(vf7, 64, a2); // sqc2 vf7, 64(a2)
|
||||
c->vftoi0(DEST::xyzw, vf16, vf8); // vftoi0.xyzw vf16, vf8
|
||||
c->sqc2(vf8, 96, a2); // sqc2 vf8, 96(a2)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sqc2(vf13, 16, a2); // sqc2 vf13, 16(a2)
|
||||
c->daddiu(a0, a0, -4); // daddiu a0, a0, -4
|
||||
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
||||
c->daddiu(v1, v1, 128); // daddiu v1, v1, 128
|
||||
c->sqc2(vf15, 80, a2); // sqc2 vf15, 80(a2)
|
||||
bc = ((s64)c->sgpr64(a0)) > 0; // bgtz a0, L24
|
||||
c->sqc2(vf16, 112, a2); // sqc2 vf16, 112(a2)
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
|
||||
block_3:
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 13 collide-mesh)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_13_collide_mesh
|
||||
} // namespace Mips2C
|
||||
// add method_13_collide_mesh::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_13_collide_mesh { extern void link(); }
|
||||
@@ -4,206 +4,121 @@
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace calc_animation_from_spr {
|
||||
struct Cache {
|
||||
void* fake_scratchpad_data; // *fake-scratchpad-data*
|
||||
void* clear_frame_accumulator; // clear-frame-accumulator
|
||||
void* decompress_fixed_data_to_accumulator; // decompress-fixed-data-to-accumulator
|
||||
void* decompress_frame_data_pair_to_accumulator; // decompress-frame-data-pair-to-accumulator
|
||||
void* decompress_frame_data_to_accumulator; // decompress-frame-data-to-accumulator
|
||||
void* normalize_frame_quaternions; // normalize-frame-quaternions
|
||||
} cache;
|
||||
|
||||
namespace cspace_parented_transformq_joint {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->mov64(v1, a1); // or v1, a1, r0
|
||||
c->daddiu(sp, sp, -192); // daddiu sp, sp, -192
|
||||
c->sq(s0, 0, sp); // sq s0, 0(sp)
|
||||
c->sq(s1, 16, sp); // sq s1, 16(sp)
|
||||
c->sq(s2, 32, sp); // sq s2, 32(sp)
|
||||
c->sq(s3, 48, sp); // sq s3, 48(sp)
|
||||
c->sq(s4, 64, sp); // sq s4, 64(sp)
|
||||
c->sq(s5, 80, sp); // sq s5, 80(sp)
|
||||
c->sq(s6, 96, sp); // sq s6, 96(sp)
|
||||
c->sq(t8, 112, sp); // sq t8, 112(sp)
|
||||
c->sq(t9, 128, sp); // sq t9, 128(sp)
|
||||
c->sq(gp, 144, sp); // sq gp, 144(sp)
|
||||
c->sq(fp, 160, sp); // sq fp, 160(sp)
|
||||
c->sq(ra, 176, sp); // sq ra, 176(sp)
|
||||
c->daddiu(sp, sp, -16); // daddiu sp, sp, -16
|
||||
c->mov128_vf_gpr(vf15, r0); // qmtc2.i vf15, r0
|
||||
c->sw(a1, 0, sp); // sw a1, 0(sp)
|
||||
get_fake_spad_addr2(v1, cache.fake_scratchpad_data, 0, c);// lui v1, 28672
|
||||
c->lw(s1, 2384, v1); // lw s1, 2384(v1)
|
||||
c->daddiu(t7, v1, 1808); // daddiu t7, v1, 1808
|
||||
c->lui(s0, 4096); // lui s0, 4096
|
||||
c->daddiu(t1, v1, 7328); // daddiu t1, v1, 7328
|
||||
bc = c->sgpr64(s1) == 0; // beq s1, r0, L20
|
||||
c->ori(s0, s0, 54272); // ori s0, s0, 54272
|
||||
if (bc) {goto block_12;} // branch non-likely
|
||||
|
||||
c->lw(t2, 0, t7); // lw t2, 0(t7)
|
||||
c->addiu(t3, r0, 7392); // addiu t3, r0, 7392
|
||||
c->lw(t4, 4, t7); // lw t4, 4(t7)
|
||||
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
||||
c->sw(t2, 16, s0); // sw t2, 16(s0)
|
||||
c->vadd_bc(DEST::xyzw, BC::w, vf14, vf15, vf0); // vaddw.xyzw vf14, vf15, vf0
|
||||
c->sw(t3, 128, s0); // sw t3, 128(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(t4, 32, s0); // sw t4, 32(s0)
|
||||
// Unknown instr: sync.l
|
||||
c->sw(v1, 0, s0); // sw v1, 0(s0)
|
||||
// Unknown instr: sync.l
|
||||
c->load_symbol2(t9, cache.clear_frame_accumulator);// lw t9, clear-frame-accumulator(s7)
|
||||
c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14
|
||||
c->lw(s2, 0, sp); // lw s2, 0(sp)
|
||||
// nop // sll r0, r0, 0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->vadd(DEST::yz, vf14, vf14, vf14); // vadd.yz vf14, vf14, vf14
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
|
||||
block_2:
|
||||
c->lw(v1, 0, s0); // lw v1, 0(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->andi(v1, v1, 256); // andi v1, v1, 256
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(v1) != 0; // bne v1, r0, L16
|
||||
c->lw(a3, 0, a0); // lw a3, 0(a0)
|
||||
c->lui(v1, 16256); // lui v1, 16256
|
||||
c->lqc2(vf5, 16, a1); // lqc2 vf5, 16(a1)
|
||||
c->mtc1(f0, v1); // mtc1 f0, v1
|
||||
c->lw(t0, 16, a3); // lw t0, 16(a3)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lw(a2, 16, a0); // lw a2, 16(a0)
|
||||
c->vadd(DEST::xyzw, vf6, vf5, vf5); // vadd.xyzw vf6, vf5, vf5
|
||||
c->lwc1(f1, 64, t0); // lwc1 f1, 64(t0)
|
||||
c->vadd_bc(DEST::x, BC::w, vf2, vf0, vf5); // vaddw.x vf2, vf0, vf5
|
||||
c->lqc2(vf15, 0, a1); // lqc2 vf15, 0(a1)
|
||||
c->vadd_bc(DEST::y, BC::z, vf2, vf0, vf5); // vaddz.y vf2, vf0, vf5
|
||||
c->lqc2(vf1, 32, a1); // lqc2 vf1, 32(a1)
|
||||
c->divs(f4, f0, f1); // div.s f4, f0, f1
|
||||
c->lqc2(vf7, 0, t0); // lqc2 vf7, 0(t0)
|
||||
c->vsub_bc(DEST::z, BC::y, vf2, vf0, vf5); // vsuby.z vf2, vf0, vf5
|
||||
c->lqc2(vf8, 16, t0); // lqc2 vf8, 16(t0)
|
||||
c->vsub_bc(DEST::w, BC::w, vf2, vf0, vf0); // vsubw.w vf2, vf0, vf0
|
||||
c->lqc2(vf9, 32, t0); // lqc2 vf9, 32(t0)
|
||||
c->vsub_bc(DEST::x, BC::z, vf3, vf0, vf5); // vsubz.x vf3, vf0, vf5
|
||||
c->lqc2(vf10, 48, t0); // lqc2 vf10, 48(t0)
|
||||
c->vadd_bc(DEST::y, BC::w, vf3, vf0, vf5); // vaddw.y vf3, vf0, vf5
|
||||
c->lwc1(f2, 68, t0); // lwc1 f2, 68(t0)
|
||||
c->vadd_bc(DEST::z, BC::x, vf3, vf0, vf5); // vaddx.z vf3, vf0, vf5
|
||||
c->sqc2(vf1, 64, a2); // sqc2 vf1, 64(a2)
|
||||
c->vsub_bc(DEST::w, BC::w, vf3, vf0, vf0); // vsubw.w vf3, vf0, vf0
|
||||
c->lwc1(f3, 72, t0); // lwc1 f3, 72(t0)
|
||||
c->vadd_bc(DEST::x, BC::y, vf4, vf0, vf5); // vaddy.x vf4, vf0, vf5
|
||||
c->lw(v1, 76, t0); // lw v1, 76(t0)
|
||||
c->vsub_bc(DEST::y, BC::x, vf4, vf0, vf5); // vsubx.y vf4, vf0, vf5
|
||||
c->mfc1(t1, f4); // mfc1 t1, f4
|
||||
c->vadd_bc(DEST::z, BC::w, vf4, vf0, vf5); // vaddw.z vf4, vf0, vf5
|
||||
c->divs(f4, f0, f2); // div.s f4, f0, f2
|
||||
c->vsub_bc(DEST::w, BC::w, vf4, vf0, vf0); // vsubw.w vf4, vf0, vf0
|
||||
c->vopmula(vf6, vf2); // vopmula.xyz acc, vf6, vf2
|
||||
c->vopmsub(vf2, vf2, vf6); // vopmsub.xyz vf2, vf2, vf6
|
||||
c->vopmula(vf6, vf3); // vopmula.xyz acc, vf6, vf3
|
||||
c->vopmsub(vf3, vf3, vf6); // vopmsub.xyz vf3, vf3, vf6
|
||||
c->vopmula(vf6, vf4); // vopmula.xyz acc, vf6, vf4
|
||||
c->vopmsub(vf4, vf4, vf6); // vopmsub.xyz vf4, vf4, vf6
|
||||
c->vadd_bc(DEST::x, BC::w, vf2, vf2, vf0); // vaddw.x vf2, vf2, vf0
|
||||
c->vadd_bc(DEST::y, BC::w, vf3, vf3, vf0); // vaddw.y vf3, vf3, vf0
|
||||
c->vadd_bc(DEST::z, BC::w, vf4, vf4, vf0); // vaddw.z vf4, vf4, vf0
|
||||
c->mfc1(t2, f4); // mfc1 t2, f4
|
||||
bc = c->sgpr64(v1) != 0; // bne v1, r0, L64
|
||||
c->divs(f4, f0, f3); // div.s f4, f0, f3
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->lw(t2, 8, t7); // lw t2, 8(t7)
|
||||
c->addiu(t3, r0, 9600); // addiu t3, r0, 9600
|
||||
c->lw(t4, 12, t7); // lw t4, 12(t7)
|
||||
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
||||
c->sw(t2, 16, s0); // sw t2, 16(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(t3, 128, s0); // sw t3, 128(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(t4, 32, s0); // sw t4, 32(s0)
|
||||
// Unknown instr: sync.l
|
||||
c->sw(v1, 0, s0); // sw v1, 0(s0)
|
||||
// Unknown instr: sync.l
|
||||
c->lw(a2, 16, t7); // lw a2, 16(t7)
|
||||
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
|
||||
c->load_symbol2(t9, cache.decompress_fixed_data_to_accumulator);// lw t9, decompress-fixed-data-to-accumulator(s7)
|
||||
c->daddiu(a1, a1, 7392); // daddiu a1, a1, 7392
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->daddiu(s1, s1, -1); // daddiu s1, s1, -1
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
|
||||
block_4:
|
||||
c->lw(v1, 0, s0); // lw v1, 0(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->andi(v1, v1, 256); // andi v1, v1, 256
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(v1) != 0; // bne v1, r0, L17
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_4;} // branch non-likely
|
||||
|
||||
bc = c->sgpr64(s1) == 0; // beq s1, r0, L18
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_7;} // branch non-likely
|
||||
|
||||
c->lw(t2, 24, t7); // lw t2, 24(t7)
|
||||
c->addiu(t3, r0, 7392); // addiu t3, r0, 7392
|
||||
c->lw(t4, 28, t7); // lw t4, 28(t7)
|
||||
c->addiu(v1, r0, 256); // addiu v1, r0, 256
|
||||
c->sw(t2, 16, s0); // sw t2, 16(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(t3, 128, s0); // sw t3, 128(s0)
|
||||
// nop // sll r0, r0, 0
|
||||
c->sw(t4, 32, s0); // sw t4, 32(s0)
|
||||
// Unknown instr: sync.l
|
||||
c->sw(v1, 0, s0); // sw v1, 0(s0)
|
||||
// Unknown instr: sync.l
|
||||
|
||||
block_7:
|
||||
c->lw(t0, 20, t7); // lw t0, 20(t7)
|
||||
get_fake_spad_addr2(a1, cache.fake_scratchpad_data, 0, c);// lui a1, 28672
|
||||
c->lw(a2, 16, t7); // lw a2, 16(t7)
|
||||
c->daddiu(a1, a1, 9600); // daddiu a1, a1, 9600
|
||||
bc = c->sgpr64(t0) == 0; // beq t0, r0, L19
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_10;} // branch non-likely
|
||||
|
||||
c->lw(a3, 12, t7); // lw a3, 12(t7)
|
||||
// nop // sll r0, r0, 0
|
||||
c->load_symbol2(t9, cache.decompress_frame_data_pair_to_accumulator);// lw t9, decompress-frame-data-pair-to-accumulator(s7)
|
||||
// nop // sll r0, r0, 0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(a3, a3, 3); // sll a3, a3, 3
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
bc = c->sgpr64(s1) != 0; // bne s1, r0, L16
|
||||
c->daddiu(t7, t7, 24); // daddiu t7, t7, 24
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->load_symbol2(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lw(s2, 0, sp); // lw s2, 0(sp)
|
||||
// nop // sll r0, r0, 0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
// nop // sll r0, r0, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(s0, 0, sp); // lq s0, 0(sp)
|
||||
c->lq(s1, 16, sp); // lq s1, 16(sp)
|
||||
c->lq(s2, 32, sp); // lq s2, 32(sp)
|
||||
c->lq(s3, 48, sp); // lq s3, 48(sp)
|
||||
c->lq(s4, 64, sp); // lq s4, 64(sp)
|
||||
c->lq(s5, 80, sp); // lq s5, 80(sp)
|
||||
c->lq(s6, 96, sp); // lq s6, 96(sp)
|
||||
c->lq(t8, 112, sp); // lq t8, 112(sp)
|
||||
c->lq(t9, 128, sp); // lq t9, 128(sp)
|
||||
c->lq(gp, 144, sp); // lq gp, 144(sp)
|
||||
c->lq(ra, 176, sp); // lq ra, 176(sp)
|
||||
c->lq(fp, 160, sp); // lq fp, 160(sp)
|
||||
c->vmul_bc(DEST::xyzw, BC::x, vf2, vf2, vf1); // vmulx.xyzw vf2, vf2, vf1
|
||||
c->vmul_bc(DEST::xyzw, BC::y, vf3, vf3, vf1); // vmuly.xyzw vf3, vf3, vf1
|
||||
c->vmul_bc(DEST::xyzw, BC::z, vf4, vf4, vf1); // vmulz.xyzw vf4, vf4, vf1
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf2); // vmulax.xyzw acc, vf7, vf2
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf2); // vmadday.xyzw acc, vf8, vf2
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf2); // vmaddaz.xyzw acc, vf9, vf2
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf10, vf2); // vmaddw.xyzw vf11, vf10, vf2
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf3); // vmulax.xyzw acc, vf7, vf3
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf3); // vmadday.xyzw acc, vf8, vf3
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf3); // vmaddaz.xyzw acc, vf9, vf3
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf10, vf3); // vmaddw.xyzw vf12, vf10, vf3
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf4); // vmulax.xyzw acc, vf7, vf4
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf4); // vmadday.xyzw acc, vf8, vf4
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf4); // vmaddaz.xyzw acc, vf9, vf4
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf10, vf4); // vmaddw.xyzw vf13, vf10, vf4
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf15); // vmulax.xyzw acc, vf7, vf15
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf15); // vmadday.xyzw acc, vf8, vf15
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf15); // vmaddaz.xyzw acc, vf9, vf15
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf14, vf10, vf0); // vmaddw.xyzw vf14, vf10, vf0
|
||||
c->sqc2(vf11, 0, a2); // sqc2 vf11, 0(a2)
|
||||
c->sqc2(vf12, 16, a2); // sqc2 vf12, 16(a2)
|
||||
c->sqc2(vf13, 32, a2); // sqc2 vf13, 32(a2)
|
||||
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 192); // daddiu sp, sp, 192
|
||||
// nop // sll r0, r0, 0
|
||||
goto end_of_function; // return
|
||||
|
||||
|
||||
block_10:
|
||||
c->load_symbol2(t9, cache.decompress_frame_data_to_accumulator);// lw t9, decompress-frame-data-to-accumulator(s7)
|
||||
// nop // sll r0, r0, 0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
// nop // sll r0, r0, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
bc = c->sgpr64(s1) != 0; // bne s1, r0, L16
|
||||
c->daddiu(t7, t7, 24); // daddiu t7, t7, 24
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->load_symbol2(t9, cache.normalize_frame_quaternions);// lw t9, normalize-frame-quaternions(s7)
|
||||
// nop // sll r0, r0, 0
|
||||
c->lw(s2, 0, sp); // lw s2, 0(sp)
|
||||
// nop // sll r0, r0, 0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
// nop // sll r0, r0, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
|
||||
block_12:
|
||||
c->daddiu(sp, sp, 16); // daddiu sp, sp, 16
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(s0, 0, sp); // lq s0, 0(sp)
|
||||
c->lq(s1, 16, sp); // lq s1, 16(sp)
|
||||
c->lq(s2, 32, sp); // lq s2, 32(sp)
|
||||
c->lq(s3, 48, sp); // lq s3, 48(sp)
|
||||
c->lq(s4, 64, sp); // lq s4, 64(sp)
|
||||
c->lq(s5, 80, sp); // lq s5, 80(sp)
|
||||
c->lq(s6, 96, sp); // lq s6, 96(sp)
|
||||
c->lq(t8, 112, sp); // lq t8, 112(sp)
|
||||
c->lq(t9, 128, sp); // lq t9, 128(sp)
|
||||
c->lq(gp, 144, sp); // lq gp, 144(sp)
|
||||
c->lq(ra, 176, sp); // lq ra, 176(sp)
|
||||
c->lq(fp, 160, sp); // lq fp, 160(sp)
|
||||
block_2:
|
||||
c->pextlw(t1, t2, t1); // pextlw t1, t2, t1
|
||||
c->vmul_bc(DEST::xyzw, BC::x, vf2, vf2, vf1); // vmulx.xyzw vf2, vf2, vf1
|
||||
c->vmul_bc(DEST::xyzw, BC::y, vf3, vf3, vf1); // vmuly.xyzw vf3, vf3, vf1
|
||||
c->vmul_bc(DEST::xyzw, BC::z, vf4, vf4, vf1); // vmulz.xyzw vf4, vf4, vf1
|
||||
c->mfc1(t3, f4); // mfc1 t3, f4
|
||||
c->pcpyld(t1, t3, t1); // pcpyld t1, t3, t1
|
||||
c->mov128_vf_gpr(vf16, t1); // qmtc2.i vf16, t1
|
||||
c->vmul(DEST::xyzw, vf2, vf2, vf16); // vmul.xyzw vf2, vf2, vf16
|
||||
c->vmul(DEST::xyzw, vf3, vf3, vf16); // vmul.xyzw vf3, vf3, vf16
|
||||
c->vmul(DEST::xyzw, vf4, vf4, vf16); // vmul.xyzw vf4, vf4, vf16
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf2); // vmulax.xyzw acc, vf7, vf2
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf2); // vmadday.xyzw acc, vf8, vf2
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf2); // vmaddaz.xyzw acc, vf9, vf2
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf11, vf10, vf2); // vmaddw.xyzw vf11, vf10, vf2
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf3); // vmulax.xyzw acc, vf7, vf3
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf3); // vmadday.xyzw acc, vf8, vf3
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf3); // vmaddaz.xyzw acc, vf9, vf3
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf12, vf10, vf3); // vmaddw.xyzw vf12, vf10, vf3
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf4); // vmulax.xyzw acc, vf7, vf4
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf4); // vmadday.xyzw acc, vf8, vf4
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf4); // vmaddaz.xyzw acc, vf9, vf4
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf13, vf10, vf4); // vmaddw.xyzw vf13, vf10, vf4
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf7, vf15); // vmulax.xyzw acc, vf7, vf15
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf8, vf15); // vmadday.xyzw acc, vf8, vf15
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf9, vf15); // vmaddaz.xyzw acc, vf9, vf15
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf14, vf10, vf0); // vmaddw.xyzw vf14, vf10, vf0
|
||||
c->sqc2(vf11, 0, a2); // sqc2 vf11, 0(a2)
|
||||
c->sqc2(vf12, 16, a2); // sqc2 vf12, 16(a2)
|
||||
c->sqc2(vf13, 32, a2); // sqc2 vf13, 32(a2)
|
||||
c->sqc2(vf14, 48, a2); // sqc2 vf14, 48(a2)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 192); // daddiu sp, sp, 192
|
||||
// nop // sll r0, r0, 0
|
||||
goto end_of_function; // return
|
||||
|
||||
//jr ra // jr ra
|
||||
@@ -218,14 +133,11 @@ end_of_function:
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.fake_scratchpad_data = intern_from_c(-1, 0, "*fake-scratchpad-data*").c();
|
||||
cache.clear_frame_accumulator = intern_from_c(-1, 0, "clear-frame-accumulator").c();
|
||||
cache.decompress_fixed_data_to_accumulator = intern_from_c(-1, 0, "decompress-fixed-data-to-accumulator").c();
|
||||
cache.decompress_frame_data_pair_to_accumulator = intern_from_c(-1, 0, "decompress-frame-data-pair-to-accumulator").c();
|
||||
cache.decompress_frame_data_to_accumulator = intern_from_c(-1, 0, "decompress-frame-data-to-accumulator").c();
|
||||
cache.normalize_frame_quaternions = intern_from_c(-1, 0, "normalize-frame-quaternions").c();
|
||||
gLinkedFunctionTable.reg("calc-animation-from-spr", execute, 512);
|
||||
gLinkedFunctionTable.reg("cspace<-parented-transformq-joint!", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace calc_animation_from_spr
|
||||
} // namespace Mips2C
|
||||
} // namespace cspace_parented_transformq_joint
|
||||
} // namespace Mips2C
|
||||
// add cspace_parented_transformq_joint::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace cspace_parented_transformq_joint { extern void link(); }
|
||||
+504
-158
@@ -342,153 +342,9 @@ void link() {
|
||||
|
||||
} // namespace method_32_sky_work
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_31_sky_work {
|
||||
struct Cache {
|
||||
void* z_vector; // *z-vector*
|
||||
void* vector_normalize; // vector-normalize!
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -80); // daddiu sp, sp, -80
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s4, 32, sp); // sq s4, 32(sp)
|
||||
c->sq(s5, 48, sp); // sq s5, 48(sp)
|
||||
c->sq(gp, 64, sp); // sq gp, 64(sp)
|
||||
c->mov64(gp, a0); // or gp, a0, r0
|
||||
c->mov64(s4, a1); // or s4, a1, r0
|
||||
c->mov64(s5, a2); // or s5, a2, r0
|
||||
c->daddiu(v1, s4, 32); // daddiu v1, s4, 32
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lq(a0, 0, a0); // lq a0, 0(a0)
|
||||
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
||||
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
||||
c->daddiu(a0, s4, 32); // daddiu a0, s4, 32
|
||||
c->lui(a1, 16256); // lui a1, 16256
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->daddu(a1, r0, s4); // daddu a1, r0, s4
|
||||
c->load_symbol2(v1, cache.z_vector); // lw v1, *z-vector*(s7)
|
||||
c->daddiu(a0, s4, 32); // daddiu a0, s4, 32
|
||||
c->lqc2(vf1, 0, v1); // lqc2 vf1, 0(v1)
|
||||
c->lqc2(vf2, 0, a0); // lqc2 vf2, 0(a0)
|
||||
c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2
|
||||
c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1
|
||||
c->sqc2(vf3, 0, a1); // sqc2 vf3, 0(a1)
|
||||
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
||||
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
||||
c->lui(a1, 16256); // lui a1, 16256
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->daddiu(a1, s4, 16); // daddiu a1, s4, 16
|
||||
c->daddiu(v1, s4, 32); // daddiu v1, s4, 32
|
||||
c->daddu(a0, r0, s4); // daddu a0, r0, s4
|
||||
c->lqc2(vf1, 0, v1); // lqc2 vf1, 0(v1)
|
||||
c->lqc2(vf2, 0, a0); // lqc2 vf2, 0(a0)
|
||||
c->vopmula(vf1, vf2); // vopmula.xyz acc, vf1, vf2
|
||||
c->vopmsub(vf3, vf2, vf1); // vopmsub.xyz vf3, vf2, vf1
|
||||
c->sqc2(vf3, 0, a1); // sqc2 vf3, 0(a1)
|
||||
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
||||
c->daddiu(a0, s4, 16); // daddiu a0, s4, 16
|
||||
c->lui(a1, 16256); // lui a1, 16256
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->daddiu(s4, sp, 16); // daddiu s4, sp, 16
|
||||
c->mov64(v1, s4); // or v1, s4, r0
|
||||
c->lq(a0, 0, s5); // lq a0, 0(s5)
|
||||
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
||||
c->load_symbol2(t9, cache.vector_normalize); // lw t9, vector-normalize!(s7)
|
||||
c->mov64(a0, s4); // or a0, s4, r0
|
||||
c->lui(a1, -16512); // lui a1, -16512
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mtc1(f0, r0); // mtc1 f0, r0
|
||||
c->lui(v1, 16256); // lui v1, 16256
|
||||
c->mtc1(f1, v1); // mtc1 f1, v1
|
||||
c->lui(v1, 16800); // lui v1, 16800
|
||||
c->mtc1(f2, v1); // mtc1 f2, v1
|
||||
c->lui(v1, 15692); // lui v1, 15692
|
||||
c->ori(v1, v1, 52429); // ori v1, v1, 52429
|
||||
c->mtc1(f3, v1); // mtc1 f3, v1
|
||||
c->lwc1(f4, 4, s4); // lwc1 f4, 4(s4)
|
||||
c->adds(f3, f3, f4); // add.s f3, f3, f4
|
||||
c->muls(f2, f2, f3); // mul.s f2, f2, f3
|
||||
c->mins(f1, f1, f2); // min.s f1, f1, f2
|
||||
c->maxs(f0, f0, f1); // max.s f0, f0, f1
|
||||
c->addiu(v1, r0, 0); // addiu v1, r0, 0
|
||||
//beq r0, r0, L43 // beq r0, r0, L43
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_2; // branch always
|
||||
|
||||
|
||||
block_1:
|
||||
c->lui(a0, 17152); // lui a0, 17152
|
||||
c->mtc1(f1, a0); // mtc1 f1, a0
|
||||
c->lui(a0, 16640); // lui a0, 16640
|
||||
c->mtc1(f2, a0); // mtc1 f2, a0
|
||||
c->mtc1(f3, v1); // mtc1 f3, v1
|
||||
c->cvtsw(f3, f3); // cvt.s.w f3, f3
|
||||
c->muls(f2, f2, f3); // mul.s f2, f2, f3
|
||||
c->subs(f1, f1, f2); // sub.s f1, f1, f2
|
||||
c->muls(f1, f1, f0); // mul.s f1, f1, f0
|
||||
c->dsll(a0, v1, 4); // dsll a0, v1, 4
|
||||
c->daddiu(a0, a0, 528); // daddiu a0, a0, 528
|
||||
c->daddu(a0, a0, gp); // daddu a0, a0, gp
|
||||
c->cvtws(f2, f1); // cvt.w.s f2, f1
|
||||
c->swc1(f2, 0, a0); // swc1 f2, 0(a0)
|
||||
c->cvtws(f2, f1); // cvt.w.s f2, f1
|
||||
c->swc1(f2, 4, a0); // swc1 f2, 4(a0)
|
||||
c->cvtws(f1, f1); // cvt.w.s f1, f1
|
||||
c->swc1(f1, 8, a0); // swc1 f1, 8(a0)
|
||||
c->addiu(a1, r0, 128); // addiu a1, r0, 128
|
||||
c->sw(a1, 12, a0); // sw a1, 12(a0)
|
||||
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
||||
|
||||
block_2:
|
||||
c->slti(a0, v1, 16); // slti a0, v1, 16
|
||||
bc = c->sgpr64(a0) != 0; // bne a0, r0, L42
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 64, sp); // lq gp, 64(sp)
|
||||
c->lq(s5, 48, sp); // lq s5, 48(sp)
|
||||
c->lq(s4, 32, sp); // lq s4, 32(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 80); // daddiu sp, sp, 80
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.z_vector = intern_from_c(-1, 0, "*z-vector*").c();
|
||||
cache.vector_normalize = intern_from_c(-1, 0, "vector-normalize!").c();
|
||||
gLinkedFunctionTable.reg("(method 31 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_31_sky_work
|
||||
} // namespace Mips2C
|
||||
|
||||
// add method_32_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_32_sky_work { extern void link(); }
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -497,7 +353,7 @@ using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_30_sky_work {
|
||||
struct Cache {
|
||||
// TODO FIX - void* adgif_shader<_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* adgif_shader_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
||||
} cache;
|
||||
|
||||
@@ -686,7 +542,7 @@ block_15:
|
||||
c->lq(v1, 16, gp); // lq v1, 16(gp)
|
||||
c->sq(v1, 16, s5); // sq v1, 16(s5)
|
||||
c->daddiu(s4, s5, 32); // daddiu s4, s5, 32
|
||||
// TODO - fix c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->load_symbol2(t9, cache.adgif_shader_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->mov64(a0, s4); // or a0, s4, r0
|
||||
c->lwu(a1, 16, sp); // lwu a1, 16(sp)
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
@@ -699,7 +555,7 @@ block_15:
|
||||
c->lq(v1, 16, gp); // lq v1, 16(gp)
|
||||
c->sq(v1, 352, s5); // sq v1, 352(s5)
|
||||
c->daddiu(s5, s5, 368); // daddiu s5, s5, 368
|
||||
// TODO FIX - c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->load_symbol2(t9, cache.adgif_shader_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(a1, 20, sp); // lwu a1, 20(sp)
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
@@ -730,14 +586,16 @@ end_of_function:
|
||||
}
|
||||
|
||||
void link() {
|
||||
// TODO FIX - cache.adgif_shader<_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.adgif_shader_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
||||
gLinkedFunctionTable.reg("(method 30 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_30_sky_work
|
||||
} // namespace Mips2C
|
||||
|
||||
// add method_30_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_30_sky_work { extern void link(); }
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -746,7 +604,7 @@ using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_29_sky_work {
|
||||
struct Cache {
|
||||
// TODO - fix void* adgif_shader<_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* adgif_shader_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
||||
} cache;
|
||||
|
||||
@@ -890,7 +748,7 @@ block_12:
|
||||
c->lq(a0, 16, gp); // lq a0, 16(gp)
|
||||
c->sq(a0, 16, v1); // sq a0, 16(v1)
|
||||
c->daddiu(s5, v1, 32); // daddiu s5, v1, 32
|
||||
// TODO fix - c->load_symbol2(t9, cache.adgif_shader<_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->load_symbol2(t9, cache.adgif_shader_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(a1, 16, sp); // lwu a1, 16(sp)
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
@@ -921,14 +779,16 @@ end_of_function:
|
||||
}
|
||||
|
||||
void link() {
|
||||
// TODO - fix cache.adgif_shader<_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.adgif_shader_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
||||
gLinkedFunctionTable.reg("(method 29 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_29_sky_work
|
||||
} // namespace Mips2C
|
||||
|
||||
// add method_29_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_29_sky_work { extern void link(); }
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -983,7 +843,9 @@ void link() {
|
||||
|
||||
} // namespace method_17_sky_work
|
||||
} // namespace Mips2C
|
||||
|
||||
// add method_17_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_17_sky_work { extern void link(); }
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -1804,4 +1666,488 @@ void link() {
|
||||
}
|
||||
|
||||
} // namespace set_tex_offset
|
||||
} // namespace Mips2C
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_16_sky_work {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
bool cop1_bc = false;
|
||||
c->daddiu(sp, sp, -32); // daddiu sp, sp, -32
|
||||
c->lwu(a2, 176, a1); // lwu a2, 176(a1)
|
||||
c->daddiu(v1, sp, 16); // daddiu v1, sp, 16
|
||||
c->sq(r0, 0, v1); // sq r0, 0(v1)
|
||||
c->daddiu(a1, a0, 1472); // daddiu a1, a0, 1472
|
||||
c->mov64(a3, v1); // or a3, v1, r0
|
||||
c->daddiu(t0, a2, 812); // daddiu t0, a2, 812
|
||||
c->lq(t0, 0, t0); // lq t0, 0(t0)
|
||||
c->sq(t0, 0, a3); // sq t0, 0(a3)
|
||||
c->mtc1(f0, r0); // mtc1 f0, r0
|
||||
c->lwc1(f1, 928, a2); // lwc1 f1, 928(a2)
|
||||
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
||||
bc = !cop1_bc; // bc1f L87
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->lui(a3, 16256); // lui a3, 16256
|
||||
c->mtc1(f0, a3); // mtc1 f0, a3
|
||||
c->lwc1(f1, 4, v1); // lwc1 f1, 4(v1)
|
||||
c->adds(f0, f0, f1); // add.s f0, f0, f1
|
||||
c->swc1(f0, 4, v1); // swc1 f0, 4(v1)
|
||||
c->mfc1(a3, f0); // mfc1 a3, f0
|
||||
//beq r0, r0, L88 // beq r0, r0, L88
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_3; // branch always
|
||||
|
||||
|
||||
block_2:
|
||||
c->lui(a3, -16512); // lui a3, -16512
|
||||
c->mtc1(f0, a3); // mtc1 f0, a3
|
||||
c->lwc1(f1, 4, v1); // lwc1 f1, 4(v1)
|
||||
c->adds(f0, f0, f1); // add.s f0, f0, f1
|
||||
c->swc1(f0, 4, v1); // swc1 f0, 4(v1)
|
||||
c->mfc1(a3, f0); // mfc1 a3, f0
|
||||
|
||||
block_3:
|
||||
c->daddiu(a3, a0, 1024); // daddiu a3, a0, 1024
|
||||
c->lwc1(f0, 908, a2); // lwc1 f0, 908(a2)
|
||||
c->swc1(f0, 0, a3); // swc1 f0, 0(a3)
|
||||
c->lwc1(f0, 128, a2); // lwc1 f0, 128(a2)
|
||||
c->swc1(f0, 4, a3); // swc1 f0, 4(a3)
|
||||
c->lwc1(f0, 124, a2); // lwc1 f0, 124(a2)
|
||||
c->swc1(f0, 8, a3); // swc1 f0, 8(a3)
|
||||
c->lui(t0, 16256); // lui t0, 16256
|
||||
c->mtc1(f0, t0); // mtc1 f0, t0
|
||||
c->swc1(f0, 12, a3); // swc1 f0, 12(a3)
|
||||
c->lqc2(vf31, 0, a1); // lqc2 vf31, 0(a1)
|
||||
c->lqc2(vf30, 16, a1); // lqc2 vf30, 16(a1)
|
||||
c->lqc2(vf29, 32, a1); // lqc2 vf29, 32(a1)
|
||||
c->lqc2(vf28, 48, a1); // lqc2 vf28, 48(a1)
|
||||
c->lqc2(vf14, 780, a2); // lqc2 vf14, 780(a2)
|
||||
c->lqc2(vf26, 796, a2); // lqc2 vf26, 796(a2)
|
||||
c->lqc2(vf25, 0, v1); // lqc2 vf25, 0(v1)
|
||||
c->lqc2(vf13, 1024, a0); // lqc2 vf13, 1024(a0)
|
||||
c->vmul(DEST::xyzw, vf31, vf31, vf14); // vmul.xyzw vf31, vf31, vf14
|
||||
c->vmul(DEST::xyzw, vf30, vf30, vf14); // vmul.xyzw vf30, vf30, vf14
|
||||
c->vmul(DEST::xyzw, vf29, vf29, vf14); // vmul.xyzw vf29, vf29, vf14
|
||||
c->vmul(DEST::xyzw, vf28, vf28, vf14); // vmul.xyzw vf28, vf28, vf14
|
||||
c->vmove(DEST::z, vf25, vf0); // vmove.z vf25, vf0
|
||||
c->vmove(DEST::xyzw, vf24, vf0); // vmove.xyzw vf24, vf0
|
||||
c->vmove(DEST::xyzw, vf23, vf0); // vmove.xyzw vf23, vf0
|
||||
c->mov128_gpr_vf(v1, vf23); // qmfc2.i v1, vf23
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 32); // daddiu sp, sp, 32
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 16 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_16_sky_work
|
||||
} // namespace Mips2C
|
||||
// add method_16_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_16_sky_work { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_28_sky_work {
|
||||
struct Cache {
|
||||
void* adgif_shader_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
bool cop1_bc = false;
|
||||
c->daddiu(sp, sp, -64); // daddiu sp, sp, -64
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s5, 32, sp); // sq s5, 32(sp)
|
||||
c->sq(gp, 48, sp); // sq gp, 48(sp)
|
||||
c->mov64(gp, a0); // or gp, a0, r0
|
||||
c->mov64(s5, a2); // or s5, a2, r0
|
||||
c->sw(a1, 1916, gp); // sw a1, 1916(gp)
|
||||
c->load_symbol2(t9, cache.lookup_texture_by_id_fast);// lw t9, lookup-texture-by-id-fast(s7)
|
||||
c->lui(v1, 128); // lui v1, 128
|
||||
c->ori(a0, v1, 2304); // ori a0, v1, 2304
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->sw(v0, 16, sp); // sw v0, 16(sp)
|
||||
c->lwu(v1, 16, sp); // lwu v1, 16(sp)
|
||||
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L56
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_14;} // branch non-likely
|
||||
|
||||
c->lqc2(vf15, 1184, gp); // lqc2 vf15, 1184(gp)
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf15); // vmulax.xyzw acc, vf31, vf15
|
||||
c->lqc2(vf1, 224, gp); // lqc2 vf1, 224(gp)
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf15); // vmadday.xyzw acc, vf30, vf15
|
||||
c->lqc2(vf4, 240, gp); // lqc2 vf4, 240(gp)
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf15); // vmaddaz.xyzw acc, vf29, vf15
|
||||
c->lqc2(vf2, 784, gp); // lqc2 vf2, 784(gp)
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf15, vf28, vf0); // vmaddw.xyzw vf15, vf28, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmul(DEST::xyzw, vf16, vf15, vf14); // vmul.xyzw vf16, vf15, vf14
|
||||
c->lqc2(vf5, 800, gp); // lqc2 vf5, 800(gp)
|
||||
c->vdiv(vf0, BC::w, vf16, BC::w); // vdiv Q, vf0.w, vf16.w
|
||||
c->lqc2(vf8, 32, gp); // lqc2 vf8, 32(gp)
|
||||
c->lqc2(vf11, 48, gp); // lqc2 vf11, 48(gp)
|
||||
c->lqc2(vf3, 416, gp); // lqc2 vf3, 416(gp)
|
||||
c->lqc2(vf6, 432, gp); // lqc2 vf6, 432(gp)
|
||||
c->vwaitq(); // vwaitq
|
||||
c->vmulq(DEST::xyz, vf15, vf15); // vmulq.xyz vf15, vf15, Q
|
||||
c->vmulq(DEST::xyzw, vf16, vf26); // vmulq.xyzw vf16, vf26, Q
|
||||
c->vmul_bc(DEST::xyzw, BC::w, vf1, vf1, vf16); // vmulw.xyzw vf1, vf1, vf16
|
||||
c->vmul_bc(DEST::xyzw, BC::w, vf4, vf4, vf16); // vmulw.xyzw vf4, vf4, vf16
|
||||
c->vadd(DEST::xyzw, vf15, vf15, vf25); // vadd.xyzw vf15, vf15, vf25
|
||||
c->vadd(DEST::xyz, vf1, vf1, vf15); // vadd.xyz vf1, vf1, vf15
|
||||
c->vadd(DEST::xyz, vf4, vf4, vf15); // vadd.xyz vf4, vf4, vf15
|
||||
c->vftoi4(DEST::xyz, vf1, vf1); // vftoi4.xyz vf1, vf1
|
||||
c->vftoi4(DEST::xyzw, vf4, vf4); // vftoi4.xyzw vf4, vf4
|
||||
c->sqc2(vf1, 1600, gp); // sqc2 vf1, 1600(gp)
|
||||
c->sqc2(vf4, 1616, gp); // sqc2 vf4, 1616(gp)
|
||||
c->lw(v1, 1612, gp); // lw v1, 1612(gp)
|
||||
c->mtc1(f0, v1); // mtc1 f0, v1
|
||||
c->mtc1(f1, r0); // mtc1 f1, r0
|
||||
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
||||
bc = !cop1_bc; // bc1f L54
|
||||
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
||||
if (bc) {goto block_3;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
|
||||
block_3:
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(v1))) {// beql s7, v1, L55
|
||||
c->mov64(v1, v1); // or v1, v1, r0
|
||||
goto block_12;
|
||||
}
|
||||
|
||||
block_5:
|
||||
c->lw(v1, 1600, gp); // lw v1, 1600(gp)
|
||||
c->lw(a0, 556, s5); // lw a0, 556(s5)
|
||||
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
||||
c->slt(v1, v1, a0); // slt v1, v1, a0
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
c->movz(a0, s7, v1); // movz a0, s7, v1
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L55
|
||||
c->mov64(v1, a0); // or v1, a0, r0
|
||||
goto block_12;
|
||||
}
|
||||
|
||||
block_7:
|
||||
c->lw(v1, 1604, gp); // lw v1, 1604(gp)
|
||||
c->lw(a0, 560, s5); // lw a0, 560(s5)
|
||||
c->dsll(a0, a0, 4); // dsll a0, a0, 4
|
||||
c->slt(v1, v1, a0); // slt v1, v1, a0
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
c->movz(a0, s7, v1); // movz a0, s7, v1
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L55
|
||||
c->mov64(v1, a0); // or v1, a0, r0
|
||||
goto block_12;
|
||||
}
|
||||
|
||||
block_9:
|
||||
c->addiu(v1, r0, 28672); // addiu v1, r0, 28672
|
||||
c->lw(a0, 1616, gp); // lw a0, 1616(gp)
|
||||
c->slt(v1, v1, a0); // slt v1, v1, a0
|
||||
c->daddiu(a0, s7, 4); // daddiu a0, s7, 4
|
||||
c->movz(a0, s7, v1); // movz a0, s7, v1
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a0))) {// beql s7, a0, L55
|
||||
c->mov64(v1, a0); // or v1, a0, r0
|
||||
goto block_12;
|
||||
}
|
||||
|
||||
block_11:
|
||||
c->addiu(v1, r0, 29440); // addiu v1, r0, 29440
|
||||
c->lw(a0, 1620, gp); // lw a0, 1620(gp)
|
||||
c->slt(a0, v1, a0); // slt a0, v1, a0
|
||||
c->daddiu(v1, s7, 4); // daddiu v1, s7, 4
|
||||
c->movz(v1, s7, a0); // movz v1, s7, a0
|
||||
|
||||
block_12:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(v1); // beq s7, v1, L56
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
if (bc) {goto block_14;} // branch non-likely
|
||||
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(t0, 4, v1); // lwu t0, 4(v1)
|
||||
c->vsub(DEST::z, vf1, vf0, vf0); // vsub.z vf1, vf0, vf0
|
||||
c->vsub(DEST::z, vf4, vf0, vf0); // vsub.z vf4, vf0, vf0
|
||||
c->sqc2(vf8, 112, t0); // sqc2 vf8, 112(t0)
|
||||
c->sqc2(vf11, 128, t0); // sqc2 vf11, 128(t0)
|
||||
c->sqc2(vf3, 144, t0); // sqc2 vf3, 144(t0)
|
||||
c->sqc2(vf2, 160, t0); // sqc2 vf2, 160(t0)
|
||||
c->sqc2(vf1, 176, t0); // sqc2 vf1, 176(t0)
|
||||
c->sqc2(vf5, 192, t0); // sqc2 vf5, 192(t0)
|
||||
c->sqc2(vf4, 208, t0); // sqc2 vf4, 208(t0)
|
||||
c->sqc2(vf8, 224, t0); // sqc2 vf8, 224(t0)
|
||||
c->sqc2(vf11, 240, t0); // sqc2 vf11, 240(t0)
|
||||
c->sqc2(vf6, 256, t0); // sqc2 vf6, 256(t0)
|
||||
c->sqc2(vf2, 272, t0); // sqc2 vf2, 272(t0)
|
||||
c->sqc2(vf1, 288, t0); // sqc2 vf1, 288(t0)
|
||||
c->sqc2(vf5, 304, t0); // sqc2 vf5, 304(t0)
|
||||
c->sqc2(vf4, 320, t0); // sqc2 vf4, 320(t0)
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
||||
c->lq(a0, 0, gp); // lq a0, 0(gp)
|
||||
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
||||
c->lq(a0, 16, gp); // lq a0, 16(gp)
|
||||
c->sq(a0, 16, v1); // sq a0, 16(v1)
|
||||
c->daddiu(s5, v1, 32); // daddiu s5, v1, 32
|
||||
c->load_symbol2(t9, cache.adgif_shader_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(a1, 16, sp); // lwu a1, 16(sp)
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->addiu(v1, r0, 72); // addiu v1, r0, 72
|
||||
c->sd(v1, 64, s5); // sd v1, 64(s5)
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
||||
c->daddiu(v1, v1, 336); // daddiu v1, v1, 336
|
||||
c->lwu(a0, 1916, gp); // lwu a0, 1916(gp)
|
||||
c->sw(v1, 4, a0); // sw v1, 4(a0)
|
||||
|
||||
block_14:
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 48, sp); // lq gp, 48(sp)
|
||||
c->lq(s5, 32, sp); // lq s5, 32(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 64); // daddiu sp, sp, 64
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.adgif_shader_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
||||
gLinkedFunctionTable.reg("(method 28 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_28_sky_work
|
||||
} // namespace Mips2C
|
||||
// add method_28_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_28_sky_work { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_33_sky_work {
|
||||
struct Cache {
|
||||
void* adgif_shader_texture_simple; // adgif-shader<-texture-simple!
|
||||
void* lookup_texture_by_id_fast; // lookup-texture-by-id-fast
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -64); // daddiu sp, sp, -64
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s4, 16, sp); // sq s4, 16(sp)
|
||||
c->sq(s5, 32, sp); // sq s5, 32(sp)
|
||||
c->sq(gp, 48, sp); // sq gp, 48(sp)
|
||||
c->mov64(gp, a0); // or gp, a0, r0
|
||||
c->mov64(s5, a2); // or s5, a2, r0
|
||||
c->sw(a1, 1916, gp); // sw a1, 1916(gp)
|
||||
c->load_symbol2(t9, cache.lookup_texture_by_id_fast);// lw t9, lookup-texture-by-id-fast(s7)
|
||||
c->lui(v1, 128); // lui v1, 128
|
||||
c->ori(a0, v1, 2560); // ori a0, v1, 2560
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(a1, v0); // or a1, v0, r0
|
||||
bc = c->sgpr64(s7) == c->sgpr64(a1); // beq s7, a1, L31
|
||||
c->mov64(t0, s7); // or t0, s7, r0
|
||||
if (bc) {goto block_14;} // branch non-likely
|
||||
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
||||
c->lq(a0, 0, gp); // lq a0, 0(gp)
|
||||
c->sq(a0, 0, v1); // sq a0, 0(v1)
|
||||
c->lq(a0, 16, gp); // lq a0, 16(gp)
|
||||
c->sq(a0, 16, v1); // sq a0, 16(v1)
|
||||
c->daddiu(s4, v1, 32); // daddiu s4, v1, 32
|
||||
c->load_symbol2(t9, cache.adgif_shader_texture_simple);// lw t9, adgif-shader<-texture-simple!(s7)
|
||||
c->mov64(a0, s4); // or a0, s4, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->addiu(v1, r0, 72); // addiu v1, r0, 72
|
||||
c->sd(v1, 64, s4); // sd v1, 64(s4)
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(v1, 4, v1); // lwu v1, 4(v1)
|
||||
c->daddiu(v1, v1, 112); // daddiu v1, v1, 112
|
||||
c->lwu(a0, 1916, gp); // lwu a0, 1916(gp)
|
||||
c->sw(v1, 4, a0); // sw v1, 4(a0)
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->lwu(t0, 4, v1); // lwu t0, 4(v1)
|
||||
c->mov64(v1, gp); // or v1, gp, r0
|
||||
c->addiu(a1, r0, 0); // addiu a1, r0, 0
|
||||
c->lqc2(vf2, 784, gp); // lqc2 vf2, 784(gp)
|
||||
c->lqc2(vf5, 800, gp); // lqc2 vf5, 800(gp)
|
||||
c->lqc2(vf8, 32, gp); // lqc2 vf8, 32(gp)
|
||||
c->lqc2(vf11, 48, gp); // lqc2 vf11, 48(gp)
|
||||
c->addiu(a0, r0, 0); // addiu a0, r0, 0
|
||||
//beq r0, r0, L30 // beq r0, r0, L30
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_12; // branch always
|
||||
|
||||
|
||||
block_2:
|
||||
c->lqc2(vf15, 1920, v1); // lqc2 vf15, 1920(v1)
|
||||
c->daddiu(v1, v1, 16); // daddiu v1, v1, 16
|
||||
c->vmula_bc(DEST::xyzw, BC::x, vf31, vf15); // vmulax.xyzw acc, vf31, vf15
|
||||
c->lqc2(vf1, 384, gp); // lqc2 vf1, 384(gp)
|
||||
c->vmadda_bc(DEST::xyzw, BC::y, vf30, vf15); // vmadday.xyzw acc, vf30, vf15
|
||||
c->lqc2(vf4, 400, gp); // lqc2 vf4, 400(gp)
|
||||
c->vmadda_bc(DEST::xyzw, BC::z, vf29, vf15); // vmaddaz.xyzw acc, vf29, vf15
|
||||
c->daddu(a2, gp, a1); // daddu a2, gp, a1
|
||||
c->vmadd_bc(DEST::xyzw, BC::w, vf15, vf28, vf0); // vmaddw.xyzw vf15, vf28, vf0
|
||||
// nop // sll r0, r0, 0
|
||||
c->vmul(DEST::xyzw, vf16, vf15, vf14); // vmul.xyzw vf16, vf15, vf14
|
||||
c->lqc2(vf3, 528, a2); // lqc2 vf3, 528(a2)
|
||||
c->vdiv(vf0, BC::w, vf16, BC::w); // vdiv Q, vf0.w, vf16.w
|
||||
c->daddiu(a1, a1, 16); // daddiu a1, a1, 16
|
||||
c->vwaitq(); // vwaitq
|
||||
c->andi(a1, a1, 255); // andi a1, a1, 255
|
||||
c->vmulq(DEST::xyz, vf15, vf15); // vmulq.xyz vf15, vf15, Q
|
||||
c->vadd(DEST::xyzw, vf15, vf15, vf25); // vadd.xyzw vf15, vf15, vf25
|
||||
c->vadd(DEST::xyz, vf1, vf1, vf15); // vadd.xyz vf1, vf1, vf15
|
||||
c->vadd(DEST::xyz, vf4, vf4, vf15); // vadd.xyz vf4, vf4, vf15
|
||||
c->vftoi4(DEST::xyzw, vf1, vf1); // vftoi4.xyzw vf1, vf1
|
||||
c->vftoi4(DEST::xyzw, vf4, vf4); // vftoi4.xyzw vf4, vf4
|
||||
c->sqc2(vf1, 1600, gp); // sqc2 vf1, 1600(gp)
|
||||
c->sqc2(vf4, 1616, gp); // sqc2 vf4, 1616(gp)
|
||||
c->lw(a2, 1600, gp); // lw a2, 1600(gp)
|
||||
c->lw(a3, 556, s5); // lw a3, 556(s5)
|
||||
c->dsll(a3, a3, 4); // dsll a3, a3, 4
|
||||
c->slt(a2, a2, a3); // slt a2, a2, a3
|
||||
c->daddiu(a3, s7, 4); // daddiu a3, s7, 4
|
||||
c->movz(a3, s7, a2); // movz a3, s7, a2
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a3))) {// beql s7, a3, L28
|
||||
c->mov64(a2, a3); // or a2, a3, r0
|
||||
goto block_9;
|
||||
}
|
||||
|
||||
block_4:
|
||||
c->lw(a2, 1604, gp); // lw a2, 1604(gp)
|
||||
c->lw(a3, 560, s5); // lw a3, 560(s5)
|
||||
c->dsll(a3, a3, 4); // dsll a3, a3, 4
|
||||
c->slt(a2, a2, a3); // slt a2, a2, a3
|
||||
c->daddiu(a3, s7, 4); // daddiu a3, s7, 4
|
||||
c->movz(a3, s7, a2); // movz a3, s7, a2
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a3))) {// beql s7, a3, L28
|
||||
c->mov64(a2, a3); // or a2, a3, r0
|
||||
goto block_9;
|
||||
}
|
||||
|
||||
block_6:
|
||||
c->addiu(a2, r0, 28672); // addiu a2, r0, 28672
|
||||
c->lw(a3, 1616, gp); // lw a3, 1616(gp)
|
||||
c->slt(a2, a2, a3); // slt a2, a2, a3
|
||||
c->daddiu(a3, s7, 4); // daddiu a3, s7, 4
|
||||
c->movz(a3, s7, a2); // movz a3, s7, a2
|
||||
if (((s64)c->sgpr64(s7)) == ((s64)c->sgpr64(a3))) {// beql s7, a3, L28
|
||||
c->mov64(a2, a3); // or a2, a3, r0
|
||||
goto block_9;
|
||||
}
|
||||
|
||||
block_8:
|
||||
c->addiu(a2, r0, 29440); // addiu a2, r0, 29440
|
||||
c->lw(a3, 1620, gp); // lw a3, 1620(gp)
|
||||
c->slt(a3, a2, a3); // slt a3, a2, a3
|
||||
c->daddiu(a2, s7, 4); // daddiu a2, s7, 4
|
||||
c->movz(a2, s7, a3); // movz a2, s7, a3
|
||||
|
||||
block_9:
|
||||
bc = c->sgpr64(s7) == c->sgpr64(a2); // beq s7, a2, L29
|
||||
c->mov64(a2, s7); // or a2, s7, r0
|
||||
if (bc) {goto block_11;} // branch non-likely
|
||||
|
||||
c->vsub(DEST::z, vf1, vf0, vf0); // vsub.z vf1, vf0, vf0
|
||||
c->vsub(DEST::z, vf4, vf0, vf0); // vsub.z vf4, vf0, vf0
|
||||
c->sqc2(vf8, 0, t0); // sqc2 vf8, 0(t0)
|
||||
c->sqc2(vf11, 16, t0); // sqc2 vf11, 16(t0)
|
||||
c->sqc2(vf3, 32, t0); // sqc2 vf3, 32(t0)
|
||||
c->sqc2(vf2, 48, t0); // sqc2 vf2, 48(t0)
|
||||
c->sqc2(vf1, 64, t0); // sqc2 vf1, 64(t0)
|
||||
c->sqc2(vf5, 80, t0); // sqc2 vf5, 80(t0)
|
||||
c->sqc2(vf4, 96, t0); // sqc2 vf4, 96(t0)
|
||||
c->daddiu(t0, t0, 112); // daddiu t0, t0, 112
|
||||
c->mov64(a2, t0); // or a2, t0, r0
|
||||
|
||||
block_11:
|
||||
c->daddiu(a0, a0, 1); // daddiu a0, a0, 1
|
||||
|
||||
block_12:
|
||||
c->slti(a2, a0, 512); // slti a2, a0, 512
|
||||
bc = c->sgpr64(a2) != 0; // bne a2, r0, L27
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->lwu(v1, 1916, gp); // lwu v1, 1916(gp)
|
||||
c->sw(t0, 4, v1); // sw t0, 4(v1)
|
||||
|
||||
block_14:
|
||||
c->mov64(v1, t0); // or v1, t0, r0
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 48, sp); // lq gp, 48(sp)
|
||||
c->lq(s5, 32, sp); // lq s5, 32(sp)
|
||||
c->lq(s4, 16, sp); // lq s4, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 64); // daddiu sp, sp, 64
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.adgif_shader_texture_simple = intern_from_c(-1, 0, "adgif-shader<-texture-simple!").c();
|
||||
cache.lookup_texture_by_id_fast = intern_from_c(-1, 0, "lookup-texture-by-id-fast").c();
|
||||
gLinkedFunctionTable.reg("(method 33 sky-work)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_33_sky_work
|
||||
} // namespace Mips2C
|
||||
// add method_33_sky_work::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_33_sky_work { extern void link(); }
|
||||
@@ -1,353 +1,3 @@
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_19_grid_hash {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -32); // daddiu sp, sp, -32
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(gp, 16, sp); // sq gp, 16(sp)
|
||||
c->addiu(v1, r0, 0); // addiu v1, r0, 0
|
||||
//beq r0, r0, L235 // beq r0, r0, L235
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_2; // branch always
|
||||
|
||||
|
||||
block_1:
|
||||
c->daddu(a3, v1, a0); // daddu a3, v1, a0
|
||||
c->lb(a3, 24, a3); // lb a3, 24(a3)
|
||||
c->daddu(t0, v1, a2); // daddu t0, v1, a2
|
||||
c->sb(a3, 0, t0); // sb a3, 0(t0)
|
||||
c->addiu(a3, r0, -1); // addiu a3, r0, -1
|
||||
c->daddu(t0, v1, a2); // daddu t0, v1, a2
|
||||
c->sb(a3, 3, t0); // sb a3, 3(t0)
|
||||
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
||||
|
||||
block_2:
|
||||
c->slti(a3, v1, 3); // slti a3, v1, 3
|
||||
bc = c->sgpr64(a3) != 0; // bne a3, r0, L234
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->lh(v1, 10, a0); // lh v1, 10(a0)
|
||||
c->lb(a3, 24, a0); // lb a3, 24(a0)
|
||||
c->mult3(a3, a3, v1); // mult3 a3, a3, v1
|
||||
c->lb(t0, 26, a0); // lb t0, 26(a0)
|
||||
c->mult3(t0, t0, a3); // mult3 t0, t0, a3
|
||||
c->lb(t1, 24, a0); // lb t1, 24(a0)
|
||||
c->lb(t2, 26, a0); // lb t2, 26(a0)
|
||||
c->lb(t3, 25, a0); // lb t3, 25(a0)
|
||||
c->dsra(t4, a1, 3); // dsra t4, a1, 3
|
||||
c->daddu(t4, r0, t4); // daddu t4, r0, t4
|
||||
c->lwu(a0, 28, a0); // lwu a0, 28(a0)
|
||||
c->daddu(a0, t4, a0); // daddu a0, t4, a0
|
||||
c->addiu(t4, r0, 1); // addiu t4, r0, 1
|
||||
c->andi(a1, a1, 7); // andi a1, a1, 7
|
||||
if (((s64)c->sgpr64(a1)) >= 0) { // bgezl a1, L236
|
||||
c->dsllv(a1, t4, a1); // dsllv a1, t4, a1
|
||||
goto block_6;
|
||||
}
|
||||
|
||||
block_5:
|
||||
c->dsubu(a1, r0, a1); // dsubu a1, r0, a1
|
||||
c->dsrav(a1, t4, a1); // dsrav a1, t4, a1
|
||||
|
||||
block_6:
|
||||
c->addiu(t4, r0, 0); // addiu t4, r0, 0
|
||||
//beq r0, r0, L243 // beq r0, r0, L243
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_16; // branch always
|
||||
|
||||
|
||||
block_7:
|
||||
c->mov64(t5, a0); // or t5, a0, r0
|
||||
c->addiu(t6, r0, 0); // addiu t6, r0, 0
|
||||
//beq r0, r0, L242 // beq r0, r0, L242
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_14; // branch always
|
||||
|
||||
|
||||
block_8:
|
||||
c->mov64(t7, t5); // or t7, t5, r0
|
||||
c->addiu(t8, r0, 0); // addiu t8, r0, 0
|
||||
//beq r0, r0, L241 // beq r0, r0, L241
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_12; // branch always
|
||||
|
||||
|
||||
block_9:
|
||||
c->lbu(t9, 0, t7); // lbu t9, 0(t7)
|
||||
c->and_(t9, t9, a1); // and t9, t9, a1
|
||||
bc = c->sgpr64(t9) == 0; // beq t9, r0, L240
|
||||
c->mov64(t9, s7); // or t9, s7, r0
|
||||
if (bc) {goto block_11;} // branch non-likely
|
||||
|
||||
c->lb(t9, 0, a2); // lb t9, 0(a2)
|
||||
c->mov64(t9, t9); // or t9, t9, r0
|
||||
c->mov64(ra, t8); // or ra, t8, r0
|
||||
c->slt(gp, t9, ra); // slt gp, t9, ra
|
||||
c->movz(t9, ra, gp); // movz t9, ra, gp
|
||||
c->sb(t9, 0, a2); // sb t9, 0(a2)
|
||||
c->lb(t9, 1, a2); // lb t9, 1(a2)
|
||||
c->mov64(t9, t9); // or t9, t9, r0
|
||||
c->mov64(ra, t4); // or ra, t4, r0
|
||||
c->slt(gp, t9, ra); // slt gp, t9, ra
|
||||
c->movz(t9, ra, gp); // movz t9, ra, gp
|
||||
c->sb(t9, 1, a2); // sb t9, 1(a2)
|
||||
c->lb(t9, 2, a2); // lb t9, 2(a2)
|
||||
c->mov64(t9, t9); // or t9, t9, r0
|
||||
c->mov64(ra, t6); // or ra, t6, r0
|
||||
c->slt(gp, t9, ra); // slt gp, t9, ra
|
||||
c->movz(t9, ra, gp); // movz t9, ra, gp
|
||||
c->sb(t9, 2, a2); // sb t9, 2(a2)
|
||||
c->lb(t9, 3, a2); // lb t9, 3(a2)
|
||||
c->mov64(t9, t9); // or t9, t9, r0
|
||||
c->mov64(ra, t8); // or ra, t8, r0
|
||||
c->slt(gp, t9, ra); // slt gp, t9, ra
|
||||
c->movn(t9, ra, gp); // movn t9, ra, gp
|
||||
c->sb(t9, 3, a2); // sb t9, 3(a2)
|
||||
c->lb(t9, 4, a2); // lb t9, 4(a2)
|
||||
c->mov64(t9, t9); // or t9, t9, r0
|
||||
c->mov64(ra, t4); // or ra, t4, r0
|
||||
c->slt(gp, t9, ra); // slt gp, t9, ra
|
||||
c->movn(t9, ra, gp); // movn t9, ra, gp
|
||||
c->sb(t9, 4, a2); // sb t9, 4(a2)
|
||||
c->lb(t9, 5, a2); // lb t9, 5(a2)
|
||||
c->mov64(gp, t9); // or gp, t9, r0
|
||||
c->mov64(t9, t6); // or t9, t6, r0
|
||||
c->slt(ra, gp, t9); // slt ra, gp, t9
|
||||
c->movn(gp, t9, ra); // movn gp, t9, ra
|
||||
c->sb(gp, 5, a2); // sb gp, 5(a2)
|
||||
|
||||
block_11:
|
||||
c->daddu(t7, t7, v1); // daddu t7, t7, v1
|
||||
c->daddiu(t8, t8, 1); // daddiu t8, t8, 1
|
||||
|
||||
block_12:
|
||||
c->slt(t9, t8, t1); // slt t9, t8, t1
|
||||
bc = c->sgpr64(t9) != 0; // bne t9, r0, L239
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_9;} // branch non-likely
|
||||
|
||||
c->mov64(t7, s7); // or t7, s7, r0
|
||||
c->mov64(t7, s7); // or t7, s7, r0
|
||||
c->daddu(t5, t5, a3); // daddu t5, t5, a3
|
||||
c->daddiu(t6, t6, 1); // daddiu t6, t6, 1
|
||||
|
||||
block_14:
|
||||
c->slt(t7, t6, t2); // slt t7, t6, t2
|
||||
bc = c->sgpr64(t7) != 0; // bne t7, r0, L238
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_8;} // branch non-likely
|
||||
|
||||
c->mov64(t5, s7); // or t5, s7, r0
|
||||
c->mov64(t5, s7); // or t5, s7, r0
|
||||
c->daddu(a0, a0, t0); // daddu a0, a0, t0
|
||||
c->daddiu(t4, t4, 1); // daddiu t4, t4, 1
|
||||
|
||||
block_16:
|
||||
c->slt(t5, t4, t3); // slt t5, t4, t3
|
||||
bc = c->sgpr64(t5) != 0; // bne t5, r0, L237
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_7;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 16, sp); // lq gp, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 32); // daddiu sp, sp, 32
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 19 grid-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_19_grid_hash
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_38_spatial_hash {
|
||||
struct Cache {
|
||||
void* perf_stats; // *perf-stats*
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
bool cop1_bc = false;
|
||||
c->daddiu(sp, sp, -112); // daddiu sp, sp, -112
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s3, 48, sp); // sq s3, 48(sp)
|
||||
c->sq(s4, 64, sp); // sq s4, 64(sp)
|
||||
c->sq(s5, 80, sp); // sq s5, 80(sp)
|
||||
c->sq(gp, 96, sp); // sq gp, 96(sp)
|
||||
c->mov64(s5, a0); // or s5, a0, r0
|
||||
c->mov64(gp, a1); // or gp, a1, r0
|
||||
c->mov64(s4, a2); // or s4, a2, r0
|
||||
c->mov64(s3, a3); // or s3, a3, r0
|
||||
c->load_symbol2(v1, cache.perf_stats); // lw v1, *perf-stats*(s7)
|
||||
c->daddiu(v1, v1, 116); // daddiu v1, v1, 116
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(v1, -4, a0); // lwu v1, -4(a0)
|
||||
c->lwu(t9, 112, v1); // lwu t9, 112(v1)
|
||||
c->daddiu(a1, s5, 4); // daddiu a1, s5, 4
|
||||
c->mov64(a2, gp); // or a2, gp, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(v1, v0); // or v1, v0, r0
|
||||
c->lwu(v1, 0, s5); // lwu v1, 0(s5)
|
||||
c->daddiu(v1, v1, 12); // daddiu v1, v1, 12
|
||||
c->sw(v1, 16, sp); // sw v1, 16(sp)
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(v1, -4, a0); // lwu v1, -4(a0)
|
||||
c->lwu(t9, 104, v1); // lwu t9, 104(v1)
|
||||
c->daddiu(a1, s5, 4); // daddiu a1, s5, 4
|
||||
c->lwu(a2, 16, sp); // lwu a2, 16(sp)
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(v1, v0); // or v1, v0, r0
|
||||
c->sd(r0, 24, sp); // sd r0, 24(sp)
|
||||
c->sw(s5, 32, sp); // sw s5, 32(sp)
|
||||
c->sw(s4, 36, sp); // sw s4, 36(sp)
|
||||
c->sd(s3, 40, sp); // sd s3, 40(sp)
|
||||
c->lwu(v1, 32, sp); // lwu v1, 32(sp)
|
||||
c->lh(v1, 10, v1); // lh v1, 10(v1)
|
||||
c->lwu(a0, 16, sp); // lwu a0, 16(sp)
|
||||
c->gprs[a1].du64[0] = 0; // or a1, r0, r0
|
||||
// nop // sll r0, r0, 0
|
||||
|
||||
block_1:
|
||||
c->dsll(a2, a1, 3); // dsll a2, a1, 3
|
||||
c->lbu(a3, 0, a0); // lbu a3, 0(a0)
|
||||
bc = c->sgpr64(a3) == 0; // beq a3, r0, L27
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_7;} // branch non-likely
|
||||
|
||||
|
||||
block_2:
|
||||
c->andi(t0, a3, 1); // andi t0, a3, 1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t0) == 0; // beq t0, r0, L26
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->lwu(t0, 32, sp); // lwu t0, 32(sp)
|
||||
c->lwu(t0, 84, t0); // lwu t0, 84(t0)
|
||||
c->dsll(t1, a2, 4); // dsll t1, a2, 4
|
||||
c->daddu(t0, t0, t1); // daddu t0, t0, t1
|
||||
c->mov64(t1, gp); // or t1, gp, r0
|
||||
c->mov64(t2, t0); // or t2, t0, r0
|
||||
c->lqc2(vf2, 0, t1); // lqc2 vf2, 0(t1)
|
||||
c->lqc2(vf3, 0, t2); // lqc2 vf3, 0(t2)
|
||||
c->vsub(DEST::xyzw, vf1, vf3, vf2); // vsub.xyzw vf1, vf3, vf2
|
||||
c->vmul(DEST::xyzw, vf1, vf1, vf1); // vmul.xyzw vf1, vf1, vf1
|
||||
c->vadd_bc(DEST::x, BC::y, vf1, vf1, vf1); // vaddy.x vf1, vf1, vf1
|
||||
c->vadd_bc(DEST::x, BC::z, vf1, vf1, vf1); // vaddz.x vf1, vf1, vf1
|
||||
c->mov128_gpr_vf(t1, vf1); // qmfc2.i t1, vf1
|
||||
c->mtc1(f0, t1); // mtc1 f0, t1
|
||||
c->lwc1(f1, 12, gp); // lwc1 f1, 12(gp)
|
||||
c->lwc1(f2, 12, t0); // lwc1 f2, 12(t0)
|
||||
c->adds(f1, f1, f2); // add.s f1, f1, f2
|
||||
c->muls(f1, f1, f1); // mul.s f1, f1, f1
|
||||
c->mfc1(t0, f1); // mfc1 t0, f1
|
||||
c->mtc1(f1, t0); // mtc1 f1, t0
|
||||
cop1_bc = c->fprs[f0] < c->fprs[f1]; // c.lt.s f0, f1
|
||||
bc = !cop1_bc; // bc1f L26
|
||||
c->mov64(t0, s7); // or t0, s7, r0
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->ld(t0, 24, sp); // ld t0, 24(sp)
|
||||
c->ld(t1, 40, sp); // ld t1, 40(sp)
|
||||
c->slt(t0, t0, t1); // slt t0, t0, t1
|
||||
bc = c->sgpr64(t0) == 0; // beq t0, r0, L26
|
||||
c->mov64(t0, s7); // or t0, s7, r0
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->dsll(t0, a2, 4); // dsll t0, a2, 4
|
||||
c->lwu(t1, 32, sp); // lwu t1, 32(sp)
|
||||
c->lwu(t1, 100, t1); // lwu t1, 100(t1)
|
||||
c->daddu(t0, t0, t1); // daddu t0, t0, t1
|
||||
c->lwu(t0, 0, t0); // lwu t0, 0(t0)
|
||||
c->lwu(t1, 36, sp); // lwu t1, 36(sp)
|
||||
c->ld(t2, 24, sp); // ld t2, 24(sp)
|
||||
c->dsll(t2, t2, 2); // dsll t2, t2, 2
|
||||
c->daddu(t1, t1, t2); // daddu t1, t1, t2
|
||||
c->sw(t0, 0, t1); // sw t0, 0(t1)
|
||||
c->ld(t0, 24, sp); // ld t0, 24(sp)
|
||||
c->daddiu(t0, t0, 1); // daddiu t0, t0, 1
|
||||
c->sd(t0, 24, sp); // sd t0, 24(sp)
|
||||
// nop // sll r0, r0, 0
|
||||
|
||||
block_6:
|
||||
c->dsra(a3, a3, 1); // dsra a3, a3, 1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(a3) != 0; // bne a3, r0, L25
|
||||
c->daddiu(a2, a2, 1); // daddiu a2, a2, 1
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
|
||||
block_7:
|
||||
c->daddiu(a1, a1, 1); // daddiu a1, a1, 1
|
||||
c->daddiu(a0, a0, 1); // daddiu a0, a0, 1
|
||||
c->slt(a2, a1, v1); // slt a2, a1, v1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(a2) != 0; // bne a2, r0, L24
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_1;} // branch non-likely
|
||||
|
||||
c->load_symbol2(v1, cache.perf_stats); // lw v1, *perf-stats*(s7)
|
||||
c->daddiu(v1, v1, 116); // daddiu v1, v1, 116
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
c->ld(v0, 24, sp); // ld v0, 24(sp)
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 96, sp); // lq gp, 96(sp)
|
||||
c->lq(s5, 80, sp); // lq s5, 80(sp)
|
||||
c->lq(s4, 64, sp); // lq s4, 64(sp)
|
||||
c->lq(s3, 48, sp); // lq s3, 48(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 112); // daddiu sp, sp, 112
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.perf_stats = intern_from_c(-1, 0, "*perf-stats*").c();
|
||||
gLinkedFunctionTable.reg("(method 38 spatial-hash)", execute, 512);
|
||||
}
|
||||
|
||||
} // namespace method_38_spatial_hash
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -663,7 +313,9 @@ void link() {
|
||||
|
||||
} // namespace method_35_spatial_hash
|
||||
} // namespace Mips2C
|
||||
|
||||
// add method_35_spatial_hash::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_35_spatial_hash { extern void link(); }
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -708,121 +360,6 @@ void link() {
|
||||
} // namespace method_33_sphere_hash
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_28_sphere_hash {
|
||||
struct Cache {
|
||||
void* mem_copy; // mem-copy!
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -64); // daddiu sp, sp, -64
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s4, 16, sp); // sq s4, 16(sp)
|
||||
c->sq(s5, 32, sp); // sq s5, 32(sp)
|
||||
c->sq(gp, 48, sp); // sq gp, 48(sp)
|
||||
c->mov64(s5, a0); // or s5, a0, r0
|
||||
c->mov64(s4, a1); // or s4, a1, r0
|
||||
c->lh(gp, 56, s5); // lh gp, 56(s5)
|
||||
c->lh(v1, 88, s5); // lh v1, 88(s5)
|
||||
c->slt(v1, gp, v1); // slt v1, gp, v1
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L96
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
c->lwu(v1, 84, s5); // lwu v1, 84(s5)
|
||||
c->dsll(a0, gp, 4); // dsll a0, gp, 4
|
||||
c->daddu(a0, v1, a0); // daddu a0, v1, a0
|
||||
c->load_symbol2(t9, cache.mem_copy); // lw t9, mem-copy!(s7)
|
||||
c->mov64(a1, s4); // or a1, s4, r0
|
||||
c->addiu(a2, r0, 16); // addiu a2, r0, 16
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->addiu(v1, r0, 0); // addiu v1, r0, 0
|
||||
//beq r0, r0, L95 // beq r0, r0, L95
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_3; // branch always
|
||||
|
||||
|
||||
block_2:
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s5); // daddu a0, a0, s5
|
||||
c->lwc1(f0, 32, a0); // lwc1 f0, 32(a0)
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s4); // daddu a0, a0, s4
|
||||
c->lwc1(f1, 0, a0); // lwc1 f1, 0(a0)
|
||||
c->lwc1(f2, 12, s4); // lwc1 f2, 12(s4)
|
||||
c->subs(f1, f1, f2); // sub.s f1, f1, f2
|
||||
c->mins(f0, f0, f1); // min.s f0, f0, f1
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s5); // daddu a0, a0, s5
|
||||
c->swc1(f0, 32, a0); // swc1 f0, 32(a0)
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s5); // daddu a0, a0, s5
|
||||
c->lwc1(f0, 44, a0); // lwc1 f0, 44(a0)
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s4); // daddu a0, a0, s4
|
||||
c->lwc1(f1, 0, a0); // lwc1 f1, 0(a0)
|
||||
c->lwc1(f2, 12, s4); // lwc1 f2, 12(s4)
|
||||
c->adds(f1, f1, f2); // add.s f1, f1, f2
|
||||
c->maxs(f0, f0, f1); // max.s f0, f0, f1
|
||||
c->dsll(a0, v1, 2); // dsll a0, v1, 2
|
||||
c->daddu(a0, a0, s5); // daddu a0, a0, s5
|
||||
c->swc1(f0, 44, a0); // swc1 f0, 44(a0)
|
||||
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
||||
|
||||
block_3:
|
||||
c->slti(a0, v1, 3); // slti a0, v1, 3
|
||||
bc = c->sgpr64(a0) != 0; // bne a0, r0, L94
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_2;} // branch non-likely
|
||||
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->mov64(v1, s7); // or v1, s7, r0
|
||||
c->lh(v1, 56, s5); // lh v1, 56(s5)
|
||||
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
||||
c->sh(v1, 56, s5); // sh v1, 56(s5)
|
||||
//beq r0, r0, L97 // beq r0, r0, L97
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_6; // branch always
|
||||
|
||||
|
||||
block_5:
|
||||
c->addiu(gp, r0, -1); // addiu gp, r0, -1
|
||||
c->mov64(v1, gp); // or v1, gp, r0
|
||||
|
||||
block_6:
|
||||
c->mov64(v0, gp); // or v0, gp, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 48, sp); // lq gp, 48(sp)
|
||||
c->lq(s5, 32, sp); // lq s5, 32(sp)
|
||||
c->lq(s4, 16, sp); // lq s4, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 64); // daddiu sp, sp, 64
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.mem_copy = intern_from_c(-1, 0, "mem-copy!").c();
|
||||
gLinkedFunctionTable.reg("(method 28 sphere-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_28_sphere_hash
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
@@ -1224,4 +761,506 @@ void link() {
|
||||
}
|
||||
|
||||
} // namespace method_20_grid_hash
|
||||
} // namespace Mips2C
|
||||
} // namespace Mips2C
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_21_grid_hash {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->lh(v1, 10, a0); // lh v1, 10(a0)
|
||||
c->lb(a3, 24, a0); // lb a3, 24(a0)
|
||||
c->mult3(a3, a3, v1); // mult3 a3, a3, v1
|
||||
c->lb(t0, 26, a0); // lb t0, 26(a0)
|
||||
c->mult3(t0, t0, a3); // mult3 t0, t0, a3
|
||||
c->addiu(t1, r0, 1); // addiu t1, r0, 1
|
||||
c->lb(t2, 0, a1); // lb t2, 0(a1)
|
||||
c->dsubu(t1, t1, t2); // dsubu t1, t1, t2
|
||||
c->lb(t2, 3, a1); // lb t2, 3(a1)
|
||||
c->daddu(t1, t1, t2); // daddu t1, t1, t2
|
||||
c->addiu(t2, r0, 1); // addiu t2, r0, 1
|
||||
c->lb(t3, 2, a1); // lb t3, 2(a1)
|
||||
c->dsubu(t2, t2, t3); // dsubu t2, t2, t3
|
||||
c->lb(t3, 5, a1); // lb t3, 5(a1)
|
||||
c->daddu(t2, t2, t3); // daddu t2, t2, t3
|
||||
c->addiu(t3, r0, 1); // addiu t3, r0, 1
|
||||
c->lb(t4, 1, a1); // lb t4, 1(a1)
|
||||
c->dsubu(t3, t3, t4); // dsubu t3, t3, t4
|
||||
c->lb(t4, 4, a1); // lb t4, 4(a1)
|
||||
c->daddu(t3, t3, t4); // daddu t3, t3, t4
|
||||
c->lb(t4, 0, a1); // lb t4, 0(a1)
|
||||
c->mult3(t4, t4, v1); // mult3 t4, t4, v1
|
||||
c->lb(t5, 1, a1); // lb t5, 1(a1)
|
||||
c->mult3(t5, t5, t0); // mult3 t5, t5, t0
|
||||
c->daddu(t4, t4, t5); // daddu t4, t4, t5
|
||||
c->lb(a1, 2, a1); // lb a1, 2(a1)
|
||||
c->mult3(a1, a1, a3); // mult3 a1, a1, a3
|
||||
c->daddu(a1, t4, a1); // daddu a1, t4, a1
|
||||
c->dsra(t4, a2, 3); // dsra t4, a2, 3
|
||||
c->daddu(a1, a1, t4); // daddu a1, a1, t4
|
||||
c->daddu(a1, r0, a1); // daddu a1, r0, a1
|
||||
c->lwu(a0, 28, a0); // lwu a0, 28(a0)
|
||||
c->daddu(a0, a1, a0); // daddu a0, a1, a0
|
||||
c->addiu(a1, r0, 1); // addiu a1, r0, 1
|
||||
c->andi(a2, a2, 7); // andi a2, a2, 7
|
||||
if (((s64)c->sgpr64(a2)) >= 0) { // bgezl a2, L185
|
||||
c->dsllv(a1, a1, a2); // dsllv a1, a1, a2
|
||||
goto block_3;
|
||||
}
|
||||
|
||||
block_2:
|
||||
c->dsubu(a2, r0, a2); // dsubu a2, r0, a2
|
||||
c->dsrav(a1, a1, a2); // dsrav a1, a1, a2
|
||||
|
||||
block_3:
|
||||
c->nor(a1, a1, r0); // nor a1, a1, r0
|
||||
c->mov64(a2, t3); // or a2, t3, r0
|
||||
|
||||
block_4:
|
||||
c->mov64(t3, t2); // or t3, t2, r0
|
||||
c->mov64(t4, a0); // or t4, a0, r0
|
||||
|
||||
block_5:
|
||||
c->mov64(t5, t1); // or t5, t1, r0
|
||||
c->mov64(t6, t4); // or t6, t4, r0
|
||||
|
||||
block_6:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lbu(t7, 0, t6); // lbu t7, 0(t6)
|
||||
// nop // sll r0, r0, 0
|
||||
c->and_(t7, t7, a1); // and t7, t7, a1
|
||||
c->daddiu(t5, t5, -1); // daddiu t5, t5, -1
|
||||
c->sb(t7, 0, t6); // sb t7, 0(t6)
|
||||
bc = c->sgpr64(t5) != 0; // bne t5, r0, L188
|
||||
c->daddu(t6, t6, v1); // daddu t6, t6, v1
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->daddiu(t3, t3, -1); // daddiu t3, t3, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t3) != 0; // bne t3, r0, L187
|
||||
c->daddu(t4, t4, a3); // daddu t4, t4, a3
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
c->daddiu(a2, a2, -1); // daddiu a2, a2, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(a2) != 0; // bne a2, r0, L186
|
||||
c->daddu(a0, a0, t0); // daddu a0, a0, t0
|
||||
if (bc) {goto block_4;} // branch non-likely
|
||||
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 21 grid-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_21_grid_hash
|
||||
} // namespace Mips2C
|
||||
// add method_21_grid_hash::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_21_grid_hash { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_24_grid_hash {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
c->lq(v1, 0, a2); // lq v1, 0(a2)
|
||||
c->mov128_vf_gpr(vf1, v1); // qmtc2.i vf1, v1
|
||||
c->lq(v1, 12, a0); // lq v1, 12(a0)
|
||||
c->mov128_vf_gpr(vf5, v1); // qmtc2.i vf5, v1
|
||||
c->vsub_bc(DEST::xyzw, BC::w, vf3, vf1, vf1); // vsubw.xyzw vf3, vf1, vf1
|
||||
c->vadd_bc(DEST::xyzw, BC::w, vf2, vf1, vf1); // vaddw.xyzw vf2, vf1, vf1
|
||||
c->lq(v1, 28, a0); // lq v1, 28(a0)
|
||||
c->mov128_vf_gpr(vf4, v1); // qmtc2.i vf4, v1
|
||||
c->vmr32(DEST::xyzw, vf4, vf4); // vmr32.xyzw vf4, vf4
|
||||
c->vsub(DEST::xyzw, vf6, vf3, vf4); // vsub.xyzw vf6, vf3, vf4
|
||||
c->vsub(DEST::xyzw, vf7, vf2, vf4); // vsub.xyzw vf7, vf2, vf4
|
||||
c->vmul(DEST::xyzw, vf6, vf6, vf5); // vmul.xyzw vf6, vf6, vf5
|
||||
c->vmul(DEST::xyzw, vf7, vf7, vf5); // vmul.xyzw vf7, vf7, vf5
|
||||
c->vftoi0(DEST::xyz, vf6, vf6); // vftoi0.xyz vf6, vf6
|
||||
c->vftoi0(DEST::xyz, vf7, vf7); // vftoi0.xyz vf7, vf7
|
||||
c->nor(v1, r0, r0); // nor v1, r0, r0
|
||||
c->lw(a0, 24, a0); // lw a0, 24(a0)
|
||||
c->sll(a2, a0, 8); // sll a2, a0, 8
|
||||
c->lui(a0, 1); // lui a0, 1
|
||||
c->srl(a2, a2, 8); // srl a2, a2, 8
|
||||
c->ori(a0, a0, 257); // ori a0, a0, 257
|
||||
c->dsubu(a0, a2, a0); // dsubu a0, a2, a0
|
||||
// nop // sll r0, r0, 0
|
||||
c->pextlb(a0, r0, a0); // pextlb a0, r0, a0
|
||||
// nop // sll r0, r0, 0
|
||||
c->pextlh(a0, r0, a0); // pextlh a0, r0, a0
|
||||
// nop // sll r0, r0, 0
|
||||
c->mov128_gpr_vf(a3, vf6); // qmfc2.i a3, vf6
|
||||
c->mov128_gpr_vf(a2, vf7); // qmfc2.i a2, vf7
|
||||
c->pmaxw(a3, a3, r0); // pmaxw a3, a3, r0
|
||||
c->pmaxw(a2, a2, r0); // pmaxw a2, a2, r0
|
||||
c->pminw(a3, a3, a0); // pminw a3, a3, a0
|
||||
c->pminw(a0, a2, a0); // pminw a0, a2, a0
|
||||
c->ppach(a2, r0, a3); // ppach a2, r0, a3
|
||||
c->ppach(a3, r0, a0); // ppach a3, r0, a0
|
||||
c->ppacb(a0, r0, a2); // ppacb a0, r0, a2
|
||||
c->ppacb(a2, r0, a3); // ppacb a2, r0, a3
|
||||
c->dsll(a2, a2, 24); // dsll a2, a2, 24
|
||||
c->or_(a0, a0, a2); // or a0, a0, a2
|
||||
c->dsll32(v1, v1, 16); // dsll32 v1, v1, 16
|
||||
c->ld(a2, 0, a1); // ld a2, 0(a1)
|
||||
c->and_(v1, a2, v1); // and v1, a2, v1
|
||||
c->or_(v1, v1, a0); // or v1, v1, a0
|
||||
c->sd(v1, 0, a1); // sd v1, 0(a1)
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
//jr ra // jr ra
|
||||
c->daddu(sp, sp, r0); // daddu sp, sp, r0
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 24 grid-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_24_grid_hash
|
||||
} // namespace Mips2C
|
||||
// add method_24_grid_hash::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_24_grid_hash { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_35_sphere_hash {
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -48); // daddiu sp, sp, -48
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s5, 16, sp); // sq s5, 16(sp)
|
||||
c->sq(gp, 32, sp); // sq gp, 32(sp)
|
||||
c->mov64(s5, a0); // or s5, a0, r0
|
||||
c->mov64(gp, a2); // or gp, a2, r0
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(v1, -4, a0); // lwu v1, -4(a0)
|
||||
c->lwu(t9, 112, v1); // lwu t9, 112(v1)
|
||||
c->daddiu(v1, s5, 4); // daddiu v1, s5, 4
|
||||
c->mov64(a2, a1); // or a2, a1, r0
|
||||
c->mov64(a1, v1); // or a1, v1, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(v1, v0); // or v1, v0, r0
|
||||
c->mov64(t0, s5); // or t0, s5, r0
|
||||
c->daddiu(t1, s5, 4); // daddiu t1, s5, 4
|
||||
c->lh(v1, 10, t0); // lh v1, 10(t0)
|
||||
c->lb(a0, 24, t0); // lb a0, 24(t0)
|
||||
c->mult3(a0, a0, v1); // mult3 a0, a0, v1
|
||||
c->lb(a1, 26, t0); // lb a1, 26(t0)
|
||||
c->mult3(a1, a1, a0); // mult3 a1, a1, a0
|
||||
c->addiu(a2, r0, 1); // addiu a2, r0, 1
|
||||
c->lb(a3, 0, t1); // lb a3, 0(t1)
|
||||
c->dsubu(a2, a2, a3); // dsubu a2, a2, a3
|
||||
c->lb(a3, 3, t1); // lb a3, 3(t1)
|
||||
c->daddu(a2, a2, a3); // daddu a2, a2, a3
|
||||
c->addiu(a3, r0, 1); // addiu a3, r0, 1
|
||||
c->lb(t2, 2, t1); // lb t2, 2(t1)
|
||||
c->dsubu(a3, a3, t2); // dsubu a3, a3, t2
|
||||
c->lb(t2, 5, t1); // lb t2, 5(t1)
|
||||
c->daddu(a3, a3, t2); // daddu a3, a3, t2
|
||||
c->addiu(t2, r0, 1); // addiu t2, r0, 1
|
||||
c->lb(t3, 1, t1); // lb t3, 1(t1)
|
||||
c->dsubu(t2, t2, t3); // dsubu t2, t2, t3
|
||||
c->lb(t3, 4, t1); // lb t3, 4(t1)
|
||||
c->daddu(t2, t2, t3); // daddu t2, t2, t3
|
||||
c->lb(t3, 0, t1); // lb t3, 0(t1)
|
||||
c->mult3(t3, t3, v1); // mult3 t3, t3, v1
|
||||
c->lb(t4, 1, t1); // lb t4, 1(t1)
|
||||
c->mult3(t4, t4, a1); // mult3 t4, t4, a1
|
||||
c->daddu(t3, t3, t4); // daddu t3, t3, t4
|
||||
c->lb(t1, 2, t1); // lb t1, 2(t1)
|
||||
c->mult3(t1, t1, a0); // mult3 t1, t1, a0
|
||||
c->daddu(t1, t3, t1); // daddu t1, t3, t1
|
||||
c->dsra(t3, gp, 3); // dsra t3, gp, 3
|
||||
c->daddu(t1, t1, t3); // daddu t1, t1, t3
|
||||
c->daddu(t1, r0, t1); // daddu t1, r0, t1
|
||||
c->lwu(t0, 28, t0); // lwu t0, 28(t0)
|
||||
c->daddu(t0, t1, t0); // daddu t0, t1, t0
|
||||
c->addiu(t1, r0, 1); // addiu t1, r0, 1
|
||||
c->andi(t3, gp, 7); // andi t3, gp, 7
|
||||
if (((s64)c->sgpr64(t3)) >= 0) { // bgezl t3, L84
|
||||
c->dsllv(t1, t1, t3); // dsllv t1, t1, t3
|
||||
goto block_3;
|
||||
}
|
||||
|
||||
block_2:
|
||||
c->dsubu(t3, r0, t3); // dsubu t3, r0, t3
|
||||
c->dsrav(t1, t1, t3); // dsrav t1, t1, t3
|
||||
|
||||
block_3:
|
||||
c->nor(t1, t1, r0); // nor t1, t1, r0
|
||||
c->mov64(t2, t2); // or t2, t2, r0
|
||||
// nop // sll r0, r0, 0
|
||||
|
||||
block_4:
|
||||
c->mov64(t3, a3); // or t3, a3, r0
|
||||
c->mov64(t4, t0); // or t4, t0, r0
|
||||
|
||||
block_5:
|
||||
c->mov64(t5, a2); // or t5, a2, r0
|
||||
c->mov64(t6, t4); // or t6, t4, r0
|
||||
|
||||
block_6:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lbu(t7, 0, t6); // lbu t7, 0(t6)
|
||||
// nop // sll r0, r0, 0
|
||||
c->and_(t7, t7, t1); // and t7, t7, t1
|
||||
c->daddiu(t5, t5, -1); // daddiu t5, t5, -1
|
||||
c->sb(t7, 0, t6); // sb t7, 0(t6)
|
||||
bc = c->sgpr64(t5) != 0; // bne t5, r0, L87
|
||||
c->daddu(t6, t6, v1); // daddu t6, t6, v1
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->daddiu(t3, t3, -1); // daddiu t3, t3, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t3) != 0; // bne t3, r0, L86
|
||||
c->daddu(t4, t4, a0); // daddu t4, t4, a0
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t2) != 0; // bne t2, r0, L85
|
||||
c->daddu(t0, t0, a1); // daddu t0, t0, a1
|
||||
if (bc) {goto block_4;} // branch non-likely
|
||||
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
c->gprs[v0].du64[0] = 0; // or v0, r0, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 32, sp); // lq gp, 32(sp)
|
||||
c->lq(s5, 16, sp); // lq s5, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 48); // daddiu sp, sp, 48
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
gLinkedFunctionTable.reg("(method 35 sphere-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_35_sphere_hash
|
||||
} // namespace Mips2C
|
||||
// add method_35_sphere_hash::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_35_sphere_hash { extern void link(); }
|
||||
|
||||
//--------------------------MIPS2C---------------------
|
||||
// clang-format off
|
||||
#include "game/mips2c/mips2c_private.h"
|
||||
#include "game/kernel/jakx/kscheme.h"
|
||||
using ::jakx::intern_from_c;
|
||||
namespace Mips2C::jakx {
|
||||
namespace method_40_spatial_hash {
|
||||
struct Cache {
|
||||
void* mem_copy; // mem-copy!
|
||||
} cache;
|
||||
|
||||
u64 execute(void* ctxt) {
|
||||
auto* c = (ExecutionContext*)ctxt;
|
||||
bool bc = false;
|
||||
u32 call_addr = 0;
|
||||
c->daddiu(sp, sp, -96); // daddiu sp, sp, -96
|
||||
c->sd(ra, 0, sp); // sd ra, 0(sp)
|
||||
c->sq(s2, 16, sp); // sq s2, 16(sp)
|
||||
c->sq(s3, 32, sp); // sq s3, 32(sp)
|
||||
c->sq(s4, 48, sp); // sq s4, 48(sp)
|
||||
c->sq(s5, 64, sp); // sq s5, 64(sp)
|
||||
c->sq(gp, 80, sp); // sq gp, 80(sp)
|
||||
c->mov64(s5, a0); // or s5, a0, r0
|
||||
c->mov64(s4, a2); // or s4, a2, r0
|
||||
c->lh(gp, 56, s5); // lh gp, 56(s5)
|
||||
c->lh(v1, 88, s5); // lh v1, 88(s5)
|
||||
c->slt(v1, gp, v1); // slt v1, gp, v1
|
||||
bc = c->sgpr64(v1) == 0; // beq v1, r0, L33
|
||||
// nop // sll r0, r0, 0
|
||||
if (bc) {goto block_11;} // branch non-likely
|
||||
|
||||
c->lwu(v1, 84, s5); // lwu v1, 84(s5)
|
||||
c->dsll(a0, gp, 4); // dsll a0, gp, 4
|
||||
c->daddu(s3, v1, a0); // daddu s3, v1, a0
|
||||
c->lwu(v1, 100, s5); // lwu v1, 100(s5)
|
||||
c->dsll(a0, gp, 4); // dsll a0, gp, 4
|
||||
c->daddu(s2, v1, a0); // daddu s2, v1, a0
|
||||
c->load_symbol2(t9, cache.mem_copy); // lw t9, mem-copy!(s7)
|
||||
c->mov64(a0, s3); // or a0, s3, r0
|
||||
c->addiu(a2, r0, 16); // addiu a2, r0, 16
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->sw(s4, 0, s2); // sw s4, 0(s2)
|
||||
c->mov64(a0, s5); // or a0, s5, r0
|
||||
c->lwu(v1, -4, a0); // lwu v1, -4(a0)
|
||||
c->lwu(t9, 112, v1); // lwu t9, 112(v1)
|
||||
c->daddiu(a1, s5, 4); // daddiu a1, s5, 4
|
||||
c->mov64(a2, s3); // or a2, s3, r0
|
||||
call_addr = c->gprs[t9].du32[0]; // function call:
|
||||
c->sll(v0, ra, 0); // sll v0, ra, 0
|
||||
c->jalr(call_addr); // jalr ra, t9
|
||||
c->mov64(v1, v0); // or v1, v0, r0
|
||||
c->mov64(t1, s5); // or t1, s5, r0
|
||||
c->daddiu(t2, s5, 4); // daddiu t2, s5, 4
|
||||
c->mov64(a3, gp); // or a3, gp, r0
|
||||
c->lh(v1, 10, t1); // lh v1, 10(t1)
|
||||
c->lb(a0, 24, t1); // lb a0, 24(t1)
|
||||
c->mult3(a0, a0, v1); // mult3 a0, a0, v1
|
||||
c->lb(a1, 26, t1); // lb a1, 26(t1)
|
||||
c->mult3(a1, a1, a0); // mult3 a1, a1, a0
|
||||
c->addiu(a2, r0, 1); // addiu a2, r0, 1
|
||||
c->lb(t0, 0, t2); // lb t0, 0(t2)
|
||||
c->dsubu(a2, a2, t0); // dsubu a2, a2, t0
|
||||
c->lb(t0, 3, t2); // lb t0, 3(t2)
|
||||
c->daddu(a2, a2, t0); // daddu a2, a2, t0
|
||||
c->addiu(t0, r0, 1); // addiu t0, r0, 1
|
||||
c->lb(t3, 2, t2); // lb t3, 2(t2)
|
||||
c->dsubu(t0, t0, t3); // dsubu t0, t0, t3
|
||||
c->lb(t3, 5, t2); // lb t3, 5(t2)
|
||||
c->daddu(t0, t0, t3); // daddu t0, t0, t3
|
||||
c->addiu(t3, r0, 1); // addiu t3, r0, 1
|
||||
c->lb(t4, 1, t2); // lb t4, 1(t2)
|
||||
c->dsubu(t3, t3, t4); // dsubu t3, t3, t4
|
||||
c->lb(t4, 4, t2); // lb t4, 4(t2)
|
||||
c->daddu(t3, t3, t4); // daddu t3, t3, t4
|
||||
c->lb(t4, 0, t2); // lb t4, 0(t2)
|
||||
c->mult3(t4, t4, v1); // mult3 t4, t4, v1
|
||||
c->lb(t5, 1, t2); // lb t5, 1(t2)
|
||||
c->mult3(t5, t5, a1); // mult3 t5, t5, a1
|
||||
c->daddu(t4, t4, t5); // daddu t4, t4, t5
|
||||
c->lb(t2, 2, t2); // lb t2, 2(t2)
|
||||
c->mult3(t2, t2, a0); // mult3 t2, t2, a0
|
||||
c->daddu(t2, t4, t2); // daddu t2, t4, t2
|
||||
c->dsra(t4, a3, 3); // dsra t4, a3, 3
|
||||
c->daddu(t2, t2, t4); // daddu t2, t2, t4
|
||||
c->daddu(t2, r0, t2); // daddu t2, r0, t2
|
||||
c->lwu(t1, 28, t1); // lwu t1, 28(t1)
|
||||
c->daddu(t1, t2, t1); // daddu t1, t2, t1
|
||||
c->addiu(t2, r0, 1); // addiu t2, r0, 1
|
||||
c->andi(a3, a3, 7); // andi a3, a3, 7
|
||||
if (((s64)c->sgpr64(a3)) >= 0) { // bgezl a3, L29
|
||||
c->dsllv(a3, t2, a3); // dsllv a3, t2, a3
|
||||
goto block_4;
|
||||
}
|
||||
|
||||
block_3:
|
||||
c->dsubu(a3, r0, a3); // dsubu a3, r0, a3
|
||||
c->dsrav(a3, t2, a3); // dsrav a3, t2, a3
|
||||
|
||||
block_4:
|
||||
c->mov64(t2, t3); // or t2, t3, r0
|
||||
|
||||
block_5:
|
||||
c->mov64(t3, t0); // or t3, t0, r0
|
||||
c->mov64(t4, t1); // or t4, t1, r0
|
||||
|
||||
block_6:
|
||||
c->mov64(t5, a2); // or t5, a2, r0
|
||||
c->mov64(t6, t4); // or t6, t4, r0
|
||||
|
||||
block_7:
|
||||
// nop // sll r0, r0, 0
|
||||
c->lbu(t7, 0, t6); // lbu t7, 0(t6)
|
||||
// nop // sll r0, r0, 0
|
||||
c->or_(t7, t7, a3); // or t7, t7, a3
|
||||
c->daddiu(t5, t5, -1); // daddiu t5, t5, -1
|
||||
c->sb(t7, 0, t6); // sb t7, 0(t6)
|
||||
bc = c->sgpr64(t5) != 0; // bne t5, r0, L32
|
||||
c->daddu(t6, t6, v1); // daddu t6, t6, v1
|
||||
if (bc) {goto block_7;} // branch non-likely
|
||||
|
||||
c->daddiu(t3, t3, -1); // daddiu t3, t3, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t3) != 0; // bne t3, r0, L31
|
||||
c->daddu(t4, t4, a0); // daddu t4, t4, a0
|
||||
if (bc) {goto block_6;} // branch non-likely
|
||||
|
||||
c->daddiu(t2, t2, -1); // daddiu t2, t2, -1
|
||||
// nop // sll r0, r0, 0
|
||||
bc = c->sgpr64(t2) != 0; // bne t2, r0, L30
|
||||
c->daddu(t1, t1, a1); // daddu t1, t1, a1
|
||||
if (bc) {goto block_5;} // branch non-likely
|
||||
|
||||
c->gprs[v1].du64[0] = 0; // or v1, r0, r0
|
||||
c->lh(v1, 56, s5); // lh v1, 56(s5)
|
||||
c->daddiu(v1, v1, 1); // daddiu v1, v1, 1
|
||||
c->sh(v1, 56, s5); // sh v1, 56(s5)
|
||||
//beq r0, r0, L34 // beq r0, r0, L34
|
||||
// nop // sll r0, r0, 0
|
||||
goto block_12; // branch always
|
||||
|
||||
|
||||
block_11:
|
||||
c->addiu(gp, r0, -1); // addiu gp, r0, -1
|
||||
c->mov64(v1, gp); // or v1, gp, r0
|
||||
|
||||
block_12:
|
||||
c->mov64(v0, gp); // or v0, gp, r0
|
||||
c->ld(ra, 0, sp); // ld ra, 0(sp)
|
||||
c->lq(gp, 80, sp); // lq gp, 80(sp)
|
||||
c->lq(s5, 64, sp); // lq s5, 64(sp)
|
||||
c->lq(s4, 48, sp); // lq s4, 48(sp)
|
||||
c->lq(s3, 32, sp); // lq s3, 32(sp)
|
||||
c->lq(s2, 16, sp); // lq s2, 16(sp)
|
||||
//jr ra // jr ra
|
||||
c->daddiu(sp, sp, 96); // daddiu sp, sp, 96
|
||||
goto end_of_function; // return
|
||||
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
// nop // sll r0, r0, 0
|
||||
end_of_function:
|
||||
return c->gprs[v0].du64[0];
|
||||
}
|
||||
|
||||
void link() {
|
||||
cache.mem_copy = intern_from_c(-1, 0, "mem-copy!").c();
|
||||
gLinkedFunctionTable.reg("(method 40 spatial-hash)", execute, 256);
|
||||
}
|
||||
|
||||
} // namespace method_40_spatial_hash
|
||||
} // namespace Mips2C
|
||||
// add method_40_spatial_hash::link to the link callback table for the object file.
|
||||
// FWD DEC:
|
||||
namespace method_40_spatial_hash { extern void link(); }
|
||||
@@ -414,23 +414,17 @@ namespace init_boundary_regs { extern void link(); }
|
||||
namespace draw_boundary_polygon { extern void link(); }
|
||||
namespace render_boundary_quad { extern void link(); }
|
||||
namespace render_boundary_tri { extern void link(); }
|
||||
// namespace set_sky_vf27 { extern void link(); }
|
||||
namespace generic_light_proc { extern void link(); }
|
||||
namespace generic_envmap_proc { extern void link(); }
|
||||
// namespace generic_prepare_dma_double { extern void link(); }
|
||||
namespace generic_prepare_dma_single { extern void link(); }
|
||||
namespace generic_warp_source_proc { extern void link(); }
|
||||
namespace generic_warp_dest_proc { extern void link(); }
|
||||
namespace generic_warp_dest { extern void link(); }
|
||||
namespace generic_warp_envmap_dest { extern void link(); }
|
||||
namespace generic_no_light_proc { extern void link(); }
|
||||
// namespace method_9_font_work { extern void link(); }
|
||||
// namespace draw_string_asm { extern void link(); }
|
||||
// namespace get_string_length { extern void link(); }
|
||||
namespace adgif_shader_texture_with_update { extern void link(); }
|
||||
namespace moving_sphere_triangle_intersect { extern void link(); }
|
||||
namespace collide_do_primitives { extern void link(); }
|
||||
// namespace cspace_parented_transformq_joint { extern void link(); }
|
||||
namespace foreground_check_longest_edge_asm { extern void link(); }
|
||||
namespace foreground_merc { extern void link(); }
|
||||
namespace foreground_generic_merc { extern void link(); }
|
||||
@@ -440,9 +434,7 @@ namespace method_11_collide_hash { extern void link(); }
|
||||
namespace method_12_collide_hash { extern void link(); }
|
||||
namespace fill_bg_using_box_new { extern void link(); }
|
||||
namespace fill_bg_using_line_sphere_new { extern void link(); }
|
||||
namespace method_12_collide_mesh { extern void link(); }
|
||||
namespace method_14_collide_mesh { extern void link(); }
|
||||
// namespace method_15_collide_mesh { extern void link(); }
|
||||
namespace method_10_collide_shape_prim_mesh { extern void link(); }
|
||||
namespace method_10_collide_shape_prim_sphere { extern void link(); }
|
||||
namespace method_10_collide_shape_prim_group { extern void link(); }
|
||||
@@ -454,20 +446,11 @@ namespace method_10_collide_cache_prim { extern void link(); }
|
||||
namespace method_17_collide_cache { extern void link(); }
|
||||
namespace method_9_collide_puss_work { extern void link(); }
|
||||
namespace method_10_collide_puss_work { extern void link(); }
|
||||
// namespace method_18_grid_hash { extern void link(); }
|
||||
namespace method_19_grid_hash { extern void link(); }
|
||||
namespace method_20_grid_hash { extern void link(); }
|
||||
namespace method_22_grid_hash { extern void link(); }
|
||||
namespace method_28_sphere_hash { extern void link(); }
|
||||
// namespace method_32_sphere_hash { extern void link(); }
|
||||
// namespace method_29_sphere_hash { extern void link(); }
|
||||
namespace method_30_sphere_hash { extern void link(); }
|
||||
// namespace method_31_sphere_hash { extern void link(); }
|
||||
// namespace method_32_spatial_hash { extern void link(); }
|
||||
// namespace method_38_spatial_hash { extern void link(); }
|
||||
namespace method_35_spatial_hash { extern void link(); }
|
||||
namespace method_36_spatial_hash { extern void link(); }
|
||||
namespace method_34_spatial_hash { extern void link(); }
|
||||
namespace sparticle_motion_blur { extern void link(); }
|
||||
namespace sp_launch_particles_var { extern void link(); }
|
||||
namespace particle_adgif { extern void link(); }
|
||||
@@ -490,9 +473,6 @@ namespace ripple_matrix_scale { extern void link(); }
|
||||
namespace ripple_apply_wave_table { extern void link(); }
|
||||
namespace ripple_create_wave_table { extern void link(); }
|
||||
namespace ripple_execute_init { extern void link(); }
|
||||
// namespace method_14_ocean { extern void link(); }
|
||||
// namespace method_15_ocean { extern void link(); }
|
||||
// namespace method_16_ocean { extern void link(); }
|
||||
namespace init_ocean_far_regs { extern void link(); }
|
||||
namespace draw_large_polygon_ocean { extern void link(); }
|
||||
namespace render_ocean_quad { extern void link(); }
|
||||
@@ -511,11 +491,7 @@ namespace render_sky_tri { extern void link(); }
|
||||
namespace method_17_sky_work { extern void link(); }
|
||||
namespace method_29_sky_work { extern void link(); }
|
||||
namespace method_30_sky_work { extern void link(); }
|
||||
namespace method_31_sky_work { extern void link(); }
|
||||
// namespace method_34_sky_work { extern void link(); }
|
||||
// namespace method_35_sky_work { extern void link(); }
|
||||
namespace method_32_sky_work { extern void link(); }
|
||||
// namespace set_sky_vf23_value { extern void link(); }
|
||||
namespace shadow_xform_verts { extern void link(); }
|
||||
namespace shadow_calc_dual_verts { extern void link(); }
|
||||
namespace shadow_scissor_edges { extern void link(); }
|
||||
@@ -533,7 +509,16 @@ namespace shadow_add_single_tris { extern void link(); }
|
||||
namespace shadow_add_double_tris { extern void link(); }
|
||||
namespace shadow_execute { extern void link(); }
|
||||
namespace method_21_cloth_system { extern void link(); }
|
||||
}
|
||||
namespace method_16_sky_work { extern void link(); }
|
||||
namespace method_28_sky_work { extern void link(); }
|
||||
namespace method_33_sky_work { extern void link(); }
|
||||
namespace method_11_collide_mesh { extern void link(); }
|
||||
namespace method_13_collide_mesh { extern void link(); }
|
||||
namespace method_21_grid_hash { extern void link(); }
|
||||
namespace method_24_grid_hash { extern void link(); }
|
||||
namespace method_35_sphere_hash { extern void link(); }
|
||||
namespace method_40_spatial_hash { extern void link(); }
|
||||
namespace cspace_parented_transformq_joint { extern void link(); }}
|
||||
// clang-format on
|
||||
|
||||
LinkedFunctionTable gLinkedFunctionTable;
|
||||
@@ -801,27 +786,20 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
jakx::light_hash_count_items::link, jakx::light_hash_add_items::link}},
|
||||
{"debug",
|
||||
{
|
||||
jakx::debug_line_clip::link, jakx::init_boundary_regs::link,
|
||||
jakx::draw_boundary_polygon::link, jakx::render_boundary_quad::link,
|
||||
// jakx::render_boundary_tri::link, jakx::set_sky_vf27::link
|
||||
jakx::debug_line_clip::link,
|
||||
jakx::init_boundary_regs::link,
|
||||
jakx::draw_boundary_polygon::link,
|
||||
jakx::render_boundary_quad::link,
|
||||
}},
|
||||
{"generic-effect",
|
||||
{jakx::generic_light_proc::link, jakx::generic_envmap_proc::link,
|
||||
// jakx::generic_prepare_dma_double::link,
|
||||
jakx::generic_prepare_dma_single::link, jakx::generic_warp_source_proc::link,
|
||||
jakx::generic_warp_dest_proc::link, jakx::generic_warp_dest::link,
|
||||
jakx::generic_warp_envmap_dest::link, jakx::generic_no_light_proc::link}},
|
||||
// {"font",
|
||||
// {jakx::method_9_font_work::link,
|
||||
// jakx::draw_string_asm::link,
|
||||
// jakx::get_string_length::link}},
|
||||
{"texture", {jakx::adgif_shader_texture_with_update::link}},
|
||||
{"collide-func",
|
||||
{jakx::moving_sphere_triangle_intersect::link, jakx::collide_do_primitives::link}},
|
||||
{"joint",
|
||||
{
|
||||
// jakx::cspace_parented_transformq_joint::link
|
||||
}},
|
||||
{"joint", {jakx::cspace_parented_transformq_joint::link}},
|
||||
{"foreground",
|
||||
{jakx::foreground_check_longest_edge_asm::link, jakx::foreground_generic_merc::link,
|
||||
jakx::foreground_merc::link, jakx::foreground_draw_hud::link}},
|
||||
@@ -830,9 +808,8 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
{jakx::method_11_collide_hash::link, jakx::method_12_collide_hash::link,
|
||||
jakx::fill_bg_using_box_new::link, jakx::fill_bg_using_line_sphere_new::link}},
|
||||
{"collide-mesh",
|
||||
{jakx::method_12_collide_mesh::link, jakx::method_14_collide_mesh::link,
|
||||
// jakx::method_15_collide_mesh::link,
|
||||
jakx::method_10_collide_shape_prim_mesh::link}},
|
||||
{jakx::method_14_collide_mesh::link, jakx::method_10_collide_shape_prim_mesh::link,
|
||||
jakx::method_11_collide_mesh::link, jakx::method_13_collide_mesh::link}},
|
||||
{"collide-cache",
|
||||
{jakx::method_10_collide_shape_prim_mesh::link,
|
||||
jakx::method_10_collide_shape_prim_sphere::link,
|
||||
@@ -843,19 +820,11 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
jakx::method_10_collide_cache_prim::link, jakx::method_17_collide_cache::link,
|
||||
jakx::method_9_collide_puss_work::link, jakx::method_10_collide_puss_work::link}},
|
||||
{"spatial-hash",
|
||||
{
|
||||
// jakx::method_18_grid_hash::link,
|
||||
jakx::method_19_grid_hash::link, jakx::method_20_grid_hash::link,
|
||||
jakx::method_22_grid_hash::link, jakx::method_28_sphere_hash::link,
|
||||
// jakx::method_32_sphere_hash::link,
|
||||
// jakx::method_29_sphere_hash::link,
|
||||
jakx::method_30_sphere_hash::link,
|
||||
// jakx::method_31_sphere_hash::link,
|
||||
// jakx::method_32_spatial_hash::link,
|
||||
// jakx::method_38_spatial_hash::link,
|
||||
jakx::method_35_spatial_hash::link, jakx::method_36_spatial_hash::link,
|
||||
// jakx::method_34_spatial_hash::link
|
||||
}},
|
||||
{jakx::method_20_grid_hash::link, jakx::method_22_grid_hash::link,
|
||||
jakx::method_30_sphere_hash::link, jakx::method_36_spatial_hash::link,
|
||||
jakx::method_21_grid_hash::link, jakx::method_24_grid_hash::link,
|
||||
jakx::method_35_sphere_hash::link, jakx::method_35_spatial_hash::link,
|
||||
jakx::method_40_spatial_hash::link}},
|
||||
{"sparticle-launcher",
|
||||
{jakx::sparticle_motion_blur::link, jakx::sp_launch_particles_var::link,
|
||||
jakx::particle_adgif::link, jakx::sp_init_fields::link}},
|
||||
@@ -872,12 +841,7 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
{"ripple",
|
||||
{jakx::ripple_matrix_scale::link, jakx::ripple_apply_wave_table::link,
|
||||
jakx::ripple_create_wave_table::link, jakx::ripple_execute_init::link}},
|
||||
{"ocean-vu0",
|
||||
{
|
||||
// jakx::method_14_ocean::link,
|
||||
// jakx::method_15_ocean::link,
|
||||
// jakx::method_16_ocean::link
|
||||
}},
|
||||
{"ocean-vu0", {}},
|
||||
{"ocean",
|
||||
{jakx::init_ocean_far_regs::link, jakx::draw_large_polygon_ocean::link,
|
||||
jakx::render_ocean_quad::link}},
|
||||
@@ -889,12 +853,9 @@ PerGameVersion<std::unordered_map<std::string, std::vector<void (*)()>>> gMips2C
|
||||
{"sky-tng",
|
||||
{jakx::set_tex_offset::link, jakx::render_sky_quad::link, jakx::render_sky_tri::link,
|
||||
jakx::method_17_sky_work::link, jakx::method_29_sky_work::link,
|
||||
jakx::method_30_sky_work::link, jakx::method_31_sky_work::link,
|
||||
// jakx::method_34_sky_work::link,
|
||||
// jakx::method_35_sky_work::link,
|
||||
jakx::method_32_sky_work::link,
|
||||
// jakx::set_sky_vf23_value::link,
|
||||
jakx::draw_large_polygon::link}},
|
||||
jakx::method_30_sky_work::link, jakx::method_32_sky_work::link,
|
||||
jakx::draw_large_polygon::link, jakx::method_16_sky_work::link,
|
||||
jakx::method_28_sky_work::link, jakx::method_33_sky_work::link}},
|
||||
{"shadow-cpu",
|
||||
{jakx::shadow_xform_verts::link, jakx::shadow_execute::link,
|
||||
jakx::shadow_calc_dual_verts::link, jakx::shadow_scissor_edges::link,
|
||||
|
||||
@@ -0,0 +1,210 @@
|
||||
#include "fakeplayer.h"
|
||||
|
||||
#include "sfxblock.h"
|
||||
|
||||
#include "game/sound/common/sound_types.h"
|
||||
|
||||
#include "fmt/format.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <combaseapi.h>
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#include "common/log/log.h"
|
||||
|
||||
namespace snd {
|
||||
|
||||
FakePlayer::FakePlayer() : mVmanager(mSynth) {}
|
||||
|
||||
FakePlayer::~FakePlayer() {}
|
||||
|
||||
bool FakePlayer::Tick(std::vector<s16>& leftStream, std::vector<s16>& rightStream, long samples) {
|
||||
static int htick = 200;
|
||||
static int stick = snd::SAMPLE_RATE;
|
||||
|
||||
for (long i = 0; i < samples; i++) {
|
||||
// The handlers expect to tick at 240hz
|
||||
// 48000/240 = 200
|
||||
if (htick == 200) {
|
||||
mTick++;
|
||||
|
||||
// m_handler->Tick returns true if the handler is done.
|
||||
if (m_handler && m_handler->Tick()) {
|
||||
m_handler = NULL; // deletes the handler.
|
||||
return true;
|
||||
}
|
||||
|
||||
htick = 0;
|
||||
}
|
||||
|
||||
if (stick == snd::SAMPLE_RATE) {
|
||||
// fmt::print("{} handlers active\n", m_handlers.size());
|
||||
stick = 0;
|
||||
}
|
||||
|
||||
stick++;
|
||||
htick++;
|
||||
auto s16Output = mSynth.Tick();
|
||||
leftStream.push_back(s16Output.left);
|
||||
rightStream.push_back(s16Output.right);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
u32 FakePlayer::PlaySound(BankHandle bank_id, u32 sound_id, s32 vol, s32 pan, s32 pm, s32 pb) {
|
||||
auto bank = mLoader.GetBankByHandle(bank_id);
|
||||
if (bank == nullptr) {
|
||||
lg::error("play_sound: Bank {} does not exist", static_cast<void*>(bank_id));
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto handler = bank->MakeHandler(mVmanager, sound_id, vol, pan, pm, pb, GetTick(), 0);
|
||||
if (!handler.has_value()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
handler.value()->m_sound_handle = 0;
|
||||
m_handler = std::move(handler.value());
|
||||
// fmt::print("play_sound {}:{} - {}\n", bank_id, sound_id, handle);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 FakePlayer::PlaySoundByName(BankHandle bank_id,
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
SoundBank* bank = nullptr;
|
||||
if (bank_id == 0 && bank_name != nullptr) {
|
||||
bank = mLoader.GetBankByName(bank_name);
|
||||
} else if (bank_id != 0) {
|
||||
bank = mLoader.GetBankByHandle(bank_id);
|
||||
} else {
|
||||
bank = mLoader.GetBankWithSound(sound_name);
|
||||
}
|
||||
|
||||
if (bank == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
auto sound = bank->GetSoundByName(sound_name);
|
||||
if (sound.has_value()) {
|
||||
return PlaySound(bank, sound.value(), vol, pan, pm, pb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FakePlayer::StopSound() {
|
||||
if (m_handler)
|
||||
m_handler->Stop();
|
||||
m_handler = nullptr;
|
||||
}
|
||||
|
||||
u32 FakePlayer::GetSoundID(u32 sound_handle) {
|
||||
return m_handler ? m_handler->SoundID() : -1;
|
||||
}
|
||||
|
||||
void FakePlayer::SetSoundReg(u8 reg, u8 value) {
|
||||
if (m_handler)
|
||||
m_handler->SetRegister(reg, value);
|
||||
}
|
||||
|
||||
u8 FakePlayer::GetSoundGroup(u32 sound_id) {
|
||||
return m_handler ? m_handler->Group() : -1;
|
||||
}
|
||||
|
||||
void FakePlayer::SetMasterVolume(u32 group, s32 volume) {
|
||||
if (volume > snd::MAX_VOLUME)
|
||||
volume = snd::MAX_VOLUME;
|
||||
|
||||
if (volume < 0)
|
||||
volume = 0;
|
||||
|
||||
if (group == 15)
|
||||
return;
|
||||
|
||||
mVmanager.SetMasterVol(group, volume);
|
||||
|
||||
// Master volume
|
||||
if (group == 16) {
|
||||
mSynth.SetMasterVol(0x3ffff * volume / snd::MAX_VOLUME);
|
||||
}
|
||||
}
|
||||
|
||||
BankHandle FakePlayer::LoadBank(std::span<u8> bank) {
|
||||
return mLoader.BankLoad(bank);
|
||||
}
|
||||
|
||||
void FakePlayer::UnloadBank(BankHandle bank_handle) {
|
||||
auto* bank = mLoader.GetBankByHandle(bank_handle);
|
||||
if (bank == nullptr)
|
||||
return;
|
||||
|
||||
mLoader.UnloadBank(bank_handle);
|
||||
}
|
||||
|
||||
void FakePlayer::SetPanTable(VolPair* pantable) {
|
||||
mVmanager.SetPanTable(pantable);
|
||||
}
|
||||
|
||||
void FakePlayer::SetPlaybackMode(s32 mode) {
|
||||
mVmanager.SetPlaybackMode(mode);
|
||||
}
|
||||
|
||||
void FakePlayer::SetSoundVolPan(s32 sound_id, s32 vol, s32 pan) {
|
||||
if (m_handler)
|
||||
m_handler->SetVolPan(vol, pan);
|
||||
}
|
||||
|
||||
void FakePlayer::SetSoundPmod(s32 sound_handle, s32 mod) {
|
||||
if (m_handler)
|
||||
m_handler->SetPMod(mod);
|
||||
}
|
||||
|
||||
s32 FakePlayer::GetSoundUserData(BankHandle block_handle,
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst) {
|
||||
SoundBank* bank = nullptr;
|
||||
if (block_handle == nullptr && block_name != nullptr) {
|
||||
bank = mLoader.GetBankByName(block_name);
|
||||
} else if (block_handle != nullptr) {
|
||||
bank = mLoader.GetBankByHandle(block_handle);
|
||||
} else {
|
||||
bank = mLoader.GetBankWithSound(sound_name);
|
||||
}
|
||||
|
||||
if (bank == nullptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (sound_id == -1) {
|
||||
auto sound = bank->GetSoundByName(sound_name);
|
||||
if (sound.has_value()) {
|
||||
sound_id = sound.value();
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
auto ud = bank->GetSoundUserData(sound_id);
|
||||
if (ud.has_value()) {
|
||||
dst->data[0] = ud.value()->data[0];
|
||||
dst->data[1] = ud.value()->data[1];
|
||||
dst->data[2] = ud.value()->data[2];
|
||||
dst->data[3] = ud.value()->data[3];
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
} // namespace snd
|
||||
@@ -0,0 +1,75 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <span>
|
||||
|
||||
#include "ame_handler.h"
|
||||
#include "loader.h"
|
||||
#include "sound_handler.h"
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
#include "../common/synth.h"
|
||||
#include "game/sound/989snd/vagvoice.h"
|
||||
|
||||
// This class is adapted from Player.cpp
|
||||
// Instead of being used to playback audio, it is used to generate the audio samples
|
||||
// that would ordinarily be generated during playback. These samples
|
||||
// (made by calling the Tick function) are then written to .wav files.
|
||||
|
||||
namespace snd {
|
||||
|
||||
class FakePlayer {
|
||||
public:
|
||||
FakePlayer();
|
||||
~FakePlayer();
|
||||
FakePlayer(const FakePlayer&) = delete;
|
||||
FakePlayer operator=(const FakePlayer&) = delete;
|
||||
|
||||
BankHandle LoadBank(std::span<u8> bank);
|
||||
|
||||
u32 PlaySound(BankHandle bank, u32 sound, s32 vol, s32 pan, s32 pm, s32 pb);
|
||||
void StopSound();
|
||||
u32 PlaySoundByName(BankHandle bank,
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb);
|
||||
void SetSoundReg(u8 reg, u8 value);
|
||||
u8 GetSoundGroup(u32 sound_id);
|
||||
void SetGlobalExcite(u8 value) { GlobalExcite = value; };
|
||||
void SetMasterVolume(u32 group, s32 volume);
|
||||
void UnloadBank(BankHandle bank_handle);
|
||||
u32 GetSoundID(u32 sound_handle);
|
||||
void SetPanTable(VolPair* pantable);
|
||||
void SetPlaybackMode(s32 mode);
|
||||
void SetSoundVolPan(s32 sound_handle, s32 vol, s32 pan);
|
||||
void SubmitVoice(std::shared_ptr<Voice>& voice) { mSynth.AddVoice(voice); };
|
||||
void SetSoundPmod(s32 sound_handle, s32 mod);
|
||||
s32 GetTick() { return mTick; };
|
||||
s32 GetSoundUserData(BankHandle block_handle,
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst);
|
||||
|
||||
bool Tick(std::vector<s16>& leftStream, std::vector<s16>& rightStream, long samples);
|
||||
|
||||
private:
|
||||
std::unique_ptr<SoundHandler> m_handler;
|
||||
|
||||
Loader mLoader;
|
||||
Synth mSynth;
|
||||
VoiceManager mVmanager;
|
||||
s32 mTick{0};
|
||||
|
||||
// static long sound_callback(cubeb_stream* stream,
|
||||
// void* user,
|
||||
// const void* input,
|
||||
// void* output_buffer,
|
||||
// long len);
|
||||
// static void state_callback(cubeb_stream* stream, void* user, cubeb_state state);
|
||||
};
|
||||
} // namespace snd
|
||||
@@ -1,4 +1,5 @@
|
||||
set(SOUND_SOURCES
|
||||
989snd/fakeplayer.cpp
|
||||
989snd/player.cpp
|
||||
989snd/midi_handler.cpp
|
||||
989snd/ame_handler.cpp
|
||||
@@ -19,6 +20,7 @@ set(SOUND_SOURCES
|
||||
)
|
||||
|
||||
add_library(sound STATIC ${SOUND_SOURCES})
|
||||
set_target_properties(sound PROPERTIES POSITION_INDEPENDENT_CODE ON)
|
||||
target_link_libraries(sound PRIVATE fmt cubeb common)
|
||||
|
||||
add_executable(sndplay 989snd/sndplay.cpp)
|
||||
|
||||
@@ -0,0 +1,120 @@
|
||||
#pragma once
|
||||
|
||||
#include <cctype>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace flava {
|
||||
|
||||
struct Variant {
|
||||
const char* name;
|
||||
int value;
|
||||
};
|
||||
|
||||
struct FlavaSet {
|
||||
int reg;
|
||||
std::vector<Variant> variants;
|
||||
bool battle_mode = false;
|
||||
};
|
||||
|
||||
inline const FlavaSet* lookup(std::string music_name) {
|
||||
for (char& ch : music_name) {
|
||||
ch = static_cast<char>(std::tolower(static_cast<unsigned char>(ch)));
|
||||
}
|
||||
|
||||
static const std::map<std::string, FlavaSet> table = {
|
||||
{"village1",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"sage", 2},
|
||||
{"sage-hut", 3},
|
||||
{"birdlady", 4},
|
||||
{"farmer", 5},
|
||||
{"assistant", 6},
|
||||
{"mayor", 7},
|
||||
{"sculptor", 8},
|
||||
{"explorer", 9},
|
||||
{"dock", 10}}}},
|
||||
{"jungle",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"jungle-temple-exit", 1},
|
||||
{"jungle-lurkerm", 2},
|
||||
{"jungle-temple-top", 3}}}},
|
||||
{"jungleb", {0, {{"default", 0}, {"jungleb-eggtop", 1}}}},
|
||||
{"beach",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"beach-sentinel", 1},
|
||||
{"beach-cannon", 2},
|
||||
{"beach-grotto", 3},
|
||||
{"birdlady", 4}}}},
|
||||
{"misty", {0, {{"default", 0}, {"misty-battle", 1}, {"misty-boat", 2}, {"racer", 3}}}},
|
||||
{"firecany", {0, {{"default", 0}, {"racer", 1}, {"unused", 2}}}},
|
||||
{"village2",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"sage", 1},
|
||||
{"assistant", 2},
|
||||
{"warrior", 3},
|
||||
{"geologist", 4},
|
||||
{"gambler", 5},
|
||||
{"levitator", 6}}}},
|
||||
{"swamp", {0, {{"default", 0}, {"swamp-launcher", 2}, {"swamp-battle", 3}, {"flutflut", 4}}}},
|
||||
{"rolling", {0, {{"default", 0}, {"rolling-gorge", 1}}}},
|
||||
{"ogre", {0, {{"default", 0}, {"ogre-middle", 1}, {"ogre-end", 2}}}},
|
||||
{"village3",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"miners", 1},
|
||||
{"sage", 2},
|
||||
{"assistant", 3},
|
||||
{"to-maincave", 4},
|
||||
{"to-snow", 5}}}},
|
||||
{"maincave",
|
||||
{0,
|
||||
{{"default", 0}, {"robocave", 1}, {"robocave-top", 2}, {"maincave", 3}, {"darkcave", 4}}}},
|
||||
{"snow",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"snow-battle", 1},
|
||||
{"flutflut", 2},
|
||||
{"snow-cave", 3},
|
||||
{"snow-fort", 4},
|
||||
{"snow-balls", 5}}}},
|
||||
{"lavatube", {0, {{"none", 0}, {"default", 1}, {"lavatube-middle", 2}, {"lavatube-end", 3}}}},
|
||||
{"citadel",
|
||||
{0,
|
||||
{{"default", 0},
|
||||
{"sage", 1},
|
||||
{"assistant", 2},
|
||||
{"sage-yellow", 3},
|
||||
{"sage-red", 4},
|
||||
{"sage-blue", 5},
|
||||
{"citadel-center", 6}}}},
|
||||
{"finalbos", {0, {{"default", 0}, {"finalboss-middle", 1}, {"finalboss-end", 2}}}},
|
||||
{"credits", {0, {{"none", 0}, {"default", 2}}}},
|
||||
|
||||
// jak2
|
||||
{"city1", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"pilot", 5}}, true}},
|
||||
{"ruins", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}}},
|
||||
{"atoll", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"darkjak", 4}}, true}},
|
||||
{"sewer",
|
||||
{14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}, true}},
|
||||
{"fortress", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}}},
|
||||
{"strip", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}}},
|
||||
{"dig", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}}},
|
||||
{"mountain",
|
||||
{14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}, true}},
|
||||
{"palcab", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"darkjak", 4}}, true}},
|
||||
{"tomb", {14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"darkjak", 4}}, true}},
|
||||
{"forest",
|
||||
{14, {{"default", 0}, {"gun", 1}, {"board", 2}, {"mech", 3}, {"darkjak", 4}}, true}},
|
||||
};
|
||||
|
||||
auto it = table.find(music_name);
|
||||
return it == table.end() ? nullptr : &it->second;
|
||||
}
|
||||
|
||||
} // namespace flava
|
||||
@@ -5,6 +5,9 @@
|
||||
|
||||
namespace snd {
|
||||
|
||||
const s32 MAX_VOLUME = 0x400;
|
||||
const u32 SAMPLE_RATE = 48000; // 48000 samples of 16bits per channel per second
|
||||
//= 96000 bytes per second in mono, 192000 bytes per second in stereo
|
||||
struct VolPair {
|
||||
s16 left;
|
||||
s16 right;
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
;; Common layout of hardware registers shared between the two VIFs
|
||||
(deftype vif-bank (structure)
|
||||
((stat uint32)
|
||||
(fbrst uint32 :offset 16)
|
||||
(fbrst vif-fbrst :offset 16)
|
||||
(err vif-err :offset 32)
|
||||
(mark uint32 :offset 48)
|
||||
(cycle uint32 :offset 64)
|
||||
|
||||
@@ -133,7 +133,7 @@ It type checks the arguments for the entry function.
|
||||
(set! docstring (first body)))
|
||||
(when (not (null? *defstate-type-stack*))
|
||||
(fmt #t
|
||||
"*defstate-type-stack* leaked! An error probably happened in a previous defstate. stack is: {}"
|
||||
"*defstate-type-stack* leaked! An error probably happened in a previous defstate. stack is: {}\n"
|
||||
*defstate-type-stack*))
|
||||
(set! *defstate-type-stack* '())
|
||||
(when virtual
|
||||
|
||||
@@ -220,7 +220,7 @@
|
||||
(defmacro reload-subtitles ()
|
||||
"rebuild and reload subtitles."
|
||||
`(begin
|
||||
(asm-text-file subtitle :files ("game/assets/game_subtitle.gp"))
|
||||
(asm-text-file subtitle :files ("game/assets/jak1/game_subtitle.gp"))
|
||||
(if *subtitle-text* (+! (-> *subtitle-text* lang) 1))
|
||||
(load-level-subtitle-files 0)))
|
||||
|
||||
|
||||
@@ -664,7 +664,7 @@
|
||||
(set! (-> s5-1 max quad) (-> v1-34 quad))
|
||||
)
|
||||
(dotimes (s4-1 (-> gp-0 num-joints))
|
||||
(add-point! s5-1 (the-as vector (+ (the-as uint (-> gp-0 joint 0 mat trans)) (* 240 s4-1))))
|
||||
(add-point! s5-1 (-> gp-0 joint s4-1 mat trans))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -881,8 +881,8 @@
|
||||
)
|
||||
(while (!= s4-0 -134250495)
|
||||
(camera-line
|
||||
(the-as vector (-> this point s5-0))
|
||||
(the-as vector (-> this point s4-0))
|
||||
(-> this point s5-0 position)
|
||||
(-> this point s4-0 position)
|
||||
(new 'static 'vector4w :x #x80 :y #x80 :z #x80 :w #x80)
|
||||
)
|
||||
(set! s5-0 s4-0)
|
||||
@@ -893,7 +893,7 @@
|
||||
(camera-cross
|
||||
(new 'static 'vector :y 1024.0)
|
||||
(new 'static 'vector :z 1024.0)
|
||||
(the-as vector (-> this point s5-0))
|
||||
(-> this point s5-0 position)
|
||||
(new 'static 'vector4w :x #xff :w #x80)
|
||||
(meters 0.25)
|
||||
)
|
||||
@@ -1022,7 +1022,7 @@
|
||||
(meters 0.25)
|
||||
)
|
||||
)
|
||||
(let ((f30-0 (* 0.5 (-> *camera-combiner* fov))))
|
||||
(let ((f30-0 (/ (-> *camera-combiner* fov) 2)))
|
||||
(camera-fov-frame
|
||||
(-> *camera-combiner* inv-camera-rot)
|
||||
(camera-pos)
|
||||
@@ -1034,9 +1034,9 @@
|
||||
)
|
||||
(cond
|
||||
((= (-> arg0 blend-to-type) (camera-blend-to-type unknown-2))
|
||||
(let ((f0-2 (* 0.5 (-> arg0 fov))))
|
||||
(let ((f0-2 (/ (-> arg0 fov) 2)))
|
||||
(camera-fov-frame
|
||||
(the-as matrix (-> *camera-combiner* tracking))
|
||||
(-> *camera-combiner* tracking inv-mat)
|
||||
(-> arg0 trans)
|
||||
f0-2
|
||||
0.75
|
||||
@@ -1046,9 +1046,9 @@
|
||||
)
|
||||
)
|
||||
(else
|
||||
(let ((f0-4 (* 0.5 (-> arg0 fov))))
|
||||
(let ((f0-4 (/ (-> arg0 fov) 2)))
|
||||
(camera-fov-frame
|
||||
(the-as matrix (-> arg0 tracking))
|
||||
(-> arg0 tracking inv-mat)
|
||||
(-> arg0 trans)
|
||||
f0-4
|
||||
0.75
|
||||
@@ -1531,7 +1531,7 @@
|
||||
|
||||
(defun camera-master-debug ((arg0 camera-master))
|
||||
(when *display-cam-other*
|
||||
(let ((f0-1 (* 0.5 (-> *camera-other-fov* data))))
|
||||
(let ((f0-1 (/ (-> *camera-other-fov* data) 2)))
|
||||
(camera-fov-frame
|
||||
*camera-other-matrix*
|
||||
*camera-other-trans*
|
||||
@@ -1545,7 +1545,7 @@
|
||||
(let ((s4-0 (new 'stack-no-clear 'vector))
|
||||
(s5-0 *camera-other-trans*)
|
||||
)
|
||||
(vector+float*! s4-0 s5-0 (the-as vector (-> *camera-other-matrix* vector)) 2048.0)
|
||||
(vector+float*! s4-0 s5-0 (-> *camera-other-matrix* vector 0) 2048.0)
|
||||
(camera-line s5-0 s4-0 (new 'static 'vector4w :x #xff :w #x80))
|
||||
(vector+float*! s4-0 s5-0 (-> *camera-other-matrix* vector 1) 2048.0)
|
||||
(camera-line s5-0 s4-0 (new 'static 'vector4w :y #xff :w #x80))
|
||||
@@ -1636,7 +1636,7 @@
|
||||
(set! (-> a1-0 trans w) 1.0)
|
||||
(debug-set-camera-pos-rot! a0-0 a1-0)
|
||||
)
|
||||
(send-event *camera* 'set-fov (degrees 64))
|
||||
(send-event *camera* 'set-fov 11650.845)
|
||||
(clear *camera-old-level*)
|
||||
(format *camera-old-level* "dig3a")
|
||||
(set! *camera-old-cpu* 4815)
|
||||
|
||||
@@ -476,15 +476,9 @@
|
||||
(+! (-> this point v1-3 incarnation) 1)
|
||||
(let ((v1-11 (-> this point arg0 next)))
|
||||
(set! (-> this summed-len) (- (-> this summed-len) (-> this point arg0 tp-length)))
|
||||
(vector-!
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 arg0)))
|
||||
(-> this point v1-11 position)
|
||||
(-> this point arg0 position)
|
||||
)
|
||||
(vector-! (-> this point arg0 direction) (-> this point v1-11 position) (-> this point arg0 position))
|
||||
)
|
||||
(set! (-> this point arg0 tp-length)
|
||||
(vector-normalize-ret-len! (the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 arg0))) 1.0)
|
||||
)
|
||||
(set! (-> this point arg0 tp-length) (vector-normalize-ret-len! (-> this point arg0 direction) 1.0))
|
||||
(+! (-> this summed-len) (-> this point arg0 tp-length))
|
||||
(+! (-> this used-count) -1)
|
||||
)
|
||||
@@ -554,12 +548,7 @@
|
||||
)
|
||||
0.0
|
||||
(while (not (or (= a0-14 -134250495) (= a0-14 (-> this end-point))))
|
||||
(let ((f1-2 (vector-dot
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 v1-15)))
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 a0-14)))
|
||||
)
|
||||
)
|
||||
)
|
||||
(let ((f1-2 (vector-dot (-> this point v1-15 direction) (-> this point a0-14 direction))))
|
||||
(when (>= f1-2 f0-2)
|
||||
(set! f0-2 f1-2)
|
||||
(set! a1-1 v1-15)
|
||||
@@ -596,11 +585,7 @@
|
||||
)
|
||||
)
|
||||
(if (< (* (-> this point s4-1 tp-length)
|
||||
(+ 1.0 (vector-dot
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 s4-1)))
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 v1-11)))
|
||||
)
|
||||
)
|
||||
(+ 1.0 (vector-dot (-> this point s4-1 direction) (-> this point v1-11 direction)))
|
||||
)
|
||||
arg0
|
||||
)
|
||||
@@ -621,14 +606,8 @@
|
||||
(let ((s3-0 (-> this free-point))
|
||||
(s2-0 (-> this end-point))
|
||||
)
|
||||
(vector-!
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 s2-0)))
|
||||
arg0
|
||||
(-> this point s2-0 position)
|
||||
)
|
||||
(set! (-> this point s2-0 tp-length)
|
||||
(vector-normalize-ret-len! (the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 s2-0))) 1.0)
|
||||
)
|
||||
(vector-! (-> this point s2-0 direction) arg0 (-> this point s2-0 position))
|
||||
(set! (-> this point s2-0 tp-length) (vector-normalize-ret-len! (-> this point s2-0 direction) 1.0))
|
||||
(if (< (-> this point s2-0 tp-length) arg1)
|
||||
(return 0)
|
||||
)
|
||||
@@ -736,11 +715,7 @@
|
||||
)
|
||||
(while (and (!= v1-18 (-> this end-point)) (!= v1-18 (-> this next-to-last-point)) (!= v1-18 arg1))
|
||||
(let ((s1-0 (-> this point v1-18 next)))
|
||||
(vector-!
|
||||
s2-0
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 s1-0)))
|
||||
(the-as vector (+ (the-as uint (-> this point 0 direction)) (* 48 v1-18)))
|
||||
)
|
||||
(vector-! s2-0 (-> this point s1-0 direction) (-> this point v1-18 direction))
|
||||
(let* ((f0-5 (vector-normalize-ret-len! s2-0 1.0))
|
||||
(f0-6 (/ f0-5 2))
|
||||
(f26-0 (* (fmin 1.0 f0-6) f30-0 (vector-dot arg0 s2-0)))
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
(when (>= (vector4-dot s5-0 (the-as vector (-> this leading))) 0.0)
|
||||
(let* ((v1-7 (-> this sections))
|
||||
(a0-3 (-> v1-7 length))
|
||||
(a3-0 (the-as object (-> this leading)))
|
||||
(a3-0 (-> this leading))
|
||||
)
|
||||
(dotimes (s3-1 a0-3)
|
||||
(let ((s2-0 (-> v1-7 data s3-1)))
|
||||
@@ -102,7 +102,7 @@
|
||||
(when (and (>= f0-9 -41984.0) (>= 41779.2 f0-9))
|
||||
(let* ((a0-11 (new 'stack-no-clear 'vector))
|
||||
(s1-0 (new 'stack-no-clear 'vector))
|
||||
(f30-0 (ray-plane-equation-intersect a0-11 s5-0 (-> s2-0 pull-dir) (the-as vector a3-0)))
|
||||
(f30-0 (ray-plane-equation-intersect a0-11 s5-0 (-> s2-0 pull-dir) a3-0))
|
||||
(f0-10 (ray-plane-equation-intersect s1-0 s5-0 (-> s2-0 pull-dir) (-> s2-0 trailing)))
|
||||
)
|
||||
(let ((a0-13 (new 'stack-no-clear 'vector)))
|
||||
@@ -152,7 +152,7 @@
|
||||
(return #f)
|
||||
)
|
||||
)
|
||||
(set! a3-0 (+ (the-as uint (-> v1-7 data 0 trailing)) (* s3-1 64)))
|
||||
(set! a3-0 (-> v1-7 data s3-1 trailing))
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@@ -243,24 +243,15 @@
|
||||
(format *stdcon* ")~%")
|
||||
(vector-average!
|
||||
(-> s4-0 trans)
|
||||
(the-as
|
||||
vector
|
||||
(+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> s3-0 runtime-node-id-1)))
|
||||
)
|
||||
(the-as
|
||||
vector
|
||||
(+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> s3-0 runtime-node-id-2)))
|
||||
)
|
||||
(-> this nav-graph node-array data (-> s3-0 runtime-node-id-1) position)
|
||||
(-> this nav-graph node-array data (-> s3-0 runtime-node-id-2) position)
|
||||
)
|
||||
(dotimes (s3-1 (-> this nav-graph visnode-array length))
|
||||
(let ((v1-23 (-> this nav-graph visnode-array data s3-1)))
|
||||
(when (and (= (-> v1-23 runtime-edge-id) arg0) (not (logtest? (-> v1-23 mysql-save-flag) (mysql-save-flag delete))))
|
||||
(vector-!
|
||||
(-> s4-0 vector 0)
|
||||
(the-as
|
||||
vector
|
||||
(+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> v1-23 runtime-node-id)))
|
||||
)
|
||||
(-> this nav-graph node-array data (-> v1-23 runtime-node-id) position)
|
||||
(-> s4-0 trans)
|
||||
)
|
||||
(vector-normalize! (-> s4-0 vector 0) (fmax 15360.0 (+ -15360.0 (vector-length (-> s4-0 vector 0)))))
|
||||
@@ -1180,8 +1171,8 @@
|
||||
((zero? v1-20)
|
||||
(format #t "Undo move-node ~D~%" (-> s4-0 id))
|
||||
(vector-!
|
||||
(the-as vector (+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> s4-0 index))))
|
||||
(the-as vector (+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> s4-0 index))))
|
||||
(-> this nav-graph node-array data (-> s4-0 index) position)
|
||||
(-> this nav-graph node-array data (-> s4-0 index) position)
|
||||
(-> s4-0 move-vec)
|
||||
)
|
||||
(nav-graph-editor-method-54 this (-> s4-0 index))
|
||||
@@ -1412,10 +1403,7 @@
|
||||
(let ((a0-4 (nav-graph-editor-method-49 this)))
|
||||
(vector-!
|
||||
(-> a0-4 move-vec)
|
||||
(the-as
|
||||
vector
|
||||
(+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> this selected-index)))
|
||||
)
|
||||
(-> this nav-graph node-array data (-> this selected-index) position)
|
||||
(-> a0-4 move-vec)
|
||||
)
|
||||
)
|
||||
@@ -1438,13 +1426,7 @@
|
||||
(logior! (-> a0-5 mysql-save-flag) (mysql-save-flag update))
|
||||
)
|
||||
(set! (-> v1-3 index) (-> self selected-index))
|
||||
(set! (-> v1-3 move-vec quad)
|
||||
(-> (the-as
|
||||
(pointer uint128)
|
||||
(+ (the-as uint (-> self nav-graph node-array data 0 position)) (* 80 (-> self selected-index)))
|
||||
)
|
||||
)
|
||||
)
|
||||
(set! (-> v1-3 move-vec quad) (-> self nav-graph node-array data (-> self selected-index) position quad))
|
||||
)
|
||||
)
|
||||
:code sleep-code
|
||||
@@ -1516,11 +1498,11 @@
|
||||
(add-debug-line-sphere
|
||||
#t
|
||||
(bucket-id debug2)
|
||||
(the-as vector (+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> this edge-src))))
|
||||
(-> this nav-graph node-array data (-> this edge-src) position)
|
||||
(vector-!
|
||||
(new 'stack-no-clear 'vector)
|
||||
(-> this mouse-hit)
|
||||
(the-as vector (+ (the-as uint (-> this nav-graph node-array data 0 position)) (* 80 (-> this edge-src))))
|
||||
(-> this nav-graph node-array data (-> this edge-src) position)
|
||||
)
|
||||
1024.0
|
||||
(if (>= (-> this selected-index) 0)
|
||||
|
||||
@@ -20,7 +20,29 @@
|
||||
)
|
||||
|
||||
(define *sampler-count* "Incremented everytime a metric is sampled
|
||||
@see [[timer0-handler]]" 0)
|
||||
@see [[timer0-handler]]" 0)
|
||||
|
||||
(defun-debug timer0-handler ((arg0 int) (arg1 int) (arg2 int))
|
||||
(let* ((v1-0 arg2)
|
||||
(v1-1 (logand #x3ffffff v1-0))
|
||||
)
|
||||
(when (< (the-as uint v1-1) (the-as uint #x2000000))
|
||||
(let ((v1-4 (&+ *sampler-mem* (* (shr v1-1 3) 4))))
|
||||
(+! (-> (the-as (pointer uint32) v1-4)) 1)
|
||||
)
|
||||
(set! *sampler-count* (+ *sampler-count* 1))
|
||||
)
|
||||
)
|
||||
(set! (-> (the-as timer-bank #x10000000) mode)
|
||||
(new 'static 'timer-mode :clks (timer-clock-selection busclk/256) :zret #x1 :cue #x1 :cmpe #x1 :equf #x1)
|
||||
)
|
||||
0
|
||||
(none)
|
||||
)
|
||||
|
||||
;; og:preserve-this
|
||||
; (set! (-> (the-as timer-bank #x10000000) mode) (new 'static 'timer-mode))
|
||||
|
||||
|
||||
(defun-debug sampler-start ()
|
||||
"Reset the [[timer-bank]] EE registers.
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
(when v1-1
|
||||
(dotimes (a0-4 3)
|
||||
(dotimes (a1-0 3)
|
||||
(set! (-> (the-as (pointer int32) (+ (+ (* a0-4 16) (* a1-0 4)) (the-as int *texture-masks*))))
|
||||
(set! (-> *texture-masks* data a0-4 mask data a1-0)
|
||||
(logior (-> (the-as (pointer int32) (+ (* a1-0 4) (the-as int *texture-masks*) (* a0-4 16))) 0)
|
||||
(-> (the-as (pointer int32) (+ (* a1-0 4) (the-as int v1-1) (* a0-4 16))) 15)
|
||||
)
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
;; DECOMP BEGINS
|
||||
|
||||
(deftype eye (structure)
|
||||
"Data for a single eye."
|
||||
((data vector 2 :inline)
|
||||
(x float :overlay-at (-> data 0 data 0))
|
||||
(y float :overlay-at (-> data 0 data 1))
|
||||
@@ -23,6 +24,7 @@
|
||||
|
||||
|
||||
(deftype eye-control (structure)
|
||||
"Information about the state of both eyes of a [[process-drawable]]."
|
||||
((process handle)
|
||||
(draw-flag symbol)
|
||||
(different-eyes symbol)
|
||||
@@ -37,6 +39,7 @@
|
||||
|
||||
|
||||
(deftype eye-control-array (basic)
|
||||
"An array of [[eye-control]]s."
|
||||
((data eye-control 16 :inline)
|
||||
)
|
||||
)
|
||||
@@ -50,6 +53,7 @@
|
||||
|
||||
|
||||
(deftype eye-work (structure)
|
||||
"Eye renderer DMA data."
|
||||
((sprite-tmpl dma-gif-packet :inline)
|
||||
(sprite-tmpl2 dma-gif-packet :inline)
|
||||
(adgif-tmpl dma-gif-packet :inline)
|
||||
@@ -72,7 +76,7 @@
|
||||
|
||||
(dotimes (v1-6 6)
|
||||
(dotimes (a0-10 16)
|
||||
(let ((a1-14 (the-as eye-control (+ (+ (* 96 a0-10) 28 (* 1552 v1-6)) (the-as int *eye-control-arrays*)))))
|
||||
(let ((a1-14 (-> *eye-control-arrays* data v1-6 data a0-10)))
|
||||
(set! (-> a1-14 process) (the-as handle #f))
|
||||
(set! (-> a1-14 draw-flag) #t)
|
||||
(set! (-> a1-14 shaders) (the-as (inline-array adgif-shader) #f))
|
||||
|
||||
Loaded 100 of 1090 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user