#ifndef GUARD_MOVES_H
#define GUARD_MOVES_H

#include "constants/move.h"
#include "constants/move_id.h"

void LoadWazaParameters(void);
u8 sub_809287C(struct Move *move);
void InitPokemonMove(struct Move *move, u16 moveID);
void sub_8092AA8(struct Move *move, u16 moveID);
void InitZeroedPPPokemonMove(struct Move *move, u16 moveID);
s16 GetMoveTargetAndRange(struct Move *move, u32 isAI);
u8 GetMoveType(struct Move *move);
u8* GetLevelUpMoves(s16 species);
u8* GetHMTMMoves(s16 species);
u8 GetMoveAIWeight(struct Move *move);
u32 GetMoveNumberOfChainedHits(struct Move *move);
s32 GetMoveBasePower(struct Move *move);
s32 GetMoveAccuracyOrAIChance(struct Move *move, u32 accuracyType);
u32 GetMoveBasePP(struct Move *move);
u32 GetMoveMaxUpgradeLevel(struct Move *move);
u32 GetMoveCritChance(struct Move *move);
bool8 MoveCannotHitFrozen(struct Move *move);
bool8 MovesIgnoresTaunted(struct Move *move);
u32 GetMoveRangeID(struct Move *move);
void sub_8092C84(u8 *buffer, u16 moveID);
u8 *GetMoveUseText(u16 moveID);
bool8 IsReflectedByMagicCoat(u16 moveID);
bool8 CanBeSnatched(u16 moveID);
bool8 FailsWhileMuzzled(u16 moveID);
bool8 IsSoundMove(struct Move *move);
bool8 DoesMoveCharge(u16 move);

bool8 IsAnyMoveLinked(int unused, struct Move* moves);
bool8 IsNextMoveLinked(int index, struct Move* moves);
void RemoveLinkSequenceFromMoves8(struct Move* moves, int index);
int GetLinkedSequence(int index, struct Move* moves, u16* sequenceMoveIDs);
void unk_CopyMoves4To8(struct Move* destMoves, struct Move* srcMoves);
void sub_8094060(struct Move* srcMoves, struct Move* destMoves);

void unk_FixLinkedMovesSetEnabled8_v2(struct Move* move);

void sub_8092D54(u8 *buffer, struct Move *move);
extern void CopyAndResetMove(struct Move *, struct Move *);

void unk_GetLinkedSequences4(struct Move* moves, struct Move linkedSequences[4][4]);
void unk_LinkedSequencesToMoves4(struct Move* moves, struct Move linkedSequences[4][4]);
void unk_GetLinkedSequences8(struct Move* moves, struct Move linkedSequences[8][8]);
void unk_LinkedSequencesToMoves8(struct Move* moves, struct Move linkedSequences[8][8]);
void unk_GetLinkedSequences8_v2(struct Move* moves, struct Move linkedSequences[8][8]);
void unk_LinkedSequencesToMoves8_v2(struct Move* moves, struct Move linkedSequences[8][8]);

int unk_FindMarkedMoveInLinkedSequences44(struct Move linkedSequences[4][4]);
void unk_LinkedSequencesToMoves4(struct Move* moves, struct Move linkedSequences[4][4]);
int unk_FindMarkedMoveInLinkedSequences88(struct Move linkedSequences[8][8]);
void unk_LinkedSequencesToMoves8(struct Move* moves, struct Move linkedSequences[8][8]);
int unk_FindMarkedMoveInLinkedSequences88_v2(struct Move linkedSequences[8][8]);
void unk_LinkedSequencesToMoves8_v2(struct Move* moves, struct Move linkedSequences[8][8]);


#endif // GUARD_MOVES_H
