Re-PR'd due to excess "merges"
This commit is contained in:
Papa Cancer 2019-04-20 20:11:49 +01:00
parent 0b7aef1c94
commit b50007e861
9 changed files with 95 additions and 1 deletions

View file

@ -1644,6 +1644,11 @@
.4byte \ptr
.endm
.macro tryinstruct ptr:req
various BS_ATTACKER, VARIOUS_TRY_INSTRUCT
.4byte \ptr
.endm
@ helpful macros
.macro setstatchanger stat:req, stages:req, down:req
setbyte sSTATCHANGER \stat | \stages << 3 | \down << 7

View file

@ -348,6 +348,7 @@ gBattleScriptsForMoveEffects:: @ 82D86A8
.4byte BattleScript_EffectMatBlock
.4byte BattleScript_EffectStompingTantrum
.4byte BattleScript_EffectCoreEnforcer
.4byte BattleScript_EffectInstruct
.4byte BattleScript_EffectThroatChop
.4byte BattleScript_EffectLaserFocus
@ -787,6 +788,20 @@ BattleScript_EffectCopycat:
BattleScript_CopycatFail:
ppreduce
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:
setstatchanger STAT_SPEED, 2, FALSE

View file

@ -165,6 +165,7 @@ struct SpecialStatus
u8 sturdied:1;
u8 stormDrainRedirected:1;
u8 switchInAbilityDone:1;
u8 instructedChosenTarget:3;
s32 dmg;
s32 physicalDmg;
s32 specialDmg;
@ -516,6 +517,7 @@ struct BattleStruct
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 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.
};

View file

@ -336,6 +336,7 @@
#define EFFECT_MAT_BLOCK 330
#define EFFECT_STOMPING_TANTRUM 331
#define EFFECT_CORE_ENFORCER 332
#define EFFECT_INSTRUCT 333
#define EFFECT_THROAT_CHOP 334
#define EFFECT_LASER_FOCUS 335

View file

@ -139,6 +139,7 @@
#define VARIOUS_GRAVITY_ON_AIRBORNE_MONS 76
#define VARIOUS_CHECK_IF_GRASSY_TERRAIN_HEALS 77
#define VARIOUS_JUMP_IF_ROAR_FAILS 78
#define VARIOUS_TRY_INSTRUCT 79
// atk80, dmg manipulation
#define ATK80_DMG_CHANGE_SIGN 0

View file

@ -528,6 +528,7 @@
#define STRINGID_SWEETVEILPROTECTED 524
#define STRINGID_AROMAVEILPROTECTED 525
#define STRINGID_CELEBRATEMESSAGE 526
#define STRINGID_USEDINSTRUCTEDMOVE 527
#define STRINGID_THROATCHOPENDS 528
#define STRINGID_PKMNCANTUSEMOVETHROATCHOP 529
#define STRINGID_LASERFOCUS 530

View file

@ -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_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_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!");
const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
@ -662,6 +663,7 @@ const u8 *const gBattleStringsTable[BATTLESTRINGS_COUNT] =
[STRINGID_LASERFOCUS - 12] = sText_LaserFocusMessage,
[STRINGID_THROATCHOPENDS - 12] = sText_ThroatChopEnds,
[STRINGID_PKMNCANTUSEMOVETHROATCHOP - 12] = sText_PkmnCantUseMoveThroatChop,
[STRINGID_USEDINSTRUCTEDMOVE - 12] = sText_UsedInstructedMove,
[STRINGID_CELEBRATEMESSAGE - 12] = sText_CelebrateMessage,
[STRINGID_AROMAVEILPROTECTED - 12] = sText_AromaVeilProtected,
[STRINGID_SWEETVEILPROTECTED - 12] = sText_SweetVeilProtected,

View file

@ -738,6 +738,7 @@ static const u16 sProtectSuccessRates[] = {USHRT_MAX, USHRT_MAX / 2, USHRT_MAX /
#define METRONOME_FORBIDDEN_END 0xFFFF
#define ASSIST_FORBIDDEN_END 0xFFFF
#define COPYCAT_FORBIDDEN_END 0xFFFF
#define INSTRUCT_FORBIDDEN_END 0xFFFF
static const u16 sMovesForbiddenToCopy[] =
{
@ -773,6 +774,33 @@ static const u16 sMovesForbiddenToCopy[] =
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[] =
{
MOVE_STUN_SPORE,
@ -4408,6 +4436,7 @@ static void atk49_moveend(void)
break;
case ATK49_UPDATE_LAST_MOVES:
gDisableStructs[gBattlerAttacker].usedMoves |= gBitTable[gCurrMovePos];
gBattleStruct->lastMoveTarget[gBattlerAttacker] = gBattlerTarget;
if (gMoveResultFlags & (MOVE_RESULT_FAILED | MOVE_RESULT_DOESNT_AFFECT_FOE))
gBattleStruct->lastMoveFailed |= gBitTable[gBattlerAttacker];
else
@ -4517,6 +4546,8 @@ static void atk49_moveend(void)
gBattleScripting.atk49_state++;
break;
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;
gBattleStruct->ateBoost[gBattlerAttacker] = 0;
gStatuses3[gBattlerAttacker] &= ~(STATUS3_ME_FIRST);
@ -7118,6 +7149,42 @@ static void atk76_various(void)
gBattlescriptCurrInstr += 7;
}
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:
CreateAbilityPopUp(gActiveBattler, gBattleMons[gActiveBattler].ability, (gBattleTypeFlags & BATTLE_TYPE_DOUBLE) != 0);
break;

View file

@ -9152,7 +9152,7 @@ const struct BattleMove gBattleMoves[MOVES_COUNT] =
[MOVE_INSTRUCT] =
{
.effect = EFFECT_PLACEHOLDER,
.effect = EFFECT_INSTRUCT,
.power = 0,
.type = TYPE_PSYCHIC,
.accuracy = 0,