diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bike.c | 35 | ||||
-rw-r--r-- | src/field_control_avatar.c | 2 | ||||
-rw-r--r-- | src/field_map_obj.c | 2 | ||||
-rw-r--r-- | src/field_player_avatar.c | 4 | ||||
-rw-r--r-- | src/mauville_old_man.c | 407 |
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 |