diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/rom3.c | 333 |
1 files changed, 326 insertions, 7 deletions
diff --git a/src/rom3.c b/src/rom3.c index 9bd2674c5..af9a9f4dd 100644 --- a/src/rom3.c +++ b/src/rom3.c @@ -7,13 +7,30 @@ #include "species.h" #include "task.h" +extern u8 unk_2000000[]; + +#define EWRAM_14000 ((u8 *)(unk_2000000 + 0x14000)) +#define EWRAM_15000 ((u8 *)(unk_2000000 + 0x15000)) + extern u16 gBattleTypeFlags; +extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2]; +extern u32 gBitTable[]; +extern u8 gUnknown_020238C4; +extern u8 gUnknown_020238C5; +extern u8 gUnknown_020238C6; extern u32 gUnknown_020239FC; +extern u8 gUnknown_02023A60[][0x200]; +extern u8 gUnknown_02024260[][0x200]; +extern u8 gUnknown_02024A60; extern u32 gUnknown_02024A64; extern u8 gUnknown_02024A68; extern u16 gUnknown_02024A6A[]; extern u8 gUnknown_02024A72[]; +extern u8 gUnknown_02024C07; +extern u8 gUnknown_02024C08; +extern u8 gUnknown_02024C0A; +extern u8 gUnknown_02024C0C; extern u8 gUnknown_02024C78; extern u8 gUnknown_02024E60[]; extern u8 gUnknown_02024E64[]; @@ -38,10 +55,15 @@ extern void sub_802BF74(void); extern void sub_8032AE0(void); extern void sub_8037510(void); extern void sub_811DA78(void); +extern void dp01_prepare_buffer_wireless_probably(u8 a, u16, u8 *c); +extern void sub_800C1A8(u8); +extern void sub_800C47C(u8); +extern void sub_8007F4C(void); +extern u8 sub_8007ECC(void); void sub_800B858(void) { - if (gBattleTypeFlags & 2) + if (gBattleTypeFlags & BATTLE_TYPE_LINK) { OpenLink(); CreateTask(sub_8083C50, 0); @@ -66,7 +88,7 @@ void setup_poochyena_battle(void) battle_anim_clear_some_data(); sub_8040710(); BattleAI_HandleItemUseBeforeAISetup(); - if (gBattleTypeFlags & 0x10) + if (gBattleTypeFlags & BATTLE_TYPE_FIRST_BATTLE) { ZeroEnemyPartyMons(); CreateMon(&gEnemyParty[0], SPECIES_POOCHYENA, 2, 32, 0, 0, 0, 0); @@ -81,12 +103,12 @@ void sub_800B950(void) { s32 i; - if (gBattleTypeFlags & 2) + if (gBattleTypeFlags & BATTLE_TYPE_LINK) sub_800BA78(); else sub_800B9A8(); sub_800BD54(); - if (!(gBattleTypeFlags & 0x40)) + if (!(gBattleTypeFlags & BATTLE_TYPE_40)) { for (i = 0; i < gUnknown_02024A68; i++) sub_8094978(i, 0); @@ -95,12 +117,12 @@ void sub_800B950(void) void sub_800B9A8(void) { - if (!(gBattleTypeFlags & 1)) + if (!(gBattleTypeFlags & BATTLE_TYPE_DOUBLE)) { gUnknown_030042D4 = sub_8010800; - if (gBattleTypeFlags & 0x80) + if (gBattleTypeFlags & BATTLE_TYPE_SAFARI) gUnknown_03004330[0] = sub_812B468; - else if (gBattleTypeFlags & 0x200) + else if (gBattleTypeFlags & BATTLE_TYPE_WALLY_TUTORIAL) gUnknown_03004330[0] = sub_8137224; else gUnknown_03004330[0] = sub_802BF74; @@ -255,3 +277,300 @@ void sub_800BA78(void) } gUnknown_02024A68 = 4; } + +void sub_800BD54(void) +{ + int i; + int j; + + if (!(gBattleTypeFlags & BATTLE_TYPE_40)) + { + for (i = 0; i < gUnknown_02024A68; i++) + { + for (j = 0; j < 6; j++) + { + if (i < 2) + { + if (!(gUnknown_02024A72[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0x19C + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0) + { + gUnknown_02024A6A[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0x19C + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0) + { + gUnknown_02024A6A[i] = j; + break; + } + } + } + else + { + if (!(gUnknown_02024A72[i] & 1)) + { + if (GetMonData(&gPlayerParty[j], MON_DATA_HP) != 0 + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES) != 0 //Why is this one not SPECIES2 like the rest? + && GetMonData(&gPlayerParty[j], MON_DATA_SPECIES2) != 0x19C + && GetMonData(&gPlayerParty[j], MON_DATA_IS_EGG) == 0 + && gUnknown_02024A6A[i - 2] != j) + { + gUnknown_02024A6A[i] = j; + break; + } + } + else + { + if (GetMonData(&gEnemyParty[j], MON_DATA_HP) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0 + && GetMonData(&gEnemyParty[j], MON_DATA_SPECIES2) != 0x19C + && GetMonData(&gEnemyParty[j], MON_DATA_IS_EGG) == 0 + && gUnknown_02024A6A[i - 2] != j) + { + gUnknown_02024A6A[i] = j; + break; + } + } + } + } + } + } +} + +void dp01_prepare_buffer(u8 a, u8 *b, u16 c) +{ + int i; + + if (gBattleTypeFlags & BATTLE_TYPE_LINK) + { + dp01_prepare_buffer_wireless_probably(a, c, b); + } + else + { + switch (a) + { + case 0: + for (i = 0; i < c; i++) + { + gUnknown_02023A60[gUnknown_02024A60][i] = *b; + b++; + } + break; + case 1: + for (i = 0; i < c; i++) + { + gUnknown_02024260[gUnknown_02024A60][i] = *b; + b++; + } + break; + } + } +} + +void sub_800BF28(void) +{ + gUnknown_020238C4 = CreateTask(sub_800C1A8, 0); + gTasks[gUnknown_020238C4].data[11] = 0; + gTasks[gUnknown_020238C4].data[12] = 0; + gTasks[gUnknown_020238C4].data[13] = 0; + gTasks[gUnknown_020238C4].data[14] = 0; + gTasks[gUnknown_020238C4].data[15] = 0; + gUnknown_020238C5 = CreateTask(sub_800C47C, 0); + gTasks[gUnknown_020238C5].data[12] = 0; + gTasks[gUnknown_020238C5].data[13] = 0; + gTasks[gUnknown_020238C5].data[14] = 0; + gTasks[gUnknown_020238C5].data[15] = 0; + gUnknown_020238C6 = 0; + CpuFill16(0, EWRAM_14000, 0x2000); +} + +void dp01_prepare_buffer_wireless_probably(u8 a, u16 b, u8 *c) +{ + s32 r9; + int i; + + r9 = b - b % 4 + 4; + if (gTasks[gUnknown_020238C4].data[14] + r9 + 9 > 0x1000) + { + gTasks[gUnknown_020238C4].data[12] = gTasks[gUnknown_020238C4].data[14]; + gTasks[gUnknown_020238C4].data[14] = 0; + } + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14000] = a; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14001] = gUnknown_02024A60; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14002] = gUnknown_02024C07; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14003] = gUnknown_02024C08; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14004] = r9; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14005] = (r9 & 0x0000FF00) >> 8; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14006] = gUnknown_02024C0C; + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14007] = gUnknown_02024C0A; + for (i = 0; i < b; i++) + unk_2000000[gTasks[gUnknown_020238C4].data[14] + 0x14008 + i] = c[i]; + gTasks[gUnknown_020238C4].data[14] = gTasks[gUnknown_020238C4].data[14] + r9 + 8; +} + +void sub_800C1A8(u8 taskId) +{ + u16 var; + + switch (gTasks[taskId].data[11]) + { + case 0: + gTasks[taskId].data[10] = 100; + gTasks[taskId].data[11]++; + break; + case 1: + gTasks[taskId].data[10]--; + if (gTasks[taskId].data[10] == 0) + gTasks[taskId].data[11]++; + break; + case 2: + GetLinkPlayerCount_2(); + if (IsLinkMaster()) + { + sub_8007F4C(); + gTasks[taskId].data[11]++; + break; + } + gTasks[taskId].data[11]++; + break; + case 3: + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[13] == 0) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + var = (unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8)) + 8; + SendBlock(bitmask_all_link_players_but_self(), &unk_2000000[gTasks[taskId].data[15] + 0x14000], var); + gTasks[taskId].data[11]++; + } + else + { + gTasks[taskId].data[13]--; + break; + } + } + break; + case 4: + if (sub_8007ECC()) + { + var = unk_2000000[gTasks[taskId].data[15] + 0x14004] | (unk_2000000[gTasks[taskId].data[15] + 0x14005] << 8); + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[15] = gTasks[taskId].data[15] + var + 8; + gTasks[taskId].data[11] = 3; + } + break; + case 5: + gTasks[taskId].data[13]--; + if (gTasks[taskId].data[13] == 0) + { + gTasks[taskId].data[13] = 1; + gTasks[taskId].data[11] = 3; + } + break; + } +} + +//fix me +void sub_800C35C(void) +{ + u8 i; //r4 + s32 j; //r2 + u16 r6; //r6 + u8 *recvBuffer; //r3 + u8 *dest; //r5 + u8 *src; //r4 + + if (gReceivedRemoteLinkPlayers != 0 && (gBattleTypeFlags & 0x20) && gLinkPlayers[0].linkType == 0x2211) + { + for (i = 0; i < GetLinkPlayerCount(); i++) + { + if (GetBlockReceivedStatus() & gBitTable[i]) + { + ResetBlockReceivedFlag(i); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#ifndef NONMATCHING + asm(""); + recvBuffer = (u8 *)&gBlockRecvBuffer[i]; +#endif + r6 = gBlockRecvBuffer[i][2]; + if (gTasks[gUnknown_020238C5].data[14] + 9 + r6 > 0x1000) + { + gTasks[gUnknown_020238C5].data[12] = gTasks[gUnknown_020238C5].data[14]; + gTasks[gUnknown_020238C5].data[14] = 0; + } + //_0800C402 + dest = EWRAM_15000 + gTasks[gUnknown_020238C5].data[14]; + src = recvBuffer; + for (j = 0; j < r6 + 8; j++) + dest[j] = src[j]; + gTasks[gUnknown_020238C5].data[14] = gTasks[gUnknown_020238C5].data[14] + r6 + 8; + } + //_0800C446 + } + } +} + +/* +extern void sub_80155A4(); + +void sub_800C47C(u8 taskId) +{ + //s16 r3; + u16 r7; + u8 r4; + u8 r2; + + if (gTasks[taskId].data[15] != gTasks[taskId].data[14]) + { + if (gTasks[taskId].data[15] > gTasks[taskId].data[14] + && gTasks[taskId].data[15] == gTasks[taskId].data[12]) + { + gTasks[taskId].data[12] = 0; + gTasks[taskId].data[15] = 0; + } + //_0800C4B6 + //r3 = gTasks[taskId].data[15]; + asm(""::"r"(unk_2000000)); + r4 = EWRAM_15000[gTasks[taskId].data[15] + 1]; + r7 = EWRAM_15000[gTasks[taskId].data[15] + 4] | (EWRAM_15000[gTasks[taskId].data[15] + 5] << 8); + switch (EWRAM_15000[gTasks[taskId].data[15]]) + { + case 0: + if (gUnknown_02024A64 & gBitTable[r4]) + return; + memcpy(gUnknown_02023A60[r4], &EWRAM_15000[gTasks[taskId].data[15] + 8], r7); + sub_80155A4(r4); + if (!(gBattleTypeFlags & 4)) + { + gUnknown_02024C07 = EWRAM_15000[gTasks[taskId].data[15] + 2]; + gUnknown_02024C08 = EWRAM_15000[gTasks[taskId].data[15] + 3]; + gUnknown_02024C0C = EWRAM_15000[gTasks[taskId].data[15] + 6]; + gUnknown_02024C0A = EWRAM_15000[gTasks[taskId].data[15] + 7]; + } + break; + case 1: + memcpy(gUnknown_02024260[r4], &EWRAM_15000[gTasks[taskId].data[15] + 8], r7); + break; + case 2: + r2 = EWRAM_15000[gTasks[taskId].data[15] + 8]; + gUnknown_02024A64 &= ~(gBitTable[r4] << (r2 * 4)); + break; + } + gTasks[taskId].data[15] = gTasks[taskId].data[15] + r7 + 8; + } +} +*/
\ No newline at end of file |