This commit is contained in:
ProjectRevoTPP
2017-05-12 01:57:52 -04:00
21 changed files with 1060 additions and 2864 deletions

View File

@@ -4,7 +4,7 @@ Install [**devkitARM**](http://devkitpro.org/wiki/Getting_Started/devkitARM).
Make sure that there is an environment variable called DEVKITARM with the path of the directory before the "bin" directory containing "arm-none-eabi-as", "arm-none-eabi-cpp", "arm-none-eabi-ld" and "arm-none-eabi-objcopy".
Then get the compiler from https://github.com/YamaArashi/agbcc and run the following commands.
Then get the compiler from https://github.com/pret/agbcc and run the following commands.
build.sh
install.sh PATH_OF_POKERUBY_DIRECTORY

View File

@@ -1358,7 +1358,7 @@ _0800E148:
ldrsh r0, [r1, r5]
cmp r0, 0
beq _0800E154
bl sub_800DC24
bl PrintLinkBattleWinLossTie
_0800E154:
movs r0, 0x78
bl PlaySE

File diff suppressed because it is too large Load Diff

View File

@@ -3695,8 +3695,8 @@ _0810F612:
bx r1
thumb_func_end sub_810F5BC
thumb_func_start sub_810F618
sub_810F618: @ 810F618
thumb_func_start SetShoalItemFlag
SetShoalItemFlag: @ 810F618
push {lr}
ldr r0, _0810F624 @ =0x0000085f
bl FlagSet
@@ -3704,7 +3704,7 @@ sub_810F618: @ 810F618
bx r0
.align 2, 0
_0810F624: .4byte 0x0000085f
thumb_func_end sub_810F618
thumb_func_end SetShoalItemFlag
thumb_func_start PutZigzagoonInPlayerParty
PutZigzagoonInPlayerParty: @ 810F628

View File

@@ -7537,8 +7537,8 @@ _0808082E:
bx r1
thumb_func_end TranslateWeatherNum
thumb_func_start sub_8080834
sub_8080834: @ 8080834
thumb_func_start UpdateWeatherPerDay
UpdateWeatherPerDay: @ 8080834
lsls r0, 16
ldr r2, _08080850 @ =gSaveBlock1
adds r2, 0x2F
@@ -7554,7 +7554,7 @@ sub_8080834: @ 8080834
bx lr
.align 2, 0
_08080850: .4byte gSaveBlock1
thumb_func_end sub_8080834
thumb_func_end UpdateWeatherPerDay
thumb_func_start UpdateRainCounter
UpdateRainCounter: @ 8080854

View File

@@ -7,7 +7,7 @@
#define BATTLE_TYPE_TRAINER 0x0008
#define BATTLE_TYPE_FIRST_BATTLE 0x0010
#define BATTLE_TYPE_20 0x0020
#define BATTLE_TYPE_40 0x0040
#define BATTLE_TYPE_MULTI 0x0040
#define BATTLE_TYPE_SAFARI 0x0080
#define BATTLE_TYPE_BATTLE_TOWER 0x0100
#define BATTLE_TYPE_WALLY_TUTORIAL 0x0200

View File

@@ -22,7 +22,7 @@ bool8 IsPlayerFacingPlantedBerryTree(void);
bool8 TryToWaterBerryTree(void);
void ClearBerryTrees(void);
bool32 BerryTreeGrow(struct BerryTree *tree);
void BerryTreeTimeUpdate(int time);
void BerryTreeTimeUpdate(s32 minutes);
void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle);
void RemoveBerryTree(u8 id);
u8 GetBerryTypeByBerryTreeId(u8 id);

View File

@@ -4,7 +4,7 @@
#define ARRAY_2007800 ((struct EasyChatPair *)(unk_2000000 + 0x7800))
#define ARRAY_2007900 ((struct EasyChatPair *)(unk_2000000 + 0x7900))
void InitDewfordTrends(void);
void InitDewfordTrend(void);
void sub_80FA4E4(void *, u32, u8);
#endif

View File

@@ -51,6 +51,7 @@
#define SYS_BRAILLE_WAIT 0x851
#define SYS_BRAILLE_FLY 0x852
#define SYS_SHOAL_ITEM 0x85F
#define SYS_B_DASH 0x860 // got Running Shoes
#define SYS_CTRL_OBJ_DELETE 0x861
#define SYS_RESET_RTC_ENABLE 0x862

View File

@@ -34,10 +34,10 @@ struct EnigmaBerry
struct BattleEnigmaBerry
{
u8 name[7];
u8 holdEffect;
u8 itemEffect[18];
u8 holdEffectParam;
/*0x00*/ u8 name[7];
/*0x07*/ u8 holdEffect;
/*0x08*/ u8 itemEffect[18];
/*0x1A*/ u8 holdEffectParam;
};
struct BerryTree
@@ -45,7 +45,7 @@ struct BerryTree
u8 berry;
u8 stage:7;
u8 growthSparkle:1;
u16 secondsUntilNextStage;
u16 minutesUntilNextStage;
u8 berryYield;
u8 regrowthCount:4;
u8 watered1:1;

View File

@@ -51,6 +51,7 @@ SECTIONS {
asm/battle_1.o(.text);
src/rom_800D42C.o(.text);
asm/battle_1.o(.text_800DC24);
src/battle_2.o(.text);
asm/battle_2.o(.text);
asm/battle_3.o(.text);
asm/battle_4.o(.text);

977
src/battle_2.c Normal file
View File

@@ -0,0 +1,977 @@
#include "global.h"
#include "battle.h"
#include "main.h"
#include "text.h"
#include "palette.h"
#include "sprite.h"
#include "task.h"
#include "pokemon.h"
#include "species.h"
#include "link.h"
#include "name_string_util.h"
#include "battle_setup.h"
struct UnknownStruct5
{
u32 unk0;
u32 unk4;
u32 unk8;
};
struct UnknownStruct6
{
u16 unk0[0xA0];
u8 fillerA0[0x640];
u16 unk780[0xA0];
};
struct UnknownStruct7
{
u8 unk0;
u8 unk1;
u8 unk2;
u8 unk3;
};
struct UnknownStruct8
{
u8 unk0[7];
u8 unk7;
u8 unk8[18];
u8 unk1A;
};
struct UnknownPokemonStruct2
{
/*0x00*/ u16 species;
/*0x02*/ u16 heldItem;
/*0x04*/ u8 nickname[11];
/*0x0F*/ u8 level;
/*0x10*/ u16 hp;
/*0x12*/ u16 maxhp;
/*0x14*/ u32 status;
/*0x18*/ u32 personality;
/*0x1C*/ u8 gender;
/*0x1D*/ u8 language;
};
extern const struct UnknownStruct5 gUnknown_081F9674;
extern const u8 gUnknown_081F96C8[];
extern const struct Trainer gTrainers[];
extern const u8 gSpeciesNames[][11];
extern const struct BattleMove gBattleMoves[];
extern u8 ewram[];
#define ewram0 (*(struct UnknownStruct7 *)(ewram + 0x0))
#define ewram4 (*(struct UnknownStruct8 *)(ewram + 0x4))
#define ewram160CB (ewram[0x160CB])
#define ewram1D000 ((struct Pokemon *)(ewram + 0x1D000))
extern struct UnknownPokemonStruct2 gUnknown_02023A00[];
extern u8 gUnknown_02024D1E[];
extern u8 gUnknown_02024D1F[]; // I don't actually know what type this is.
extern u16 gUnknown_030041B0;
extern u16 gUnknown_030041B4;
extern u16 gUnknown_030041B8;
extern struct Window gUnknown_030041D0;
extern struct Window gUnknown_03004210;
extern struct Window gUnknown_03004250;
extern u16 gUnknown_03004240;
extern u16 gUnknown_03004280;
extern u16 gUnknown_03004288;
extern u16 gUnknown_030042A0;
extern u16 gUnknown_030042A4;
extern u16 gUnknown_030042C0;
extern u16 gUnknown_030042C4;
extern MainCallback gUnknown_030042D0;
extern struct UnknownStruct6 gUnknown_03004DE0;
//extern u16 gUnknown_03004DE0[][0xA0]; // possibly?
extern u16 gBattleTypeFlags;
extern s8 gBattleTerrain; // I'm not sure if this is supposed to be s8 or u8. Regardless, it must have the same type as the return value of GetBattleTerrain.
extern u8 gReservedSpritePaletteCount;
extern u16 gTrainerBattleOpponent;
extern struct BattleEnigmaBerry gEnigmaBerries[];
extern u16 gBlockRecvBuffer[MAX_LINK_PLAYERS][BLOCK_BUFFER_SIZE / 2];
extern void sub_800B858(void);
extern void dp12_8087EA4(void);
extern void sub_80895F8();
extern void sub_800D6D4();
extern void sub_800DAB8();
extern void sub_800E23C();
extern void setup_poochyena_battle();
extern void SetWildMonHeldItem(void);
extern void AdjustFriendship(struct Pokemon *, u8);
extern void sub_800DE30(u8);
extern void sub_800B950(void);
extern u8 battle_load_something();
extern void OpenPartyMenu();
void sub_800E7F8(void);
void sub_800EC9C(void);
void sub_800F104(void);
void sub_800F298(void);
void sub_800F808(void);
void sub_800F838(struct Sprite *);
u8 CreateNPCTrainerParty(struct Pokemon *, u16);
void sub_800FCFC(void);
void sub_8010824(void);
void sub_800E7C4(void)
{
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
sub_800B858();
SetMainCallback2(sub_800F104);
gUnknown_02024D1E[0] = 0;
}
else
{
sub_800E7F8();
}
}
void sub_800E7F8(void)
{
s32 i;
SetHBlankCallback(NULL);
SetVBlankCallback(NULL);
CpuFill32(0, (void *)VRAM, VRAM_SIZE);
REG_MOSAIC = 0;
REG_WIN0H = 0xF0;
REG_WIN0V = 0x5051;
REG_WININ = 0;
REG_WINOUT = 0;
gUnknown_030042C4 = 0xF0;
gUnknown_03004240 = 0x5051;
dp12_8087EA4();
for (i = 0; i < 80; i++)
{
gUnknown_03004DE0.unk0[i] = 0xF0;
gUnknown_03004DE0.unk780[i] = 0xF0;
}
for (i = 80; i < 160; i++)
{
asm(""::"r"(i)); // Needed to stop the compiler from optimizing out the loop counter
gUnknown_03004DE0.unk0[i] = 0xFF10;
gUnknown_03004DE0.unk780[i] = 0xFF10;
}
sub_80895F8(gUnknown_081F9674.unk0, gUnknown_081F9674.unk4, gUnknown_081F9674.unk8);
SetUpWindowConfig(&gWindowConfig_81E6C58);
ResetPaletteFade();
gUnknown_030042A4 = 0;
gUnknown_030042A0 = 0;
gUnknown_030042C0 = 0;
gUnknown_030041B4 = 0;
gUnknown_03004288 = 0;
gUnknown_03004280 = 0;
gUnknown_030041B0 = 0;
gUnknown_030041B8 = 0;
gBattleTerrain = GetBattleTerrain();
InitWindowFromConfig(&gUnknown_03004210, &gWindowConfig_81E6C58);
InitWindowFromConfig(&gUnknown_030041D0, &gWindowConfig_81E71D0);
InitWindowFromConfig(&gUnknown_03004250, &gWindowConfig_81E71EC);
sub_800D6D4();
sub_800DAB8();
ResetSpriteData();
ResetTasks();
sub_800E23C();
FreeAllSpritePalettes();
gReservedSpritePaletteCount = 4;
SetVBlankCallback(sub_800FCFC);
setup_poochyena_battle();
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
SetMainCallback2(sub_800F298);
else
SetMainCallback2(sub_800EC9C);
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
{
CreateNPCTrainerParty(gEnemyParty, gTrainerBattleOpponent);
SetWildMonHeldItem();
}
gMain.inBattle = TRUE;
for (i = 0; i < 6; i++)
AdjustFriendship(&gPlayerParty[i], 3);
gUnknown_02024D1E[0] = 0;
}
void sub_800E9EC(void)
{
u16 r6 = 0;
u16 species;
u16 hp;
u32 status;
s32 i;
for (i = 0; i < 6; i++)
{
species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES2);
hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
if (species == 0)
continue;
if (species != SPECIES_EGG && hp != 0 && status == 0)
r6 |= 1 << i * 2;
if (species == 0)
continue;
if (hp != 0 && (species == SPECIES_EGG || status != 0))
r6 |= 2 << i * 2;
if (species == 0)
continue;
if (species != SPECIES_EGG && hp == 0)
r6 |= 3 << i * 2;
}
ewram0.unk2 = r6;
ewram0.unk3 = r6 >> 8;
}
void sub_800EAAC(void)
{
s32 i;
struct UnknownStruct8 *_ewram4 = &ewram4;
for (i = 0; i < 7; i++)
_ewram4->unk0[i] = gSaveBlock1.enigmaBerry.berry.name[i];
for (i = 0; i < 18; i++)
_ewram4->unk8[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
_ewram4->unk7 = gSaveBlock1.enigmaBerry.holdEffect;
_ewram4->unk1A = gSaveBlock1.enigmaBerry.holdEffectParam;
}
void sub_800EB08(void)
{
s32 i;
s32 j;
if (!(gBattleTypeFlags & BATTLE_TYPE_LINK))
{
for (i = 0; i < 7; i++)
{
gEnigmaBerries[0].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
gEnigmaBerries[2].name[i] = gSaveBlock1.enigmaBerry.berry.name[i];
}
for (i = 0; i < 18; i++)
{
gEnigmaBerries[0].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
gEnigmaBerries[2].itemEffect[i] = gSaveBlock1.enigmaBerry.itemEffect[i];
}
gEnigmaBerries[0].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
gEnigmaBerries[2].holdEffect = gSaveBlock1.enigmaBerry.holdEffect;
gEnigmaBerries[0].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
gEnigmaBerries[2].holdEffectParam = gSaveBlock1.enigmaBerry.holdEffectParam;
}
else
{
s32 numPlayers;
struct BattleEnigmaBerry *src;
u8 r4;
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
numPlayers = 4;
else
numPlayers = 2;
for (i = 0; i < numPlayers; i++)
{
src = (struct BattleEnigmaBerry *)(gBlockRecvBuffer[i] + 2);
r4 = gLinkPlayers[i].lp_field_18;
for (j = 0; j < 7; j++)
gEnigmaBerries[r4].name[j] = src->name[j];
for (j = 0; j < 18; j++)
gEnigmaBerries[r4].itemEffect[j] = src->itemEffect[j];
gEnigmaBerries[r4].holdEffect = src->holdEffect;
gEnigmaBerries[r4].holdEffectParam = src->holdEffectParam;
}
}
}
void shedinja_something(struct Pokemon *pkmn)
{
u8 nickname[POKEMON_NAME_LENGTH + 1];
u8 language = 1;
if (GetMonData(pkmn, MON_DATA_SPECIES) == SPECIES_SHEDINJA
&& GetMonData(pkmn, MON_DATA_LANGUAGE) != language)
{
GetMonData(pkmn, MON_DATA_NICKNAME, nickname);
if (StringCompareWithoutExtCtrlCodes(nickname, gUnknown_081F96C8) == 0)
SetMonData(pkmn, MON_DATA_LANGUAGE, &language);
}
}
void sub_800EC9C(void)
{
u8 playerId;
u8 enemyId;
RunTasks();
AnimateSprites();
BuildOamBuffer();
playerId = GetMultiplayerId();
ewram160CB = playerId;
enemyId = playerId ^ 1;
switch (gUnknown_02024D1E[0])
{
case 0:
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
{
ewram0.unk0 = 1;
ewram0.unk1 = 1;
sub_800E9EC();
sub_800EAAC();
SendBlock(bitmask_all_link_players_but_self(), &ewram0, 32);
gUnknown_02024D1E[0] = 1;
}
}
else
{
gBattleTypeFlags |= BATTLE_TYPE_WILD;
gUnknown_02024D1E[0] = 8;
sub_800EB08();
}
break;
case 1:
if ((GetBlockReceivedStatus() & 3) == 3)
{
s32 id;
u8 taskId;
ResetBlockReceivedFlags();
id = 0;
if (gBlockRecvBuffer[0][0] == 0x100)
{
if (playerId == 0)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
id++;
}
if (id == 0)
{
if (gBlockRecvBuffer[0][0] == gBlockRecvBuffer[1][0])
{
if (playerId == 0)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
id++;
}
if (id == 0)
{
while (id < 2)
{
if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
break;
id++;
}
if (id == 2)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
}
}
sub_800EB08();
taskId = CreateTask(sub_800DE30, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
gTasks[taskId].data[3] = ewram0.unk2 | (ewram0.unk3 << 8);
gTasks[taskId].data[4] = gBlockRecvBuffer[enemyId][1];
gUnknown_02024D1E[0]++;
}
break;
case 2:
if (sub_8007ECC())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty, sizeof(*gPlayerParty) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 3:
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
memcpy(gEnemyParty, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 4:
if (sub_8007ECC())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 2, sizeof(*gPlayerParty) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 5:
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
memcpy(gEnemyParty + 2, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 6:
if (sub_8007ECC())
{
SendBlock(bitmask_all_link_players_but_self(), gPlayerParty + 4, sizeof(*gPlayerParty) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 7:
if ((GetBlockReceivedStatus() & 3) == 3)
{
ResetBlockReceivedFlags();
memcpy(gEnemyParty + 4, gBlockRecvBuffer[enemyId], sizeof(*gEnemyParty) * 2);
shedinja_something(&gEnemyParty[0]);
shedinja_something(&gEnemyParty[1]);
shedinja_something(&gEnemyParty[2]);
shedinja_something(&gEnemyParty[3]);
shedinja_something(&gEnemyParty[4]);
shedinja_something(&gEnemyParty[5]);
gUnknown_02024D1E[0]++;
}
break;
case 8:
sub_800B950();
gUnknown_02024D1E[0]++;
gUnknown_02024D1E[1] = 0;
gUnknown_02024D1E[2] = 0;
break;
case 9:
if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
{
gUnknown_030042D0 = gMain.callback1;
gMain.callback1 = sub_8010824;
SetMainCallback2(sub_800F808);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
gTrainerBattleOpponent = 0x800;
gBattleTypeFlags |= BATTLE_TYPE_20;
}
}
break;
}
}
void sub_800F02C(void)
{
s32 i;
for (i = 0; i < 3; i++)
{
u8 *nickname = gUnknown_02023A00[i].nickname;
gUnknown_02023A00[i].species = GetMonData(&gPlayerParty[i], MON_DATA_SPECIES);
gUnknown_02023A00[i].heldItem = GetMonData(&gPlayerParty[i], MON_DATA_HELD_ITEM);
GetMonData(&gPlayerParty[i], MON_DATA_NICKNAME, nickname);
gUnknown_02023A00[i].level = GetMonData(&gPlayerParty[i], MON_DATA_LEVEL);
gUnknown_02023A00[i].hp = GetMonData(&gPlayerParty[i], MON_DATA_HP);
gUnknown_02023A00[i].maxhp = GetMonData(&gPlayerParty[i], MON_DATA_MAX_HP);
gUnknown_02023A00[i].status = GetMonData(&gPlayerParty[i], MON_DATA_STATUS);
gUnknown_02023A00[i].personality = GetMonData(&gPlayerParty[i], MON_DATA_PERSONALITY);
gUnknown_02023A00[i].gender = GetMonGender(&gPlayerParty[i]);
StripExtCtrlCodes(nickname);
gUnknown_02023A00[i].language = GetMonData(&gPlayerParty[i], MON_DATA_LANGUAGE);
if (gUnknown_02023A00[i].language != 1)
PadNameString(nickname, 0);
}
memcpy(ewram, gUnknown_02023A00, 0x60);
}
void sub_800F104(void)
{
u8 playerId;
MainCallback *pSavedCallback;
u16 *pSavedBattleTypeFlags;
playerId = GetMultiplayerId();
ewram160CB = playerId;
// Seriously, Game Freak?
pSavedCallback = (MainCallback *)(ewram + 0x160C4);
pSavedBattleTypeFlags = (u16 *)(ewram + 0x160C2);
RunTasks();
AnimateSprites();
BuildOamBuffer();
switch (gUnknown_02024D1E[0])
{
case 0:
if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
{
sub_800F02C();
SendBlock(bitmask_all_link_players_but_self(), ewram, 0x60);
gUnknown_02024D1E[0]++;
}
break;
case 1:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
s32 i;
ResetBlockReceivedFlags();
for (i = 0; i < 4; i++)
{
if (i != playerId)
{
if ((!(gLinkPlayers[i].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
|| ((gLinkPlayers[i].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
memcpy(gUnknown_02023A00, gBlockRecvBuffer[i], 0x60);
}
}
gUnknown_02024D1E[0]++;
*pSavedCallback = gMain.savedCallback;
*pSavedBattleTypeFlags = gBattleTypeFlags;
gMain.savedCallback = sub_800F104;
OpenPartyMenu(5, 0);
}
break;
case 2:
if (!gPaletteFade.active)
{
gUnknown_02024D1E[0] = 3;
sub_800832C();
}
break;
case 3:
if (gReceivedRemoteLinkPlayers == 0)
{
gBattleTypeFlags = *pSavedBattleTypeFlags;
gMain.savedCallback = *pSavedCallback;
SetMainCallback2(sub_800E7F8);
}
break;
}
}
void sub_800F298(void)
{
u8 playerId;
s32 id;
playerId = GetMultiplayerId();
ewram160CB = playerId;
RunTasks();
AnimateSprites();
BuildOamBuffer();
switch (gUnknown_02024D1E[0])
{
case 0:
if (gReceivedRemoteLinkPlayers != 0 && sub_8007ECC())
{
ewram0.unk0 = 1;
ewram0.unk1 = 1;
sub_800E9EC();
sub_800EAAC();
SendBlock(bitmask_all_link_players_but_self(), ewram, 0x20);
gUnknown_02024D1E[0]++;
}
break;
case 1:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
u8 taskId;
ResetBlockReceivedFlags();
id = 0;
if (gBlockRecvBuffer[0][0] == 0x100)
{
if (playerId == 0)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
id++;
}
if (id == 0)
{
s32 i;
for (i = 0; i < MAX_LINK_PLAYERS; i++)
{
if (gBlockRecvBuffer[0][0] != gBlockRecvBuffer[i][0])
break;
}
if (i == MAX_LINK_PLAYERS)
{
if (playerId == 0)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
id++;
}
if (id == 0)
{
while (id < MAX_LINK_PLAYERS)
{
if (gBlockRecvBuffer[id][0] == 0x0101 && id != playerId)
if (id < playerId)
break;
if (gBlockRecvBuffer[id][0] > 0x0101 && id != playerId)
break;
id++;
}
if (id == MAX_LINK_PLAYERS)
gBattleTypeFlags |= 12;
else
gBattleTypeFlags |= 8;
}
}
sub_800EB08();
memcpy(ewram1D000, gPlayerParty, sizeof(struct Pokemon) * 3);
taskId = CreateTask(sub_800DE30, 0);
gTasks[taskId].data[1] = 0x10E;
gTasks[taskId].data[2] = 0x5A;
gTasks[taskId].data[5] = 0;
gTasks[taskId].data[3] = 0;
gTasks[taskId].data[4] = 0;
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
gTasks[taskId].data[3] |= gBlockRecvBuffer[id][1] & 0x3F;
break;
case 1:
gTasks[taskId].data[4] |= gBlockRecvBuffer[id][1] & 0x3F;
break;
case 2:
gTasks[taskId].data[3] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
break;
case 3:
gTasks[taskId].data[4] |= (gBlockRecvBuffer[id][1] & 0x3F) << 6;
break;
}
}
ZeroPlayerPartyMons();
ZeroEnemyPartyMons();
gUnknown_02024D1E[0]++;
goto step_2;
}
break;
case 2:
step_2:
if (sub_8007ECC())
{
SendBlock(bitmask_all_link_players_but_self(), ewram1D000, sizeof(struct Pokemon) * 2);
gUnknown_02024D1E[0]++;
}
break;
case 3:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
ResetBlockReceivedFlags();
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
if (id == playerId)
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
case 1:
case 2:
memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
}
}
else
{
if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
|| ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gPlayerParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
case 1:
case 2:
memcpy(gPlayerParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
}
}
else
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gEnemyParty, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
case 1:
case 2:
memcpy(gEnemyParty + 3, gBlockRecvBuffer[id], sizeof(struct Pokemon) * 2);
break;
}
}
}
}
gUnknown_02024D1E[0]++;
}
break;
case 4:
if (sub_8007ECC())
{
SendBlock(bitmask_all_link_players_but_self(), ewram1D000 + 2, sizeof(struct Pokemon));
gUnknown_02024D1E[0]++;
}
break;
case 5:
if ((GetBlockReceivedStatus() & 0xF) == 0xF)
{
ResetBlockReceivedFlags();
for (id = 0; id < MAX_LINK_PLAYERS; id++)
{
if (id == playerId)
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
case 1:
case 2:
memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
}
}
else
{
if ((!(gLinkPlayers[id].lp_field_18 & 1) && !(gLinkPlayers[playerId].lp_field_18 & 1))
|| ((gLinkPlayers[id].lp_field_18 & 1) && (gLinkPlayers[playerId].lp_field_18 & 1)))
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gPlayerParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
case 1:
case 2:
memcpy(gPlayerParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
}
}
else
{
switch (gLinkPlayers[id].lp_field_18)
{
case 0:
case 3:
memcpy(gEnemyParty + 2, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
case 1:
case 2:
memcpy(gEnemyParty + 5, gBlockRecvBuffer[id], sizeof(struct Pokemon));
break;
}
}
}
}
shedinja_something(&gPlayerParty[0]);
shedinja_something(&gPlayerParty[1]);
shedinja_something(&gPlayerParty[2]);
shedinja_something(&gPlayerParty[3]);
shedinja_something(&gPlayerParty[4]);
shedinja_something(&gPlayerParty[5]);
shedinja_something(&gEnemyParty[0]);
shedinja_something(&gEnemyParty[1]);
shedinja_something(&gEnemyParty[2]);
shedinja_something(&gEnemyParty[3]);
shedinja_something(&gEnemyParty[4]);
shedinja_something(&gEnemyParty[5]);
gUnknown_02024D1E[0]++;
}
break;
case 6:
sub_800B950();
gUnknown_02024D1E[0]++;
gUnknown_02024D1E[1] = 0;
gUnknown_02024D1E[2] = 0;
break;
case 7:
if (battle_load_something(gUnknown_02024D1F, gUnknown_02024D1F + 1) != 0)
{
gUnknown_030042D0 = gMain.callback1;
gMain.callback1 = sub_8010824;
SetMainCallback2(sub_800F808);
if (gBattleTypeFlags & BATTLE_TYPE_LINK)
{
gTrainerBattleOpponent = 0x800;
gBattleTypeFlags |= BATTLE_TYPE_20;
}
}
break;
}
}
void sub_800F808(void)
{
AnimateSprites();
BuildOamBuffer();
sub_800374C(&gUnknown_03004210);
UpdatePaletteFade();
RunTasks();
}
void sub_800F828(struct Sprite *sprite)
{
sprite->data0 = 0;
sprite->callback = sub_800F838;
}
void sub_800F838(struct Sprite *sprite)
{
u16 *arr = (u16 *)ewram;
switch (sprite->data0)
{
case 0:
sprite->data0++;
sprite->data1 = 0;
sprite->data2 = 0x281;
sprite->data3 = 0;
sprite->data4 = 1;
// fall through
case 1:
sprite->data4--;
if (sprite->data4 == 0)
{
s32 i;
s32 r2;
s32 r0;
sprite->data4 = 2;
r2 = sprite->data1 + sprite->data3 * 32;
r0 = sprite->data2 - sprite->data3 * 32;
for (i = 0; i < 29; i += 2)
{
arr[r2 + i] = 0x3D;
arr[r0 + i] = 0x3D;
}
sprite->data3++;
if (sprite->data3 == 21)
{
sprite->data0++;
sprite->data1 = 32;
}
}
break;
case 2:
sprite->data1--;
if (sprite->data1 == 20)
SetMainCallback2(sub_800E7C4);
break;
}
}
u8 CreateNPCTrainerParty(struct Pokemon *party, u16 trainerNum)
{
u32 nameHash = 0;
s32 i;
if (trainerNum == 0x400)
return 0;
if ((gBattleTypeFlags & 0x908) == 8)
{
ZeroEnemyPartyMons();
for (i = 0; i < gTrainers[trainerNum].partySize; i++)
{
u32 personalityValue;
s32 j;
u8 fixedIV;
if (gTrainers[trainerNum].doubleBattle == TRUE)
personalityValue = 0x80;
else if (gTrainers[trainerNum].encounterMusic_gender & 0x80)
personalityValue = 0x78;
else
personalityValue = 0x88;
for (j = 0; gTrainers[trainerNum].trainerName[j] != 0xFF; j++)
nameHash += gTrainers[trainerNum].trainerName[j];
switch (gTrainers[trainerNum].partyFlags)
{
case 0:
{
struct TrainerPartyMember0 *partyData = gTrainers[trainerNum].party;
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
break;
}
case 1:
{
struct TrainerPartyMember1 *partyData = gTrainers[trainerNum].party;
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
for (j = 0; j < 4; j++)
{
SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
}
break;
}
case 2:
{
struct TrainerPartyMember2 *partyData = gTrainers[trainerNum].party;
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
break;
}
case 3:
{
struct TrainerPartyMember3 *partyData = gTrainers[trainerNum].party;
for (j = 0; gSpeciesNames[partyData[i].species][j] != 0xFF; j++)
nameHash += gSpeciesNames[partyData[i].species][j];
personalityValue += nameHash << 8;
fixedIV = partyData[i].iv * 31 / 255;
CreateMon(&party[i], partyData[i].species, partyData[i].level, fixedIV, TRUE, personalityValue, 2, 0);
SetMonData(&party[i], MON_DATA_HELD_ITEM, (u8 *)&partyData[i].heldItem);
for (j = 0; j < 4; j++)
{
SetMonData(&party[i], MON_DATA_MOVE1 + j, (u8 *)&partyData[i].moves[j]);
SetMonData(&party[i], MON_DATA_PP1 + j, &gBattleMoves[partyData[i].moves[j]].pp);
}
break;
}
}
}
gBattleTypeFlags |= gTrainers[trainerNum].doubleBattle;
}
return gTrainers[trainerNum].partySize;
}

View File

@@ -1498,7 +1498,7 @@ u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d)
{
for (i = 0; i < 6; i++) //_08044A9A
{
if (gBattleTypeFlags & BATTLE_TYPE_40) // && b[i] != 0xFFFF && b[i]
if (gBattleTypeFlags & BATTLE_TYPE_MULTI) // && b[i] != 0xFFFF && b[i]
{
if (b[i].unk0 == 0xFFFF)
{
@@ -1546,7 +1546,7 @@ u8 sub_8044804(u8 a, const struct UnknownStruct8 *b, u8 c, u8 d)
// Mismatch occurrs in this loop initialization
for (i = 0; i < 6; i++)
{
if (gBattleTypeFlags & BATTLE_TYPE_40)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
if (b[i].unk0 == 0xFFFF)
{

View File

@@ -1130,7 +1130,7 @@ bool32 BerryTreeGrow(struct BerryTree *tree)
return TRUE;
}
void BerryTreeTimeUpdate(int time)
void BerryTreeTimeUpdate(s32 minutes)
{
int i;
struct BerryTree *tree;
@@ -1141,27 +1141,27 @@ void BerryTreeTimeUpdate(int time)
if (tree->berry && tree->stage && !tree->growthSparkle)
{
if (time >= GetStageDurationByBerryType(tree->berry) * 71)
if (minutes >= GetStageDurationByBerryType(tree->berry) * 71)
{
*tree = gBlankBerryTree;
}
else
{
int time2 = time;
s32 time = minutes;
while (time2 != 0)
while (time != 0)
{
if (tree->secondsUntilNextStage > time2)
if (tree->minutesUntilNextStage > time)
{
tree->secondsUntilNextStage -= time2;
tree->minutesUntilNextStage -= time;
break;
}
time2 -= tree->secondsUntilNextStage;
tree->secondsUntilNextStage = GetStageDurationByBerryType(tree->berry);
time -= tree->minutesUntilNextStage;
tree->minutesUntilNextStage = GetStageDurationByBerryType(tree->berry);
if (!BerryTreeGrow(tree))
break;
if (tree->stage == 5)
tree->secondsUntilNextStage *= 4;
tree->minutesUntilNextStage *= 4;
}
}
}
@@ -1174,12 +1174,12 @@ void PlantBerryTree(u8 id, u8 berry, u8 stage, bool8 sparkle)
*tree = gBlankBerryTree;
tree->berry = berry;
tree->secondsUntilNextStage = GetStageDurationByBerryType(berry);
tree->minutesUntilNextStage = GetStageDurationByBerryType(berry);
tree->stage = stage;
if (stage == 5)
{
tree->berryYield = CalcBerryYield(tree);
tree->secondsUntilNextStage *= 4;
tree->minutesUntilNextStage *= 4;
}
if (!sparkle)
{

View File

@@ -8,17 +8,17 @@
#include "rtc.h"
#include "wallclock.h"
extern void sub_80FA220(u16);
extern void sub_80BE8C4(u16);
extern void sub_8080834(u16);
extern void UpdateDewfordTrendPerDay(u16);
extern void UpdateTVShowsPerDay(u16);
extern void UpdateWeatherPerDay(u16);
extern void UpdatePartyPokerusTime(u16);
extern void UpdateMirageRnd(u16);
extern void UpdateBirchState(u16);
extern void sub_810F618(u16);
extern void SetShoalItemFlag(u16);
static void InitTimeBasedEvents(void);
static void UpdatePerDay(struct Time *time);
static void UpdatePerSecond(struct Time *time);
static void UpdatePerMinute(struct Time *time);
static void ReturnFromStartWallClock(void);
static void InitTimeBasedEvents(void)
@@ -35,7 +35,7 @@ void DoTimeBasedEvents(void)
{
RtcCalcLocalTime();
UpdatePerDay(&gLocalTime);
UpdatePerSecond(&gLocalTime);
UpdatePerMinute(&gLocalTime);
}
}
@@ -49,32 +49,32 @@ static void UpdatePerDay(struct Time *time)
{
newDays = time->days - days;
ClearUpperFlags();
sub_80FA220(newDays);
sub_80BE8C4(newDays);
sub_8080834(newDays);
UpdateDewfordTrendPerDay(newDays);
UpdateTVShowsPerDay(newDays);
UpdateWeatherPerDay(newDays);
UpdatePartyPokerusTime(newDays);
UpdateMirageRnd(newDays);
UpdateBirchState(newDays);
sub_810F618(newDays);
SetShoalItemFlag(newDays);
SetRandomLotteryNumber(newDays);
*varPtr = time->days;
}
}
static void UpdatePerSecond(struct Time *time)
static void UpdatePerMinute(struct Time *time)
{
struct Time newTime;
s32 totalSeconds;
s32 minutes;
CalcTimeDifference(&newTime, &gSaveBlock2.lastBerryTreeUpdate, time);
totalSeconds = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes;
minutes = 1440 * newTime.days + 60 * newTime.hours + newTime.minutes;
// there's no way to get the correct assembly other than with this nested if check. so dumb.
if (totalSeconds != 0)
if (minutes != 0)
{
if (totalSeconds >= 0)
if (minutes >= 0)
{
BerryTreeTimeUpdate(totalSeconds);
BerryTreeTimeUpdate(minutes);
gSaveBlock2.lastBerryTreeUpdate = *time;
}
}

View File

@@ -19,7 +19,7 @@ static bool8 SB1ContainsWords(u16 *a);
static bool8 IsEasyChatPairEqual(u16 *words1, u16 *words2);
static s16 sub_80FA828(struct EasyChatPair *a, u16 b);
void InitDewfordTrends(void)
void InitDewfordTrend(void)
{
u16 i;
@@ -38,244 +38,63 @@ void InitDewfordTrends(void)
sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0);
}
#ifdef NONMATCHING
void sub_80FA220(u16 a)
void UpdateDewfordTrendPerDay(u16 a)
{
u16 i;
u32 sp0;
u32 sp4;
if (a != 0)
{
sp0 = a * 5;
u32 sp0 = a * 5;
for (i = 0; i < 5; i++)
{
//_080FA24A
u32 r2 = sp0;
u32 r4;
u32 r2 = sp0;
struct EasyChatPair *r5 = &gSaveBlock1.easyChatPairs[i];
if (gSaveBlock1.easyChatPairs[i].unk1_6 == 0)
if (r5->unk1_6 == 0)
{
if (gSaveBlock1.easyChatPairs[i].unk0_0 >= r2)
if (r5->unk0_0 >= (u16)r2)
{
gSaveBlock1.easyChatPairs[i].unk0_0 -= r2;
if (gSaveBlock1.easyChatPairs[i].unk0_0 == 0)
gSaveBlock1.easyChatPairs[i].unk1_6 = 1;
r5->unk0_0 -= r2;
if (r5->unk0_0 == 0)
r5->unk1_6 = 1;
continue;
}
//_080FA290
r2 -= gSaveBlock1.easyChatPairs[i].unk0_0;
gSaveBlock1.easyChatPairs[i].unk1_6 = 1;
r2 -= r5->unk0_0;
r5->unk0_0 = 0;
r5->unk1_6 = 1;
}
//_080FA2A0
r4 = gSaveBlock1.easyChatPairs[i].unk0_0 + r2;
if (r4 > gSaveBlock1.easyChatPairs[i].unk0_7)
r4 = r5->unk0_0 + r2;
if ((u16)r4 > r5->unk0_7)
{
sp4 = r4 % gSaveBlock1.easyChatPairs[i].unk0_7;
r4 = r4 / gSaveBlock1.easyChatPairs[i].unk0_7;
u32 sp4 = r4 % r5->unk0_7;
r4 = r4 / r5->unk0_7;
if (r4 == 0)
gSaveBlock1.easyChatPairs[i].unk1_6 = 1;
r5->unk1_6 = r4 ^ 1;
if (r5->unk1_6)
r5->unk0_0 = sp4;
else
gSaveBlock1.easyChatPairs[i].unk1_6 = 0;
if (gSaveBlock1.easyChatPairs[i].unk1_6)
{
gSaveBlock1.easyChatPairs[i].unk0_0 += sp4;
continue;
}
//_080FA2FA
gSaveBlock1.easyChatPairs[i].unk0_7 -= sp4;
continue;
r5->unk0_0 = r5->unk0_7 - sp4;
}
//_080FA310
gSaveBlock1.easyChatPairs[i].unk0_0 = r4;
else
{
//_080FA310
r5->unk0_0 = r4;
if (gSaveBlock1.easyChatPairs[i].unk0_0 == gSaveBlock1.easyChatPairs[i].unk0_7)
gSaveBlock1.easyChatPairs[i].unk1_6 = 0;
if (r5->unk0_0 == r5->unk0_7)
r5->unk1_6 = 0;
}
}
sub_80FA46C(gSaveBlock1.easyChatPairs, 5, 0);
}
//_080FA34E
}
#else
__attribute__((naked))
void sub_80FA220(u16 a)
{
asm(".syntax unified\n\
push {r4-r7,lr}\n\
mov r7, r10\n\
mov r6, r9\n\
mov r5, r8\n\
push {r5-r7}\n\
sub sp, 0x8\n\
lsls r0, 16\n\
lsrs r1, r0, 16\n\
cmp r1, 0\n\
bne _080FA236\n\
b _080FA34E\n\
_080FA236:\n\
lsls r0, r1, 2\n\
adds r0, r1\n\
str r0, [sp]\n\
movs r0, 0\n\
mov r10, r0\n\
movs r1, 0x7F\n\
mov r9, r1\n\
movs r2, 0x80\n\
negs r2, r2\n\
mov r8, r2\n\
_080FA24A:\n\
ldr r2, [sp]\n\
mov r4, r10\n\
lsls r0, r4, 3\n\
ldr r1, _080FA28C @ =gSaveBlock1 + 0x2DD4\n\
adds r5, r0, r1\n\
ldrb r6, [r5, 0x1]\n\
movs r0, 0x40\n\
ands r0, r6\n\
cmp r0, 0\n\
bne _080FA2A0\n\
ldrb r4, [r5]\n\
lsls r3, r4, 25\n\
lsrs r1, r3, 25\n\
lsls r0, r2, 16\n\
lsrs r0, 16\n\
cmp r1, r0\n\
bcc _080FA290\n\
adds r0, r1, 0\n\
subs r0, r2\n\
mov r2, r9\n\
ands r0, r2\n\
mov r1, r8\n\
ands r1, r4\n\
orrs r1, r0\n\
strb r1, [r5]\n\
movs r0, 0x7F\n\
ands r1, r0\n\
cmp r1, 0\n\
bne _080FA336\n\
movs r0, 0x40\n\
orrs r0, r6\n\
b _080FA334\n\
.align 2, 0\n\
_080FA28C: .4byte gSaveBlock1 + 0x2DD4\n\
_080FA290:\n\
lsrs r0, r3, 25\n\
subs r2, r0\n\
mov r0, r8\n\
ands r0, r4\n\
strb r0, [r5]\n\
movs r0, 0x40\n\
orrs r0, r6\n\
strb r0, [r5, 0x1]\n\
_080FA2A0:\n\
ldrb r7, [r5]\n\
lsls r0, r7, 25\n\
lsrs r0, 25\n\
adds r4, r0, r2\n\
ldrh r0, [r5]\n\
lsls r6, r0, 18\n\
lsls r0, r4, 16\n\
lsrs r0, 16\n\
lsrs r1, r6, 25\n\
cmp r0, r1\n\
bls _080FA310\n\
adds r0, r4, 0\n\
bl __umodsi3\n\
adds r3, r0, 0\n\
lsrs r1, r6, 25\n\
adds r0, r4, 0\n\
str r3, [sp, 0x4]\n\
bl __udivsi3\n\
adds r4, r0, 0\n\
movs r0, 0x1\n\
eors r4, r0\n\
ands r4, r0\n\
lsls r2, r4, 6\n\
ldrb r0, [r5, 0x1]\n\
movs r4, 0x41\n\
negs r4, r4\n\
adds r1, r4, 0\n\
ands r0, r1\n\
orrs r0, r2\n\
strb r0, [r5, 0x1]\n\
movs r1, 0x40\n\
ands r0, r1\n\
ldr r3, [sp, 0x4]\n\
cmp r0, 0\n\
beq _080FA2FA\n\
adds r1, r3, 0\n\
mov r0, r9\n\
ands r1, r0\n\
mov r0, r8\n\
ands r0, r7\n\
orrs r0, r1\n\
strb r0, [r5]\n\
b _080FA336\n\
_080FA2FA:\n\
ldrh r0, [r5]\n\
lsls r0, 18\n\
lsrs r0, 25\n\
subs r0, r3\n\
mov r1, r9\n\
ands r0, r1\n\
mov r1, r8\n\
ands r1, r7\n\
orrs r1, r0\n\
strb r1, [r5]\n\
b _080FA336\n\
_080FA310:\n\
mov r2, r9\n\
ands r4, r2\n\
mov r0, r8\n\
ands r0, r7\n\
orrs r0, r4\n\
strb r0, [r5]\n\
lsls r0, 25\n\
ldrh r1, [r5]\n\
lsls r1, 18\n\
lsrs r0, 25\n\
lsrs r1, 25\n\
cmp r0, r1\n\
bne _080FA336\n\
ldrb r0, [r5, 0x1]\n\
movs r4, 0x41\n\
negs r4, r4\n\
adds r1, r4, 0\n\
ands r0, r1\n\
_080FA334:\n\
strb r0, [r5, 0x1]\n\
_080FA336:\n\
mov r0, r10\n\
adds r0, 0x1\n\
lsls r0, 16\n\
lsrs r0, 16\n\
mov r10, r0\n\
cmp r0, 0x4\n\
bls _080FA24A\n\
ldr r0, _080FA360 @ =gSaveBlock1 + 0x2DD4\n\
movs r1, 0x5\n\
movs r2, 0\n\
bl sub_80FA46C\n\
_080FA34E:\n\
add sp, 0x8\n\
pop {r3-r5}\n\
mov r8, r3\n\
mov r9, r4\n\
mov r10, r5\n\
pop {r4-r7}\n\
pop {r0}\n\
bx r0\n\
.align 2, 0\n\
_080FA360: .4byte gSaveBlock1 + 0x2DD4\n\
.syntax divided\n");
}
#endif
bool8 sub_80FA364(u16 *a)
{
struct EasyChatPair s = {0};

View File

@@ -145,7 +145,7 @@ void NewGameInitData(void)
ClearDecorationInventories();
InitEasyChatPhrases();
SetMauvilleOldMan();
InitDewfordTrends();
InitDewfordTrend();
ResetFanClub();
ResetLotteryCorner();
WarpToTruck();

View File

@@ -123,7 +123,7 @@ void sub_800B950(void)
else
sub_800B9A8();
sub_800BD54();
if (!(gBattleTypeFlags & BATTLE_TYPE_40))
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
for (i = 0; i < gUnknown_02024A68; i++)
sub_8094978(i, 0);
@@ -187,7 +187,7 @@ void sub_800BA78(void)
}
return;
}
if ((gBattleTypeFlags & (BATTLE_TYPE_40 | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE)
if ((gBattleTypeFlags & (BATTLE_TYPE_MULTI | BATTLE_TYPE_DOUBLE)) == BATTLE_TYPE_DOUBLE)
{
if (gBattleTypeFlags & BATTLE_TYPE_WILD)
{
@@ -298,7 +298,7 @@ void sub_800BD54(void)
int i;
int j;
if (!(gBattleTypeFlags & BATTLE_TYPE_40))
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
{
for (i = 0; i < gUnknown_02024A68; i++)
{

View File

@@ -34,7 +34,7 @@ extern u8 BattleText_Tie[];
#define PRINT_MESSAGE_LEFT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, LEFT_MESSAGE_X)
#define PRINT_MESSAGE_RIGHT(text, tileDataStartOffset) PRINT_MESSAGE(text, tileDataStartOffset, RIGHT_MESSAGE_X)
void sub_800DC24(void)
void PrintLinkBattleWinLossTie(void)
{
if (gUnknown_02024D26 == 3)
@@ -43,7 +43,7 @@ void sub_800DC24(void)
return;
}
if (gBattleTypeFlags & BATTLE_TYPE_40)
if (gBattleTypeFlags & BATTLE_TYPE_MULTI)
{
// Double battle?

View File

@@ -339,7 +339,7 @@ void PlayCry4(u16 species, s8 pan, u8 mode)
}
else
{
if (!(gBattleTypeFlags & BATTLE_TYPE_40))
if (!(gBattleTypeFlags & BATTLE_TYPE_MULTI))
m4aMPlayVolumeControl(&gMPlay_BGM, 0xFFFF, 85);
PlayCryInternal(species, pan, 125, 10, mode);
}

View File

@@ -256,7 +256,7 @@ void EndMassOutbreak(void)
gSaveBlock1.outbreakUnk5 = 0;
}
void sub_80BE8C4(u16 arg0)
void UpdateTVShowsPerDay(u16 arg0)
{
sub_80BE8EC(arg0);
UpdateMassOutbreakTimeLeft(arg0);