mirror of
https://github.com/pret/pmd-sky.git
synced 2026-09-26 12:17:30 -05:00
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 <noreply@anthropic.com>
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -1,2 +0,0 @@
|
||||
#pragma once
|
||||
.public TEAM_MEMBER_TABLE_PTR
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -34,6 +34,8 @@ _022AB69C:
|
||||
.space 0x27C
|
||||
.global TEAM_NAME
|
||||
TEAM_NAME:
|
||||
.global _022AB918
|
||||
_022AB918:
|
||||
#ifdef JAPAN
|
||||
.space 0x8
|
||||
#else
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
8
include/main_02050CF8.h
Normal file
8
include/main_02050CF8.h
Normal file
@@ -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
|
||||
8
include/main_02050D84.h
Normal file
8
include/main_02050D84.h
Normal file
@@ -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
|
||||
@@ -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];
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1,6 +1,35 @@
|
||||
#ifndef PMDSKY_MAIN_020526EC_H
|
||||
#define PMDSKY_MAIN_020526EC_H
|
||||
|
||||
#include "enums.h"
|
||||
#include <file.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
#define PMDSKY_MONSTER_DATA_TABLE_PTR_H
|
||||
|
||||
#include "enums.h"
|
||||
|
||||
extern struct monster_data_table *MONSTER_DATA_TABLE_PTR;
|
||||
#include <file.h>
|
||||
|
||||
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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
9
main.lsf
9
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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -3,13 +3,14 @@
|
||||
#include "item.h"
|
||||
#include "item_util.h"
|
||||
#include "item_util_1.h"
|
||||
#include "main_0200D81C.h"
|
||||
#include <stdarg.h>
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
40
src/main_02050CF8.c
Normal file
40
src/main_02050CF8.c
Normal file
@@ -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;
|
||||
}
|
||||
41
src/main_02050D84.c
Normal file
41
src/main_02050D84.c
Normal file
@@ -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;
|
||||
}
|
||||
@@ -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 <stdarg.h>
|
||||
|
||||
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]);
|
||||
}
|
||||
|
||||
@@ -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 <stdarg.h>
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user