165 lines
4.2 KiB
GDScript
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
|