summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2019-10-05 15:49:05 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2019-10-05 15:49:05 -0400
commitb01da1a59260b2ac54dd876e9cf35d2c1fb944e7 (patch)
tree8384ebb678d1237c49d6f1b59cd6504e6e58a1e4 /src
parentb4b509f68477068ae111cc5a6094d858d396c4bb (diff)
link.c through InitLocalLinkPlayer
Diffstat (limited to 'src')
-rw-r--r--src/link.c153
-rw-r--r--src/pokemon.c4
-rw-r--r--src/prof_pc.c2
3 files changed, 156 insertions, 3 deletions
diff --git a/src/link.c b/src/link.c
new file mode 100644
index 000000000..f63b2fcd7
--- /dev/null
+++ b/src/link.c
@@ -0,0 +1,153 @@
+#include "global.h"
+#include "palette.h"
+#include "gpu_regs.h"
+#include "link.h"
+#include "quest_log.h"
+#include "link_rfu.h"
+#include "librfu.h"
+#include "random.h"
+#include "task.h"
+#include "event_data.h"
+#include "string_util.h"
+
+struct BlockTransfer
+{
+ u16 pos;
+ u16 size;
+ const u8 *src;
+ bool8 active;
+ u8 multiplayerId;
+};
+
+struct LinkTestBGInfo
+{
+ u32 screenBaseBlock;
+ u32 paletteNum;
+ u32 dummy_8;
+ u32 dummy_C;
+};
+
+u32 gUnknown_3000E58;
+
+struct LinkTestBGInfo gLinkTestBGInfo;
+
+EWRAM_DATA struct LinkPlayer gLocalLinkPlayer = {};
+
+void sub_800B210(void);
+void InitLocalLinkPlayer(void);
+void sub_800978C(void);
+void ResetBlockSend(void);
+void task00_link_test(u8 taskId);
+void CB2_LinkTest(void);
+
+extern const u16 gLinkTestDigitsPal[0x20];
+extern const u16 gLinkTestDigitsGfx[0x1000];
+extern const u8 gBGControlRegOffsets[];
+
+bool8 IsWirelessAdapterConnected(void)
+{
+ if (gUnknown_203ADFA == 2 || gUnknown_203ADFA == 3)
+ return FALSE;
+
+ sub_800B1F4();
+ sub_80F86F4();
+ sub_80FB128(1);
+ if (sub_80FD3A4() == 0x8001)
+ {
+ rfu_REQ_stopMode();
+ rfu_waitREQComplete();
+ return TRUE;
+ }
+ sub_800B210();
+ CloseLink();
+ RestoreSerialTimer3IntrHandlers();
+ return FALSE;
+}
+
+void Task_DestroySelf(u8 taskId)
+{
+ DestroyTask(taskId);
+}
+
+void InitLinkTestBG(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock, u16 a4)
+{
+ LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock) + (16 * a4), sizeof gLinkTestDigitsGfx);
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+ gLinkTestBGInfo.dummy_8 = a4;
+ switch (bgNum)
+ {
+ case 1:
+ SetGpuReg(REG_OFFSET_BG1CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ case 2:
+ SetGpuReg(REG_OFFSET_BG2CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ case 3:
+ SetGpuReg(REG_OFFSET_BG3CNT, BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_PRIORITY(1) | BGCNT_CHARBASE(charBaseBlock));
+ break;
+ }
+ SetGpuReg(REG_OFFSET_BG0HOFS + bgNum * 4, 0);
+ SetGpuReg(REG_OFFSET_BG0VOFS + bgNum * 4, 0);
+}
+
+void sub_80095BC(u8 paletteNum, u8 bgNum, u8 screenBaseBlock, u8 charBaseBlock)
+{
+ LoadPalette(gLinkTestDigitsPal, paletteNum * 16, 0x20);
+ DmaCopy16(3, gLinkTestDigitsGfx, (u16 *)BG_CHAR_ADDR(charBaseBlock), sizeof gLinkTestDigitsGfx);
+ gLinkTestBGInfo.screenBaseBlock = screenBaseBlock;
+ gLinkTestBGInfo.paletteNum = paletteNum;
+ gLinkTestBGInfo.dummy_8 = 0;
+ SetGpuReg(gBGControlRegOffsets[bgNum], BGCNT_SCREENBASE(screenBaseBlock) | BGCNT_CHARBASE(charBaseBlock));
+}
+
+void LinkTestScreen(void)
+{
+ int i;
+
+ ResetSpriteData();
+ FreeAllSpritePalettes();
+ ResetTasks();
+ SetVBlankCallback(sub_800978C);
+ ResetBlockSend();
+ gLinkType = 0x1111;
+ OpenLink();
+ SeedRng(gMain.vblankCounter2);
+ for (i = 0; i < MAX_LINK_PLAYERS; i++)
+ {
+ gSaveBlock2Ptr->playerTrainerId[i] = Random() % 256;
+ }
+ InitLinkTestBG(0, 2, 4, 0, 0);
+ SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_BG0_ON | DISPCNT_BG2_ON | DISPCNT_OBJ_ON);
+ CreateTask(Task_DestroySelf, 0);
+ RunTasks();
+ AnimateSprites();
+ BuildOamBuffer();
+ UpdatePaletteFade();
+ gUnknown_3000E58 = 0;
+ InitLocalLinkPlayer();
+ CreateTask(task00_link_test, 0);
+ SetMainCallback2(CB2_LinkTest);
+}
+
+void SetLocalLinkPlayerId(u8 playerId)
+{
+ gLocalLinkPlayer.id = playerId;
+}
+
+void InitLocalLinkPlayer(void)
+{
+ gLocalLinkPlayer.trainerId = gSaveBlock2Ptr->playerTrainerId[0] | (gSaveBlock2Ptr->playerTrainerId[1] << 8) | (gSaveBlock2Ptr->playerTrainerId[2] << 16) | (gSaveBlock2Ptr->playerTrainerId[3] << 24);
+ StringCopy(gLocalLinkPlayer.name, gSaveBlock2Ptr->playerName);
+ gLocalLinkPlayer.gender = gSaveBlock2Ptr->playerGender;
+ gLocalLinkPlayer.linkType = gLinkType;
+ gLocalLinkPlayer.language = gGameLanguage;
+ gLocalLinkPlayer.version = gGameVersion + 0x4000;
+ gLocalLinkPlayer.lp_field_2 = 0x8000;
+ gLocalLinkPlayer.name[8] = IsNationalPokedexEnabled();
+ if (FlagGet(FLAG_0x844))
+ {
+ gLocalLinkPlayer.name[8] |= 0x10;
+ }
+}
diff --git a/src/pokemon.c b/src/pokemon.c
index 152e8e1df..4685dcbcd 100644
--- a/src/pokemon.c
+++ b/src/pokemon.c
@@ -4961,7 +4961,7 @@ u16 GetEvolutionTargetSpecies(struct Pokemon *mon, u8 type, u16 evolutionItem)
if (gEvolutionTable[species][i].param == heldItem)
{
targetSpecies = gEvolutionTable[species][i].targetSpecies;
- if (sub_806E25C() || targetSpecies <= 151)
+ if (IsNationalPokedexEnabled() || targetSpecies <= 151)
{
heldItem = 0;
SetMonData(mon, MON_DATA_HELD_ITEM, &heldItem);
@@ -5629,7 +5629,7 @@ u16 sub_8043F90(u16 species)
{
species = SpeciesToNationalPokedexNum(species);
- if (!sub_806E25C() && species > 151)
+ if (!IsNationalPokedexEnabled() && species > 151)
return 0xFFFF;
return species;
}
diff --git a/src/prof_pc.c b/src/prof_pc.c
index 35566e714..aeabc8644 100644
--- a/src/prof_pc.c
+++ b/src/prof_pc.c
@@ -33,7 +33,7 @@ u16 Special_GetPokedexCount(void)
gSpecialVar_0x8005 = GetNationalPokedexCount(0);
gSpecialVar_0x8006 = GetNationalPokedexCount(1);
}
- return sub_806E25C();
+ return IsNationalPokedexEnabled();
}
const u8 * sub_80CA424(u16 count)