Merge pull request #1906 from LOuroboros/flingBE
Implemented Fling (1/2)
This commit is contained in:
commit
8262e967a3
10 changed files with 389 additions and 153 deletions
|
@ -1932,6 +1932,42 @@
|
|||
various BS_ATTACKER, VARIOUS_SHELL_SIDE_ARM_CHECK
|
||||
.endm
|
||||
|
||||
.macro jumpifcantfling battler:req, ptr:req
|
||||
various \battler, VARIOUS_JUMP_IF_CANT_FLING
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro curecertainstatuses battler:req
|
||||
various \battler, VARIOUS_CURE_CERTAIN_STATUSES
|
||||
.endm
|
||||
|
||||
.macro tryresetnegativestatstages battler:req
|
||||
various \battler, VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES
|
||||
.endm
|
||||
|
||||
.macro jumpiflastuseditemberry ptr:req
|
||||
various BS_ATTACKER, VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro jumpiflastuseditemholdeffect battler:req, holdEffect:req, ptr:req
|
||||
various \battler, VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT
|
||||
.byte \holdEffect
|
||||
.4byte \ptr
|
||||
.endm
|
||||
|
||||
.macro savebattleritem battler:req
|
||||
various \battler, VARIOUS_SAVE_BATTLER_ITEM
|
||||
.endm
|
||||
|
||||
.macro restorebattleritem battler:req
|
||||
various \battler, VARIOUS_RESTORE_BATTLER_ITEM
|
||||
.endm
|
||||
|
||||
.macro battleritemtolastuseditem battler:req
|
||||
various \battler, VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM
|
||||
.endm
|
||||
|
||||
@ helpful macros
|
||||
.macro setstatchanger stat:req, stages:req, down:req
|
||||
setbyte sSTATCHANGER, \stat | \stages << 3 | \down << 7
|
||||
|
|
|
@ -235,7 +235,7 @@ gBattleScriptsForMoveEffects::
|
|||
.4byte BattleScript_EffectDragonDance @ EFFECT_DRAGON_DANCE
|
||||
.4byte BattleScript_EffectCamouflage @ EFFECT_CAMOUFLAGE
|
||||
.4byte BattleScript_EffectHit @ EFFECT_PLEDGE
|
||||
.4byte BattleScript_EffectHit @ EFFECT_FLING
|
||||
.4byte BattleScript_EffectFling @ EFFECT_FLING
|
||||
.4byte BattleScript_EffectNaturalGift @ EFFECT_NATURAL_GIFT
|
||||
.4byte BattleScript_EffectWakeUpSlap @ EFFECT_WAKE_UP_SLAP
|
||||
.4byte BattleScript_EffectHit @ EFFECT_WRING_OUT
|
||||
|
@ -463,6 +463,92 @@ BattleScript_SkyDropFlyingAlreadyConfused:
|
|||
setbyte BS_ATTACKER, BS_TARGET
|
||||
goto BattleScript_ThrashConfuses
|
||||
|
||||
BattleScript_EffectFling:
|
||||
jumpifcantfling BS_ATTACKER, BattleScript_ButItFailedAtkStringPpReduce
|
||||
jumpifstatus3 BS_ATTACKER, STATUS3_EMBARGO, BattleScript_ButItFailedAtkStringPpReduce
|
||||
jumpifword CMP_COMMON_BITS, gFieldStatuses, STATUS_FIELD_MAGIC_ROOM, BattleScript_ButItFailedAtkStringPpReduce
|
||||
setlastuseditem BS_ATTACKER
|
||||
removeitem BS_ATTACKER
|
||||
attackcanceler
|
||||
accuracycheck BattleScript_PrintMoveMissed, ACC_CURR_MOVE
|
||||
attackstring
|
||||
pause B_WAIT_TIME_SHORT
|
||||
printstring STRINGID_PKMNFLUNG
|
||||
waitmessage B_WAIT_TIME_SHORT
|
||||
ppreduce
|
||||
critcalc
|
||||
damagecalc
|
||||
adjustdamage
|
||||
attackanimation
|
||||
waitanimation
|
||||
effectivenesssound
|
||||
hitanimation BS_TARGET
|
||||
waitstate
|
||||
healthbarupdate BS_TARGET
|
||||
datahpupdate BS_TARGET
|
||||
critmessage
|
||||
waitmessage B_WAIT_TIME_MED
|
||||
resultmessage
|
||||
waitmessage B_WAIT_TIME_MED
|
||||
jumpiflastuseditemberry BattleScript_EffectFlingConsumeBerry
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLAME_ORB, BattleScript_FlingFlameOrb
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_FLINCH, BattleScript_FlingFlinch
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_LIGHT_BALL, BattleScript_FlingLightBall
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_MENTAL_HERB, BattleScript_FlingMentalHerb
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_POISON_POWER, BattleScript_FlingPoisonBarb
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_TOXIC_ORB, BattleScript_FlingToxicOrb
|
||||
jumpiflastuseditemholdeffect BS_ATTACKER, HOLD_EFFECT_RESTORE_STATS, BattleScript_FlingWhiteHerb
|
||||
BattleScript_EffectFlingConsumeBerry:
|
||||
savebattleritem BS_TARGET
|
||||
battleritemtolastuseditem BS_TARGET
|
||||
setbyte sBERRY_OVERRIDE, TRUE @ override the requirements for eating berries
|
||||
orword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
consumeberry BS_TARGET
|
||||
bicword gHitMarker, HITMARKER_NO_ANIMATIONS
|
||||
setbyte sBERRY_OVERRIDE, FALSE
|
||||
restorebattleritem BS_TARGET
|
||||
BattleScript_FlingEnd:
|
||||
tryfaintmon BS_TARGET
|
||||
goto BattleScript_MoveEnd
|
||||
|
||||
BattleScript_FlingFlameOrb:
|
||||
setmoveeffect MOVE_EFFECT_BURN
|
||||
seteffectprimary
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingFlinch:
|
||||
setmoveeffect MOVE_EFFECT_FLINCH
|
||||
seteffectprimary
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingLightBall:
|
||||
setmoveeffect MOVE_EFFECT_PARALYSIS
|
||||
seteffectprimary
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingMentalHerb:
|
||||
curecertainstatuses BS_TARGET
|
||||
savetarget
|
||||
copybyte gBattlerAttacker, gBattlerTarget
|
||||
playanimation BS_ATTACKER, B_ANIM_HELD_ITEM_EFFECT, NULL
|
||||
printfromtable gMentalHerbCureStringIds
|
||||
waitmessage B_WAIT_TIME_LONG
|
||||
updatestatusicon BS_ATTACKER
|
||||
restoretarget
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingPoisonBarb:
|
||||
setmoveeffect MOVE_EFFECT_POISON
|
||||
seteffectprimary
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingToxicOrb:
|
||||
setmoveeffect MOVE_EFFECT_TOXIC
|
||||
seteffectprimary
|
||||
goto BattleScript_FlingEnd
|
||||
BattleScript_FlingWhiteHerb:
|
||||
tryresetnegativestatstages BS_TARGET
|
||||
swapattackerwithtarget
|
||||
printstring STRINGID_PKMNSTATUSNORMAL
|
||||
waitmessage B_WAIT_TIME_MED
|
||||
swapattackerwithtarget
|
||||
goto BattleScript_FlingEnd
|
||||
|
||||
BattleScript_EffectShellSideArm:
|
||||
shellsidearmcheck
|
||||
setmoveeffect MOVE_EFFECT_POISON
|
||||
|
|
|
@ -294,6 +294,7 @@ struct BattleHistory
|
|||
u8 moveHistoryIndex[MAX_BATTLERS_COUNT];
|
||||
u16 trainerItems[MAX_BATTLERS_COUNT];
|
||||
u8 itemsNo;
|
||||
u16 heldItems[MAX_BATTLERS_COUNT];
|
||||
};
|
||||
|
||||
struct BattleScriptsStack
|
||||
|
|
|
@ -150,6 +150,7 @@
|
|||
#define B_KINGS_SHIELD_LOWER_ATK GEN_7 // In Gen7+, it lowers Atk by 1 stage instead of 2 of oponents that hit it.
|
||||
#define B_SPEED_BUFFING_RAPID_SPIN GEN_8 // In Gen8, Rapid Spin raises the user's Speed by 1 stage.
|
||||
#define B_RECOIL_IF_MISS_DMG GEN_7 // In Gen5+, Jump Kick and High Jump Kick will always do half of the user's max HP when missing.
|
||||
#define B_KLUTZ_FLING_INTERACTION GEN_7 // In Gen5+, Pokémon with the Klutz ability can't use Fling.
|
||||
#define B_UPDATED_CONVERSION GEN_7 // In Gen6+, Conversion changes the user's type to match their first move's. Before, it would choose a move at random.
|
||||
|
||||
// Move accuracy settings
|
||||
|
|
|
@ -229,6 +229,15 @@
|
|||
#define VARIOUS_SET_SKY_DROP 139
|
||||
#define VARIOUS_CLEAR_SKY_DROP 140
|
||||
#define VARIOUS_SKY_DROP_YAWN 141
|
||||
#define VARIOUS_JUMP_IF_CANT_FLING 142
|
||||
#define VARIOUS_JUMP_IF_HOLD_EFFECT 143
|
||||
#define VARIOUS_CURE_CERTAIN_STATUSES 144
|
||||
#define VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES 145
|
||||
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY 146
|
||||
#define VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT 147
|
||||
#define VARIOUS_SAVE_BATTLER_ITEM 148
|
||||
#define VARIOUS_RESTORE_BATTLER_ITEM 149
|
||||
#define VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM 150
|
||||
|
||||
// Cmd_manipulatedamage
|
||||
#define DMG_CHANGE_SIGN 0
|
||||
|
|
|
@ -21,6 +21,7 @@ struct Item
|
|||
u8 battleUsage;
|
||||
ItemUseFunc battleUseFunc;
|
||||
u8 secondaryId;
|
||||
u8 flingPower;
|
||||
};
|
||||
|
||||
struct BagPocket
|
||||
|
@ -75,6 +76,6 @@ ItemUseFunc ItemId_GetFieldFunc(u16 itemId);
|
|||
u8 ItemId_GetBattleUsage(u16 itemId);
|
||||
ItemUseFunc ItemId_GetBattleFunc(u16 itemId);
|
||||
u8 ItemId_GetSecondaryId(u16 itemId);
|
||||
bool32 IsPinchBerryItemEffect(u16 holdEffect);
|
||||
u8 ItemId_GetFlingPower(u16 itemId);
|
||||
|
||||
#endif // GUARD_ITEM_H
|
||||
|
|
|
@ -41,6 +41,7 @@ enum
|
|||
static u8 ChooseMoveOrAction_Singles(void);
|
||||
static u8 ChooseMoveOrAction_Doubles(void);
|
||||
static void BattleAI_DoAIProcessing(void);
|
||||
static bool32 IsPinchBerryItemEffect(u16 holdEffect);
|
||||
|
||||
// ewram
|
||||
EWRAM_DATA const u8 *gAIScriptPtr = NULL; // Still used in contests
|
||||
|
@ -2928,6 +2929,29 @@ static s16 AI_DoubleBattle(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
|||
return score;
|
||||
}
|
||||
|
||||
static bool32 IsPinchBerryItemEffect(u16 holdEffect)
|
||||
{
|
||||
switch (holdEffect)
|
||||
{
|
||||
case HOLD_EFFECT_ATTACK_UP:
|
||||
case HOLD_EFFECT_DEFENSE_UP:
|
||||
case HOLD_EFFECT_SPEED_UP:
|
||||
case HOLD_EFFECT_SP_ATTACK_UP:
|
||||
case HOLD_EFFECT_SP_DEFENSE_UP:
|
||||
case HOLD_EFFECT_CRITICAL_UP:
|
||||
case HOLD_EFFECT_RANDOM_STAT_UP:
|
||||
#ifdef HOLD_EFFECT_CUSTAP_BERRY
|
||||
case HOLD_EFFECT_CUSTAP_BERRY:
|
||||
#endif
|
||||
#ifdef HOLD_EFFECT_MICLE_BERRY
|
||||
case HOLD_EFFECT_MICLE_BERRY:
|
||||
#endif
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// AI_FLAG_CHECK_VIABILITY - a weird mix of increasing and decreasing scores
|
||||
static s16 AI_CheckViability(u8 battlerAtk, u8 battlerDef, u16 move, s16 score)
|
||||
{
|
||||
|
|
|
@ -9397,6 +9397,83 @@ static void Cmd_various(void)
|
|||
gBattlescriptCurrInstr += 7;
|
||||
return;
|
||||
}
|
||||
case VARIOUS_JUMP_IF_CANT_FLING:
|
||||
if (!CanFling(gActiveBattler))
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||
else
|
||||
gBattlescriptCurrInstr += 7;
|
||||
return;
|
||||
case VARIOUS_CURE_CERTAIN_STATUSES:
|
||||
// Check infatuation
|
||||
if (gBattleMons[gActiveBattler].status2 & STATUS2_INFATUATION)
|
||||
{
|
||||
gBattleMons[gActiveBattler].status2 &= ~(STATUS2_INFATUATION);
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_INFATUATION; // STRINGID_TARGETGOTOVERINFATUATION
|
||||
StringCopy(gBattleTextBuff1, gStatusConditionString_LoveJpn);
|
||||
}
|
||||
// Check taunt
|
||||
if (gDisableStructs[gActiveBattler].tauntTimer != 0)
|
||||
{
|
||||
gDisableStructs[gActiveBattler].tauntTimer = gDisableStructs[gActiveBattler].tauntTimer2 = 0;
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TAUNT;
|
||||
PREPARE_MOVE_BUFFER(gBattleTextBuff1, MOVE_TAUNT);
|
||||
}
|
||||
// Check encore
|
||||
if (gDisableStructs[gActiveBattler].encoreTimer != 0)
|
||||
{
|
||||
gDisableStructs[gActiveBattler].encoredMove = 0;
|
||||
gDisableStructs[gActiveBattler].encoreTimerStartValue = gDisableStructs[gActiveBattler].encoreTimer = 0;
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_ENCORE; // STRINGID_PKMNENCOREENDED
|
||||
}
|
||||
// Check torment
|
||||
if (gBattleMons[gActiveBattler].status2 & STATUS2_TORMENT)
|
||||
{
|
||||
gBattleMons[gActiveBattler].status2 &= ~(STATUS2_TORMENT);
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_TORMENT;
|
||||
}
|
||||
// Check heal block
|
||||
if (gStatuses3[gActiveBattler] & STATUS3_HEAL_BLOCK)
|
||||
{
|
||||
gStatuses3[gActiveBattler] &= ~(STATUS3_HEAL_BLOCK);
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_HEALBLOCK;
|
||||
}
|
||||
// Check disable
|
||||
if (gDisableStructs[gActiveBattler].disableTimer != 0)
|
||||
{
|
||||
gDisableStructs[gActiveBattler].disableTimer = gDisableStructs[gActiveBattler].disableTimerStartValue = 0;
|
||||
gDisableStructs[gActiveBattler].disabledMove = 0;
|
||||
gBattleCommunication[MULTISTRING_CHOOSER] = B_MSG_MENTALHERBCURE_DISABLE;
|
||||
}
|
||||
gBattlescriptCurrInstr += 3;
|
||||
return;
|
||||
case VARIOUS_TRY_RESET_NEGATIVE_STAT_STAGES:
|
||||
gActiveBattler = gBattlerTarget;
|
||||
for (i = 0; i < NUM_BATTLE_STATS; i++)
|
||||
if (gBattleMons[gActiveBattler].statStages[i] < DEFAULT_STAT_STAGE)
|
||||
gBattleMons[gActiveBattler].statStages[i] = DEFAULT_STAT_STAGE;
|
||||
gBattlescriptCurrInstr += 3;
|
||||
return;
|
||||
case VARIOUS_JUMP_IF_LAST_USED_ITEM_BERRY:
|
||||
if (ItemId_GetPocket(gLastUsedItem) == POCKET_BERRIES)
|
||||
gBattlescriptCurrInstr += 7;
|
||||
else
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||
return;
|
||||
case VARIOUS_JUMP_IF_LAST_USED_ITEM_HOLD_EFFECT:
|
||||
if (ItemId_GetHoldEffect(gLastUsedItem) == gBattlescriptCurrInstr[3])
|
||||
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 4);
|
||||
else
|
||||
gBattlescriptCurrInstr += 8;
|
||||
return;
|
||||
case VARIOUS_SAVE_BATTLER_ITEM:
|
||||
gBattleResources->battleHistory->heldItems[gActiveBattler] = gBattleMons[gActiveBattler].item;
|
||||
break;
|
||||
case VARIOUS_RESTORE_BATTLER_ITEM:
|
||||
gBattleMons[gActiveBattler].item = gBattleResources->battleHistory->heldItems[gActiveBattler];
|
||||
break;
|
||||
case VARIOUS_BATTLER_ITEM_TO_LAST_USED_ITEM:
|
||||
gBattleMons[gActiveBattler].item = gLastUsedItem;
|
||||
break;
|
||||
} // End of switch (gBattlescriptCurrInstr[2])
|
||||
|
||||
gBattlescriptCurrInstr += 3;
|
||||
|
|
|
@ -7964,7 +7964,7 @@ static u16 CalcMoveBasePower(u16 move, u8 battlerAtk, u8 battlerDef)
|
|||
// todo
|
||||
break;
|
||||
case EFFECT_FLING:
|
||||
// todo: program Fling + Unburden interaction
|
||||
basePower = ItemId_GetFlingPower(gBattleMons[battlerAtk].item);
|
||||
break;
|
||||
case EFFECT_ERUPTION:
|
||||
basePower = gBattleMons[battlerAtk].hp * basePower / gBattleMons[battlerAtk].maxHP;
|
||||
|
@ -9637,17 +9637,13 @@ bool32 CanFling(u8 battlerId)
|
|||
u16 itemEffect = ItemId_GetHoldEffect(item);
|
||||
|
||||
if (item == ITEM_NONE
|
||||
#if B_KLUTZ_FLING_INTERACTION >= GEN_5
|
||||
|| GetBattlerAbility(battlerId) == ABILITY_KLUTZ
|
||||
#endif
|
||||
|| gFieldStatuses & STATUS_FIELD_MAGIC_ROOM
|
||||
|| gDisableStructs[battlerId].embargoTimer != 0
|
||||
|| !CanBattlerGetOrLoseItem(battlerId, item)
|
||||
//|| itemEffect == HOLD_EFFECT_PRIMAL_ORB
|
||||
|| itemEffect == HOLD_EFFECT_GEMS
|
||||
#ifdef ITEM_ABILITY_CAPSULE
|
||||
|| item == ITEM_ABILITY_CAPSULE
|
||||
#endif
|
||||
|| (ItemId_GetPocket(item) == POCKET_BERRIES && IsAbilityOnSide(battlerId, ABILITY_UNNERVE))
|
||||
|| GetPocketByItemId(item) == POCKET_POKE_BALLS)
|
||||
|| ItemId_GetFlingPower(item) != 0
|
||||
|| !CanBattlerGetOrLoseItem(battlerId, item))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
|
|
|
@ -966,3 +966,8 @@ bool32 IsPinchBerryItemEffect(u16 holdEffect)
|
|||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
u8 ItemId_GetFlingPower(u16 itemId)
|
||||
{
|
||||
return gItems[SanitizeItemId(itemId)].flingPower;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue