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.

108 lines
2.6 KiB

  1. # Hero three boosts a friend, making them faster
  2. extends "res://scripts/player.gd"
  3. var merge_power = .75
  4. var merged = null
  5. var old_layer
  6. var old_mask
  7. var allow_merge_time = 0
  8. var allow_merge_threshold = 0.4
  9. var original_charge
  10. var boost_charge = 0
  11. func _ready():
  12. # Called every time the node is added to the scene.
  13. # Initialization here
  14. pass
  15. func _exit_tree():
  16. unmerge() # Checks if necessary automatically
  17. func _process(delta):
  18. if is_network_master():
  19. allow_merge_time += delta
  20. if not merged and allow_merge_time > allow_merge_threshold:
  21. var cols = get_colliding_bodies()
  22. for col in cols:
  23. if col.is_in_group("player"):
  24. var same_team = col.player_info.is_right_team == player_info.is_right_team
  25. if same_team:
  26. rpc("merge", col.get_name())
  27. if merged and Input.is_action_just_pressed("hero_3_unmerge"):
  28. rpc("unmerge")
  29. if merged:
  30. # Subtract and then add, so we can continously add this
  31. # We don't use build_charge because this is delicate math
  32. charge -= boost_charge
  33. boost_charge = merged.charge - original_charge
  34. charge += boost_charge
  35. # Network the changes
  36. build_charge(0)
  37. func control_player(state):
  38. if !merged:
  39. .control_player(state)
  40. func set_collisions(on):
  41. if on:
  42. collision_layer = old_layer
  43. collision_mask = old_mask
  44. gravity_scale = 1
  45. else:
  46. old_layer = collision_layer
  47. old_mask = collision_mask
  48. collision_layer = 0
  49. collision_mask = 0
  50. gravity_scale = 0
  51. func set_boosted_label(node, on):
  52. if on:
  53. var boosted_label = $Boosted.duplicate()
  54. boosted_label.show()
  55. node.add_child(boosted_label)
  56. else:
  57. var boosted_label = node.get_node("Boosted")
  58. boosted_label.queue_free()
  59. func set_boosting(is_boosting):
  60. set_collisions(!is_boosting)
  61. visible = !is_boosting
  62. if is_network_master():
  63. get_node("MasterOnly/Boosting").visible = is_boosting
  64. get_node(tp_camera).set_enabled(!is_boosting)
  65. func set_boosted(node, is_boosted):
  66. if is_network_master():
  67. # Assume their PoV, but no control
  68. node.get_node(node.tp_camera).set_enabled(is_boosted)
  69. if node.is_network_master():
  70. set_boosted_label(node, is_boosted)
  71. var ratio = (1 + merge_power)
  72. if !is_boosted:
  73. ratio = 1/ratio # Undo the effect
  74. node.walk_speed *= ratio
  75. node.air_accel *= ratio
  76. if is_boosted:
  77. original_charge = node.charge
  78. boost_charge = 0
  79. sync func merge(node_name):
  80. set_boosting(true)
  81. var other = util.get_player(node_name)
  82. set_boosted(other, true)
  83. merged = other
  84. sync func unmerge():
  85. if merged:
  86. set_boosted(merged, false)
  87. set_boosting(false)
  88. var pos = merged.get_translation()
  89. pos.z += 1
  90. set_translation(pos)
  91. merged = null