From d4fc05d9cc03944ca7918439c8f5dfab50471339 Mon Sep 17 00:00:00 2001 From: Elliptic Ellipsis Date: Thu, 9 Dec 2021 05:24:45 +0000 Subject: [PATCH 1/6] Update progress script with new csv format, text mode, etc. --- progress.py | 54 ++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 13 deletions(-) mode change 100644 => 100755 progress.py diff --git a/progress.py b/progress.py old mode 100644 new mode 100755 index 512dc31a..141fbc30 --- a/progress.py +++ b/progress.py @@ -1,4 +1,7 @@ +#!/usr/bin/env python3 + import argparse +import json import git import os import re @@ -80,9 +83,13 @@ def parse_map(non_matching_funcs): def main(): parser = argparse.ArgumentParser() - parser.add_argument('-m', '--matching', dest='matching', action='store_true', - help='Output matching progress instead of decompilation progress') + + parser = argparse.ArgumentParser(description="Computes current progress throughout the whole project.") + parser.add_argument("format", nargs="?", default="text", choices=["text", "csv", "shield-json"]) + parser.add_argument("-m", "--matching", dest='matching', action='store_true', + help="Output matching progress instead of decompilation progress") args = parser.parse_args() + matching = args.matching non_matching_funcs = [] @@ -101,21 +108,42 @@ def main(): total = src + asm data_total = src_data + data - src_pct = '%.4f' % (100 * src / total) - asm_pct = '%.4f' % (100 * asm / total) + src_percent = 100 * src / total + asm_percent = 100 * asm / total - src_data_pct = '%.4f' % (100 * src_data / data_total) - data_pct = '%.4f' % (100 * data / data_total) + src_data_percent = 100 * src_data / data_total + data_percent = 100 * data / data_total - version = 1 - git_object = git.Repo().head.object - timestamp = str(git_object.committed_date) - git_hash = git_object.hexsha - csv_list = [str(version), timestamp, git_hash, str(src_pct), - str(asm_pct), str(src_data_pct), str(data_pct)] + if args.format == 'csv': + version = 2 + git_object = git.Repo().head.object + timestamp = str(git_object.committed_date) + git_hash = git_object.hexsha - print(','.join(csv_list)) + csv_list = [str(version), timestamp, git_hash, str(src), + str(total), str(src_data), str(data_total)] + + print(','.join(csv_list)) + + elif args.format == 'shield-json': + # https://shields.io/endpoint + print(json.dumps({ + "schemaVersion": 1, + "label": "progress", + "message": f"{src_percent:.3g}%", + "color": 'yellow', + })) + + elif args.format == 'text': + adjective = "decompiled" if not args.matching else "matched" + + print("src: {:>9} / {:>8} total bytes {:<10} {:>9.4f}%".format(src, total, adjective, round(src_percent, 4))) + # print() + print("data: {:>9} / {:>8} total bytes analysed {:>9.4f}%".format(src_data, data_total, round(src_data_percent, 4))) + + else: + print("Unknown format argument: " + args.format) if __name__ == '__main__': From 64f36f47400598ed8482513fab8ae54e8c0e1f77 Mon Sep 17 00:00:00 2001 From: Elliptic Ellipsis Date: Thu, 9 Dec 2021 05:26:41 +0000 Subject: [PATCH 2/6] Update Jenkinsfile --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index a01f6b2d..93efaa65 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,8 +26,8 @@ pipeline { } steps { sh 'mkdir reports' - sh 'python3 progress.py >> reports/progress_tmc.csv' - sh 'python3 progress.py -m >> reports/progress_tmc_matching.csv' + sh 'python3 progress.py csv >> reports/progress_tmc.csv' + sh 'python3 progress.py csv -m >> reports/progress_tmc_matching.csv' stash includes: 'reports/*', name: 'reports' } } From 555fa4369543992ef0c1340041a5c6762d790af7 Mon Sep 17 00:00:00 2001 From: octorock <79596758+octorock@users.noreply.github.com> Date: Sat, 18 Dec 2021 00:51:20 +0100 Subject: [PATCH 3/6] Decompile code_080A7C00 --- asm/code_0804B058.s | 8 +- asm/code_080A7C00.s | 197 ------------------------------------------- asm/objectOnPillar.s | 4 +- include/functions.h | 2 +- include/structures.h | 26 ++++++ linker.ld | 4 +- src/code_080A7C00.c | 115 +++++++++++++++++++++++++ src/loadRoom.c | 4 +- 8 files changed, 152 insertions(+), 208 deletions(-) delete mode 100644 asm/code_080A7C00.s create mode 100644 src/code_080A7C00.c diff --git a/asm/code_0804B058.s b/asm/code_0804B058.s index d8682f83..23fa0b18 100644 --- a/asm/code_0804B058.s +++ b/asm/code_0804B058.s @@ -47,7 +47,7 @@ _0804B168: .4byte gRoomVars thumb_func_start sub_0804B16C sub_0804B16C: @ 0x0804B16C push {r4, lr} - ldr r4, _0804B1A4 @ =gUnk_02017660 + ldr r4, _0804B1A4 @ =gSmallChests _0804B170: ldrh r0, [r4, #4] cmp r0, #0 @@ -75,7 +75,7 @@ _0804B198: blo _0804B170 pop {r4, pc} .align 2, 0 -_0804B1A4: .4byte gUnk_02017660 +_0804B1A4: .4byte gSmallChests _0804B1A8: .4byte gPaletteBuffer thumb_func_start LoadRoomTileEntities @@ -202,7 +202,7 @@ sub_0804B290: @ 0x0804B290 sub_0804B29C: @ 0x0804B29C push {r4, lr} adds r2, r0, #0 - ldr r4, _0804B2EC @ =gUnk_02017660 + ldr r4, _0804B2EC @ =gSmallChests movs r1, #0 _0804B2A4: ldrh r0, [r4, #4] @@ -237,7 +237,7 @@ _0804B2A4: bl sub_0806F704 b _0804B2FC .align 2, 0 -_0804B2EC: .4byte gUnk_02017660 +_0804B2EC: .4byte gSmallChests _0804B2F0: .4byte gRoomControls _0804B2F4: adds r1, #1 diff --git a/asm/code_080A7C00.s b/asm/code_080A7C00.s deleted file mode 100644 index 988666cd..00000000 --- a/asm/code_080A7C00.s +++ /dev/null @@ -1,197 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - - thumb_func_start CreateItemEntity -CreateItemEntity: @ 0x080A7C00 - push {r4, lr} - bl GiveItemWithCutscene - adds r4, r0, #0 - cmp r4, #0 - beq _080A7C16 - ldrb r1, [r4, #0xa] - movs r2, #0 - bl sub_080A276C - str r0, [r4, #0x50] -_080A7C16: - pop {r4, pc} - - thumb_func_start sub_080A7C18 -sub_080A7C18: @ 0x080A7C18 - push {lr} - bl GiveItemWithCutscene - adds r2, r0, #0 - cmp r2, #0 - beq _080A7C32 - ldr r0, _080A7C34 @ =gPlayerEntity - str r0, [r2, #0x50] - ldrb r1, [r2, #0xa] - adds r0, r2, #0 - movs r2, #0 - bl sub_08078AF0 -_080A7C32: - pop {pc} - .align 2, 0 -_080A7C34: .4byte gPlayerEntity - - thumb_func_start GiveItemWithCutscene -GiveItemWithCutscene: @ 0x080A7C38 - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - adds r6, r1, #0 - adds r7, r2, #0 - cmp r5, #0x3f - bne _080A7C52 - ldr r0, _080A7C78 @ =gSave - adds r0, #0xbb - ldrb r0, [r0] - cmp r0, #0 - beq _080A7C52 - movs r5, #0x57 - movs r6, #0 -_080A7C52: - bl sub_0805E744 - adds r4, r0, #0 - cmp r4, #0 - beq _080A7C72 - strb r5, [r4, #0xa] - strb r6, [r4, #0xb] - strb r7, [r4, #0xe] - movs r0, #0xb - strb r0, [r4, #9] - movs r0, #6 - strb r0, [r4, #8] - adds r0, r4, #0 - movs r1, #6 - bl AppendEntityToList -_080A7C72: - adds r0, r4, #0 - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_080A7C78: .4byte gSave - - thumb_func_start sub_080A7C7C -sub_080A7C7C: @ 0x080A7C7C - push {lr} - ldr r0, _080A7C88 @ =gUnk_02017660 - movs r1, #0x40 - bl MemClear - pop {pc} - .align 2, 0 -_080A7C88: .4byte gUnk_02017660 - - thumb_func_start sub_080A7C8C -sub_080A7C8C: @ 0x080A7C8C - push {r4, r5, r6, lr} - adds r5, r0, #0 - adds r6, r1, #0 - ldr r4, _080A7C9C @ =gUnk_02017660 - movs r2, #0 - movs r1, #0 - b _080A7CA8 - .align 2, 0 -_080A7C9C: .4byte gUnk_02017660 -_080A7CA0: - adds r1, #1 - adds r4, #8 - cmp r1, #7 - bhi _080A7CB0 -_080A7CA8: - ldrh r0, [r4, #4] - cmp r0, r5 - bne _080A7CA0 - movs r2, #1 -_080A7CB0: - lsrs r1, r6, #1 - ldrb r0, [r4, #6] - lsls r0, r0, #0x1f - lsrs r0, r0, #0x1f - cmp r1, r0 - bne _080A7CF4 - cmp r2, #0 - beq _080A7CD2 - ldrb r0, [r4, #1] - bl SetLocalFlag - ldrb r0, [r4, #2] - ldrb r1, [r4, #3] - movs r2, #0 - bl CreateItemEntity - b _080A7CDC -_080A7CD2: - movs r0, #0x60 - movs r1, #0 - movs r2, #0 - bl CreateItemEntity -_080A7CDC: - movs r0, #0x74 - adds r1, r5, #0 - adds r2, r6, #0 - bl sub_0807B7D8 - movs r0, #0 - movs r1, #0x78 - bl RequestPriorityDuration - ldr r0, _080A7CF8 @ =0x0000011B - bl SoundReq -_080A7CF4: - pop {r4, r5, r6, pc} - .align 2, 0 -_080A7CF8: .4byte 0x0000011B - - thumb_func_start sub_080A7CFC -sub_080A7CFC: @ 0x080A7CFC - push {r4, r5, r6, lr} - adds r5, r0, #0 - movs r4, #0xc0 - lsls r4, r4, #3 - movs r6, #0 - movs r0, #3 - bl GetCurrentRoomProperty - adds r1, r0, #0 - cmp r1, #0 - beq _080A7D38 -_080A7D12: - ldrh r0, [r1, #4] - cmp r0, r5 - bne _080A7D30 - ldrb r0, [r1] - cmp r0, #5 - beq _080A7D24 - cmp r0, #6 - beq _080A7D2A - b _080A7D38 -_080A7D24: - movs r6, #0 - ldrh r4, [r1, #6] - b _080A7D38 -_080A7D2A: - movs r6, #1 - ldrh r4, [r1, #6] - b _080A7D38 -_080A7D30: - adds r1, #8 - ldrh r0, [r1, #4] - cmp r0, #0 - bne _080A7D12 -_080A7D38: - adds r0, r4, #0 - adds r1, r6, #0 - bl sub_080A7D44 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_080A7D44 -sub_080A7D44: @ 0x080A7D44 - push {lr} - cmp r1, #0 - beq _080A7D52 - movs r1, #0 - bl sub_08078AA8 - b _080A7D56 -_080A7D52: - bl MessageFromTarget -_080A7D56: - pop {pc} diff --git a/asm/objectOnPillar.s b/asm/objectOnPillar.s index a6f43db9..64542d7e 100644 --- a/asm/objectOnPillar.s +++ b/asm/objectOnPillar.s @@ -699,7 +699,7 @@ _08097346: sub_08097348: @ 0x08097348 push {lr} adds r3, r0, #0 - ldr r1, _08097360 @ =gUnk_02017660 + ldr r1, _08097360 @ =gSmallChests movs r2, #0 _08097350: ldrh r0, [r1, #4] @@ -709,7 +709,7 @@ _08097350: bl CheckLocalFlag b _0809736E .align 2, 0 -_08097360: .4byte gUnk_02017660 +_08097360: .4byte gSmallChests _08097364: adds r2, #1 adds r1, #8 diff --git a/include/functions.h b/include/functions.h index b9cff99a..25a9243f 100644 --- a/include/functions.h +++ b/include/functions.h @@ -29,7 +29,7 @@ extern Entity* CreateDeathFx(Entity*, u32, u32); extern void UpdateAnimationVariableFrames(Entity*, u32); extern u8* GetSpriteSubEntryOffsetDataPointer(u32, u32); extern bool32 LoadFixedGFX(Entity*, u32); -extern Entity* CreateItemEntity(u32, u32, u32); +extern void CreateItemEntity(u32, u32, u32); extern u32 ProcessMovement(Entity*); extern void MenuFadeIn(u32, u32); extern void LoadResourceAsync(const void*, u32, u32); diff --git a/include/structures.h b/include/structures.h index 2073f1b0..82b39a5c 100644 --- a/include/structures.h +++ b/include/structures.h @@ -157,4 +157,30 @@ typedef struct { void* unk8; } WStruct; +typedef struct { + u8 type; + u8 unk_0x1; + u8 unk_0x2; + u8 unk_0x3; + u16 tilePos; + u16 unk_0x6; +} TileEntityData; + +typedef enum { + NONE, + ROOM_VISIT_MARKER, + SMALL_CHEST, + BIG_CHEST, + BOMBABLE_WALL, + SIGN, + TILE_ENTITY_6, + MUSIC_SETTER, + TILE_ENTITY_8, + DARKNESS, + DESTRUCTIBLE_TILE, + GRASS_DROP_CHANGER, + TILE_ENTITY_C, + TILE_ENTITY_D +} TileEntityType; + #endif diff --git a/linker.ld b/linker.ld index f20f38ab..5859ee17 100644 --- a/linker.ld +++ b/linker.ld @@ -65,7 +65,7 @@ SECTIONS { . = 0x00012654; gMetatilesTop = .; . = 0x00016654; gUnk_02016654 = .; . = 0x00017654; gCurrentRoomProperties = .; - . = 0x00017660; gUnk_02017660 = .; + . = 0x00017660; gSmallChests = .; . = 0x000176A0; gPaletteBuffer = .; . = 0x000176E0; gUnk_020176E0 = .; . = 0x00017700; gUnk_02017700 = .; @@ -919,7 +919,7 @@ SECTIONS { src/sub_080A554C.o(.text); asm/code_080A5574.o(.text); src/playerItem/playerItemSword.o(.text); - asm/code_080A7C00.o(.text); + src/code_080A7C00.o(.text); src/projectileInit.o(.text); src/projectile/darkNutSwordSlash.o(.text); src/projectile/rockProjectile.o(.text); diff --git a/src/code_080A7C00.c b/src/code_080A7C00.c new file mode 100644 index 00000000..4038ab33 --- /dev/null +++ b/src/code_080A7C00.c @@ -0,0 +1,115 @@ +#include "global.h" +#include "utils.h" +#include "textbox.h" +#include "save.h" +#include "audio.h" +#include "flags.h" +#include "functions.h" +#include "object.h" + +extern Entity* GiveItemWithCutscene(); +extern Entity* sub_080A276C(Entity*, u32, u32); +extern void sub_08078AF0(Entity*, u32, u32); +extern Entity* sub_0805E744(void); + +extern TileEntityData gSmallChests[8]; + +void sub_080A7D44(u32, bool32); + +void CreateItemEntity(u32 type, u32 type2, u32 actionDelay) { + Entity* entity = GiveItemWithCutscene(type, type2, actionDelay); + if (entity != NULL) { + Entity* new_entity = sub_080A276C(entity, entity->type, 0); + entity->parent = new_entity; + } +} + +void sub_080A7C18(u32 type, u32 type2, u32 actionDelay) { + Entity* entity = GiveItemWithCutscene(type, type2, actionDelay); + if (entity != NULL) { + entity->parent = &gPlayerEntity; + sub_08078AF0(entity, entity->type, 0); + } +} + +Entity* GiveItemWithCutscene(s32 type, u32 type2, u32 actionDelay) { + Entity* entity; + + if ((type == 0x3f) && (gSave.stats.filler3[0] != 0)) { + type = 0x57; + type2 = 0; + } + entity = sub_0805E744(); + if (entity != NULL) { + entity->type = type; + entity->type2 = type2; + entity->actionDelay = actionDelay; + entity->id = OBJECT_B; + entity->kind = OBJECT; + AppendEntityToList(entity, 6); + } + return entity; +} + +void ClearSmallChests(void) { + MemClear(&gSmallChests, sizeof(gSmallChests)); +} + +void sub_080A7C8C(u32 tilePos, u32 param_2) { + TileEntityData* data = gSmallChests; + bool32 found = FALSE; + u32 index; + for (index = 0; index < 8; data++) { + if (data->tilePos == tilePos) { + found = TRUE; + break; + } + index++; + } + if (param_2 >> 1 == ((u32)(*((u8*)&data->unk_0x6) << 0x1f) >> 0x1f)) { + if (found) { + SetLocalFlag(data->unk_0x1); + CreateItemEntity(data->unk_0x2, data->unk_0x3, 0); + } else { + CreateItemEntity(0x60, 0, 0); + } + sub_0807B7D8(0x74, tilePos, param_2); + RequestPriorityDuration(NULL, 0x78); + SoundReq(SFX_11B); + } +} + +void sub_080A7CFC(u32 tilePos) { + u32 messageId = 0x600; + bool32 isTileEntity6 = FALSE; + TileEntityData* data = (TileEntityData*)GetCurrentRoomProperty(3); + if (data != NULL) { + do { + if (data->tilePos == tilePos) { + switch (data->type) { + case SIGN: + isTileEntity6 = FALSE; + messageId = data->unk_0x6; // message id + break; + case TILE_ENTITY_6: + isTileEntity6 = TRUE; + messageId = data->unk_0x6; + break; + } + break; + } + data += 1; + } while (data->tilePos != 0); + } + sub_080A7D44(messageId, isTileEntity6); +} + +void sub_080A7D44(u32 messageId, bool32 isTileEntity6) { + if (isTileEntity6) { + // TILE_ENTITY_6 + sub_08078AA8(messageId, 0); + } else { + // Read sign text + MessageFromTarget(messageId); + } +} diff --git a/src/loadRoom.c b/src/loadRoom.c index 4ca4aa43..6714f00c 100644 --- a/src/loadRoom.c +++ b/src/loadRoom.c @@ -17,7 +17,7 @@ extern u8 gUnk_081091E4[]; extern void sub_080186EC(); extern void sub_0804B16C(); -extern void sub_080A7C7C(void); +extern void ClearSmallChests(void); extern Entity* GetEmptyEntityByKind(u32 kind); void RegisterRoomEntity(Entity*, EntityData*); @@ -115,7 +115,7 @@ void sub_0804AF0C(Entity* ent, EntityData* dat) { void sub_0804AF90(void) { sub_0804AFB0(gArea.pCurrentRoomInfo->properties); - sub_080A7C7C(); + ClearSmallChests(); } void sub_0804AFB0(void** properties) { From 75b0db1b84712e908a058865e1c09ca5214d9ecb Mon Sep 17 00:00:00 2001 From: Elliptic Ellipsis Date: Sat, 18 Dec 2021 07:45:19 +0000 Subject: [PATCH 4/6] Update Jenkinsfile destinations --- Jenkinsfile | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 93efaa65..66549a57 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -26,8 +26,9 @@ pipeline { } steps { sh 'mkdir reports' - sh 'python3 progress.py csv >> reports/progress_tmc.csv' - sh 'python3 progress.py csv -m >> reports/progress_tmc_matching.csv' + sh 'python3 progress.py csv >> reports/progress-tmc-nonmatching.csv' + sh 'python3 progress.py csv -m >> reports/progress-tmc-matching.csv' + sh 'python3 progress.py shield-json > reports/progress-tmc-shield.json' stash includes: 'reports/*', name: 'reports' } } @@ -40,8 +41,9 @@ pipeline { } steps { unstash 'reports' - sh 'cat reports/progress_tmc.csv >> /var/www/html/reports/progress_tmc.csv' - sh 'cat reports/progress_tmc_matching.csv >> /var/www/html/reports/progress_tmc_matching.csv' + sh 'cat reports/progress-tmc-nonmatching.csv >> /var/www/zelda64.dev/assets/csv/progress-tmc-nonmatching.csv' + sh 'cat reports/progress-tmc-matching.csv >> /var/www/zelda64.dev/assets/csv/progress-tmc-matching.csv' + sh 'cat reports/progress-tmc-shield.json > /var/www/zelda64.dev/assets/csv/progress-tmc-shield.json' } } } From 26d404235c47b9cbc39c5ca5583130f5e7aaa64b Mon Sep 17 00:00:00 2001 From: Elliptic Ellipsis Date: Sat, 18 Dec 2021 07:45:33 +0000 Subject: [PATCH 5/6] Add shields to README.md --- README.md | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5b3e1a88..0665215a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,19 @@ # The Legend of Zelda: The Minish Cap -**Progress:** [⬛⬛⬛⬛⬛⬛⬛⬛⬛⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜⬜] 45% + +[![Build Status][jenkins-badge]][jenkins] [![Decompilation Progress][progress-badge]][progress] [![Contributors][contributors-badge]][contributors] [![Discord Channel][discord-badge]][discord] + +[jenkins]: https://jenkins.deco.mp/job/TMC/job/master +[jenkins-badge]: https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.deco.mp%2Fjob%2FTMC%2Fjob%2Fmaster + +[progress]: https://zelda64.dev/games/tmc +[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/assets/csv/progress-mm-shield.json + +[contributors]: https://github.com/zeldaret/tmc/graphs/contributors +[contributors-badge]: https://img.shields.io/github/contributors/zeldaret/tmc + +[discord]: https://discord.zelda64.dev +[discord-badge]: https://img.shields.io/discord/688807550715560050?color=%237289DA&logo=discord&logoColor=%23FFFFFF ```diff - WARNING! - From 78bc78fe3cbbbe5df21539b03664d873550753f1 Mon Sep 17 00:00:00 2001 From: Elliptic Ellipsis Date: Sat, 18 Dec 2021 07:48:54 +0000 Subject: [PATCH 6/6] Fix shield --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0665215a..5663c817 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ [jenkins-badge]: https://img.shields.io/jenkins/build?jobUrl=https%3A%2F%2Fjenkins.deco.mp%2Fjob%2FTMC%2Fjob%2Fmaster [progress]: https://zelda64.dev/games/tmc -[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/assets/csv/progress-mm-shield.json +[progress-badge]: https://img.shields.io/endpoint?url=https://zelda64.dev/assets/csv/progress-tmc-shield.json [contributors]: https://github.com/zeldaret/tmc/graphs/contributors [contributors-badge]: https://img.shields.io/github/contributors/zeldaret/tmc