diff options
author | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-09-30 01:55:51 -0400 |
---|---|---|
committer | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-09-30 01:55:51 -0400 |
commit | 044e8cc93b46fccb2e4e5ed5accf4c55917a3f7f (patch) | |
tree | 3628ac48decbc59229a6a92ac1270f5bbed4a4bb /src | |
parent | 0cac170dfd3bfa9c2386b0b230655ace9dea7f11 (diff) | |
parent | f74d4742f597a423b7a8685d72c06597c8c78db7 (diff) |
merge
Diffstat (limited to 'src')
-rw-r--r-- | src/battle/battle_4.c | 1242 | ||||
-rw-r--r-- | src/battle/battle_anim_80CA710.c | 18 | ||||
-rw-r--r-- | src/debug/mori_debug_menu.c | 8 | ||||
-rw-r--r-- | src/engine/record_mixing.c | 32 | ||||
-rw-r--r-- | src/engine/trade.c | 1 | ||||
-rw-r--r-- | src/field/bike.c | 2 | ||||
-rw-r--r-- | src/field/daycare.c | 1836 | ||||
-rw-r--r-- | src/field/decoration_inventory.c | 2 | ||||
-rw-r--r-- | src/field/easy_chat.c | 2 | ||||
-rw-r--r-- | src/field/field_effect.c | 1 | ||||
-rw-r--r-- | src/field/field_effect_helpers.c | 1632 | ||||
-rw-r--r-- | src/field/field_ground_effect.c | 13 | ||||
-rw-r--r-- | src/field/field_map_obj.c | 450 | ||||
-rw-r--r-- | src/field/field_map_obj_helpers.c | 2 | ||||
-rw-r--r-- | src/field/field_player_avatar.c | 6 | ||||
-rw-r--r-- | src/field/field_tasks.c | 8 | ||||
-rw-r--r-- | src/field/field_weather.c | 2 | ||||
-rw-r--r-- | src/field/fieldmap.c | 12 | ||||
-rw-r--r-- | src/field/pokeblock.c | 2 | ||||
-rw-r--r-- | src/field/pokenav.c | 2 | ||||
-rw-r--r-- | src/field/use_pokeblock.c | 2 | ||||
-rw-r--r-- | src/pokemon/pokemon_1.c | 4 |
22 files changed, 3830 insertions, 1449 deletions
diff --git a/src/battle/battle_4.c b/src/battle/battle_4.c index 65ea765cf..d37ad197d 100644 --- a/src/battle/battle_4.c +++ b/src/battle/battle_4.c @@ -93,6 +93,7 @@ extern u16 gUnknown_02024C2C[4]; //last used moves 2, used by sketch extern u16 gUnknown_030041B0; extern u16 gUnknown_02024C4C[4]; //last used moves by banks, another one extern u8 gCurrentMoveTurn; +extern u16 gTrappingMoves[]; //extern functions u8 AtkCanceller_UnableToUseMove(void); @@ -199,6 +200,9 @@ extern u8 BattleScript_TrainerBallBlock[]; extern u8 BattleScript_WallyBallThrow[]; extern u8 BattleScript_SuccessBallThrow[]; extern u8 BattleScript_ShakeBallThrow[]; +extern u8 BattleScript_AllStatsUp[]; +extern u8 BattleScript_AtkDefDown[]; +extern u8 BattleScript_SAtkDown2[]; extern u8 gUnknown_081D919F[]; //spikes1 extern u8 gUnknown_081D9171[]; //spikes2 @@ -211,6 +215,11 @@ extern u8 BattleScript_CastformChange[]; extern u8 gUnknown_081D9834[]; extern u8 gUnknown_081D90FC[]; //bs random switchout extern u8 gUnknown_081D95DB[]; //bs payday money give +extern u8 gUnknown_081D8C58[]; +extern u8 gUnknown_081D8C65[]; +extern u8 gUnknown_081D9156[]; +extern u8 gUnknown_081D9468[]; + //useful macros //read via orr @@ -408,6 +417,7 @@ static void atk85_stockpile(void); static void atk86_stockpiletobasedamage(void); static void atk87_stockpiletohpheal(void); static void atk88_negativedamage(void); +static u8 ChangeStatBuffs(s8, u8, u8, u8*); static void atk89_statbuffchange(void); static void atk8A_normalisebuffs(void); static void atk8B_setbide(void); @@ -862,19 +872,19 @@ static const u32 gStatusFlagsForMoveEffects[] = 0x00000000 }; -extern const u8 BattleScript_1D963E[]; -extern const u8 BattleScript_1D965A[]; -extern const u8 BattleScript_1D9669[]; -extern const u8 BattleScript_1D9678[]; -extern const u8 BattleScript_1D9687[]; -extern const u8 BattleScript_1D969D[]; -extern const u8 BattleScript_1D96BA[]; -extern const u8 BattleScript_1D9696[]; -extern const u8 BattleScript_1D96B1[]; -extern const u8 BattleScript_1D96AA[]; -extern const u8 BattleScript_1D96C8[]; +extern u8 BattleScript_1D963E[]; +extern u8 BattleScript_1D965A[]; +extern u8 BattleScript_1D9669[]; +extern u8 BattleScript_1D9678[]; +extern u8 BattleScript_1D9687[]; +extern u8 BattleScript_1D969D[]; +extern u8 BattleScript_1D96BA[]; +extern u8 BattleScript_1D9696[]; +extern u8 BattleScript_1D96B1[]; +extern u8 BattleScript_1D96AA[]; +extern u8 BattleScript_1D96C8[]; -const u8* const gMoveEffectBS_Ptrs[] = +u8* const gMoveEffectBS_Ptrs[] = { BattleScript_1D963E, BattleScript_1D963E, @@ -947,7 +957,7 @@ static const u16 sUnknown_081FACFE[] = //banned moves to copy 0xFFFF }; -static const u8 sUnknown_081FAD26[] = +static const u8 sUnknown_081FAD26[] = //reversal+flail HP thresholds to power { 1, 200, 4, 150, @@ -1445,73 +1455,71 @@ static void atk06_typecalc(void) { int i = 0; u8 move_type; - if (gCurrentMove == MOVE_STRUGGLE) {goto END;} - - if (BATTLE_STRUCT->dynamicMoveType) - move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; - else - move_type = gBattleMoves[gCurrentMove].type; - - //check stab - if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) + if (gCurrentMove != MOVE_STRUGGLE) { - gBattleMoveDamage = gBattleMoveDamage * 15; - gBattleMoveDamage = gBattleMoveDamage / 10; - } + if (BATTLE_STRUCT->dynamicMoveType) + move_type = BATTLE_STRUCT->dynamicMoveType & 0x3F; + else + move_type = gBattleMoves[gCurrentMove].type; - if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) - { - gLastUsedAbility = gBattleMons[gBankTarget].ability; - gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = move_type; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); - } - else - { - while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) + //check stab + if (gBattleMons[gBankAttacker].type1 == move_type || gBattleMons[gBankAttacker].type2 == move_type) { - if (gTypeEffectiveness[i] == TYPE_FORESIGHT) - { - if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) - break; - i += 3; - continue; - } + gBattleMoveDamage = gBattleMoveDamage * 15; + gBattleMoveDamage = gBattleMoveDamage / 10; + } - else if (gTypeEffectiveness[i] == move_type) + if (gBattleMons[gBankTarget].ability == ABILITY_LEVITATE && move_type == TYPE_GROUND) + { + gLastUsedAbility = gBattleMons[gBankTarget].ability; + gBattleMoveFlags |= (MOVESTATUS_MISSED | MOVESTATUS_NOTAFFECTED); + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = move_type; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + else + { + while (gTypeEffectiveness[i]!= TYPE_ENDTABLE) { - //check type1 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) - ModulateDmgByType(gTypeEffectiveness[i + 2]); - //check type2 - if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && - gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) - ModulateDmgByType(gTypeEffectiveness[i + 2]); + if (gTypeEffectiveness[i] == TYPE_FORESIGHT) + { + if (gBattleMons[gBankTarget].status2 & STATUS2_FORESIGHT) + break; + i += 3; + continue; + } + + else if (gTypeEffectiveness[i] == move_type) + { + //check type1 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type1) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + //check type2 + if (gTypeEffectiveness[i + 1] == gBattleMons[gBankTarget].type2 && + gBattleMons[gBankTarget].type1 != gBattleMons[gBankTarget].type2) + ModulateDmgByType(gTypeEffectiveness[i + 2]); + } + i += 3; } - i += 3; } - } - if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 - && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) - && gBattleMoves[gCurrentMove].power) - { - gLastUsedAbility = ABILITY_WONDER_GUARD; - gBattleMoveFlags |= MOVESTATUS_MISSED; - gMoveHitWith[gBankTarget] = 0; - gUnknown_02024C44[gBankTarget] = 0; - gBattleCommunication[6] = 3; - RecordAbilityBattle(gBankTarget, gLastUsedAbility); + if (gBattleMons[gBankTarget].ability == ABILITY_WONDER_GUARD && AttacksThisTurn(gBankAttacker, gCurrentMove) == 2 + && (!(gBattleMoveFlags & MOVESTATUS_SUPEREFFECTIVE) || ((gBattleMoveFlags & (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE)) == (MOVESTATUS_SUPEREFFECTIVE | MOVESTATUS_NOTVERYEFFECTIVE))) + && gBattleMoves[gCurrentMove].power) + { + gLastUsedAbility = ABILITY_WONDER_GUARD; + gBattleMoveFlags |= MOVESTATUS_MISSED; + gMoveHitWith[gBankTarget] = 0; + gUnknown_02024C44[gBankTarget] = 0; + gBattleCommunication[6] = 3; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); + } + if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) + gProtectStructs[gBankAttacker].notEffective = 1; } - if (gBattleMoveFlags & MOVESTATUS_NOTAFFECTED) - gProtectStructs[gBankAttacker].notEffective = 1; - - END: - gBattlescriptCurrInstr++; + gBattlescriptCurrInstr++; } - static void b_wonderguard_and_levitate(void) { u8 flags = 0; @@ -1620,7 +1628,6 @@ static void ModulateDmgByType2(u8 multiplier, u16 move, u8* flags) //a literal c } } -#ifdef NONMATCHING u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) { int i = 0; @@ -1662,7 +1669,7 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); //check type2 if (gTypeEffectiveness[i + 1] == gBattleMons[bank_def].type2 && - gBattleMons[bank_def].type1 != gBattleMons[bank_def].type2) + gBattleMons[gBankTarget /* what the christ */].type1 != gBattleMons[bank_def].type2) ModulateDmgByType2(gTypeEffectiveness[i + 2], move, &flags); } i += 3; @@ -1678,254 +1685,6 @@ u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) } return flags; } -#else -__attribute__((naked)) -u8 TypeCalc(u16 move, u8 bank_atk, u8 bank_def) -{ - 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, 0x14\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r10, r0\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - str r1, [sp, 0x4]\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - mov r9, r2\n\ - movs r7, 0\n\ - mov r0, sp\n\ - strb r7, [r0]\n\ - mov r0, r10\n\ - cmp r0, 0xA5\n\ - bne _0801D2AE\n\ - movs r0, 0\n\ - b _0801D43A\n\ - _0801D2AE:\n\ - ldr r1, _0801D31C @ =gBattleMoves\n\ - mov r3, r10\n\ - lsls r2, r3, 1\n\ - adds r0, r2, r3\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldrb r0, [r0, 0x2]\n\ - str r0, [sp, 0x8]\n\ - ldr r1, _0801D320 @ =gBattleMons\n\ - movs r0, 0x58\n\ - ldr r3, [sp, 0x4]\n\ - muls r0, r3\n\ - adds r3, r0, r1\n\ - adds r0, r3, 0\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - str r2, [sp, 0xC]\n\ - adds r5, r1, 0\n\ - ldr r1, [sp, 0x8]\n\ - cmp r0, r1\n\ - beq _0801D2E2\n\ - adds r0, r3, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r0, r1\n\ - bne _0801D2F4\n\ - _0801D2E2:\n\ - ldr r4, _0801D324 @ =gBattleMoveDamage\n\ - ldr r1, [r4]\n\ - lsls r0, r1, 4\n\ - subs r0, r1\n\ - str r0, [r4]\n\ - movs r1, 0xA\n\ - bl __divsi3\n\ - str r0, [r4]\n\ - _0801D2F4:\n\ - movs r0, 0x58\n\ - mov r2, r9\n\ - muls r2, r0\n\ - adds r0, r2, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x1A\n\ - bne _0801D328\n\ - ldr r3, [sp, 0x8]\n\ - cmp r3, 0x4\n\ - bne _0801D328\n\ - movs r1, 0x9\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - orrs r0, r1\n\ - mov r1, sp\n\ - strb r0, [r1]\n\ - b _0801D3DC\n\ - .align 2, 0\n\ - _0801D31C: .4byte gBattleMoves\n\ - _0801D320: .4byte gBattleMons\n\ - _0801D324: .4byte gBattleMoveDamage\n\ - _0801D328:\n\ - ldr r1, _0801D344 @ =gTypeEffectiveness\n\ - adds r0, r7, r1\n\ - ldrb r0, [r0]\n\ - adds r2, r1, 0\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - b _0801D3CA\n\ - .align 2, 0\n\ - _0801D344: .4byte gTypeEffectiveness\n\ - _0801D348:\n\ - adds r7, 0x3\n\ - b _0801D3B6\n\ - _0801D34C:\n\ - ldr r6, _0801D44C @ =gTypeEffectiveness\n\ - adds r0, r7, r6\n\ - ldrb r0, [r0]\n\ - ldr r2, [sp, 0x8]\n\ - cmp r0, r2\n\ - bne _0801D3B0\n\ - adds r1, r7, 0x1\n\ - adds r1, r6\n\ - ldr r3, _0801D450 @ =gBattleMons\n\ - mov r8, r3\n\ - movs r3, 0x58\n\ - mov r0, r9\n\ - muls r0, r3\n\ - mov r2, r8\n\ - adds r5, r0, r2\n\ - adds r0, r5, 0\n\ - adds r0, 0x21\n\ - ldrb r4, [r1]\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D388\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - str r3, [sp, 0x10]\n\ - bl ModulateDmgByType2\n\ - ldr r3, [sp, 0x10]\n\ - _0801D388:\n\ - adds r0, r5, 0\n\ - adds r0, 0x22\n\ - ldrb r0, [r0]\n\ - cmp r4, r0\n\ - bne _0801D3B0\n\ - ldr r0, _0801D454 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - muls r0, r3\n\ - add r0, r8\n\ - adds r0, 0x21\n\ - ldrb r0, [r0]\n\ - cmp r0, r4\n\ - beq _0801D3B0\n\ - adds r0, r7, 0x2\n\ - adds r0, r6\n\ - ldrb r0, [r0]\n\ - mov r1, r10\n\ - mov r2, sp\n\ - bl ModulateDmgByType2\n\ - _0801D3B0:\n\ - adds r7, 0x3\n\ - ldr r5, _0801D450 @ =gBattleMons\n\ - ldr r2, _0801D44C @ =gTypeEffectiveness\n\ - _0801D3B6:\n\ - adds r0, r7, r2\n\ - ldrb r0, [r0]\n\ - cmp r0, 0xFF\n\ - beq _0801D3DC\n\ - cmp r0, 0xFE\n\ - bne _0801D34C\n\ - movs r0, 0x58\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - _0801D3CA:\n\ - adds r1, r5, 0\n\ - adds r1, 0x50\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 22\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801D348\n\ - _0801D3DC:\n\ - movs r0, 0x58\n\ - mov r1, r9\n\ - muls r1, r0\n\ - adds r0, r1, 0\n\ - adds r0, r5\n\ - adds r0, 0x20\n\ - ldrb r0, [r0]\n\ - cmp r0, 0x19\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r1, [r0]\n\ - movs r0, 0x1\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801D436\n\ - ldr r0, [sp, 0x4]\n\ - mov r1, r10\n\ - bl AttacksThisTurn\n\ - lsls r0, 24\n\ - lsrs r1, r0, 24\n\ - cmp r1, 0x2\n\ - bne _0801D436\n\ - mov r0, sp\n\ - ldrb r3, [r0]\n\ - adds r0, r1, 0\n\ - ands r0, r3\n\ - cmp r0, 0\n\ - beq _0801D41E\n\ - movs r0, 0x6\n\ - ands r0, r3\n\ - cmp r0, 0x6\n\ - bne _0801D436\n\ - _0801D41E:\n\ - ldr r0, _0801D458 @ =gBattleMoves\n\ - ldr r1, [sp, 0xC]\n\ - add r1, r10\n\ - lsls r1, 2\n\ - adds r1, r0\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0\n\ - beq _0801D436\n\ - mov r0, sp\n\ - movs r1, 0x1\n\ - orrs r1, r3\n\ - strb r1, [r0]\n\ - _0801D436:\n\ - mov r0, sp\n\ - ldrb r0, [r0]\n\ - _0801D43A:\n\ - add sp, 0x14\n\ - pop {r3-r5}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - mov r10, r5\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ - _0801D44C: .4byte gTypeEffectiveness\n\ - _0801D450: .4byte gBattleMons\n\ - _0801D454: .4byte gBankTarget\n\ - _0801D458: .4byte gBattleMoves\n\ - .syntax divided\n"); -} -#endif // NONMATCHING u8 AI_TypeCalc(u16 move, u16 species, u8 ability) { @@ -2510,7 +2269,7 @@ void SetMoveEffect(bool8 primary, u8 certainArg) #define EffectAffectsUser 0x40 register u8 certain asm("r5") = certainArg; register bool32 StatusChanged asm("r10") = 0; - register int AffectsUser asm("r6") = 0; //0x40 otherwise + register int AffectsUser asm("r6") = 0; //0x40 otherwise bool32 NoSunCanFreeze = 1; if (gBattleCommunication[MOVE_EFFECT_BYTE] & EffectAffectsUser) @@ -2526,16 +2285,16 @@ void SetMoveEffect(bool8 primary, u8 certainArg) BATTLE_STRUCT->scriptingActive = gBankAttacker; } - if (gBattleMons[gEffectBank].ability_id == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gBattleMons[gEffectBank].ability == ABILITY_SHIELD_DUST && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 9) {gBattlescriptCurrInstr++; return;} - if (gSideAffecting[get_bank_identity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && + if (gSideAffecting[GetBankIdentity(gEffectBank) & 1] & SIDE_STATUS_SAFEGUARD && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && !primary && gBattleCommunication[MOVE_EFFECT_BYTE] <= 7) {gBattlescriptCurrInstr++; return;} //make sure at least ONE HP except payday and thief - if (gBattleMons[gEffectBank].current_hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) + if (gBattleMons[gEffectBank].hp == 0 && gBattleCommunication[MOVE_EFFECT_BYTE] != 0xB && gBattleCommunication[MOVE_EFFECT_BYTE] != 0x1F) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_SUBSTITUTE && AffectsUser != EffectAffectsUser) @@ -2547,81 +2306,82 @@ void SetMoveEffect(bool8 primary, u8 certainArg) { case STATUS_SLEEP: //check active uproar - if (gBattleMons[gEffectBank].ability_id != ABILITY_SOUNDPROOF) + if (gBattleMons[gEffectBank].ability != ABILITY_SOUNDPROOF) { for (gActiveBank = 0; gActiveBank < gNoOfAllBanks && !(gBattleMons[gActiveBank].status2 & STATUS2_UPROAR); gActiveBank++) {} } else gActiveBank = gNoOfAllBanks; - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gActiveBank != gNoOfAllBanks) {break;} //nice way of checking uproar... - if (gBattleMons[gEffectBank].ability_id == ABILITY_VITAL_SPIRIT) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_INSOMNIA) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_VITAL_SPIRIT) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_INSOMNIA) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_POISON) {break;} if (gBattleMons[gEffectBank].type1 == TYPE_STEEL) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_STEEL) {break;} - if (gBattleMons[gEffectBank].status) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} + if (gBattleMons[gEffectBank].status1) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + StatusChanged = 1; break; case STATUS_BURN: - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_WATER_VEIL; - RecordAbility(gEffectBank, ABILITY_WATER_VEIL); + RecordAbilityBattle(gEffectBank, ABILITY_WATER_VEIL); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_BRN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_FIRE || gBattleMons[gEffectBank].type2 == TYPE_FIRE) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_BRN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_BRNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } if (gBattleMons[gEffectBank].type1 == TYPE_FIRE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_FIRE) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_WATER_VEIL) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_WATER_VEIL) {break;} if (gBattleMons[gEffectBank].status1 == 0) {break;} StatusChanged = 1; break; @@ -2629,70 +2389,70 @@ void SetMoveEffect(bool8 primary, u8 certainArg) if (WEATHER_HAS_EFFECT && gBattleWeather & WEATHER_SUN_ANY) {NoSunCanFreeze = 0;} if (gBattleMons[gEffectBank].type1 == TYPE_ICE) {break;} if (gBattleMons[gEffectBank].type2 == TYPE_ICE) {break;} - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (NoSunCanFreeze == 0) {break;} - if (gBattleMons[gEffectBank].ability_id == ABILITY_MAGMA_ARMOR) {break;} + if (gBattleMons[gEffectBank].ability == ABILITY_MAGMA_ARMOR) {break;} - b_cancel_multi_turn_move_maybe(gEffectBank); + CancelMultiTurnMoves(gEffectBank); StatusChanged = 1; break; case STATUS_PARALYSIS: - if (gBattleMons[gEffectBank].ability_id == ABILITY_LIMBER) + if (gBattleMons[gEffectBank].ability == ABILITY_LIMBER) { if ((primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_LIMBER; - RecordAbility(gEffectBank, ABILITY_LIMBER); + RecordAbilityBattle(gEffectBank, ABILITY_LIMBER); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PRLZ_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PRLZPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } else {break;} } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} StatusChanged = 1; break; case STATUS_TOXIC_POISON: - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY && (primary == 1 || certain == 0x80)) { gLastUsedAbility = ABILITY_IMMUNITY; - RecordAbility(gEffectBank, ABILITY_IMMUNITY); + RecordAbilityBattle(gEffectBank, ABILITY_IMMUNITY); b_movescr_stack_push(gBattlescriptCurrInstr + 1); //_0801E664: - gBattlescriptCurrInstr = BS_PSN_PREVENTION; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); return; } else - {gBattleCommunication.multistring_chooser = 0; return;} + {gBattleCommunication[MULTISTRING_CHOOSER] = 0; return;} } if ((gBattleMons[gEffectBank].type1 == TYPE_POISON || gBattleMons[gEffectBank].type2 == TYPE_POISON || gBattleMons[gEffectBank].type1 == TYPE_STEEL || gBattleMons[gEffectBank].type2 == TYPE_STEEL) && !(gHitMarker & HITMARKER_IGNORE_SAFEGUARD) && (primary == 1 || certain == 0x80)) { b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PSN_PREVENTION; - gBattleCommunication.multistring_chooser = 2; + gBattlescriptCurrInstr = BattleScript_PSNPrevention; + gBattleCommunication[MULTISTRING_CHOOSER] = 2; return; } - if (gBattleMons[gEffectBank].status) {break;} + if (gBattleMons[gEffectBank].status1) {break;} if (gBattleMons[gEffectBank].type1 != TYPE_POISON && gBattleMons[gEffectBank].type2 != TYPE_POISON && gBattleMons[gEffectBank].type1 != TYPE_STEEL && gBattleMons[gEffectBank].type2 != TYPE_STEEL) { - if (gBattleMons[gEffectBank].ability_id == ABILITY_IMMUNITY) {break;} - gBattleMons[gEffectBank].status1 |= ~(STATUS_POISON); //TODO: fix OR to AND + if (gBattleMons[gEffectBank].ability == ABILITY_IMMUNITY) {break;} + gBattleMons[gEffectBank].status1 &= ~(0x9); //This gets (correctly) optimized out... StatusChanged = 1; break; } @@ -2707,20 +2467,20 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gBattleMons[gEffectBank].status1 |= ((Random() & 3) + 2); else gBattleMons[gEffectBank].status1 |= gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; gActiveBank = gEffectBank; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gEffectBank].status1); + MarkBufferBankForExecution(gActiveBank); if (gHitMarker & HITMARKER_IGNORE_SAFEGUARD) { - gBattleCommunication.multistring_chooser = 1; + gBattleCommunication[MULTISTRING_CHOOSER] = 1; gHitMarker &= ~(HITMARKER_IGNORE_SAFEGUARD); } else - gBattleCommunication.multistring_chooser = 0; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; if (gBattleCommunication[MOVE_EFFECT_BYTE] == 2 || gBattleCommunication[MOVE_EFFECT_BYTE] == 6 || gBattleCommunication[MOVE_EFFECT_BYTE] == 5 || gBattleCommunication[MOVE_EFFECT_BYTE] == 3) { - BATTLE_STRUCT->SynchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; + BATTLE_STRUCT->synchroniseEffect = gBattleCommunication[MOVE_EFFECT_BYTE]; gHitMarker |= HITMARKER_SYNCHRONISE_EFFECT; } return; @@ -2738,22 +2498,22 @@ void SetMoveEffect(bool8 primary, u8 certainArg) switch (gStatusFlagsForMoveEffects[gBattleCommunication[MOVE_EFFECT_BYTE]]) { case 7: //confusion - if (gBattleMons[gEffectBank].ability_id == ABILITY_OWN_TEMPO) + if (gBattleMons[gEffectBank].ability == ABILITY_OWN_TEMPO) {gBattlescriptCurrInstr++; return;} if (gBattleMons[gEffectBank].status2 & STATUS2_CONFUSION) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= (((Random()) % 0x4)) + 2; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 8: //flinch - if (gBattleMons[gEffectBank].ability_id == ABILITY_INNER_FOCUS) + if (gBattleMons[gEffectBank].ability == ABILITY_INNER_FOCUS) { if (primary == 1 || certain == 0x80) { gLastUsedAbility = ABILITY_INNER_FOCUS; - RecordAbility(gEffectBank, ABILITY_INNER_FOCUS); - gBattlescriptCurrInstr = BS_FLINCH_PREVENTION; + RecordAbilityBattle(gEffectBank, ABILITY_INNER_FOCUS); + gBattlescriptCurrInstr = BattleScript_FlinchPrevention; return; } else @@ -2773,21 +2533,21 @@ void SetMoveEffect(bool8 primary, u8 certainArg) gLockedMove[gEffectBank] = gCurrentMove; gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 4; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 11: //pay day - if (!(get_bank_identity(gEffectBank) & 1)) + if (!(GetBankIdentity(gBankAttacker) & 1)) { u16 PayDay = gPaydayMoney; - gPaydayMoney += (gBattleMons[gEffectBank].level * 5); + gPaydayMoney += (gBattleMons[gBankAttacker].level * 5); if (PayDay > gPaydayMoney) gPaydayMoney = 0xFFFF; } b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 9: //tri attack - if (gBattleMons[gEffectBank].status) + if (gBattleMons[gEffectBank].status1) {gBattlescriptCurrInstr++; return;} gBattleCommunication[MOVE_EFFECT_BYTE] = Random() % 3 + 3; SetMoveEffect(0, 0); @@ -2795,73 +2555,73 @@ void SetMoveEffect(bool8 primary, u8 certainArg) case 12: //charging move gBattleMons[gEffectBank].status2 |= STATUS2_MULTIPLETURNS; gLockedMove[gEffectBank] = gCurrentMove; - gProtectStructs[gEffectBank].flag1_chargingturn = 1; + gProtectStructs[gEffectBank].chargingTurn = 1; gBattlescriptCurrInstr++; break; case 13: //wrap if (gBattleMons[gEffectBank].status2 & STATUS2_WRAPPED) {gBattlescriptCurrInstr++; return;} gBattleMons[gEffectBank].status2 |= ((Random() & 3) + 2) << 0xD; - BATTLE_STRUCT->WrappedMove1[gEffectBank] = gCurrentMove; - BATTLE_STRUCT->WrappedMove2[gEffectBank] = gCurrentMove >> 8; - BATTLE_STRUCT->WrappedBy[gEffectBank] = gBankAttacker; + BATTLE_STRUCT->wrappedMove[gEffectBank*2] = (u8)gCurrentMove; + (1 + BATTLE_STRUCT->wrappedMove)[gEffectBank*2] = gCurrentMove >> 8; //don't ask. + BATTLE_STRUCT->wrappedBy[gEffectBank] = gBankAttacker; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; - gBattleCommunication.multistring_chooser = 0; - while (gBattleCommunication.multistring_chooser <= 4 - && gCurrentMove != gTrappingMoves[gBattleCommunication.multistring_chooser]) - gBattleCommunication.multistring_chooser++; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattleCommunication[MULTISTRING_CHOOSER] = 0; + while (gBattleCommunication[MULTISTRING_CHOOSER] <= 4 + && gCurrentMove != gTrappingMoves[gBattleCommunication[MULTISTRING_CHOOSER]]) + gBattleCommunication[MULTISTRING_CHOOSER]++; break; - case 14: //recoil + case 14: //25% recoil gBattleMoveDamage = (gHP_dealt) / 4; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 15 ... 21: //stat + 1 - if (ChangeStats(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x10, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xF2, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; //TODO: the arg ptr is wrong by one BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 22 ... 28: //stat - 1 - if (ChangeStats(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly + if (ChangeStatBuffs(~(0x6f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xEB, certain, 0)) {gBattlescriptCurrInstr++;} //TODO: negation doesnt work correctly else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 39 ... 45: //stat + 2 - if (ChangeStats(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(0x20, gBattleCommunication[MOVE_EFFECT_BYTE] + 0xDA, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_UP; + gBattlescriptCurrInstr = BattleScript_StatUp; } break; case 46 ... 52: //stat - 2 - if (ChangeStats(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} + if (ChangeStatBuffs(~(0x5f), gBattleCommunication[MOVE_EFFECT_BYTE] + 0xD3, certain, 0)) {gBattlescriptCurrInstr++;} else { BATTLE_STRUCT->animArg1 = gBattleCommunication[MOVE_EFFECT_BYTE] & 0x3F; BATTLE_STRUCT->animArg2 = 0; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_STAT_DOWN; + gBattlescriptCurrInstr = BattleScript_StatDown; } break; case 29: //recharge gBattleMons[gEffectBank].status2 |= STATUS2_RECHARGE; - gDisableStructs[gEffectBank].recharge_counter = 2; + gDisableStructs[gEffectBank].rechargeCounter = 2; gLockedMove[gEffectBank] = gCurrentMove; gBattlescriptCurrInstr++; break; @@ -2871,83 +2631,85 @@ void SetMoveEffect(bool8 primary, u8 certainArg) break; case 31: //item steal { - u8 side = battle_side_get_owner(gBankAttacker); - if (battle_side_get_owner(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) + u8 side = GetBankSide(gBankAttacker); + if (GetBankSide(gBankAttacker) == 1 && !(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400) {gBattlescriptCurrInstr++; return;} - if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.KnockedOff[side] & gBitTable[gBattlePartyID[gBankAttacker]])) + if (!(gBattleTypeFlags & (BATTLE_TYPE_EREADER_TRAINER | BATTLE_TYPE_BATTLE_TOWER | BATTLE_TYPE_LINK)) && gTrainerBattleOpponent != 0x400 && (gWishFutureKnock.knockedOffPokes[side] & gBitTable[gBattlePartyID[gBankAttacker]])) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item && gBattleMons[gBankTarget].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gBankTarget].item && gBattleMons[gBankTarget].ability == ABILITY_STICKY_HOLD) { b_movescr_stack_push_cursor(); - gBattlescriptCurrInstr = BS_NO_ITEMSTEAL; - gLastUsedAbility = gBattleMons[gBankTarget].ability_id; - RecordAbility(gBankTarget, gLastUsedAbility); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + gLastUsedAbility = gBattleMons[gBankTarget].ability; + RecordAbilityBattle(gBankTarget, gLastUsedAbility); return; } - if (gBattleMons[gBankAttacker].held_item) + if (gBattleMons[gBankAttacker].item) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == ITEM_ENIGMA_BERRY) + if (gBattleMons[gBankTarget].item == ITEM_ENIGMA_BERRY) {gBattlescriptCurrInstr++; return;} - if (gBattleMons[gBankTarget].held_item == 0) + if (gBattleMons[gBankTarget].item == 0) {gBattlescriptCurrInstr++; return;} - CHANGED_HELDITEMS[gBankAttacker] = gLastUsedItem = gBattleMons[gBankTarget].held_item; - gBattleMons[gBankTarget].held_item = 0; + gLastUsedItem = gBattleMons[gBankTarget].item; + unk_2000000[gBankAttacker * 2 + 0x160cc] = gLastUsedItem; + gBattleMons[gBankTarget].item = 0; gActiveBank = gBankAttacker; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); - mark_buffer_bank_for_execution(gBankAttacker); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gLastUsedItem); + MarkBufferBankForExecution(gBankAttacker); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].held_item); - mark_buffer_bank_for_execution(gBankTarget); + EmitSetAttributes(0, REQUEST_HELDITEM_BATTLE, 0, 2, &gBattleMons[gBankTarget].item); + MarkBufferBankForExecution(gBankTarget); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_ITEMSTEAL; + gBattlescriptCurrInstr = BattleScript_ItemSteal; - STORE_CHOICEMOVE(gBankTarget, 0); + ewram[gBankTarget * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gBankTarget, 0); } break; case 32: //escape prevention gBattleMons[gBankTarget].status2 |= STATUS2_RECHARGE; - gDisableStructs[gBankTarget].BankPreventingEscape = gBankAttacker; + gDisableStructs[gBankTarget].bankPreventingEscape = gBankAttacker; gBattlescriptCurrInstr++; break; case 33: //nightmare gBattleMons[gBankTarget].status2 |= STATUS2_NIGHTMARE; gBattlescriptCurrInstr++; break; - case 34: + case 34: //ancientpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D9224; + gBattlescriptCurrInstr = BattleScript_AllStatsUp; return; case 35: //break free rapidspin b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_RAPIDSPINAWAY; + gBattlescriptCurrInstr = BattleScript_RapidSpinAway; return; case 36: //paralysis removal if (gBattleMons[gBankTarget].status1 & STATUS_PARALYSIS) { gBattleMons[gBankTarget].status1 &= ~(STATUS_PARALYSIS); gActiveBank = gBankTarget; - bb2_setattributes_in_battle(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status); - mark_buffer_bank_for_execution(gActiveBank); + EmitSetAttributes(0, REQUEST_STATUS_BATTLE, 0, 4, &gBattleMons[gBankTarget].status1); + MarkBufferBankForExecution(gActiveBank); b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_PARALYSISHEALED; + gBattlescriptCurrInstr = BattleScript_TargetPRLZHeal; } else {gBattlescriptCurrInstr++; return;} break; - case 37: // + case 37: //superpower b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D93FA; + gBattlescriptCurrInstr = BattleScript_AtkDefDown; return; - case 38: //recoil plus paralysis + case 38: //33% recoil gBattleMoveDamage = gHP_dealt / 3; if (gBattleMoveDamage == 0) gBattleMoveDamage = 1; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = MoveEffectBS_ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; + gBattlescriptCurrInstr = gMoveEffectBS_Ptrs[gBattleCommunication[MOVE_EFFECT_BYTE]]; break; case 53: //thrash if (!(gBattleMons[gEffectBank].status2 & STATUS2_LOCK_CONFUSE)) @@ -2960,32 +2722,33 @@ void SetMoveEffect(bool8 primary, u8 certainArg) {gBattlescriptCurrInstr++; return;} break; case 54: //knock off - if (gBattleMons[gEffectBank].ability_id == ABILITY_STICKY_HOLD) + if (gBattleMons[gEffectBank].ability == ABILITY_STICKY_HOLD) { - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} gLastUsedAbility = ABILITY_STICKY_HOLD; - gBattlescriptCurrInstr = BS_STICKYHOLD_ACTIVATES; - RecordAbility(gEffectBank, ABILITY_STICKY_HOLD); + gBattlescriptCurrInstr = BattleScript_NoItemSteal; + RecordAbilityBattle(gEffectBank, ABILITY_STICKY_HOLD); return; } - if (gBattleMons[gEffectBank].held_item == 0) + if (gBattleMons[gEffectBank].item == 0) {gBattlescriptCurrInstr++; return;} else { - u8 side = battle_side_get_owner(gEffectBank); - gLastUsedItem = gBattleMons[gEffectBank].held_item; - gBattleMons[gEffectBank].held_item = 0; - gWishFutureKnock.KnockedOff[side] |= gBitTable[gBattlePartyID[gEffectBank]]; + u8 side = GetBankSide(gEffectBank); + gLastUsedItem = gBattleMons[gEffectBank].item; + gBattleMons[gEffectBank].item = 0; + gWishFutureKnock.knockedOffPokes[side] |= gBitTable[gBattlePartyID[gEffectBank]]; b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = BS_KNOCKEDOFF; + gBattlescriptCurrInstr = BattleScript_KnockedOff; - STORE_CHOICEMOVE(gEffectBank, 0); + ewram[gEffectBank * 2 + 0x160e8] = 0; + //STORE_CHOICEMOVE(gEffectBank, 0); } break; - case 59: //overheat I guess, dont remember + case 59: //overheat b_movescr_stack_push(gBattlescriptCurrInstr + 1); - gBattlescriptCurrInstr = gUnknown_081D94B0; + gBattlescriptCurrInstr = BattleScript_SAtkDown2; return; } } @@ -4888,11 +4651,11 @@ _0801F3BC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F3D0 @ =gUnknown_081D9224\n\ + ldr r0, _0801F3D0 @ =BattleScript_AllStatsUp\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F3CC: .4byte gBattlescriptCurrInstr\n\ -_0801F3D0: .4byte gUnknown_081D9224\n\ +_0801F3D0: .4byte BattleScript_AllStatsUp\n\ _0801F3D4:\n\ ldr r4, _0801F3E4 @ =gBattlescriptCurrInstr\n\ ldr r0, [r4]\n\ @@ -4952,11 +4715,11 @@ _0801F44C:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F460 @ =gUnknown_081D93FA\n\ + ldr r0, _0801F460 @ =BattleScript_AtkDefDown\n\ b _0801F5F8\n\ .align 2, 0\n\ _0801F45C: .4byte gBattlescriptCurrInstr\n\ -_0801F460: .4byte gUnknown_081D93FA\n\ +_0801F460: .4byte BattleScript_AtkDefDown\n\ _0801F464:\n\ ldr r4, _0801F494 @ =gBattleMoveDamage\n\ ldr r0, _0801F498 @ =gHP_dealt\n\ @@ -5141,7 +4904,7 @@ _0801F5EC:\n\ ldr r0, [r4]\n\ adds r0, 0x1\n\ bl b_movescr_stack_push\n\ - ldr r0, _0801F610 @ =gUnknown_081D94B0\n\ + ldr r0, _0801F610 @ =BattleScript_SAtkDown2\n\ _0801F5F8:\n\ str r0, [r4]\n\ _0801F5FA:\n\ @@ -5155,11 +4918,12 @@ _0801F5FA:\n\ bx r0\n\ .align 2, 0\n\ _0801F60C: .4byte gBattlescriptCurrInstr\n\ -_0801F610: .4byte gUnknown_081D94B0\n\ +_0801F610: .4byte BattleScript_SAtkDown2\n\ .syntax divided\n"); } #endif // NONMATCHING + static void atk15_seteffectwithchancetarget(void) { u32 PercentChance; @@ -5208,425 +4972,107 @@ static void atk18_status_effect_clear(void) BATTLE_STRUCT->unk16112 = 0; } -//Fuck this, Maybe later -__attribute__((naked)) static void atk19_faint_pokemon(void) { - 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, 0x4\n\ - ldr r0, _0801F81C @ =gBattlescriptCurrInstr\n\ - ldr r2, [r0]\n\ - ldrb r1, [r2, 0x2]\n\ - adds r6, r0, 0\n\ - cmp r1, 0\n\ - beq _0801F834\n\ - ldrb r0, [r2, 0x1]\n\ - bl GetBattleBank\n\ - ldr r5, _0801F820 @ =gActiveBank\n\ - strb r0, [r5]\n\ - ldr r2, _0801F824 @ =gHitMarker\n\ - ldr r1, _0801F828 @ =gBitTable\n\ - ldrb r0, [r5]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r2]\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801F7E6\n\ - b _0801FB1C\n\ -_0801F7E6:\n\ - ldr r1, [r6]\n\ - ldrb r4, [r1, 0x3]\n\ - ldrb r0, [r1, 0x4]\n\ - lsls r0, 8\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x5]\n\ - lsls r0, 16\n\ - orrs r4, r0\n\ - ldrb r0, [r1, 0x6]\n\ - lsls r0, 24\n\ - orrs r4, r0\n\ - bl b_movescr_stack_pop_cursor\n\ - str r4, [r6]\n\ - ldrb r0, [r5]\n\ - bl GetBankSide\n\ - ldr r1, _0801F82C @ =gSideAffecting\n\ - lsls r0, 24\n\ - lsrs r0, 23\n\ - adds r0, r1\n\ - ldrh r2, [r0]\n\ - ldr r1, _0801F830 @ =0x0000fdff\n\ - ands r1, r2\n\ - strh r1, [r0]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801F81C: .4byte gBattlescriptCurrInstr\n\ -_0801F820: .4byte gActiveBank\n\ -_0801F824: .4byte gHitMarker\n\ -_0801F828: .4byte gBitTable\n\ -_0801F82C: .4byte gSideAffecting\n\ -_0801F830: .4byte 0x0000fdff\n\ -_0801F834:\n\ - ldrb r0, [r2, 0x1]\n\ - cmp r0, 0x1\n\ - bne _0801F85C\n\ - ldr r1, _0801F84C @ =gActiveBank\n\ - ldr r0, _0801F850 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F854 @ =gBankTarget\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F858 @ =gUnknown_081D8C58\n\ - b _0801F86A\n\ - .align 2, 0\n\ -_0801F84C: .4byte gActiveBank\n\ -_0801F850: .4byte gBankAttacker\n\ -_0801F854: .4byte gBankTarget\n\ -_0801F858: .4byte gUnknown_081D8C58\n\ -_0801F85C:\n\ - ldr r1, _0801F954 @ =gActiveBank\n\ - ldr r0, _0801F958 @ =gBankTarget\n\ - ldrb r0, [r0]\n\ - strb r0, [r1]\n\ - ldr r0, _0801F95C @ =gBankAttacker\n\ - ldrb r7, [r0]\n\ - ldr r4, _0801F960 @ =gUnknown_081D8C65\n\ -_0801F86A:\n\ - ldr r0, _0801F964 @ =gAbsentBankFlags\n\ - ldrb r1, [r0]\n\ - ldr r0, _0801F968 @ =gBitTable\n\ - mov r12, r0\n\ - ldr r2, _0801F954 @ =gActiveBank\n\ - mov r8, r2\n\ - ldrb r2, [r2]\n\ - lsls r0, r2, 2\n\ - add r0, r12\n\ - ldr r0, [r0]\n\ - ands r1, r0\n\ - cmp r1, 0\n\ - beq _0801F886\n\ - b _0801FB1C\n\ -_0801F886:\n\ - ldr r3, _0801F96C @ =gBattleMons\n\ - mov r10, r3\n\ - movs r5, 0x58\n\ - mov r9, r5\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - ldrh r3, [r0, 0x28]\n\ - cmp r3, 0\n\ - beq _0801F89C\n\ - b _0801FB1C\n\ -_0801F89C:\n\ - ldr r2, _0801F970 @ =0x02000000\n\ - lsls r1, r7, 1\n\ - ldr r5, _0801F974 @ =0x000160ac\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F978 @ =0x000160ad\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - lsls r1, r7, 2\n\ - adds r5, 0x54\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - adds r5, 0x1\n\ - adds r0, r1, r5\n\ - adds r0, r2\n\ - strb r3, [r0]\n\ - ldr r0, _0801F97C @ =0x00016103\n\ - adds r1, r0\n\ - adds r1, r2\n\ - strb r3, [r1]\n\ - ldr r5, _0801F980 @ =gHitMarker\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - lsls r0, 2\n\ - add r0, r12\n\ - ldr r1, [r0]\n\ - lsls r1, 28\n\ - ldr r0, [r5]\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - bl b_movescr_stack_push\n\ - str r4, [r6]\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - bl GetBankSide\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - bne _0801F9B0\n\ - ldr r0, [r5]\n\ - movs r1, 0x80\n\ - lsls r1, 15\n\ - orrs r0, r1\n\ - str r0, [r5]\n\ - ldr r1, _0801F984 @ =gBattleResults\n\ - ldrb r0, [r1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F914\n\ - adds r0, 0x1\n\ - strb r0, [r1]\n\ -_0801F914:\n\ - mov r0, r9\n\ - muls r0, r7\n\ - add r0, r10\n\ - adds r3, r0, 0\n\ - adds r3, 0x2A\n\ - mov r4, r8\n\ - ldrb r2, [r4]\n\ - mov r0, r9\n\ - muls r0, r2\n\ - add r0, r10\n\ - adds r1, r0, 0\n\ - adds r1, 0x2A\n\ - ldrb r0, [r3]\n\ - ldrb r5, [r1]\n\ - cmp r0, r5\n\ - bls _0801F9CC\n\ - ldrb r1, [r1]\n\ - subs r0, r1\n\ - cmp r0, 0x1D\n\ - ble _0801F990\n\ - ldr r1, _0801F988 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F98C @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x8\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F954: .4byte gActiveBank\n\ -_0801F958: .4byte gBankTarget\n\ -_0801F95C: .4byte gBankAttacker\n\ -_0801F960: .4byte gUnknown_081D8C65\n\ -_0801F964: .4byte gAbsentBankFlags\n\ -_0801F968: .4byte gBitTable\n\ -_0801F96C: .4byte gBattleMons\n\ -_0801F970: .4byte 0x02000000\n\ -_0801F974: .4byte 0x000160ac\n\ -_0801F978: .4byte 0x000160ad\n\ -_0801F97C: .4byte 0x00016103\n\ -_0801F980: .4byte gHitMarker\n\ -_0801F984: .4byte gBattleResults\n\ -_0801F988: .4byte gBattlePartyID\n\ -_0801F98C: .4byte gPlayerParty\n\ -_0801F990:\n\ - ldr r1, _0801F9A8 @ =gBattlePartyID\n\ - lsls r0, r2, 1\n\ - adds r0, r1\n\ - ldrh r1, [r0]\n\ - movs r0, 0x64\n\ - muls r0, r1\n\ - ldr r1, _0801F9AC @ =gPlayerParty\n\ - adds r0, r1\n\ - movs r1, 0x6\n\ - bl AdjustFriendship\n\ - b _0801F9CC\n\ - .align 2, 0\n\ -_0801F9A8: .4byte gBattlePartyID\n\ -_0801F9AC: .4byte gPlayerParty\n\ -_0801F9B0:\n\ - ldr r1, _0801FAE0 @ =gBattleResults\n\ - ldrb r0, [r1, 0x1]\n\ - cmp r0, 0xFE\n\ - bhi _0801F9BC\n\ - adds r0, 0x1\n\ - strb r0, [r1, 0x1]\n\ -_0801F9BC:\n\ - ldr r2, _0801FAE4 @ =gActiveBank\n\ - ldrb r0, [r2]\n\ - mov r3, r9\n\ - muls r3, r0\n\ - adds r0, r3, 0\n\ - add r0, r10\n\ - ldrh r0, [r0]\n\ - strh r0, [r1, 0x20]\n\ -_0801F9CC:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r0, [r0]\n\ - movs r1, 0x40\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r6, _0801FAEC @ =gBattleMons\n\ - ldr r0, _0801FAF0 @ =gBankAttacker\n\ - ldrb r0, [r0]\n\ - movs r5, 0x58\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FA02\n\ - ldr r4, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r4]\n\ - bl b_movescr_stack_push\n\ - ldr r1, _0801FAF8 @ =gBattleMoveDamage\n\ - adds r0, r7, 0\n\ - muls r0, r5\n\ - adds r0, r6\n\ - ldrh r0, [r0, 0x28]\n\ - str r0, [r1]\n\ - ldr r0, _0801FAFC @ =gUnknown_081D9156\n\ - str r0, [r4]\n\ -_0801FA02:\n\ - ldr r1, _0801FB00 @ =gStatuses3\n\ - ldr r6, _0801FB04 @ =gBankTarget\n\ - ldrb r0, [r6]\n\ - lsls r0, 2\n\ - adds r0, r1\n\ - ldr r0, [r0]\n\ - movs r1, 0x80\n\ - lsls r1, 7\n\ - ands r0, r1\n\ - cmp r0, 0\n\ - bne _0801FA1A\n\ - b _0801FB22\n\ -_0801FA1A:\n\ - ldr r0, _0801FAE8 @ =gHitMarker\n\ - ldr r5, [r0]\n\ - movs r0, 0x80\n\ - lsls r0, 17\n\ - ands r5, r0\n\ - cmp r5, 0\n\ - bne _0801FB22\n\ - ldr r4, _0801FAF0 @ =gBankAttacker\n\ - mov r8, r4\n\ - ldrb r0, [r4]\n\ - bl GetBankSide\n\ - adds r4, r0, 0\n\ - ldrb r0, [r6]\n\ - bl GetBankSide\n\ - lsls r4, 24\n\ - lsls r0, 24\n\ - cmp r4, r0\n\ - beq _0801FB22\n\ - ldr r0, _0801FAEC @ =gBattleMons\n\ - mov r9, r0\n\ - mov r1, r8\n\ - ldrb r2, [r1]\n\ - movs r7, 0x58\n\ - adds r3, r2, 0\n\ - muls r3, r7\n\ - adds r0, r3, r0\n\ - ldrh r0, [r0, 0x28]\n\ - cmp r0, 0\n\ - beq _0801FB22\n\ - ldr r0, _0801FB08 @ =gCurrentMove\n\ - ldrh r0, [r0]\n\ - cmp r0, 0xA5\n\ - beq _0801FB22\n\ - ldr r1, _0801FB0C @ =0x02000000\n\ - ldr r4, _0801FB10 @ =0x0001608c\n\ - adds r0, r2, r4\n\ - adds r0, r1\n\ - ldrb r4, [r0]\n\ - adds r0, r4, r3\n\ - mov r6, r9\n\ - adds r6, 0x24\n\ - adds r0, r6\n\ - strb r5, [r0]\n\ - ldr r5, _0801FAF4 @ =gBattlescriptCurrInstr\n\ - ldr r0, [r5]\n\ - bl b_movescr_stack_push\n\ - ldr r0, _0801FB14 @ =gUnknown_081D9468\n\ - str r0, [r5]\n\ - ldr r5, _0801FAE4 @ =gActiveBank\n\ - mov r1, r8\n\ - ldrb r0, [r1]\n\ - strb r0, [r5]\n\ - adds r1, r4, 0\n\ - adds r1, 0x9\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - ldrb r0, [r5]\n\ - muls r0, r7\n\ - adds r0, r6\n\ - adds r0, r4\n\ - str r0, [sp]\n\ - movs r0, 0\n\ - movs r2, 0\n\ - movs r3, 0x1\n\ - bl EmitSetAttributes\n\ - ldrb r0, [r5]\n\ - bl MarkBufferBankForExecution\n\ - ldr r1, _0801FB18 @ =gBattleTextBuff1\n\ - movs r0, 0xFD\n\ - strb r0, [r1]\n\ - movs r0, 0x2\n\ - strb r0, [r1, 0x1]\n\ - lsls r4, 1\n\ - mov r2, r8\n\ - ldrb r0, [r2]\n\ - muls r0, r7\n\ - adds r0, r4, r0\n\ - mov r2, r9\n\ - adds r2, 0xC\n\ - adds r0, r2\n\ - ldrh r0, [r0]\n\ - strb r0, [r1, 0x2]\n\ - mov r3, r8\n\ - ldrb r0, [r3]\n\ - muls r0, r7\n\ - adds r4, r0\n\ - adds r4, r2\n\ - ldrh r0, [r4]\n\ - lsrs r0, 8\n\ - strb r0, [r1, 0x3]\n\ - movs r0, 0xFF\n\ - strb r0, [r1, 0x4]\n\ - b _0801FB22\n\ - .align 2, 0\n\ -_0801FAE0: .4byte gBattleResults\n\ -_0801FAE4: .4byte gActiveBank\n\ -_0801FAE8: .4byte gHitMarker\n\ -_0801FAEC: .4byte gBattleMons\n\ -_0801FAF0: .4byte gBankAttacker\n\ -_0801FAF4: .4byte gBattlescriptCurrInstr\n\ -_0801FAF8: .4byte gBattleMoveDamage\n\ -_0801FAFC: .4byte gUnknown_081D9156\n\ -_0801FB00: .4byte gStatuses3\n\ -_0801FB04: .4byte gBankTarget\n\ -_0801FB08: .4byte gCurrentMove\n\ -_0801FB0C: .4byte 0x02000000\n\ -_0801FB10: .4byte 0x0001608c\n\ -_0801FB14: .4byte gUnknown_081D9468\n\ -_0801FB18: .4byte gBattleTextBuff1\n\ -_0801FB1C:\n\ - ldr r0, [r6]\n\ - adds r0, 0x7\n\ - str r0, [r6]\n\ -_0801FB22:\n\ - add sp, 0x4\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\ - .syntax divided\n"); + u8 *r4; + + if (gBattlescriptCurrInstr[2] != 0) + { + gActiveBank = GetBattleBank(gBattlescriptCurrInstr[1]); + if (gHitMarker & HITMARKER_FAINTED(gActiveBank)) + { + r4 = BSScriptReadPtr(gBattlescriptCurrInstr + 3); + + b_movescr_stack_pop_cursor(); + gBattlescriptCurrInstr = r4; + gSideAffecting[GetBankSide(gActiveBank)] &= ~SIDE_STATUS_SPIKES_DAMAGED; + } + else + { + gBattlescriptCurrInstr += 7; + } + } + else + { + u8 bank; + + if (gBattlescriptCurrInstr[1] == 1) + { + gActiveBank = gBankAttacker; + bank = gBankTarget; + r4 = gUnknown_081D8C58; + } + else + { + gActiveBank = gBankTarget; + bank = gBankAttacker; + r4 = gUnknown_081D8C65; + } + if (!(gAbsentBankFlags & gBitTable[gActiveBank]) + && gBattleMons[gActiveBank].hp == 0) + { + ewram[0x160AC + bank * 2 + 0] = 0; + ewram[0x160AC + bank * 2 + 1] = 0; + ewram[0x16100 + bank * 4 + 0] = 0; + ewram[0x16100 + bank * 4 + 1] = 0; + ewram[0x16100 + bank * 4 + 2] = 0; + ewram[0x16100 + bank * 4 + 3] = 0; + + gHitMarker |= HITMARKER_FAINTED(gActiveBank); + b_movescr_stack_push(gBattlescriptCurrInstr + 7); + gBattlescriptCurrInstr = r4; + if (GetBankSide(gActiveBank) == 0) + { + gHitMarker |= HITMARKER_x400000; + if (gBattleResults.playerFaintCounter < 0xFF) + gBattleResults.playerFaintCounter++; + if (gBattleMons[bank].level > gBattleMons[gActiveBank].level) + { + if (gBattleMons[bank].level - gBattleMons[gActiveBank].level > 0x1D) + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 8); + else + AdjustFriendship(&gPlayerParty[gBattlePartyID[gActiveBank]], 6); + } + } + else + { + if (gBattleResults.opponentFaintCounter < 0xFF) + gBattleResults.opponentFaintCounter++; + gBattleResults.lastOpponentSpecies = gBattleMons[gActiveBank].species; + } + if ((gHitMarker & HITMARKER_DESTINYBOND) && gBattleMons[gBankAttacker].hp != 0) + { + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattleMoveDamage = gBattleMons[bank].hp; + gBattlescriptCurrInstr = gUnknown_081D9156; + } + if ((gStatuses3[gBankTarget] & STATUS3_GRUDGE) + && !(gHitMarker & HITMARKER_GRUDGE) + && GetBankSide(gBankAttacker) != GetBankSide(gBankTarget) + && gBattleMons[gBankAttacker].hp != 0 + && gCurrentMove != MOVE_STRUGGLE) + { + u8 moveIndex = ewram[0x1608C + gBankAttacker]; + + gBattleMons[gBankAttacker].pp[moveIndex] = 0; + b_movescr_stack_push(gBattlescriptCurrInstr); + gBattlescriptCurrInstr = gUnknown_081D9468; + gActiveBank = gBankAttacker; + EmitSetAttributes(0, moveIndex + 9, 0, 1, &gBattleMons[gActiveBank].pp[moveIndex]); + MarkBufferBankForExecution(gActiveBank); + + gBattleTextBuff1[0] = 0xFD; + gBattleTextBuff1[1] = 2; + gBattleTextBuff1[2] = gBattleMons[gBankAttacker].moves[moveIndex]; + gBattleTextBuff1[3] = gBattleMons[gBankAttacker].moves[moveIndex] >> 8; + gBattleTextBuff1[4] = EOS; + } + } + else + { + gBattlescriptCurrInstr += 7; + } + } } static void atk1A_faint_animation(void) @@ -5832,13 +5278,14 @@ static void atk23_getexp(void) else { BATTLE_STRUCT->atk23StateTracker++; - unk_2000000[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; + ((u8*)ewram)[0x16113] |= gBitTable[gBattlePartyID[gBank1]]; } break; case 1: //calculate experience points to redistribute { - int via_sent_in = 0, i; + int via_sent_in = 0; u16 calculatedExp; + int i; for (i = 0; i < 6; i++) { u16 item; @@ -5894,15 +5341,14 @@ static void atk23_getexp(void) BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - goto LABEL; + *tracker = 5; //increment looper + gBattleMoveDamage = zero; //used for exp } else if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) == 100) { - BATTLE_STRUCT->sentInPokes >>= 1; tracker = &BATTLE_STRUCT->atk23StateTracker; zero = 0; - LABEL: *tracker = 5; //increment looper gBattleMoveDamage = zero; //used for exp } @@ -5937,7 +5383,9 @@ static void atk23_getexp(void) stringID = 0x14A; } else - stringID = 0x149; + { + stringID = 0x149; + } //get exp getter bank if (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) @@ -5962,12 +5410,13 @@ static void atk23_getexp(void) gBattleTextBuff1[3] = BATTLE_STRUCT->expGetterID; gBattleTextBuff1[4] = 0xFF; - //buffer 'gained' or 'gained a boosted' - gBattleTextBuff2[0] = 0xFD; - gBattleTextBuff2[1] = 0; - gBattleTextBuff2[2] = sBYTE0_32(stringID); - gBattleTextBuff2[3] = sBYTE1_32(stringID); - gBattleTextBuff2[4] = 0xFF; + //buffer 'gained' or 'gained a boosted' + gBattleTextBuff2[0] = 0xFD; + gBattleTextBuff2[1] = 0; + gBattleTextBuff2[2] = stringID; + stringID = (stringID >> 8) & (0xFF); //this does not want to cooperate + gBattleTextBuff2[3] = stringID; + gBattleTextBuff2[4] = 0xFF; //buffer exp number gBattleTextBuff3[0] = 0xFD; @@ -5994,7 +5443,8 @@ static void atk23_getexp(void) gBattleBufferB[BATTLE_STRUCT->expGetterBank][0] = 0; if (GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_HP) && GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_LEVEL) != 100) { - BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); //doesnt match + // Doesn't match. + BATTLE_STRUCT->beforeLvlUp[0] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_MAX_HP); BATTLE_STRUCT->beforeLvlUp[1] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_ATK); BATTLE_STRUCT->beforeLvlUp[2] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_DEF); BATTLE_STRUCT->beforeLvlUp[3] = GetMonData(&gPlayerParty[BATTLE_STRUCT->expGetterID], MON_DATA_SPD); @@ -8022,9 +7472,39 @@ _080214AE:\n\ #ifdef NONMATCHING static void atk46_playanimation2(void) { - + u8 arg1; + u8* arg2; + u16* arg3; + u32 something; + + arg1 = BSScriptRead8(gBattlescriptCurrInstr + 1); + gActiveBank = GetBattleBank(arg1); + arg2 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 2); + arg3 = BS2ScriptReadPtr(gBattlescriptCurrInstr + 6); + + if (*arg2 == 1 || *arg2 == 0x11 || *arg2 == 2) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + gBattlescriptCurrInstr += 10; + return; + } + if ((gHitMarker & 0x80)) + { + something = (u32)(gBattlescriptCurrInstr + 10); + } + else + { + u8 yeah = *arg2 - 10; + if (yeah < 4 || (gStatuses3[gActiveBank] & 0x000400C0) == 0) + { + EmitBattleAnimation(0, *arg2, *arg3); + MarkBufferBankForExecution(gActiveBank); + } + something = (u32)(gBattlescriptCurrInstr + 10); + } + gBattlescriptCurrInstr = (u8*)something; } - #else __attribute__((naked)) static void atk46_playanimation2(void) diff --git a/src/battle/battle_anim_80CA710.c b/src/battle/battle_anim_80CA710.c new file mode 100644 index 000000000..65ccd7c21 --- /dev/null +++ b/src/battle/battle_anim_80CA710.c @@ -0,0 +1,18 @@ + +// Includes +#include "global.h" + +// Static type declarations + +// Static RAM declarations + +IWRAM_DATA u32 filler_03000724; +IWRAM_DATA u16 gUnknown_03000728[4]; +IWRAM_DATA u16 gUnknown_03000730[6]; +IWRAM_DATA u32 filler_0300073c; + +// Static ROM declarations + +// .rodata + +// .text diff --git a/src/debug/mori_debug_menu.c b/src/debug/mori_debug_menu.c index 4eadaa78b..1595ecd2e 100644 --- a/src/debug/mori_debug_menu.c +++ b/src/debug/mori_debug_menu.c @@ -52,7 +52,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) u16 monData; u16 var; - monData = GetMonData(gPlayerParty, 11, ptr); + monData = GetMonData(gPlayerParty, MON_DATA_SPECIES, ptr); var = sub_8041870(monData); StringCopy(localPtr, gSpeciesNames[monData]); StringAppend(localPtr, gUnknown_0839B24D); @@ -67,7 +67,7 @@ u8 MoriDebugMenu_SearchChild(u8 a1, u8 a2, u8 *ptr) s8 MoriDebugMenu_Egg(void) { - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041940(); CloseMenu(); @@ -76,7 +76,7 @@ s8 MoriDebugMenu_Egg(void) s8 MoriDebugMenu_MaleEgg(void) { - if ( Daycare_CountPokemon(gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) + if ( Daycare_CountPokemon(&gSaveBlock1.daycareData) == 2 && daycare_relationship_score_from_savegame() ) sub_8041950(); CloseMenu(); @@ -117,7 +117,7 @@ s8 MoriDebugMenu_BreedEgg(void) SetMonData(&gPlayerParty[loopCounter], MON_DATA_FRIENDSHIP, &friendship); } } - gSaveBlock1.filler_30B6 = -3; + gSaveBlock1.daycareData.misc.countersEtc.unk_11a = -3; CloseMenu(); return 1; } diff --git a/src/engine/record_mixing.c b/src/engine/record_mixing.c index d02d89467..8dff432c1 100644 --- a/src/engine/record_mixing.c +++ b/src/engine/record_mixing.c @@ -29,7 +29,7 @@ extern u8 ewram[]; #define unk_2018000 (*(struct PlayerRecords *)(ewram + 0x18000)) #define unk_2008000 (*(struct PlayerRecords *)(ewram + 0x08000)) -extern struct RecordMixing_UnknownStruct gUnknown_02038738; +extern struct RecordMixingDayCareMail gUnknown_02038738; extern u16 gSpecialVar_0x8005; u32 gUnknown_03005D2C; @@ -42,7 +42,7 @@ void *recordMixingTvShows = &gSaveBlock1.tvShows; void *gUnknown_083D0274 = &gSaveBlock1.unknown_2ABC; void *gUnknown_083D0278 = &gSaveBlock1.mauvilleMan; void *recordMixingEasyChatPairs = &gSaveBlock1.easyChatPairs; -struct RecordMixing_UnknownStruct *gUnknown_083D0280 = &gUnknown_02038738; +struct RecordMixingDayCareMail *gUnknown_083D0280 = &gUnknown_02038738; void *gUnknown_083D0284 = &gSaveBlock2.filler_A8; #define BUFFER_CHUNK_SIZE 200 @@ -59,7 +59,7 @@ struct PlayerRecords u8 filler1004[0x40]; u8 filler1044[0x40]; struct EasyChatPair easyChatPairs[5]; - struct RecordMixing_UnknownStruct filler10AC; + struct RecordMixingDayCareMail filler10AC; u8 filler1124[0xA4]; u16 filler11C8[0x34]; }; @@ -74,10 +74,10 @@ void RecordMixing_PrepareExchangePacket(void) memcpy(unk_2018000.filler1004, gUnknown_083D0274, sizeof(unk_2008000.filler1004)); memcpy(unk_2018000.filler1044, gUnknown_083D0278, sizeof(unk_2008000.filler1044)); memcpy(unk_2018000.easyChatPairs, recordMixingEasyChatPairs, sizeof(unk_2018000.easyChatPairs)); - gUnknown_02038738.data[0] = gSaveBlock1.filler_303C.data[0]; - gUnknown_02038738.data[1] = gSaveBlock1.filler_303C.data[1]; - sub_8041324(gSaveBlock1.daycareData, &gUnknown_02038738); - memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixing_UnknownStruct)); + gUnknown_02038738.mail[0] = gSaveBlock1.daycareData.misc.mail[0]; + gUnknown_02038738.mail[1] = gSaveBlock1.daycareData.misc.mail[1]; + sub_8041324(gSaveBlock1.daycareData.mons, &gUnknown_02038738); + memcpy(&unk_2018000.filler10AC, gUnknown_083D0280, sizeof(struct RecordMixingDayCareMail)); memcpy(unk_2018000.filler1124, gUnknown_083D0284, sizeof(unk_2018000.filler1124)); if (GetMultiplayerId() == 0) @@ -461,10 +461,10 @@ u8 sub_80B9BBC(u16 *a) void sub_80B9BC4(u8 *a, size_t b, u8 c[][2], u8 d, u8 e) { - struct RecordMixing_UnknownStructSub *r6 = (struct RecordMixing_UnknownStructSub *)(a + b * c[d][0]); - struct RecordMixing_UnknownStructSub *src = r6 + c[d][1]; - struct RecordMixing_UnknownStructSub sp0 = *src; - struct RecordMixing_UnknownStructSub *r8 = (struct RecordMixing_UnknownStructSub *)(a + b * c[e][0]); + struct DayCareMail *r6 = (struct DayCareMail *)(a + b * c[d][0]); + struct DayCareMail *src = r6 + c[d][1]; + struct DayCareMail sp0 = *src; + struct DayCareMail *r8 = (struct DayCareMail *)(a + b * c[e][0]); r6 += c[d][1]; *r6 = *(r8 + c[e][1]); @@ -511,7 +511,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) u16 i; // r3 u16 r7; u8 r1; - struct RecordMixing_UnknownStruct *r6; + struct DayCareMisc *r6; //asm("":::"r8"); SeedRng(gLinkPlayers[0].trainerId); @@ -526,7 +526,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) sp3C = 0; for (i = 0; i < r8; i++) { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + r6 = (struct DayCareMisc *)(a + b * i); if (r6->unk70 != 0) { for (r7 = 0; r7 < r6->unk70; r7++) @@ -540,7 +540,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9D46 for (r7 = 0, i = 0; i < r8; i++) { - r6 = (struct RecordMixing_UnknownStruct *)(a + b * i); + r6 = (struct DayCareMisc *)(a + b * i); if (sp1C[i][0] == 1 || sp1C[i][1] == 1) sp3C++; if (sp1C[i][0] == 1 && sp1C[i][1] == 0) @@ -596,7 +596,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9E3E for (i = 0; i < 4; i++) { - r6 = (struct RecordMixing_UnknownStruct *)a + b * c; + r6 = (struct DayCareMisc *)a + b * c; spC[i] = r6; } r1 = sub_80B9C4C(d) % 3; @@ -630,7 +630,7 @@ void sub_80B9C6C(u8 *a, u32 b, u8 c, void *d) //_080B9EF0 //memcpy(&gSaveBlock1.filler_303C.data[0], a + b * c, 0x38); //memcpy(&gSaveBlock1.filler_303C.data[1], a + b * c + 0x38, 0x38); - r6 = (struct RecordMixing_UnknownStruct *)(a + b * c); + r6 = (struct DayCareMisc *)(a + b * c); gSaveBlock1.filler_303C.data[0] = r6->data[0]; gSaveBlock1.filler_303C.data[1] = r6->data[1]; //memcpy(&gSaveBlock1.filler_303C.data[0], &r6->data[0], 0x38); diff --git a/src/engine/trade.c b/src/engine/trade.c index cb190d194..0816fe555 100644 --- a/src/engine/trade.c +++ b/src/engine/trade.c @@ -37,6 +37,7 @@ struct UnkStructD { extern const struct InGameTrade gIngameTrades[]; extern const u16 gIngameTradeMail[][10]; +IWRAM_DATA u8 gUnknown_03000508[8]; void sub_804A96C(struct UnkStructD *arg0, u8 left, u8 top, u16 *tilemap, u8 width, u8 height, u16 sp8) { int y, x; diff --git a/src/field/bike.c b/src/field/bike.c index 80cab0850..dae86bd88 100644 --- a/src/field/bike.c +++ b/src/field/bike.c @@ -10,8 +10,6 @@ #include "songs.h" #include "sound.h" -extern u8 sub_80608A4(u8); - extern u8 gUnknown_02039250; extern u8 gUnknown_02039251; extern u8 gUnknown_0202E854; diff --git a/src/field/daycare.c b/src/field/daycare.c index 7f688016a..591b5b188 100644 --- a/src/field/daycare.c +++ b/src/field/daycare.c @@ -1,11 +1,46 @@ #include "global.h" #include "daycare.h" #include "pokemon.h" +#include "event_data.h" #include "species.h" #include "items.h" +#include "text.h" #include "string_util.h" +#include "mail_data.h" +#include "name_string_util.h" +#include "pokemon_storage_system.h" +#include "rng.h" +#include "moves.h" +#include "trade.h" +#include "strings2.h" +#include "data/pokemon/egg_moves.h" +#include "party_menu.h" +#include "field_effect.h" +#include "main.h" +#include "menu.h" +#include "sound.h" +#include "songs.h" +#include "script.h" +#include "overworld.h" -extern u8 gLastFieldPokeMenuOpened; +IWRAM_DATA u16 gUnknown_03000470[52]; +IWRAM_DATA u16 gUnknown_030004D8[4]; +IWRAM_DATA u16 gUnknown_030004E0[4]; +IWRAM_DATA u16 gUnknown_030004E8[12]; +IWRAM_DATA u16 gUnknown_03000500[4]; + +static void sub_80417F4(struct DayCareMail *); +static void sub_80420FC(struct Pokemon *, u16, struct DayCareData *); +static u8 daycare_relationship_score(struct DayCareData *); + +const u8 *const gUnknown_08209AC4[] = { + DaycareText_GetAlongVeryWell, + DaycareText_GetAlong, + DaycareText_DontLikeOther, + DaycareText_PlayOther +}; + +const u8 gUnknown_08209AD4[] = _("タマゴ"); u8 *GetMonNick(struct Pokemon *mon, u8 *dest) { @@ -23,19 +58,19 @@ u8 *GetBoxMonNick(struct BoxPokemon *mon, u8 *dest) return StringCopy10(dest, nickname); } -u8 Daycare_CountPokemon(struct BoxPokemon *daycare_data) +u8 Daycare_CountPokemon(struct DayCareData *daycare_data) { u8 i, count; count = 0; for(i = 0;i <= 1;i++) - if(GetBoxMonData(daycare_data + i, MON_DATA_SPECIES) != 0) + if(GetBoxMonData(&daycare_data->mons[i], MON_DATA_SPECIES) != 0) count++; return count; } -void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStruct * void_pointer) +void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixingDayCareMail * daycareMailEtc) { u8 i; u8 specCount; @@ -47,20 +82,20 @@ void sub_8041324(struct BoxPokemon * box_pokemon, struct RecordMixing_UnknownStr specCount ++; if (GetBoxMonData(&box_pokemon[i], MON_DATA_HELD_ITEM) == ITEM_NONE) { - void_pointer->unk74[i] = 0; + daycareMailEtc->unk74[i] = 0; } else { - void_pointer->unk74[i] = 1; + daycareMailEtc->unk74[i] = 1; } } else { - void_pointer->unk74[i] = 1; + daycareMailEtc->unk74[i] = 1; } } - void_pointer->unk70 = specCount; + daycareMailEtc->unk70 = specCount; } -s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) +static s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) { u8 i; @@ -71,275 +106,108 @@ s8 Daycare_FindEmptySpot(struct BoxPokemon * daycare_data) return -1; } -/*void Daycare_SendPokemon(struct Pokemon * mon, struct BoxPokemon * daycare_data){ // unfinished +static void Daycare_SendPokemon(struct Pokemon * mon, struct DayCareData * daycare_data) +{ s8 empty_slot; + u8 mail; + u8 *names; - empty_slot = Daycare_FindEmptySpot(daycare_data); - if(MonHasMail(mon) != 0){ // if the mon holds a mail? - u8 empty_slot_times_56 = empty_slot * 56; - u8 * something2 = ((u8 *) (daycare_data + 2)) + empty_slot_times_56 + 36; - StringCopy(something2, gSaveBlock2.playerName); - PadNameString(something2, 0xFC); - something2 += 8; - GetMonNick(mon, something2); - u8 pokerus = GetMonData(mon, MON_DATA_64); - something1 += (u8 * daycare_data) -}*/ - -__attribute__((naked)) -void Daycare_SendPokemon() -{ - // strange stack usage - happens because THUMB ARM only allows R0-R7 to be pushed/popped: - // all registers in reglist must be Lo registers, except that PUSH can include the LR, and POP can include the PC - // the ldm/stm section probably copies some struct, but I'm not sure how the code would look - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - adds r7, r0, 0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - bl Daycare_FindEmptySpot\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - mov r9, r4\n\ - adds r0, r7, 0\n\ - bl MonHasMail\n\ - lsls r0, 24\n\ - cmp r0, 0\n\ - beq _0804144A\n\ - lsls r0, r4, 24\n\ - asrs r0, 24\n\ - lsls r4, r0, 3\n\ - subs r4, r0\n\ - lsls r4, 3\n\ - adds r5, r4, 0\n\ - adds r5, 0xA0\n\ - add r5, r8\n\ - adds r6, r5, 0\n\ - adds r6, 0x24\n\ - ldr r1, _08041490 @ =gSaveBlock2\n\ - adds r0, r6, 0\n\ - bl StringCopy\n\ - adds r0, r6, 0\n\ - movs r1, 0xFC\n\ - bl PadNameString\n\ - adds r6, 0x8\n\ - adds r0, r7, 0\n\ - adds r1, r6, 0\n\ - bl GetMonNick\n\ - adds r0, r7, 0\n\ - movs r1, 0x40\n\ - bl GetMonData\n\ - lsls r0, 24\n\ - lsrs r0, 24\n\ - add r4, r8\n\ - ldr r2, _08041494 @ =gSaveBlock1\n\ - lsls r1, r0, 3\n\ - adds r1, r0\n\ - lsls r1, 2\n\ - adds r1, r2\n\ - adds r4, 0xA0\n\ - ldr r0, _08041498 @ =0x00002b4c\n\ - adds r1, r0\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - ldm r1!, {r0,r2,r3}\n\ - stm r4!, {r0,r2,r3}\n\ - adds r0, r7, 0\n\ - bl TakeMailFromMon\n\ -_0804144A:\n\ - mov r2, r9\n\ - lsls r4, r2, 24\n\ - asrs r4, 24\n\ - lsls r5, r4, 2\n\ - adds r4, r5, r4\n\ - lsls r4, 4\n\ - add r4, r8\n\ - adds r0, r4, 0\n\ - adds r1, r7, 0\n\ - movs r2, 0x50\n\ - bl memcpy\n\ - adds r0, r4, 0\n\ - bl BoxMonRestorePP\n\ - movs r0, 0x88\n\ - lsls r0, 1\n\ - add r0, r8\n\ - adds r0, r5\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r7, 0\n\ - bl ZeroMonData\n\ - bl party_compaction\n\ - bl CalculatePlayerPartyCount\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r0}\n\ - bx r0\n\ - .align 2, 0\n\ -_08041490: .4byte gSaveBlock2\n\ -_08041494: .4byte gSaveBlock1\n\ -_08041498: .4byte 0x00002b4c\n\ - .syntax divided\n"); + empty_slot = Daycare_FindEmptySpot(daycare_data->mons); + if(MonHasMail(mon)) { + StringCopy((names = daycare_data->misc.mail[empty_slot].names), gSaveBlock2.playerName); + PadNameString(names, 0xFC); + names += 8; + GetMonNick(mon, names); + mail = GetMonData(mon, MON_DATA_MAIL); + daycare_data->misc.mail[empty_slot].message = gSaveBlock1.mail[mail]; + TakeMailFromMon(mon); + } + daycare_data->mons[empty_slot] = mon->box; + BoxMonRestorePP(&daycare_data->mons[empty_slot]); + daycare_data->misc.countersEtc.steps[empty_slot] = 0; + ZeroMonData(mon); + party_compaction(); + CalculatePlayerPartyCount(); } void Daycare_SendPokemon_Special() { - Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, gSaveBlock1.daycareData); + Daycare_SendPokemon(gPlayerParty + gLastFieldPokeMenuOpened, &gSaveBlock1.daycareData); } -void sub_80417F4(u8 *); - -void sub_80414C0(struct BoxPokemon * daycare_data) +static void sub_80414C0(struct DayCareData * daycare_data) { - u32 second_species; - if((GetBoxMonData(&daycare_data[1], MON_DATA_SPECIES) != 0) && ((second_species = GetBoxMonData(&daycare_data[0], MON_DATA_SPECIES)) == 0)){ - daycare_data[0] = daycare_data[1]; - ZeroBoxMonData(&daycare_data[1]); - memcpy(daycare_data + 2, (u8 *) (daycare_data + 1) + 0x88, 0x38); - *((u32 *)(daycare_data) + 68) = *((u32 *)(daycare_data) + 69); - *((u32 *)(daycare_data) + 69) = second_species; - sub_80417F4((u8 *) (daycare_data + 1) + 0x88); + if((GetBoxMonData(&daycare_data->mons[1], MON_DATA_SPECIES) != 0) && GetBoxMonData(&daycare_data->mons[0], MON_DATA_SPECIES) == 0) + { + daycare_data->mons[0] = daycare_data->mons[1]; + ZeroBoxMonData(&daycare_data->mons[1]); + daycare_data->misc.mail[0] = daycare_data->misc.mail[1]; + daycare_data->misc.countersEtc.steps[0] = daycare_data->misc.countersEtc.steps[1]; + daycare_data->misc.countersEtc.steps[1] = 0; + sub_80417F4(&daycare_data->misc.mail[1]); } } u8 TryIncrementMonLevel(struct Pokemon *); extern u16 gMoveToLearn; -void sub_804151C(struct Pokemon * mon) +static void DayCare_LevelUpMoves(struct Pokemon * mon) { s32 i; u8 r6; u16 temp; - for(i = 0; i < 100; i++){ - if(TryIncrementMonLevel(mon) == FALSE) goto end; - - r6 = 1; - while((temp = MonTryLearningNewMove(mon, r6)) != 0){ - r6 = 0; - if(temp == 0xffff){ - DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); + for (i = 0; i < MAX_LEVEL; i++) + { + if (TryIncrementMonLevel(mon)) + { + r6 = 1; + while ((temp = MonTryLearningNewMove(mon, r6)) != 0) + { + r6 = 0; + if (temp == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(mon, gMoveToLearn); } } + else + break; } - end: - CalculateMonStats(mon); } -__attribute__((naked)) -u16 sub_8041570(struct BoxPokemon * daycare_data, u8 a2){ - asm(".syntax unified\n\ - push {r4-r7,lr}\n\ - mov r7, r9\n\ - mov r6, r8\n\ - push {r6,r7}\n\ - sub sp, 0x68\n\ - adds r5, r0, 0\n\ - lsls r1, 24\n\ - lsrs r4, r1, 24\n\ - lsls r7, r4, 2\n\ - adds r0, r7, r4\n\ - lsls r0, 4\n\ - adds r6, r5, r0\n\ - ldr r1, _08041640 @ =gStringVar1\n\ - adds r0, r6, 0\n\ - bl GetBoxMonNick\n\ - adds r0, r6, 0\n\ - movs r1, 0xB\n\ - bl GetBoxMonData\n\ - lsls r0, 16\n\ - lsrs r0, 16\n\ - mov r9, r0\n\ - adds r0, r6, 0\n\ - mov r1, sp\n\ - bl sub_803B4B4\n\ - mov r0, sp\n\ - movs r1, 0x38\n\ - bl GetMonData\n\ - cmp r0, 0x64\n\ - beq _080415D8\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl GetMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r1, r5, r2\n\ - adds r1, r7\n\ - ldr r1, [r1]\n\ - adds r0, r1\n\ - str r0, [sp, 0x64]\n\ - add r2, sp, 0x64\n\ - mov r0, sp\n\ - movs r1, 0x19\n\ - bl SetMonData\n\ - mov r0, sp\n\ - bl sub_804151C\n\ -_080415D8:\n\ - ldr r0, _08041644 @ =gPlayerParty\n\ - movs r1, 0xFA\n\ - lsls r1, 1\n\ - adds r1, r0\n\ - mov r8, r1\n\ - mov r0, r8\n\ - mov r1, sp\n\ - movs r2, 0x64\n\ - bl memcpy\n\ - lsls r0, r4, 3\n\ - subs r0, r4\n\ - lsls r1, r0, 3\n\ - adds r0, r5, r1\n\ - adds r0, 0xC0\n\ - ldrh r0, [r0]\n\ - cmp r0, 0\n\ - beq _08041610\n\ - adds r4, r1, 0\n\ - adds r4, 0xA0\n\ - adds r4, r5, r4\n\ - mov r0, r8\n\ - adds r1, r4, 0\n\ - bl GiveMailToMon2\n\ - adds r0, r4, 0\n\ - bl sub_80417F4\n\ -_08041610:\n\ - bl party_compaction\n\ - adds r0, r6, 0\n\ - bl ZeroBoxMonData\n\ - movs r2, 0x88\n\ - lsls r2, 1\n\ - adds r0, r5, r2\n\ - adds r0, r7\n\ - movs r1, 0\n\ - str r1, [r0]\n\ - adds r0, r5, 0\n\ - bl sub_80414C0\n\ - bl CalculatePlayerPartyCount\n\ - mov r0, r9\n\ - add sp, 0x68\n\ - pop {r3,r4}\n\ - mov r8, r3\n\ - mov r9, r4\n\ - pop {r4-r7}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08041640: .4byte gStringVar1\n\ -_08041644: .4byte gPlayerParty\n\ - .syntax divided"); -} - -extern u8 gSpecialVar_0x8004; +static u16 sub_8041570(struct DayCareData * daycare_data, u8 slot) +{ + u16 species; + u32 experience; + struct Pokemon pokemon; + + GetBoxMonNick(&daycare_data->mons[slot], gStringVar1); + species = GetBoxMonData(&daycare_data->mons[slot], MON_DATA_SPECIES); + sub_803B4B4(&daycare_data->mons[slot], &pokemon); + if (GetMonData(&pokemon, MON_DATA_LEVEL) != MAX_LEVEL) + { + experience = GetMonData(&pokemon, MON_DATA_EXP) + daycare_data->misc.countersEtc.steps[slot]; + SetMonData(&pokemon, MON_DATA_EXP, (u8 *)&experience); + DayCare_LevelUpMoves(&pokemon); + } + gPlayerParty[PARTY_SIZE - 1] = pokemon; + if (daycare_data->misc.mail[slot].message.itemId) + { + GiveMailToMon2(&gPlayerParty[PARTY_SIZE - 1], &daycare_data->misc.mail[slot].message); + sub_80417F4(&daycare_data->misc.mail[slot]); + } + party_compaction(); + ZeroBoxMonData(&daycare_data->mons[slot]); + daycare_data->misc.countersEtc.steps[slot] = 0; + sub_80414C0(daycare_data); + CalculatePlayerPartyCount(); + return species; +} u16 sub_8041648() { - return sub_8041570(gSaveBlock1.daycareData, gSpecialVar_0x8004); + return sub_8041570(&gSaveBlock1.daycareData, gSpecialVar_0x8004); } u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ @@ -348,3 +216,1475 @@ u8 Daycare_GetLevelAfterSteps(struct BoxPokemon * mon, u32 steps){ SetBoxMonData(&temp, MON_DATA_EXP, (u8 *) &new_exp); return GetLevelFromBoxMonExp(&temp); } + +static u8 sub_80416A0(struct DayCareData *daycareData, u8 slot) +{ + u8 levelBefore; + u8 levelAfter; + + levelBefore = GetLevelFromBoxMonExp(&daycareData->mons[slot]); + levelAfter = Daycare_GetLevelAfterSteps(&daycareData->mons[slot], daycareData->misc.countersEtc.steps[slot]); + return levelAfter - levelBefore; +} + +static u8 sub_80416E8(struct DayCareData *dayCareData, u8 slot) +{ + u8 levelDelta = sub_80416A0(dayCareData, slot); + GetBoxMonNick(&dayCareData->mons[slot], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, levelDelta, STR_CONV_MODE_LEFT_ALIGN, 2); + return levelDelta; +} + +static u16 sub_8041728(struct DayCareData *dayCareData, u8 slot) +{ + u16 cost; + + u8 levelDelta = sub_80416A0(dayCareData, slot); + GetBoxMonNick(&dayCareData->mons[slot], gStringVar1); + cost = 100 + 100 * levelDelta; + ConvertIntToDecimalStringN(gStringVar2, cost, STR_CONV_MODE_LEFT_ALIGN, 5); + return cost; +} + +void sub_8041770(void) +{ + gSpecialVar_0x8005 = sub_8041728(&gSaveBlock1.daycareData, gSpecialVar_0x8004); +} + +void sub_8041790(u16 i) +{ + gSaveBlock1.daycareData.misc.countersEtc.steps[0] += i; + gSaveBlock1.daycareData.misc.countersEtc.steps[1] += i; +} + +u8 sub_80417B8(void) +{ + if (GetBoxMonData(&gSaveBlock1.daycareData.mons[gSpecialVar_0x8004], MON_DATA_SPECIES) != 0) + return sub_80416E8(&gSaveBlock1.daycareData, gSpecialVar_0x8004); + return 0; +} + +static void sub_80417F4(struct DayCareMail *mail) +{ + u8 zero; + u8 *names; + u8 *names2; + int i; + zero = 0; + for (i = 7, names = mail->names + 7; i >= 0; i --) + *names-- = zero; + names2 = mail->names + 8; + zero = 0; + names = mail->names + 18; + do *names-- = zero; while ((int)names >= (int)names2); + ClearMailStruct(&mail->message); +} + +void unref_sub_8041824(struct DayCareData *dayCareData) +{ + u8 slot; + for (slot = 0; slot < ARRAY_COUNT(dayCareData->mons); slot ++) + { + ZeroBoxMonData(&dayCareData->mons[slot]); + dayCareData->misc.countersEtc.steps[slot] = 0; + sub_80417F4(&dayCareData->misc.mail[slot]); + } + dayCareData->misc.countersEtc.personalityLo = 0; + dayCareData->misc.countersEtc.unk_11a = 0; +} + +u16 sub_8041870(u16 species) +{ + int i, j, k; + bool8 found; + for (i = 0; i < 5; i ++) + { + found = FALSE; + for (j = 1; j < NUM_SPECIES; j ++) + { + for (k = 0; k < 5; k ++) + { + if (gEvolutionTable[j].evolutions[k].targetSpecies == species) + { + species = j; + found = TRUE; + break; + } + } + if (found) + break; + } + if (j == 412) + break; + } + return species; +} + +static void sub_80418F0(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = (Random() % 0xfffe) + 1; + FlagSet(0x86); +} + +static void sub_804191C(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = Random() | 0x8000; + FlagSet(0x86); +} + +void sub_8041940(void) +{ + sub_80418F0(&gSaveBlock1.daycareData); +} + +void sub_8041950(void) +{ + sub_804191C(&gSaveBlock1.daycareData); +} + +static void sub_8041960(u8 *data, u8 idx) +{ + int i, j; + u8 temp[6]; + data[idx] = 0xff; + for (i = 0; i < 6; i ++) + temp[i] = data[i]; + j = 0; + for (i = 0; i < 6; i ++) + if (temp[i] != 0xff) + data[j++] = temp[i]; +} + +static void InheritIVs(struct Pokemon *egg, struct DayCareData *dayCareData) +{ + u8 i; + u8 selectedIvs[3]; + u8 allIvs[6]; + u8 whichParent[3]; + u8 iv; + for (i = 0; i < 6; i ++) + allIvs[i] = i; + for (i = 0; i < 3; i ++) + { + selectedIvs[i] = allIvs[Random() % (6 - i)]; + sub_8041960(allIvs, selectedIvs[i]); + } + for (i = 0; i < 3; i ++) + whichParent[i] = Random() % 2; + for (i = 0; i < 3; i ++) + { + switch (selectedIvs[i]) + { + case 0: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_HP_IV); + SetMonData(egg, MON_DATA_HP_IV, &iv); + break; + case 1: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_ATK_IV); + SetMonData(egg, MON_DATA_ATK_IV, &iv); + break; + case 2: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_DEF_IV); + SetMonData(egg, MON_DATA_DEF_IV, &iv); + break; + case 3: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPD_IV); + SetMonData(egg, MON_DATA_SPD_IV, &iv); + break; + case 4: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPATK_IV); + SetMonData(egg, MON_DATA_SPATK_IV, &iv); + break; + case 5: + iv = GetBoxMonData(&dayCareData->mons[whichParent[i]], MON_DATA_SPDEF_IV); + SetMonData(egg, MON_DATA_SPDEF_IV, &iv); + break; + } + } +} + +#ifdef NONMATCHING +static +#endif +u8 pokemon_get_eggmoves(struct Pokemon *pokemon, u16 *eggMoves) +{ + u16 eggMoveIdx; + u16 numMovesFound; + u16 species; + u16 i; + + numMovesFound = 0; + eggMoveIdx = 0; + species = GetMonData(pokemon, MON_DATA_SPECIES); + for (i = 0; i < ARRAY_COUNT(gEggMoves) - 1; i ++) + { + if (gEggMoves[i] == species + EGG_MOVES_SPECIES_OFFSET) + { + eggMoveIdx = i + 1; + break; + } + } + for (i = 0; i < 10; i ++) + { + if (gEggMoves[eggMoveIdx + i] > EGG_MOVES_SPECIES_OFFSET) + { + break; + } + eggMoves[i] = gEggMoves[eggMoveIdx + i]; + numMovesFound++; + } + return numMovesFound; +} + +#ifdef NONMATCHING + +void daycare_build_child_moveset(struct Pokemon *egg, struct BoxPokemon *dad, struct BoxPokemon *mom) +{ + u16 numSharedParentMoves; + u8 numLevelUpMoves; + u8 numEggMoves; + u16 i, j; + + numSharedParentMoves = 0; + for (i = 0; i < 4; i ++) + { + gUnknown_03000500[i] = 0; + gUnknown_030004D8[i] = 0; + gUnknown_030004E0[i] = 0; + } + for (i = 0; i < 10; i ++) + gUnknown_030004E8[i] = 0; + for (i = 0; i < 50; i ++) + gUnknown_03000470[i] = 0; + + numLevelUpMoves = GetLevelUpMovesBySpecies(GetMonData(egg, MON_DATA_SPECIES), gUnknown_03000470); + for (i = 0; i < 4; i ++) + { + gUnknown_030004D8[i] = GetBoxMonData(dad, MON_DATA_MOVE1 + i); + gUnknown_03000500[i] = GetBoxMonData(mom, MON_DATA_MOVE1 + i); + } + numEggMoves = pokemon_get_eggmoves(egg, gUnknown_030004E8); + + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] != MOVE_NONE) + { + for (j = 0; j < numEggMoves; j ++) + { + if (gUnknown_030004D8[i] == gUnknown_030004E8[j]) + { + if (GiveMoveToMon(egg, gUnknown_030004D8[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004D8[i]); + break; + } + } + } + else + break; + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] != MOVE_NONE) + { + for (j = 0; j < 50 + 8; j ++) + { + if (gUnknown_030004D8[i] == ItemIdToBattleMoveId(ITEM_TM01 + j) && CanMonLearnTMHM(egg, j)) + { + if (GiveMoveToMon(egg, gUnknown_030004D8[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004D8[i]); + } + } + } + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004D8[i] == MOVE_NONE) + break; + for (j = 0; j < 4; j ++) + { + if (gUnknown_030004D8[i] == gUnknown_03000500[j] && gUnknown_030004D8[i] != MOVE_NONE) + gUnknown_030004E0[numSharedParentMoves++] = gUnknown_030004D8[i]; + } + } + for (i = 0; i < 4; i ++) + { + if (gUnknown_030004E0[i] == MOVE_NONE) + break; + for (j = 0; j < numLevelUpMoves; j ++) + { + if (gUnknown_03000470[j] != MOVE_NONE && gUnknown_030004E0[i] == gUnknown_03000470[j]) + { + if (GiveMoveToMon(egg, gUnknown_030004E0[i]) == 0xffff) + DeleteFirstMoveAndGiveMoveToMon(egg, gUnknown_030004E0[i]); + break; + } + } + } +} +#else +__attribute__((naked)) +void daycare_build_child_moveset(struct Pokemon *egg, struct BoxPokemon *dad, struct BoxPokemon *mom) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0xC\n" + "\tadds r7, r0, 0\n" + "\tmov r10, r1\n" + "\tmov r9, r2\n" + "\tmovs r0, 0\n" + "\tstr r0, [sp]\n" + "\tmovs r6, 0\n" + "\tldr r5, _08041CC8 @ =gUnknown_03000500\n" + "\tmovs r2, 0\n" + "\tldr r4, _08041CCC @ =gUnknown_030004D8\n" + "\tldr r3, _08041CD0 @ =gUnknown_030004E0\n" + "_08041BE4:\n" + "\tlsls r1, r6, 1\n" + "\tadds r0, r1, r5\n" + "\tstrh r2, [r0]\n" + "\tadds r0, r1, r4\n" + "\tstrh r2, [r0]\n" + "\tadds r1, r3\n" + "\tstrh r2, [r1]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041BE4\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD4 @ =gUnknown_030004E8\n" + "\tmovs r1, 0\n" + "_08041C02:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x9\n" + "\tbls _08041C02\n" + "\tmovs r6, 0\n" + "\tldr r2, _08041CD8 @ =gUnknown_03000470\n" + "\tmovs r1, 0\n" + "_08041C18:\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r2\n" + "\tstrh r1, [r0]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x31\n" + "\tbls _08041C18\n" + "\tadds r0, r7, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetMonData\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r1, _08041CD8 @ =gUnknown_03000470\n" + "\tbl GetLevelUpMovesBySpecies\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tstr r0, [sp, 0x4]\n" + "\tmovs r6, 0\n" + "\tldr r1, _08041CCC @ =gUnknown_030004D8\n" + "\tmov r8, r1\n" + "_08041C46:\n" + "\tadds r5, r6, 0\n" + "\tadds r5, 0xD\n" + "\tmov r0, r10\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tlsls r4, r6, 1\n" + "\tmov r2, r8\n" + "\tadds r1, r4, r2\n" + "\tstrh r0, [r1]\n" + "\tmov r0, r9\n" + "\tadds r1, r5, 0\n" + "\tbl GetBoxMonData\n" + "\tldr r1, _08041CC8 @ =gUnknown_03000500\n" + "\tadds r4, r1\n" + "\tstrh r0, [r4]\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C46\n" + "\tldr r1, _08041CD4 @ =gUnknown_030004E8\n" + "\tadds r0, r7, 0\n" + "\tbl pokemon_get_eggmoves\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tmovs r6, 0\n" + "_08041C82:\n" + "\tldr r0, _08041CCC @ =gUnknown_030004D8\n" + "\tlsls r1, r6, 1\n" + "\tadds r2, r1, r0\n" + "\tldrh r1, [r2]\n" + "\tmov r9, r0\n" + "\tcmp r1, 0\n" + "\tbeq _08041CF8\n" + "\tmovs r5, 0\n" + "\tcmp r5, r8\n" + "\tbcs _08041CEA\n" + "\tadds r4, r2, 0\n" + "\tldr r2, _08041CDC @ =0x0000ffff\n" + "_08041C9A:\n" + "\tldr r0, _08041CD4 @ =gUnknown_030004E8\n" + "\tlsls r1, r5, 1\n" + "\tadds r1, r0\n" + "\tldrh r0, [r4]\n" + "\tldrh r1, [r1]\n" + "\tcmp r0, r1\n" + "\tbne _08041CE0\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041CEA\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041CEA\n" + "\t.align 2, 0\n" + "_08041CC8: .4byte gUnknown_03000500\n" + "_08041CCC: .4byte gUnknown_030004D8\n" + "_08041CD0: .4byte gUnknown_030004E0\n" + "_08041CD4: .4byte gUnknown_030004E8\n" + "_08041CD8: .4byte gUnknown_03000470\n" + "_08041CDC: .4byte 0x0000ffff\n" + "_08041CE0:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, r8\n" + "\tbcc _08041C9A\n" + "_08041CEA:\n" + "\tadds r0, r6, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r6, r0, 16\n" + "\tldr r3, _08041E14 @ =gUnknown_030004D8\n" + "\tmov r9, r3\n" + "\tcmp r6, 0x3\n" + "\tbls _08041C82\n" + "_08041CF8:\n" + "\tmovs r6, 0\n" + "_08041CFA:\n" + "\tlsls r0, r6, 1\n" + "\tmov r2, r9\n" + "\tadds r1, r0, r2\n" + "\tldrh r1, [r1]\n" + "\tadds r2, r0, 0\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tcmp r1, 0\n" + "\tbeq _08041D5C\n" + "\tmovs r5, 0\n" + "\tldr r0, _08041E14 @ =gUnknown_030004D8\n" + "\tadds r4, r2, r0\n" + "\tldr r6, _08041E18 @ =0x0000ffff\n" + "\tmov r9, r0\n" + "_08041D16:\n" + "\tldr r3, _08041E1C @ =0x00000121\n" + "\tadds r0, r5, r3\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tbl ItemIdToBattleMoveId\n" + "\tldrh r1, [r4]\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r1, r0\n" + "\tbne _08041D52\n" + "\tlsls r1, r5, 24\n" + "\tlsrs r1, 24\n" + "\tadds r0, r7, 0\n" + "\tbl CanMonLearnTMHM\n" + "\tcmp r0, 0\n" + "\tbeq _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, r6\n" + "\tbne _08041D52\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "_08041D52:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x39\n" + "\tbls _08041D16\n" + "_08041D5C:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbls _08041CFA\n" + "\tmovs r6, 0\n" + "\tmov r2, r9\n" + "\tldrh r0, [r2]\n" + "\tldr r3, _08041E20 @ =gUnknown_030004E0\n" + "\tmov r10, r3\n" + "\tcmp r0, 0\n" + "\tbeq _08041DC6\n" + "\tmov r4, r9\n" + "\tldr r0, _08041E24 @ =gUnknown_03000500\n" + "\tmov r9, r0\n" + "\tmov r12, r10\n" + "_08041D7C:\n" + "\tmovs r5, 0\n" + "\tlsls r2, r6, 1\n" + "\tadds r6, 0x1\n" + "\tmov r8, r6\n" + "\tadds r3, r2, r4\n" + "_08041D86:\n" + "\tlsls r0, r5, 1\n" + "\tadd r0, r9\n" + "\tldrh r2, [r3]\n" + "\tadds r1, r2, 0\n" + "\tldrh r0, [r0]\n" + "\tcmp r1, r0\n" + "\tbne _08041DA8\n" + "\tcmp r1, 0\n" + "\tbeq _08041DA8\n" + "\tldr r1, [sp]\n" + "\tadds r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tstr r0, [sp]\n" + "\tlsls r1, 1\n" + "\tadd r1, r12\n" + "\tstrh r2, [r1]\n" + "_08041DA8:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tcmp r5, 0x3\n" + "\tbls _08041D86\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041DC6\n" + "\tlsls r0, r6, 1\n" + "\tadds r0, r4\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08041D7C\n" + "_08041DC6:\n" + "\tmovs r6, 0\n" + "\tmov r2, r10\n" + "\tldrh r0, [r2]\n" + "\tcmp r0, 0\n" + "\tbeq _08041E50\n" + "_08041DD0:\n" + "\tmovs r5, 0\n" + "\tadds r3, r6, 0x1\n" + "\tmov r8, r3\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcs _08041E38\n" + "\tldr r2, _08041E18 @ =0x0000ffff\n" + "_08041DDE:\n" + "\tldr r1, _08041E28 @ =gUnknown_03000470\n" + "\tlsls r0, r5, 1\n" + "\tadds r0, r1\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0\n" + "\tbeq _08041E2C\n" + "\tlsls r0, r6, 1\n" + "\tmov r3, r10\n" + "\tadds r4, r0, r3\n" + "\tldrh r0, [r4]\n" + "\tcmp r0, r1\n" + "\tbne _08041E2C\n" + "\tadds r1, r0, 0\n" + "\tadds r0, r7, 0\n" + "\tstr r2, [sp, 0x8]\n" + "\tbl GiveMoveToMon\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tldr r2, [sp, 0x8]\n" + "\tcmp r0, r2\n" + "\tbne _08041E38\n" + "\tldrh r1, [r4]\n" + "\tadds r0, r7, 0\n" + "\tbl DeleteFirstMoveAndGiveMoveToMon\n" + "\tb _08041E38\n" + "\t.align 2, 0\n" + "_08041E14: .4byte gUnknown_030004D8\n" + "_08041E18: .4byte 0x0000ffff\n" + "_08041E1C: .4byte 0x00000121\n" + "_08041E20: .4byte gUnknown_030004E0\n" + "_08041E24: .4byte gUnknown_03000500\n" + "_08041E28: .4byte gUnknown_03000470\n" + "_08041E2C:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tldr r0, [sp, 0x4]\n" + "\tcmp r5, r0\n" + "\tbcc _08041DDE\n" + "_08041E38:\n" + "\tmov r1, r8\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r6, r0, 16\n" + "\tcmp r6, 0x3\n" + "\tbhi _08041E50\n" + "\tldr r0, _08041E60 @ =gUnknown_030004E0\n" + "\tlsls r1, r6, 1\n" + "\tadds r1, r0\n" + "\tldrh r1, [r1]\n" + "\tmov r10, r0\n" + "\tcmp r1, 0\n" + "\tbne _08041DD0\n" + "_08041E50:\n" + "\tadd sp, 0xC\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0\n" + "\t.align 2, 0\n" + "_08041E60: .4byte gUnknown_030004E0"); +} +#endif + +static void RemoveEggFromDayCare(struct DayCareData *dayCareData) +{ + dayCareData->misc.countersEtc.personalityLo = 0; + dayCareData->misc.countersEtc.unk_11a = 0; +} + +void sub_8041E7C(void) +{ + RemoveEggFromDayCare(&gSaveBlock1.daycareData); +} + +static void incense_effects(u16 *species, struct DayCareData *dayCareData) +{ + u16 momItem, dadItem; + if (*species == SPECIES_WYNAUT || *species == SPECIES_AZURILL) + { + momItem = GetBoxMonData(&dayCareData->mons[0], MON_DATA_HELD_ITEM); + dadItem = GetBoxMonData(&dayCareData->mons[1], MON_DATA_HELD_ITEM); + if (*species == SPECIES_WYNAUT && momItem != ITEM_LAX_INCENSE && dadItem != ITEM_LAX_INCENSE) + { + *species = SPECIES_WOBBUFFET; + } + if (*species == SPECIES_AZURILL && momItem != ITEM_SEA_INCENSE && dadItem != ITEM_SEA_INCENSE) + { + *species = SPECIES_MARILL; + } + } +} + +static u16 sub_8041EEC(struct DayCareData *dayCareData, u8 *a1) // inherit_species_from_mom +{ + u16 i; + u16 species[2]; + u16 eggSpecies; + u8 buffer; + for (i=0; i<2; i++) + { + species[i] = GetBoxMonData(&dayCareData->mons[i], MON_DATA_SPECIES); + if (species[i] == SPECIES_DITTO) + { + a1[0] = i ^ 1; + a1[1] = i; + } + else if (GetBoxMonGender(&dayCareData->mons[i]) == MON_FEMALE) + { + a1[0] = i; + a1[1] = i ^ 1; + } + } + eggSpecies = sub_8041870(species[a1[0]]); + if (eggSpecies == SPECIES_NIDORAN_F && dayCareData->misc.countersEtc.personalityLo & 0x8000) + { + eggSpecies = SPECIES_NIDORAN_M; + } + if (eggSpecies == SPECIES_ILLUMISE && dayCareData->misc.countersEtc.personalityLo & 0x8000) + { + eggSpecies = SPECIES_VOLBEAT; + } + if (species[a1[1]] == SPECIES_DITTO && GetBoxMonGender(&dayCareData->mons[a1[0]]) != MON_FEMALE) + { + buffer = a1[1]; + a1[1] = a1[0]; + a1[0] = buffer; + } + return eggSpecies; +} + +static void sub_8041FC4(struct DayCareData *dayCareData) // give_egg +{ + struct Pokemon egg; + u16 species; + u8 parents[2]; + u8 isEgg; + species = sub_8041EEC(dayCareData, parents); + incense_effects(&species, dayCareData); + sub_80420FC(&egg, species, dayCareData); + InheritIVs(&egg, dayCareData); + daycare_build_child_moveset(&egg, &dayCareData->mons[parents[1]], &dayCareData->mons[parents[0]]); + isEgg = TRUE; + SetMonData(&egg, MON_DATA_IS_EGG, &isEgg); + gPlayerParty[5] = egg; + party_compaction(); + CalculatePlayerPartyCount(); + RemoveEggFromDayCare(dayCareData); +} + + +void sub_8042044(struct Pokemon *mon, u16 species, u8 overwriteMetLocation) // scr_create_egg +{ + u8 metLevel; + u16 ball; + u8 language; + u8 metLocation; + u8 isEgg; + CreateMon(mon, species, 5, 0x20, FALSE, 0, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, (u8 *)&ball); + SetMonData(mon, MON_DATA_NICKNAME, gUnknown_08209AD4); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); + if (overwriteMetLocation) + { + metLocation = 0xfd; + SetMonData(mon, MON_DATA_MET_LOCATION, &metLocation); + } + isEgg = TRUE; + SetMonData(mon, MON_DATA_IS_EGG, &isEgg); +} + +static void sub_80420FC(struct Pokemon *mon, u16 species, struct DayCareData *dayCareData) +{ + u32 personality; + u16 ball; + u8 metLevel; + u8 language; + personality = dayCareData->misc.countersEtc.personalityLo | (Random() << 16); + CreateMon(mon, species, 5, 0x20, TRUE, personality, FALSE, 0); + metLevel = 0; + ball = ITEM_POKE_BALL; + language = LANGUAGE_JAPANESE; + SetMonData(mon, MON_DATA_POKEBALL, (u8 *)&ball); + SetMonData(mon, MON_DATA_NICKNAME, gUnknown_08209AD4); + SetMonData(mon, MON_DATA_FRIENDSHIP, &gBaseStats[species].eggCycles); + SetMonData(mon, MON_DATA_MET_LEVEL, &metLevel); + SetMonData(mon, MON_DATA_LANGUAGE, &language); +} + +void sp0B8_daycare(void) +{ + sub_8041FC4(&gSaveBlock1.daycareData); +} + +#ifdef NONMATCHING +static bool8 sub_80421B0(struct DayCareData *dayCareData) +{ + struct BoxPokemon *parent; + u32 i; + int v0; + int steps; + v0 = 0; + for (i=0, parent=&dayCareData->mons[0]; i<2; parent++, i++) + { + if (GetBoxMonData(parent, MON_DATA_SANITY_BIT2, v0)) + { + dayCareData->misc.countersEtc.steps[i]++; + v0++; + } + } + if (dayCareData->misc.countersEtc.personalityLo == 0 && v0 == 2 && dayCareData->misc.extra.misc[4] == 0xff && daycare_relationship_score(dayCareData) > (u32)((u32)(Random() * 100) / 0xffff)) + { + sub_8041940(); + } + if ((++dayCareData->misc.countersEtc.unk_11a) == 0xff) + { + for (i=0; i<gPlayerPartyCount; i++) + { + if (GetMonData(&gPlayerParty[i], MON_DATA_IS_EGG)) + { + steps = GetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP); + if (steps == 0) + { + gSpecialVar_0x8004 = i; + return TRUE; + } + steps--; + SetMonData(&gPlayerParty[i], MON_DATA_FRIENDSHIP, (u8 *)&steps); + } + } + } + return FALSE; +} +#else +__attribute__((naked)) +static bool8 sub_80421B0(struct DayCareData *dayCareData) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tsub sp, 0x8\n" + "\tadds r7, r0, 0\n" + "\tmovs r2, 0\n" + "\tmovs r6, 0\n" + "\tadds r5, r7, 0\n" + "_080421BC:\n" + "\tlsls r4, r6, 2\n" + "\tadds r0, r5, 0\n" + "\tmovs r1, 0x5\n" + "\tstr r2, [sp, 0x4]\n" + "\tbl GetBoxMonData\n" + "\tldr r2, [sp, 0x4]\n" + "\tcmp r0, 0\n" + "\tbeq _080421DE\n" + "\tmovs r0, 0x88\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tadds r1, r4\n" + "\tldr r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstr r0, [r1]\n" + "\tadds r2, 0x1\n" + "_080421DE:\n" + "\tadds r5, 0x50\n" + "\tadds r6, 0x1\n" + "\tcmp r6, 0x1\n" + "\tbls _080421BC\n" + "\tmovs r1, 0x8C\n" + "\tlsls r1, 1\n" + "\tadds r0, r7, r1\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _08042226\n" + "\tcmp r2, 0x2\n" + "\tbne _08042226\n" + "\tsubs r1, 0x4\n" + "\tadds r0, r7, r1\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042226\n" + "\tadds r0, r7, 0\n" + "\tbl daycare_relationship_score\n" + "\tadds r4, r0, 0\n" + "\tlsls r4, 24\n" + "\tlsrs r4, 24\n" + "\tbl Random\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tmovs r1, 0x64\n" + "\tmuls r0, r1\n" + "\tldr r1, _08042240 @ =0x0000ffff\n" + "\tbl __udivsi3\n" + "\tcmp r4, r0\n" + "\tbls _08042226\n" + "\tbl sub_8041940\n" + "_08042226:\n" + "\tmovs r0, 0x8D\n" + "\tlsls r0, 1\n" + "\tadds r1, r7, r0\n" + "\tldrb r0, [r1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r1]\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042290\n" + "\tmovs r6, 0\n" + "\tb _08042288\n" + "\t.align 2, 0\n" + "_08042240: .4byte 0x0000ffff\n" + "_08042244:\n" + "\tmovs r0, 0x64\n" + "\tadds r1, r6, 0\n" + "\tmuls r1, r0\n" + "\tldr r0, _08042270 @ =gPlayerParty\n" + "\tadds r4, r1, r0\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x2D\n" + "\tbl GetMonData\n" + "\tcmp r0, 0\n" + "\tbeq _08042286\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x20\n" + "\tbl GetMonData\n" + "\tstr r0, [sp]\n" + "\tcmp r0, 0\n" + "\tbne _08042278\n" + "\tldr r0, _08042274 @ =gSpecialVar_0x8004\n" + "\tstrh r6, [r0]\n" + "\tmovs r0, 0x1\n" + "\tb _08042292\n" + "\t.align 2, 0\n" + "_08042270: .4byte gPlayerParty\n" + "_08042274: .4byte gSpecialVar_0x8004\n" + "_08042278:\n" + "\tsubs r0, 0x1\n" + "\tstr r0, [sp]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x20\n" + "\tmov r2, sp\n" + "\tbl SetMonData\n" + "_08042286:\n" + "\tadds r6, 0x1\n" + "_08042288:\n" + "\tldr r0, _0804229C @ =gPlayerPartyCount\n" + "\tldrb r0, [r0]\n" + "\tcmp r6, r0\n" + "\tbcc _08042244\n" + "_08042290:\n" + "\tmovs r0, 0\n" + "_08042292:\n" + "\tadd sp, 0x8\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1\n" + "\t.align 2, 0\n" + "_0804229C: .4byte gPlayerPartyCount"); +} +#endif + +bool8 sub_80422A0(void) +{ + return sub_80421B0(&gSaveBlock1.daycareData); +} + +static bool8 sub_80422B4(struct DayCareData *dayCareData) +{ + return (u32)((-dayCareData->misc.countersEtc.personalityLo) | dayCareData->misc.countersEtc.personalityLo) >> 31; +} + +static void sub_80422C4(struct DayCareData *dayCareData) +{ + u8 language; + if (GetBoxMonData(&dayCareData->mons[0], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&dayCareData->mons[0], gStringVar1); + language = GetBoxMonData(&dayCareData->mons[0], MON_DATA_LANGUAGE); + GetBoxMonData(&dayCareData->mons[0], MON_DATA_OT_NAME, gStringVar3); + ConvertInternationalString(gStringVar3, language); + } + if (GetBoxMonData(&dayCareData->mons[1], MON_DATA_SPECIES) != 0) + { + GetBoxMonNick(&dayCareData->mons[1], gStringVar2); + } +} + +u16 sub_8042328(void) +{ + GetBoxMonNick(&gPlayerParty[gLastFieldPokeMenuOpened].box, gStringVar1); + return GetBoxMonData(&gPlayerParty[gLastFieldPokeMenuOpened].box, MON_DATA_SPECIES); +} + +void sp0B5_daycare(void) +{ + sub_80422C4(&gSaveBlock1.daycareData); +} + +u8 sp0B6_daycare(void) +{ + u8 monCount; + if (sub_80422B4(&gSaveBlock1.daycareData)) + { + return 1; + } + monCount = Daycare_CountPokemon(&gSaveBlock1.daycareData); + if (monCount != 0) + { + return monCount + 1; + } + return 0; +} + +#ifdef NONMATCHING +static +#endif +bool8 sub_80423A8(u16 *a, u16 *b) +{ + int i, j; + u16 *v0, *v1, v2; + for (i=0, v0=a; i<2; v0++, i++) + { + for (j=0, v2=*v0, v1=b; j<2; v1++, j++) + { + if (v2 == *v1) + { + return TRUE; + } + } + } + return FALSE; +} + +#ifdef NONMATCHING +static u8 daycare_relationship_score(struct DayCareData *dayCareData) +{ + u16 species[2]; + u32 otIds[2]; + u32 genders[2]; + u16 eggGroups[2][2]; + int i; + u16 *spc; + u32 *ids; + u32 *gnd; + u16 *egg1; + u16 *egg2; + struct BoxPokemon *parent; + for (i=0, parent=&dayCareData->mons[0], spc=species, ids=otIds, gnd=genders, egg1=&eggGroups[0][0], egg2=&eggGroups[0][1]; i<2; spc++, egg1+=2, egg2+=2, parent++, i++) + { + *spc = GetBoxMonData(parent, MON_DATA_SPECIES); + *ids++ = GetBoxMonData(parent, MON_DATA_OT_ID); + *gnd++ = GetGenderFromSpeciesAndPersonality(*spc, GetBoxMonData(parent, MON_DATA_PERSONALITY)); + *egg1 = gBaseStats[*spc].eggGroup1; + *egg2 = gBaseStats[*spc].eggGroup2; + } + if (eggGroups[0][0] == 0xf) + { + return 0; + } + if (eggGroups[1][0] == 0xf) + { + return 0; + } + if (eggGroups[0][0] == 0xd && eggGroups[1][0] == 0xd) + { + return 0; + } + else if (eggGroups[0][0] == 0xd || eggGroups[1][0] == 0xd) + { + if (otIds[0] == otIds[1]) + { + return 20; + } + return 50; + } + if (genders[0] == genders[1] || genders[0] == MON_GENDERLESS || genders[1] == MON_GENDERLESS) + { + return 0; + } + if (!sub_80423A8(eggGroups[0], eggGroups[1])) + { + return 0; + } + if (species[0] == species[1]) + { + if (otIds[0] == otIds[1]) + { + return 50; + } + return 70; + } + else + { + if (otIds[0] != otIds[1]) + { + return 50; + } + return 20; + } +} +#else +__attribute__((naked)) +static u8 daycare_relationship_score(struct DayCareData *dayCareData) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r10\n" + "\tmov r6, r9\n" + "\tmov r5, r8\n" + "\tpush {r5-r7}\n" + "\tsub sp, 0x2C\n" + "\tmovs r1, 0\n" + "\tmov r8, r1\n" + "\tmov r2, sp\n" + "\tadds r2, 0x8\n" + "\tstr r2, [sp, 0x1C]\n" + "\tadd r1, sp, 0xC\n" + "\tmov r10, r1\n" + "\tadds r2, 0xC\n" + "\tstr r2, [sp, 0x20]\n" + "\tmov r1, sp\n" + "\tadds r1, 0x2\n" + "\tldr r2, _08042488 @ =gBaseStats\n" + "\tmov r9, r2\n" + "\tldr r5, [sp, 0x1C]\n" + "\tadds r7, r1, 0\n" + "\tmov r6, sp\n" + "\tldr r1, [sp, 0x20]\n" + "\tstr r1, [sp, 0x24]\n" + "\tmov r2, r10\n" + "\tstr r2, [sp, 0x28]\n" + "\tadds r4, r0, 0\n" + "_0804240E:\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0xB\n" + "\tbl GetBoxMonData\n" + "\tstrh r0, [r5]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0x1\n" + "\tbl GetBoxMonData\n" + "\tldr r1, [sp, 0x28]\n" + "\tstm r1!, {r0}\n" + "\tstr r1, [sp, 0x28]\n" + "\tadds r0, r4, 0\n" + "\tmovs r1, 0\n" + "\tbl GetBoxMonData\n" + "\tadds r1, r0, 0\n" + "\tldrh r0, [r5]\n" + "\tbl GetGenderFromSpeciesAndPersonality\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tldr r2, [sp, 0x24]\n" + "\tstm r2!, {r0}\n" + "\tstr r2, [sp, 0x24]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x14]\n" + "\tstrh r0, [r6]\n" + "\tldrh r1, [r5]\n" + "\tlsls r0, r1, 3\n" + "\tsubs r0, r1\n" + "\tlsls r0, 2\n" + "\tadd r0, r9\n" + "\tldrb r0, [r0, 0x15]\n" + "\tstrh r0, [r7]\n" + "\tadds r5, 0x2\n" + "\tadds r7, 0x4\n" + "\tadds r6, 0x4\n" + "\tadds r4, 0x50\n" + "\tmovs r0, 0x1\n" + "\tadd r8, r0\n" + "\tmov r1, r8\n" + "\tcmp r1, 0x1\n" + "\tbls _0804240E\n" + "\tmov r0, sp\n" + "\tldrh r1, [r0]\n" + "\tcmp r1, 0xF\n" + "\tbeq _08042484\n" + "\tldrh r0, [r0, 0x4]\n" + "\tcmp r0, 0xF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xD\n" + "\tbne _0804248C\n" + "\tcmp r0, 0xD\n" + "\tbne _08042490\n" + "_08042484:\n" + "\tmovs r0, 0\n" + "\tb _080424E4\n" + "\t.align 2, 0\n" + "_08042488: .4byte gBaseStats\n" + "_0804248C:\n" + "\tcmp r0, 0xD\n" + "\tbne _0804249C\n" + "_08042490:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424DE\n" + "\tb _080424E2\n" + "_0804249C:\n" + "\tldr r0, [sp, 0x14]\n" + "\tldr r2, [sp, 0x20]\n" + "\tldr r1, [r2, 0x4]\n" + "\tcmp r0, r1\n" + "\tbeq _08042484\n" + "\tcmp r0, 0xFF\n" + "\tbeq _08042484\n" + "\tcmp r1, 0xFF\n" + "\tbeq _08042484\n" + "\tadd r1, sp, 0x4\n" + "\tmov r0, sp\n" + "\tbl sub_80423A8\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _08042484\n" + "\tldr r0, [sp, 0x1C]\n" + "\tldrh r1, [r0, 0x2]\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, r1\n" + "\tbne _080424D4\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbeq _080424E2\n" + "\tmovs r0, 0x46\n" + "\tb _080424E4\n" + "_080424D4:\n" + "\tldr r1, [sp, 0xC]\n" + "\tmov r2, r10\n" + "\tldr r0, [r2, 0x4]\n" + "\tcmp r1, r0\n" + "\tbne _080424E2\n" + "_080424DE:\n" + "\tmovs r0, 0x14\n" + "\tb _080424E4\n" + "_080424E2:\n" + "\tmovs r0, 0x32\n" + "_080424E4:\n" + "\tadd sp, 0x2C\n" + "\tpop {r3-r5}\n" + "\tmov r8, r3\n" + "\tmov r9, r4\n" + "\tmov r10, r5\n" + "\tpop {r4-r7}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +u8 daycare_relationship_score_from_savegame(void) +{ + return daycare_relationship_score(&gSaveBlock1.daycareData); +} + +void sp0B9_daycare_relationship_comment(void) +{ + u8 whichString; + u8 relationshipScore; + + relationshipScore = daycare_relationship_score_from_savegame(); + whichString = 0; + if (relationshipScore == 0) + whichString = 3; + if (relationshipScore == 20) + whichString = 2; + if (relationshipScore == 50) + whichString = 1; + if (relationshipScore == 70) + whichString = 0; + StringCopy(gStringVar4, gUnknown_08209AC4[whichString]); +} + +#ifdef NONMATCHING +bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) +{ + u8 i; + u8 flags[2]; + + // This portion is nonmatching + flags[1] = 0; + flags[0] = 0; + for (i = 0; name[i] != EOS; i ++) + // End nonmatching portion + + { + if (name[i] == CHAR_MALE) flags[0] ++; + if (name[i] == CHAR_FEMALE) flags[1] ++; + } + if (genderRatio == MON_MALE && flags[0] && !flags[1]) return TRUE; + if (genderRatio == MON_FEMALE && flags[1] && !flags[0]) return TRUE; + return FALSE; +} +#else +__attribute__((naked)) +bool8 NameHasGenderSymbol(const u8 *name, u8 genderRatio) +{ + asm_unified("\n" + "\tpush {r4,r5,lr}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r0, 0\n" + "\tlsls r1, 24\n" + "\tlsrs r5, r1, 24\n" + "\tmov r2, sp\n" + "\tmov r1, sp\n" + "\tmovs r0, 0\n" + "\tstrb r0, [r1, 0x1]\n" + "\tstrb r0, [r2]\n" + "\tmovs r3, 0\n" + "\tldrb r0, [r4]\n" + "\tcmp r0, 0xFF\n" + "\tbeq _0804258C\n" + "_08042564:\n" + "\tadds r1, r4, r3\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xB5\n" + "\tbne _08042572\n" + "\tldrb r0, [r2]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r2]\n" + "_08042572:\n" + "\tldrb r0, [r1]\n" + "\tcmp r0, 0xB6\n" + "\tbne _0804257E\n" + "\tldrb r0, [r2, 0x1]\n" + "\tadds r0, 0x1\n" + "\tstrb r0, [r2, 0x1]\n" + "_0804257E:\n" + "\tadds r0, r3, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r3, r0, 24\n" + "\tadds r0, r4, r3\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0xFF\n" + "\tbne _08042564\n" + "_0804258C:\n" + "\tcmp r5, 0\n" + "\tbne _080425A0\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbeq _080425A0\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0, 0x1]\n" + "\tcmp r0, 0\n" + "\tbeq _080425B4\n" + "_080425A0:\n" + "\tcmp r5, 0xFE\n" + "\tbne _080425B8\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0, 0x1]\n" + "\tcmp r0, 0\n" + "\tbeq _080425B8\n" + "\tmov r0, sp\n" + "\tldrb r0, [r0]\n" + "\tcmp r0, 0\n" + "\tbne _080425B8\n" + "_080425B4:\n" + "\tmovs r0, 0x1\n" + "\tb _080425BA\n" + "_080425B8:\n" + "\tmovs r0, 0\n" + "_080425BA:\n" + "\tadd sp, 0x4\n" + "\tpop {r4,r5}\n" + "\tpop {r1}\n" + "\tbx r1"); +} +#endif + +static u8 *AppendGenderSymbol(u8 *name, u8 gender) +{ + if (gender == MON_MALE) + { + if (!NameHasGenderSymbol(name, MON_MALE)) + return StringAppend(name, gOtherText_MaleSymbol3); + } + + else if (gender == MON_FEMALE) + { + if (!NameHasGenderSymbol(name, MON_FEMALE)) + return StringAppend(name, gOtherText_FemaleSymbol3); + } + return StringAppend(name, gOtherText_GenderlessSymbol); +} + +static u8 *MonAppendGenderSymbol(u8 *name, struct BoxPokemon *boxMon) +{ + return AppendGenderSymbol(name, GetBoxMonGender(boxMon)); +} + +static void DaycareLevelMenuGetText(struct DayCareData *dayCareData, u8 *dest) +{ + u8 buffers[2][20]; + u8 i; + *dest = EOS; + for (i = 0; i < 2; i ++) + { + GetBoxMonNick(&dayCareData->mons[i], buffers[i]); + MonAppendGenderSymbol(buffers[i], &dayCareData->mons[i]); + } + StringCopy(dest, buffers[0]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, buffers[1]); + StringAppend(dest, gOtherText_NewLine2); + StringAppend(dest, gOtherText_CancelAndLv); +} + +static void DaycareLevelMenuGetLevelText(struct DayCareData *dayCareData, u8 *dest) +{ + u8 i; + u8 level; + *dest = EOS; + for (i = 0; i < 2; i ++) + { + level = Daycare_GetLevelAfterSteps(&dayCareData->mons[i], dayCareData->misc.countersEtc.steps[i]); + dest[0] = 0x34; + dest[1] = 0xFC; + dest[2] = 0x14; + dest[3] = 0x06; + dest = ConvertIntToDecimalStringN(dest + 4, level, STR_CONV_MODE_RIGHT_ALIGN, 3); + dest[0] = 0xFC; + dest[1] = 0x14; + dest[2] = 0x00; + dest = StringCopy(dest + 3, gOtherText_NewLine2); + } + *dest = EOS; +} + +static void DaycareLevelMenuProcessKeyInput(u8 taskId) +{ + if (gMain.newKeys & DPAD_UP) + { + if (gTasks[taskId].data[0] != 0) + { + gTasks[taskId].data[0] --; + MoveMenuCursor(-1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & DPAD_DOWN) + { + if (gTasks[taskId].data[0] != 2) + { + gTasks[taskId].data[0] ++; + MoveMenuCursor(+1); + PlaySE(SE_SELECT); + } + } + else if (gMain.newKeys & A_BUTTON) + { + HandleDestroyMenuCursors(); + PlaySE(SE_SELECT); + gLastFieldPokeMenuOpened = gScriptResult = gTasks[taskId].data[0]; + DestroyTask(taskId); + MenuZeroFillWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } + else if (gMain.newKeys & B_BUTTON) + { + HandleDestroyMenuCursors(); + gLastFieldPokeMenuOpened = gScriptResult = 2; + DestroyTask(taskId); + MenuZeroFillWindowRect(15, 6, 29, 13); + EnableBothScriptContexts(); + } +} + +void ShowDaycareLevelMenu(void) +{ + u8 buffer[100]; + MenuDrawTextWindow(15, 6, 29, 13); + DaycareLevelMenuGetText(&gSaveBlock1.daycareData, buffer); + MenuPrint(buffer, 16, 7); + DaycareLevelMenuGetLevelText(&gSaveBlock1.daycareData, buffer); + MenuPrint_PixelCoords(buffer, 0xce, 0x38, TRUE); + InitMenu(0, 16, 7, 3, 0, 13); + CreateTask(DaycareLevelMenuProcessKeyInput, 3); +} + +void ChooseSendDaycareMon(void) +{ + OpenPartyMenu(6, 0); + gMain.savedCallback = c2_exit_to_overworld_2_switch; +} diff --git a/src/field/decoration_inventory.c b/src/field/decoration_inventory.c index 35ba7e228..083cb260c 100644 --- a/src/field/decoration_inventory.c +++ b/src/field/decoration_inventory.c @@ -1,5 +1,5 @@ // -// Created by Scott Norton on 6/5/17. + // #include "global.h" diff --git a/src/field/easy_chat.c b/src/field/easy_chat.c index dd33e69c3..e71067454 100644 --- a/src/field/easy_chat.c +++ b/src/field/easy_chat.c @@ -19,6 +19,8 @@ extern const u8 gEasyChatGroupSizes[]; extern u16 gSpecialVar_0x8004; +IWRAM_DATA u8 gUnknown_03000740; + // returns the end of the destination buffer text u8 *EasyChat_GetWordText(u8 *dst, u16 word) { diff --git a/src/field/field_effect.c b/src/field/field_effect.c index 0625e9d18..72224f299 100644 --- a/src/field/field_effect.c +++ b/src/field/field_effect.c @@ -1894,7 +1894,6 @@ bool8 sub_80873F4(struct Task *task, struct MapObject *mapObject, struct Sprite } void sub_8087470(u8); -extern u8 sub_80608A4(u8); void mapldr_080851BC(void) { diff --git a/src/field/field_effect_helpers.c b/src/field/field_effect_helpers.c new file mode 100644 index 000000000..2ad8bdce3 --- /dev/null +++ b/src/field/field_effect_helpers.c @@ -0,0 +1,1632 @@ +#include "global.h" +#include "sprite.h" +#include "fieldmap.h" +#include "metatile_behavior.h" +#include "songs.h" +#include "sound.h" +#include "field_map_obj.h" +#include "field_camera.h" +#include "field_map_obj_helpers.h" +#include "field_weather.h" +#include "field_effect.h" +#include "field_ground_effect.h" +#include "field_effect_helpers.h" + +static void sub_81269E0(struct Sprite *); +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite); +static void npc_pal_op_A(struct MapObject *, u8); +static void npc_pal_op_B(struct MapObject *, u8); +static void sub_81275A0(struct Sprite *); +static void sub_81275C4(struct Sprite *); +static void sub_8127DA0(struct Sprite *); +static void sub_8127DD0(struct Sprite *); +static void sub_8127E30(struct Sprite *); +static void sub_812882C(struct Sprite *, u8, u8); +static void sub_81278D8(struct Sprite *); +static void sub_8127FD4(struct MapObject *, struct Sprite *); +static void sub_812800C(struct MapObject *, struct Sprite *); +static void sub_81280A0(struct MapObject *, struct Sprite *, struct Sprite *); +static void sub_8128174(struct Sprite *); +static u32 ShowDisguiseFieldEffect(u8, u8, u8); + +const u8 UnusedEggString_8401E28[] = _("タマゴ"); + +const u16 gUnknown_08401E2C[] = { + 0x0c, + 0x1c, + 0x2c +}; + +const u8 gUnknown_08401E32[] = { + 0, + 1, + 2, + 3 +}; + +const u16 gUnknown_08401E36[] = { + 4, + 4, + 4, + 16 +}; + +void (*const gUnknown_08401E40[])(struct Sprite *) = { + sub_81275A0, + sub_81275C4 +}; + +void (*const gUnknown_08401E48[])(struct Sprite *) = { + sub_8127DA0, + sub_8127DD0, + sub_8127E30 +}; + +const u8 gUnknown_08401E54[] = { + 0, + 0, + 1, + 2, + 3 +}; + +const u16 gUnknown_08401E5A[] = { + 3, + 7 +}; + +void SetUpReflection(struct MapObject *mapObject, struct Sprite *sprite, bool8 flag) +{ + struct Sprite *newSprite; + + newSprite = &gSprites[obj_unfreeze(sprite, sprite->pos1.x, sprite->pos1.y, 0x98)]; + newSprite->callback = sub_81269E0; + newSprite->oam.priority = 3; + newSprite->oam.paletteNum = gUnknown_0830FD14[newSprite->oam.paletteNum]; + newSprite->usingSheet = TRUE; + newSprite->anims = gDummySpriteAnimTable; + StartSpriteAnim(newSprite, 0); + newSprite->affineAnims = gDummySpriteAffineAnimTable; + newSprite->affineAnimBeginning = TRUE; + newSprite->subspriteMode = 0; + newSprite->data0 = sprite->data0; + newSprite->data1 = mapObject->localId; + newSprite->data7 = flag; + npc_pal_op(mapObject, newSprite); + if (!flag) + { + newSprite->oam.affineMode = 1; + } +} + +static s16 sub_81268D0(struct MapObject *mapObject) +{ + return GetFieldObjectGraphicsInfo(mapObject->graphicsId)->height - 2; +} + +static void npc_pal_op(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 whichElement; + u16 unk_8041e2c[ARRAY_COUNT(gUnknown_08401E2C)]; + + memcpy(unk_8041e2c, gUnknown_08401E2C, sizeof gUnknown_08401E2C); + sprite->data2 = 0; + if (!GetFieldObjectGraphicsInfo(mapObject->graphicsId)->disableReflectionPaletteLoad && ((whichElement = sub_8057450(mapObject->mapobj_unk_1F)) || (whichElement = sub_8057450(mapObject->mapobj_unk_1E)))) + { + sprite->data2 = unk_8041e2c[whichElement - 1]; + npc_pal_op_A(mapObject, sprite->oam.paletteNum); + } + else + { + npc_pal_op_B(mapObject, sprite->oam.paletteNum); + } +} + +static void npc_pal_op_B(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + if (graphicsInfo->paletteSlot == 0) + { + npc_load_two_palettes__no_record(graphicsInfo->paletteTag1, paletteNum); + } + else if (graphicsInfo->paletteSlot == 10) + { + npc_load_two_palettes__and_record(graphicsInfo->paletteTag1, paletteNum); + } + else + { + pal_patch_for_npc(npc_paltag_by_palslot(paletteNum), paletteNum); + } + sub_807D78C(paletteNum); + } +} + +static void npc_pal_op_A(struct MapObject *mapObject, u8 paletteNum) +{ + const struct MapObjectGraphicsInfo *graphicsInfo; + + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + if (graphicsInfo->paletteTag2 != 0x11ff) + { + pal_patch_for_npc(graphicsInfo->paletteTag2, paletteNum); + sub_807D78C(paletteNum); + } +} + +static void sub_81269E0(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *oldSprite; + + mapObject = &gMapObjects[sprite->data0]; + oldSprite = &gSprites[mapObject->spriteId]; + if (!mapObject->active || !mapObject->mapobj_bit_17 || mapObject->localId != sprite->data1) + { + sprite->inUse = FALSE; + } + else + { + sprite->oam.paletteNum = gUnknown_0830FD14[oldSprite->oam.paletteNum]; + sprite->oam.shape = oldSprite->oam.shape; + sprite->oam.size = oldSprite->oam.size; + sprite->oam.matrixNum = oldSprite->oam.matrixNum | 0x10; + sprite->oam.tileNum = oldSprite->oam.tileNum; + sprite->subspriteTables = oldSprite->subspriteTables; + sprite->subspriteTableNum = oldSprite->subspriteTableNum; + sprite->invisible = oldSprite->invisible; + sprite->pos1.x = oldSprite->pos1.x; + sprite->pos1.y = oldSprite->pos1.y + sub_81268D0(mapObject) + sprite->data2; + sprite->centerToCornerVecX = oldSprite->centerToCornerVecX; + sprite->centerToCornerVecY = oldSprite->centerToCornerVecY; + sprite->pos2.x = oldSprite->pos2.x; + sprite->pos2.y = -oldSprite->pos2.y; + sprite->coordOffsetEnabled = oldSprite->coordOffsetEnabled; + if (sprite->data7 == FALSE) + { + sprite->oam.matrixNum = 0; + if (oldSprite->oam.matrixNum & 0x8) + { + sprite->oam.matrixNum = 1; + } + } + } +} + +u8 sub_8126B54(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[8] /*gFieldEffectSpriteTemplate_Arrow*/, 0, 0, 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->oam.priority = 1; + sprite->coordOffsetEnabled = TRUE; + sprite->invisible = TRUE; + } + return spriteId; +} + +void objid_set_invisible(u8 spriteId) +{ + gSprites[spriteId].invisible = TRUE; +} + +void sub_8126BC4(u8 spriteId, u8 animNum, s16 x, s16 y) +{ + s16 x2; + s16 y2; + struct Sprite *sprite; + + sprite = &gSprites[spriteId]; + if (sprite->invisible || sprite->data0 != x || sprite->data1 != y) + { + sub_80603CC(x, y, &x2, &y2); + sprite = &gSprites[spriteId]; + sprite->pos1.x = x2 + 8; + sprite->pos1.y = y2 + 8; + sprite->invisible = FALSE; + sprite->data0 = x; + sprite->data1 = y; + StartSpriteAnim(sprite, animNum - 1); + } +} + +u32 FldEff_Shadow(void) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + u8 spriteId; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[gUnknown_08401E32[graphicsInfo->shadowSize]], 0, 0, 0x94); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].coordOffsetEnabled = TRUE; + gSprites[spriteId].data0 = gFieldEffectArguments[0]; + gSprites[spriteId].data1 = gFieldEffectArguments[1]; + gSprites[spriteId].data2 = gFieldEffectArguments[2]; + gSprites[spriteId].data3 = (graphicsInfo->height >> 1) - gUnknown_08401E36[graphicsInfo->shadowSize]; + } + return 0; +} + +void oamc_shadow(struct Sprite *sprite) +{ + u8 mapObjectId; + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + sprite->data3; + if (!mapObject->active || !mapObject->mapobj_bit_22 || MetatileBehavior_IsPokeGrass(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1E) || MetatileBehavior_IsSurfableWaterOrUnderwater(mapObject->mapobj_unk_1F) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1E) || MetatileBehavior_IsReflective(mapObject->mapobj_unk_1F)) + { + FieldEffectStop(sprite, FLDEFF_SHADOW); + } + } +} + +u32 FldEff_TallGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[4], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + sprite->data5 = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 4); + } + } + return 0; +} + +void unc_grass_normal(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data5 >> 8; + mapGroup = sprite->data5; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data1 -= gCamera.x; + sprite->data2 -= gCamera.y; + sprite->data5 = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data3 >> 8; + mapNum = sprite->data3; + mapGroup = sprite->data4; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data1, sprite->data2); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsTallGrass(metatileBehavior) || (sprite->data7 && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_TALL_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data1 || mapObject->coords2.y != sprite->data2) && (mapObject->coords3.x != sprite->data1 || mapObject->coords3.y != sprite->data2)) + { + sprite->data7 = TRUE; + } + metatileBehavior = 0; + if (sprite->animCmdIndex == 0) + { + metatileBehavior = 4; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data0, metatileBehavior); + } +} + +u32 FldEff_JumpTallGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[10], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 12; + } + return 0; +} + +u8 sub_8126FF0(u8 localId, u8 mapNum, u8 mapGroup, s16 x, s16 y) +{ + struct Sprite *sprite; + u8 i; + + for (i = 0; i < MAX_SPRITES; i ++) + { + if (gSprites[i].inUse) + { + sprite = &gSprites[i]; + if (sprite->callback == unc_grass_normal && (x == sprite->data1 && y == sprite->data2) && (localId == (u8)(sprite->data3 >> 8) && mapNum == (sprite->data3 & 0xFF) && mapGroup == sprite->data4)) + { + return i; + } + } + } + return MAX_SPRITES; +} + +u32 FldEff_LongGrass(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[15], x, y, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = ZCoordToPriority(gFieldEffectArguments[2]); + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + sprite->data5 = gFieldEffectArguments[6]; + if (gFieldEffectArguments[7]) + { + SeekSpriteAnim(sprite, 6); + } + } + return 0; +} + +void unc_grass_tall(struct Sprite *sprite) +{ + u8 mapNum; + u8 mapGroup; + u8 metatileBehavior; + u8 localId; + u8 mapObjectId; + struct MapObject *mapObject; + + mapNum = sprite->data5 >> 8; + mapGroup = sprite->data5; + if (gCamera.field_0 && (gSaveBlock1.location.mapNum != mapNum || gSaveBlock1.location.mapGroup != mapGroup)) + { + sprite->data1 -= gCamera.x; + sprite->data2 -= gCamera.y; + sprite->data5 = ((u8)gSaveBlock1.location.mapNum << 8) | (u8)gSaveBlock1.location.mapGroup; + } + localId = sprite->data3 >> 8; + mapNum = sprite->data3; + mapGroup = sprite->data4; + metatileBehavior = MapGridGetMetatileBehaviorAt(sprite->data1, sprite->data2); + if (TryGetFieldObjectIdByLocalIdAndMap(localId, mapNum, mapGroup, &mapObjectId) || !MetatileBehavior_IsLongGrass(metatileBehavior) || (sprite->data7 && sprite->animEnded)) + { + FieldEffectStop(sprite, FLDEFF_LONG_GRASS); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + if ((mapObject->coords2.x != sprite->data1 || mapObject->coords2.y != sprite->data2) && (mapObject->coords3.x != sprite->data1 || mapObject->coords3.y != sprite->data2)) + { + sprite->data7 = TRUE; + } + sub_806487C(sprite, 0); + sub_812882C(sprite, sprite->data0, 0); + } +} + +u32 FldEff_JumpLongGrass(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[16], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 18; + } + return 0; +} + +u32 FldEff_ShortGrass(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[30], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &(gSprites[spriteId]); + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127334(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_18) + { + FieldEffectStop(sprite, FLDEFF_SHORT_GRASS); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + y = linkedSprite->pos1.y; + x = linkedSprite->pos1.x; + if (x != sprite->data3 || y != sprite->data4) + { + sprite->data3 = x; + sprite->data4 = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sprite->oam.priority = linkedSprite->oam.priority; + sub_806487C(sprite, linkedSprite->invisible); + } +} + +u32 FldEff_SandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[11], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return 0; +} + +u32 FldEff_DeepSandFootprints(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[23], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_DEEP_SAND_FOOTPRINTS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +u32 FldEff_BikeTireTracks(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[27], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data7 = FLDEFF_BIKE_TIRE_TRACKS; + StartSpriteAnim(sprite, gFieldEffectArguments[4]); + } + return spriteId; +} + +void sub_8127584(struct Sprite *sprite) +{ + gUnknown_08401E40[sprite->data0](sprite); +} + +static void sub_81275A0(struct Sprite *sprite) +{ + if (++sprite->data1 > 40) + { + sprite->data0 = 1; + } + sub_806487C(sprite, FALSE); +} + +static void sub_81275C4(struct Sprite *sprite) +{ + sprite->invisible ^= 1; + sprite->data1 ++; + sub_806487C(sprite, sprite->invisible); + if (sprite->data1 > 56) + { + FieldEffectStop(sprite, sprite->data7); + } +} + +u32 FldEff_Splash(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->oam.priority = linkedSprite->oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + PlaySE(SE_MIZU); + } + return 0; +} + +void sub_81276B4(struct Sprite *sprite) +{ + u8 mapObjectId; + + if (sprite->animEnded || TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId)) + { + FieldEffectStop(sprite, FLDEFF_SPLASH); + } + else + { + sprite->pos1.x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + sprite->pos1.y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_JumpSmallSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[14], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = FLDEFF_JUMP_SMALL_SPLASH; + } + return 0; +} + +u32 FldEff_JumpBigSplash(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[12], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = FLDEFF_JUMP_BIG_SPLASH; + } + return 0; +} + +u32 FldEff_FeetInFlowingWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[13], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->callback = sub_81278D8; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = -1; + sprite->data4 = -1; + sprite->pos2.y = (graphicsInfo->height >> 1) - 4; + StartSpriteAnim(sprite, 1); + } + return 0; +} + +static void sub_81278D8(struct Sprite *sprite) +{ + u8 mapObjectId; + struct Sprite *linkedSprite; + struct MapObject *mapObject; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_19) + { + FieldEffectStop(sprite, FLDEFF_FEET_IN_FLOWING_WATER); + } + else + { + mapObject = &gMapObjects[mapObjectId]; + linkedSprite = &gSprites[mapObject->spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y; + sprite->subpriority = linkedSprite->subpriority; + sub_806487C(sprite, FALSE); + if (mapObject->coords2.x != sprite->data3 || mapObject->coords2.y != sprite->data4) + { + sprite->data3 = mapObject->coords2.x; + sprite->data4 = mapObject->coords2.y; + if (!sprite->invisible) + { + PlaySE(SE_MIZU); + } + } + } +} + +u32 FldEff_Ripple(void) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[5], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_RIPPLE; + } + return 0; +} + +u32 FldEff_HotSpringsWater(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[31], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + } + return 0; +} + +void sub_8127A7C(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_21) + { + FieldEffectStop(sprite, FLDEFF_HOT_SPRINGS_WATER); + } + else + { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 8; + sprite->subpriority = linkedSprite->subpriority - 1; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Unknown19(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[17], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_19; + } + return 0; +} + +u32 FldEff_Unknown20(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[18], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_20; + } + return 0; +} + +u32 FldEff_Unknown21(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[19], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_21; + } + return 0; +} + +u32 FldEff_Unknown22(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[20], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = FLDEFF_UNKNOWN_22; + } + return 0; +} + +void ash(s16 x, s16 y, u16 c, s16 d) +{ + gFieldEffectArguments[0] = x; + gFieldEffectArguments[1] = y; + gFieldEffectArguments[2] = 0x52; + gFieldEffectArguments[3] = 1; + gFieldEffectArguments[4] = c; + gFieldEffectArguments[5] = d; + FieldEffectStart(FLDEFF_ASH); +} + +u32 FldEff_Ash(void) +{ + s16 x; + s16 y; + u8 spriteId; + struct Sprite *sprite; + + x = gFieldEffectArguments[0]; + y = gFieldEffectArguments[1]; + sub_8060470(&x, &y, 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[6], x, y, gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data1 = gFieldEffectArguments[0]; + sprite->data2 = gFieldEffectArguments[1]; + sprite->data3 = gFieldEffectArguments[4]; + sprite->data4 = gFieldEffectArguments[5]; + } + return 0; +} + +void sub_8127D84(struct Sprite *sprite) +{ + gUnknown_08401E48[sprite->data0](sprite); +} + +static void sub_8127DA0(struct Sprite *sprite) +{ + sprite->invisible = TRUE; + sprite->animPaused = TRUE; + if (--sprite->data4 == 0) + { + sprite->data0 = 1; + } +} + +static void sub_8127DD0(struct Sprite *sprite) +{ + sprite->invisible = FALSE; + sprite->animPaused = FALSE; + MapGridSetMetatileIdAt(sprite->data1, sprite->data2, sprite->data3); + CurrentMapDrawMetatileAt(sprite->data1, sprite->data2); + gMapObjects[gPlayerAvatar.mapObjectId].mapobj_bit_2 = TRUE; + sprite->data0 = 2; +} + +static void sub_8127E30(struct Sprite *sprite) +{ + sub_806487C(sprite, FALSE); + if (sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_ASH); + } +} + +u32 FldEff_SurfBlob(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[7], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x96); + if (spriteId !=MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.paletteNum = 0; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = -1; + sprite->data6 = -1; + sprite->data7 = -1; + } + FieldEffectActiveListRemove(FLDEFF_SURF_BLOB); + return spriteId; +} + +void sub_8127ED0(u8 spriteId, u8 value) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF) | (value & 0xF); +} + +void sub_8127EFC(u8 spriteId, u8 value) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF0) | ((value & 0xF) << 4); +} + +void sub_8127F28(u8 spriteId, u8 value, s16 data1) +{ + gSprites[spriteId].data0 = (gSprites[spriteId].data0 & ~0xF00) | ((value & 0xF) << 8); + gSprites[spriteId].data1 = data1; +} + +static u8 sub_8127F5C(struct Sprite *sprite) +{ + return sprite->data0 & 0xF; +} + +static u8 sub_8127F64(struct Sprite *sprite) +{ + return (sprite->data0 & 0xF0) >> 4; +} + +static u8 sub_8127F70(struct Sprite *sprite) +{ + return (sprite->data0 & 0xF00) >> 8; +} + +void sub_8127F7C(struct Sprite *sprite) +{ + struct MapObject *mapObject; + struct Sprite *linkedSprite; + + mapObject = &gMapObjects[sprite->data2]; + linkedSprite = &gSprites[mapObject->spriteId]; + sub_8127FD4(mapObject, sprite); + sub_812800C(mapObject, sprite); + sub_81280A0(mapObject, linkedSprite, sprite); + sprite->oam.priority = linkedSprite->oam.priority; +} + +static void sub_8127FD4(struct MapObject *mapObject, struct Sprite *sprite) +{ + u8 unk_8041E54[ARRAY_COUNT(gUnknown_08401E54)]; + + memcpy(unk_8041E54, gUnknown_08401E54, sizeof gUnknown_08401E54); + if (sub_8127F64(sprite) == 0) + { + StartSpriteAnimIfDifferent(sprite, unk_8041E54[mapObject->placeholder18]); + } +} + +#ifdef NONMATCHING +static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + s16 x; + s16 y; + u8 i; + + x = mapObject->coords2.x; + y = mapObject->coords2.y; + if (sprite->pos2.y == 0 && (x != sprite->data6 || y != sprite->data7)) + { + sprite->data5 = sprite->pos2.y; + for (sprite->data6 = x, sprite->data7 = y, i = DIR_SOUTH; i <= DIR_EAST; i ++, x = sprite->data6, y = sprite->data7) + { + MoveCoords(i, &x, &y); + if (MapGridGetZCoordAt(x, y) == 3) + { + sprite->data5 ++; + break; + } + } + } +} +#else +__attribute__((naked)) static void sub_812800C(struct MapObject *mapObject, struct Sprite *sprite) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tsub sp, 0x4\n" + "\tadds r4, r1, 0\n" + "\tldrh r2, [r0, 0x10]\n" + "\tmov r1, sp\n" + "\tstrh r2, [r1]\n" + "\tldrh r1, [r0, 0x12]\n" + "\tmov r0, sp\n" + "\tadds r0, 0x2\n" + "\tstrh r1, [r0]\n" + "\tmovs r2, 0x26\n" + "\tldrsh r3, [r4, r2]\n" + "\tmov r8, r0\n" + "\tcmp r3, 0\n" + "\tbne _08128094\n" + "\tmov r0, sp\n" + "\tmovs r5, 0\n" + "\tldrsh r2, [r0, r5]\n" + "\tmovs r5, 0x3A\n" + "\tldrsh r0, [r4, r5]\n" + "\tcmp r2, r0\n" + "\tbne _08128048\n" + "\tlsls r0, r1, 16\n" + "\tasrs r0, 16\n" + "\tmovs r5, 0x3C\n" + "\tldrsh r1, [r4, r5]\n" + "\tcmp r0, r1\n" + "\tbeq _08128094\n" + "_08128048:\n" + "\tstrh r3, [r4, 0x38]\n" + "\tstrh r2, [r4, 0x3A]\n" + "\tmov r1, r8\n" + "\tmovs r2, 0\n" + "\tldrsh r0, [r1, r2]\n" + "\tstrh r0, [r4, 0x3C]\n" + "\tmovs r5, 0x1\n" + "\tmov r7, r8\n" + "\tmov r6, sp\n" + "_0812805A:\n" + "\tadds r0, r5, 0\n" + "\tmov r1, sp\n" + "\tadds r2, r7, 0\n" + "\tbl MoveCoords\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r6, r1]\n" + "\tmovs r2, 0\n" + "\tldrsh r1, [r7, r2]\n" + "\tbl MapGridGetZCoordAt\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tcmp r0, 0x3\n" + "\tbne _08128080\n" + "\tldrh r0, [r4, 0x38]\n" + "\tadds r0, 0x1\n" + "\tstrh r0, [r4, 0x38]\n" + "\tb _08128094\n" + "_08128080:\n" + "\tadds r0, r5, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tldrh r0, [r4, 0x3A]\n" + "\tstrh r0, [r6]\n" + "\tldrh r0, [r4, 0x3C]\n" + "\tmov r1, r8\n" + "\tstrh r0, [r1]\n" + "\tcmp r5, 0x4\n" + "\tbls _0812805A\n" + "_08128094:\n" + "\tadd sp, 0x4\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +static void sub_81280A0(struct MapObject *mapObject, struct Sprite *linkedSprite, struct Sprite *sprite) +{ + u16 unk_8401E5A[ARRAY_COUNT(gUnknown_08401E5A)]; + u8 v0; + + memcpy(unk_8401E5A, gUnknown_08401E5A, sizeof gUnknown_08401E5A); + v0 = sub_8127F5C(sprite); + if (v0 != 0) + { + if (((u16)(++ sprite->data4) & unk_8401E5A[sprite->data5]) == 0) + { + sprite->pos2.y += sprite->data3; + } + if ((sprite->data4 & 0x0F) == 0) + { + sprite->data3 = -sprite->data3; + } + if (v0 != 2) + { + if (sub_8127F70(sprite) == 0) + { + linkedSprite->pos2.y = sprite->pos2.y; + } + else + { + linkedSprite->pos2.y = sprite->data1 + sprite->pos2.y; + } + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = linkedSprite->pos1.y + 8; + } + } +} + +u8 sub_8128124(u8 oldSpriteId) +{ + u8 spriteId; + struct Sprite *sprite; + + spriteId = CreateSpriteAtEnd(&gDummySpriteTemplate, 0, 0, -1); + sprite = &gSprites[spriteId]; + sprite->callback = sub_8128174; + sprite->invisible = TRUE; + sprite->data0 = oldSpriteId; + sprite->data1 = 1; + return spriteId; +} + +static void sub_8128174(struct Sprite *sprite) +{ + struct Sprite *oldSprite; + + oldSprite = &gSprites[sprite->data0]; + if (((sprite->data2++) & 0x03) == 0) + { + oldSprite->pos2.y += sprite->data1; + } + if ((sprite->data2 & 0x0F) == 0) + { + sprite->data1 = -sprite->data1; + } +} + +u32 FldEff_Dust(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 12); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[9], gFieldEffectArguments[0], gFieldEffectArguments[1], 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->data0 = gFieldEffectArguments[2]; + sprite->data1 = 10; + } + return 0; +} + +u32 FldEff_SandPile(void) +{ + u8 mapObjectId; + struct MapObject *mapObject; + u8 spriteId; + struct Sprite *sprite; + const struct MapObjectGraphicsInfo *graphicsInfo; + + mapObjectId = GetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + mapObject = &gMapObjects[mapObjectId]; + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[29], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gSprites[mapObject->spriteId].oam.priority; + sprite->data0 = gFieldEffectArguments[0]; + sprite->data1 = gFieldEffectArguments[1]; + sprite->data2 = gFieldEffectArguments[2]; + sprite->data3 = gSprites[mapObject->spriteId].pos1.x; + sprite->data4 = gSprites[mapObject->spriteId].pos1.y; + sprite->pos2.y = (graphicsInfo->height >> 1) - 2; + SeekSpriteAnim(sprite, 2); + } + return 0; +} + +void sub_81282E0(struct Sprite *sprite) +{ + u8 mapObjectId; + s16 x; + s16 y; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data0, sprite->data1, sprite->data2, &mapObjectId) || !gMapObjects[mapObjectId].mapobj_bit_20) + { + FieldEffectStop(sprite, FLDEFF_SAND_PILE); + } + else + { + y = gSprites[gMapObjects[mapObjectId].spriteId].pos1.y; + x = gSprites[gMapObjects[mapObjectId].spriteId].pos1.x; + if (x != sprite->data3 || y != sprite->data4) + { + sprite->data3 = x; + sprite->data4 = y; + if (sprite->animEnded) + { + StartSpriteAnim(sprite, 0); + } + } + sprite->pos1.x = x; + sprite->pos1.y = y; + sprite->subpriority = gSprites[gMapObjects[mapObjectId].spriteId].subpriority; + sub_806487C(sprite, FALSE); + } +} + +u32 FldEff_Bubbles(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 0); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[34], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = 1; + } + return 0; +} + +void sub_8128410(struct Sprite *sprite) +{ + sprite->data0 += 0x80; + sprite->data0 &= 0x100; + sprite->pos1.y -= sprite->data0 >> 8; + sub_806487C(sprite, FALSE); + if (sprite->invisible || sprite->animEnded) + { + FieldEffectStop(sprite, FLDEFF_BUBBLES); + } +} + +u32 FldEff_BerryTreeGrowthSparkle(void) +{ + u8 spriteId; + struct Sprite *sprite; + + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 4); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[22], gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2]); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled = TRUE; + sprite->oam.priority = gFieldEffectArguments[3]; + sprite->oam.paletteNum = 5; + sprite->data0 = FLDEFF_BERRY_TREE_GROWTH_SPARKLE; + } + return 0; +} + +u32 FldEff_TreeDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_TREE_DISGUISE, 0x18, 0x04); +} + + +u32 FldEff_MountainDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_MOUNTAIN_DISGUISE, 0x19, 0x03); +} + + +u32 FldEff_SandDisguise(void) +{ + return ShowDisguiseFieldEffect(FLDEFF_SAND_DISGUISE, 0x1C, 0x02); +} + +static u32 ShowDisguiseFieldEffect(u8 fldEff, u8 templateIdx, u8 paletteNum) +{ + u8 spriteId; + struct Sprite *sprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(gFieldEffectArguments[0], gFieldEffectArguments[1], gFieldEffectArguments[2], &spriteId)) + { + FieldEffectActiveListRemove(fldEff); + return MAX_SPRITES; + } + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[templateIdx], 0, 0, 0); + if (spriteId != MAX_SPRITES) + { + sprite = &gSprites[spriteId]; + sprite->coordOffsetEnabled ++; + sprite->oam.paletteNum = paletteNum; + sprite->data1 = fldEff; + sprite->data2 = gFieldEffectArguments[0]; + sprite->data3 = gFieldEffectArguments[1]; + sprite->data4 = gFieldEffectArguments[2]; + } + return spriteId; +} + +void sub_81285AC(struct Sprite *sprite) +{ + u8 mapObjectId; + const struct MapObjectGraphicsInfo *graphicsInfo; + struct Sprite *linkedSprite; + + if (TryGetFieldObjectIdByLocalIdAndMap(sprite->data2, sprite->data3, sprite->data4, &mapObjectId)) + { + FieldEffectStop(sprite, sprite->data1); + } + // else { + graphicsInfo = GetFieldObjectGraphicsInfo(gMapObjects[mapObjectId].graphicsId); + linkedSprite = &gSprites[gMapObjects[mapObjectId].spriteId]; + sprite->invisible = linkedSprite->invisible; + sprite->pos1.x = linkedSprite->pos1.x; + sprite->pos1.y = (graphicsInfo->height >> 1) + linkedSprite->pos1.y - 16; + sprite->subpriority = linkedSprite->subpriority - 1; + if (sprite->data0 == 1) + { + sprite->data0 ++; + StartSpriteAnim(sprite, 1); + } + if (sprite->data0 == 2 && sprite->animEnded) + { + sprite->data7 = 1; + } + if (sprite->data0 == 3) + { + FieldEffectStop(sprite, sprite->data1); + } + // } +} + +void sub_812869C(struct MapObject *mapObject) +{ + if (mapObject->mapobj_unk_21 == 1) + { + gSprites[mapObject->mapobj_unk_1A].data0 ++; + } +} + +bool8 sub_81286C4(struct MapObject *mapObject) +{ + struct Sprite *sprite; + + if (mapObject->mapobj_unk_21 == 2) + { + return TRUE; + } + if (mapObject->mapobj_unk_21 == 0) + { + return TRUE; + } + sprite = &gSprites[mapObject->mapobj_unk_1A]; + if (sprite->data7) + { + mapObject->mapobj_unk_21 = 2; + sprite->data0 ++; + return TRUE; + } + return FALSE; +} + +u32 FldEff_Sparkle(void) +{ + u8 spriteId; + + gFieldEffectArguments[0] += 7; + gFieldEffectArguments[1] += 7; + sub_8060470((s16 *)&gFieldEffectArguments[0], (s16 *)&gFieldEffectArguments[1], 8, 8); + spriteId = CreateSpriteAtEnd(gFieldEffectObjectTemplatePointers[35], gFieldEffectArguments[0], gFieldEffectArguments[1], 0x52); + if (spriteId != MAX_SPRITES) + { + gSprites[spriteId].oam.priority = gFieldEffectArguments[2]; + gSprites[spriteId].coordOffsetEnabled = TRUE; + } + return 0; +} + +void sub_8128774(struct Sprite *sprite) +{ + if (sprite->data0 == 0) + { + if (sprite->animEnded) + { + sprite->invisible = TRUE; + sprite->data0 ++; + } + if (sprite->data0 == 0) + { + return; + } + } + if (++ sprite->data1 >= 35) + { + FieldEffectStop(sprite, FLDEFF_SPARKLE); + } +} + +void sub_81287C4(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data1); + } + else + { + sub_806487C(sprite, FALSE); + SetObjectSubpriorityByZCoord(sprite->data0, sprite, 0); + } +} + +void sub_8128800(struct Sprite *sprite) +{ + if (sprite->animEnded) + { + FieldEffectStop(sprite, sprite->data0); + } + else + { + sub_806487C(sprite, FALSE); + } +} + +#ifdef NONMATCHING +static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + u8 i; + s16 xlo; + s16 xhi; + s16 lx; + s16 lyhi; + s16 ly; + s16 ylo; + s16 yhi; + struct MapObject *mapObject; // r4 + const struct MapObjectGraphicsInfo *graphicsInfo; // destroyed + struct Sprite *linkedSprite; // r5 + + SetObjectSubpriorityByZCoord(z, sprite, offset); + for (i = 0; i < 16; i ++) + { + mapObject = &gMapObjects[i]; + if (mapObject->active) + { + graphicsInfo = GetFieldObjectGraphicsInfo(mapObject->graphicsId); + linkedSprite = &gSprites[mapObject->spriteId]; + xhi = sprite->pos1.x + sprite->centerToCornerVecX; + xlo = sprite->pos1.x - sprite->centerToCornerVecX; + lx = linkedSprite->pos1.x; + if (xhi < lx && xlo > lx) + { + lyhi = linkedSprite->pos1.y + linkedSprite->centerToCornerVecY; + ly = linkedSprite->pos1.y; + ylo = sprite->pos1.y - sprite->centerToCornerVecY; + yhi = ylo + linkedSprite->centerToCornerVecY; + if ((lyhi < yhi || lyhi < ylo) && ly > yhi) + { + if (sprite->subpriority <= linkedSprite->subpriority) + { + sprite->subpriority = linkedSprite->subpriority + 2; + break; + } + } + } + } + } +} +#else +__attribute__((naked)) static void sub_812882C(struct Sprite *sprite /*r6*/, u8 z, u8 offset) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tadds r6, r0, 0\n" + "\tadds r0, r1, 0\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tlsls r2, 24\n" + "\tlsrs r2, 24\n" + "\tadds r1, r6, 0\n" + "\tbl SetObjectSubpriorityByZCoord\n" + "\tmovs r7, 0\n" + "_08128842:\n" + "\tlsls r0, r7, 3\n" + "\tadds r0, r7\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288DC @ =gMapObjects\n" + "\tadds r4, r0, r1\n" + "\tldrb r0, [r4]\n" + "\tlsls r0, 31\n" + "\tcmp r0, 0\n" + "\tbeq _081288E4\n" + "\tldrb r0, [r4, 0x5]\n" + "\tbl GetFieldObjectGraphicsInfo\n" + "\tldrb r1, [r4, 0x4]\n" + "\tlsls r0, r1, 4\n" + "\tadds r0, r1\n" + "\tlsls r0, 2\n" + "\tldr r1, _081288E0 @ =gSprites\n" + "\tadds r5, r0, r1\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x28\n" + "\tmovs r2, 0\n" + "\tldrsb r2, [r0, r2]\n" + "\tldrh r0, [r6, 0x20]\n" + "\tadds r1, r0, r2\n" + "\tsubs r0, r2\n" + "\tlsls r0, 16\n" + "\tlsrs r4, r0, 16\n" + "\tlsls r1, 16\n" + "\tasrs r1, 16\n" + "\tmovs r0, 0x20\n" + "\tldrsh r2, [r5, r0]\n" + "\tcmp r1, r2\n" + "\tbge _081288E4\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r2\n" + "\tble _081288E4\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r3, 0\n" + "\tldrsb r3, [r0, r3]\n" + "\tldrh r2, [r5, 0x22]\n" + "\tadds r2, r3\n" + "\tldrh r4, [r5, 0x22]\n" + "\tadds r0, r6, 0\n" + "\tadds r0, 0x29\n" + "\tmovs r1, 0\n" + "\tldrsb r1, [r0, r1]\n" + "\tldrh r0, [r6, 0x22]\n" + "\tsubs r0, r1\n" + "\tlsls r0, 16\n" + "\tasrs r0, 16\n" + "\tadds r3, r0, r3\n" + "\tlsls r2, 16\n" + "\tasrs r2, 16\n" + "\tlsls r3, 16\n" + "\tasrs r3, 16\n" + "\tcmp r2, r3\n" + "\tblt _081288BC\n" + "\tcmp r2, r0\n" + "\tbge _081288E4\n" + "_081288BC:\n" + "\tlsls r0, r4, 16\n" + "\tasrs r0, 16\n" + "\tcmp r0, r3\n" + "\tble _081288E4\n" + "\tadds r2, r6, 0\n" + "\tadds r2, 0x43\n" + "\tadds r0, r5, 0\n" + "\tadds r0, 0x43\n" + "\tldrb r1, [r0]\n" + "\tldrb r0, [r2]\n" + "\tcmp r0, r1\n" + "\tbhi _081288E4\n" + "\tadds r0, r1, 0x2\n" + "\tstrb r0, [r2]\n" + "\tb _081288EE\n" + "\t.align 2, 0\n" + "_081288DC: .4byte gMapObjects\n" + "_081288E0: .4byte gSprites\n" + "_081288E4:\n" + "\tadds r0, r7, 0x1\n" + "\tlsls r0, 24\n" + "\tlsrs r7, r0, 24\n" + "\tcmp r7, 0xF\n" + "\tbls _08128842\n" + "_081288EE:\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif diff --git a/src/field/field_ground_effect.c b/src/field/field_ground_effect.c index 2a398ba22..5af8ea3e3 100644 --- a/src/field/field_ground_effect.c +++ b/src/field/field_ground_effect.c @@ -472,7 +472,7 @@ void GroundEffect_SpawnOnTallGrass(struct MapObject *mapObj, struct Sprite *spri | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 1; - FieldEffectStart(4); + FieldEffectStart(FLDEFF_TALL_GRASS); } void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) @@ -491,7 +491,7 @@ void sub_8063E94(struct MapObject *mapObj, struct Sprite *sprite) | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 0; - FieldEffectStart(4); + FieldEffectStart(FLDEFF_TALL_GRASS); } void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) @@ -510,7 +510,7 @@ void sub_8063EE0(struct MapObject *mapObj, struct Sprite *sprite) | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 1; - FieldEffectStart(17); + FieldEffectStart(FLDEFF_LONG_GRASS); } void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) @@ -529,7 +529,7 @@ void sub_8063F2C(struct MapObject *mapObj, struct Sprite *sprite) | (u8)gSaveBlock1.location.mapGroup; gFieldEffectArguments[7] = 0; - FieldEffectStart(17); + FieldEffectStart(FLDEFF_LONG_GRASS); } void GroundEffect_WaterReflection(struct MapObject *mapObj, struct Sprite *sprite) @@ -570,7 +570,10 @@ static void nullsub(struct MapObject *mapObj, struct Sprite *sprite, u8 a) static void DoTracksGroundEffect_Footprints(struct MapObject *mapObj, struct Sprite *sprite, u8 a) { // First half-word is a Field Effect script id. (gFieldEffectScriptPointers) - u16 sandFootprints_FieldEffectData[2] = { 0xD, 0x18 }; + u16 sandFootprints_FieldEffectData[2] = { + FLDEFF_SAND_FOOTPRINTS, + FLDEFF_DEEP_SAND_FOOTPRINTS + }; gFieldEffectArguments[0] = mapObj->coords3.x; gFieldEffectArguments[1] = mapObj->coords3.y; diff --git a/src/field/field_map_obj.c b/src/field/field_map_obj.c index 0e7cd7896..59319a16e 100644 --- a/src/field/field_map_obj.c +++ b/src/field/field_map_obj.c @@ -1901,7 +1901,7 @@ extern void CameraObjectReset1(void); extern struct LinkPlayerMapObject gLinkPlayerMapObjects[]; extern u8 gReservedSpritePaletteCount; -extern struct Camera gUnknown_0202E844; +extern struct Camera gCamera; static u8 gUnknown_030005A4; static u16 gUnknown_030005A6; @@ -2986,24 +2986,21 @@ void UpdateFieldObjectCoordsForCameraUpdate(void) s16 deltaX; s16 deltaY; -#ifndef NONMATCHING - asm(""::"r"(i)); //makes the compiler store i in r3 -#endif - - if (gUnknown_0202E844.field_0) + if (gCamera.field_0) { - for (i = 0, deltaX = gUnknown_0202E844.x, deltaY = gUnknown_0202E844.y; i < 16; i++) + deltaX = gCamera.x; + deltaY = gCamera.y; + for (i = 0; i < 16; i++) { - struct MapObject *mapObject = &gMapObjects[i]; - if (mapObject->active) + if (gMapObjects[i].active) { - mapObject->coords1.x -= deltaX; - mapObject->coords1.y -= deltaY; - mapObject->coords2.x -= deltaX; - mapObject->coords2.y -= deltaY; - mapObject->coords3.x -= deltaX; - mapObject->coords3.y -= deltaY; + gMapObjects[i].coords1.x -= deltaX; + gMapObjects[i].coords1.y -= deltaY; + gMapObjects[i].coords2.x -= deltaX; + gMapObjects[i].coords2.y -= deltaY; + gMapObjects[i].coords3.x -= deltaX; + gMapObjects[i].coords3.y -= deltaY; } } } @@ -5030,32 +5027,30 @@ u8 sub_805F3C4(struct MapObject *mapObject, struct Sprite *sprite) return 0; } -#ifdef NONMATCHING - -u8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F3EC(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { return 0; } -u8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F3F0(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); - FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2))); mapObject->mapobj_bit_1 = 1; sprite->data1 = 2; return 1; } -u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3(u8)) +bool8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, bool8 a3(u8)) { + u32 direction; s16 x; s16 y; - int direction; - direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, a2); + + direction = a2; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); FieldObjectMoveDestCoords(mapObject, direction, &x, &y); FieldObjectSetRegularAnim(mapObject, sprite, GetGoSpeed0AnimId(direction)); - if (!npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) + if (npc_block_way(mapObject, x, y, direction) || (a3 != NULL && !a3(MapGridGetMetatileBehaviorAt(x, y)))) { FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); } @@ -5063,9 +5058,115 @@ u8 sub_805F438(struct MapObject *mapObject, struct Sprite *sprite, u8 a2, u8 *a3 sprite->data1 = 2; return 1; } -#endif -asm(".section .text_fmocb2_c\n"); +bool8 sub_805F4F0(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_8060744(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F5A8(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806079C(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F660(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80607C8(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 cph_IM_DIFFERENT(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectSetRegularAnim(mapObject, sprite, sub_806084C(direction)); + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 sub_805F760(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + FieldObjectMoveDestCoords(mapObject, direction, &x, &y); + FieldObjectSetRegularAnim(mapObject, sprite, sub_80608A4(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} + +bool8 oac_hopping(struct MapObject *mapObject, struct Sprite *sprite, u8 playerDirection, bool8 tileCB(u8)) +{ + u32 direction; + s16 x; + s16 y; + + direction = playerDirection; + direction = state_to_direction(gUnknown_0836DC09[mapObject->animPattern], mapObject->mapobj_unk_21, direction); + x = mapObject->coords2.x; + y = mapObject->coords2.y; + sub_8060320(direction, &x, &y, 2, 2); + FieldObjectSetRegularAnim(mapObject, sprite, GetJumpLedgeAnimId(direction)); + if (npc_block_way(mapObject, x, y, direction) || (tileCB != NULL && !tileCB(MapGridGetMetatileBehaviorAt(x, y)))) + { + FieldObjectSetRegularAnim(mapObject, sprite, GetFaceDirectionAnimId(direction)); + } + mapObject->mapobj_bit_1 = TRUE; + sprite->data1 = 2; + return TRUE; +} fieldmap_object_cb(sub_805F8E0, sub_805F904, gUnknown_083755C0); @@ -5367,8 +5468,10 @@ bool8 IsCoordOutsideFieldObjectMovementRect(struct MapObject2 *mapObject, s16 x, static bool8 DoesObjectCollideWithObjectAt(struct MapObject *mapObject, s16 x, s16 y); bool8 IsMetatileDirectionallyImpassable(struct MapObject *mapObject, s16 x, s16 y, u8 direction); -u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u8 direction) +u8 npc_block_way(struct MapObject *mapObject, s16 x, s16 y, u32 dirn) { + u8 direction; + direction = dirn; if (IsCoordOutsideFieldObjectMovementRect((struct MapObject2 *)mapObject, x, y)) return 1; else if (MapGridIsImpassableAt(x, y) || GetMapBorderIdAt(x, y) == -1 || IsMetatileDirectionallyImpassable(mapObject, x, y, direction)) @@ -5480,23 +5583,26 @@ void unref_sub_80602F8(u8 direction, s16 *x, s16 *y) *y += gDirectionToVector[direction].y << 4; } -void sub_8060320(u8 direction, s16 *x, s16 *y, s16 deltaX, s16 deltaY) +void sub_8060320(u32 dirn, s16 *x, s16 *y, s16 deltaX, s16 deltaY) { + u8 direction = dirn; + s16 dx2 = deltaX; + s16 dy2 = deltaY; if (gDirectionToVector[direction].x > 0) { - *x += deltaX; + *x += dx2; } if (gDirectionToVector[direction].x < 0) { - *x -= deltaX; + *x -= dx2; } if (gDirectionToVector[direction].y > 0) { - *y += deltaY; + *y += dy2; } if (gDirectionToVector[direction].y < 0) { - *y -= deltaY; + *y -= dy2; } } @@ -5563,11 +5669,12 @@ void GetFieldObjectMovingCameraOffset(s16 *x, s16 *y) } } -void FieldObjectMoveDestCoords(struct MapObject *mapObject, u8 direction, s16 *x, s16 *y) +void FieldObjectMoveDestCoords(struct MapObject *mapObject, u32 direction, s16 *x, s16 *y) { + u8 newDirn = direction; *x = mapObject->coords2.x; *y = mapObject->coords2.y; - MoveCoords(direction, x, y); + MoveCoords(newDirn, x, y); } bool8 FieldObjectIsSpecialAnimOrDirectionSequenceAnimActive(struct MapObject *mapObject) @@ -5681,193 +5788,34 @@ void meta_step(struct MapObject *mapObject, struct Sprite *sprite, u8 (*callback FieldObjectUpdateSubpriority(mapObject, sprite); } - -u8 GetFaceDirectionAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756C8, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetSimpleGoAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756CD, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetGoSpeed0AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D2, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060744(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756D7, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 d2s_08064034(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756DC, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806079C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E1, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607C8(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756E6, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80607F4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756EB, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetJumpLedgeAnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F0, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_806084C(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756F5, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_8060878(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FA, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608A4(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_083756FF, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 sub_80608D0(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375704, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay32AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375709, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay16AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_0837570E, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay8AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375713, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} - -u8 GetStepInPlaceDelay4AnimId(u8 index) -{ - u8 directions[5]; - memcpy(directions, gUnknown_08375718, 5); - if (index >= 5) - { - index = 0; - } - return directions[index]; -} +#define dirn_to_anim(name, table)\ +u8 name(u32 idx)\ +{\ + u8 direction;\ + u8 animIds[sizeof(table)];\ + direction = idx;\ + memcpy(animIds, (table), sizeof(table));\ + if (direction > DIR_EAST) direction = 0;\ + return animIds[direction];\ +} + +dirn_to_anim(GetFaceDirectionAnimId, gUnknown_083756C8) +dirn_to_anim(GetSimpleGoAnimId, gUnknown_083756CD) +dirn_to_anim(GetGoSpeed0AnimId, gUnknown_083756D2) +dirn_to_anim(sub_8060744, gUnknown_083756D7) +dirn_to_anim(d2s_08064034, gUnknown_083756DC) +dirn_to_anim(sub_806079C, gUnknown_083756E1) +dirn_to_anim(sub_80607C8, gUnknown_083756E6) +dirn_to_anim(sub_80607F4, gUnknown_083756EB) +dirn_to_anim(GetJumpLedgeAnimId, gUnknown_083756F0) +dirn_to_anim(sub_806084C, gUnknown_083756F5) +dirn_to_anim(sub_8060878, gUnknown_083756FA) +dirn_to_anim(sub_80608A4, gUnknown_083756FF) +dirn_to_anim(sub_80608D0, gUnknown_08375704) +dirn_to_anim(GetStepInPlaceDelay32AnimId, gUnknown_08375709) +dirn_to_anim(GetStepInPlaceDelay16AnimId, gUnknown_0837570E) +dirn_to_anim(GetStepInPlaceDelay8AnimId, gUnknown_08375713) +dirn_to_anim(GetStepInPlaceDelay4AnimId, gUnknown_08375718) u8 FieldObjectFaceOppositeDirection(struct MapObject *mapObject, u8 direction) { @@ -5995,65 +5943,23 @@ u8 GetOppositeDirection(u8 direction) return directions[direction - 1]; } -int zffu_offset_calc(u8 a0, u8 a1) +u32 zffu_offset_calc(u8 a0, u8 a1) { return gUnknown_08375757[a0 - 1][a1 - 1]; } -#ifdef NONMATCHING -int state_to_direction(u8 a0, u8 a1, u8 a2) +u32 state_to_direction(u8 a0, u32 a1, u32 a2) { - int zffuOffset; - asm_comment("For some reason, r2 is being backed up to r3 and restored ahead of the zffu call."); - if (a1 == 0 || a2 == 0 || a1 > 4 || a2 > 4) + u32 zffuOffset; + u8 a1_2 = a1; + u8 a2_2 = a2; + if (a1_2 == 0 || a2_2 == 0 || a1_2 > DIR_EAST || a2_2 > DIR_EAST) { return 0; } - zffuOffset = zffu_offset_calc(a1, a2); + zffuOffset = zffu_offset_calc(a1_2, a2); return gUnknown_08375767[a0 - 1][zffuOffset - 1]; } -#else -__attribute__((naked)) -int state_to_direction(u8 a0, u8 a1, u8 a2) -{ - asm(".syntax unified\n\ - push {r4,lr}\n\ - lsls r0, 24\n\ - lsrs r4, r0, 24\n\ - lsls r1, 24\n\ - lsrs r1, 24\n\ - adds r0, r1, 0\n\ - lsls r2, 24\n\ - lsrs r2, 24\n\ - cmp r1, 0\n\ - beq _08060BFC\n\ - cmp r2, 0\n\ - beq _08060BFC\n\ - cmp r1, 0x4\n\ - bhi _08060BFC\n\ - cmp r2, 0x4\n\ - bls _08060C00\n\ -_08060BFC:\n\ - movs r0, 0\n\ - b _08060C12\n\ -_08060C00:\n\ - adds r1, r2, 0\n\ - bl zffu_offset_calc\n\ - ldr r2, _08060C18 @ =gUnknown_08375767\n\ - lsls r1, r4, 2\n\ - subs r1, 0x5\n\ - adds r0, r1\n\ - adds r0, r2\n\ - ldrb r0, [r0]\n\ -_08060C12:\n\ - pop {r4}\n\ - pop {r1}\n\ - bx r1\n\ - .align 2, 0\n\ -_08060C18: .4byte gUnknown_08375767\n\ -.syntax divided\n"); -} -#endif void FieldObjectExecSpecialAnim(struct MapObject *mapObject, struct Sprite *sprite) { diff --git a/src/field/field_map_obj_helpers.c b/src/field/field_map_obj_helpers.c index 93cd57557..b453d3794 100644 --- a/src/field/field_map_obj_helpers.c +++ b/src/field/field_map_obj_helpers.c @@ -303,7 +303,7 @@ void DoShadowFieldEffect(struct MapObject *mapObject) if (!mapObject->mapobj_bit_22) { mapObject->mapobj_bit_22 = 1; - oe_exec_and_other_stuff(3, mapObject); + oe_exec_and_other_stuff(FLDEFF_SHADOW, mapObject); } } diff --git a/src/field/field_player_avatar.c b/src/field/field_player_avatar.c index c8099a73d..e7947b704 100644 --- a/src/field/field_player_avatar.c +++ b/src/field/field_player_avatar.c @@ -1224,8 +1224,8 @@ u8 sub_8059EA4(struct Task *task, struct MapObject *b, struct MapObject *c) { FieldObjectClearAnimIfSpecialAnimFinished(b); FieldObjectClearAnimIfSpecialAnimFinished(c); - FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId(task->data[2])); - FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId(task->data[2])); + FieldObjectSetSpecialAnim(b, GetStepInPlaceDelay16AnimId((u8)task->data[2])); + FieldObjectSetSpecialAnim(c, GetSimpleGoAnimId((u8)task->data[2])); gFieldEffectArguments[0] = c->coords2.x; gFieldEffectArguments[1] = c->coords2.y; gFieldEffectArguments[2] = c->elevation; @@ -1385,7 +1385,7 @@ static void taskFF_0805D1D4(u8 taskId) return; } sub_8127ED0(playerMapObj->mapobj_unk_1A, 2); - FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0(gTasks[taskId].data[0])); + FieldObjectSetSpecialAnim(playerMapObj, sub_80608D0((u8)gTasks[taskId].data[0])); gTasks[taskId].func = sub_805A2D0; } diff --git a/src/field/field_tasks.c b/src/field/field_tasks.c index 2be54f923..da6f162c2 100644 --- a/src/field/field_tasks.c +++ b/src/field/field_tasks.c @@ -1,5 +1,5 @@ // -// Created by scott on 6/22/2017. + // #include "global.h" @@ -845,11 +845,11 @@ void Task_MuddySlope(u8 taskId) } break; } - if (gUnknown_0202E844.field_0 && mapIndices != data[0]) + if (gCamera.field_0 && mapIndices != data[0]) { data[0] = mapIndices; - x2 = gUnknown_0202E844.x; - y2 = gUnknown_0202E844.y; + x2 = gCamera.x; + y2 = gCamera.y; } else { diff --git a/src/field/field_weather.c b/src/field/field_weather.c index 5ff2eddf9..443a38357 100644 --- a/src/field/field_weather.c +++ b/src/field/field_weather.c @@ -55,7 +55,7 @@ extern struct Weather gWeather; extern u8 *gUnknown_083970E8; extern u8 (*gUnknown_08396FC8[][4])(void); extern u8 (*gUnknown_083970B8[])(void); -extern u8 *gUnknown_030006DC; +IWRAM_DATA u8 *gUnknown_030006DC; extern u8 gUnknown_083970C8; extern u8 (*gUnknown_0202FC48)[32]; extern u8 gUnknown_0202F9E8[32]; diff --git a/src/field/fieldmap.c b/src/field/fieldmap.c index 3ad190a4b..7a31ae720 100644 --- a/src/field/fieldmap.c +++ b/src/field/fieldmap.c @@ -22,7 +22,7 @@ struct Coords32 EWRAM_DATA static u16 gUnknown_02029828[0x2800] = {0}; EWRAM_DATA struct MapHeader gMapHeader = {0}; -EWRAM_DATA struct Camera gUnknown_0202E844 = {0}; +EWRAM_DATA struct Camera gCamera = {0}; EWRAM_DATA static struct ConnectionFlags gUnknown_0202E850 = {0}; struct BackupMapData gUnknown_03004870; @@ -713,7 +713,7 @@ bool8 CameraMove(int x, int y) unsigned int direction; struct MapConnection *connection; int old_x, old_y; - gUnknown_0202E844.field_0 = FALSE; + gCamera.field_0 = FALSE; direction = GetPostCameraMoveMapBorderId(x, y); if (direction + 1 <= 1) { @@ -728,14 +728,14 @@ bool8 CameraMove(int x, int y) connection = sub_8056A64(direction, gSaveBlock1.pos.x, gSaveBlock1.pos.y); sub_8056918(connection, direction, x, y); sub_80538F0(connection->mapGroup, connection->mapNum); - gUnknown_0202E844.field_0 = TRUE; - gUnknown_0202E844.x = old_x - gSaveBlock1.pos.x; - gUnknown_0202E844.y = old_y - gSaveBlock1.pos.y; + gCamera.field_0 = TRUE; + gCamera.x = old_x - gSaveBlock1.pos.x; + gCamera.y = old_y - gSaveBlock1.pos.y; gSaveBlock1.pos.x += x; gSaveBlock1.pos.y += y; sub_80566F0(direction); } - return gUnknown_0202E844.field_0; + return gCamera.field_0; } struct MapConnection *sub_8056A64(u8 direction, int x, int y) diff --git a/src/field/pokeblock.c b/src/field/pokeblock.c index d69c41639..593d7344b 100644 --- a/src/field/pokeblock.c +++ b/src/field/pokeblock.c @@ -1,5 +1,5 @@ // -// Created by scott on 6/27/2017. + // #include "global.h" diff --git a/src/field/pokenav.c b/src/field/pokenav.c index 84ed7b14b..21d7bb4e3 100644 --- a/src/field/pokenav.c +++ b/src/field/pokenav.c @@ -38,3 +38,5 @@ void sub_80F700C(u8 *arg0, u16 arg1) { ptr[2] = 0x80; ptr[3] = 0xFF; } + +IWRAM_DATA MainCallback gUnknown_03000744; diff --git a/src/field/use_pokeblock.c b/src/field/use_pokeblock.c index be3003680..e946a9cfc 100644 --- a/src/field/use_pokeblock.c +++ b/src/field/use_pokeblock.c @@ -1,5 +1,5 @@ // -// Created by Scott Norton on 5/31/17. + // Modified by Dizzy Egg on 8/15/17. // diff --git a/src/pokemon/pokemon_1.c b/src/pokemon/pokemon_1.c index fd7916ee6..1d597cb17 100644 --- a/src/pokemon/pokemon_1.c +++ b/src/pokemon/pokemon_1.c @@ -468,10 +468,10 @@ void CalculateMonStats(struct Pokemon *mon) SetMonData(mon, MON_DATA_HP, (u8 *)¤tHP); } -void sub_803B4B4(struct Pokemon *src, struct Pokemon *dest) +void sub_803B4B4(const struct BoxPokemon *src, struct Pokemon *dest) { u32 value = 0; - memcpy(&dest->box, &src->box, sizeof(struct BoxPokemon)); + dest->box = *src; SetMonData(dest, MON_DATA_STATUS, (u8 *)&value); SetMonData(dest, MON_DATA_HP, (u8 *)&value); SetMonData(dest, MON_DATA_MAX_HP, (u8 *)&value); |