mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
Review corrections
-Simplified the affection mechanics' battle scripts. -Corrected the value seting inside CalcCritChanceStage. -Simplified the checks inside Cmd_adjustdamage -Simplified the contents of GetLeadMonFriendshipScore now that a more general function to do the same thing was added. -Added constants for the values returned by GetMonFriendshipScore.
This commit is contained in:
parent
032b7b2ab9
commit
e792fae415
@ -421,47 +421,29 @@ BattleScript_AffectionBasedEndurance::
|
||||
return
|
||||
|
||||
BattleScript_AffectionBasedStatusHeal::
|
||||
jumpifstatus BS_ATTACKER, STATUS1_POISON, BattleScript_AffectionBasedStatusHeal_Poison
|
||||
jumpifstatus BS_ATTACKER, STATUS1_TOXIC_POISON, BattleScript_AffectionBasedStatusHeal_Poison
|
||||
jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_AffectionBasedStatusHeal_Sleep
|
||||
jumpifstatus BS_ATTACKER, STATUS1_PARALYSIS, BattleScript_AffectionBasedStatusHeal_Paralysis
|
||||
jumpifstatus BS_ATTACKER, STATUS1_BURN, BattleScript_AffectionBasedStatusHeal_Burn
|
||||
jumpifstatus BS_ATTACKER, STATUS1_FREEZE, BattleScript_AffectionBasedStatusHeal_Freeze
|
||||
jumpifstatus BS_ATTACKER, STATUS1_POISON, BattleScript_AffectionBasedStatus_HealPoisonString
|
||||
jumpifstatus BS_ATTACKER, STATUS1_TOXIC_POISON, BattleScript_AffectionBasedStatus_HealPoisonString
|
||||
jumpifstatus BS_ATTACKER, STATUS1_SLEEP, BattleScript_AffectionBasedStatus_HealSleepString
|
||||
jumpifstatus BS_ATTACKER, STATUS1_PARALYSIS, BattleScript_AffectionBasedStatus_HealParalysisString
|
||||
jumpifstatus BS_ATTACKER, STATUS1_BURN, BattleScript_AffectionBasedStatus_HealBurnString
|
||||
jumpifstatus BS_ATTACKER, STATUS1_FREEZE, BattleScript_AffectionBasedStatus_HealFreezeString
|
||||
end2
|
||||
BattleScript_AffectionBasedStatusHeal_Poison:
|
||||
BattleScript_AffectionBasedStatus_HealPoisonString:
|
||||
printstring STRINGID_ATTACKEREXPELLEDTHEPOISON
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
clearstatus BS_ATTACKER
|
||||
waitstate
|
||||
updatestatusicon BS_ATTACKER
|
||||
waitstate
|
||||
end2
|
||||
BattleScript_AffectionBasedStatusHeal_Sleep:
|
||||
goto BattleScript_AffectionBasedStatusHeal_Continue
|
||||
BattleScript_AffectionBasedStatus_HealSleepString:
|
||||
printstring STRINGID_ATTACKERSHOOKITSELFAWAKE
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
clearstatus BS_ATTACKER
|
||||
waitstate
|
||||
updatestatusicon BS_ATTACKER
|
||||
waitstate
|
||||
end2
|
||||
BattleScript_AffectionBasedStatusHeal_Paralysis:
|
||||
goto BattleScript_AffectionBasedStatusHeal_Continue
|
||||
BattleScript_AffectionBasedStatus_HealParalysisString:
|
||||
printstring STRINGID_ATTACKERBROKETHROUGHPARALYSIS
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
clearstatus BS_ATTACKER
|
||||
waitstate
|
||||
updatestatusicon BS_ATTACKER
|
||||
waitstate
|
||||
end2
|
||||
BattleScript_AffectionBasedStatusHeal_Burn:
|
||||
goto BattleScript_AffectionBasedStatusHeal_Continue
|
||||
BattleScript_AffectionBasedStatus_HealBurnString:
|
||||
printstring STRINGID_ATTACKERHEALEDITSBURN
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
clearstatus BS_ATTACKER
|
||||
waitstate
|
||||
updatestatusicon BS_ATTACKER
|
||||
waitstate
|
||||
end2
|
||||
BattleScript_AffectionBasedStatusHeal_Freeze:
|
||||
goto BattleScript_AffectionBasedStatusHeal_Continue
|
||||
BattleScript_AffectionBasedStatus_HealFreezeString:
|
||||
printstring STRINGID_ATTACKERMELTEDTHEICE
|
||||
goto BattleScript_AffectionBasedStatusHeal_Continue
|
||||
BattleScript_AffectionBasedStatusHeal_Continue:
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
clearstatus BS_ATTACKER
|
||||
waitstate
|
||||
|
@ -273,6 +273,15 @@
|
||||
#define FRIENDSHIP_EVENT_FAINT_FIELD_PSN 7
|
||||
#define FRIENDSHIP_EVENT_FAINT_LARGE 8 // If opponent was >= 30 levels higher. See AdjustFriendshipOnBattleFaint
|
||||
|
||||
// Constants for GetLeadMonFriendshipScore
|
||||
#define FRIENDSHIP_NONE 0
|
||||
#define FRIENDSHIP_GE_1 1
|
||||
#define FRIENDSHIP_GE_50 2
|
||||
#define FRIENDSHIP_GE_100 3
|
||||
#define FRIENDSHIP_GE_150 4
|
||||
#define FRIENDSHIP_GE_200 5
|
||||
#define FRIENDSHIP_MAX 6
|
||||
|
||||
#define MAX_FRIENDSHIP 255
|
||||
#define MAX_SHEEN 255
|
||||
#define MAX_CONDITION 255
|
||||
|
@ -59,6 +59,7 @@
|
||||
#include "constants/songs.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "battle_util.h"
|
||||
#include "constants/pokemon.h"
|
||||
|
||||
extern struct Evolution gEvolutionTable[][EVOS_PER_MON];
|
||||
|
||||
@ -1732,7 +1733,7 @@ u32 GetTotalAccuracy(u32 battlerAtk, u32 battlerDef, u32 move, u32 atkAbility, u
|
||||
#if B_AFFECTION_MECHANICS == TRUE
|
||||
// With high affection/friendship there's a chance to evade a move by substracting 10% of its accuracy.
|
||||
// I can't find exact information about that chance, so I'm just gonna write it as a 20% chance for now.
|
||||
if (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[battlerDef]]) >= 4 && (Random() % 100) <= 20)
|
||||
if (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[battlerDef]]) >= FRIENDSHIP_GE_150 && (Random() % 100) <= 20)
|
||||
calc = (calc * 90) / 100;
|
||||
#endif
|
||||
|
||||
@ -1904,11 +1905,9 @@ s32 CalcCritChanceStage(u8 battlerAtk, u8 battlerDef, u32 move, bool32 recordAbi
|
||||
+ 2 * (holdEffectAtk == HOLD_EFFECT_LUCKY_PUNCH && gBattleMons[gBattlerAttacker].species == SPECIES_CHANSEY)
|
||||
+ 2 * BENEFITS_FROM_LEEK(battlerAtk, holdEffectAtk)
|
||||
#if B_AFFECTION_MECHANICS == TRUE
|
||||
+ (abilityAtk == ABILITY_SUPER_LUCK)
|
||||
+ 2 * (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]) >= 5);
|
||||
#else
|
||||
+ (abilityAtk == ABILITY_SUPER_LUCK);
|
||||
+ 2 * (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]) >= FRIENDSHIP_GE_200)
|
||||
#endif
|
||||
+ (abilityAtk == ABILITY_SUPER_LUCK);
|
||||
|
||||
if (critChance >= ARRAY_COUNT(sCriticalHitChance))
|
||||
critChance = ARRAY_COUNT(sCriticalHitChance) - 1;
|
||||
@ -1976,6 +1975,8 @@ static void Cmd_adjustdamage(void)
|
||||
{
|
||||
u8 holdEffect, param;
|
||||
u32 moveType;
|
||||
u32 friendshipScore = GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]);
|
||||
u32 rand = Random() % 100;
|
||||
|
||||
GET_MOVE_TYPE(gCurrentMove, moveType);
|
||||
|
||||
@ -1991,7 +1992,7 @@ static void Cmd_adjustdamage(void)
|
||||
|
||||
gPotentialItemEffectBattler = gBattlerTarget;
|
||||
|
||||
if (holdEffect == HOLD_EFFECT_FOCUS_BAND && (Random() % 100) < param)
|
||||
if (holdEffect == HOLD_EFFECT_FOCUS_BAND && rand < param)
|
||||
{
|
||||
RecordItemEffectBattle(gBattlerTarget, holdEffect);
|
||||
gSpecialStatuses[gBattlerTarget].focusBanded = TRUE;
|
||||
@ -2009,12 +2010,12 @@ static void Cmd_adjustdamage(void)
|
||||
gSpecialStatuses[gBattlerTarget].focusSashed = TRUE;
|
||||
}
|
||||
#if B_AFFECTION_MECHANICS == TRUE
|
||||
else if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER && GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]) >= 3)
|
||||
else if (GetBattlerSide(gBattlerTarget) == B_SIDE_PLAYER && friendshipScore >= FRIENDSHIP_GE_100)
|
||||
{
|
||||
if ((GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]) == 6 && (Random() % 100) < 25)
|
||||
|| (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]) == 5 && (Random() % 100) < 20)
|
||||
|| (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]) == 4 && (Random() % 100) < 15)
|
||||
|| (GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerTarget]]) == 3 && (Random() % 100) < 10))
|
||||
if ((friendshipScore == FRIENDSHIP_MAX && rand < 25)
|
||||
|| (friendshipScore == FRIENDSHIP_GE_200 && rand < 20)
|
||||
|| (friendshipScore == FRIENDSHIP_GE_150 && rand < 15)
|
||||
|| (friendshipScore == FRIENDSHIP_GE_100 && rand < 10))
|
||||
gSpecialStatuses[gBattlerTarget].affectionEndured = TRUE;
|
||||
}
|
||||
#endif
|
||||
@ -2024,11 +2025,9 @@ static void Cmd_adjustdamage(void)
|
||||
&& !gSpecialStatuses[gBattlerTarget].focusBanded
|
||||
&& !gSpecialStatuses[gBattlerTarget].focusSashed
|
||||
#if B_AFFECTION_MECHANICS == TRUE
|
||||
&& !gSpecialStatuses[gBattlerTarget].sturdied
|
||||
&& !gSpecialStatuses[gBattlerTarget].affectionEndured)
|
||||
#else
|
||||
&& !gSpecialStatuses[gBattlerTarget].sturdied)
|
||||
&& !gSpecialStatuses[gBattlerTarget].affectionEndured
|
||||
#endif
|
||||
&& !gSpecialStatuses[gBattlerTarget].sturdied)
|
||||
goto END;
|
||||
|
||||
// Handle reducing the dmg to 1 hp.
|
||||
@ -4063,7 +4062,7 @@ static void Cmd_getexp(void)
|
||||
}
|
||||
#endif
|
||||
#if B_AFFECTION_MECHANICS == TRUE
|
||||
if (GetMonFriendshipScore(&gPlayerParty[gBattleStruct->expGetterMonId]) >= 2)
|
||||
if (GetMonFriendshipScore(&gPlayerParty[gBattleStruct->expGetterMonId]) >= FRIENDSHIP_GE_50)
|
||||
gBattleMoveDamage = (gBattleMoveDamage * 120) / 100;
|
||||
#endif
|
||||
|
||||
|
@ -45,6 +45,7 @@
|
||||
#include "constants/species.h"
|
||||
#include "constants/trainers.h"
|
||||
#include "constants/weather.h"
|
||||
#include "constants/pokemon.h"
|
||||
|
||||
extern struct Evolution gEvolutionTable[][EVOS_PER_MON];
|
||||
|
||||
@ -2084,22 +2085,22 @@ void TryToRevertMimicry(void)
|
||||
}
|
||||
}
|
||||
|
||||
u32 GetMonFriendshipScore(struct Pokemon *pokemon) // Based on GetLeadMonFriendshipScore
|
||||
u32 GetMonFriendshipScore(struct Pokemon *pokemon)
|
||||
{
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == 255)
|
||||
return 6;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == MAX_FRIENDSHIP)
|
||||
return FRIENDSHIP_MAX;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200)
|
||||
return 5;
|
||||
return FRIENDSHIP_GE_200;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150)
|
||||
return 4;
|
||||
return FRIENDSHIP_GE_150;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100)
|
||||
return 3;
|
||||
return FRIENDSHIP_GE_100;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50)
|
||||
return 2;
|
||||
return FRIENDSHIP_GE_50;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1)
|
||||
return 1;
|
||||
return FRIENDSHIP_GE_1;
|
||||
|
||||
return 0;
|
||||
return FRIENDSHIP_NONE;
|
||||
}
|
||||
|
||||
enum
|
||||
@ -2585,7 +2586,7 @@ u8 DoFieldEndTurnEffects(void)
|
||||
for (gBattlerAttacker = 0; gBattlerAttacker < gBattlersCount; gBattlerAttacker++)
|
||||
{
|
||||
if (GetBattlerSide(gBattlerAttacker) == B_SIDE_PLAYER
|
||||
&& GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]) >= 4
|
||||
&& GetMonFriendshipScore(&gPlayerParty[gBattlerPartyIndexes[gBattlerAttacker]]) >= FRIENDSHIP_GE_150
|
||||
&& (Random() % 100 < 20))
|
||||
{
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = 1;
|
||||
|
@ -65,6 +65,7 @@
|
||||
#include "constants/weather.h"
|
||||
#include "constants/metatile_labels.h"
|
||||
#include "palette.h"
|
||||
#include "battle_util.h"
|
||||
|
||||
EWRAM_DATA bool8 gBikeCyclingChallenge = FALSE;
|
||||
EWRAM_DATA u8 gBikeCollisions = 0;
|
||||
@ -939,21 +940,7 @@ u16 GetWeekCount(void)
|
||||
|
||||
u8 GetLeadMonFriendshipScore(void)
|
||||
{
|
||||
struct Pokemon *pokemon = &gPlayerParty[GetLeadMonIndex()];
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) == MAX_FRIENDSHIP)
|
||||
return 6;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 200)
|
||||
return 5;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 150)
|
||||
return 4;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 100)
|
||||
return 3;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 50)
|
||||
return 2;
|
||||
if (GetMonData(pokemon, MON_DATA_FRIENDSHIP) >= 1)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
return GetMonFriendshipScore(&gPlayerParty[GetLeadMonIndex()]);
|
||||
}
|
||||
|
||||
static void CB2_FieldShowRegionMap(void)
|
||||
|
Loading…
Reference in New Issue
Block a user