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:
cecilarmitais
2026-09-15 02:48:48 -07:00
parent 143395893f
commit c482e2dfdb
56 changed files with 1852 additions and 3138 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,2 +0,0 @@
#pragma once
.public TEAM_MEMBER_TABLE_PTR

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -34,6 +34,8 @@ _022AB69C:
.space 0x27C
.global TEAM_NAME
TEAM_NAME:
.global _022AB918
_022AB918:
#ifdef JAPAN
.space 0x8
#else

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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
View 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
View 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

View File

@@ -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];

View File

@@ -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

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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;

View File

@@ -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
View 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
View 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;
}

View File

@@ -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]);
}

View File

@@ -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;
}

View File

@@ -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)

View File

@@ -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];
}

View File

@@ -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];
}

View File

@@ -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;
}
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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;

View File

@@ -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)
{

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);
}

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{

View File

@@ -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)
{