JHRGB/Player.gd
2023-12-28 19:47:27 +00:00

165 lines
4.2 KiB
GDScript

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