summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-01-29 20:59:54 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2017-01-29 17:59:54 -0800
commitb6b5453431af46791fd9d211efac64464c1dff85 (patch)
tree44148fc13d5f707e426016ac33b8c34f4b6df948 /src
parent047c35d6f1ff8888cd25d449d544ce898e0b9fec (diff)
start decompiling mauville_old_man.c (#225)
* some labels and enumerate player speeds * clear up speed enums * GetPlayerSpeed * oops * start decompiling mauville_old_man.c * formatting * decompile more of mauville_old_man.c * someone fix this please * formatting * make ROM build again * formatting again
Diffstat (limited to 'src')
-rw-r--r--src/bike.c35
-rw-r--r--src/field_control_avatar.c2
-rw-r--r--src/field_map_obj.c2
-rw-r--r--src/field_player_avatar.c4
-rw-r--r--src/mauville_old_man.c407
5 files changed, 434 insertions, 16 deletions
diff --git a/src/bike.c b/src/bike.c
index bd4c2e411..a1a3fded9 100644
--- a/src/bike.c
+++ b/src/bike.c
@@ -84,6 +84,16 @@ static void (*const gUnknown_083DB5A4[])(u8) =
sub_80593F4,
};
+// Player speeds
+enum
+{
+ SPEED_STANDING,
+ SPEED_NORMAL,
+ SPEED_FAST,
+ SPEED_FASTER,
+ SPEED_FASTEST,
+};
+
//Acro bike states
enum
{
@@ -132,7 +142,7 @@ static u8 (*const sAcroBikeInputHandlers[])(u8 *, u16, u16) =
AcroBikeHandleInputState6,
};
-const u16 gUnknown_083DB600[] = {1, 2, 4};
+const u16 gMachBikeSpeeds[] = {SPEED_NORMAL, SPEED_FAST, SPEED_FASTEST};
static const u8 Unknown_3DB606[] = {4, 0};
static const struct UnknownStruct1 gUnknown_083DB608[] =
@@ -243,7 +253,7 @@ static void MachBikeTransition_80E51C4(u8 direction)
{
gUnknown_083DB5A4[gPlayerAvatar.bikeFrameCounter](direction);
gPlayerAvatar.unkB = gPlayerAvatar.bikeFrameCounter + (gPlayerAvatar.bikeFrameCounter >> 1); // same as dividing by 2, but compiler is insistent on >> 1
- if (gPlayerAvatar.bikeFrameCounter < 2)
+ if (gPlayerAvatar.bikeFrameCounter < 2) // do not go faster than the last element in the mach bike array
gPlayerAvatar.bikeFrameCounter++;
}
}
@@ -882,7 +892,7 @@ static u8 sub_80E5DA0(struct MapObject *mapObject, s16 x, s16 y, u8 direction, u
return collision;
}
-bool8 sub_80E5DEC(u8 tile)
+bool8 IsRunningDisallowed(u8 tile)
{
if (IsRunningDisallowedByMetatile(tile) != FALSE || gMapHeader.mapType == MAP_TYPE_INDOOR)
return TRUE;
@@ -975,8 +985,8 @@ void GetOnOffBike(u8 var)
else
{
SetPlayerAvatarTransitionFlags(var);
- sav1_set_battle_music_maybe(0x193);
- sub_8053FB0(0x193);
+ sav1_set_battle_music_maybe(BGM_CYCLING);
+ sub_8053FB0(BGM_CYCLING);
}
}
@@ -1010,20 +1020,21 @@ static void sub_80E6024(void)
gPlayerAvatar.unkB = 0;
}
-s16 sub_80E6034(void)
+s16 GetPlayerSpeed(void)
{
- s16 arr[3];
+ // because the player pressed a direction, it won't ever return a speed of 0 since this function returns the player's current speed.
+ s16 machSpeeds[3];
- memcpy(arr, gUnknown_083DB600, sizeof(arr));
+ memcpy(machSpeeds, gMachBikeSpeeds, sizeof(machSpeeds));
if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE)
- return arr[gPlayerAvatar.bikeFrameCounter];
+ return machSpeeds[gPlayerAvatar.bikeFrameCounter];
else if (gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_ACRO_BIKE)
- return 3;
+ return SPEED_FASTER;
else if (gPlayerAvatar.flags & (PLAYER_AVATAR_FLAG_SURFING | PLAYER_AVATAR_FLAG_DASH))
- return 2;
+ return SPEED_FAST;
else
- return 1;
+ return SPEED_NORMAL;
}
void sub_80E6084(void)
diff --git a/src/field_control_avatar.c b/src/field_control_avatar.c
index f05959a79..992e461eb 100644
--- a/src/field_control_avatar.c
+++ b/src/field_control_avatar.c
@@ -137,7 +137,7 @@ void FieldGetPlayerInput(struct FieldInput *input, u16 newKeys, u16 heldKeys)
if ((r6 == 2 && forcedMove == FALSE) || r6 == 0)
{
- if (sub_80E6034() != 4)
+ if (GetPlayerSpeed() != 4)
{
if (newKeys & START_BUTTON)
input->pressedStartButton = TRUE;
diff --git a/src/field_map_obj.c b/src/field_map_obj.c
index 20c56a122..010ac4c3e 100644
--- a/src/field_map_obj.c
+++ b/src/field_map_obj.c
@@ -411,6 +411,6 @@ void npc_hide_all_but_player(void)
for (i = 0; i < 16; i++)
{
if (i != gPlayerAvatar.mapObjectId)
- RemoveFieldObject(&gFieldObjects[i]);
+ RemoveFieldObject(&gMapObjects[i]);
}
}
diff --git a/src/field_player_avatar.c b/src/field_player_avatar.c
index bab172152..ae7dd7d62 100644
--- a/src/field_player_avatar.c
+++ b/src/field_player_avatar.c
@@ -489,7 +489,7 @@ u8 ForcedMovement_MuddySlope(void)
{
struct MapObject *playerMapObj = &gMapObjects[gPlayerAvatar.mapObjectId];
- if (playerMapObj->placeholder18 != 2 || sub_80E6034() <= 3)
+ if (playerMapObj->placeholder18 != 2 || GetPlayerSpeed() <= 3)
{
sub_80E6010(0);
playerMapObj->mapobj_bit_9 = 1;
@@ -555,7 +555,7 @@ void sub_8058D0C(u8 direction, u16 heldKeys)
return;
}
if (!(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_4) && (heldKeys & B_BUTTON) && FlagGet(SYS_B_DASH)
- && sub_80E5DEC(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0)
+ && IsRunningDisallowed(gMapObjects[gPlayerAvatar.mapObjectId].mapobj_unk_1E) == 0)
{
sub_805940C(direction);
gPlayerAvatar.flags |= PLAYER_AVATAR_FLAG_DASH;
diff --git a/src/mauville_old_man.c b/src/mauville_old_man.c
new file mode 100644
index 000000000..82e936633
--- /dev/null
+++ b/src/mauville_old_man.c
@@ -0,0 +1,407 @@
+#include "global.h"
+#include "string_util.h"
+#include "menu.h"
+#include "script.h"
+#include "asm.h"
+#include "rng.h"
+
+extern u16 gScriptResult;
+extern u16 gSpecialVar_0x8004;
+
+extern void sub_80F83F8(void);
+extern void sub_81099CC(void);
+extern void sub_80F83D0(void);
+extern void sub_80F7F80(u8);
+extern u16 sub_80EB8EC(void);
+extern void sub_80F7DC0(void);
+extern u8 gOtherText_Is[];
+extern u8 gOtherText_DontYouAgree[];
+extern u32 gUnknown_083E5388[];
+extern u32 gUnknown_083E53A8[];
+
+extern u16 gUnknown_083E537C[];
+
+void sub_80F7A34(void)
+{
+ u16 i;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D94 = 0;
+ oldMan->oldMan1.unk_2DBD = 0;
+
+ for(i = 0; i < 6; i++)
+ oldMan->oldMan1.mauvilleOldMan_ecArray[i] = gUnknown_083E537C[i];
+}
+
+void sub_80F7A6C(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D94 = 1;
+ oldMan->oldMan1.unk_2D95 = 0;
+}
+
+void sub_80F7A7C(void)
+{
+ sub_80F83F8();
+}
+
+void sub_80F7A88(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D94 = 4;
+ oldMan->oldMan1.unk_2D95 = 0;
+}
+
+void sub_80F7A98(void)
+{
+ sub_81099CC();
+}
+
+void sub_80F7AA4(void)
+{
+ u32 var = ((u16)((gSaveBlock2.playerTrainerId[1] << 8 | gSaveBlock2.playerTrainerId[0])) % 10) / 2;
+
+ switch(var)
+ {
+ case 0:
+ sub_80F7A34();
+ break;
+ case 1:
+ sub_80F7A6C();
+ break;
+ case 2:
+ sub_80F7A98();
+ break;
+ case 3:
+ sub_80F7A7C();
+ break;
+ case 4:
+ sub_80F7A88();
+ break;
+ }
+ sub_80F83D0();
+}
+
+u8 GetCurrentMauvilleOldMan(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ return oldMan->oldMan1.unk_2D94;
+}
+
+void sub_80F7B14(void)
+{
+ gScriptResult = GetCurrentMauvilleOldMan();
+}
+
+void sub_80F7B2C(void)
+{
+ u16 *scriptPtr = &gScriptResult; // why??
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ *scriptPtr = oldMan->oldMan1.unk_2DBD;
+}
+
+void sub_80F7B40(void)
+{
+ u16 i;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+ //struct UnkMauvilleOldManStruct *oldManStruct = &gSaveBlock1.oldManStruct;
+
+ StringCopy(oldMan->oldMan1.playerName, gSaveBlock2.playerName);
+
+ for(i = 0; i < 4; i++)
+ oldMan->oldMan1.playerTrainerId[i] = gSaveBlock2.playerTrainerId[i];
+
+ for(i = 0; i < 6; i++)
+ oldMan->oldMan1.mauvilleOldMan_ecArray[i] = oldMan->oldMan1.mauvilleOldMan_ecArray2[i];
+
+ oldMan->oldMan1.unk_2DBD = 1;
+}
+
+// too mathy
+__attribute__((naked))
+void sub_80F7BA0(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r7,lr}\n\
+ ldr r1, _080F7C48 @ =gSaveBlock1 + 0x2D94\n\
+ ldr r0, _080F7C4C @ =gSpecialVar_0x8004\n\
+ ldrh r0, [r0]\n\
+ adds r5, r1, 0\n\
+ adds r5, 0xE\n\
+ cmp r0, 0\n\
+ bne _080F7BB2\n\
+ adds r5, r1, 0x2\n\
+_080F7BB2:\n\
+ ldr r2, _080F7C50 @ =gStringVar4\n\
+ adds r4, r2, 0\n\
+ movs r6, 0\n\
+_080F7BB8:\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ adds r7, r6, 0x1\n\
+ cmp r2, r4\n\
+ beq _080F7BDA\n\
+ movs r1, 0x37\n\
+_080F7BCC:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7BD4\n\
+ strb r1, [r4]\n\
+_080F7BD4:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7BCC\n\
+_080F7BDA:\n\
+ adds r4, 0x1\n\
+ movs r0, 0\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ cmp r2, r4\n\
+ beq _080F7C02\n\
+ movs r1, 0x37\n\
+_080F7BF4:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7BFC\n\
+ strb r1, [r4]\n\
+_080F7BFC:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7BF4\n\
+_080F7C02:\n\
+ adds r4, 0x1\n\
+ movs r0, 0xFE\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ ldrh r1, [r5]\n\
+ adds r5, 0x2\n\
+ adds r0, r2, 0\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ cmp r2, r4\n\
+ beq _080F7C2A\n\
+ movs r1, 0x37\n\
+_080F7C1C:\n\
+ ldrb r0, [r4]\n\
+ cmp r0, 0\n\
+ bne _080F7C24\n\
+ strb r1, [r4]\n\
+_080F7C24:\n\
+ adds r4, 0x1\n\
+ cmp r2, r4\n\
+ bne _080F7C1C\n\
+_080F7C2A:\n\
+ cmp r6, 0\n\
+ bne _080F7C3A\n\
+ movs r0, 0xFC\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+ movs r0, 0xF\n\
+ strb r0, [r2]\n\
+ adds r2, 0x1\n\
+_080F7C3A:\n\
+ lsls r0, r7, 16\n\
+ lsrs r6, r0, 16\n\
+ cmp r6, 0x1\n\
+ bls _080F7BB8\n\
+ pop {r4-r7}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080F7C48: .4byte gSaveBlock1 + 0x2D94\n\
+_080F7C4C: .4byte gSpecialVar_0x8004\n\
+_080F7C50: .4byte gStringVar4\n\
+ .syntax divided");
+}
+
+void sub_80F7C54(void)
+{
+ sub_80F7F80(gSpecialVar_0x8004);
+ MenuDisplayMessageBox();
+ ScriptContext1_Stop();
+}
+
+void sub_80F7C70(void)
+{
+ u16 *scriptPtr = &gScriptResult; // again??
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ *scriptPtr = oldMan->oldMan1.unk_2D95;
+}
+
+void sub_80F7C84(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ oldMan->oldMan1.unk_2D95 = 1;
+}
+
+void sub_80F7C90(void)
+{
+ u16 var = sub_80EB8EC();
+
+ if(var == 0xFFFF)
+ {
+ gScriptResult = FALSE;
+ }
+ else
+ {
+ sub_80EB3FC(gStringVar1, var);
+ gScriptResult = TRUE;
+ }
+}
+
+void sub_80F7CC8(void)
+{
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ if(oldMan->oldMan1.unk_2D95 == 10)
+ {
+ gScriptResult = FALSE;
+ oldMan->oldMan1.unk_2D95 = 0;
+ }
+ else
+ gScriptResult = TRUE;
+}
+
+// someone fix this
+#ifdef NONMATCHING
+void sub_80F7CF4(void)
+{
+ u8 *stringPtr;
+ OldMan *oldMan = &gSaveBlock1.oldMan;
+
+ if(oldMan->oldMan2.unk1 == 0)
+ sub_80F7DC0();
+
+ if(oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1] != 0xFFFF) // is not the last element of the array?
+ {
+ int random = (u16)Random();
+ random &= 7;
+ sub_80EB3FC(gStringVar4, oldMan->oldMan2.mauvilleOldMan_ecArray[oldMan->oldMan2.unk1]);
+ stringPtr = StringCopy(gStringVar4, gOtherText_Is);
+ stringPtr = StringCopy(stringPtr, (u8 *)gUnknown_083E5388[random]);
+ StringCopy(stringPtr, gOtherText_DontYouAgree);
+ }
+ else
+ {
+ StringCopy(gStringVar4, (u8 *)gUnknown_083E53A8[oldMan->oldMan2.mauvilleOldMan_ecArray2[oldMan->oldMan2.unk2++]]);
+ }
+ if(!(Random() % 10))
+ oldMan->oldMan2.unk1 = 10;
+ else
+ oldMan->oldMan2.unk1++;
+
+ gScriptResult = TRUE;
+}
+#else
+__attribute__((naked))
+void sub_80F7CF4(void)
+{
+ asm(".syntax unified\n\
+ push {r4-r6,lr}\n\
+ ldr r5, _080F7D50 @ =gSaveBlock1 + 0x2D94\n\
+ ldrb r0, [r5, 0x1]\n\
+ cmp r0, 0\n\
+ bne _080F7D02\n\
+ bl sub_80F7DC0\n\
+_080F7D02:\n\
+ ldrb r0, [r5, 0x1]\n\
+ lsls r0, 1\n\
+ adds r6, r5, 0x4\n\
+ adds r0, r6\n\
+ ldrh r1, [r0]\n\
+ ldr r0, _080F7D54 @ =0x0000ffff\n\
+ cmp r1, r0\n\
+ beq _080F7D68\n\
+ bl Random\n\
+ adds r4, r0, 0\n\
+ lsls r4, 16\n\
+ lsrs r4, 16\n\
+ movs r0, 0x7\n\
+ ands r4, r0\n\
+ ldr r0, _080F7D58 @ =gStringVar4\n\
+ ldrb r1, [r5, 0x1]\n\
+ lsls r1, 1\n\
+ adds r1, r6\n\
+ ldrh r1, [r1]\n\
+ bl sub_80EB3FC\n\
+ adds r2, r0, 0\n\
+ ldr r1, _080F7D5C @ =gOtherText_Is\n\
+ bl StringCopy\n\
+ adds r2, r0, 0\n\
+ ldr r0, _080F7D60 @ =gUnknown_083E5388\n\
+ lsls r4, 2\n\
+ adds r4, r0\n\
+ ldr r1, [r4]\n\
+ adds r0, r2, 0\n\
+ bl StringCopy\n\
+ adds r2, r0, 0\n\
+ ldr r1, _080F7D64 @ =gOtherText_DontYouAgree\n\
+ bl StringCopy\n\
+ b _080F7D88\n\
+ .align 2, 0\n\
+_080F7D50: .4byte gSaveBlock1 + 0x2D94\n\
+_080F7D54: .4byte 0x0000ffff\n\
+_080F7D58: .4byte gStringVar4\n\
+_080F7D5C: .4byte gOtherText_Is\n\
+_080F7D60: .4byte gUnknown_083E5388\n\
+_080F7D64: .4byte gOtherText_DontYouAgree\n\
+_080F7D68:\n\
+ ldr r0, _080F7DA0 @ =gStringVar4\n\
+ ldr r3, _080F7DA4 @ =gUnknown_083E53A8\n\
+ ldrb r1, [r5, 0x2]\n\
+ adds r2, r1, 0x1\n\
+ strb r2, [r5, 0x2]\n\
+ lsls r1, 24\n\
+ lsrs r1, 24\n\
+ adds r2, r5, 0\n\
+ adds r2, 0x18\n\
+ adds r1, r2\n\
+ ldrb r1, [r1]\n\
+ lsls r1, 2\n\
+ adds r1, r3\n\
+ ldr r1, [r1]\n\
+ bl StringCopy\n\
+_080F7D88:\n\
+ bl Random\n\
+ lsls r0, 16\n\
+ lsrs r0, 16\n\
+ movs r1, 0xA\n\
+ bl __umodsi3\n\
+ lsls r0, 16\n\
+ cmp r0, 0\n\
+ bne _080F7DA8\n\
+ movs r0, 0xA\n\
+ b _080F7DAC\n\
+ .align 2, 0\n\
+_080F7DA0: .4byte gStringVar4\n\
+_080F7DA4: .4byte gUnknown_083E53A8\n\
+_080F7DA8:\n\
+ ldrb r0, [r5, 0x1]\n\
+ adds r0, 0x1\n\
+_080F7DAC:\n\
+ strb r0, [r5, 0x1]\n\
+ ldr r1, _080F7DBC @ =gScriptResult\n\
+ movs r0, 0x1\n\
+ strh r0, [r1]\n\
+ pop {r4-r6}\n\
+ pop {r0}\n\
+ bx r0\n\
+ .align 2, 0\n\
+_080F7DBC: .4byte gScriptResult\n\
+ .syntax divided");
+}
+#endif