#include "global.h"
#include "called_move_data.h"
#include "constants/move_id.h"

extern bool8 sub_8057634(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 YawnMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 NightmareMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805783C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 EncoreMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057974(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 PainSplitMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 TormentMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057BC4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057C88(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 WhirlpoolMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057D7C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057D9C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 SmokescreenMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057FCC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8057FF4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805805C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805816C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058270(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80582C4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80583D8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058430(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058478(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80584C0(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058548(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058580(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 BrickBreakMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058638(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80586DC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058770(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80587E8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058838(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058858(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80588B8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80588F4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058930(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058A18(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058BF0(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058E5C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8058FBC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80590D4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059190(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80591E4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 SkillSwapMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059424(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805946C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059528(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059540(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80595A0(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80595EC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_80598CC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059928(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059988(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059A2C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059AA8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059AB8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059AF8(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059D00(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059D48(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059D98(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059DA4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059DB4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059DC4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059E0C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 TriAttackMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A120(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A210(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A258(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A2A0(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 RolePlayMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A3DC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A464(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 CurseMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A568(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 TickleMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A688(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 KnockOffMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 SecretPowerMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AC90(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AD04(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AD34(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AD54(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AE3C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AE74(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AECC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 PresentMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805AFA4(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B028(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B074(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B0BC(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B17C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 WrapMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B264(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B324(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 DestinyBondMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B388(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B3E0(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B454(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 MimicMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B53C(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 LeechSeedMoveAction(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B668(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B910(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805B808(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_805A408(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 HandleRegularDamagingMove(Entity *pokemon, Entity *target, Move *move, s32 param_4);
extern bool8 sub_8059050(Entity *pokemon, Entity *target, Move *move, s32 param_4);

// Todo: move this data to some better place once the file structure is better understood

// These are random
const struct CalledMove gMetronomeCalledMoves[METRONOME_AVAILABLE_CALLED_MOVES] =
{
    {MOVE_IRON_TAIL, sub_8057634},
    {MOVE_YAWN, YawnMoveAction},
    {MOVE_NIGHTMARE, NightmareMoveAction},
    {MOVE_CHARM, sub_805783C},
    {MOVE_ENCORE, EncoreMoveAction},
    {MOVE_SUPER_FANG, sub_8057974},
    {MOVE_PAIN_SPLIT, PainSplitMoveAction},
    {MOVE_TORMENT, TormentMoveAction},
    {MOVE_SWAGGER, sub_8057BC4},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_WHIRLPOOL, WhirlpoolMoveAction},
    {MOVE_FAKE_TEARS, sub_8057D7C},
    {MOVE_SPITE, sub_8057D9C},
    {MOVE_SMOKESCREEN, SmokescreenMoveAction},
    {MOVE_FLATTER, sub_8057FCC},
    {MOVE_WILL_O_WISP, sub_8057FF4},
    {MOVE_RETURN, sub_805805C},
    {MOVE_FLAME_WHEEL, sub_805816C},
    {MOVE_GUST, sub_8058270},
    {MOVE_DISABLE, sub_80582C4},
    {MOVE_CRUNCH, sub_80583D8},
    {MOVE_BITE, sub_8058430},
    {MOVE_THUNDER, sub_8058478},
    {MOVE_ENDEAVOR, sub_80584C0},
    {MOVE_FACADE, sub_8058548},
    {MOVE_CONSTRICT, sub_8058580},
    {MOVE_BRICK_BREAK, BrickBreakMoveAction},
    {MOVE_ROCK_TOMB, sub_8058638},
    {MOVE_GIGA_DRAIN, sub_80586DC},
    {MOVE_REVERSAL, sub_8058770},
    {MOVE_SMELLINGSALT, sub_80587E8},
    {MOVE_METAL_SOUND, sub_8058838},
    {MOVE_TICKLE, sub_8058858},
    {MOVE_OUTRAGE, sub_80588B8},
    {MOVE_LOW_KICK, sub_80588F4},
    {MOVE_ANCIENTPOWER, sub_8058930},
    {MOVE_RAPID_SPIN, sub_8058A18},
    {MOVE_SCARY_FACE, sub_8058BF0},
    {MOVE_SUBMISSION, sub_8058E5C},
    {MOVE_LICK, sub_8058FBC},
    {MOVE_FISSURE, sub_80590D4},
    {MOVE_EXTRASENSORY, sub_8059190},
    {MOVE_ABSORB, sub_80591E4},
    {MOVE_SKILL_SWAP, SkillSwapMoveAction},
    {MOVE_HEADBUTT, sub_8059424},
    {MOVE_DOUBLE_EDGE, sub_805946C},
    {MOVE_SAND_ATTACK, sub_8059528},
    {MOVE_SMOG, sub_8059540},
    {MOVE_SACRED_FIRE, sub_80595A0},
    {MOVE_SHEER_COLD, sub_80595EC},
    {MOVE_MUDDY_WATER, sub_80598CC},
    {MOVE_TWISTER, sub_8059928},
    {MOVE_TWINEEDLE, sub_8059988},
    {MOVE_SEISMIC_TOSS, sub_8059A2C},
    {MOVE_SUPERSONIC, sub_8059AA8},
    {MOVE_TAUNT, sub_8059AB8},
    {MOVE_HORN_DRILL, sub_8059AF8},
    {MOVE_THUNDERSHOCK, sub_8059D00},
    {MOVE_THUNDER_WAVE, sub_8059D48},
    {MOVE_BLOCK, sub_8059D98},
    {MOVE_POISON_GAS, sub_8059DA4},
    {MOVE_TOXIC, sub_8059DB4},
    {MOVE_POISON_FANG, sub_8059DC4},
    {MOVE_POISON_STING, sub_8059E0C},
    {MOVE_TRI_ATTACK, TriAttackMoveAction},
    {MOVE_TRICK, sub_805A120},
    {MOVE_TRIPLE_KICK, sub_805A210},
    {MOVE_MUD_SLAP, sub_805A258},
    {MOVE_THIEF, sub_805A2A0},
    {MOVE_ROLE_PLAY, RolePlayMoveAction},
    {MOVE_LEER, sub_805A3DC},
    {MOVE_PAY_DAY, sub_805A464},
    {MOVE_CURSE, CurseMoveAction},
    {MOVE_FRENZY_PLANT, sub_805A568},
    {MOVE_SUPERPOWER, TickleMoveAction},
    {MOVE_DYNAMICPUNCH, sub_805A688},
    {MOVE_KNOCK_OFF, KnockOffMoveAction},
    {MOVE_SECRET_POWER, SecretPowerMoveAction},
    {MOVE_DIZZY_PUNCH, sub_805AC90},
    {MOVE_IMPRISON, sub_805AD04},
    {MOVE_FEATHERDANCE, sub_805AD34},
    {MOVE_BEAT_UP, sub_805AD54},
    {MOVE_BLAST_BURN, sub_805AE3C},
    {MOVE_CRUSH_CLAW, sub_805AE74},
    {MOVE_BLAZE_KICK, sub_805AECC},
    {MOVE_PRESENT, PresentMoveAction},
    {MOVE_ERUPTION, sub_805AFA4},
    {MOVE_GLARE, sub_805B028},
    {MOVE_POISON_TAIL, sub_805B074},
    {MOVE_ROAR, sub_805B0BC},
    {MOVE_FIRE_SPIN, sub_805B17C},
    {MOVE_WRAP, WrapMoveAction},
    {MOVE_MAGNITUDE, sub_805B264},
    {MOVE_MIST_BALL, sub_805B324},
    {MOVE_DESTINY_BOND, DestinyBondMoveAction},
    {MOVE_FALSE_SWIPE, sub_805B388},
    {MOVE_HIDDEN_POWER, sub_805B3E0},
    {MOVE_ATTRACT, sub_805B454},
    {MOVE_MIMIC, MimicMoveAction},
    {MOVE_FRUSTRATION, sub_805B53C},
    {MOVE_LEECH_SEED, LeechSeedMoveAction},
    {MOVE_DREAM_EATER, sub_805B668},
    {MOVE_LUSTER_PURGE, sub_805B910},
    {MOVE_DRAGON_RAGE, sub_805B808},
    {MOVE_FAKE_OUT, sub_805A408},
};

// These correspond to dungeon's tileset id
const struct CalledMove gNaturePowerCalledMoves[] =
{
    {MOVE_SURF, HandleRegularDamagingMove},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_EARTHQUAKE, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_EARTHQUAKE, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_RAZOR_LEAF, HandleRegularDamagingMove},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_RAZOR_LEAF, HandleRegularDamagingMove},
    {MOVE_RAZOR_LEAF, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_EARTHQUAKE, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SURF, HandleRegularDamagingMove},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_EARTHQUAKE, HandleRegularDamagingMove},
    {MOVE_BUBBLEBEAM, sub_8058580},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_SHADOW_BALL, sub_80583D8},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_STUN_SPORE, sub_8059050},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_RAZOR_LEAF, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, sub_8057C88},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SWIFT, HandleRegularDamagingMove},
    {MOVE_SURF, HandleRegularDamagingMove},
    {MOVE_SURF, HandleRegularDamagingMove},
    {MOVE_ROCK_SLIDE, HandleRegularDamagingMove},
};

//
