a1d2460372
In contests, even FONT_NARROWER isn't sufficient to prevent clipping in all cases. e.g. Stomping Tantrum clips. We have decided to accept that cost to make the rest of the user experience better, but downstream projects that don't like that trade-off can either a) alter the contest UI, or b) set B_EXPANDED_MOVE_NAMES to FALSE.
250 lines
8.8 KiB
C
250 lines
8.8 KiB
C
#include "global.h"
|
|
#include "test/battle.h"
|
|
|
|
ASSUMPTIONS
|
|
{
|
|
ASSUME(gMovesInfo[MOVE_FLY].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_FLY].argument)) == STATUS3_ON_AIR);
|
|
ASSUME(gMovesInfo[MOVE_DIG].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_DIG].argument)) == STATUS3_UNDERGROUND);
|
|
ASSUME(gMovesInfo[MOVE_BOUNCE].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_BOUNCE].argument)) == STATUS3_ON_AIR);
|
|
ASSUME(gMovesInfo[MOVE_DIVE].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_DIVE].argument)) == STATUS3_UNDERWATER);
|
|
ASSUME(gMovesInfo[MOVE_PHANTOM_FORCE].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_PHANTOM_FORCE].argument)) == STATUS3_PHANTOM_FORCE);
|
|
ASSUME(gMovesInfo[MOVE_SHADOW_FORCE].effect == EFFECT_SEMI_INVULNERABLE);
|
|
ASSUME(UNCOMPRESS_BITS(HIHALF(gMovesInfo[MOVE_SHADOW_FORCE].argument)) == STATUS3_PHANTOM_FORCE);
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Semi-invulnerable moves make the user semi-invulnerable turn 1, then strike turn 2")
|
|
{
|
|
u16 move;
|
|
|
|
PARAMETRIZE { move = MOVE_FLY; }
|
|
PARAMETRIZE { move = MOVE_DIG; }
|
|
PARAMETRIZE { move = MOVE_BOUNCE; }
|
|
PARAMETRIZE { move = MOVE_DIVE; }
|
|
PARAMETRIZE { move = MOVE_PHANTOM_FORCE; }
|
|
PARAMETRIZE { move = MOVE_SHADOW_FORCE; }
|
|
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, move); MOVE(opponent, MOVE_AERIAL_ACE); }
|
|
TURN { SKIP_TURN(player); }
|
|
} SCENE {
|
|
// Charging turn
|
|
if (B_UPDATED_MOVE_DATA >= GEN_5)
|
|
{
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
NOT MESSAGE("Wobbuffet flew up high!");
|
|
MESSAGE("Wobbuffet used Fly!");
|
|
break;
|
|
case MOVE_DIG:
|
|
NOT MESSAGE("Wobbuffet dug a hole!");
|
|
MESSAGE("Wobbuffet used Dig!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
NOT MESSAGE("Wobbuffet sprang up!");
|
|
MESSAGE("Wobbuffet used Bounce!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
NOT MESSAGE("Wobbuffet hid underwater!");
|
|
MESSAGE("Wobbuffet used Dive!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
NOT MESSAGE("Wobbuffet vanished instantly!");
|
|
MESSAGE("Wobbuffet used Phantom Force!");
|
|
break;
|
|
case MOVE_SHADOW_FORCE:
|
|
NOT MESSAGE("Wobbuffet vanished instantly!");
|
|
MESSAGE("Wobbuffet used Shadow Force!");
|
|
break;
|
|
}
|
|
} else {
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
}
|
|
if (B_UPDATED_MOVE_DATA < GEN_5)
|
|
{
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
MESSAGE("Wobbuffet flew up high!");
|
|
break;
|
|
case MOVE_DIG:
|
|
MESSAGE("Wobbuffet dug a hole!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
MESSAGE("Wobbuffet sprang up!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
MESSAGE("Wobbuffet hid underwater!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
case MOVE_SHADOW_FORCE:
|
|
MESSAGE("Wobbuffet vanished instantly!");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
|
|
// Aerial Ace cannot miss unless the target is semi-invulnerable
|
|
MESSAGE("Foe Wobbuffet used Aerial Ace!");
|
|
MESSAGE("Foe Wobbuffet's attack missed!");
|
|
// Attack turn
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
MESSAGE("Wobbuffet used Fly!");
|
|
break;
|
|
case MOVE_DIG:
|
|
MESSAGE("Wobbuffet used Dig!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
MESSAGE("Wobbuffet used Bounce!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
MESSAGE("Wobbuffet used Dive!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
MESSAGE("Wobbuffet used Phantom Force!");
|
|
break;
|
|
case MOVE_SHADOW_FORCE:
|
|
MESSAGE("Wobbuffet used Shadow Force!");
|
|
break;
|
|
}
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
HP_BAR(opponent);
|
|
}
|
|
}
|
|
|
|
SINGLE_BATTLE_TEST("Semi-invulnerable moves don't need to charge with Power Herb")
|
|
{
|
|
u16 move;
|
|
|
|
PARAMETRIZE { move = MOVE_FLY; }
|
|
PARAMETRIZE { move = MOVE_DIG; }
|
|
PARAMETRIZE { move = MOVE_BOUNCE; }
|
|
PARAMETRIZE { move = MOVE_DIVE; }
|
|
PARAMETRIZE { move = MOVE_PHANTOM_FORCE; }
|
|
PARAMETRIZE { move = MOVE_SHADOW_FORCE; }
|
|
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET) { Item(ITEM_POWER_HERB); }
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, move); }
|
|
} SCENE {
|
|
// Charging turn
|
|
if (B_UPDATED_MOVE_DATA >= GEN_5)
|
|
{
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
NOT MESSAGE("Wobbuffet flew up high!");
|
|
MESSAGE("Wobbuffet used Fly!");
|
|
break;
|
|
case MOVE_DIG:
|
|
NOT MESSAGE("Wobbuffet dug a hole!");
|
|
MESSAGE("Wobbuffet used Dig!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
NOT MESSAGE("Wobbuffet sprang up!");
|
|
MESSAGE("Wobbuffet used Bounce!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
NOT MESSAGE("Wobbuffet hid underwater!");
|
|
MESSAGE("Wobbuffet used Dive!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
NOT MESSAGE("Wobbuffet vanished instantly!");
|
|
MESSAGE("Wobbuffet used Phantom Force!");
|
|
break;
|
|
case MOVE_SHADOW_FORCE:
|
|
NOT MESSAGE("Wobbuffet vanished instantly!");
|
|
MESSAGE("Wobbuffet used Shadow Force!");
|
|
break;
|
|
}
|
|
} else {
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
}
|
|
if (B_UPDATED_MOVE_DATA < GEN_5)
|
|
{
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
MESSAGE("Wobbuffet flew up high!");
|
|
break;
|
|
case MOVE_DIG:
|
|
MESSAGE("Wobbuffet dug a hole!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
MESSAGE("Wobbuffet sprang up!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
MESSAGE("Wobbuffet hid underwater!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
case MOVE_SHADOW_FORCE:
|
|
MESSAGE("Wobbuffet vanished instantly!");
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
MESSAGE("Wobbuffet became fully charged due to its Power Herb!");
|
|
if (B_UPDATED_MOVE_DATA < GEN_5)
|
|
{
|
|
switch (move)
|
|
{
|
|
case MOVE_FLY:
|
|
MESSAGE("Wobbuffet used Fly!");
|
|
break;
|
|
case MOVE_DIG:
|
|
MESSAGE("Wobbuffet used Dig!");
|
|
break;
|
|
case MOVE_BOUNCE:
|
|
MESSAGE("Wobbuffet used Bounce!");
|
|
break;
|
|
case MOVE_DIVE:
|
|
MESSAGE("Wobbuffet used Dive!");
|
|
break;
|
|
case MOVE_PHANTOM_FORCE:
|
|
MESSAGE("Wobbuffet used Phantom Force!");
|
|
break;
|
|
case MOVE_SHADOW_FORCE:
|
|
MESSAGE("Wobbuffet used Shadow Force!");
|
|
break;
|
|
}
|
|
}
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
HP_BAR(opponent);
|
|
}
|
|
}
|
|
|
|
// No way to apply this test with Shadow Force/Phantom Force
|
|
SINGLE_BATTLE_TEST("Semi-invulnerable moves apply a status that won't block certain moves")
|
|
{
|
|
u16 move, opMove;
|
|
|
|
PARAMETRIZE { move = MOVE_FLY; opMove = MOVE_SKY_UPPERCUT; }
|
|
PARAMETRIZE { move = MOVE_DIG; opMove = MOVE_EARTHQUAKE; }
|
|
PARAMETRIZE { move = MOVE_BOUNCE; opMove = MOVE_THUNDER; }
|
|
PARAMETRIZE { move = MOVE_DIVE; opMove = MOVE_SURF; }
|
|
|
|
GIVEN {
|
|
PLAYER(SPECIES_WOBBUFFET);
|
|
OPPONENT(SPECIES_WOBBUFFET);
|
|
} WHEN {
|
|
TURN { MOVE(player, move); MOVE(opponent, opMove); }
|
|
} SCENE {
|
|
ANIMATION(ANIM_TYPE_MOVE, move, player);
|
|
ANIMATION(ANIM_TYPE_MOVE, opMove, opponent);
|
|
HP_BAR(player);
|
|
}
|
|
}
|