PlanetNode.gd 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. extends Node2D
  2. class_name Planet
  3. onready var MAIN = find_parent("MAIN")
  4. var SHIP
  5. var TOP_PANEL
  6. export var color : Color
  7. export var mass=100
  8. var radius
  9. var planet_visual
  10. var rings = []
  11. var jam = null # can be shooter or strategy
  12. var jam_till_start = 0
  13. var jam_till_finish = 0
  14. var JAM_MIN_DURATION = 2
  15. var JAM_MAX_DURATION = 10
  16. var JAM_MIN_TIME_TO_START = 10
  17. var JAM_MAX_TIME_TO_START = 20
  18. #var jamstart_timer
  19. #var jamstop_timer
  20. var jam_timer
  21. var jam_missed_timer
  22. var jam_missed_timeout = 1.0
  23. var jam_state
  24. var labelnode
  25. var label
  26. enum {
  27. STRATEGY,
  28. SHOOTER
  29. }
  30. enum {
  31. STARTING
  32. IN_PROGRESS
  33. }
  34. var jam_names = {
  35. STRATEGY: "STRATEGY",
  36. SHOOTER: "SHOOTER"
  37. }
  38. var jam_dists = {
  39. STRATEGY: 80.0,
  40. SHOOTER: 60.0,
  41. }
  42. var jam_rewards = {
  43. STRATEGY: 0.5,
  44. SHOOTER: 1.0,
  45. }
  46. var ring_percents = [
  47. 0.3,
  48. 0.5,
  49. 1.0
  50. ]
  51. var ring_colors = [
  52. ColorN("cyan"),
  53. ColorN("yellow"),
  54. ColorN("magenta")
  55. ]
  56. # Called when the node enters the scene tree for the first time.
  57. func _ready():
  58. radius = sqrt(mass)*3
  59. randomize()
  60. planet_visual = Node2D.new()
  61. var circle = Circle.new(radius)
  62. circle.color = color
  63. planet_visual.add_child(circle)
  64. add_child(planet_visual)
  65. labelnode = Node2D.new()
  66. label = FontedLabel.new()
  67. add_child(labelnode)
  68. labelnode.visible = false
  69. labelnode.z_index = 2
  70. labelnode.add_child(label)
  71. label.rect_position = - Vector2(0, radius*2.5)
  72. label.align = HALIGN_CENTER
  73. label.grow_horizontal = Control.GROW_DIRECTION_BOTH
  74. label.text = ""
  75. labelnode.visible = false
  76. jam_timer = Timer.new()
  77. jam_missed_timer = Timer.new()
  78. call_deferred("add_child",jam_timer)
  79. call_deferred("add_child",jam_missed_timer)
  80. jam_missed_timer.wait_time = jam_missed_timeout
  81. jam_missed_timer.one_shot = true
  82. jam_timer.wait_time = 1.0
  83. jam_timer.connect("timeout",self,"on_jam_tick")
  84. jam_missed_timer.connect("timeout",self,"on_missed_jam_tick")
  85. MAIN.planets.append(self)
  86. func on_jam_tick():
  87. match(jam_state):
  88. STARTING:
  89. update_label_starting()
  90. if jam_till_start <= 0:
  91. start_jam()
  92. jam_till_start -= 1
  93. IN_PROGRESS:
  94. label.text = "FINISHES" + " IN " + str(jam_till_finish)
  95. if jam_till_finish <= 0:
  96. finish_jam()
  97. jam_till_finish -= 1
  98. func update_label_starting():
  99. label.text = jam_names[jam] + " IN " + str(jam_till_start) + " FOR " + str(jam_till_finish)
  100. func on_missed_jam_tick():
  101. print ("missed_jam fires")
  102. if jam == null:
  103. labelnode.visible = false
  104. label.text = ""
  105. func start_jam():
  106. print(jam_names[jam] + " tries to start")
  107. if jam == null:
  108. print(jam_names[jam] + " not a jam")
  109. return
  110. jam_state = IN_PROGRESS
  111. if SHIP == null:
  112. SHIP = MAIN.get_node("SHIP") # the order of entry into the tree is undefined
  113. if (SHIP.global_position - global_position).length() > rings[-1].radius:
  114. jam_missed()
  115. else:
  116. if TOP_PANEL == null:
  117. TOP_PANEL = MAIN.find_node("top_panel") # the order of entry into the tree is undefined
  118. TOP_PANEL.activate(self)
  119. func jam_missed():
  120. label.text = 'MISSED IT!'
  121. print ("jam missed")
  122. jam_missed_timer.start()
  123. finish_jam()
  124. labelnode.visible = true
  125. func add_random_jam():
  126. jam = randi() % 2
  127. print("jam pops up")
  128. make_rings()
  129. labelnode.visible = true
  130. jam_till_start = floor(rand_range(JAM_MIN_TIME_TO_START,JAM_MAX_TIME_TO_START))
  131. jam_till_finish = floor(rand_range(JAM_MIN_DURATION,JAM_MAX_DURATION))
  132. jam_state = STARTING
  133. jam_timer.start()
  134. update_label_starting()
  135. func finish_jam():
  136. jam_timer.stop()
  137. for r in rings:
  138. r.queue_free()
  139. rings.clear()
  140. jam = null
  141. labelnode.visible = false
  142. if TOP_PANEL == null:
  143. TOP_PANEL = MAIN.find_node("top_panel") # the order of entry into the tree is undefined
  144. TOP_PANEL.deactivate()
  145. func make_rings():
  146. for i in range(len(ring_colors)):
  147. var ring = CircleOutline.new(ring_percents[i]*jam_dists[jam] + radius)
  148. ring.default_color = ring_colors [i]
  149. ring.width = 2
  150. rings.append(ring)
  151. call_deferred("add_child",ring)