forked from woofmeow/straywild
Add deterministic generated worlds
This commit is contained in:
parent
19f63bd656
commit
e8888ed05a
87 changed files with 3743 additions and 139 deletions
92
main/main.gd
92
main/main.gd
|
|
@ -409,6 +409,12 @@ func _start_dedicated_server() -> void:
|
|||
):
|
||||
_fail_dedicated_server("The server operator list is invalid.")
|
||||
return
|
||||
if not _apply_generated_world(config.world_seed, false):
|
||||
_fail_dedicated_server("The configured world seed could not be generated.")
|
||||
return
|
||||
if not _network_session.set_host_world_seed(config.world_seed):
|
||||
_fail_dedicated_server("The configured world seed is invalid.")
|
||||
return
|
||||
_configure_portable_stores()
|
||||
if not _discovery.configure_dedicated_runtime(config.server_name):
|
||||
_fail_dedicated_server("The server room name is invalid.")
|
||||
|
|
@ -1666,14 +1672,24 @@ func _resize_native_overlays() -> void:
|
|||
_shop_backdrop.size = Vector2(get_window().size)
|
||||
|
||||
|
||||
func _on_new_game_requested() -> void:
|
||||
func _on_new_game_requested(world_seed: int) -> void:
|
||||
if _gameplay_started or _quit_in_progress:
|
||||
return
|
||||
if not _apply_generated_world(world_seed, true):
|
||||
_game_ui.get_title_screen().report_network_error(
|
||||
"Could not generate that world seed. Try rolling another world."
|
||||
)
|
||||
return
|
||||
if not _prepare_host_world_seed(world_seed):
|
||||
_game_ui.get_title_screen().report_network_error(
|
||||
"Could not prepare the generated world for hosting."
|
||||
)
|
||||
return
|
||||
if not _prepare_private_host():
|
||||
return
|
||||
if (
|
||||
not _save_manager.delete_progression_save()
|
||||
or not _save_manager.initialize_new_game()
|
||||
or not _save_manager.initialize_new_game(world_seed)
|
||||
):
|
||||
_network_session.disconnect_session("New Game setup failed.")
|
||||
_game_ui.get_title_screen().report_network_error(
|
||||
|
|
@ -1686,14 +1702,22 @@ func _on_new_game_requested() -> void:
|
|||
func _on_continue_game_requested() -> void:
|
||||
if _gameplay_started or _quit_in_progress:
|
||||
return
|
||||
if not _prepare_private_host():
|
||||
return
|
||||
if not _save_manager.load_player_data():
|
||||
_network_session.disconnect_session("Continue failed.")
|
||||
_game_ui.get_title_screen().report_network_error(
|
||||
"Failed to load save. The original was preserved."
|
||||
)
|
||||
return
|
||||
var world_seed: int = _save_manager.get_world_seed()
|
||||
if (
|
||||
not _apply_generated_world(world_seed, true)
|
||||
or not _prepare_host_world_seed(world_seed)
|
||||
):
|
||||
_game_ui.get_title_screen().report_network_error(
|
||||
"The saved world could not be generated. The save was preserved."
|
||||
)
|
||||
return
|
||||
if not _prepare_private_host():
|
||||
return
|
||||
_enter_gameplay()
|
||||
|
||||
|
||||
|
|
@ -1716,6 +1740,15 @@ func _prepare_private_host() -> bool:
|
|||
return true
|
||||
|
||||
|
||||
func _prepare_host_world_seed(world_seed: int) -> bool:
|
||||
if _network_session.state in [
|
||||
NetworkSessionType.State.CONNECTION_FAILED,
|
||||
NetworkSessionType.State.SERVER_LOST,
|
||||
]:
|
||||
_network_session.reset_failure()
|
||||
return _network_session.set_host_world_seed(world_seed)
|
||||
|
||||
|
||||
func _enter_gameplay() -> void:
|
||||
_fade_out_title_music()
|
||||
_game_ui.get_title_screen().hide()
|
||||
|
|
@ -1805,10 +1838,14 @@ func _on_network_join_authenticated() -> void:
|
|||
)
|
||||
_join_requested_from_title = false
|
||||
return
|
||||
if not _apply_joined_world(server_metadata):
|
||||
return
|
||||
_fade_out_title_music()
|
||||
_game_ui.get_title_screen().hide()
|
||||
_set_gameplay_active(true)
|
||||
elif _join_requested_from_pause:
|
||||
if not _apply_joined_world(server_metadata):
|
||||
return
|
||||
_set_gameplay_active(true)
|
||||
_join_requested_from_title = false
|
||||
_join_requested_from_pause = false
|
||||
|
|
@ -1912,7 +1949,12 @@ func _on_reset_progress_requested() -> void:
|
|||
if not _save_manager.delete_progression_save():
|
||||
pause_menu.report_reset_failure()
|
||||
return
|
||||
if not _save_manager.initialize_new_game():
|
||||
var world_seed: int = PlayerSaveManager.roll_world_seed()
|
||||
if not _save_manager.initialize_new_game(world_seed):
|
||||
pause_menu.report_reset_failure()
|
||||
return
|
||||
_network_session.disconnect_session("Progress reset.")
|
||||
if not _apply_generated_world(world_seed, true):
|
||||
pause_menu.report_reset_failure()
|
||||
return
|
||||
pause_menu.close_for_title_transition()
|
||||
|
|
@ -1921,6 +1963,44 @@ func _on_reset_progress_requested() -> void:
|
|||
_show_title_music(true)
|
||||
|
||||
|
||||
func _apply_joined_world(server_metadata: Dictionary) -> bool:
|
||||
var world_seed: int = int(server_metadata.get("world_seed", 0))
|
||||
if _apply_generated_world(world_seed, true):
|
||||
return true
|
||||
_network_session.disconnect_session("World generation failed.")
|
||||
_join_requested_from_title = false
|
||||
_join_requested_from_pause = false
|
||||
_set_gameplay_active(false)
|
||||
var title_screen: TitleScreenType = _game_ui.get_title_screen()
|
||||
title_screen.reopen_to_menu()
|
||||
title_screen.report_network_error(
|
||||
"The host's generated world could not be built locally."
|
||||
)
|
||||
_show_title_music(true)
|
||||
return false
|
||||
|
||||
|
||||
func _apply_generated_world(world_seed: int, reposition_player: bool) -> bool:
|
||||
if not _test_world.generate_world(world_seed):
|
||||
return false
|
||||
var spawn_transform: Transform3D = _test_world.get_player_spawn_transform()
|
||||
_player_spawn_service.set_spawn_transform(spawn_transform)
|
||||
if reposition_player:
|
||||
_player.global_transform = spawn_transform
|
||||
_player.velocity = Vector3.ZERO
|
||||
if _application_initialized and not _dedicated_runtime:
|
||||
_water_recovery.update_world_context(
|
||||
spawn_transform,
|
||||
_test_world.get_player_water_triggers(),
|
||||
_test_world.get_safe_respawn_points(),
|
||||
)
|
||||
_shoreline_ambience.configure(
|
||||
_player,
|
||||
_test_world.get_saltwater_shoreline_mesh(),
|
||||
)
|
||||
return true
|
||||
|
||||
|
||||
func _on_water_recovery_starting() -> void:
|
||||
_local_recovery_attempt_id = (
|
||||
"recovery:%s"
|
||||
|
|
|
|||
|
|
@ -298,48 +298,11 @@ unique_name_in_owner = true
|
|||
script = ExtResource("36_player_list")
|
||||
|
||||
[node name="TestWorld" parent="." unique_id=1334932296 instance=ExtResource("1_world")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2.4475808, 0, -1.8959346)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0)
|
||||
|
||||
[node name="Sun" parent="TestWorld/Environment" index="1"]
|
||||
transform = Transform3D(0.8480481, 0.4287137, -0.31147876, 0, 0.5877853, 0.809017, 0.52991927, -0.68608534, 0.49847022, 0, 0, 0)
|
||||
|
||||
[node name="Shape" parent="TestWorld/Regions/StarterIslandRegion/Terrain/Collision" index="0" unique_id=674742331]
|
||||
shape = SubResource("ConcavePolygonShape3D_hifdc")
|
||||
|
||||
[node name="Pond" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies" index="0" unique_id=995477450]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.4, 2.51, 2.1)
|
||||
|
||||
[node name="VisualWater" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Pond" index="0" unique_id=1034265960]
|
||||
mesh = SubResource("PlaneMesh_7ny4s")
|
||||
|
||||
[node name="Shape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Pond/FishingRegion" index="0" unique_id=1185360438]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0)
|
||||
shape = SubResource("BoxShape3D_agj3o")
|
||||
|
||||
[node name="Shape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Pond/RecoveryRegion" index="0" unique_id=1718808476]
|
||||
shape = SubResource("BoxShape3D_l6210")
|
||||
|
||||
[node name="VisualWater" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean" index="0" unique_id=1176408937]
|
||||
mesh = SubResource("PlaneMesh_6upbg")
|
||||
|
||||
[node name="Shape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/FishingRegions/OceanFishingRegion" index="0" unique_id=357406062]
|
||||
shape = SubResource("BoxShape3D_umo15")
|
||||
|
||||
[node name="WestShape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/RecoveryRegions/OceanRecoveryRegion" index="0" unique_id=1183368645]
|
||||
shape = SubResource("BoxShape3D_1fdkm")
|
||||
|
||||
[node name="EastShape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/RecoveryRegions/OceanRecoveryRegion" index="1" unique_id=1742419808]
|
||||
shape = SubResource("BoxShape3D_y2c0j")
|
||||
|
||||
[node name="NorthShape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/RecoveryRegions/OceanRecoveryRegion" index="2" unique_id=1844920260]
|
||||
shape = SubResource("BoxShape3D_uwwqy")
|
||||
|
||||
[node name="SouthShape" parent="TestWorld/Regions/StarterIslandRegion/WaterBodies/Ocean/RecoveryRegions/OceanRecoveryRegion" index="3" unique_id=1316495770]
|
||||
shape = SubResource("BoxShape3D_hf28p")
|
||||
|
||||
[node name="FishingShopWorld" parent="TestWorld/Regions/StarterIslandRegion/Interactables" index="0" unique_id=1255373524]
|
||||
transform = Transform3D(-0.9976046, 0, -0.06917416, 0, 1, 0, 0.06917416, 0, -0.9976046, 7.3292284, 3.4012775, 14.888193)
|
||||
|
||||
[node name="BelowWorldFailsafe" parent="TestWorld/Safety" index="0"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12, -7, 0)
|
||||
|
||||
|
|
@ -436,4 +399,3 @@ unique_name_in_owner = true
|
|||
unique_name_in_owner = true
|
||||
|
||||
[editable path="TestWorld"]
|
||||
[editable path="TestWorld/Regions/StarterIslandRegion"]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue