level.gd 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. extends Node3D
  2. signal quit
  3. const RedRobot: PackedScene = preload("res://enemies/red_robot/red_robot.tscn")
  4. const PlayerScene: PackedScene = preload("res://player/player.tscn")
  5. var lightmap_gi: LightmapGI = null
  6. @onready var world_environment: WorldEnvironment = $WorldEnvironment
  7. @onready var robot_spawn_points: Node3D = $RobotSpawnpoints
  8. @onready var player_spawn_points: Node3D = $PlayerSpawnpoints
  9. @onready var spawned_nodes: Node3D = $SpawnedNodes
  10. func _ready() -> void:
  11. Settings.apply_graphics_settings(get_window(), world_environment.environment, self)
  12. if Settings.config_file.get_value("rendering", "gi_type") == Settings.GIType.SDFGI:
  13. setup_sdfgi()
  14. elif Settings.config_file.get_value("rendering", "gi_type") == Settings.GIType.VOXEL_GI:
  15. setup_voxelgi()
  16. else:
  17. setup_lightmapgi()
  18. if multiplayer.is_server():
  19. # Server will spawn the red robots
  20. for child in robot_spawn_points.get_children():
  21. spawn_robot(child)
  22. # Then spawn already connected players at random location
  23. randomize()
  24. var spawn_points = player_spawn_points.get_children()
  25. spawn_points.shuffle()
  26. add_player(1, spawn_points.pop_front())
  27. for id in multiplayer.get_peers():
  28. add_player(id, spawn_points.pop_front())
  29. # Then spawn/despawn players as they connect/disconnect
  30. multiplayer.peer_connected.connect(add_player)
  31. multiplayer.peer_disconnected.connect(del_player)
  32. func setup_sdfgi() -> void:
  33. world_environment.environment.sdfgi_enabled = true
  34. $VoxelGI.hide()
  35. $ReflectionProbes.hide()
  36. # LightmapGI nodes override SDFGI (even when hidden)
  37. # so we need to free the LightmapGI node if it exists
  38. if lightmap_gi != null:
  39. lightmap_gi.queue_free()
  40. if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.HIGH:
  41. RenderingServer.environment_set_sdfgi_ray_count(RenderingServer.ENV_SDFGI_RAY_COUNT_96)
  42. elif Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.LOW:
  43. RenderingServer.environment_set_sdfgi_ray_count(RenderingServer.ENV_SDFGI_RAY_COUNT_32)
  44. else:
  45. world_environment.environment.sdfgi_enabled = false
  46. func setup_voxelgi() -> void:
  47. world_environment.environment.sdfgi_enabled = false
  48. $VoxelGI.show()
  49. $ReflectionProbes.hide()
  50. # LightmapGI nodes override VoxelGI (even when hidden)
  51. # so we need to free the LightmapGI node if it exists
  52. if lightmap_gi != null:
  53. lightmap_gi.queue_free()
  54. if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.HIGH:
  55. RenderingServer.voxel_gi_set_quality(RenderingServer.VOXEL_GI_QUALITY_HIGH)
  56. elif Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.LOW:
  57. RenderingServer.voxel_gi_set_quality(RenderingServer.VOXEL_GI_QUALITY_LOW)
  58. else:
  59. $VoxelGI.hide()
  60. func setup_lightmapgi() -> void:
  61. world_environment.environment.sdfgi_enabled = false
  62. $VoxelGI.hide()
  63. $ReflectionProbes.show()
  64. # If no LightmapGI node, create one
  65. if lightmap_gi == null:
  66. var new_gi := LightmapGI.new()
  67. new_gi.light_data = load("res://level/level.lmbake")
  68. new_gi.name = "LightmapGI"
  69. lightmap_gi = new_gi
  70. add_child(new_gi)
  71. if Settings.config_file.get_value("rendering", "gi_quality") == Settings.GIQuality.DISABLED:
  72. lightmap_gi.hide()
  73. $ReflectionProbes.hide()
  74. func spawn_robot(spawn_point) -> void:
  75. var robot: CharacterBody3D = RedRobot.instantiate()
  76. robot.transform = spawn_point.transform
  77. robot.exploded.connect(_respawn_robot.bind(spawn_point))
  78. spawned_nodes.add_child(robot, true)
  79. func _respawn_robot(spawn_point) -> void:
  80. await get_tree().create_timer(15.0).timeout
  81. spawn_robot(spawn_point)
  82. func del_player(id: int) -> void:
  83. if not spawned_nodes.has_node(str(id)):
  84. return
  85. spawned_nodes.get_node(str(id)).queue_free()
  86. func add_player(id: int, spawn_point: Marker3D = null) -> void:
  87. if spawn_point == null:
  88. spawn_point = player_spawn_points.get_child(randi() % player_spawn_points.get_child_count())
  89. var player: CharacterBody3D = PlayerScene.instantiate()
  90. player.name = str(id)
  91. player.player_id = id
  92. player.transform = spawn_point.transform
  93. spawned_nodes.add_child(player)
  94. func _input(input_event: InputEvent) -> void:
  95. if input_event.is_action_pressed(&"quit"):
  96. Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
  97. quit.emit()