diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/random.c | 6 | ||||
-rw-r--r-- | src/trade.c | 571 |
2 files changed, 573 insertions, 4 deletions
diff --git a/src/random.c b/src/random.c index 54dae0824..f6c49971d 100644 --- a/src/random.c +++ b/src/random.c @@ -8,11 +8,11 @@ u32 gRngValue; u16 Random(void) { - gRngValue = 1103515245 * gRngValue + 24691; - return gRngValue >> 16; + gRngValue = 1103515245 * gRngValue + 24691; + return gRngValue >> 16; } void SeedRng(u16 seed) { - gRngValue = seed; + gRngValue = seed; } diff --git a/src/trade.c b/src/trade.c index 42c2792ff..7c77556db 100644 --- a/src/trade.c +++ b/src/trade.c @@ -16,6 +16,9 @@ #include "data.h" #include "sound.h" #include "string_util.h" +#include "strings.h" +#include "menu.h" +#include "overworld.h" #include "party_menu.h" #include "pokemon_summary_screen.h" #include "pokemon_storage_system.h" @@ -79,12 +82,16 @@ void sub_804D4F8(void); void sub_804D638(void); void sub_804D694(u8 state); void sub_804D764(void); +u8 shedinja_maker_maybe(void); void sub_804DFF0(void); void sub_804E9E4(void); +void sub_804EAAC(u8 a0); void sub_804EAE4(u8 side); -u8 shedinja_maker_maybe(void); void sub_804F020(u8 side); void sub_804F284(u8 side); +void sub_804F3B4(void); +void sub_804F3C8(u8 a0); +void sub_804F488(u16 a0, u8 a1); void sub_804F4DC(void); void sub_804F5BC(u8 str_idx); bool8 sub_804F610(void); @@ -93,6 +100,7 @@ void sub_804F748(u8 side); void sub_804F890(u8 side); void sub_804F964(void); void sub_804F9D8(void); +u32 sub_804FA14(struct Pokemon * party, u8 partyCount, u8 cursorPos); void LoadHeldItemIcons(void); void sub_8050138(void); @@ -106,6 +114,7 @@ extern const u8 gTradeUnknownSpriteCoords[][4]; extern const struct SpriteTemplate gUnknown_8261CB0; extern const struct SpriteTemplate gUnknown_8261CC8; extern const u8 gJPText_Shedinja[]; +extern const u8 gUnknown_8261D08[][4][6]; void sub_804C600(void) { @@ -2513,3 +2522,563 @@ bool8 shedinja_maker_maybe(void) } return FALSE; } + +void sub_804DBAC(void) +{ + sub_804F728(gUnknown_841E0A5, (u8 *)OBJ_VRAM0 + gUnknown_2031DA8->unk_72 * 32, 0x18); +} + +void sub_804DBD4(u8 a0, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xEEAA: + gUnknown_2031DA8->unk_78 = 2; + break; + case 0xAABB: + gUnknown_2031DA8->unk_78 = 1; + break; + case 0xBBBB: + gUnknown_2031DA8->unk_7A = 1; + break; + case 0xBBCC: + gUnknown_2031DA8->unk_7A = 2; + break; + } + ResetBlockReceivedFlag(0); + } + + if (a1 & 2) + { + switch (gBlockRecvBuffer[1][0]) + { + case 0xEEAA: + gUnknown_2031DA8->unk_79 = 2; + break; + case 0xAABB: + gUnknown_2031DA8->unk_7E = gBlockRecvBuffer[1][1] + 6; + gUnknown_2031DA8->unk_79 = 1; + break; + case 0xBBBB: + gUnknown_2031DA8->unk_7B = 1; + break; + case 0xBBCC: + gUnknown_2031DA8->unk_7B = 2; + break; + } + ResetBlockReceivedFlag(1); + } +} + +void sub_804DCF4(u8 a0, u8 a1) +{ + if (a1 & 1) + { + switch (gBlockRecvBuffer[0][0]) + { + case 0xEEBB: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + sub_804F5BC(4); + gUnknown_2031DA8->unk_6F = 11; + break; + case 0xEECC: + sub_804F5BC(5); + gUnknown_2031DA8->unk_6F = 8; + break; + case 0xDDDD: + gUnknown_2031DA8->unk_7E = gBlockRecvBuffer[0][1] + 6; + rbox_fill_rectangle(0); + sub_804EAAC(gUnknown_2031DA8->tradeMenuCursorPosition); + sub_804EAAC(gUnknown_2031DA8->unk_7E); + gUnknown_2031DA8->unk_6F = 7; + break; + case 0xCCDD: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_2031DA8->unk_6F = 10; + break; + case 0xDDEE: + sub_804F5BC(1); + gUnknown_2031DA8->unk_6F = 8; + } + ResetBlockReceivedFlag(0); + } + + if (a1 & 2) + ResetBlockReceivedFlag(1); +} + +void sub_804DDF0(void) +{ + if (gUnknown_2031DA8->unk_78 && gUnknown_2031DA8->unk_79) + { + if (gUnknown_2031DA8->unk_78 == 1 && gUnknown_2031DA8->unk_79 == 1) + { + gUnknown_2031DA8->unk_6F = 6; + gUnknown_2031DA8->linkData[0] = 0xDDDD; + gUnknown_2031DA8->linkData[1] = gUnknown_2031DA8->tradeMenuCursorPosition; + sub_804F488(5, 0); + gUnknown_2031DA8->unk_78 = gUnknown_2031DA8->unk_79 = 0; + } + else if (gUnknown_2031DA8->unk_78 == 1 && gUnknown_2031DA8->unk_79 == 2) + { + sub_804F5BC(1); + gUnknown_2031DA8->linkData[0] = 0xEECC; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + gUnknown_2031DA8->unk_7A = gUnknown_2031DA8->unk_7B = 0; + gUnknown_2031DA8->unk_78 = gUnknown_2031DA8->unk_79 = 0; + gUnknown_2031DA8->unk_6F = 8; + } + else if (gUnknown_2031DA8->unk_78 == 2 && gUnknown_2031DA8->unk_79 == 1) + { + sub_804F5BC(5); + gUnknown_2031DA8->linkData[0] = 0xDDEE; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + gUnknown_2031DA8->unk_7A = gUnknown_2031DA8->unk_7B = 0; + gUnknown_2031DA8->unk_78 = gUnknown_2031DA8->unk_79 = 0; + gUnknown_2031DA8->unk_6F = 8; + } + else if (gUnknown_2031DA8->unk_78 == 2 && gUnknown_2031DA8->unk_79 == 2) + { + gUnknown_2031DA8->linkData[0] = 0xEEBB; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_2031DA8->unk_78 = gUnknown_2031DA8->unk_79 = 0; + gUnknown_2031DA8->unk_6F = 11; + } + } + + if (gUnknown_2031DA8->unk_7A && gUnknown_2031DA8->unk_7B) + { + if (gUnknown_2031DA8->unk_7A == 1 && gUnknown_2031DA8->unk_7B == 1) + { + gUnknown_2031DA8->linkData[0] = 0xCCDD; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + gUnknown_2031DA8->unk_7A = 0; + gUnknown_2031DA8->unk_7B = 0; + gUnknown_2031DA8->unk_6F = 9; + } + + if (gUnknown_2031DA8->unk_7A == 2 || gUnknown_2031DA8->unk_7B == 2) + { + sub_804F5BC(1); + gUnknown_2031DA8->linkData[0] = 0xDDEE; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + gUnknown_2031DA8->unk_7A = 0; + gUnknown_2031DA8->unk_7B = 0; + gUnknown_2031DA8->unk_6F = 8; + } + } +} + +void sub_804DFF0(void) +{ + u8 mpId = GetMultiplayerId(); + u8 status; + if ((status = GetBlockReceivedStatus())) + { + if (mpId == 0) + sub_804DBD4(0, status); + else + sub_804DCF4(mpId, status); + } + if (mpId == 0) + sub_804DDF0(); +} + +u8 sub_804E028(u8 oldPosition, u8 direction) +{ + int i; + u8 newPosition = 0; + + for (i = 0; i < PARTY_SIZE; i++) + { + if (gUnknown_2031DA8->tradeMenuOptionsActive[gUnknown_8261D08[oldPosition][direction][i]] == TRUE) + { + newPosition = gUnknown_8261D08[oldPosition][direction][i]; + break; + } + } + + return newPosition; +} + + +void TradeMenuMoveCursor(u8 *tradeMenuCursorPosition, u8 direction) +{ + u8 newPosition = sub_804E028(*tradeMenuCursorPosition, direction); + + if (newPosition == 12) // CANCEL + { + StartSpriteAnim(&gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx], 1); + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].pos1.x = 224; + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].pos1.y = 160; + } + else + { + StartSpriteAnim(&gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx], 0); + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].pos1.x = gTradeMonSpriteCoords[newPosition][0] * 8 + 32; + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].pos1.y = gTradeMonSpriteCoords[newPosition][1] * 8; + } + + if (*tradeMenuCursorPosition != newPosition) + { + PlaySE(SE_SELECT); + } + + *tradeMenuCursorPosition = newPosition; +} + +void sub_804E134(void) +{ + sub_804F5BC(0); + gUnknown_2031DA8->unk_6F = 5; + + if (GetMultiplayerId() == 1) + { + gUnknown_2031DA8->linkData[0] = 0xAABB; + gUnknown_2031DA8->linkData[1] = gUnknown_2031DA8->tradeMenuCursorPosition; + SendBlock(bitmask_all_link_players_but_self(), gUnknown_2031DA8->linkData, 0x14); + } + else + { + gUnknown_2031DA8->unk_78 = 1; + } +} + +extern const struct MenuAction gUnknown_8261EE4[]; +extern const struct WindowTemplate gUnknown_8261FC4; + +void sub_804E194(void) +{ + int i; + + if (JOY_REPT(DPAD_UP)) + { + TradeMenuMoveCursor(&gUnknown_2031DA8->tradeMenuCursorPosition, 0); + } + else if (JOY_REPT(DPAD_DOWN)) + { + TradeMenuMoveCursor(&gUnknown_2031DA8->tradeMenuCursorPosition, 1); + } + else if (JOY_REPT(DPAD_LEFT)) + { + TradeMenuMoveCursor(&gUnknown_2031DA8->tradeMenuCursorPosition, 2); + } + else if (JOY_REPT(DPAD_RIGHT)) + { + TradeMenuMoveCursor(&gUnknown_2031DA8->tradeMenuCursorPosition, 3); + } + + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + + if (gUnknown_2031DA8->tradeMenuCursorPosition < 6) // PlayerParty + { + DrawTextBorderOuter(1, 1, 14); + FillWindowPixelBuffer(1, PIXEL_FILL(1)); + UnionRoomAndTradeMenuPrintOptions(1, 3, 16, 2, gUnknown_8261EE4); + Menu_InitCursor(1, 3, 0, 0, 16, 2, 0); + PutWindowTilemap(1); + CopyWindowToVram(1, 3); + gUnknown_2031DA8->unk_6F = 1; + } + else if (gUnknown_2031DA8->tradeMenuCursorPosition < 12) + { + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_2031DA8->unk_6F = 2; + } + else if (gUnknown_2031DA8->tradeMenuCursorPosition == 12) + { + CreateYesNoMenu(&gUnknown_8261FC4, 3, 0, 2, 0x001, 14, 0); + gUnknown_2031DA8->unk_6F = 4; + sub_804F728(gUnknown_8261ECC[4], (void *)OBJ_VRAM0 + gUnknown_2031DA8->unk_72 * 32, 24); + } + } + if (JOY_NEW(R_BUTTON)) + { + for (i = 0; i < 10; i++) + gUnknown_2031DA8->linkData[i] = i; + SendBlock(bitmask_all_link_players_but_self(), gUnknown_2031DA8->linkData, 20); + } +} + +void sub_804E330(void) +{ + sub_804F3B4(); + gUnknown_2031DA8->unk_6F = 0; + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].invisible = FALSE; + sub_804F728(gUnknown_8261ECC[1], (void *)OBJ_VRAM0 + gUnknown_2031DA8->unk_72 * 32, 24); +} + +void sub_804E388(void) +{ + switch (Menu_ProcessInputNoWrapAround()) + { + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + sub_804E330(); + break; + case MENU_NOTHING_CHOSEN: + break; + case 0: + BeginNormalPaletteFade(0xFFFFFFFF, 0, 0, 16, RGB_BLACK); + gUnknown_2031DA8->unk_6F = 2; + break; + case 1: + switch (sub_804FA14(gPlayerParty, gPlayerPartyCount, gUnknown_2031DA8->tradeMenuCursorPosition)) + { + case 0: + sub_804E134(); + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].invisible = TRUE; + break; + case 1: + sub_804F488(3, 3); + gUnknown_2031DA8->unk_6F = 8; + break; + case 2: + case 4: + sub_804F488(3, 6); + gUnknown_2031DA8->unk_6F = 8; + break; + case 3: + case 5: + sub_804F488(3, 7); + gUnknown_2031DA8->unk_6F = 8; + break; + } + break; + } +} + +void sub_804E46C(void) +{ + if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + sub_804E330(); + } +} + +void sub_804E494(void) +{ + if (!gPaletteFade.active) + { + if (gUnknown_2031DA8->tradeMenuCursorPosition < 6) + ShowPokemonSummaryScreen(gPlayerParty, gUnknown_2031DA8->tradeMenuCursorPosition, gUnknown_2031DA8->partyCounts[0] - 1, sub_804CF14, 4); + else + ShowPokemonSummaryScreen(gEnemyParty, gUnknown_2031DA8->tradeMenuCursorPosition - 6, gUnknown_2031DA8->partyCounts[1] - 1, sub_804CF14, 4); + FreeAllWindowBuffers(); + } +} + +u8 sub_804E50C(u8 *a0, u8 a1, u8 a2) +{ + s32 i; + u16 species; + u8 r4 = 0; + for (i = 0; i < a1; i++) + { + if (a2 != i) + r4 += a0[i]; + } + species = GetMonData(&gEnemyParty[gUnknown_2031DA8->unk_7E % 6], MON_DATA_SPECIES); + if ((species == SPECIES_DEOXYS || species == SPECIES_MEW) && !GetMonData(&gEnemyParty[gUnknown_2031DA8->unk_7E % 6], MON_DATA_OBEDIENCE)) + return 2; + if (r4 != 0) + r4 = 1; + return r4; +} + +void sub_804E5A0(void) +{ + int i; + u8 arr[12]; + + for (i = 0; i < gUnknown_2031DA8->partyCounts[0]; i++) + { + arr[i] = gUnknown_2031DA8->unk_45[0][i]; + } + + switch (sub_804E50C(arr, gUnknown_2031DA8->partyCounts[0], gUnknown_2031DA8->tradeMenuCursorPosition)) + { + case 0: + sub_804F488(3, 3); + gUnknown_2031DA8->linkData[0] = 0xBBCC; + sub_804F488(0xB4, 0); + break; + case 1: + sub_804F488(3, 1); + gUnknown_2031DA8->linkData[0] = 0xBBBB; + if (IsLinkTaskFinished()) + { + SendBlock(bitmask_all_link_players_but_self(), gUnknown_2031DA8->linkData, 20); + } + break; + case 2: + sub_804F488(3, 8); + gUnknown_2031DA8->linkData[0] = 0xBBCC; + sub_804F488(0xB4, 0); + break; + } +} + +void sub_804E674(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + sub_804E5A0(); + gUnknown_2031DA8->unk_6F = 100; + PutWindowTilemap(17); + break; + case 1: + case MENU_B_PRESSED: + sub_804F488(3, 1); + if (IsLinkTaskFinished()) + { + gUnknown_2031DA8->linkData[0] = 0xBBCC; + SendBlock(bitmask_all_link_players_but_self(), gUnknown_2031DA8->linkData, 20); + } + gUnknown_2031DA8->unk_6F = 100; + PutWindowTilemap(17); + break; + } +} + +void sub_804E6FC(void) +{ + int i; + + for (i = 0; i < gUnknown_2031DA8->partyCounts[1] - 4; i++) + { + PutWindowTilemap(i + 12); + CopyWindowToVram(i + 12, 1); + } +} + +void sub_804E744(void) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case 0: + sub_804F5BC(4); + gUnknown_2031DA8->linkData[0] = 0xEEAA; + gUnknown_2031DA8->linkData[1] = 0; + sub_804F488(5, 0); + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].invisible = TRUE; + gUnknown_2031DA8->unk_6F = 100; + sub_804E6FC(); + break; + case 1: + case MENU_B_PRESSED: + PlaySE(SE_SELECT); + sub_804E330(); + break; + } +} + +void sub_804E7C8(void) +{ + if (GetMultiplayerId() == 0) + { + rbox_fill_rectangle(0); + sub_804EAAC(gUnknown_2031DA8->tradeMenuCursorPosition); + sub_804EAAC(gUnknown_2031DA8->unk_7E); + } + gUnknown_2031DA8->unk_6F = 7; +} + +void sub_804E804(void) +{ + if (gUnknown_2031DA8->unk_74[0] == 5 && gUnknown_2031DA8->unk_74[1] == 5) + { + sub_804DBAC(); + gUnknown_2031DA8->unk_6F = 14; + } +} + +void sub_804E830(void) +{ + gUnknown_2031DA8->unk_A8++; + + if (gUnknown_2031DA8->unk_A8 > 120) + { + CreateYesNoMenu(&gUnknown_8261FC4, 3, 0, 2, 1, 14, 0); + gUnknown_2031DA8->unk_A8 = 0; + gUnknown_2031DA8->unk_6F = 3; + } +} + +void sub_804E880(void) +{ + int i; + + if (gMain.newKeys & A_BUTTON) + { + PlaySE(SE_SELECT); + rbox_fill_rectangle(0); + rbox_fill_rectangle(1); + + for (i = 0; i < 4; i++) + { + FillWindowPixelBuffer(i + 14, PIXEL_FILL(0)); + rbox_fill_rectangle(i + 14); + } + + sub_804F3C8(0); + sub_804F3C8(1); + gUnknown_2031DA8->unk_6F = 0; + gSprites[gUnknown_2031DA8->tradeMenuCursorSpriteIdx].invisible = FALSE; + } +} + +void sub_804E908(void) +{ + if (!gPaletteFade.active) + { + if (gWirelessCommType) + { + sub_800AB9C(); + } + else + { + sub_800AA80(12); + } + + gUnknown_2031DA8->unk_6F = 12; + } +} + +void sub_804E944(void) +{ + if (gWirelessCommType) + { + if (IsLinkTaskFinished()) + { + Free(gUnknown_2031C90); + Free(gUnknown_2031DA8); + FreeAllWindowBuffers(); + DestroyWirelessStatusIndicatorSprite(); + SetMainCallback2(c2_8056854); + } + } + else + { + if (!gReceivedRemoteLinkPlayers) + { + Free(gUnknown_2031C90); + Free(gUnknown_2031DA8); + FreeAllWindowBuffers(); + SetMainCallback2(c2_8056854); + } + } +} + |