grappling_hook.gd 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. extends Area2D
  2. var speed = 0
  3. var dir = Vector2(0,0)
  4. var length = 0
  5. var max_length = 0
  6. var rest_length = 0
  7. var faction = 0
  8. var ship
  9. var target
  10. var offset = Vector2(0,0)
  11. var retract = false
  12. var joint
  13. var disabled = false
  14. func _destroy():
  15. if (disabled):
  16. return
  17. disabled = true
  18. set_process(false)
  19. get_node("Anim").play("destroy")
  20. joint.queue_free()
  21. func _collide(body):
  22. if (!body.disabled && !Factions.is_enemy(faction,body.faction)):
  23. return
  24. target = body
  25. offset = (global_position-body.global_position).rotated(-body.rotation)
  26. joint.set_node_a(ship.get_path())
  27. joint.set_node_b(body.get_path())
  28. _retract()
  29. dir = (body.global_position-get_parent().global_position).normalized()
  30. speed *= 0.5
  31. rest_length += max(body.size.x,body.size.y)/2.0
  32. func _retract():
  33. if (retract):
  34. return
  35. #clear_shapes()
  36. speed *= 0.5
  37. retract = true
  38. func _detach():
  39. if (disabled):
  40. return
  41. _retract()
  42. get_node("Particles").set_emitting(true)
  43. if (target!=null):
  44. get_node("Particles").set_initial_velocity(target.get_lv())
  45. target = null
  46. joint.set_node_a("")
  47. joint.set_node_b("")
  48. func _process(delta):
  49. if (retract):
  50. if (target!=null):
  51. if (length>rest_length):
  52. length -= delta*speed
  53. joint.set_node_b("")
  54. target.position += -delta*speed*dir
  55. joint.set_node_b(target.get_path())
  56. if (ship.global_position.distance_squared_to(target.global_position)<rest_length*rest_length):
  57. length = rest_length
  58. else:
  59. target.boarding = true
  60. ship.board_target = target
  61. ship.start_boarding()
  62. set_global_position(target.global_position+offset.rotated(target.rotation))
  63. else:
  64. length -= delta*speed
  65. if (length<=0):
  66. _destroy()
  67. return
  68. global_position = get_parent().global_position+length*dir
  69. else:
  70. length += delta*speed
  71. if (length>max_length):
  72. _retract()
  73. global_position = get_parent().global_position+length*dir
  74. get_node("Wire").set_region_rect(Rect2(0,0,32,2*global_position.distance_to(get_parent().global_position)-16))
  75. set_rotation(position.angle()-PI)
  76. func _ready():
  77. joint = get_node("Joint")
  78. set_process(true)
  79. get_node("Wire").set_material(get_node("Wire").get_material().duplicate())