shithub: zelda3

Download patch

ref: ea788824b2a4c1f3d1768c0fa7d2b2451da61227
parent: eb7471b9242ad359a8c421c4114ee94dbeeb51b8
author: Snesrev <snesrev@protonmail.com>
date: Mon Oct 17 13:31:37 EDT 2022

Bug with conveyor belt and mirror (#126)

If you use the mirror while on a dungeon conveyor belt,
you retain momentum after warping.

--- a/messaging.c
+++ b/messaging.c
@@ -726,7 +726,7 @@
   music_control = 241;
   sound_effect_ambient = 5;
   overworld_map_state = 5;
-  byte_7E03F3 = 0;
+  link_on_conveyor_belt = 0;
   byte_7E0322 = 0;
   link_cape_mode = 0;
   mapbak_bg1_x_offset = palette_filter_countdown;
--- a/player.c
+++ b/player.c
@@ -4071,7 +4071,7 @@
       } // endif_6
 
       is_standing_in_doorway = 1;
-      byte_7E03F3 = 0;
+      link_on_conveyor_belt = 0;
       if ((R14 & 0x70) != 0x70) {
         if (R14 & 5) { // if_7
           link_moving_against_diag_tile = 0;
@@ -4108,7 +4108,7 @@
 label_3:
 
   if ((R14 & 7) == 0 && (R12 & 5) != 0) {
-    byte_7E03F3 = 0;
+    link_on_conveyor_belt = 0;
     FlagMovingIntoSlopes_Y();
     if ((link_moving_against_diag_tile & 0xf) != 0)
       return;
@@ -4151,12 +4151,12 @@
   }  // endif_12_norupee
 
   if (tiledetect_var4 & 0x22) {
-    byte_7E03F3 = tiledetect_var4 & 0x20 ? 2 : 1;
+    link_on_conveyor_belt = tiledetect_var4 & 0x20 ? 2 : 1;
   } else if (tiledetect_var4 & 0x2200) {
-    byte_7E03F3 = tiledetect_var4 & 0x2000 ? 4 : 3;
+    link_on_conveyor_belt = tiledetect_var4 & 0x2000 ? 4 : 3;
   } else {
     if (!(bitfield_spike_cactus_tiles & 7) && !(R14 & 2))
-      byte_7E03F3 = 0;
+      link_on_conveyor_belt = 0;
   } // endif_15
 
   if ((tiledetect_vertical_ledge & 7) == 7 && RunLedgeHopTimer()) {
@@ -4757,7 +4757,7 @@
       } // endif_6
 
       is_standing_in_doorway = 2;
-      byte_7E03F3 = 0;
+      link_on_conveyor_belt = 0;
       if ((R14 & 0x70) != 0x70) {
         if (R14 & 7) { // if_7
           link_moving_against_diag_tile = 0;
@@ -4787,7 +4787,7 @@
 label_3:
 
   if ((R14 & 2) == 0 && (R12 & 5) != 0) {
-    byte_7E03F3 = 0;
+    link_on_conveyor_belt = 0;
     FlagMovingIntoSlopes_X();
     if ((link_moving_against_diag_tile & 0xf) != 0)
       return;
@@ -4823,12 +4823,12 @@
   }  // endif_12_norupee
 
   if (tiledetect_var4 & 0x22) {
-    byte_7E03F3 = tiledetect_var4 & 0x20 ? 2 : 1;
+    link_on_conveyor_belt = tiledetect_var4 & 0x20 ? 2 : 1;
   } else if (tiledetect_var4 & 0x2200) {
-    byte_7E03F3 = tiledetect_var4 & 0x2000 ? 4 : 3;
+    link_on_conveyor_belt = tiledetect_var4 & 0x2000 ? 4 : 3;
   } else {
     if (!(bitfield_spike_cactus_tiles & 7) && !(R14 & 2))
-      byte_7E03F3 = 0;
+      link_on_conveyor_belt = 0;
   } // endif_15
 
   if ((detection_of_ledge_tiles_horiz_uphoriz & 7) == 7 && RunLedgeHopTimer()) {
@@ -5879,7 +5879,7 @@
   static const int8 kMovingBeltY[4] = { -8, 8, 0, 0 };
   static const int8 kMovingBeltX[4] = { 0, 0, -8, 8 };
 
-  if (!byte_7E03F3)
+  if (!link_on_conveyor_belt)
     return;
   if (BYTE(link_z_coord) != 0 && BYTE(link_z_coord) != 0xff)
     return;
@@ -5886,7 +5886,7 @@
   if (link_grabbing_wall & 1 || link_player_handler_state == kPlayerState_Hookshot || link_auxiliary_state)
     return;
 
-  int j = byte_7E03F3 - 1;
+  int j = link_on_conveyor_belt - 1;
   if (link_is_running && link_dash_ctr == 32 && (link_direction & kMovePosDirFlag[j]))
     return;
 
@@ -6234,6 +6234,9 @@
   if (enhanced_features0 & kFeatures0_MiscBugFixes) {
     about_to_jump_off_ledge = 0;
 
+    // If you use a mirror on a conveyor belt you still had momentum
+    link_on_conveyor_belt = 0;
+
     // These could be 1 if quitting while killing armos knight
     bg1_y_offset = bg1_x_offset = 0;
   }
@@ -6525,7 +6528,7 @@
 void ResetSomeThingsAfterDeath(uint8 a) {  // 8bffbf
   link_is_in_deep_water = 0;
   link_speed_setting = a;
-  byte_7E03F3 = 0;
+  link_on_conveyor_belt = 0;
   byte_7E0322 = 0;
   flag_is_link_immobilized = 0;
   palette_swap_flag = 0;
--- a/variables.h
+++ b/variables.h
@@ -388,7 +388,7 @@
 #define link_force_hold_sword_up (*(uint8*)(g_ram+0x3EF))
 #define flute_countdown (*(uint8*)(g_ram+0x3F0))
 #define tiledetect_var4 (*(uint16*)(g_ram+0x3F1))
-#define byte_7E03F3 (*(uint8*)(g_ram+0x3F3))
+#define link_on_conveyor_belt (*(uint8*)(g_ram+0x3F3))
 #define dung_unk6 (*(uint8*)(g_ram+0x3F4))
 #define link_timer_tempbunny (*(uint16*)(g_ram+0x3F5))
 #define link_need_for_poof_for_transform (*(uint8*)(g_ram+0x3F7))