summaryrefslogtreecommitdiff
path: root/src/moves.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/moves.c')
-rw-r--r--src/moves.c336
1 files changed, 336 insertions, 0 deletions
diff --git a/src/moves.c b/src/moves.c
new file mode 100644
index 0000000..0f59f0b
--- /dev/null
+++ b/src/moves.c
@@ -0,0 +1,336 @@
+#include "global.h"
+#include "file_system.h"
+#include "constants/move.h"
+#include "constants/move_id.h"
+
+struct MoveDataFile
+{
+ struct MoveData *moveData;
+ u8 *unk4; // unsure of this struct's structure yet
+};
+
+struct unkStruct_80928C0
+{
+ u32 unk0;
+ u32 unk4;
+ u8 unk8;
+ u8 unk9;
+};
+
+extern struct unkStruct_80928C0 gUnknown_81098C4;
+extern struct FileArchive gSystemFileArchive;
+extern struct OpenedFile *gWazaParametersFile;
+extern struct MoveData *gMovesData;
+extern u8 *gMovesRelated_2038C6C;
+
+extern u8 gUnknown_81098D0[];
+extern u8 gUnknown_81098DC[];
+extern u8 gUnknown_810990C[];
+extern u8 gUnknown_8109908[];
+extern u8 gUnknown_8109928[];
+extern u8 gUnknown_8109910[];
+extern u8 gUnknown_81098E0[];
+extern u8 gUnknown_81098EC[];
+extern u8 *gRangeNames[];
+extern u8 gUnknown_810992C[];
+
+extern void sub_8093F10(struct PokemonMove *, struct PokemonMove *);
+extern void sub_80928C0(u8 *, struct PokemonMove *, struct unkStruct_80928C0 *);
+extern u32 GetMoveMaxPP(struct PokemonMove*);
+bool8 DoesMoveCharge(u16 move);
+extern void ExpandPlaceholdersBuffer(u8 *, u8 *, ...);
+
+void LoadWazaParameters(void)
+{
+ gWazaParametersFile = OpenFileAndGetFileDataPtr(gUnknown_81098D0, &gSystemFileArchive);
+
+ gMovesData = ((struct MoveDataFile *)(gWazaParametersFile->data))->moveData;
+ gMovesRelated_2038C6C = ((struct MoveDataFile *)(gWazaParametersFile->data))->unk4;
+}
+
+u8 sub_809287C(struct PokemonMove *move)
+{
+ if((move->moveFlags & MOVE_FLAG_DISABLED) != 0)
+ return 0x32;
+ else if((move->sealed & 1) == 0)
+ return 0x34;
+ else
+ return 0x32;
+}
+
+void sub_80928A0(u8 *buffer, struct PokemonMove *move, struct unkStruct_80928C0 *r2)
+{
+ struct PokemonMove stack;
+ sub_8093F10(&stack, move);
+ sub_80928C0(buffer, &stack, r2);
+}
+
+void sub_80928C0(u8 *buffer, struct PokemonMove *move, struct unkStruct_80928C0 *param_3)
+{
+ u32 uVar2;
+ u32 maxPP;
+ u8 localBuffer[12];
+
+ uVar2 = sub_809287C(move);
+ if (param_3 == NULL) {
+ param_3 = &gUnknown_81098C4;
+ }
+
+ if (move->powerBoost != 0)
+ ExpandPlaceholdersBuffer(localBuffer,gUnknown_81098DC,move->powerBoost); // %+d
+ else
+ localBuffer[0] = '\0';
+
+ if (param_3->unk8 != 0) {
+ uVar2 = 2;
+ }
+ if (param_3->unk9 != 0 && DoesMoveCharge(move->moveID)) {
+ uVar2 = 2;
+ }
+ switch(param_3->unk0) {
+ case 0:
+ ExpandPlaceholdersBuffer
+ (buffer,gUnknown_81098E0,uVar2,
+ gMovesData[move->moveID].namePointer,localBuffer);
+ break;
+
+ case 1:
+ maxPP = GetMoveMaxPP(move);
+ ExpandPlaceholdersBuffer
+ (buffer,gUnknown_81098EC,uVar2,move->moveFlags & MOVE_FLAG_SET ? gUnknown_8109908 : gUnknown_810990C,
+ gMovesData[move->moveID].namePointer,localBuffer,param_3->unk4,
+ move->pp,maxPP);
+ break;
+
+ case 2:
+ maxPP = GetMoveMaxPP(move);
+ ExpandPlaceholdersBuffer
+ (buffer,gUnknown_8109910,uVar2,move->moveFlags & MOVE_FLAG_SET ? gUnknown_8109908 : gUnknown_810990C,
+ gMovesData[move->moveID].namePointer,localBuffer,param_3->unk4,
+ move->pp,maxPP);
+ break;
+
+ case 3:
+ maxPP = GetMoveMaxPP(move);
+ ExpandPlaceholdersBuffer
+ (buffer,gUnknown_81098EC,uVar2,move->moveFlags & MOVE_FLAG_ENABLED ? gUnknown_8109928 : gUnknown_810990C,
+ gMovesData[move->moveID].namePointer,localBuffer,param_3->unk4,
+ move->pp,maxPP);
+ break;
+
+ case 4:
+ maxPP = GetMoveMaxPP(move);
+ ExpandPlaceholdersBuffer
+ (buffer,gUnknown_8109910,uVar2, move->moveFlags & MOVE_FLAG_ENABLED ? gUnknown_8109928 : gUnknown_810990C,
+ gMovesData[move->moveID].namePointer,localBuffer,param_3->unk4,
+ move->pp,maxPP);
+ break;
+ }
+}
+
+void InitPokemonMove(struct PokemonMove *move, u16 moveID)
+{
+ move->moveFlags = MOVE_FLAG_ENABLED | MOVE_FLAG_EXISTS;
+ move->sealed = FALSE;
+ move->moveID = moveID;
+ move->pp = GetMoveMaxPP(move);
+ move->powerBoost = 0;
+}
+
+void sub_8092AA8(struct PokemonMove *move, u16 moveID)
+{
+ if(moveID == 0)
+ move->moveFlags = 0;
+ else
+ {
+ move->moveFlags = MOVE_FLAG_ENABLED | MOVE_FLAG_EXISTS;
+ move->sealed = FALSE;
+ move->moveID = moveID;
+ move->pp = GetMoveMaxPP(move);
+ move->powerBoost = 0;
+ }
+}
+
+void InitZeroedPPPokemonMove(struct PokemonMove *move, u16 moveID)
+{
+ move->moveFlags = MOVE_FLAG_ENABLED | MOVE_FLAG_EXISTS;
+ move->moveID = moveID;
+ move->pp = 0;
+}
+
+s16 GetMoveTargetingFlags(struct PokemonMove *move, u32 r1)
+{
+ return gMovesData[move->moveID].targetingFlags[r1];
+}
+
+u8 GetMoveType(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].type;
+}
+
+NAKED
+void sub_8092B18(s16 species)
+{
+ asm_unified("\tpush {lr}\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r1, r0, 16\n"
+ "\tadds r2, r1, 0\n"
+ "\tldr r0, _08092B40\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _08092B48\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _08092B48\n"
+ "\tmovs r0, 0xD2\n"
+ "\tlsls r0, 1\n"
+ "\tcmp r2, r0\n"
+ "\tbeq _08092B48\n"
+ "\tldr r0, _08092B44\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0]\n"
+ "\tb _08092B4A\n"
+ "\t.align 2, 0\n"
+"_08092B40: .4byte 0x000001a5\n"
+"_08092B44: .4byte gMovesRelated_2038C6C\n"
+"_08092B48:\n"
+ "\tldr r0, _08092B50\n"
+"_08092B4A:\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.align 2, 0\n"
+"_08092B50: .4byte gUnknown_810992B");
+}
+
+NAKED
+void sub_8092B54(s16 species)
+{
+ asm_unified("\tpush {lr}\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r1, r0, 16\n"
+ "\tadds r2, r1, 0\n"
+ "\tldr r0, _08092B7C\n"
+ "\tcmp r1, r0\n"
+ "\tbeq _08092B84\n"
+ "\tcmp r1, 0\n"
+ "\tbeq _08092B84\n"
+ "\tmovs r0, 0xD2\n"
+ "\tlsls r0, 1\n"
+ "\tcmp r2, r0\n"
+ "\tbeq _08092B84\n"
+ "\tldr r0, _08092B80\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tadds r0, r1\n"
+ "\tldr r0, [r0, 0x4]\n"
+ "\tb _08092B86\n"
+ "\t.align 2, 0\n"
+"_08092B7C: .4byte 0x000001a5\n"
+"_08092B80: .4byte gMovesRelated_2038C6C\n"
+"_08092B84:\n"
+ "\tldr r0, _08092B8C\n"
+"_08092B86:\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.align 2, 0\n"
+"_08092B8C: .4byte gUnknown_810992B");
+}
+
+u8 GetMoveWeight(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].weight;
+}
+
+u8 GetMoveHitCount(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].hitCount;
+}
+
+s16 GetMovePower(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].power;
+}
+
+u8 GetMoveAccuracy(struct PokemonMove *move, u32 r1)
+{
+ return gMovesData[move->moveID].accuracy[r1];
+}
+
+u32 GetMoveMaxPP(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].maxPP;
+}
+
+u8 GetMoveUnk12(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].unk12;
+}
+
+u8 GetMoveCriticalHitChance(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].criticalHitChance;
+}
+
+u8 GetMoveCannotHitFrozen(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].cannotHitFrozen;
+}
+
+u8 GetMoveDealsDirectDamage(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].dealsDirectDamage;
+}
+
+u32 GetMoveRangeType(struct PokemonMove *move)
+{
+ return gMovesData[move->moveID].rangeType;
+}
+
+void sub_8092C84(u8 *buffer, u16 moveID)
+{
+ struct PokemonMove stack;
+ InitPokemonMove(&stack, moveID);
+ sub_80928C0(buffer, &stack, NULL);
+}
+
+u8 *GetMoveUseText(u16 moveID)
+{
+ return gMovesData[moveID].useText;
+}
+
+u8 GetMoveAffectedByMagicCoat(u16 moveID)
+{
+ return gMovesData[moveID].affectedByMagicCoat;
+}
+
+u8 GetMoveTargetsUser(u16 moveID)
+{
+ return gMovesData[moveID].targetsUser;
+}
+
+u8 GetMoveAffectedByMuzzled(u16 moveID)
+{
+ return gMovesData[moveID].affectedByMuzzled;
+}
+
+bool8 IsBlockedBySoundproof(struct PokemonMove *move)
+{
+ if(move->moveID == MOVE_GROWL) return TRUE;
+ if(move->moveID == MOVE_ROAR) return TRUE;
+ if(move->moveID == MOVE_METAL_SOUND) return TRUE;
+ if(move->moveID == MOVE_SING) return TRUE;
+ if(move->moveID == MOVE_GRASSWHISTLE) return TRUE;
+ if(move->moveID == MOVE_SUPERSONIC) return TRUE;
+ if(move->moveID == MOVE_PERISH_SONG) return TRUE;
+ if(move->moveID == MOVE_SCREECH) return TRUE;
+ if(move->moveID == MOVE_HYPER_VOICE) return TRUE;
+ if(move->moveID == MOVE_SNORE) return TRUE;
+ if(move->moveID == MOVE_HEAL_BELL) return TRUE;
+
+ return FALSE;
+}
+
+void sub_8092D54(u8 *buffer, struct PokemonMove *move)
+{
+ ExpandPlaceholdersBuffer(buffer, gUnknown_810992C, gRangeNames[GetMoveRangeType(move)]);
+}