Player.gd 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. class_name Player
  2. extends GirlMob
  3. onready var lighting_text = $"../../UI/LightingTime"
  4. onready var necklace_light = $"NecklaceLight"
  5. onready var lightning_ray = $"LightningRay"
  6. onready var camera = $"../Camera2D"
  7. onready var outline_material: Material = preload("res://shader/outline_material.tres")
  8. onready var music_player = $"../../MusicPlayer"
  9. onready var label = $"../../UI/Caption"
  10. onready var blockade = $"../NecklaceWall"
  11. var recent_collider: BaseMob = null
  12. var lighting_time: float = 10.0
  13. var strike_time: bool = false
  14. var last_checkpoint: Vector2
  15. var just_restarted = 0
  16. var necklace_on = false
  17. var animated = false
  18. onready var reloadable = $"../Reloadable"
  19. var clone_of_reloadable
  20. var int_tick = 0
  21. func _ready():
  22. lightning = $"../Lightning"
  23. lives = 1
  24. last_checkpoint = get_position()
  25. frozen = false
  26. outside_the_building = true
  27. _add_time(0)
  28. camera.fix_camera()
  29. base_max_velocity = 50.0
  30. clone_of_reloadable = reloadable.duplicate()
  31. # necklace_on = true
  32. # go_inside()
  33. func _input(event):
  34. if animated:
  35. if event.is_action_pressed("necklace"):
  36. blockade.queue_free()
  37. label.set_visible(false)
  38. necklace_on = true
  39. body.set_sprite_frames(preload("res://asset/body_necklace.tres"))
  40. $"../../UI/LightingTime".set_visible(true)
  41. else:
  42. if event is InputEventKey and event.pressed:
  43. if event.is_action_pressed("move_up"): # and not walking_down and not walking_up:
  44. jump_grace_timer.start()
  45. elif event.is_action_pressed("restart") and lives > 0:
  46. lives = -100000
  47. elif event.is_action_pressed("sprint"):
  48. pass
  49. # if base_max_velocity < 400:
  50. # base_max_velocity = 1000.0
  51. # else:
  52. # base_max_velocity = 100.0
  53. func _physics_process(_delta):
  54. int_tick += 1
  55. if int_tick > 10:
  56. var rld = $"../Reloadable"
  57. if rld != null:
  58. var mobs = rld.get_children()
  59. var lowest_dist = 100000.0
  60. for mob in mobs:
  61. if !mob.frozen:
  62. lowest_dist = min(mob.position.distance_to(position), lowest_dist)
  63. if lowest_dist < 500:
  64. music_player.set_combat_intensity(1.0 - lowest_dist / 500.0)
  65. else:
  66. music_player.set_combat_intensity(0.0)
  67. int_tick = 0
  68. if just_restarted > 0:
  69. just_restarted -= 1
  70. if just_restarted == 0:
  71. var new_clone = clone_of_reloadable.duplicate()
  72. get_parent().add_child(new_clone)
  73. reloadable = new_clone
  74. music_player.set_rain_intensity(-position.distance_to(Vector2(0, 0)) / 105.0)
  75. func _process(_delta):
  76. pass
  77. func _add_time(delta):
  78. if !necklace_on:
  79. return
  80. var ratio: float = (10.0 - lighting_time) / 10.0
  81. lighting_time -= delta
  82. if lighting_time < 0.0:
  83. strike_time = true
  84. lighting_time = 10.0
  85. if lighting_time > 9.99:
  86. lighting_text.clear()
  87. lighting_text.push_color(Color(1, 1, 1, 1))
  88. lighting_text.add_text("9.99")
  89. elif lighting_time > 3.0:
  90. lighting_text.clear()
  91. lighting_text.push_color(Color(1, 1, 1, 1))
  92. lighting_text.add_text("%2.2f" % lighting_time)
  93. else:
  94. lighting_text.clear()
  95. lighting_text.push_color(Color(1, 0, 0, 1))
  96. lighting_text.add_text("%2.2f" % lighting_time)
  97. necklace_light.set_energy(ratio * 2.0)
  98. var color = outline_material.get_shader_param("color")
  99. outline_material.set_shader_param("color", Color(color.r, color.g, color.b, ratio / 1.0))
  100. func read_input(delta):
  101. if animated:
  102. flip(true)
  103. velocity.x += speed
  104. return
  105. if Input.is_action_pressed("move_up"):
  106. velocity.y -= delta * gravity * jump_strength
  107. if Input.is_action_pressed("move_right"):
  108. velocity.x += speed
  109. flip(true)
  110. elif Input.is_action_pressed("move_left"):
  111. velocity.x -= speed
  112. flip(false)
  113. else:
  114. velocity.x += speed * -sign(velocity.x)
  115. if abs(velocity.x) < 0.01 and abs(velocity.y) < 0.01 and Input.is_action_pressed("fast_forward"):
  116. _add_time(delta * 3)
  117. func finalize(delta):
  118. if (abs(real_velocity.x) > 0.05 or abs(real_velocity.y) > 0.05 or walking_up) and lives > 0:
  119. camera.fix_camera()
  120. _add_time(delta)
  121. lightning_ray.set_cast_to(Vector2(200 if sprite_direction else -200, 0))
  122. var collider = lightning_ray.get_collider()
  123. if collider is BaseMob:
  124. if recent_collider != null && recent_collider != collider:
  125. recent_collider.body.set_material(null)
  126. collider.body.set_material(outline_material)
  127. recent_collider = collider
  128. else:
  129. if recent_collider != null and is_instance_valid(recent_collider):
  130. recent_collider.body.set_material(null)
  131. recent_collider = null
  132. if strike_time:
  133. strike_time = false
  134. if collider == null:
  135. strike()
  136. lightning.strike(position)
  137. else:
  138. collider.strike()
  139. lightning.strike(collider.position)
  140. if collider is Candle:
  141. last_checkpoint = collider.get_position() + collider.respawn_point.get_position()
  142. func strike():
  143. .strike()
  144. lighting_text.set_visible(false)
  145. func restart():
  146. lives = 1
  147. walker.stop_all()
  148. set_position(last_checkpoint)
  149. set_visible(true)
  150. camera.fix_camera()
  151. lighting_time = 10.0
  152. reloadable.queue_free()
  153. just_restarted = 2
  154. recent_collider = null
  155. flip(true)
  156. velocity = Vector2(0, 0)
  157. func watch_for_death(delta):
  158. if lives < 1:
  159. if lives > -100000:
  160. if DEBUG:
  161. lives = 1
  162. lighting_time = 10.0
  163. else:
  164. set_scale(Vector2(1.0, get_scale().y - delta * 5.0))
  165. if get_scale().y < 0.0:
  166. set_visible(false)
  167. if lightning.landed == false and lightning.expanding == false:
  168. set_scale(Vector2(1.0, 1.0))
  169. _add_time(0)
  170. lighting_text.set_visible(true)
  171. restart()
  172. else:
  173. restart()
  174. func _on_necklace_scene(_body):
  175. animated = true
  176. label.parse_bbcode('[center][color=#AAAAAA]' + '(press N to put on the necklace)' + '[/color][/center]')
  177. label.set_visible(true)
  178. func _on_necklace_scene_end(_body):
  179. $"../../UI/Logo".set_visible(true)
  180. $Timer.start()
  181. func go_inside():
  182. set_position(get_position() + Vector2(128.0, 0))
  183. $"../../UI/Logo".set_visible(false)
  184. base_max_velocity = 100.0
  185. camera.set_position(camera.get_position() - Vector2(96.0, 0.0) + Vector2(24.0, 0.0))
  186. last_checkpoint = get_position()
  187. outside_the_building = false
  188. music_player.go_inside()
  189. lighting_time = 10.0
  190. animated = false
  191. var fx = AudioServer.get_bus_effect(1, 0)
  192. fx.set_room_size(0.5)
  193. fx.set_wet(0.5)