about summary refs log blame commit diff stats
path: root/Archipelago/effects.gd
blob: 341a78327843d4cfb55a9ae384de9b50bb5aaed4 (plain) (tree)
1
2
3
4
5
6
7
8
9
            
                     

                          
                        
                              
                      

                          
                           
                       
                     


             
            





                                                                                            
                                                                                         














                                                              




                                                                 




                                                                       




                                                               
 

                        
                                                    

                          




                                                                             
 
                                        



                                                                             
                                      
 
                                    
                         
 
                                                     
 
 













                                                                             
                                       
                         
                                        
                      



                                                                                              
                                     
 
                                   
                         
 

                                                     
 
                           
                                                
                             
 
                        
                                                             
 
                         
 

                                                     
 
                              
                                     
 

                                                                     
 
                                 
 
                                                     
 
 
                                         

                                                          


                                                                   
                                                                                                        
                          
                                                     

                             
                               
                         




                                  
                                
                               






















                                                                                 
                                      
                         
 








                                                                             
 

                                                             
 














                                                                             



                                  
                                                                                                       
 
                                    
 

                                                             


                          
                                      
                                           
                                                                                      

                                                                                    
                                                      
 

                                                    

                                  
 
                             
                                         
                                                                            
                                                                                                   
                                          
                                            
                                                                           


                                                                                  


                                                                         




                                                                                                                    
                                                  
extends Node

var activated = false
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
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 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
	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

	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:
		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_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
		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_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)

		$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 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"
			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