mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2025-01-19 09:54:19 +01:00
commit
8ce919594c
@ -1644,6 +1644,11 @@
|
|||||||
.4byte \ptr
|
.4byte \ptr
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
.macro tryinstruct ptr:req
|
||||||
|
various BS_ATTACKER, VARIOUS_TRY_INSTRUCT
|
||||||
|
.4byte \ptr
|
||||||
|
.endm
|
||||||
|
|
||||||
@ helpful macros
|
@ helpful macros
|
||||||
.macro setstatchanger stat:req, stages:req, down:req
|
.macro setstatchanger stat:req, stages:req, down:req
|
||||||
setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7
|
setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7
|
||||||
|
@ -348,6 +348,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
|
|||||||
.4byte BattleScript_EffectMatBlock
|
.4byte BattleScript_EffectMatBlock
|
||||||
.4byte BattleScript_EffectStompingTantrum
|
.4byte BattleScript_EffectStompingTantrum
|
||||||
.4byte BattleScript_EffectCoreEnforcer
|
.4byte BattleScript_EffectCoreEnforcer
|
||||||
|
.4byte BattleScript_EffectInstruct
|
||||||
.4byte BattleScript_EffectThroatChop
|
.4byte BattleScript_EffectThroatChop
|
||||||
.4byte BattleScript_EffectLaserFocus
|
.4byte BattleScript_EffectLaserFocus
|
||||||
|
|
||||||
@ -788,6 +789,20 @@ BattleScript_CopycatFail:
|
|||||||
ppreduce
|
ppreduce
|
||||||
goto BattleScript_ButItFailed
|
goto BattleScript_ButItFailed
|
||||||
|
|
||||||
|
BattleScript_EffectInstruct:
|
||||||
|
attackcanceler
|
||||||
|
attackstring
|
||||||
|
ppreduce
|
||||||
|
pause 0x5
|
||||||
|
tryinstruct BattleScript_ButItFailed
|
||||||
|
attackanimation
|
||||||
|
waitanimation
|
||||||
|
printstring STRINGID_USEDINSTRUCTEDMOVE
|
||||||
|
waitmessage 0x40
|
||||||
|
setbyte sB_ANIM_TURN, 0x0
|
||||||
|
setbyte sB_ANIM_TARGETS_HIT, 0x0
|
||||||
|
jumptocalledmove TRUE
|
||||||
|
|
||||||
BattleScript_EffectAutonomize:
|
BattleScript_EffectAutonomize:
|
||||||
setstatchanger STAT_SPEED, 2, FALSE
|
setstatchanger STAT_SPEED, 2, FALSE
|
||||||
attackcanceler
|
attackcanceler
|
||||||
|
@ -165,6 +165,7 @@ struct SpecialStatus
|
|||||||
u8 sturdied:1;
|
u8 sturdied:1;
|
||||||
u8 stormDrainRedirected:1;
|
u8 stormDrainRedirected:1;
|
||||||
u8 switchInAbilityDone:1;
|
u8 switchInAbilityDone:1;
|
||||||
|
u8 instructedChosenTarget:3;
|
||||||
s32 dmg;
|
s32 dmg;
|
||||||
s32 physicalDmg;
|
s32 physicalDmg;
|
||||||
s32 specialDmg;
|
s32 specialDmg;
|
||||||
@ -516,6 +517,7 @@ struct BattleStruct
|
|||||||
u8 ateBerry[2]; // array id determined by side, each party pokemon as bit
|
u8 ateBerry[2]; // array id determined by side, each party pokemon as bit
|
||||||
u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages
|
u8 stolenStats[NUM_BATTLE_STATS]; // hp byte is used for which stats to raise, other inform about by how many stages
|
||||||
u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum
|
u8 lastMoveFailed; // as bits for each battler, for the sake of Stomping Tantrum
|
||||||
|
u8 lastMoveTarget[MAX_BATTLERS_COUNT]; // The last target on which each mon used a move, for the sake of Instruct
|
||||||
u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects.
|
u8 debugHoldEffects[MAX_BATTLERS_COUNT]; // These override actual items' hold effects.
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -336,6 +336,7 @@
|
|||||||
#define EFFECT_MAT_BLOCK 330
|
#define EFFECT_MAT_BLOCK 330
|
||||||
#define EFFECT_STOMPING_TANTRUM 331
|
#define EFFECT_STOMPING_TANTRUM 331
|
||||||
#define EFFECT_CORE_ENFORCER 332
|
#define EFFECT_CORE_ENFORCER 332
|
||||||
|
#define EFFECT_INSTRUCT 333
|
||||||
#define EFFECT_THROAT_CHOP 334
|
#define EFFECT_THROAT_CHOP 334
|
||||||
#define EFFECT_LASER_FOCUS 335
|
#define EFFECT_LASER_FOCUS 335
|
||||||
|
|
||||||
|
@ -139,6 +139,7 @@
|
|||||||
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76
|
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76
|
||||||
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77
|
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77
|
||||||
#define VARIOUS_JUMP_IF_ROAR_FAILS 78
|
#define VARIOUS_JUMP_IF_ROAR_FAILS 78
|
||||||
|
#define VARIOUS_TRY_INSTRUCT 79
|
||||||
|
|
||||||
// atk80, dmg manipulation
|
// atk80, dmg manipulation
|
||||||
#define ATK80_DMG_CHANGE_SIGN 0
|
#define ATK80_DMG_CHANGE_SIGN 0
|
||||||
|
@ -528,6 +528,7 @@
|
|||||||
#define STRINGID_SWEETVEILPROTECTED 524
|
#define STRINGID_SWEETVEILPROTECTED 524
|
||||||
#define STRINGID_AROMAVEILPROTECTED 525
|
#define STRINGID_AROMAVEILPROTECTED 525
|
||||||
#define STRINGID_CELEBRATEMESSAGE 526
|
#define STRINGID_CELEBRATEMESSAGE 526
|
||||||
|
#define STRINGID_USEDINSTRUCTEDMOVE 527
|
||||||
#define STRINGID_THROATCHOPENDS 528
|
#define STRINGID_THROATCHOPENDS 528
|
||||||
#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529
|
#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529
|
||||||
#define STRINGID_LASERFOCUS 530
|
#define STRINGID_LASERFOCUS 530
|
||||||
|
@ -655,6 +655,7 @@ static const u8 sText_FlowerVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrou
|
|||||||
static const u8 sText_SweetVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of sweetness!");
|
static const u8 sText_SweetVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} surrounded itself\nwith a veil of sweetness!");
|
||||||
static const u8 sText_AromaVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby an aromatic veil!");
|
static const u8 sText_AromaVeilProtected[] = _("{B_DEF_NAME_WITH_PREFIX} is protected\nby an aromatic veil!");
|
||||||
static const u8 sText_CelebrateMessage[] = _("Congratulations, {B_PLAYER_NAME}!");
|
static const u8 sText_CelebrateMessage[] = _("Congratulations, {B_PLAYER_NAME}!");
|
||||||
|
static const u8 sText_UsedInstructedMove[] = _("{B_ATK_NAME_WITH_PREFIX} used the move\ninstructed by {B_BUFF1}!");
|
||||||
static const u8 sText_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX}\nconcentrated intensely!");
|
static const u8 sText_LaserFocusMessage[] = _("{B_ATK_NAME_WITH_PREFIX}\nconcentrated intensely!");
|
||||||
|
|
||||||
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
||||||
@ -662,6 +663,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
|
|||||||
[STRINGID_LASERFOCUS - 12] = sText_LaserFocusMessage,
|
[STRINGID_LASERFOCUS - 12] = sText_LaserFocusMessage,
|
||||||
[STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds,
|
[STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds,
|
||||||
[STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop,
|
[STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop,
|
||||||
|
[STRINGID_USEDINSTRUCTEDMOVE - 12] = sText_UsedInstructedMove,
|
||||||
[STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage,
|
[STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage,
|
||||||
[STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected,
|
[STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected,
|
||||||
[STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected,
|
[STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected,
|
||||||
|
@ -738,6 +738,7 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX /
|
|||||||
#define METRONOME_FORBIDDEN_END 0xFFFF
|
#define METRONOME_FORBIDDEN_END 0xFFFF
|
||||||
#define ASSIST_FORBIDDEN_END 0xFFFF
|
#define ASSIST_FORBIDDEN_END 0xFFFF
|
||||||
#define COPYCAT_FORBIDDEN_END 0xFFFF
|
#define COPYCAT_FORBIDDEN_END 0xFFFF
|
||||||
|
#define INSTRUCT_FORBIDDEN_END 0xFFFF
|
||||||
|
|
||||||
static const u16 sMovesForbiddenToCopy[] =
|
static const u16 sMovesForbiddenToCopy[] =
|
||||||
{
|
{
|
||||||
@ -773,6 +774,33 @@ static const u16 sMovesForbiddenToCopy[] =
|
|||||||
METRONOME_FORBIDDEN_END
|
METRONOME_FORBIDDEN_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static const u16 sMoveEffectsForbiddenToInstruct[] =
|
||||||
|
{
|
||||||
|
EFFECT_ASSIST,
|
||||||
|
//EFFECT_BEAK_BLAST,
|
||||||
|
EFFECT_BIDE,
|
||||||
|
EFFECT_FOCUS_PUNCH,
|
||||||
|
//EFFECT_GEOMANCY,
|
||||||
|
EFFECT_INSTRUCT,
|
||||||
|
EFFECT_ME_FIRST,
|
||||||
|
EFFECT_METRONOME,
|
||||||
|
EFFECT_MIRROR_MOVE,
|
||||||
|
EFFECT_NATURE_POWER,
|
||||||
|
EFFECT_PLACEHOLDER,
|
||||||
|
EFFECT_RECHARGE,
|
||||||
|
EFFECT_SEMI_INVULNERABLE,
|
||||||
|
//EFFECT_SHELL_TRAP,
|
||||||
|
EFFECT_SKETCH,
|
||||||
|
//EFFECT_SKY_DROP,
|
||||||
|
EFFECT_SKULL_BASH,
|
||||||
|
EFFECT_SLEEP_TALK,
|
||||||
|
EFFECT_SOLARBEAM,
|
||||||
|
EFFECT_TRANSFORM,
|
||||||
|
EFFECT_TWO_TURNS_ATTACK,
|
||||||
|
INSTRUCT_FORBIDDEN_END
|
||||||
|
};
|
||||||
|
|
||||||
static const u16 sNaturePowerMoves[] =
|
static const u16 sNaturePowerMoves[] =
|
||||||
{
|
{
|
||||||
MOVE_STUN_SPORE,
|
MOVE_STUN_SPORE,
|
||||||
@ -4408,6 +4436,7 @@ static void atk49_moveend(void)
|
|||||||
break;
|
break;
|
||||||
case ATK49_UPDATE_LAST_MOVES:
|
case ATK49_UPDATE_LAST_MOVES:
|
||||||
gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos];
|
gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos];
|
||||||
|
gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget;
|
||||||
if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE))
|
if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE))
|
||||||
gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker];
|
gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker];
|
||||||
else
|
else
|
||||||
@ -4517,6 +4546,8 @@ static void atk49_moveend(void)
|
|||||||
gBattleScripting.atk49_state++;
|
gBattleScripting.atk49_state++;
|
||||||
break;
|
break;
|
||||||
case ATK49_CLEAR_BITS: // Clear bits active just while using a move.
|
case ATK49_CLEAR_BITS: // Clear bits active just while using a move.
|
||||||
|
if (gSpecialStatuses[gBattlerAttacker].instructedChosenTarget)
|
||||||
|
*(gBattleStruct->moveTarget + gBattlerAttacker) = gSpecialStatuses[gBattlerAttacker].instructedChosenTarget & 0x3;
|
||||||
gProtectStructs[gBattlerAttacker].usesBouncedMove = 0;
|
gProtectStructs[gBattlerAttacker].usesBouncedMove = 0;
|
||||||
gBattleStruct->ateBoost[gBattlerAttacker] = 0;
|
gBattleStruct->ateBoost[gBattlerAttacker] = 0;
|
||||||
gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST);
|
gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST);
|
||||||
@ -7118,6 +7149,42 @@ static void atk76_various(void)
|
|||||||
gBattlescriptCurrInstr += 7;
|
gBattlescriptCurrInstr += 7;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
case VARIOUS_TRY_INSTRUCT:
|
||||||
|
for (i = 0; sMoveEffectsForbiddenToInstruct[i] != INSTRUCT_FORBIDDEN_END; i++)
|
||||||
|
{
|
||||||
|
if (sMoveEffectsForbiddenToInstruct[i] == gBattleMoves[gLastMoves[gBattlerTarget]].effect)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (gLastMoves[gBattlerTarget] == 0 || gLastMoves[gBattlerTarget] == 0xFFFF || sMoveEffectsForbiddenToInstruct[i] != INSTRUCT_FORBIDDEN_END
|
||||||
|
|| gLastMoves[gBattlerTarget] == MOVE_STRUGGLE || gLastMoves[gBattlerTarget] == MOVE_KING_S_SHIELD)
|
||||||
|
{
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gSpecialStatuses[gBattlerTarget].instructedChosenTarget = *(gBattleStruct->moveTarget + gBattlerTarget) | 0x4;
|
||||||
|
gBattlerAttacker = gBattlerTarget;
|
||||||
|
gCalledMove = gLastMoves[gBattlerAttacker];
|
||||||
|
for (i = 0; i < MAX_MON_MOVES; i++)
|
||||||
|
{
|
||||||
|
if (gBattleMons[gBattlerAttacker].moves[i] == gCalledMove)
|
||||||
|
{
|
||||||
|
gCurrMovePos = i;
|
||||||
|
i = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (i != 4 || gBattleMons[gBattlerAttacker].pp[gCurrMovePos] == 0)
|
||||||
|
gBattlescriptCurrInstr = T1_READ_PTR(gBattlescriptCurrInstr + 3);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gBattlerTarget = gBattleStruct->lastMoveTarget[gBattlerAttacker];
|
||||||
|
gHitMarker &= ~(HITMARKER_ATTACKSTRING_PRINTED);
|
||||||
|
PREPARE_MON_NICK_WITH_PREFIX_BUFFER(gBattleTextBuff1, gActiveBattler, gBattlerPartyIndexes[gActiveBattler]);
|
||||||
|
gBattlescriptCurrInstr += 7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
case VARIOUS_ABILITY_POPUP:
|
case VARIOUS_ABILITY_POPUP:
|
||||||
CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0);
|
CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0);
|
||||||
break;
|
break;
|
||||||
|
@ -9152,7 +9152,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
|
|||||||
|
|
||||||
[MOVE_INSTRUCT] =
|
[MOVE_INSTRUCT] =
|
||||||
{
|
{
|
||||||
.effect = EFFECT_PLACEHOLDER,
|
.effect = EFFECT_INSTRUCT,
|
||||||
.power = 0,
|
.power = 0,
|
||||||
.type = TYPE_PSYCHIC,
|
.type = TYPE_PSYCHIC,
|
||||||
.accuracy = 0,
|
.accuracy = 0,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user