JHRGB/Player.gd
2023-12-06 13:12:33 +00:00

121 lines
3.5 KiB
GDScript

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 = ($Body2D.position + player.get_node("Body2D").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("StaticBody2D/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