summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorProjectRevoTPP <projectrevotpp@hotmail.com>2017-01-20 17:43:41 -0500
committerYamaArashi <YamaArashi@users.noreply.github.com>2017-01-20 14:43:41 -0800
commitcf0a4dbb86f164026fa2028ef5d0d4a5a419c9c3 (patch)
treeb7daf555678f46533ad5fcc245f58790290acf36
parent9274e189277ab6ec4d4efb90cb9e18145a8fec38 (diff)
start decompiling bike.c (#203)
* start decompiling bike.c * decompile more of bike.c * decompile MovePlayerOnAcroBike and CheckMovementInputAcroBike
-rw-r--r--asm/bike.s353
-rw-r--r--include/global.fieldmap.h6
-rw-r--r--ld_script.txt1
-rw-r--r--src/bike.c210
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);
+ }
+}*/