|
extends RigidBody
|
|
|
|
sync var left = 0
|
|
sync var right = 0
|
|
var active = false
|
|
var right_active = false
|
|
var activation_margin = 0.1
|
|
|
|
var update_frequency = 2 # In secs. This isn't too fast-paced, so don't clog the network with updates every frame
|
|
var update_count = 0
|
|
|
|
var master_team_right = null
|
|
var friend_color
|
|
var enemy_color
|
|
|
|
var build_rate = 1.5
|
|
var restart_count = 0
|
|
var restart_time = 15
|
|
|
|
slave func set_status(status):
|
|
transform = status[0]
|
|
angular_velocity = status[1]
|
|
|
|
func get_status():
|
|
return [
|
|
transform,
|
|
angular_velocity,
|
|
]
|
|
|
|
func _process(delta):
|
|
|
|
# Figure out what team we're on
|
|
# We have to do this here because we never know when the master player will actually be added
|
|
if master_team_right == null:
|
|
var master_player = util.get_master_player()
|
|
if master_player:
|
|
master_team_right = master_player.player_info.is_right_team
|
|
friend_color = master_player.friend_color
|
|
enemy_color = master_player.enemy_color
|
|
else:
|
|
master_team_right = true # Doesn't matter, it's all graphical and we're headless
|
|
friend_color = Color()
|
|
enemy_color = Color()
|
|
var name = "right" if master_team_right else "left"
|
|
var full_name = "res://assets/objective-%s.png" % name
|
|
get_node("MeshInstance").get_surface_material(0).albedo_texture = load(full_name)
|
|
|
|
# Check what's active
|
|
var rot = rotation.x
|
|
if active:
|
|
activation_margin = 0
|
|
if rot > activation_margin:
|
|
active = true
|
|
right_active = false
|
|
if rot < -activation_margin:
|
|
active = true
|
|
right_active = true
|
|
if active:
|
|
if right_active == master_team_right:
|
|
# We DO own the correct one; display left counting, blue
|
|
get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", friend_color)
|
|
get_node("../HUD/RightTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
|
|
else:
|
|
# We DO NOT own the correct one; display right counting, red
|
|
get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
|
|
get_node("../HUD/RightTeam").add_color_override("font_color_shadow", enemy_color)
|
|
|
|
# Count the percents
|
|
if active:
|
|
if right_active:
|
|
right += delta * build_rate
|
|
else:
|
|
left += delta * build_rate
|
|
update_count += delta / Engine.time_scale # This is important so we update at 100% as well
|
|
if is_network_master() and update_count > update_frequency:
|
|
update_count = 0
|
|
rset("left", left)
|
|
rset("right", right)
|
|
if is_network_master():
|
|
rpc_unreliable("set_status", get_status())
|
|
|
|
# Check for game over
|
|
var game_over = false
|
|
var winner_right
|
|
if left >= 100:
|
|
game_over = true
|
|
winner_right = false
|
|
left = 100
|
|
if right >= 100:
|
|
game_over = true
|
|
winner_right = true
|
|
right = 100
|
|
if game_over:
|
|
var text = "You lose :("
|
|
if winner_right == master_team_right:
|
|
text = "You win!!!"
|
|
get_node("../HUD/Finish").set_text(text)
|
|
Engine.time_scale = 0.1
|
|
# You won't believe this, but because time_scale is 0.1 we have to multiply times 10 for proper timing
|
|
restart_count += delta / Engine.time_scale
|
|
if restart_count > restart_time:
|
|
Engine.time_scale = 1
|
|
if is_network_master():
|
|
get_node("/root/Lobby").rpc("reset_state")
|
|
|
|
# Render the percents
|
|
var on_left = left
|
|
var on_right = right
|
|
# Always display OUR team on the LEFT (in blue)
|
|
if master_team_right:
|
|
on_left = right
|
|
on_right = left
|
|
get_node("../HUD/LeftTeam").set_text("%d%%" % on_left)
|
|
get_node("../HUD/RightTeam").set_text("%d%%" % on_right)
|
|
|
|
func _exit_tree():
|
|
var lobby = get_node("/root/Lobby")
|
|
lobby.call_deferred("pre_configure_game", lobby.my_info.level)
|
|
|