From ed3247cd00cde86026379aebba200fee673cdba0 Mon Sep 17 00:00:00 2001
From: Star Rauchenberger <fefferburbia@gmail.com>
Date: Fri, 20 Sep 2024 16:15:56 -0400
Subject: Added speed boost mode

---
 Archipelago/client.gd  | 15 +++++++++++-
 Archipelago/effects.gd | 66 +++++++++++++++++++++++++++++++++++++++++++-------
 2 files changed, 71 insertions(+), 10 deletions(-)

diff --git a/Archipelago/client.gd b/Archipelago/client.gd
index 3973f0e..6621194 100644
--- a/Archipelago/client.gd
+++ b/Archipelago/client.gd
@@ -104,6 +104,7 @@ var _pilgrimage_allows_roof_access = false
 var _pilgrimage_allows_paintings = false
 var _sunwarp_shuffle = false
 var _sunwarp_mapping = []
+var _speed_boost_mode = false
 var _slot_seed = 0
 
 var _map_loaded = false
@@ -117,6 +118,7 @@ var _puzzle_skips = 0
 var _cached_slowness = 0
 var _cached_iceland = 0
 var _cached_atbash = 0
+var _cached_speed_boosts = 0
 var _geronimo_skip = false
 var _checked_paintings = []
 
@@ -330,6 +332,10 @@ func _on_data():
 				_sunwarp_shuffle = false
 			if _slot_data.has("sunwarp_permutation"):
 				_sunwarp_mapping = _slot_data["sunwarp_permutation"]
+			if _slot_data.has("speed_boost_mode"):
+				_speed_boost_mode = _slot_data["speed_boost_mode"]
+			else:
+				_speed_boost_mode = false
 
 			if (
 				_location_classification_bit != kCLASSIFICATION_LOCAL_INSANITY
@@ -348,6 +354,7 @@ func _on_data():
 			_cached_slowness = 0
 			_cached_iceland = 0
 			_cached_atbash = 0
+			_cached_speed_boosts = 0
 			_geronimo_skip = false
 
 			_localdata_file = "user://archipelago_data/%s_%d" % [_seed, _slot]
@@ -379,6 +386,9 @@ func _on_data():
 				if localdata.size() > 5:
 					_geronimo_skip = localdata[5]
 
+				if localdata.size() > 6:
+					_cached_speed_boosts = localdata[6]
+
 			requestSync()
 
 			sendMessage(
@@ -568,7 +578,8 @@ func saveLocaldata():
 		effects_node.slowness_remaining,
 		effects_node.iceland_remaining,
 		effects_node.atbash_remaining,
-		_geronimo_skip
+		_geronimo_skip,
+		effects_node.speed_boosts_remaining,
 	]
 	file.store_var(data, true)
 	file.close()
@@ -800,6 +811,8 @@ func processItem(item, index, from, flags):
 			effects_node.trigger_iceland_trap()
 		if item_name == "Atbash Trap":
 			effects_node.trigger_atbash_trap()
+		if item_name == "Speed Boost":
+			effects_node.trigger_speed_boost()
 		if item_name == "Puzzle Skip":
 			_puzzle_skips += 1
 
diff --git a/Archipelago/effects.gd b/Archipelago/effects.gd
index 1e2e311..341a783 100644
--- a/Archipelago/effects.gd
+++ b/Archipelago/effects.gd
@@ -5,6 +5,7 @@ var effect_running = false
 var slowness_remaining = 0
 var iceland_remaining = 0
 var atbash_remaining = 0
+var speed_boosts_remaining = 0
 var queued_iceland = 0
 var skip_available = false
 var puzzle_focused = false
@@ -48,6 +49,12 @@ func _ready():
 	add_child(slowness_timer)
 	slowness_timer.connect("timeout", self, "_tick_slowness")
 
+	var speed_boost_timer = Timer.new()
+	speed_boost_timer.name = "SpeedBoostTimer"
+	speed_boost_timer.wait_time = 1.0
+	add_child(speed_boost_timer)
+	speed_boost_timer.connect("timeout", self, "_tick_speed_boost")
+
 	var iceland_timer = Timer.new()
 	iceland_timer.name = "IcelandTimer"
 	iceland_timer.wait_time = 1.0
@@ -63,6 +70,12 @@ func activate():
 
 	queued_iceland = 0
 
+	var apclient = global.get_node("Archipelago")
+	if apclient._speed_boost_mode:
+		var player = get_tree().get_root().get_node("Spatial/player")
+		player.walk_speed = orig_walk / 2.0
+		player.run_speed = orig_run / 2.0
+
 
 func trigger_slowness_trap(length = 30):
 	if slowness_remaining == 0:
@@ -79,6 +92,21 @@ func trigger_slowness_trap(length = 30):
 	apclient.saveLocaldata()
 
 
+func trigger_speed_boost(length = 20):
+	if speed_boosts_remaining == 0:
+		var player = get_tree().get_root().get_node("Spatial/player")
+		player.walk_speed = orig_walk
+		player.run_speed = orig_run
+
+		$SpeedBoostTimer.start()
+
+	speed_boosts_remaining += length
+	text_dirty = true
+
+	var apclient = global.get_node("Archipelago")
+	apclient.saveLocaldata()
+
+
 func trigger_iceland_trap(length = 60):
 	if not activated:
 		queued_iceland += length
@@ -99,7 +127,7 @@ func trigger_iceland_trap(length = 60):
 
 
 func trigger_atbash_trap():
-	var newly_atbash = (atbash_remaining == 0)
+	var newly_atbash = atbash_remaining == 0
 	atbash_remaining += 1
 
 	if newly_atbash:
@@ -121,7 +149,7 @@ func deactivate_atbash_trap():
 			apclient.evaluateSolvability()
 
 		text_dirty = true
-	
+
 	var apclient = global.get_node("Archipelago")
 	apclient.saveLocaldata()
 
@@ -192,23 +220,37 @@ func _tick_slowness():
 		player.run_speed = orig_run
 
 		$SlownessTimer.stop()
-	
+
 	if slowness_remaining % 5 == 0:
 		var apclient = global.get_node("Archipelago")
 		apclient.saveLocaldata()
 
 
+func _tick_speed_boost():
+	speed_boosts_remaining -= 1
+	text_dirty = true
+
+	if speed_boosts_remaining == 0:
+		var player = get_tree().get_root().get_node("Spatial/player")
+		player.walk_speed = orig_walk / 2.0
+		player.run_speed = orig_run / 2.0
+
+		$SpeedBoostTimer.stop()
+
+	if speed_boosts_remaining % 5 == 0:
+		var apclient = global.get_node("Archipelago")
+		apclient.saveLocaldata()
+
+
 func _tick_iceland():
 	iceland_remaining -= 1
 	text_dirty = true
 
 	if iceland_remaining == 0:
-		get_tree().get_root().get_node("Spatial/player/pivot/camera").set_environment(
-			orig_env
-		)
+		get_tree().get_root().get_node("Spatial/player/pivot/camera").set_environment(orig_env)
 
 		$IcelandTimer.stop()
-	
+
 	if iceland_remaining % 5 == 0:
 		var apclient = global.get_node("Archipelago")
 		apclient.saveLocaldata()
@@ -220,9 +262,11 @@ func _process(_delta):
 		if wallcast.is_colliding():
 			var player = get_tree().get_root().get_node("Spatial/player")
 			var puzzlecast = player.get_node("pivot/camera/RayCast_sight")
-			var distance = puzzlecast.get_collision_point().distance_to(wallcast.get_collision_point())
+			var distance = puzzlecast.get_collision_point().distance_to(
+				wallcast.get_collision_point()
+			)
 			should_nbw = (distance < 0.05)
-			
+
 		if should_nbw != not_behind_wall:
 			not_behind_wall = should_nbw
 			text_dirty = true
@@ -239,6 +283,10 @@ func _process(_delta):
 			if not text.empty():
 				text += "\n"
 			text += "Slowness: %d seconds" % slowness_remaining
+		if speed_boosts_remaining > 0:
+			if not text.empty():
+				text += "\n"
+			text += "Speed Boost: %d seconds" % speed_boosts_remaining
 		if iceland_remaining > 0:
 			if not text.empty():
 				text += "\n"
-- 
cgit 1.4.1