A team game with an emphasis on movement (with no shooting), inspired by Overwatch and Zineth
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
3.4 KiB

  1. extends RigidBody
  2. sync var left = 0
  3. sync var right = 0
  4. var active = false
  5. var right_active = false
  6. var activation_margin = 0.1
  7. var update_frequency = 2 # In secs. This isn't too fast-paced, so don't clog the network with updates every frame
  8. var update_count = 0
  9. var master_team_right = null
  10. var friend_color
  11. var enemy_color
  12. var build_rate = 1.5
  13. var restart_count = 0
  14. var restart_time = 15
  15. slave func set_status(status):
  16. transform = status[0]
  17. angular_velocity = status[1]
  18. func get_status():
  19. return [
  20. transform,
  21. angular_velocity,
  22. ]
  23. func _process(delta):
  24. # Figure out what team we're on
  25. # We have to do this here because we never know when the master player will actually be added
  26. if master_team_right == null:
  27. var master_player = util.get_master_player()
  28. if master_player:
  29. master_team_right = master_player.player_info.is_right_team
  30. friend_color = master_player.friend_color
  31. enemy_color = master_player.enemy_color
  32. else:
  33. master_team_right = true # Doesn't matter, it's all graphical and we're headless
  34. friend_color = Color()
  35. enemy_color = Color()
  36. var name = "right" if master_team_right else "left"
  37. var full_name = "res://assets/objective-%s.png" % name
  38. get_node("MeshInstance").get_surface_material(0).albedo_texture = load(full_name)
  39. # Check what's active
  40. var rot = rotation.x
  41. if active:
  42. activation_margin = 0
  43. if rot > activation_margin:
  44. active = true
  45. right_active = false
  46. if rot < -activation_margin:
  47. active = true
  48. right_active = true
  49. if active:
  50. if right_active == master_team_right:
  51. # We DO own the correct one; display left counting, blue
  52. get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", friend_color)
  53. get_node("../HUD/RightTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
  54. else:
  55. # We DO NOT own the correct one; display right counting, red
  56. get_node("../HUD/LeftTeam").add_color_override("font_color_shadow", Color(0,0,0,0))
  57. get_node("../HUD/RightTeam").add_color_override("font_color_shadow", enemy_color)
  58. # Count the percents
  59. if active:
  60. if right_active:
  61. right += delta * build_rate
  62. else:
  63. left += delta * build_rate
  64. update_count += delta / Engine.time_scale # This is important so we update at 100% as well
  65. if is_network_master() and update_count > update_frequency:
  66. update_count = 0
  67. rset("left", left)
  68. rset("right", right)
  69. if is_network_master():
  70. rpc_unreliable("set_status", get_status())
  71. # Check for game over
  72. var game_over = false
  73. var winner_right
  74. if left >= 100:
  75. game_over = true
  76. winner_right = false
  77. left = 100
  78. if right >= 100:
  79. game_over = true
  80. winner_right = true
  81. right = 100
  82. if game_over:
  83. var text = "You lose :("
  84. if winner_right == master_team_right:
  85. text = "You win!!!"
  86. get_node("../HUD/Finish").set_text(text)
  87. Engine.time_scale = 0.1
  88. # You won't believe this, but because time_scale is 0.1 we have to multiply times 10 for proper timing
  89. restart_count += delta / Engine.time_scale
  90. if restart_count > restart_time:
  91. Engine.time_scale = 1
  92. if is_network_master():
  93. get_node("/root/Lobby").rpc("reset_state")
  94. # Render the percents
  95. var on_left = left
  96. var on_right = right
  97. # Always display OUR team on the LEFT (in blue)
  98. if master_team_right:
  99. on_left = right
  100. on_right = left
  101. get_node("../HUD/LeftTeam").set_text("%d%%" % on_left)
  102. get_node("../HUD/RightTeam").set_text("%d%%" % on_right)
  103. func _exit_tree():
  104. var lobby = get_node("/root/Lobby")
  105. lobby.call_deferred("pre_configure_game", lobby.my_info.level)