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.

84 lines
2.0 KiB

  1. extends "res://scripts/player.gd"
  2. var merge_power = .1
  3. var merged = null
  4. var old_layer
  5. var old_mask
  6. var allow_merge_time = 0
  7. var allow_merge_threshold = 0.4
  8. func _ready():
  9. # Called every time the node is added to the scene.
  10. # Initialization here
  11. pass
  12. func _exit_tree():
  13. unmerge() # Checks if necessary automatically
  14. func _process(delta):
  15. if is_network_master():
  16. allow_merge_time += delta
  17. if not merged and allow_merge_time > allow_merge_threshold:
  18. var cols = get_colliding_bodies()
  19. for col in cols:
  20. if col.is_in_group("player"):
  21. var same_team = col.player_info.is_right_team == player_info.is_right_team
  22. if same_team:
  23. rpc("merge", col.get_name())
  24. if merged and Input.is_action_just_pressed("hero_3_unmerge"):
  25. rpc("unmerge")
  26. func set_collisions(on):
  27. if on:
  28. collision_layer = old_layer
  29. collision_mask = old_mask
  30. gravity_scale = 1
  31. else:
  32. old_layer = collision_layer
  33. old_mask = collision_mask
  34. collision_layer = 0
  35. collision_mask = 0
  36. gravity_scale = 0
  37. func set_boosted_label(node, on):
  38. if on:
  39. var boosted_label = $Boosted.duplicate()
  40. boosted_label.show()
  41. node.add_child(boosted_label)
  42. else:
  43. var boosted_label = node.get_node("Boosted")
  44. boosted_label.queue_free()
  45. func set_boosting(is_boosting):
  46. set_collisions(!is_boosting)
  47. visible = !is_boosting
  48. get_node("MasterOnly/Boosting").visible = is_boosting
  49. if not is_boosting and is_network_master():
  50. $"Yaw/Pitch/Camera".make_current()
  51. func set_boosted(node, is_boosted):
  52. if is_network_master():
  53. # Assume their PoV, but no control
  54. node.get_node("Yaw/Pitch/Camera").make_current()
  55. if node.is_network_master():
  56. set_boosted_label(node, is_boosted)
  57. var ratio = (1 + merge_power)
  58. if !is_boosted:
  59. ratio = 1/ratio # Undo the effect
  60. node.walk_speed *= ratio
  61. node.air_accel *= ratio
  62. sync func merge(node_name):
  63. set_boosting(true)
  64. var other = $"/root/Level/Players".get_node(node_name)
  65. set_boosted(other, true)
  66. merged = other
  67. sync func unmerge():
  68. if merged:
  69. set_boosting(false)
  70. set_boosted(merged, false)
  71. merged = null