summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/field_specials.s369
-rw-r--r--include/asm.inc.h3
-rw-r--r--ld_script.txt1
-rw-r--r--src/field_specials.c192
4 files changed, 196 insertions, 369 deletions
diff --git a/asm/field_specials.s b/asm/field_specials.s
index e97bdfe80..684ab248b 100644
--- a/asm/field_specials.s
+++ b/asm/field_specials.s
@@ -5,375 +5,6 @@
.syntax unified
.text
-
- thumb_func_start sub_810D6A4
-sub_810D6A4: @ 810D6A4
- push {lr}
- ldr r0, _0810D6B4 @ =sub_8145D88
- bl SetMainCallback2
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- .align 2, 0
-_0810D6B4: .4byte sub_8145D88
- thumb_func_end sub_810D6A4
-
- thumb_func_start sub_810D6B8
-sub_810D6B8: @ 810D6B8
- push {lr}
- ldr r0, _0810D6D0 @ =gMain
- ldr r1, _0810D6D4 @ =c2_exit_to_overworld_2_switch
- str r1, [r0, 0x8]
- ldr r0, _0810D6D8 @ =CB2_ViewWallClock
- bl SetMainCallback2
- bl ScriptContext2_Enable
- pop {r0}
- bx r0
- .align 2, 0
-_0810D6D0: .4byte gMain
-_0810D6D4: .4byte c2_exit_to_overworld_2_switch
-_0810D6D8: .4byte CB2_ViewWallClock
- thumb_func_end sub_810D6B8
-
- thumb_func_start ResetCyclingRoadChallengeData
-ResetCyclingRoadChallengeData: @ 810D6DC
- ldr r0, _0810D6F0 @ =gUnknown_02039250
- movs r1, 0
- strb r1, [r0]
- ldr r0, _0810D6F4 @ =gUnknown_02039251
- strb r1, [r0]
- ldr r1, _0810D6F8 @ =gUnknown_02039254
- movs r0, 0
- str r0, [r1]
- bx lr
- .align 2, 0
-_0810D6F0: .4byte gUnknown_02039250
-_0810D6F4: .4byte gUnknown_02039251
-_0810D6F8: .4byte gUnknown_02039254
- thumb_func_end ResetCyclingRoadChallengeData
-
- thumb_func_start BeginCyclingRoadChallenge
-BeginCyclingRoadChallenge: @ 810D6FC
- ldr r1, _0810D714 @ =gUnknown_02039250
- movs r0, 0x1
- strb r0, [r1]
- ldr r1, _0810D718 @ =gUnknown_02039251
- movs r0, 0
- strb r0, [r1]
- ldr r1, _0810D71C @ =gUnknown_02039254
- ldr r0, _0810D720 @ =gMain
- ldr r0, [r0, 0x20]
- str r0, [r1]
- bx lr
- .align 2, 0
-_0810D714: .4byte gUnknown_02039250
-_0810D718: .4byte gUnknown_02039251
-_0810D71C: .4byte gUnknown_02039254
-_0810D720: .4byte gMain
- thumb_func_end BeginCyclingRoadChallenge
-
- thumb_func_start GetPlayerAvatarBike
-GetPlayerAvatarBike: @ 810D724
- push {lr}
- movs r0, 0x4
- bl TestPlayerAvatarFlags
- lsls r0, 24
- cmp r0, 0
- beq _0810D736
- movs r0, 0x1
- b _0810D748
-_0810D736:
- movs r0, 0x2
- bl TestPlayerAvatarFlags
- lsls r0, 24
- cmp r0, 0
- bne _0810D746
- movs r0, 0
- b _0810D748
-_0810D746:
- movs r0, 0x2
-_0810D748:
- pop {r1}
- bx r1
- thumb_func_end GetPlayerAvatarBike
-
- thumb_func_start DetermineCyclingRoadResults
-DetermineCyclingRoadResults: @ 810D74C
- push {r4-r7,lr}
- adds r7, r0, 0
- lsls r1, 24
- lsrs r6, r1, 24
- cmp r6, 0x63
- bhi _0810D778
- ldr r4, _0810D770 @ =gStringVar1
- adds r0, r4, 0
- adds r1, r6, 0
- movs r2, 0
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- ldr r1, _0810D774 @ =gOtherText_Times
- adds r0, r4, 0
- bl StringAppend
- b _0810D780
- .align 2, 0
-_0810D770: .4byte gStringVar1
-_0810D774: .4byte gOtherText_Times
-_0810D778:
- ldr r0, _0810D7CC @ =gStringVar1
- ldr r1, _0810D7D0 @ =gOtherText_99Times
- bl StringCopy
-_0810D780:
- ldr r0, _0810D7D4 @ =0x00000e0f
- cmp r7, r0
- bhi _0810D7E0
- ldr r4, _0810D7D8 @ =gStringVar2
- adds r0, r7, 0
- movs r1, 0x3C
- bl __udivsi3
- adds r1, r0, 0
- adds r0, r4, 0
- movs r2, 0x1
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- movs r0, 0xAD
- strb r0, [r4, 0x2]
- adds r5, r4, 0x3
- adds r0, r7, 0
- movs r1, 0x3C
- bl __umodsi3
- movs r1, 0x64
- muls r0, r1
- movs r1, 0x3C
- bl __udivsi3
- adds r1, r0, 0
- adds r0, r5, 0
- movs r2, 0x2
- movs r3, 0x2
- bl ConvertIntToDecimalStringN
- ldr r1, _0810D7DC @ =gOtherText_Seconds
- adds r0, r4, 0
- bl StringAppend
- b _0810D7E8
- .align 2, 0
-_0810D7CC: .4byte gStringVar1
-_0810D7D0: .4byte gOtherText_99Times
-_0810D7D4: .4byte 0x00000e0f
-_0810D7D8: .4byte gStringVar2
-_0810D7DC: .4byte gOtherText_Seconds
-_0810D7E0:
- ldr r0, _0810D7F4 @ =gStringVar2
- ldr r1, _0810D7F8 @ =gOtherText_1Minute
- bl StringCopy
-_0810D7E8:
- movs r4, 0
- cmp r6, 0
- bne _0810D7FC
- movs r4, 0x5
- b _0810D81A
- .align 2, 0
-_0810D7F4: .4byte gStringVar2
-_0810D7F8: .4byte gOtherText_1Minute
-_0810D7FC:
- cmp r6, 0x3
- bhi _0810D804
- movs r4, 0x4
- b _0810D81A
-_0810D804:
- cmp r6, 0x9
- bhi _0810D80C
- movs r4, 0x3
- b _0810D81A
-_0810D80C:
- cmp r6, 0x13
- bhi _0810D814
- movs r4, 0x2
- b _0810D81A
-_0810D814:
- cmp r6, 0x63
- bhi _0810D81A
- movs r4, 0x1
-_0810D81A:
- adds r0, r7, 0
- movs r1, 0x3C
- bl __udivsi3
- cmp r0, 0xA
- bhi _0810D82A
- adds r0, r4, 0x5
- b _0810D848
-_0810D82A:
- cmp r0, 0xF
- bhi _0810D832
- adds r0, r4, 0x4
- b _0810D848
-_0810D832:
- cmp r0, 0x14
- bhi _0810D83A
- adds r0, r4, 0x3
- b _0810D848
-_0810D83A:
- cmp r0, 0x28
- bhi _0810D842
- adds r0, r4, 0x2
- b _0810D848
-_0810D842:
- cmp r0, 0x3B
- bhi _0810D84C
- adds r0, r4, 0x1
-_0810D848:
- lsls r0, 24
- lsrs r4, r0, 24
-_0810D84C:
- ldr r0, _0810D858 @ =gScriptResult
- strh r4, [r0]
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0810D858: .4byte gScriptResult
- thumb_func_end DetermineCyclingRoadResults
-
- thumb_func_start FinishCyclingRoadChallenge
-FinishCyclingRoadChallenge: @ 810D85C
- push {r4,r5,lr}
- ldr r0, _0810D880 @ =gMain
- ldr r1, _0810D884 @ =gUnknown_02039254
- ldr r4, [r0, 0x20]
- ldr r0, [r1]
- subs r4, r0
- ldr r5, _0810D888 @ =gUnknown_02039251
- ldrb r1, [r5]
- adds r0, r4, 0
- bl DetermineCyclingRoadResults
- ldrb r1, [r5]
- adds r0, r4, 0
- bl RecordCyclingRoadResults
- pop {r4,r5}
- pop {r0}
- bx r0
- .align 2, 0
-_0810D880: .4byte gMain
-_0810D884: .4byte gUnknown_02039254
-_0810D888: .4byte gUnknown_02039251
- thumb_func_end FinishCyclingRoadChallenge
-
- thumb_func_start RecordCyclingRoadResults
-RecordCyclingRoadResults: @ 810D88C
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r5, r0, 0
- lsls r1, 24
- lsrs r1, 24
- mov r8, r1
- ldr r6, _0810D8E0 @ =0x00004028
- adds r0, r6, 0
- bl VarGet
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- ldr r7, _0810D8E4 @ =0x00004029
- adds r0, r7, 0
- bl VarGet
- lsls r0, 16
- adds r4, r0
- cmp r4, r5
- bhi _0810D8BC
- cmp r4, 0
- bne _0810D8D6
-_0810D8BC:
- lsls r1, r5, 16
- lsrs r1, 16
- adds r0, r6, 0
- bl VarSet
- lsrs r1, r5, 16
- adds r0, r7, 0
- bl VarSet
- ldr r0, _0810D8E8 @ =0x00004027
- mov r1, r8
- bl VarSet
-_0810D8D6:
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r0}
- bx r0
- .align 2, 0
-_0810D8E0: .4byte 0x00004028
-_0810D8E4: .4byte 0x00004029
-_0810D8E8: .4byte 0x00004027
- thumb_func_end RecordCyclingRoadResults
-
- thumb_func_start GetRecordedCyclingRoadResults
-GetRecordedCyclingRoadResults: @ 810D8EC
- push {r4,lr}
- ldr r0, _0810D920 @ =0x00004028
- bl VarGet
- adds r4, r0, 0
- lsls r4, 16
- lsrs r4, 16
- ldr r0, _0810D924 @ =0x00004029
- bl VarGet
- lsls r0, 16
- adds r4, r0
- cmp r4, 0
- beq _0810D92C
- ldr r0, _0810D928 @ =0x00004027
- bl VarGet
- adds r1, r0, 0
- lsls r1, 24
- lsrs r1, 24
- adds r0, r4, 0
- bl DetermineCyclingRoadResults
- movs r0, 0x1
- b _0810D92E
- .align 2, 0
-_0810D920: .4byte 0x00004028
-_0810D924: .4byte 0x00004029
-_0810D928: .4byte 0x00004027
-_0810D92C:
- movs r0, 0
-_0810D92E:
- pop {r4}
- pop {r1}
- bx r1
- thumb_func_end GetRecordedCyclingRoadResults
-
- thumb_func_start UpdateCyclingRoadState
-UpdateCyclingRoadState: @ 810D934
- push {r4,lr}
- ldr r0, _0810D974 @ =gUnknown_020297F0
- ldrh r1, [r0]
- ldr r0, _0810D978 @ =0x00000c1d
- cmp r1, r0
- beq _0810D96C
- ldr r4, _0810D97C @ =0x000040a9
- adds r0, r4, 0
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x2
- beq _0810D95E
- adds r0, r4, 0
- bl VarGet
- lsls r0, 16
- lsrs r0, 16
- cmp r0, 0x3
- bne _0810D96C
-_0810D95E:
- adds r0, r4, 0
- movs r1, 0
- bl VarSet
- movs r0, 0
- bl sav1_set_battle_music_maybe
-_0810D96C:
- pop {r4}
- pop {r0}
- bx r0
- .align 2, 0
-_0810D974: .4byte gUnknown_020297F0
-_0810D978: .4byte 0x00000c1d
-_0810D97C: .4byte 0x000040a9
- thumb_func_end UpdateCyclingRoadState
thumb_func_start SetSSTidalFlag
SetSSTidalFlag: @ 810D980
diff --git a/include/asm.inc.h b/include/asm.inc.h
index 3cc54f6c1..430664517 100644
--- a/include/asm.inc.h
+++ b/include/asm.inc.h
@@ -414,6 +414,9 @@ void sub_8134AC0(void *);
// src/player_pc.o
void NewGameInitPCItems(void);
+// src/diploma.o
+void sub_8145D88(void);
+
// asm/intro_credits_graphics.o
void load_intro_part2_graphics(/*TODO: arg types*/);
void sub_8148C78(/*TODO: arg types*/);
diff --git a/ld_script.txt b/ld_script.txt
index 8b1347baf..cc083b1d3 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -217,6 +217,7 @@ SECTIONS {
src/time_events.o(.text);
asm/birch_pc.o(.text);
src/hof_pc.o(.text);
+ src/field_specials.o(.text);
asm/field_specials.o(.text);
asm/battle_records.o(.text);
asm/pokedex_area_screen.o(.text);
diff --git a/src/field_specials.c b/src/field_specials.c
new file mode 100644
index 000000000..00bdaeb43
--- /dev/null
+++ b/src/field_specials.c
@@ -0,0 +1,192 @@
+#include "global.h"
+#include "asm.h"
+#include "event_data.h"
+#include "field_player_avatar.h"
+#include "main.h"
+#include "map_constants.h"
+#include "rom4.h"
+#include "script.h"
+#include "songs.h"
+#include "string_util.h"
+#include "strings.h"
+#include "text.h"
+#include "wallclock.h"
+
+#define CHAR_PERIOD 0xAD
+#define CHAR_COMMA 0xB8
+
+#if ENGLISH
+#define CHAR_DECIMAL_SEPARATOR CHAR_PERIOD
+#elif GERMAN
+#define CHAR_DECIMAL_SEPARATOR CHAR_COMMA
+#endif
+
+extern struct WarpData gUnknown_020297F0;
+extern u16 gScriptResult;
+extern u8 gUnknown_02039250;
+extern u8 gUnknown_02039251;
+extern u32 gUnknown_02039254;
+
+static void RecordCyclingRoadResults(u32, u8);
+
+void sub_810D6A4(void) {
+ SetMainCallback2(sub_8145D88);
+ ScriptContext2_Enable();
+}
+
+void sub_810D6B8(void) {
+ gMain.savedCallback = c2_exit_to_overworld_2_switch;
+ SetMainCallback2(CB2_ViewWallClock);
+ ScriptContext2_Enable();
+}
+
+void ResetCyclingRoadChallengeData(void) {
+ gUnknown_02039250 = 0;
+ gUnknown_02039251 = 0;
+ gUnknown_02039254 = 0;
+}
+
+void BeginCyclingRoadChallenge(void) {
+ gUnknown_02039250 = 1;
+ gUnknown_02039251 = 0;
+ gUnknown_02039254 = gMain.vblankCounter1;
+}
+
+u16 GetPlayerAvatarBike(void) {
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_ACRO_BIKE))
+ {
+ return 1;
+ }
+
+ if (TestPlayerAvatarFlags(PLAYER_AVATAR_FLAG_MACH_BIKE))
+ {
+ return 2;
+ }
+
+ return 0;
+}
+
+void DetermineCyclingRoadResults(u32 arg0, u8 arg1) {
+ u8 result;
+
+ if (arg1 <= 99)
+ {
+ ConvertIntToDecimalStringN(gStringVar1, arg1, STR_CONV_MODE_LEFT_ALIGN, 2);
+ StringAppend(gStringVar1, gOtherText_Times);
+ }
+ else
+ {
+ StringCopy(gStringVar1, gOtherText_99Times);
+ }
+
+ if (arg0 < 3600)
+ {
+ ConvertIntToDecimalStringN(gStringVar2, arg0 / 60, STR_CONV_MODE_RIGHT_ALIGN, 2);
+ gStringVar2[2] = CHAR_DECIMAL_SEPARATOR;
+ ConvertIntToDecimalStringN(&gStringVar2[3], ((arg0 % 60) * 100) / 60, STR_CONV_MODE_LEADING_ZEROS, 2);
+ StringAppend(gStringVar2, gOtherText_Seconds);
+ }
+ else
+ {
+ StringCopy(gStringVar2, gOtherText_1Minute);
+ }
+
+ result = 0;
+ if (arg1 == 0)
+ {
+ result = 5;
+ }
+ else if (arg1 < 4)
+ {
+ result = 4;
+ }
+ else if (arg1 < 10)
+ {
+ result = 3;
+ }
+ else if (arg1 < 20)
+ {
+ result = 2;
+ }
+ else if (arg1 < 100)
+ {
+ result = 1;
+ }
+
+ if (arg0 / 60 <= 10)
+ {
+ result += 5;
+ }
+ else if (arg0 / 60 <= 15)
+ {
+ result += 4;
+ }
+ else if (arg0 / 60 <= 20)
+ {
+ result += 3;
+ }
+ else if (arg0 / 60 <= 40)
+ {
+ result += 2;
+ }
+ else if (arg0 / 60 < 60)
+ {
+ result += 1;
+ }
+
+
+ gScriptResult = result;
+}
+
+void FinishCyclingRoadChallenge(void) {
+ const u32 time = gMain.vblankCounter1 - gUnknown_02039254;
+
+ DetermineCyclingRoadResults(time, gUnknown_02039251);
+ RecordCyclingRoadResults(time, gUnknown_02039251);
+}
+
+static void RecordCyclingRoadResults(u32 arg0, u8 arg1) {
+ u16 high, low;
+ u32 record;
+
+ high = VarGet(0x4028);
+ low = VarGet(0x4029);
+ record = high + (low << 16);
+
+ if (record > arg0 || record == 0)
+ {
+ VarSet(0x4028, arg0);
+ VarSet(0x4029, arg0 >> 16);
+ VarSet(0x4027, arg1);
+ }
+}
+
+u16 GetRecordedCyclingRoadResults(void) {
+ u16 high, low;
+ u32 record;
+
+ high = VarGet(0x4028);
+ low = VarGet(0x4029);
+ record = high + (low << 16);
+
+ if (record == 0)
+ {
+ return FALSE;
+ }
+
+ DetermineCyclingRoadResults(record, VarGet(0x4027));
+ return TRUE;
+}
+
+void UpdateCyclingRoadState(void) {
+ if (gUnknown_020297F0.mapNum == MAP_ID_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE && gUnknown_020297F0.mapGroup == MAP_GROUP_ROUTE110_SEASIDE_CYCLING_ROAD_NORTH_ENTRANCE)
+ {
+ return;
+ }
+
+ if (VarGet(0x40a9) == 2 || VarGet(0x40a9) == 3)
+ {
+ VarSet(0x40a9, 0);
+ sav1_set_battle_music_maybe(SE_STOP);
+ }
+}