mirror of
https://github.com/open-goal/jak-project
synced 2026-07-04 05:20:56 -04:00
jakx: Commit existing work from other PRs (#4112)
This attempts to get into master whatever work was done in this PR / it's earlier PR https://github.com/open-goal/jak-project/pull/3965 I don't want this work to be lost / floating around in massive PRs. However the changes are: - switch to ntsc_v1 instead of PAL as the development target, as we have done for all other games - remove most of the copied-from-jak2/3 changes as they need to be confirmed during the decompilation process not just assumed - avoids committing any changes to `game/kernel/common` as it was not clear to me if these were changes made in jak x's kernel that were not properly broken out into it's own functions. We don't want to accidentally introduce bugs into jak1-3's kernel code. - in other words, if the change in the kernel only happens in jak x...it should likely be specific to jak x's kernel, not common. --------- Co-authored-by: VodBox <dillon@vodbox.io> Co-authored-by: yodah <greenboyyodah@gmail.com>
This commit is contained in:
@@ -350,6 +350,32 @@
|
||||
"--config-override \"{\\\"decompile_code\\\": false, \\\"levels_extract\\\": true, \\\"allowed_objects\\\": []}\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"project": "CMakeLists.txt",
|
||||
"projectTarget": "decompiler.exe (bin\\decompiler.exe)",
|
||||
"name": "Decompiler - Jak X",
|
||||
"args": [
|
||||
"${workspaceRoot}/decompiler/config/jakx/jakx_config.jsonc",
|
||||
"${workspaceRoot}/iso_data",
|
||||
"${workspaceRoot}/decompiler_out",
|
||||
"--version",
|
||||
"ntsc_v1"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"project": "CMakeLists.txt",
|
||||
"projectTarget": "decompiler.exe (bin\\decompiler.exe)",
|
||||
"name": "Decompiler - Jak X - PAL",
|
||||
"args": [
|
||||
"${workspaceRoot}/decompiler/config/jakx/jakx_config.jsonc",
|
||||
"${workspaceRoot}/iso_data",
|
||||
"${workspaceRoot}/decompiler_out",
|
||||
"--version",
|
||||
"pal"
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "default",
|
||||
"project": "CMakeLists.txt",
|
||||
|
||||
@@ -17,6 +17,8 @@ tasks:
|
||||
- '{{.PYTHON}} ./scripts/tasks/update-env.py --game jak2'
|
||||
set-game-jak3:
|
||||
- '{{.PYTHON}} ./scripts/tasks/update-env.py --game jak3'
|
||||
set-game-jakx:
|
||||
- '{{.PYTHON}} ./scripts/tasks/update-env.py --game jakx'
|
||||
set-decomp-ntscv1:
|
||||
desc: "aka black label"
|
||||
cmds:
|
||||
|
||||
@@ -57,7 +57,8 @@ void write_wave_file(const std::vector<s16>& left_samples,
|
||||
}
|
||||
|
||||
std::pair<std::vector<s16>, std::vector<s16>> decode_adpcm(BinaryReader& reader,
|
||||
const bool stereo) {
|
||||
const bool stereo,
|
||||
const u32 version) {
|
||||
std::vector<s16> left_samples;
|
||||
std::vector<s16> right_samples;
|
||||
s32 left_sample_prev[2] = {0, 0};
|
||||
@@ -85,7 +86,7 @@ std::pair<std::vector<s16>, std::vector<s16>> decode_adpcm(BinaryReader& reader,
|
||||
break;
|
||||
}
|
||||
|
||||
if (stereo && bytes_read == 0x2000) {
|
||||
if (stereo && bytes_read == (version == 3 ? 0x1000 : 0x2000)) {
|
||||
// switch streams
|
||||
processing_left_chunk = !processing_left_chunk;
|
||||
bytes_read = 0;
|
||||
|
||||
@@ -34,6 +34,8 @@ void write_wave_file(const std::vector<s16>& left_samples,
|
||||
s32 sample_rate,
|
||||
const fs::path& name);
|
||||
|
||||
std::pair<std::vector<s16>, std::vector<s16>> decode_adpcm(BinaryReader& reader, const bool mono);
|
||||
std::pair<std::vector<s16>, std::vector<s16>> decode_adpcm(BinaryReader& reader,
|
||||
const bool mono,
|
||||
const u32 version);
|
||||
|
||||
std::vector<u8> encode_adpcm(const std::vector<s16>& samples);
|
||||
|
||||
@@ -71,6 +71,15 @@ constexpr int LEVEL_MAX = 10;
|
||||
constexpr int LEVEL_TOTAL = LEVEL_MAX + 1;
|
||||
} // namespace jak3
|
||||
|
||||
namespace jakx {
|
||||
// for now, we don't have the ability to extend the size of the symbol table
|
||||
constexpr s32 GOAL_MAX_SYMBOLS = 0x4000;
|
||||
// amount of levels in level heap
|
||||
constexpr int LEVEL_MAX = 10;
|
||||
// total amount of levels, including ones outside level heap (default-level)
|
||||
constexpr int LEVEL_TOTAL = LEVEL_MAX + 1;
|
||||
} // namespace jakx
|
||||
|
||||
constexpr s32 max_symbols(GameVersion version) {
|
||||
switch (version) {
|
||||
case GameVersion::Jak1:
|
||||
@@ -79,6 +88,8 @@ constexpr s32 max_symbols(GameVersion version) {
|
||||
return jak2::GOAL_MAX_SYMBOLS;
|
||||
case GameVersion::Jak3:
|
||||
return jak3::GOAL_MAX_SYMBOLS;
|
||||
case GameVersion::JakX:
|
||||
return jakx::GOAL_MAX_SYMBOLS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -324,6 +324,180 @@ constexpr int FIX_SYM_NETWORK_BOOTSTRAP = 0x294;
|
||||
|
||||
} // namespace jak3_symbols
|
||||
|
||||
namespace jakx_symbols {
|
||||
|
||||
constexpr int FIX_SYM_EMPTY_CAR = -0x8;
|
||||
constexpr int S7_OFF_FIX_SYM_EMPTY_PAIR = -0x6 - 1;
|
||||
constexpr int FIX_SYM_EMPTY_CDR = -0x4;
|
||||
constexpr int FIX_SYM_FALSE = 0x0; // GOAL boolean #f (note that this is equal to the $s7 register)
|
||||
constexpr int FIX_SYM_TRUE = 0x4; // GOAL boolean #t
|
||||
constexpr int FIX_SYM_FUNCTION_TYPE = 0x8;
|
||||
constexpr int FIX_SYM_BASIC = 0xc;
|
||||
constexpr int FIX_SYM_STRING_TYPE = 0x10;
|
||||
constexpr int FIX_SYM_SYMBOL_TYPE = 0x14;
|
||||
constexpr int FIX_SYM_TYPE_TYPE = 0x18;
|
||||
constexpr int FIX_SYM_OBJECT_TYPE = 0x1c;
|
||||
constexpr int FIX_SYM_LINK_BLOCK = 0x20;
|
||||
constexpr int FIX_SYM_INTEGER = 0x24;
|
||||
constexpr int FIX_SYM_SINTEGER = 0x28;
|
||||
constexpr int FIX_SYM_UINTEGER = 0x2c;
|
||||
constexpr int FIX_SYM_BINTEGER = 0x30;
|
||||
constexpr int FIX_SYM_INT8 = 0x34;
|
||||
constexpr int FIX_SYM_INT16 = 0x38;
|
||||
constexpr int FIX_SYM_INT32 = 0x3c;
|
||||
constexpr int FIX_SYM_INT64 = 0x40;
|
||||
constexpr int FIX_SYM_INT128 = 0x44;
|
||||
constexpr int FIX_SYM_UINT8 = 0x48;
|
||||
constexpr int FIX_SYM_UINT16 = 0x4c;
|
||||
constexpr int FIX_SYM_UINT32 = 0x50;
|
||||
constexpr int FIX_SYM_UINT64 = 0x54;
|
||||
constexpr int FIX_SYM_UINT128 = 0x58;
|
||||
constexpr int FIX_SYM_FLOAT = 0x5c;
|
||||
constexpr int FIX_SYM_PROCESS_TREE = 0x60;
|
||||
constexpr int FIX_SYM_PROCESS_TYPE = 0x64;
|
||||
constexpr int FIX_SYM_THREAD = 0x68;
|
||||
constexpr int FIX_SYM_STRUCTURE = 0x6c;
|
||||
constexpr int FIX_SYM_PAIR_TYPE = 0x70;
|
||||
constexpr int FIX_SYM_POINTER = 0x74;
|
||||
constexpr int FIX_SYM_NUMBER = 0x78;
|
||||
constexpr int FIX_SYM_ARRAY = 0x7c;
|
||||
constexpr int FIX_SYM_VU_FUNCTION = 0x80;
|
||||
constexpr int FIX_SYM_CONNECTABLE = 0x84;
|
||||
constexpr int FIX_SYM_STACK_FRAME = 0x88;
|
||||
constexpr int FIX_SYM_FILE_STREAM = 0x8c;
|
||||
constexpr int FIX_SYM_HEAP = 0x90;
|
||||
constexpr int FIX_SYM_NOTHING_FUNC = 0x94;
|
||||
constexpr int FIX_SYM_DELETE_BASIC = 0x98;
|
||||
constexpr int FIX_SYM_STATIC = 0x9c;
|
||||
constexpr int FIX_SYM_GLOBAL_HEAP = 0xa0;
|
||||
constexpr int FIX_SYM_DEBUG = 0xa4;
|
||||
constexpr int FIX_SYM_LOADING_LEVEL = 0xa8;
|
||||
constexpr int FIX_SYM_LOADING_PACKAGE = 0xac;
|
||||
constexpr int FIX_SYM_PROCESS_LEVEL_HEAP = 0xb0;
|
||||
constexpr int FIX_SYM_STACK = 0xb4;
|
||||
constexpr int FIX_SYM_SCRATCH = 0xb8;
|
||||
constexpr int FIX_SYM_SCRATCH_TOP = 0xbc;
|
||||
constexpr int FIX_SYM_ZERO_FUNC = 0xc0;
|
||||
constexpr int FIX_SYM_ASIZE_OF_BASIC_FUNC = 0xc4;
|
||||
constexpr int FIX_SYM_COPY_BASIC_FUNC = 0xc8; // bugged name
|
||||
constexpr int FIX_SYM_LEVEL = 0xcc;
|
||||
constexpr int FIX_SYM_ART_GROUP = 0xd0;
|
||||
constexpr int FIX_SYM_TEXTURE_PAGE_DIR = 0xd4;
|
||||
constexpr int FIX_SYM_TEXTURE_PAGE = 0xd8;
|
||||
constexpr int FIX_SYM_SOUND = 0xdc;
|
||||
constexpr int FIX_SYM_DGO = 0xe0;
|
||||
constexpr int FIX_SYM_TOP_LEVEL = 0xe4;
|
||||
constexpr int FIX_SYM_QUOTE = 0xe8;
|
||||
constexpr int FIX_SYM_LISTENER_LINK_BLOCK = 0xec;
|
||||
constexpr int FIX_SYM_LISTENER_FUNCTION = 0xf0;
|
||||
constexpr int FIX_SYM_STACK_TOP = 0xf4;
|
||||
constexpr int FIX_SYM_STACK_BASE = 0xf8;
|
||||
constexpr int FIX_SYM_STACK_SIZE = 0xfc;
|
||||
constexpr int FIX_SYM_KERNEL_FUNCTION = 0x100;
|
||||
constexpr int FIX_SYM_KERNEL_PACKAGES = 0x104;
|
||||
constexpr int FIX_SYM_KERNEL_BOOT_MESSAGE = 0x108;
|
||||
constexpr int FIX_SYM_KERNEL_BOOT_MODE = 0x10c;
|
||||
constexpr int FIX_SYM_KERNEL_BOOT_LEVEL = 0x110;
|
||||
constexpr int FIX_SYM_KERNEL_BOOT_ART_GROUP = 0x114;
|
||||
constexpr int FIX_SYM_KERNEL_DEBUG = 0x118;
|
||||
constexpr int FIX_SYM_KERNEL_VERSION = 0x11c;
|
||||
constexpr int FIX_SYM_KERNEL_DISPATCHER = 0x120;
|
||||
constexpr int FIX_SYM_SYNC_DISPATCHER = 0x124;
|
||||
constexpr int FIX_SYM_PRINT_COLLUMN = 0x128;
|
||||
constexpr int FIX_SYM_DEBUG_SEGMENT = 300;
|
||||
constexpr int FIX_SYM_ENABLE_METHOD_SET = 0x130;
|
||||
constexpr int FIX_SYM_SQL_RESULT = 0x134;
|
||||
constexpr int FIX_SYM_COLLAPSE_QUOTE = 0x138;
|
||||
constexpr int FIX_SYM_LEVEL_TYPE_LIST = 0x13C;
|
||||
constexpr int FIX_SYM_DECI_COUNT = 0x140;
|
||||
constexpr int FIX_SYM_USER = 0x144;
|
||||
constexpr int FIX_SYM_VIDEO_MODE = 0x148;
|
||||
constexpr int FIX_SYM_BOOT_VIDEO_MODE = 0x14C;
|
||||
constexpr int FIX_SYM_BOOT = 0x150;
|
||||
constexpr int FIX_SYM_DEMO = 0x154;
|
||||
constexpr int FIX_SYM_DEMO_SHARED = 0x158;
|
||||
constexpr int FIX_SYM_PREVIEW = 0x15C;
|
||||
constexpr int FIX_SYM_KIOSK = 0x160;
|
||||
constexpr int FIX_SYM_PLAY_BOOT = 0x164;
|
||||
constexpr int FIX_SYM_SIN = 0x168;
|
||||
constexpr int FIX_SYM_COS = 0x16C;
|
||||
constexpr int FIX_SYM_PUT_DISPLAY_ENV = 0x170;
|
||||
constexpr int FIX_SYM_SYNCV = 0x174;
|
||||
constexpr int FIX_SYM_SYNC_PATH = 0x178;
|
||||
constexpr int FIX_SYM_RESET_PATH = 0x17C;
|
||||
constexpr int FIX_SYM_RESET_GRAPH = 0x180;
|
||||
constexpr int FIX_SYM_DMA_SYNC = 0x184;
|
||||
constexpr int FIX_SYM_GS_PUT_IMR = 0x188;
|
||||
constexpr int FIX_SYM_GS_GET_IMR = 0x18C;
|
||||
constexpr int FIX_SYM_GS_STORE_IMAGE = 400;
|
||||
constexpr int FIX_SYM_FLUSH_CACHE = 0x194;
|
||||
constexpr int FIX_SYM_CPAD_OPEN = 0x198;
|
||||
constexpr int FIX_SYM_CPAD_GET_DATA = 0x19C;
|
||||
constexpr int FIX_SYM_MOUSE_GET_DATA = 0x1A0;
|
||||
constexpr int FIX_SYM_KEYBD_GET_DATA = 0x1A4;
|
||||
constexpr int FIX_SYM_INSTALL_HANDLER = 0x1A8;
|
||||
constexpr int FIX_SYM_INSTALL_DEBUG_HANDLER = 0x1AC;
|
||||
constexpr int FIX_SYM_FILE_STREAM_OPEN = 0x1B0;
|
||||
constexpr int FIX_SYM_FILE_STREAM_CLOSE = 0x1B4;
|
||||
constexpr int FIX_SYM_FILE_STREAM_LENGTH = 0x1B8;
|
||||
constexpr int FIX_SYM_FILE_STREAM_SEEK = 0x1BC;
|
||||
constexpr int FIX_SYM_FILE_STREAM_READ = 0x1C0;
|
||||
constexpr int FIX_SYM_FILE_STREAM_WRITE = 0x1C4;
|
||||
constexpr int FIX_SYM_SCF_GET_LANGUAGE = 0x1C8;
|
||||
constexpr int FIX_SYM_SCF_GET_TIME = 0x1CC;
|
||||
constexpr int FIX_SYM_SCF_GET_ASPECT = 0x1D0;
|
||||
constexpr int FIX_SYM_SCF_GET_VOLUME = 0x1D4;
|
||||
constexpr int FIX_SYM_SCF_GET_TERRITORY = 0x1D8;
|
||||
constexpr int FIX_SYM_SCF_GET_TIMEOUT = 0x1DC;
|
||||
constexpr int FIX_SYM_SCF_GET_INACTIVE_TIMEOUT = 0x1E0;
|
||||
constexpr int FIX_SYM_DMA_TO_IOP = 0x1E4;
|
||||
constexpr int FIX_SYM_KERNEL_SHUTDOWN = 0x1E8;
|
||||
constexpr int FIX_SYM_AYBABTU = 0x1EC;
|
||||
constexpr int FIX_SYM_STRING_TO_SYMBOL = 0x1F0;
|
||||
constexpr int FIX_SYM_SYMBOL_TO_STRING = 500;
|
||||
constexpr int FIX_SYM_PRINT = 0x1F8;
|
||||
constexpr int FIX_SYM_INSPECT = 0x1FC;
|
||||
constexpr int FIX_SYM_LOAD = 0x200;
|
||||
constexpr int FIX_SYM_LOADB = 0x204;
|
||||
constexpr int FIX_SYM_LOADO = 0x208;
|
||||
constexpr int FIX_SYM_UNLOAD = 0x20C;
|
||||
constexpr int FIX_SYM_FORMAT = 0x210;
|
||||
constexpr int FIX_SYM_MALLOC = 0x214;
|
||||
constexpr int FIX_SYM_KMALLOC = 0x218;
|
||||
constexpr int FIX_SYM_KMEMOPEN = 0x21C;
|
||||
constexpr int FIX_SYM_KMEMCLOSE = 0x220;
|
||||
constexpr int FIX_SYM_NEW_DYNAMIC_STRUCTURE = 0x224;
|
||||
constexpr int FIX_SYM_METHOD_SET = 0x228;
|
||||
constexpr int FIX_SYM_LINK = 0x22C;
|
||||
constexpr int FIX_SYM_LINK_BUSY = 0x230;
|
||||
constexpr int FIX_SYM_LINK_RESET = 0x234;
|
||||
constexpr int FIX_SYM_LINK_BEGIN = 0x238;
|
||||
constexpr int FIX_SYM_LINK_RESUME = 0x23C;
|
||||
constexpr int FIX_SYM_DGO_LOAD = 0x240;
|
||||
constexpr int FIX_SYM_SQL_QUERY = 0x244;
|
||||
constexpr int FIX_SYM_MC_RUN = 0x248;
|
||||
constexpr int FIX_SYM_MC_FORMAT = 0x24C;
|
||||
constexpr int FIX_SYM_MC_UNFORMAT = 0x250;
|
||||
constexpr int FIX_SYM_MC_CREATE_FILE = 0x254;
|
||||
constexpr int FIX_SYM_MC_SAVE = 600;
|
||||
constexpr int FIX_SYM_MC_LOAD = 0x25C;
|
||||
constexpr int FIX_SYM_MC_CHECK_RESULT = 0x260;
|
||||
constexpr int FIX_SYM_MC_GET_SLOT_INFO = 0x264;
|
||||
constexpr int FIX_SYM_MC_MAKEFILE = 0x268;
|
||||
constexpr int FIX_SYM_KSET_LANGUAGE = 0x26C;
|
||||
constexpr int FIX_SYM_RPC_CALL = 0x270;
|
||||
constexpr int FIX_SYM_RPC_BUSY = 0x274;
|
||||
constexpr int FIX_SYM_TEST_LOAD_DGO_C = 0x278;
|
||||
constexpr int FIX_SYM_SYMLINK2 = 0x27c;
|
||||
constexpr int FIX_SYM_SYMLINK3 = 0x280;
|
||||
constexpr int FIX_SYM_ULTIMATE_MEMCPY = 0x284;
|
||||
constexpr int FIX_SYM_PLAY = 0x288;
|
||||
constexpr int FIX_SYM_SYMBOL_STRING = 0x28c;
|
||||
constexpr int FIX_SYM_KERNEL_SYMBOL_WARNINGS = 0x290;
|
||||
constexpr int FIX_SYM_NETWORK_BOOTSTRAP = 0x294;
|
||||
|
||||
} // namespace jakx_symbols
|
||||
|
||||
constexpr int false_symbol_offset() {
|
||||
return jak1_symbols::FIX_SYM_FALSE;
|
||||
}
|
||||
@@ -334,6 +508,7 @@ constexpr int true_symbol_offset(GameVersion version) {
|
||||
return jak1_symbols::FIX_SYM_TRUE;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
return jak2_symbols::FIX_SYM_TRUE;
|
||||
}
|
||||
}
|
||||
@@ -344,6 +519,7 @@ constexpr int empty_pair_offset_from_s7(GameVersion version) {
|
||||
return jak1_symbols::FIX_SYM_EMPTY_PAIR;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
// minus 1 for the symbol table pointer's offset.
|
||||
return jak2_symbols::S7_OFF_FIX_SYM_EMPTY_PAIR;
|
||||
}
|
||||
|
||||
@@ -1100,6 +1100,7 @@ void TypeSystem::add_builtin_types(GameVersion version) {
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
symbol_type = add_builtin_structure("object", "symbol", true);
|
||||
symbol_type->override_offset(1);
|
||||
break;
|
||||
|
||||
@@ -25,7 +25,8 @@ std::string get_object_file_name(const std::string& original_name, const u8* dat
|
||||
const std::string art_group_text_strings[] = {
|
||||
fmt::format("/src/next/data/art-group{}/", versions::jak1::ART_FILE_VERSION),
|
||||
fmt::format("/src/jak2/final/art-group{}/", versions::jak2::ART_FILE_VERSION),
|
||||
fmt::format("/src/jak3/final/art-group{}/", versions::jak3::ART_FILE_VERSION)};
|
||||
fmt::format("/src/jak3/final/art-group{}/", versions::jak3::ART_FILE_VERSION),
|
||||
fmt::format("/src/jakx/final/art-group{}/", versions::jakx::ART_FILE_VERSION)};
|
||||
const std::string suffix = "-ag.go";
|
||||
|
||||
for (auto& art_group_text : art_group_text_strings) {
|
||||
|
||||
@@ -0,0 +1,795 @@
|
||||
#include "font_db_jakx.h"
|
||||
|
||||
std::unordered_set<char> passthrus_jakx = {'~', ' ', ',', '.', '-', '+', '(', ')',
|
||||
'!', ':', '?', '=', '%', '*', '/', '#',
|
||||
';', '<', '>', '@', '[', '_', ']'};
|
||||
|
||||
std::vector<ReplaceInfo> replace_info_jakx = {
|
||||
// other
|
||||
{"A~Y~-21H~-5Vº~Z", "Å"},
|
||||
{"N~Y~-6Hº~Z~+10H", "Nº"},
|
||||
{"~+4Vç~-4V", ",c"},
|
||||
|
||||
// added for translations TODO - check these for jak 2
|
||||
{"O~Y~-25H~-1V/~Z", "Ø"},
|
||||
{"o~Y~-23H~+4V/~Z", "ø"},
|
||||
{"A~Y~-13H~+8V,~Z", "Ą"},
|
||||
{"a~Y~-8H~+6V,~Z", "ą"},
|
||||
{"E~Y~-6H~+8V,~Z", "Ę"},
|
||||
{"e~Y~-10H~+7V,~Z", "ę"},
|
||||
{"L~Y~-21H~+0V/~Z", "Ł"},
|
||||
{"l~Y~-16H~+0V/~Z", "ł"}, // TODO - this one is ugly, font character addition (small slash)
|
||||
{"Z~Y~-25H~-11Vº~Z", "Ż"},
|
||||
{"z~Y~-23H~-5Vº~Z", "ż"},
|
||||
{"a~Y~-25H~-5Vº~Z", "å"},
|
||||
{"S~Y~-21H~-5V'~Z", "Ś"},
|
||||
{"s~Y~-25H~-5V'~Z", "ś"},
|
||||
{"n~Y~-25H~-5V'~Z", "ń"},
|
||||
{"c~Y~-25H~-5V'~Z", "ć"},
|
||||
{"o~Y~-24H~-4V<TIL>~Z", "õ"},
|
||||
{"a~Y~-24H~-4V<TIL>~Z", "ã"},
|
||||
{"O~Y~-28H~-4V'~-9H'~Z", "Ő"},
|
||||
{"U~Y~-27H~-4V'~-12H'~Z", "Ű"},
|
||||
{"o~Y~-28H~-4V'~-9H'~Z", "ő"},
|
||||
{"u~Y~-28H~-4V'~-9H'~Z", "ű"},
|
||||
{"E~Y~-22H~-11Vº~Z", "Ė"},
|
||||
{"e~Y~-25H~-5Vº~Z", "ė"},
|
||||
{"C~Y~-27H~-10Vˇ~Z", "Č"},
|
||||
{"c~Y~-25H~-5Vˇ~Z", "č"},
|
||||
{"D~Y~-27H~-10Vˇ~Z", "Ď"},
|
||||
{"S~Y~-24H~-10Vˇ~Z", "Š"},
|
||||
{"s~Y~-22H~-4Vˇ~Z", "š"},
|
||||
{"Z~Y~-25H~-10Vˇ~Z", "Ž"},
|
||||
{"z~Y~-23H~-4Vˇ~Z", "ž"},
|
||||
{"U~Y~-15H~+5V,~Z", "Ų"},
|
||||
{"u~Y~-15H~+5V,~Z", "ų"},
|
||||
{"U~Y~-20H~-18V-~Z", "Ū"},
|
||||
{"u~Y~-18H~-15V-~Z", "ū"},
|
||||
{"D~Y~-28H~-1V-~Z", "Đ"},
|
||||
{"d~Y~-13H~-10V-~Z", "đ"},
|
||||
{"I~Y~-8H~+4V,~Z", "Į"},
|
||||
{"i~Y~-8H~+4V,~Z", "į"},
|
||||
// czech specific
|
||||
{"U~Y~-24H~-7Vº~Z", "Ů"},
|
||||
{"u~Y~-23H~-5Vº~Z", "ů"},
|
||||
{"t~Y~-7H~-21V,~Z", "ť"},
|
||||
|
||||
// tildes
|
||||
{"N~Y~-22H~-4V<TIL>~Z", "Ñ"},
|
||||
{"n~Y~-24H~-4V<TIL>~Z", "ñ"},
|
||||
{"A~Y~-21H~-5V<TIL>~Z", "Ã"},
|
||||
{"O~Y~-22H~-4V<TIL>~Z", "Õ"},
|
||||
|
||||
// acute accents
|
||||
{"A~Y~-21H~-5V'~Z", "Á"},
|
||||
{"A~Y~-26H~-8V'~Z", "<Á_V2>"}, // unfortunate...
|
||||
{"a~Y~-25H~-5V'~Z", "á"},
|
||||
{"E~Y~-23H~-9V'~Z", "É"},
|
||||
{"e~Y~-26H~-5V'~Z", "é"},
|
||||
{"I~Y~-19H~-5V'~Z", "Í"},
|
||||
{"i~Y~-19H~-8V'~Z", "í"},
|
||||
{"O~Y~-22H~-4V'~Z", "Ó"},
|
||||
{"o~Y~-26H~-4V'~Z", "ó"},
|
||||
{"U~Y~-24H~-3V'~Z", "Ú"},
|
||||
{"u~Y~-24H~-3V'~Z", "ú"},
|
||||
{"Z~Y~-24H~-3V'~Z", "Ź"},
|
||||
{"z~Y~-24H~-3V'~Z", "ź"},
|
||||
// czech specific
|
||||
{"Y~Y~-26H~-5V'~Z", "Ý"},
|
||||
{"~+7Vy~-7V~Y~-24H~-3V'~Z", "ý"},
|
||||
|
||||
// circumflex
|
||||
{"A~Y~-20H~-4V^~Z", "Â"},
|
||||
{"a~Y~-24H~-5V^~Z", "â"},
|
||||
{"E~Y~-20H~-5V^~Z", "Ê"},
|
||||
{"e~Y~-25H~-4V^~Z", "ê"},
|
||||
{"I~Y~-19H~-5V^~Z", "Î"},
|
||||
{"i~Y~-19H~-8V^~Z", "î"},
|
||||
{"O~Y~-20H~-4V^~Z", "Ô"},
|
||||
{"o~Y~-25H~-4V^~Z", "ô"},
|
||||
{"U~Y~-24H~-3V^~Z", "Û"},
|
||||
{"u~Y~-23H~-3V^~Z", "û"},
|
||||
|
||||
// grave accents
|
||||
{"A~Y~-26H~-8V`~Z", "À"},
|
||||
{"a~Y~-25H~-5V`~Z", "à"},
|
||||
{"E~Y~-23H~-9V`~Z", "È"},
|
||||
{"e~Y~-26H~-5V`~Z", "è"},
|
||||
{"I~Y~-19H~-5V`~Z", "Ì"},
|
||||
{"i~Y~-19H~-8V`~Z", "ì"},
|
||||
{"O~Y~-22H~-4V`~Z", "Ò"},
|
||||
{"o~Y~-26H~-4V`~Z", "ò"},
|
||||
{"U~Y~-24H~-3V`~Z", "Ù"},
|
||||
{"u~Y~-24H~-3V`~Z", "ù"},
|
||||
|
||||
// umlaut
|
||||
{"A~Y~-26H~-8V¨~Z", "Ä"},
|
||||
{"a~Y~-25H~-5V¨~Z", "ä"},
|
||||
{"E~Y~-20H~-5V¨~Z", "Ë"},
|
||||
{"e~Y~-25H~-5V¨~Z", "ë"},
|
||||
{"I~Y~-19H~-5V¨~Z", "Ï"},
|
||||
{"i~Y~-26H~-4V¨~Z", "ï"},
|
||||
{"O~Y~-26H~-8V¨~Z", "Ö"},
|
||||
{"o~Y~-26H~-4V¨~Z", "ö"},
|
||||
{"U~Y~-25H~-8V¨~Z", "Ü"},
|
||||
{"u~Y~-24H~-3V¨~Z", "ü"},
|
||||
|
||||
// caron - Ǎ ǎ Ě ě Ǧ ǧ Ǐ ǐ Ǒ ǒ Ǔ ǔ Y̌ y̌
|
||||
{"A~Y~-25H~-9Vˇ~Z", "Ǎ"},
|
||||
{"a~Y~-24H~-5Vˇ~Z", "ǎ"},
|
||||
{"E~Y~-22H~-8Vˇ~Z", "Ě"},
|
||||
{"e~Y~-25H~-4Vˇ~Z", "ě"},
|
||||
{"G~Y~-24H~-8Vˇ~Z", "Ǧ"},
|
||||
{"~+7Vg~-7V~Y~-25H~-4Vˇ~Z", "ǧ"},
|
||||
{"I~Y~-19H~-8Vˇ~Z", "Ǐ"},
|
||||
{"i~Y~-19H~-8Vˇ~Z", "ǐ"},
|
||||
{"O~Y~-25H~-7Vˇ~Z", "Ǒ"},
|
||||
{"o~Y~-25H~-4Vˇ~Z", "ǒ"},
|
||||
{"U~Y~-25H~-6Vˇ~Z", "Ǔ"},
|
||||
{"u~Y~-24H~-3Vˇ~Z", "ǔ"},
|
||||
{"Y~Y~-25H~-5Vˇ~Z", "Y̌"},
|
||||
{"~+7Vy~-7V~Y~-25H~-3Vˇ~Z", "y̌"},
|
||||
// czech specific - Č č Ň ň Ř ř Š š Ž ž Ť
|
||||
{"C~Y~-25H~-9Vˇ~Z", "Č"},
|
||||
{"c~Y~-24H~-5Vˇ~Z", "č"},
|
||||
{"N~Y~-25H~-9Vˇ~Z", "Ň"},
|
||||
{"n~Y~-24H~-5Vˇ~Z", "ň"},
|
||||
{"R~Y~-25H~-9Vˇ~Z", "Ř"},
|
||||
{"r~Y~-22H~-5Vˇ~Z", "ř"},
|
||||
{"S~Y~-25H~-9Vˇ~Z", "Š"},
|
||||
{"s~Y~-22H~-5Vˇ~Z", "š"},
|
||||
{"T~Y~-24H~-7Vˇ~Z", "Ť"},
|
||||
{"Z~Y~-25H~-9Vˇ~Z", "Ž"},
|
||||
{"z~Y~-24H~-5Vˇ~Z", "ž"},
|
||||
|
||||
// dakuten katakana
|
||||
{"~Yウ~Z゛", "ヴ"},
|
||||
{"~Yカ~Z゛", "ガ"},
|
||||
{"~Yキ~Z゛", "ギ"},
|
||||
{"~Yク~Z゛", "グ"},
|
||||
{"~Yケ~Z゛", "ゲ"},
|
||||
{"~Yコ~Z゛", "ゴ"},
|
||||
{"~Yサ~Z゛", "ザ"},
|
||||
{"~Yシ~Z゛", "ジ"},
|
||||
{"~Yス~Z゛", "ズ"},
|
||||
{"~Yセ~Z゛", "ゼ"},
|
||||
{"~Yソ~Z゛", "ゾ"},
|
||||
{"~Yタ~Z゛", "ダ"},
|
||||
{"~Yチ~Z゛", "ヂ"},
|
||||
{"~Yツ~Z゛", "ヅ"},
|
||||
{"~Yテ~Z゛", "デ"},
|
||||
{"~Yト~Z゛", "ド"},
|
||||
{"~Yハ~Z゛", "バ"},
|
||||
{"~Yヒ~Z゛", "ビ"},
|
||||
{"~Yフ~Z゛", "ブ"},
|
||||
{"~Yヘ~Z゛", "ベ"},
|
||||
{"~Yホ~Z゛", "ボ"},
|
||||
// handakuten katakana
|
||||
{"~Yハ~Z゜", "パ"},
|
||||
{"~Yヒ~Z゜", "ピ"},
|
||||
{"~Yフ~Z゜", "プ"},
|
||||
{"~Yヘ~Z゜", "ペ"},
|
||||
{"~Yホ~Z゜", "ポ"},
|
||||
// dakuten hiragana
|
||||
{"~Yか~Z゛", "が"},
|
||||
{"~Yき~Z゛", "ぎ"},
|
||||
{"~Yく~Z゛", "ぐ"},
|
||||
{"~Yけ~Z゛", "げ"},
|
||||
{"~Yこ~Z゛", "ご"},
|
||||
{"~Yさ~Z゛", "ざ"},
|
||||
{"~Yし~Z゛", "じ"},
|
||||
{"~Yす~Z゛", "ず"},
|
||||
{"~Yせ~Z゛", "ぜ"},
|
||||
{"~Yそ~Z゛", "ぞ"},
|
||||
{"~Yた~Z゛", "だ"},
|
||||
{"~Yち~Z゛", "ぢ"},
|
||||
{"~Yつ~Z゛", "づ"},
|
||||
{"~Yて~Z゛", "で"},
|
||||
{"~Yと~Z゛", "ど"},
|
||||
{"~Yは~Z゛", "ば"},
|
||||
{"~Yひ~Z゛", "び"},
|
||||
{"~Yふ~Z゛", "ぶ"},
|
||||
{"~Yへ~Z゛", "べ"},
|
||||
{"~Yほ~Z゛", "ぼ"},
|
||||
// handakuten hiragana
|
||||
{"~Yは~Z゜", "ぱ"},
|
||||
{"~Yひ~Z゜", "ぴ"},
|
||||
{"~Yふ~Z゜", "ぷ"},
|
||||
{"~Yへ~Z゜", "ぺ"},
|
||||
{"~Yほ~Z゜", "ぽ"},
|
||||
// japanese punctuation
|
||||
{",~+8H", "、"},
|
||||
{"~+8H ", " "},
|
||||
|
||||
// playstation buttons
|
||||
// - face
|
||||
{"~Y~22L<~Z~Y~27L*~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<PAD_X>"},
|
||||
{"~Y~22L<~Z~Y~26L;~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<PAD_TRIANGLE>"},
|
||||
{"~Y~22L<~Z~Y~25L@~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<PAD_CIRCLE>"},
|
||||
{"~Y~22L<~Z~Y~24L#~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<PAD_SQUARE>"},
|
||||
// - dpad
|
||||
{"~Y~22L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~22L~+17H~+14V<PAD_PART_DPAD_D>~Z~"
|
||||
"22L~+32H<PAD_PART_DPAD_R>~Z~+56H",
|
||||
"<PAD_DPAD_UP>"},
|
||||
{"~Y~22L<PAD_PART_DPAD_L>~Z~3L~+17H~-13V<PAD_PART_DPAD_U>~Z~3L~+17H~+14V<PAD_PART_DPAD_D>~Z~"
|
||||
"22L~+32H<PAD_PART_DPAD_R>~Z~+56H",
|
||||
"<PAD_DPAD_DOWN>"},
|
||||
{"~Y~22L<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",
|
||||
"<PAD_DPAD_ANY>"},
|
||||
// - shoulder
|
||||
{"~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~1L~+4H~+3V<PAD_PART_L1_NAME>~Z~+"
|
||||
"38H",
|
||||
"<PAD_L1>"},
|
||||
{"~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~1L~+6H~+3V<PAD_PART_R1_NAME>~Z~+"
|
||||
"38H",
|
||||
"<PAD_R1>"},
|
||||
{"~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~1L~+5H~-2V<PAD_PART_R2_NAME>~Z~+"
|
||||
"38H",
|
||||
"<PAD_R2>"},
|
||||
{"~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~1L~+5H~-2V<PAD_PART_L2_NAME>~Z~+"
|
||||
"38H",
|
||||
"<PAD_L2>"},
|
||||
// - analog
|
||||
{"~1L~+8H~Y<PAD_PART_STICK>~Z~6L~-16H<PAD_PART_STICK_LEFT>~Z~+16h~6L<PAD_PART_STICK_RIGHT>~Z~"
|
||||
"6L~-15V<PAD_PART_STICK_DOWN>~Z~+13V~6L<PAD_PART_STICK_UP>~Z~-10H~+9V~6L<PAD_PART_STICK_UP_"
|
||||
"LEFT>~Z~+10H~+9V~6L<PAD_PART_STICK_UP_RIGHT>~Z~-10H~-11V~6L<PAD_PART_STICK_DOWN_LEFT>~Z~+10H~"
|
||||
"-11V~6L<PAD_PART_STICK_DOWN_RIGHT>~Z~+32H",
|
||||
"<PAD_ANALOG_ANY>"},
|
||||
{"~Y~1L~+8H<PAD_PART_STICK>~Z~6L~-8H<PAD_PART_STICK_LEFT>~Z~+24H~6L<PAD_PART_STICK_RIGHT>~Z~+"
|
||||
"40H",
|
||||
"<PAD_ANALOG_LEFT_RIGHT>"},
|
||||
{"~Y~1L<PAD_PART_STICK>~Z~6L~-15V<PAD_PART_STICK_DOWN>~Z~+13V~6L<PAD_PART_STICK_UP>~Z~+26H",
|
||||
"<PAD_ANALOG_UP_DOWN>"},
|
||||
|
||||
// icons
|
||||
{"~Y~6L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<ICON_MISSION_COMPLETE>"},
|
||||
{"~Y~3L<~Z~Y~1L>~Z~Y~23L[~Z~+26H", "<ICON_MISSION_TODO>"},
|
||||
|
||||
// flags
|
||||
{"~Y~6L<FLAG_PART_VERT_STRIPE_LARGE>~Z~+15H~1L<FLAG_PART_VERT_STRIPE_LARGE>~Z~+30H~3L<FLAG_"
|
||||
"PART_VERT_STRIPE_LARGE>~Z~+45H",
|
||||
"<FLAG_ITALIAN>"},
|
||||
{"~Y~5L<FLAG_PART_FILL>~Z~3L<FLAG_PART_TOP_BOTTOM_STRIPE>~]~-1H~Y~5L<FLAG_PART_FILL>~Z~3L<FLAG_"
|
||||
"PART_TOP_BOTTOM_STRIPE>~Z~+26H",
|
||||
"<FLAG_SPAIN>"},
|
||||
{"~Y~39L~~~Z~3L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~5L<FLAG_PART_HORZ_STRIPE_BOTTOM>~]~-1H~Y~39L~~~"
|
||||
"Z~3L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~5L<FLAG_PART_HORZ_STRIPE_BOTTOM>~Z~+26H",
|
||||
"<FLAG_GERMAN>"},
|
||||
{"~Y~7L<FLAG_PART_VERT_STRIPE_LARGE>~Z~+15H~1L<FLAG_PART_VERT_STRIPE_LARGE>~Z~+30H~3L<FLAG_"
|
||||
"PART_VERT_STRIPE_LARGE>~Z~+47H",
|
||||
"<FLAG_FRANCE>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~3L<FLAG_PART_UK_CROSS_LEFT>~Z~7L<FLAG_PART_UK_FILL_LEFT>~]~-1H~Y~1L<"
|
||||
"FLAG_PART_FILL>~Z~3L<FLAG_PART_UK_CROSS_RIGHT>~Z~7L<FLAG_PART_UK_FILL_RIGHT>~Z~+26H",
|
||||
"<FLAG_UK>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~3L<FLAG_PART_USA_STRIPES_LEFT>~Z~7L<FLAG_PART_USA_STARS>~]~-1H~Y~1L<"
|
||||
"FLAG_PART_FILL>~Z~3L<FLAG_PART_USA_STRIPES_RIGHT>~Z~+26H",
|
||||
"<FLAG_USA>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~39L<FLAG_PART_KOREA_TRIGRAMS_LEFT>~]~-1H~Y~1L<FLAG_PART_FILL>~Z~39L<"
|
||||
"FLAG_PART_KOREA_TRIGRAMS_RIGHT>~Z~-11H~7L<FLAG_PART_KOREA_CIRCLE_FILL>~Z~-11H~3L<FLAG_PART_"
|
||||
"KOREA_CIRCLE_TOP>~Z~+26H",
|
||||
"<FLAG_KOREA>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~]~-1H~Y~1L<FLAG_PART_FILL>~Z~-11H~3L<FLAG_PART_JAPAN_SUN>~Z~+26H",
|
||||
"<FLAG_JAPAN>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~7L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~7L<FLAG_PART_VERT_STRIPE_RIGHT>~]"
|
||||
"~-1H~Y~1L<FLAG_PART_FILL>~Z~7L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~+26H",
|
||||
"<FLAG_FINLAND>"},
|
||||
{"~Y~7L<FLAG_PART_FILL>~Z~5L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~5L<FLAG_PART_VERT_STRIPE_RIGHT>~]"
|
||||
"~-1H~Y~7L<FLAG_PART_FILL>~Z~5L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~+26H",
|
||||
"<FLAG_SWEDEN>"},
|
||||
{"~Y~3L<FLAG_PART_FILL>~Z~1L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~1L<FLAG_PART_VERT_STRIPE_RIGHT>~]"
|
||||
"~-1H~Y~3L<FLAG_PART_FILL>~Z~1L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~+26H",
|
||||
"<FLAG_DENMARK>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~3L<FLAG_PART_TOP_BOTTOM_STRIPE>~]~-1H~Y~1L<FLAG_PART_FILL>~Z~3L<FLAG_"
|
||||
"PART_TOP_BOTTOM_STRIPE>~Z~-19H~1L<FLAG_PART_VERT_STRIPE_MIDDLE>~Z~-23H~7L<FLAG_PART_VERT_"
|
||||
"STRIPE_RIGHT>~Z~-23H~7L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~7L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~"
|
||||
"+26H",
|
||||
"<FLAG_NORWAY>"},
|
||||
{"~Y~1L<FLAG_PART_FILL>~Z~7L<FLAG_PART_TOP_BOTTOM_STRIPE>~]~-1H~Y~1L<FLAG_PART_FILL>~Z~7L<FLAG_"
|
||||
"PART_TOP_BOTTOM_STRIPE>~Z~-19H~1L<FLAG_PART_VERT_STRIPE_MIDDLE>~Z~-23H~3L<FLAG_PART_VERT_"
|
||||
"STRIPE_RIGHT>~Z~-23H~3L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~3L<FLAG_PART_HORZ_STRIPE_MIDDLE>~Z~"
|
||||
"+26H",
|
||||
"<FLAG_ICELAND>"},
|
||||
|
||||
// weird stuff
|
||||
// - descenders
|
||||
{"~+7Vp~-7V", "p"},
|
||||
{"~+7Vy~-7V", "y"},
|
||||
{"~+7Vg~-7V", "g"},
|
||||
{"~+7Vq~-7V", "q"},
|
||||
{"~+1Vj~-1V", "j"},
|
||||
|
||||
{"\\\\",
|
||||
"~%"}, // this is 2 slashes, duplicated because we use an escape sequence when decompiling
|
||||
|
||||
// - symbols and ligatures
|
||||
{"~-4H~-3V<SOMETHING>~+3V~-4H",
|
||||
"<SUPERSCRIPT_QUOTE>"}, // used for the 4<__> place in spanish. the 5th uses the same
|
||||
// character but looks different...?
|
||||
{"~Y~-6Hº~Z~+10H", "°"},
|
||||
|
||||
// Color / Emphasis
|
||||
{"~[~0L", "<COLOR_DEFAULT>"},
|
||||
{"~[~1L", "<COLOR_WHITE>"},
|
||||
{"~[~2L", "<COLOR_TRANSPARENT>"},
|
||||
{"~[~3L", "<COLOR_RED>"},
|
||||
{"~[~4L", "<COLOR_ORANGE>"},
|
||||
{"~[~5L", "<COLOR_YELLOW>"},
|
||||
{"~[~6L", "<COLOR_GREEN>"},
|
||||
{"~[~7L", "<COLOR_BLUE>"},
|
||||
{"~[~8L", "<COLOR_CYAN>"},
|
||||
{"~[~9L", "<COLOR_PINK>"},
|
||||
{"~[~10L", "<COLOR_MENU-SELECTED>"},
|
||||
{"~[~11L", "<COLOR_MENU-SELECTED-PARENT>"},
|
||||
{"~[~12L", "<COLOR_MENU>"},
|
||||
{"~[~13L", "<COLOR_MENU-PARENT>"},
|
||||
{"~[~14L", "<COLOR_MENU-FUNC-BAD>"},
|
||||
{"~[~15L", "<COLOR_MENU-FLAG-ON>"},
|
||||
{"~[~16L", "<COLOR_MENU-FLAG-ON-PARENT>"},
|
||||
{"~[~17L", "<COLOR_MENU-FLAG-OFF>"},
|
||||
{"~[~18L", "<COLOR_MENU-FLAG-OFF-PARENT>"},
|
||||
{"~[~19L", "<COLOR_MENU-INVALID>"},
|
||||
{"~[~20L", "<COLOR_FLAT-YELLOW>"},
|
||||
{"~[~21L", "<COLOR_COLOR-21>"},
|
||||
{"~[~22L", "<COLOR_PAD-BACK>"},
|
||||
{"~[~23L", "<COLOR_PAD-SHINE>"},
|
||||
{"~[~24L", "<COLOR_PAD-SQUARE>"},
|
||||
{"~[~25L", "<COLOR_PAD-CIRCLE>"},
|
||||
{"~[~26L", "<COLOR_PAD-TRIANGLE>"},
|
||||
{"~[~27L", "<COLOR_PAD-CROSS>"},
|
||||
{"~[~28L", "<COLOR_PROGRESS-OLD-BLUE>"},
|
||||
{"~[~29L", "<COLOR_PROGRESS-OLD-YELLOW>"},
|
||||
{"~[~30L", "<COLOR_PROGRESS-OLD-SELECTED>"},
|
||||
{"~[~31L", "<COLOR_PROGRESS-OLD-PERCENT>"},
|
||||
{"~[~32L", "<COLOR_PROGRESS>"},
|
||||
{"~[~33L", "<COLOR_PROGRESS-SELECTED>"},
|
||||
{"~[~34L", "<COLOR_PROGRESS-FORCE-SELECTED>"},
|
||||
{"~[~35L", "<COLOR_PROGRESS-OPTION-OFF>"},
|
||||
{"~[~36L", "<COLOR_COLOR-36>"},
|
||||
{"~[~37L", "<COLOR_CREDITS-STAFF-TITLE-1>"},
|
||||
{"~[~38L", "<COLOR_CREDITS-STAFF-TITLE-2>"},
|
||||
{"~[~39L", "<COLOR_COLOR-39>"}};
|
||||
|
||||
// TODO - cryllic
|
||||
|
||||
std::vector<EncodeInfo> encode_info_jakx = {
|
||||
{"ˇ", "\x10"}, // caron
|
||||
{"`", "\x11"}, // grave accent
|
||||
{"'", "\x12"}, // apostrophe
|
||||
{"^", "\x13"}, // circumflex
|
||||
{"<TIL>", "\x14"}, // tilde
|
||||
{"¨", "\x15"}, // umlaut
|
||||
{"º", "\x16"}, // numero/overring
|
||||
{"¡", "\x17"}, // inverted exclamation mark
|
||||
{"¿", "\x18"}, // inverted question mark
|
||||
{"<SOMETHING>", "\x19"},
|
||||
{"ç", "\x1d"}, // c-cedilla
|
||||
{"Ç", "\x1e"}, // c-cedilla
|
||||
{"ß", "\x1f"}, // eszett
|
||||
|
||||
{"œ", "\x5e"}, // ligature o+e
|
||||
|
||||
{"<FLAG_PART_HORZ_STRIPE_MIDDLE>", "\x7f"},
|
||||
{"<FLAG_PART_HORZ_STRIPE_BOTTOM>", "\x80"},
|
||||
{"<FLAG_PART_VERT_STRIPE_LARGE>", "\x81"},
|
||||
{"<FLAG_PART_VERT_STRIPE_RIGHT>", "\x82"},
|
||||
{"<FLAG_PART_VERT_STRIPE_LEFT>", "\x83"},
|
||||
{"<FLAG_PART_VERT_STRIPE_MIDDLE>", "\x84"},
|
||||
{"<FLAG_PART_FILL>", "\x85"},
|
||||
{"<FLAG_PART_JAPAN_SUN>", "\x86"},
|
||||
{"<FLAG_PART_KOREA_TRIGRAMS_LEFT>", "\x87"},
|
||||
{"<FLAG_PART_KOREA_TRIGRAMS_RIGHT>", "\x88"},
|
||||
{"<FLAG_PART_KOREA_CIRCLE_TOP>", "\x89"},
|
||||
{"<FLAG_PART_KOREA_CIRCLE_FILL>", "\x8a"},
|
||||
{"<FLAG_PART_TOP_BOTTOM_STRIPE>", "\x8b"},
|
||||
{"<FLAG_PART_UK_CROSS_LEFT>", "\x8c"},
|
||||
{"<FLAG_PART_UK_CROSS_RIGHT>", "\x8d"},
|
||||
{"<FLAG_PART_UK_FILL_LEFT>", "\x8e"},
|
||||
{"<FLAG_PART_UK_FILL_RIGHT>", "\x8f"},
|
||||
{"<FLAG_PART_USA_STRIPES_RIGHT>", "\x90"},
|
||||
{"<PAD_PART_STICK>", "\x91"},
|
||||
{"<PAD_PART_SELECT>", "\x92"},
|
||||
{"<PAD_PART_TRIGGER_BACK>", "\x93"},
|
||||
{"<PAD_PART_R1_NAME>", "\x94"},
|
||||
{"<PAD_PART_L1_NAME>", "\x95"},
|
||||
{"<PAD_PART_R2_NAME>", "\x96"},
|
||||
{"<PAD_PART_L2_NAME>", "\x97"},
|
||||
{"<PAD_PART_STICK_UP>", "\x98"},
|
||||
{"<PAD_PART_STICK_UP_RIGHT>", "\x99"},
|
||||
{"<FLAG_PART_USA_STRIPES_LEFT>", "\x9a"},
|
||||
{"<FLAG_PART_USA_STARS>", "\x9b"},
|
||||
{"<PAD_PART_STICK_DOWN>", "\x9c"},
|
||||
{"<PAD_PART_STICK_DOWN_LEFT>", "\x9d"},
|
||||
{"<PAD_PART_STICK_LEFT>", "\x9e"},
|
||||
{"<PAD_PART_STICK_UP_LEFT>", "\x9f"},
|
||||
{"<PAD_PART_DPAD_D>", "\xa0"},
|
||||
{"<PAD_PART_DPAD_L>", "\xa1"},
|
||||
{"<PAD_PART_DPAD_U>", "\xa2"},
|
||||
{"<PAD_PART_DPAD_R>", "\xa3"},
|
||||
{"<PAD_PART_STICK_RIGHT>", "\xa4"},
|
||||
{"<PAD_PART_STICK_DOWN_RIGHT>", "\xa5"},
|
||||
{"<PAD_PART_SHOULDER_TOP_LEFT>", "\xa6"},
|
||||
{"<PAD_PART_SHOULDER_TOP_RIGHT>", "\xa7"},
|
||||
{"<PAD_PART_TRIGGER_TOP_LEFT>", "\xa8"},
|
||||
{"<PAD_PART_TRIGGER_TOP_RIGHT>", "\xa9"},
|
||||
{"<PAD_PART_TRIGGER_SHIM1>", "\xaa"},
|
||||
{"<PAD_PART_TRIGGER_SHIM2>", "\xab"},
|
||||
{"<PAD_PART_SHOULDER_SHIM2>", "\xac"},
|
||||
|
||||
{"<PAD_PART_SHOULDER_BOTTOM_LEFT>", "\xb0"},
|
||||
{"<PAD_PART_SHOULDER_BOTTOM_RIGHT>", "\xb1"},
|
||||
{"<PAD_PART_TRIGGER_BOTTOM_LEFT>", "\xb2"},
|
||||
{"<PAD_PART_TRIGGER_BOTTOM_RIGHT>", "\xb3"},
|
||||
// {"入", "\x1\x00"}},
|
||||
// {"年", "\x1\x01"}},
|
||||
// punctuation
|
||||
{"・", "\x1\x10"},
|
||||
{"゛", "\x1\x11"},
|
||||
{"゜", "\x1\x12"},
|
||||
{"ー", "\x1\x13"},
|
||||
{"『", "\x1\x14"},
|
||||
{"』", "\x1\x15"},
|
||||
// hiragana
|
||||
{"ぁ", "\x1\x16"}, // -a
|
||||
{"あ", "\x1\x17"}, // a
|
||||
{"ぃ", "\x1\x18"}, // -i
|
||||
{"い", "\x1\x19"}, // i
|
||||
{"ぅ", "\x1\x1a"}, // -u
|
||||
{"う", "\x1\x1b"}, // u
|
||||
{"ぇ", "\x1\x1c"}, // -e
|
||||
{"え", "\x1\x1d"}, // e
|
||||
{"ぉ", "\x1\x1e"}, // -o
|
||||
{"お", "\x1\x1f"}, // o
|
||||
{"か", "\x1\x20"}, // ka
|
||||
{"き", "\x1\x21"}, // ki
|
||||
{"く", "\x1\x22"}, // ku
|
||||
{"け", "\x1\x23"}, // ke
|
||||
{"こ", "\x1\x24"}, // ko
|
||||
{"さ", "\x1\x25"}, // sa
|
||||
{"し", "\x1\x26"}, // shi
|
||||
{"す", "\x1\x27"}, // su
|
||||
{"せ", "\x1\x28"}, // se
|
||||
{"そ", "\x1\x29"}, // so
|
||||
{"た", "\x1\x2a"}, // ta
|
||||
{"ち", "\x1\x2b"}, // chi
|
||||
{"っ", "\x1\x2c"}, // sokuon
|
||||
{"つ", "\x1\x2d"}, // tsu
|
||||
{"て", "\x1\x2e"}, // te
|
||||
{"と", "\x1\x2f"}, // to
|
||||
{"な", "\x1\x30"}, // na
|
||||
{"に", "\x1\x31"}, // ni
|
||||
{"ぬ", "\x1\x32"}, // nu
|
||||
{"ね", "\x1\x33"}, // ne
|
||||
{"の", "\x1\x34"}, // no
|
||||
{"は", "\x1\x35"}, // ha
|
||||
{"ひ", "\x1\x36"}, // hi
|
||||
{"ふ", "\x1\x37"}, // fu
|
||||
{"へ", "\x1\x38"}, // he
|
||||
{"ほ", "\x1\x39"}, // ho
|
||||
{"ま", "\x1\x3a"}, // ma
|
||||
{"み", "\x1\x3b"}, // mi
|
||||
{"む", "\x1\x3c"}, // mu
|
||||
{"め", "\x1\x3d"}, // me
|
||||
{"も", "\x1\x3e"}, // mo
|
||||
{"ゃ", "\x1\x3f"}, // youon ya
|
||||
{"や", "\x1\x40"}, // ya
|
||||
{"ゅ", "\x1\x41"}, // youon yu
|
||||
{"ゆ", "\x1\x42"}, // yu
|
||||
{"ょ", "\x1\x43"}, // youon yo
|
||||
{"よ", "\x1\x44"}, // yo
|
||||
{"ら", "\x1\x45"}, // ra
|
||||
{"り", "\x1\x46"}, // ri
|
||||
{"る", "\x1\x47"}, // ru
|
||||
{"れ", "\x1\x48"}, // re
|
||||
{"ろ", "\x1\x49"}, // ro
|
||||
{"ゎ", "\x1\x4a"}, // -wa
|
||||
{"わ", "\x1\x4b"}, // wa
|
||||
{"を", "\x1\x4c"}, // wo
|
||||
{"ん", "\x1\x4d"}, // -n
|
||||
// katakana
|
||||
{"ァ", "\x1\x4e"}, // -a
|
||||
{"ア", "\x1\x4f"}, // a
|
||||
{"ィ", "\x1\x50"}, // -i
|
||||
{"イ", "\x1\x51"}, // i
|
||||
{"ゥ", "\x1\x52"}, // -u
|
||||
{"ウ", "\x1\x53"}, // u
|
||||
{"ェ", "\x1\x54"}, // -e
|
||||
{"エ", "\x1\x55"}, // e
|
||||
{"ォ", "\x1\x56"}, // -o
|
||||
{"オ", "\x1\x57"}, // o
|
||||
{"カ", "\x1\x58"}, // ka
|
||||
{"キ", "\x1\x59"}, // ki
|
||||
{"ク", "\x1\x5a"}, // ku
|
||||
{"ケ", "\x1\x5b"}, // ke
|
||||
{"コ", "\x1\x5c"}, // ko
|
||||
{"サ", "\x1\x5d"}, // sa
|
||||
{"シ", "\x1\x5e"}, // shi
|
||||
{"ス", "\x1\x5f"}, // su
|
||||
{"セ", "\x1\x60"}, // se
|
||||
{"ソ", "\x1\x61"}, // so
|
||||
{"タ", "\x1\x62"}, // ta
|
||||
{"チ", "\x1\x63"}, // chi
|
||||
{"ッ", "\x1\x64"}, // sokuon
|
||||
{"ツ", "\x1\x65"}, // tsu
|
||||
{"テ", "\x1\x66"}, // te
|
||||
{"ト", "\x1\x67"}, // to
|
||||
{"ナ", "\x1\x68"}, // na
|
||||
{"ニ", "\x1\x69"}, // ni
|
||||
{"ヌ", "\x1\x6a"}, // nu
|
||||
{"ネ", "\x1\x6b"}, // ne
|
||||
{"ノ", "\x1\x6c"}, // no
|
||||
{"ハ", "\x1\x6d"}, // ha
|
||||
{"ヒ", "\x1\x6e"}, // hi
|
||||
{"フ", "\x1\x6f"}, // fu
|
||||
{"ヘ", "\x1\x70"}, // he
|
||||
{"ホ", "\x1\x71"}, // ho
|
||||
{"マ", "\x1\x72"}, // ma
|
||||
{"ミ", "\x1\x73"}, // mi
|
||||
{"ム", "\x1\x74"}, // mu
|
||||
{"メ", "\x1\x75"}, // me
|
||||
{"モ", "\x1\x76"}, // mo
|
||||
{"ャ", "\x1\x77"}, // youon ya
|
||||
{"ヤ", "\x1\x78"}, // ya
|
||||
{"ュ", "\x1\x79"}, // youon yu
|
||||
{"ユ", "\x1\x7a"}, // yu
|
||||
{"ョ", "\x1\x7b"}, // youon yo
|
||||
{"ヨ", "\x1\x7c"}, // yo
|
||||
{"ラ", "\x1\x7d"}, // ra
|
||||
{"リ", "\x1\x7e"}, // ri
|
||||
{"ル", "\x1\x7f"}, // ru
|
||||
{"レ", "\x1\x80"}, // re
|
||||
{"ロ", "\x1\x81"}, // ro
|
||||
{"ヮ", "\x1\x82"}, // -wa
|
||||
{"ワ", "\x1\x83"}, // wa
|
||||
{"ヲ", "\x1\x84"}, // wo
|
||||
{"ン", "\x1\x85"}, // -n
|
||||
|
||||
{"位", "\x1\x8c"},
|
||||
{"遺", "\x1\x8d"},
|
||||
{"院", "\x1\x8e"},
|
||||
{"映", "\x1\x8f"},
|
||||
{"衛", "\x1\x90"},
|
||||
{"応", "\x1\x91"},
|
||||
{"下", "\x1\x92"},
|
||||
{"画", "\x1\x93"},
|
||||
{"解", "\x1\x94"},
|
||||
{"開", "\x1\x95"},
|
||||
{"外", "\x1\x96"},
|
||||
{"害", "\x1\x97"},
|
||||
{"蓋", "\x1\x98"},
|
||||
{"完", "\x1\x99"},
|
||||
{"換", "\x1\x9a"},
|
||||
{"監", "\x1\x9b"},
|
||||
{"間", "\x1\x9c"},
|
||||
{"器", "\x1\x9d"},
|
||||
{"記", "\x1\x9e"},
|
||||
{"逆", "\x1\x9f"},
|
||||
{"救", "\x1\xa0"},
|
||||
{"金", "\x1\xa1"},
|
||||
{"空", "\x1\xa2"},
|
||||
{"掘", "\x1\xa3"},
|
||||
{"警", "\x1\xa4"},
|
||||
{"迎", "\x1\xa5"},
|
||||
{"撃", "\x1\xa6"},
|
||||
{"建", "\x1\xa7"},
|
||||
{"源", "\x1\xa8"},
|
||||
{"現", "\x1\xa9"},
|
||||
{"言", "\x1\xaa"},
|
||||
{"限", "\x1\xab"},
|
||||
{"個", "\x1\xac"},
|
||||
{"庫", "\x1\xad"},
|
||||
{"後", "\x1\xae"},
|
||||
{"語", "\x1\xaf"},
|
||||
{"護", "\x1\xb0"},
|
||||
{"交", "\x1\xb1"},
|
||||
{"功", "\x1\xb2"},
|
||||
{"向", "\x1\xb3"},
|
||||
{"工", "\x1\xb4"},
|
||||
{"攻", "\x1\xb5"},
|
||||
{"溝", "\x1\xb6"},
|
||||
{"行", "\x1\xb7"},
|
||||
{"鉱", "\x1\xb8"},
|
||||
{"降", "\x1\xb9"},
|
||||
{"合", "\x1\xba"},
|
||||
{"告", "\x1\xbb"},
|
||||
{"獄", "\x1\xbc"},
|
||||
{"彩", "\x1\xbd"},
|
||||
{"作", "\x1\xbe"},
|
||||
{"山", "\x1\xbf"},
|
||||
{"使", "\x1\xc0"},
|
||||
{"始", "\x1\xc1"},
|
||||
{"試", "\x1\xc2"},
|
||||
{"字", "\x1\xc3"},
|
||||
{"寺", "\x1\xc4"},
|
||||
{"時", "\x1\xc5"},
|
||||
{"示", "\x1\xc6"},
|
||||
{"自", "\x1\xc7"},
|
||||
{"式", "\x1\xc8"},
|
||||
{"矢", "\x1\xc9"},
|
||||
{"射", "\x1\xca"},
|
||||
{"者", "\x1\xcb"},
|
||||
{"守", "\x1\xcc"},
|
||||
{"手", "\x1\xcd"},
|
||||
{"終", "\x1\xce"},
|
||||
{"週", "\x1\xcf"},
|
||||
{"出", "\x1\xd0"},
|
||||
{"所", "\x1\xd1"},
|
||||
{"書", "\x1\xd2"},
|
||||
{"勝", "\x1\xd3"},
|
||||
{"章", "\x1\xd4"},
|
||||
{"上", "\x1\xd5"},
|
||||
{"乗", "\x1\xd6"},
|
||||
{"場", "\x1\xd7"},
|
||||
{"森", "\x1\xd8"},
|
||||
{"進", "\x1\xd9"},
|
||||
{"人", "\x1\xda"},
|
||||
{"水", "\x1\xdb"},
|
||||
{"数", "\x1\xdc"},
|
||||
{"制", "\x1\xdd"},
|
||||
{"性", "\x1\xde"},
|
||||
{"成", "\x1\xdf"},
|
||||
{"聖", "\x1\xe0"},
|
||||
{"石", "\x1\xe1"},
|
||||
{"跡", "\x1\xe2"},
|
||||
{"先", "\x1\xe3"},
|
||||
{"戦", "\x1\xe4"},
|
||||
{"船", "\x1\xe5"},
|
||||
{"選", "\x1\xe6"},
|
||||
{"走", "\x1\xe7"},
|
||||
{"送", "\x1\xe8"},
|
||||
{"像", "\x1\xe9"},
|
||||
{"造", "\x1\xea"},
|
||||
{"続", "\x1\xeb"},
|
||||
{"対", "\x1\xec"},
|
||||
{"袋", "\x1\xed"},
|
||||
{"台", "\x1\xee"},
|
||||
{"弾", "\x1\xef"},
|
||||
{"地", "\x1\xf0"},
|
||||
{"中", "\x1\xf1"},
|
||||
{"敵", "\x1\xf2"},
|
||||
{"転", "\x1\xf3"},
|
||||
{"電", "\x1\xf4"},
|
||||
{"塔", "\x1\xf5"},
|
||||
{"頭", "\x1\xf6"},
|
||||
{"動", "\x1\xf7"},
|
||||
{"内", "\x1\xf8"},
|
||||
{"日", "\x1\xf9"},
|
||||
{"入", "\x1\xfa"},
|
||||
{"年", "\x1\xfb"},
|
||||
{"能", "\x1\xfc"},
|
||||
{"廃", "\x1\xfd"},
|
||||
{"排", "\x1\xfe"},
|
||||
{"敗", "\x1\xff"},
|
||||
|
||||
{"発", "\x2\x10"},
|
||||
{"反", "\x2\x11"},
|
||||
{"必", "\x2\x12"},
|
||||
{"表", "\x2\x13"},
|
||||
{"武", "\x2\x14"},
|
||||
{"壁", "\x2\x15"},
|
||||
{"墓", "\x2\x16"},
|
||||
{"放", "\x2\x17"},
|
||||
{"方", "\x2\x18"},
|
||||
{"砲", "\x2\x19"},
|
||||
{"妨", "\x2\x1a"},
|
||||
{"北", "\x2\x1b"},
|
||||
{"本", "\x2\x1c"},
|
||||
{"幕", "\x2\x1d"},
|
||||
{"無", "\x2\x1e"},
|
||||
{"迷", "\x2\x1f"},
|
||||
{"面", "\x2\x20"},
|
||||
{"戻", "\x2\x21"},
|
||||
{"紋", "\x2\x22"},
|
||||
{"薬", "\x2\x23"},
|
||||
{"輸", "\x2\x24"},
|
||||
{"勇", "\x2\x25"},
|
||||
{"友", "\x2\x26"},
|
||||
{"遊", "\x2\x27"},
|
||||
{"容", "\x2\x28"},
|
||||
{"要", "\x2\x29"},
|
||||
{"利", "\x2\x2a"},
|
||||
{"了", "\x2\x2b"},
|
||||
{"量", "\x2\x2c"},
|
||||
{"力", "\x2\x2d"},
|
||||
{"練", "\x2\x2e"},
|
||||
{"連", "\x2\x2f"},
|
||||
{"録", "\x2\x30"},
|
||||
{"話", "\x2\x31"},
|
||||
{"墟", "\x2\x32"},
|
||||
{"脱", "\x2\x33"},
|
||||
// {"成", "\x2\x34"},
|
||||
{"旗", "\x2\x35"},
|
||||
{"破", "\x2\x36"},
|
||||
{"壊", "\x2\x37"},
|
||||
{"全", "\x2\x38"},
|
||||
{"滅", "\x2\x39"},
|
||||
{"機", "\x2\x3a"},
|
||||
{"仲", "\x2\x3b"},
|
||||
{"渓", "\x2\x3c"},
|
||||
{"谷", "\x2\x3d"},
|
||||
{"優", "\x2\x3e"},
|
||||
{"探", "\x2\x3f"},
|
||||
{"部", "\x2\x40"},
|
||||
{"索", "\x2\x41"},
|
||||
// {"乗", "\x2\x42"},
|
||||
{"前", "\x2\x43"},
|
||||
{"右", "\x2\x44"},
|
||||
{"左", "\x2\x45"},
|
||||
{"会", "\x2\x46"},
|
||||
{"高", "\x2\x47"},
|
||||
{"低", "\x2\x48"},
|
||||
{"押", "\x2\x49"},
|
||||
{"切", "\x2\x4a"},
|
||||
{"替", "\x2\x4b"},
|
||||
// {"対", "\x2\x4c"},
|
||||
{"秒", "\x2\x4d"},
|
||||
{"箱", "\x2\x4e"},
|
||||
{"泳", "\x2\x4f"},
|
||||
{"~", "\x2\x50"},
|
||||
|
||||
{"闇", "\x2\x56"},
|
||||
{"以", "\x2\x57"},
|
||||
{"屋", "\x2\x58"},
|
||||
{"俺", "\x2\x59"},
|
||||
{"化", "\x2\x5a"},
|
||||
{"界", "\x2\x5b"},
|
||||
{"感", "\x2\x5c"},
|
||||
{"気", "\x2\x5d"},
|
||||
{"却", "\x2\x5e"},
|
||||
{"曲", "\x2\x5f"},
|
||||
{"継", "\x2\x60"},
|
||||
{"権", "\x2\x61"},
|
||||
{"見", "\x2\x62"},
|
||||
{"古", "\x2\x63"},
|
||||
{"好", "\x2\x64"},
|
||||
// {"高", "\x2\x65"},
|
||||
{"才", "\x2\x66"},
|
||||
{"士", "\x2\x67"},
|
||||
{"子", "\x2\x68"},
|
||||
{"次", "\x2\x69"},
|
||||
{"主", "\x2\x6a"},
|
||||
{"種", "\x2\x6b"},
|
||||
{"讐", "\x2\x6c"},
|
||||
{"女", "\x2\x6d"},
|
||||
{"小", "\x2\x6e"},
|
||||
{"焼", "\x2\x6f"},
|
||||
{"証", "\x2\x70"},
|
||||
{"神", "\x2\x71"},
|
||||
{"身", "\x2\x72"},
|
||||
{"寸", "\x2\x73"},
|
||||
{"世", "\x2\x74"},
|
||||
{"想", "\x2\x75"},
|
||||
{"退", "\x2\x76"},
|
||||
{"第", "\x2\x77"},
|
||||
{"着", "\x2\x78"},
|
||||
{"天", "\x2\x79"},
|
||||
{"倒", "\x2\x7a"},
|
||||
{"到", "\x2\x7b"},
|
||||
{"突", "\x2\x7c"},
|
||||
{"爆", "\x2\x7d"},
|
||||
{"番", "\x2\x7e"},
|
||||
{"負", "\x2\x7f"},
|
||||
{"復", "\x2\x80"},
|
||||
{"物", "\x2\x81"},
|
||||
{"眠", "\x2\x82"},
|
||||
{"予", "\x2\x83"},
|
||||
{"用", "\x2\x84"},
|
||||
{"落", "\x2\x85"},
|
||||
{"緑", "\x2\x86"},
|
||||
|
||||
{"封", "\x2\x88"},
|
||||
{"印", "\x2\x89"},
|
||||
{"扉", "\x2\x8a"},
|
||||
{"最", "\x2\x8b"},
|
||||
{"刻", "\x2\x8c"},
|
||||
{"足", "\x2\x8d"},
|
||||
};
|
||||
|
||||
GameTextFontBank g_font_bank_jakx(GameTextVersion::JAKX,
|
||||
&encode_info_jakx,
|
||||
&replace_info_jakx,
|
||||
&passthrus_jakx);
|
||||
@@ -0,0 +1,14 @@
|
||||
#pragma once
|
||||
|
||||
#include "common/util/font/font_utils.h"
|
||||
|
||||
/*!
|
||||
* ================================
|
||||
* GAME TEXT FONT BANK - JAK X
|
||||
* ================================
|
||||
* This font is used in:
|
||||
* - Jak X
|
||||
*/
|
||||
// TODO cyrillic
|
||||
// TODO - current just using the jak 3 stuff (hopefully it's identical?)
|
||||
extern GameTextFontBank g_font_bank_jak3;
|
||||
@@ -12,6 +12,8 @@ GameVersion game_name_to_version(const std::string& name) {
|
||||
return GameVersion::Jak2;
|
||||
} else if (name == "jak3") {
|
||||
return GameVersion::Jak3;
|
||||
} else if (name == "jakx") {
|
||||
return GameVersion::JakX;
|
||||
} else {
|
||||
ASSERT_MSG(false, fmt::format("invalid game name: {}", name));
|
||||
}
|
||||
@@ -29,6 +31,8 @@ std::string version_to_game_name(GameVersion v) {
|
||||
return "jak2";
|
||||
case GameVersion::Jak3:
|
||||
return "jak3";
|
||||
case GameVersion::JakX:
|
||||
return "jakx";
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("no game_name for version: {} found", fmt::underlying(v)));
|
||||
}
|
||||
@@ -42,6 +46,8 @@ std::string version_to_game_name_external(GameVersion v) {
|
||||
return "Jak 2";
|
||||
case GameVersion::Jak3:
|
||||
return "Jak 3";
|
||||
case GameVersion::JakX:
|
||||
return "Jak X";
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("no game_name for version: {} found", fmt::underlying(v)));
|
||||
}
|
||||
@@ -49,7 +55,7 @@ std::string version_to_game_name_external(GameVersion v) {
|
||||
|
||||
std::vector<std::string> valid_game_version_names() {
|
||||
return {game_version_names[GameVersion::Jak1], game_version_names[GameVersion::Jak2],
|
||||
game_version_names[GameVersion::Jak3]};
|
||||
game_version_names[GameVersion::Jak3], game_version_names[GameVersion::JakX]};
|
||||
}
|
||||
|
||||
std::string build_revision() {
|
||||
|
||||
@@ -38,6 +38,13 @@ constexpr u32 DGO_FILE_VERSION = 1;
|
||||
constexpr u32 TX_PAGE_VERSION = 8;
|
||||
} // namespace jak3
|
||||
|
||||
namespace jakx {
|
||||
constexpr u32 ART_FILE_VERSION = 8;
|
||||
constexpr u32 LEVEL_FILE_VERSION = 36;
|
||||
constexpr u32 DGO_FILE_VERSION = 1;
|
||||
constexpr u32 TX_PAGE_VERSION = 8;
|
||||
} // namespace jakx
|
||||
|
||||
} // namespace versions
|
||||
|
||||
// GOAL kernel version (OpenGOAL changes this version from the game's version)
|
||||
@@ -48,17 +55,17 @@ constexpr int KERNEL_VERSION_MINOR = 0;
|
||||
constexpr int IRX_VERSION_MAJOR = 2;
|
||||
constexpr int IRX_VERSION_MINOR = 0;
|
||||
|
||||
enum class GameVersion { Jak1 = 1, Jak2 = 2, Jak3 = 3 };
|
||||
enum class GameVersion { Jak1 = 1, Jak2 = 2, Jak3 = 3, JakX = 4 };
|
||||
|
||||
// TODO: most usages of this are currently stubs for jak 3
|
||||
template <typename T>
|
||||
struct PerGameVersion {
|
||||
constexpr PerGameVersion(T jak1, T jak2, T jak3) : data{jak1, jak2, jak3} {}
|
||||
constexpr PerGameVersion(T jak1, T jak2, T jak3, T jakx) : data{jak1, jak2, jak3, jakx} {}
|
||||
constexpr const T& operator[](GameVersion v) const { return data[(int)v - 1]; }
|
||||
T data[3];
|
||||
T data[4];
|
||||
};
|
||||
|
||||
constexpr PerGameVersion<const char*> game_version_names = {"jak1", "jak2", "jak3"};
|
||||
constexpr PerGameVersion<const char*> game_version_names = {"jak1", "jak2", "jak3", "jakx"};
|
||||
|
||||
GameVersion game_name_to_version(const std::string& name);
|
||||
bool valid_game_version(const std::string& name);
|
||||
|
||||
@@ -3276,6 +3276,7 @@ goos::Object DefskelgroupElement::to_form_internal(const Env& env) const {
|
||||
}
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
if (m_static_info.version != 8) {
|
||||
forms.push_back(pretty_print::to_symbol(fmt::format(":version {}", m_static_info.version)));
|
||||
}
|
||||
|
||||
@@ -1827,6 +1827,8 @@ class DefpartElement : public FormElement {
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
return field_id == 72;
|
||||
case GameVersion::JakX:
|
||||
return field_id == 71;
|
||||
default:
|
||||
ASSERT_MSG(false, fmt::format("unknown version for is_sp_end"));
|
||||
return false;
|
||||
|
||||
@@ -750,6 +750,8 @@ std::string ObjectFileDB::process_tpages(TextureDB& tex_db,
|
||||
case GameVersion::Jak3:
|
||||
animated_slots = jak3_animated_texture_slots();
|
||||
break;
|
||||
case GameVersion::JakX:
|
||||
break;
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
@@ -857,10 +859,9 @@ std::string ObjectFileDB::process_all_spool_subtitles(const Config& cfg,
|
||||
}
|
||||
}
|
||||
|
||||
std::string ObjectFileDB::process_game_text_files(const Config& cfg) {
|
||||
std::string ObjectFileDB::process_game_text_files(const Config& cfg, std::string text_string) {
|
||||
try {
|
||||
lg::info("- Finding game text...");
|
||||
std::string text_string = "COMMON";
|
||||
Timer timer;
|
||||
int file_count = 0;
|
||||
int string_count = 0;
|
||||
@@ -868,7 +869,7 @@ std::string ObjectFileDB::process_game_text_files(const Config& cfg) {
|
||||
std::unordered_map<int, std::unordered_map<int, std::string>> text_by_language_by_id;
|
||||
|
||||
for_each_obj([&](ObjectFileData& data) {
|
||||
if (data.name_in_dgo.substr(1) == text_string) {
|
||||
if (data.name_in_dgo.ends_with(text_string)) {
|
||||
file_count++;
|
||||
auto statistics = process_game_text(data, cfg.text_version);
|
||||
string_count += statistics.total_text;
|
||||
@@ -924,7 +925,7 @@ void get_joint_info(ObjectFileDB& db, ObjectFileData& obj, JointGeo jg) {
|
||||
const auto& words = obj.linked_data.words_by_seg.at(MAIN_SEGMENT);
|
||||
for (size_t i = 0; i < jg.length; ++i) {
|
||||
u32 label = 0x0;
|
||||
if (db.version() == GameVersion::Jak3) {
|
||||
if (db.version() == GameVersion::Jak3 || db.version() == GameVersion::JakX) {
|
||||
label = words.at((jg.offset / 4) + 11 + i).label_id();
|
||||
} else {
|
||||
label = words.at((jg.offset / 4) + 7 + i).label_id();
|
||||
|
||||
@@ -272,7 +272,7 @@ class ObjectFileDB {
|
||||
const Config& cfg,
|
||||
const fs::path& dump_out);
|
||||
std::string process_game_count_file();
|
||||
std::string process_game_text_files(const Config& cfg);
|
||||
std::string process_game_text_files(const Config& cfg, std::string text_string = "COMMON");
|
||||
std::string process_all_spool_subtitles(const Config& cfg, const fs::path& image_out);
|
||||
|
||||
const ObjectFileData& lookup_record(const ObjectFileRecord& rec) const;
|
||||
|
||||
@@ -1855,6 +1855,7 @@ std::unique_ptr<AtomicOp> convert_5(const Instruction& i0,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
process_offset = 48;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -1430,7 +1430,7 @@ Form* try_sc_as_type_of_jak2(FormPool& pool, Function& f, const ShortCircuit* vt
|
||||
f.ir2.env.disable_def(b2_delay_op.dst(), f.warnings);
|
||||
f.ir2.env.disable_use(shift_left->expr().get_arg(0).var());
|
||||
|
||||
if (f.ir2.env.version != GameVersion::Jak3) {
|
||||
if (f.ir2.env.version != GameVersion::Jak3 && f.ir2.env.version != GameVersion::JakX) {
|
||||
f.warnings.warning("Using new Jak 2 rtype-of");
|
||||
}
|
||||
return b0_ptr;
|
||||
@@ -1574,6 +1574,7 @@ Form* try_sc_as_type_of(FormPool& pool, Function& f, const ShortCircuit* vtx, Ga
|
||||
return try_sc_as_type_of_jak1(pool, f, vtx);
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
return try_sc_as_type_of_jak2(pool, f, vtx);
|
||||
default:
|
||||
ASSERT(false);
|
||||
|
||||
@@ -25,6 +25,8 @@ void read_static_group_data(DecompiledDataElement* src,
|
||||
DefpartgroupElement::StaticInfo& group) {
|
||||
auto lab = src->label();
|
||||
// looks like:
|
||||
|
||||
// Jak 3
|
||||
/*
|
||||
.type sparticle-launch-group
|
||||
L81:
|
||||
@@ -42,6 +44,27 @@ L81:
|
||||
L82:
|
||||
*/
|
||||
|
||||
// Jak X
|
||||
/*
|
||||
.type sparticle-launch-group
|
||||
L23:
|
||||
.word 0x5dc0006
|
||||
.word 0x2105dc
|
||||
.word L25
|
||||
.word L24
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x3f800000
|
||||
.word 0x3f800000
|
||||
.word 0x3f800000
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x47700000
|
||||
*/
|
||||
|
||||
int word_idx = (lab.offset / 4) - 1;
|
||||
auto& words = env.file->words_by_seg.at(lab.target_segment);
|
||||
|
||||
@@ -125,6 +148,8 @@ void read_static_part_data(DecompiledDataElement* src,
|
||||
DefpartElement::StaticInfo& part) {
|
||||
auto lab = src->label();
|
||||
// looks like:
|
||||
|
||||
// Jak 3
|
||||
/*
|
||||
.type sparticle-launcher
|
||||
L79:
|
||||
@@ -142,6 +167,24 @@ L80:
|
||||
.word 0x3f800000
|
||||
*/
|
||||
|
||||
// Jak X
|
||||
/*
|
||||
.type sparticle-launcher
|
||||
L11:
|
||||
.word 0x0
|
||||
.word L12
|
||||
.word 0x0
|
||||
L12:
|
||||
.word 0x1
|
||||
.word 0x401000
|
||||
.word 0x0
|
||||
.word 0x0
|
||||
.word 0x10006
|
||||
.word 0x41200000
|
||||
.word 0x0
|
||||
.word 0x3f800000
|
||||
*/
|
||||
|
||||
int start_word_idx = (lab.offset / 4) - 1;
|
||||
auto& words = env.file->words_by_seg.at(lab.target_segment);
|
||||
|
||||
@@ -151,14 +194,17 @@ L80:
|
||||
env.func->warnings.error_and_throw("Reference to sparticle-launcher bad: invalid type pointer");
|
||||
}
|
||||
|
||||
auto empty2_idx = start_word_idx + (env.version != GameVersion::JakX ? 2 : 3);
|
||||
auto array_word_idx = start_word_idx + (env.version != GameVersion::JakX ? 3 : 2);
|
||||
|
||||
auto& empty1 = words.at(start_word_idx + 1);
|
||||
auto& empty2 = words.at(start_word_idx + 2);
|
||||
auto& empty2 = words.at(empty2_idx);
|
||||
if (empty1.kind() != LinkedWord::PLAIN_DATA || empty1.data != 0 ||
|
||||
empty2.kind() != LinkedWord::PLAIN_DATA || empty2.data != 0) {
|
||||
env.func->warnings.error_and_throw("Reference to sparticle-launcher bad: accums not empty");
|
||||
}
|
||||
|
||||
auto& array_word = words.at(start_word_idx + 3);
|
||||
auto& array_word = words.at(array_word_idx);
|
||||
if (array_word.kind() != LinkedWord::PTR) {
|
||||
env.func->warnings.error_and_throw("Reference to sparticle-launcher bad: invalid array label");
|
||||
}
|
||||
|
||||
@@ -450,14 +450,15 @@ FormElement* rewrite_defskelgroup(LetElement* elt,
|
||||
// (set! *hopper-sg* v1-1)
|
||||
ASSERT(elt->body()->size() > 0);
|
||||
|
||||
int last_lod = env.version == GameVersion::Jak3 ? (elt->body()->size() - 4) / 2 - 1
|
||||
: (elt->body()->size() - 3) / 2 - 1;
|
||||
int last_lod = env.version == GameVersion::Jak3 || env.version == GameVersion::JakX
|
||||
? (elt->body()->size() - 4) / 2 - 1
|
||||
: (elt->body()->size() - 3) / 2 - 1;
|
||||
if (last_lod > skelgroup_info.max_lod) {
|
||||
env.func->warnings.error_and_throw("defskelgroup exceeds max-lod of {} ({})",
|
||||
skelgroup_info.max_lod, last_lod);
|
||||
}
|
||||
|
||||
auto rest_info = env.version == GameVersion::Jak3
|
||||
auto rest_info = env.version == GameVersion::Jak3 || env.version == GameVersion::JakX
|
||||
? get_defskelgroup_entries_jak3(elt->body(), env, elt->entries().at(0).dest)
|
||||
: get_defskelgroup_entries(elt->body(), env, elt->entries().at(0).dest);
|
||||
|
||||
@@ -630,6 +631,7 @@ void run_defskelgroups(Function& top_level_func) {
|
||||
sg = inspect_skel_group_data_jak2(src_as_label, env);
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
sg = inspect_skel_group_data_jak3(src_as_label, env);
|
||||
inspect_cloth_data_jak3(as_let, sg, env);
|
||||
break;
|
||||
|
||||
@@ -350,6 +350,7 @@ FormElement* rewrite_as_send_event(LetElement* in,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
// in jak 2, the event message block holds a ppointer instead.
|
||||
set_from_matcher = Matcher::set(
|
||||
Matcher::deref(Matcher::reg(block_var_reg), false, {DerefTokenMatcher::string("from")}),
|
||||
@@ -370,6 +371,7 @@ FormElement* rewrite_as_send_event(LetElement* in,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
set_from_form_matcher = Matcher::set(
|
||||
Matcher::deref(Matcher::any_reg(0), false, {DerefTokenMatcher::string("from")}),
|
||||
Matcher::op_fixed(FixedOperatorKind::PROCESS_TO_PPOINTER, {Matcher::any(1)}));
|
||||
@@ -1913,7 +1915,7 @@ FormElement* rewrite_proc_new(LetElement* in, const Env& env, FormPool& pool) {
|
||||
auto ra = in->entries().at(0).dest;
|
||||
std::vector<Matcher> get_process_args = {Matcher::any(0), Matcher::any_symbol(1),
|
||||
Matcher::any(2)};
|
||||
if (env.version >= GameVersion::Jak3) {
|
||||
if (env.version == GameVersion::Jak3 || env.version == GameVersion::JakX) {
|
||||
// this flag appears unused...
|
||||
get_process_args.push_back(Matcher::any_integer(3));
|
||||
}
|
||||
@@ -1924,8 +1926,8 @@ FormElement* rewrite_proc_new(LetElement* in, const Env& env, FormPool& pool) {
|
||||
|
||||
const auto& proc_type = mr_get_proc.maps.strings.at(1);
|
||||
|
||||
// part-tracker-spawn macro for jak 3
|
||||
if (env.version >= GameVersion::Jak3 &&
|
||||
// part-tracker-spawn macro for jak 3 / jak x
|
||||
if ((env.version == GameVersion::Jak3 || env.version == GameVersion::JakX) &&
|
||||
(proc_type == "part-tracker" || proc_type == "part-tracker-subsampler")) {
|
||||
auto form = rewrite_part_tracker_new_jak3(proc_type, in, env, pool);
|
||||
if (form) {
|
||||
@@ -2045,6 +2047,7 @@ FormElement* rewrite_proc_new(LetElement* in, const Env& env, FormPool& pool) {
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
expected_name = fmt::format("(symbol->string (-> {} symbol))", proc_type);
|
||||
break;
|
||||
default:
|
||||
@@ -2073,7 +2076,7 @@ FormElement* rewrite_proc_new(LetElement* in, const Env& env, FormPool& pool) {
|
||||
if (!mr_get_proc.maps.forms.at(2)->to_form(env).is_int(0x4000)) {
|
||||
ja_push_form_to_args(pool, args, mr_get_proc.maps.forms.at(2), "stack-size");
|
||||
}
|
||||
if (env.version >= GameVersion::Jak3) {
|
||||
if (env.version == GameVersion::Jak3 || env.version == GameVersion::JakX) {
|
||||
if (mr_get_proc.maps.ints.at(3) != 1) {
|
||||
// TODO better name
|
||||
args.push_back(pool.form<ConstantTokenElement>(":unk"));
|
||||
@@ -2195,7 +2198,7 @@ FormElement* rewrite_attack_info(LetElement* in, const Env& env, FormPool& pool)
|
||||
if (env.version == GameVersion::Jak2) {
|
||||
possible_args = possible_args_jak2;
|
||||
}
|
||||
if (env.version == GameVersion::Jak3) {
|
||||
if (env.version == GameVersion::Jak3 || env.version == GameVersion::JakX) {
|
||||
possible_args = possible_args_jak3;
|
||||
}
|
||||
|
||||
@@ -2742,7 +2745,8 @@ FormElement* rewrite_with_dma_buf_add_bucket(LetElement* in, const Env& env, For
|
||||
|
||||
// New for Jak 3: they check to see if nothing was added, and skip adding an empty DMA transfer
|
||||
// if so. This means the usual 2 ending let body forms are now wrapped in a `when`.
|
||||
const int expected_last_let_body_size = env.version == GameVersion::Jak3 ? 1 : 2;
|
||||
const int expected_last_let_body_size =
|
||||
env.version == GameVersion::Jak3 || env.version == GameVersion::JakX ? 1 : 2;
|
||||
if (last_part->entries().size() != 1 ||
|
||||
last_part->body()->size() != expected_last_let_body_size) {
|
||||
return nullptr;
|
||||
@@ -2752,7 +2756,7 @@ FormElement* rewrite_with_dma_buf_add_bucket(LetElement* in, const Env& env, For
|
||||
LetElement* dmatag_let;
|
||||
FormElement* insert_tag_call;
|
||||
|
||||
if (env.version == GameVersion::Jak3) {
|
||||
if (env.version == GameVersion::Jak3 || env.version == GameVersion::JakX) {
|
||||
// check for the when:
|
||||
auto outer_when = dynamic_cast<CondNoElseElement*>(last_part->body()->at(0));
|
||||
if (!outer_when) {
|
||||
|
||||
@@ -236,6 +236,7 @@ struct Mips2C_Output {
|
||||
fmt::format(" cache.{} = intern_from_c(\"{}\").c();\n", goal_to_c_name(sym), sym);
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
result += fmt::format(" cache.{} = intern_from_c(-1, 0, \"{}\").c();\n",
|
||||
goal_to_c_name(sym), sym);
|
||||
break;
|
||||
|
||||
@@ -38,7 +38,7 @@ nlohmann::json read_json_file_from_config(const nlohmann::json& json, const std:
|
||||
Config make_config_via_json(nlohmann::json& json) {
|
||||
Config config;
|
||||
int version_int = json.at("game_version").get<int>();
|
||||
ASSERT(version_int == 1 || version_int == 2 || version_int == 3);
|
||||
ASSERT(version_int == 1 || version_int == 2 || version_int == 3 || version_int == 4);
|
||||
config.game_version = (GameVersion)version_int;
|
||||
config.text_version = json.at("text_version").get<GameTextVersion>();
|
||||
config.game_name = json.at("game_name").get<std::string>();
|
||||
|
||||
@@ -11298,9 +11298,7 @@
|
||||
[[844, 847], "a0", "dma-gif-packet"],
|
||||
[[921, 924], "v1", "dma-gif-packet"]
|
||||
],
|
||||
"(method 9 blit-displays-work)": [
|
||||
[[2, 36], "v1", "(inline-array vector4w)"]
|
||||
],
|
||||
"(method 9 blit-displays-work)": [[[2, 36], "v1", "(inline-array vector4w)"]],
|
||||
"(method 10 blit-displays-work)": [
|
||||
[[2, 141], "v1", "(inline-array vector4w)"]
|
||||
],
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,156 @@
|
||||
{
|
||||
"game_version": 4,
|
||||
"text_version": 40,
|
||||
|
||||
"game_name": "jakx",
|
||||
"expected_elf_name": "SCUS_974.29",
|
||||
|
||||
// if you want to filter to only some object names.
|
||||
// it will make the decompiler much faster.
|
||||
"allowed_objects": [],
|
||||
|
||||
"banned_objects": [],
|
||||
|
||||
////////////////////////////
|
||||
// CODE ANALYSIS OPTIONS
|
||||
////////////////////////////
|
||||
|
||||
// set to true to generate plain .asm files with MIPS disassembly, with no fancy decompilation.
|
||||
// this is fast and should succeed 100% of the time.
|
||||
"disassemble_code": false,
|
||||
|
||||
// Run the decompiler
|
||||
"decompile_code": true,
|
||||
|
||||
"find_functions": true,
|
||||
|
||||
////////////////////////////
|
||||
// DATA ANALYSIS OPTIONS
|
||||
////////////////////////////
|
||||
|
||||
// set to true to generate plain .asm files for data files.
|
||||
// this will display most data as hex, but will add labels/references/type pointers/strings
|
||||
// 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,
|
||||
// write goal imports for tpages and textures
|
||||
"write_tpage_imports": false,
|
||||
// unpack game text to assets folder
|
||||
"process_game_text": false,
|
||||
// unpack game count to assets folder
|
||||
"process_game_count": false,
|
||||
// write goal imports for art groups
|
||||
"process_art_groups": false,
|
||||
// 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
|
||||
"dump_joint_geo_info": false,
|
||||
// write out a json file containing tpage and texture mappings, run with all objects allowed
|
||||
"dump_tex_info": false,
|
||||
|
||||
// set to false to skip adding .STR files to the decompiler database
|
||||
"read_spools": true,
|
||||
// write out spool subtitle text, implies read_spools
|
||||
"process_subtitle_text": false,
|
||||
// write out spool subtitle images, implies read_spools
|
||||
"process_subtitle_images": false,
|
||||
|
||||
///////////////////////////
|
||||
// WEIRD OPTIONS
|
||||
///////////////////////////
|
||||
|
||||
// these options are used rarely and should usually be left at false
|
||||
|
||||
// generate the symbol_map.json file.
|
||||
// this is a guess at where each symbol is first defined/used.
|
||||
"generate_symbol_definition_map": false,
|
||||
|
||||
// generate the all-types file
|
||||
"generate_all_types": false,
|
||||
|
||||
// debug option for instruction decoder
|
||||
"write_hex_near_instructions": false,
|
||||
|
||||
// to write out "scripts", which are currently just all the linked lists found. mostly a jak 2/3 thing
|
||||
"write_scripts": true,
|
||||
|
||||
// hex dump of code/data files.
|
||||
"hexdump_code": false,
|
||||
"hexdump_data": false,
|
||||
// dump raw obj files
|
||||
"dump_objs": true,
|
||||
// print control flow graph
|
||||
"print_cfgs": false,
|
||||
|
||||
// set to true for PAL versions. this will forcefully skip files that have some data missing at the end.
|
||||
"is_pal": false,
|
||||
|
||||
"old_all_types_file": "decompiler/config/jak3/all-types.gc",
|
||||
|
||||
////////////////////////////
|
||||
// CONFIG FILES
|
||||
////////////////////////////
|
||||
|
||||
"type_casts_file": "decompiler/config/jakx/ntsc_v1/type_casts.jsonc",
|
||||
"anonymous_function_types_file": "decompiler/config/jakx/ntsc_v1/anonymous_function_types.jsonc",
|
||||
"var_names_file": "decompiler/config/jakx/ntsc_v1/var_names.jsonc",
|
||||
"label_types_file": "decompiler/config/jakx/ntsc_v1/label_types.jsonc",
|
||||
"stack_structures_file": "decompiler/config/jakx/ntsc_v1/stack_structures.jsonc",
|
||||
"hacks_file": "decompiler/config/jakx/ntsc_v1/hacks.jsonc",
|
||||
"inputs_file": "decompiler/config/jakx/ntsc_v1/inputs.jsonc",
|
||||
"art_info_file": "decompiler/config/jakx/ntsc_v1/art_info.jsonc",
|
||||
"import_deps_file": "decompiler/config/jakx/ntsc_v1/import_deps.jsonc",
|
||||
"all_types_file": "decompiler/config/ntsc_v1/all-types.gc",
|
||||
"art_group_dump_file": "decompiler/config/ntsc_v1/art-group-info.min.json",
|
||||
"joint_node_dump_file": "decompiler/config/ntsc_v1/joint-node-info.min.json",
|
||||
"tex_dump_file": "decompiler/config/ntsc_v1/tex-info.min.json",
|
||||
"process_stack_size_file": "decompiler/config/ntsc_v1/process_stack_size_overrides.jsonc",
|
||||
|
||||
// optional: a predetermined object file name map from a file.
|
||||
// this will make decompilation naming consistent even if you only run on some objects.
|
||||
"obj_file_name_map_file": "goal_src/jakx/build/all_objs.json",
|
||||
|
||||
////////////////////////////
|
||||
// LEVEL EXTRACTION
|
||||
////////////////////////////
|
||||
|
||||
// turn this on to extract level background graphics data as .fr3 files in out/<game>/fr3
|
||||
"levels_extract": false,
|
||||
// turn this on if you want extracted levels to be saved out as .glb files in glb_out/<game>
|
||||
"rip_levels": false,
|
||||
// should we also extract collision meshes to the .fr3 files?
|
||||
// these can be displayed in-game with the OpenGOAL collision renderer
|
||||
"extract_collision": true,
|
||||
// turn this on if you want extracted level collision to be saved as .obj files in debug_out/<game>
|
||||
"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
|
||||
"rip_streamed_audio": false,
|
||||
|
||||
////////////////////////////
|
||||
// PATCHING OPTIONS
|
||||
////////////////////////////
|
||||
|
||||
// these are options related to xdelta3 patches on specific objects
|
||||
// this allows us to get a more consistent input
|
||||
|
||||
// set to true to write new patch files
|
||||
"write_patches": false,
|
||||
// set to true to apply patch files
|
||||
"apply_patches": true,
|
||||
// what to patch an object to and what the patch file is
|
||||
"object_patches": {},
|
||||
"version_overrides": {
|
||||
"ntsc_v1": {},
|
||||
"pal": {
|
||||
"game_name": "jakx_pal",
|
||||
"expected_elf_name": "SCES_532.86",
|
||||
"is_pal": true,
|
||||
"object_patches": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
// "gkernel": [
|
||||
// [17, "(function process symbol)"]
|
||||
// ]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,55 @@
|
||||
{
|
||||
//////////////////////
|
||||
// ART INFO
|
||||
//////////////////////
|
||||
|
||||
// defines what art group each file or function is using.
|
||||
// by default, the decompiler assumes this to be the name of the current type + -ag
|
||||
// so you only need to specify it when that's not the case.
|
||||
|
||||
// remap names for states and behaviors of these types
|
||||
"type_remap": {
|
||||
// "target": "jakb-ag",
|
||||
// "sidekick": "daxter-ag",
|
||||
// "wings": "jakb-ag",
|
||||
// "lightjak-shield": "jakb-ag",
|
||||
// "freeze-screen": "collectables-ag",
|
||||
// "red-3-sphere": "gun-ag",
|
||||
// "gun-dark-3-sphere": "gun-ag",
|
||||
// "marauder": "marauder-male-ag",
|
||||
// "glider-ring": "des-glider-ring-ag",
|
||||
// "flut-racer": "flut-wild-ag",
|
||||
// "was-pre-heart": "neo-satellite-heart-ag",
|
||||
// "was-pre-beam": "neo-satellite-game-ring-ag",
|
||||
// "was-pre-bubble": "neo-satellite-ps-symbols-ag",
|
||||
// "maker": "dm-robot-ag",
|
||||
// "mh-wasp": "neo-wasp-ag",
|
||||
// "factory-boss": "errol-lowres-ag",
|
||||
// "fac-robotank-turret": "fac-robotank-ag",
|
||||
// "neo-sat-shield": "neo-satellite-shield-ag",
|
||||
// "neo-sat": "neo-satellite-ag",
|
||||
// "power-game-switcher": "switcher-ag",
|
||||
// "power-game-player": "daxter-pac-man-ag",
|
||||
// "power-game-glyph": "cipher-ag",
|
||||
// "power-game-rings": "pow-rings-ag",
|
||||
// "power-game-chaser": "flitter-ag",
|
||||
// "power-game-zapper": "grunt-head-ag",
|
||||
// "gungame-door": "fort-entry-gate-ag",
|
||||
// "bt-mh-flyer": "bt-wasp-ag",
|
||||
// "gunship-exploder": "kg-robot-transport-break",
|
||||
// "gunship-engine": "kg-robot-transport-bomb",
|
||||
// "protect-gunship": "kg-robot-transport",
|
||||
// "gunship-missile": "cty-homing-missile"
|
||||
},
|
||||
|
||||
// remap names for types in an entire file (higher priority)
|
||||
"file_override": {
|
||||
// "target-indax": { "target": "daxter-ag" } // in target-indax.gc, the remap for 'target' will be set to 'daxter-ag'
|
||||
},
|
||||
|
||||
// some art groups (like robotboss-ag) have a name for their model that differs
|
||||
// from the usual ag-name + "-lod0". you can add those exceptions here.
|
||||
"joint_node_hacks": {
|
||||
// "robotboss-ag": "robotboss-basic"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
////////////////////////////
|
||||
// HACKS and ASM FUNCTIONS
|
||||
////////////////////////////
|
||||
|
||||
"types_with_bad_inspect_methods": [
|
||||
// "game-task-event"
|
||||
],
|
||||
|
||||
"no_type_analysis_functions_by_name": [],
|
||||
|
||||
// this limits the number of cases in a cond. The first argument is the name of the function.
|
||||
// the second argument is the name of the first condition in the cond. Use print_cfg to find it out.
|
||||
// The third argument is the number of cases. If you set it too small it may fail to build the CFG.
|
||||
"cond_with_else_max_lengths": [
|
||||
// ["(method 20 res-lump)", "b0", 2],
|
||||
],
|
||||
|
||||
// if a cond with an else case is being used a value in a place where it looks wrong
|
||||
// you can add the function name to this list and it will more aggressively reject this rewrite.
|
||||
"aggressively_reject_cond_to_value_rewrite": [
|
||||
// "(method 10 res-lump)",
|
||||
],
|
||||
|
||||
// this provides a hint to the decompiler that these functions will have a lot of inline assembly.
|
||||
// currently it just leaves pcpyld as an asm op.
|
||||
"hint_inline_assembly_functions": [],
|
||||
|
||||
"asm_functions_by_name": [
|
||||
// "name=",
|
||||
],
|
||||
|
||||
// these functions use pairs and the decompiler
|
||||
// will be less picky about types related to pairs.
|
||||
"pair_functions_by_name": [
|
||||
// "ref",
|
||||
],
|
||||
|
||||
// If format is used with the wrong number of arguments,
|
||||
// it will often mess up the decompilation, as the decompiler assumes
|
||||
// that they used the correct number. This will override the decompiler's
|
||||
// automatic detection.
|
||||
"bad_format_strings": {
|
||||
// "~170h~5d~220h~5d~280h~5,,2f": 3,
|
||||
},
|
||||
|
||||
"blocks_ending_in_asm_branch": {
|
||||
// "light-merge!": [1, 2, 3, 5, 7],
|
||||
},
|
||||
|
||||
// Sometimes the game might use format strings that are fetched dynamically,
|
||||
// for example using the game text lookup method
|
||||
// Add information about those format instructions here.
|
||||
// e.g. "function-name":[[op, argc], [op, argc], ...]
|
||||
// where "op" is the op number for the call to format.
|
||||
"dynamic_format_arg_counts": {
|
||||
// "auto-save-post": [[182, 1]],
|
||||
},
|
||||
|
||||
"mips2c_functions_by_name": [
|
||||
// "collide-do-primitives",
|
||||
],
|
||||
|
||||
"mips2c_jump_table_functions": {},
|
||||
|
||||
// there are some missing textures. I don't know what the game actually does here.
|
||||
// the format for entries is [level, tpage, index]
|
||||
"missing_textures": [
|
||||
// ["wasintro", 0, 0],
|
||||
],
|
||||
|
||||
// some object files have garbage pad data at the end which makes the decompiler
|
||||
// assume they must be different files, such as the art group for orb-cache-top.
|
||||
// this just suppresses a message.
|
||||
"expected_merged_objs": []
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
{}
|
||||
@@ -0,0 +1,428 @@
|
||||
{
|
||||
//////////////////////
|
||||
// INPUT FILES
|
||||
//////////////////////
|
||||
|
||||
// input is GOAL object files, possibly in containers.
|
||||
// most objects are part of CGO/DGO files (both go in dgo_names). This includes levels and the engine
|
||||
// the DGOs will be processed in this order. Usually it's best to have KERNEL, ENGINE, then the levels when
|
||||
// you want to run on the entire game.
|
||||
"dgo_names": [
|
||||
// engine files
|
||||
"CGO/ART.CGO",
|
||||
"CGO/COMMON.CGO",
|
||||
"CGO/ENGINE.CGO",
|
||||
"CGO/KERNEL.CGO",
|
||||
"CGO/GAME.CGO"
|
||||
// "DGO/ASHCRED.DGO",
|
||||
// "DGO/ASHLEV.DGO",
|
||||
// "DGO/ASHVL.DGO",
|
||||
// "DGO/ASHVL2.DGO",
|
||||
// "DGO/ASHVL3.DGO",
|
||||
// "DGO/ATL.DGO",
|
||||
// "DGO/ATOLLART.DGO",
|
||||
// "DGO/ATOLLCTF.DGO",
|
||||
// "DGO/ATOLLS.DGO",
|
||||
// "DGO/ATOPLOW.DGO",
|
||||
// "DGO/ATX.DGO",
|
||||
// "DGO/BEARL.DGO",
|
||||
// "DGO/BOBCL.DGO",
|
||||
// "DGO/BRDROOM.DGO",
|
||||
// "DGO/BRDROOMF.DGO",
|
||||
// "DGO/CANFOOT.DGO",
|
||||
// "DGO/CANSPARS.DGO",
|
||||
// "DGO/CANSPARW.DGO",
|
||||
// "DGO/CANTBOX.DGO",
|
||||
// "DGO/CANYONS.DGO",
|
||||
// "DGO/CANYONTT.DGO",
|
||||
// "DGO/CANYONW.DGO",
|
||||
// "DGO/CARS.DGO",
|
||||
// "DGO/CHEEL.DGO",
|
||||
// "DGO/CLF.DGO",
|
||||
// "DGO/CLFX.DGO",
|
||||
// "DGO/CLIFCTF.DGO",
|
||||
// "DGO/CLIFFART.DGO",
|
||||
// "DGO/CLIFFSS.DGO",
|
||||
// "DGO/CLIFHUNT.DGO",
|
||||
// "DGO/CLIFTRN.DGO",
|
||||
// "DGO/CNSPFOOT.DGO",
|
||||
// "DGO/CNSPTBOX.DGO",
|
||||
// "DGO/CNSPTT.DGO",
|
||||
// "DGO/COL.DGO",
|
||||
// "DGO/COLART.DGO",
|
||||
// "DGO/COLICLCT.DGO",
|
||||
// "DGO/COLICTF.DGO",
|
||||
// "DGO/COLIREV.DGO",
|
||||
// "DGO/COLISEUS.DGO",
|
||||
// "DGO/COLX.DGO",
|
||||
// "DGO/COUGL.DGO",
|
||||
// "DGO/CREDITS.DGO",
|
||||
// "DGO/CSX.DGO",
|
||||
// "DGO/CSY.DGO",
|
||||
// "DGO/CYA.DGO",
|
||||
// "DGO/CYB.DGO",
|
||||
// "DGO/CYC.DGO",
|
||||
// "DGO/CYD.DGO",
|
||||
// "DGO/CYE.DGO",
|
||||
// "DGO/CYX.DGO",
|
||||
// "DGO/CYY.DGO",
|
||||
// "DGO/DAXCRED.DGO",
|
||||
// "DGO/DAXLEV.DGO",
|
||||
// "DGO/DAXTL.DGO",
|
||||
// "DGO/DESACTF.DGO",
|
||||
// "DGO/DESARENS.DGO",
|
||||
// "DGO/DESART.DGO",
|
||||
// "DGO/DESCLCT.DGO",
|
||||
// "DGO/DESHUNT.DGO",
|
||||
// "DGO/DESHUNT2.DGO",
|
||||
// "DGO/DESISLES.DGO",
|
||||
// "DGO/DESRAPT.DGO",
|
||||
// "DGO/DESREV.DGO",
|
||||
// "DGO/DETHRACE.DGO",
|
||||
// "DGO/DISLEART.DGO",
|
||||
// "DGO/DISLECTF.DGO",
|
||||
// "DGO/DKA.DGO",
|
||||
// "DGO/DKB.DGO",
|
||||
// "DGO/DKC.DGO",
|
||||
// "DGO/DKD.DGO",
|
||||
// "DGO/DKE.DGO",
|
||||
// "DGO/DKKRFOOT.DGO",
|
||||
// "DGO/DKKRTBOX.DGO",
|
||||
// "DGO/DKKRTT.DGO",
|
||||
// "DGO/DKKX.DGO",
|
||||
// "DGO/DKKY.DGO",
|
||||
// "DGO/DKX.DGO",
|
||||
// "DGO/DOCKFOOT.DGO",
|
||||
// "DGO/DOCKKRAS.DGO",
|
||||
// "DGO/DOCKKRAW.DGO",
|
||||
// "DGO/DOCKSS.DGO",
|
||||
// "DGO/DOCKSTT.DGO",
|
||||
// "DGO/DOCKSW.DGO",
|
||||
// "DGO/DOCKTBOX.DGO",
|
||||
// "DGO/DRA.DGO",
|
||||
// "DGO/DRB.DGO",
|
||||
// "DGO/DRC.DGO",
|
||||
// "DGO/DRD.DGO",
|
||||
// "DGO/DRDKFOOT.DGO",
|
||||
// "DGO/DRDKTBOX.DGO",
|
||||
// "DGO/DRDKTT.DGO",
|
||||
// "DGO/DRDX.DGO",
|
||||
// "DGO/DRDY.DGO",
|
||||
// "DGO/DROMDOCS.DGO",
|
||||
// "DGO/DROMDOCW.DGO",
|
||||
// "DGO/DROMES.DGO",
|
||||
// "DGO/DROMETT.DGO",
|
||||
// "DGO/DROMEW.DGO",
|
||||
// "DGO/DROMEX.DGO",
|
||||
// "DGO/DROMFOOT.DGO",
|
||||
// "DGO/DROMTBOX.DGO",
|
||||
// "DGO/DRONE.DGO",
|
||||
// "DGO/DRX.DGO",
|
||||
// "DGO/DRY.DGO",
|
||||
// "DGO/DSI.DGO",
|
||||
// "DGO/DSR.DGO",
|
||||
// "DGO/DSRX.DGO",
|
||||
// "DGO/DSX.DGO",
|
||||
// "DGO/EIGHT.DGO",
|
||||
// "DGO/EIGHTB.DGO",
|
||||
// "DGO/FALCL.DGO",
|
||||
// "DGO/FMVLEV.DGO",
|
||||
// "DGO/FOXL.DGO",
|
||||
// "DGO/GARAGE.DGO",
|
||||
// "DGO/GARAGEB.DGO",
|
||||
// "DGO/GILAL.DGO",
|
||||
// "DGO/GTBCRED.DGO",
|
||||
// "DGO/GTBLEV.DGO",
|
||||
// "DGO/GTBVL.DGO",
|
||||
// "DGO/HAVENS.DGO",
|
||||
// "DGO/HAVENW.DGO",
|
||||
// "DGO/HAVJUNGS.DGO",
|
||||
// "DGO/HAVJUNGW.DGO",
|
||||
// "DGO/HAVNFOOT.DGO",
|
||||
// "DGO/HAVNTBOX.DGO",
|
||||
// "DGO/HAVSEWS.DGO",
|
||||
// "DGO/HAVSEWW.DGO",
|
||||
// "DGO/HAVTFOOT.DGO",
|
||||
// "DGO/HAVTOURS.DGO",
|
||||
// "DGO/HAVTOURW.DGO",
|
||||
// "DGO/HAVTT.DGO",
|
||||
// "DGO/HAVTTBOX.DGO",
|
||||
// "DGO/HJNGFOOT.DGO",
|
||||
// "DGO/HJX.DGO",
|
||||
// "DGO/HJY.DGO",
|
||||
// "DGO/HSX.DGO",
|
||||
// "DGO/HSY.DGO",
|
||||
// "DGO/HVA.DGO",
|
||||
// "DGO/HVB.DGO",
|
||||
// "DGO/HVC.DGO",
|
||||
// "DGO/HVD.DGO",
|
||||
// "DGO/HVE.DGO",
|
||||
// "DGO/HVJGTBOX.DGO",
|
||||
// "DGO/HVJGTT.DGO",
|
||||
// "DGO/HVSWFOOT.DGO",
|
||||
// "DGO/HVSWTBOX.DGO",
|
||||
// "DGO/HVSWTT.DGO",
|
||||
// "DGO/HVTRTT.DGO",
|
||||
// "DGO/HVX.DGO",
|
||||
// "DGO/HVY.DGO",
|
||||
// "DGO/IBX.DGO",
|
||||
// "DGO/IBY.DGO",
|
||||
// "DGO/ICA.DGO",
|
||||
// "DGO/ICB.DGO",
|
||||
// "DGO/ICBGTT.DGO",
|
||||
// "DGO/ICC.DGO",
|
||||
// "DGO/ICD.DGO",
|
||||
// "DGO/ICEBERGS.DGO",
|
||||
// "DGO/ICEBERGW.DGO",
|
||||
// "DGO/ICEBFOOT.DGO",
|
||||
// "DGO/ICEBTBOX.DGO",
|
||||
// "DGO/ICEFOOT.DGO",
|
||||
// "DGO/ICEPASSS.DGO",
|
||||
// "DGO/ICEPASSW.DGO",
|
||||
// "DGO/ICEPFOOT.DGO",
|
||||
// "DGO/ICEPTBOX.DGO",
|
||||
// "DGO/ICES.DGO",
|
||||
// "DGO/ICETBOX.DGO",
|
||||
// "DGO/ICETFOOT.DGO",
|
||||
// "DGO/ICETOURS.DGO",
|
||||
// "DGO/ICETOURW.DGO",
|
||||
// "DGO/ICETRN.DGO",
|
||||
// "DGO/ICETT.DGO",
|
||||
// "DGO/ICETTBOX.DGO",
|
||||
// "DGO/ICEW.DGO",
|
||||
// "DGO/ICPSTT.DGO",
|
||||
// "DGO/ICTRTT.DGO",
|
||||
// "DGO/ICX.DGO",
|
||||
// "DGO/ICY.DGO",
|
||||
// "DGO/IPX.DGO",
|
||||
// "DGO/IPY.DGO",
|
||||
// "DGO/JAKCRED.DGO",
|
||||
// "DGO/JAKLEV.DGO",
|
||||
// "DGO/JAKVL.DGO",
|
||||
// "DGO/JGA.DGO",
|
||||
// "DGO/JGB.DGO",
|
||||
// "DGO/JGC.DGO",
|
||||
// "DGO/JGD.DGO",
|
||||
// "DGO/JGE.DGO",
|
||||
// "DGO/JGF.DGO",
|
||||
// "DGO/JGG.DGO",
|
||||
// "DGO/JGX.DGO",
|
||||
// "DGO/JGY.DGO",
|
||||
// "DGO/JKALEV.DGO",
|
||||
// "DGO/JKBLEV.DGO",
|
||||
// "DGO/JKCLEV.DGO",
|
||||
// "DGO/JUNGFOOT.DGO",
|
||||
// "DGO/JUNGLES.DGO",
|
||||
// "DGO/JUNGLETT.DGO",
|
||||
// "DGO/JUNGLEW.DGO",
|
||||
// "DGO/JUNGTBOX.DGO",
|
||||
// "DGO/JUNGTRN.DGO",
|
||||
// "DGO/KAELEV.DGO",
|
||||
// "DGO/KCR.DGO",
|
||||
// "DGO/KCROSART.DGO",
|
||||
// "DGO/KCROSCTF.DGO",
|
||||
// "DGO/KCROSSS.DGO",
|
||||
// "DGO/KCRSCLCT.DGO",
|
||||
// "DGO/KCRSPLOW.DGO",
|
||||
// "DGO/KCRX.DGO",
|
||||
// "DGO/KEICRED.DGO",
|
||||
// "DGO/KIELEV.DGO",
|
||||
// "DGO/KIEVL.DGO",
|
||||
// "DGO/KLECRED.DGO",
|
||||
// "DGO/KLELEV.DGO",
|
||||
// "DGO/KLEVL.DGO",
|
||||
// "DGO/KLEVL2.DGO",
|
||||
// "DGO/KRA.DGO",
|
||||
// "DGO/KRASFOOT.DGO",
|
||||
// "DGO/KRASS.DGO",
|
||||
// "DGO/KRASTBOX.DGO",
|
||||
// "DGO/KRASTRN.DGO",
|
||||
// "DGO/KRASTT.DGO",
|
||||
// "DGO/KRASW.DGO",
|
||||
// "DGO/KRATFOOT.DGO",
|
||||
// "DGO/KRATOURS.DGO",
|
||||
// "DGO/KRATOURW.DGO",
|
||||
// "DGO/KRATTBOX.DGO",
|
||||
// "DGO/KRB.DGO",
|
||||
// "DGO/KRC.DGO",
|
||||
// "DGO/KRTRTT.DGO",
|
||||
// "DGO/KRX.DGO",
|
||||
// "DGO/KRY.DGO",
|
||||
// "DGO/LEOPL.DGO",
|
||||
// "DGO/MENU2.DGO",
|
||||
// "DGO/MENUMAP.DGO",
|
||||
// "DGO/MONGL.DGO",
|
||||
// "DGO/OSMLEV.DGO",
|
||||
// "DGO/PANTL.DGO",
|
||||
// "DGO/PEAKFOOT.DGO",
|
||||
// "DGO/PEAKS.DGO",
|
||||
// "DGO/PEAKTBOX.DGO",
|
||||
// "DGO/PEAKTT.DGO",
|
||||
// "DGO/PEAKW.DGO",
|
||||
// "DGO/PECCRED.DGO",
|
||||
// "DGO/PECLEV.DGO",
|
||||
// "DGO/PECVL.DGO",
|
||||
// "DGO/PKA.DGO",
|
||||
// "DGO/PKB.DGO",
|
||||
// "DGO/PKC.DGO",
|
||||
// "DGO/PKD.DGO",
|
||||
// "DGO/PKE.DGO",
|
||||
// "DGO/PKX.DGO",
|
||||
// "DGO/POSSL.DGO",
|
||||
// "DGO/RACEWEAP.DGO",
|
||||
// "DGO/RATLEV.DGO",
|
||||
// "DGO/RAYCRED.DGO",
|
||||
// "DGO/RAYLEV.DGO",
|
||||
// "DGO/RAYVL.DGO",
|
||||
// "DGO/RAYVL2.DGO",
|
||||
// "DGO/RAZCRED.DGO",
|
||||
// "DGO/RAZLEV.DGO",
|
||||
// "DGO/RAZVL.DGO",
|
||||
// "DGO/RTH.DGO",
|
||||
// "DGO/RUSTYH.DGO",
|
||||
// "DGO/S2A.DGO",
|
||||
// "DGO/S3A.DGO",
|
||||
// "DGO/SBWLCTF.DGO",
|
||||
// "DGO/SEWERS.DGO",
|
||||
// "DGO/SEWERTT.DGO",
|
||||
// "DGO/SEWERW.DGO",
|
||||
// "DGO/SEWFOOT.DGO",
|
||||
// "DGO/SEWTBOX.DGO",
|
||||
// "DGO/SIGCRED.DGO",
|
||||
// "DGO/SIGLEV.DGO",
|
||||
// "DGO/SIGVL.DGO",
|
||||
// "DGO/SIGVL2.DGO",
|
||||
// "DGO/SIGVL3.DGO",
|
||||
// "DGO/SNAKL.DGO",
|
||||
// "DGO/SNO.DGO",
|
||||
// "DGO/SNOBART.DGO",
|
||||
// "DGO/SNOBOWLS.DGO",
|
||||
// "DGO/SNOWFOOT.DGO",
|
||||
// "DGO/SNOWS.DGO",
|
||||
// "DGO/SNOWTBOX.DGO",
|
||||
// "DGO/SNOWTRN2.DGO",
|
||||
// "DGO/SNOWTT.DGO",
|
||||
// "DGO/SNOX.DGO",
|
||||
// "DGO/SNW.DGO",
|
||||
// "DGO/SNWX.DGO",
|
||||
// "DGO/SPA.DGO",
|
||||
// "DGO/SPARFOOT.DGO",
|
||||
// "DGO/SPARGUSS.DGO",
|
||||
// "DGO/SPARGUSW.DGO",
|
||||
// "DGO/SPARTEMS.DGO",
|
||||
// "DGO/SPARTEMW.DGO",
|
||||
// "DGO/SPARTT.DGO",
|
||||
// "DGO/SPATFOOT.DGO",
|
||||
// "DGO/SPATOURS.DGO",
|
||||
// "DGO/SPATOURW.DGO",
|
||||
// "DGO/SPATTBOX.DGO",
|
||||
// "DGO/SPB.DGO",
|
||||
// "DGO/SPC.DGO",
|
||||
// "DGO/SPD.DGO",
|
||||
// "DGO/SPE.DGO",
|
||||
// "DGO/SPRGSTBX.DGO",
|
||||
// "DGO/SPTMFOOT.DGO",
|
||||
// "DGO/SPTMTBOX.DGO",
|
||||
// "DGO/SPTMTT.DGO",
|
||||
// "DGO/SPTRTT.DGO",
|
||||
// "DGO/SPX.DGO",
|
||||
// "DGO/SPY.DGO",
|
||||
// "DGO/STX.DGO",
|
||||
// "DGO/STY.DGO",
|
||||
// "DGO/SWA.DGO",
|
||||
// "DGO/SWB.DGO",
|
||||
// "DGO/SWC.DGO",
|
||||
// "DGO/SWD.DGO",
|
||||
// "DGO/SWE.DGO",
|
||||
// "DGO/SWF.DGO",
|
||||
// "DGO/SWX.DGO",
|
||||
// "DGO/TARLEV.DGO",
|
||||
// "DGO/TEMPFOOT.DGO",
|
||||
// "DGO/TEMPLES.DGO",
|
||||
// "DGO/TEMPLETT.DGO",
|
||||
// "DGO/TEMPLEW.DGO",
|
||||
// "DGO/TEMPTBOX.DGO",
|
||||
// "DGO/THACRED.DGO",
|
||||
// "DGO/THALEV.DGO",
|
||||
// "DGO/THAVL.DGO",
|
||||
// "DGO/THAVL2.DGO",
|
||||
// "DGO/THAVL3.DGO",
|
||||
// "DGO/THBCRED.DGO",
|
||||
// "DGO/THBLEV.DGO",
|
||||
// "DGO/THBVL.DGO",
|
||||
// "DGO/THBVL2.DGO",
|
||||
// "DGO/THBVL3.DGO",
|
||||
// "DGO/THCCRED.DGO",
|
||||
// "DGO/THCLEV.DGO",
|
||||
// "DGO/THCVL.DGO",
|
||||
// "DGO/THCVL2.DGO",
|
||||
// "DGO/THCVL3.DGO",
|
||||
// "DGO/TIGEL.DGO",
|
||||
// "DGO/TOADL.DGO",
|
||||
// "DGO/TORCRED.DGO",
|
||||
// "DGO/TORLEV.DGO",
|
||||
// "DGO/TORVL.DGO",
|
||||
// "DGO/TORVL2.DGO",
|
||||
// "DGO/TORVL3.DGO",
|
||||
// "DGO/TPA.DGO",
|
||||
// "DGO/TPB.DGO",
|
||||
// "DGO/TPC.DGO",
|
||||
// "DGO/TPD.DGO",
|
||||
// "DGO/TPE.DGO",
|
||||
// "DGO/TPX.DGO",
|
||||
// "DGO/TPY.DGO",
|
||||
// "DGO/TURTL.DGO",
|
||||
// "DGO/UR8CRED.DGO",
|
||||
// "DGO/UR8LEV.DGO",
|
||||
// "DGO/UR8VL.DGO",
|
||||
// "DGO/UR8VL2.DGO",
|
||||
// "DGO/UR8VL3.DGO",
|
||||
// "DGO/WOLFL.DGO",
|
||||
// "DGO/WOMBL.DGO",
|
||||
// "DGO/XIMLEV.DGO"
|
||||
],
|
||||
|
||||
"levels_to_extract": [],
|
||||
|
||||
// some objects are part of STR files (streaming data).
|
||||
"str_file_names": [],
|
||||
|
||||
// streaming "art" that should be added to GAME.FR3.
|
||||
"str_art_file_names": [],
|
||||
|
||||
"object_file_names": [
|
||||
"TEXT/0COMMON.TXT",
|
||||
"TEXT/0SUBTIT.TXT",
|
||||
"TEXT/1COMMON.TXT",
|
||||
"TEXT/1SUBTIT.TXT",
|
||||
"TEXT/2COMMON.TXT",
|
||||
"TEXT/2SUBTIT.TXT",
|
||||
"TEXT/3COMMON.TXT",
|
||||
"TEXT/3SUBTIT.TXT",
|
||||
"TEXT/4COMMON.TXT",
|
||||
"TEXT/4SUBTIT.TXT",
|
||||
"TEXT/5COMMON.TXT",
|
||||
"TEXT/5SUBTIT.TXT",
|
||||
"TEXT/6COMMON.TXT",
|
||||
"TEXT/6SUBTIT.TXT",
|
||||
"TEXT/7COMMON.TXT",
|
||||
"TEXT/7SUBTIT.TXT",
|
||||
"TEXT/8COMMON.TXT",
|
||||
"TEXT/8SUBTIT.TXT",
|
||||
"TEXT/9COMMON.TXT",
|
||||
"TEXT/9SUBTIT.TXT",
|
||||
"TEXT/10COMMON.TXT",
|
||||
"TEXT/10SUBTIT.TXT",
|
||||
"TEXT/11COMMON.TXT",
|
||||
"TEXT/11SUBTIT.TXT"
|
||||
],
|
||||
|
||||
"streamed_audio_file_names": [
|
||||
"VAGWAD.ENG",
|
||||
"VAGWAD.FRE",
|
||||
"VAGWAD.GER",
|
||||
"VAGWAD.SPA",
|
||||
"VAGWAD.ITA",
|
||||
"VAGWAD.INT"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,6 @@
|
||||
{
|
||||
// "math": [
|
||||
// ["L108", "(pointer float)", 32],
|
||||
// ["L109", "(pointer float)", 32]
|
||||
// ],
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,4 @@
|
||||
// This overrides the stack size for calls to stack-size-set! in given functions.
|
||||
{
|
||||
// "(method 29 target)": 2048,
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
// "quaternion-smooth-seek!": [[16, ["inline-array", "quaternion", 2]]],
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,18 @@
|
||||
{
|
||||
// "(method 2 array)": [
|
||||
// [23, "gp", "(array int32)"],
|
||||
// [43, "gp", "(array uint32)"],
|
||||
// [63, "gp", "(array int64)"],
|
||||
// [83, "gp", "(array uint64)"],
|
||||
// [102, "gp", "(array int8)"],
|
||||
// [121, "gp", "(array uint8)"],
|
||||
// [141, "gp", "(array int16)"],
|
||||
// [161, "gp", "(array uint16)"],
|
||||
// [186, "gp", "(array uint128)"],
|
||||
// [204, "gp", "(array int32)"],
|
||||
// [223, "gp", "(array float)"],
|
||||
// [232, "gp", "(array float)"],
|
||||
// [249, "gp", "(array basic)"],
|
||||
// [258, "gp", "(array basic)"]
|
||||
// ],
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
{
|
||||
// "(method 0 inline-array-class)": {
|
||||
// "args": ["allocation", "type-to-make", "count"]
|
||||
// },
|
||||
}
|
||||
@@ -0,0 +1,901 @@
|
||||
{
|
||||
// NOTE: almost all of these were just copy pasted from jak2
|
||||
// so it's impossible to know which are actually needed for jakx...
|
||||
// commenting out incase there's something here actually needed
|
||||
|
||||
"gkernel": [
|
||||
[17, "(function process symbol)"],
|
||||
[24, "(function process symbol)"],
|
||||
[26, "(function process symbol)"],
|
||||
[29, "(function process symbol)"],
|
||||
[32, "(function process symbol)"],
|
||||
[34, "(function process symbol)"],
|
||||
[36, "(function process symbol)"]
|
||||
],
|
||||
"profile": [[3, "(function profile-segment-array profile-collapse none)"]],
|
||||
"surface-h": [
|
||||
[0, "(function none)"],
|
||||
[1, "(function none)"],
|
||||
[2, "(function none)"]
|
||||
],
|
||||
"gsound": [
|
||||
[1, "(function none)"],
|
||||
[3, "(function none)"],
|
||||
[5, "(function none)"]
|
||||
],
|
||||
"joint-mod": [[21, "(function cspace transformq none)"]],
|
||||
"level-info": [
|
||||
[0, "(function int)"],
|
||||
[1, "(function int)"],
|
||||
[2, "(function int)"]
|
||||
],
|
||||
"game-info": [
|
||||
[11, "(function string none :behavior process)"],
|
||||
[17, "(function symbol symbol int none :behavior process)"],
|
||||
[
|
||||
22,
|
||||
"(function symbol symbol continue-point game-save resetter-spec none :behavior process)"
|
||||
]
|
||||
],
|
||||
"game-task": [
|
||||
[0, "(function symbol)"],
|
||||
[1, "(function symbol)"],
|
||||
[2, "(function symbol)"],
|
||||
[3, "(function symbol)"]
|
||||
],
|
||||
"settings": [
|
||||
[6, "(function engine-pers connection-pers object object symbol)"]
|
||||
],
|
||||
"generic-obs": [[51, "(function symbol :behavior touch-tracker)"]],
|
||||
"target-util": [
|
||||
[2, "(function none :behavior target)"],
|
||||
[3, "(function none :behavior target)"],
|
||||
[4, "(function none :behavior manipy)"],
|
||||
[5, "(function none :behavior manipy)"],
|
||||
[6, "(function none :behavior target)"]
|
||||
],
|
||||
"logic-target": [
|
||||
[0, "(function external-art-buffer none)"],
|
||||
[1, "(function external-art-buffer none)"]
|
||||
],
|
||||
"sidekick": [[6, "(function object vector int string :behavior sidekick)"]],
|
||||
"target-handler": [
|
||||
[10, "(function handle none :behavior target)"],
|
||||
[14, "(function none :behavior target)"]
|
||||
],
|
||||
"target-anim": [
|
||||
[3, "(function none :behavior target)"],
|
||||
[4, "(function none :behavior target)"],
|
||||
[7, "(function none :behavior target)"],
|
||||
[8, "(function none :behavior target)"],
|
||||
[13, "(function (pointer time-frame) none :behavior target)"],
|
||||
[14, "(function none :behavior target)"],
|
||||
[15, "(function none :behavior target)"],
|
||||
[16, "(function none :behavior target)"],
|
||||
[17, "(function none :behavior target)"]
|
||||
],
|
||||
"target": [
|
||||
[1, "(function object :behavior target)"],
|
||||
[7, "(function object :behavior target)"],
|
||||
[18, "(function process-focusable object :behavior target)"],
|
||||
[29, "(function surface surface surface int object :behavior target)"],
|
||||
[35, "(function surface surface surface int object :behavior target)"],
|
||||
[45, "(function surface surface surface int object :behavior target)"],
|
||||
[46, "(function surface surface surface int object :behavior target)"],
|
||||
[77, "(function surface surface surface int object :behavior target)"]
|
||||
],
|
||||
"target2": [
|
||||
[12, "(function vector time-frame float object :behavior process)"],
|
||||
[15, "(function object :behavior target)"],
|
||||
[23, "(function object :behavior target)"],
|
||||
[64, "(function symbol :behavior target)"]
|
||||
],
|
||||
"target-lightjak": [[68, "(function symbol object :behavior target)"]],
|
||||
"target-invisible": [[10, "(function object :behavior target)"]],
|
||||
"target-death": [
|
||||
[1, "(function object :behavior target)"],
|
||||
[2, "(function object :behavior target)"],
|
||||
[3, "(function symbol object :behavior target)"],
|
||||
[4, "(function object :behavior target)"],
|
||||
[9, "(function handle object :behavior target)"],
|
||||
[10, "(function object :behavior target)"],
|
||||
[14, "(function process-drawable object)"],
|
||||
[25, "(function surface surface surface int object :behavior target)"],
|
||||
[26, "(function surface surface surface int object :behavior target)"],
|
||||
[28, "(function continue-point object)"],
|
||||
[34, "(function process symbol)"],
|
||||
[35, "(function process symbol)"],
|
||||
[36, "(function process symbol)"],
|
||||
[37, "(function process symbol)"],
|
||||
[38, "(function process symbol)"]
|
||||
],
|
||||
"target-gun": [
|
||||
[15, "(function pickup-type pickup-type none :behavior target)"],
|
||||
[16, "(function pickup-type none :behavior target)"],
|
||||
[25, "(function surface surface surface int object :behavior target)"]
|
||||
],
|
||||
"target-board": [
|
||||
[30, "(function surface surface surface int object :behavior target)"],
|
||||
[31, "(function surface surface surface int object :behavior target)"],
|
||||
[32, "(function surface surface surface int object :behavior target)"],
|
||||
[33, "(function surface surface surface int object :behavior target)"],
|
||||
[34, "(function surface surface surface int object :behavior target)"]
|
||||
],
|
||||
"vent": [
|
||||
[26, "(function vent symbol)"],
|
||||
[27, "(function vent symbol)"],
|
||||
[28, "(function vent symbol)"],
|
||||
[29, "(function vent symbol)"]
|
||||
],
|
||||
"crates": [[35, "(function process symbol)"]],
|
||||
"collectables": [
|
||||
[77, "(function part-tracker vector)"],
|
||||
[78, "(function part-tracker vector)"]
|
||||
],
|
||||
"trajectory": [[15, "(function trajectory none)"]],
|
||||
"progress": [[3, "(function int none :behavior process)"]],
|
||||
"level": [
|
||||
[25, "(function level-group int symbol)"],
|
||||
[7, "(function none)"],
|
||||
[4, "(function load-state sound-bank-state symbol)"]
|
||||
],
|
||||
"main": [
|
||||
[11, "(function int none)"],
|
||||
[9, "(function none)"],
|
||||
[8, "(function none)"],
|
||||
[7, "(function none)"],
|
||||
[3, "(function symbol :behavior process)"]
|
||||
],
|
||||
"scene": [[4, "(function symbol :behavior scene-player)"]],
|
||||
"pov-camera": [
|
||||
[
|
||||
7,
|
||||
"(function process int symbol event-message-block object :behavior pov-camera)"
|
||||
]
|
||||
],
|
||||
"airlock": [
|
||||
[7, "(function object :behavior com-airlock)"],
|
||||
[11, "(function object :behavior com-airlock)"],
|
||||
[12, "(function object :behavior com-airlock)"]
|
||||
],
|
||||
"default-menu": [
|
||||
[3, "(function object)"],
|
||||
[4, "(function object)"],
|
||||
[5, "(function object)"],
|
||||
[6, "(function object)"],
|
||||
[7, "(function int debug-menu-msg object)"],
|
||||
[8, "(function object)"],
|
||||
[9, "(function object)"],
|
||||
[10, "(function object)"],
|
||||
[11, "(function object)"],
|
||||
[12, "(function object)"],
|
||||
[13, "(function object)"],
|
||||
[14, "(function object)"],
|
||||
[15, "(function object)"],
|
||||
[16, "(function object)"],
|
||||
[17, "(function object)"],
|
||||
[18, "(function int debug-menu-msg float object)"],
|
||||
[20, "(function object)"],
|
||||
[21, "(function object)"],
|
||||
[22, "(function object)"],
|
||||
[23, "(function object)"],
|
||||
[24, "(function object)"],
|
||||
[25, "(function object)"],
|
||||
[26, "(function object)"],
|
||||
[27, "(function int debug-menu-msg float object)"],
|
||||
[28, "(function int debug-menu-msg float object)"],
|
||||
[29, "(function object)"],
|
||||
[30, "(function int debug-menu-msg float object)"],
|
||||
[31, "(function int debug-menu-msg float object)"],
|
||||
[32, "(function int debug-menu-msg float object)"],
|
||||
[33, "(function int debug-menu-msg float object)"],
|
||||
[34, "(function object)"],
|
||||
[35, "(function object)"],
|
||||
[36, "(function int debug-menu-msg float object)"],
|
||||
[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)"],
|
||||
[41, "(function object)"],
|
||||
[42, "(function int debug-menu-msg float object)"],
|
||||
[43, "(function int debug-menu-msg float object)"],
|
||||
[44, "(function int debug-menu-msg float object)"],
|
||||
[45, "(function int debug-menu-msg float object)"],
|
||||
[46, "(function int debug-menu-msg float object)"],
|
||||
[47, "(function int debug-menu-msg float object)"],
|
||||
[48, "(function int debug-menu-msg float object)"],
|
||||
[49, "(function int debug-menu-msg float object)"],
|
||||
[50, "(function int debug-menu-msg float object)"],
|
||||
[51, "(function int debug-menu-msg float object)"],
|
||||
[52, "(function int debug-menu-msg float object)"],
|
||||
[53, "(function int debug-menu-msg float object)"],
|
||||
[54, "(function int debug-menu-msg float object)"],
|
||||
[55, "(function int debug-menu-msg float object)"],
|
||||
[56, "(function int debug-menu-msg float object)"],
|
||||
[57, "(function int debug-menu-msg float object)"],
|
||||
[58, "(function int debug-menu-msg float object)"],
|
||||
[59, "(function int debug-menu-msg float object)"],
|
||||
[60, "(function int debug-menu-msg float object)"],
|
||||
[61, "(function int debug-menu-msg float object)"],
|
||||
[62, "(function int debug-menu-msg float object)"],
|
||||
[63, "(function int debug-menu-msg float object)"],
|
||||
[64, "(function int debug-menu-msg float object)"],
|
||||
[65, "(function int debug-menu-msg float object)"],
|
||||
[66, "(function int debug-menu-msg float object)"],
|
||||
[67, "(function int debug-menu-msg float object)"],
|
||||
[68, "(function int debug-menu-msg float object)"],
|
||||
[69, "(function int debug-menu-msg float object)"],
|
||||
[70, "(function int debug-menu-msg float object)"],
|
||||
[71, "(function int debug-menu-msg float object)"],
|
||||
[72, "(function int debug-menu-msg float object)"],
|
||||
[73, "(function int debug-menu-msg float object)"],
|
||||
[74, "(function int debug-menu-msg float object)"],
|
||||
[75, "(function int debug-menu-msg float object)"],
|
||||
[76, "(function int debug-menu-msg float object)"],
|
||||
[77, "(function int debug-menu-msg float object)"],
|
||||
[78, "(function int debug-menu-msg float object)"],
|
||||
[79, "(function int debug-menu-msg float object)"],
|
||||
[80, "(function int debug-menu-msg float object)"],
|
||||
[81, "(function int debug-menu-msg float object)"],
|
||||
[82, "(function int debug-menu-msg float object)"],
|
||||
[83, "(function int debug-menu-msg float object)"],
|
||||
[84, "(function int debug-menu-msg float object)"],
|
||||
[85, "(function int debug-menu-msg float object)"],
|
||||
[86, "(function int debug-menu-msg float object)"],
|
||||
[87, "(function int debug-menu-msg float object)"],
|
||||
[88, "(function int debug-menu-msg float object)"],
|
||||
[89, "(function int debug-menu-msg float object)"],
|
||||
[90, "(function int debug-menu-msg float object)"],
|
||||
[91, "(function int debug-menu-msg float object)"],
|
||||
[92, "(function int debug-menu-msg float object)"],
|
||||
[93, "(function int debug-menu-msg float object)"],
|
||||
[94, "(function int debug-menu-msg float object)"],
|
||||
[95, "(function int debug-menu-msg float object)"],
|
||||
[96, "(function int debug-menu-msg float object)"],
|
||||
[97, "(function int debug-menu-msg float object)"],
|
||||
[98, "(function int debug-menu-msg float object)"],
|
||||
[99, "(function int debug-menu-msg float object)"],
|
||||
[100, "(function int debug-menu-msg float object)"],
|
||||
[101, "(function int debug-menu-msg float object)"],
|
||||
[102, "(function int debug-menu-msg float object)"],
|
||||
[103, "(function int debug-menu-msg float object)"],
|
||||
[104, "(function int debug-menu-msg float object)"],
|
||||
[105, "(function int debug-menu-msg float object)"],
|
||||
[106, "(function int debug-menu-msg float object)"],
|
||||
[107, "(function int debug-menu-msg float object)"],
|
||||
[108, "(function int debug-menu-msg float object)"],
|
||||
[109, "(function int debug-menu-msg float object)"],
|
||||
[110, "(function int debug-menu-msg float object)"],
|
||||
[111, "(function int debug-menu-msg float object)"],
|
||||
[112, "(function int debug-menu-msg float object)"],
|
||||
[113, "(function int debug-menu-msg float object)"],
|
||||
[114, "(function int debug-menu-msg float object)"],
|
||||
[115, "(function int debug-menu-msg float object)"],
|
||||
[116, "(function int debug-menu-msg float object)"],
|
||||
[117, "(function int debug-menu-msg float object)"],
|
||||
[118, "(function int debug-menu-msg float object)"],
|
||||
[119, "(function int debug-menu-msg float object)"],
|
||||
[120, "(function int debug-menu-msg float object)"],
|
||||
[121, "(function int debug-menu-msg float object)"],
|
||||
[122, "(function int debug-menu-msg float object)"],
|
||||
[123, "(function int debug-menu-msg float object)"],
|
||||
[124, "(function int debug-menu-msg float object)"],
|
||||
[125, "(function int debug-menu-msg float object)"],
|
||||
[126, "(function int debug-menu-msg float object)"],
|
||||
[127, "(function int debug-menu-msg float object)"],
|
||||
[128, "(function int debug-menu-msg float object)"],
|
||||
[129, "(function int debug-menu-msg float object)"],
|
||||
[130, "(function int debug-menu-msg float object)"],
|
||||
[131, "(function int debug-menu-msg float object)"],
|
||||
[132, "(function int debug-menu-msg float object)"],
|
||||
[133, "(function int debug-menu-msg float object)"],
|
||||
[134, "(function int debug-menu-msg float object)"],
|
||||
[135, "(function int debug-menu-msg float object)"],
|
||||
[136, "(function int debug-menu-msg float object)"],
|
||||
[137, "(function int debug-menu-msg float object)"],
|
||||
[138, "(function int debug-menu-msg float object)"],
|
||||
[139, "(function int debug-menu-msg float object)"],
|
||||
[140, "(function int debug-menu-msg float object)"],
|
||||
[141, "(function int debug-menu-msg float object)"],
|
||||
[142, "(function int debug-menu-msg float object)"],
|
||||
[143, "(function int debug-menu-msg float object)"],
|
||||
[144, "(function int debug-menu-msg float object)"],
|
||||
[145, "(function int debug-menu-msg float object)"],
|
||||
[146, "(function int debug-menu-msg float object)"],
|
||||
[147, "(function int debug-menu-msg float object)"],
|
||||
[148, "(function int debug-menu-msg float object)"],
|
||||
[149, "(function int debug-menu-msg float object)"],
|
||||
[150, "(function int debug-menu-msg float object)"],
|
||||
[151, "(function int debug-menu-msg float object)"],
|
||||
[152, "(function int debug-menu-msg float object)"],
|
||||
[153, "(function int debug-menu-msg float object)"],
|
||||
[154, "(function int debug-menu-msg float object)"],
|
||||
[155, "(function int debug-menu-msg float object)"],
|
||||
[156, "(function int debug-menu-msg float object)"],
|
||||
[157, "(function int debug-menu-msg float object)"],
|
||||
[158, "(function int debug-menu-msg float object)"],
|
||||
[159, "(function int debug-menu-msg float object)"],
|
||||
[160, "(function object)"],
|
||||
[161, "(function object)"],
|
||||
[162, "(function object)"],
|
||||
[163, "(function object)"],
|
||||
[164, "(function object)"],
|
||||
[165, "(function object)"],
|
||||
[166, "(function object)"],
|
||||
[167, "(function object)"],
|
||||
[168, "(function int debug-menu-msg object)"],
|
||||
[169, "(function int debug-menu-msg object)"],
|
||||
[170, "(function int debug-menu-msg object)"],
|
||||
[171, "(function int debug-menu-msg object)"],
|
||||
[172, "(function int debug-menu-msg object)"],
|
||||
[173, "(function int debug-menu-msg float object)"],
|
||||
[174, "(function int debug-menu-msg float object)"],
|
||||
[175, "(function int debug-menu-msg float object)"],
|
||||
[176, "(function int debug-menu-msg float object)"],
|
||||
[177, "(function int debug-menu-msg float object)"],
|
||||
[178, "(function int debug-menu-msg float object)"],
|
||||
[179, "(function int debug-menu-msg float object)"],
|
||||
[180, "(function int debug-menu-msg float object)"],
|
||||
[181, "(function int debug-menu-msg float object)"],
|
||||
[182, "(function int debug-menu-msg float object)"],
|
||||
[183, "(function int debug-menu-msg float object)"],
|
||||
[184, "(function int debug-menu-msg float object)"],
|
||||
[185, "(function int debug-menu-msg float object)"],
|
||||
[186, "(function int debug-menu-msg float object)"],
|
||||
[187, "(function int debug-menu-msg float object)"],
|
||||
[188, "(function int debug-menu-msg float object)"],
|
||||
[189, "(function int debug-menu-msg float object)"],
|
||||
[190, "(function int debug-menu-msg float object)"],
|
||||
[191, "(function int debug-menu-msg float object)"],
|
||||
[192, "(function int debug-menu-msg float object)"],
|
||||
[193, "(function int debug-menu-msg float object)"],
|
||||
[194, "(function int debug-menu-msg float object)"],
|
||||
[195, "(function int debug-menu-msg float object)"],
|
||||
[196, "(function int debug-menu-msg float object)"],
|
||||
[197, "(function int debug-menu-msg float object)"],
|
||||
[198, "(function int debug-menu-msg float object)"],
|
||||
[199, "(function int debug-menu-msg float object)"],
|
||||
[200, "(function int debug-menu-msg float object)"],
|
||||
[201, "(function int debug-menu-msg float object)"],
|
||||
[202, "(function int debug-menu-msg float object)"],
|
||||
[203, "(function int debug-menu-msg float object)"],
|
||||
[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)"],
|
||||
[208, "(function int debug-menu-msg float object)"],
|
||||
[209, "(function int debug-menu-msg float object)"],
|
||||
[210, "(function int debug-menu-msg float object)"],
|
||||
[211, "(function int debug-menu-msg 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)"],
|
||||
[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)"],
|
||||
[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)"],
|
||||
[221, "(function symbol debug-menu-msg float float object)"],
|
||||
[222, "(function symbol debug-menu-msg float float object)"],
|
||||
[223, "(function symbol debug-menu-msg float float object)"],
|
||||
[224, "(function symbol debug-menu-msg float float object)"],
|
||||
[225, "(function symbol debug-menu-msg float float object)"],
|
||||
[226, "(function symbol debug-menu-msg float float object)"],
|
||||
[227, "(function symbol debug-menu-msg float float object)"],
|
||||
[228, "(function symbol debug-menu-msg float float object)"],
|
||||
[229, "(function symbol debug-menu-msg float float object)"],
|
||||
[230, "(function symbol debug-menu-msg float float object)"],
|
||||
[231, "(function symbol debug-menu-msg float float object)"],
|
||||
[232, "(function symbol debug-menu-msg float float object)"],
|
||||
[233, "(function symbol debug-menu-msg float float object)"],
|
||||
[234, "(function symbol debug-menu-msg float float object)"],
|
||||
[235, "(function object)"],
|
||||
[236, "(function object)"],
|
||||
[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)"],
|
||||
[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)"]
|
||||
],
|
||||
"enemy-states": [[38, "(function object :behavior enemy)"]],
|
||||
"scene-actor": [
|
||||
[0, "(function none)"],
|
||||
[1, "(function flut-npc none)"],
|
||||
[2, "(function flut-npc art-element)"],
|
||||
[39, "(function flut-npc flut-npc)"]
|
||||
],
|
||||
"warp-gate": [
|
||||
[0, "(function object)"],
|
||||
[8, "(function string object :behavior process)"],
|
||||
[12, "(function object :behavior target)"]
|
||||
],
|
||||
"gun-yellow-shot": [[59, "(function handle object :behavior process)"]],
|
||||
"gun-dark-shot": [
|
||||
[25, "(function collide-shape-prim none :behavior gravity-spinner)"],
|
||||
[34, "(function handle float object :behavior process)"]
|
||||
],
|
||||
"entity": [
|
||||
[11, "(function process object)"],
|
||||
[16, "(function process object)"],
|
||||
[57, "(function process object)"],
|
||||
[61, "(function process object)"]
|
||||
],
|
||||
"target-darkjak": [
|
||||
[5, "(function object :behavior target)"],
|
||||
[
|
||||
20,
|
||||
"(function (pointer float) (pointer int64) (pointer int64) object :behavior target)"
|
||||
],
|
||||
[21, "(function object :behavior target)"]
|
||||
],
|
||||
"memory-usage": [
|
||||
[2, "(function process-drawable symbol)"],
|
||||
[3, "(function basic symbol)"]
|
||||
],
|
||||
"bug-report": [
|
||||
[0, "(function object :behavior bug-report)"],
|
||||
[1, "(function object :behavior bug-report)"]
|
||||
],
|
||||
"relocate": [[7, "(function sparticle-system sparticle-cpuinfo none)"]],
|
||||
"target-mech": [
|
||||
[7, "(function object :behavior target)"],
|
||||
[8, "(function object :behavior target)"],
|
||||
[9, "(function object :behavior target)"],
|
||||
[18, "(function surface surface surface int object :behavior target)"],
|
||||
[19, "(function surface surface surface int object :behavior target)"]
|
||||
],
|
||||
"mech-states": [[57, "(function object :behavior target)"]],
|
||||
"target-flut": [
|
||||
[14, "(function surface surface surface int object :behavior target)"],
|
||||
[20, "(function object :behavior target)"],
|
||||
[21, "(function object :behavior target)"],
|
||||
[33, "(function process-focusable object)"],
|
||||
[72, "(function object)"],
|
||||
[73, "(function object :behavior target)"],
|
||||
[74, "(function object :behavior target)"]
|
||||
],
|
||||
"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)"]
|
||||
],
|
||||
"nav-enemy": [[7, "(function enemy-jump-info none :behavior nav-enemy)"]],
|
||||
"task-control": [
|
||||
[53, "(function game-task-node-info symbol object)"],
|
||||
[54, "(function game-task-node-info object)"],
|
||||
[67, "(function pair symbol)"]
|
||||
],
|
||||
"merc-death": [[3, "(function time-frame :behavior process-drawable)"]],
|
||||
"vehicle-states": [
|
||||
[10, "(function collide-shape-prim none)"],
|
||||
[12, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"prebot-states": [[21, "(function vector :behavior prebot)"]],
|
||||
"wasall-obs": [
|
||||
[0, "(function object)"],
|
||||
[1, "(function object)"],
|
||||
[2, "(function object)"],
|
||||
[3, "(function object)"]
|
||||
],
|
||||
"roboguard": [
|
||||
[1, "(function cspace transformq none)"],
|
||||
[2, "(function cspace transformq none)"],
|
||||
[25, "(function int int float object :behavior roboguard)"],
|
||||
[45, "(function roboguard symbol object)"]
|
||||
],
|
||||
"vehicle": [
|
||||
[6, "(function collide-shape-prim none)"],
|
||||
[7, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"wvehicle-wheel": [
|
||||
[7, "(function collide-shape-prim none)"],
|
||||
[11, "(function collide-shape-prim none)"],
|
||||
[17, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"wvehicle-states": [
|
||||
[20, "(function collide-shape-prim none)"],
|
||||
[22, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"wvehicle": [[6, "(function collide-shape-prim none)"]],
|
||||
"pilot-states": [
|
||||
[15, "(function surface surface surface int object :behavior target)"]
|
||||
],
|
||||
"was-squad-control": [[16, "(function object object)"]],
|
||||
"des-cactus": [[13, "(function collide-shape-prim none)"]],
|
||||
"desertg-obs": [
|
||||
[4, "(function collide-shape-prim none)"],
|
||||
[7, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"desertf-obs": [[7, "(function none)"]],
|
||||
"temple-obs2": [
|
||||
[43, "(function symbol)"],
|
||||
[46, "(function object :behavior tpl-watcher)"]
|
||||
],
|
||||
"temple-scenes": [
|
||||
[0, "(function none)"],
|
||||
[1, "(function none)"],
|
||||
[2, "(function none)"],
|
||||
[3, "(function none :behavior scene-player)"],
|
||||
[4, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"des-beast-2": [
|
||||
[1, "(function cspace transformq none)"],
|
||||
[2, "(function cspace transformq none)"],
|
||||
[23, "(function projectile none)"]
|
||||
],
|
||||
"scorpion-gun": [
|
||||
[33, "(function cspace transformq none)"],
|
||||
[34, "(function cspace transformq none)"]
|
||||
],
|
||||
"hover-formation": [
|
||||
[10, "(function form-search-info float)"],
|
||||
[11, "(function int int form-search-info uint)"],
|
||||
[14, "(function vector object)"],
|
||||
[15, "(function int int (pointer object) int)"]
|
||||
],
|
||||
"robo-hover": [
|
||||
[14, "(function robo-hover cspace float float vector vector int object)"]
|
||||
],
|
||||
"tower-scenes": [
|
||||
[0, "(function none :behavior scene-player)"],
|
||||
[1, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"forest-kill-plants": [
|
||||
[5, "(function engine-pers connection-pers object object symbol)"],
|
||||
[7, "(function engine-pers connection-pers object object symbol)"]
|
||||
],
|
||||
"forest-tasks": [
|
||||
[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)"]
|
||||
],
|
||||
"neo-wasp": [[15, "(function neo-wasp cspace transformq float float none)"]],
|
||||
"for-turret": [
|
||||
[1, "(function cspace transformq none)"],
|
||||
[2, "(function cspace transformq none)"],
|
||||
[3, "(function cspace transformq none)"],
|
||||
[4, "(function cspace transformq none)"]
|
||||
],
|
||||
"volcano-obs": [[38, "(function cspace transformq none)"]],
|
||||
"spiky-frog": [[9, "(function cspace transformq none)"]],
|
||||
"volcano-scenes": [
|
||||
[1, "(function none :behavior scene-player)"],
|
||||
[2, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"mantis": [
|
||||
[8, "(function mantis vector float int vector vector)"],
|
||||
[15, "(function mantis collide-shape-moving vector symbol)"]
|
||||
],
|
||||
"wcar-faccar": [[9, "(function handle object :behavior process)"]],
|
||||
"wasstadb-obs": [[5, "(function object)"]],
|
||||
"arena-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)"]
|
||||
],
|
||||
"traffic-engine": [
|
||||
[24, "(function traffic-find-segment-struct nav-segment none)"]
|
||||
],
|
||||
"desert-scenes": [
|
||||
[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 symbol :behavior scene-player)"]
|
||||
],
|
||||
"throne-scenes": [[0, "(function none :behavior scene-player)"]],
|
||||
"terraformer-setup": [[38, "(function object :behavior manipy)"]],
|
||||
"mined-scenes": [
|
||||
[6, "(function none :behavior scene-player)"],
|
||||
[7, "(function process-drawable vector none :behavior scene-player)"],
|
||||
[8, "(function process-drawable vector none :behavior scene-player)"]
|
||||
],
|
||||
"wasteland-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)"]
|
||||
],
|
||||
"wasdoors-scenes": [[2, "(function none :behavior scene-player)"]],
|
||||
"wasdef-manager": [
|
||||
[7, "(function process-tree object)"],
|
||||
[8, "(function process-tree object)"],
|
||||
[9, "(function process-tree object)"]
|
||||
],
|
||||
"des-burning-bush": [[37, "(function symbol)"]],
|
||||
"mh-wasp": [
|
||||
[9, "(function mh-wasp cspace float float vector vector int none)"]
|
||||
],
|
||||
"mh-bat": [
|
||||
[1, "(function cspace transformq none)"],
|
||||
[21, "(function object :behavior mh-bat)"],
|
||||
[26, "(function object :behavior mh-bat)"],
|
||||
[30, "(function object :behavior mh-bat)"],
|
||||
[34, "(function object :behavior mh-bat)"],
|
||||
[39, "(function object :behavior mh-bat)"]
|
||||
],
|
||||
"factoryc-obs2": [
|
||||
[67, "(function (pointer joint-exploder) :behavior fac-break-floor)"]
|
||||
],
|
||||
"factory-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 process-drawable 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)"]
|
||||
],
|
||||
"factory-boss-setup": [[37, "(function object :behavior manipy)"]],
|
||||
"factory-boss-scenes": [
|
||||
[1, "(function none :behavior scene-player)"],
|
||||
[2, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"bot": [[25, "(function gui-connection symbol :behavior bot)"]],
|
||||
"oasis-defense": [
|
||||
[4, "(function collide-shape-prim none)"],
|
||||
[11, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"ash-oasis-course": [
|
||||
[0, "(function ashelin-oasis object)"],
|
||||
[1, "(function ashelin-oasis object)"],
|
||||
[2, "(function asht-wait-spot ashelin-oasis object)"],
|
||||
[3, "(function ashelin-oasis symbol)"]
|
||||
],
|
||||
"comb-obs": [
|
||||
[16, "(function collide-shape-prim none)"],
|
||||
[33, "(function collide-shape-prim none)"],
|
||||
[49, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"comb-sentry": [[19, "(function collide-shape-prim none)"]],
|
||||
"comb-field": [[5, "(function symbol)"]],
|
||||
"comb-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)"]
|
||||
],
|
||||
"railx-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)"]
|
||||
],
|
||||
"title-obs": [
|
||||
[20, "(function external-art-buffer int)"],
|
||||
[22, "(function game-task object)"],
|
||||
[26, "(function vector :behavior manipy)"],
|
||||
[30, "(function object :behavior manipy)"]
|
||||
],
|
||||
"ff-squad-control": [
|
||||
[6, "(function process-focusable traffic-object-type-info none)"],
|
||||
[7, "(function process-focusable traffic-object-type-info none)"],
|
||||
[8, "(function process-focusable traffic-object-type-info none)"],
|
||||
[9, "(function crimson-guard traffic-object-type-info none)"]
|
||||
],
|
||||
"guard": [
|
||||
[31, "(function crimson-guard collide-shape vector symbol)"],
|
||||
[49, "(function process city-attacker-info int)"]
|
||||
],
|
||||
"guard-tazer": [
|
||||
[7, "(function collide-shape-prim none)"],
|
||||
[13, "(function collide-shape-prim none)"]
|
||||
],
|
||||
"roboguard-city": [
|
||||
[13, "(function cspace transformq none)"],
|
||||
[78, "(function roboguard-city symbol quaternion :behavior process)"]
|
||||
],
|
||||
"ctywide-obs": [[93, "(function symbol)"]],
|
||||
"ctywide-scenes": [
|
||||
[1, "(function none :behavior scene-player)"],
|
||||
[2, "(function none :behavior scene-player)"],
|
||||
[3, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"ctyport-obs": [[5, "(function collide-shape-prim none)"]],
|
||||
"ctyport-scenes": [
|
||||
[3, "(function none :behavior scene-player)"],
|
||||
[4, "(function none :behavior scene-player)"],
|
||||
[5, "(function none :behavior scene-player)"],
|
||||
[6, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"ctyport-attack": [[45, "(function object :behavior process)"]],
|
||||
"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)"]
|
||||
],
|
||||
"freehq-scenes": [[0, "(function none :behavior scene-player)"]],
|
||||
"hiphog-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)"]
|
||||
],
|
||||
"rubble-attack": [[7, "(function int)"]],
|
||||
"rublcst-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)"]
|
||||
],
|
||||
"vinroom-scenes": [
|
||||
[0, "(function none :behavior scene-player)"],
|
||||
[1, "(function none :behavior scene-player)"]
|
||||
],
|
||||
"gungame-manager": [[6, "(function process symbol)"]],
|
||||
"blow-tower-obs2": [
|
||||
[16, "(function bt-mh-flyer cspace float float vector vector int none)"],
|
||||
[117, "(function bt-roboguard symbol quaternion)"],
|
||||
[124, "(function cspace transformq none)"]
|
||||
],
|
||||
"cty-blow-tower": [
|
||||
[39, "(function collide-shape-prim none)"],
|
||||
[27, "(function process symbol)"],
|
||||
[46, "(function collide-shape-prim none)"],
|
||||
[69, "(function process object)"]
|
||||
],
|
||||
"assault-enemies": [
|
||||
[36, "(function assault-crimson-guard city-attacker-info int)"]
|
||||
],
|
||||
"assault-task": [[11, "(function symbol :behavior process)"]],
|
||||
"precura-obs": [[98, "(function symbol :behavior process)"]],
|
||||
"precurd-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)"]
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,785 @@
|
||||
{
|
||||
////////////////////////////
|
||||
// HACKS and ASM FUNCTIONS
|
||||
////////////////////////////
|
||||
|
||||
"types_with_bad_inspect_methods": [
|
||||
"game-task-event",
|
||||
"game-task-control",
|
||||
"predator-edge",
|
||||
"manipy",
|
||||
"process-tree",
|
||||
"vector",
|
||||
"target",
|
||||
"vehicle-load-parts"
|
||||
],
|
||||
|
||||
"no_type_analysis_functions_by_name": [],
|
||||
|
||||
// this limits the number of cases in a cond. The first argument is the name of the function.
|
||||
// the second argument is the name of the first condition in the cond. Use print_cfg to find it out.
|
||||
// The third argument is the number of cases. If you set it too small it may fail to build the CFG.
|
||||
"cond_with_else_max_lengths": [
|
||||
["(method 20 res-lump)", "b0", 2],
|
||||
["(method 11 res-lump)", "b0", 1],
|
||||
["(method 12 res-lump)", "b0", 1]
|
||||
],
|
||||
|
||||
// if a cond with an else case is being used a value in a place where it looks wrong
|
||||
// you can add the function name to this list and it will more aggressively reject this rewrite.
|
||||
"aggressively_reject_cond_to_value_rewrite": [
|
||||
"(method 10 res-lump)",
|
||||
"(method 11 res-lump)",
|
||||
"(method 12 res-lump)"
|
||||
],
|
||||
|
||||
// this provides a hint to the decompiler that these functions will have a lot of inline assembly.
|
||||
// currently it just leaves pcpyld as an asm op.
|
||||
"hint_inline_assembly_functions": [],
|
||||
|
||||
"asm_functions_by_name": [
|
||||
// checking boxed type is different now - these make the cfg stuff sad
|
||||
"name=",
|
||||
"(method 77 grenadier)",
|
||||
"display-list-control",
|
||||
"anim-test-anim-list-handler",
|
||||
"anim-test-sequence-list-handler",
|
||||
"anim-tester-get-playing-item",
|
||||
"start-pilot-recorder",
|
||||
"(anon-function 10 pilot-recorder)",
|
||||
"(anon-function 10 sig-recorder)",
|
||||
// actual asm
|
||||
"quad-copy!",
|
||||
"return-from-thread",
|
||||
"return-from-thread-dead",
|
||||
"reset-and-call",
|
||||
"(method 10 cpu-thread)",
|
||||
"(method 11 cpu-thread)",
|
||||
"(method 0 catch-frame)",
|
||||
"throw-dispatch",
|
||||
"throw",
|
||||
"run-function-in-process",
|
||||
"set-to-run-bootstrap",
|
||||
"return-from-exception",
|
||||
"exp",
|
||||
"(method 17 bounding-box)",
|
||||
"(method 9 bounding-box)",
|
||||
"(method 9 matrix)",
|
||||
"quaternion->matrix-2",
|
||||
"sin-rad",
|
||||
"cos-rad",
|
||||
"atan-series-rad",
|
||||
"sign-float",
|
||||
"dma-count-until-done",
|
||||
"(method 11 collide-mesh-cache)",
|
||||
"cpu-delay",
|
||||
"qword-read-time",
|
||||
"dma-test-func",
|
||||
"move-test-func",
|
||||
|
||||
"symlink2",
|
||||
"blerc-a-fragment",
|
||||
"blerc-execute",
|
||||
"foreground-check-longest-edge-asm",
|
||||
"generic-light-proc",
|
||||
"(method 17 collide-edge-work)",
|
||||
"(method 10 collide-cache-prim)",
|
||||
"(method 17 collide-cache)",
|
||||
"(method 16 ocean)",
|
||||
|
||||
// unknown instructions
|
||||
// logand with #f arg
|
||||
// "bugfix?",
|
||||
// CFG failed
|
||||
"draw-inline-array-instance-shrub",
|
||||
|
||||
"(method 9 editable-region)", // condition branch assert hit
|
||||
"test-to-from-spr",
|
||||
"test-from-spr",
|
||||
"test-to-spr",
|
||||
"test-seq-read",
|
||||
"test-worst-read",
|
||||
"test-seq-write",
|
||||
"test-worst-write",
|
||||
// texture
|
||||
"adgif-shader<-texture!",
|
||||
|
||||
// jak 3
|
||||
"(method 10 manipulator)",
|
||||
"(method 46 ff-squad-control)",
|
||||
"memcpy",
|
||||
|
||||
// jak x
|
||||
"get-string-length",
|
||||
"rand-uint31-gen",
|
||||
"vector-rotate-y-fast!",
|
||||
|
||||
// jak x decompiler crashes
|
||||
"(method 13 race-line)",
|
||||
"(method 23 gui-control)",
|
||||
"(method 34 sky-work)",
|
||||
"(method 35 sky-work)",
|
||||
"(method 11 collide-mesh)",
|
||||
"target-standard-event-handler",
|
||||
"display-loop-main",
|
||||
"(method 22 level)",
|
||||
"(method 11 medius-cache)",
|
||||
"water-anim-event-handler"
|
||||
],
|
||||
|
||||
// these functions use pairs and the decompiler
|
||||
// will be less picky about types related to pairs.
|
||||
"pair_functions_by_name": [
|
||||
"ref",
|
||||
"ref&",
|
||||
"(method 4 pair)",
|
||||
"last",
|
||||
"member",
|
||||
"nmember",
|
||||
"assoc",
|
||||
"assoce",
|
||||
"nassoc",
|
||||
"nassoce",
|
||||
"append!",
|
||||
"delete!",
|
||||
"delete-car!",
|
||||
"insert-cons!",
|
||||
"sort",
|
||||
"unload-package",
|
||||
"display-loop-main",
|
||||
"lookup-level-info",
|
||||
"(method 24 level-group)",
|
||||
"(method 19 level-group)",
|
||||
// script
|
||||
"command-get-time",
|
||||
"command-get-param",
|
||||
"command-get-quoted-param",
|
||||
"command-get-entity",
|
||||
"(method 9 script-context)",
|
||||
"(anon-function 6 script)",
|
||||
"(anon-function 49 script)",
|
||||
"(anon-function 52 script)",
|
||||
"(anon-function 72 script)",
|
||||
"(anon-function 73 script)",
|
||||
"(anon-function 74 script)",
|
||||
"(anon-function 75 script)",
|
||||
"(anon-function 76 script)",
|
||||
"(anon-function 80 script)",
|
||||
"(method 11 script-context)",
|
||||
"(method 10 script-context)",
|
||||
"command-get-trans",
|
||||
"key-assoc",
|
||||
"(anon-function 0 script)",
|
||||
// default-menu
|
||||
"dm-scene-load-pick-func",
|
||||
"debug-menu-make-continue-sub-menu",
|
||||
"debug-menu-make-from-template",
|
||||
"debug-menu-context-make-default-menus",
|
||||
"debug-menu-make-task-menu",
|
||||
"(method 19 gui-control)",
|
||||
// menu
|
||||
"debug-menu-rebuild",
|
||||
"debug-menu-find-from-template",
|
||||
"debug-menu-render",
|
||||
"debug-menu-context-select-next-or-prev-item",
|
||||
"debug-menu-context-select-new-item",
|
||||
"debug-menu-send-msg",
|
||||
// airlock
|
||||
"(method 24 com-airlock)",
|
||||
"(method 19 gui-control)",
|
||||
"(method 28 editable)",
|
||||
"execute-select",
|
||||
"(method 29 editable)",
|
||||
"(method 25 editable)",
|
||||
// game-info
|
||||
"(method 20 game-info)",
|
||||
"print-continues",
|
||||
// task-control
|
||||
"(anon-function 55 task-control)",
|
||||
"(method 17 load-state)",
|
||||
"(method 12 level)",
|
||||
"bg",
|
||||
"update-sound-banks",
|
||||
"entity-remap-names",
|
||||
"(method 8 process-tree)",
|
||||
"(post play-anim scene-player)",
|
||||
"(method 25 scene-player)",
|
||||
"(method 25 scene-player)",
|
||||
"scene-player-init",
|
||||
"next-continue",
|
||||
"(method 25 warp-gate)",
|
||||
"(code use warp-gate)",
|
||||
"cspace-inspect-tree",
|
||||
"(method 11 mtn-step-plat-rocks-a)",
|
||||
"(method 11 mtn-step-plat-rocks-b)",
|
||||
"(method 11 mtn-step-plat-rocks-c)",
|
||||
"(method 22 fort-floor-spike-b)",
|
||||
"prototypes-game-visible-set!",
|
||||
"(method 22 fort-floor-spike-a)",
|
||||
"(method 22 fort-floor-spike-b)",
|
||||
"(method 22 fort-floor-spike-c)",
|
||||
"(method 11 sew-catwalk)",
|
||||
"(method 11 mtn-aval-rocks)",
|
||||
"(method 11 gar-curtain)",
|
||||
"(method 10 level-load-info)",
|
||||
"(method 29 level-group)",
|
||||
"(method 26 level-group)",
|
||||
"(method 19 level)",
|
||||
"(method 10 level)",
|
||||
"update-sound-banks",
|
||||
"level-base-level-name",
|
||||
"borrow-city-expansion",
|
||||
"add-want-level",
|
||||
"level-find-borrow-slot",
|
||||
"(method 18 level)",
|
||||
"(method 11 tow-tentacle)",
|
||||
"city-sound-expand-want-list",
|
||||
"(method 12 cty-borrow-manager)",
|
||||
"(method 16 cty-borrow-manager)",
|
||||
"mark-permanent-holds",
|
||||
"update-sound-info",
|
||||
"insert-into-sound-list",
|
||||
// title-obs
|
||||
"(anon-function 22 title-obs)",
|
||||
"cty-faction-evaluate-commands",
|
||||
"traffic-manager-event-handler",
|
||||
"(method 20 cty-faction-manager)"
|
||||
],
|
||||
|
||||
// If format is used with the wrong number of arguments,
|
||||
// it will often mess up the decompilation, as the decompiler assumes
|
||||
// that they used the correct number. This will override the decompiler's
|
||||
// automatic detection.
|
||||
"bad_format_strings": {
|
||||
"~170h~5d~220h~5d~280h~5,,2f": 3,
|
||||
"~338h~5d~388h~5d~448h~5,,2f": 3,
|
||||
"~30Htf: ~8D~134Hpr: ~8D~252Hsh: ~8D~370Hhd: ~8D~%": 4,
|
||||
"~30Hal: ~8D~131Hwa: ~8D~252Hsp: ~8D~370Hwp: ~8D~%": 4,
|
||||
"ERROR: <asg> ~A in spool anim loop for ~A ~D, but not loaded.~": 3,
|
||||
// TODO - these should be automatic
|
||||
" tfrag ~192H~5DK ~280Htfragment~456H~5DK~%": 2,
|
||||
" tie-proto ~192H~5DK ~280Hsky~456H~5DK~%": 2,
|
||||
" tie-instance ~192H~5DK ~280Htie-fragment~456H~5DK~%": 2,
|
||||
" shrub-proto ~192H~5DK ~280Htie-scissor~456H~5DK~%": 2,
|
||||
" shrub-instance ~192H~5DK ~280Hshrubbery~456H~5DK~%": 2,
|
||||
" collision ~192H~5DK ~280Htie-generic~456H~5DK~%": 2,
|
||||
" pris-anim ~192H~5DK ~280Hpris-generic~456H~5DK~%": 2,
|
||||
" textures ~192H~5DK ~280Htextures~456H~5DK~%": 2,
|
||||
" misc ~192H~5DK ~280Hsprite~456H~5DK~%": 2,
|
||||
" entity ~192H~5DK~%": 1,
|
||||
" pris-geo ~192H~5DK ~280Hpris-fragment~456H~5DK~%": 2,
|
||||
"~33L~S~32L ~S": 2,
|
||||
"~32L~S ~33L~S~1L": 2,
|
||||
"~35L~S~33L ~S": 2,
|
||||
"~1L~S~35L ~S": 2,
|
||||
"~35L~S ~1L~S~1L": 2,
|
||||
"~33L~S~35L ~S": 2,
|
||||
"~33L~C~34L~S~33L~C": 3,
|
||||
"~35L~S ~33L~S~1L": 2,
|
||||
"~33L~S ~35L~S~1L": 2,
|
||||
"~33L~C": 1,
|
||||
"~33L~S~44L ~S": 2,
|
||||
"~44L~S ~33L~S": 2,
|
||||
"~10Htfrag: ~8,,0m": 1,
|
||||
"~140Hshrub: ~8,,0m": 1,
|
||||
"~272Halpha: ~8,,0m~%": 1,
|
||||
"~27Htie: ~8,,0m": 1,
|
||||
"~140Hfg-tf: ~8,,0m": 1,
|
||||
"~270Hfg-pr: ~8,,0m~%": 1,
|
||||
"~10Hfg-wa: ~8,,0m": 1,
|
||||
"~140Hfg-sh: ~8,,0m": 1,
|
||||
"~267Hfg-p2: ~8,,0m~%": 1,
|
||||
"~30Hp2: ~8D~131Hhf: ~8D~%~1K": 2,
|
||||
"Current time (~d:~d) [mission-percentage ~f~%": 2,
|
||||
"~0K~Name~130HID~+50HVol~+15HPitch~+24HPan~+18HEar~+24HDist~%": 1,
|
||||
"~130H~5D ~4D ~5D ~4D ~3D ~5,,0M~%": 5
|
||||
},
|
||||
|
||||
"blocks_ending_in_asm_branch": {
|
||||
"light-merge!": [1, 2, 3, 5, 7],
|
||||
"bsp-camera-asm": [1, 2, 3, 4, 6, 7],
|
||||
"level-remap-texture": [2, 3, 4, 5, 6],
|
||||
"start-perf-stat-collection": [26],
|
||||
"end-perf-stat-collection": [0],
|
||||
|
||||
"(method 23 gui-control)": [10, 46, 50, 58, 81, 90, 101],
|
||||
|
||||
"find-offending-process-focusable": [16, 19],
|
||||
"(method 19 process-drawable)": [0, 2, 3, 7, 10, 11, 30],
|
||||
"(anon-function 11 game-save)": [0, 3, 4, 5],
|
||||
"(anon-function 3 game-save)": [15, 16],
|
||||
"(anon-function 12 lightjak-wings)": [2, 3],
|
||||
"target-standard-event-handler": [
|
||||
5, 6, 7, 20, 64, 65, 66, 67, 72, 73, 83, 84, 85, 86, 87, 88, 96, 97, 109,
|
||||
264, 265, 282, 283, 284, 290, 291, 306, 336, 350, 351, 412, 415, 427
|
||||
],
|
||||
"(method 9 curve-color-fast)": [0, 1],
|
||||
"evaluate-color-curve-fast": [0, 1],
|
||||
"(anon-function 0 target-death)": [71, 131, 132, 137],
|
||||
"target-board-handler": [15, 16, 20],
|
||||
"sprite-draw-distorters": [4, 5],
|
||||
"(method 10 simple-sprite-system)": [0],
|
||||
"add-debug-box-with-transform": [0, 3],
|
||||
"add-debug-line-sphere": [0],
|
||||
"bones-mtx-calc-execute": [19, 7],
|
||||
"foreground-draw": [0, 1, 126],
|
||||
"unpack-comp-rle": [1, 3, 5, 6],
|
||||
"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, // branch fwd 39
|
||||
39, // branch fwd no delay
|
||||
43, // goto 18
|
||||
45 // goto 6
|
||||
],
|
||||
"(method 16 level)": [0, 1, 5, 13, 14, 15],
|
||||
"upload-vis-bits": [2, 6, 3, 0],
|
||||
"set-background-regs!": [4, 3],
|
||||
"draw-drawable-tree-instance-shrub": [5, 7, 9, 11],
|
||||
"draw-drawable-tree-instance-tie": [21, 23, 31, 33],
|
||||
"(method 12 flow-control)": [3, 9, 22],
|
||||
"(method 26 level-group)": [40, 41, 67],
|
||||
"borrow-city-expansion": [0, 9, 13, 15, 17],
|
||||
"dma-add-process-drawable": [0, 77],
|
||||
"real-main-draw-hook": [120, 122],
|
||||
"display-frame-finish": [61],
|
||||
"display-loop-main": [130],
|
||||
"(method 63 collide-shape-moving)": [1, 2, 14, 49],
|
||||
"(method 67 collide-shape-moving)": [2, 3, 13],
|
||||
"(method 51 rigid-body-object)": [5],
|
||||
"(anon-function 2 rigid-body-queue)": [0, 2],
|
||||
"(method 15 rigid-body-queue)": [5, 6, 7, 9],
|
||||
"(method 13 rigid-body-queue)": [5, 6, 7, 9],
|
||||
"(method 11 rigid-body-queue)": [0, 6, 7, 9],
|
||||
"(method 10 rigid-body-queue)": [10, 34, 37],
|
||||
"(method 9 los-control)": [0, 43],
|
||||
"load-game-text-info": [19, 20, 21],
|
||||
"draw-actor-marks": [8],
|
||||
"find-nearest-entity": [7, 9],
|
||||
"(method 13 collide-cache)": [7, 9],
|
||||
"(method 11 collide-mesh)": [2, 4],
|
||||
"(method 12 collide-mesh-cache)": [0, 1, 2, 3, 4, 5],
|
||||
"(method 10 collide-mesh)": [2],
|
||||
"(method 42 collide-shape)": [0, 1, 2, 3, 4, 7],
|
||||
"(method 18 collide-shape-prim-mesh)": [2, 3, 4, 5, 6, 7],
|
||||
"(method 18 collide-shape-prim-sphere)": [2, 3, 4],
|
||||
"(method 15 collide-shape-prim-sphere)": [1, 2, 3, 4, 5, 6],
|
||||
"(method 16 collide-shape-prim-sphere)": [0, 1, 2, 3, 4],
|
||||
"(method 36 collide-shape)": [8, 9],
|
||||
"(method 45 collide-shape)": [33],
|
||||
"(method 40 collide-shape)": [
|
||||
0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
|
||||
22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
|
||||
],
|
||||
"(method 12 collide-shape-prim-group)": [1, 2, 3, 4, 5, 6],
|
||||
"(method 13 collide-shape-prim)": [1, 2, 3, 4, 5, 6],
|
||||
"(method 12 collide-shape-prim-sphere)": [
|
||||
1, 2, 3, 4, 5, 8, 10, 11, 13, 14, 15
|
||||
],
|
||||
"(method 12 collide-shape-prim-mesh)": [
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 15, 16
|
||||
],
|
||||
"update-actor-hash": [0, 2, 4],
|
||||
"(method 24 grid-hash)": [39, 35, 22, 15],
|
||||
"(anon-function 4 gun-states)": [
|
||||
18, 128, 129, 131, 133, 135, 138, 139, 143
|
||||
],
|
||||
"(method 16 sparticle-launch-control)": [25, 35, 36, 48, 62, 65, 100, 102],
|
||||
"(anon-function 17 target-ladder)": [0, 1],
|
||||
"command-get-process": [46],
|
||||
"foreground-draw-hud": [0, 7, 8, 9, 16, 22],
|
||||
"target-flut-falling-anim-trans": [8, 9],
|
||||
"(method 12 nav-mesh)": [0, 1, 2, 9],
|
||||
"(method 20 nav-mesh)": [9],
|
||||
"(method 21 nav-mesh)": [7],
|
||||
"(method 29 nav-mesh)": [0, 1, 2, 4],
|
||||
"(method 33 nav-mesh)": [10, 11, 12, 13],
|
||||
"(method 34 nav-mesh)": [0, 1, 2, 4],
|
||||
"(method 35 nav-mesh)": [0, 1, 2, 4],
|
||||
"(method 36 nav-mesh)": [1, 2],
|
||||
"(method 37 nav-mesh)": [4],
|
||||
"(method 45 nav-mesh)": [1, 2],
|
||||
"(method 46 nav-mesh)": [1, 2, 19, 20],
|
||||
"(method 48 nav-mesh)": [4, 5, 6, 8],
|
||||
"(method 49 nav-mesh)": [0, 1, 2, 3, 5],
|
||||
"(method 18 nav-control)": [11, 12, 19, 20, 31, 34],
|
||||
"(method 19 nav-control)": [9, 10],
|
||||
"(method 40 nav-state)": [1, 2],
|
||||
"point-poly-distance-min": [0, 1, 2, 3, 4, 5, 6, 7, 10],
|
||||
"find-closest-circle-ray-intersection": [0, 4, 15, 16, 17, 18],
|
||||
"(method 39 vehicle)": [0, 10, 12, 15],
|
||||
"(anon-function 7 vehicle-states)": [0, 2],
|
||||
"(method 11 vehicle-hud-requests)": [0, 6, 7, 10],
|
||||
"(anon-function 12 neo-juicer)": [29, 30],
|
||||
"(method 160 neo-grenadier)": [1, 2, 3],
|
||||
"(method 82 spydroid-orig)": [13],
|
||||
"(method 118 vehicle)": [3, 4, 7, 8, 9, 10, 17, 26, 30, 31, 33],
|
||||
"(method 25 squad-control)": [0, 4, 5, 7],
|
||||
"target-pilot-post": [0, 29],
|
||||
"(method 36 was-squad-control)": [0, 8, 14, 16],
|
||||
"(anon-function 6 nst-tasks)": [4, 9, 10, 16, 23, 30],
|
||||
"(method 33 task-manager-nest-cocoons)": [3, 7, 13, 28],
|
||||
"(method 90 wvehicle)": [29, 37, 38, 44],
|
||||
"(anon-function 2 artifact-race)": [40, 55, 56, 57, 65, 66],
|
||||
"(anon-function 27 course-race)": [6],
|
||||
"(anon-function 65 temple-obs)": [5, 6],
|
||||
"(anon-function 5 target-turret)": [0, 1, 2, 3],
|
||||
"dp-bipedal-consider-attacks": [15, 19],
|
||||
"(anon-function 25 volcanox-obs)": [3, 5, 6],
|
||||
"(method 36 task-manager-arena-fight-base)": [11],
|
||||
"(method 28 hud-wasgun)": [0, 1, 2, 4],
|
||||
"(method 15 hud-wasgun)": [8, 28, 29, 30, 54],
|
||||
"(method 15 vehicle-controller)": [0, 3, 5, 6, 7, 10],
|
||||
"(method 51 hvehicle)": [5],
|
||||
"(method 159 hvehicle)": [0, 1, 10, 19, 21, 23, 26],
|
||||
"(method 18 vehicle-controller)": [0, 1, 74, 75],
|
||||
"glider-too-low?": [2, 19, 21],
|
||||
"(method 39 task-manager-desert-glide)": [0, 3, 4, 9],
|
||||
"(method 36 task-manager-desert-glide)": [20, 50, 60],
|
||||
"(method 37 task-manager-desert-glide)": [11, 12, 23, 29, 31],
|
||||
"(method 34 task-manager-desert-glide)": [3],
|
||||
"(anon-function 20 target-flut)": [0, 38, 39],
|
||||
"(anon-function 14 flut-racer)": [7, 17, 19],
|
||||
"(method 28 conveyor)": [22],
|
||||
"generic-merc-execute-all": [7, 15],
|
||||
"check-enemy": [0, 1],
|
||||
"(method 91 h-warf)": [0],
|
||||
"(method 51 h-warf)": [5],
|
||||
"(method 44 nav-graph)": [0, 7, 8, 26, 34],
|
||||
"(method 15 city-level-info)": [0, 1, 2, 6, 7, 9, 11, 13],
|
||||
"(method 10 traffic-suppressor)": [0, 1, 2, 4],
|
||||
"(method 18 traffic-tracker)": [5, 6, 7, 8],
|
||||
"(method 21 traffic-tracker)": [0],
|
||||
"(method 9 cty-faction-manager)": [8],
|
||||
"(method 46 traffic-engine)": [0, 1, 2, 4],
|
||||
"(method 42 traffic-engine)": [6],
|
||||
"(method 17 traffic-manager)": [7, 19, 27, 28, 29, 30, 41],
|
||||
"(anon-function 10 guard-rifle)": [9],
|
||||
"(method 261 crimson-guard)": [52, 64],
|
||||
"(anon-function 13 metalhead-predator)": [24, 25],
|
||||
"(anon-function 90 ctywide-obs)": [4],
|
||||
"(anon-function 10 cty-sniper-turret)": [44],
|
||||
"(method 33 rub-tower)": [9, 10],
|
||||
"(method 30 gungame-manager)": [0, 4, 5, 7],
|
||||
"closest-pt-in-triangle": [17],
|
||||
|
||||
"find-knot-span": [0, 1, 2, 3, 5, 6, 7, 8, 9],
|
||||
"curve-evaluate!": [0, 2, 5, 6, 7, 8, 9],
|
||||
"circle-circle-xz-intersect": [
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
|
||||
]
|
||||
},
|
||||
|
||||
// Sometimes the game might use format strings that are fetched dynamically,
|
||||
// for example using the game text lookup method
|
||||
// Add information about those format instructions here.
|
||||
// e.g. "function-name":[[op, argc], [op, argc], ...]
|
||||
// where "op" is the op number for the call to format.
|
||||
"dynamic_format_arg_counts": {
|
||||
"auto-save-post": [[182, 1]],
|
||||
"(method 10 menu-secret-option)": [[289, 1]],
|
||||
"(method 10 menu-create-game-option)": [[49, 1]],
|
||||
"(method 10 menu-format-card-option)": [[49, 1]],
|
||||
"(method 10 menu-card-removed-option)": [[49, 1]],
|
||||
"(method 10 menu-insert-card-option)": [[49, 1]],
|
||||
"(method 10 menu-hero-mode-message-option)": [[50, 1]],
|
||||
"(method 10 menu-secrets-insufficient-space-option)": [[51, 1]],
|
||||
"(method 10 menu-error-loading-option)": [
|
||||
[65, 1],
|
||||
[100, 1]
|
||||
],
|
||||
"(method 10 menu-insufficient-space-option)": [
|
||||
[72, 1],
|
||||
[112, 1]
|
||||
],
|
||||
"(method 10 menu-error-auto-saving-option)": [[73, 1]],
|
||||
"(method 10 menu-loading-option)": [[113, 1]],
|
||||
"(method 10 menu-icon-info-option)": [[150, 1]],
|
||||
"(method 17 hud-goal)": [[71, 0]],
|
||||
"(method 17 hud-miss)": [[71, 0]],
|
||||
"(method 16 resetter)": [
|
||||
[68, 1],
|
||||
[101, 1],
|
||||
[130, 1]
|
||||
],
|
||||
"(method 32 task-manager-desert-turtle-training)": [[59, 1]],
|
||||
"(method 24 race-manager)": [[97, 1]],
|
||||
"(method 25 race-manager)": [
|
||||
[97, 1],
|
||||
[126, 1]
|
||||
],
|
||||
"(method 15 hud-race-final-stats)": [[131, 0]],
|
||||
"(method 15 hud-wasbbv-goal-time)": [[74, 0]],
|
||||
"(method 32 task-manager-lightjak-training)": [[53, 0]],
|
||||
"(method 18 hover-training-manager)": [[69, 0]],
|
||||
"(method 37 task-manager-arena-training)": [[67, 1]],
|
||||
"(method 15 hud-arena-final-stats)": [
|
||||
[103, 0],
|
||||
[147, 0]
|
||||
],
|
||||
"(method 35 task-manager-arena-fight-base)": [[53, 0]],
|
||||
"(method 32 task-manager-arena-gun-training)": [[53, 0]],
|
||||
"(method 26 task-manager-arena-fight-2)": [
|
||||
[72, 0],
|
||||
[186, 0]
|
||||
],
|
||||
"(method 37 task-manager-wascity-gungame)": [
|
||||
[48, 0],
|
||||
[78, 0],
|
||||
[119, 0],
|
||||
[157, 0],
|
||||
[195, 0],
|
||||
[227, 0],
|
||||
[268, 0],
|
||||
[306, 0],
|
||||
[338, 0],
|
||||
[379, 0],
|
||||
[411, 0],
|
||||
[446, 0]
|
||||
],
|
||||
"(method 30 was-pre-game)": [
|
||||
[184, 0],
|
||||
[276, 0]
|
||||
],
|
||||
"(method 32 task-manager-throne-gun-training)": [[53, 0]],
|
||||
"(method 17 hud-spider-killed)": [[71, 0]],
|
||||
"(trans idle des-burning-bush)": [
|
||||
[226, 1],
|
||||
[257, 0]
|
||||
],
|
||||
"(method 37 des-burning-bush)": [
|
||||
[278, 0],
|
||||
[336, 0]
|
||||
],
|
||||
"(method 38 des-burning-bush)": [
|
||||
[109, 0],
|
||||
[153, 0],
|
||||
[196, 0]
|
||||
],
|
||||
"(method 15 freeze-time-hud)": [[108, 0]],
|
||||
"(method 17 freeze-time-hud)": [[97, 0]],
|
||||
"(method 15 hud-wasbbv-score)": [[61, 0]],
|
||||
"(method 15 hud-wasbbv-goal)": [[64, 0]],
|
||||
"(method 32 task-manager-dark-punch-training)": [[53, 0]],
|
||||
"(method 32 task-manager-lightjak-training-shield)": [[53, 0]],
|
||||
"(trans credits highres-viewer-manager)": [[185, 0]],
|
||||
"(trans idle hirez-viewer)": [[356, 0]],
|
||||
"(trans idle burning-bush)": [
|
||||
[171, 1],
|
||||
[202, 0]
|
||||
],
|
||||
"(method 33 task-manager-bbush-board)": [[86, 0]],
|
||||
"(method 17 board-score-hud)": [[71, 0]],
|
||||
"(method 23 gungame-manager)": [
|
||||
[52, 0],
|
||||
[90, 0],
|
||||
[128, 0],
|
||||
[164, 0],
|
||||
[194, 0],
|
||||
[235, 0],
|
||||
[273, 0],
|
||||
[305, 0],
|
||||
[346, 0],
|
||||
[378, 0],
|
||||
[413, 0]
|
||||
],
|
||||
"(trans carry precur-bomb)": [[60, 0]]
|
||||
},
|
||||
|
||||
"mips2c_functions_by_name": [
|
||||
"collide-do-primitives",
|
||||
"moving-sphere-triangle-intersect",
|
||||
"calc-animation-from-spr",
|
||||
"draw-string-asm",
|
||||
// "draw-string",
|
||||
// "get-string-length",
|
||||
"adgif-shader<-texture-with-update!",
|
||||
"init-boundary-regs",
|
||||
"draw-boundary-polygon",
|
||||
"render-boundary-quad",
|
||||
"render-boundary-tri",
|
||||
"clip-polygon-against-negative-hyperplane",
|
||||
"clip-polygon-against-positive-hyperplane",
|
||||
"sp-init-fields!",
|
||||
"particle-adgif",
|
||||
"sp-launch-particles-var",
|
||||
"sparticle-motion-blur",
|
||||
"sp-process-block-2d",
|
||||
"sp-process-block-3d",
|
||||
"set-tex-offset",
|
||||
"draw-large-polygon",
|
||||
"render-sky-quad",
|
||||
"render-sky-tri",
|
||||
"(method 17 sky-work)",
|
||||
"(method 18 sky-work)",
|
||||
"(method 32 sky-work)",
|
||||
"(method 31 sky-work)",
|
||||
"(method 29 sky-work)",
|
||||
"(method 30 sky-work)",
|
||||
// "(method 34 sky-work)",
|
||||
// "(method 35 sky-work)",
|
||||
"(method 11 collide-hash)",
|
||||
"(method 12 collide-hash)",
|
||||
"fill-bg-using-box-new",
|
||||
"fill-bg-using-line-sphere-new",
|
||||
"(method 12 collide-mesh)",
|
||||
"(method 14 collide-mesh)",
|
||||
"(method 15 collide-mesh)",
|
||||
"(method 10 collide-edge-hold-list)",
|
||||
"(method 19 collide-edge-work)",
|
||||
"(method 9 edge-grab-info)",
|
||||
"(method 16 collide-edge-work)",
|
||||
"(method 17 collide-edge-work)",
|
||||
"(method 18 collide-edge-work)",
|
||||
"draw-large-polygon-ocean",
|
||||
"render-ocean-quad",
|
||||
"init-ocean-far-regs",
|
||||
"(method 14 ocean)",
|
||||
"(method 15 ocean)",
|
||||
"(method 16 ocean)",
|
||||
"(method 18 grid-hash)",
|
||||
"(method 19 grid-hash)",
|
||||
"(method 20 grid-hash)",
|
||||
"(method 22 grid-hash)",
|
||||
"(method 28 sphere-hash)",
|
||||
"(method 33 sphere-hash)",
|
||||
"(method 29 sphere-hash)",
|
||||
"(method 30 sphere-hash)",
|
||||
"(method 31 sphere-hash)",
|
||||
"(method 32 sphere-hash)",
|
||||
"(method 32 spatial-hash)",
|
||||
"(method 34 spatial-hash)",
|
||||
"(method 35 spatial-hash)",
|
||||
"(method 36 spatial-hash)",
|
||||
"(method 38 spatial-hash)",
|
||||
"(method 10 collide-shape-prim-mesh)",
|
||||
"(method 10 collide-shape-prim-sphere)",
|
||||
"(method 10 collide-shape-prim-group)",
|
||||
"(method 11 collide-shape-prim-mesh)",
|
||||
"(method 11 collide-shape-prim-sphere)",
|
||||
"(method 11 collide-shape-prim-group)",
|
||||
"(method 9 collide-cache-prim)",
|
||||
"(method 10 collide-cache-prim)",
|
||||
"(method 17 collide-cache)",
|
||||
"(method 9 collide-puss-work)",
|
||||
"(method 10 collide-puss-work)",
|
||||
"bones-mtx-calc",
|
||||
"foreground-check-longest-edge-asm",
|
||||
"foreground-merc",
|
||||
"add-light-sphere-to-light-group",
|
||||
"light-hash-add-items",
|
||||
"light-hash-count-items",
|
||||
"light-hash-get-bucket-index",
|
||||
// nav-mesh / nav-control related
|
||||
// TODO - it would be nice to eventually figure out the asm blocks for the majority of these
|
||||
"nav-state-patch-pointers",
|
||||
"(method 20 nav-engine)",
|
||||
// "find-closest-circle-ray-intersection",
|
||||
// "(method 18 nav-control)",
|
||||
"nav-dma-send-to-spr-no-flush",
|
||||
"nav-dma-send-from-spr-no-flush",
|
||||
"(method 17 nav-engine)",
|
||||
"(method 18 nav-engine)",
|
||||
"(method 21 nav-engine)",
|
||||
"(method 39 nav-state)",
|
||||
"setup-blerc-chains-for-one-fragment",
|
||||
"blerc-execute",
|
||||
"ripple-create-wave-table",
|
||||
"ripple-execute-init",
|
||||
"ripple-apply-wave-table",
|
||||
"ripple-matrix-scale",
|
||||
"(method 53 squid)",
|
||||
"init-vortex-regs",
|
||||
"render-vortex-quad",
|
||||
"draw-large-polygon-vortex",
|
||||
"foreground-generic-merc",
|
||||
"generic-merc-init-asm",
|
||||
"mercneric-convert",
|
||||
"high-speed-reject",
|
||||
"generic-translucent",
|
||||
"generic-merc-query",
|
||||
"generic-merc-death",
|
||||
"generic-merc-execute-asm",
|
||||
"generic-merc-do-chain",
|
||||
"generic-light-proc",
|
||||
"generic-envmap-proc",
|
||||
"generic-prepare-dma-double",
|
||||
"generic-prepare-dma-single",
|
||||
"generic-warp-source-proc",
|
||||
"generic-warp-dest-proc",
|
||||
"generic-warp-dest",
|
||||
"generic-warp-envmap-dest",
|
||||
"generic-no-light-proc",
|
||||
"(method 21 cloth-system)",
|
||||
"debug-line-clip?",
|
||||
"(method 9 font-work)",
|
||||
"live-func-curve",
|
||||
"birth-func-curve",
|
||||
"sparticle-motion-blur-dirt",
|
||||
"foreground-draw-hud",
|
||||
"shadow-execute",
|
||||
"shadow-add-double-edges",
|
||||
"shadow-add-single-edges",
|
||||
"shadow-add-facing-single-tris",
|
||||
"shadow-add-double-tris",
|
||||
"shadow-xform-verts",
|
||||
"shadow-calc-dual-verts",
|
||||
"shadow-scissor-edges",
|
||||
"shadow-scissor-top",
|
||||
"shadow-init-vars",
|
||||
"shadow-find-facing-single-tris",
|
||||
"shadow-find-single-edges",
|
||||
"shadow-find-facing-double-tris",
|
||||
"shadow-find-double-edges",
|
||||
"shadow-add-verts",
|
||||
"shadow-add-single-tris"
|
||||
],
|
||||
|
||||
"mips2c_jump_table_functions": {},
|
||||
|
||||
// there are some missing textures. I don't know what the game actually does here.
|
||||
// the format for entries is [level, tpage, index]
|
||||
"missing_textures": [
|
||||
["lfac", 0, 0],
|
||||
["ltow", 0, 0],
|
||||
["lcit", 0, 0],
|
||||
["pow", 0, 0],
|
||||
["wasintro", 0, 0],
|
||||
["lfacctyb", 0, 0],
|
||||
["intpfall", 0, 0],
|
||||
["lfaccity", 0, 0],
|
||||
["ltowcity", 0, 0],
|
||||
["powergd", 0, 0],
|
||||
["lcitysml", 0, 0]
|
||||
],
|
||||
|
||||
// some object files have garbage pad data at the end which makes the decompiler
|
||||
// assume they must be different files, such as the art group for orb-cache-top.
|
||||
// this just suppresses a message.
|
||||
"expected_merged_objs": []
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
// This overrides the stack size for calls to stack-size-set! in given functions.
|
||||
{
|
||||
// NOTE: almost all of these were just copy pasted from jak2
|
||||
// so it's impossible to know which are actually needed for jakx...
|
||||
// commenting out incase there's something here actually needed
|
||||
|
||||
"(method 29 target)": 2048,
|
||||
"(method 11 part-spawner)": 64,
|
||||
"(method 11 elevator)": 1024,
|
||||
"scene-player-init": 1024,
|
||||
"task-manager-init-by-other": 2048,
|
||||
"race-manager-init-by-other": 1024,
|
||||
"neo-sat-shield-init-by-other": 64,
|
||||
"bt-gun-manager-init-by-other": 256
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -23,6 +23,7 @@ StrFileReader::StrFileReader(const fs::path& file_path, GameVersion version) : m
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
init_jak2(file_path);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -45,7 +45,8 @@ DirTpageResult process_dir_tpages(ObjectFileData& data) {
|
||||
word_idx++;
|
||||
}
|
||||
|
||||
if (data.linked_data.version != GameVersion::Jak3) {
|
||||
if (data.linked_data.version != GameVersion::Jak3 &&
|
||||
data.linked_data.version != GameVersion::JakX) {
|
||||
word_idx = ((word_idx + 3) / 4) * 4;
|
||||
}
|
||||
ASSERT(word_idx == (int)words.size());
|
||||
|
||||
+206
-44
@@ -8,6 +8,7 @@
|
||||
#include "game_subs.h"
|
||||
|
||||
#include "common/goos/Reader.h"
|
||||
#include "common/log/log.h"
|
||||
#include "common/util/BitUtils.h"
|
||||
#include "common/util/font/font_utils.h"
|
||||
#include "common/util/font/font_utils_korean.h"
|
||||
@@ -43,6 +44,8 @@ bool word_is_type(const LinkedWord& word, const std::string& type_name) {
|
||||
} // namespace
|
||||
|
||||
/*
|
||||
Jak 3:
|
||||
|
||||
(deftype game-text (structure)
|
||||
((id uint32 :offset-assert 0)
|
||||
(text basic :offset-assert 4)
|
||||
@@ -56,6 +59,25 @@ bool word_is_type(const LinkedWord& word, const std::string& type_name) {
|
||||
(data game-text :dynamic :offset-assert 16)
|
||||
)
|
||||
)
|
||||
|
||||
Jak X:
|
||||
|
||||
(deftype game-text (structure)
|
||||
((id text-id :offset-assert 0)
|
||||
(index uint32 :offset-assert 4)
|
||||
)
|
||||
)
|
||||
|
||||
(deftype game-text-info (basic)
|
||||
((length int32 :offset-assert 4)
|
||||
(language-id int32 :offset-assert 8)
|
||||
(group-name string :offset-assert 12)
|
||||
(dic-index (pointer uint32) :offset-assert 16)
|
||||
(dic-data (pointer uint8) :offset-assert 20)
|
||||
(text (pointer game-text) :offset-assert 24)
|
||||
(text-data (pointer uint8) :offset-assert 28)
|
||||
)
|
||||
)
|
||||
*/
|
||||
|
||||
GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version) {
|
||||
@@ -86,65 +108,205 @@ GameTextResult process_game_text(ObjectFileData& data, GameTextVersion version)
|
||||
read_words.at(offset)++;
|
||||
auto group_label = get_label(data, words.at(offset++));
|
||||
auto group_name = data.linked_data.get_goal_string_by_label(group_label);
|
||||
ASSERT(group_name == "common");
|
||||
if (version == GameTextVersion::JAKX) {
|
||||
ASSERT(group_name == "common" || group_name == "subtitles");
|
||||
} else {
|
||||
ASSERT(group_name == "common");
|
||||
}
|
||||
// remember that we read these bytes
|
||||
auto group_start = (group_label.offset / 4) - 1;
|
||||
for (int j = 0; j < align16(8 + 1 + (int)group_name.length()) / 4; j++) {
|
||||
for (int j = 0;
|
||||
j < align16(8 + 1 + (int)group_name.length()) / 4 && (group_start + j) < read_words.size();
|
||||
j++) {
|
||||
read_words.at(group_start + j)++;
|
||||
}
|
||||
|
||||
// read each text...
|
||||
for (u32 i = 0; i < text_count; i++) {
|
||||
// id number
|
||||
read_words.at(offset)++;
|
||||
auto text_id = get_word<u32>(words.at(offset++));
|
||||
if (version != GameTextVersion::JAKX) {
|
||||
// read each text...
|
||||
for (u32 i = 0; i < text_count; i++) {
|
||||
// id number
|
||||
read_words.at(offset)++;
|
||||
auto text_id = get_word<u32>(words.at(offset++));
|
||||
|
||||
// label to string
|
||||
read_words.at(offset)++;
|
||||
auto text_label = get_label(data, words.at(offset++));
|
||||
// label to string
|
||||
read_words.at(offset)++;
|
||||
auto text_label = get_label(data, words.at(offset++));
|
||||
|
||||
// actual string
|
||||
auto text = data.linked_data.get_goal_string_by_label(text_label);
|
||||
result.total_text++;
|
||||
result.total_chars += text.length();
|
||||
// actual string
|
||||
auto text = data.linked_data.get_goal_string_by_label(text_label);
|
||||
result.total_text++;
|
||||
result.total_chars += text.length();
|
||||
|
||||
// no duplicate ids
|
||||
if (result.text.find(text_id) != result.text.end()) {
|
||||
ASSERT(false);
|
||||
// no duplicate ids
|
||||
if (result.text.find(text_id) != result.text.end()) {
|
||||
ASSERT(false);
|
||||
}
|
||||
|
||||
// escape characters
|
||||
if (get_font_bank(version)->is_language_id_korean(language)) {
|
||||
// If we are doing korean, we process it differently
|
||||
result.text[text_id] = get_font_bank(version)->convert_korean_game_to_utf8(text.c_str());
|
||||
} else if (font_bank_exists(version)) {
|
||||
result.text[text_id] = get_font_bank(version)->convert_game_to_utf8(text.c_str());
|
||||
} else {
|
||||
result.text[text_id] = goos::get_readable_string(text.c_str()); // HACK!
|
||||
}
|
||||
|
||||
// remember what we read (-1 for the type tag)
|
||||
auto string_start = (text_label.offset / 4) - 1;
|
||||
// 8 for type tag and length fields, 1 for null char.
|
||||
for (int j = 0, m = align16(8 + 1 + (int)text.length()) / 4;
|
||||
j < m && string_start + j < (int)read_words.size(); j++) {
|
||||
read_words.at(string_start + j)++;
|
||||
}
|
||||
}
|
||||
|
||||
// escape characters
|
||||
if (get_font_bank(version)->is_language_id_korean(language)) {
|
||||
// If we are doing korean, we process it differently
|
||||
result.text[text_id] = get_font_bank(version)->convert_korean_game_to_utf8(text.c_str());
|
||||
} else if (font_bank_exists(version)) {
|
||||
result.text[text_id] = get_font_bank(version)->convert_game_to_utf8(text.c_str());
|
||||
} else {
|
||||
result.text[text_id] = goos::get_readable_string(text.c_str()); // HACK!
|
||||
// alignment to the string section.
|
||||
while (offset & 3) {
|
||||
read_words.at(offset)++;
|
||||
offset++;
|
||||
}
|
||||
|
||||
// remember what we read (-1 for the type tag)
|
||||
auto string_start = (text_label.offset / 4) - 1;
|
||||
// 8 for type tag and length fields, 1 for null char.
|
||||
for (int j = 0, m = align16(8 + 1 + (int)text.length()) / 4;
|
||||
j < m && string_start + j < (int)read_words.size(); j++) {
|
||||
read_words.at(string_start + j)++;
|
||||
// make sure we read each thing at least once.
|
||||
// reading more than once is ok, some text is duplicated.
|
||||
for (int i = 0; i < int(words.size()); i++) {
|
||||
if (read_words[i] < 1) {
|
||||
std::string debug;
|
||||
data.linked_data.append_word_to_string(debug, words.at(i));
|
||||
ASSERT_MSG(false, fmt::format("[{}] {} 0x{}", i, int(read_words[i]), debug.c_str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// alignment to the string section.
|
||||
while (offset & 3) {
|
||||
} else {
|
||||
// dic-index field
|
||||
read_words.at(offset)++;
|
||||
offset++;
|
||||
}
|
||||
auto dic_index = get_label(data, words.at(offset++));
|
||||
|
||||
// make sure we read each thing at least once.
|
||||
// reading more than once is ok, some text is duplicated.
|
||||
for (int i = 0; i < int(words.size()); i++) {
|
||||
if (read_words[i] < 1) {
|
||||
std::string debug;
|
||||
data.linked_data.append_word_to_string(debug, words.at(i));
|
||||
ASSERT_MSG(false, fmt::format("[{}] {} 0x{}", i, int(read_words[i]), debug.c_str()));
|
||||
// dic-data field
|
||||
read_words.at(offset)++;
|
||||
auto dic_data = get_label(data, words.at(offset++));
|
||||
|
||||
// text field
|
||||
read_words.at(offset)++;
|
||||
auto game_texts = get_label(data, words.at(offset++));
|
||||
|
||||
// text-data field
|
||||
read_words.at(offset)++;
|
||||
auto text_data = get_label(data, words.at(offset++));
|
||||
|
||||
for (u32 i = 0; i < text_count; i++) {
|
||||
// id number
|
||||
read_words.at(game_texts.offset / 4 + i * 2)++;
|
||||
auto id = get_word<u32>(words.at(game_texts.offset / 4 + i * 2));
|
||||
|
||||
if (result.text.find(id) != result.text.end()) {
|
||||
ASSERT(false);
|
||||
}
|
||||
|
||||
// index within text-data
|
||||
read_words.at(game_texts.offset / 4 + i * 2 - 1)++;
|
||||
auto index = get_word<u32>(words.at(game_texts.offset / 4 + i * 2 + 1));
|
||||
|
||||
result.total_text++;
|
||||
|
||||
std::string text;
|
||||
|
||||
u32 text_offset = text_data.offset + index;
|
||||
|
||||
// number of dictionary elements
|
||||
read_words.at(text_offset / 4)++;
|
||||
u32 entries = data.data.at(text_offset++ + 0x80);
|
||||
|
||||
auto flag = entries & 128;
|
||||
entries = 127 & entries;
|
||||
|
||||
if (entries == 127) {
|
||||
u32 add;
|
||||
do {
|
||||
read_words.at(text_offset / 4)++;
|
||||
add = data.data.at(text_offset++ + 0x80);
|
||||
entries += add;
|
||||
} while (add == 255);
|
||||
}
|
||||
|
||||
for (u32 j = 0; j < entries; j++) {
|
||||
u32 idx;
|
||||
|
||||
if (flag) {
|
||||
u32 low_address = text_offset + j * 2;
|
||||
u32 high_address = text_offset + j * 2 + 1;
|
||||
|
||||
read_words.at(low_address / 4)++;
|
||||
read_words.at(high_address / 4)++;
|
||||
|
||||
idx = data.data.at(low_address + 0x80) + data.data.at(high_address + 0x80) * 256;
|
||||
} else {
|
||||
read_words.at((text_offset + j) / 4)++;
|
||||
idx = data.data.at(text_offset + j + 0x80);
|
||||
}
|
||||
|
||||
read_words.at(dic_index.offset / 4 + idx)++;
|
||||
auto d_idx = get_word<u32>(words.at(dic_index.offset / 4 + idx));
|
||||
|
||||
read_words.at((dic_data.offset + d_idx) / 4)++;
|
||||
auto sublen = data.data.at(dic_data.offset + d_idx + 0x80);
|
||||
|
||||
for (u32 x = 0; x < sublen; x++) {
|
||||
read_words.at((dic_data.offset + d_idx + x + 1) / 4)++;
|
||||
text += data.data.at(dic_data.offset + d_idx + x + 1 + 0x80);
|
||||
}
|
||||
|
||||
result.total_chars += sublen;
|
||||
}
|
||||
|
||||
// escape characters
|
||||
if (font_bank_exists(version)) {
|
||||
result.text[id] = get_font_bank(version)->convert_game_to_utf8(text.c_str());
|
||||
} else {
|
||||
result.text[id] = goos::get_readable_string(text.c_str()); // HACK!
|
||||
}
|
||||
}
|
||||
|
||||
size_t unused_dictionary_indices = 0;
|
||||
size_t unused_words = 0;
|
||||
|
||||
// check if we read each thing at least once.
|
||||
// reading more than once is ok, some text is duplicated.
|
||||
for (int i = 0; i < int(words.size()); i++) {
|
||||
if (read_words[i] < 1) {
|
||||
if (i < dic_data.offset / 4) {
|
||||
std::string text;
|
||||
u32 d_idx = get_word<u32>(words.at(i));
|
||||
|
||||
auto sublen = data.data.at(dic_data.offset + d_idx + 0x80);
|
||||
|
||||
for (u32 x = 0; x < sublen; x++) {
|
||||
read_words.at((dic_data.offset + d_idx + x + 1) / 4)++;
|
||||
text += data.data.at(dic_data.offset + d_idx + x + 1 + 0x80);
|
||||
}
|
||||
|
||||
lg::debug(fmt::format("Unused dictionary entry in {} [index {}] {} {:?}",
|
||||
data.name_in_dgo, i - (dic_index.offset / 4), int(read_words[i]),
|
||||
text.c_str()));
|
||||
|
||||
unused_dictionary_indices++;
|
||||
} else {
|
||||
std::string debug;
|
||||
data.linked_data.append_word_to_string(debug, words.at(i));
|
||||
lg::debug(fmt::format("Unused word in {} [{}] {} 0x{}", data.name_in_dgo, i,
|
||||
int(read_words[i]), debug.c_str()));
|
||||
unused_words++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (unused_dictionary_indices) {
|
||||
lg::warn(fmt::format("{} dictionary entries unused by game text in {}",
|
||||
unused_dictionary_indices, data.name_in_dgo));
|
||||
}
|
||||
|
||||
if (unused_words) {
|
||||
lg::warn(
|
||||
fmt::format("{} data words unused by game text in {}", unused_words, data.name_in_dgo));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ struct AudioDir {
|
||||
};
|
||||
|
||||
std::vector<Entry> entries;
|
||||
u32 version = 1;
|
||||
|
||||
int entry_count() const { return entries.size(); }
|
||||
|
||||
@@ -153,7 +154,7 @@ AudioDir read_audio_dir(const decompiler::Config& config, const fs::path& path)
|
||||
e.start_byte = AUDIO_PAGE_SIZE * entries[i].value;
|
||||
result.entries.push_back(e);
|
||||
}
|
||||
} else if (config.game_version == GameVersion::Jak3) {
|
||||
} else if (config.game_version == GameVersion::Jak3 || config.game_version == GameVersion::JakX) {
|
||||
struct VagDirJak3 {
|
||||
u32 id[2];
|
||||
u32 version;
|
||||
@@ -179,6 +180,8 @@ AudioDir read_audio_dir(const decompiler::Config& config, const fs::path& path)
|
||||
ASSERT(dir.id[1] == 0x52494444);
|
||||
lg::warn("version {} count {}", dir.version, dir.count);
|
||||
|
||||
result.version = dir.version;
|
||||
|
||||
std::vector<DirEntryJak3> entries;
|
||||
|
||||
for (size_t i = 0; i < dir.count; i++) {
|
||||
@@ -216,7 +219,8 @@ AudioFileInfo process_audio_file(const fs::path& output_folder,
|
||||
std::span<const uint8_t> data,
|
||||
const std::string& name,
|
||||
const std::string& suffix,
|
||||
bool stereo) {
|
||||
bool stereo,
|
||||
u32 version) {
|
||||
BinaryReader reader(data);
|
||||
|
||||
auto header = reader.read<VagFileHeader>();
|
||||
@@ -228,7 +232,7 @@ AudioFileInfo process_audio_file(const fs::path& output_folder,
|
||||
header.debug_print();
|
||||
|
||||
reader = BinaryReader(data.subspan(0, header.size));
|
||||
const auto [left_samples, right_samples] = decode_adpcm(reader, stereo);
|
||||
const auto [left_samples, right_samples] = decode_adpcm(reader, stereo, version);
|
||||
|
||||
while (reader.bytes_left()) {
|
||||
ASSERT(reader.read<u8>() == 0);
|
||||
@@ -280,7 +284,8 @@ void process_streamed_audio(const decompiler::Config& config,
|
||||
|
||||
lg::info("File {}, total {:.2f} minutes", entry.name, audio_len / 60.0);
|
||||
auto data = std::span(wad_data).subspan(entry.start_byte);
|
||||
auto info = process_audio_file(output_path, data, entry.name, suffix, entry.stereo);
|
||||
auto info =
|
||||
process_audio_file(output_path, data, entry.name, suffix, entry.stereo, dir_data.version);
|
||||
audio_len += info.length_seconds;
|
||||
filename_data[i][lang_id + 1] = info.filename;
|
||||
}
|
||||
|
||||
@@ -355,6 +355,9 @@ TexturePage read_texture_page(ObjectFileData& data,
|
||||
case GameVersion::Jak3:
|
||||
ASSERT(tpage.info.major_version == versions::jak3::TX_PAGE_VERSION);
|
||||
break;
|
||||
case GameVersion::JakX:
|
||||
ASSERT(tpage.info.major_version == versions::jakx::TX_PAGE_VERSION);
|
||||
break;
|
||||
default:
|
||||
ASSERT(false);
|
||||
}
|
||||
|
||||
@@ -215,15 +215,28 @@ int run_decompilation_process(decompiler::Config config,
|
||||
if (!result.empty()) {
|
||||
file_util::write_text_file(out_folder / "assets" / "game_text.txt", result);
|
||||
}
|
||||
|
||||
if (config.game_version == GameVersion::JakX) {
|
||||
auto subtitle_result = db.process_game_text_files(config, "SUBTIT");
|
||||
if (!subtitle_result.empty()) {
|
||||
file_util::write_text_file(out_folder / "assets" / "game_subs.txt", subtitle_result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lg::info("[Mem] After text: {} MB", get_peak_rss() / (1024 * 1024));
|
||||
|
||||
if (config.process_subtitle_text || config.process_subtitle_images) {
|
||||
auto result = db.process_all_spool_subtitles(
|
||||
config, config.process_subtitle_images ? out_folder / "assets" / "subtitle-images" : "");
|
||||
if (!result.empty()) {
|
||||
file_util::write_text_file(out_folder / "assets" / "game_subs.txt", result);
|
||||
if (config.game_version == GameVersion::JakX) {
|
||||
lg::warn(
|
||||
"- Jak X does not use spools, ignoring process_subtitle_text and/or "
|
||||
"process_subtitle_images");
|
||||
} else {
|
||||
auto result = db.process_all_spool_subtitles(
|
||||
config, config.process_subtitle_images ? out_folder / "assets" / "subtitle-images" : "");
|
||||
if (!result.empty()) {
|
||||
file_util::write_text_file(out_folder / "assets" / "game_subs.txt", result);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -458,7 +458,8 @@ void TieFragment::read_from_file(TypedRef ref,
|
||||
num_dverts = read_plain_data_field<u16>(ref, "num-dverts", dts);
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3: {
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX: {
|
||||
auto debug_data_ref = TypedRef(deref_label(get_field_ref(ref, "debug", dts)),
|
||||
dts.ts.lookup_type("tie-fragment-debug"));
|
||||
num_tris = read_plain_data_field<u16>(debug_data_ref, "num-tris", dts);
|
||||
@@ -929,6 +930,7 @@ void PrototypeBucketTie::read_from_file(TypedRef ref,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
flags = read_plain_data_field<u16>(ref, "flags", dts);
|
||||
break;
|
||||
default:
|
||||
@@ -1577,6 +1579,7 @@ void PrototypeBucketShrub::read_from_file(TypedRef ref,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
flags = read_plain_data_field<u16>(ref, "flags", dts);
|
||||
break;
|
||||
default:
|
||||
@@ -2157,6 +2160,7 @@ void BspHeader::read_from_file(const decompiler::LinkedObjectFile& file,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
visible_list_length = read_plain_data_field<s16>(ref, "visible-list-length", dts);
|
||||
extra_vis_list_length = read_plain_data_field<s16>(ref, "extra-vis-list-length", dts);
|
||||
break;
|
||||
@@ -2189,7 +2193,7 @@ void BspHeader::read_from_file(const decompiler::LinkedObjectFile& file,
|
||||
get_and_check_ref_to_basic(ref, "collide-hash", "collide-hash", dts), dts, version);
|
||||
}
|
||||
|
||||
if (version == GameVersion::Jak3) {
|
||||
if (version == GameVersion::Jak3 || version == GameVersion::JakX) {
|
||||
if (get_word_kind_for_field(ref, "hfrag-drawable", dts) == decompiler::LinkedWord::PTR) {
|
||||
hfrag.emplace();
|
||||
hfrag->read_from_file(get_and_check_ref_to_basic(ref, "hfrag-drawable", "hfragment", dts),
|
||||
|
||||
@@ -769,9 +769,9 @@ s32 find_or_add_texture_to_level(tfrag3::Level& out,
|
||||
}
|
||||
|
||||
// check eyes
|
||||
u32 eye_tpage = PerGameVersion<u32>(0x1cf, 0x70c, 0x3)[version];
|
||||
u32 left_id = PerGameVersion<u32>(0x6f, 0x7, 0x2)[version];
|
||||
u32 right_id = PerGameVersion<u32>(0x70, 0x8, 0x3)[version];
|
||||
u32 eye_tpage = PerGameVersion<u32>(0x1cf, 0x70c, 0x3, 0x3)[version];
|
||||
u32 left_id = PerGameVersion<u32>(0x6f, 0x7, 0x2, 0x2)[version];
|
||||
u32 right_id = PerGameVersion<u32>(0x70, 0x8, 0x3, 0x3)[version];
|
||||
|
||||
if (eye_out && (pc_combo_tex_id >> 16) == eye_tpage) {
|
||||
auto tex_it = tex_db.textures.find(pc_combo_tex_id);
|
||||
@@ -859,7 +859,8 @@ ConvertedMercEffect convert_merc_effect(const MercEffect& input_effect,
|
||||
u32 tidx = 2;
|
||||
tex_combo = (((u32)tpage) << 16) | tidx;
|
||||
} break;
|
||||
case GameVersion::Jak3: {
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX: {
|
||||
// (define *generic-envmap-texture* (get-texture pal-environment-front environment-generic))
|
||||
// (defconstant environment-generic 2) tpage
|
||||
// (def-tex pal-environment-front environment-generic 1) texture
|
||||
|
||||
@@ -1627,7 +1627,7 @@ void emulate_tie_instance_program(std::vector<TieProtoInfo>& protos, GameVersion
|
||||
|
||||
bool inserted = frag.vertex_by_dest_addr.insert({(u32)dest_ptr, vertex_info}).second;
|
||||
// TODO hack
|
||||
if (version != GameVersion::Jak3) {
|
||||
if (version != GameVersion::Jak3 && version != GameVersion::JakX) {
|
||||
ASSERT(inserted);
|
||||
}
|
||||
nd.bp1++;
|
||||
@@ -2571,6 +2571,7 @@ void add_vertices_and_static_draw(tfrag3::TieTree& tree,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
info = get_jak2_tie_category(proto.proto_flag);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -747,6 +747,13 @@ void types2_for_logior(types2::Type& type_out,
|
||||
return;
|
||||
}
|
||||
|
||||
if (arg0_type.typespec().base_type() == "pointer" &&
|
||||
arg1_type.typespec().base_type() == "pointer") {
|
||||
env.func->warnings.warning("Using logior on pointers");
|
||||
type_out.type = TP_Type::make_from_ts("int");
|
||||
return;
|
||||
}
|
||||
|
||||
if (common_int2_case(type_out, dts, arg0_type, arg1_type)) {
|
||||
return;
|
||||
}
|
||||
@@ -1971,6 +1978,7 @@ bool load_var_op_determine_type(types2::Type& type_out,
|
||||
art_get_by_name_method_id = 10;
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
art_get_by_name_method_id = 11;
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -218,13 +218,23 @@ std::string DecompilerTypeSystem::lookup_parent_from_inspects(const std::string&
|
||||
}
|
||||
|
||||
bool DecompilerTypeSystem::lookup_flags(const std::string& type, u64* dest) const {
|
||||
if (type == "process-tree") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x24;
|
||||
return true;
|
||||
}
|
||||
if (type == "process") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x80;
|
||||
return true;
|
||||
if (m_version == GameVersion::JakX) {
|
||||
if (type == "process-tree") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x2c;
|
||||
return true;
|
||||
}
|
||||
if (type == "process") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x90;
|
||||
}
|
||||
} else {
|
||||
if (type == "process-tree") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x24;
|
||||
return true;
|
||||
}
|
||||
if (type == "process") {
|
||||
*dest = ((u64)0xe << 32) + (0 << 16) + 0x80;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
auto kv = type_flags.find(type);
|
||||
|
||||
@@ -1067,6 +1067,10 @@ const std::unordered_map<
|
||||
ArrayFieldDecompMeta(TypeSpec("uint64"),
|
||||
8,
|
||||
ArrayFieldDecompMeta::Kind::REF_TO_INTEGER_ARR)}}},
|
||||
}},
|
||||
{GameVersion::JakX,
|
||||
{
|
||||
// TODO
|
||||
}}};
|
||||
|
||||
goos::Object decompile_structure(const TypeSpec& type,
|
||||
|
||||
@@ -159,6 +159,82 @@ enum class FieldId2 {
|
||||
SPT_END = 72,
|
||||
};
|
||||
|
||||
// jakx version
|
||||
enum class FieldIdX {
|
||||
MISC_FIELDS_START = 0,
|
||||
SPT_TEXTURE = 1,
|
||||
SPT_ANIM = 2,
|
||||
SPT_ANIM_SPEED = 3,
|
||||
SPT_BIRTH_FUNC = 4,
|
||||
SPT_JOINT_REFPOINT = 5,
|
||||
SPT_NUM = 6,
|
||||
MISC_FIELDS_END = 7,
|
||||
SPRITE_FIELDS_START = 8,
|
||||
SPT_X = 9,
|
||||
SPT_Y = 10,
|
||||
SPT_Z = 11,
|
||||
SPT_SCALE_X = 12,
|
||||
SPT_ROT_X = 13,
|
||||
SPT_ROT_Y = 14,
|
||||
SPT_ROT_Z = 15,
|
||||
SPT_SCALE_Y = 16,
|
||||
SPT_R = 17,
|
||||
SPT_G = 18,
|
||||
SPT_B = 19,
|
||||
SPT_A = 20,
|
||||
SPRITE_FIELDS_END = 21,
|
||||
CPU_FIELDS_START = 22,
|
||||
SPT_OMEGA = 23,
|
||||
SPT_VEL_X = 24,
|
||||
SPT_VEL_Y = 25,
|
||||
SPT_VEL_Z = 26,
|
||||
SPT_SCALEVEL_X = 27,
|
||||
SPT_ROTVEL_X = 28,
|
||||
SPT_ROTVEL_Y = 29,
|
||||
SPT_ROTVEL_Z = 30,
|
||||
SPT_SCALEVEL_Y = 31,
|
||||
SPT_FADE_R = 32,
|
||||
SPT_FADE_G = 33,
|
||||
SPT_FADE_B = 34,
|
||||
SPT_FADE_A = 35,
|
||||
SPT_ACCEL_X = 36,
|
||||
SPT_ACCEL_Y = 37,
|
||||
SPT_ACCEL_Z = 38,
|
||||
SPT_DUMMY = 39,
|
||||
SPT_QUAT_X = 40,
|
||||
SPT_QUAT_Y = 41,
|
||||
SPT_QUAT_Z = 42,
|
||||
SPT_QUAD_W = 43,
|
||||
SPT_FRICTION = 44,
|
||||
SPT_TIMER = 45,
|
||||
SPT_FLAGS = 46,
|
||||
SPT_USERDATA = 47,
|
||||
SPT_FUNC = 48,
|
||||
SPT_NEXT_TIME = 49,
|
||||
SPT_NEXT_LAUNCHER = 50,
|
||||
CPU_FIELDS_END = 51,
|
||||
LAUNCH_FIELDS_START = 52,
|
||||
SPT_LAUNCHROT_X = 53,
|
||||
SPT_LAUNCHROT_Y = 54,
|
||||
SPT_LAUNCHROT_Z = 55,
|
||||
SPT_LAUNCHROT_W = 56,
|
||||
SPT_CONEROT_X = 57,
|
||||
SPT_CONEROT_Y = 58,
|
||||
SPT_CONEROT_Z = 59,
|
||||
SPT_CONEROT_W = 60,
|
||||
SPT_ROTATE_X = 61,
|
||||
SPT_ROTATE_Y = 62,
|
||||
SPT_ROTATE_Z = 63,
|
||||
SPT_CONEROT_RADIUS = 64,
|
||||
SPT_MAT_SCALE_X = 65,
|
||||
SPT_MAT_SCALE_Y = 66,
|
||||
SPT_MAT_SCALE_Z = 67,
|
||||
LAUNCH_FIELDS_END = 68,
|
||||
SPT_SCALE = 69,
|
||||
SPT_SCALEVEL = 70,
|
||||
SPT_END = 71,
|
||||
};
|
||||
|
||||
// NOTE : "per second" here means it's in 1/60th instead of the usual 1/300ths
|
||||
constexpr bool allow_per_sec = false;
|
||||
|
||||
@@ -335,10 +411,86 @@ const SparticleFieldDecomp field_kind_jak2[73] = {
|
||||
{true, FieldKind::END_FLAG} // SPT_END = 72
|
||||
};
|
||||
|
||||
const SparticleFieldDecomp field_kind_jakx[72] = {
|
||||
{false}, // MISC_FIELDS_START = 0
|
||||
{true, FieldKind::TEXTURE_ID}, // SPT_TEXTURE = 1
|
||||
{false}, // SPT_ANIM = 2
|
||||
{false}, // SPT_ANIM_SPEED = 3
|
||||
{true, FieldKind::FUNCTION}, // SPT_BIRTH_FUNC = 4
|
||||
{false}, // SPT_JOINT/REFPOINT = 5
|
||||
{true, FieldKind::FLOAT}, // SPT_NUM = 6
|
||||
{false}, // MISC_FIELDS_END = 7
|
||||
{false}, // SPRITE_FIELDS_START = 8
|
||||
{true, FieldKind::METERS}, // SPT_X = 9
|
||||
{true, FieldKind::METERS}, // SPT_Y = 10
|
||||
{true, FieldKind::METERS}, // SPT_Z = 11
|
||||
{true, FieldKind::METERS}, // SPT_SCALE_X = 12
|
||||
{true, FieldKind::ROT_X}, // SPT_ROT_X = 13
|
||||
{true, FieldKind::DEGREES}, // SPT_ROT_Y = 14
|
||||
{true, FieldKind::DEGREES}, // SPT_ROT_Z = 15
|
||||
{true, FieldKind::METERS}, // SPT_SCALE_Y = 16
|
||||
{true, FieldKind::FLOAT}, // SPT_R = 17
|
||||
{true, FieldKind::FLOAT}, // SPT_G = 18
|
||||
{true, FieldKind::FLOAT}, // SPT_B = 19
|
||||
{true, FieldKind::FLOAT}, // SPT_A = 20
|
||||
{false}, // SPRITE_FIELDS_END = 21
|
||||
{false}, // CPU_FIELDS_START = 22
|
||||
{true, FieldKind::DEGREES}, // SPT_OMEGA = 23
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_VEL_X = 24 (likely m/s)
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_VEL_Y = 25
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_VEL_Z = 26
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_SCALEVEL_X = 27
|
||||
{true, FieldKind::DEGREES_PER_SEC}, // SPT_ROTVEL_X = 28
|
||||
{true, FieldKind::DEGREES_PER_SEC}, // SPT_ROTVEL_Y = 29
|
||||
{true, FieldKind::DEGREES_PER_SEC}, // SPT_ROTVEL_Z = 30
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_SCALEVEL_Y = 31
|
||||
{true, FieldKind::FLOAT_PER_SEC}, // SPT_FADE_R = 32
|
||||
{true, FieldKind::FLOAT_PER_SEC}, // SPT_FADE_G = 33
|
||||
{true, FieldKind::FLOAT_PER_SEC}, // SPT_FADE_B = 34
|
||||
{true, FieldKind::FLOAT_PER_SEC}, // SPT_FADE_A = 35
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_ACCEL_X = 36
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_ACCEL_Y = 37
|
||||
{true, FieldKind::METERS_PER_SEC}, // SPT_ACCEL_Z = 38
|
||||
{false}, // SPT_DUMMY = 39
|
||||
{false}, // SPT_QUAT_X = 40
|
||||
{false}, // SPT_QUAT_Y = 41
|
||||
{false}, // SPT_QUAT_Z = 42
|
||||
{false}, // SPT_QUAD_W = 43
|
||||
{true, FieldKind::FLOAT}, // SPT_FRICTION = 44
|
||||
{true, FieldKind::SECONDS}, // SPT_TIMER = 45
|
||||
{true, FieldKind::CPUINFO_FLAGS}, // SPT_FLAGS = 46
|
||||
{true, FieldKind::USERDATA}, // SPT_USERDATA = 47
|
||||
{true, FieldKind::FUNCTION}, // SPT_FUNC = 48
|
||||
{true, FieldKind::SECONDS}, // SPT_NEXT_TIME = 49
|
||||
{true, FieldKind::LAUNCHER_BY_ID}, // SPT_NEXT_LAUNCHER = 50
|
||||
{false}, // CPU_FIELDS_END = 51
|
||||
{false}, // LAUNCH_FIELDS_START = 52
|
||||
{true, FieldKind::DEGREES}, // SPT_LAUNCHROT_X = 53
|
||||
{true, FieldKind::DEGREES}, // SPT_LAUNCHROT_Y = 54
|
||||
{true, FieldKind::DEGREES}, // SPT_LAUNCHROT_Z = 55
|
||||
{true, FieldKind::DEGREES}, // SPT_LAUNCHROT_W = 56
|
||||
{true, FieldKind::DEGREES}, // SPT_CONEROT_X = 57
|
||||
{true, FieldKind::DEGREES}, // SPT_CONEROT_Y = 58
|
||||
{true, FieldKind::DEGREES}, // SPT_CONEROT_Z = 59
|
||||
{false}, // SPT_CONEROT_W = 60
|
||||
{true, FieldKind::DEGREES}, // SPT_ROTATE_X = 61
|
||||
{true, FieldKind::DEGREES}, // SPT_ROTATE_Y = 62
|
||||
{true, FieldKind::DEGREES}, // SPT_ROTATE_Z = 63
|
||||
{true, FieldKind::METERS}, // SPT_CONEROT_RADIUS = 64
|
||||
{true, FieldKind::METERS}, // SPT_MAT_SCALE_X = 65
|
||||
{true, FieldKind::METERS}, // SPT_MAT_SCALE_X = 66
|
||||
{true, FieldKind::METERS}, // SPT_MAT_SCALE_X = 67
|
||||
{false}, // LAUNCH_FIELDS_END = 68
|
||||
{false}, // SPT_SCALE = 69
|
||||
{false}, // SPT_SCALEVEL = 70
|
||||
{true, FieldKind::END_FLAG} // SPT_END = 71
|
||||
};
|
||||
|
||||
const std::unordered_map<GameVersion, const SparticleFieldDecomp*> field_kinds = {
|
||||
{GameVersion::Jak1, field_kind_jak1},
|
||||
{GameVersion::Jak2, field_kind_jak2},
|
||||
{GameVersion::Jak3, field_kind_jak2}};
|
||||
{GameVersion::Jak3, field_kind_jak2},
|
||||
{GameVersion::JakX, field_kind_jakx}};
|
||||
|
||||
float word_as_float(const LinkedWord& w) {
|
||||
ASSERT(w.kind() == LinkedWord::PLAIN_DATA);
|
||||
|
||||
@@ -13,9 +13,8 @@ namespace decompiler {
|
||||
bool allowable_base_type_for_symbol_to_string(const TypeSpec& ts);
|
||||
|
||||
constexpr PerGameVersion<int> SYMBOL_TO_STRING_MEM_OFFSET_DECOMP = {
|
||||
8167 * 8, jak2::SYM_TO_STRING_OFFSET,
|
||||
-99999, // not supported this way!
|
||||
8167 * 8, jak2::SYM_TO_STRING_OFFSET, -99999, -99999, // not supported this way!
|
||||
};
|
||||
|
||||
constexpr PerGameVersion<int> OFFSET_OF_NEXT_STATE_STORE = {72, 64, 68};
|
||||
constexpr PerGameVersion<int> OFFSET_OF_NEXT_STATE_STORE = {72, 64, 68, 68};
|
||||
} // namespace decompiler
|
||||
|
||||
@@ -26,12 +26,14 @@ set(RUNTIME_SOURCE
|
||||
external/discord_jak1.cpp
|
||||
external/discord_jak2.cpp
|
||||
external/discord_jak3.cpp
|
||||
external/discord_jakx.cpp
|
||||
external/discord.cpp
|
||||
graphics/display.cpp
|
||||
graphics/gfx_test.cpp
|
||||
graphics/gfx.cpp
|
||||
graphics/jak2_texture_remap.cpp
|
||||
graphics/jak3_texture_remap.cpp
|
||||
graphics/jakx_texture_remap.cpp
|
||||
graphics/screenshot.cpp
|
||||
graphics/opengl_renderer/background/background_common.cpp
|
||||
graphics/opengl_renderer/background/Hfrag.cpp
|
||||
@@ -140,6 +142,20 @@ set(RUNTIME_SOURCE
|
||||
kernel/jak3/kscheme.cpp
|
||||
kernel/jak3/ksocket.cpp
|
||||
kernel/jak3/ksound.cpp
|
||||
kernel/jakx/fileio.cpp
|
||||
kernel/jakx/kboot.cpp
|
||||
kernel/jakx/kdgo.cpp
|
||||
kernel/jakx/kdsnetm.cpp
|
||||
kernel/jakx/klink.cpp
|
||||
kernel/jakx/klisten.cpp
|
||||
kernel/jakx/kmachine.cpp
|
||||
kernel/jakx/kmachine_extras.cpp
|
||||
kernel/jakx/kmalloc.cpp
|
||||
kernel/jakx/kmemcard.cpp
|
||||
kernel/jakx/kprint.cpp
|
||||
kernel/jakx/kscheme.cpp
|
||||
kernel/jakx/ksocket.cpp
|
||||
kernel/jakx/ksound.cpp
|
||||
mips2c/jak1_functions/bones.cpp
|
||||
mips2c/jak1_functions/collide_cache.cpp
|
||||
mips2c/jak1_functions/collide_edge_grab.cpp
|
||||
@@ -279,6 +295,29 @@ set(RUNTIME_SOURCE
|
||||
overlord/jak3/sbank.cpp
|
||||
overlord/jak3/soundcommon.cpp
|
||||
overlord/jak3/streamlist.cpp
|
||||
overlord/jakx/overlord.cpp
|
||||
overlord/jakx/pagemanager.cpp
|
||||
overlord/jakx/iso_cd.cpp
|
||||
overlord/jakx/dma.cpp
|
||||
overlord/jakx/iso.cpp
|
||||
overlord/jakx/iso_queue.cpp
|
||||
overlord/jakx/srpc.cpp
|
||||
overlord/jakx/vag.cpp
|
||||
overlord/jakx/ssound.cpp
|
||||
overlord/jakx/iso_api.cpp
|
||||
overlord/jakx/spustreams.cpp
|
||||
overlord/jakx/list.cpp
|
||||
overlord/jakx/vblank_handler.cpp
|
||||
overlord/jakx/dvd_driver.cpp
|
||||
overlord/jakx/basefile.cpp
|
||||
overlord/jakx/basefilesystem.cpp
|
||||
overlord/jakx/ramdisk.cpp
|
||||
overlord/jakx/isocommon.cpp
|
||||
overlord/jakx/init.cpp
|
||||
overlord/jakx/stream.cpp
|
||||
overlord/jakx/sbank.cpp
|
||||
overlord/jakx/soundcommon.cpp
|
||||
overlord/jakx/streamlist.cpp
|
||||
runtime.cpp
|
||||
sce/deci2.cpp
|
||||
sce/iop.cpp
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "common/common_types.h"
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
constexpr PerGameVersion<int> DGO_RPC_ID(0xdeb4, 0xfab3, 0xfab3);
|
||||
constexpr PerGameVersion<int> DGO_RPC_ID(0xdeb4, 0xfab3, 0xfab3, 0xfab3);
|
||||
constexpr int DGO_RPC_CHANNEL = 3;
|
||||
constexpr int DGO_RPC_LOAD_FNO = 0;
|
||||
constexpr int DGO_RPC_LOAD_NEXT_FNO = 1;
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
constexpr PerGameVersion<int> LOADER_RPC_ID(0xdeb2, 0xfab1, 0xfab1);
|
||||
constexpr PerGameVersion<int> LOADER_RPC_ID(0xdeb2, 0xfab1, 0xfab1, 0xfab1);
|
||||
constexpr int LOADER_RPC_CHANNEL = 1;
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
*/
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
constexpr PerGameVersion<int> PLAY_RPC_ID(0xdeb6, 0xfab5, 0xfab5);
|
||||
constexpr PerGameVersion<int> PLAY_RPC_ID(0xdeb6, 0xfab5, 0xfab5, 0xfab5);
|
||||
constexpr int PLAY_RPC_CHANNEL = 5;
|
||||
|
||||
@@ -7,5 +7,5 @@
|
||||
*/
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
constexpr PerGameVersion<int> PLAYER_RPC_ID(0xdeb1, 0xfab0, 0xfab0);
|
||||
constexpr PerGameVersion<int> PLAYER_RPC_ID(0xdeb1, 0xfab0, 0xfab0, 0xfab0);
|
||||
constexpr int PLAYER_RPC_CHANNEL = 0;
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
#include "common/common_types.h"
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
constexpr PerGameVersion<int> RAMDISK_RPC_ID(0xdeb3, 0xfab2, 0xfab2);
|
||||
constexpr PerGameVersion<int> RAMDISK_RPC_ID(0xdeb3, 0xfab2, 0xfab2, 0xfab2);
|
||||
constexpr int RAMDISK_RPC_CHANNEL = 2;
|
||||
constexpr int RAMDISK_GET_DATA_FNO = 0;
|
||||
constexpr int RAMDISK_RESET_AND_LOAD_FNO = 1;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
#include "game/common/overlord_common.h"
|
||||
|
||||
constexpr PerGameVersion<int> STR_RPC_ID(0xdeb5, 0xfab4, 0xfab4);
|
||||
constexpr PerGameVersion<int> STR_RPC_ID(0xdeb5, 0xfab4, 0xfab4, 0xfab4);
|
||||
constexpr int STR_RPC_CHANNEL = 4;
|
||||
|
||||
/*
|
||||
|
||||
Vendored
+38
@@ -0,0 +1,38 @@
|
||||
#include "discord_jakx.h"
|
||||
|
||||
namespace jakx {
|
||||
const std::map<std::string, std::string> level_names = {};
|
||||
|
||||
// for remapping sub-level names to the matching one in level_names
|
||||
std::map<std::string, std::string> level_name_remap = {};
|
||||
|
||||
const std::map<std::string, std::pair<char, char>> level_remap_hack = {};
|
||||
|
||||
void remap_hack() {
|
||||
for (auto& name : level_remap_hack) {
|
||||
auto base_name = name.first;
|
||||
auto suffix_start = name.second.first;
|
||||
auto suffix_end = name.second.second;
|
||||
for (int i = 0; i < suffix_end - suffix_start; i++) {
|
||||
auto suffix = static_cast<char>(suffix_start + i);
|
||||
std::string level(base_name);
|
||||
level.push_back(suffix);
|
||||
level_name_remap.insert(std::make_pair(level, base_name));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// levels that are not affected by time of day
|
||||
const std::vector<std::string> indoor_levels = {};
|
||||
|
||||
// time of day string to append to level name for icons
|
||||
const char* time_of_day_str(float time) {
|
||||
int hour = static_cast<int>(time);
|
||||
|
||||
if (hour > 6 && hour < 19) {
|
||||
return "day";
|
||||
} else {
|
||||
return "night";
|
||||
}
|
||||
}
|
||||
} // namespace jakx
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "discord.h"
|
||||
|
||||
namespace jakx {
|
||||
extern const std::map<std::string, std::string> level_names;
|
||||
extern std::map<std::string, std::string> level_name_remap;
|
||||
void remap_hack();
|
||||
extern const std::vector<std::string> indoor_levels;
|
||||
const char* time_of_day_str(float time);
|
||||
} // namespace jakx
|
||||
@@ -75,7 +75,8 @@ u32 Init(GameVersion version) {
|
||||
{
|
||||
auto p = scoped_prof("startup::gfx::init_main_display");
|
||||
std::string title = "OpenGOAL";
|
||||
if (g_game_version == GameVersion::Jak2 || g_game_version == GameVersion::Jak3) {
|
||||
if (g_game_version == GameVersion::Jak2 || g_game_version == GameVersion::Jak3 ||
|
||||
g_game_version == GameVersion::JakX) {
|
||||
title += " - Work in Progress";
|
||||
}
|
||||
title += fmt::format(" - {} - {}", version_to_game_name_external(g_game_version),
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
#include "jakx_texture_remap.h"
|
||||
|
||||
#include <unordered_map>
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
const std::unordered_map<int, std::vector<std::pair<int, int>>> data = {
|
||||
// TODO - jakx
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
int lookup_jakx_texture_dest_offset(int tpage, int texture_idx) {
|
||||
auto it = data.find(tpage);
|
||||
if (it == data.end()) {
|
||||
return 0;
|
||||
}
|
||||
for (auto& p : it->second) {
|
||||
if (p.first == texture_idx) {
|
||||
return p.second;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
int lookup_jakx_texture_dest_offset(int tpage, int texture_idx);
|
||||
@@ -14,6 +14,7 @@ void BlitDisplays::init_textures(TexturePool& texture_pool, GameVersion version)
|
||||
tbp = 0x3300;
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
tbp = 0x3300; // assuming this for now...
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -213,6 +213,7 @@ void CollideMeshRenderer::init_pat_colors(GameVersion version) {
|
||||
mode_colors = &mode_colors_jak2;
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
material_colors = &material_colors_jak3;
|
||||
event_colors = &event_colors_jak3;
|
||||
mode_colors = &mode_colors_jak2; // unchanged from jak2
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#pragma once
|
||||
#include "common/versions/versions.h"
|
||||
|
||||
#include "game/graphics/gfx.h"
|
||||
#include "game/graphics/opengl_renderer/BucketRenderer.h"
|
||||
#include <game/graphics/gfx.h>
|
||||
|
||||
struct PatColors {
|
||||
math::Vector4f pat_mode_colors[PAT_MOD_COUNT];
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
DirectRenderer::ScissorState DirectRenderer::m_scissor;
|
||||
|
||||
constexpr PerGameVersion<int> game_height(448, 416, 416);
|
||||
constexpr PerGameVersion<int> game_height(448, 416, 416, 416);
|
||||
|
||||
DirectRenderer::DirectRenderer(const std::string& name, int my_id, int batch_size)
|
||||
: BucketRenderer(name, my_id), m_prim_buffer(batch_size) {
|
||||
@@ -1049,7 +1049,7 @@ void DirectRenderer::handle_xyz2_packed(const u8* data,
|
||||
handle_xyzf2_common(x << 16, y << 16, z, 0, render_state, prof, !adc);
|
||||
}
|
||||
|
||||
PerGameVersion<u32> normal_zbp = {448, 304, 304};
|
||||
PerGameVersion<u32> normal_zbp = {448, 304, 304, 304};
|
||||
void DirectRenderer::handle_zbuf1(u64 val,
|
||||
SharedRenderState* render_state,
|
||||
ScopedProfilerNode& prof) {
|
||||
|
||||
@@ -28,6 +28,7 @@ void EyeRenderer::init_textures(TexturePool& texture_pool, GameVersion version)
|
||||
tbp += EYE_BASE_BLOCK_JAK1;
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
// for jak 3, go back to using the right TBP.
|
||||
tbp += EYE_BASE_BLOCK_JAK3;
|
||||
break;
|
||||
|
||||
@@ -136,6 +136,7 @@ OpenGLRenderer::OpenGLRenderer(std::shared_ptr<TexturePool> texture_pool,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
m_texture_animator =
|
||||
std::make_shared<TextureAnimator>(m_render_state.shaders, common_level, m_version);
|
||||
break;
|
||||
@@ -156,6 +157,7 @@ OpenGLRenderer::OpenGLRenderer(std::shared_ptr<TexturePool> texture_pool,
|
||||
init_bucket_renderers_jak2();
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
init_bucket_renderers_jak3();
|
||||
break;
|
||||
default:
|
||||
@@ -1457,6 +1459,7 @@ void OpenGLRenderer::dispatch_buckets(DmaFollower dma,
|
||||
dispatch_buckets_jak2(dma, prof, sync_after_buckets);
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
dispatch_buckets_jak3(dma, prof, sync_after_buckets);
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -102,6 +102,18 @@ OpenGLTexturePool::OpenGLTexturePool(GameVersion version) {
|
||||
{128, 128, 10},
|
||||
{256, 1, 2},
|
||||
{256, 256, 7}},
|
||||
{{4, 4, 3},
|
||||
{4, 64, 6},
|
||||
{16, 16, 5},
|
||||
{32, 16, 1},
|
||||
{32, 32, 20},
|
||||
{32, 64, 1},
|
||||
{64, 32, 15},
|
||||
{64, 64, 85},
|
||||
{64, 128, 4},
|
||||
{128, 128, 185},
|
||||
{256, 1, 2},
|
||||
{256, 256, 7}},
|
||||
{{4, 4, 3},
|
||||
{4, 64, 6},
|
||||
{16, 16, 5},
|
||||
@@ -247,6 +259,7 @@ int output_slot_by_idx(GameVersion version, const std::string& name) {
|
||||
v = &jak2_animated_texture_slots();
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
v = &jak3_animated_texture_slots();
|
||||
break;
|
||||
default:
|
||||
@@ -463,6 +476,7 @@ const std::vector<std::string>& animated_texture_slots(GameVersion version) {
|
||||
case GameVersion::Jak2:
|
||||
return jak2_animated_texture_slots();
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
return jak3_animated_texture_slots();
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
@@ -596,6 +610,7 @@ TextureAnimator::TextureAnimator(ShaderLibrary& shaders,
|
||||
setup_texture_anims_jak2();
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
setup_texture_anims_jak3();
|
||||
break;
|
||||
default:
|
||||
@@ -1302,6 +1317,7 @@ void TextureAnimator::handle_texture_anim_data(DmaFollower& dma,
|
||||
}
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
switch (static_cast<PcTextureAnimCodesJak3>(vif0.immediate)) {
|
||||
case PcTextureAnimCodesJak3::UPLOAD_CLUT_16_16: {
|
||||
auto p = scoped_prof("clut-16-16");
|
||||
|
||||
@@ -1766,7 +1766,7 @@ void TextureAnimator::setup_texture_anims_common() {
|
||||
}
|
||||
|
||||
m_security_anim_array_idx = create_fixed_anim_array({env, dot});
|
||||
if (this->m_version == GameVersion::Jak3) {
|
||||
if (this->m_version == GameVersion::Jak3 || this->m_version == GameVersion::JakX) {
|
||||
m_comb_field_anim_array_idx = create_fixed_anim_array({env, dot});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1265,7 +1265,8 @@ void Merc2::do_draws(const Draw* draw_array,
|
||||
if (draw.texture < (int)lev->textures.size() && draw.texture >= 0) {
|
||||
glBindTexture(GL_TEXTURE_2D, lev->textures.at(draw.texture));
|
||||
} else if ((draw.texture & 0xffffff00) == 0xefffff00) {
|
||||
if (render_state->version >= GameVersion::Jak3) {
|
||||
if (render_state->version == GameVersion::Jak3 ||
|
||||
render_state->version == GameVersion::JakX) {
|
||||
auto maybe_eye =
|
||||
render_state->eye_renderer->lookup_eye_texture_hash(draw.hash, (draw.texture & 1));
|
||||
if (maybe_eye) {
|
||||
|
||||
@@ -31,6 +31,7 @@ void OceanMidAndFar::render(DmaFollower& dma,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
render_jak2(dma, render_state, prof);
|
||||
break;
|
||||
}
|
||||
@@ -176,6 +177,7 @@ void OceanMidAndFar::handle_ocean_mid(DmaFollower& dma,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
m_mid_renderer.run_jak2(dma, render_state, prof);
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -39,6 +39,7 @@ void OceanNear::render(DmaFollower& dma,
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
render_jak2(dma, render_state, prof);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -69,6 +69,7 @@ void OceanTexture::init_textures(TexturePool& pool, GameVersion version) {
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
m_tex0_gpu = pool.give_texture_and_load_to_vram(in, OCEAN_TEX_TBP_JAK2);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -171,7 +171,8 @@ void Sprite3::handle_sprite_frame_setup(DmaFollower& dma,
|
||||
m_frame_data.from_jak1(jak1_data);
|
||||
} break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3: {
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX: {
|
||||
render_state->shaders[ShaderId::SPRITE3].activate();
|
||||
auto frame_data = dma.read_and_advance();
|
||||
ASSERT(frame_data.size_bytes == (int)sizeof(SpriteFrameData)); // very cool
|
||||
@@ -379,6 +380,7 @@ void Sprite3::render_2d_group1(DmaFollower& dma,
|
||||
ASSERT(run.vifcode1().immediate == SpriteProgMem::Sprites2dHud_Jak2);
|
||||
break;
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
ASSERT_EQ_IMM(run.vifcode1().immediate, (int)SpriteProgMem::Sprites2dHud_Jak3);
|
||||
break;
|
||||
default:
|
||||
@@ -397,6 +399,7 @@ void Sprite3::render(DmaFollower& dma, SharedRenderState* render_state, ScopedPr
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
render_jak2(dma, render_state, prof);
|
||||
break;
|
||||
default:
|
||||
@@ -835,7 +838,7 @@ void Sprite3::do_block_common(SpriteMode mode,
|
||||
|
||||
auto& vert1 = m_vertices_3d.at(start_vtx_id + 0);
|
||||
|
||||
if (render_state->version == GameVersion::Jak3) {
|
||||
if (render_state->version == GameVersion::Jak3 || render_state->version == GameVersion::JakX) {
|
||||
auto flag = m_vec_data_2d[sprite_idx].flag();
|
||||
|
||||
if ((flag & 0x10) || (flag & 0x20)) {
|
||||
|
||||
@@ -213,6 +213,7 @@ void Sprite3::distort_dma(GameVersion version, DmaFollower& dma, ScopedProfilerN
|
||||
break;
|
||||
case GameVersion::Jak2:
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
expect_zbp = 0x130;
|
||||
expect_th = 9;
|
||||
break;
|
||||
|
||||
@@ -48,7 +48,8 @@ constexpr bool run_dma_copy = false;
|
||||
|
||||
constexpr PerGameVersion<int> fr3_level_count(jak1::LEVEL_TOTAL,
|
||||
jak2::LEVEL_TOTAL,
|
||||
jak3::LEVEL_TOTAL);
|
||||
jak3::LEVEL_TOTAL,
|
||||
jakx::LEVEL_TOTAL);
|
||||
|
||||
struct GraphicsData {
|
||||
// vsync
|
||||
|
||||
@@ -314,6 +314,7 @@ const std::vector<u32>& get_tpage_dir(GameVersion version) {
|
||||
case GameVersion::Jak2:
|
||||
return get_jak2_tpage_dir();
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
return get_jak3_tpage_dir();
|
||||
default:
|
||||
ASSERT(false);
|
||||
@@ -401,6 +402,7 @@ PcTextureId TexturePool::allocate_pc_port_texture(GameVersion version) {
|
||||
case GameVersion::Jak2:
|
||||
return PcTextureId(get_jak2_tpage_dir().size() - 1, m_next_pc_texture_to_allocate++);
|
||||
case GameVersion::Jak3:
|
||||
case GameVersion::JakX:
|
||||
return PcTextureId(get_jak3_tpage_dir().size() - 1, m_next_pc_texture_to_allocate++);
|
||||
default:
|
||||
ASSERT_NOT_REACHED();
|
||||
|
||||
@@ -51,10 +51,11 @@ enum GoalFileType {
|
||||
SND_BNK_FILE_TYPE = 0x3c,
|
||||
MUSIC_BNK_FILE_TYPE = 0x3d,
|
||||
VAG_FILE_TYPE = 0x3e,
|
||||
MISC_FILE_TYPE = 0x3f, // jak2 only
|
||||
MAP_FILE_TYPE = 0x40, // jak2 only
|
||||
CL_FILE_TYPE = 0x41, // jak 3 cloth animation
|
||||
MISC_FILE_TYPE = 0x3f, // jak2 only
|
||||
MAP_FILE_TYPE = 0x40, // jak2 only
|
||||
CL_FILE_TYPE = 0x41, // jak 3 cloth animation
|
||||
FLASH_FILE_TYPE = 0x42, // jak x idk
|
||||
REFPLANT_FILE_TYPE = 0x301,
|
||||
// added this, allows access directly to out/iso from fileio.
|
||||
ISO_FILE_TYPE = 0x302
|
||||
};
|
||||
};
|
||||
|
||||
@@ -87,10 +87,17 @@ struct link_control {
|
||||
Ptr<kheapinfo> heap,
|
||||
uint32_t flags);
|
||||
|
||||
void jakx_begin(Ptr<uint8_t> object_file,
|
||||
const char* name,
|
||||
int32_t size,
|
||||
Ptr<kheapinfo> heap,
|
||||
uint32_t flags);
|
||||
|
||||
// was originally "work"
|
||||
uint32_t jak1_work();
|
||||
uint32_t jak2_work();
|
||||
uint32_t jak3_work();
|
||||
uint32_t jakx_work();
|
||||
|
||||
uint32_t jak1_work_v3();
|
||||
uint32_t jak1_work_v2();
|
||||
@@ -101,10 +108,14 @@ struct link_control {
|
||||
uint32_t jak3_work_v2_v4();
|
||||
uint32_t jak3_work_v5();
|
||||
uint32_t jak3_work_opengoal();
|
||||
uint32_t jakx_work_v2_v4();
|
||||
uint32_t jakx_work_v5();
|
||||
uint32_t jakx_work_opengoal();
|
||||
|
||||
void jak1_finish(bool jump_from_c_to_goal);
|
||||
void jak2_finish(bool jump_from_c_to_goal);
|
||||
void jak3_finish(bool jump_from_c_to_goal);
|
||||
void jakx_finish(bool jump_from_c_to_goal);
|
||||
|
||||
void reset() {
|
||||
m_object_data.offset = 0;
|
||||
|
||||
@@ -304,6 +304,16 @@ s32 kwrite(u64 fs, u64 buffer, s32 size) {
|
||||
return result;
|
||||
}
|
||||
|
||||
s32 kmkdir(u64 name) {
|
||||
char acStack_90[128];
|
||||
if (Ptr<String>(name)->data()[4] == '/') { // start from the fourth character?
|
||||
sprintf(acStack_90, "%s", Ptr<String>(name)->data() + 5);
|
||||
} else {
|
||||
sprintf(acStack_90, "host:%s", Ptr<String>(name)->data() + 4);
|
||||
}
|
||||
return ee::sceMkDir(acStack_90, 0x1fd);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Close a file stream.
|
||||
*/
|
||||
|
||||
@@ -49,6 +49,7 @@ s32 klength(u64 fs);
|
||||
s32 kseek(u64 fs, s32 offset, s32 where);
|
||||
s32 kread(u64 fs, u64 buffer, s32 size);
|
||||
s32 kwrite(u64 fs, u64 buffer, s32 size);
|
||||
s32 kmkdir(u64 name);
|
||||
u64 kclose(u64 fs);
|
||||
void dma_to_iop();
|
||||
u64 DecodeLanguage();
|
||||
|
||||
@@ -11,8 +11,8 @@
|
||||
|
||||
void kmemcard_init_globals();
|
||||
|
||||
constexpr PerGameVersion<s32> SAVE_SIZE(692, 1204, 1060); // 691 for jak 1 v1
|
||||
constexpr PerGameVersion<s32> BANK_SIZE(0x10000, 0x20000, 0x1e000);
|
||||
constexpr PerGameVersion<s32> SAVE_SIZE(692, 1204, 1060, 1060); // 691 for jak 1 v1
|
||||
constexpr PerGameVersion<s32> BANK_SIZE(0x10000, 0x20000, 0x1e000, 0x1e000);
|
||||
|
||||
// each card can be in one of these states:
|
||||
enum class MemoryCardState : u32 {
|
||||
|
||||
@@ -32,4 +32,8 @@ constexpr u32 DEBUG_HEAP_SIZE = 0x2f00000;
|
||||
|
||||
namespace jak3 {
|
||||
constexpr u32 DEBUG_HEAP_SIZE = 0x2f00000;
|
||||
}
|
||||
}
|
||||
|
||||
namespace jakx {
|
||||
constexpr u32 DEBUG_HEAP_SIZE = 0x2f00000;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,266 @@
|
||||
#include "fileio.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "game/kernel/common/fileio.h"
|
||||
|
||||
namespace jakx {
|
||||
|
||||
// This file naming system was used only in development, as it loads files from the development PC
|
||||
// connected to the PS2 dev-kit.
|
||||
// My theory is that the developers would use this to debug their level/art tools. They could use
|
||||
// these file names to quickly load in new files and see if they worked correctly with the renderer,
|
||||
// without needing to create/load entire new DGO files.
|
||||
// They've been adding to this file over all 3 games, so I believe it is more than just a leftover
|
||||
// from early jak 1.
|
||||
|
||||
/*!
|
||||
* Convert a file-name like $CODE/thing to the appropriate file path on the development computer.
|
||||
*/
|
||||
char* DecodeFileName(const char* name) {
|
||||
char* result;
|
||||
|
||||
if (name[0] == '$') {
|
||||
if (!strncmp(name, "$TEXTURE/", 9)) {
|
||||
result = MakeFileName(TX_PAGE_FILE_TYPE, name + 9, 0);
|
||||
} else if (!strncmp(name, "$ART_GROUP/", 0xb)) {
|
||||
result = MakeFileName(ART_GROUP_FILE_TYPE, name + 0xb, 0);
|
||||
} else if (!strncmp(name, "$LEVEL/", 7)) {
|
||||
int len = (int)strlen(name);
|
||||
if (name[len - 4] == '.') {
|
||||
result = MakeFileName(LEVEL_WITH_EXTENSION_FILE_TYPE, name + 7, 0);
|
||||
} else {
|
||||
// level files can omit a file type if desired
|
||||
result = MakeFileName(LEVEL_FILE_TYPE, name + 7, 0);
|
||||
}
|
||||
} else if (!strncmp(name, "$FINAL/", 6)) { // in jak2, this is FINAL instead of DATA
|
||||
result = MakeFileName(DATA_FILE_TYPE, name + 6, 0);
|
||||
} else if (!strncmp(name, "$CODE/", 6)) {
|
||||
result = MakeFileName(CODE_FILE_TYPE, name + 6, 0);
|
||||
} else if (!strncmp(name, "$RES/", 5)) {
|
||||
result = MakeFileName(RES_FILE_TYPE, name + 5, 0);
|
||||
} else if (!strncmp(name, "$MISC/", 6)) {
|
||||
result = MakeFileName(MISC_FILE_TYPE, name + 6, 0);
|
||||
} else if (!strncmp(name, "$MAP/", 5)) {
|
||||
result = MakeFileName(MAP_FILE_TYPE, name + 5, 0);
|
||||
} else if (!strncmp(name, "$FLASH/", 7)) {
|
||||
result = MakeFileName(FLASH_FILE_TYPE, name + 7, 0);
|
||||
} else {
|
||||
printf("[ERROR] DecodeFileName: UNKNOWN FILE NAME %s\n", name);
|
||||
result = nullptr;
|
||||
}
|
||||
} else {
|
||||
// no prefix. Treat this as a code file
|
||||
return MakeFileName(CODE_FILE_TYPE, name, 0);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Create a file name that looks in the appropriate folder in ND's development environment.
|
||||
* This is a bit of dumping ground for all possible files they'd load.
|
||||
*/
|
||||
char* MakeFileName(int type, const char* name, int new_string) {
|
||||
using namespace versions::jakx;
|
||||
// start with network filesystem
|
||||
// kstrcpy(buffer_633, "host:");
|
||||
kstrcpy(buffer_633, "");
|
||||
char* buf = strend(buffer_633);
|
||||
|
||||
// prefix to build directory
|
||||
char prefix[128];
|
||||
kstrcpy(prefix, FOLDER_PREFIX);
|
||||
|
||||
switch (type) {
|
||||
// Unused files that could be used to exchange data between the dev PS2 and the GOAL compiler.
|
||||
case LISTENER_TO_KERNEL_FILE_TYPE:
|
||||
kstrcpy(buf, "kernel/LISTENERTOKERNEL");
|
||||
break;
|
||||
case KERNEL_TO_LISTENER_FILE_TYPE:
|
||||
kstrcpy(buf, "kernel/KERNELTOLISTENER");
|
||||
break;
|
||||
|
||||
// A GOAL object file containing code built from the GOAL compiler.
|
||||
case CODE_FILE_TYPE:
|
||||
sprintf(buf, "game/obj/%s.o", name);
|
||||
break;
|
||||
|
||||
// Unused, opening the gamepad as a file.
|
||||
case GAMEPAD_FILE_TYPE:
|
||||
sprintf(buffer_633, "pad:0");
|
||||
break;
|
||||
|
||||
// Locks for the unused kernel/listener interface. (funny that they added this after...)
|
||||
case LISTENER_TO_KERNEL_LOCK_FILE_TYPE:
|
||||
kstrcpy(buf, "kernel/LISTENERTOKERNEL_LOCK");
|
||||
break;
|
||||
case KERNEL_TO_LISTENER_LOCK_FILE_TYPE:
|
||||
kstrcpy(buf, "kernel/KERNELTOLISTENER_LOCK");
|
||||
break;
|
||||
|
||||
// Host0 IOP modules (stored on the linux SBC inside the dev ps2 itself!)
|
||||
case IOP_MODULE_FILE_TYPE: // 8
|
||||
sprintf(buffer_633, "host0:/usr/local/sce/iop/modules/%s.irx", name);
|
||||
break;
|
||||
|
||||
// plain GOAL data object file
|
||||
case DATA_FILE_TYPE: // 0x20
|
||||
// sprintf(buf, "%sfinal/%s.go", prefix, name);
|
||||
sprintf(buf, "%sout/jakx/obj/%s.go", prefix, name);
|
||||
break;
|
||||
|
||||
// texture page
|
||||
case TX_PAGE_FILE_TYPE: // 0x21
|
||||
// sprintf(buf, "%sfinal/texture-page%d/%s.go", prefix, TX_PAGE_VERSION, name);
|
||||
sprintf(buf, "%sout/jakx/obj/%s.go", prefix, name);
|
||||
break;
|
||||
|
||||
// joint animation
|
||||
case JA_FILE_TYPE: // 0x22
|
||||
sprintf(buf, "%sdb/artdata%d/%s-ja.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// joint geo (skeleton)
|
||||
case JG_FILE_TYPE: // 0x23
|
||||
sprintf(buf, "%sdb/artdata%d/%s-jg.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// mesh animation (unused)
|
||||
case MA_FILE_TYPE: // 0x24
|
||||
sprintf(buf, "%sdb/artdata%d/%s-ma.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// likely art-mesh-geo, and unused. Maybe was used before MERC?
|
||||
case MG_FILE_TYPE: // 0x25
|
||||
sprintf(buf, "%sdb/artdata%d/%s-mg.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// text group perhaps?
|
||||
case TG_FILE_TYPE:
|
||||
sprintf(buf, "%sfinal/%s-tg.go", prefix, name);
|
||||
break;
|
||||
|
||||
// level file
|
||||
case LEVEL_FILE_TYPE: // 0x27
|
||||
sprintf(buf, "%sfinal/level%d/%s-bt.go", prefix, LEVEL_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
case 0x28: // 0x28
|
||||
case 0x29: // 0x29
|
||||
sprintf(buf, "%sfinal/texture-page%d/%s.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// Everybody's favorite "art group" file. Container of different art.
|
||||
case ART_GROUP_FILE_TYPE: // 0x30
|
||||
// sprintf(buf, "%sfinal/art-group%d/%s-ag.go", prefix, ART_FILE_VERSION, name);
|
||||
sprintf(buf, "%sout/jakx/obj/%s.go", prefix, name);
|
||||
break;
|
||||
|
||||
// GOAL data object file containing visibility data. This likely contained the visibility data
|
||||
// that's included in the BSP file.
|
||||
case VS_FILE_TYPE: // 0x31
|
||||
sprintf(buf, "%sfinal/level%d/%s-vs.go", prefix, LEVEL_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// GOAL data object file containing text. Likely the same format as the .TXT in final ISOs.
|
||||
case TX_FILE_TYPE: // 0x32
|
||||
sprintf(buf, "%sfinal/res%d/%s-tx.go", prefix, DGO_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// Binary format visibility. Likely the format of Jak 1's .VIS files.
|
||||
case VS_BIN_FILE_TYPE: // 0x33
|
||||
sprintf(buf, "%sfinal/level%d/%s-vs.bin", prefix, LEVEL_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// DGO description files. These contain a list of files inside each DGO.
|
||||
case DGO_TXT_FILE_TYPE: // 0x34
|
||||
sprintf(buf, "%sfinal/dgo%d/%s.txt", prefix, DGO_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// Level file! but you have to provide the extension.
|
||||
case LEVEL_WITH_EXTENSION_FILE_TYPE: // 0x35
|
||||
sprintf(buf, "%sfinal/level%d/%s", prefix, LEVEL_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// DGO and CGO files. These can exist in either final/ or game/
|
||||
case DATA_DGO_FILE_TYPE: // 0x36
|
||||
sprintf(buf, "%sfinal/dgo%d/%s.dgo", prefix, DGO_FILE_VERSION, name);
|
||||
break;
|
||||
case GAME_DGO_FILE_TYPE: // 0x37
|
||||
sprintf(buf, "game/dgo%d/%s.dgo", DGO_FILE_VERSION, name);
|
||||
break;
|
||||
case DATA_CGO_FILE_TYPE: // 0x38
|
||||
sprintf(buf, "%sfinal/dgo%d/%s.cgo", prefix, DGO_FILE_VERSION, name);
|
||||
break;
|
||||
case GAME_CGO_FILE_TYPE: // 0x39
|
||||
sprintf(buf, "game/dgo%d/%s.cgo", DGO_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// Jak 1 had a weird game-cnt.gco file containing the total number of orbs/cells.
|
||||
case CNT_FILE_TYPE: // 0x3a
|
||||
sprintf(buf, "%sfinal/res%d/game-cnt.go", prefix, DGO_FILE_VERSION);
|
||||
break;
|
||||
|
||||
// Any res file with .go extension.
|
||||
case RES_FILE_TYPE: // 0x3b
|
||||
sprintf(buf, "%sfinal/res%d/%s.go", prefix, 1, name);
|
||||
break;
|
||||
|
||||
// sound bank (sound effects)
|
||||
case SND_BNK_FILE_TYPE: // 0x3c
|
||||
sprintf(buf, "%sfinal/sound%d/%s.bnk", prefix, 1, name); // v1
|
||||
break;
|
||||
|
||||
// music file
|
||||
case MUSIC_BNK_FILE_TYPE: // 0x3d
|
||||
sprintf(buf, "%sfinal/music%d/%s.bnk", prefix, 1, name); // v1
|
||||
break;
|
||||
|
||||
// vag file, but it probably doesn't work due to the file extension.
|
||||
case VAG_FILE_TYPE: // 0x3e
|
||||
// interestingly, jak 2 used vagwad2, but jak 3 doesn't. But the memory bug is still there.
|
||||
sprintf(buf, "%sfinal/vagwad/%s.%s", prefix, name, "<INVALID>"); // v1, memory bug here
|
||||
break;
|
||||
|
||||
// whatever you want.
|
||||
case MISC_FILE_TYPE: // 0x3f
|
||||
sprintf(buf, "%sfinal/misc/%s", prefix, name);
|
||||
break;
|
||||
|
||||
// possible minimap/bigmap data
|
||||
case MAP_FILE_TYPE:
|
||||
sprintf(buf, "%sfinal/map%d/%s.go", prefix, DGO_FILE_VERSION, name); // v1
|
||||
break;
|
||||
|
||||
// jak 3 cloth animation file.
|
||||
case CL_FILE_TYPE: // 0x41
|
||||
sprintf(buf, "%sdb/artdata%d/%s-cl.go", prefix, ART_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
case FLASH_FILE_TYPE: // 0x42:
|
||||
sprintf(buf, "%sfinal/flash%d/%s.go", prefix, DGO_FILE_VERSION, name);
|
||||
break;
|
||||
|
||||
// no idea
|
||||
case REFPLANT_FILE_TYPE: // 0x301
|
||||
sprintf(buf, "%sdb/config/refplant/%s", prefix, name);
|
||||
break;
|
||||
default:
|
||||
printf("UNKNOWN FILE TYPE %d\n", type);
|
||||
}
|
||||
|
||||
char* result;
|
||||
if (!new_string) {
|
||||
// return pointer to static filename buffer
|
||||
result = buffer_633;
|
||||
} else {
|
||||
// or create a new string on the global heap.
|
||||
int l = (int)strlen(buffer_633);
|
||||
result = (char*)kmalloc(kglobalheap, l + 1, 0, "filename").c();
|
||||
kstrcpy(result, buffer_633);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace jakx
|
||||
@@ -0,0 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
namespace jakx {
|
||||
char* MakeFileName(int type, const char* name, int new_string);
|
||||
char* DecodeFileName(const char* name);
|
||||
} // namespace jakx
|
||||
@@ -0,0 +1,187 @@
|
||||
#include "kboot.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "common/log/log.h"
|
||||
#include "common/repl/repl_wrapper.h"
|
||||
#include "common/util/Timer.h"
|
||||
|
||||
#include "game/common/game_common_types.h"
|
||||
#include "game/kernel/common/Ptr.h"
|
||||
#include "game/kernel/common/Symbol4.h"
|
||||
#include "game/kernel/common/kboot.h"
|
||||
#include "game/kernel/common/klisten.h"
|
||||
#include "game/kernel/common/kprint.h"
|
||||
#include "game/kernel/common/kscheme.h"
|
||||
#include "game/kernel/common/ksocket.h"
|
||||
#include "game/kernel/jakx/klisten.h"
|
||||
#include "game/kernel/jakx/kmachine.h"
|
||||
#include "game/sce/libscf.h"
|
||||
|
||||
// KernelDispatch__3ndiPFv_x
|
||||
// KernelCheckAndDispatch__3ndiv
|
||||
// KernelShutdown__3ndii
|
||||
// main
|
||||
|
||||
namespace jakx {
|
||||
int KernelCheckAndDispatch();
|
||||
|
||||
char DebugBootUser[64];
|
||||
char DebugBootArtGroup[64];
|
||||
|
||||
void kboot_init_globals() {
|
||||
memset(DebugBootUser, 0, sizeof(DebugBootUser));
|
||||
memset(DebugBootArtGroup, 0, sizeof(DebugBootArtGroup));
|
||||
// strcpy(DebugBootUser, "unknown");
|
||||
// CHANGED : let's just try to find the username automatically by default!
|
||||
// the default is still "unknown"
|
||||
auto username = REPL::find_repl_username();
|
||||
strcpy(DebugBootUser, username.c_str());
|
||||
}
|
||||
|
||||
s32 goal_main(int argc, const char* const* argv) {
|
||||
// s32 thread_id = GetThreadId();
|
||||
// ChangeThreadPriority(thread_id, 0x18);
|
||||
// sceGsSyncVCallback(FUN_0026a918_probably_kernel);
|
||||
// DAT_002833fc = 1;
|
||||
// InitOnce_WS();
|
||||
|
||||
// only in PC port
|
||||
InitParms(argc, argv);
|
||||
|
||||
masterConfig.aspect = ee::sceScfGetAspect();
|
||||
auto sony_language = ee::sceScfGetLanguage();
|
||||
masterConfig.inactive_timeout = 0;
|
||||
masterConfig.volume = 100;
|
||||
masterConfig.timeout = 0;
|
||||
switch (sony_language) {
|
||||
case SCE_JAPANESE_LANGUAGE:
|
||||
masterConfig.language = 6; // NOTE: Why UK_English and not Japanese?
|
||||
break;
|
||||
case SCE_FRENCH_LANGUAGE: // 2 -> 1
|
||||
masterConfig.language = (u16)Language::French;
|
||||
break;
|
||||
case SCE_SPANISH_LANGUAGE: // 3 -> 3
|
||||
masterConfig.language = (u16)Language::Spanish;
|
||||
break;
|
||||
case SCE_GERMAN_LANGUAGE: // 4 -> 2
|
||||
masterConfig.language = (u16)Language::German;
|
||||
break;
|
||||
case SCE_ITALIAN_LANGUAGE: // 5 -> 4
|
||||
masterConfig.language = (u16)Language::Italian;
|
||||
break;
|
||||
case SCE_PORTUGUESE_LANGUAGE:
|
||||
masterConfig.language = (u16)Language::Portuguese;
|
||||
break;
|
||||
default:
|
||||
masterConfig.language = (u16)Language::English;
|
||||
break;
|
||||
}
|
||||
// Set up aspect ratio override in demo
|
||||
if (!strcmp(DebugBootMessage, "demo") || !strcmp(DebugBootMessage, "demo-shared")) {
|
||||
masterConfig.aspect = SCE_ASPECT_FULL;
|
||||
}
|
||||
// removed in PC port
|
||||
// DiskBoot = 1;
|
||||
// MasterDebug = 0;
|
||||
// DebugSegment = 0;
|
||||
// DebugSymbols = 0;
|
||||
|
||||
// Launch GOAL!
|
||||
int initMachineResult = InitMachine();
|
||||
bool result = (initMachineResult & 0xfff00000) == 0xfff00000;
|
||||
int shutdownReason;
|
||||
if (result) {
|
||||
printf("kboot: error; failed to initialize machine (result=0x%08x)\n", initMachineResult);
|
||||
shutdownReason = 2;
|
||||
} else {
|
||||
shutdownReason = KernelCheckAndDispatch(); // run kernel
|
||||
}
|
||||
ShutdownMachine(shutdownReason); // kernel died, we should too.
|
||||
// movie playback stuff?
|
||||
if (MasterExit == RuntimeExitStatus::EXIT) {
|
||||
// LoadExecPS2("cdrom0:\\NETGUI\\NTGUI_EU.ELF;1", 1, &movie_args_Q);
|
||||
} else if (MasterExit == RuntimeExitStatus::RESTART_IN_DEBUG) {
|
||||
char printBuffer[32];
|
||||
sprintf(printBuffer, "cdrom0:\\SCES_%.3s.%2s;1", "532", "86");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void KernelDispatch(u32 dispatcher_func) {
|
||||
// place our stack at the end of EE memory
|
||||
u64 goal_stack = u64(g_ee_main_mem) + EE_MAIN_MEM_SIZE - 8;
|
||||
|
||||
// try to get a message from the listener, and process it if needed
|
||||
Ptr<char> new_message = WaitForMessageAndAck();
|
||||
if (new_message.offset) {
|
||||
ProcessListenerMessage(new_message);
|
||||
}
|
||||
|
||||
// remember the old listener
|
||||
auto old_listener_function = ListenerFunction->value();
|
||||
|
||||
// run the kernel!
|
||||
Timer dispatch_timer;
|
||||
if (MasterUseKernel) {
|
||||
call_goal_on_stack(Ptr<Function>(dispatcher_func), goal_stack, s7.offset, g_ee_main_mem);
|
||||
} else {
|
||||
// added, just calls the listener function
|
||||
if (ListenerFunction->value() != s7.offset) {
|
||||
auto result = call_goal_on_stack(Ptr<Function>(ListenerFunction->value()), goal_stack,
|
||||
s7.offset, g_ee_main_mem);
|
||||
#ifdef __linux__
|
||||
cprintf("%ld\n", result);
|
||||
#else
|
||||
cprintf("%lld\n", result);
|
||||
#endif
|
||||
ListenerFunction->value() = s7.offset;
|
||||
}
|
||||
}
|
||||
|
||||
float time_ms = dispatch_timer.getMs();
|
||||
if (time_ms > 50) {
|
||||
lg::print("Kernel dispatch time: {:.3f} ms\n", time_ms);
|
||||
}
|
||||
|
||||
// flush stdout
|
||||
ClearPending();
|
||||
|
||||
// now run the extra "kernel function"
|
||||
auto bonus_function = KernelFunction->value();
|
||||
if (bonus_function != s7.offset) {
|
||||
// clear the pending kernel function
|
||||
KernelFunction->value() = s7.offset;
|
||||
// and run
|
||||
call_goal_on_stack(Ptr<Function>(bonus_function), goal_stack, s7.offset, g_ee_main_mem);
|
||||
}
|
||||
|
||||
// send ack to indicate that the listener function has been processed and the result printed
|
||||
if (MasterDebug && ListenerFunction->value() != old_listener_function) {
|
||||
SendAck();
|
||||
}
|
||||
|
||||
// prevent crazy spinning if we're not vsyncing (added)
|
||||
if (time_ms < 4) {
|
||||
std::this_thread::sleep_for(std::chrono::microseconds(1000));
|
||||
}
|
||||
}
|
||||
|
||||
void KernelShutdown(u32 reason) {
|
||||
if ((u32)MasterExit < reason) {
|
||||
MasterExit = (RuntimeExitStatus)reason;
|
||||
}
|
||||
}
|
||||
|
||||
int KernelCheckAndDispatch() {
|
||||
// TODO - jak x
|
||||
/*while (MasterExit == RuntimeExitStatus::RUNNING && !POWERING_OFF_W) {
|
||||
KernelDispatch(kernel_dispatcher->value());
|
||||
}
|
||||
if (POWERING_OFF_W) {
|
||||
KernelShutdown(3);
|
||||
}*/
|
||||
return (u32)MasterExit;
|
||||
}
|
||||
|
||||
} // namespace jakx
|
||||
@@ -0,0 +1,11 @@
|
||||
#pragma once
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
namespace jakx {
|
||||
extern char DebugBootUser[64];
|
||||
extern char DebugBootArtGroup[64];
|
||||
void kboot_init_globals();
|
||||
void KernelShutdown(u32 reason);
|
||||
s32 goal_main(int argc, const char* const* argv);
|
||||
} // namespace jakx
|
||||
@@ -0,0 +1,235 @@
|
||||
#include "kdgo.h"
|
||||
|
||||
#include "common/global_profiler/GlobalProfiler.h"
|
||||
#include "common/log/log.h"
|
||||
#include "common/util/Timer.h"
|
||||
|
||||
#include "game/kernel/common/fileio.h"
|
||||
#include "game/kernel/common/kdgo.h"
|
||||
#include "game/kernel/common/kmalloc.h"
|
||||
#include "game/kernel/common/kprint.h"
|
||||
#include "game/kernel/jakx/kboot.h"
|
||||
#include "game/kernel/jakx/klink.h"
|
||||
#include "game/kernel/jakx/kmachine.h"
|
||||
#include "game/overlord/jakx/rpc_interface.h"
|
||||
|
||||
namespace jakx {
|
||||
|
||||
jakx::RPC_Dgo_Cmd* sLastMsg; //! Last DGO command sent to IOP
|
||||
jakx::RPC_Dgo_Cmd sMsg[2]; //! DGO message buffers
|
||||
uint16_t cgo_id = 10;
|
||||
|
||||
void kdgo_init_globals() {
|
||||
sLastMsg = nullptr;
|
||||
memset(sMsg, 0, sizeof(sMsg));
|
||||
cgo_id = 10;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Send message to IOP to start loading a new DGO file
|
||||
* Uses a double-buffered message buffer
|
||||
* @param name: the name of the DGO file
|
||||
* @param buffer1 : one of the two file loading buffers
|
||||
* @param buffer2 : the other of the two file loading buffers
|
||||
* @param currentHeap : the current heap (for loading directly into the heap).
|
||||
*
|
||||
* DONE,
|
||||
* MODIFIED : Added print statement to indicate when DGO load starts.
|
||||
*/
|
||||
void BeginLoadingDGO(const char* name, Ptr<u8> buffer1, Ptr<u8> buffer2, Ptr<u8> currentHeap) {
|
||||
u8 msgID = sMsgNum;
|
||||
RPC_Dgo_Cmd* mess = sMsg + sMsgNum;
|
||||
sMsgNum = sMsgNum ^ 1; // toggle message buffer.
|
||||
RpcSync(DGO_RPC_CHANNEL); // make sure old RPC is finished
|
||||
|
||||
// put a dummy value here just to make sure the IOP overwrites it.
|
||||
sMsg[msgID].status = DGO_RPC_RESULT_INIT; // !! this is 666
|
||||
|
||||
// inform IOP of buffers
|
||||
sMsg[msgID].buffer1 = buffer1.offset;
|
||||
sMsg[msgID].buffer2 = buffer2.offset;
|
||||
|
||||
// also give a heap pointer so it can load the last object file directly into the heap to save the
|
||||
// precious time.
|
||||
sMsg[msgID].buffer_heap_top = currentHeap.offset;
|
||||
|
||||
// new for Jak 3: a unique ID.
|
||||
sMsg[msgID].cgo_id = cgo_id;
|
||||
cgo_id++;
|
||||
|
||||
// file name
|
||||
strcpy(sMsg[msgID].name, name);
|
||||
lg::debug("[Begin Loading DGO RPC] {}, 0x{:x}, 0x{:x}, 0x{:x}", name, buffer1.offset,
|
||||
buffer2.offset, currentHeap.offset);
|
||||
// this RPC will return once we have loaded the first object file.
|
||||
// but we call async, so we don't block here.
|
||||
RpcCall(DGO_RPC_CHANNEL, DGO_RPC_LOAD_FNO, true, mess, sizeof(RPC_Dgo_Cmd), mess,
|
||||
sizeof(RPC_Dgo_Cmd));
|
||||
sLastMsg = mess;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Get the next object in the DGO. Will block until something is loaded.
|
||||
* @param lastObjectFlag: will get set to 1 if this is the last object.
|
||||
*
|
||||
* DONE,
|
||||
* MODIFIED : added exception if the sLastMessage isn't set (game just returns null as buffer)
|
||||
*/
|
||||
Ptr<u8> GetNextDGO(u32* lastObjectFlag) {
|
||||
*lastObjectFlag = 1;
|
||||
// Wait for RPC function to respond. This will happen once the first object file is loaded.
|
||||
RpcSync(DGO_RPC_CHANNEL);
|
||||
Ptr<u8> buffer(0);
|
||||
if (sLastMsg) {
|
||||
// if we got a good result, get pointer to object
|
||||
if ((sLastMsg->status == DGO_RPC_RESULT_MORE) || (sLastMsg->status == DGO_RPC_RESULT_DONE)) {
|
||||
buffer.offset =
|
||||
sLastMsg->buffer1; // buffer 1 always contains location of most recently loaded object.
|
||||
}
|
||||
|
||||
// not the last one, so don't set the flag.
|
||||
if (sLastMsg->status == DGO_RPC_RESULT_MORE) {
|
||||
*lastObjectFlag = 0;
|
||||
}
|
||||
|
||||
// no pending message.
|
||||
sLastMsg = nullptr;
|
||||
} else {
|
||||
// I don't see how this case can happen unless there's a bug. The game does check for this and
|
||||
// nothing in this case. (maybe from GOAL this can happen?)
|
||||
printf("last message not set!\n"); // NOTE: this case was not present in Jak Xh
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/*!
|
||||
* Instruct the IOP to continue loading the next object.
|
||||
* Only should be called once it is safe to overwrite the previous.
|
||||
* @param heapPtr : pointer to heap so the IOP could try to load directly into a heap if it wants.
|
||||
* This should be updated after each object file load to make sure the IOP knows the exact location
|
||||
* of the end of the GOAL heap data.
|
||||
*
|
||||
* Unlike jak 1, we update buffer1 and buffer2 here for borrow heap loads.
|
||||
*/
|
||||
void ContinueLoadingDGO(Ptr<u8> b1, Ptr<u8> b2, Ptr<u8> heapPtr) {
|
||||
u32 msgID = sMsgNum;
|
||||
jakx::RPC_Dgo_Cmd* sendBuff = sMsg + sMsgNum;
|
||||
sMsgNum = sMsgNum ^ 1;
|
||||
sMsg[msgID].status = DGO_RPC_RESULT_INIT;
|
||||
sMsg[msgID].buffer1 = b1.offset;
|
||||
sMsg[msgID].buffer2 = b2.offset;
|
||||
sendBuff->buffer_heap_top = heapPtr.offset;
|
||||
// the IOP will wait for this RpcCall to continue the DGO state machine.
|
||||
RpcCall(DGO_RPC_CHANNEL, DGO_RPC_LOAD_NEXT_FNO, true, sendBuff, sizeof(jakx::RPC_Dgo_Cmd),
|
||||
sendBuff, sizeof(jakx::RPC_Dgo_Cmd));
|
||||
// this async RPC call will complete when the next object is fully loaded.
|
||||
sLastMsg = sendBuff;
|
||||
}
|
||||
/*!
|
||||
* Load and link a DGO file.
|
||||
* This does not use the mutli-threaded linker and will block until the entire file is done.
|
||||
*/
|
||||
void load_and_link_dgo(u64 name_gstr, u64 heap_info, u64 flag, u64 buffer_size) {
|
||||
auto name = Ptr<char>(name_gstr + 4).c();
|
||||
auto heap = Ptr<kheapinfo>(heap_info);
|
||||
load_and_link_dgo_from_c(name, heap, flag, buffer_size, false);
|
||||
}
|
||||
|
||||
/*!
|
||||
* Load and link a DGO file.
|
||||
* This does not use the mutli-threaded linker and will block until the entire file is done.e
|
||||
*/
|
||||
void load_and_link_dgo_from_c(const char* name,
|
||||
Ptr<kheapinfo> heap,
|
||||
u32 linkFlag,
|
||||
s32 bufferSize,
|
||||
bool jump_from_c_to_goal) {
|
||||
Timer timer;
|
||||
lg::debug("[Load and Link DGO From C] {}", name);
|
||||
|
||||
// remember where the heap top point is so we can clear temporary allocations
|
||||
auto oldHeapTop = heap->top;
|
||||
|
||||
// allocate temporary buffers from top of the given heap
|
||||
// align 64 for IOP DMA
|
||||
// note: both buffers named dgo-buffer-2
|
||||
auto buffer2 = kmalloc(heap, bufferSize, KMALLOC_TOP | KMALLOC_ALIGN_64, "dgo-buffer-2");
|
||||
auto buffer1 = kmalloc(heap, bufferSize, KMALLOC_TOP | KMALLOC_ALIGN_64, "dgo-buffer-2");
|
||||
|
||||
// build filename. If no extension is given, default to CGO.
|
||||
char fileName[16];
|
||||
kstrcpyup(fileName, name); // FIXME: Similar decompilation to Jak 3, yet I don't understand how
|
||||
// it's functionally the same
|
||||
if (fileName[strlen(fileName) - 4] != '.') {
|
||||
strcat(fileName, ".CGO");
|
||||
}
|
||||
|
||||
// no stall messages, as this is a blocking load and when spending 100% CPU time on linking,
|
||||
// the linker can beat the DVD drive.
|
||||
//
|
||||
// TODO - jakx
|
||||
// bool oldShowStall = setStallMsg_GW(false);
|
||||
|
||||
// if (!POWERING_OFF_W) {
|
||||
// // start load on IOP.
|
||||
// BeginLoadingDGO(
|
||||
// fileName, buffer1, buffer2,
|
||||
// Ptr<u8>((heap->current + 0x3f).offset & 0xffffffc0)); // 64-byte aligned for IOP DMA
|
||||
|
||||
// u32 lastObjectLoaded = 0;
|
||||
// while (!lastObjectLoaded && !POWERING_OFF_W) {
|
||||
// // check to see if next object is loaded (I believe it always is?)
|
||||
// auto dgoObj = GetNextDGO(&lastObjectLoaded);
|
||||
// if (!dgoObj.offset) {
|
||||
// continue;
|
||||
// }
|
||||
|
||||
// // if we're on the last object, it is loaded at cheap->current. So we can safely reset the
|
||||
// // two dgo-buffer allocations. We do this _before_ we link! This way, the last file loaded
|
||||
// has
|
||||
// // more heap available, which is important when we need to use the entire memory.
|
||||
// if (lastObjectLoaded) {
|
||||
// heap->top = oldHeapTop;
|
||||
// }
|
||||
|
||||
// // FIXME: possibly enable this function call
|
||||
// // FUN_0027cc90_patch(dgoObj, bufferSize);
|
||||
|
||||
// // determine the size and name of the object we got
|
||||
// auto obj = dgoObj + 0x40; // seek past dgo object header
|
||||
// u32 objSize = *(dgoObj.cast<u32>()); // size from object's link block
|
||||
|
||||
// char objName[64];
|
||||
// strcpy(objName, (dgoObj + 4).cast<char>().c()); // name from dgo object header
|
||||
// lg::debug("[link and exec] {:18s} {} {:6d} heap-use {:8d} {:8d}: 0x{:x}", objName,
|
||||
// lastObjectLoaded, objSize, kheapused(kglobalheap),
|
||||
// kdebugheap.offset ? kheapused(kdebugheap) : 0, kglobalheap->current.offset);
|
||||
// {
|
||||
// auto p = scoped_prof(fmt::format("link-{}", objName).c_str());
|
||||
// link_and_exec(obj, objName, objSize, heap, linkFlag, jump_from_c_to_goal); // link now!
|
||||
// }
|
||||
|
||||
// // inform IOP we are done
|
||||
// if (lastObjectLoaded) {
|
||||
// break;
|
||||
// }
|
||||
// if (POWERING_OFF_W == false) {
|
||||
// ContinueLoadingDGO(buffer1, buffer2, Ptr<u8>((heap->current + 0x3f).offset & 0xffffffc0));
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
// lg::info("load_and_link_dgo_from_c took {:.3f} s\n", timer.getSeconds());
|
||||
// if (!POWERING_OFF_W) {
|
||||
// setStallMsg_GW(oldShowStall);
|
||||
// } else {
|
||||
// KernelShutdown(3);
|
||||
// ShutdownMachine(3);
|
||||
// Msg(6, "load_and_link_dgo_from_c: cannot continue; load aborted\n");
|
||||
// while (true) {
|
||||
// ; /* WARNING: Do nothing block with infinite loop */
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
} // namespace jakx
|
||||
@@ -0,0 +1,20 @@
|
||||
#pragma once
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
#include "game/kernel/common/Ptr.h"
|
||||
#include "game/kernel/common/kmalloc.h"
|
||||
|
||||
namespace jakx {
|
||||
void load_and_link_dgo_from_c(const char* name,
|
||||
Ptr<kheapinfo> heap,
|
||||
u32 linkFlag,
|
||||
s32 bufferSize,
|
||||
bool jump_from_c_to_goal);
|
||||
void load_and_link_dgo(u64 name_gstr, u64 heap_info, u64 flag, u64 buffer_size);
|
||||
void load_and_link_dgo_from_c_fast(const char* name,
|
||||
Ptr<kheapinfo> heap,
|
||||
u32 linkFlag,
|
||||
s32 bufferSize);
|
||||
void kdgo_init_globals();
|
||||
} // namespace jakx
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user