From c482e2dfdb28c68bae2a1f8633af34c054ffc6d1 Mon Sep 17 00:00:00 2001 From: cecilarmitais Date: Tue, 15 Sep 2026 02:48:48 -0700 Subject: [PATCH] Decompile 59 more callees; clear five asm files entirely asm/main_020504BC.s 28 functions cleared asm/main_0200D1F0.s 11 functions cleared asm/main_02052060.s 10 functions cleared asm/overlay_29_02320788.s 8 functions cleared asm/main_020559D8.s 1 function cleared asm/overlay_29_022E34A8.s 1 of 9 remainder -> overlay_29_022E2B68.s sub_02050CF8 and sub_02050D84 are in translation units of their own, src/main_02050CF8.c and src/main_02050D84.c, and that is load-bearing rather than tidiness. Both call BitstreamDebug, which is four bytes -- an empty body -- and is one of the other 26 functions of the same asm file. Compiled beside it at -O4,s, mwcc inlines the call away and each function comes out two instructions short; the ROM then shifts and 33 of 37 sbins stop matching. Retail emits a real bl there, so retail compiled these two apart from BitstreamDebug. Separate objects reproduce that, and the pool -- five words and the predicated ldrne/ldreq pair -- was never the problem. asm/main_bss_022AB0AC.s declares a second global at 0x022AB918. Two objects of different size share that address: the record TEAM_NAME (0x14 bytes, 0x10 under JAPAN) and _022AB918, its leading name buffer (0xC, 8 under JAPAN). Four functions load both, which needs two distinct (symbol, addend) pool keys; one symbol gives one word and leaves them four bytes short. No .space is added and no later symbol moves, so the bss layout and the ROM are untouched -- confirmed by building that one-line change alone against the previous commit. ov29_022E34A8_EU exists only in the EUROPE build, so its definition and its prototype both carry #ifdef EUROPE; its single call site was already inside one. Note that extracting it left an orphan #endif in the remainder file, because it was the first function in its .s and sat inside a region conditional -- the tool takes the opening directive with the function and leaves the closing one behind. struct bag_items loses fill2/fill3/fill4 for the members behind them, so struct bulk_item moves above it and two accessors return struct bulk_item *. struct unk_020517F4 splits u8[8] into u8[4] + s32, forced by a 32-bit load at offset 4. struct bitstream::ptr becomes u8 * -- CopyBitsTo and CopyBitsFrom read it with ldrb, and char * under -char signed emits ldrsb. sub_02051FF0 and LoadFileFromRom take a const char * path, not a u32 id; src/ground_bg.c already declared the latter correctly. Seventeen call-site-derived declarations are removed in favour of an include of the owning header. Authored by Claude (Opus 5) under human direction. Confirmed by matching builds in all three regions: build/pmdsky.us/pmdsky.us.nds: OK, build/pmdsky.eu/pmdsky.eu.nds: OK, build/pmdsky.jp/pmdsky.jp.nds: OK. Co-Authored-By: Claude Opus 5 --- asm/include/main_0200D1F0.inc | 28 - asm/include/main_020504BC.inc | 18 - asm/include/main_02052060.inc | 26 - asm/include/main_020559D8.inc | 2 - ...9_022E34A8.inc => overlay_29_022E2B68.inc} | 2 - asm/include/overlay_29_02320788.inc | 47 - asm/main_0200D1F0.s | 556 ----------- asm/main_020504BC.s | 881 ------------------ asm/main_02052060.s | 556 ----------- asm/main_020559D8.s | 102 -- asm/main_bss_022AB0AC.s | 2 + ...ay_29_022E34A8.s => overlay_29_022E2B68.s} | 28 +- asm/overlay_29_02320788.s | 830 ----------------- include/dungeon_util_2.h | 3 + include/item.h | 11 + include/item_util_4.h | 14 + include/main_0200D81C.h | 2 + include/main_020504A4.h | 24 + include/main_02050CF8.h | 8 + include/main_02050D84.h | 8 + include/main_020517D4.h | 3 +- include/main_02051FF0.h | 3 +- include/main_020526EC.h | 29 + include/main_02055770.h | 1 + include/monster_data.h | 17 +- include/number_util.h | 10 + include/overlay_29_0230BBAC.h | 2 +- include/overlay_29_02320764.h | 13 + include/save.h | 2 +- main.lsf | 9 +- src/dungeon_recruitment.c | 2 +- src/dungeon_util_2.c | 9 + src/item_util_4.c | 236 ++++- src/main_0200D81C.c | 79 ++ src/main_0203D538.c | 3 +- src/main_020504A4.c | 360 +++++++ src/main_02050CF8.c | 40 + src/main_02050D84.c | 41 + src/main_02051FF0.c | 119 ++- src/main_020526EC.c | 282 +++++- src/main_020527A8.c | 4 +- src/main_0205283C.c | 42 +- src/main_02052B28.c | 8 +- src/main_02055770.c | 38 + src/number_util.c | 37 + src/overlay_29_023047B8.c | 2 +- src/overlay_29_0230A9DC.c | 4 +- src/overlay_29_0230BBAC.c | 2 +- src/overlay_29_02311010.c | 4 +- src/overlay_29_0231CBC8.c | 2 +- src/overlay_29_0231EDD8.c | 2 +- src/overlay_29_02320764.c | 429 +++++++++ src/overlay_29_02321238.c | 2 +- src/overlay_29_02321274.c | 2 +- src/overlay_29_023296F8.c | 2 +- src/overlay_29_0232C560.c | 2 +- 56 files changed, 1852 insertions(+), 3138 deletions(-) delete mode 100644 asm/include/main_0200D1F0.inc delete mode 100644 asm/include/main_020504BC.inc delete mode 100644 asm/include/main_02052060.inc delete mode 100644 asm/include/main_020559D8.inc rename asm/include/{overlay_29_022E34A8.inc => overlay_29_022E2B68.inc} (90%) delete mode 100644 asm/include/overlay_29_02320788.inc delete mode 100644 asm/main_0200D1F0.s delete mode 100644 asm/main_020504BC.s delete mode 100644 asm/main_02052060.s delete mode 100644 asm/main_020559D8.s rename asm/{overlay_29_022E34A8.s => overlay_29_022E2B68.s} (95%) delete mode 100644 asm/overlay_29_02320788.s create mode 100644 include/main_02050CF8.h create mode 100644 include/main_02050D84.h create mode 100644 src/main_02050CF8.c create mode 100644 src/main_02050D84.c diff --git a/asm/include/main_0200D1F0.inc b/asm/include/main_0200D1F0.inc deleted file mode 100644 index 117e881e..00000000 --- a/asm/include/main_0200D1F0.inc +++ /dev/null @@ -1,28 +0,0 @@ -#pragma once -.public _02094D0C -.public _02097F34 -.public _02097F50 -.public _02097F58 -.public _02097F68 -.public _02097F6C -.public _02097F7C -.public _02097F90 -.public _02097F9C -.public _02097FAC -.public _02097FB8 -.public _02097FC4 -.public _02097FE4 -.public BAG_ITEMS_PTR_MIRROR -.public GetDisplayedBuyPrice -.public GetDisplayedSellPrice -.public GetItemActionName -.public GetItemCategory -.public GetItemName -.public GetItemPaletteId -.public GetMoneyQuantity -.public InitItem -.public MoneyQuantityToString__02023B30 -.public strcpy -.public strncpy -.public sub_0200EB64 -.public vsprintf diff --git a/asm/include/main_020504BC.inc b/asm/include/main_020504BC.inc deleted file mode 100644 index 2122160b..00000000 --- a/asm/include/main_020504BC.inc +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -.public ADVENTURE_LOG_PTR -.public ARM9_UNKNOWN_DATA__NA_209E6BC -.public CONVERSION2_TYPE_TABLE -.public ComputeSpecialCounters -.public Copy16BitsFrom -.public Copy16BitsTo -.public CopyNStringFromId -.public GetRankUpEntry -.public GetResolvedPerformanceProgressFlag -.public GetStringFromFileVeneer -.public MemZero -.public StrncpyName -.public StrncpySimpleNoPad -.public StrncpySimpleNoPadSafe -.public TEAM_NAME -.public _0209E6BD -.public _022AB924 diff --git a/asm/include/main_02052060.inc b/asm/include/main_02052060.inc deleted file mode 100644 index 3a39cc40..00000000 --- a/asm/include/main_02052060.inc +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once -.public _020A31B8 -.public _020A31D4 -.public _020A31E4 -.public _020A31F4 -.public _020A31FC -.public _020A45C8_JP -.public _020B09B0 -.public _020B09C0 -.public _s32_div_f -.public ARM9_UNKNOWN_PTR__NA_20A2C84 -.public CopyColorToPaletteDataRgba -.public GetBaseForm -.public LoadFileFromRom -.public LoadM2nAndN2m -.public MarkPaletteDataAsNeedingUpdate -.public MemFree -.public MONSTER_DATA_TABLE_PTR -.public StringFromId -.public strncpy -.public sub_02051804 -.public sub_02051D8C -.public sub_02051E60 -.public sub_02051FF0 -.public UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE -.public vsprintf diff --git a/asm/include/main_020559D8.inc b/asm/include/main_020559D8.inc deleted file mode 100644 index 6696f528..00000000 --- a/asm/include/main_020559D8.inc +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -.public TEAM_MEMBER_TABLE_PTR diff --git a/asm/include/overlay_29_022E34A8.inc b/asm/include/overlay_29_022E2B68.inc similarity index 90% rename from asm/include/overlay_29_022E34A8.inc rename to asm/include/overlay_29_022E2B68.inc index d15ff07c..06f56aea 100644 --- a/asm/include/overlay_29_022E34A8.inc +++ b/asm/include/overlay_29_022E2B68.inc @@ -2,9 +2,7 @@ .public CanSeeInvisibleMonsters .public DUNGEON_PTR .public DrawMinimapTile -.public EntityIsValid__022E1A1C .public EntityIsValid__022E32E8 -.public GetForcedLossReason .public HasDropeyeStatus .public IsBlinded .public IsPositionActuallyInSight diff --git a/asm/include/overlay_29_02320788.inc b/asm/include/overlay_29_02320788.inc deleted file mode 100644 index 53f62fca..00000000 --- a/asm/include/overlay_29_02320788.inc +++ /dev/null @@ -1,47 +0,0 @@ -#pragma once -.public AbilityIsActiveVeneer -.public ActivateTerrainEffects -.public AdvanceFrame -.public AreTileJumpsAllowed -.public CalcDamageFixedNoCategory -.public CannotStandOnTile -.public CannotStandOnTileNoMonsterCheck -.public ChangeMonsterAnimationToIdle -.public DetermineTileWalkableNeighbors -.public DiscoverMinimap -.public DUNGEON_FRAMES_PASSED -.public DUNGEON_PTR -.public EntityIsValid__02320764 -.public ExclusiveItemEffectIsActiveWithLogging -.public EXPLOSION_FIXED_DAMAGES -.public FindClosestUnoccupiedTileWithin2 -.public FindUnoccupiedTileWithin3 -.public GetApparentWeather -.public GetLeader -.public GetRandomTile -.public GetTileSafe -.public HandleShopTransaction -.public InitMove -.public IsFloorOver -.public LogMessageByIdWithPopupCheckUserTarget -.public MonsterIsType -.public MoveMonsterToPos -.public ov29_022E5560 -.public ov29_022E55F0 -.public ov29_022E5650 -.public ov29_022F42F8 -.public ov29_02305814 -.public ov29_02321238 -.public ov29_02336694 -.public ov29_023529B8 -.public RemoveGroundItem -.public ShouldDisplayEntityWrapper -.public sub_01FFB62C -.public SubstitutePlaceholderStringTags -.public TryEndPetrifiedOrSleepStatus -.public TryInflictPetrifiedStatus -.public TwoTurnMoveForcedMiss -.public UpdateCamera -.public UpdateEntityPixelPos -.public UpdateMinimap -.public UpdateTrapsVisibility diff --git a/asm/main_0200D1F0.s b/asm/main_0200D1F0.s deleted file mode 100644 index 673c51ab..00000000 --- a/asm/main_0200D1F0.s +++ /dev/null @@ -1,556 +0,0 @@ - .include "asm/macros.inc" - .include "main_0200D1F0.inc" - - .text - - arm_func_start sub_0200D1F0 -sub_0200D1F0: ; 0x0200D1F0 - ldr ip, _0200D1F8 ; =sub_0200EB64 - bx ip - .align 2, 0 -_0200D1F8: .word sub_0200EB64 - arm_func_end sub_0200D1F0 - - arm_func_start sub_0200D1FC -sub_0200D1FC: ; 0x0200D1FC - ldr ip, _0200D204 ; =GetItemPaletteId - bx ip - .align 2, 0 -_0200D204: .word GetItemPaletteId - arm_func_end sub_0200D1FC - - arm_func_start sub_0200D208 -sub_0200D208: ; 0x0200D208 - ldr ip, _0200D210 ; =GetItemActionName - bx ip - .align 2, 0 -_0200D210: .word GetItemActionName - arm_func_end sub_0200D208 - - arm_func_start sub_0200D214 -sub_0200D214: ; 0x0200D214 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x58 - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r4, r2 - bl GetItemName - mov r1, r0 - add r0, sp, #6 - mov r2, #0x50 - bl strncpy - mov r2, #0 - mov r1, r5 - add r0, sp, #0 - mov r3, r2 - bl InitItem - mov r1, #1 - strh r1, [sp, #2] - mov r0, r6 - mov r3, r4 - add r1, sp, #6 - add r2, sp, #0 - bl sub_0200D688 - add sp, sp, #0x58 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end sub_0200D214 - - arm_func_start FindItemInInventory -FindItemInInventory: ; 0x0200D278 - stmdb sp!, {r4, r5, r6, lr} - ldr r1, _0200D30C ; =BAG_ITEMS_PTR_MIRROR - mov r5, #0 - ldr r6, [r1] - mov r3, r5 - mov ip, #1 - mov r1, #6 - b _0200D2D0 -_0200D298: - mul lr, r5, r1 - ldr r4, [r6, #0x384] - ldrb r2, [r4, lr] - add r4, r4, lr - tst r2, #1 - movne r2, ip - moveq r2, r3 - tst r2, #0xff - beq _0200D2CC - ldrsh r2, [r4, #4] - cmp r0, r2 - moveq r0, r5 - ldmeqia sp!, {r4, r5, r6, pc} -_0200D2CC: - add r5, r5, #1 -_0200D2D0: - cmp r5, #0x32 - blt _0200D298 - mov r2, #0 - b _0200D2FC -_0200D2E0: - add r1, r6, r2, lsl #1 - add r1, r1, #0x300 - ldrsh r1, [r1, #0x8a] - cmp r0, r1 - addeq r0, r2, #0x8000 - ldmeqia sp!, {r4, r5, r6, pc} - add r2, r2, #1 -_0200D2FC: - cmp r2, #0x3e8 - blt _0200D2E0 - mvn r0, #0 - ldmia sp!, {r4, r5, r6, pc} - .align 2, 0 -_0200D30C: .word BAG_ITEMS_PTR_MIRROR - arm_func_end FindItemInInventory - - arm_func_start MaybeGetFormattedItemName -MaybeGetFormattedItemName: ; 0x0200D310 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0xa0 - mov sb, r1 - mov sl, r0 - ldrsh r0, [sb, #4] - mov r8, r2 - mov r7, r3 - mov r4, #0 - bl GetItemCategory - mov r5, r4 - mov r6, r0 - cmp r8, #0 - ldrneb r0, [r8, #8] - mov fp, r5 - cmpne r0, #0 - ldrsh r0, [sb, #4] - movne r4, #1 - bl GetItemName - mov r2, r0 - cmp r6, #0 - bne _0200D3B4 - cmp r4, #0 - add r0, sp, #0x50 - beq _0200D394 - cmp r7, #0 - ldrh r3, [sb, #2] - beq _0200D388 - ldr r1, _0200D60C ; =_02097F34 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D388: - ldr r1, _0200D610 ; =_02097F50 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D394: - cmp r7, #0 - beq _0200D3A8 - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3A8: - ldr r1, _0200D618 ; =_02097F68 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3B4: - cmp r6, #1 - bne _0200D40C - cmp r4, #0 - add r0, sp, #0x50 - beq _0200D3EC - cmp r7, #0 - ldrh r3, [sb, #2] - beq _0200D3E0 - ldr r1, _0200D60C ; =_02097F34 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3E0: - ldr r1, _0200D610 ; =_02097F50 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D3EC: - cmp r7, #0 - beq _0200D400 - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D400: - ldr r1, _0200D618 ; =_02097F68 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D40C: - add r0, r6, #0xf4 - and r0, r0, #0xff - cmp r0, #2 - bhi _0200D440 - cmp r7, #0 - add r0, sp, #0x50 - beq _0200D434 - ldr r1, _0200D61C ; =_02097F6C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D434: - mov r1, r2 - bl strcpy - b _0200D4F8 -_0200D440: - ldrsh r0, [sb, #4] - cmp r0, #0xb7 - bne _0200D4AC - mov r0, sb - bl GetMoneyQuantity - mov r1, r0 - add r0, sp, #0 - bl MoneyQuantityToString__02023B30 - cmp r7, #0 - add r0, sp, #0x50 - add r2, sp, #0 - beq _0200D47C - ldr r1, _0200D620 ; =_02097F7C - bl SprintfStatic__0200D634 - b _0200D484 -_0200D47C: - ldr r1, _0200D624 ; =_02097F90 - bl SprintfStatic__0200D634 -_0200D484: - cmp r7, #0 - add r0, sp, #0x50 - add r2, sp, #0 - beq _0200D4A0 - ldr r1, _0200D620 ; =_02097F7C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4A0: - ldr r1, _0200D624 ; =_02097F90 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4AC: - cmp r6, #0xf - add r0, sp, #0x50 - bne _0200D4D8 - cmp r7, #0 - beq _0200D4CC - ldr r1, _0200D628 ; =_02097F9C - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4CC: - mov r1, r2 - bl strcpy - b _0200D4F8 -_0200D4D8: - cmp r7, #0 - beq _0200D4EC - ldr r1, _0200D614 ; =_02097F58 - bl SprintfStatic__0200D634 - b _0200D4F8 -_0200D4EC: - mov r1, r2 - mov r2, #0x50 - bl strncpy -_0200D4F8: - ldrb r0, [sb] - tst r0, #8 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _0200D538 - ldr r1, _0200D62C ; =_02097FAC - add r2, sp, #0x50 - mov r0, sl - bl SprintfStatic__0200D634 - add r0, sp, #0x50 - mov r1, sl - mov r2, #0x50 - bl strncpy - mov fp, #1 - b _0200D564 -_0200D538: - ldrb r0, [sp, #0xc8] - cmp r0, #0 - beq _0200D564 - ldr r1, _0200D630 ; =_02097FB8 - add r2, sp, #0x50 - mov r0, sl - bl SprintfStatic__0200D634 - add r0, sp, #0x50 - mov r1, sl - mov r2, #0x50 - bl strncpy -_0200D564: - cmp r8, #0 - bne _0200D580 - add r1, sp, #0x50 - mov r0, sl - mov r2, #0x50 - bl strncpy - b _0200D600 -_0200D580: - ldrb r0, [r8, #4] - cmp r0, #0 - beq _0200D5AC - ldrb r0, [sb] - tst r0, #0x10 - beq _0200D5AC - cmp fp, #0 - movne r0, #0x35 - strneb r0, [sp, #0x54] - moveq r0, #0x32 - streqb r0, [sp, #0x54] -_0200D5AC: - ldr r0, [r8] - add r1, sp, #0x50 - cmp r0, #1 - cmpne r0, #3 - bne _0200D5F0 - ldrb r0, [sb] - tst r0, #2 - mov r0, sl - beq _0200D5E4 - mov r2, sb - mov r3, r8 - bl sub_0200D688 - mov r5, #1 - b _0200D600 -_0200D5E4: - mov r2, #0x50 - bl strncpy - b _0200D600 -_0200D5F0: - mov r0, sl - mov r2, sb - mov r3, r8 - bl sub_0200D688 -_0200D600: - mov r0, r5 - add sp, sp, #0xa0 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_0200D60C: .word _02097F34 -_0200D610: .word _02097F50 -_0200D614: .word _02097F58 -_0200D618: .word _02097F68 -_0200D61C: .word _02097F6C -_0200D620: .word _02097F7C -_0200D624: .word _02097F90 -_0200D628: .word _02097F9C -_0200D62C: .word _02097FAC -_0200D630: .word _02097FB8 - arm_func_end MaybeGetFormattedItemName - - arm_func_start SprintfStatic__0200D634 -SprintfStatic__0200D634: ; 0x0200D634 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__0200D634 - - arm_func_start MaybeGetUncoloredFormattedItemName -MaybeGetUncoloredFormattedItemName: ; 0x0200D65C - stmdb sp!, {r3, lr} - mov r3, #0 - str r3, [sp] - bl MaybeGetFormattedItemName - ldmia sp!, {r3, pc} - arm_func_end MaybeGetUncoloredFormattedItemName - - arm_func_start MaybeGetColoredFormattedItemName -MaybeGetColoredFormattedItemName: ; 0x0200D670 - stmdb sp!, {r3, lr} - mov ip, #0 - mov r3, #1 - str ip, [sp] - bl MaybeGetFormattedItemName - ldmia sp!, {r3, pc} - arm_func_end MaybeGetColoredFormattedItemName - - arm_func_start sub_0200D688 -sub_0200D688: ; 0x0200D688 - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #0x2c - movs r4, r3 - mov r6, r0 - mov r5, r1 - bne _0200D6AC - mov r2, #0x50 - bl strncpy - b _0200D75C -_0200D6AC: - ldr r0, [r4] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _0200D6E8 -_0200D6BC: ; jump table - b _0200D6E8 ; case 0 - b _0200D6D0 ; case 1 - b _0200D6D0 ; case 2 - b _0200D6DC ; case 3 - b _0200D6DC ; case 4 -_0200D6D0: - mov r0, r2 - bl GetDisplayedBuyPrice - b _0200D6EC -_0200D6DC: - mov r0, r2 - bl GetDisplayedSellPrice - b _0200D6EC -_0200D6E8: - mov r0, #0 -_0200D6EC: - cmp r0, #0 - bne _0200D708 - mov r0, r6 - mov r1, r5 - mov r2, #0x50 - bl strncpy - b _0200D75C -_0200D708: - ldrsh r1, [r4, #6] - cmp r1, #0 - add r1, sp, #4 - beq _0200D740 - mov r2, #1 - bl sub_0200D76C - add r0, sp, #4 - str r0, [sp] - ldrsh r3, [r4, #6] - ldr r1, _0200D764 ; =_02097FC4 - mov r0, r6 - mov r2, r5 - bl SprintfStatic__0200D634 - b _0200D75C -_0200D740: - mov r2, #0 - bl sub_0200D76C - ldr r1, _0200D768 ; =_02097FE4 - add r3, sp, #4 - mov r0, r6 - mov r2, r5 - bl SprintfStatic__0200D634 -_0200D75C: - add sp, sp, #0x2c - ldmia sp!, {r3, r4, r5, r6, pc} - .align 2, 0 -_0200D764: .word _02097FC4 -_0200D768: .word _02097FE4 - arm_func_end sub_0200D688 - - arm_func_start sub_0200D76C -sub_0200D76C: ; 0x0200D76C -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} - ldr r3, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov lr, #0 - ldr r4, [r3, #4] - mov ip, lr - mov r3, lr -_0200D784: - ldr r5, _0200D818 ; =_02094D0C - mov r6, #0 - ldr r5, [r5, r3, lsl #2] - b _0200D79C -_0200D794: - sub r0, r0, r5 - add r6, r6, #1 -_0200D79C: - cmp r0, r5 - bge _0200D794 - cmp r6, #9 - movgt r6, #9 - cmp r6, #0 - beq _0200D7D8 - ldrb r5, [r4, r6, lsl #1] - add r6, r4, r6, lsl #1 - add ip, ip, #1 - strb r5, [r1] - ldrb r5, [r6, #1] - mov lr, #1 - strb r5, [r1, #1] - add r1, r1, #2 - b _0200D80C -_0200D7D8: - cmp lr, #0 - beq _0200D800 - ldrb r5, [r4, r6, lsl #1] - add r6, r4, r6, lsl #1 - add ip, ip, #1 - strb r5, [r1] - ldrb r5, [r6, #1] - strb r5, [r1, #1] - add r1, r1, #2 - b _0200D80C -_0200D800: - cmp r2, #0 - movne r5, #0x7f - strneb r5, [r1], #1 -_0200D80C: - add r3, r3, #1 - cmp r3, #5 - blt _0200D784 - ldr r2, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov r3, #0 - ldr r2, [r2, #4] - ldrb r4, [r2, r0, lsl #1] - add r2, r2, r0, lsl #1 - add r0, ip, #1 - strb r4, [r1] - ldrb r2, [r2, #1] - strb r2, [r1, #1] - strb r3, [r1, #2] - ldmia sp!, {r4, r5, r6, pc} -#else - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r3, _0200D814 ; =BAG_ITEMS_PTR_MIRROR - mov ip, #0 - ldr lr, [r3, #4] - ldr r8, _0200D818 ; =_02094D0C - mov r3, ip - mov sl, ip - mov r7, #9 - mov r4, #0x7f - mov r6, #1 - mov sb, ip -_0200D798: - mov r5, sb - ldr fp, [r8, sl, lsl #2] - b _0200D7AC -_0200D7A4: - sub r0, r0, fp - add r5, r5, #1 -_0200D7AC: - cmp r0, fp - bge _0200D7A4 - cmp r5, #9 - movgt r5, r7 - cmp r5, #0 - ldrneb r5, [lr, r5] - movne ip, r6 - addne r3, r3, #1 - strneb r5, [r1], #1 - bne _0200D7F0 - cmp ip, #0 - ldrneb r5, [lr, r5] - addne r3, r3, #1 - strneb r5, [r1], #1 - bne _0200D7F0 - cmp r2, #0 - strneb r4, [r1], #1 -_0200D7F0: - add sl, sl, #1 - cmp sl, #5 - blt _0200D798 - ldrb ip, [lr, r0] - mov r2, #0 - add r0, r3, #1 - strb ip, [r1] - strb r2, [r1, #1] - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -#endif - .align 2, 0 -_0200D814: .word BAG_ITEMS_PTR_MIRROR -_0200D818: .word _02094D0C - arm_func_end sub_0200D76C diff --git a/asm/main_020504BC.s b/asm/main_020504BC.s deleted file mode 100644 index f457bbaf..00000000 --- a/asm/main_020504BC.s +++ /dev/null @@ -1,881 +0,0 @@ - .include "asm/macros.inc" - .include "main_020504BC.inc" - - .text - - arm_func_start SetSentryDutyGamePoints -SetSentryDutyGamePoints: ; 0x020504BC - stmdb sp!, {r3, lr} - ldr r1, _02050548 ; =ADVENTURE_LOG_PTR - mov lr, #0 - ldr r2, [r1] - b _020504EC -_020504D0: - add r1, r2, lr, lsl #2 - ldr r1, [r1, #0x264] - cmp r0, r1 - bhi _020504F4 - add r1, lr, #1 - mov r1, r1, lsl #0x10 - mov lr, r1, asr #0x10 -_020504EC: - cmp lr, #5 - blt _020504D0 -_020504F4: - cmp lr, #5 - mvnge r0, #0 - ldmgeia sp!, {r3, pc} - mov ip, #4 - ldr r2, _02050548 ; =ADVENTURE_LOG_PTR - b _02050528 -_0205050C: - ldr r3, [r2] - sub r1, ip, #1 - add ip, r3, ip, lsl #2 - ldr r3, [ip, #0x260] - mov r1, r1, lsl #0x10 - str r3, [ip, #0x264] - mov ip, r1, asr #0x10 -_02050528: - cmp ip, lr - bgt _0205050C - ldr r1, _02050548 ; =ADVENTURE_LOG_PTR - ldr r1, [r1] - add r1, r1, lr, lsl #2 - str r0, [r1, #0x264] - mov r0, lr - ldmia sp!, {r3, pc} - .align 2, 0 -_02050548: .word ADVENTURE_LOG_PTR - arm_func_end SetSentryDutyGamePoints - - arm_func_start CopyLogTo -CopyLogTo: ; 0x0205054C - stmdb sp!, {r4, lr} - mov r4, r0 - bl ComputeSpecialCounters - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x10 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x14 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x18 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x80 - ldr r1, [r1] - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x2c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x30 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #9 - ldr r1, [r1] - add r1, r1, #0x34 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x28 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x24 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x1c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x38 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x3c - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x40 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0x44 - bl CopyBitsTo - mov r0, r4 - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0xd8 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x220 - add r1, r1, #0x16c - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x580 - add r1, r1, #0x1b0 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x20 - add r1, r1, #0x260 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xa0 - add r1, r1, #0x264 - bl CopyBitsTo - ldr r1, _02050734 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x278 - bl Copy16BitsTo - ldmia sp!, {r4, pc} - .align 2, 0 -_02050734: .word ADVENTURE_LOG_PTR - arm_func_end CopyLogTo - - arm_func_start CopyLogFrom -CopyLogFrom: ; 0x02050738 - stmdb sp!, {r4, lr} - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - mov r4, r0 - add r1, r1, #0x10 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x14 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x14 - add r1, r1, #0x18 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x80 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xe - add r1, r1, #0x2c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0xe - ldr r1, [r1] - add r1, r1, #0x30 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #9 - ldr r1, [r1] - add r1, r1, #0x34 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x28 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x24 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x1c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x38 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x3c - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x14 - ldr r1, [r1] - add r1, r1, #0x40 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0x44 - bl CopyBitsFrom - mov r0, r4 - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r2, #0x4a0 - ldr r1, [r1] - add r1, r1, #0xd8 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x220 - add r1, r1, #0x16c - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x580 - add r1, r1, #0x1b0 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0x20 - add r1, r1, #0x260 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - mov r2, #0xa0 - add r1, r1, #0x264 - bl CopyBitsFrom - ldr r1, _02050918 ; =ADVENTURE_LOG_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x278 - bl Copy16BitsFrom - ldmia sp!, {r4, pc} - .align 2, 0 -_02050918: .word ADVENTURE_LOG_PTR - arm_func_end CopyLogFrom - - arm_func_start GetAbilityString -GetAbilityString: ; 0x0205091C -#if defined(EUROPE) - add r1, r1, #0x5e0 - add r1, r1, #0x3000 -#elif defined(JAPAN) - add r1, r1, #0x81 - add r1, r1, #0x4800 -#else - add r1, r1, #0xde - add r1, r1, #0x3500 -#endif - mov r1, r1, lsl #0x10 - ldr ip, _02050938 ; =CopyNStringFromId - mov r1, r1, lsr #0x10 - mov r2, #0x50 - bx ip - .align 2, 0 -_02050938: .word CopyNStringFromId - arm_func_end GetAbilityString - - arm_func_start GetAbilityDescStringId -GetAbilityDescStringId: ; 0x0205093C -#if defined(EUROPE) - add r0, r0, #0x25c - add r0, r0, #0x3400 -#elif defined(JAPAN) - add r0, r0, #0xfd - add r0, r0, #0x4800 -#else - add r0, r0, #0x5a - add r0, r0, #0x3600 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - arm_func_end GetAbilityDescStringId - - arm_func_start GetTypeStringId -GetTypeStringId: ; 0x02050950 -#if defined(EUROPE) - add r0, r0, #0xcd - add r0, r0, #0x3500 -#elif defined(JAPAN) - add r0, r0, #0x6e - add r0, r0, #0x4800 -#else - add r0, r0, #0xcb - add r0, r0, #0x3500 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bx lr - arm_func_end GetTypeStringId - - arm_func_start GetConversion2ConvertToType -GetConversion2ConvertToType: ; 0x02050964 - ldr r1, _02050970 ; =CONVERSION2_TYPE_TABLE - ldrb r0, [r1, r0] - bx lr - .align 2, 0 -_02050970: .word CONVERSION2_TYPE_TABLE - arm_func_end GetConversion2ConvertToType - - arm_func_start InitBitstreamForWrite -InitBitstreamForWrite: ; 0x02050974 - str r1, [r0] - mov r3, #0 - str r3, [r0, #8] - str r3, [r0, #0xc] - add r1, r1, r2 - str r1, [r0, #4] - bx lr - arm_func_end InitBitstreamForWrite - - arm_func_start InitBitstreamForRead -InitBitstreamForRead: ; 0x02050990 - str r1, [r0] - mov r3, #0 - str r3, [r0, #8] - str r3, [r0, #0xc] - add r3, r1, r2 - str r3, [r0, #4] - mov r0, r1 - ldr ip, _020509B8 ; =MemZero - mov r1, r2 - bx ip - .align 2, 0 -_020509B8: .word MemZero - arm_func_end InitBitstreamForRead - - arm_func_start BitstreamDebug -BitstreamDebug: ; 0x020509BC - bx lr - arm_func_end BitstreamDebug - - arm_func_start CopyBitsTo -CopyBitsTo: ; 0x020509C0 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov ip, #0 - mov r3, #1 - mov r5, ip - mov r4, ip - b _02050A34 -_020509D8: - ldrb r6, [r1] - sub r2, r2, #1 - tst r6, r3, lsl ip - ldrne r7, [r0] - ldrne lr, [r0, #8] - ldrneb r6, [r7] - add ip, ip, #1 - orrne r6, r6, r3, lsl lr - strneb r6, [r7] - ldr lr, [r0, #8] - cmp ip, #8 - add lr, lr, #1 - moveq ip, r5 - addeq r1, r1, #1 - str lr, [r0, #8] - cmp lr, #8 - ldreq lr, [r0] - addeq lr, lr, #1 - streq lr, [r0] - streq r4, [r0, #8] - ldr lr, [r0, #0xc] - add lr, lr, #1 - str lr, [r0, #0xc] -_02050A34: - cmp r2, #0 - bne _020509D8 - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end CopyBitsTo - - arm_func_start CopyBitsFrom -CopyBitsFrom: ; 0x02050A40 - stmdb sp!, {r3, r4, r5, r6, r7, lr} - mov lr, #0 - mov ip, lr - mov r3, #1 - mov r6, lr - mov r5, lr - b _02050AC0 -_02050A5C: - cmp lr, #0 - streqb ip, [r1] - ldr r7, [r0] - ldr r4, [r0, #8] - ldrb r7, [r7] - sub r2, r2, #1 - tst r7, r3, lsl r4 - ldrneb r4, [r1] - orrne r4, r4, r3, lsl lr - strneb r4, [r1] - ldr r4, [r0, #8] - add lr, lr, #1 - cmp lr, #8 - add r4, r4, #1 - moveq lr, r6 - addeq r1, r1, #1 - str r4, [r0, #8] - cmp r4, #8 - ldreq r4, [r0] - addeq r4, r4, #1 - streq r4, [r0] - streq r5, [r0, #8] - ldr r4, [r0, #0xc] - add r4, r4, #1 - str r4, [r0, #0xc] -_02050AC0: - cmp r2, #0 - bne _02050A5C - ldmia sp!, {r3, r4, r5, r6, r7, pc} - arm_func_end CopyBitsFrom - - arm_func_start StoreDefaultTeamData -StoreDefaultTeamData: ; 0x02050ACC - stmdb sp!, {lr} - sub sp, sp, #0x14 -#ifdef JAPAN - ldr r1, _02050E54 ; =0x000004C5 - add r0, sp, #0 -#else - add r0, sp, #0 - mov r1, #0x234 -#endif - bl GetStringFromFileVeneer - ldr r0, _02050B08 ; =TEAM_NAME - add r1, sp, #0 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpyName - ldr r0, _02050B0C ; =TEAM_NAME - mov r1, #0 -#ifdef JAPAN - str r1, [r0, #8] - strb r1, [r0, #0xc] -#else - str r1, [r0, #0xc] - strb r1, [r0, #0x10] -#endif - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -#ifdef JAPAN -_02050E54: .word 0x000004C5 -#endif -_02050B08: .word TEAM_NAME -_02050B0C: .word TEAM_NAME - arm_func_end StoreDefaultTeamData - - arm_func_start GetMainTeamNameWithCheck -GetMainTeamNameWithCheck: ; 0x02050B10 - stmdb sp!, {r4, lr} - sub sp, sp, #0x40 - mov r4, r0 - mov r0, #1 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - ldrne r0, _02050B70 ; =TEAM_NAME - ldrneb r0, [r0] - cmpne r0, #0 - beq _02050B4C - ldr r1, _02050B74 ; =TEAM_NAME - mov r0, r4 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpySimpleNoPad - b _02050B68 -_02050B4C: - ldr r1, _02050B78 ; =0x00000237 - add r0, sp, #0 - bl GetStringFromFileVeneer - add r1, sp, #0 - mov r0, r4 -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bl StrncpyName -_02050B68: - add sp, sp, #0x40 - ldmia sp!, {r4, pc} - .align 2, 0 -_02050B70: .word TEAM_NAME -_02050B74: .word TEAM_NAME -#ifdef JAPAN -_02050B78: .word 0x000004C8 -#else -_02050B78: .word 0x00000237 -#endif - arm_func_end GetMainTeamNameWithCheck - - arm_func_start GetMainTeamName -GetMainTeamName: ; 0x02050B7C - ldr ip, _02050B8C ; =StrncpySimpleNoPadSafe - ldr r1, _02050B90 ; =TEAM_NAME -#ifdef JAPAN - mov r2, #5 -#else - mov r2, #0xa -#endif - bx ip - .align 2, 0 -_02050B8C: .word StrncpySimpleNoPadSafe -_02050B90: .word TEAM_NAME - arm_func_end GetMainTeamName - - arm_func_start SetMainTeamName -SetMainTeamName: ; 0x02050B94 - ldr r1, _02050BB4 ; =TEAM_NAME - mov r3, #0 -_02050B9C: - ldrb r2, [r0], #1 - strb r2, [r1, r3] - add r3, r3, #1 -#ifdef JAPAN - cmp r3, #5 -#else - cmp r3, #0xa -#endif - blt _02050B9C - bx lr - .align 2, 0 -_02050BB4: .word TEAM_NAME - arm_func_end SetMainTeamName - - arm_func_start GetRankupPoints -GetRankupPoints: ; 0x02050BB8 - stmdb sp!, {r4, lr} - bl GetRank - mov r4, r0 - mov r0, #0x16 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - beq _02050BE4 - cmp r4, #0xc - bne _02050BF0 - mov r0, #0 - ldmia sp!, {r4, pc} -_02050BE4: - cmp r4, #8 - movhs r0, #0 - ldmhsia sp!, {r4, pc} -_02050BF0: - mov r0, r4 - bl GetRankUpEntry - ldr r1, _02050C0C ; =TEAM_NAME - ldr r2, [r0, #4] -#ifdef JAPAN - ldr r0, [r1, #8] -#else - ldr r0, [r1, #0xc] -#endif - sub r0, r2, r0 - ldmia sp!, {r4, pc} - .align 2, 0 -_02050C0C: .word TEAM_NAME - arm_func_end GetRankupPoints - - arm_func_start sub_02050C10 -sub_02050C10: ; 0x02050C10 -#ifdef JAPAN -#define SUB_02050C10_OFFSET #8 -#else -#define SUB_02050C10_OFFSET #0xc -#endif - stmdb sp!, {r3, lr} - ldr r1, _02050C6C ; =TEAM_NAME - ldr r2, [r1, SUB_02050C10_OFFSET] - add r2, r2, r0 - mov r0, #0x16 - str r2, [r1, SUB_02050C10_OFFSET] - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - beq _02050C4C - ldr r0, _02050C6C ; =TEAM_NAME - ldr r1, _02050C70 ; =0x05F5E0FF - ldr r2, [r0, SUB_02050C10_OFFSET] - cmp r2, r1 - strgt r1, [r0, SUB_02050C10_OFFSET] - ldmia sp!, {r3, pc} -_02050C4C: - mov r0, #7 - bl GetRankUpEntry - ldr r1, _02050C6C ; =TEAM_NAME - ldr r2, [r0, #4] - ldr r0, [r1, SUB_02050C10_OFFSET] - cmp r0, r2 - strgt r2, [r1, SUB_02050C10_OFFSET] - ldmia sp!, {r3, pc} - .align 2, 0 -_02050C6C: .word TEAM_NAME -_02050C70: .word 0x05F5E0FF - arm_func_end sub_02050C10 - - arm_func_start GetRank -GetRank: ; 0x02050C74 - stmdb sp!, {r3, r4, r5, lr} - mov r5, #0 - ldr r4, _02050CCC ; =TEAM_NAME - b _02050CA4 -_02050C84: - mov r0, r5 - bl GetRankUpEntry -#ifdef JAPAN - ldr r1, [r4, #8] -#else - ldr r1, [r4, #0xc] -#endif - ldr r0, [r0, #4] - cmp r1, r0 - blt _02050CAC - add r0, r5, #1 - and r5, r0, #0xff -_02050CA4: - cmp r5, #0xc - blo _02050C84 -_02050CAC: - mov r0, #0x16 - bl GetResolvedPerformanceProgressFlag - cmp r0, #0 - bne _02050CC4 - cmp r5, #8 - movhi r5, #8 -_02050CC4: - mov r0, r5 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02050CCC: .word TEAM_NAME - arm_func_end GetRank - - arm_func_start sub_02050CD0 -sub_02050CD0: ; 0x02050CD0 - stmdb sp!, {r3, lr} - bl GetRank - cmp r0, #8 - movhi r0, #8 - ldmia sp!, {r3, pc} - arm_func_end sub_02050CD0 - - arm_func_start GetRankStorageSize -GetRankStorageSize: ; 0x02050CE4 - stmdb sp!, {r3, lr} - bl GetRank - bl GetRankUpEntry - ldr r0, [r0, #8] - ldmia sp!, {r3, pc} - arm_func_end GetRankStorageSize - - arm_func_start sub_02050CF8 -sub_02050CF8: ; 0x02050CF8 - stmdb sp!, {r3, lr} - sub sp, sp, #0x10 - mov r3, r0 - mov r2, r1 - add r0, sp, #0 - mov r1, r3 - bl InitBitstreamForRead - ldr r1, _02050D70 ; =TEAM_NAME - add r0, sp, #0 -#ifdef JAPAN - mov r2, #0x28 -#else - mov r2, #0x50 -#endif - bl CopyBitsTo - ldr r1, _02050D74 ; =_022AB924 - add r0, sp, #0 - mov r2, #0x20 - bl CopyBitsTo - mov r0, #1 - bl GetResolvedPerformanceProgressFlag - ldr r1, _02050D78 ; =TEAM_NAME - tst r0, #0xff -#ifdef JAPAN - strb r0, [r1, #0xc] -#else - strb r0, [r1, #0x10] -#endif - ldrne r1, _02050D7C ; =ARM9_UNKNOWN_DATA__NA_209E6BC - add r0, sp, #0 - ldreq r1, _02050D80 ; =_0209E6BD - mov r2, #1 - bl CopyBitsTo - add r0, sp, #0 - bl BitstreamDebug - ldr r0, [sp, #8] - add sp, sp, #0x10 - ldmia sp!, {r3, pc} - .align 2, 0 -_02050D70: .word TEAM_NAME -_02050D74: .word _022AB924 -_02050D78: .word TEAM_NAME -_02050D7C: .word ARM9_UNKNOWN_DATA__NA_209E6BC -_02050D80: .word _0209E6BD - arm_func_end sub_02050CF8 - - arm_func_start sub_02050D84 -sub_02050D84: ; 0x02050D84 - stmdb sp!, {lr} - sub sp, sp, #0x14 - mov r3, r0 - mov r2, r1 - add r0, sp, #4 - mov r1, r3 - bl InitBitstreamForWrite - ldr r1, _02050DFC ; =TEAM_NAME - add r0, sp, #4 -#ifdef JAPAN - mov r2, #0x28 -#else - mov r2, #0x50 -#endif - bl CopyBitsFrom - ldr r1, _02050E00 ; =_022AB924 - add r0, sp, #4 - mov r2, #0x20 - bl CopyBitsFrom - add r0, sp, #4 - add r1, sp, #0 - mov r2, #1 - bl CopyBitsFrom - ldrb r0, [sp] - ldr r1, _02050E04 ; =TEAM_NAME - tst r0, #1 - movne r2, #1 - moveq r2, #0 - add r0, sp, #4 -#ifdef JAPAN - strb r2, [r1, #0xc] -#else - strb r2, [r1, #0x10] -#endif - bl BitstreamDebug - ldr r0, [sp, #0xc] - add sp, sp, #0x14 - ldmia sp!, {pc} - .align 2, 0 -_02050DFC: .word TEAM_NAME -_02050E00: .word _022AB924 -_02050E04: .word TEAM_NAME - arm_func_end sub_02050D84 - - arm_func_start ResetPlayTimer -ResetPlayTimer: ; 0x02050E08 - mov r1, #0 - strb r1, [r0, #4] - str r1, [r0] - bx lr - arm_func_end ResetPlayTimer - - arm_func_start PlayTimerTick -PlayTimerTick: ; 0x02050E18 - ldrb r1, [r0, #4] - add r2, r1, #1 - and r1, r2, #0xff - strb r2, [r0, #4] - cmp r1, #0x3c - bxlo lr - mov r1, #0 - strb r1, [r0, #4] - ldr r2, [r0] - ldr r1, _02050E50 ; =0x022550FF - cmp r2, r1 - addlo r1, r2, #1 - strlo r1, [r0] - bx lr - .align 2, 0 -_02050E50: .word 0x022550FF - arm_func_end PlayTimerTick - - arm_func_start GetPlayTimeSeconds -GetPlayTimeSeconds: ; 0x02050E54 - ldr r0, [r0] - bx lr - arm_func_end GetPlayTimeSeconds - - arm_func_start sub_02050E5C -sub_02050E5C: ; 0x02050E5C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r0, r4 - add r1, r5, #4 - mov r2, #6 - bl CopyBitsTo - mov r0, r4 - mov r1, r5 - mov r2, #0x20 - bl CopyBitsTo - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02050E5C - - arm_func_start sub_02050E8C -sub_02050E8C: ; 0x02050E8C - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r4, r1 - mov r0, r4 - add r1, r5, #4 - mov r2, #6 - bl CopyBitsFrom - mov r0, r4 - mov r1, r5 - mov r2, #0x20 - bl CopyBitsFrom - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02050E8C diff --git a/asm/main_02052060.s b/asm/main_02052060.s deleted file mode 100644 index c1d08090..00000000 --- a/asm/main_02052060.s +++ /dev/null @@ -1,556 +0,0 @@ - .include "asm/macros.inc" - .include "main_02052060.inc" - - .text - - arm_func_start sub_02052060 -sub_02052060: ; 0x02052060 - stmdb sp!, {r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x2c - ldr r4, _020522E4 ; =_020B09B0 - mov sl, r1 - ldr r7, [sp, #0x54] - ldr r4, [r4] - mov r1, #0x30 - mla r4, r7, r1, r4 - ldr fp, [sp, #0x50] - mov r1, #0x18 - mla r4, fp, r1, r4 - mov sb, r2 - add r1, sp, #0x28 - mov r2, #0xf - mov r8, r3 - ldr r5, [r4, #0x10] - bl sub_02051FF0 - mov r3, r0 - ldr r4, [sp, #0x28] - mov r0, #0 - str r0, [sp] - str r0, [sp, #4] - ldr r0, _020522E4 ; =_020B09B0 - ldr r2, [r4, #8] - ldr r0, [r0] - add r1, r5, sl - add r2, r4, r2 - add r0, r0, #0x60 - bl sub_02051804 - mov r0, #1 - str r0, [sp] - mov r1, #0 - ldr r0, _020522E4 ; =_020B09B0 - str r1, [sp, #4] - ldr r0, [r0] - mov r2, r4 - mov r3, r1 - add r0, r0, #0x60 - bl sub_02051804 - ldr r1, [sp, #0x28] - rsb r0, sb, #0x20 - mov r0, r0, lsl #0x10 - ldr r1, [r1, #0x10] - str r0, [sp, #0x18] - add r0, r4, r1 - str r0, [sp, #0xc] - mov r5, #0 - b _020521CC -_02052120: - mov r6, #0 - mov r0, r6 - str r0, [sp, #8] - ldr r0, [sp, #0xc] - mov r1, sb, lsl #0x10 - add r0, r0, sb, lsl #6 - str r0, [sp, #0x10] - mov r0, r1, asr #0x10 - str r0, [sp, #0x14] -_02052144: - ldr r0, [sp, #0x10] - mov r1, r6, lsl #1 - ldrh r1, [r1, r0] - ldr r2, _020522E8 ; =0x00000FFF - mov r0, r6, lsl #0x10 - and r2, r1, r2 - mov r2, r2, lsl #0x10 - mov r1, r1, lsl #4 - mov r2, r2, lsr #0x10 - add r1, r8, r1, lsr #16 - add r2, r2, sl, lsr #5 - mov r1, r1, lsl #0x1c - mov r2, r2, lsl #0x10 - mov r1, r1, lsr #0x10 - orr r1, r1, r2, lsr #16 - mov r1, r1, lsl #0x10 - mov r2, r1, lsr #0x10 - ldr r1, [sp, #0x14] - mov r0, r0, asr #0x10 - str r7, [sp] - mov r3, fp - bl sub_02051D8C - ldr r0, [sp, #8] - add r6, r6, #1 - add r0, r0, #1 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - str r0, [sp, #8] - cmp r0, #0x20 - blo _02052144 - add r0, r5, #1 - mov r0, r0, lsl #0x10 - mov r5, r0, lsr #0x10 - add sb, sb, #1 -_020521CC: - ldr r0, [sp, #0x18] - cmp r5, r0, lsr #16 - blo _02052120 - mov r0, fp - mov r1, r7 - bl sub_02051E60 - ldr r0, [sp, #0x28] - ldr r3, _020522EC ; =ARM9_UNKNOWN_PTR__NA_20A2C84 - ldr r0, [r0] - add r2, sp, #0x1c - add r5, r4, r0 - mov r4, #0 - mov r1, #4 -_02052200: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052200 - mov r0, #0x28 - mul r6, r7, r0 - b _020522B0 -_0205221C: - add r3, sp, #0x1c - add r2, sp, #0x20 - mov r1, #4 -_02052228: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052228 - ldrb r0, [r5] - add r3, sp, #0x20 - add r2, sp, #0x24 - strb r0, [sp, #0x20] - ldrb r0, [r5, #1] - mov r1, #4 - strb r0, [sp, #0x21] - ldrb r0, [r5, #2] - strb r0, [sp, #0x22] - ldrb r0, [r5, #3] - strb r0, [sp, #0x23] -_02052264: - ldrb r0, [r3], #1 - subs r1, r1, #1 - strb r0, [r2], #1 - bne _02052264 - add r0, r4, r8, lsl #4 - cmp r0, #0x100 - bge _020522C8 - ldr r1, _020522E4 ; =_020B09B0 - mov r0, r0, lsl #0x10 - ldr r1, [r1] - mov r0, r0, asr #0x10 - add r3, r1, #0x1cc - mov r1, r0, lsl #0x10 - add r2, sp, #0x24 - add r0, r3, r6 - mov r1, r1, lsr #0x10 - bl CopyColorToPaletteDataRgba - add r4, r4, #1 - add r5, r5, #4 -_020522B0: - ldr r0, [sp, #0x28] - ldr r1, [r0, #4] - mov r0, r1, asr #1 - add r0, r1, r0, lsr #30 - cmp r4, r0, asr #2 - blt _0205221C -_020522C8: - ldr r0, _020522E4 ; =_020B09B0 - ldr r0, [r0] - add r0, r0, #0x1cc - add r0, r0, r6 - bl MarkPaletteDataAsNeedingUpdate - add sp, sp, #0x2c - ldmia sp!, {r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_020522E4: .word _020B09B0 -_020522E8: .word 0x00000FFF -_020522EC: .word ARM9_UNKNOWN_PTR__NA_20A2C84 - arm_func_end sub_02052060 - - arm_func_start sub_020522F0 -sub_020522F0: ; 0x020522F0 - stmdb sp!, {r4, lr} - mov r4, r1 - bl sub_02051FF0 - str r0, [r4, #8] - ldr r1, [r4] - ldr r0, [r1, #8] - add r0, r1, r0 - str r0, [r4, #4] - ldr r0, [r4] - ldr r0, [r0, #0x10] - add r0, r1, r0 - str r0, [r4, #0xc] - ldr r0, [r4] - ldr r0, [r0] - add r0, r1, r0 - str r0, [r4, #0x10] - ldmia sp!, {r4, pc} - arm_func_end sub_020522F0 - - arm_func_start sub_02052334 -sub_02052334: ; 0x02052334 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, [r4] - cmp r0, #0 - ldmeqia sp!, {r4, pc} - bl MemFree - mov r0, #0 - str r0, [r4] - ldmia sp!, {r4, pc} - arm_func_end sub_02052334 - - arm_func_start LoadMonsterMd -LoadMonsterMd: ; 0x02052358 - stmdb sp!, {r3, lr} - ldr r0, _02052388 ; =_020B09C0 - ldr r1, _0205238C ; =_020A31B8 - mov r2, #0 - bl LoadFileFromRom - bl LoadM2nAndN2m - ldr r0, _02052390 ; =MONSTER_DATA_TABLE_PTR - ldr r1, [r0, #0xc] -#ifdef EUROPE - str r1, [r0, #8] -#else - str r1, [r0, #4] -#endif - add r1, r1, #8 - str r1, [r0] - ldmia sp!, {r3, pc} - .align 2, 0 -_02052388: .word _020B09C0 -_0205238C: .word _020A31B8 -_02052390: .word MONSTER_DATA_TABLE_PTR - arm_func_end LoadMonsterMd - - arm_func_start GetNameRaw -GetNameRaw: ; 0x02052394 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r1, r0 - mov r0, r4 - mov r2, #0x14 - bl strncpy - ldmia sp!, {r4, pc} - arm_func_end GetNameRaw - - arm_func_start GetName -GetName: ; 0x020523D0 - stmdb sp!, {r3, r4, r5, lr} - mov r5, r0 - mov r0, r1 - mov r1, #0x258 - mov r4, r2 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r3, r0 - mov r0, r5 - mov r2, r4 - ldr r1, _02052414 ; =_020A31D4 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02052414: .word _020A31D4 - arm_func_end GetName - - arm_func_start SprintfStatic__02052418 -SprintfStatic__02052418: ; 0x02052418 - stmdb sp!, {r0, r1, r2, r3} - stmdb sp!, {r3, lr} - add r2, sp, #0xc - bic r2, r2, #3 - ldr r1, [sp, #0xc] - add r2, r2, #4 - bl vsprintf - ldmia sp!, {r3, lr} - add sp, sp, #0x10 - bx lr - arm_func_end SprintfStatic__02052418 - - arm_func_start GetNameWithGender -GetNameWithGender: ; 0x02052440 -#ifdef JAPAN - stmdb sp!, {r4, r5, r6, lr} -#else - stmdb sp!, {r3, r4, r5, r6, lr} - sub sp, sp, #4 -#endif - mov r5, r1 - mov r6, r0 - mov r0, r5 - mov r1, #0x258 - mov r4, r2 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - ldr r2, _020524F4 ; =MONSTER_DATA_TABLE_PTR - mov r1, #0x44 - ldr r2, [r2] - mov r3, r0 - smlabb r0, r5, r1, r2 - ldrb r0, [r0, #0x12] - cmp r0, #3 - cmpne r5, #0x1d - cmpne r5, #0x20 - bne _020524B0 - ldr r1, _020524F8 ; =_020A31D4 - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 -#ifdef JAPAN - ldmia sp!, {r4, r5, r6, pc} -#else - b _020524EC -#endif -_020524B0: - cmp r0, #2 - bne _020524D4 - ldr r1, _020524FC ; =_020A31E4 -#ifdef JAPAN - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 - ldmia sp!, {r4, r5, r6, pc} -_020524D4: - ldr r1, _02052838_JP ; =_020A45C8_JP - mov r0, r6 - mov r2, r4 - bl SprintfStatic__02052418 - ldmia sp!, {r4, r5, r6, pc} -#else - mov r5, #0xbe - mov r0, r6 - mov r2, r4 - str r5, [sp] - bl SprintfStatic__02052418 - b _020524EC -_020524D4: - ldr r1, _020524FC ; =_020A31E4 - mov r5, #0xbd - mov r0, r6 - mov r2, r4 - str r5, [sp] - bl SprintfStatic__02052418 -_020524EC: - add sp, sp, #4 - ldmia sp!, {r3, r4, r5, r6, pc} -#endif - .align 2, 0 -_020524F4: .word MONSTER_DATA_TABLE_PTR -_020524F8: .word _020A31D4 -_020524FC: .word _020A31E4 -#ifdef JAPAN -_02052838_JP: .word _020A45C8_JP -#endif - arm_func_end GetNameWithGender - - arm_func_start GetSpeciesString -GetSpeciesString: ; 0x02052500 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - bl GetBaseForm - cmp r0, #0xc9 - bne _02052684 - cmp r4, #0xca - moveq r4, #1 - beq _02052660 - cmp r4, #0xcb - moveq r4, #2 - beq _02052660 - cmp r4, #0xcc - moveq r4, #3 - beq _02052660 - cmp r4, #0xcd - moveq r4, #4 - beq _02052660 - cmp r4, #0xce - moveq r4, #5 - beq _02052660 - cmp r4, #0xcf - moveq r4, #6 - beq _02052660 - cmp r4, #0xd0 - moveq r4, #7 - beq _02052660 - cmp r4, #0xd1 - moveq r4, #8 - beq _02052660 - cmp r4, #0xd2 - moveq r4, #9 - beq _02052660 - cmp r4, #0xd3 - moveq r4, #0xa - beq _02052660 - cmp r4, #0xd4 - moveq r4, #0xb - beq _02052660 - cmp r4, #0xd5 - moveq r4, #0xc - beq _02052660 - cmp r4, #0xd6 - moveq r4, #0xd - beq _02052660 - cmp r4, #0xd7 - moveq r4, #0xe - beq _02052660 - cmp r4, #0xd8 - moveq r4, #0xf - beq _02052660 - cmp r4, #0xd9 - moveq r4, #0x10 - beq _02052660 - cmp r4, #0xda - moveq r4, #0x11 - beq _02052660 - cmp r4, #0xdb - moveq r4, #0x12 - beq _02052660 - cmp r4, #0xdc - moveq r4, #0x13 - beq _02052660 - cmp r4, #0xdd - moveq r4, #0x14 - beq _02052660 - cmp r4, #0xde - moveq r4, #0x15 - beq _02052660 - cmp r4, #0xdf - moveq r4, #0x16 - beq _02052660 - cmp r4, #0xe0 - moveq r4, #0x17 - beq _02052660 - cmp r4, #0xe1 - moveq r4, #0x18 - beq _02052660 - cmp r4, #0xe2 - moveq r4, #0x19 - beq _02052660 - cmp r4, #0xe3 - moveq r4, #0x1a - beq _02052660 - cmp r4, #0xe4 - moveq r4, #0x1b - movne r4, #0 -_02052660: - ldr r0, _020526B8 ; =0x000022E8 - bl StringFromId - ldr r1, _020526BC ; =UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE - mov r2, r0 - ldr r3, [r1, r4, lsl #2] - ldr r1, _020526C0 ; =_020A31F4 - mov r0, r5 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} -_02052684: - mov r0, r4 - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - mov r2, r0 - ldr r1, _020526C4 ; =_020A31FC - mov r0, r5 - bl SprintfStatic__02052418 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -#if defined(EUROPE) -_020526B8: .word 0x000022EA -#elif defined(JAPAN) -_020526B8: .word 0x00001659 -#else -_020526B8: .word 0x000022E8 -#endif -_020526BC: .word UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE -_020526C0: .word _020A31F4 -_020526C4: .word _020A31FC - arm_func_end GetSpeciesString - - arm_func_start GetNameString -GetNameString: ; 0x020526C8 - stmdb sp!, {r3, lr} - mov r1, #0x258 - bl _s32_div_f -#if defined(EUROPE) - add r0, r1, #0x21 - add r0, r0, #0x2200 -#elif defined(JAPAN) - add r0, r1, #0x590 - add r0, r0, #0x1000 -#else - add r0, r1, #0x1f - add r0, r0, #0x2200 -#endif - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - bl StringFromId - ldmia sp!, {r3, pc} - arm_func_end GetNameString diff --git a/asm/main_020559D8.s b/asm/main_020559D8.s deleted file mode 100644 index b6e5250b..00000000 --- a/asm/main_020559D8.s +++ /dev/null @@ -1,102 +0,0 @@ - .include "asm/macros.inc" - .include "main_020559D8.inc" - - .text - - arm_func_start sub_020559D8 -sub_020559D8: ; 0x020559D8 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - ldr r1, _02055B18 ; =TEAM_MEMBER_TABLE_PTR - mov r4, #0 - ldr lr, [r1] - mov r8, r0 - mov r2, r4 - mov r3, #1 - mvn r1, #0 -_020559F8: - ldrb r0, [lr] - add lr, lr, #0x44 - tst r0, #1 - movne r0, r3 - moveq r0, r2 - tst r0, #0xff - mov r0, r4, lsl #1 - strneh r4, [r8, r0] - add r4, r4, #1 - streqh r1, [r8, r0] - cmp r4, #5 - blt _020559F8 - mov r2, #0 - mov r3, #1 - ldr r0, _02055B1C ; =0x0000022B - b _02055B0C -_02055A38: - ldrb r1, [lr] - tst r1, #1 - movne r1, r3 - moveq r1, r2 - tst r1, #0xff - bne _02055AFC - mvn ip, #0 - mov r0, r4, lsl #1 - mov r7, lr - mov r6, r4 - strh ip, [r8, r0] - add lr, lr, #0x44 - add r4, r4, #1 - add sb, ip, #0x22c - b _02055AD4 -_02055A74: - ldrb r0, [lr] - tst r0, #1 - movne r0, #1 - moveq r0, #0 - tst r0, #0xff - beq _02055AC4 - mov r5, r7 - mov fp, lr - add r7, r7, #0x44 - mov sl, #4 -_02055A9C: - ldmia fp!, {r0, r1, r2, r3} - stmia r5!, {r0, r1, r2, r3} - subs sl, sl, #1 - bne _02055A9C - ldr r0, [fp] - str r0, [r5] - mov r0, r4, lsl #1 - strh r6, [r8, r0] - add r6, r6, #1 - b _02055ACC -_02055AC4: - mov r0, r4, lsl #1 - strh ip, [r8, r0] -_02055ACC: - add r4, r4, #1 - add lr, lr, #0x44 -_02055AD4: - cmp r4, sb - blt _02055A74 - mov r1, #0 - ldr r0, _02055B1C ; =0x0000022B - b _02055AF0 -_02055AE8: - strb r1, [r7], #0x44 - add r6, r6, #1 -_02055AF0: - cmp r6, r0 - blt _02055AE8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02055AFC: - mov r1, r4, lsl #1 - strh r4, [r8, r1] - add r4, r4, #1 - add lr, lr, #0x44 -_02055B0C: - cmp r4, r0 - blt _02055A38 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02055B18: .word TEAM_MEMBER_TABLE_PTR -_02055B1C: .word 0x0000022B - arm_func_end sub_020559D8 diff --git a/asm/main_bss_022AB0AC.s b/asm/main_bss_022AB0AC.s index 91914a2e..e1878337 100644 --- a/asm/main_bss_022AB0AC.s +++ b/asm/main_bss_022AB0AC.s @@ -34,6 +34,8 @@ _022AB69C: .space 0x27C .global TEAM_NAME TEAM_NAME: + .global _022AB918 +_022AB918: #ifdef JAPAN .space 0x8 #else diff --git a/asm/overlay_29_022E34A8.s b/asm/overlay_29_022E2B68.s similarity index 95% rename from asm/overlay_29_022E34A8.s rename to asm/overlay_29_022E2B68.s index c1468a67..785eadd6 100644 --- a/asm/overlay_29_022E34A8.s +++ b/asm/overlay_29_022E2B68.s @@ -1,34 +1,8 @@ .include "asm/macros.inc" - .include "overlay_29_022E34A8.inc" + .include "overlay_29_022E2B68.inc" .text -#ifdef EUROPE - arm_func_start ov29_022E34A8_EU -ov29_022E34A8_EU: ; 0x022E34A8 - stmdb sp!, {r3, lr} - bl EntityIsValid__022E1A1C - cmp r0, #0 - beq _022E34DC - ldr r0, _022E34E8 ; =0x02354138 - ldr r0, [r0] - ldrb r0, [r0, #8] - cmp r0, #0 - bne _022E34DC - bl GetForcedLossReason - cmp r0, #1 - movne r0, #1 - bne _022E34E0 -_022E34DC: - mov r0, #0 -_022E34E0: - and r0, r0, #0xff - ldmia sp!, {r3, pc} - .align 2, 0 -_022E34E8: .word 0x02354138 - arm_func_end ov29_022E34A8_EU -#endif - arm_func_start ov29_022E2B68 ov29_022E2B68: ; 0x022E2B68 #ifdef JAPAN diff --git a/asm/overlay_29_02320788.s b/asm/overlay_29_02320788.s deleted file mode 100644 index 45de46e4..00000000 --- a/asm/overlay_29_02320788.s +++ /dev/null @@ -1,830 +0,0 @@ - .include "asm/macros.inc" - .include "overlay_29_02320788.inc" - - .text - - arm_func_start TryAftermathExplosion -TryAftermathExplosion: ; 0x02320788 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #0x10 - mov sl, r0 - ldr r0, [sp, #0x38] - mov sb, r1 - str r0, [sp, #0x38] - str r2, [sp, #4] - mov r8, r3 - ldr fp, [sp, #0x3c] - mov r5, #0 - mov r7, #0x15 - ldr r4, _02320A8C ; =DUNGEON_PTR - b _023207F4 -_023207BC: - ldr r0, [r4] - add r0, r0, r5, lsl #2 - add r0, r0, #0x12000 -#ifdef JAPAN - ldr r6, [r0, #0xad4] -#else - ldr r6, [r0, #0xb78] -#endif - mov r0, r6 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _023207F0 - mov r0, r6 - mov r1, r7 - bl AbilityIsActiveVeneer - cmp r0, #0 - bne _023207FC -_023207F0: - add r5, r5, #1 -_023207F4: - cmp r5, #0x14 - blt _023207BC -_023207FC: - cmp r5, #0x14 - beq _02320834 - mov r0, sl - mov r1, sb - bl ov29_022E55F0 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02320A90 ; =0x00000BFC - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02320A84 -_02320834: - mov r0, sb - bl GetApparentWeather - cmp r0, #4 - bne _02320858 - ldr r2, _02320A90 ; =0x00000BFC - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - b _02320A84 -_02320858: - mov r0, sl - mov r1, sb - mov r2, r8 - bl ov29_022E5560 - mov r0, #0 - mov r1, sb - mov r2, r0 - bl SubstitutePlaceholderStringTags - ldr r2, _02320A94 ; =0x00000BFB - mov r0, sl - mov r1, sb - bl LogMessageByIdWithPopupCheckUserTarget - ldr r0, _02320A98 ; =ov29_023529B8 - mov r6, #0 - ldr r4, [r0, r8, lsl #2] - mov r7, r6 - b _023209EC -_0232089C: - ldr r0, [sp, #4] - ldrsh r0, [r0] - add r0, r1, r0 - strh r0, [sp, #0xc] - ldr r0, [sp, #4] - ldrsh r2, [r4, #2] - ldrsh r1, [r0, #2] - ldrsh r0, [sp, #0xc] - add r1, r2, r1 - strh r1, [sp, #0xe] - cmp r0, #0 - ldrgesh r1, [sp, #0xe] - cmpge r1, #0 - blt _023209E8 - cmp r0, #0x38 - cmplt r1, #0x20 - bge _023209E8 - bl GetTileSafe - ldrsh r1, [sp, #0xc] - mov r5, r0 - cmp r1, #1 - ldrgesh r0, [sp, #0xe] - cmpge r0, #1 - blt _02320974 - cmp r1, #0x37 - cmplt r0, #0x1f - bge _02320974 - ldrh r0, [r5] - tst r0, #3 - bne _02320974 - ldrh r0, [r5] - tst r0, #0x10 - bne _02320974 - bic r0, r0, #3 - strh r0, [r5] - ldrh r0, [r5] - mvn r7, #0 - str r7, [sp, #8] - orr r0, r0, #1 - strh r0, [r5] -_0232093C: - ldr r6, [sp, #8] -_02320940: - ldrsh r0, [sp, #0xc] - ldrsh r1, [sp, #0xe] - add r0, r0, r6 - add r1, r1, r7 - bl ov29_02336694 - add r6, r6, #1 - cmp r6, #1 - ble _02320940 - add r7, r7, #1 - cmp r7, #1 - ble _0232093C - mov r6, #1 - mov r7, r6 -_02320974: - ldr r0, [r5, #0x10] - cmp r0, #0 - beq _023209A4 - cmp r0, sb - beq _023209A0 - ldr r0, [r0] - cmp r0, #3 - bne _023209A0 - add r0, sp, #0xc - mov r1, #0 - bl RemoveGroundItem -_023209A0: - mov r6, #1 -_023209A4: - ldr r1, [r5, #0xc] - cmp r1, #0 - cmpne r1, sb - beq _023209E8 - ldr r0, [r1] - cmp r0, #1 - bne _023209E8 - ldr r2, _02320A9C ; =EXPLOSION_FIXED_DAMAGES - mov r0, sl - ldr r5, [r2, r8, lsl #2] - ldr r2, [sp, #0x38] - mov r3, fp - str r5, [sp] - bl CalcAftermathExplosionDamage - bl IsFloorOver - cmp r0, #0 - bne _023209F8 -_023209E8: - add r4, r4, #4 -_023209EC: - ldrsh r1, [r4] - cmp r1, #0x63 - bne _0232089C -_023209F8: - bl IsFloorOver - cmp r0, #0 - bne _02320A84 - ldr r0, [sb] - cmp r0, #1 - bne _02320A3C - ldr r0, _02320AA0 ; =0x0000026F - cmp fp, r0 - beq _02320A3C - ldr r1, _02320A9C ; =EXPLOSION_FIXED_DAMAGES - ldr r2, [sp, #0x38] - ldr r4, [r1, r8, lsl #2] - mov r0, sl - mov r1, sb - mov r3, fp - str r4, [sp] - bl CalcAftermathExplosionDamage -_02320A3C: - cmp r6, #0 - beq _02320A84 - cmp r7, #0 - beq _02320A7C - mov r6, #0 - mov r4, r6 -_02320A54: - mov r5, r4 -_02320A58: - mov r0, r5 - mov r1, r6 - bl DetermineTileWalkableNeighbors - add r5, r5, #1 - cmp r5, #0x38 - blt _02320A58 - add r6, r6, #1 - cmp r6, #0x20 - blt _02320A54 -_02320A7C: - bl UpdateMinimap - bl UpdateTrapsVisibility -_02320A84: - add sp, sp, #0x10 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -_02320A8C: .word DUNGEON_PTR -#ifdef JAPAN -_02320A90: .word 0x0000093B -_02320A94: .word 0x0000093A -#else -_02320A90: .word 0x00000BFC -_02320A94: .word 0x00000BFB -#endif -_02320A98: .word ov29_023529B8 -_02320A9C: .word EXPLOSION_FIXED_DAMAGES -_02320AA0: .word 0x0000026F - arm_func_end TryAftermathExplosion - - arm_func_start CalcExplosionDamage -CalcExplosionDamage: ; 0x02320AA4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, lr} - sub sp, sp, #0x24 - mov r7, r1 - mov r8, r0 - mov r0, r7 - mov r6, r2 - mov r5, r3 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _02320BC0 - ldr r1, _02320BC8 ; =0x00000163 - add r0, sp, #0x1a - ldr r4, [r7, #0xb4] - bl InitMove - add r1, sp, #0x1a - mov r0, r7 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _02320BC0 - ldrb r0, [r4, #6] - mov r1, #2 - cmp r0, #0 - bne _02320B2C - ldrsh r2, [r4, #0x10] - mov r0, r7 - add r2, r2, r2, lsr #31 - mov r4, r2, asr #1 - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 - cmp r4, #1 - movlt r4, #1 - b _02320B44 -_02320B2C: - mov r0, r7 - ldr r4, [sp, #0x40] - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320B44: - mov ip, #7 - mov r0, r8 - mov r1, r7 - mov r2, #1 -#ifdef JAPAN - mov r3, #0xb00 -#else - mov r3, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r4, #1 - bne _02320B94 - mov r2, #1 - mov ip, #6 - mov r0, r8 - mov r1, r7 -#ifdef JAPAN - rsb r3, r2, #0xb00 -#else - rsb r3, r2, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320B94: - add r0, sp, #0x18 - stmia sp, {r0, r6} - mov r3, #0 - str r5, [sp, #8] - str r3, [sp, #0xc] - str r3, [sp, #0x10] - mov r0, r8 - mov r1, r7 - mov r2, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_02320BC0: - add sp, sp, #0x24 - ldmia sp!, {r3, r4, r5, r6, r7, r8, pc} - .align 2, 0 -_02320BC8: .word 0x00000163 - arm_func_end CalcExplosionDamage - - arm_func_start CalcAftermathExplosionDamage -CalcAftermathExplosionDamage: ; 0x02320BCC - stmdb sp!, {r4, r5, r6, r7, r8, sb, lr} - sub sp, sp, #0x24 - mov r8, r1 - mov sb, r0 - mov r0, r8 - mov r7, r2 - mov r6, r3 - bl EntityIsValid__02320764 - cmp r0, #0 - beq _02320CFC - ldr r1, _02320D04 ; =0x00000163 - add r0, sp, #0x1a - ldr r5, [r8, #0xb4] - bl InitMove - add r1, sp, #0x1a - mov r0, r8 - bl TwoTurnMoveForcedMiss - cmp r0, #0 - bne _02320CFC - ldrb r0, [r5, #6] - mov r1, #2 - cmp r0, #0 - bne _02320C54 - ldrsh r2, [r5, #0x10] - mov r0, r8 - add r2, r2, r2, lsr #31 - mov r4, r2, asr #1 - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 - cmp r4, #1 - movlt r4, #1 - b _02320C6C -_02320C54: - mov r0, r8 - ldr r4, [sp, #0x40] - bl MonsterIsType - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320C6C: - mov ip, #7 - mov r0, sb - mov r1, r8 - mov r2, #1 -#ifdef JAPAN - mov r3, #0xb00 -#else - mov r3, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - movne r4, #1 - bne _02320CBC - mov r2, #1 - mov ip, #6 - mov r0, sb - mov r1, r8 -#ifdef JAPAN - rsb r3, r2, #0xb00 -#else - rsb r3, r2, #0xdc0 -#endif - str ip, [sp] - bl ExclusiveItemEffectIsActiveWithLogging - cmp r0, #0 - addne r0, r4, r4, lsr #31 - movne r4, r0, asr #1 -_02320CBC: - ldrsh r0, [r5, #0x10] - mov r3, #0 - mov r1, r8 - cmp r4, r0 - subge r4, r0, #1 - add r0, sp, #0x18 - stmia sp, {r0, r7} - str r6, [sp, #8] - cmp r4, #0 - movlt r4, #0 - str r3, [sp, #0xc] - str r3, [sp, #0x10] - mov r0, sb - mov r2, r4 - str r3, [sp, #0x14] - bl CalcDamageFixedNoCategory -_02320CFC: - add sp, sp, #0x24 - ldmia sp!, {r4, r5, r6, r7, r8, sb, pc} - .align 2, 0 -_02320D04: .word 0x00000163 - arm_func_end CalcAftermathExplosionDamage - - arm_func_start TryWarp -TryWarp: ; 0x02320D08 - -#ifdef JAPAN -#define TRY_WARP_OFFSET -0xA4 -#else -#define TRY_WARP_OFFSET 0 -#endif - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - mov r4, #0 - mov sb, r0 - mov r8, r1 - mov r7, r2 - mov r0, r4 - mov r2, r4 - mov r6, r3 - ldr r5, [r8, #0xb4] - bl SubstitutePlaceholderStringTags - cmp sb, r8 - beq _02320D78 - cmp sb, #0 - moveq r0, r4 - beq _02320D58 - ldr r0, [sb] - cmp r0, #1 - moveq r0, #1 - movne r0, r4 - and r0, r0, #0xff -_02320D58: - cmp r0, #0 - beq _02320D78 - mov r0, sb - mov r1, #0x53 - bl AbilityIsActiveVeneer - cmp r0, #0 - movne r0, #0 - bne _02320D84 -_02320D78: - mov r0, r8 - mov r1, #0xe - bl AbilityIsActiveVeneer -_02320D84: - cmp r0, #0 - beq _02320DA0 - ldr r2, _023210E8 ; =0x00000E74 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320DA0: - ldr r0, _023210EC ; =DUNGEON_PTR - ldr r0, [r0] - add r0, r0, #0x4000 - ldrb r0, [r0, #0xda + TRY_WARP_OFFSET] - bl AreTileJumpsAllowed - cmp r0, #0 - bne _02320DD0 - ldr r2, _023210F0 ; =0x00000E72 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320DD0: - cmp r7, #1 - bne _02320E20 - ldr r0, _023210EC ; =DUNGEON_PTR - ldrsh r1, [r8, #4] - ldr r0, [r0] - add r0, r0, #0xcc00 - ldrsh r2, [r0, #0xe4 + TRY_WARP_OFFSET] - cmp r2, r1 - ldreqsh r1, [r0, #0xe6 + TRY_WARP_OFFSET] - ldreqsh r0, [r8, #6] - cmpeq r1, r0 - bne _02320E20 - ldr r2, _023210F4 ; =0x00000E73 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, sb - mov r1, r8 - bl TryInflictPetrifiedStatus - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} -_02320E20: - ldr r2, _023210F8 ; =0x00000E71 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget - mov r0, r8 - mov r1, r8 - bl TryEndPetrifiedOrSleepStatus - mov r0, sb - mov r1, r8 - bl ov29_022E5650 - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _02320EA4 - ldrb sl, [r5, #0x4c] - ldr fp, _023210FC ; =DUNGEON_FRAMES_PASSED -_02320E60: - ldr r0, [r8, #0x1c] - add r0, r0, #0x800 - str r0, [r8, #0x1c] - cmp r0, #0xa000 - bge _02320EA4 - ldr r0, [fp] - tst r0, #3 - bne _02320E98 - add r0, sl, #1 - and sl, r0, #7 - mov r0, r8 - mov r1, sl - strb sl, [r5, #0x4c] - bl ChangeMonsterAnimationToIdle -_02320E98: - mov r0, #0x22 - bl AdvanceFrame - b _02320E60 -_02320EA4: - cmp r7, #5 - addls pc, pc, r7, lsl #2 - b _02320EC8 -_02320EB0: ; jump table - b _02320EC8 ; case 0 - b _02320EF4 ; case 1 - b _02320F30 ; case 2 - b _02320F60 ; case 3 - b _02320F74 ; case 4 - b _02320FB0 ; case 5 -_02320EC8: - add r0, sp, #0 - mov r1, #1 - bl GetRandomTile - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320EF4: - ldr r1, _023210EC ; =DUNGEON_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #0 -#ifdef JAPAN - add r1, r1, #0xc40 - add r1, r1, #0xc000 -#else - add r1, r1, #0xe4 - add r1, r1, #0xcc00 -#endif - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320F30: - add r0, sp, #0 - mov r1, r6 - mov r2, #0 - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320F60: - ldrh r0, [r6] - strh r0, [sp] - ldrh r0, [r6, #2] - strh r0, [sp, #2] - b _02321008 -_02320F74: - ldr r1, _023210EC ; =DUNGEON_PTR - add r0, sp, #0 - ldr r1, [r1] - mov r2, #1 -#ifdef JAPAN - add r1, r1, #0xc40 - add r1, r1, #0xc000 -#else - add r1, r1, #0xe4 - add r1, r1, #0xcc00 -#endif - bl FindUnoccupiedTileWithin3 - cmp r0, #0 - bne _02321008 - ldrh r0, [r8, #4] - mov r4, #1 - strh r0, [sp] - ldrh r0, [r8, #6] - strh r0, [sp, #2] - b _02321008 -_02320FB0: - ldrb r0, [r5, #6] - cmp r0, #0 - ldreqb r0, [r5, #7] - cmpeq r0, #0 - bne _02320FE4 - bl GetLeader - mov r1, r0 - add r0, sp, #0 - add r1, r1, #4 - mov r2, #0 - bl FindClosestUnoccupiedTileWithin2 - cmp r0, #0 - bne _02321008 -_02320FE4: - add r0, sp, #0 - mov r1, #1 - bl GetRandomTile - cmp r0, #0 - ldreqh r0, [r8, #4] - moveq r4, #1 - streqh r0, [sp] - ldreqh r0, [r8, #6] - streqh r0, [sp, #2] -_02321008: - ldrsh r1, [sp] - ldrsh r2, [sp, #2] - mov r0, r8 - mov r3, #1 - bl MoveMonsterToPos - mov r0, r8 - mov r1, #0 - bl UpdateEntityPixelPos - mov r0, r8 - bl sub_01FFB62C - mov r0, #1 - bl UpdateCamera - mov r0, r8 - bl ShouldDisplayEntityWrapper - cmp r0, #0 - beq _023210A0 - ldrb sl, [r5, #0x4c] - mov r0, #0xa000 - ldr r6, _023210FC ; =DUNGEON_FRAMES_PASSED - str r0, [r8, #0x1c] - mov fp, #0x22 -_0232105C: - ldr r0, [r8, #0x1c] - sub r0, r0, #0x400 - str r0, [r8, #0x1c] - cmp r0, #0 - ble _023210A0 - ldr r0, [r6] - tst r0, #3 - bne _02321094 - add r0, sl, #1 - and sl, r0, #7 - mov r0, r8 - mov r1, sl - strb sl, [r5, #0x4c] - bl ChangeMonsterAnimationToIdle -_02321094: - mov r0, fp - bl AdvanceFrame - b _0232105C -_023210A0: - mov r1, #0 - mov r0, #0x22 - str r1, [r8, #0x1c] - bl AdvanceFrame - cmp r4, #0 - beq _023210C8 - ldr r2, _02321100 ; =0x00000E75 - mov r0, sb - mov r1, r8 - bl LogMessageByIdWithPopupCheckUserTarget -_023210C8: - cmp r7, #1 - bne _023210DC - mov r0, sb - mov r1, r8 - bl TryInflictPetrifiedStatus -_023210DC: - mov r0, r8 - bl ov29_02321238 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - .align 2, 0 -#ifdef JAPAN -#define TRY_WARP_DATA_OFFSET -0x2BE -#else -#define TRY_WARP_DATA_OFFSET 0 -#endif -_023210E8: .word 0x00000E74 + TRY_WARP_DATA_OFFSET -_023210EC: .word DUNGEON_PTR -_023210F0: .word 0x00000E72 + TRY_WARP_DATA_OFFSET -_023210F4: .word 0x00000E73 + TRY_WARP_DATA_OFFSET -_023210F8: .word 0x00000E71 + TRY_WARP_DATA_OFFSET -_023210FC: .word DUNGEON_FRAMES_PASSED -_02321100: .word 0x00000E75 + TRY_WARP_DATA_OFFSET - arm_func_end TryWarp - - arm_func_start EnsureCanStandCurrentTile -EnsureCanStandCurrentTile: ; 0x02321104 - stmdb sp!, {r4, lr} - mov r4, r0 - add r1, r4, #4 - bl CannotStandOnTile - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r4, pc} - arm_func_end EnsureCanStandCurrentTile - - arm_func_start ov29_02321134 -ov29_02321134: ; 0x02321134 - stmdb sp!, {r4, lr} - mov r4, r0 - add r1, r4, #4 - bl CannotStandOnTileNoMonsterCheck - cmp r0, #0 - ldmeqia sp!, {r4, pc} - mov r0, r4 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r4, pc} - arm_func_end ov29_02321134 - - arm_func_start ov29_02321164 -ov29_02321164: ; 0x02321164 - stmdb sp!, {r3, r4, r5, lr} - mov r4, r1 - mov r5, r0 - mov r0, r4 - add r1, r4, #4 - bl CannotStandOnTile - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r0, r5 - mov r1, r4 - mov r2, #5 - mov r3, #0 - bl TryWarp - ldmia sp!, {r3, r4, r5, pc} - arm_func_end ov29_02321164 - - arm_func_start ov29_0232119C -ov29_0232119C: ; 0x0232119C - stmdb sp!, {r3, r4, r5, lr} - movs r4, r0 - mov r5, r2 - moveq r0, #0 - beq _023211C4 - ldr r0, [r4] - cmp r0, #0 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff -_023211C4: - cmp r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r1, #0 - beq _023211E0 - mov r0, r4 - mov r1, #8 - bl ChangeMonsterAnimationToIdle -_023211E0: - ldr r0, [r4, #0xb4] - ldrb r0, [r0, #7] - cmp r0, #0 - beq _02321210 - cmp r5, #0 - beq _02321200 - mov r0, r4 - bl ov29_022F42F8 -_02321200: - add r0, r4, #4 - bl DiscoverMinimap - mov r0, #0 - bl HandleShopTransaction -_02321210: - mov r0, r4 - bl ActivateTerrainEffects - ldr r1, _02321234 ; =DUNGEON_PTR - mov r0, r4 - ldr r1, [r1] - add r1, r1, #0x4000 -#ifdef JAPAN - ldrb r1, [r1, #0x20] -#else - ldrb r1, [r1, #0xc4] -#endif - bl ov29_02305814 - ldmia sp!, {r3, r4, r5, pc} - .align 2, 0 -_02321234: .word DUNGEON_PTR - arm_func_end ov29_0232119C diff --git a/include/dungeon_util_2.h b/include/dungeon_util_2.h index d5615404..33ca13f0 100644 --- a/include/dungeon_util_2.h +++ b/include/dungeon_util_2.h @@ -9,5 +9,8 @@ void PopulateActiveMonsterPtrs(void); s32 GetTeamMemberIndex(struct entity *entity); void GetMonsterOrTrapName(char *buf, struct entity *entity, u32 param_3); void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3); +#ifdef EUROPE +bool8 ov29_022E34A8_EU(struct entity *entity); +#endif #endif //PMDSKY_DUNGEON_UTIL_2_H diff --git a/include/item.h b/include/item.h index 0c4ced18..44879e24 100644 --- a/include/item.h +++ b/include/item.h @@ -1653,6 +1653,17 @@ struct bulk_item /* 0x2 */ u16 quantity; }; +struct unk_0209C850 { + s32 field_0x0; + u8 field_0x4; + u8 field_0x5; + s16 field_0x6; + u8 field_0x8; + u8 field_0x9; + u8 field_0xa; + u8 field_0xb; +}; + struct bag_items { // Indexes: // 0x0 - Main, default diff --git a/include/item_util_4.h b/include/item_util_4.h index a3d855c8..c254e442 100644 --- a/include/item_util_4.h +++ b/include/item_util_4.h @@ -21,5 +21,19 @@ s32 GetDisplayedSellPrice(struct item* item); s32 GetActualBuyPrice(struct item* item); s32 GetActualSellPrice(struct item* item); +s32 sub_0200D1F0(s16 a); +u8 sub_0200D1FC(s16 item_id); +u8 sub_0200D208(s16 item_id); +void sub_0200D214(u8* buf, s16 item_id, struct unk_0209C850* a); +s32 FindItemInInventory(s16 item_id); +bool8 MaybeGetFormattedItemName(u8* buf, struct item* item, struct unk_0209C850* a, + bool8 colored, bool8 forceBrackets); +void SprintfStatic__0200D634(u8* buf, const char* fmt, ...); +bool8 MaybeGetUncoloredFormattedItemName(u8* buf, struct item* item, + struct unk_0209C850* a); +bool8 MaybeGetColoredFormattedItemName(u8* buf, struct item* item, + struct unk_0209C850* a); +void sub_0200D688(u8* buf, u8* name, struct item* item, struct unk_0209C850* a); + #endif //PMDSKY_ITEM_UTIL_4_H diff --git a/include/main_0200D81C.h b/include/main_0200D81C.h index f3e5ff55..fef15188 100644 --- a/include/main_0200D81C.h +++ b/include/main_0200D81C.h @@ -8,4 +8,6 @@ bool8 AreItemsEquivalent(struct item* item1, struct item* item2, s32 bitmask); void sub_0200D894(struct item* item); s32 GetMoneyQuantity(struct item* item); +s32 sub_0200D76C(s32 value, u8* buf, bool8 pad); + #endif //PMDSKY_MAIN_0200D81C_H diff --git a/include/main_020504A4.h b/include/main_020504A4.h index d71a8230..bbb93859 100644 --- a/include/main_020504A4.h +++ b/include/main_020504A4.h @@ -2,6 +2,30 @@ #define PMDSKY_MAIN_020504A4_H #include "adventure_log.h" +#include "util.h" +#include "save.h" u32 GetSentryDutyGamePoints(s32 index); +s32 SetSentryDutyGamePoints(u32 points); +void CopyLogTo(struct bitstream *stream); +void CopyLogFrom(struct bitstream *stream); +void GetAbilityString(char *buf, s32 ability_id); +u16 GetAbilityDescStringId(s32 ability_id); +u16 GetTypeStringId(s32 type_id); +u8 GetConversion2ConvertToType(s32 type_id); +void InitBitstreamForWrite(struct bitstream *stream, void *buf, s32 len); +void InitBitstreamForRead(struct bitstream *stream, void *buf, s32 len); +void BitstreamDebug(struct bitstream *stream); +void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits); +void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits); +void StoreDefaultTeamData(void); +void GetMainTeamNameWithCheck(u8 *buf); +void GetMainTeamName(u8 *buf); +void SetMainTeamName(const u8 *name); +s32 GetRankupPoints(void); +void sub_02050C10(s32 points); +u8 GetRank(void); +u8 sub_02050CD0(void); +s32 GetRankStorageSize(void); + #endif diff --git a/include/main_02050CF8.h b/include/main_02050CF8.h new file mode 100644 index 00000000..a85a9d73 --- /dev/null +++ b/include/main_02050CF8.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_MAIN_02050CF8_H +#define PMDSKY_MAIN_02050CF8_H + +#include "util.h" + +s32 sub_02050CF8(void *buf, s32 len); + +#endif //PMDSKY_MAIN_02050CF8_H diff --git a/include/main_02050D84.h b/include/main_02050D84.h new file mode 100644 index 00000000..45d89a95 --- /dev/null +++ b/include/main_02050D84.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_MAIN_02050D84_H +#define PMDSKY_MAIN_02050D84_H + +#include "util.h" + +s32 sub_02050D84(void *buf, s32 len); + +#endif //PMDSKY_MAIN_02050D84_H diff --git a/include/main_020517D4.h b/include/main_020517D4.h index 8a2c33d2..caa97757 100644 --- a/include/main_020517D4.h +++ b/include/main_020517D4.h @@ -5,7 +5,8 @@ u32 GetBagCapacity(s32 scenario_balance); u32 GetBagCapacitySpecialEpisode(s32 se_type); struct unk_020517F4 { - u8 field_0x0[8]; + u8 field_0x0[4]; + s32 field_0x4; s32 field_0x8; s16 field_0xc; u8 field_0xe[2]; diff --git a/include/main_02051FF0.h b/include/main_02051FF0.h index a3cab832..a93af8c1 100644 --- a/include/main_02051FF0.h +++ b/include/main_02051FF0.h @@ -1,6 +1,7 @@ #ifndef PMDSKY_MAIN_02051FF0_H #define PMDSKY_MAIN_02051FF0_H -s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2); +s32 sub_02051FF0(const char *path, void **outPtr, s32 param2); +void sub_02052060(const char *path, u32 a1, s32 a2, s32 a3, s32 a4, s32 a5); #endif //PMDSKY_MAIN_02051FF0_H diff --git a/include/main_020526EC.h b/include/main_020526EC.h index 84b57784..138754e6 100644 --- a/include/main_020526EC.h +++ b/include/main_020526EC.h @@ -1,6 +1,35 @@ #ifndef PMDSKY_MAIN_020526EC_H #define PMDSKY_MAIN_020526EC_H +#include "enums.h" +#include + +struct unk_02052060 { + u32 field_0x0; + s32 field_0x4; + u32 field_0x8; + u32 field_0xc; + u32 field_0x10; +}; + +struct unk_020522F0 { + struct unk_02052060 *field_0x0; + u8 *field_0x4; + s32 field_0x8; + u8 *field_0xc; + u8 *field_0x10; +}; + + +void sub_020522F0(const char *path, struct unk_020522F0 *state, s32 param2); +void sub_02052334(struct unk_020522F0 *state); +void LoadMonsterMd(void); +void GetNameRaw(u8 *dest, s32 monster_id); +void GetName(char *dest, enum monster_id monster_id, char color_id); +void SprintfStatic__02052418(char *dest, const char *format, ...); +void GetNameWithGender(char *dest, s16 monster_id, char color_id); +void GetSpeciesString(char *dest, s16 monster_id); +const u8* GetNameString(enum monster_id monster_id); u16 GetSpriteIndex__020526EC(s16 monster_id); u16 GetSpriteIndex__02052708(s16 monster_id); u16 GetSpriteIndex__02052724(s16 monster_id); diff --git a/include/main_02055770.h b/include/main_02055770.h index 7548d87b..c10d6831 100644 --- a/include/main_02055770.h +++ b/include/main_02055770.h @@ -45,5 +45,6 @@ struct ground_monster* GetMainCharacter3(void); s16 sub_02055894(struct ground_monster *member); s16 GetFirstMatchingMemberIdx(s16 monster_id); s16 GetFirstEmptyMemberIdx(s16 monster_id); +void sub_020559D8(s16 *idxs); #endif diff --git a/include/monster_data.h b/include/monster_data.h index b4a7ce15..5b1ebf72 100644 --- a/include/monster_data.h +++ b/include/monster_data.h @@ -2,8 +2,7 @@ #define PMDSKY_MONSTER_DATA_TABLE_PTR_H #include "enums.h" - -extern struct monster_data_table *MONSTER_DATA_TABLE_PTR; +#include struct monster_evolution_parameters { s16 pre_evolution_idx; // 0x8: The pre-evolution of the monster. @@ -65,4 +64,18 @@ struct monster_file_contents { struct monster_data_table table; // 0x8: The main contents of the data table. }; +struct unk_020B09B4 { + struct monster_data_table *field_0x0; +#ifdef EUROPE + void *field_0x4; + struct monster_file_contents *field_0x8; +#else + struct monster_file_contents *field_0x4; + void *field_0x8; +#endif + struct iovec field_0xc; +}; + +extern struct unk_020B09B4 MONSTER_DATA_TABLE_PTR; + #endif //PMDSKY_MONSTER_DATA_TABLE_PTR_H diff --git a/include/number_util.h b/include/number_util.h index 50c21c21..f6b9606f 100644 --- a/include/number_util.h +++ b/include/number_util.h @@ -4,6 +4,16 @@ #include "util.h" #include "save.h" +struct unk_022AB694 { + u32 field_0x0; + u8 field_0x4; +}; + +void ResetPlayTimer(struct unk_022AB694 *timer); +void PlayTimerTick(struct unk_022AB694 *timer); +s32 GetPlayTimeSeconds(struct unk_022AB694 *timer); +void sub_02050E5C(struct unk_022AB694 *timer, struct bitstream *stream); +void sub_02050E8C(struct unk_022AB694 *timer, struct bitstream *stream); struct fixed_point sub_02050EBC(struct fixed_point a, struct fixed_point b); struct fixed_point SubFixedPoint(struct fixed_point a, struct fixed_point b); struct fixed_point sub_02050F78(struct fixed_point a, struct fixed_point b); diff --git a/include/overlay_29_0230BBAC.h b/include/overlay_29_0230BBAC.h index 7d70f9ee..2d4ebce0 100644 --- a/include/overlay_29_0230BBAC.h +++ b/include/overlay_29_0230BBAC.h @@ -14,7 +14,7 @@ void ov29_0230D088(struct entity *attacker, struct entity *defender, enum type_i void ApplyDamageAndEffectsWrapper(struct entity *entity, s32 damage, s32 a3, s16 damage_source); void CalcRecoilDamageFixed(struct entity *entity, s32 fixed_damage, s32 a3, bool8 *out_flag, s32 a5, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); -void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10); void CalcDamageFixedWrapper(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, u8 category, s16 damage_source, s32 a9, s32 a10, s32 a11); void UpdateShopkeeperModeAfterAttack(struct entity *attacker, struct entity *defender); void UpdateShopkeeperModeAfterTrap(struct entity *entity, bool8 is_enemy); diff --git a/include/overlay_29_02320764.h b/include/overlay_29_02320764.h index d00913f5..4af69a0c 100644 --- a/include/overlay_29_02320764.h +++ b/include/overlay_29_02320764.h @@ -5,5 +5,18 @@ // Checks if an entity pointer points to a valid entity (not entity type 0, which represents no entity). bool8 EntityIsValid__02320764(struct entity *entity); +void TryAftermathExplosion(struct entity *attacker, struct entity *defender, + struct position *pos, s32 idx, enum type_id attack_type, + s16 damage_source); +void CalcExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage); +void CalcAftermathExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage); +void TryWarp(struct entity *user, struct entity *target, s32 warp_type, + struct position *pos); +void EnsureCanStandCurrentTile(struct entity *entity); +void ov29_02321134(struct entity *entity); +void ov29_02321164(struct entity *a, struct entity *b); +void ov29_0232119C(struct entity *entity, s32 a, s32 b); #endif //PMDSKY_OVERLAY_29_02320764_H diff --git a/include/save.h b/include/save.h index 4ff59a4b..8f23fa4e 100644 --- a/include/save.h +++ b/include/save.h @@ -2,7 +2,7 @@ #define PMDSKY_SAVE_H struct bitstream { - char* ptr; // Current byte + u8* ptr; u32 end; // End of the region the bitstream can read from / write to. Doesn't seem to do anything with this information? u32 bit_idx; // Bit position in current byte u32 bit_count; // Total bits this stream has used diff --git a/main.lsf b/main.lsf index 85ccfca9..385cf283 100644 --- a/main.lsf +++ b/main.lsf @@ -65,7 +65,6 @@ Static main Object src/main_0200CA54.o Object src/item_util.o Object src/item_util_4.o - Object asm/main_0200D1F0.o Object src/main_0200D81C.o Object asm/main_0200D8E4.o Object src/item_util_1.o @@ -263,7 +262,8 @@ Static main Object src/main_020503CC.o Object asm/main_02050420.o Object src/main_020504A4.o - Object asm/main_020504BC.o + Object src/main_02050CF8.o + Object src/main_02050D84.o Object src/number_util.o Object src/dungeon_recruitment_2.o Object src/main_020514CC.o @@ -279,7 +279,6 @@ Static main Object src/main_020517D4.o Object asm/main_02051804.o Object src/main_02051FF0.o - Object asm/main_02052060.o Object src/main_020526EC.o Object src/get_category_string.o Object src/main_020527A8.o @@ -294,7 +293,6 @@ Static main Object src/main_02055410.o Object src/main_0205567C.o Object src/main_02055770.o - Object asm/main_020559D8.o Object src/main_02056294.o Object asm/main_020563BC.o Object src/main_020564B0.o @@ -795,7 +793,7 @@ Overlay OVY_29 Object src/overlay_29_022E272C.o Object src/dungeon_visibility.o Object src/dungeon_util_2.o - Object asm/overlay_29_022E34A8.o + Object asm/overlay_29_022E2B68.o Object src/dg_camera.o Object src/dg_effect.o Object asm/overlay_29_022E37DC.o @@ -1024,7 +1022,6 @@ Overlay OVY_29 Object src/overlay_29_0232017C.o Object asm/overlay_29_023201A0.o Object src/overlay_29_02320764.o - Object asm/overlay_29_02320788.o Object src/overlay_29_02321238.o Object src/overlay_29_02321274.o Object asm/overlay_29_02321288.o diff --git a/src/dungeon_recruitment.c b/src/dungeon_recruitment.c index fe7070f6..bc0ff6b1 100644 --- a/src/dungeon_recruitment.c +++ b/src/dungeon_recruitment.c @@ -28,6 +28,7 @@ #include "position_util.h" #include "overlay_29_0234B104.h" #include "main_02056294.h" +#include "overlay_29_02320764.h" struct unk_0230E064 { s16 field_0x0; @@ -59,7 +60,6 @@ void ov29_0234D630(void); void ov29_0234D838(void); const u8 *GetNameString(enum monster_id monster_id); void StrncpyName(char *dest, const char *src, u32 n); -void EnsureCanStandCurrentTile(struct entity *entity); void ov29_02305F60(struct entity *user, struct entity *target); void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); s32 ov29_0234D7C0(s32 message_id, struct preprocessor_args *args, s32 param_3, diff --git a/src/dungeon_util_2.c b/src/dungeon_util_2.c index 06609577..1fcf3c73 100644 --- a/src/dungeon_util_2.c +++ b/src/dungeon_util_2.c @@ -1,4 +1,5 @@ #include "dungeon_util_2.h" +#include "overlay_29_022ED01C.h" #include "dungeon_pokemon_attributes_1.h" #include "dungeon_range.h" #include "dungeon.h" @@ -108,3 +109,11 @@ void SubstitutePlaceholderStringTags(s32 pos, struct entity* entity, u32 param_3 break; } } + +#ifdef EUROPE +bool8 ov29_022E34A8_EU(struct entity *entity) +{ + return EntityIsValid__022E1A1C(entity) && !DUNGEON_PTR->end_floor_no_death_check_flag && + GetForcedLossReason() != FORCED_LOSS_PARTNER_FAINTED; +} +#endif diff --git a/src/item_util_4.c b/src/item_util_4.c index 9ecb5e24..c737b807 100644 --- a/src/item_util_4.c +++ b/src/item_util_4.c @@ -3,13 +3,14 @@ #include "item.h" #include "item_util.h" #include "item_util_1.h" +#include "main_0200D81C.h" +#include extern s16 RandRangeSafe(s32, s32); extern s16 _020A18BC[10]; extern void ItemZInit(); extern u16 GetItemBuyPrice(s16); extern u16 GetItemSellPrice(s16); -extern s32 GetMoneyQuantity(struct item*); extern bool8 IsShoppableItem(s16); extern bool8 IsThrownItem(s16); @@ -250,3 +251,236 @@ s32 GetActualSellPrice(struct item* item) } return GetItemSellPrice(item->id); } + +extern u8* strcpy(u8*, u8*); +extern u8* strncpy(u8* dest, u8* src, u32 n); +extern s32 vsprintf(u8* str, const u8* format, va_list ap); +extern struct bag_items* BAG_ITEMS_PTR_MIRROR; +extern s32 sub_0200EB64(s16 a); +extern void MoneyQuantityToString__02023B30(u8* buf, s32 quantity); +extern const char _02097F34; +extern const char _02097F50; +extern const char _02097F58; +extern const char _02097F68; +extern const char _02097F6C; +extern const char _02097F7C; +extern const char _02097F90; +extern const char _02097F9C; +extern const char _02097FAC; +extern const char _02097FB8; +extern const char _02097FC4; +extern const char _02097FE4; + +s32 sub_0200D1F0(s16 a) +{ + return sub_0200EB64(a); +} + +u8 sub_0200D1FC(s16 item_id) +{ + return GetItemPaletteId(item_id); +} + +u8 sub_0200D208(s16 item_id) +{ + return GetItemActionName(item_id); +} + +void sub_0200D214(u8 *buf, s16 item_id, struct unk_0209C850 *a) +{ + struct item item; + u8 name[0x50]; + + strncpy(name, GetItemName(item_id), 0x50); + InitItem(&item, item_id, 0, 0); + item.quantity = 1; + sub_0200D688(buf, name, &item, a); +} + +s32 FindItemInInventory(s16 item_id) +{ + s32 i; + s32 j; + struct bag_items *bag; + + bag = BAG_ITEMS_PTR_MIRROR; + for (i = 0; i < INVENTORY_SIZE; i++) { + if (ItemExists(bag->bag_items->bag_items[i].flags)) { + if (item_id == bag->bag_items->bag_items[i].id) { + return i; + } + } + } + for (j = 0; j < 1000; j++) { + if (item_id == bag->field_0x38A[j]) { + return j + 0x8000; + } + } + return -1; +} + +bool8 MaybeGetFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a, bool8 colored, + bool8 forceBrackets) +{ + u8 name[0x50]; + u8 money[0x50]; + u8 *raw_name; + bool8 sticky; + bool8 brackets; + bool8 ret; + enum item_category category; + + brackets = FALSE; + category = GetItemCategory(item->id); + ret = FALSE; + sticky = FALSE; + if (a != NULL && a->field_0x8 != 0) { + brackets = TRUE; + } + raw_name = GetItemName(item->id); + if (category == CATEGORY_THROWN_LINE) { + if (brackets) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F34, raw_name, item->quantity); + } else { + SprintfStatic__0200D634(name, &_02097F50, raw_name, item->quantity); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + SprintfStatic__0200D634(name, &_02097F68, raw_name); + } + } + } else if (category == CATEGORY_THROWN_ARC) { + if (brackets) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F34, raw_name, item->quantity); + } else { + SprintfStatic__0200D634(name, &_02097F50, raw_name, item->quantity); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + SprintfStatic__0200D634(name, &_02097F68, raw_name); + } + } + } else if ((u8) (category + 0xF4) <= 2) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F6C, raw_name); + } else { + strcpy(name, raw_name); + } + } else if (item->id == ITEM_POKE) { + MoneyQuantityToString__02023B30(money, GetMoneyQuantity(item)); + if (colored) { + SprintfStatic__0200D634(name, &_02097F7C, money); + } else { + SprintfStatic__0200D634(name, &_02097F90, money); + } + if (colored) { + SprintfStatic__0200D634(name, &_02097F7C, money); + } else { + SprintfStatic__0200D634(name, &_02097F90, money); + } + } else if (category == CATEGORY_EXCLUSIVE_ITEMS) { + if (colored) { + SprintfStatic__0200D634(name, &_02097F9C, raw_name); + } else { + strcpy(name, raw_name); + } + } else { + if (colored) { + SprintfStatic__0200D634(name, &_02097F58, raw_name); + } else { + strncpy(name, raw_name, 0x50); + } + } + if (ItemSticky(item->flags)) { + SprintfStatic__0200D634(buf, &_02097FAC, name); + strncpy(name, buf, 0x50); + sticky = TRUE; + } else if (forceBrackets) { + SprintfStatic__0200D634(buf, &_02097FB8, name); + strncpy(name, buf, 0x50); + } + if (a == NULL) { + strncpy(buf, name, 0x50); + } else { + if (a->field_0x4 != 0 && (item->flags & ITEM_FLAG_SET)) { + if (sticky) { + name[4] = '5'; + } else { + name[4] = '2'; + } + } + if (a->field_0x0 == 1 || a->field_0x0 == 3) { + if (item->flags & ITEM_FLAG_IN_SHOP) { + sub_0200D688(buf, name, item, a); + ret = TRUE; + } else { + strncpy(buf, name, 0x50); + } + } else { + sub_0200D688(buf, name, item, a); + } + } + return ret; +} + +void SprintfStatic__0200D634(u8 *buf, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + vsprintf(buf, fmt, args); +} + +bool8 MaybeGetUncoloredFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a) +{ + return MaybeGetFormattedItemName(buf, item, a, FALSE, FALSE); +} + +bool8 MaybeGetColoredFormattedItemName(u8 *buf, struct item *item, + struct unk_0209C850 *a) +{ + return MaybeGetFormattedItemName(buf, item, a, TRUE, FALSE); +} + +void sub_0200D688(u8 *buf, u8 *name, struct item *item, + struct unk_0209C850 *a) +{ + s32 price; + u8 numbuf[40]; + + if (a == NULL) { + strncpy(buf, name, 0x50); + return; + } + switch (a->field_0x0) { + case 1: + case 2: + price = GetDisplayedBuyPrice(item); + break; + case 3: + case 4: + price = GetDisplayedSellPrice(item); + break; + default: + price = 0; + break; + } + if (price == 0) { + strncpy(buf, name, 0x50); + return; + } + if (a->field_0x6 != 0) { + sub_0200D76C(price, numbuf, TRUE); + SprintfStatic__0200D634(buf, &_02097FC4, name, a->field_0x6, numbuf); + } else { + sub_0200D76C(price, numbuf, FALSE); + SprintfStatic__0200D634(buf, &_02097FE4, name, numbuf); + } +} diff --git a/src/main_0200D81C.c b/src/main_0200D81C.c index 3b8be333..34b466a8 100644 --- a/src/main_0200D81C.c +++ b/src/main_0200D81C.c @@ -1,8 +1,87 @@ #include "main_0200D81C.h" +extern u8* BAG_ITEMS_PTR_MIRROR[]; +extern s32 _02094D0C[]; + extern s32 MultiplyByFixedPoint(s32, s32); extern s32 MONEY_QUANTITY_TABLE[]; +s32 sub_0200D76C(s32 value, u8 *buf, bool8 pad) +{ +#ifdef JAPAN + s32 i; + s32 count; + int digit; + s32 seen; + const u8 *tail; + + seen = 0; + count = 0; + for (i = 0; i < 5; i++) { + digit = 0; + while (value >= _02094D0C[i]) { + value -= _02094D0C[i]; + digit++; + } + if (digit > 9) { + digit = 9; + } + if (digit != 0) { + seen = 1; + count++; + buf[0] = BAG_ITEMS_PTR_MIRROR[1][digit * 2]; + buf[1] = BAG_ITEMS_PTR_MIRROR[1][digit * 2 + 1]; + buf += 2; + } else if (seen) { + count++; + buf[0] = BAG_ITEMS_PTR_MIRROR[1][digit * 2]; + buf[1] = BAG_ITEMS_PTR_MIRROR[1][digit * 2 + 1]; + buf += 2; + } else if (pad) { + *buf++ = 0x7F; + } + } + tail = ((const u8 **)BAG_ITEMS_PTR_MIRROR)[1]; + buf[0] = tail[value * 2]; + buf[1] = tail[value * 2 + 1]; + buf[2] = 0; + return count + 1; +#else + s32 count; + s32 i; + s32 seen; + int digit; + u8 *digits; + + digits = BAG_ITEMS_PTR_MIRROR[1]; + seen = 0; + count = 0; + for (i = 0; i < 5; i++) { + digit = 0; + while (value >= _02094D0C[i]) { + value -= _02094D0C[i]; + digit++; + } + if (digit > 9) { + digit = 9; + } + if (digit != 0) { + seen = 1; + count++; + *buf++ = digits[digit]; + } else if (seen) { + count++; + *buf++ = digits[digit]; + } else if (pad) { + *buf++ = 0x7F; + } + } + buf[0] = digits[value]; + buf[1] = 0; + return count + 1; +#endif +} + void ItemZInit(struct item* item) { item->id = 0; diff --git a/src/main_0203D538.c b/src/main_0203D538.c index c54c75d9..e9e10725 100644 --- a/src/main_0203D538.c +++ b/src/main_0203D538.c @@ -68,7 +68,6 @@ struct unk_020AFE74 { extern struct unk_020AFE74 *MISSION_REWARD_STRUCT_MAIN_PTR; -extern void MaybeGetColoredFormattedItemName(void*, struct item*, void*); extern void GetNameWithGender(char *dst, s16 monster_id, char color_id); extern void GetNameRaw(unsigned char *, s32); extern void InitPreprocessorArgs(struct preprocessor_args* args); @@ -105,7 +104,7 @@ extern void ov11_02310BDC(void); extern const u8 _0209C844[2]; extern const u16 _0209C846[4]; -extern s32 _0209C850; +extern struct unk_0209C850 _0209C850; extern WindowTemplate _0209C85C; extern struct unk_0202A5CC _0209C86C[]; extern s32 _0209C884; diff --git a/src/main_020504A4.c b/src/main_020504A4.c index c0f52d85..35112c1d 100644 --- a/src/main_020504A4.c +++ b/src/main_020504A4.c @@ -1,7 +1,367 @@ #include "main_020504A4.h" #include "adventure_log.h" +#include "main_0200330C.h" +#include "main_0202593C.h" +#include "main_020251AC.h" +#include "main_020517D4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 CONVERSION2_TYPE_TABLE[]; + +extern void StrncpyName(char *dest, const char *src, u32 n); +extern void ComputeSpecialCounters(void); +extern void Copy16BitsTo(struct bitstream *stream, void *buf_write); +extern void Copy16BitsFrom(struct bitstream *stream, void *buf_read); u32 GetSentryDutyGamePoints(s32 index) { return ADVENTURE_LOG_PTR->sentry_duty_game_points[index]; } + +s32 SetSentryDutyGamePoints(u32 points) +{ + s16 i; + s16 j; + + for (i = 0; i < 5; i++) + { + if (points > ADVENTURE_LOG_PTR->sentry_duty_game_points[i]) + { + break; + } + } + if (i >= 5) + { + return -1; + } + for (j = 4; j > i; j--) + { + ADVENTURE_LOG_PTR->sentry_duty_game_points[j] = ADVENTURE_LOG_PTR->sentry_duty_game_points[j - 1]; + } + ADVENTURE_LOG_PTR->sentry_duty_game_points[i] = points; + return i; +} + +void CopyLogTo(struct bitstream *stream) +{ + ComputeSpecialCounters(); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_dungeons_cleared, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_friend_rescues, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_evolutions, 0x14); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->completion_flags, 0x80); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->pokemon_joined_counter, 0xe); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->pokemon_battled_counter, 0xe); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->moves_learned_counter, 9); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_victories_on_one_floor, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_faints, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_eggs_hatched, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_big_treasure_wins, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_recycled, 0x14); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->nb_gifts_sent, 0x14); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->pokemon_joined_flags, 0x4a0); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->pokemon_battled_flags, 0x4a0); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->moves_learned_flags, 0x220); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->items_acquired_flags, 0x580); + CopyBitsTo(stream, &ADVENTURE_LOG_PTR->special_challenge_flags, 0x20); + CopyBitsTo(stream, ADVENTURE_LOG_PTR->sentry_duty_game_points, 0xa0); + Copy16BitsTo(stream, &ADVENTURE_LOG_PTR->current_floor); +} + +void CopyLogFrom(struct bitstream *stream) +{ + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_dungeons_cleared, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_friend_rescues, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_evolutions, 0x14); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->completion_flags, 0x80); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->pokemon_joined_counter, 0xe); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->pokemon_battled_counter, 0xe); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->moves_learned_counter, 9); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_victories_on_one_floor, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_faints, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_eggs_hatched, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_big_treasure_wins, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_recycled, 0x14); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->nb_gifts_sent, 0x14); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->pokemon_joined_flags, 0x4a0); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->pokemon_battled_flags, 0x4a0); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->moves_learned_flags, 0x220); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->items_acquired_flags, 0x580); + CopyBitsFrom(stream, &ADVENTURE_LOG_PTR->special_challenge_flags, 0x20); + CopyBitsFrom(stream, ADVENTURE_LOG_PTR->sentry_duty_game_points, 0xa0); + Copy16BitsFrom(stream, &ADVENTURE_LOG_PTR->current_floor); +} + +void GetAbilityString(char *buf, s32 ability_id) +{ +#if defined(EUROPE) + CopyNStringFromId(buf, (u16)(ability_id + 0x35e0), 0x50); +#elif defined(JAPAN) + CopyNStringFromId(buf, (u16)(ability_id + 0x4881), 0x50); +#else + CopyNStringFromId(buf, (u16)(ability_id + 0x35de), 0x50); +#endif +} + +u16 GetAbilityDescStringId(s32 ability_id) +{ +#if defined(EUROPE) + return ability_id + 0x365c; +#elif defined(JAPAN) + return ability_id + 0x48fd; +#else + return ability_id + 0x365a; +#endif +} + +u16 GetTypeStringId(s32 type_id) +{ +#if defined(EUROPE) + return type_id + 0x35cd; +#elif defined(JAPAN) + return type_id + 0x486e; +#else + return type_id + 0x35cb; +#endif +} + +u8 GetConversion2ConvertToType(s32 type_id) +{ + return CONVERSION2_TYPE_TABLE[type_id]; +} + +void InitBitstreamForWrite(struct bitstream *stream, void *buf, s32 len) +{ + stream->ptr = buf; + stream->bit_idx = 0; + stream->bit_count = 0; + stream->end = (u32)buf + len; +} + +void InitBitstreamForRead(struct bitstream *stream, void *buf, s32 len) +{ + stream->ptr = buf; + stream->bit_idx = 0; + stream->bit_count = 0; + stream->end = (u32)buf + len; + MemZero(buf, len); +} + +void BitstreamDebug(struct bitstream *stream) +{ +} + +void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits) +{ + u8 *src = buf_write; + s32 bit = 0; + + while (nbits != 0) + { + nbits--; + if (*src & (1 << bit)) + { + *stream->ptr |= 1 << stream->bit_idx; + } + bit++; + if (bit == 8) + { + bit = 0; + src++; + } + stream->bit_idx++; + if (stream->bit_idx == 8) + { + stream->ptr++; + stream->bit_idx = 0; + } + stream->bit_count++; + } +} + +void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits) +{ + u8 *dest = buf_read; + s32 bit = 0; + + while (nbits != 0) + { + if (bit == 0) + { + *dest = 0; + } + nbits--; + if (*stream->ptr & (1 << stream->bit_idx)) + { + *dest |= 1 << bit; + } + bit++; + if (bit == 8) + { + bit = 0; + dest++; + } + stream->bit_idx++; + if (stream->bit_idx == 8) + { + stream->ptr++; + stream->bit_idx = 0; + } + stream->bit_count++; + } +} + +void StoreDefaultTeamData(void) +{ + u8 buf[0x14]; + +#ifdef JAPAN + GetStringFromFileVeneer(buf, 0x4c5); + StrncpyName((char *)_022AB918, (const char *)buf, 5); +#else + GetStringFromFileVeneer(buf, 0x234); + StrncpyName((char *)_022AB918, (const char *)buf, 0xa); +#endif + TEAM_NAME.field_0xc = 0; + TEAM_NAME.field_0x10 = 0; +} + +void GetMainTeamNameWithCheck(u8 *buf) +{ + u8 name[0x40]; + + if (GetResolvedPerformanceProgressFlag(1) && TEAM_NAME.field_0x0[0] != 0) + { +#ifdef JAPAN + StrncpySimpleNoPad(buf, _022AB918, 5); +#else + StrncpySimpleNoPad(buf, _022AB918, 0xa); +#endif + } + else + { +#ifdef JAPAN + GetStringFromFileVeneer(name, 0x4c8); + StrncpyName((char *)buf, (const char *)name, 5); +#else + GetStringFromFileVeneer(name, 0x237); + StrncpyName((char *)buf, (const char *)name, 0xa); +#endif + } +} + +void GetMainTeamName(u8 *buf) +{ +#ifdef JAPAN + StrncpySimpleNoPadSafe(buf, TEAM_NAME.field_0x0, 5); +#else + StrncpySimpleNoPadSafe(buf, TEAM_NAME.field_0x0, 0xa); +#endif +} + +void SetMainTeamName(const u8 *name) +{ + s32 i; + +#ifdef JAPAN + for (i = 0; i < 5; i++) +#else + for (i = 0; i < 0xa; i++) +#endif + { + TEAM_NAME.field_0x0[i] = *name++; + } +} + +s32 GetRankupPoints(void) +{ + u8 rank = GetRank(); + + if (GetResolvedPerformanceProgressFlag(0x16)) + { + if (rank == 0xc) + { + return 0; + } + } + else if (rank >= 8) + { + return 0; + } + return GetRankUpEntry(rank)->field_0x4 - TEAM_NAME.field_0xc; +} + +void sub_02050C10(s32 points) +{ + TEAM_NAME.field_0xc += points; + if (GetResolvedPerformanceProgressFlag(0x16)) + { + if (TEAM_NAME.field_0xc > 99999999) + { + TEAM_NAME.field_0xc = 99999999; + } + } + else + { + s32 max = GetRankUpEntry(7)->field_0x4; + + if (TEAM_NAME.field_0xc > max) + { + TEAM_NAME.field_0xc = max; + } + } +} + +u8 GetRank(void) +{ + u8 rank = 0; + + while (rank < 0xc) + { + if (TEAM_NAME.field_0xc < GetRankUpEntry(rank)->field_0x4) + { + break; + } + rank++; + } + if (!GetResolvedPerformanceProgressFlag(0x16)) + { + if (rank > 8) + { + rank = 8; + } + } + return rank; +} + +u8 sub_02050CD0(void) +{ + u8 rank = GetRank(); + + if (rank > 8) + { + rank = 8; + } + return rank; +} + +s32 GetRankStorageSize(void) +{ + return GetRankUpEntry(GetRank())->field_0x8; +} diff --git a/src/main_02050CF8.c b/src/main_02050CF8.c new file mode 100644 index 00000000..caff01d6 --- /dev/null +++ b/src/main_02050CF8.c @@ -0,0 +1,40 @@ +#include "main_02050CF8.h" +#include "main_020504A4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 ARM9_UNKNOWN_DATA__NA_209E6BC; +extern u8 _0209E6BD; + +s32 sub_02050CF8(void *buf, s32 len) +{ + struct bitstream stream; + + InitBitstreamForRead(&stream, buf, len); +#ifdef JAPAN + CopyBitsTo(&stream, _022AB918, 0x28); +#else + CopyBitsTo(&stream, _022AB918, 0x50); +#endif + CopyBitsTo(&stream, &_022AB924, 0x20); + TEAM_NAME.field_0x10 = GetResolvedPerformanceProgressFlag(1); + CopyBitsTo(&stream, TEAM_NAME.field_0x10 ? &ARM9_UNKNOWN_DATA__NA_209E6BC : &_0209E6BD, 1); + BitstreamDebug(&stream); + return stream.bit_idx; +} diff --git a/src/main_02050D84.c b/src/main_02050D84.c new file mode 100644 index 00000000..8d4b157b --- /dev/null +++ b/src/main_02050D84.c @@ -0,0 +1,41 @@ +#include "main_02050D84.h" +#include "main_020504A4.h" +#include "progression.h" + +struct unk_022AB918 { +#ifdef JAPAN + u8 field_0x0[8]; +#else + u8 field_0x0[0xc]; +#endif + s32 field_0xc; + u8 field_0x10; +}; + +extern struct unk_022AB918 TEAM_NAME; +#ifdef JAPAN +extern u8 _022AB918[8]; +#else +extern u8 _022AB918[0xc]; +#endif +extern s32 _022AB924; +extern u8 ARM9_UNKNOWN_DATA__NA_209E6BC; +extern u8 _0209E6BD; + +s32 sub_02050D84(void *buf, s32 len) +{ + u8 value; + struct bitstream stream; + + InitBitstreamForWrite(&stream, buf, len); +#ifdef JAPAN + CopyBitsFrom(&stream, _022AB918, 0x28); +#else + CopyBitsFrom(&stream, _022AB918, 0x50); +#endif + CopyBitsFrom(&stream, &_022AB924, 0x20); + CopyBitsFrom(&stream, &value, 1); + TEAM_NAME.field_0x10 = (value & 1) != FALSE; + BitstreamDebug(&stream); + return stream.bit_idx; +} diff --git a/src/main_02051FF0.c b/src/main_02051FF0.c index 68db72e8..e143e1be 100644 --- a/src/main_02051FF0.c +++ b/src/main_02051FF0.c @@ -1,16 +1,65 @@ #include "main_02051FF0.h" +#include "main_020526EC.h" #include "main_02008BD4.h" #include "main_02001188.h" +#include "main_0202593C.h" +#include "monster_data.h" +#include "ground_bg.h" +#include -extern void LoadFileFromRom(struct iovec *handle, u32 fileId, s32 param2); +extern void LoadFileFromRom(struct iovec *iov, const char *filepath, u32 flags); extern s32 GetAtSize(void *data); extern void DecompressAtNormalVeneer(void *dest, u32 size, void *src); +extern void LoadM2nAndN2m(void); +extern s16 GetBaseForm(s16 id); +extern u8 *strncpy(u8 *dst, const u8 *src, u32 n); +extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); -s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2) +extern const char _020A31B8[]; +extern const char _020A31D4[]; +extern const char _020A31E4[]; +extern const char _020A31F4[]; +extern const char _020A31FC[]; +#ifdef JAPAN +extern const char _020A45C8_JP[]; +#endif +extern const char *const UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[28]; +extern const RGB_Array ARM9_UNKNOWN_PTR__NA_20A2C84; + +struct unk_020B09B0_sub { + u8 field_0x0[0x10]; + u32 field_0x10; + u8 field_0x14[4]; +}; + +struct unk_020B09B0_job { + s32 field_0x0; + void *field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; +}; + +struct unk_020B09B0 { + struct unk_020B09B0_sub field_0x0[2][2]; + struct unk_020B09B0_job field_0x60[16]; + s16 field_0x1a0; + u8 field_0x1a2[0x1cc - 0x1a2]; + struct UnkStruct_2324CBC_Sub98 field_0x1cc[2]; +}; + +extern struct unk_020B09B0 *_020B09B0; + +extern void sub_02051804(struct unk_020B09B0_job *jobs, u32 a, const void *b, + s32 c, s32 d, u32 e); +extern void sub_02051D8C(s16 a, s32 b, u16 c, s32 d, s32 e); +extern void sub_02051E60(s32 a, s32 b); + +s32 sub_02051FF0(const char *path, void **outPtr, s32 param2) { struct iovec handle; - LoadFileFromRom(&handle, fileId, param2); + LoadFileFromRom(&handle, path, param2); s32 size = GetAtSize(handle.iov_base); @@ -28,3 +77,67 @@ s32 sub_02051FF0(u32 fileId, void **outPtr, s32 param2) return size; } + +void sub_02052060(const char *path, u32 a1, s32 a2, s32 a3, s32 a4, s32 a5) +{ + struct unk_02052060 *hdr; + RGB_Array rgb; + RGB_Array tmp; + RGB_Array color; + s32 sy; + u32 row; + u8 *map; + u16 n; + u16 limit; + u8 *data; + s32 size; + u16 i; + s32 k; + s32 x; + s32 y; + u32 dst; + const u8 *src; + + dst = _020B09B0->field_0x0[a5][a4].field_0x10; + size = sub_02051FF0(path, (void **)&hdr, 0xF); + data = (u8 *)hdr; + sub_02051804(_020B09B0->field_0x60, dst + a1, data + hdr->field_0x8, size, 0, 0); + sub_02051804(_020B09B0->field_0x60, 0, data, 0, 1, 0); + + map = data + hdr->field_0x10; + limit = 0x20 - a2; + y = a2; + for (i = 0; i < limit; i++, y++) { + row = (u32)(map + y * 64); + sy = (s16)y; + x = 0; + for (n = 0; n < 0x20; n++) { + u32 v = *(u16 *)((x << 1) + row); + v = (u16)((u16)(v & 0xFFF) + (a1 >> 5)) | + (u16)((a3 + ((v << 4) >> 16)) << 12); + sub_02051D8C(x, sy, v, + a4, a5); + x++; + } + } + sub_02051E60(a4, a5); + + src = data + hdr->field_0x0; + k = 0; + color = ARM9_UNKNOWN_PTR__NA_20A2C84; + for (; k < hdr->field_0x4 / 4; k++, src += 4) { + s32 id; + + tmp = color; + tmp.c[0] = src[0]; + tmp.c[1] = src[1]; + tmp.c[2] = src[2]; + tmp.c[3] = src[3]; + rgb = tmp; + id = k + a3 * 16; + if (id >= 0x100) + break; + CopyColorToPaletteDataRgba(&_020B09B0->field_0x1cc[a5], (u16)(s16)id, &rgb); + } + MarkPaletteDataAsNeedingUpdate(&_020B09B0->field_0x1cc[a5]); +} diff --git a/src/main_020526EC.c b/src/main_020526EC.c index d6a4f347..178210bd 100644 --- a/src/main_020526EC.c +++ b/src/main_020526EC.c @@ -1,22 +1,296 @@ #include "main_020526EC.h" +#include "main_02051FF0.h" +#include "main_02008BD4.h" +#include "main_02001188.h" +#include "main_0202593C.h" #include "monster_data.h" +#include "ground_bg.h" +#include + +extern void LoadFileFromRom(struct iovec *iov, const char *filepath, u32 flags); +extern s32 GetAtSize(void *data); +extern void DecompressAtNormalVeneer(void *dest, u32 size, void *src); +extern void LoadM2nAndN2m(void); +extern s16 GetBaseForm(s16 id); +extern u8 *strncpy(u8 *dst, const u8 *src, u32 n); +extern s32 vsprintf(u8 *str, const u8 *format, va_list ap); + +extern const char _020A31B8[]; +extern const char _020A31D4[]; +extern const char _020A31E4[]; +extern const char _020A31F4[]; +extern const char _020A31FC[]; +#ifdef JAPAN +extern const char _020A45C8_JP[]; +#endif +extern const char *const UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[28]; +extern const RGB_Array ARM9_UNKNOWN_PTR__NA_20A2C84; + +struct unk_020B09B0_sub { + u8 field_0x0[0x10]; + u32 field_0x10; + u8 field_0x14[4]; +}; + +struct unk_020B09B0_job { + s32 field_0x0; + void *field_0x4; + s32 field_0x8; + s32 field_0xc; + s32 field_0x10; +}; + +struct unk_020B09B0 { + struct unk_020B09B0_sub field_0x0[2][2]; + struct unk_020B09B0_job field_0x60[16]; + s16 field_0x1a0; + u8 field_0x1a2[0x1cc - 0x1a2]; + struct UnkStruct_2324CBC_Sub98 field_0x1cc[2]; +}; + +extern struct unk_020B09B0 *_020B09B0; + +extern void sub_02051804(struct unk_020B09B0_job *jobs, u32 a, const void *b, + s32 c, s32 d, u32 e); +extern void sub_02051D8C(s16 a, s16 b, u16 c, s32 d, s32 e); +extern void sub_02051E60(s32 a, s32 b); + +void sub_020522F0(const char *path, struct unk_020522F0 *state, s32 param2) +{ + u8 *data; + + state->field_0x8 = sub_02051FF0(path, (void **)&state->field_0x0, param2); + data = (u8 *)state->field_0x0; + state->field_0x4 = data + state->field_0x0->field_0x8; + state->field_0xc = data + state->field_0x0->field_0x10; + state->field_0x10 = data + state->field_0x0->field_0x0; +} + +void sub_02052334(struct unk_020522F0 *state) +{ + if (state->field_0x0 != NULL) { + MemFree(state->field_0x0); + state->field_0x0 = NULL; + } +} + +void LoadMonsterMd(void) +{ + LoadFileFromRom(&MONSTER_DATA_TABLE_PTR.field_0xc, _020A31B8, 0); + LoadM2nAndN2m(); +#ifdef EUROPE + MONSTER_DATA_TABLE_PTR.field_0x8 = MONSTER_DATA_TABLE_PTR.field_0xc.iov_base; + MONSTER_DATA_TABLE_PTR.field_0x0 = &MONSTER_DATA_TABLE_PTR.field_0x8->table; +#else + MONSTER_DATA_TABLE_PTR.field_0x4 = MONSTER_DATA_TABLE_PTR.field_0xc.iov_base; + MONSTER_DATA_TABLE_PTR.field_0x0 = &MONSTER_DATA_TABLE_PTR.field_0x4->table; +#endif +} + +void GetNameRaw(u8 *dest, s32 monster_id) +{ +#ifdef EUROPE + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x2221)), 20); +#elif JAPAN + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x1590)), 20); +#else + strncpy(dest, StringFromId((u16)(monster_id % 600 + 0x221F)), 20); +#endif +} + +void GetName(char *dest, enum monster_id monster_id, char color_id) +{ +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x2221))); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x1590))); +#else + SprintfStatic__02052418(dest, _020A31D4, color_id, + StringFromId((u16)(monster_id % 600 + 0x221F))); +#endif +} + +void SprintfStatic__02052418(char *dest, const char *format, ...) +{ + va_list args; + va_start(args, format); + vsprintf(dest, format, args); +} + +void GetNameWithGender(char *dest, s16 monster_id, char color_id) +{ +#ifdef EUROPE + u8 *name = StringFromId((u16)(monster_id % 600 + 0x2221)); +#elif JAPAN + u8 *name = StringFromId((u16)(monster_id % 600 + 0x1590)); +#else + u8 *name = StringFromId((u16)(monster_id % 600 + 0x221F)); +#endif + + if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 3 || + monster_id == MONSTER_NIDORAN_F || monster_id == MONSTER_NIDORAN_M) { + SprintfStatic__02052418(dest, _020A31D4, color_id, name); + } +#ifdef JAPAN + else if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 2) { + SprintfStatic__02052418(dest, _020A31E4, color_id, name); + } + else { + SprintfStatic__02052418(dest, _020A45C8_JP, color_id, name); + } +#else + else if (MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender == 2) { + SprintfStatic__02052418(dest, _020A31E4, color_id, name, 0xBE); + } + else { + SprintfStatic__02052418(dest, _020A31E4, color_id, name, 0xBD); + } +#endif +} + +void GetSpeciesString(char *dest, s16 monster_id) +{ + s32 idx; + + if (GetBaseForm(monster_id) == MONSTER_UNOWN_A) { + if (monster_id == MONSTER_UNOWN_B) { + idx = 1; + } + else if (monster_id == MONSTER_UNOWN_C) { + idx = 2; + } + else if (monster_id == MONSTER_UNOWN_D) { + idx = 3; + } + else if (monster_id == MONSTER_UNOWN_E) { + idx = 4; + } + else if (monster_id == MONSTER_UNOWN_F) { + idx = 5; + } + else if (monster_id == MONSTER_UNOWN_G) { + idx = 6; + } + else if (monster_id == MONSTER_UNOWN_H) { + idx = 7; + } + else if (monster_id == MONSTER_UNOWN_I) { + idx = 8; + } + else if (monster_id == MONSTER_UNOWN_J) { + idx = 9; + } + else if (monster_id == MONSTER_UNOWN_K) { + idx = 10; + } + else if (monster_id == MONSTER_UNOWN_L) { + idx = 11; + } + else if (monster_id == MONSTER_UNOWN_M) { + idx = 12; + } + else if (monster_id == MONSTER_UNOWN_N) { + idx = 13; + } + else if (monster_id == MONSTER_UNOWN_O) { + idx = 14; + } + else if (monster_id == MONSTER_UNOWN_P) { + idx = 15; + } + else if (monster_id == MONSTER_UNOWN_Q) { + idx = 16; + } + else if (monster_id == MONSTER_UNOWN_R) { + idx = 17; + } + else if (monster_id == MONSTER_UNOWN_S) { + idx = 18; + } + else if (monster_id == MONSTER_UNOWN_T) { + idx = 19; + } + else if (monster_id == MONSTER_UNOWN_U) { + idx = 20; + } + else if (monster_id == MONSTER_UNOWN_V) { + idx = 21; + } + else if (monster_id == MONSTER_UNOWN_W) { + idx = 22; + } + else if (monster_id == MONSTER_UNOWN_X) { + idx = 23; + } + else if (monster_id == MONSTER_UNOWN_Y) { + idx = 24; + } + else if (monster_id == MONSTER_UNOWN_Z) { + idx = 25; + } + else if (monster_id == MONSTER_UNOWN_EXCLAMATION) { + idx = 26; + } + else if (monster_id == MONSTER_UNOWN_QUESTION) { + idx = 27; + } + else { + idx = 0; + } +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x22EA), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x1659), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#else + SprintfStatic__02052418(dest, _020A31F4, StringFromId(0x22E8), + UNOWN_SPECIES_ADDITIONAL_CHAR_PTR_TABLE[idx]); +#endif + } + else { +#ifdef EUROPE + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x2221))); +#elif JAPAN + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x1590))); +#else + SprintfStatic__02052418(dest, _020A31FC, + StringFromId((u16)(monster_id % 600 + 0x221F))); +#endif + } +} + +const u8* GetNameString(enum monster_id monster_id) +{ +#ifdef EUROPE + return StringFromId((u16)(monster_id % 600 + 0x2221)); +#elif JAPAN + return StringFromId((u16)(monster_id % 600 + 0x1590)); +#else + return StringFromId((u16)(monster_id % 600 + 0x221F)); +#endif +} u16 GetSpriteIndex__020526EC(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } u16 GetSpriteIndex__02052708(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } u16 GetSpriteIndex__02052724(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].sprite_index; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].sprite_index; } s16 GetDexNumber(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].pokedex_number; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].pokedex_number; } diff --git a/src/main_020527A8.c b/src/main_020527A8.c index 0dbcaf9b..8cafb59e 100644 --- a/src/main_020527A8.c +++ b/src/main_020527A8.c @@ -3,12 +3,12 @@ u8 GetMonsterGender(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].gender; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].gender; } u8 GetBodySize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].body_size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].body_size; } u8 GetSpriteSize(s16 monster_id) diff --git a/src/main_0205283C.c b/src/main_0205283C.c index 46a8082f..4e74a08e 100644 --- a/src/main_0205283C.c +++ b/src/main_0205283C.c @@ -3,108 +3,108 @@ u8 GetShadowSize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].shadow_size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].shadow_size; } s16 GetSpeedStatus(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_movement_speed; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_movement_speed; } enum mobility_type GetMobilityType(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].movement_type; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].movement_type; } u8 GetRegenSpeed(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].hp_regeneration << 1; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].hp_regeneration << 1; } bool8 GetCanMoveFlag(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b00010000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b00010000 ? TRUE : FALSE; } u8 GetChanceAsleep(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].spawn_asleep_chance; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].spawn_asleep_chance; } u16 GetWeightMultiplier(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].weight; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].weight; } u16 GetSize(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].size; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].size; } u16 GetBaseHp(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_hp; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_hp; } bool8 CanThrowItems(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b00100000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b00100000 ? TRUE : FALSE; } bool8 CanEvolve(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b01000000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b01000000 ? TRUE : FALSE; } s16 GetMonsterPreEvolution(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].evolution_param.pre_evolution_idx; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].evolution_param.pre_evolution_idx; } u8 GetBaseOffensiveStat(s16 monster_id, u8 stat_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_atk[stat_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_atk[stat_idx]; } u8 GetBaseDefensiveStat(s16 monster_id, u8 stat_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].base_def[stat_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].base_def[stat_idx]; } enum type_id GetType(s16 monster_id, u8 type_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].types[type_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].types[type_idx]; } enum ability_id GetAbility(s16 monster_id, u8 ability_idx) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].abilities[ability_idx]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].abilities[ability_idx]; } s16 GetRecruitRate2(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].recruit_rate_2; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].recruit_rate_2; } s16 GetRecruitRate1(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].recruit_rate_1; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].recruit_rate_1; } s32 GetExp(s16 monster_id, s32 level) { - s16 exp_yield = MONSTER_DATA_TABLE_PTR->entries[monster_id].exp_yield; + s16 exp_yield = MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].exp_yield; return exp_yield + exp_yield * (level - 1) / 10; } void GetEvoParameters(struct monster_evolution_parameters *evo_params, s16 monster_id) { - *evo_params = MONSTER_DATA_TABLE_PTR->entries[monster_id].evolution_param; + *evo_params = MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].evolution_param; } void GetTreasureBoxChances(s16 monster_id, s16 *chances) { s16 i; for (i = 0; i < 4; i++) - chances[i] = (&MONSTER_DATA_TABLE_PTR->entries[monster_id].unk_0x3c)[i]; + chances[i] = (&MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].unk_0x3c)[i]; } diff --git a/src/main_02052B28.c b/src/main_02052B28.c index 1858267d..f2c5a0a4 100644 --- a/src/main_02052B28.c +++ b/src/main_02052B28.c @@ -3,20 +3,20 @@ s32 GetIqGroup(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].iq_group; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].iq_group; } u8 GetSpawnThreshold(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].spawn_threshold; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].spawn_threshold; } bool8 NeedsItemToSpawn(s16 monster_id) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].flags & 0b10000000 ? TRUE : FALSE; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].flags & 0b10000000 ? TRUE : FALSE; } s16 GetExclusiveItem(s16 monster_id, s32 item_index) { - return MONSTER_DATA_TABLE_PTR->entries[monster_id].exclusive_item[item_index % 4]; + return MONSTER_DATA_TABLE_PTR.field_0x0->entries[monster_id].exclusive_item[item_index % 4]; } diff --git a/src/main_02055770.c b/src/main_02055770.c index c1f134f9..5798e845 100644 --- a/src/main_02055770.c +++ b/src/main_02055770.c @@ -112,3 +112,41 @@ s16 GetFirstEmptyMemberIdx(s16 monster_id) } return -1; } + +void sub_020559D8(s16 *idxs) +{ + struct ground_monster *m = TEAM_MEMBER_TABLE_PTR->members; + s32 i; + struct ground_monster *dst; + s32 j; + for (i = 0; i < 5; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (valid) { + idxs[i] = i; + } else { + idxs[i] = -1; + } + } + for (; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 valid = (m->is_valid & 1) != 0; + if (!valid) { + idxs[i] = -1; + dst = m; + j = i; + for (m++, i++; i < MAX_GROUND_TEAM_MEMBERS; i++, m++) { + bool8 v = (m->is_valid & 1) != 0; + if (v) { + *dst++ = *m; + idxs[i] = j++; + } else { + idxs[i] = -1; + } + } + for (; j < MAX_GROUND_TEAM_MEMBERS; j++) { + dst++->is_valid = 0; + } + return; + } + idxs[i] = i; + } +} diff --git a/src/number_util.c b/src/number_util.c index fb5909e2..fcfa194d 100644 --- a/src/number_util.c +++ b/src/number_util.c @@ -1,4 +1,41 @@ #include "number_util.h" +#include "main_020504A4.h" + +void ResetPlayTimer(struct unk_022AB694 *timer) +{ + timer->field_0x4 = 0; + timer->field_0x0 = 0; +} + +void PlayTimerTick(struct unk_022AB694 *timer) +{ + if (++timer->field_0x4 < 60) + { + return; + } + timer->field_0x4 = 0; + if (timer->field_0x0 < 0x22550ff) + { + timer->field_0x0++; + } +} + +s32 GetPlayTimeSeconds(struct unk_022AB694 *timer) +{ + return timer->field_0x0; +} + +void sub_02050E5C(struct unk_022AB694 *timer, struct bitstream *stream) +{ + CopyBitsTo(stream, &timer->field_0x4, 6); + CopyBitsTo(stream, &timer->field_0x0, 0x20); +} + +void sub_02050E8C(struct unk_022AB694 *timer, struct bitstream *stream) +{ + CopyBitsFrom(stream, &timer->field_0x4, 6); + CopyBitsFrom(stream, &timer->field_0x0, 0x20); +} extern void CopyBitsTo(struct bitstream *stream, void *buf_write, s32 nbits); extern void CopyBitsFrom(struct bitstream *stream, void *buf_read, s32 nbits); diff --git a/src/overlay_29_023047B8.c b/src/overlay_29_023047B8.c index 2dec1cdb..ab833af6 100644 --- a/src/overlay_29_023047B8.c +++ b/src/overlay_29_023047B8.c @@ -17,6 +17,7 @@ #include "overlay_29_02311010.h" #include "position_util.h" #include "secondary_terrain_types.h" +#include "overlay_29_02320764.h" extern struct dungeon *DUNGEON_PTR[2]; extern const u8 ov29_02352808[4]; @@ -32,7 +33,6 @@ extern void HandleShopTransaction(s32 a); extern void ov29_02346888(void); extern void ActivateTerrainEffects(struct entity *entity); extern void ov29_022EF9BC(void); -extern void EnsureCanStandCurrentTile(struct entity *entity); extern void EnemyEvolution(struct entity *entity); extern void CheckLeaderTile(void); extern void IsFloorOver2(void); diff --git a/src/overlay_29_0230A9DC.c b/src/overlay_29_0230A9DC.c index 2cc3b176..975eadc4 100644 --- a/src/overlay_29_0230A9DC.c +++ b/src/overlay_29_0230A9DC.c @@ -6,8 +6,8 @@ #include "overlay_29_0230A994.h" #include "enums.h" +#include "overlay_29_02320764.h" extern bool8 DungeonRandOutcome__022EAB20(s32 percentChance); -extern void TryAftermathExplosion(struct entity *attacker, struct entity *defender, struct position *pos, s32 radius, s32 a, s32 damage_source); extern const s16 AFTERMATH_CHANCE; bool8 ItemIsActive__0230A9DC(struct entity *entity, enum item_id item_id) { @@ -26,7 +26,7 @@ bool8 AftermathCheck(struct entity *attacker, struct entity *defender, s32 damag #endif && DungeonRandOutcome__022EAB20(AFTERMATH_CHANCE) && damage_source != DAMAGE_SOURCE_EXPLOSION) { - TryAftermathExplosion(attacker, defender, &defender->pos, 1, 0, DAMAGE_SOURCE_EXPLOSION); + TryAftermathExplosion(attacker, defender, &defender->pos, 1, TYPE_NONE, DAMAGE_SOURCE_EXPLOSION); return TRUE; } return FALSE; diff --git a/src/overlay_29_0230BBAC.c b/src/overlay_29_0230BBAC.c index 53c211a9..764b6e3e 100644 --- a/src/overlay_29_0230BBAC.c +++ b/src/overlay_29_0230BBAC.c @@ -861,7 +861,7 @@ void CalcDamageFixed(struct entity *attacker, struct entity *defender, s32 fixed } } -void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s16 fixed_damage, +void CalcDamageFixedNoCategory(struct entity *attacker, struct entity *defender, s32 fixed_damage, s32 a4, bool8 *out_flag, enum type_id attack_type, s16 damage_source, s32 a8, s32 a9, s32 a10) { diff --git a/src/overlay_29_02311010.c b/src/overlay_29_02311010.c index 870edcac..82a354fc 100644 --- a/src/overlay_29_02311010.c +++ b/src/overlay_29_02311010.c @@ -31,6 +31,7 @@ #include "overlay_29_023350D8.h" #include "dungeon_logic_4.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" extern s16 ov10_022C4BE4[20]; extern void ov29_0230FB30(struct entity *entity); @@ -60,17 +61,14 @@ extern void ov29_0230FB30(struct entity *entity); #ifdef EUROPE -extern bool8 ov29_022E34A8_EU(struct entity *entity); #endif extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); extern bool8 ExclusiveItemEffectIsActiveWithLogging(struct entity *user, struct entity *target, bool8 should_log, s32 message_id, enum exclusive_item_effect_id effect_id); extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void MultiplyFixedPoint64(struct fixed_point_64 *out, const struct fixed_point_64 *a, const struct fixed_point_64 *b); extern void ov29_022EA370(s32 a, s32 b); extern s32 ov29_022F2FE4(); -extern void EnsureCanStandCurrentTile(struct entity *entity); extern void ov29_022E543C(struct entity *entity); extern void ov29_022E53F0(struct entity *entity); extern void ov29_022F42F8(struct entity *entity); diff --git a/src/overlay_29_0231CBC8.c b/src/overlay_29_0231CBC8.c index b9e2a30e..139e2a61 100644 --- a/src/overlay_29_0231CBC8.c +++ b/src/overlay_29_0231CBC8.c @@ -18,6 +18,7 @@ #include "overlay_29_0230F8AC.h" #include "dungeon_logic_4.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" #ifdef JAPAN #define MESSAGE_BE6 0x925 @@ -42,7 +43,6 @@ #endif extern void TryIncreaseHp(struct entity *user, struct entity *target, s32 hp, s32 a, bool8 b); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern void BoostIQ(struct entity *entity, s16 iq, bool8 a); extern void TryInflictInvisibleStatus(struct entity *user, struct entity *target); extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); diff --git a/src/overlay_29_0231EDD8.c b/src/overlay_29_0231EDD8.c index 28d58763..c24d0808 100644 --- a/src/overlay_29_0231EDD8.c +++ b/src/overlay_29_0231EDD8.c @@ -20,6 +20,7 @@ #include "position_util.h" #include "util.h" #include "overlay_29_0230BBAC.h" +#include "overlay_29_02320764.h" #ifdef JAPAN #define MESSAGE_E45 0xB86 @@ -45,7 +46,6 @@ extern const s16 HURL_DAMAGE; extern void ChangeMonsterAnimation(struct entity *entity, s32 animation_id, s32 direction); extern void ChangeMonsterAnimationToIdle(struct entity *monster, s32 direction); extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, bool8 reset_prev_pos_fields); -extern void TryWarp(struct entity *user, struct entity *target, s32 a, s32 b); extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); extern void ov29_022E9298(struct position *pos, struct unk_022E9298 *bounds, bool8 a); extern bool8 CannotMoveToTile(struct entity *entity, struct position *pos); diff --git a/src/overlay_29_02320764.c b/src/overlay_29_02320764.c index b7e16cff..96799d40 100644 --- a/src/overlay_29_02320764.c +++ b/src/overlay_29_02320764.c @@ -1,5 +1,74 @@ #include "overlay_29_02320764.h" +#include "dg_object.h" +#include "dg_uty.h" +#include "dungeon.h" +#include "dungeon_ai_movement.h" +#include "dungeon_logic_3.h" +#include "dungeon_map_access.h" +#include "dungeon_pokemon_attributes.h" +#include "dungeon_util_2.h" #include "dungeon_util_static.h" +#include "move_orb_effects.h" +#include "moves_1.h" +#include "weather.h" +#include "overlay_29_022E272C.h" +#include "overlay_29_022E4B8C.h" +#include "overlay_29_022E563C.h" +#include "overlay_29_022E99F0.h" +#include "overlay_29_022E9FC0.h" +#include "overlay_29_022EC7E8.h" +#include "overlay_29_0230558C.h" +#include "overlay_29_0230BBAC.h" +#include "overlay_29_023047B8.h" +#include "overlay_29_02321238.h" +#include "overlay_29_02336F4C.h" +#include "overlay_29_0234B340.h" +#include "overlay_29_02344088.h" + +#ifdef JAPAN +#define MESSAGE_BFB 0x93A +#define MESSAGE_BFC 0x93B +#define MESSAGE_DBF 0xAFF +#define MESSAGE_DC0 0xB00 +#define MESSAGE_E71 0xBB3 +#define MESSAGE_E72 0xBB4 +#define MESSAGE_E73 0xBB5 +#define MESSAGE_E74 0xBB6 +#define MESSAGE_E75 0xBB7 +#else +#define MESSAGE_BFB 0xBFB +#define MESSAGE_BFC 0xBFC +#define MESSAGE_DBF 0xDBF +#define MESSAGE_DC0 0xDC0 +#define MESSAGE_E71 0xE71 +#define MESSAGE_E72 0xE72 +#define MESSAGE_E73 0xE73 +#define MESSAGE_E74 0xE74 +#define MESSAGE_E75 0xE75 +#endif + +extern struct dungeon *DUNGEON_PTR[]; +extern u32 DUNGEON_FRAMES_PASSED; +extern struct position *ov29_023529B8[]; +extern s32 EXPLOSION_FIXED_DAMAGES[]; + +extern void RemoveGroundItem(struct position *pos, bool8 a); +extern void ov29_02336694(s32 x, s32 y); +extern void DetermineTileWalkableNeighbors(s32 x, s32 y); +extern void UpdateMinimap(void); +extern bool8 TwoTurnMoveForcedMiss(struct entity *target, struct move *move); +extern void TryInflictPetrifiedStatus(struct entity *user, struct entity *target); +extern bool8 TryEndPetrifiedOrSleepStatus(struct entity *user, struct entity *target); +extern bool8 GetRandomTile(struct position *out, bool8 a); +extern void MoveMonsterToPos(struct entity *entity, s32 x_pos, s32 y_pos, + bool8 reset_prev_pos_fields); +extern void UpdateCamera(s32 a); +extern bool8 CannotStandOnTile(struct entity *entity, struct position *pos); +extern bool8 CannotStandOnTileNoMonsterCheck(struct entity *entity, struct position *pos); +extern void ov29_022F42F8(struct entity *entity); +extern void DiscoverMinimap(struct position *pos); +extern void HandleShopTransaction(s32 a); +extern void ActivateTerrainEffects(struct entity *entity); bool8 EntityIsValid__02320764(struct entity *entity) { @@ -8,3 +77,363 @@ bool8 EntityIsValid__02320764(struct entity *entity) return GetEntityType(entity) != ENTITY_NOTHING; } + +void TryAftermathExplosion(struct entity *attacker, struct entity *defender, + struct position *pos, s32 idx, enum type_id attack_type, + s16 damage_source) +{ + struct position tile_pos; + struct position *p; + struct tile *tile; + s32 i; + s32 dx; + s32 dy; + s32 x; + s32 y; + bool8 flag_a; + bool8 flag_b; + + for (i = 0; i < DUNGEON_MAX_POKEMON; i++) { + struct entity *mon = DUNGEON_PTR[0]->active_monster_ptrs[i]; + if (EntityIsValid__02320764(mon) && AbilityIsActiveVeneer(mon, ABILITY_DAMP)) + break; + } + + if (i != DUNGEON_MAX_POKEMON) { + ov29_022E55F0(attacker, defender); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFC); + return; + } + + if (GetApparentWeather(defender) == WEATHER_RAIN) { + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFC); + return; + } + + ov29_022E5560(attacker, defender, idx); + SubstitutePlaceholderStringTags(0, defender, 0); + LogMessageByIdWithPopupCheckUserTarget(attacker, defender, MESSAGE_BFB); + + flag_a = FALSE; + flag_b = FALSE; + for (p = ov29_023529B8[idx]; p->x != 0x63; p++) { + tile_pos.x = p->x + pos->x; + tile_pos.y = p->y + pos->y; + if (tile_pos.x < 0 || tile_pos.y < 0) + continue; + if (tile_pos.x >= DUNGEON_MAX_SIZE_X || tile_pos.y >= DUNGEON_MAX_SIZE_Y) + continue; + + tile = GetTileSafe(tile_pos.x, tile_pos.y); + if (tile_pos.x >= 1 && tile_pos.y >= 1 && tile_pos.x < DUNGEON_MAX_SIZE_X - 1 + && tile_pos.y < DUNGEON_MAX_SIZE_Y - 1) { + if (GetTerrainType(tile) == TERRAIN_TYPE_WALL + && !(tile->terrain_flags & TERRAIN_TYPE_IMPASSABLE_WALL)) { + tile->terrain_flags &= ~(TERRAIN_TYPE_NORMAL | TERRAIN_TYPE_SECONDARY); + tile->terrain_flags |= TERRAIN_TYPE_NORMAL; + for (dy = -1; dy <= 1; dy++) { + for (dx = -1; dx <= 1; dx++) { + ov29_02336694(tile_pos.x + dx, tile_pos.y + dy); + } + } + flag_a = TRUE; + flag_b = TRUE; + } + } + + if (tile->object != NULL) { + if (tile->object != defender && GetEntityType(tile->object) == ENTITY_ITEM) + RemoveGroundItem(&tile_pos, FALSE); + flag_a = TRUE; + } + + if (tile->monster != NULL && tile->monster != defender + && GetEntityType(tile->monster) == ENTITY_MONSTER) { + CalcAftermathExplosionDamage(attacker, tile->monster, attack_type, damage_source, + EXPLOSION_FIXED_DAMAGES[idx]); + if (IsFloorOver()) + break; + } + } + + if (IsFloorOver()) + return; + + if (GetEntityType(defender) == ENTITY_MONSTER + && damage_source != DAMAGE_SOURCE_EXPLOSION) { + CalcAftermathExplosionDamage(attacker, defender, attack_type, damage_source, + EXPLOSION_FIXED_DAMAGES[idx]); + } + + if (flag_a) { + if (flag_b) { + for (y = 0; y < DUNGEON_MAX_SIZE_Y; y++) { + for (x = 0; x < DUNGEON_MAX_SIZE_X; x++) { + DetermineTileWalkableNeighbors(x, y); + } + } + } + UpdateMinimap(); + UpdateTrapsVisibility(); + } +} + +void CalcExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage) +{ + struct monster *info; + struct move move; + bool8 flag; + s32 damage; + + if (!EntityIsValid__02320764(defender)) + return; + + info = GetEntInfo(defender); + InitMove(&move, MOVE_REGULAR_ATTACK); + if (TwoTurnMoveForcedMiss(defender, &move)) + return; + + if (!info->is_not_team_member) { + damage = info->hp / 2; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + if (damage < 1) + damage = 1; + } else { + damage = fixed_damage; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + } + + if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC0, + EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE)) { + damage = 1; + } else if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DBF, + EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE)) { + damage /= 2; + } + + CalcDamageFixedNoCategory(attacker, defender, damage, 0, &flag, attack_type, + damage_source, 0, 0, 0); +} + +void CalcAftermathExplosionDamage(struct entity *attacker, struct entity *defender, + enum type_id attack_type, s16 damage_source, s32 fixed_damage) +{ + struct monster *info; + struct move move; + bool8 flag; + s32 damage; + + if (!EntityIsValid__02320764(defender)) + return; + + info = GetEntInfo(defender); + InitMove(&move, MOVE_REGULAR_ATTACK); + if (TwoTurnMoveForcedMiss(defender, &move)) + return; + + if (!info->is_not_team_member) { + damage = info->hp / 2; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + if (damage < 1) + damage = 1; + } else { + damage = fixed_damage; + if (MonsterIsType(defender, TYPE_FIRE)) + damage /= 2; + } + + if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DC0, + EXCLUSIVE_EFF_NO_EXPLOSION_DAMAGE)) { + damage = 1; + } else if (ExclusiveItemEffectIsActiveWithLogging(attacker, defender, TRUE, MESSAGE_DBF, + EXCLUSIVE_EFF_HALVED_EXPLOSION_DAMAGE)) { + damage /= 2; + } + + if (damage >= info->hp) + damage = info->hp - 1; + if (damage < 0) + damage = 0; + + CalcDamageFixedNoCategory(attacker, defender, damage, 0, &flag, attack_type, + damage_source, 0, 0, 0); +} + +void TryWarp(struct entity *user, struct entity *target, s32 warp_type, + struct position *pos) +{ + struct position p; + struct monster *info; + bool8 flag; + bool8 blocked; + s32 direction; + + flag = FALSE; + info = GetEntInfo(target); + SubstitutePlaceholderStringTags(0, target, 0); + + if (user != target + && (user == NULL ? FALSE : (bool8)(GetEntityType(user) == ENTITY_MONSTER)) + && AbilityIsActiveVeneer(user, ABILITY_MOLD_BREAKER)) + blocked = FALSE; + else + blocked = AbilityIsActiveVeneer(target, ABILITY_SUCTION_CUPS); + + if (blocked) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E74); + return; + } + + if (!AreTileJumpsAllowed(DUNGEON_PTR[0]->gen_info.fixed_room_id)) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E72); + return; + } + + if (warp_type == 1 && DUNGEON_PTR[0]->gen_info.stairs_pos.x == target->pos.x + && DUNGEON_PTR[0]->gen_info.stairs_pos.y == target->pos.y) { + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E73); + TryInflictPetrifiedStatus(user, target); + return; + } + + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E71); + TryEndPetrifiedOrSleepStatus(target, target); + ov29_022E5650(user, target); + + if (ShouldDisplayEntityWrapper(target)) { + direction = info->action.direction; + while (TRUE) { + target->elevation += 0x800; + if (target->elevation >= 0xA000) + break; + if ((DUNGEON_FRAMES_PASSED & 3) == 0) { + direction = (direction + 1) & 7; + info->action.direction = direction; + ChangeMonsterAnimationToIdle(target, direction); + } + AdvanceFrame(0x22); + } + } + + switch (warp_type) { + default: + if (!GetRandomTile(&p, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + case 1: + if (!FindClosestUnoccupiedTileWithin2(&p, &DUNGEON_PTR[0]->gen_info.stairs_pos, + FALSE)) { + flag = TRUE; + p = target->pos; + } + break; + case 2: + if (!FindClosestUnoccupiedTileWithin2(&p, pos, FALSE)) { + flag = TRUE; + p = target->pos; + } + break; + case 3: + p = *pos; + break; + case 4: + if (!FindUnoccupiedTileWithin3(&p, &DUNGEON_PTR[0]->gen_info.stairs_pos, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + case 5: + if (!info->is_not_team_member && !info->is_team_leader) { + if (FindClosestUnoccupiedTileWithin2(&p, &GetLeader()->pos, FALSE)) + break; + } + if (!GetRandomTile(&p, TRUE)) { + flag = TRUE; + p = target->pos; + } + break; + } + + MoveMonsterToPos(target, p.x, p.y, TRUE); + UpdateEntityPixelPos(target, NULL); + sub_01FFB62C(target); + UpdateCamera(1); + + if (ShouldDisplayEntityWrapper(target)) { + direction = info->action.direction; + target->elevation = 0xA000; + while (TRUE) { + target->elevation -= 0x400; + if (target->elevation <= 0) + break; + if ((DUNGEON_FRAMES_PASSED & 3) == 0) { + direction = (direction + 1) & 7; + info->action.direction = direction; + ChangeMonsterAnimationToIdle(target, direction); + } + AdvanceFrame(0x22); + } + } + + target->elevation = 0; + AdvanceFrame(0x22); + + if (flag) + LogMessageByIdWithPopupCheckUserTarget(user, target, MESSAGE_E75); + + if (warp_type == 1) + TryInflictPetrifiedStatus(user, target); + + ov29_02321238(target); +} + +void EnsureCanStandCurrentTile(struct entity *entity) +{ + if (CannotStandOnTile(entity, &entity->pos)) + TryWarp(entity, entity, 5, NULL); +} + +void ov29_02321134(struct entity *entity) +{ + if (CannotStandOnTileNoMonsterCheck(entity, &entity->pos)) + TryWarp(entity, entity, 5, NULL); +} + +void ov29_02321164(struct entity *a, struct entity *b) +{ + if (CannotStandOnTile(b, &b->pos)) + TryWarp(a, b, 5, NULL); +} + +void ov29_0232119C(struct entity *entity, s32 a, s32 b) +{ + bool8 valid; + + if (entity == NULL) + valid = FALSE; + else + valid = GetEntityType(entity) != ENTITY_NOTHING; + + if (!valid) + return; + + if (a) + ChangeMonsterAnimationToIdle(entity, 8); + + if (GetEntInfo(entity)->is_team_leader) { + if (b) + ov29_022F42F8(entity); + DiscoverMinimap(&entity->pos); + HandleShopTransaction(0); + } + + ActivateTerrainEffects(entity); + ov29_02305814(entity, DUNGEON_PTR[0]->gen_info.force_create_monster_house); +} diff --git a/src/overlay_29_02321238.c b/src/overlay_29_02321238.c index e124a024..ac0ed258 100644 --- a/src/overlay_29_02321238.c +++ b/src/overlay_29_02321238.c @@ -1,6 +1,6 @@ #include "overlay_29_02321238.h" +#include "overlay_29_02320764.h" -extern void ov29_0232119C(struct entity *entity, s32 a, s32 b); void ov29_02321238(struct entity *entity) { diff --git a/src/overlay_29_02321274.c b/src/overlay_29_02321274.c index 52dd5fb8..434dc0d8 100644 --- a/src/overlay_29_02321274.c +++ b/src/overlay_29_02321274.c @@ -1,6 +1,6 @@ #include "overlay_29_02321274.h" +#include "overlay_29_02320764.h" -extern void ov29_0232119C(struct entity *entity, s32 a, s32 b); void ov29_02321274(struct entity *entity) { diff --git a/src/overlay_29_023296F8.c b/src/overlay_29_023296F8.c index 764762d2..c42bf013 100644 --- a/src/overlay_29_023296F8.c +++ b/src/overlay_29_023296F8.c @@ -1,5 +1,6 @@ #include "overlay_29_023296F8.h" #include "move_orb_effects.h" +#include "overlay_29_02320764.h" extern const struct StatIndex ATK_STAT_IDX; @@ -12,7 +13,6 @@ bool8 DoMoveBoostDefense2(struct entity* attacker, struct entity* defender, stru return TRUE; } -extern void TryWarp(struct entity *user, struct entity *target, s32, s32); bool8 DoMoveWarp(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) { diff --git a/src/overlay_29_0232C560.c b/src/overlay_29_0232C560.c index 9be1fd93..ee51bb4c 100644 --- a/src/overlay_29_0232C560.c +++ b/src/overlay_29_0232C560.c @@ -1,6 +1,6 @@ #include "overlay_29_0232C560.h" +#include "overlay_29_02320764.h" -extern void TryWarp(struct entity *user, struct entity *target, s32, s32); bool8 DoMoveStayAway(struct entity* attacker, struct entity* defender, struct move* move, enum item_id item_id) {