Finish unk_020557E0.c

This commit is contained in:
PikalaxALT 2023-08-18 17:37:06 -04:00
parent 563b4393b6
commit ab8036814b
7 changed files with 283 additions and 427 deletions

View File

@ -1,255 +0,0 @@
.include "asm/macros.inc"
.include "unk_020557E0.inc"
.include "global.inc"
.extern _021D4178
.extern sub_02055900
.extern sub_020559B4
.extern sub_020559D0
.extern sub_02055A00
.text
thumb_func_start sub_02055A48
sub_02055A48: ; 0x02055A48
push {r4, r5, r6, lr}
add r5, r1, #0
add r1, r2, #0
add r2, r3, #0
mov r6, #0
bl sub_02055A00
add r4, r0, #0
bne _02055A5E
add r0, r6, #0
pop {r4, r5, r6, pc}
_02055A5E:
add r0, r6, #0
add r1, r5, #0
_02055A62:
add r2, r5, r0
add r2, #0x30
ldrb r2, [r2]
cmp r2, #0
bne _02055A76
ldrb r2, [r1, #2]
cmp r4, r2
bne _02055A76
ldrb r2, [r1, #3]
add r6, r6, r2
_02055A76:
add r0, r0, #1
add r1, #8
cmp r0, #6
blt _02055A62
cmp r6, #0
bne _02055A86
mov r0, #0
pop {r4, r5, r6, pc}
_02055A86:
add r0, r6, #0
add r0, #0x14
lsl r0, r0, #0x10
lsr r0, r0, #0x10
bne _02055A94
bl GF_AssertFail
_02055A94:
add r0, r6, #0
add r0, #0x14
lsl r0, r0, #0x10
lsr r0, r0, #0x10
cmp r0, #1
bhi _02055AA4
mov r0, #0
b _02055AB6
_02055AA4:
bl LCRandom
add r6, #0x14
lsl r1, r6, #0x10
lsr r1, r1, #0x10
bl _s32_div_f
lsl r0, r1, #0x10
lsr r0, r0, #0x10
_02055AB6:
cmp r0, #0x14
bge _02055ABE
mov r0, #0
pop {r4, r5, r6, pc}
_02055ABE:
sub r0, #0x14
mov r2, #0
add r1, r5, #0
_02055AC4:
add r3, r5, r2
add r3, #0x30
ldrb r3, [r3]
cmp r3, #0
bne _02055AE2
ldrb r3, [r1, #2]
cmp r4, r3
bne _02055AE2
ldrb r3, [r1, #3]
cmp r0, r3
bge _02055AE0
str r2, [r5, #0x3c]
mov r0, #1
pop {r4, r5, r6, pc}
_02055AE0:
sub r0, r0, r3
_02055AE2:
add r2, r2, #1
add r1, #8
cmp r2, #6
blt _02055AC4
bl GF_AssertFail
mov r0, #0
pop {r4, r5, r6, pc}
.balign 4, 0
thumb_func_end sub_02055A48
thumb_func_start sub_02055AF4
sub_02055AF4: ; 0x02055AF4
push {r4, lr}
ldr r0, [r1, #0x14]
add r4, r2, #0
cmp r0, #4
beq _02055B04
cmp r0, #5
beq _02055B1A
b _02055B16
_02055B04:
add r0, r4, #0
bl sub_020559B4
add r1, r0, #1
ldr r0, [r4, #0x3c]
add r0, r4, r0
add r0, #0x30
strb r1, [r0]
pop {r4, pc}
_02055B16:
bl GF_AssertFail
_02055B1A:
pop {r4, pc}
thumb_func_end sub_02055AF4
thumb_func_start sub_02055B1C
sub_02055B1C: ; 0x02055B1C
push {r3, r4, r5, r6, r7, lr}
add r5, r0, #0
mov r0, #0x20
add r6, r1, #0
bl AllocMonZeroed
add r4, r0, #0
ldr r0, [r5, #0xc]
bl sub_020270F8
str r0, [sp]
add r0, r5, #0
bl sub_020558BC
add r1, r0, #0
mov r0, #0xb
bl sub_02051A98
add r1, r5, #0
add r7, r0, #0
bl BattleSetup_InitFromFsys
ldr r0, [sp]
ldr r1, [r6, #0x3c]
add r2, r4, #0
bl sub_0202EC70
add r0, r7, #0
add r1, r4, #0
mov r2, #1
bl sub_02051C9C
add r0, r4, #0
bl FreeToHeap
add r0, r7, #0
pop {r3, r4, r5, r6, r7, pc}
.balign 4, 0
thumb_func_end sub_02055B1C
thumb_func_start sub_02055B68
sub_02055B68: ; 0x02055B68
mov r3, #0
add r2, r3, #0
_02055B6C:
ldrh r1, [r0, #4]
add r2, r2, #1
add r0, #8
add r3, r3, r1
cmp r2, #6
blt _02055B6C
add r0, r3, #0
bx lr
thumb_func_end sub_02055B68
thumb_func_start sub_02055B7C
sub_02055B7C: ; 0x02055B7C
push {r4, r5, r6, r7}
mov r3, #0
add r5, r0, #0
add r4, r3, #0
mov r0, #1
_02055B86:
mov r1, #0
_02055B88:
add r2, r5, r1
add r2, #0x30
ldrb r2, [r2]
cmp r0, r2
bne _02055BC8
lsl r1, r1, #3
add r2, r5, r1
ldrb r1, [r2, #6]
ldrb r2, [r2, #7]
cmp r0, #1
beq _02055BB4
mov r6, ip
cmp r6, r1
beq _02055BB4
mov r6, ip
cmp r6, r2
beq _02055BB4
cmp r7, r1
beq _02055BB4
cmp r7, r2
beq _02055BB4
add r4, #0xc8
_02055BB4:
mov r6, #1
mov ip, r1
lsl r6, r1
add r1, r3, #0
mov r3, #1
lsl r3, r2
orr r1, r6
add r7, r2, #0
orr r3, r1
b _02055BCE
_02055BC8:
add r1, r1, #1
cmp r1, #6
blt _02055B88
_02055BCE:
add r0, r0, #1
cmp r0, #7
blt _02055B86
cmp r3, #0
beq _02055BE6
mov r0, #1
_02055BDA:
add r1, r3, #0
tst r1, r0
beq _02055BE2
add r4, #0x32
_02055BE2:
lsr r3, r3, #1
bne _02055BDA
_02055BE6:
add r0, r4, #0
pop {r4, r5, r6, r7}
bx lr
thumb_func_end sub_02055B7C
thumb_func_start sub_02055BEC
sub_02055BEC: ; 0x02055BEC
ldr r0, [r0, #0x48]
bx lr
thumb_func_end sub_02055BEC

View File

@ -76,5 +76,6 @@ void sub_020522F0(BATTLE_SETUP *setup, FieldSystem *fsys, void *a1);
void sub_02051F2C(BATTLE_SETUP *setup, FieldSystem *fsys, int level);
void sub_020520B0(BATTLE_SETUP *setup, FieldSystem *fsys, PARTY *party, void *a4);
BATTLE_SETUP* sub_02051A98(HeapID heapId, int a1);
void sub_02051C9C(BATTLE_SETUP* setup, Pokemon* mon, int a2);
#endif //POKEHEARTGOLD_BATTLE_SETUP_H

View File

@ -31,7 +31,8 @@ static inline u16 LCRandRange(const u16 maximum) {
if (maximum <= 1) {
return 0;
} else {
return LCRandom() % maximum;
u16 result = LCRandom() % maximum;
return result;
}
}

View File

@ -11,7 +11,7 @@ void sub_02055828(FieldSystem *fsys);
void sub_0202EC70(struct UnkStruct_0202EB30 *a0, int i, Pokemon *mon);
int sub_020558D0(FieldSystem *fsys);
int sub_020558E0(FieldSystem *fsys);
int sub_020558F0(FieldSystem *fsys);
u32 sub_020558F0(FieldSystem *fsys);
BOOL sub_02055874(FieldSystem* fsys, int x, int y);
BATTLE_SETUP* sub_0205589C(FieldSystem* fsys);
void sub_020558AC(FieldSystem *fsys, BATTLE_SETUP *setup);

View File

@ -198,8 +198,7 @@ Static main
Object asm/unk_020551B8.o
Object asm/unk_02055244.o
Object src/unk_02055418.o
Object src/unk_020557E0_c.o
Object asm/unk_020557E0.o
Object src/unk_020557E0.o
Object asm/unk_02055BF0_data.o
Object src/unk_02055BF0.o
Object asm/unk_02056680.o

278
src/unk_020557E0.c Normal file
View File

@ -0,0 +1,278 @@
#include "global.h"
#include "field_system.h"
#include "gf_rtc.h"
#include "game_stats.h"
#include "save_arrays.h"
#include "math_util.h"
#include "battle_setup.h"
#include "unk_02054648.h"
#include "metatile_behavior.h"
#include "constants/game_stat.h"
#include "unk_020557E0.h"
struct PalParkMon {
u16 species;
u8 encounter_tile;
u8 encounter_rate;
u16 score;
u8 type1;
u8 type2;
};
struct PalParkLocal {
struct PalParkMon mons[PARTY_SIZE];
u8 caught_order[PARTY_SIZE];
s32 unk_38;
s32 encounter_index;
s64 timestamp; // 40
int unk_48;
};
typedef enum UnkEnum_02055A00 {
UNK_02055A00_0,
UNK_02055A00_1,
UNK_02055A00_2,
UNK_02055A00_3,
UNK_02055A00_4,
UNK_02055A00_5,
UNK_02055A00_6,
UNK_02055A00_7,
UNK_02055A00_8,
} UnkEnum_02055A00;
struct PalParkLocal _021D4178;
void sub_02055900(u16 species, u8* dest);
void sub_0205592C(FieldSystem* fsys, struct PalParkLocal* palpark);
int sub_020559B4(struct PalParkLocal* palpark);
void sub_020559D0(struct PalParkLocal* palpark);
BOOL sub_020559E8(struct PalParkLocal* palpark);
UnkEnum_02055A00 sub_02055A00(FieldSystem* fsys, int x, int y);
BOOL sub_02055A48(FieldSystem* fsys, struct PalParkLocal* palpark, int x, int y);
BATTLE_SETUP* sub_02055B1C(FieldSystem* fsys, struct PalParkLocal* palpark);
void sub_02055AF4(FieldSystem *fsys, BATTLE_SETUP *setup, struct PalParkLocal* palpark);
int sub_02055B68(struct PalParkLocal* palpark);
u32 sub_02055B7C(struct PalParkLocal* palpark);
int sub_02055BEC(struct PalParkLocal* palpark);
void sub_020557E0(FieldSystem* fsys) {
s32 i;
struct PalParkLocal* local = &_021D4178;
for (i = 0; i < PARTY_SIZE; ++i) {
local->caught_order[i] = 0;
}
}
void sub_020557F8(FieldSystem* fsys) {
MI_CpuClearFast(&_021D4178, sizeof _021D4178);
sub_0205592C(fsys, &_021D4178);
sub_020559D0(&_021D4178);
_021D4178.timestamp = GF_RTC_DateTimeToSec();
}
void sub_02055828(FieldSystem* fsys) {
struct PalParkLocal* local = &_021D4178;
GAME_STATS* stats = Save_GameStats_Get(fsys->savedata);
s64 elapsed = GF_RTC_TimeDelta(local->timestamp, GF_RTC_DateTimeToSec());
if (elapsed < 1000) {
local->unk_48 = 2 * (1000 - elapsed);
} else {
local->unk_48 = 0;
}
GameStats_AddSpecial(stats, GAME_STAT_UNK17);
}
BOOL sub_02055874(FieldSystem* fsys, int x, int y) {
if (sub_020559E8(&_021D4178) == TRUE) {
return sub_02055A48(fsys, &_021D4178, x, y);
}
return FALSE;
}
BATTLE_SETUP* sub_0205589C(FieldSystem* fsys) {
return sub_02055B1C(fsys, &_021D4178);
}
void sub_020558AC(FieldSystem *fsys, BATTLE_SETUP *setup) {
return sub_02055AF4(fsys, setup, &_021D4178);
}
int sub_020558BC(FieldSystem* fsys) {
return 6 - sub_020559B4(&_021D4178);
}
int sub_020558D0(FieldSystem* fsys) {
return sub_02055B68(&_021D4178);
}
int sub_020558E0(FieldSystem *fsys) {
return sub_02055BEC(&_021D4178);
}
u32 sub_020558F0(FieldSystem *fsys) {
return sub_02055B7C(&_021D4178);
}
void sub_02055900(u16 species, u8* dest) {
GF_ASSERT(species != SPECIES_NONE && species <= SPECIES_ARCEUS);
ReadFromNarcMemberByIdPair(dest, NARC_a_1_2_5, 0, (species - 1) * 6, 6);
}
void sub_0205592C(FieldSystem* fsys, struct PalParkLocal* palpark) {
struct UnkStruct_0202EB30* sp4 = sub_020270F8(fsys->savedata);
Pokemon* mon = AllocMonZeroed(HEAP_ID_4);
u8 narc_data[6];
u16 species;
for (int i = 0; i < PARTY_SIZE; ++i) {
palpark->caught_order[i] = 0;
sub_0202EC70(sp4, i, mon);
palpark->mons[i].species = species = GetMonData(mon, MON_DATA_SPECIES, NULL);
sub_02055900(species, narc_data);
if (narc_data[0] != 0) {
palpark->mons[i].encounter_tile = narc_data[0];
} else {
palpark->mons[i].encounter_tile = narc_data[1] + 4;
}
palpark->mons[i].encounter_rate = narc_data[3];
palpark->mons[i].score = narc_data[2];
palpark->mons[i].type1 = GetMonData(mon, MON_DATA_TYPE_1, NULL);
palpark->mons[i].type2 = GetMonData(mon, MON_DATA_TYPE_2, NULL);
}
FreeToHeap(mon);
}
int sub_020559B4(struct PalParkLocal* palpark) {
int i;
int total = 0;
for (i = 0; i < PARTY_SIZE; ++i) {
if (palpark->caught_order[i] != 0) {
++total;
}
}
return total;
}
void sub_020559D0(struct PalParkLocal* palpark) {
u16 rnd = LCRandom() % 10;
palpark->unk_38 = rnd + 5;
}
BOOL sub_020559E8(struct PalParkLocal* palpark) {
if (--palpark->unk_38 == 0) {
sub_020559D0(palpark);
return TRUE;
}
return FALSE;
}
UnkEnum_02055A00 sub_02055A00(FieldSystem* fsys, int x, int y) {
int behavior = GetMetatileBehaviorAt(fsys, x, y);
int r5 = (x >= 32 ? 1 : 0);
r5 += (y < 32 ? 0 : 2);
if (sub_0205B6E8(behavior)) {
return (UnkEnum_02055A00)(r5 + UNK_02055A00_1);
}
if (sub_0205B778(behavior)) {
return (UnkEnum_02055A00)(r5 + UNK_02055A00_5);
}
return UNK_02055A00_0;
}
BOOL sub_02055A48(FieldSystem* fsys, struct PalParkLocal* palpark, int x, int y) {
int i;
int rnd, total_rate = 0;
UnkEnum_02055A00 standing_tile = sub_02055A00(fsys, x, y);
if (standing_tile == UNK_02055A00_0) {
return FALSE;
}
for (i = 0; i < PARTY_SIZE; ++i) {
if (palpark->caught_order[i] == 0 && palpark->mons[i].encounter_tile == standing_tile) {
total_rate += palpark->mons[i].encounter_rate;
}
}
if (total_rate == 0) {
return FALSE;
}
rnd = LCRandRange(total_rate + 20);
if (rnd < 20) {
return FALSE;
}
rnd -= 20;
for (i = 0; i < PARTY_SIZE; ++i) {
if (palpark->caught_order[i] == 0 && palpark->mons[i].encounter_tile == standing_tile) {
if (rnd < palpark->mons[i].encounter_rate) {
palpark->encounter_index = i;
return TRUE;
} else {
rnd -= palpark->mons[i].encounter_rate;
}
}
}
GF_ASSERT(0);
return FALSE;
}
void sub_02055AF4(FieldSystem *fsys, BATTLE_SETUP *setup, struct PalParkLocal* palpark) {
switch (setup->winFlag) {
case 4:
palpark->caught_order[palpark->encounter_index] = sub_020559B4(palpark) + 1;
break;
case 5:
break;
default:
GF_ASSERT(0);
}
}
BATTLE_SETUP* sub_02055B1C(FieldSystem* fsys, struct PalParkLocal* palpark) {
Pokemon* mon = AllocMonZeroed(HEAP_ID_32);
struct UnkStruct_0202EB30* migratedMons = sub_020270F8(fsys->savedata);
BATTLE_SETUP* ret = sub_02051A98(HEAP_ID_FIELD, sub_020558BC(fsys));
BattleSetup_InitFromFsys(ret, fsys);
sub_0202EC70(migratedMons, palpark->encounter_index, mon);
sub_02051C9C(ret, mon, 1);
FreeToHeap(mon);
return ret;
}
int sub_02055B68(struct PalParkLocal* palpark) {
int i, score = 0;
for (i = 0; i < PARTY_SIZE; ++i) {
score += palpark->mons[i].score;
}
return score;
}
u32 sub_02055B7C(struct PalParkLocal* palpark) {
int j, i;
u8 type1, type2, last_type1, last_type2;
u32 seen_types = 0, score = 0;
for (i = 1; i < PARTY_SIZE + 1; ++i) {
for (j = 0; j < PARTY_SIZE; ++j) {
if (palpark->caught_order[j] == i) {
type1 = palpark->mons[j].type1;
type2 = palpark->mons[j].type2;
if (i != 1 && last_type1 != type1 && last_type1 != type2 && last_type2 != type1 && last_type2 != type2) {
score += 200;
}
last_type1 = type1;
last_type2 = type2;
seen_types |= 1 << type1;
seen_types |= 1 << type2;
break;
}
}
}
while (seen_types != 0) {
if (seen_types & 1) {
score += 50;
}
seen_types >>= 1;
}
return score;
}
int sub_02055BEC(struct PalParkLocal* palpark) {
return palpark->unk_48;
}

View File

@ -1,168 +0,0 @@
#include "global.h"
#include "field_system.h"
#include "gf_rtc.h"
#include "game_stats.h"
#include "save_arrays.h"
#include "math_util.h"
#include "battle_setup.h"
#include "unk_02054648.h"
#include "metatile_behavior.h"
#include "constants/game_stat.h"
#include "unk_020557E0.h"
struct UnkStruct_021D4178_sub {
u16 species;
u8 unk_2;
u8 unk_3;
u16 unk_4;
u8 type1;
u8 type2;
};
struct UnkStruct_021D4178 {
struct UnkStruct_021D4178_sub unk_00[PARTY_SIZE];
u8 unk_30[PARTY_SIZE];
u8 filler_36[2];
s32 unk_38;
s32 unk_3C;
s64 timestamp; // 40
int unk_48;
};
struct UnkStruct_021D4178 _021D4178;
void sub_02055900(u16 species, u8* dest);
void sub_0205592C(FieldSystem* fsys, struct UnkStruct_021D4178* unk);
int sub_020559B4(struct UnkStruct_021D4178* unk);
void sub_020559D0(struct UnkStruct_021D4178* unk);
BOOL sub_020559E8(struct UnkStruct_021D4178* unk);
int sub_02055A00(FieldSystem* fsys, int x, int y);
BOOL sub_02055A48(FieldSystem* fsys, struct UnkStruct_021D4178* unk, int x, int y);
BATTLE_SETUP* sub_02055B1C(FieldSystem* fsys, struct UnkStruct_021D4178* unk);
void sub_02055AF4(FieldSystem *fsys, BATTLE_SETUP *setup, struct UnkStruct_021D4178* unk);
int sub_02055B68(struct UnkStruct_021D4178* unk);
int sub_02055BEC(struct UnkStruct_021D4178* unk);
int sub_02055B7C(struct UnkStruct_021D4178* unk);
void sub_020557E0(FieldSystem* fsys) {
s32 i;
struct UnkStruct_021D4178* r3 = &_021D4178;
for (i = 0; i < 6; ++i) {
r3->unk_30[i] = 0;
}
}
void sub_020557F8(FieldSystem* fsys) {
MI_CpuClearFast(&_021D4178, sizeof _021D4178);
sub_0205592C(fsys, &_021D4178);
sub_020559D0(&_021D4178);
_021D4178.timestamp = GF_RTC_DateTimeToSec();
}
void sub_02055828(FieldSystem* fsys) {
struct UnkStruct_021D4178* r4 = &_021D4178;
GAME_STATS* stats = Save_GameStats_Get(fsys->savedata);
s64 elapsed = GF_RTC_TimeDelta(r4->timestamp, GF_RTC_DateTimeToSec());
if (elapsed < 1000) {
r4->unk_48 = 2 * (1000 - elapsed);
} else {
r4->unk_48 = 0;
}
GameStats_AddSpecial(stats, GAME_STAT_UNK17);
}
BOOL sub_02055874(FieldSystem* fsys, int x, int y) {
if (sub_020559E8(&_021D4178) == TRUE) {
return sub_02055A48(fsys, &_021D4178, x, y);
}
return FALSE;
}
BATTLE_SETUP* sub_0205589C(FieldSystem* fsys) {
return sub_02055B1C(fsys, &_021D4178);
}
void sub_020558AC(FieldSystem *fsys, BATTLE_SETUP *setup) {
return sub_02055AF4(fsys, setup, &_021D4178);
}
int sub_020558BC(FieldSystem* fsys) {
return 6 - sub_020559B4(&_021D4178);
}
int sub_020558D0(FieldSystem* fsys) {
return sub_02055B68(&_021D4178);
}
int sub_020558E0(FieldSystem *fsys) {
return sub_02055BEC(&_021D4178);
}
int sub_020558F0(FieldSystem *fsys) {
return sub_02055B7C(&_021D4178);
}
void sub_02055900(u16 species, u8* dest) {
GF_ASSERT(species != SPECIES_NONE && species <= SPECIES_ARCEUS);
ReadFromNarcMemberByIdPair(dest, NARC_a_1_2_5, 0, (species - 1) * 6, 6);
}
void sub_0205592C(FieldSystem* fsys, struct UnkStruct_021D4178* unk) {
struct UnkStruct_0202EB30* sp4 = sub_020270F8(fsys->savedata);
Pokemon* mon = AllocMonZeroed(HEAP_ID_4); // r4
u8 sp8[6];
u16 species;
for (int i = 0; i < PARTY_SIZE; ++i) {
unk->unk_30[i] = 0;
sub_0202EC70(sp4, i, mon);
unk->unk_00[i].species = species = GetMonData(mon, MON_DATA_SPECIES, NULL);
sub_02055900(species, sp8);
if (sp8[0] != 0) {
unk->unk_00[i].unk_2 = sp8[0];
} else {
unk->unk_00[i].unk_2 = sp8[1] + 4;
}
unk->unk_00[i].unk_3 = sp8[3];
unk->unk_00[i].unk_4 = sp8[2];
unk->unk_00[i].type1 = GetMonData(mon, MON_DATA_TYPE_1, NULL);
unk->unk_00[i].type2 = GetMonData(mon, MON_DATA_TYPE_2, NULL);
}
FreeToHeap(mon);
}
int sub_020559B4(struct UnkStruct_021D4178* unk) {
int i;
int total = 0;
for (i = 0; i < PARTY_SIZE; ++i) {
if (unk->unk_30[i]) {
++total;
}
}
return total;
}
void sub_020559D0(struct UnkStruct_021D4178* unk) {
u16 rnd = LCRandom() % 10;
unk->unk_38 = rnd + 5;
}
BOOL sub_020559E8(struct UnkStruct_021D4178* unk) {
if (--unk->unk_38 == 0) {
sub_020559D0(unk);
return TRUE;
}
return FALSE;
}
int sub_02055A00(FieldSystem* fsys, int x, int y) {
int behavior = GetMetatileBehaviorAt(fsys, x, y);
int r5 = (x >= 32 ? 1 : 0);
r5 += (y < 32 ? 0 : 2);
if (sub_0205B6E8(behavior)) {
return r5 + 1;
}
if (sub_0205B778(behavior)) {
return r5 + 5;
}
return 0;
}