summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/battle_anim_80A5C6C.c1
-rw-r--r--src/battle_anim_80A9C70.c2
-rw-r--r--src/battle_controllers.c2
-rw-r--r--src/battle_dome.c4
-rw-r--r--src/battle_factory.c2
-rw-r--r--src/battle_gfx_sfx_util.c1
-rw-r--r--src/battle_transition.c2
-rw-r--r--src/blend_palette.c19
-rw-r--r--src/cable_club.c1299
-rw-r--r--src/contest.c1
-rw-r--r--src/evolution_scene.c2
-rwxr-xr-xsrc/field_message_box.c2
-rw-r--r--src/hall_of_fame.c2
-rw-r--r--src/intro.c2
-rw-r--r--src/mystery_event_menu.c2
-rw-r--r--src/palette.c2
-rw-r--r--src/pokeblock_feed.c2
-rw-r--r--src/pokemon_animation.c2
-rw-r--r--src/rom_8011DC0.c4
-rw-r--r--src/start_menu.c4
-rw-r--r--src/string_util.c104
-rw-r--r--src/text.c68
-rw-r--r--src/tileset_anims.c2
-rw-r--r--src/util.c18
24 files changed, 1422 insertions, 127 deletions
diff --git a/src/battle_anim_80A5C6C.c b/src/battle_anim_80A5C6C.c
index f4a4946c3..a461d3d1d 100644
--- a/src/battle_anim_80A5C6C.c
+++ b/src/battle_anim_80A5C6C.c
@@ -3,7 +3,6 @@
#include "constants/species.h"
#include "battle.h"
#include "battle_anim.h"
-#include "blend_palette.h"
#include "contest.h"
#include "data2.h"
#include "decompress.h"
diff --git a/src/battle_anim_80A9C70.c b/src/battle_anim_80A9C70.c
index 1f8a53993..9b9218b1c 100644
--- a/src/battle_anim_80A9C70.c
+++ b/src/battle_anim_80A9C70.c
@@ -3,7 +3,7 @@
#include "battle_anim.h"
#include "constants/battle_anim.h"
#include "constants/rgb.h"
-#include "blend_palette.h"
+#include "util.h"
#include "decompress.h"
#include "palette.h"
#include "sprite.h"
diff --git a/src/battle_controllers.c b/src/battle_controllers.c
index 63154ae8b..56ff34528 100644
--- a/src/battle_controllers.c
+++ b/src/battle_controllers.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "battle.h"
#include "battle_controllers.h"
+#include "cable_club.h"
#include "link.h"
#include "task.h"
#include "battle_ai_script_commands.h"
@@ -18,7 +19,6 @@ extern u8 gUnknown_02022D0A;
static EWRAM_DATA u8 sBattleBuffersTransferData[0x100] = {};
-extern void task00_08081A90(u8 taskId); // cable_club
extern void sub_81B8D64(u8 battlerId, u8 arg1); // party_menu
// this file's funcionts
diff --git a/src/battle_dome.c b/src/battle_dome.c
index 82384b43a..8de1c058c 100644
--- a/src/battle_dome.c
+++ b/src/battle_dome.c
@@ -68,7 +68,7 @@ extern bool8 sub_81A3610(void);
extern u16 sub_81A4FF0(u8);
extern u8 GetFrontierTrainerFrontSpriteId(u16);
extern u8 GetFrontierOpponentClass(u16);
-extern void sub_80F94E8(void);
+extern void ReducePlayerPartyToThree(void);
extern u8 gUnknown_0203CEF8[];
extern u16 gBattle_BG0_X;
@@ -6132,7 +6132,7 @@ static void sub_8194E44(void)
static void sub_8194EB4(void)
{
- sub_80F94E8();
+ ReducePlayerPartyToThree();
}
static void sub_8194EC0(void)
diff --git a/src/battle_factory.c b/src/battle_factory.c
index 36c5ed2e8..2c8ab1052 100644
--- a/src/battle_factory.c
+++ b/src/battle_factory.c
@@ -20,7 +20,7 @@
#include "pokemon_summary_screen.h"
#include "sound.h"
#include "pokedex.h"
-#include "blend_palette.h"
+#include "util.h"
#include "trainer_pokemon_sprites.h"
#include "constants/battle_frontier.h"
#include "constants/songs.h"
diff --git a/src/battle_gfx_sfx_util.c b/src/battle_gfx_sfx_util.c
index 80e1574a4..05958395d 100644
--- a/src/battle_gfx_sfx_util.c
+++ b/src/battle_gfx_sfx_util.c
@@ -19,7 +19,6 @@
#include "decompress.h"
#include "data2.h"
#include "palette.h"
-#include "blend_palette.h"
#include "contest.h"
#include "constants/songs.h"
#include "constants/rgb.h"
diff --git a/src/battle_transition.c b/src/battle_transition.c
index d1d92cb50..fc8c0eeee 100644
--- a/src/battle_transition.c
+++ b/src/battle_transition.c
@@ -19,7 +19,7 @@
#include "gpu_regs.h"
#include "decompress.h"
#include "bg.h"
-#include "blend_palette.h"
+#include "util.h"
struct TransitionData
{
diff --git a/src/blend_palette.c b/src/blend_palette.c
deleted file mode 100644
index c9503388f..000000000
--- a/src/blend_palette.c
+++ /dev/null
@@ -1,19 +0,0 @@
-#include "global.h"
-#include "palette.h"
-
-void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor)
-{
- u16 i;
- for (i = 0; i < numEntries; i++)
- {
- u16 index = i + palOffset;
- struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index];
- s8 r = data1->r;
- s8 g = data1->g;
- s8 b = data1->b;
- struct PlttData *data2 = (struct PlttData *)&blendColor;
- gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0)
- | ((g + (((data2->g - g) * coeff) >> 4)) << 5)
- | ((b + (((data2->b - b) * coeff) >> 4)) << 10);
- }
-}
diff --git a/src/cable_club.c b/src/cable_club.c
new file mode 100644
index 000000000..c54df5f24
--- /dev/null
+++ b/src/cable_club.c
@@ -0,0 +1,1299 @@
+#include "global.h"
+#include "main.h"
+#include "battle.h"
+#include "battle_records.h"
+#include "battle_setup.h"
+#include "cable_club.h"
+#include "data2.h"
+#include "event_data.h"
+#include "field_message_box.h"
+#include "field_specials.h"
+#include "field_weather.h"
+#include "international_string_util.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "load_save.h"
+#include "m4a.h"
+#include "menu.h"
+#include "overworld.h"
+#include "palette.h"
+#include "rom_8011DC0.h"
+#include "script.h"
+#include "script_pokemon_util_80F87D8.h"
+#include "sound.h"
+#include "start_menu.h"
+#include "string_util.h"
+#include "strings.h"
+#include "task.h"
+#include "trade.h"
+#include "trainer_card.h"
+#include "window.h"
+#include "constants/songs.h"
+
+extern u8 gUnknown_02032298[2];
+extern u8 gUnknown_0203CEF8[];
+
+static const struct WindowTemplate gUnknown_08550594 = {
+ .priority = 0,
+ .tilemapLeft = 16,
+ .tilemapTop = 11,
+ .width = 11,
+ .height = 2,
+ .paletteNum = 15,
+ .baseBlock = 0x0125,
+};
+static const u8 *const gTrainerCardColorNames[] = {
+ gText_BronzeCard,
+ gText_CopperCard,
+ gText_SilverCard,
+ gText_GoldCard
+};
+
+static void sub_80B2634(u8 taskId);
+static void sub_80B2688(u8 taskId);
+static void sub_80B270C(u8 taskId);
+static void sub_80B275C(u8 taskId);
+static void sub_80B2804(u8 taskId);
+static void sub_80B28A8(u8 taskId);
+static void sub_80B2918(u8 taskId);
+static void sub_80B2A08(u8 taskId);
+static void sub_80B2C30(u8 taskId);
+static void sub_80B2CB0(u8 taskId);
+static void sub_80B2CEC(u8 taskId);
+static void sub_80B2D2C(u8 taskId);
+static bool8 sub_80B2D6C(u8 taskId);
+static void sub_80B2EE4(u8 taskId);
+static void sub_80B3144(u8 taskId);
+static void sub_80B3194(u8 taskId);
+static void sub_80B31E8(u8 taskId);
+static void sub_80B3220(u8 taskId);
+
+static void sub_80B236C(u8 arg0, u8 arg1)
+{
+ if (FindTaskIdByFunc(sub_80B2634) == 0xFF)
+ {
+ u8 taskId1;
+
+ taskId1 = CreateTask(sub_80B2634, 80);
+ gTasks[taskId1].data[1] = arg0;
+ gTasks[taskId1].data[2] = arg1;
+ }
+}
+
+static void sub_80B23B0(u16 windowId, u32 value)
+{
+ u8 xPos;
+
+ ConvertIntToDecimalStringN(gStringVar1, value, STR_CONV_MODE_LEFT_ALIGN, 1);
+ SetStandardWindowBorderStyle(windowId, 0);
+ StringExpandPlaceholders(gStringVar4, gText_XPLink);
+ xPos = GetStringCenterAlignXOffset(1, gStringVar4, 88);
+ AddTextPrinterParameterized(windowId, 1, gStringVar4, xPos, 1, 0xFF, NULL);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void sub_80B241C(u16 windowId)
+{
+ sub_819746C(windowId, FALSE);
+ CopyWindowToVram(windowId, 3);
+}
+
+static void sub_80B243C(u8 taskId, u8 arg1)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (arg1 != data[3])
+ {
+ if (arg1 <= 1)
+ sub_80B241C(data[5]);
+ else
+ sub_80B23B0(data[5], arg1);
+ data[3] = arg1;
+ }
+}
+
+static u32 sub_80B2478(u8 lower, u8 upper)
+{
+ int playerCount;
+
+ switch (GetLinkPlayerDataExchangeStatusTimed(lower, upper))
+ {
+ case EXCHANGE_COMPLETE:
+ return 1;
+ case EXCHANGE_IN_PROGRESS:
+ return 3;
+ case EXCHANGE_STAT_4:
+ return 7;
+ case EXCHANGE_STAT_5:
+ return 9;
+ case EXCHANGE_STAT_6:
+ ConvertIntToDecimalStringN(gStringVar1, GetLinkPlayerCount_2(), STR_CONV_MODE_LEFT_ALIGN, 1);
+ return 4;
+ case EXCHANGE_STAT_7:
+ return 10;
+ case EXCHANGE_TIMED_OUT:
+ default:
+ return 0;
+ }
+}
+
+static bool32 sub_80B24F8(u8 taskId)
+{
+ if (HasLinkErrorOccurred() == TRUE)
+ {
+ gTasks[taskId].func = sub_80B2D2C;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_80B252C(u8 taskId)
+{
+ if ((gMain.newKeys & B_BUTTON)
+ && IsLinkConnectionEstablished() == FALSE)
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = sub_80B2CEC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_80B2578(u8 taskId)
+{
+ if (IsLinkConnectionEstablished())
+ SetSuppressLinkErrorMessage(TRUE);
+
+ if (gMain.newKeys & B_BUTTON)
+ {
+ gLinkType = 0;
+ gTasks[taskId].func = sub_80B2CEC;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static bool32 sub_80B25CC(u8 taskId)
+{
+ if (GetSioMultiSI() == 1)
+ {
+ gTasks[taskId].func = sub_80B2D2C;
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void sub_80B2600(u8 taskId)
+{
+ gTasks[taskId].data[0]++;
+ if (gTasks[taskId].data[0] == 10)
+ {
+ sub_800A4D8(2);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80B2634(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ OpenLinkTimed();
+ sub_800AB98();
+ ResetLinkPlayers();
+ data[5] = AddWindow(&gUnknown_08550594);
+ }
+ else if (data[0] > 9)
+ {
+ gTasks[taskId].func = sub_80B2688;
+ }
+ data[0]++;
+}
+
+static void sub_80B2688(u8 taskId)
+{
+ u32 playerCount = GetLinkPlayerCount_2();
+
+ if (sub_80B252C(taskId) == TRUE
+ || sub_80B2578(taskId) == TRUE
+ || playerCount < 2)
+ return;
+
+ SetSuppressLinkErrorMessage(TRUE);
+ gTasks[taskId].data[3] = 0;
+ if (IsLinkMaster() == TRUE)
+ {
+ PlaySE(SE_PIN);
+ ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
+ gTasks[taskId].func = sub_80B270C;
+ }
+ else
+ {
+ PlaySE(SE_BOO);
+ ShowFieldAutoScrollMessage(gText_AwaitingLinkup);
+ gTasks[taskId].func = sub_80B2918;
+ }
+}
+
+static void sub_80B270C(u8 taskId)
+{
+ if (sub_80B252C(taskId) == TRUE
+ || sub_80B25CC(taskId) == TRUE
+ || sub_80B24F8(taskId) == TRUE)
+ return;
+
+ if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
+ {
+ gTasks[taskId].data[3] = 0;
+ gTasks[taskId].func = sub_80B275C;
+ }
+}
+
+static void sub_80B275C(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+ s32 linkPlayerCount = GetLinkPlayerCount_2();
+
+ if (sub_80B252C(taskId) == TRUE
+ || sub_80B25CC(taskId) == TRUE
+ || sub_80B24F8(taskId) == TRUE)
+ return;
+
+ sub_80B243C(taskId, linkPlayerCount);
+
+ if (!(gMain.newKeys & A_BUTTON))
+ return;
+
+ if (linkPlayerCount < data[1])
+ return;
+
+ sub_800AA04(linkPlayerCount);
+ sub_80B241C(data[5]);
+ ConvertIntToDecimalStringN(gStringVar1, linkPlayerCount, STR_CONV_MODE_LEFT_ALIGN, 1);
+ ShowFieldAutoScrollMessage(gText_ConfirmStartLinkWithXPlayers);
+ gTasks[taskId].func = sub_80B2804;
+}
+
+static void sub_80B2804(u8 taskId)
+{
+ if (sub_80B252C(taskId) == TRUE
+ || sub_80B25CC(taskId) == TRUE
+ || sub_80B24F8(taskId) == TRUE)
+ return;
+
+ if (GetFieldMessageBoxMode() == FIELD_MESSAGE_BOX_HIDDEN)
+ {
+ if (sub_800AA48() != GetLinkPlayerCount_2())
+ {
+ ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
+ gTasks[taskId].func = sub_80B270C;
+ }
+ else if (gMain.heldKeys & B_BUTTON)
+ {
+ ShowFieldAutoScrollMessage(gText_ConfirmLinkWhenPlayersReady);
+ gTasks[taskId].func = sub_80B270C;
+ }
+ else if (gMain.heldKeys & A_BUTTON)
+ {
+ PlaySE(SE_SELECT);
+ sub_800A620();
+ gTasks[taskId].func = sub_80B28A8;
+ }
+ }
+}
+
+static void sub_80B28A8(u8 taskId)
+{
+ u8 local1 = gTasks[taskId].data[1];
+ u8 local2 = gTasks[taskId].data[2];
+
+ if (sub_80B24F8(taskId) == TRUE
+ || sub_80B2D6C(taskId) == TRUE)
+ return;
+
+ if (GetLinkPlayerCount_2() != sub_800AA48())
+ {
+ gTasks[taskId].func = sub_80B2D2C;
+ }
+ else
+ {
+ gSpecialVar_Result = sub_80B2478(local1, local2);
+ if (gSpecialVar_Result != 0)
+ gTasks[taskId].func = sub_80B2A08;
+ }
+}
+
+static void sub_80B2918(u8 taskId)
+{
+ u8 local1, local2;
+ struct TrainerCard *card;
+
+ local1 = gTasks[taskId].data[1];
+ local2 = gTasks[taskId].data[2];
+
+ if (sub_80B252C(taskId) == TRUE
+ || sub_80B24F8(taskId) == TRUE)
+ return;
+
+ gSpecialVar_Result = sub_80B2478(local1, local2);
+ if (gSpecialVar_Result == 0)
+ return;
+ if (gSpecialVar_Result == 3 || gSpecialVar_Result == 4)
+ {
+ sub_800AC34();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03005DB4 = GetMultiplayerId();
+ sub_800AA04(gFieldLinkPlayerCount);
+ card = (struct TrainerCard *)gBlockSendBuffer;
+ TrainerCard_GenerateCardForPlayer(card);
+ card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ gTasks[taskId].func = sub_80B2C30;
+ }
+}
+
+static void sub_80B2A08(u8 taskId)
+{
+ struct TrainerCard *card;
+
+ if (sub_80B24F8(taskId) == TRUE)
+ return;
+
+ if (gSpecialVar_Result == 4)
+ {
+ if (!Link_AnyPartnersPlayingRubyOrSapphire())
+ {
+ sub_800AC34();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ }
+ else if (gSpecialVar_Result == 3)
+ {
+ sub_800AC34();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else if (gSpecialVar_Result == 7 || gSpecialVar_Result == 9)
+ {
+ CloseLink();
+ HideFieldMessageBox();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else
+ {
+ gFieldLinkPlayerCount = GetLinkPlayerCount_2();
+ gUnknown_03005DB4 = GetMultiplayerId();
+ sub_800AA04(gFieldLinkPlayerCount);
+ card = (struct TrainerCard *)gBlockSendBuffer;
+ TrainerCard_GenerateCardForPlayer(card);
+ card->monSpecies[0] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[0] - 1], MON_DATA_SPECIES, NULL);
+ card->monSpecies[1] = GetMonData(&gPlayerParty[gUnknown_0203CEF8[1] - 1], MON_DATA_SPECIES, NULL);
+ gTasks[taskId].func = sub_80B2C30;
+ sub_800A4D8(2);
+ }
+}
+
+bool32 sub_80B2AF4(u16 *arg0, u16 *arg1)
+{
+ int i;
+ int j;
+ bool32 result = FALSE;
+ int k = 0;
+
+ gStringVar1[0] = EOS;
+ gStringVar2[0] = EOS;
+
+ for (i = 0; i < 2; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ if (arg0[i] == arg1[j])
+ {
+ if (k == 0)
+ {
+ StringCopy(gStringVar1, gSpeciesNames[arg0[i]]);
+ result = TRUE;
+ }
+
+ if (k == 1)
+ {
+ StringCopy(gStringVar2, gSpeciesNames[arg0[i]]);
+ result = TRUE;
+ }
+
+ k++;
+ }
+ }
+ }
+
+ gSpecialVar_0x8005 = k;
+
+ return result;
+}
+
+static void task_map_chg_seq_0807EC34(u16 *a0, u32 taskId)
+{
+ struct TrainerCard *trainerCards = gTrainerCards;
+
+ if (*a0 == 1)
+ {
+ if (gLinkType == 0x2266 || gLinkType == 0x2277)
+ {
+ if (sub_80B2AF4(trainerCards[0].monSpecies, trainerCards[1].monSpecies))
+ {
+ *a0 = 11;
+ sub_800AC34();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+ else
+ {
+ sub_80B241C(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ }
+ else
+ {
+ sub_80B241C(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ }
+ else
+ {
+ sub_800AC34();
+ gTasks[taskId].func = sub_80B2CB0;
+ }
+}
+
+static void sub_80B2C30(u8 taskId)
+{
+ u8 index;
+ struct TrainerCard *trainerCards;
+
+ if (sub_80B24F8(taskId) == TRUE)
+ return;
+
+ if (GetBlockReceivedStatus() != sub_800A9A8())
+ return;
+
+ for (index = 0; index < GetLinkPlayerCount(); index++)
+ {
+ sub_80C3120(&gTrainerCards[index], gBlockRecvBuffer[index], gLinkPlayers[index].version);
+ }
+
+ SetSuppressLinkErrorMessage(FALSE);
+ ResetBlockReceivedFlags();
+ task_map_chg_seq_0807EC34(&gSpecialVar_Result, taskId);
+}
+
+static void sub_80B2CB0(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ sub_80B241C(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ RemoveWindow(gTasks[taskId].data[5]);
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80B2CEC(u8 taskId)
+{
+ gSpecialVar_Result = 5;
+ sub_80B241C(gTasks[taskId].data[5]);
+ sub_8098374();
+ RemoveWindow(gTasks[taskId].data[5]);
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static void sub_80B2D2C(u8 taskId)
+{
+ gSpecialVar_Result = 6;
+ sub_80B241C(gTasks[taskId].data[5]);
+ RemoveWindow(gTasks[taskId].data[5]);
+ HideFieldMessageBox();
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+}
+
+static bool8 sub_80B2D6C(u8 taskId)
+{
+ gTasks[taskId].data[4]++;
+ if (gTasks[taskId].data[4] > 600)
+ {
+ gTasks[taskId].func = sub_80B2D2C;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+void sub_80B2DA4(u8 arg0)
+{
+ u8 r3 = 2;
+ u8 r2 = 2;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 1:
+ r3 = 2;
+ gLinkType = 0x2233;
+ break;
+ case 2:
+ r3 = 2;
+ gLinkType = 0x2244;
+ break;
+ case 5:
+ r3 = 4;
+ r2 = 4;
+ gLinkType = 0x2255;
+ break;
+ case 9:
+ r3 = 2;
+ if (gSaveBlock2Ptr->frontier.lvlMode == 0)
+ {
+ gLinkType = 0x2266;
+ }
+ else
+ {
+ gLinkType = 0x2277;
+ }
+ break;
+ }
+
+ sub_80B236C(r3, r2);
+}
+
+void sub_80B2E4C(void)
+{
+ gLinkType = 0x1133;
+ gBattleTypeFlags = 0;
+ sub_80B236C(2, 2);
+}
+
+void sub_80B2E74(void)
+{
+ gSpecialVar_Result = 0;
+ gLinkType = 0x3311;
+ gBattleTypeFlags = 0;
+ sub_80B236C(2, 4);
+}
+
+void sub_80B2EA8(void)
+{
+ u32 taskId = FindTaskIdByFunc(sub_80B2EE4);
+
+ if (taskId == 0xFF)
+ {
+ taskId = CreateTask(sub_80B2EE4, 80);
+ gTasks[taskId].data[0] = 0;
+ }
+}
+
+static void sub_80B2EE4(u8 taskId)
+{
+ int playerCount;
+ int i;
+
+ switch (gTasks[taskId].data[0])
+ {
+ case 0:
+ if (gSpecialVar_Result == 1)
+ {
+ bool32 unk = FALSE;
+ bool32 isEnglishRSLinked = FALSE;
+ bool32 isJapaneseEmeraldLinked = FALSE;
+
+ playerCount = GetLinkPlayerCount();
+ for (i = 0; i < playerCount; i++)
+ {
+ u32 version = (u8)gLinkPlayers[i].version;
+ u32 language = gLinkPlayers[i].language;
+
+ if (version == VERSION_RUBY || version == VERSION_SAPPHIRE)
+ {
+ if (language == LANGUAGE_JAPANESE)
+ {
+ unk = TRUE;
+ break;
+ }
+ else
+ {
+ isEnglishRSLinked = TRUE;
+ }
+ }
+ else if (version == VERSION_EMERALD)
+ {
+ if (language == LANGUAGE_JAPANESE)
+ {
+ isJapaneseEmeraldLinked = TRUE;
+ }
+ }
+ }
+
+ if (isEnglishRSLinked && isJapaneseEmeraldLinked)
+ {
+ unk = TRUE;
+ }
+
+ if (unk)
+ {
+ gSpecialVar_Result = 12;
+ sub_800AD10();
+ gTasks[taskId].data[0] = 1;
+ return;
+ }
+ }
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ break;
+ case 1:
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80B2FD8(void)
+{
+ gLinkType = 0x4411;
+ gBattleTypeFlags = 0;
+ sub_80B236C(2, 4);
+}
+
+void sub_80B3000(void)
+{
+ gLinkType = 0x6601;
+ gBattleTypeFlags = 0;
+ sub_80B236C(4, 4);
+}
+
+void sub_80B3028(void)
+{
+ gLinkType = 0x6602;
+ gBattleTypeFlags = 0;
+ sub_80B236C(2, 4);
+}
+
+u8 sub_80B3050(void)
+{
+ if (FuncIsActiveTask(sub_80B3144) != FALSE)
+ return 0xFF;
+
+ switch (gSpecialVar_0x8004)
+ {
+ case 1:
+ gLinkType = 0x2233;
+ break;
+ case 2:
+ gLinkType = 0x2244;
+ break;
+ case 5:
+ gLinkType = 0x2255;
+ break;
+ case 9:
+ if (gSaveBlock2Ptr->frontier.lvlMode == 0)
+ {
+ gLinkType = 0x2266;
+ }
+ else
+ {
+ gLinkType = 0x2277;
+ }
+ break;
+ case 3:
+ gLinkType = 0x1111;
+ break;
+ case 4:
+ gLinkType = 0x3322;
+ break;
+ }
+
+ return CreateTask(sub_80B3144, 80);
+}
+
+static void sub_80B3144(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ if (data[0] == 0)
+ {
+ OpenLink();
+ ResetLinkPlayers();
+ CreateTask(task00_08081A90, 80);
+ }
+ else if (data[0] >= 10)
+ {
+ gTasks[taskId].func = sub_80B3194;
+ }
+ data[0]++;
+}
+
+static void sub_80B3194(u8 taskId)
+{
+ if (GetLinkPlayerCount_2() >= 2)
+ {
+ if (IsLinkMaster() == TRUE)
+ gTasks[taskId].func = sub_80B31E8;
+ else
+ gTasks[taskId].func = sub_80B3220;
+ }
+}
+
+static void sub_80B31E8(u8 taskId)
+{
+ if (sub_800AA48() == GetLinkPlayerCount_2())
+ {
+ sub_800A620();
+ gTasks[taskId].func = sub_80B3220;
+ }
+}
+
+static void sub_80B3220(u8 taskId)
+{
+ if (gReceivedRemoteLinkPlayers == TRUE
+ && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ sub_800AB18();
+ sub_8009F18();
+ DestroyTask(taskId);
+ }
+}
+
+void sub_80B3254(void)
+{
+ SaveGame();
+}
+
+static void sub_80B3260(int a0)
+{
+ switch (a0)
+ {
+ case 1:
+ gBattleTypeFlags = BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
+ break;
+ case 2:
+ gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER;
+ break;
+ case 5:
+ ReducePlayerPartyToThree();
+ gBattleTypeFlags = BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
+ break;
+ case 9:
+ gBattleTypeFlags = BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_DOUBLE | BATTLE_TYPE_LINK | BATTLE_TYPE_TRAINER | BATTLE_TYPE_MULTI;
+ break;
+ }
+}
+
+static void sub_80B32B4(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ FadeScreen(1, 0);
+ gLinkType = 0x2211;
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ task->data[1]++;
+ if (task->data[1] > 20)
+ task->data[0]++;
+ break;
+ case 3:
+ sub_800AC34();
+ task->data[0]++;
+ break;
+ case 4:
+ if (!gReceivedRemoteLinkPlayers)
+ task->data[0]++;
+ break;
+ case 5:
+ if (gLinkPlayers[0].trainerId & 1)
+ PlayMapChosenOrBattleBGM(MUS_BATTLE32);
+ else
+ PlayMapChosenOrBattleBGM(MUS_BATTLE20);
+
+ sub_80B3260(gSpecialVar_0x8004);
+ overworld_free_bg_tilemaps();
+ gTrainerBattleOpponent_A = 0x800;
+ SetMainCallback2(CB2_InitBattle);
+ gMain.savedCallback = sub_80B360C;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_80B33BC(u8 taskId)
+{
+ int i;
+ s16* data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ FadeScreen(1, 0);
+ gLinkType = 0x2211;
+ ClearLinkCallback_2();
+ data[0] = 1;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ data[0] = 2;
+ break;
+ case 2:
+ SendBlock(0, &gLocalLinkPlayer, sizeof(gLocalLinkPlayer));
+ data[0] = 3;
+ break;
+ case 3:
+ if (GetBlockReceivedStatus() == sub_800A9D8())
+ {
+ for (i = 0; i < GetLinkPlayerCount(); i++)
+ {
+ struct LinkPlayer *player = (struct LinkPlayer *)gBlockRecvBuffer[i];
+ gLinkPlayers[i] = *player;
+ sub_800B524(&gLinkPlayers[i]);
+ ResetBlockReceivedFlag(i);
+ }
+ data[0] = 4;
+ }
+ break;
+ case 4:
+ data[1]++;
+ if (data[1] > 20)
+ data[0] = 5;
+ break;
+ case 5:
+ sub_800ADF8();
+ data[0] = 6;
+ break;
+ case 6:
+ if (sub_800A520())
+ {
+ data[0] = 7;
+ }
+ break;
+ case 7:
+ if (gLinkPlayers[0].trainerId & 1)
+ PlayMapChosenOrBattleBGM(MUS_BATTLE32);
+ else
+ PlayMapChosenOrBattleBGM(MUS_BATTLE20);
+
+ gLinkPlayers[0].linkType = 0x2211;
+ sub_80B3260(gSpecialVar_0x8004);
+ overworld_free_bg_tilemaps();
+ gTrainerBattleOpponent_A = 0x800;
+ SetMainCallback2(CB2_InitBattle);
+ gMain.savedCallback = sub_80B360C;
+ DestroyTask(taskId);
+ break;
+ }
+}
+
+static void sub_80B3554(void)
+{
+ u8 playerCount;
+ int i;
+ bool32 r4;
+
+ switch (gMain.state)
+ {
+ case 0:
+ playerCount = GetLinkPlayerCount();
+ r4 = FALSE;
+ for (i = 0; i < playerCount; i++)
+ {
+ u32 version = (u8)gLinkPlayers[i].version;
+ if (version == VERSION_FIRE_RED || version == VERSION_LEAF_GREEN)
+ {
+ r4 = TRUE;
+ break;
+ }
+ }
+
+ if (r4)
+ {
+ gMain.state = 2;
+ }
+ else
+ {
+ sub_800AC34();
+ gMain.state = 1;
+ }
+ break;
+ case 1:
+ if (gReceivedRemoteLinkPlayers == FALSE)
+ {
+ SetMainCallback2(CB2_ReturnToField);
+ }
+ break;
+ case 2:
+ SetMainCallback2(CB2_ReturnToField);
+ break;
+ }
+ RunTasks();
+}
+
+void sub_80B360C(void)
+{
+ gBattleTypeFlags &= ~BATTLE_TYPE_20;
+ Overworld_ResetMapMusic();
+ LoadPlayerParty();
+ SavePlayerBag();
+ sub_813BF10();
+
+ if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2)
+ {
+ UpdatePlayerLinkBattleRecords(gUnknown_03005DB4 ^ 1);
+ if (gWirelessCommType)
+ {
+ switch (gBattleOutcome)
+ {
+ case B_OUTCOME_WON:
+ sub_801B990(0, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
+ case B_OUTCOME_LOST:
+ sub_801B990(1, gLinkPlayers[GetMultiplayerId() ^ 1].trainerId);
+ break;
+ }
+ }
+ }
+
+ if (InUnionRoom() == TRUE)
+ {
+ gMain.savedCallback = sub_80B3554;
+ }
+ else
+ {
+ gMain.savedCallback = c2_8056854;
+ }
+
+ SetMainCallback2(sub_80A0514);
+}
+
+void sub_80B36EC(void)
+{
+ if (gSpecialVar_0x8004 == 1 || gSpecialVar_0x8004 == 2 || gSpecialVar_0x8004 == 5 || gSpecialVar_0x8004 == 9)
+ {
+ LoadPlayerParty();
+ SavePlayerBag();
+ }
+ copy_saved_warp2_bank_and_enter_x_to_warp1(0x7F);
+}
+
+void sub_80B371C(void)
+{
+ sub_80872B0();
+}
+
+static void sub_80B3728(u8 taskId)
+{
+ struct Task* task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ ShowFieldMessage(gText_PleaseWaitForLink);
+ task->data[0] = 1;
+ break;
+ case 1:
+ if (IsFieldMessageBoxHidden())
+ {
+ sub_8087288();
+ sub_8009628(gSpecialVar_0x8005);
+ task->data[0] = 2;
+ }
+ break;
+ case 2:
+ switch (sub_8087214())
+ {
+ case 0:
+ break;
+ case 1:
+ HideFieldMessageBox();
+ task->data[0] = 0;
+ sub_80872C4();
+ SwitchTaskToFollowupFunc(taskId);
+ break;
+ case 2:
+ task->data[0] = 3;
+ break;
+ }
+ break;
+ case 3:
+ sub_808729C();
+ sub_8197AE8(TRUE);
+ DestroyTask(taskId);
+ EnableBothScriptContexts();
+ break;
+ }
+}
+
+void sub_80B37D4(TaskFunc followupFunc)
+{
+ u8 taskId = CreateTask(sub_80B3728, 80);
+ SetTaskFuncWithFollowupFunc(taskId, sub_80B3728, followupFunc);
+ ScriptContext1_Stop();
+}
+
+static void sub_80B37FC(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ switch (task->data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ FadeScreen(1, 0);
+ ClearLinkCallback_2();
+ task->data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ task->data[0]++;
+ break;
+ case 2:
+ gUnknown_02032298[0] = 0;
+ gUnknown_02032298[1] = 0;
+ m4aMPlayAllStop();
+ sub_800AC34();
+ task->data[0]++;
+ break;
+ case 3:
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ SetMainCallback2(sub_80773AC);
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+static void sub_80B3894(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ ScriptContext2_Enable();
+ FadeScreen(1, 0);
+ Rfu_set_zero();
+ data[0]++;
+ break;
+ case 1:
+ if (!gPaletteFade.active)
+ data[0]++;
+ break;
+ case 2:
+ gUnknown_02032298[0] = 0;
+ gUnknown_02032298[1] = 0;
+ m4aMPlayAllStop();
+ sub_800ADF8();
+ data[0]++;
+ break;
+ case 3:
+ if (sub_800A520())
+ {
+ sub_8013F78();
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80B3924(void)
+{
+ if (gWirelessCommType != 0)
+ {
+ sub_80B37D4(sub_80B3894);
+ }
+ else
+ {
+ sub_80B37D4(sub_80B37FC);
+ }
+}
+
+static void sub_80B3950(void)
+{
+ CreateTask(sub_80B37FC, 80);
+}
+
+void nullsub_37(void)
+{
+
+}
+
+void sub_80B3968(void)
+{
+ gLinkType = 0x2211;
+
+ if (gWirelessCommType != 0)
+ {
+ sub_80B37D4(sub_80B33BC);
+ }
+ else
+ {
+ sub_80B37D4(sub_80B32B4);
+ }
+}
+
+static void sub_80B39A4(void)
+{
+ u8 taskId = CreateTask(sub_80B3728, 80);
+ ScriptContext1_Stop();
+}
+
+void sp02A_crash_sound(void)
+{
+ TrainerCard_ShowLinkCard(gSpecialVar_0x8006, CB2_ReturnToFieldContinueScriptPlayMapMusic);
+}
+
+bool32 sub_80B39D4(u8 linkPlayerIndex)
+{
+ u32 trainerCardColorIndex;
+
+ gSpecialVar_0x8006 = linkPlayerIndex;
+ StringCopy(gStringVar1, gLinkPlayers[linkPlayerIndex].name);
+
+ trainerCardColorIndex = sub_80C4904(linkPlayerIndex);
+ if (trainerCardColorIndex == 0)
+ return FALSE;
+
+ StringCopy(gStringVar2, gTrainerCardColorNames[trainerCardColorIndex - 1]);
+ return TRUE;
+}
+
+void task00_08081A90(u8 taskId)
+{
+ struct Task *task = &gTasks[taskId];
+
+ task->data[0]++;
+ if (task->data[0] > 300)
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ DestroyTask(taskId);
+ }
+
+ if (gReceivedRemoteLinkPlayers)
+ {
+ if (gWirelessCommType == 0)
+ {
+ if (!sub_800AA60())
+ {
+ CloseLink();
+ SetMainCallback2(CB2_LinkError);
+ }
+ DestroyTask(taskId);
+ }
+ else
+ {
+ DestroyTask(taskId);
+ }
+ }
+}
+
+static void sub_80B3AAC(u8 taskId)
+{
+ if (!gReceivedRemoteLinkPlayers)
+ {
+ EnableBothScriptContexts();
+ DestroyTask(taskId);
+ }
+}
+
+static void sub_80B3AD0(u8 taskId)
+{
+ sub_800AC34();
+ gTasks[taskId].func = sub_80B3AAC;
+}
+
+void sub_80B3AF8(u8 taskId)
+{
+ s16 *data = gTasks[taskId].data;
+
+ switch (data[0])
+ {
+ case 0:
+ if (gWirelessCommType != 0)
+ {
+ DestroyTask(taskId);
+ }
+ else
+ {
+ OpenLink();
+ CreateTask(task00_08081A90, 1);
+ data[0]++;
+ }
+ break;
+ case 1:
+ if (++data[1] > 11)
+ {
+ data[1] = 0;
+ data[0]++;
+ }
+ break;
+ case 2:
+ if (GetLinkPlayerCount_2() >= sub_800AA48())
+ {
+ if (IsLinkMaster())
+ {
+ if (++data[1] > 30)
+ {
+ sub_800A620();
+ data[0]++;
+ }
+ }
+ else
+ {
+ data[0]++;
+ }
+ }
+ break;
+ case 3:
+ if (gReceivedRemoteLinkPlayers == TRUE && IsLinkPlayerDataExchangeComplete() == TRUE)
+ {
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}
+
+void sub_80B3BC4(void)
+{
+ if (gWirelessCommType == 0)
+ {
+ gLinkType = 0x2288;
+ }
+}
diff --git a/src/contest.c b/src/contest.c
index 8eacc89c3..473f77f9c 100644
--- a/src/contest.c
+++ b/src/contest.c
@@ -10,7 +10,6 @@
#include "constants/flags.h"
#include "battle.h"
#include "battle_anim.h"
-#include "blend_palette.h"
#include "contest.h"
#include "data2.h"
#include "decompress.h"
diff --git a/src/evolution_scene.c b/src/evolution_scene.c
index 91ac90b1b..c00aaeb15 100644
--- a/src/evolution_scene.c
+++ b/src/evolution_scene.c
@@ -25,7 +25,7 @@
#include "gpu_regs.h"
#include "bg.h"
#include "link.h"
-#include "blend_palette.h"
+#include "util.h"
#include "trig.h"
struct EvoInfo
diff --git a/src/field_message_box.c b/src/field_message_box.c
index 19859ec0f..f45b6607d 100755
--- a/src/field_message_box.c
+++ b/src/field_message_box.c
@@ -131,7 +131,7 @@ void HideFieldMessageBox(void)
gUnknown_020375BC = 0;
}
-u8 textbox_any_visible(void)
+u8 GetFieldMessageBoxMode(void)
{
return gUnknown_020375BC;
}
diff --git a/src/hall_of_fame.c b/src/hall_of_fame.c
index 2b0904672..f2975e739 100644
--- a/src/hall_of_fame.c
+++ b/src/hall_of_fame.c
@@ -17,7 +17,7 @@
#include "bg.h"
#include "constants/species.h"
#include "constants/game_stat.h"
-#include "blend_palette.h"
+#include "util.h"
#include "string_util.h"
#include "m4a.h"
#include "international_string_util.h"
diff --git a/src/intro.c b/src/intro.c
index e1d61242c..fe5c012b0 100644
--- a/src/intro.c
+++ b/src/intro.c
@@ -22,7 +22,7 @@
#include "graphics.h"
#include "sound.h"
#include "constants/species.h"
-#include "blend_palette.h"
+#include "util.h"
#include "title_screen.h"
#include "constants/rgb.h"
#include "constants/battle_anim.h"
diff --git a/src/mystery_event_menu.c b/src/mystery_event_menu.c
index 8dcb960b7..7e09a4d70 100644
--- a/src/mystery_event_menu.c
+++ b/src/mystery_event_menu.c
@@ -151,7 +151,7 @@ static void CB2_MysteryEventMenu(void)
if (!IsTextPrinterActive(0))
{
gMain.state++;
- gLinkType = 21761;
+ gLinkType = 0x5501;
OpenLink();
}
break;
diff --git a/src/palette.c b/src/palette.c
index fd4ad32ad..1e92f4bba 100644
--- a/src/palette.c
+++ b/src/palette.c
@@ -1,6 +1,6 @@
#include "global.h"
-#include "blend_palette.h"
#include "palette.h"
+#include "util.h"
#include "decompress.h"
#include "gpu_regs.h"
#include "task.h"
diff --git a/src/pokeblock_feed.c b/src/pokeblock_feed.c
index 1449d4a00..10f7d34d8 100644
--- a/src/pokeblock_feed.c
+++ b/src/pokeblock_feed.c
@@ -6,7 +6,7 @@
#include "menu.h"
#include "malloc.h"
#include "pokemon.h"
-#include "blend_palette.h"
+#include "util.h"
#include "main.h"
#include "menu_helpers.h"
#include "bg.h"
diff --git a/src/pokemon_animation.c b/src/pokemon_animation.c
index e75f2eeba..6734fce06 100644
--- a/src/pokemon_animation.c
+++ b/src/pokemon_animation.c
@@ -4,7 +4,7 @@
#include "pokemon_animation.h"
#include "trig.h"
#include "task.h"
-#include "blend_palette.h"
+#include "util.h"
#include "constants/rgb.h"
struct UnkAnimStruct
diff --git a/src/rom_8011DC0.c b/src/rom_8011DC0.c
index 56c31f89f..dc94cb9d5 100644
--- a/src/rom_8011DC0.c
+++ b/src/rom_8011DC0.c
@@ -1609,7 +1609,7 @@ void sub_80141A4(void)
break;
case 1:
if (!FuncIsActiveTask(sub_80140E0))
- sub_80C4E74(GetMultiplayerId() ^ 1, CB2_ReturnToField);
+ TrainerCard_ShowLinkCard(GetMultiplayerId() ^ 1, CB2_ReturnToField);
break;
}
@@ -1675,7 +1675,7 @@ void sub_80143E4(void *arg0, bool32 arg1)
{
u16 *argAsU16Ptr = arg0;
- sub_80C30A4(argAsU16Ptr);
+ TrainerCard_GenerateCardForPlayer((struct TrainerCard *)argAsU16Ptr);
if (arg1)
argAsU16Ptr[48] = sub_801B39C();
else
diff --git a/src/start_menu.c b/src/start_menu.c
index 9d10aeaa4..dcb2c4154 100644
--- a/src/start_menu.c
+++ b/src/start_menu.c
@@ -88,7 +88,7 @@ extern void CB2_PartyMenuFromStartMenu(void);
extern void CB2_PokeNav(void);
extern void sub_80C4DDC(void (*)(void));
extern void sub_80C51C4(void (*)(void));
-extern void sub_80C4E74(u8, void (*)(void));
+extern void TrainerCard_ShowLinkCard(u8, void (*)(void));
extern void ScriptUnfreezeEventObjects(void);
extern void sub_81A9EC8(void);
extern void save_serialize_map(void);
@@ -750,7 +750,7 @@ static bool8 StartMenuLinkModePlayerNameCallback(void)
{
play_some_sound();
overworld_free_bg_tilemaps();
- sub_80C4E74(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu);
+ TrainerCard_ShowLinkCard(gUnknown_03005DB4, CB2_ReturnToFieldWithOpenMenu);
return TRUE;
}
diff --git a/src/string_util.c b/src/string_util.c
index ea50ba5a5..3fbf79d87 100644
--- a/src/string_util.c
+++ b/src/string_util.c
@@ -20,20 +20,20 @@ static const s32 sPowersOfTen[] =
1000000000,
};
-extern u8 gExpandedPlaceholder_Empty[];
-extern u8 gExpandedPlaceholder_Kun[];
-extern u8 gExpandedPlaceholder_Chan[];
-extern u8 gExpandedPlaceholder_Sapphire[];
-extern u8 gExpandedPlaceholder_Ruby[];
-extern u8 gExpandedPlaceholder_Emerald[];
-extern u8 gExpandedPlaceholder_Aqua[];
-extern u8 gExpandedPlaceholder_Magma[];
-extern u8 gExpandedPlaceholder_Archie[];
-extern u8 gExpandedPlaceholder_Maxie[];
-extern u8 gExpandedPlaceholder_Kyogre[];
-extern u8 gExpandedPlaceholder_Groudon[];
-extern u8 gExpandedPlaceholder_Brendan[];
-extern u8 gExpandedPlaceholder_May[];
+extern const u8 gExpandedPlaceholder_Empty[];
+extern const u8 gExpandedPlaceholder_Kun[];
+extern const u8 gExpandedPlaceholder_Chan[];
+extern const u8 gExpandedPlaceholder_Sapphire[];
+extern const u8 gExpandedPlaceholder_Ruby[];
+extern const u8 gExpandedPlaceholder_Emerald[];
+extern const u8 gExpandedPlaceholder_Aqua[];
+extern const u8 gExpandedPlaceholder_Magma[];
+extern const u8 gExpandedPlaceholder_Archie[];
+extern const u8 gExpandedPlaceholder_Maxie[];
+extern const u8 gExpandedPlaceholder_Kyogre[];
+extern const u8 gExpandedPlaceholder_Groudon[];
+extern const u8 gExpandedPlaceholder_Brendan[];
+extern const u8 gExpandedPlaceholder_May[];
u8 *StringCopy10(u8 *dest, const u8 *src)
{
@@ -348,7 +348,7 @@ u8 *StringExpandPlaceholders(u8 *dest, const u8 *src)
{
u8 c = *src++;
u8 placeholderId;
- u8 *expandedString;
+ const u8 *expandedString;
switch (c)
{
@@ -383,9 +383,9 @@ u8 *StringExpandPlaceholders(u8 *dest, const u8 *src)
case EOS:
*dest = EOS;
return dest;
- case 0xFA:
- case 0xFB:
- case 0xFE:
+ case CHAR_PROMPT_SCROLL:
+ case CHAR_PROMPT_CLEAR:
+ case CHAR_NEWLINE:
default:
*dest++ = c;
}
@@ -394,8 +394,8 @@ u8 *StringExpandPlaceholders(u8 *dest, const u8 *src)
u8 *StringBraille(u8 *dest, const u8 *src)
{
- u8 setBrailleFont[] = { 0xFC, 0x06, 0x06, 0xFF };
- u8 gotoLine2[] = { 0xFE, 0xFC, 0x0E, 0x02, 0xFF };
+ u8 setBrailleFont[] = { EXT_CTRL_CODE_BEGIN, 0x06, 0x06, EOS };
+ u8 gotoLine2[] = { CHAR_NEWLINE, EXT_CTRL_CODE_BEGIN, 0x0E, 0x02, EOS };
dest = StringCopy(dest, setBrailleFont);
@@ -408,7 +408,7 @@ u8 *StringBraille(u8 *dest, const u8 *src)
case EOS:
*dest = c;
return dest;
- case 0xFE:
+ case CHAR_NEWLINE:
dest = StringCopy(dest, gotoLine2);
break;
default:
@@ -419,32 +419,32 @@ u8 *StringBraille(u8 *dest, const u8 *src)
}
}
-static u8 *ExpandPlaceholder_UnknownStringVar(void)
+static const u8 *ExpandPlaceholder_UnknownStringVar(void)
{
return gUnknownStringVar;
}
-static u8 *ExpandPlaceholder_PlayerName(void)
+static const u8 *ExpandPlaceholder_PlayerName(void)
{
return gSaveBlock2Ptr->playerName;
}
-static u8 *ExpandPlaceholder_StringVar1(void)
+static const u8 *ExpandPlaceholder_StringVar1(void)
{
return gStringVar1;
}
-static u8 *ExpandPlaceholder_StringVar2(void)
+static const u8 *ExpandPlaceholder_StringVar2(void)
{
return gStringVar2;
}
-static u8 *ExpandPlaceholder_StringVar3(void)
+static const u8 *ExpandPlaceholder_StringVar3(void)
{
return gStringVar3;
}
-static u8 *ExpandPlaceholder_KunChan(void)
+static const u8 *ExpandPlaceholder_KunChan(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
return gExpandedPlaceholder_Kun;
@@ -452,7 +452,7 @@ static u8 *ExpandPlaceholder_KunChan(void)
return gExpandedPlaceholder_Chan;
}
-static u8 *ExpandPlaceholder_RivalName(void)
+static const u8 *ExpandPlaceholder_RivalName(void)
{
if (gSaveBlock2Ptr->playerGender == MALE)
return gExpandedPlaceholder_May;
@@ -460,44 +460,44 @@ static u8 *ExpandPlaceholder_RivalName(void)
return gExpandedPlaceholder_Brendan;
}
-static u8 *ExpandPlaceholder_Version(void)
+static const u8 *ExpandPlaceholder_Version(void)
{
return gExpandedPlaceholder_Emerald;
}
-static u8 *ExpandPlaceholder_Aqua(void)
+static const u8 *ExpandPlaceholder_Aqua(void)
{
return gExpandedPlaceholder_Aqua;
}
-static u8 *ExpandPlaceholder_Magma(void)
+static const u8 *ExpandPlaceholder_Magma(void)
{
return gExpandedPlaceholder_Magma;
}
-static u8 *ExpandPlaceholder_Archie(void)
+static const u8 *ExpandPlaceholder_Archie(void)
{
return gExpandedPlaceholder_Archie;
}
-static u8 *ExpandPlaceholder_Maxie(void)
+static const u8 *ExpandPlaceholder_Maxie(void)
{
return gExpandedPlaceholder_Maxie;
}
-static u8 *ExpandPlaceholder_Kyogre(void)
+static const u8 *ExpandPlaceholder_Kyogre(void)
{
return gExpandedPlaceholder_Kyogre;
}
-static u8 *ExpandPlaceholder_Groudon(void)
+static const u8 *ExpandPlaceholder_Groudon(void)
{
return gExpandedPlaceholder_Groudon;
}
-u8 *GetExpandedPlaceholder(u32 id)
+const u8 *GetExpandedPlaceholder(u32 id)
{
- typedef u8 *(*ExpandPlaceholderFunc)(void);
+ typedef const u8 *(*ExpandPlaceholderFunc)(void);
static const ExpandPlaceholderFunc funcs[] =
{
@@ -574,7 +574,7 @@ u8 *StringCopyN_Multibyte(u8 *dest, u8 *src, u32 n)
else
{
*dest++ = *src++;
- if (*(src - 1) == 0xF9)
+ if (*(src - 1) == CHAR_SPECIAL_F9)
*dest++ = *src++;
}
}
@@ -589,7 +589,7 @@ u32 StringLength_Multibyte(u8 *str)
while (*str != EOS)
{
- if (*str == 0xF9)
+ if (*str == CHAR_SPECIAL_F9)
str++;
str++;
length++;
@@ -600,7 +600,7 @@ u32 StringLength_Multibyte(u8 *str)
u8 *WriteColorChangeControlCode(u8 *dest, u32 colorType, u8 color)
{
- *dest = 0xFC;
+ *dest = EXT_CTRL_CODE_BEGIN;
dest++;
switch (colorType)
@@ -630,7 +630,7 @@ bool32 IsStringJapanese(u8 *str)
while (*str != EOS)
{
if (*str <= 0xA0)
- if (*str != 0)
+ if (*str != CHAR_SPACE)
return TRUE;
str++;
}
@@ -645,7 +645,7 @@ bool32 sub_800924C(u8 *str, s32 n)
for (i = 0; *str != EOS && i < n; i++)
{
if (*str <= 0xA0)
- if (*str != 0)
+ if (*str != CHAR_SPACE)
return TRUE;
str++;
}
@@ -692,7 +692,7 @@ u8 GetExtCtrlCodeLength(u8 code)
static const u8 *SkipExtCtrlCode(const u8 *s)
{
- while (*s == 0xFC)
+ while (*s == EXT_CTRL_CODE_BEGIN)
{
s++;
s += GetExtCtrlCodeLength(*s);
@@ -716,11 +716,11 @@ s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2)
if (*str1 < *str2)
{
retVal = -1;
- if (*str2 == 0xFF)
+ if (*str2 == EOS)
retVal = 1;
}
- if (*str1 == 0xFF)
+ if (*str1 == EOS)
return retVal;
str1++;
@@ -729,7 +729,7 @@ s32 StringCompareWithoutExtCtrlCodes(const u8 *str1, const u8 *str2)
retVal = 1;
- if (*str1 == 0xFF)
+ if (*str1 == EOS)
retVal = -1;
return retVal;
@@ -743,9 +743,9 @@ void ConvertInternationalString(u8 *s, u8 language)
StripExtCtrlCodes(s);
i = StringLength(s);
- s[i++] = 0xFC;
+ s[i++] = EXT_CTRL_CODE_BEGIN;
s[i++] = 22;
- s[i++] = 0xFF;
+ s[i++] = EOS;
i--;
@@ -755,7 +755,7 @@ void ConvertInternationalString(u8 *s, u8 language)
i--;
}
- s[0] = 0xFC;
+ s[0] = EXT_CTRL_CODE_BEGIN;
s[1] = 21;
}
}
@@ -764,9 +764,9 @@ void StripExtCtrlCodes(u8 *str)
{
u16 srcIndex = 0;
u16 destIndex = 0;
- while (str[srcIndex] != 0xFF)
+ while (str[srcIndex] != EOS)
{
- if (str[srcIndex] == 0xFC)
+ if (str[srcIndex] == EXT_CTRL_CODE_BEGIN)
{
srcIndex++;
srcIndex += GetExtCtrlCodeLength(str[srcIndex]);
@@ -776,5 +776,5 @@ void StripExtCtrlCodes(u8 *str)
str[destIndex++] = str[srcIndex++];
}
}
- str[destIndex] = 0xFF;
+ str[destIndex] = EOS;
}
diff --git a/src/text.c b/src/text.c
index e5a9feed8..ec0d26ab1 100644
--- a/src/text.c
+++ b/src/text.c
@@ -3095,13 +3095,13 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
temp = strLocal[strPos++];
switch (temp)
{
- case 0xFE:
- case 0xFF:
+ case CHAR_NEWLINE:
+ case EOS:
lineWidths[line] = width;
width = 0;
line++;
break;
- case 0xFC:
+ case EXT_CTRL_CODE_BEGIN:
temp2 = strLocal[strPos++];
switch (temp2)
{
@@ -3135,21 +3135,21 @@ u32 GetStringWidthFixedWidthFont(const u8 *str, u8 fontId, u8 letterSpacing)
break;
}
break;
- case 0xF7:
- case 0xFD:
+ case CHAR_SPECIAL_F7:
+ case PLACEHOLDER_BEGIN:
++strPos;
break;
- case 0xFA:
- case 0xFB:
+ case CHAR_PROMPT_SCROLL:
+ case CHAR_PROMPT_CLEAR:
break;
- case 0xF8:
- case 0xF9:
+ case CHAR_SPECIAL_F8:
+ case CHAR_SPECIAL_F9:
++strPos;
default:
++width;
break;
}
- } while (temp != 0xFF);
+ } while (temp != EOS);
for (width = 0, strPos = 0; strPos < 8; ++strPos)
{
@@ -3201,16 +3201,16 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
lineWidth = 0;
bufferPointer = 0;
- while (*str != 0xFF)
+ while (*str != EOS)
{
switch (*str)
{
- case 0xFE:
+ case CHAR_NEWLINE:
if (lineWidth > width)
width = lineWidth;
lineWidth = 0;
break;
- case 0xFD:
+ case PLACEHOLDER_BEGIN:
switch (*++str)
{
case 0x2:
@@ -3225,10 +3225,10 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
default:
return 0;
}
- case 0xF7:
+ case CHAR_SPECIAL_F7:
if (bufferPointer == NULL)
bufferPointer = DynamicPlaceholderTextUtil_GetPlaceholderPtr(*++str);
- while (*bufferPointer != 0xFF)
+ while (*bufferPointer != EOS)
{
glyphWidth = func(*bufferPointer++, isJapanese);
if (minGlyphWidth > 0)
@@ -3240,13 +3240,13 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
else
{
lineWidth += glyphWidth;
- if (isJapanese && str[1] != 0xFF)
+ if (isJapanese && str[1] != EOS)
lineWidth += localLetterSpacing;
}
}
bufferPointer = 0;
break;
- case 0xFC:
+ case EXT_CTRL_CODE_BEGIN:
switch (*++str)
{
case 0x4:
@@ -3299,9 +3299,9 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
break;
}
break;
- case 0xF8:
- case 0xF9:
- if (*str == 0xF9)
+ case CHAR_SPECIAL_F8:
+ case CHAR_SPECIAL_F9:
+ if (*str == CHAR_SPECIAL_F9)
glyphWidth = func(*++str | 0x100, isJapanese);
else
glyphWidth = GetKeypadIconWidth(*++str);
@@ -3315,12 +3315,12 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
else
{
lineWidth += glyphWidth;
- if (isJapanese && str[1] != 0xFF)
+ if (isJapanese && str[1] != EOS)
lineWidth += localLetterSpacing;
}
break;
- case 0xFA:
- case 0xFB:
+ case CHAR_PROMPT_SCROLL:
+ case CHAR_PROMPT_CLEAR:
break;
default:
glyphWidth = func(*str, isJapanese);
@@ -3333,7 +3333,7 @@ u32 GetStringWidth(u8 fontId, const u8 *str, s16 letterSpacing)
else
{
lineWidth += glyphWidth;
- if (isJapanese && str[1] != 0xFF)
+ if (isJapanese && str[1] != EOS)
lineWidth += localLetterSpacing;
}
break;
@@ -3372,7 +3372,7 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
temp = strLocal[strPos++];
switch (temp)
{
- case 0xFC:
+ case EXT_CTRL_CODE_BEGIN:
temp2 = strLocal[strPos++];
switch (temp2)
{
@@ -3421,16 +3421,16 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
continue;
}
break;
- case 0xF7:
- case 0xF8:
- case 0xF9:
- case 0xFD:
+ case CHAR_SPECIAL_F7:
+ case CHAR_SPECIAL_F8:
+ case CHAR_SPECIAL_F9:
+ case PLACEHOLDER_BEGIN:
++strPos;
break;
- case 0xFA:
- case 0xFB:
- case 0xFE:
- case 0xFF:
+ case CHAR_PROMPT_SCROLL:
+ case CHAR_PROMPT_CLEAR:
+ case CHAR_NEWLINE:
+ case EOS:
break;
default:
switch (fontId)
@@ -3450,7 +3450,7 @@ u8 RenderTextFont9(u8 *pixels, u8 fontId, u8 *str)
break;
}
}
- while (temp != 0xFF);
+ while (temp != EOS);
RestoreTextColors(&colorBackup[0], &colorBackup[1], &colorBackup[2]);
return 1;
diff --git a/src/tileset_anims.c b/src/tileset_anims.c
index 454a2e435..f7c3cd482 100644
--- a/src/tileset_anims.c
+++ b/src/tileset_anims.c
@@ -1,7 +1,7 @@
// Includes
#include "global.h"
#include "palette.h"
-#include "blend_palette.h"
+#include "util.h"
#include "battle_transition.h"
#include "task.h"
#include "battle_transition.h"
diff --git a/src/util.c b/src/util.c
index 9c8766a97..47112774a 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "util.h"
#include "sprite.h"
+#include "palette.h"
const u32 gBitTable[] =
{
@@ -258,3 +259,20 @@ u32 CalcByteArraySum(const u8* data, u32 length)
sum += data[i];
return sum;
}
+
+void BlendPalette(u16 palOffset, u16 numEntries, u8 coeff, u16 blendColor)
+{
+ u16 i;
+ for (i = 0; i < numEntries; i++)
+ {
+ u16 index = i + palOffset;
+ struct PlttData *data1 = (struct PlttData *)&gPlttBufferUnfaded[index];
+ s8 r = data1->r;
+ s8 g = data1->g;
+ s8 b = data1->b;
+ struct PlttData *data2 = (struct PlttData *)&blendColor;
+ gPlttBufferFaded[index] = ((r + (((data2->r - r) * coeff) >> 4)) << 0)
+ | ((g + (((data2->g - g) * coeff) >> 4)) << 5)
+ | ((b + (((data2->b - b) * coeff) >> 4)) << 10);
+ }
+}