From 30c23048932b3ebccfe853a8c7f4c39242692643 Mon Sep 17 00:00:00 2001 From: Daniel Hill <9439488+blazkowolf@users.noreply.github.com> Date: Fri, 27 Sep 2024 15:57:15 -0400 Subject: [PATCH] refactor: format all files using new formatters --- .editorconfig | 8 + .gitignore | 1 + .husky/pre-commit | 4 + .prettierrc | 9 + .stylua.toml | 10 + cv64/README.md | 26 +- cv64/cv64_figures_display.js | 59 +-- cv64/cv64_heap_display.js | 206 +++++----- cv64/cv64_map_piece_info.js | 46 +-- cv64/cv64_misc_info_display.lua | 397 +++++++++++-------- cv64/cv64_object_ID_display.js | 50 ++- ddr/DDRKCEK_heap_display.js | 210 +++++----- ddr/DDRKCEK_object_ID_display.js | 44 ++- ddr/README.md | 12 +- lod/README.md | 12 +- lod/cvlod_heap_display.js | 216 ++++++----- lod/cvlod_object_ID_display.js | 44 ++- package-lock.json | 642 +++++++++++++++++++++++++++++++ package.json | 25 ++ 19 files changed, 1449 insertions(+), 572 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .husky/pre-commit create mode 100644 .prettierrc create mode 100644 .stylua.toml create mode 100644 package-lock.json create mode 100644 package.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..17bdb37 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,8 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2658d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +node_modules/ diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..bff860c --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +prettier $(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g') --write --ignore-unknown +stylua --glob '**/*.lua' -- . + +git update-index --again diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d399abc --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "semi": true, + "useTabs": false, + "tabWidth": 2, + "endOfLine": "lf", + "printWidth": 80, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/.stylua.toml b/.stylua.toml new file mode 100644 index 0000000..0cbf46b --- /dev/null +++ b/.stylua.toml @@ -0,0 +1,10 @@ +column_width = 80 +line_endings = "Unix" +indent_type = "Tabs" +indent_width = 4 +quote_style = "AutoPreferDouble" +call_parentheses = "Always" +collapse_simple_statement = "Never" + +[sort_requires] +enabled = false diff --git a/cv64/README.md b/cv64/README.md index ef5d847..7730c79 100644 --- a/cv64/README.md +++ b/cv64/README.md @@ -1,13 +1,13 @@ -# Castlevania 64 (USA v1.0) - -* `cv64_figures_display.js`: Displays the more relevant variables from each entry of the `figures_array` list, which stores instances of models, cameras and lights. - -* `cv64_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

-Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. - -* `cv64_map_piece_info.js`: Displays information on the currently loaded map pieces, which are subdivisions of the current map loaded into a grid that are used to display large maps without increasing performance.

-The information shown includes the state of the loaded map piece (active or inactive), as well as its location within the imaginary grid (this grid "moves" while the player is moving through the different map pieces). - -* `cv64_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. - -* `cv64_misc_info_display.lua`: Displays miscellaneous information regarding the current state of gameplay, such as different player-related variables. \ No newline at end of file +# Castlevania 64 (USA v1.0) + +- `cv64_figures_display.js`: Displays the more relevant variables from each entry of the `figures_array` list, which stores instances of models, cameras and lights. + +- `cv64_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

+ Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. + +- `cv64_map_piece_info.js`: Displays information on the currently loaded map pieces, which are subdivisions of the current map loaded into a grid that are used to display large maps without increasing performance.

+ The information shown includes the state of the loaded map piece (active or inactive), as well as its location within the imaginary grid (this grid "moves" while the player is moving through the different map pieces). + +- `cv64_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. + +- `cv64_misc_info_display.lua`: Displays miscellaneous information regarding the current state of gameplay, such as different player-related variables. diff --git a/cv64/cv64_figures_display.js b/cv64/cv64_figures_display.js index 2533edb..6e06f98 100644 --- a/cv64/cv64_figures_display.js +++ b/cv64/cv64_figures_display.js @@ -1,32 +1,43 @@ function getfigsArrayID(i, fig_array_start, fig_size) { - return ((i - fig_array_start) / fig_size); + return (i - fig_array_start) / fig_size; } // CV64 (USA v1.0) function print_info() { - const fig_array_start = 0x8034EAB8; - const fig_array_end = 0x80363AB8; - const fig_size = 0xA8; - var field_0x00 = 0; - var field_0x02 = 0; - var display_list_addr = 0; - var count = 0; - - console.log("----------------------------------------------"); - for (var i = fig_array_start; i < fig_array_end; i += fig_size) { - field_0x00 = mem.s16[i]; - field_0x02 = mem.s16[i + 2]; - display_list_addr = mem.u32[i + 0x34]; - field_0x00 = field_0x00 >>> 0; // Signed -> Unsigned - field_0x02 = field_0x02 >>> 0; // Signed -> Unsigned - - if (field_0x00 != 0) { - console.log("figs_array[", getfigsArrayID(i, fig_array_start, fig_size), "] = ", i.toString(16), "(", field_0x00.toString(16), " | ", field_0x02.toString(16), ") --- DL = ", display_list_addr.toString(16)); - count++; - } - } - console.log("----------------------------------------------"); - console.log("Number of figs =", count); + const fig_array_start = 0x8034eab8; + const fig_array_end = 0x80363ab8; + const fig_size = 0xa8; + var field_0x00 = 0; + var field_0x02 = 0; + var display_list_addr = 0; + var count = 0; + + console.log('----------------------------------------------'); + for (var i = fig_array_start; i < fig_array_end; i += fig_size) { + field_0x00 = mem.s16[i]; + field_0x02 = mem.s16[i + 2]; + display_list_addr = mem.u32[i + 0x34]; + field_0x00 = field_0x00 >>> 0; // Signed -> Unsigned + field_0x02 = field_0x02 >>> 0; // Signed -> Unsigned + + if (field_0x00 != 0) { + console.log( + 'figs_array[', + getfigsArrayID(i, fig_array_start, fig_size), + '] = ', + i.toString(16), + '(', + field_0x00.toString(16), + ' | ', + field_0x02.toString(16), + ') --- DL = ', + display_list_addr.toString(16) + ); + count++; + } + } + console.log('----------------------------------------------'); + console.log('Number of figs =', count); } print_info(); diff --git a/cv64/cv64_heap_display.js b/cv64/cv64_heap_display.js index f3064ac..ec30f95 100644 --- a/cv64/cv64_heap_display.js +++ b/cv64/cv64_heap_display.js @@ -2,121 +2,145 @@ const heap_array_start = 0x80271000; const heap_array_end = 0x80271060; -const heap_array_entry_size = 0x0C; +const heap_array_entry_size = 0x0c; const heap_block_header_size = 0x18; const heapIDStrings = [ - "HEAP_KIND_MULTIPURPOSE", - "HEAP_KIND_1", - "HEAP_KIND_MENU_DATA", - "HEAP_KIND_3", - "HEAP_KIND_4", - "HEAP_KIND_5", - "HEAP_KIND_6", - "HEAP_KIND_MAP_DATA" + 'HEAP_KIND_MULTIPURPOSE', + 'HEAP_KIND_1', + 'HEAP_KIND_MENU_DATA', + 'HEAP_KIND_3', + 'HEAP_KIND_4', + 'HEAP_KIND_5', + 'HEAP_KIND_6', + 'HEAP_KIND_MAP_DATA', ]; var heapBlockFlags = [ - { name: "HEAP_BLOCK_GRAPHIC_CONTAINER", value: 0x4000 }, - { name: "HEAP_BLOCK_ACTIVE", value: 0x8000 } + { name: 'HEAP_BLOCK_GRAPHIC_CONTAINER', value: 0x4000 }, + { name: 'HEAP_BLOCK_ACTIVE', value: 0x8000 }, ]; var heapFlags = [ - { name: "HEAP_WRITE_BACK_CACHE_TO_RAM", value: 0x4000 }, - { name: "HEAP_ACTIVE", value: 0x8000 } + { name: 'HEAP_WRITE_BACK_CACHE_TO_RAM', value: 0x4000 }, + { name: 'HEAP_ACTIVE', value: 0x8000 }, ]; function getFlagString(flags, flagDefinitions, freeStateName) { - var result = []; - - for (var i = 0; i < flagDefinitions.length; i++) { - var flag = flagDefinitions[i]; - if (flags & flag.value) { - result.push(flag.name); - } + var result = []; + + for (var i = 0; i < flagDefinitions.length; i++) { + var flag = flagDefinitions[i]; + if (flags & flag.value) { + result.push(flag.name); } - - return result.length > 0 ? result.join(" | ") : freeStateName; + } + + return result.length > 0 ? result.join(' | ') : freeStateName; } function getHeapIDString(heapID) { - if (heapID >= 8) { - return ""; - } - else { - return heapIDStrings[heapID]; - } + if (heapID >= 8) { + return ''; + } else { + return heapIDStrings[heapID]; + } } function printHeapInfo(flags, size, heap_start) { - console.log("flags: ", getFlagString(flags, heapFlags, "HEAP_INACTIVE")); - console.log("size: ", size); - console.log("heap_start: ", heap_start.toString(16)); + console.log('flags: ', getFlagString(flags, heapFlags, 'HEAP_INACTIVE')); + console.log('size: ', size); + console.log('heap_start: ', heap_start.toString(16)); } -function printHeapBlock(flags, size, field_0x08, data_start, data_end, raw_data_start) { - console.log(" flags: ", getFlagString(flags, heapBlockFlags, "HEAP_BLOCK_FREE")); - console.log(" size: ", size); - console.log(" graphic_container.field_0x00: ", field_0x08.toString(16)); - console.log(" graphic_container.data_ptrs[0]: ", data_start.toString(16)); - console.log(" graphic_container.data_ptrs[1]: ", data_end.toString(16)); - console.log(" raw_data_start: ", raw_data_start.toString(16)); +function printHeapBlock( + flags, + size, + field_0x08, + data_start, + data_end, + raw_data_start +) { + console.log( + ' flags: ', + getFlagString(flags, heapBlockFlags, 'HEAP_BLOCK_FREE') + ); + console.log(' size: ', size); + console.log(' graphic_container.field_0x00: ', field_0x08.toString(16)); + console.log(' graphic_container.data_ptrs[0]: ', data_start.toString(16)); + console.log(' graphic_container.data_ptrs[1]: ', data_end.toString(16)); + console.log(' raw_data_start: ', raw_data_start.toString(16)); } function printHeaps() { - var heapInfo_flags = 0; - var heapInfo_maxSize = 0; - var heapInfo_dataStart = 0; - var heapInfo_dataEnd = 0; - - var heapBlock_flags = 0; - var heapBlock_dataStart = 0; - var heapBlock_maxSize = 0; - - var heapInfo_index = 0; - var heapBlock_index = 0; - - var heapInfo_usedSpace = 0; - - // Loop through each of heap - for (var i = heap_array_start; i < heap_array_end; i += heap_array_entry_size) { - // Get heap header variables - heapInfo_flags = mem.u16[i]; - heapInfo_maxSize = mem.u32[i + 4]; - heapInfo_dataStart = mem.u32[i + 8]; - heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; - - // Print heap header - console.log("--------- heap[", getHeapIDString(heapInfo_index), "] ---------"); - printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); - console.log("----------------------------------------------"); - - // Don't print contents of inactive heap - if (heapInfo_flags != 0) { - // Loop through all blocks within heap - var j = heapInfo_dataStart; - while (j < heapInfo_dataEnd) { - heapBlock_flags = mem.u16[j]; - heapBlock_maxSize = mem.u32[j + 4]; - heapBlock_dataStart = mem.u32[j + 0xC]; - // Don't print block marked as free - if (heapBlock_flags != 0) { - console.log(" Block", heapBlock_index, "(", j.toString(16), ")"); - console.log(" -------------------"); - printHeapBlock(heapBlock_flags, heapBlock_maxSize, mem.u32[j + 8], heapBlock_dataStart, mem.u32[j + 0x10], (j + 0x18).toString(16)); - console.log(" -------------------"); - heapInfo_usedSpace += heapBlock_maxSize; - } - j += heap_block_header_size + heapBlock_maxSize; - heapBlock_index += 1; - } - } - console.log(heapInfo_usedSpace, "/", heapInfo_maxSize, "bytes used\n"); - heapInfo_index += 1; - heapBlock_index = 0; - heapInfo_usedSpace = 0; - } - console.log("----------------------------------------------"); + var heapInfo_flags = 0; + var heapInfo_maxSize = 0; + var heapInfo_dataStart = 0; + var heapInfo_dataEnd = 0; + + var heapBlock_flags = 0; + var heapBlock_dataStart = 0; + var heapBlock_maxSize = 0; + + var heapInfo_index = 0; + var heapBlock_index = 0; + + var heapInfo_usedSpace = 0; + + // Loop through each of heap + for ( + var i = heap_array_start; + i < heap_array_end; + i += heap_array_entry_size + ) { + // Get heap header variables + heapInfo_flags = mem.u16[i]; + heapInfo_maxSize = mem.u32[i + 4]; + heapInfo_dataStart = mem.u32[i + 8]; + heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; + + // Print heap header + console.log( + '--------- heap[', + getHeapIDString(heapInfo_index), + '] ---------' + ); + printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); + console.log('----------------------------------------------'); + + // Don't print contents of inactive heap + if (heapInfo_flags != 0) { + // Loop through all blocks within heap + var j = heapInfo_dataStart; + while (j < heapInfo_dataEnd) { + heapBlock_flags = mem.u16[j]; + heapBlock_maxSize = mem.u32[j + 4]; + heapBlock_dataStart = mem.u32[j + 0xc]; + // Don't print block marked as free + if (heapBlock_flags != 0) { + console.log(' Block', heapBlock_index, '(', j.toString(16), ')'); + console.log(' -------------------'); + printHeapBlock( + heapBlock_flags, + heapBlock_maxSize, + mem.u32[j + 8], + heapBlock_dataStart, + mem.u32[j + 0x10], + (j + 0x18).toString(16) + ); + console.log(' -------------------'); + heapInfo_usedSpace += heapBlock_maxSize; + } + j += heap_block_header_size + heapBlock_maxSize; + heapBlock_index += 1; + } + } + console.log(heapInfo_usedSpace, '/', heapInfo_maxSize, 'bytes used\n'); + heapInfo_index += 1; + heapBlock_index = 0; + heapInfo_usedSpace = 0; + } + console.log('----------------------------------------------'); } printHeaps(); diff --git a/cv64/cv64_map_piece_info.js b/cv64/cv64_map_piece_info.js index 35fc40e..650f57a 100644 --- a/cv64/cv64_map_piece_info.js +++ b/cv64/cv64_map_piece_info.js @@ -1,27 +1,27 @@ function print_info() { - const start = 0x8018cab0; - const size = 0x54; - const num = 9; - const vec_offset = 0x04; - const isActive_offset = 0x18; - - var x = 0; - var y = 0; - var z = 0; - var isActive = 0; - - for (var i = 0; i < num; i += 1) { - x = mem.s16[start + (size * i) + vec_offset + 0]; - y = mem.s16[start + (size * i) + vec_offset + 2]; - z = mem.s16[start + (size * i) + vec_offset + 4]; - isActive = mem.s16[start + (size * i) + isActive_offset]; - - console.log(" ---- ", i, " ----"); - console.log("x: ", x); - console.log("y: ", y); - console.log("z: ", z); - console.log("isActive: ", (isActive == 1) ? "TRUE" : "FALSE"); - } + const start = 0x8018cab0; + const size = 0x54; + const num = 9; + const vec_offset = 0x04; + const isActive_offset = 0x18; + + var x = 0; + var y = 0; + var z = 0; + var isActive = 0; + + for (var i = 0; i < num; i += 1) { + x = mem.s16[start + size * i + vec_offset + 0]; + y = mem.s16[start + size * i + vec_offset + 2]; + z = mem.s16[start + size * i + vec_offset + 4]; + isActive = mem.s16[start + size * i + isActive_offset]; + + console.log(' ---- ', i, ' ----'); + console.log('x: ', x); + console.log('y: ', y); + console.log('z: ', z); + console.log('isActive: ', isActive == 1 ? 'TRUE' : 'FALSE'); + } } print_info(); diff --git a/cv64/cv64_misc_info_display.lua b/cv64/cv64_misc_info_display.lua index af2c90e..3d4bf78 100644 --- a/cv64/cv64_misc_info_display.lua +++ b/cv64/cv64_misc_info_display.lua @@ -1,163 +1,234 @@ --- Examples from: https://skelux.net/showthread.php?tid=526 - -local OBJ_BASE = 0x00342060 -- base address of objects array -local OBJ_LEN = 0x74 -- length of each object in bytes -local OBJ_ARRAY_COUNT = 0x180 -- max amount of objects allocated in objects array -local PLAYER_OBJ = 0x003427a0 -local RDRAM_BASE_ADDR = 0x80000000 -local PLAYER_CURRENTLY_TARGETED_ENEMY = 0x002d7a58 -local PLAYER_COLL_INFO_WALL_ADDR = 0x800D7BA0 - -local vspace = 14 -- spacing between each line -local vstart = 100 -- y value to start printing - -local player_states = {} -player_states[0x00] = "INIT" -player_states[0x01] = "IDLE" -player_states[0x02] = "DAMAGE" -player_states[0x03] = "JUMP" -player_states[0x04] = "ATTACK" -player_states[0x05] = "ACTION" -player_states[0x06] = "MOVING" -player_states[0x07] = "LEDGE_MOVEMENT" -player_states[0x08] = "FALLING" -player_states[0x09] = "SLIDE" -player_states[0x0A] = "ENEMY_LOCK" -player_states[0x0B] = "DEAD" -player_states[0x0C] = "FROZEN" -player_states[0x0D] = "FROZEN_GRAB" - -console.clear() -memory.usememorydomain("RDRAM") - -function getSpeedFromVelocityVec3f(velocity) - return math.sqrt(velocity[0] * velocity[0] + velocity[1] * velocity[1] + velocity[2] * velocity[2]) -end - --- read vec3f from memory -function readVec3f(addr) - vec3f = {} - for i = 0, 2 do - vec3f[i] = memory.readfloat(addr + 4 * i, true) - end - return vec3f -end - --- read vec3s -function readVec3s(addr) - vec3s = {} - for i = 0, 2 do - vec3s[i] = memory.read_s16_be(addr + 2 * i) - end - return vec3s - end - --- print vec3f -function printVec3f(x, y, name, vec3f) - gui.text(x, y, string.format("%s %5.1f, %5.1f, %5.1f", name, vec3f[0], vec3f[1], vec3f[2])) -end - --- print vec3s -function printVec3s(x, y, name, vec3s) - gui.text(x, y, string.format("%s %04d, %04d, %04d", name, vec3s[0], vec3s[1], vec3s[2])) -end - --- parse common actor variables from its base address -function ReadActorVars(actor_addr) - local actor = {} - - actor.model = memory.read_u32_be(actor_addr + 0x24) - RDRAM_BASE_ADDR - actor.position = readVec3f(actor.model + 0x40) - actor.angle = readVec3s(actor.model + 0x4C) - actor.size = readVec3f(actor.model + 0x58) - return actor -end - -function ReadPlayerVars(player_addr) - local player = {} - player.actor_vars = ReadActorVars(player_addr) - player.state = memory.readbyte(player_addr + 0x9) - player.sub_state = memory.readbyte(player_addr + 0xB) - player.playerData = memory.read_u32_be(player_addr + 0x28) - RDRAM_BASE_ADDR - player.velocity = readVec3f(player.playerData + 0x74) - player.enemy_target = memory.read_u32_be(PLAYER_CURRENTLY_TARGETED_ENEMY) - - -- From playerCollisionInfoWall - player.collInfoWall = PLAYER_COLL_INFO_WALL_ADDR - RDRAM_BASE_ADDR - player.wall_push_velocity = readVec3f(player.collInfoWall + 0x10) - - if player.enemy_target ~= 0 then - player.enemy_target = player.enemy_target - RDRAM_BASE_ADDR - player.enemy_target_ID = memory.read_u16_be(player.enemy_target) - else - player.enemy_target = 0 - player.enemy_target_ID = 0 - end - - return player -end - -function readSaveStruct() - local save = {} - local saveStruct = 0x00389be4 - - save.week = memory.read_s16_be(saveStruct + 0x44) - save.day = memory.read_s16_be(saveStruct + 0x46) - save.hour = memory.read_s16_be(saveStruct + 0x48) - save.minutes = memory.read_s16_be(saveStruct + 0x4A) - save.seconds = memory.read_s16_be(saveStruct + 0x4C) - save.milliseconds = memory.read_u16_be(saveStruct + 0x4E) - - return save -end - -function inGameplayLoop() - local gameplayMgr = 0x00342148 - - if memory.read_u16_be(gameplayMgr) == 0005 and memory.readbyte(gameplayMgr + 0x9) == 03 - and memory.readbyte(gameplayMgr + 0xB) == 03 then - return true - else - return false - end -end - -function getObjectCount() - local obj_count = 0 - local current_obj_addr = OBJ_BASE - - for i = 1, OBJ_ARRAY_COUNT, 1 do - if memory.read_u16_be(current_obj_addr) ~= 0 then - obj_count = obj_count + 1 - end - current_obj_addr = current_obj_addr + OBJ_LEN - end - - return obj_count -end - -while true do - if inGameplayLoop() == true then - player = ReadPlayerVars(PLAYER_OBJ) - save = readSaveStruct() - - gui.text(0, vstart + vspace * 0, string.format("==== Player ====")) - printVec3f(0, vstart + vspace * 1, "Pos: ", player.actor_vars.position) - printVec3s(0, vstart + vspace * 2, "Angle: ", player.actor_vars.angle) - gui.text(0, vstart + vspace * 3, string.format("Speed: %f", getSpeedFromVelocityVec3f(player.velocity))) - gui.text(0, vstart + vspace * 4, string.format("State: %s", player_states[player.state])) - gui.text(0, vstart + vspace * 5, string.format("Sub-state: %d", player.sub_state)) - - gui.text(0, vstart + vspace * 7, string.format("Enemy Target: %08X (%04X)", RDRAM_BASE_ADDR + player.enemy_target, player.enemy_target_ID)) - - gui.text(0, vstart + vspace * 9, string.format("Week: %d, Day: %d", save.week, save.day)) - gui.text(0, vstart + vspace * 10, string.format("Hour: %d", save.hour)) - gui.text(0, vstart + vspace * 11, string.format("Minutes: %d", save.minutes)) - gui.text(0, vstart + vspace * 12, string.format("Seconds: %d", save.seconds)) - gui.text(0, vstart + vspace * 13, string.format("Milliseconds: %d", save.milliseconds)) - - gui.text(0, vstart + vspace * 15, string.format("Object count: %d", getObjectCount())) - gui.text(0, vstart + vspace * 16, string.format("Player push speed on wall contact: %f", getSpeedFromVelocityVec3f(player.wall_push_velocity))) - end - emu.frameadvance() -end +-- Examples from: https://skelux.net/showthread.php?tid=526 + +local OBJ_BASE = 0x00342060 -- base address of objects array +local OBJ_LEN = 0x74 -- length of each object in bytes +local OBJ_ARRAY_COUNT = 0x180 -- max amount of objects allocated in objects array +local PLAYER_OBJ = 0x003427a0 +local RDRAM_BASE_ADDR = 0x80000000 +local PLAYER_CURRENTLY_TARGETED_ENEMY = 0x002d7a58 +local PLAYER_COLL_INFO_WALL_ADDR = 0x800D7BA0 + +local vspace = 14 -- spacing between each line +local vstart = 100 -- y value to start printing + +local player_states = {} +player_states[0x00] = "INIT" +player_states[0x01] = "IDLE" +player_states[0x02] = "DAMAGE" +player_states[0x03] = "JUMP" +player_states[0x04] = "ATTACK" +player_states[0x05] = "ACTION" +player_states[0x06] = "MOVING" +player_states[0x07] = "LEDGE_MOVEMENT" +player_states[0x08] = "FALLING" +player_states[0x09] = "SLIDE" +player_states[0x0A] = "ENEMY_LOCK" +player_states[0x0B] = "DEAD" +player_states[0x0C] = "FROZEN" +player_states[0x0D] = "FROZEN_GRAB" + +console.clear() +memory.usememorydomain("RDRAM") + +function getSpeedFromVelocityVec3f(velocity) + return math.sqrt( + velocity[0] * velocity[0] + + velocity[1] * velocity[1] + + velocity[2] * velocity[2] + ) +end + +-- read vec3f from memory +function readVec3f(addr) + vec3f = {} + for i = 0, 2 do + vec3f[i] = memory.readfloat(addr + 4 * i, true) + end + return vec3f +end + +-- read vec3s +function readVec3s(addr) + vec3s = {} + for i = 0, 2 do + vec3s[i] = memory.read_s16_be(addr + 2 * i) + end + return vec3s +end + +-- print vec3f +function printVec3f(x, y, name, vec3f) + gui.text( + x, + y, + string.format( + "%s %5.1f, %5.1f, %5.1f", + name, + vec3f[0], + vec3f[1], + vec3f[2] + ) + ) +end + +-- print vec3s +function printVec3s(x, y, name, vec3s) + gui.text( + x, + y, + string.format("%s %04d, %04d, %04d", name, vec3s[0], vec3s[1], vec3s[2]) + ) +end + +-- parse common actor variables from its base address +function ReadActorVars(actor_addr) + local actor = {} + + actor.model = memory.read_u32_be(actor_addr + 0x24) - RDRAM_BASE_ADDR + actor.position = readVec3f(actor.model + 0x40) + actor.angle = readVec3s(actor.model + 0x4C) + actor.size = readVec3f(actor.model + 0x58) + return actor +end + +function ReadPlayerVars(player_addr) + local player = {} + player.actor_vars = ReadActorVars(player_addr) + player.state = memory.readbyte(player_addr + 0x9) + player.sub_state = memory.readbyte(player_addr + 0xB) + player.playerData = memory.read_u32_be(player_addr + 0x28) - RDRAM_BASE_ADDR + player.velocity = readVec3f(player.playerData + 0x74) + player.enemy_target = memory.read_u32_be(PLAYER_CURRENTLY_TARGETED_ENEMY) + + -- From playerCollisionInfoWall + player.collInfoWall = PLAYER_COLL_INFO_WALL_ADDR - RDRAM_BASE_ADDR + player.wall_push_velocity = readVec3f(player.collInfoWall + 0x10) + + if player.enemy_target ~= 0 then + player.enemy_target = player.enemy_target - RDRAM_BASE_ADDR + player.enemy_target_ID = memory.read_u16_be(player.enemy_target) + else + player.enemy_target = 0 + player.enemy_target_ID = 0 + end + + return player +end + +function readSaveStruct() + local save = {} + local saveStruct = 0x00389be4 + + save.week = memory.read_s16_be(saveStruct + 0x44) + save.day = memory.read_s16_be(saveStruct + 0x46) + save.hour = memory.read_s16_be(saveStruct + 0x48) + save.minutes = memory.read_s16_be(saveStruct + 0x4A) + save.seconds = memory.read_s16_be(saveStruct + 0x4C) + save.milliseconds = memory.read_u16_be(saveStruct + 0x4E) + + return save +end + +function inGameplayLoop() + local gameplayMgr = 0x00342148 + + if + memory.read_u16_be(gameplayMgr) == 0005 + and memory.readbyte(gameplayMgr + 0x9) == 03 + and memory.readbyte(gameplayMgr + 0xB) == 03 + then + return true + else + return false + end +end + +function getObjectCount() + local obj_count = 0 + local current_obj_addr = OBJ_BASE + + for i = 1, OBJ_ARRAY_COUNT, 1 do + if memory.read_u16_be(current_obj_addr) ~= 0 then + obj_count = obj_count + 1 + end + current_obj_addr = current_obj_addr + OBJ_LEN + end + + return obj_count +end + +while true do + if inGameplayLoop() == true then + player = ReadPlayerVars(PLAYER_OBJ) + save = readSaveStruct() + + gui.text(0, vstart + vspace * 0, string.format("==== Player ====")) + printVec3f(0, vstart + vspace * 1, "Pos: ", player.actor_vars.position) + printVec3s(0, vstart + vspace * 2, "Angle: ", player.actor_vars.angle) + gui.text( + 0, + vstart + vspace * 3, + string.format( + "Speed: %f", + getSpeedFromVelocityVec3f(player.velocity) + ) + ) + gui.text( + 0, + vstart + vspace * 4, + string.format("State: %s", player_states[player.state]) + ) + gui.text( + 0, + vstart + vspace * 5, + string.format("Sub-state: %d", player.sub_state) + ) + + gui.text( + 0, + vstart + vspace * 7, + string.format( + "Enemy Target: %08X (%04X)", + RDRAM_BASE_ADDR + player.enemy_target, + player.enemy_target_ID + ) + ) + + gui.text( + 0, + vstart + vspace * 9, + string.format("Week: %d, Day: %d", save.week, save.day) + ) + gui.text(0, vstart + vspace * 10, string.format("Hour: %d", save.hour)) + gui.text( + 0, + vstart + vspace * 11, + string.format("Minutes: %d", save.minutes) + ) + gui.text( + 0, + vstart + vspace * 12, + string.format("Seconds: %d", save.seconds) + ) + gui.text( + 0, + vstart + vspace * 13, + string.format("Milliseconds: %d", save.milliseconds) + ) + + gui.text( + 0, + vstart + vspace * 15, + string.format("Object count: %d", getObjectCount()) + ) + gui.text( + 0, + vstart + vspace * 16, + string.format( + "Player push speed on wall contact: %f", + getSpeedFromVelocityVec3f(player.wall_push_velocity) + ) + ) + end + emu.frameadvance() +end diff --git a/cv64/cv64_object_ID_display.js b/cv64/cv64_object_ID_display.js index d7ddc80..9f98912 100644 --- a/cv64/cv64_object_ID_display.js +++ b/cv64/cv64_object_ID_display.js @@ -1,29 +1,37 @@ function getObjectsArrayID(i, object_array_start, object_size) { - return ((i - object_array_start) / object_size); + return (i - object_array_start) / object_size; } // CV64 (USA v1.0) function print_info() { - const object_array_start = 0x80342060; - const object_array_end = 0x8034CE5E; - const object_size = 0x74; - var object_ID = 0; - var count = 0; - var object_addr = 0; - - const unk_object_ptr_start = 0x800d5f00; - const num_of_unk_objects_ptr = 8; - - console.log("----------------------------------------------"); - for (var i = object_array_start; i < object_array_end; i += object_size) { - object_ID = mem.s16[i]; - if (object_ID > 0) { - console.log("objects_array[", getObjectsArrayID(i, object_array_start, object_size), "] = ", i.toString(16), "(", object_ID.toString(16), ")"); - count++; - } - } - console.log("----------------------------------------------"); - console.log("Number of objects =", count); + const object_array_start = 0x80342060; + const object_array_end = 0x8034ce5e; + const object_size = 0x74; + var object_ID = 0; + var count = 0; + var object_addr = 0; + + const unk_object_ptr_start = 0x800d5f00; + const num_of_unk_objects_ptr = 8; + + console.log('----------------------------------------------'); + for (var i = object_array_start; i < object_array_end; i += object_size) { + object_ID = mem.s16[i]; + if (object_ID > 0) { + console.log( + 'objects_array[', + getObjectsArrayID(i, object_array_start, object_size), + '] = ', + i.toString(16), + '(', + object_ID.toString(16), + ')' + ); + count++; + } + } + console.log('----------------------------------------------'); + console.log('Number of objects =', count); } print_info(); diff --git a/ddr/DDRKCEK_heap_display.js b/ddr/DDRKCEK_heap_display.js index a48be6b..a9100e8 100644 --- a/ddr/DDRKCEK_heap_display.js +++ b/ddr/DDRKCEK_heap_display.js @@ -3,126 +3,150 @@ const heap_array_start = 0x8013d5c0; const heap_array_end = 0x8013d620; const is_expansion_pak = 0x80153814; -const heap_array_entry_size = 0x0C; +const heap_array_entry_size = 0x0c; const heap_block_header_size = 0x18; const heapIDStrings = [ - "HEAP_KIND_0", - "HEAP_KIND_1", - "HEAP_KIND_2", - "HEAP_KIND_3", - "HEAP_KIND_4", - "HEAP_KIND_5", - "HEAP_KIND_6", - "HEAP_KIND_7" + 'HEAP_KIND_0', + 'HEAP_KIND_1', + 'HEAP_KIND_2', + 'HEAP_KIND_3', + 'HEAP_KIND_4', + 'HEAP_KIND_5', + 'HEAP_KIND_6', + 'HEAP_KIND_7', ]; function isExpansionPakEnabled() { - return mem.s16[is_expansion_pak] ? "YES" : "NO"; + return mem.s16[is_expansion_pak] ? 'YES' : 'NO'; } var heapBlockFlags = [ - { name: "HEAP_BLOCK_GRAPHIC_CONTAINER", value: 0x4000 }, - { name: "HEAP_BLOCK_ACTIVE", value: 0x8000 } + { name: 'HEAP_BLOCK_GRAPHIC_CONTAINER', value: 0x4000 }, + { name: 'HEAP_BLOCK_ACTIVE', value: 0x8000 }, ]; var heapFlags = [ - { name: "HEAP_WRITE_BACK_CACHE_TO_RAM", value: 0x4000 }, - { name: "HEAP_ACTIVE", value: 0x8000 } + { name: 'HEAP_WRITE_BACK_CACHE_TO_RAM', value: 0x4000 }, + { name: 'HEAP_ACTIVE', value: 0x8000 }, ]; function getFlagString(flags, flagDefinitions, freeStateName) { - var result = []; - - for (var i = 0; i < flagDefinitions.length; i++) { - var flag = flagDefinitions[i]; - if (flags & flag.value) { - result.push(flag.name); - } + var result = []; + + for (var i = 0; i < flagDefinitions.length; i++) { + var flag = flagDefinitions[i]; + if (flags & flag.value) { + result.push(flag.name); } - - return result.length > 0 ? result.join(" | ") : freeStateName; + } + + return result.length > 0 ? result.join(' | ') : freeStateName; } function getHeapIDString(heapID) { - if (heapID >= 8) { - return ""; - } - else { - return heapIDStrings[heapID]; - } + if (heapID >= 8) { + return ''; + } else { + return heapIDStrings[heapID]; + } } function printHeapInfo(flags, size, heap_start) { - console.log("flags: ", getFlagString(flags, heapFlags, "HEAP_INACTIVE")); - console.log("size: ", size); - console.log("heap_start: ", heap_start.toString(16)); + console.log('flags: ', getFlagString(flags, heapFlags, 'HEAP_INACTIVE')); + console.log('size: ', size); + console.log('heap_start: ', heap_start.toString(16)); } -function printHeapBlock(flags, size, field_0x08, data_start, data_end, raw_data_start) { - console.log(" flags: ", getFlagString(flags, heapBlockFlags, "HEAP_BLOCK_FREE")); - console.log(" size: ", size); - console.log(" graphic_container.field_0x00: ", field_0x08.toString(16)); - console.log(" graphic_container.data_ptrs[0]: ", data_start.toString(16)); - console.log(" graphic_container.data_ptrs[1]: ", data_end.toString(16)); - console.log(" raw_data_start: ", raw_data_start.toString(16)); +function printHeapBlock( + flags, + size, + field_0x08, + data_start, + data_end, + raw_data_start +) { + console.log( + ' flags: ', + getFlagString(flags, heapBlockFlags, 'HEAP_BLOCK_FREE') + ); + console.log(' size: ', size); + console.log(' graphic_container.field_0x00: ', field_0x08.toString(16)); + console.log(' graphic_container.data_ptrs[0]: ', data_start.toString(16)); + console.log(' graphic_container.data_ptrs[1]: ', data_end.toString(16)); + console.log(' raw_data_start: ', raw_data_start.toString(16)); } function printHeaps() { - var heapInfo_flags = 0; - var heapInfo_maxSize = 0; - var heapInfo_dataStart = 0; - var heapInfo_dataEnd = 0; - - var heapBlock_flags = 0; - var heapBlock_dataStart = 0; - var heapBlock_maxSize = 0; - - var heapInfo_index = 0; - var heapBlock_index = 0; - - var heapInfo_usedSpace = 0; - - // Loop through each of heap - for (var i = heap_array_start; i < heap_array_end; i += heap_array_entry_size) { - // Get heap header variables - heapInfo_flags = mem.u16[i]; - heapInfo_maxSize = mem.u32[i + 4]; - heapInfo_dataStart = mem.u32[i + 8]; - heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; - - // Print heap header - console.log("--------- heap[", getHeapIDString(heapInfo_index), "] ---------"); - printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); - console.log("----------------------------------------------"); - - // Don't print contents of inactive heap - if (heapInfo_flags != 0) { - // Loop through all blocks within heap - var j = heapInfo_dataStart; - while (j < heapInfo_dataEnd) { - heapBlock_flags = mem.u16[j]; - heapBlock_maxSize = mem.u32[j + 4]; - heapBlock_dataStart = mem.u32[j + 0xC]; - // Don't print block marked as free - if (heapBlock_flags != 0) { - console.log(" Block", heapBlock_index, "(", j.toString(16), ")"); - console.log(" -------------------"); - printHeapBlock(heapBlock_flags, heapBlock_maxSize, mem.u32[j + 8], heapBlock_dataStart, mem.u32[j + 0x10], (j + 0x18).toString(16)); - console.log(" -------------------"); - heapInfo_usedSpace += heapBlock_maxSize; - } - j += heap_block_header_size + heapBlock_maxSize; - heapBlock_index += 1; - } - } - console.log(heapInfo_usedSpace, "/", heapInfo_maxSize, "bytes used\n"); - heapInfo_index += 1; - heapBlock_index = 0; - heapInfo_usedSpace = 0; - } - console.log("----------------------------------------------"); + var heapInfo_flags = 0; + var heapInfo_maxSize = 0; + var heapInfo_dataStart = 0; + var heapInfo_dataEnd = 0; + + var heapBlock_flags = 0; + var heapBlock_dataStart = 0; + var heapBlock_maxSize = 0; + + var heapInfo_index = 0; + var heapBlock_index = 0; + + var heapInfo_usedSpace = 0; + + // Loop through each of heap + for ( + var i = heap_array_start; + i < heap_array_end; + i += heap_array_entry_size + ) { + // Get heap header variables + heapInfo_flags = mem.u16[i]; + heapInfo_maxSize = mem.u32[i + 4]; + heapInfo_dataStart = mem.u32[i + 8]; + heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; + + // Print heap header + console.log( + '--------- heap[', + getHeapIDString(heapInfo_index), + '] ---------' + ); + printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); + console.log('----------------------------------------------'); + + // Don't print contents of inactive heap + if (heapInfo_flags != 0) { + // Loop through all blocks within heap + var j = heapInfo_dataStart; + while (j < heapInfo_dataEnd) { + heapBlock_flags = mem.u16[j]; + heapBlock_maxSize = mem.u32[j + 4]; + heapBlock_dataStart = mem.u32[j + 0xc]; + // Don't print block marked as free + if (heapBlock_flags != 0) { + console.log(' Block', heapBlock_index, '(', j.toString(16), ')'); + console.log(' -------------------'); + printHeapBlock( + heapBlock_flags, + heapBlock_maxSize, + mem.u32[j + 8], + heapBlock_dataStart, + mem.u32[j + 0x10], + (j + 0x18).toString(16) + ); + console.log(' -------------------'); + heapInfo_usedSpace += heapBlock_maxSize; + } + j += heap_block_header_size + heapBlock_maxSize; + heapBlock_index += 1; + } + } + console.log(heapInfo_usedSpace, '/', heapInfo_maxSize, 'bytes used\n'); + heapInfo_index += 1; + heapBlock_index = 0; + heapInfo_usedSpace = 0; + } + console.log('----------------------------------------------'); } -console.log("Expansion Pak Enabled? : ", isExpansionPakEnabled(),"\n"); +console.log('Expansion Pak Enabled? : ', isExpansionPakEnabled(), '\n'); printHeaps(); diff --git a/ddr/DDRKCEK_object_ID_display.js b/ddr/DDRKCEK_object_ID_display.js index ba4a18a..c4a4b3e 100644 --- a/ddr/DDRKCEK_object_ID_display.js +++ b/ddr/DDRKCEK_object_ID_display.js @@ -1,26 +1,34 @@ function getModulesArrayID(i, module_array_start, module_size) { - return ((i - module_array_start) / module_size); + return (i - module_array_start) / module_size; } // DDR function print_info() { - const module_array_start = mem.u32[0x80053c10]; - const module_array_end = mem.u32[0x80053c14]; - const module_size = 0x74; - var module_ID = 0; - var count = 0; - var module_addr = 0; - - console.log("----------------------------------------------"); - for (var i = module_array_start; i < module_array_end; i += module_size) { - module_ID = mem.s16[i]; - if (module_ID > 0) { - console.log("modules_array[", getModulesArrayID(i, module_array_start, module_size), "] = ", i.toString(16), "(", module_ID.toString(16), ")"); - count++; - } - } - console.log("----------------------------------------------"); - console.log("Number of modules =", count); + const module_array_start = mem.u32[0x80053c10]; + const module_array_end = mem.u32[0x80053c14]; + const module_size = 0x74; + var module_ID = 0; + var count = 0; + var module_addr = 0; + + console.log('----------------------------------------------'); + for (var i = module_array_start; i < module_array_end; i += module_size) { + module_ID = mem.s16[i]; + if (module_ID > 0) { + console.log( + 'modules_array[', + getModulesArrayID(i, module_array_start, module_size), + '] = ', + i.toString(16), + '(', + module_ID.toString(16), + ')' + ); + count++; + } + } + console.log('----------------------------------------------'); + console.log('Number of modules =', count); } print_info(); diff --git a/ddr/README.md b/ddr/README.md index a14b8d2..67d8d26 100644 --- a/ddr/README.md +++ b/ddr/README.md @@ -1,6 +1,6 @@ -# Dance Dance Revolution Disney Dancing Museum - -* `DDRKCEK_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

-Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. - -* `DDRKCEK_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. \ No newline at end of file +# Dance Dance Revolution Disney Dancing Museum + +- `DDRKCEK_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

+ Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. + +- `DDRKCEK_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. diff --git a/lod/README.md b/lod/README.md index 1881574..6571710 100644 --- a/lod/README.md +++ b/lod/README.md @@ -1,6 +1,6 @@ -# Castlevania: Legacy of Darkness (USA) - -* `cvlod_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

-Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. - -* `cvlod_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. \ No newline at end of file +# Castlevania: Legacy of Darkness (USA) + +- `cvlod_heap_display.js`: Shows the state of all heaps, and each of the blocks allocated within each heap.

+ Note that when allocating new blocks, the game doesn't clean the block header, so sometimes there may be leftover data from previous allocations, showing unusual data, such as wrong pointers. + +- `cvlod_object_ID_display.js`: Shows each non-emptyslot from the `Objects_array`, alongside its address and ID number. diff --git a/lod/cvlod_heap_display.js b/lod/cvlod_heap_display.js index bafd3f4..09e5bd7 100644 --- a/lod/cvlod_heap_display.js +++ b/lod/cvlod_heap_display.js @@ -1,128 +1,152 @@ // LoD (USA) -const heap_array_start = 0x801B1D00; -const heap_array_end = 0x801B1D60; -const is_expansion_pak = 0x801C82F4; +const heap_array_start = 0x801b1d00; +const heap_array_end = 0x801b1d60; +const is_expansion_pak = 0x801c82f4; -const heap_array_entry_size = 0x0C; +const heap_array_entry_size = 0x0c; const heap_block_header_size = 0x18; const heapIDStrings = [ - "HEAP_KIND_0", - "HEAP_KIND_1", - "HEAP_KIND_2", - "HEAP_KIND_3", - "HEAP_KIND_4", - "HEAP_KIND_5", - "HEAP_KIND_6", - "HEAP_KIND_7" + 'HEAP_KIND_0', + 'HEAP_KIND_1', + 'HEAP_KIND_2', + 'HEAP_KIND_3', + 'HEAP_KIND_4', + 'HEAP_KIND_5', + 'HEAP_KIND_6', + 'HEAP_KIND_7', ]; function isExpansionPakEnabled() { - return mem.s16[is_expansion_pak] ? "YES" : "NO"; + return mem.s16[is_expansion_pak] ? 'YES' : 'NO'; } var heapBlockFlags = [ - { name: "HEAP_BLOCK_GRAPHIC_CONTAINER", value: 0x4000 }, - { name: "HEAP_BLOCK_ACTIVE", value: 0x8000 } + { name: 'HEAP_BLOCK_GRAPHIC_CONTAINER', value: 0x4000 }, + { name: 'HEAP_BLOCK_ACTIVE', value: 0x8000 }, ]; var heapFlags = [ - { name: "HEAP_WRITE_BACK_CACHE_TO_RAM", value: 0x4000 }, - { name: "HEAP_ACTIVE", value: 0x8000 } + { name: 'HEAP_WRITE_BACK_CACHE_TO_RAM', value: 0x4000 }, + { name: 'HEAP_ACTIVE', value: 0x8000 }, ]; function getFlagString(flags, flagDefinitions, freeStateName) { - var result = []; - - for (var i = 0; i < flagDefinitions.length; i++) { - var flag = flagDefinitions[i]; - if (flags & flag.value) { - result.push(flag.name); - } + var result = []; + + for (var i = 0; i < flagDefinitions.length; i++) { + var flag = flagDefinitions[i]; + if (flags & flag.value) { + result.push(flag.name); } - - return result.length > 0 ? result.join(" | ") : freeStateName; + } + + return result.length > 0 ? result.join(' | ') : freeStateName; } function getHeapIDString(heapID) { - if (heapID >= 8) { - return ""; - } - else { - return heapIDStrings[heapID]; - } + if (heapID >= 8) { + return ''; + } else { + return heapIDStrings[heapID]; + } } function printHeapInfo(flags, size, heap_start) { - console.log("flags: ", getFlagString(flags, heapFlags, "HEAP_INACTIVE")); - console.log("size: ", size); - console.log("heap_start: ", heap_start.toString(16)); + console.log('flags: ', getFlagString(flags, heapFlags, 'HEAP_INACTIVE')); + console.log('size: ', size); + console.log('heap_start: ', heap_start.toString(16)); } -function printHeapBlock(flags, size, field_0x08, data_start, data_end, raw_data_start) { - console.log(" flags: ", getFlagString(flags, heapBlockFlags, "HEAP_BLOCK_FREE")); - console.log(" size: ", size); - console.log(" graphic_container.field_0x00: ", field_0x08.toString(16)); - console.log(" graphic_container.data_ptrs[0]: ", data_start.toString(16)); - console.log(" graphic_container.data_ptrs[1]: ", data_end.toString(16)); - console.log(" raw_data_start: ", raw_data_start.toString(16)); +function printHeapBlock( + flags, + size, + field_0x08, + data_start, + data_end, + raw_data_start +) { + console.log( + ' flags: ', + getFlagString(flags, heapBlockFlags, 'HEAP_BLOCK_FREE') + ); + console.log(' size: ', size); + console.log(' graphic_container.field_0x00: ', field_0x08.toString(16)); + console.log(' graphic_container.data_ptrs[0]: ', data_start.toString(16)); + console.log(' graphic_container.data_ptrs[1]: ', data_end.toString(16)); + console.log(' raw_data_start: ', raw_data_start.toString(16)); } function printHeaps() { - var heapInfo_flags = 0; - var heapInfo_maxSize = 0; - var heapInfo_dataStart = 0; - var heapInfo_dataEnd = 0; - - var heapBlock_flags = 0; - var heapBlock_dataStart = 0; - var heapBlock_maxSize = 0; - - var heapInfo_index = 0; - var heapBlock_index = 0; - - var heapInfo_usedSpace = 0; - - // Loop through each of heap - for (var i = heap_array_start; i < heap_array_end; i += heap_array_entry_size) { - // Get heap header variables - heapInfo_flags = mem.u16[i]; - heapInfo_maxSize = mem.u32[i + 4]; - heapInfo_dataStart = mem.u32[i + 8]; - heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; - - // Print heap header - console.log("--------- heap[", getHeapIDString(heapInfo_index), "] ---------"); - printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); - console.log("----------------------------------------------"); - - // Don't print contents of inactive heap - if (heapInfo_flags != 0) { - // Loop through all blocks within heap - var j = heapInfo_dataStart; - while (j < heapInfo_dataEnd) { - heapBlock_flags = mem.u16[j]; - heapBlock_maxSize = mem.u32[j + 4]; - heapBlock_dataStart = mem.u32[j + 0xC]; - // Don't print block marked as free - if (heapBlock_flags != 0) { - console.log(" Block", heapBlock_index, "(", j.toString(16), ")"); - console.log(" -------------------"); - printHeapBlock(heapBlock_flags, heapBlock_maxSize, mem.u32[j + 8], heapBlock_dataStart, mem.u32[j + 0x10], (j + 0x18).toString(16)); - console.log(" -------------------"); - heapInfo_usedSpace += heapBlock_maxSize; - } - j += heap_block_header_size + heapBlock_maxSize; - heapBlock_index += 1; - } - } - console.log(heapInfo_usedSpace, "/", heapInfo_maxSize, "bytes used\n"); - heapInfo_index += 1; - heapBlock_index = 0; - heapInfo_usedSpace = 0; - } - console.log("----------------------------------------------"); + var heapInfo_flags = 0; + var heapInfo_maxSize = 0; + var heapInfo_dataStart = 0; + var heapInfo_dataEnd = 0; + + var heapBlock_flags = 0; + var heapBlock_dataStart = 0; + var heapBlock_maxSize = 0; + + var heapInfo_index = 0; + var heapBlock_index = 0; + + var heapInfo_usedSpace = 0; + + // Loop through each of heap + for ( + var i = heap_array_start; + i < heap_array_end; + i += heap_array_entry_size + ) { + // Get heap header variables + heapInfo_flags = mem.u16[i]; + heapInfo_maxSize = mem.u32[i + 4]; + heapInfo_dataStart = mem.u32[i + 8]; + heapInfo_dataEnd = heapInfo_dataStart + heapInfo_maxSize; + + // Print heap header + console.log( + '--------- heap[', + getHeapIDString(heapInfo_index), + '] ---------' + ); + printHeapInfo(heapInfo_flags, heapInfo_maxSize, heapInfo_dataStart); + console.log('----------------------------------------------'); + + // Don't print contents of inactive heap + if (heapInfo_flags != 0) { + // Loop through all blocks within heap + var j = heapInfo_dataStart; + while (j < heapInfo_dataEnd) { + heapBlock_flags = mem.u16[j]; + heapBlock_maxSize = mem.u32[j + 4]; + heapBlock_dataStart = mem.u32[j + 0xc]; + // Don't print block marked as free + if (heapBlock_flags != 0) { + console.log(' Block', heapBlock_index, '(', j.toString(16), ')'); + console.log(' -------------------'); + printHeapBlock( + heapBlock_flags, + heapBlock_maxSize, + mem.u32[j + 8], + heapBlock_dataStart, + mem.u32[j + 0x10], + (j + 0x18).toString(16) + ); + console.log(' -------------------'); + heapInfo_usedSpace += heapBlock_maxSize; + } + j += heap_block_header_size + heapBlock_maxSize; + heapBlock_index += 1; + } + } + console.log(heapInfo_usedSpace, '/', heapInfo_maxSize, 'bytes used\n'); + heapInfo_index += 1; + heapBlock_index = 0; + heapInfo_usedSpace = 0; + } + console.log('----------------------------------------------'); } -console.log("Expansion Pak Enabled? : ", isExpansionPakEnabled(),"\n"); +console.log('Expansion Pak Enabled? : ', isExpansionPakEnabled(), '\n'); printHeaps(); diff --git a/lod/cvlod_object_ID_display.js b/lod/cvlod_object_ID_display.js index dbe97e6..5f00ce0 100644 --- a/lod/cvlod_object_ID_display.js +++ b/lod/cvlod_object_ID_display.js @@ -1,26 +1,34 @@ function getObjectsArrayID(i, object_array_start, object_size) { - return ((i - object_array_start) / object_size); + return (i - object_array_start) / object_size; } // LoD (USA) function print_info() { - const object_array_start = mem.u32[0x800C1530]; - const object_array_end = mem.u32[0x800C1534]; - const object_size = 0x74; - var object_ID = 0; - var count = 0; - var object_addr = 0; - - console.log("----------------------------------------------"); - for (var i = object_array_start; i < object_array_end; i += object_size) { - object_ID = mem.s16[i]; - if (object_ID > 0) { - console.log("objects_array[", getObjectsArrayID(i, object_array_start, object_size), "] = ", i.toString(16), "(", object_ID.toString(16), ")"); - count++; - } - } - console.log("----------------------------------------------"); - console.log("Number of objects =", count); + const object_array_start = mem.u32[0x800c1530]; + const object_array_end = mem.u32[0x800c1534]; + const object_size = 0x74; + var object_ID = 0; + var count = 0; + var object_addr = 0; + + console.log('----------------------------------------------'); + for (var i = object_array_start; i < object_array_end; i += object_size) { + object_ID = mem.s16[i]; + if (object_ID > 0) { + console.log( + 'objects_array[', + getObjectsArrayID(i, object_array_start, object_size), + '] = ', + i.toString(16), + '(', + object_ID.toString(16), + ')' + ); + count++; + } + } + console.log('----------------------------------------------'); + console.log('Number of objects =', count); } print_info(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8db7082 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,642 @@ +{ + "name": "emulator_scripts", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "emulator_scripts", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@johnnymorganz/stylua-bin": "^0.20.0", + "husky": "^9.1.6", + "prettier": "^3.3.3" + } + }, + "node_modules/@johnnymorganz/stylua-bin": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@johnnymorganz/stylua-bin/-/stylua-bin-0.20.0.tgz", + "integrity": "sha512-CjsdrDNhUHivkm7xvT+LK0E+aOzD2RbLy0jiD1s/x5RoTq8tqXenhZN7ao2NeuLctwrKCOk26xAv5oP4JmGoPw==", + "dev": true, + "hasInstallScript": true, + "license": "MPL-2.0", + "dependencies": { + "axios": "^1.6.0", + "node-fetch": "^3.2.10", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + }, + "bin": { + "stylua": "run.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "license": "Unlicense", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "license": "MIT/X11", + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "deprecated": "This package is no longer supported.", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/husky": { + "version": "9.1.6", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", + "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "license": "MIT/X11", + "engines": { + "node": "*" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..513bd41 --- /dev/null +++ b/package.json @@ -0,0 +1,25 @@ +{ + "private": true, + "name": "emulator_scripts", + "version": "1.0.0", + "description": "Useful scripts for reverse engineering games using Project64", + "scripts": { + "format:js": "prettier --write --ignore-unknown **/*", + "format:lua": "stylua --glob '**/*.lua' -- .", + "format": "npm run format:js && npm run format:lua", + "test": "echo \"Error: no test specified\" && exit 1", + "prepare": "husky" + }, + "repository": "https://github.com/k64ret/emulator_scripts.git", + "author": "", + "license": "MIT", + "bugs": { + "url": "https://github.com/k64ret/emulator_scripts/issues" + }, + "homepage": "https://github.com/k64ret/emulator_scripts#readme", + "devDependencies": { + "@johnnymorganz/stylua-bin": "^0.20.0", + "husky": "^9.1.6", + "prettier": "^3.3.3" + } +}