class_name Player extends RigidBody2D 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 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): if $CollisionShape2D.disabled: # Prepare the shape query parameters var query_parameters = PhysicsShapeQueryParameters2D.new() var collision_shape = $CollisionShape2D.shape query_parameters.set_shape(collision_shape) query_parameters.set_transform(Transform2D(0, position)) query_parameters.set_collision_mask(2) #2=pools # Get the Physics2DDirectSpaceState for collision checking var space_state = get_world_2d().direct_space_state # Check for collision var collision_results = space_state.intersect_shape(query_parameters) if collision_results.size() == 0: $CollisionShape2D.disabled=false #func _physics_process(delta): # if Input.is_action_pressed('move_up'): # velocity.y -= 1 # if Input.is_action_pressed('move_down'): # velocity.y += 1 # if Input.is_action_pressed('move_left'): # velocity.x -= 1 # if Input.is_action_pressed('move_right'): # velocity.x += 1 # if Input.is_action_just_pressed('take'): # drop() func drop(): if not is_carrying(): return var new_pool: Pool = load("res://pool.tscn").instantiate() new_pool.position = position new_pool.mana_r=carrying_r new_pool.mana_g=carrying_g new_pool.mana_b=carrying_b new_pool.get_node("CollisionShape2D2").disabled=true; carrying_r=0 carrying_g=0 carrying_b=0 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 new_pool.get_node("CollisionShape2D2").disabled=true; carrying_r=0 carrying_g=0 carrying_b=0 player.carrying_r=0 player.carrying_g=0 player.carrying_b=0 get_tree().root.get_node("Sim/Map").call_deferred("add_child",new_pool) update() func exchange_with(pool: Pool): 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 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"] func _on_decay_timer_timeout(): pass # Replace with function body.