extends Node var activated = false var effect_running = false var slowness_remaining = 0 var iceland_remaining = 0 var atbash_remaining = 0 var queued_iceland = 0 var skip_available = false var puzzle_focused = false var solve_mode = false var not_behind_wall = false var puzzle_to_skip = "" var text_dirty = true var orig_env var orig_walk var orig_run var wallcast func _ready(): orig_env = get_tree().get_root().get_node("Spatial/player/pivot/camera").environment orig_walk = get_tree().get_root().get_node("Spatial/player").walk_speed orig_run = get_tree().get_root().get_node("Spatial/player").run_speed wallcast = get_tree().get_root().get_node("Spatial/player/pivot/camera/wallcast") var label = Label.new() label.set_name("label") label.margin_right = 1920.0 - 20.0 label.margin_top = 20.0 label.align = Label.ALIGN_RIGHT label.valign = Label.VALIGN_TOP var dynamic_font = DynamicFont.new() dynamic_font.font_data = load("res://fonts/Lingo.ttf") dynamic_font.size = 36 dynamic_font.outline_color = Color(0, 0, 0, 1) dynamic_font.outline_size = 2 label.add_font_override("font", dynamic_font) add_child(label) var slowness_timer = Timer.new() slowness_timer.name = "SlownessTimer" slowness_timer.wait_time = 1.0 add_child(slowness_timer) slowness_timer.connect("timeout", self, "_tick_slowness") var iceland_timer = Timer.new() iceland_timer.name = "IcelandTimer" iceland_timer.wait_time = 1.0 add_child(iceland_timer) iceland_timer.connect("timeout", self, "_tick_iceland") func activate(): activated = true if queued_iceland > 0: trigger_iceland_trap(queued_iceland) queued_iceland = 0 func trigger_slowness_trap(length = 30): if slowness_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 $SlownessTimer.start() slowness_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 return if iceland_remaining == 0: get_tree().get_root().get_node("Spatial/player/pivot/camera").set_environment( load("res://environments/level_iceland.tres") ) $IcelandTimer.start() iceland_remaining += length text_dirty = true var apclient = global.get_node("Archipelago") apclient.saveLocaldata() func trigger_atbash_trap(): var newly_atbash = (atbash_remaining == 0) atbash_remaining += 1 if newly_atbash: var apclient = global.get_node("Archipelago") apclient.evaluateSolvability() text_dirty = true var apclient = global.get_node("Archipelago") apclient.saveLocaldata() func deactivate_atbash_trap(): if atbash_remaining > 0: atbash_remaining -= 1 if atbash_remaining == 0: var apclient = global.get_node("Archipelago") apclient.evaluateSolvability() text_dirty = true var apclient = global.get_node("Archipelago") apclient.saveLocaldata() func show_puzzle_skip_message(node_path): if puzzle_focused and node_path != puzzle_to_skip: hide_puzzle_skip_message() var panel_input = get_tree().get_root().get_node(node_path) if not panel_input.visible: return var ap_panel = panel_input.get_parent().get_parent().get_parent().get_parent().get_node_or_null( "AP_Panel" ) if ap_panel == null or not ap_panel.solvable: return puzzle_focused = true wallcast.enabled = true not_behind_wall = false text_dirty = true puzzle_to_skip = node_path _evaluate_puzzle_skip() func hide_puzzle_skip_message(): puzzle_focused = false wallcast.enabled = false not_behind_wall = false text_dirty = true _evaluate_puzzle_skip() func enter_solve_mode(): solve_mode = true _evaluate_puzzle_skip() func exit_solve_mode(): solve_mode = false _evaluate_puzzle_skip() func skip_puzzle(): if not solve_mode and puzzle_focused: var apclient = global.get_node("Archipelago") if apclient.getAvailablePuzzleSkips() > 0: apclient.usePuzzleSkip() get_tree().get_root().get_node(puzzle_to_skip).complete() func _evaluate_puzzle_skip(): if puzzle_focused and not solve_mode: skip_available = true else: skip_available = false text_dirty = true func _tick_slowness(): slowness_remaining -= 1 text_dirty = true if slowness_remaining == 0: var player = get_tree().get_root().get_node("Spatial/player") player.walk_speed = orig_walk player.run_speed = orig_run $SlownessTimer.stop() if slowness_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 ) $IcelandTimer.stop() if iceland_remaining % 5 == 0: var apclient = global.get_node("Archipelago") apclient.saveLocaldata() func _process(_delta): if puzzle_focused: var should_nbw = false 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()) should_nbw = (distance < 0.05) if should_nbw != not_behind_wall: not_behind_wall = should_nbw text_dirty = true if text_dirty: text_dirty = false var text = "" if atbash_remaining == 1: text += "Atbash Trap lasts until you solve a puzzle" if atbash_remaining > 1: text += ("Atbash Trap lasts until you solve %d puzzles" % atbash_remaining) if slowness_remaining > 0: if not text.empty(): text += "\n" text += "Slowness: %d seconds" % slowness_remaining if iceland_remaining > 0: if not text.empty(): text += "\n" text += "Iceland: %d seconds" % iceland_remaining if skip_available and not_behind_wall: var apclient = global.get_node("Archipelago") if apclient.getAvailablePuzzleSkips() > 0: if not text.empty(): text += "\n" text += "Press P to skip puzzle (%d available)" % apclient.getAvailablePuzzleSkips() self.get_node("label").text = text