class_name Player extends RigidBody2D var health=60 var can_pickup=true func _integrate_forces(state: PhysicsDirectBodyState2D): var contact_count = state.get_contact_count() for i in range(contact_count): var collider_object = state.get_contact_collider_object(i) if collider_object and collider_object is Player: handle_player_collision(collider_object) if collider_object and collider_object is Pool: handle_pool_collision(collider_object) func handle_player_collision(player: Player): if not get_tree().root.get_node("Sim/ScreenOverlay/SettingsWindow/VBoxContainer/DropOnColl").is_pressed(): return if is_carrying() and player.is_carrying(): doubledrop(player) drop() player.drop() func handle_pool_collision(pool: Pool): exchange_with(pool) var carrying_r=0 var carrying_g=0 var carrying_b=0 func _process(_delta): var controlling=get_tree().root.get_node("Sim/Map").controlling if controlling and is_instance_valid(controlling) and controlling==self: var s=5 if Input.is_action_pressed('move_up'): controlling.apply_impulse(Vector2(0,-1)*s) if Input.is_action_pressed('move_down'): controlling.apply_impulse(Vector2(0,1)*s) if Input.is_action_pressed('move_left'): controlling.apply_impulse(Vector2(-1,0)*s) if Input.is_action_pressed('move_right'): controlling.apply_impulse(Vector2(1,0)*s) func drop(): if not is_carrying(): return var new_pool: Pool = load("res://pool.tscn").instantiate() new_pool.position = position-(linear_velocity.normalized()*15) new_pool.mana_r=carrying_r new_pool.mana_g=carrying_g new_pool.mana_b=carrying_b carrying_r=0 carrying_g=0 carrying_b=0 $PickupTimer.start() get_tree().root.get_node("Sim/Map").call_deferred("add_child",new_pool) update() func doubledrop(player: Player): if not is_carrying() or not player.is_carrying(): return var new_pool: Pool = load("res://pool.tscn").instantiate() new_pool.position = (position + player.position ) /2 new_pool.mana_r=carrying_r+player.carrying_r new_pool.mana_g=carrying_g+player.carrying_g new_pool.mana_b=carrying_b+player.carrying_b carrying_r=0 carrying_g=0 carrying_b=0 player.carrying_r=0 player.carrying_g=0 player.carrying_b=0 can_pickup=false $PickupTimer.start() player.can_pickup=false player.get_node("PickupTimer").start() get_tree().root.get_node("Sim/Map").call_deferred("add_child",new_pool) update() player.update() func _on_Timer_timeout(): # This function will be called after 5 seconds print("Timer finished!") func exchange_with(pool: Pool): if ! can_pickup: return if is_carrying(): pool.mana_r+=carrying_r pool.mana_g+=carrying_g pool.mana_b+=carrying_b carrying_r=0 carrying_g=0 carrying_b=0 #position += velocity.normalized() #move away else: if pool.mana_r>0 and pool.mana_r >= pool.mana_g and pool.mana_r >= pool.mana_b: pool.mana_r -= 1 carrying_r=1 elif pool.mana_g>0 and pool.mana_g >= pool.mana_r and pool.mana_g >= pool.mana_b: pool.mana_g -= 1 carrying_g=1 elif pool.mana_b>0: pool.mana_b -= 1 carrying_b=1 can_pickup=false $PickupTimer.start() update() func update(): var max_value = max(carrying_r, carrying_g, carrying_b) if max_value==0: self.modulate = Color(1, 1, 1, 1) return var normalized_r = carrying_r / max_value var normalized_g = carrying_g / max_value var normalized_b = carrying_b / max_value self.modulate = Color(normalized_r, normalized_g, normalized_b) func is_carrying(): return (carrying_r+carrying_g+carrying_b)>0 func save_data(): var data = { "filename" : get_scene_file_path(), "pos_x" : position.x, "pos_y" : position.y, "vel_x" : linear_velocity.x, "vel_y" : linear_velocity.y, "vel_a" : angular_velocity, "r" : carrying_r, "g" : carrying_g, "b" : carrying_b, } return data func load_data(data): position=Vector2(data["pos_x"],data["pos_y"]) linear_velocity=Vector2(data["vel_x"],data["vel_y"]) angular_velocity=data["vel_a"] carrying_r=data["r"] carrying_g=data["g"] carrying_b=data["b"] update() func _on_health_timer_timeout(): if not get_tree().root.get_node("Sim/ScreenOverlay/SettingsWindow/VBoxContainer/Health").is_pressed(): return if is_carrying(): health+=1 else: health-=1 if(health<1): self.queue_free() func _on_pickup_timer_timeout(): can_pickup=true