diff options
author | ProjectRevoTPP <projectrevotpp@hotmail.com> | 2017-01-20 17:43:41 -0500 |
---|---|---|
committer | YamaArashi <YamaArashi@users.noreply.github.com> | 2017-01-20 14:43:41 -0800 |
commit | cf0a4dbb86f164026fa2028ef5d0d4a5a419c9c3 (patch) | |
tree | b7daf555678f46533ad5fcc245f58790290acf36 | |
parent | 9274e189277ab6ec4d4efb90cb9e18145a8fec38 (diff) |
start decompiling bike.c (#203)
* start decompiling bike.c
* decompile more of bike.c
* decompile MovePlayerOnAcroBike and CheckMovementInputAcroBike
-rw-r--r-- | asm/bike.s | 353 | ||||
-rw-r--r-- | include/global.fieldmap.h | 6 | ||||
-rw-r--r-- | ld_script.txt | 1 | ||||
-rw-r--r-- | src/bike.c | 210 |
4 files changed, 217 insertions, 353 deletions
diff --git a/asm/bike.s b/asm/bike.s index a7e3401ac..27984c50d 100644 --- a/asm/bike.s +++ b/asm/bike.s @@ -5,358 +5,7 @@ .syntax unified .text - - thumb_func_start MovePlayerOnBike -MovePlayerOnBike: @ 80E50A8 - push {r4,lr} - lsls r0, 24 - lsrs r3, r0, 24 - lsls r1, 16 - lsrs r4, r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldr r0, _080E50CC @ =gPlayerAvatar - ldrb r1, [r0] - movs r0, 0x2 - ands r0, r1 - cmp r0, 0 - beq _080E50D0 - adds r0, r3, 0 - adds r1, r4, 0 - bl MovePlayerOnMachBike - b _080E50D8 - .align 2, 0 -_080E50CC: .4byte gPlayerAvatar -_080E50D0: - adds r0, r3, 0 - adds r1, r4, 0 - bl MovePlayerOnAcroBike -_080E50D8: - pop {r4} - pop {r0} - bx r0 - thumb_func_end MovePlayerOnBike - - thumb_func_start MovePlayerOnMachBike -MovePlayerOnMachBike: @ 80E50E0 - push {r4,lr} - sub sp, 0x4 - mov r1, sp - strb r0, [r1] - ldr r4, _080E510C @ =gUnknown_083DB594 - mov r0, sp - bl CheckMovementInputMachBike - lsls r0, 24 - lsrs r0, 22 - adds r0, r4 - mov r1, sp - ldrb r1, [r1] - ldr r2, [r0] - adds r0, r1, 0 - bl _call_via_r2 - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080E510C: .4byte gUnknown_083DB594 - thumb_func_end MovePlayerOnMachBike - - thumb_func_start CheckMovementInputMachBike -CheckMovementInputMachBike: @ 80E5110 - push {r4,lr} - adds r4, r0, 0 - bl player_get_direction_upper_nybble - lsls r0, 24 - lsrs r0, 24 - adds r3, r0, 0 - ldrb r1, [r4] - cmp r1, 0 - bne _080E5138 - strb r0, [r4] - ldr r2, _080E5134 @ =gPlayerAvatar - ldrb r0, [r2, 0xB] - cmp r0, 0 - bne _080E514C - strb r1, [r2, 0x2] - movs r0, 0 - b _080E5160 - .align 2, 0 -_080E5134: .4byte gPlayerAvatar -_080E5138: - ldr r2, _080E5154 @ =gPlayerAvatar - cmp r1, r3 - beq _080E515C - ldrb r0, [r2, 0x2] - cmp r0, 0x2 - beq _080E515C - ldrb r0, [r2, 0xB] - cmp r0, 0 - beq _080E5158 - strb r3, [r4] -_080E514C: - movs r0, 0x2 - strb r0, [r2, 0x2] - movs r0, 0x3 - b _080E5160 - .align 2, 0 -_080E5154: .4byte gPlayerAvatar -_080E5158: - movs r0, 0x1 - b _080E515E -_080E515C: - movs r0, 0x2 -_080E515E: - strb r0, [r2, 0x2] -_080E5160: - pop {r4} - pop {r1} - bx r1 - thumb_func_end CheckMovementInputMachBike - - thumb_func_start sub_80E5168 -sub_80E5168: @ 80E5168 - push {lr} - lsls r0, 24 - lsrs r0, 24 - bl PlayerFaceDirection - bl sub_80E6024 - pop {r0} - bx r0 - thumb_func_end sub_80E5168 - - thumb_func_start sub_80E517C -sub_80E517C: @ 80E517C - push {r4,r5,lr} - lsls r0, 24 - lsrs r5, r0, 24 - ldr r0, _080E51AC @ =gPlayerAvatar - ldrb r1, [r0, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080E51B0 @ =gMapObjects - adds r4, r0, r1 - ldrb r1, [r4, 0x1E] - adds r0, r5, 0 - bl sub_80E5E70 - lsls r0, 24 - cmp r0, 0 - beq _080E51B4 - adds r0, r5, 0 - bl PlayerTurnInPlace - bl sub_80E6024 - b _080E51BE - .align 2, 0 -_080E51AC: .4byte gPlayerAvatar -_080E51B0: .4byte gMapObjects -_080E51B4: - ldrb r0, [r4, 0x18] - lsls r0, 28 - lsrs r0, 28 - bl sub_80E5168 -_080E51BE: - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end sub_80E517C - - thumb_func_start sub_80E51C4 -sub_80E51C4: @ 80E51C4 - push {r4-r7,lr} - lsls r0, 24 - lsrs r5, r0, 24 - adds r7, r5, 0 - ldr r6, _080E51F8 @ =gPlayerAvatar - ldrb r1, [r6, 0x5] - lsls r0, r1, 3 - adds r0, r1 - lsls r0, 2 - ldr r1, _080E51FC @ =gMapObjects - adds r4, r0, r1 - ldrb r1, [r4, 0x1E] - adds r0, r5, 0 - bl sub_80E5E70 - lsls r0, 24 - cmp r0, 0 - bne _080E520A - ldrb r0, [r6, 0xB] - cmp r0, 0 - beq _080E5200 - ldrb r0, [r4, 0x18] - lsrs r0, 4 - bl sub_80E5270 - b _080E5266 - .align 2, 0 -_080E51F8: .4byte gPlayerAvatar -_080E51FC: .4byte gMapObjects -_080E5200: - ldrb r0, [r4, 0x18] - lsrs r0, 4 - bl sub_80E5168 - b _080E5266 -_080E520A: - adds r0, r5, 0 - bl sub_80E5D34 - lsls r0, 24 - lsrs r4, r0, 24 - movs r1, 0xFF - lsls r1, 24 - adds r0, r1 - lsrs r0, 24 - cmp r0, 0xA - bhi _080E5242 - cmp r4, 0x6 - bne _080E522C - adds r0, r5, 0 - bl PlayerJumpLedge - b _080E5266 -_080E522C: - bl sub_80E6024 - subs r0, r4, 0x5 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _080E5266 - adds r0, r5, 0 - bl PlayerOnBikeCollide - b _080E5266 -_080E5242: - ldr r1, _080E526C @ =gUnknown_083DB5A4 - ldrb r0, [r6, 0xA] - lsls r0, 2 - adds r0, r1 - ldr r1, [r0] - adds r0, r7, 0 - bl _call_via_r1 - ldrb r2, [r6, 0xA] - lsls r0, r2, 24 - lsrs r1, r0, 24 - lsrs r0, 25 - adds r0, r2, r0 - strb r0, [r6, 0xB] - cmp r1, 0x1 - bhi _080E5266 - adds r0, r2, 0x1 - strb r0, [r6, 0xA] -_080E5266: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080E526C: .4byte gUnknown_083DB5A4 - thumb_func_end sub_80E51C4 - - thumb_func_start sub_80E5270 -sub_80E5270: @ 80E5270 - push {r4-r7,lr} - lsls r0, 24 - lsrs r4, r0, 24 - adds r7, r4, 0 - ldr r6, _080E52A8 @ =gPlayerAvatar - ldrb r0, [r6, 0xB] - cmp r0, 0 - beq _080E5286 - subs r0, 0x1 - strb r0, [r6, 0xB] - strb r0, [r6, 0xA] -_080E5286: - adds r0, r4, 0 - bl sub_80E5D34 - lsls r0, 24 - lsrs r5, r0, 24 - movs r1, 0xFF - lsls r1, 24 - adds r0, r1 - lsrs r0, 24 - cmp r0, 0xA - bhi _080E52C2 - cmp r5, 0x6 - bne _080E52AC - adds r0, r4, 0 - bl PlayerJumpLedge - b _080E52D2 - .align 2, 0 -_080E52A8: .4byte gPlayerAvatar -_080E52AC: - bl sub_80E6024 - subs r0, r5, 0x5 - lsls r0, 24 - lsrs r0, 24 - cmp r0, 0x3 - bls _080E52D2 - adds r0, r4, 0 - bl PlayerOnBikeCollide - b _080E52D2 -_080E52C2: - ldr r0, _080E52D8 @ =gUnknown_083DB5A4 - ldrb r1, [r6, 0xA] - lsls r1, 2 - adds r1, r0 - ldr r1, [r1] - adds r0, r7, 0 - bl _call_via_r1 -_080E52D2: - pop {r4-r7} - pop {r0} - bx r0 - .align 2, 0 -_080E52D8: .4byte gUnknown_083DB5A4 - thumb_func_end sub_80E5270 - - thumb_func_start MovePlayerOnAcroBike -MovePlayerOnAcroBike: @ 80E52DC - push {r4,lr} - sub sp, 0x4 - mov r3, sp - strb r0, [r3] - lsls r1, 16 - lsrs r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldr r4, _080E5310 @ =gUnknown_083DB5B0 - mov r0, sp - bl CheckMovementInputAcroBike - lsls r0, 24 - lsrs r0, 22 - adds r0, r4 - mov r1, sp - ldrb r1, [r1] - ldr r2, [r0] - adds r0, r1, 0 - bl _call_via_r2 - add sp, 0x4 - pop {r4} - pop {r0} - bx r0 - .align 2, 0 -_080E5310: .4byte gUnknown_083DB5B0 - thumb_func_end MovePlayerOnAcroBike - - thumb_func_start CheckMovementInputAcroBike -CheckMovementInputAcroBike: @ 80E5314 - push {r4,lr} - lsls r1, 16 - lsrs r1, 16 - lsls r2, 16 - lsrs r2, 16 - ldr r4, _080E5338 @ =gUnknown_083DB5E4 - ldr r3, _080E533C @ =gPlayerAvatar - ldrb r3, [r3, 0x8] - lsls r3, 2 - adds r3, r4 - ldr r3, [r3] - bl _call_via_r3 - lsls r0, 24 - lsrs r0, 24 - pop {r4} - pop {r1} - bx r1 - .align 2, 0 -_080E5338: .4byte gUnknown_083DB5E4 -_080E533C: .4byte gPlayerAvatar - thumb_func_end CheckMovementInputAcroBike - + thumb_func_start CheckMovementInputAcroBikeNormal CheckMovementInputAcroBikeNormal: @ 80E5340 push {r4-r6,lr} diff --git a/include/global.fieldmap.h b/include/global.fieldmap.h index de465ac95..64c2e8181 100644 --- a/include/global.fieldmap.h +++ b/include/global.fieldmap.h @@ -302,7 +302,7 @@ struct MapObjectGraphicsInfo #define PLAYER_AVATAR_FLAG_6 (1 << 6) #define PLAYER_AVATAR_FLAG_DASH (1 << 7) -struct PlayerAvatar +struct PlayerAvatar /* 0x202E858 */ { /*0x00*/ u8 flags; /*0x01*/ u8 bike; @@ -312,6 +312,10 @@ struct PlayerAvatar /*0x05*/ u8 mapObjectId; /*0x06*/ u8 unk6; /*0x07*/ u8 gender; + u8 unk8; + u8 unk9; + u8 unkA; + u8 unkB; // TODO: rest of struct }; diff --git a/ld_script.txt b/ld_script.txt index fa8dfbc4b..d60856033 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -176,6 +176,7 @@ SECTIONS { src/item_use.o(.text); asm/item_use.o(.text); asm/battle_anim_80CA710.o(.text); + src/bike.o(.text); asm/bike.o(.text); asm/easy_chat.o(.text); asm/pokenav.o(.text); diff --git a/src/bike.c b/src/bike.c new file mode 100644 index 000000000..35c6dc97d --- /dev/null +++ b/src/bike.c @@ -0,0 +1,210 @@ +#include "global.h" +#include "global.fieldmap.h" +#include "flags.h" +#include "asm.h" +#include "field_player_avatar.h" + +extern void (*gUnknown_083DB594[])(u8); +extern void (*gUnknown_083DB5A4[])(u8); +extern void (*gUnknown_083DB5B0[])(u8); +extern u8 (*gUnknown_083DB5E4[])(u8 *, u16, u16); + +extern void sub_80E6024(void); +extern u8 sub_80E5E70(u8, u8); +extern void PlayerOnBikeCollide(u8); +extern u8 sub_80E5D34(u8); + +void MovePlayerOnMachBike(u8, u16, u16); +u8 CheckMovementInputMachBike(u8 *); +u8 CheckMovementInputAcroBike(u8 *, u16, u16); +void sub_80E5168(u8); +void sub_80E5270(u8); +void MovePlayerOnAcroBike(u8, u16, u16); + +void MovePlayerOnBike(u8 var1, u16 var2, u16 var3) +{ + if(gPlayerAvatar.flags & PLAYER_AVATAR_FLAG_MACH_BIKE) + MovePlayerOnMachBike(var1, var2, var3); + else + MovePlayerOnAcroBike(var1, var2, var3); +} + +void MovePlayerOnMachBike(u8 var1, u16 var2, u16 var3) +{ + gUnknown_083DB594[CheckMovementInputMachBike(&var1) & 0x3FF](var1); // var2 and var3 arent used? +} + +u8 CheckMovementInputMachBike(u8 *ptr) +{ + u8 direction = player_get_direction_upper_nybble(); + + if (*ptr == 0) + { + *ptr = direction; + if (gPlayerAvatar.unkB == 0) + { + gPlayerAvatar.running2 = 0; + return 0; + } + gPlayerAvatar.running2 = 2; + return 3; + } + + if (*ptr != direction && gPlayerAvatar.running2 != 2) + { + if (gPlayerAvatar.unkB != 0) + { + *ptr = direction; + gPlayerAvatar.running2 = 2; + return 3; + } + gPlayerAvatar.running2 = 1; + return 1; + } + else + { + gPlayerAvatar.running2 = 2; + return 2; + } +} + +void sub_80E5168(u8 var) +{ + PlayerFaceDirection(var); + sub_80E6024(); +} + +void sub_80E517C(u8 var) +{ + struct MapObject *mapPtr = &gMapObjects[gPlayerAvatar.mapObjectId]; + + if(sub_80E5E70(var, mapPtr->mapobj_unk_1E)) + { + PlayerTurnInPlace(var); + sub_80E6024(); + } + else + sub_80E5168(mapPtr->mapobj_unk_18); +} + +void sub_80E51C4(u8 var) +{ + struct MapObject *mapPtr = &gMapObjects[gPlayerAvatar.mapObjectId]; + u8 funcVar; + + if(sub_80E5E70(var, mapPtr->mapobj_unk_1E) == 0) + { + if(gPlayerAvatar.unkB) + sub_80E5270(mapPtr->placeholder18); + else + sub_80E5168(mapPtr->placeholder18); + } + else + { + funcVar = sub_80E5D34(var); + if (funcVar > 0 && funcVar < 12) + { + if(funcVar == 6) + PlayerJumpLedge(var); + else + { + sub_80E6024(); + if((u8)(funcVar - 5) > 3) + PlayerOnBikeCollide(var); + } + } + else + { + gUnknown_083DB5A4[gPlayerAvatar.unkA](var); + gPlayerAvatar.unkB = gPlayerAvatar.unkA + (gPlayerAvatar.unkA >> 1); // same as dividing by 2, but compiler is insistent on >> 1 + if(gPlayerAvatar.unkA < 2) + gPlayerAvatar.unkA++; + } + } +} + +void sub_80E5270(u8 var) +{ + u8 funcVar; + + if(gPlayerAvatar.unkB != 0) + gPlayerAvatar.unkA = --gPlayerAvatar.unkB; + + funcVar = sub_80E5D34(var); + + if (funcVar > 0 && funcVar < 12) + { + if(funcVar == 6) + PlayerJumpLedge(var); + else + { + sub_80E6024(); + if((u8)(funcVar - 5) > 3) + PlayerOnBikeCollide(var); + } + } + else + gUnknown_083DB5A4[gPlayerAvatar.unkA](var); +} + +void MovePlayerOnAcroBike(u8 var1, u16 var2, u16 var3) +{ + gUnknown_083DB5B0[CheckMovementInputAcroBike(&var1, var2, var3) & 0x3FF](var1); +} + +u8 CheckMovementInputAcroBike(u8 *ptr, u16 var1, u16 var2) +{ + return gUnknown_083DB5E4[gPlayerAvatar.unk8](ptr, var1, var2); +} + +/*u8 CheckMovementInputAcroBikeNormal(u8 *ptr, u16 var1, u16 var2) +{ + u8 playerDir = player_get_direction_upper_nybble(); + u8 result; + gPlayerAvatar.unkA = 0; + + if(*ptr == 0) + { + if(var1 & 2) + { + *ptr = playerDir; + gPlayerAvatar.running2 = *ptr; + gPlayerAvatar.unk8 = 2; + return 3; + } + else + { + *ptr = playerDir; + gPlayerAvatar.running2 = *ptr; + return 0; + } + } + else if(*ptr == playerDir) + { + if(var2 & 2 && gPlayerAvatar.unkB == 0) + { + gPlayerAvatar.unkB++; + gPlayerAvatar.unk8 = 4; + return 11; + } + else if(gPlayerAvatar.unkB == playerDir) + { + result = 2; + gPlayerAvatar.running2 = result; + return result; + } + } + if(gPlayerAvatar.running2 == 2) + { + result = 2; + gPlayerAvatar.running2 = result; + return result; + } + else + { + gPlayerAvatar.unk8 = 1; + gPlayerAvatar.unk9 = *ptr; + gPlayerAvatar.running2 = 0; + return CheckMovementInputAcroBike(ptr, var1, var2); + } +}*/ |