Player.gd 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. extends Block
  2. var grinder_enabled = false
  3. var slowdown_factor = 3
  4. const GRINDER_FREQ = 5
  5. const GRINDER_SCALE_ANITIME = 0.1
  6. var grinder_previous_pos = null
  7. func _init():
  8. MOVE_ANITIME = 0.2
  9. print("Player initting")
  10. color = ColorN("white")
  11. func _process(delta):
  12. if grinder_enabled:
  13. rotation = wrapf(rotation+2*PI*GRINDER_FREQ*delta,0,2*PI)
  14. var deletion_list = Array()
  15. var cur_pos = Vector2(_i,_j)
  16. var diff = cur_pos - grinder_previous_pos
  17. for b in Grid.Blocks:
  18. var b_pos = Vector2(b._i,b._j)
  19. var b_diff = b_pos - cur_pos
  20. if diff.x == 0:
  21. if b._i == _i and between(b._j, cur_pos.y, grinder_previous_pos.y):
  22. deletion_list.append(b)
  23. if diff.y == 0:
  24. if b._j == _j and between (b._i, cur_pos.x, grinder_previous_pos.x):
  25. deletion_list.append(b)
  26. if b_diff.length() < 0.98:
  27. deletion_list.append(b)
  28. for b in deletion_list:
  29. b.erase(true)
  30. func between(target_a,b,c): # b and c can be in any order
  31. var mi= min(b,c)
  32. var ma= max(b,c)
  33. return (target_a <= ma and target_a > mi)
  34. #func between(target_a,b,c): # b and c can be in any order
  35. # return (target_a == wrapf(target_a,a<ma and a>mi)
  36. func plunge():
  37. _prepare_action()
  38. moving_sound()
  39. var height_to_surface = 0
  40. var height_to_groundline = abs(_j)
  41. print ("ground is ", height_to_groundline, " away")
  42. for j in range(height_to_groundline+1):
  43. if Grid.get_block(_i,_j-sign(_j)*j):
  44. height_to_surface = j-2
  45. break
  46. var wing = height_to_surface
  47. if height_to_surface >= 0:
  48. print ("wing is", wing)
  49. var targets = Array()
  50. for i in range(_i-wing,_i+wing+1):
  51. print ("checking",i)
  52. for block in Grid.Blocks:
  53. if block._i == i:
  54. targets.append(block)
  55. if len(targets)!=0:
  56. var target_bb = Grid.get_bb(targets)
  57. var target_height_above_ground = target_bb.max_j + 1
  58. if _j < 0:
  59. target_height_above_ground = -target_bb.min_j + 1
  60. print("target_height = ", target_height_above_ground)
  61. var initial_j = _j
  62. var ani_progress = 0
  63. move_to(_i,sign(_j),0,MOVE_ANITIME, Tween.EASE_IN)
  64. ani_progress+=MOVE_ANITIME
  65. Grid.translate_block(targets,0,-sign(_j)*(target_height_above_ground+1),ani_progress)
  66. execute_after(ani_progress,"plunge_bounce_down")
  67. ani_progress+=BLOCK_MOVE_ANITIME
  68. execute_after(ani_progress,"plunge_bounce_back", targets)
  69. Grid.patch_ground_hole(target_bb.min_i,target_bb.max_i,ani_progress)
  70. ani_progress+=BLOCK_MOVE_ANITIME
  71. execute_after(ani_progress, "check_height")
  72. ignore_input_for(ani_progress)
  73. else:
  74. move_to(_i,sign(_j),0,MOVE_ANITIME, Tween.EASE_IN)
  75. func check_height():
  76. Grid.check_height()
  77. func plunge_bounce_down():
  78. print("plunge_down_sign", sign(_j)," ", _j)
  79. hitting_sound()
  80. move_to(_i,-sign(_j),0,BLOCK_MOVE_ANITIME, Tween.EASE_OUT)
  81. func plunge_bounce_back(targets):
  82. move_to(_i,-sign(_j))
  83. Grid.translate_block(targets,0,-sign(_j))
  84. func drill():
  85. _prepare_action()
  86. moving_sound()
  87. enable_grinder()
  88. var targets = Array()
  89. for b in Grid.Blocks:
  90. if b._i == _i:
  91. targets.append(b)
  92. var bb = Grid.get_bb(targets)
  93. if bb:
  94. var dest_j = -1
  95. if _j >=0:
  96. dest_j = bb.min_j-1
  97. else:
  98. dest_j = bb.max_j+1
  99. if abs (dest_j) > Grid.MAX_Y:
  100. dest_j = sign(dest_j)*Grid.MAX_Y
  101. move_to(_i,dest_j)
  102. else:
  103. move_to(_i, -sign(_j))
  104. execute_after(MOVE_ANITIME,"disable_grinder")
  105. ignore_input_for(MOVE_ANITIME)
  106. func roll(right = true):
  107. _prepare_action()
  108. moving_sound()
  109. var direction = 1 if right else -1
  110. var targets = Array()
  111. var j_below = _j - sign(_j)
  112. if Grid.get_block(_i,j_below):
  113. var length_forwards = Grid.check_x_continuity(_i,j_below,1)
  114. var length_backwards = Grid.check_x_continuity(_i,j_below,-1)
  115. for i in range(_i - length_backwards, _i + length_forwards+1):
  116. targets.append(Grid.get_block(i, j_below))
  117. for t in targets:
  118. if not (t._i + direction in range(Grid.BLOCKSX)):
  119. t.erase()
  120. Grid.translate_block(targets, direction, 0)
  121. if j_below == Grid.GROUND_LINE:
  122. if right and length_backwards == _i:
  123. Grid.add_trash(0,Grid.GROUND_LINE)
  124. if !right and length_forwards == Grid.BLOCKSX-1 - _i:
  125. Grid.add_trash(Grid.BLOCKSX-1,Grid.GROUND_LINE)
  126. var tw = SDTween.new()
  127. tw.interpolate_property(self,"rotation",rotation, rotation+direction*PI/2,BLOCK_MOVE_ANITIME,Tween.TRANS_CUBIC,Tween.EASE_IN_OUT)
  128. add_child(tw)
  129. tw.start()
  130. ignore_input_for(BLOCK_MOVE_ANITIME)
  131. func erase_layer(): #erases every block on a layer besides the one in is standing on
  132. _prepare_action()
  133. var prev_speed = MOVE_ANITIME
  134. MOVE_ANITIME *= slowdown_factor
  135. var ani_progress = 0
  136. enable_grinder()
  137. var move_targets = Array()
  138. for b in Grid.Blocks:
  139. if abs(b._j) > abs(_j) and sign(b._j) == sign(_j) and b._i != _i:
  140. move_targets.append(b)
  141. move_to(Grid.BLOCKSX-1,_j)
  142. slow_moving_sound()
  143. ani_progress+=MOVE_ANITIME
  144. execute_after(ani_progress,"erase_back")
  145. execute_after(ani_progress,"return_speed", prev_speed)
  146. ani_progress+=MOVE_ANITIME
  147. execute_after(ani_progress,"erase_return", _i)
  148. execute_after(ani_progress,"disable_grinder")
  149. if len(move_targets)!=0:
  150. execute_after(ani_progress,"erase_collapse", move_targets)
  151. ani_progress+=max(BLOCK_MOVE_ANITIME,prev_speed)
  152. else:
  153. ani_progress+=prev_speed
  154. ignore_input_for(ani_progress)
  155. func erase_back():
  156. slow_moving_sound()
  157. move_to(0,_j)
  158. func slow_moving_sound():
  159. var s = moving_sound()
  160. s.pitch_scale /= slowdown_factor
  161. s.volume_db+=1
  162. func erase_return(initial_i):
  163. move_to(initial_i,_j)
  164. func erase_collapse(targets):
  165. if len(targets)>=0:
  166. Grid.translate_block(targets,0,-sign(_j))
  167. func reset():
  168. _prepare_action()
  169. Grid.onscreen_reset()
  170. ignore_input_for(BLOCK_MOVE_ANITIME)
  171. func return_speed(prev_speed):
  172. MOVE_ANITIME = prev_speed
  173. func enable_grinder():
  174. grinder_previous_pos = Vector2(_i,_j)
  175. var tw = SDTween.new()
  176. tw.interpolate_property(self,"scale",scale,scale/sqrt(2),GRINDER_SCALE_ANITIME,Tween.TRANS_CUBIC,Tween.EASE_IN_OUT)
  177. add_child(tw)
  178. tw.start()
  179. grinder_enabled = true
  180. func disable_grinder():
  181. grinder_enabled = false
  182. var tw = SDTween.new()
  183. tw.interpolate_property(self,"scale",scale,scale*sqrt(2),GRINDER_SCALE_ANITIME,Tween.TRANS_CUBIC,Tween.EASE_IN_OUT)
  184. add_child(tw)
  185. tw.start()
  186. var tw2 = SDTween.new()
  187. tw2.interpolate_property(self,"rotation",rotation,0,GRINDER_SCALE_ANITIME,Tween.TRANS_CUBIC,Tween.EASE_IN_OUT)
  188. add_child(tw2)
  189. tw2.start()
  190. func hitting_sound():
  191. var p = SDRandPitch2D.new("res://sounds/pum2.ogg")
  192. add_child(p)
  193. p.play()
  194. func moving_sound():
  195. var p = SDRandPitch2D.new("res://sounds/juh.ogg")
  196. add_child(p)
  197. p.play()
  198. return p
  199. func _input(event):
  200. if event.is_action_pressed("erase_layer"):
  201. print("detecting input, player listening?",listening)
  202. if listening:
  203. var disabilities = Grid.Levels[Grid.current_level].disabled
  204. _prepare_action()
  205. if event.is_action_pressed("ui_up"):
  206. if not Grid.get_block(_i,_j+1):
  207. if abs(_j+1) <= Grid.MAX_Y:
  208. move_to(_i,_j+1 if not _j+1 == Grid.GROUND_LINE else _j+2)
  209. ignore_input_for(MOVE_ANITIME)
  210. moving_sound()
  211. if event.is_action_pressed("ui_down"):
  212. if not Grid.get_block(_i,_j-1):
  213. if abs(_j-1) <= Grid.MAX_Y:
  214. move_to(_i,_j-1 if not _j-1 == Grid.GROUND_LINE else _j-2)
  215. ignore_input_for(MOVE_ANITIME)
  216. moving_sound()
  217. if event.is_action_pressed("ui_right"):
  218. if not Grid.get_block(_i+1,_j):
  219. if _i+1 in range(Grid.BLOCKSX):
  220. move_to(_i+1,_j)
  221. ignore_input_for(MOVE_ANITIME)
  222. moving_sound()
  223. if event.is_action_pressed("ui_left"):
  224. if not Grid.get_block(_i-1,_j):
  225. if _i-1 in range(Grid.BLOCKSX):
  226. move_to(_i-1,_j)
  227. ignore_input_for(MOVE_ANITIME)
  228. moving_sound()
  229. if event.is_action_pressed("plunge"):
  230. if not "plunge" in disabilities:
  231. plunge()
  232. if event.is_action_pressed("drill"):
  233. if not "drill" in disabilities:
  234. drill()
  235. if event.is_action_pressed("erase_layer"):
  236. erase_layer()
  237. if event.is_action_pressed("roll_right"):
  238. if not "roll_right" in disabilities:
  239. roll(true)
  240. if event.is_action_pressed("roll_left"):
  241. if not "roll_left" in disabilities:
  242. roll(false)
  243. if event.is_action_pressed("ui_reset"):
  244. reset()
  245. if event.is_action_pressed("win"):
  246. Grid.win_stage()