diff --git a/art/exported/environment/terrain/starter_island.glb b/art/exported/environment/terrain/starter_island.glb index 5d8b6ce..8c71154 100644 Binary files a/art/exported/environment/terrain/starter_island.glb and b/art/exported/environment/terrain/starter_island.glb differ diff --git a/art/exported/environment/terrain/starter_island.glb.import b/art/exported/environment/terrain/starter_island.glb.import index 18e4e12..bedce7c 100644 --- a/art/exported/environment/terrain/starter_island.glb.import +++ b/art/exported/environment/terrain/starter_island.glb.import @@ -41,5 +41,5 @@ materials/extract_format=0 materials/extract_path="" _subresources={} gltf/naming_version=2 -gltf/embedded_image_handling=3 +gltf/embedded_image_handling=1 gltf/texture_map_mode=1 diff --git a/art/exported/environment/textures/cliff_wall.png b/art/exported/environment/textures/cliff_wall.png deleted file mode 100644 index 3fe157f..0000000 Binary files a/art/exported/environment/textures/cliff_wall.png and /dev/null differ diff --git a/art/exported/environment/textures/cliff_wall.png.import b/art/exported/environment/textures/cliff_wall.png.import deleted file mode 100644 index 026f231..0000000 --- a/art/exported/environment/textures/cliff_wall.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://cd7qwsbeg1jxx" -path="res://.godot/imported/cliff_wall.png-7ce756d49c24c7b8fdda307d68086d87.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://art/exported/environment/textures/cliff_wall.png" -dest_files=["res://.godot/imported/cliff_wall.png-7ce756d49c24c7b8fdda307d68086d87.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/art/exported/environment/textures/dirt_wall.png b/art/exported/environment/textures/dirt_wall.png deleted file mode 100644 index dcc2364..0000000 Binary files a/art/exported/environment/textures/dirt_wall.png and /dev/null differ diff --git a/art/exported/environment/textures/dirt_wall.png.import b/art/exported/environment/textures/dirt_wall.png.import deleted file mode 100644 index 1b09653..0000000 --- a/art/exported/environment/textures/dirt_wall.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://c3j0gailr6yfy" -path="res://.godot/imported/dirt_wall.png-8ba7bb24831d83f929bfa44b53af9288.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://art/exported/environment/textures/dirt_wall.png" -dest_files=["res://.godot/imported/dirt_wall.png-8ba7bb24831d83f929bfa44b53af9288.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/art/exported/environment/textures/grass.png b/art/exported/environment/textures/grass.png deleted file mode 100644 index 8d9761c..0000000 Binary files a/art/exported/environment/textures/grass.png and /dev/null differ diff --git a/art/exported/environment/textures/grass_heavy.png b/art/exported/environment/textures/grass_heavy.png deleted file mode 100644 index 29bfa2a..0000000 Binary files a/art/exported/environment/textures/grass_heavy.png and /dev/null differ diff --git a/art/exported/environment/textures/grass_heavy.png.import b/art/exported/environment/textures/grass_heavy.png.import deleted file mode 100644 index d99e72b..0000000 --- a/art/exported/environment/textures/grass_heavy.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://dusa52a3eghr7" -path="res://.godot/imported/grass_heavy.png-ba7f679d1bc5402f8b0a3465ac6a44b8.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://art/exported/environment/textures/grass_heavy.png" -dest_files=["res://.godot/imported/grass_heavy.png-ba7f679d1bc5402f8b0a3465ac6a44b8.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/art/exported/environment/textures/grass_lite.png b/art/exported/environment/textures/grass_lite.png deleted file mode 100644 index b701eed..0000000 Binary files a/art/exported/environment/textures/grass_lite.png and /dev/null differ diff --git a/art/exported/environment/textures/grass_lite.png.import b/art/exported/environment/textures/grass_lite.png.import deleted file mode 100644 index a5ec41c..0000000 --- a/art/exported/environment/textures/grass_lite.png.import +++ /dev/null @@ -1,41 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://crci2on30ctoc" -path.s3tc="res://.godot/imported/grass_lite.png-f89cf6413257cd31582bd4f9f875ae85.s3tc.ctex" -metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/environment/textures/grass_lite.png" -dest_files=["res://.godot/imported/grass_lite.png-f89cf6413257cd31582bd4f9f875ae85.s3tc.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/exported/environment/textures/sand.png b/art/exported/environment/textures/sand.png deleted file mode 100644 index 06f807a..0000000 Binary files a/art/exported/environment/textures/sand.png and /dev/null differ diff --git a/art/exported/environment/textures/sand.png.import b/art/exported/environment/textures/sand.png.import deleted file mode 100644 index 82f5791..0000000 --- a/art/exported/environment/textures/sand.png.import +++ /dev/null @@ -1,41 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://bnje415gq85nn" -path.s3tc="res://.godot/imported/sand.png-41fc96c392119deeba43c2d4e49d88a5.s3tc.ctex" -metadata={ -"imported_formats": ["s3tc_bptc"], -"vram_texture": true -} - -[deps] - -source_file="res://art/exported/environment/textures/sand.png" -dest_files=["res://.godot/imported/sand.png-41fc96c392119deeba43c2d4e49d88a5.s3tc.ctex"] - -[params] - -compress/mode=2 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=true -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=0 diff --git a/art/source/characters/base/netfishing_base_character.blend b/art/source/characters/base/netfishing_base_character.blend index 12aa0fa..2da3679 100644 Binary files a/art/source/characters/base/netfishing_base_character.blend and b/art/source/characters/base/netfishing_base_character.blend differ diff --git a/art/source/environment/terrain/starter_island.blend b/art/source/environment/terrain/starter_island.blend index 9d3b513..3eb342d 100644 Binary files a/art/source/environment/terrain/starter_island.blend and b/art/source/environment/terrain/starter_island.blend differ diff --git a/fishing/fishing_spot.gd b/fishing/fishing_spot.gd index 18be08a..e010a4a 100644 --- a/fishing/fishing_spot.gd +++ b/fishing/fishing_spot.gd @@ -26,7 +26,6 @@ const PlayerType = preload("res://player/player.gd") const FishableWaterRegionType = preload( "res://world/fishable_water_region.gd" ) -const NetworkSessionType = preload("res://network/network_session.gd") signal status_changed(status: String) signal catch_display_changed( @@ -105,7 +104,6 @@ var _item_catalog: ItemCatalogType var _fishing_upgrades: PlayerFishingUpgradesType var _item_effects: PlayerItemEffectsType var _cooler_capacity: PlayerCoolerCapacityType -var _network_session: NetworkSessionType var _active_player: PlayerType var _state_time_remaining: float = 0.0 var _cast_charge: float = 0.0 @@ -149,7 +147,6 @@ func setup( fishing_upgrades: PlayerFishingUpgradesType, item_effects: PlayerItemEffectsType, cooler_capacity: PlayerCoolerCapacityType, - network_session: NetworkSessionType = null, ) -> void: _local_player = local_player _local_inventory = local_inventory @@ -160,7 +157,6 @@ func setup( _fishing_upgrades = fishing_upgrades _item_effects = item_effects _cooler_capacity = cooler_capacity - _network_session = network_session if not _local_inventory.catches_changed.is_connected( _on_cooler_availability_changed ): @@ -199,8 +195,6 @@ func can_open_system_menu() -> bool: func can_open_fishing_shop() -> bool: return ( - _can_use_shared_gameplay() - and _gameplay_input_enabled and not _external_input_blocked and _local_menu_input_owners.is_empty() @@ -210,8 +204,6 @@ func can_open_fishing_shop() -> bool: func is_ready_for_shop_transaction() -> bool: return ( - _can_use_shared_gameplay() - and _gameplay_input_enabled and not _external_input_blocked and state == FishingState.READY @@ -375,13 +367,6 @@ func _unhandled_input(event: InputEvent) -> void: return if not event.is_action("fish_primary"): return - if not _can_use_shared_gameplay(): - if event.is_pressed(): - status_changed.emit( - "Fishing in joined games is coming in the next multiplayer phase." - ) - get_viewport().set_input_as_handled() - return if event.is_pressed(): match state: @@ -465,10 +450,6 @@ func _begin_aiming(player: PlayerType) -> void: ) -func _can_use_shared_gameplay() -> bool: - return _network_session == null or _network_session.can_use_host_gameplay() - - func has_active_fishing_rod() -> bool: if ( _local_bag == null diff --git a/items/catalog/basic_fishing_rod.tres b/items/catalog/basic_fishing_rod.tres index f43f9ca..4530abc 100644 --- a/items/catalog/basic_fishing_rod.tres +++ b/items/catalog/basic_fishing_rod.tres @@ -1,7 +1,7 @@ [gd_resource type="Resource" script_class="ItemData" load_steps=3 format=3] [ext_resource type="Script" path="res://items/item_data.gd" id="1_script"] -[ext_resource type="Texture2D" path="res://items/icons/equipment/64_rod_base_thick.png" id="2_icon"] +[ext_resource type="Texture2D" path="res://items/icons/placeholder/basic_fishing_rod.svg" id="2_icon"] [resource] script = ExtResource("1_script") diff --git a/items/icons/equipment/64_rod_base_thick.png b/items/icons/equipment/64_rod_base_thick.png deleted file mode 100644 index fb56ec2..0000000 Binary files a/items/icons/equipment/64_rod_base_thick.png and /dev/null differ diff --git a/items/icons/equipment/64_rod_base_thick.png.import b/items/icons/equipment/64_rod_base_thick.png.import deleted file mode 100644 index c8594f3..0000000 --- a/items/icons/equipment/64_rod_base_thick.png.import +++ /dev/null @@ -1,40 +0,0 @@ -[remap] - -importer="texture" -type="CompressedTexture2D" -uid="uid://02t4tyyt0vwi" -path="res://.godot/imported/64_rod_base_thick.png-60188964cb71ab30683aa983d1300765.ctex" -metadata={ -"vram_texture": false -} - -[deps] - -source_file="res://items/icons/equipment/64_rod_base_thick.png" -dest_files=["res://.godot/imported/64_rod_base_thick.png-60188964cb71ab30683aa983d1300765.ctex"] - -[params] - -compress/mode=0 -compress/high_quality=false -compress/lossy_quality=0.7 -compress/uastc_level=0 -compress/rdo_quality_loss=0.0 -compress/hdr_compression=1 -compress/normal_map=0 -compress/channel_pack=0 -mipmaps/generate=false -mipmaps/limit=-1 -roughness/mode=0 -roughness/src_normal="" -process/channel_remap/red=0 -process/channel_remap/green=1 -process/channel_remap/blue=2 -process/channel_remap/alpha=3 -process/fix_alpha_border=true -process/premult_alpha=false -process/normal_map_invert_y=false -process/hdr_as_srgb=false -process/hdr_clamp_exposure=false -process/size_limit=0 -detect_3d/compress_to=1 diff --git a/items/icons/placeholder/basic_fishing_rod.svg b/items/icons/placeholder/basic_fishing_rod.svg new file mode 100644 index 0000000..ee4a812 --- /dev/null +++ b/items/icons/placeholder/basic_fishing_rod.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/art/exported/environment/textures/grass.png.import b/items/icons/placeholder/basic_fishing_rod.svg.import similarity index 65% rename from art/exported/environment/textures/grass.png.import rename to items/icons/placeholder/basic_fishing_rod.svg.import index 9d7961f..e2aef7d 100644 --- a/art/exported/environment/textures/grass.png.import +++ b/items/icons/placeholder/basic_fishing_rod.svg.import @@ -2,16 +2,16 @@ importer="texture" type="CompressedTexture2D" -uid="uid://b4n8bf4cgua4s" -path="res://.godot/imported/grass.png-4d1108b11a421d9c16bd72fb0bc993d3.ctex" +uid="uid://c6krnuo5lp861" +path="res://.godot/imported/basic_fishing_rod.svg-bc9101c1a69623deb55f1b3189ae4567.ctex" metadata={ "vram_texture": false } [deps] -source_file="res://art/exported/environment/textures/grass.png" -dest_files=["res://.godot/imported/grass.png-4d1108b11a421d9c16bd72fb0bc993d3.ctex"] +source_file="res://items/icons/placeholder/basic_fishing_rod.svg" +dest_files=["res://.godot/imported/basic_fishing_rod.svg-bc9101c1a69623deb55f1b3189ae4567.ctex"] [params] @@ -38,3 +38,6 @@ process/hdr_as_srgb=false process/hdr_clamp_exposure=false process/size_limit=0 detect_3d/compress_to=1 +svg/scale=1.0 +editor/scale_with_editor_scale=false +editor/convert_colors_with_editor_theme=false diff --git a/main/main.gd b/main/main.gd index d2f5542..51e645b 100644 --- a/main/main.gd +++ b/main/main.gd @@ -33,16 +33,6 @@ const PixelationResetOverlayType = preload( const WorldPixelationPostprocessType = preload( "res://main/world_pixelation_postprocess.gd" ) -const NetworkSessionType = preload("res://network/network_session.gd") -const NetworkProfilePreferencesType = preload( - "res://network/network_profile_preferences.gd" -) -const SavedServerStoreType = preload( - "res://network/saved_server_store.gd" -) -const PlayerSpawnServiceType = preload( - "res://network/player_spawn_service.gd" -) const TITLE_MUSIC_SILENCE_DB: float = -80.0 @@ -69,15 +59,6 @@ const TITLE_MUSIC_SILENCE_DB: float = -80.0 @onready var _world_pixelation: WorldPixelationPostprocessType = ( %WorldPixelationPostprocess ) -@onready var _network_session: NetworkSessionType = %NetworkSession -@onready var _network_profile: NetworkProfilePreferencesType = ( - %NetworkProfilePreferences -) -@onready var _saved_servers: SavedServerStoreType = %SavedServerStore -@onready var _player_spawn_service: PlayerSpawnServiceType = ( - %PlayerSpawnService -) -@onready var _players_root: Node3D = $Players var _gameplay_started: bool = false var _shop_interaction: FishingShopInteractionType @@ -85,34 +66,11 @@ var _title_music_tween: Tween var _title_music_transition_generation: int = 0 var _title_music_requested: bool = false var _quit_in_progress: bool = false -var _join_requested_from_title: bool = false -var _join_requested_from_pause: bool = false -var _pending_join_endpoint: String = "" func _ready() -> void: _player.global_transform = _test_world.get_player_spawn_transform() _player.velocity = Vector3.ZERO - _player_spawn_service.setup( - _players_root, - _player, - _test_world.get_player_spawn_transform() - ) - _network_session.setup( - _network_profile, - _saved_servers, - _player_spawn_service - ) - _network_session.join_authenticated.connect( - _on_network_join_authenticated - ) - _network_session.connection_error.connect( - _on_network_connection_error - ) - _network_session.server_lost.connect(_on_network_server_lost) - _network_session.remote_recovery_requested.connect( - _on_remote_recovery_requested - ) _player.fish_sale_service.setup( _player.inventory, _player.wallet @@ -145,8 +103,7 @@ func _ready() -> void: item_catalog, _player.fishing_upgrades, _player.item_effects, - _player.cooler_capacity, - _network_session + _player.cooler_capacity ) _game_ui.setup( _player, @@ -164,8 +121,7 @@ func _ready() -> void: _player.fishing_upgrades, _shop_interaction, _player.item_effects, - _player.cooler_capacity, - _network_session + _player.cooler_capacity ) _water_recovery.setup( _player, @@ -199,26 +155,16 @@ func _ready() -> void: _apply_runtime_settings(_settings_manager.current_settings) _set_gameplay_active(false) var title_screen: TitleScreenType = _game_ui.get_title_screen() - title_screen.new_game_requested.connect(_on_new_game_requested) - title_screen.continue_game_requested.connect(_on_continue_game_requested) + title_screen.gameplay_requested.connect(_on_gameplay_requested) title_screen.quit_requested.connect(_on_quit_requested) - title_screen.setup( - _save_manager, - _settings_manager, - _network_session, - _saved_servers - ) + title_screen.setup(_save_manager, _settings_manager) var pause_menu: PauseMenuType = _game_ui.get_pause_menu() pause_menu.setup( _player, _save_manager, _settings_manager, - _fishing_spot, - _network_session, - _saved_servers + _fishing_spot ) - title_screen.join_game_requested.connect(_on_title_join_game_requested) - pause_menu.join_game_requested.connect(_on_pause_join_game_requested) pause_menu.return_to_title_requested.connect( _on_return_to_title_requested ) @@ -238,9 +184,6 @@ func _ready() -> void: _water_recovery.recovery_starting.connect( _on_water_recovery_starting ) - _water_recovery.local_respawn_completed.connect( - _on_local_respawn_completed - ) _on_active_hotbar_item_changed( _player.hotbar.get_selected_slot(), _player.hotbar.get_selected_item_id() @@ -359,54 +302,9 @@ func _set_gameplay_active(active: bool) -> void: _save_manager.set_autosave_enabled(active) -func _on_new_game_requested() -> void: +func _on_gameplay_requested() -> void: if _gameplay_started or _quit_in_progress: return - if not _prepare_private_host(): - return - if ( - not _save_manager.delete_progression_save() - or not _save_manager.initialize_new_game() - ): - _network_session.disconnect_session("New Game setup failed.") - _game_ui.get_title_screen().report_network_error( - "Could not initialize local progression. Existing data was preserved where possible." - ) - return - _enter_gameplay() - - -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 - _enter_gameplay() - - -func _prepare_private_host() -> bool: - _join_requested_from_title = false - _join_requested_from_pause = false - if _network_session.state in [ - NetworkSessionType.State.CONNECTION_FAILED, - NetworkSessionType.State.SERVER_LOST, - ]: - _network_session.reset_failure() - if not _network_session.start_private_host(): - _game_ui.get_title_screen().report_network_error( - "Could not start the private multiplayer session." - ) - return false - return true - - -func _enter_gameplay() -> void: _fade_out_title_music() _game_ui.get_title_screen().hide() _set_gameplay_active(true) @@ -417,133 +315,11 @@ func _on_return_to_title_requested() -> void: return var pause_menu: PauseMenuType = _game_ui.get_pause_menu() pause_menu.close_for_title_transition() - _network_session.disconnect_session("Returned to title.") _set_gameplay_active(false) _game_ui.get_title_screen().reopen() _show_title_music(true) -func _on_title_join_game_requested(endpoint: String) -> void: - if _quit_in_progress or _gameplay_started: - return - if _network_session.state != NetworkSessionType.State.INACTIVE: - _network_session.disconnect_session("Preparing direct connection.") - _join_requested_from_title = true - _join_requested_from_pause = false - _pending_join_endpoint = endpoint - if not _network_session.join_direct(endpoint): - _join_requested_from_title = false - - -func _on_pause_join_game_requested(endpoint: String) -> void: - if _quit_in_progress or not _gameplay_started: - return - if not _save_manager.save_if_dirty(): - _game_ui.get_pause_menu().report_network_error( - "Could not save progression before leaving this session." - ) - return - _join_requested_from_pause = true - _join_requested_from_title = false - _pending_join_endpoint = endpoint - _game_ui.get_pause_menu().close_for_title_transition() - _network_session.disconnect_session("Connecting to another game.") - if not _network_session.join_direct(endpoint): - _handle_failed_session_switch( - "Could not begin the direct connection." - ) - - -func _on_network_join_authenticated() -> void: - if _join_requested_from_title: - var inspection = _save_manager.inspect_save() - var progression_ready: bool = ( - _save_manager.load_player_data() - if inspection.can_continue() - else _save_manager.initialize_new_game() - ) - if not progression_ready: - _network_session.disconnect_session( - "Local progression could not be prepared." - ) - _game_ui.get_title_screen().report_network_error( - "Your local progression could not be prepared." - ) - _join_requested_from_title = false - return - _fade_out_title_music() - _game_ui.get_title_screen().hide() - _set_gameplay_active(true) - elif _join_requested_from_pause: - _set_gameplay_active(true) - _join_requested_from_title = false - _join_requested_from_pause = false - _pending_join_endpoint = "" - - -func _on_network_connection_error(message: String) -> void: - if _join_requested_from_title: - _game_ui.get_title_screen().report_network_error(message) - elif _join_requested_from_pause: - _handle_failed_session_switch(message) - - -func _handle_failed_session_switch(message: String) -> void: - _join_requested_from_pause = false - _set_gameplay_active(false) - var title_screen: TitleScreenType = _game_ui.get_title_screen() - title_screen.reopen() - title_screen.open_join_game_page(_pending_join_endpoint) - title_screen.report_network_error(message) - _show_title_music(true) - - -func _on_network_server_lost() -> void: - if not _gameplay_started: - return - _set_gameplay_active(false) - var title_screen: TitleScreenType = _game_ui.get_title_screen() - title_screen.reopen() - title_screen.open_join_game_page(_pending_join_endpoint) - title_screen.report_network_error("The server connection was lost.") - _show_title_music(true) - - -func _on_local_respawn_completed(entry_position: Vector3) -> void: - if _network_session.is_host(): - _network_session.publish_authoritative_teleport( - _player.get_network_peer_id() - ) - elif _network_session.is_joined_client(): - _network_session.request_safe_respawn(entry_position) - - -func _on_remote_recovery_requested( - peer_id: int, - entry_position: Vector3, -) -> void: - if not _network_session.is_host(): - return - var avatar: PlayerType = _player_spawn_service.get_avatar(peer_id) - if avatar == null: - return - var target_position: Vector3 = _test_world.get_player_spawn_transform().origin - var nearest_distance: float = INF - for point: SafeRespawnPoint in _test_world.get_safe_respawn_points(): - if point == null or not point.enabled: - continue - var distance: float = point.get_horizontal_distance_squared( - entry_position - ) - if distance < nearest_distance: - nearest_distance = distance - target_position = point.global_position - target_position.y += _water_recovery.respawn_height_offset - avatar.global_position = target_position - avatar.velocity = Vector3.ZERO - _network_session.publish_authoritative_teleport(peer_id) - - func _on_reset_progress_requested() -> void: if _quit_in_progress: return @@ -596,7 +372,6 @@ func _on_quit_requested() -> void: _settings_manager.save_if_dirty() if _gameplay_started: _save_manager.save_if_dirty() - _network_session.disconnect_session("Application closing.") _title_music_requested = false _replace_title_music_transition() _finish_quit() diff --git a/main/main.tscn b/main/main.tscn index bcb80fb..192178b 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=21 format=3] +[gd_scene load_steps=17 format=3] [ext_resource type="PackedScene" path="res://world/test_world.tscn" id="1_world"] [ext_resource type="PackedScene" path="res://player/player.tscn" id="2_player"] @@ -16,10 +16,6 @@ [ext_resource type="Script" path="res://ui/ui_pixelation_presenter.gd" id="14_pixelation"] [ext_resource type="PackedScene" path="res://ui/pixelation_reset_overlay.tscn" id="15_reset"] [ext_resource type="PackedScene" path="res://main/world_pixelation_postprocess.tscn" id="16_world_pixelation"] -[ext_resource type="Script" path="res://network/network_session.gd" id="17_network_session"] -[ext_resource type="Script" path="res://network/network_profile_preferences.gd" id="18_network_profile"] -[ext_resource type="Script" path="res://network/saved_server_store.gd" id="19_saved_servers"] -[ext_resource type="Script" path="res://network/player_spawn_service.gd" id="20_spawn_service"] [node name="Main" type="Node3D"] script = ExtResource("3_main") @@ -28,22 +24,6 @@ pelican_buyer_profile = ExtResource("7_pelicans") main_shop_buyer_profile = ExtResource("12_main_shop") item_catalog = ExtResource("11_items") -[node name="NetworkSession" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("17_network_session") - -[node name="NetworkProfilePreferences" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("18_network_profile") - -[node name="SavedServerStore" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("19_saved_servers") - -[node name="PlayerSpawnService" type="Node" parent="."] -unique_name_in_owner = true -script = ExtResource("20_spawn_service") - [node name="TestWorld" parent="." instance=ExtResource("1_world")] [node name="Players" type="Node3D" parent="."] diff --git a/network/connection_endpoint.gd b/network/connection_endpoint.gd deleted file mode 100644 index a11eb36..0000000 --- a/network/connection_endpoint.gd +++ /dev/null @@ -1,12 +0,0 @@ -class_name ConnectionEndpoint -extends RefCounted - -var host: String = "" -var port: int = 7777 -var normalized_display: String = "" -var original_display: String = "" -var error_message: String = "" - - -func is_valid() -> bool: - return error_message.is_empty() and not host.is_empty() and port in range(1, 65536) diff --git a/network/connection_endpoint.gd.uid b/network/connection_endpoint.gd.uid deleted file mode 100644 index c0103c2..0000000 --- a/network/connection_endpoint.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://c0ssdkdd35qgf diff --git a/network/connection_route.gd b/network/connection_route.gd deleted file mode 100644 index af9e625..0000000 --- a/network/connection_route.gd +++ /dev/null @@ -1,24 +0,0 @@ -class_name ConnectionRoute -extends RefCounted - -enum Kind { - DIRECT, -} - -var kind: Kind = Kind.DIRECT -var direct_endpoint: ConnectionEndpoint -var display_description: String = "" - - -static func direct(endpoint: ConnectionEndpoint) -> ConnectionRoute: - var route := ConnectionRoute.new() - route.kind = Kind.DIRECT - route.direct_endpoint = endpoint - route.display_description = ( - endpoint.normalized_display if endpoint != null else "" - ) - return route - - -func is_valid() -> bool: - return kind == Kind.DIRECT and direct_endpoint != null and direct_endpoint.is_valid() diff --git a/network/connection_route.gd.uid b/network/connection_route.gd.uid deleted file mode 100644 index 2f2ca91..0000000 --- a/network/connection_route.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dquhcebc57bg8 diff --git a/network/direct_enet_transport.gd b/network/direct_enet_transport.gd deleted file mode 100644 index 3d6201d..0000000 --- a/network/direct_enet_transport.gd +++ /dev/null @@ -1,38 +0,0 @@ -class_name DirectEnetTransport -extends NetworkTransport - - -func start_host( - port: int, - max_clients: int, - bind_address: String = "*", -) -> Error: - disconnect_transport() - var enet_peer := ENetMultiplayerPeer.new() - if not bind_address.is_empty() and bind_address != "*": - enet_peer.set_bind_ip(bind_address) - var error: Error = enet_peer.create_server(port, max_clients, 3) - if error != OK: - transport_error.emit("Unable to host UDP port %d." % port) - return error - _peer = enet_peer - _route_description = "UDP *:%d" % port - return OK - - -func connect_to_route(route: ConnectionRoute) -> Error: - disconnect_transport() - if route == null or not route.is_valid(): - transport_error.emit("The direct connection route is invalid.") - return ERR_INVALID_PARAMETER - var endpoint: ConnectionEndpoint = route.direct_endpoint - var enet_peer := ENetMultiplayerPeer.new() - var error: Error = enet_peer.create_client(endpoint.host, endpoint.port, 3) - if error != OK: - transport_error.emit( - "Unable to connect to %s." % endpoint.normalized_display - ) - return error - _peer = enet_peer - _route_description = endpoint.normalized_display - return OK diff --git a/network/direct_enet_transport.gd.uid b/network/direct_enet_transport.gd.uid deleted file mode 100644 index 09f5d1b..0000000 --- a/network/direct_enet_transport.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://d4jn8ubxqkqa4 diff --git a/network/endpoint_parser.gd b/network/endpoint_parser.gd deleted file mode 100644 index fdaebbe..0000000 --- a/network/endpoint_parser.gd +++ /dev/null @@ -1,69 +0,0 @@ -class_name EndpointParser -extends RefCounted - -const DEFAULT_PORT: int = 7777 - - -static func parse(value: String, default_port: int = DEFAULT_PORT) -> ConnectionEndpoint: - var result := ConnectionEndpoint.new() - result.original_display = value.strip_edges() - result.port = default_port - if default_port < 1 or default_port > 65535: - result.error_message = "The configured default port is invalid." - return result - var input: String = result.original_display - if input.is_empty(): - result.error_message = "Enter a hostname or IP address." - return result - - var host: String = "" - var port_text: String = "" - if input.begins_with("["): - var closing: int = input.find("]") - if closing < 0: - result.error_message = "The IPv6 address is missing a closing bracket." - return result - host = input.substr(1, closing - 1).strip_edges() - var suffix: String = input.substr(closing + 1).strip_edges() - if not suffix.is_empty(): - if not suffix.begins_with(":") or suffix.length() == 1: - result.error_message = "Use [IPv6]:port for an IPv6 port." - return result - port_text = suffix.substr(1).strip_edges() - elif input.contains("[") or input.contains("]"): - result.error_message = "IPv6 brackets are malformed." - return result - else: - var colon_count: int = input.count(":") - if colon_count == 1: - var separator: int = input.rfind(":") - host = input.substr(0, separator).strip_edges() - port_text = input.substr(separator + 1).strip_edges() - else: - # Zero colons is a hostname/IPv4 host. More than one is a raw - # IPv6 host; an explicit port for it must use brackets. - host = input.strip_edges() - - if host.is_empty(): - result.error_message = "The hostname or IP address is empty." - return result - if host.contains(" ") or host.contains("\t") or host.contains("\n"): - result.error_message = "The hostname or IP address contains whitespace." - return result - if not port_text.is_empty(): - if not port_text.is_valid_int(): - result.error_message = "The port must be a number from 1 to 65535." - return result - result.port = int(port_text) - if result.port < 1 or result.port > 65535: - result.error_message = "The port must be from 1 to 65535." - return result - - result.host = host.to_lower() - var is_ipv6: bool = result.host.contains(":") - result.normalized_display = ( - "[%s]:%d" % [result.host, result.port] - if is_ipv6 - else "%s:%d" % [result.host, result.port] - ) - return result diff --git a/network/endpoint_parser.gd.uid b/network/endpoint_parser.gd.uid deleted file mode 100644 index 6b14810..0000000 --- a/network/endpoint_parser.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://2drengcleq7e diff --git a/network/network_profile_preferences.gd b/network/network_profile_preferences.gd deleted file mode 100644 index 56acbe8..0000000 --- a/network/network_profile_preferences.gd +++ /dev/null @@ -1,120 +0,0 @@ -class_name NetworkProfilePreferences -extends Node - -const FORMAT_VERSION: int = 1 -const PROFILE_PATH: String = "user://network_profile.json" -const TEMP_PATH: String = "user://network_profile.json.tmp" -const BACKUP_PATH: String = "user://network_profile.json.backup" - -var profile_id: String = "" -var display_name: String = "Player" -var created_at_unix: int = 0 - - -func load_or_create() -> bool: - _recover_interrupted_write() - if FileAccess.file_exists(PROFILE_PATH): - if _load_existing(): - return true - var corrupt_path: String = ( - "user://network_profile.corrupt.%d.json" - % int(Time.get_unix_time_from_system()) - ) - if not _rename(PROFILE_PATH, corrupt_path): - push_warning("Invalid network profile was preserved and not overwritten.") - return false - profile_id = Crypto.new().generate_random_bytes(16).hex_encode() - if profile_id.is_empty(): - profile_id = "%d-%d" % [ - int(Time.get_unix_time_from_system()), - Time.get_ticks_usec(), - ] - display_name = "Player" - created_at_unix = int(Time.get_unix_time_from_system()) - return _save_atomic() - - -func _load_existing() -> bool: - var file := FileAccess.open(PROFILE_PATH, FileAccess.READ) - if file == null: - return false - var json := JSON.new() - var error: Error = json.parse(file.get_as_text()) - file.close() - if error != OK or typeof(json.data) != TYPE_DICTIONARY: - return false - var data: Dictionary = json.data - if ( - data.get("format_version") != FORMAT_VERSION - or typeof(data.get("profile_id")) != TYPE_STRING - or typeof(data.get("display_name")) != TYPE_STRING - or typeof(data.get("created_at_unix")) not in [TYPE_INT, TYPE_FLOAT] - ): - return false - var loaded_id: String = data["profile_id"] - var loaded_name: String = data["display_name"] - if ( - loaded_id.is_empty() - or loaded_id.length() > NetworkProtocol.MAX_PROFILE_ID_LENGTH - or loaded_name.is_empty() - or loaded_name.length() > NetworkProtocol.MAX_DISPLAY_NAME_LENGTH - ): - return false - profile_id = loaded_id - display_name = loaded_name - created_at_unix = int(data["created_at_unix"]) - return true - - -func _save_atomic() -> bool: - var data: Dictionary = { - "format_version": FORMAT_VERSION, - "profile_id": profile_id, - "display_name": display_name, - "created_at_unix": created_at_unix, - } - var file := FileAccess.open(TEMP_PATH, FileAccess.WRITE) - if file == null: - return false - file.store_string(JSON.stringify(data, "\t")) - file.flush() - var error: Error = file.get_error() - file.close() - if error != OK: - _remove_if_present(TEMP_PATH) - return false - _remove_if_present(BACKUP_PATH) - var had_primary: bool = FileAccess.file_exists(PROFILE_PATH) - if had_primary and not _rename(PROFILE_PATH, BACKUP_PATH): - _remove_if_present(TEMP_PATH) - return false - if not _rename(TEMP_PATH, PROFILE_PATH): - if had_primary: - _rename(BACKUP_PATH, PROFILE_PATH) - return false - _remove_if_present(BACKUP_PATH) - return true - - -func _recover_interrupted_write() -> void: - if FileAccess.file_exists(PROFILE_PATH): - _remove_if_present(TEMP_PATH) - _remove_if_present(BACKUP_PATH) - return - if FileAccess.file_exists(BACKUP_PATH): - _rename(BACKUP_PATH, PROFILE_PATH) - _remove_if_present(TEMP_PATH) - - -func _rename(from_path: String, to_path: String) -> bool: - return DirAccess.rename_absolute( - ProjectSettings.globalize_path(from_path), - ProjectSettings.globalize_path(to_path) - ) == OK - - -func _remove_if_present(path: String) -> bool: - return ( - not FileAccess.file_exists(path) - or DirAccess.remove_absolute(ProjectSettings.globalize_path(path)) == OK - ) diff --git a/network/network_profile_preferences.gd.uid b/network/network_profile_preferences.gd.uid deleted file mode 100644 index 8e27e50..0000000 --- a/network/network_profile_preferences.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://db8ua5psoql0w diff --git a/network/network_protocol.gd b/network/network_protocol.gd deleted file mode 100644 index 7d093f6..0000000 --- a/network/network_protocol.gd +++ /dev/null @@ -1,121 +0,0 @@ -class_name NetworkProtocol -extends RefCounted - -const PROTOCOL_VERSION: int = 1 -const GAME_BUILD: String = "prealpha" -const MAX_DISPLAY_NAME_LENGTH: int = 48 -const MAX_PROFILE_ID_LENGTH: int = 96 -const MAX_NONCE_LENGTH: int = 96 - -enum RejectionCode { - NONE, - MALFORMED_HANDSHAKE, - PROTOCOL_MISMATCH, - SERVER_FULL, - DUPLICATE_PROFILE, - AUTHENTICATION_TIMEOUT, - SERVER_SHUTTING_DOWN, - UNSUPPORTED_CLIENT, -} - - -static func make_client_hello( - profile_id: String, - display_name: String, - client_nonce: String, -) -> Dictionary: - return { - "protocol_version": PROTOCOL_VERSION, - "game_build": GAME_BUILD, - "local_profile_id": profile_id, - "display_name": display_name, - "client_nonce": client_nonce, - "capability_flags": PackedStringArray(), - "cosmetic_snapshot": {}, - } - - -static func validate_client_hello(data: Variant) -> String: - if typeof(data) != TYPE_DICTIONARY: - return "Handshake payload is not a dictionary." - var payload: Dictionary = data - for key: String in [ - "protocol_version", - "game_build", - "local_profile_id", - "display_name", - "client_nonce", - "capability_flags", - "cosmetic_snapshot", - ]: - if not payload.has(key): - return "Handshake is missing %s." % key - if typeof(payload["protocol_version"]) != TYPE_INT: - return "Protocol version is invalid." - if typeof(payload["game_build"]) != TYPE_STRING: - return "Game build is invalid." - if typeof(payload["local_profile_id"]) != TYPE_STRING: - return "Profile ID is invalid." - if typeof(payload["display_name"]) != TYPE_STRING: - return "Display name is invalid." - if typeof(payload["client_nonce"]) != TYPE_STRING: - return "Client nonce is invalid." - if typeof(payload["capability_flags"]) not in [ - TYPE_PACKED_STRING_ARRAY, - TYPE_ARRAY, - ]: - return "Capabilities are invalid." - if typeof(payload["cosmetic_snapshot"]) != TYPE_DICTIONARY: - return "Cosmetic snapshot is invalid." - var profile_id: String = payload["local_profile_id"] - var display_name: String = payload["display_name"] - var nonce: String = payload["client_nonce"] - if ( - profile_id.is_empty() - or profile_id.length() > MAX_PROFILE_ID_LENGTH - or display_name.is_empty() - or display_name.length() > MAX_DISPLAY_NAME_LENGTH - or nonce.is_empty() - or nonce.length() > MAX_NONCE_LENGTH - ): - return "Handshake strings are outside allowed limits." - return "" - - -static func make_server_hello( - accepted: bool, - rejection_code: RejectionCode, - session_id: String, - assigned_peer_id: int, - player_count: int, - max_players: int, -) -> Dictionary: - return { - "accepted": accepted, - "rejection_code": int(rejection_code), - "protocol_version": PROTOCOL_VERSION, - "session_id": session_id, - "assigned_peer_id": assigned_peer_id, - "server_display_name": "NETFISHING", - "player_count": player_count, - "max_players": max_players, - "capability_flags": PackedStringArray(["movement_v1"]), - } - - -static func rejection_text(code: int) -> String: - match code: - RejectionCode.PROTOCOL_MISMATCH: - return "The server uses a different network protocol." - RejectionCode.SERVER_FULL: - return "The server is full." - RejectionCode.DUPLICATE_PROFILE: - return "This local profile is already connected." - RejectionCode.AUTHENTICATION_TIMEOUT: - return "The server did not finish authentication." - RejectionCode.SERVER_SHUTTING_DOWN: - return "The server is shutting down." - RejectionCode.UNSUPPORTED_CLIENT: - return "This game build is not supported by the server." - _: - return "The server rejected the connection." diff --git a/network/network_protocol.gd.uid b/network/network_protocol.gd.uid deleted file mode 100644 index aecfaef..0000000 --- a/network/network_protocol.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dghw7u3pdrpsf diff --git a/network/network_session.gd b/network/network_session.gd deleted file mode 100644 index 0bb8255..0000000 --- a/network/network_session.gd +++ /dev/null @@ -1,816 +0,0 @@ -class_name NetworkSession -extends Node - -const DEFAULT_PORT: int = 7777 -const DEFAULT_SESSION_MAX_PLAYERS: int = 8 -const DEFAULT_TRANSPORT_MAX_CLIENTS: int = 31 -const CONNECTION_TIMEOUT_SECONDS: float = 10.0 -const AUTHENTICATION_TIMEOUT_SECONDS: float = 8.0 -const INPUT_INTERVAL: float = 1.0 / 25.0 -const SNAPSHOT_INTERVAL: float = 1.0 / 15.0 - -signal state_changed(state: State) -signal status_message_changed(message: String) -signal connection_error(message: String) -signal peer_authenticated(peer_id: int, display_name: String) -signal peer_removed(peer_id: int) -signal host_openness_changed(is_open: bool) -signal peer_count_changed(player_count: int, max_players: int) -signal join_authenticated -signal server_lost -signal remote_recovery_requested(peer_id: int, entry_position: Vector3) - -enum State { - INACTIVE, - STARTING_PRIVATE_HOST, - PRIVATE_HOST, - OPEN_HOST, - CONNECTING, - AUTHENTICATING, - JOINED_CLIENT, - DISCONNECTING, - CONNECTION_FAILED, - SERVER_LOST, -} - -@export_range(2, 128, 1) var session_max_players: int = ( - DEFAULT_SESSION_MAX_PLAYERS -) -@export_range(1, 256, 1) var transport_max_clients: int = ( - DEFAULT_TRANSPORT_MAX_CLIENTS -) - -var state: State = State.INACTIVE -var _transport: DirectEnetTransport -var _profile: NetworkProfilePreferences -var _saved_servers: SavedServerStore -var _spawn_service: PlayerSpawnService -var _registry := PeerRegistry.new() -var _pending_authentication: Dictionary[int, float] = {} -var _session_id: String = "" -var _operation_generation: int = 0 -var _connection_deadline: float = 0.0 -var _client_nonce: String = "" -var _current_route: ConnectionRoute -var _input_sequence: int = 0 -var _input_accumulator: float = 0.0 -var _snapshot_accumulator: float = 0.0 -var _last_server_max_players: int = DEFAULT_SESSION_MAX_PLAYERS -var _profile_ready: bool = false - - -func _ready() -> void: - transport_max_clients = maxi( - transport_max_clients, - session_max_players - 1 - ) - _connect_multiplayer_signals() - - -func setup( - profile: NetworkProfilePreferences, - saved_servers: SavedServerStore, - spawn_service: PlayerSpawnService, -) -> void: - _profile = profile - _saved_servers = saved_servers - _spawn_service = spawn_service - if _profile != null: - _profile_ready = _profile.load_or_create() - - -func start_private_host(port: int = DEFAULT_PORT) -> bool: - if ( - state != State.INACTIVE - or not _profile_ready - or _profile == null - or _spawn_service == null - ): - return false - if port < 1 or port > 65535: - _fail("The hosting port must be from 1 to 65535.") - return false - _operation_generation += 1 - _set_state(State.STARTING_PRIVATE_HOST, "Starting private game...") - _replace_transport() - var error: Error = _transport.start_host( - port, - transport_max_clients, - ) - if error != OK: - _fail("Could not start a private game on UDP port %d." % port) - return false - var peer: MultiplayerPeer = _transport.get_multiplayer_peer() - peer.refuse_new_connections = true - multiplayer.multiplayer_peer = peer - _session_id = Crypto.new().generate_random_bytes(16).hex_encode() - _registry.clear() - _registry.add_peer( - 1, - _profile.profile_id, - _profile.display_name, - NetworkProtocol.PROTOCOL_VERSION - ) - _spawn_service.clear_remote_players() - _spawn_service.register_local_player(1) - _set_state(State.PRIVATE_HOST, "Private game • UDP %d" % port) - host_openness_changed.emit(false) - _emit_peer_count() - return true - - -func join_direct(endpoint_text: String) -> bool: - if ( - state != State.INACTIVE - or not _profile_ready - or _profile == null - or _spawn_service == null - ): - return false - var endpoint: ConnectionEndpoint = EndpointParser.parse(endpoint_text) - if not endpoint.is_valid(): - _fail(endpoint.error_message) - return false - _operation_generation += 1 - var generation: int = _operation_generation - _current_route = ConnectionRoute.direct(endpoint) - _set_state( - State.CONNECTING, - "Connecting to %s..." % endpoint.normalized_display - ) - _replace_transport() - var error: Error = _transport.connect_to_route(_current_route) - if error != OK: - _fail("Could not begin the direct connection.") - return false - multiplayer.multiplayer_peer = _transport.get_multiplayer_peer() - _connection_deadline = ( - Time.get_ticks_msec() / 1000.0 + CONNECTION_TIMEOUT_SECONDS - ) - # The generation is checked by the process timeout and all state-gated - # multiplayer callbacks. - if generation != _operation_generation: - return false - return true - - -func cancel_connection() -> void: - if state not in [State.CONNECTING, State.AUTHENTICATING]: - return - _operation_generation += 1 - _teardown_peer() - _set_state(State.INACTIVE, "Connection cancelled.") - - -func reset_failure() -> void: - if state not in [State.CONNECTION_FAILED, State.SERVER_LOST]: - return - _teardown_peer() - _set_state(State.INACTIVE, "Ready for a direct connection.") - - -func disconnect_session(message: String = "Disconnected.") -> void: - if state == State.INACTIVE: - return - if state in [State.CONNECTION_FAILED, State.SERVER_LOST]: - _teardown_peer() - _set_state(State.INACTIVE, message) - return - _operation_generation += 1 - _set_state(State.DISCONNECTING, "Disconnecting...") - _teardown_peer() - _set_state(State.INACTIVE, message) - - -func set_host_open(is_open: bool) -> bool: - if state not in [State.PRIVATE_HOST, State.OPEN_HOST]: - return false - var peer: MultiplayerPeer = multiplayer.multiplayer_peer - if peer == null: - return false - peer.refuse_new_connections = not is_open - _set_state( - State.OPEN_HOST if is_open else State.PRIVATE_HOST, - ( - "Open game • %d / %d players" - if is_open - else "Private game • %d / %d players" - ) % [_registry.size(), session_max_players] - ) - host_openness_changed.emit(is_open) - return true - - -func is_host() -> bool: - return state in [State.PRIVATE_HOST, State.OPEN_HOST] - - -func is_open_host() -> bool: - return state == State.OPEN_HOST - - -func is_joined_client() -> bool: - return state == State.JOINED_CLIENT - - -func get_player_count() -> int: - return _registry.size() - - -func get_session_max_players() -> int: - return session_max_players - - -func get_current_route_display() -> String: - return ( - _current_route.display_description - if _current_route != null - else _transport.get_route_description() if _transport != null else "" - ) - - -func can_use_host_gameplay() -> bool: - return is_host() - - -func _process(delta: float) -> void: - var now: float = Time.get_ticks_msec() / 1000.0 - if ( - state in [State.CONNECTING, State.AUTHENTICATING] - and _connection_deadline > 0.0 - and now >= _connection_deadline - ): - _fail("Connection timed out.") - _teardown_peer() - return - if is_host(): - _expire_pending_authentication(now) - if state not in [State.OPEN_HOST, State.PRIVATE_HOST, State.JOINED_CLIENT]: - return - _input_accumulator += delta - _snapshot_accumulator += delta - if state == State.JOINED_CLIENT and _input_accumulator >= INPUT_INTERVAL: - _input_accumulator = fmod(_input_accumulator, INPUT_INTERVAL) - _send_local_input() - if is_host() and _snapshot_accumulator >= SNAPSHOT_INTERVAL: - _snapshot_accumulator = fmod(_snapshot_accumulator, SNAPSHOT_INTERVAL) - _broadcast_movement_snapshots() - - -func _connect_multiplayer_signals() -> void: - if not multiplayer.peer_connected.is_connected(_on_peer_connected): - multiplayer.peer_connected.connect(_on_peer_connected) - if not multiplayer.peer_disconnected.is_connected(_on_peer_disconnected): - multiplayer.peer_disconnected.connect(_on_peer_disconnected) - if not multiplayer.connected_to_server.is_connected( - _on_connected_to_server - ): - multiplayer.connected_to_server.connect(_on_connected_to_server) - if not multiplayer.connection_failed.is_connected(_on_connection_failed): - multiplayer.connection_failed.connect(_on_connection_failed) - if not multiplayer.server_disconnected.is_connected( - _on_server_disconnected - ): - multiplayer.server_disconnected.connect(_on_server_disconnected) - - -func _replace_transport() -> void: - if _transport != null: - _transport.disconnect_transport() - _transport.queue_free() - _transport = DirectEnetTransport.new() - add_child(_transport) - _transport.transport_error.connect(connection_error.emit) - - -func _on_peer_connected(peer_id: int) -> void: - if not is_host(): - return - if state != State.OPEN_HOST: - multiplayer.multiplayer_peer.disconnect_peer(peer_id) - return - _pending_authentication[peer_id] = ( - Time.get_ticks_msec() / 1000.0 + AUTHENTICATION_TIMEOUT_SECONDS - ) - - -func _on_connected_to_server() -> void: - if state != State.CONNECTING: - return - _set_state(State.AUTHENTICATING, "Authenticating...") - _client_nonce = Crypto.new().generate_random_bytes(16).hex_encode() - var hello: Dictionary = NetworkProtocol.make_client_hello( - _profile.profile_id, - _profile.display_name, - _client_nonce - ) - submit_client_hello.rpc_id(1, hello) - - -func _on_connection_failed() -> void: - if state not in [State.CONNECTING, State.AUTHENTICATING]: - return - _teardown_peer() - _fail("Could not connect. The server may be private, unavailable, or unreachable.") - - -func _on_server_disconnected() -> void: - if state in [State.INACTIVE, State.DISCONNECTING]: - return - _operation_generation += 1 - _teardown_peer() - _set_state(State.SERVER_LOST, "The server connection was lost.") - server_lost.emit() - connection_error.emit("The server connection was lost.") - - -func _on_peer_disconnected(peer_id: int) -> void: - _pending_authentication.erase(peer_id) - if _registry.has_peer(peer_id): - _registry.remove_peer(peer_id) - _spawn_service.remove_peer(peer_id) - if is_host(): - receive_peer_despawn.rpc(peer_id) - peer_removed.emit(peer_id) - _emit_peer_count() - - -@rpc("any_peer", "call_remote", "reliable", 0) -func submit_client_hello(data: Dictionary) -> void: - var sender_id: int = multiplayer.get_remote_sender_id() - if not is_host() or sender_id <= 1 or not _pending_authentication.has(sender_id): - return - var validation_error: String = NetworkProtocol.validate_client_hello(data) - if not validation_error.is_empty(): - _reject_peer( - sender_id, - NetworkProtocol.RejectionCode.MALFORMED_HANDSHAKE - ) - return - if int(data["protocol_version"]) != NetworkProtocol.PROTOCOL_VERSION: - _reject_peer( - sender_id, - NetworkProtocol.RejectionCode.PROTOCOL_MISMATCH - ) - return - if _registry.size() >= session_max_players: - _reject_peer(sender_id, NetworkProtocol.RejectionCode.SERVER_FULL) - return - var profile_id: String = data["local_profile_id"] - if _registry.has_profile(profile_id): - _reject_peer( - sender_id, - NetworkProtocol.RejectionCode.DUPLICATE_PROFILE - ) - return - var display_name: String = data["display_name"] - if not _registry.add_peer( - sender_id, - profile_id, - display_name, - NetworkProtocol.PROTOCOL_VERSION - ): - _reject_peer( - sender_id, - NetworkProtocol.RejectionCode.MALFORMED_HANDSHAKE - ) - return - _pending_authentication.erase(sender_id) - var spawn_index: int = _registry.get_peer_ids().find(sender_id) - var spawn_transform: Transform3D = ( - _spawn_service.get_spawn_transform_for_index(spawn_index) - ) - _spawn_service.spawn_remote_player(sender_id, spawn_transform, true) - receive_server_hello.rpc_id( - sender_id, - NetworkProtocol.make_server_hello( - true, - NetworkProtocol.RejectionCode.NONE, - _session_id, - sender_id, - _registry.size(), - session_max_players - ) - ) - receive_spawn_list.rpc_id(sender_id, _build_spawn_list()) - receive_peer_spawn.rpc( - _make_spawn_entry(sender_id, display_name, spawn_transform) - ) - peer_authenticated.emit(sender_id, display_name) - _emit_peer_count() - - -func _reject_peer( - peer_id: int, - code: NetworkProtocol.RejectionCode, -) -> void: - receive_server_hello.rpc_id( - peer_id, - NetworkProtocol.make_server_hello( - false, - code, - _session_id, - peer_id, - _registry.size(), - session_max_players - ) - ) - _pending_authentication.erase(peer_id) - call_deferred("_disconnect_rejected_peer", peer_id) - - -func _disconnect_rejected_peer(peer_id: int) -> void: - if ( - is_host() - and multiplayer.multiplayer_peer != null - and multiplayer.multiplayer_peer.get_connection_status() - == MultiplayerPeer.CONNECTION_CONNECTED - ): - multiplayer.multiplayer_peer.disconnect_peer(peer_id) - - -@rpc("authority", "call_remote", "reliable", 0) -func receive_server_hello(data: Dictionary) -> void: - if state != State.AUTHENTICATING: - return - if ( - typeof(data.get("accepted")) != TYPE_BOOL - or typeof(data.get("protocol_version")) != TYPE_INT - or typeof(data.get("rejection_code")) != TYPE_INT - ): - _teardown_peer() - _fail("The server sent an invalid handshake response.") - return - if not bool(data["accepted"]): - var message: String = NetworkProtocol.rejection_text( - int(data["rejection_code"]) - ) - _teardown_peer() - _fail(message) - return - if int(data["protocol_version"]) != NetworkProtocol.PROTOCOL_VERSION: - _teardown_peer() - _fail("The server uses a different network protocol.") - return - _session_id = str(data.get("session_id", "")) - _last_server_max_players = int(data.get( - "max_players", - DEFAULT_SESSION_MAX_PLAYERS - )) - var local_peer_id: int = multiplayer.get_unique_id() - _registry.clear() - _registry.add_peer( - local_peer_id, - _profile.profile_id, - _profile.display_name, - NetworkProtocol.PROTOCOL_VERSION - ) - _spawn_service.clear_remote_players() - _spawn_service.register_local_player(local_peer_id) - _connection_deadline = 0.0 - _set_state( - State.JOINED_CLIENT, - "Connected • %d / %d players" % [ - int(data.get("player_count", 1)), - _last_server_max_players, - ] - ) - if _current_route != null and _saved_servers != null: - _saved_servers.record_successful_connection( - _current_route.direct_endpoint, - _last_server_max_players - ) - join_authenticated.emit() - - -@rpc("authority", "call_remote", "reliable", 0) -func receive_spawn_list(entries: Array) -> void: - if state != State.JOINED_CLIENT: - return - for value: Variant in entries: - if typeof(value) == TYPE_DICTIONARY: - _apply_spawn_entry(value) - _emit_peer_count() - - -@rpc("authority", "call_remote", "reliable", 0) -func receive_peer_spawn(entry: Dictionary) -> void: - if state != State.JOINED_CLIENT: - return - _apply_spawn_entry(entry) - _emit_peer_count() - - -@rpc("authority", "call_remote", "reliable", 0) -func receive_peer_despawn(peer_id: int) -> void: - if state != State.JOINED_CLIENT: - return - _registry.remove_peer(peer_id) - _spawn_service.remove_peer(peer_id) - peer_removed.emit(peer_id) - _emit_peer_count() - - -func _apply_spawn_entry(entry: Dictionary) -> void: - if ( - typeof(entry.get("peer_id")) != TYPE_INT - or typeof(entry.get("profile_id")) != TYPE_STRING - or typeof(entry.get("display_name")) != TYPE_STRING - or typeof(entry.get("position")) != TYPE_ARRAY - or typeof(entry.get("yaw")) not in [TYPE_FLOAT, TYPE_INT] - ): - return - var peer_id: int = entry["peer_id"] - if peer_id == multiplayer.get_unique_id(): - var own_position: Array = entry["position"] - if own_position.size() == 3: - var own_avatar: Player = _spawn_service.get_avatar(peer_id) - if own_avatar != null: - var own_snapshot: Dictionary = own_avatar.make_network_snapshot( - peer_id - ) - own_snapshot["position"] = own_position - own_snapshot["visual_yaw"] = float(entry["yaw"]) - own_avatar.apply_network_teleport(own_snapshot) - return - if not _registry.has_peer(peer_id): - _registry.add_peer( - peer_id, - entry["profile_id"], - entry["display_name"], - NetworkProtocol.PROTOCOL_VERSION - ) - var transform: Transform3D = _spawn_service.get_spawn_transform_for_index(0) - var position: Array = entry["position"] - if position.size() != 3: - return - transform.origin = Vector3( - float(position[0]), - float(position[1]), - float(position[2]) - ) - transform.basis = Basis(Vector3.UP, float(entry["yaw"])) - _spawn_service.spawn_remote_player(peer_id, transform, false) - - -func _build_spawn_list() -> Array[Dictionary]: - var entries: Array[Dictionary] = [] - for peer_id: int in _registry.get_peer_ids(): - var record: PeerRegistry.PeerRecord = _registry.get_peer(peer_id) - var avatar: Player = _spawn_service.get_avatar(peer_id) - if record != null and avatar != null: - entries.append(_make_spawn_entry( - peer_id, - record.display_name, - avatar.global_transform - )) - return entries - - -func _make_spawn_entry( - peer_id: int, - display_name: String, - transform: Transform3D, -) -> Dictionary: - var record: PeerRegistry.PeerRecord = _registry.get_peer(peer_id) - return { - "peer_id": peer_id, - "profile_id": record.profile_id if record != null else "", - "display_name": display_name, - "position": [ - transform.origin.x, - transform.origin.y, - transform.origin.z, - ], - "yaw": transform.basis.get_euler().y, - } - - -func _send_local_input() -> void: - var peer_id: int = multiplayer.get_unique_id() - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null: - return - _input_sequence += 1 - var input: Dictionary = avatar.capture_network_input(_input_sequence) - submit_movement_input.rpc_id(1, input) - - -@rpc("any_peer", "call_remote", "unreliable_ordered", 1) -func submit_movement_input(data: Dictionary) -> void: - var sender_id: int = multiplayer.get_remote_sender_id() - if not is_host() or not _registry.has_peer(sender_id): - return - var avatar: Player = _spawn_service.get_avatar(sender_id) - if avatar == null or not _is_valid_movement_input(data): - return - avatar.apply_authoritative_network_input(data) - - -func _is_valid_movement_input(data: Dictionary) -> bool: - if ( - typeof(data.get("sequence")) != TYPE_INT - or typeof(data.get("axis")) != TYPE_ARRAY - or typeof(data.get("jump")) != TYPE_BOOL - or typeof(data.get("sprint")) != TYPE_BOOL - or typeof(data.get("sneak")) != TYPE_BOOL - or typeof(data.get("slow_walk")) != TYPE_BOOL - or typeof(data.get("camera_yaw")) not in [TYPE_FLOAT, TYPE_INT] - ): - return false - var axis: Array = data["axis"] - if axis.size() != 2: - return false - var x: float = float(axis[0]) - var y: float = float(axis[1]) - var camera_yaw: float = float(data["camera_yaw"]) - return ( - is_finite(x) - and is_finite(y) - and is_finite(camera_yaw) - and absf(x) <= 1.01 - and absf(y) <= 1.01 - and absf(camera_yaw) <= TAU * 100.0 - ) - - -func _broadcast_movement_snapshots() -> void: - var snapshots: Array[Dictionary] = [] - for peer_id: int in _registry.get_peer_ids(): - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null: - continue - snapshots.append(avatar.make_network_snapshot(peer_id)) - receive_movement_snapshots.rpc(snapshots) - - -@rpc("authority", "call_remote", "unreliable_ordered", 2) -func receive_movement_snapshots(snapshots: Array) -> void: - if state != State.JOINED_CLIENT: - return - var local_peer_id: int = multiplayer.get_unique_id() - for value: Variant in snapshots: - if typeof(value) != TYPE_DICTIONARY: - continue - var snapshot: Dictionary = value - if typeof(snapshot.get("peer_id")) != TYPE_INT: - continue - var peer_id: int = snapshot["peer_id"] - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null: - continue - if peer_id == local_peer_id: - avatar.apply_local_prediction_correction(snapshot) - else: - avatar.push_network_snapshot(snapshot) - - -func publish_authoritative_teleport(peer_id: int) -> void: - if not is_host(): - return - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar == null: - return - receive_authoritative_teleport.rpc( - avatar.make_network_snapshot(peer_id) - ) - - -func request_safe_respawn(entry_position: Vector3) -> void: - if not entry_position.is_finite(): - return - if is_host(): - remote_recovery_requested.emit(1, entry_position) - elif state == State.JOINED_CLIENT: - submit_safe_respawn_request.rpc_id( - 1, - [entry_position.x, entry_position.y, entry_position.z] - ) - - -@rpc("any_peer", "call_remote", "reliable", 0) -func submit_safe_respawn_request(position_data: Array) -> void: - var sender_id: int = multiplayer.get_remote_sender_id() - if ( - not is_host() - or not _registry.has_peer(sender_id) - or position_data.size() != 3 - ): - return - var entry_position := Vector3( - float(position_data[0]), - float(position_data[1]), - float(position_data[2]) - ) - if not entry_position.is_finite(): - return - remote_recovery_requested.emit(sender_id, entry_position) - - -@rpc("authority", "call_remote", "reliable", 0) -func receive_authoritative_teleport(snapshot: Dictionary) -> void: - if state != State.JOINED_CLIENT: - return - var peer_id: int = int(snapshot.get("peer_id", 0)) - var avatar: Player = _spawn_service.get_avatar(peer_id) - if avatar != null: - avatar.apply_network_teleport(snapshot) - - -func _expire_pending_authentication(now: float) -> void: - for peer_id: int in _pending_authentication.keys(): - if now >= float(_pending_authentication[peer_id]): - _reject_peer( - peer_id, - NetworkProtocol.RejectionCode.AUTHENTICATION_TIMEOUT - ) - - -func _emit_peer_count() -> void: - peer_count_changed.emit(_registry.size(), session_max_players) - - -func _set_state(new_state: State, message: String) -> void: - if not _is_transition_allowed(state, new_state): - push_warning( - "Rejected invalid network state transition %s -> %s." - % [State.keys()[state], State.keys()[new_state]] - ) - return - state = new_state - state_changed.emit(state) - status_message_changed.emit(message) - - -func _is_transition_allowed(from_state: State, to_state: State) -> bool: - if from_state == to_state: - return true - var allowed: Dictionary[State, Array] = { - State.INACTIVE: [ - State.STARTING_PRIVATE_HOST, - State.CONNECTING, - State.CONNECTION_FAILED, - ], - State.STARTING_PRIVATE_HOST: [ - State.PRIVATE_HOST, - State.CONNECTION_FAILED, - State.DISCONNECTING, - ], - State.PRIVATE_HOST: [ - State.OPEN_HOST, - State.DISCONNECTING, - ], - State.OPEN_HOST: [ - State.PRIVATE_HOST, - State.DISCONNECTING, - ], - State.CONNECTING: [ - State.AUTHENTICATING, - State.CONNECTION_FAILED, - State.DISCONNECTING, - State.INACTIVE, - ], - State.AUTHENTICATING: [ - State.JOINED_CLIENT, - State.CONNECTION_FAILED, - State.DISCONNECTING, - State.INACTIVE, - ], - State.JOINED_CLIENT: [ - State.DISCONNECTING, - State.SERVER_LOST, - ], - State.DISCONNECTING: [ - State.INACTIVE, - State.CONNECTING, - ], - State.CONNECTION_FAILED: [ - State.INACTIVE, - State.CONNECTING, - State.DISCONNECTING, - ], - State.SERVER_LOST: [ - State.INACTIVE, - State.CONNECTING, - State.DISCONNECTING, - ], - } - return to_state in allowed.get(from_state, []) - - -func _fail(message: String) -> void: - _set_state(State.CONNECTION_FAILED, message) - connection_error.emit(message) - - -func _teardown_peer() -> void: - _pending_authentication.clear() - _registry.clear() - if _spawn_service != null: - _spawn_service.clear_remote_players() - if _transport != null: - _transport.disconnect_transport() - multiplayer.multiplayer_peer = OfflineMultiplayerPeer.new() - _connection_deadline = 0.0 - _input_accumulator = 0.0 - _snapshot_accumulator = 0.0 diff --git a/network/network_session.gd.uid b/network/network_session.gd.uid deleted file mode 100644 index 1a423e8..0000000 --- a/network/network_session.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://u62a32ktf0y5 diff --git a/network/network_transport.gd b/network/network_transport.gd deleted file mode 100644 index 8b0cd05..0000000 --- a/network/network_transport.gd +++ /dev/null @@ -1,34 +0,0 @@ -class_name NetworkTransport -extends Node - -signal transport_error(message: String) - -var _peer: MultiplayerPeer -var _route_description: String = "" - - -func start_host( - _port: int, - _max_clients: int, - _bind_address: String = "*", -) -> Error: - return ERR_UNAVAILABLE - - -func connect_to_route(_route: ConnectionRoute) -> Error: - return ERR_UNAVAILABLE - - -func disconnect_transport() -> void: - if _peer != null: - _peer.close() - _peer = null - _route_description = "" - - -func get_multiplayer_peer() -> MultiplayerPeer: - return _peer - - -func get_route_description() -> String: - return _route_description diff --git a/network/network_transport.gd.uid b/network/network_transport.gd.uid deleted file mode 100644 index 42076b6..0000000 --- a/network/network_transport.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://pcqgk35ifhxc diff --git a/network/peer_registry.gd b/network/peer_registry.gd deleted file mode 100644 index 2b6203a..0000000 --- a/network/peer_registry.gd +++ /dev/null @@ -1,69 +0,0 @@ -class_name PeerRegistry -extends RefCounted - -class PeerRecord: - extends RefCounted - - var peer_id: int = 0 - var profile_id: String = "" - var display_name: String = "" - var protocol_version: int = 0 - var joined_at_unix: int = 0 - - -var _records: Dictionary[int, PeerRecord] = {} - - -func add_peer( - peer_id: int, - profile_id: String, - display_name: String, - protocol_version: int, -) -> bool: - if peer_id <= 0 or profile_id.is_empty() or has_profile(profile_id): - return false - var record := PeerRecord.new() - record.peer_id = peer_id - record.profile_id = profile_id - record.display_name = display_name - record.protocol_version = protocol_version - record.joined_at_unix = int(Time.get_unix_time_from_system()) - _records[peer_id] = record - return true - - -func remove_peer(peer_id: int) -> PeerRecord: - var record: PeerRecord = _records.get(peer_id) - _records.erase(peer_id) - return record - - -func get_peer(peer_id: int) -> PeerRecord: - return _records.get(peer_id) - - -func has_peer(peer_id: int) -> bool: - return _records.has(peer_id) - - -func has_profile(profile_id: String) -> bool: - for record: PeerRecord in _records.values(): - if record.profile_id == profile_id: - return true - return false - - -func get_peer_ids() -> Array[int]: - var result: Array[int] = [] - for peer_id: int in _records: - result.append(peer_id) - result.sort() - return result - - -func size() -> int: - return _records.size() - - -func clear() -> void: - _records.clear() diff --git a/network/peer_registry.gd.uid b/network/peer_registry.gd.uid deleted file mode 100644 index da096b2..0000000 --- a/network/peer_registry.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://de3jtu2e0ut65 diff --git a/network/player_spawn_service.gd b/network/player_spawn_service.gd deleted file mode 100644 index bf62dd0..0000000 --- a/network/player_spawn_service.gd +++ /dev/null @@ -1,96 +0,0 @@ -class_name PlayerSpawnService -extends Node - -const PlayerScene: PackedScene = preload("res://player/player.tscn") - -signal avatar_spawned(peer_id: int, avatar: Player) -signal avatar_removed(peer_id: int) - -var _players_root: Node3D -var _local_player: Player -var _spawn_transform: Transform3D -var _avatars: Dictionary[int, Player] = {} -var _local_peer_id: int = 1 - - -func setup( - players_root: Node3D, - local_player: Player, - spawn_transform: Transform3D, -) -> void: - _players_root = players_root - _local_player = local_player - _spawn_transform = spawn_transform - - -func register_local_player(peer_id: int) -> void: - if _local_player == null: - return - for existing_id: int in _avatars.keys(): - if _avatars[existing_id] == _local_player: - _avatars.erase(existing_id) - _local_peer_id = peer_id - _avatars[peer_id] = _local_player - _local_player.name = "Player_%d" % peer_id - _local_player.set_local_control(true) - _local_player.set_network_peer_id(peer_id) - - -func spawn_remote_player( - peer_id: int, - transform: Transform3D, - authoritative_simulation: bool = false, -) -> Player: - if peer_id <= 0 or peer_id == _local_peer_id: - return null - var existing: Player = _avatars.get(peer_id) - if existing != null and is_instance_valid(existing): - return existing - var avatar := PlayerScene.instantiate() as Player - avatar.name = "Player_%d" % peer_id - avatar.set_local_control(false) - avatar.set_network_peer_id(peer_id) - _players_root.add_child(avatar) - avatar.global_transform = transform - avatar.configure_network_remote(authoritative_simulation) - _avatars[peer_id] = avatar - avatar_spawned.emit(peer_id, avatar) - return avatar - - -func remove_peer(peer_id: int) -> void: - if peer_id == _local_peer_id: - return - var avatar: Player = _avatars.get(peer_id) - _avatars.erase(peer_id) - if avatar != null and is_instance_valid(avatar): - avatar.queue_free() - avatar_removed.emit(peer_id) - - -func clear_remote_players() -> void: - for peer_id: int in _avatars.keys(): - if peer_id != _local_peer_id: - remove_peer(peer_id) - - -func get_avatar(peer_id: int) -> Player: - return _avatars.get(peer_id) - - -func get_peer_ids() -> Array[int]: - var result: Array[int] = [] - for peer_id: int in _avatars: - result.append(peer_id) - result.sort() - return result - - -func get_spawn_transform_for_index(index: int) -> Transform3D: - if index <= 0: - return _spawn_transform - var angle: float = float(index) * 2.3999632297 - var ring: float = 1.4 + floor(float(index - 1) / 8.0) * 1.2 - var result: Transform3D = _spawn_transform - result.origin += Vector3(cos(angle) * ring, 0.0, sin(angle) * ring) - return result diff --git a/network/player_spawn_service.gd.uid b/network/player_spawn_service.gd.uid deleted file mode 100644 index 93d44f8..0000000 --- a/network/player_spawn_service.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://8w70d0nrf4a7 diff --git a/network/saved_server_store.gd b/network/saved_server_store.gd deleted file mode 100644 index ca2f5b8..0000000 --- a/network/saved_server_store.gd +++ /dev/null @@ -1,187 +0,0 @@ -class_name SavedServerStore -extends Node - -const FORMAT_VERSION: int = 1 -const STORE_PATH: String = "user://saved_servers.json" -const TEMP_PATH: String = "user://saved_servers.json.tmp" -const BACKUP_PATH: String = "user://saved_servers.json.backup" -const MAX_ENTRIES: int = 100 - -var _entries: Array[Dictionary] = [] -var _loaded: bool = false - - -func list_entries() -> Array[Dictionary]: - _ensure_loaded() - return _entries.duplicate(true) - - -func find_by_normalized_endpoint(value: String) -> Dictionary: - _ensure_loaded() - for entry: Dictionary in _entries: - if entry.get("normalized_endpoint", "") == value: - return entry.duplicate(true) - return {} - - -func save_entry( - display_name: String, - endpoint: ConnectionEndpoint, -) -> bool: - _ensure_loaded() - if ( - endpoint == null - or not endpoint.is_valid() - or display_name.strip_edges().is_empty() - or display_name.length() > 80 - ): - return false - var now: int = int(Time.get_unix_time_from_system()) - for entry: Dictionary in _entries: - if entry.get("normalized_endpoint", "") == endpoint.normalized_display: - entry["display_name"] = display_name.strip_edges() - entry["host"] = endpoint.host - entry["port"] = endpoint.port - entry["updated_at_unix"] = now - return _save_atomic() - if _entries.size() >= MAX_ENTRIES: - return false - _entries.append({ - "entry_id": Crypto.new().generate_random_bytes(16).hex_encode(), - "display_name": display_name.strip_edges(), - "route_kind": "DIRECT", - "host": endpoint.host, - "port": endpoint.port, - "normalized_endpoint": endpoint.normalized_display, - "favorite": false, - "created_at_unix": now, - "updated_at_unix": now, - "last_success_at_unix": 0, - "last_observed_max_players": 0, - }) - return _save_atomic() - - -func remove_entry(entry_id: String) -> bool: - _ensure_loaded() - for index: int in range(_entries.size()): - if _entries[index].get("entry_id", "") == entry_id: - _entries.remove_at(index) - return _save_atomic() - return false - - -func record_successful_connection( - endpoint: ConnectionEndpoint, - observed_max_players: int, -) -> bool: - _ensure_loaded() - if endpoint == null or not endpoint.is_valid(): - return false - for entry: Dictionary in _entries: - if entry.get("normalized_endpoint", "") == endpoint.normalized_display: - entry["last_success_at_unix"] = int(Time.get_unix_time_from_system()) - entry["last_observed_max_players"] = maxi(observed_max_players, 0) - entry["updated_at_unix"] = int(Time.get_unix_time_from_system()) - return _save_atomic() - # Successful manual connections are deliberately not auto-saved. - return true - - -func _ensure_loaded() -> void: - if _loaded: - return - _loaded = true - _recover_interrupted_write() - if not FileAccess.file_exists(STORE_PATH): - return - var file := FileAccess.open(STORE_PATH, FileAccess.READ) - if file == null: - return - var json := JSON.new() - var error: Error = json.parse(file.get_as_text()) - file.close() - if error != OK or typeof(json.data) != TYPE_DICTIONARY: - return - var data: Dictionary = json.data - if data.get("format_version") != FORMAT_VERSION: - return - var raw_entries: Variant = data.get("entries") - if typeof(raw_entries) != TYPE_ARRAY: - return - var seen: Dictionary[String, bool] = {} - for value: Variant in raw_entries: - if typeof(value) != TYPE_DICTIONARY: - continue - var entry: Dictionary = value - var stored_host: String = str(entry.get("host", "")) - var stored_port: int = int(entry.get("port", 0)) - var endpoint_text: String = ( - "[%s]:%d" % [stored_host, stored_port] - if stored_host.contains(":") - else "%s:%d" % [stored_host, stored_port] - ) - var endpoint: ConnectionEndpoint = EndpointParser.parse(endpoint_text) - if ( - not endpoint.is_valid() - or seen.has(endpoint.normalized_display) - or typeof(entry.get("entry_id")) != TYPE_STRING - or typeof(entry.get("display_name")) != TYPE_STRING - ): - continue - entry["normalized_endpoint"] = endpoint.normalized_display - seen[endpoint.normalized_display] = true - _entries.append(entry.duplicate(true)) - if _entries.size() >= MAX_ENTRIES: - break - - -func _save_atomic() -> bool: - var file := FileAccess.open(TEMP_PATH, FileAccess.WRITE) - if file == null: - return false - file.store_string(JSON.stringify({ - "format_version": FORMAT_VERSION, - "entries": _entries, - }, "\t")) - file.flush() - var error: Error = file.get_error() - file.close() - if error != OK: - _remove_if_present(TEMP_PATH) - return false - _remove_if_present(BACKUP_PATH) - var had_primary: bool = FileAccess.file_exists(STORE_PATH) - if had_primary and not _rename(STORE_PATH, BACKUP_PATH): - _remove_if_present(TEMP_PATH) - return false - if not _rename(TEMP_PATH, STORE_PATH): - if had_primary: - _rename(BACKUP_PATH, STORE_PATH) - return false - _remove_if_present(BACKUP_PATH) - return true - - -func _recover_interrupted_write() -> void: - if FileAccess.file_exists(STORE_PATH): - _remove_if_present(TEMP_PATH) - _remove_if_present(BACKUP_PATH) - return - if FileAccess.file_exists(BACKUP_PATH): - _rename(BACKUP_PATH, STORE_PATH) - _remove_if_present(TEMP_PATH) - - -func _rename(from_path: String, to_path: String) -> bool: - return DirAccess.rename_absolute( - ProjectSettings.globalize_path(from_path), - ProjectSettings.globalize_path(to_path) - ) == OK - - -func _remove_if_present(path: String) -> bool: - return ( - not FileAccess.file_exists(path) - or DirAccess.remove_absolute(ProjectSettings.globalize_path(path)) == OK - ) diff --git a/network/saved_server_store.gd.uid b/network/saved_server_store.gd.uid deleted file mode 100644 index b07aac2..0000000 --- a/network/saved_server_store.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://b7j0er0u1nwy7 diff --git a/player/player.gd b/player/player.gd index d7e3452..705cb1c 100644 --- a/player/player.gd +++ b/player/player.gd @@ -105,20 +105,6 @@ var _showcase_restore_tween: Tween var _showcase_camera_tween: Tween var _showcase_camera_snapshot: ShowcaseCameraSnapshot var _showcase_restore_generation: int = 0 -var _network_peer_id: int = 0 -var _network_authoritative_simulation: bool = false -var _network_interpolation_enabled: bool = false -var _network_axis: Vector2 = Vector2.ZERO -var _network_camera_yaw: float = 0.0 -var _network_jump_pending: bool = false -var _network_sprint: bool = false -var _network_sneak: bool = false -var _network_slow_walk: bool = false -var _last_network_input_sequence: int = 0 -var _network_target_position: Vector3 -var _network_target_velocity: Vector3 -var _network_target_visual_yaw: float = 0.0 -var _network_snapshot_ready: bool = false func _ready() -> void: @@ -128,9 +114,6 @@ func _ready() -> void: func _physics_process(delta: float) -> void: - if _network_interpolation_enabled: - _update_network_interpolation(delta) - return if _water_recovery_active: velocity = Vector3.ZERO return @@ -142,50 +125,34 @@ func _physics_process(delta: float) -> void: else fall_gravity_multiplier ) velocity.y -= _gravity * gravity_multiplier * delta - elif _movement_enabled and ( - ( - local_control_enabled - and Input.is_action_just_pressed("jump") - ) - or ( - _network_authoritative_simulation - and _network_jump_pending - ) + elif ( + local_control_enabled + and _movement_enabled + and Input.is_action_just_pressed("jump") ): velocity.y = jump_velocity - _network_jump_pending = false - if not _movement_enabled: + if not local_control_enabled or not _movement_enabled: velocity.x = 0.0 velocity.z = 0.0 move_and_slide() return - var input_vector: Vector2 - var camera_basis: Basis - if local_control_enabled: - input_vector = Input.get_vector( - "move_left", - "move_right", - "move_forward", - "move_backward" - ) - camera_basis = _camera_yaw.global_basis - elif _network_authoritative_simulation: - input_vector = _network_axis - camera_basis = Basis(Vector3.UP, _network_camera_yaw) - else: - velocity.x = 0.0 - velocity.z = 0.0 - return + var input_vector: Vector2 = Input.get_vector( + "move_left", + "move_right", + "move_forward", + "move_backward" + ) + var camera_basis: Basis = _camera_yaw.global_basis var move_direction: Vector3 = camera_basis.x * input_vector.x + camera_basis.z * input_vector.y move_direction.y = 0.0 var input_strength: float = minf(input_vector.length(), 1.0) move_direction = move_direction.normalized() - var speed: float = _get_network_aware_speed() - if item_effects != null: - speed *= item_effects.get_movement_multiplier() + var speed: float = ( + _get_current_speed() * item_effects.get_movement_multiplier() + ) velocity.x = move_direction.x * speed * input_strength velocity.z = move_direction.z * speed * input_strength @@ -276,18 +243,6 @@ func _get_current_speed() -> float: return walk_speed -func _get_network_aware_speed() -> float: - if local_control_enabled: - return _get_current_speed() - if _network_sneak: - return sneak_speed - if _network_slow_walk: - return slow_walk_speed - if _network_sprint: - return sprint_speed - return walk_speed - - func _rotate_camera(delta_rotation: Vector2) -> void: _camera_yaw.rotation.y -= delta_rotation.x var vertical_direction: float = -1.0 if invert_camera_y else 1.0 @@ -310,158 +265,6 @@ func set_local_control(enabled: bool) -> void: _camera_dragging = false -func set_network_peer_id(peer_id: int) -> void: - _network_peer_id = peer_id - - -func get_network_peer_id() -> int: - return _network_peer_id - - -func configure_network_remote(authoritative_simulation: bool) -> void: - set_local_control(false) - _network_authoritative_simulation = authoritative_simulation - _network_interpolation_enabled = not authoritative_simulation - _network_snapshot_ready = false - _camera.current = false - - -func capture_network_input(sequence: int) -> Dictionary: - var axis: Vector2 = Input.get_vector( - "move_left", - "move_right", - "move_forward", - "move_backward" - ) - return { - "sequence": sequence, - "axis": [axis.x, axis.y], - "camera_yaw": _camera_yaw.global_rotation.y, - "jump": Input.is_action_just_pressed("jump"), - "sprint": Input.is_action_pressed("sprint"), - "sneak": Input.is_action_pressed("sneak"), - "slow_walk": Input.is_action_pressed("slow_walk"), - } - - -func apply_authoritative_network_input(data: Dictionary) -> void: - var sequence: int = int(data.get("sequence", 0)) - if sequence <= _last_network_input_sequence: - return - var axis: Array = data.get("axis", []) - if axis.size() != 2: - return - _last_network_input_sequence = sequence - _network_axis = Vector2(float(axis[0]), float(axis[1])).limit_length(1.0) - _network_camera_yaw = float(data.get("camera_yaw", 0.0)) - _network_jump_pending = bool(data.get("jump", false)) - _network_sprint = bool(data.get("sprint", false)) - _network_sneak = bool(data.get("sneak", false)) - _network_slow_walk = bool(data.get("slow_walk", false)) - - -func make_network_snapshot(peer_id: int) -> Dictionary: - return { - "peer_id": peer_id, - "acknowledged_input": _last_network_input_sequence, - "position": [global_position.x, global_position.y, global_position.z], - "velocity": [velocity.x, velocity.y, velocity.z], - "visual_yaw": _visuals.rotation.y, - "grounded": is_on_floor(), - } - - -func push_network_snapshot(snapshot: Dictionary) -> void: - var parsed: Dictionary = _parse_network_snapshot(snapshot) - if parsed.is_empty(): - return - _network_target_position = parsed["position"] - _network_target_velocity = parsed["velocity"] - _network_target_visual_yaw = parsed["visual_yaw"] - if not _network_snapshot_ready: - global_position = _network_target_position - velocity = _network_target_velocity - _visuals.rotation.y = _network_target_visual_yaw - _network_snapshot_ready = true - - -func apply_local_prediction_correction(snapshot: Dictionary) -> void: - var parsed: Dictionary = _parse_network_snapshot(snapshot) - if parsed.is_empty(): - return - var authoritative_position: Vector3 = parsed["position"] - var error_distance: float = global_position.distance_to( - authoritative_position - ) - if error_distance > 2.0: - global_position = authoritative_position - elif error_distance > 0.05: - global_position = global_position.lerp(authoritative_position, 0.18) - - -func apply_network_teleport(snapshot: Dictionary) -> void: - var parsed: Dictionary = _parse_network_snapshot(snapshot) - if parsed.is_empty(): - return - global_position = parsed["position"] - velocity = parsed["velocity"] - _visuals.rotation.y = parsed["visual_yaw"] - _network_target_position = global_position - _network_target_velocity = velocity - _network_target_visual_yaw = _visuals.rotation.y - _network_snapshot_ready = true - - -func _parse_network_snapshot(snapshot: Dictionary) -> Dictionary: - var position: Variant = snapshot.get("position") - var network_velocity: Variant = snapshot.get("velocity") - if ( - typeof(position) != TYPE_ARRAY - or typeof(network_velocity) != TYPE_ARRAY - or position.size() != 3 - or network_velocity.size() != 3 - ): - return {} - var parsed_position := Vector3( - float(position[0]), - float(position[1]), - float(position[2]) - ) - var parsed_velocity := Vector3( - float(network_velocity[0]), - float(network_velocity[1]), - float(network_velocity[2]) - ) - var visual_yaw: float = float(snapshot.get("visual_yaw", 0.0)) - if ( - not parsed_position.is_finite() - or not parsed_velocity.is_finite() - or not is_finite(visual_yaw) - ): - return {} - return { - "position": parsed_position, - "velocity": parsed_velocity, - "visual_yaw": visual_yaw, - } - - -func _update_network_interpolation(delta: float) -> void: - if not _network_snapshot_ready: - return - var position_weight: float = 1.0 - exp(-12.0 * delta) - global_position = global_position.lerp( - _network_target_position, - position_weight - ) - velocity = _network_target_velocity - _visuals.rotation.y = lerp_angle( - _visuals.rotation.y, - _network_target_visual_yaw, - 1.0 - exp(-14.0 * delta) - ) - - func is_local_control_enabled() -> bool: return local_control_enabled diff --git a/ui/game_ui.gd b/ui/game_ui.gd index e8f9e46..d63f940 100644 --- a/ui/game_ui.gd +++ b/ui/game_ui.gd @@ -16,7 +16,6 @@ const PlayerHotbarType = preload("res://inventory/player_hotbar.gd") const HotbarUIType = preload("res://ui/hotbar.gd") const TitleScreenType = preload("res://ui/title_screen.gd") const PauseMenuType = preload("res://ui/pause_menu.gd") -const NetworkSessionType = preload("res://network/network_session.gd") const FishingShopType = preload("res://ui/fishing_shop.gd") const SettingsPanelType = preload("res://ui/settings_panel.gd") const PlayerFishingUpgradesType = preload( @@ -101,7 +100,6 @@ func setup( shop_interaction: ShopInteractionType, item_effects: PlayerItemEffectsType, cooler_capacity: PlayerCoolerCapacityType, - network_session: NetworkSessionType, ) -> void: _fishing_spot = fishing_spot _item_effects = item_effects @@ -123,8 +121,7 @@ func setup( bag, hotbar, item_catalog, - cooler_capacity, - network_session + cooler_capacity ) _hotbar_ui.setup(hotbar, bag, item_catalog, fishing_spot) _fishing_shop.setup( diff --git a/ui/network/join_game_page.gd b/ui/network/join_game_page.gd deleted file mode 100644 index 9952e0c..0000000 --- a/ui/network/join_game_page.gd +++ /dev/null @@ -1,175 +0,0 @@ -class_name JoinGamePage -extends Control - -signal join_requested(endpoint: String) -signal back_requested - -@onready var _address: LineEdit = %Address -@onready var _join_button: BubbleButton = %JoinButton -@onready var _cancel_button: BubbleButton = %CancelButton -@onready var _back_button: BubbleButton = %BackButton -@onready var _open_close_button: BubbleButton = %OpenCloseButton -@onready var _status: Label = %Status -@onready var _session_summary: Label = %SessionSummary - -var _network_session: NetworkSession -var _saved_servers: SavedServerStore -var _gameplay_context: bool = false - - -func _ready() -> void: - _join_button.pressed.connect(_on_join_pressed) - _cancel_button.pressed.connect(_on_cancel_pressed) - _back_button.pressed.connect(_on_back_pressed) - _open_close_button.pressed.connect(_on_open_close_pressed) - _address.text_submitted.connect(_on_address_submitted) - hide() - - -func setup( - network_session: NetworkSession, - saved_servers: SavedServerStore, - gameplay_context: bool, -) -> void: - _network_session = network_session - _saved_servers = saved_servers - _gameplay_context = gameplay_context - if not _network_session.state_changed.is_connected(_on_state_changed): - _network_session.state_changed.connect(_on_state_changed) - if not _network_session.status_message_changed.is_connected( - _on_status_message_changed - ): - _network_session.status_message_changed.connect( - _on_status_message_changed - ) - if not _network_session.connection_error.is_connected( - _on_connection_error - ): - _network_session.connection_error.connect(_on_connection_error) - if not _network_session.peer_count_changed.is_connected( - _on_peer_count_changed - ): - _network_session.peer_count_changed.connect(_on_peer_count_changed) - _refresh() - - -func open_page(preserved_endpoint: String = "") -> void: - if not preserved_endpoint.is_empty(): - _address.text = preserved_endpoint - elif _address.text.is_empty(): - _address.text = "127.0.0.1:7777" - show() - _refresh() - _address.grab_focus() - _address.select_all() - - -func close_page() -> void: - hide() - get_viewport().gui_release_focus() - - -func get_endpoint_text() -> String: - return _address.text - - -func set_status(message: String) -> void: - _status.text = message - - -func _on_join_pressed() -> void: - _request_join() - - -func _on_address_submitted(_value: String) -> void: - _request_join() - - -func _request_join() -> void: - if _network_session.state in [ - NetworkSession.State.CONNECTION_FAILED, - NetworkSession.State.SERVER_LOST, - ]: - _network_session.reset_failure() - var endpoint: ConnectionEndpoint = EndpointParser.parse(_address.text) - if not endpoint.is_valid(): - _status.text = endpoint.error_message - return - _address.text = endpoint.normalized_display - join_requested.emit(endpoint.normalized_display) - - -func _on_cancel_pressed() -> void: - if _network_session != null: - _network_session.cancel_connection() - _refresh() - - -func _on_back_pressed() -> void: - if ( - _network_session != null - and _network_session.state in [ - NetworkSession.State.CONNECTING, - NetworkSession.State.AUTHENTICATING, - ] - ): - _network_session.cancel_connection() - back_requested.emit() - - -func _on_open_close_pressed() -> void: - if _network_session == null or not _network_session.is_host(): - return - _network_session.set_host_open(not _network_session.is_open_host()) - _refresh() - - -func _on_state_changed(_state: NetworkSession.State) -> void: - _refresh() - - -func _on_status_message_changed(message: String) -> void: - _status.text = message - _refresh() - - -func _on_connection_error(message: String) -> void: - _status.text = message - _refresh() - - -func _on_peer_count_changed(player_count: int, max_players: int) -> void: - _session_summary.text = "%d / %d players" % [ - player_count, - max_players, - ] - - -func _refresh() -> void: - if not is_node_ready() or _network_session == null: - return - var connecting: bool = _network_session.state in [ - NetworkSession.State.CONNECTING, - NetworkSession.State.AUTHENTICATING, - ] - _address.editable = not connecting - _join_button.disabled = connecting - _cancel_button.visible = connecting - _open_close_button.visible = ( - _gameplay_context and _network_session.is_host() - ) - if _open_close_button.visible: - _open_close_button.text = ( - "close\ngame" - if _network_session.is_open_host() - else "open\ngame" - ) - _session_summary.visible = ( - _gameplay_context - and _network_session.state != NetworkSession.State.INACTIVE - ) - if _session_summary.visible: - _session_summary.text = "%d / %d players" % [ - _network_session.get_player_count(), - _network_session.get_session_max_players(), - ] diff --git a/ui/network/join_game_page.gd.uid b/ui/network/join_game_page.gd.uid deleted file mode 100644 index c1bdf89..0000000 --- a/ui/network/join_game_page.gd.uid +++ /dev/null @@ -1 +0,0 @@ -uid://dch42c44t4rj5 diff --git a/ui/network/join_game_page.tscn b/ui/network/join_game_page.tscn deleted file mode 100644 index 75e7e8f..0000000 --- a/ui/network/join_game_page.tscn +++ /dev/null @@ -1,145 +0,0 @@ -[gd_scene load_steps=5 format=3] - -[ext_resource type="Script" path="res://ui/network/join_game_page.gd" id="1_script"] -[ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] -[ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_button.tscn" id="3_bubble"] - -[sub_resource type="StyleBoxFlat" id="StyleBox_paper"] -bg_color = Color(0.93, 0.885, 0.73, 1) -shadow_color = Color(0.02, 0.075, 0.11, 0.42) -shadow_size = 10 -shadow_offset = Vector2(7, 8) -corner_radius_top_left = 54 -corner_radius_top_right = 46 -corner_radius_bottom_right = 58 -corner_radius_bottom_left = 48 - -[node name="JoinGamePage" type="Control"] -visible = false -layout_mode = 3 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 -theme = ExtResource("2_theme") -script = ExtResource("1_script") - -[node name="Paper" type="PanelContainer" parent="."] -layout_mode = 0 -offset_left = 340.0 -offset_top = 132.0 -offset_right = 940.0 -offset_bottom = 570.0 -theme_override_styles/panel = SubResource("StyleBox_paper") - -[node name="Margin" type="MarginContainer" parent="Paper"] -layout_mode = 2 -theme_override_constants/margin_left = 70 -theme_override_constants/margin_top = 52 -theme_override_constants/margin_right = 70 -theme_override_constants/margin_bottom = 52 - -[node name="Layout" type="VBoxContainer" parent="Paper/Margin"] -layout_mode = 2 -theme_override_constants/separation = 18 -alignment = 1 - -[node name="Title" type="Label" parent="Paper/Margin/Layout"] -layout_mode = 2 -theme_override_colors/font_color = Color(0.035, 0.145, 0.22, 1) -theme_override_font_sizes/font_size = 34 -text = "join game" -horizontal_alignment = 1 - -[node name="Hint" type="Label" parent="Paper/Margin/Layout"] -layout_mode = 2 -theme_override_colors/font_color = Color(0.035, 0.145, 0.22, 1) -theme_override_font_sizes/font_size = 17 -text = "hostname or IP address • optional port" -horizontal_alignment = 1 - -[node name="Address" type="LineEdit" parent="Paper/Margin/Layout"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 52) -layout_mode = 2 -theme_override_colors/font_color = Color(0.035, 0.145, 0.22, 1) -theme_override_font_sizes/font_size = 22 -placeholder_text = "example.net:7777" -alignment = 1 -max_length = 300 - -[node name="Status" type="Label" parent="Paper/Margin/Layout"] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 42) -layout_mode = 2 -theme_override_colors/font_color = Color(0.035, 0.145, 0.22, 1) -theme_override_font_sizes/font_size = 17 -text = "Direct UDP connection • default port 7777" -horizontal_alignment = 1 -vertical_alignment = 1 -autowrap_mode = 2 - -[node name="SessionSummary" type="Label" parent="Paper/Margin/Layout"] -unique_name_in_owner = true -visible = false -layout_mode = 2 -theme_override_colors/font_color = Color(0.035, 0.145, 0.22, 1) -theme_override_font_sizes/font_size = 17 -text = "1 / 8 players" -horizontal_alignment = 1 - -[node name="Actions" type="HBoxContainer" parent="Paper/Margin/Layout"] -layout_mode = 2 -theme_override_constants/separation = 12 -alignment = 1 - -[node name="JoinButton" parent="Paper/Margin/Layout/Actions" instance=ExtResource("3_bubble")] -unique_name_in_owner = true -custom_minimum_size = Vector2(112, 106) -layout_mode = 2 -text = "join" -neutral_size = Vector2(112, 106) -minimum_font_size = 18 -maximum_font_size = 24 -horizontal_amplitude = 0.0 -vertical_amplitude = 0.0 -deformation_amplitude = 0.0 - -[node name="OpenCloseButton" parent="Paper/Margin/Layout/Actions" instance=ExtResource("3_bubble")] -unique_name_in_owner = true -visible = false -custom_minimum_size = Vector2(112, 106) -layout_mode = 2 -text = "open\ngame" -neutral_size = Vector2(112, 106) -minimum_font_size = 17 -maximum_font_size = 22 -horizontal_amplitude = 0.0 -vertical_amplitude = 0.0 -deformation_amplitude = 0.0 - -[node name="CancelButton" parent="Paper/Margin/Layout/Actions" instance=ExtResource("3_bubble")] -unique_name_in_owner = true -visible = false -custom_minimum_size = Vector2(98, 94) -layout_mode = 2 -text = "cancel" -neutral_size = Vector2(98, 94) -minimum_font_size = 16 -maximum_font_size = 20 -horizontal_amplitude = 0.0 -vertical_amplitude = 0.0 -deformation_amplitude = 0.0 - -[node name="BackButton" parent="Paper/Margin/Layout/Actions" instance=ExtResource("3_bubble")] -unique_name_in_owner = true -custom_minimum_size = Vector2(98, 94) -layout_mode = 2 -text = "back" -neutral_size = Vector2(98, 94) -minimum_font_size = 16 -maximum_font_size = 20 -horizontal_amplitude = 0.0 -vertical_amplitude = 0.0 -deformation_amplitude = 0.0 diff --git a/ui/pause_menu.gd b/ui/pause_menu.gd index 7091273..ab68d67 100644 --- a/ui/pause_menu.gd +++ b/ui/pause_menu.gd @@ -19,22 +19,17 @@ const BubbleConfirmationPageType = preload( "res://ui/components/bubble_menu/bubble_confirmation_page.gd" ) const FishingSpotType = preload("res://fishing/fishing_spot.gd") -const NetworkSessionType = preload("res://network/network_session.gd") -const SavedServerStoreType = preload("res://network/saved_server_store.gd") -const JoinGamePageType = preload("res://ui/network/join_game_page.gd") signal return_to_title_requested signal reset_progress_requested signal quit_requested signal menu_visibility_changed(is_open: bool) -signal join_game_requested(endpoint: String) enum ConfirmationAction { NONE, RETURN_TO_TITLE, RESET_PROGRESS, QUIT_ANYWAY, - JOIN_ANOTHER, } enum CloseReason { @@ -59,14 +54,11 @@ enum CloseReason { ) @onready var _feedback: Label = %FeedbackLabel @onready var _save_button: BubbleButton = %SaveButton -@onready var _join_game_page: JoinGamePageType = %JoinGamePage var _player: PlayerType var _save_manager: SaveManagerType var _settings_manager: SettingsManagerType var _fishing_spot: FishingSpotType -var _network_session: NetworkSessionType -var _saved_servers: SavedServerStoreType var _prior_movement_enabled: bool = true var _prior_camera_enabled: bool = true var _prior_mouse_mode: Input.MouseMode = Input.MOUSE_MODE_VISIBLE @@ -79,14 +71,12 @@ var _root_transition_generation: int = 0 var _closing_menu: bool = false var _backdrop_fade: Tween var _backdrop_fade_generation: int = 0 -var _pending_join_endpoint: String = "" func _ready() -> void: %ResumeButton.pressed.connect(resume) _save_button.pressed.connect(_save_now) %SettingsButton.pressed.connect(_open_settings) - %JoinGameButton.pressed.connect(_open_join_game) %ReturnToTitleButton.pressed.connect(_confirm_return_to_title) %ResetProgressButton.pressed.connect(_confirm_reset_progress) %QuitButton.pressed.connect(_request_quit) @@ -97,8 +87,6 @@ func _ready() -> void: _settings_panel.navigation_transition_started.connect( _emit_transition_flurry ) - _join_game_page.join_requested.connect(_on_join_game_requested) - _join_game_page.back_requested.connect(_close_join_game) _dim_background.color.a = 0.0 _confirmation_page.hide_page() resized.connect(_update_responsive_pause_stage) @@ -110,16 +98,11 @@ func setup( save_manager: SaveManagerType, settings_manager: SettingsManagerType, fishing_spot: FishingSpotType, - network_session: NetworkSessionType, - saved_servers: SavedServerStoreType, ) -> void: _player = player _save_manager = save_manager _settings_manager = settings_manager _fishing_spot = fishing_spot - _network_session = network_session - _saved_servers = saved_servers - _join_game_page.setup(network_session, saved_servers, true) if not _fishing_spot.bite_activated.is_connected(_on_bite_activated): _fishing_spot.bite_activated.connect(_on_bite_activated) @@ -138,7 +121,6 @@ func open_menu() -> void: Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _feedback.text = "" _settings_panel.hide() - _join_game_page.close_page() _confirmation_page.hide_page() _confirmation_action = ConfirmationAction.NONE _action_in_progress = false @@ -187,8 +169,6 @@ func handle_escape() -> bool: return true if _confirmation_page.visible: _close_confirmation() - elif _join_game_page.visible: - _close_join_game() elif _settings_panel.visible: _settings_panel.handle_back() else: @@ -223,47 +203,6 @@ func _open_settings() -> void: _begin_root_exit(_finish_open_settings) -func _open_join_game() -> void: - if ( - _action_in_progress - or _root_transition_active - or _confirmation_action != ConfirmationAction.NONE - ): - return - _begin_root_exit(_finish_open_join_game) - - -func _finish_open_join_game() -> void: - _join_game_page.open_page() - - -func _close_join_game() -> void: - _join_game_page.close_page() - _begin_root_entry(true) - - -func _on_join_game_requested(endpoint: String) -> void: - if _action_in_progress or _root_transition_active: - return - _pending_join_endpoint = endpoint - _open_confirmation( - ConfirmationAction.JOIN_ANOTHER, - "join another game?", - ( - "your progression will be saved first. " - + "current players will be disconnected if you are hosting." - ), - "save and join", - false - ) - - -func report_network_error(message: String) -> void: - _feedback.text = message - if _join_game_page.visible: - _join_game_page.set_status(message) - - func _finish_open_settings() -> void: _settings_panel.open_panel( _settings_manager, @@ -408,10 +347,6 @@ func _finish_confirmation_accept(action: ConfirmationAction) -> void: reset_progress_requested.emit() ConfirmationAction.QUIT_ANYWAY: quit_requested.emit() - ConfirmationAction.JOIN_ANOTHER: - _join_game_page.close_page() - join_game_requested.emit(_pending_join_endpoint) - _pending_join_endpoint = "" _: _action_in_progress = false _begin_root_entry(false) @@ -486,7 +421,6 @@ func _finish_close(reason: CloseReason, restore_controls: bool) -> void: _dim_background.color.a = 0.0 _dim_background.hide() _settings_panel.hide() - _join_game_page.close_page() _root_page.hide_page() _confirmation_page.hide_page() _confirmation_action = ConfirmationAction.NONE diff --git a/ui/pause_menu.tscn b/ui/pause_menu.tscn index 3f51fd6..318caa5 100644 --- a/ui/pause_menu.tscn +++ b/ui/pause_menu.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=11 format=3] +[gd_scene load_steps=10 format=3] [ext_resource type="Script" path="res://ui/pause_menu.gd" id="1_script"] [ext_resource type="PackedScene" path="res://ui/settings_panel.tscn" id="2_settings"] @@ -9,7 +9,6 @@ [ext_resource type="Resource" path="res://ui/components/bubble_menu/bubble_menu_profile.tres" id="7_profile"] [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_transition_flurry.gd" id="8_flurry"] [ext_resource type="PackedScene" path="res://ui/components/bubble_menu/bubble_confirmation_page.tscn" id="9_confirmation"] -[ext_resource type="PackedScene" path="res://ui/network/join_game_page.tscn" id="10_join_page"] [node name="PauseMenu" type="Control"] unique_name_in_owner = true @@ -77,8 +76,8 @@ grow_horizontal = 2 grow_vertical = 2 script = ExtResource("4_page") page_id = &"pause" -bubble_paths = Array[NodePath]([NodePath("BubbleCluster/ResumeButton"), NodePath("BubbleCluster/SaveButton"), NodePath("BubbleCluster/JoinGameButton"), NodePath("BubbleCluster/SettingsButton"), NodePath("BubbleCluster/ReturnToTitleButton"), NodePath("BubbleCluster/ResetProgressButton"), NodePath("BubbleCluster/QuitButton")]) -focus_paths = Array[NodePath]([NodePath("BubbleCluster/ResumeButton"), NodePath("BubbleCluster/SaveButton"), NodePath("BubbleCluster/JoinGameButton"), NodePath("BubbleCluster/SettingsButton"), NodePath("BubbleCluster/ReturnToTitleButton"), NodePath("BubbleCluster/ResetProgressButton"), NodePath("BubbleCluster/QuitButton")]) +bubble_paths = Array[NodePath]([NodePath("BubbleCluster/ResumeButton"), NodePath("BubbleCluster/SaveButton"), NodePath("BubbleCluster/SettingsButton"), NodePath("BubbleCluster/ReturnToTitleButton"), NodePath("BubbleCluster/ResetProgressButton"), NodePath("BubbleCluster/QuitButton")]) +focus_paths = Array[NodePath]([NodePath("BubbleCluster/ResumeButton"), NodePath("BubbleCluster/SaveButton"), NodePath("BubbleCluster/SettingsButton"), NodePath("BubbleCluster/ReturnToTitleButton"), NodePath("BubbleCluster/ResetProgressButton"), NodePath("BubbleCluster/QuitButton")]) initial_focus_path = NodePath("BubbleCluster/ResumeButton") back_focus_path = NodePath("BubbleCluster/ResumeButton") maximum_layout_size = Vector2(720, 520) @@ -135,19 +134,6 @@ minimum_font_size = 16 maximum_font_size = 23 motion_phase = 2.05 -[node name="JoinGameButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] -unique_name_in_owner = true -custom_minimum_size = Vector2(0, 0) -text = "join\ngame" -accessibility_name = "join game" -neutral_size = Vector2(126, 120) -desktop_anchor = Vector2(105, 320) -compact_anchor = Vector2(105, 320) -compact_minimum_size = Vector2(96, 92) -minimum_font_size = 15 -maximum_font_size = 21 -motion_phase = 2.55 - [node name="ReturnToTitleButton" parent="ResponsivePauseStage/PausePresentationScaleRoot/RootPage/BubbleCluster" instance=ExtResource("5_bubble")] unique_name_in_owner = true custom_minimum_size = Vector2(0, 0) @@ -223,13 +209,3 @@ anchor_right = 1.0 anchor_bottom = 1.0 grow_horizontal = 2 grow_vertical = 2 - -[node name="JoinGamePage" parent="ResponsivePauseStage/PausePresentationScaleRoot" instance=ExtResource("10_join_page")] -unique_name_in_owner = true -z_index = 4 -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 diff --git a/ui/player_menu.gd b/ui/player_menu.gd index 7759634..83bfa9c 100644 --- a/ui/player_menu.gd +++ b/ui/player_menu.gd @@ -8,7 +8,6 @@ const FishDataType = preload("res://fish/fish_data.gd") const FishBuyerProfileType = preload("res://economy/fish_buyer_profile.gd") const FishSaleResultType = preload("res://economy/fish_sale_result.gd") const FishSaleServiceType = preload("res://economy/fish_sale_service.gd") -const NetworkSessionType = preload("res://network/network_session.gd") const FishInventoryType = preload("res://inventory/fish_inventory.gd") const FishPoolType = preload("res://fish/fish_pool.gd") const FishingSpotType = preload("res://fishing/fishing_spot.gd") @@ -226,7 +225,6 @@ var _inventory: FishInventoryType var _collection_log: CollectionLogType var _wallet: PlayerWalletType var _sale_service: FishSaleServiceType -var _network_session: NetworkSessionType var _default_buyer: FishBuyerProfileType var _catalog: FishPoolType var _fishing_spot: FishingSpotType @@ -355,7 +353,6 @@ func setup( hotbar: PlayerHotbarType, item_catalog: ItemCatalogType, cooler_capacity: PlayerCoolerCapacityType, - network_session: NetworkSessionType, ) -> void: _player = player _inventory = inventory @@ -369,7 +366,6 @@ func setup( _hotbar = hotbar _item_catalog = item_catalog _cooler_capacity = cooler_capacity - _network_session = network_session _fish_selection.clear() if not _inventory.catches_changed.is_connected(_on_inventory_changed): _inventory.catches_changed.connect(_on_inventory_changed) @@ -2341,23 +2337,6 @@ func _update_sale_summary() -> void: _sale_unavailable.text = "" _sale_unavailable.visible = false return - if not _can_use_shared_world_actions(): - _selection_summary.text = ( - "1 fish selected" - if selected_count == 1 - else "%d fish selected" % selected_count - ) - _selection_status.set_content("selected", str(selected_count)) - _offer_status.set_content("pelican offer", "host only") - _sell_button.disabled = true - _sell_bubble.disabled = true - _sell_bubble.persistent_mark = false - _sell_bubble.refresh_ink_state() - _sale_unavailable.text = ( - "Selling in joined games is coming in a later multiplayer phase." - ) - _sale_unavailable.visible = true - return var preview: FishSaleResultType = ( _sale_service.preview_batch(selected_ids, _default_buyer) if _sale_service != null @@ -2428,11 +2407,6 @@ func _on_favorite_pressed() -> void: func _on_sell_pressed() -> void: - if not _can_use_shared_world_actions(): - _transaction_feedback.text = ( - "Selling in joined games is coming in a later multiplayer phase." - ) - return var selected_ids: Array[StringName] = _fish_selection.get_selected_ids() if ( _inventory == null @@ -2481,7 +2455,6 @@ func _on_sell_pressed() -> void: func _on_confirm_sale_pressed() -> void: if ( _sale_in_progress - or not _can_use_shared_world_actions() or _sale_service == null or _confirmation_catch_ids.is_empty() or _confirmation_buyer == null @@ -2511,13 +2484,6 @@ func _on_confirm_sale_pressed() -> void: _inventory_tab.grab_focus() -func _can_use_shared_world_actions() -> bool: - return ( - _network_session == null - or _network_session.can_use_host_gameplay() - ) - - func _close_sale_confirmation() -> void: var was_visible: bool = _sale_confirmation.visible _confirmation_catch_ids.clear() diff --git a/ui/title_screen.gd b/ui/title_screen.gd index ee1062e..a5d5a9f 100644 --- a/ui/title_screen.gd +++ b/ui/title_screen.gd @@ -16,9 +16,6 @@ const BubbleClusterType = preload( const TitleConfirmationBubblePageType = preload( "res://ui/title_confirmation_bubble_page.gd" ) -const NetworkSessionType = preload("res://network/network_session.gd") -const SavedServerStoreType = preload("res://network/saved_server_store.gd") -const JoinGamePageType = preload("res://ui/network/join_game_page.gd") const DECORATIVE_FISH_TEXTURES: Array[Texture2D] = [ preload("res://fish/species/bass/fish_bass_striped.png"), preload("res://fish/species/bluegill/fish_bluegill.png"), @@ -87,10 +84,8 @@ const HOST_PRESENTATION_OUT_DURATION: float = 1.70 const HOST_PRESENTATION_IN_DURATION: float = 1.85 const HOST_CLUSTER_SAFE_MARGIN: float = 24.0 -signal new_game_requested -signal continue_game_requested +signal gameplay_requested signal quit_requested -signal join_game_requested(endpoint: String) enum ConfirmationAction { NONE, @@ -103,7 +98,6 @@ enum ConfirmationAction { @onready var _settings_button: BubbleButtonType = %SettingsButton @onready var _delete_button: BubbleButtonType = %DeleteSaveButton @onready var _quit_button: BubbleButtonType = %QuitButton -@onready var _join_game_button: BubbleButtonType = %JoinGameButton @onready var _new_game_label: Label = %NewGameLabel @onready var _delete_save_label: Label = %DeleteSaveLabel @onready var _feedback_label: Label = %FeedbackLabel @@ -135,7 +129,6 @@ enum ConfirmationAction { @onready var _bubble_field: BubbleClusterType = %BubbleField @onready var _start_prompt_center: CenterContainer = %StartPromptCenter @onready var _start_prompt_label: Label = %StartPromptLabel -@onready var _join_game_page: JoinGamePageType = %JoinGamePage var _save_manager: SaveManagerType var _settings_manager: SettingsManagerType @@ -195,7 +188,6 @@ func _ready() -> void: _on_continue_stats_focus_changed.bind(false) ) _new_game_button.pressed.connect(_on_new_game_pressed) - _join_game_button.pressed.connect(_open_join_game) _settings_button.pressed.connect(_open_settings) _delete_button.pressed.connect(_on_delete_pressed) %QuitButton.pressed.connect(_on_quit_pressed) @@ -229,14 +221,9 @@ func _ready() -> void: func setup( save_manager: SaveManagerType, settings_manager: SettingsManagerType, - network_session: NetworkSessionType, - saved_servers: SavedServerStoreType, ) -> void: _save_manager = save_manager _settings_manager = settings_manager - _join_game_page.setup(network_session, saved_servers, false) - _join_game_page.join_requested.connect(join_game_requested.emit) - _join_game_page.back_requested.connect(_close_join_game) Input.mouse_mode = Input.MOUSE_MODE_VISIBLE _refresh_save_inspection() show() @@ -252,45 +239,12 @@ func reopen() -> void: _prepare_awaiting_start_input() _reset_confirmation() _settings_panel.hide() - _join_game_page.close_page() _refresh_save_inspection() show() _start_decorative_presentation() _start_entry_prompt_animation() -func open_join_game_page(endpoint: String = "") -> void: - _cancel_title_entry_transition() - _awaiting_start_input = false - _start_prompt_center.hide() - _presentation_center.hide() - _settings_panel.hide() - _confirmation_page.hide_page() - _join_game_page.open_page(endpoint) - - -func report_network_error(message: String) -> void: - _join_game_page.set_status(message) - if not _join_game_page.visible: - _feedback_label.text = message - _feedback_label.show() - _feedback_label.modulate.a = 1.0 - - -func _open_join_game() -> void: - if _action_in_progress or _is_confirmation_active(): - return - open_join_game_page() - - -func _close_join_game() -> void: - _join_game_page.close_page() - _presentation_center.show() - _button_center.show() - _start_prompt_center.hide() - _focus_initial_button() - - func is_awaiting_start_input() -> bool: return _awaiting_start_input @@ -393,7 +347,6 @@ func _get_title_buttons() -> Array[BubbleButton]: return [ _continue_button, _new_game_button, - _join_game_button, _settings_button, _delete_button, _quit_button, @@ -485,11 +438,6 @@ func _process(delta: float) -> void: func _input(event: InputEvent) -> void: if not visible: return - if _join_game_page.visible: - if event.is_action_pressed("ui_cancel"): - _close_join_game() - get_viewport().set_input_as_handled() - return if ( _title_settings_transition_active or _title_entry_transition_active @@ -903,7 +851,12 @@ func _on_continue_pressed() -> void: return _hide_continue_stats_context() _action_in_progress = true - continue_game_requested.emit() + if _save_manager.load_player_data(): + _feedback_label.text = "save loaded." + gameplay_requested.emit() + else: + _refresh_save_inspection() + _feedback_label.text = "failed to load save. the original was preserved." _action_in_progress = false @@ -917,7 +870,8 @@ func _on_new_game_pressed() -> void: return _hide_continue_stats_context() if _inspection.status == SaveInspectionType.Status.MISSING: - new_game_requested.emit() + if _save_manager.initialize_new_game(): + gameplay_requested.emit() return if _inspection.status == SaveInspectionType.Status.UNSUPPORTED_VERSION: _feedback_label.text = ( @@ -963,14 +917,6 @@ func _on_confirmation_accepted() -> void: var action: ConfirmationAction = _confirmation_action _confirmation_page.lock_interaction() _action_in_progress = true - if action == ConfirmationAction.NEW_GAME: - _confirmation_action = ConfirmationAction.NONE - _confirmation_transition_generation += 1 - _cancel_confirmation_transition() - _confirmation_page.hide_page() - new_game_requested.emit() - _action_in_progress = false - return if not _save_manager.delete_progression_save(): _feedback_label.text = "failed to delete saved progression." _action_in_progress = false @@ -979,8 +925,15 @@ func _on_confirmation_accepted() -> void: return _save_manager.initialize_new_game() _refresh_save_inspection() - _feedback_label.text = "saved progression deleted." - _begin_confirmation_return() + if action == ConfirmationAction.NEW_GAME: + _confirmation_action = ConfirmationAction.NONE + _confirmation_transition_generation += 1 + _cancel_confirmation_transition() + _confirmation_page.hide_page() + gameplay_requested.emit() + else: + _feedback_label.text = "saved progression deleted." + _begin_confirmation_return() _action_in_progress = false diff --git a/ui/title_screen.tscn b/ui/title_screen.tscn index e591a0f..4f7e080 100644 --- a/ui/title_screen.tscn +++ b/ui/title_screen.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=14 format=3] +[gd_scene load_steps=13 format=3] [ext_resource type="Script" path="res://ui/title_screen.gd" id="1_script"] [ext_resource type="Theme" path="res://ui/game_theme.tres" id="2_theme"] @@ -10,7 +10,6 @@ [ext_resource type="Script" path="res://ui/components/bubble_menu/bubble_cluster.gd" id="8_bubble_cluster"] [ext_resource type="Resource" path="res://ui/components/bubble_menu/bubble_menu_profile.tres" id="9_bubble_profile"] [ext_resource type="PackedScene" path="res://ui/title_confirmation_bubble_page.tscn" id="10_confirmation_page"] -[ext_resource type="PackedScene" path="res://ui/network/join_game_page.tscn" id="11_join_page"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_title_water"] shader = ExtResource("4_water_shader") @@ -315,28 +314,6 @@ motion_period = 4.9 motion_phase = 2.5 deformation_period = 6.3 -[node name="JoinGameButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] -unique_name_in_owner = true -offset_left = 126.0 -offset_top = 224.0 -offset_right = 248.0 -offset_bottom = 342.0 -text = "join\ngame" -script = ExtResource("7_bubble_button") -profile = ExtResource("9_bubble_profile") -neutral_size = Vector2(122, 118) -desktop_anchor = Vector2(187, 268) -compact_anchor = Vector2(187, 268) -compact_minimum_size = Vector2(82, 80) -minimum_font_size = 15 -maximum_font_size = 22 -horizontal_amplitude = 1.7 -vertical_amplitude = 3.8 -motion_period = 5.2 -motion_phase = 3.1 -deformation_amplitude = 0.015 -deformation_period = 5.7 - [node name="DeleteSaveButton" type="Button" parent="ResponsiveTitleStage/TitlePresentationScaleRoot/Center/MainContent/ButtonCenter/BubbleLayoutSlot/BubbleMotionRoot/BubbleField"] unique_name_in_owner = true offset_left = -11.0 @@ -430,13 +407,3 @@ offset_right = 360.0 offset_bottom = 300.0 grow_horizontal = 2 grow_vertical = 2 - -[node name="JoinGamePage" parent="ResponsiveTitleStage/TitlePresentationScaleRoot" instance=ExtResource("11_join_page")] -unique_name_in_owner = true -z_index = 220 -layout_mode = 1 -anchors_preset = 15 -anchor_right = 1.0 -anchor_bottom = 1.0 -grow_horizontal = 2 -grow_vertical = 2 diff --git a/world/materials/starter_island_grass.tres b/world/materials/starter_island_grass.tres index f4ee32d..2c0ec07 100644 --- a/world/materials/starter_island_grass.tres +++ b/world/materials/starter_island_grass.tres @@ -1,6 +1,6 @@ [gd_resource type="StandardMaterial3D" load_steps=2 format=3] -[ext_resource type="Texture2D" path="res://art/exported/environment/textures/grass_lite.png" id="1_texture"] +[ext_resource type="Texture2D" path="res://art/exported/environment/textures/grass_olive_tile.png" id="1_texture"] [resource] resource_name = "Starter Island Grass" diff --git a/world/materials/starter_island_sand.tres b/world/materials/starter_island_sand.tres deleted file mode 100644 index 6c9be5a..0000000 --- a/world/materials/starter_island_sand.tres +++ /dev/null @@ -1,10 +0,0 @@ -[gd_resource type="StandardMaterial3D" load_steps=2 format=3] - -[ext_resource type="Texture2D" path="res://art/exported/environment/textures/sand.png" id="1_texture"] - -[resource] -resource_name = "Starter Island Sand" -texture_filter = 4 -albedo_texture = ExtResource("1_texture") -roughness = 1.0 -uv1_scale = Vector3(21.406, 21.406, 21.406) diff --git a/world/regions/starter_island_region.gd b/world/regions/starter_island_region.gd index 399c937..9e6529b 100644 --- a/world/regions/starter_island_region.gd +++ b/world/regions/starter_island_region.gd @@ -5,8 +5,6 @@ extends WorldRegion const FishingShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" ) -const GRASS_SURFACE_NAME: String = "grass_lite" -const SAND_SURFACE_NAME: String = "sand" @export_group("Owned Nodes") @export_node_path("MeshInstance3D") @@ -32,14 +30,9 @@ var pelican_landmark_path: NodePath = ( @export var grass_material: Material @export_range(0, 16, 1) var grass_surface_index: int = 0 -@export_group("Sand Surface") -@export var sand_material: Material -@export_range(0, 16, 1) var sand_surface_index: int = 2 - func _ready() -> void: _apply_grass_material() - _apply_sand_material() _build_terrain_collision() if Engine.is_editor_hint(): update_configuration_warnings() @@ -78,10 +71,7 @@ func _apply_grass_material() -> void: if grass_surface_index >= visual_mesh.mesh.get_surface_count(): push_error("Starter island grass surface index is invalid.") return - if ( - visual_mesh.mesh.surface_get_name(grass_surface_index) - != GRASS_SURFACE_NAME - ): + if visual_mesh.mesh.surface_get_name(grass_surface_index) != "grass": push_error("Starter island grass surface name does not match.") return visual_mesh.set_surface_override_material( @@ -90,31 +80,6 @@ func _apply_grass_material() -> void: ) -func _apply_sand_material() -> void: - var visual_mesh: MeshInstance3D = ( - get_node_or_null(visual_mesh_path) as MeshInstance3D - ) - if visual_mesh == null or visual_mesh.mesh == null: - push_error("Starter island visual mesh is unavailable.") - return - if sand_material == null: - push_error("Starter island sand material is unavailable.") - return - if sand_surface_index >= visual_mesh.mesh.get_surface_count(): - push_error("Starter island sand surface index is invalid.") - return - if ( - visual_mesh.mesh.surface_get_name(sand_surface_index) - != SAND_SURFACE_NAME - ): - push_error("Starter island sand surface name does not match.") - return - visual_mesh.set_surface_override_material( - sand_surface_index, - sand_material - ) - - func _build_terrain_collision() -> void: var visual_mesh: MeshInstance3D = ( get_node_or_null(visual_mesh_path) as MeshInstance3D @@ -144,23 +109,10 @@ func _get_configuration_warnings() -> PackedStringArray: warnings.append("Terrain/Visual must provide the island mesh.") elif grass_surface_index >= visual_mesh.mesh.get_surface_count(): warnings.append("Grass surface index is outside the terrain mesh.") - elif ( - visual_mesh.mesh.surface_get_name(grass_surface_index) - != GRASS_SURFACE_NAME - ): + elif visual_mesh.mesh.surface_get_name(grass_surface_index) != "grass": warnings.append("Grass surface index must identify the grass surface.") if grass_material == null: warnings.append("Assign the starter-island grass material.") - if visual_mesh != null and visual_mesh.mesh != null: - if sand_surface_index >= visual_mesh.mesh.get_surface_count(): - warnings.append("Sand surface index is outside the terrain mesh.") - elif ( - visual_mesh.mesh.surface_get_name(sand_surface_index) - != SAND_SURFACE_NAME - ): - warnings.append("Sand surface index must identify the sand surface.") - if sand_material == null: - warnings.append("Assign the starter-island sand material.") if get_node_or_null(terrain_collision_shape_path) == null: warnings.append("Terrain/Collision must provide a collision shape.") if get_node_or_null(player_spawn_path) == null: diff --git a/world/regions/starter_island_region.tscn b/world/regions/starter_island_region.tscn index a8833c4..0741c96 100644 --- a/world/regions/starter_island_region.tscn +++ b/world/regions/starter_island_region.tscn @@ -10,7 +10,6 @@ [ext_resource type="PackedScene" path="res://world/interactables/pelican_buyer_world.tscn" id="8_pelican"] [ext_resource type="Material" path="res://world/materials/starter_island_grass.tres" id="9_grass"] [ext_resource type="Script" uid="uid://dtcgnxl1kmdu1" path="res://world/water_body_authoring.gd" id="10_water_body"] -[ext_resource type="Material" path="res://world/materials/starter_island_sand.tres" id="11_sand"] [sub_resource type="ConcavePolygonShape3D" id="ConcavePolygonShape3D_4e4k5"] data = PackedVector3Array(10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 0, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 10.033899, 3.3913999, 0, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 10.033899, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 3.3446, 10.033899, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 10.033899, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 10.033899, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 3.3446, 6.6893, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 6.6893, 3.3913999, 3.3446, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 6.6893, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 6.6893, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 6.6893, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 0, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 3.3446, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 6.6893, 3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.3913999, 10.033899, 3.3446, 3.3913999, 10.033899, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.3446, 3.3913999, 10.033899, 6.6893, 3.3913999, 10.033899, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 6.6893, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.3446, 3.3913999, 13.3786, 6.6893, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, 3.9148, 3.3913999, 16.514599, 3.6399, 3.3913999, 16.2405, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6949, 3.3913999, 18.9914, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 19.798899, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -13.1096, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.7232, 3.3913999, -13.1096, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -13.3786, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 16.7232, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -10.033899, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -10.033899, 13.3786, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 13.3786, 3.3913999, -10.033899, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -16.459, 16.495699, 3.3913999, -13.42, 16.4543, 3.3913999, -13.3786, 12.738999, 3.3913999, -15.894899, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.4543, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 13.3786, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -16.7232, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -13.3786, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -13.3786, 10.033899, 3.3913999, -13.3786, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 10.033899, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -10.033899, 10.033899, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -13.3786, 6.6893, 3.3913999, -10.033899, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -16.7232, 6.6893, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 6.6893, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 4.4131, 3.2091, -13.357699, 3.3446, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 6.6893, 3.3913999, -10.033899, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -10.033899, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 6.6893, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, 0, 3.3913999, -3.3446, 0, 3.3913999, -6.6893, 3.3446, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -6.6893, 3.3446, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -6.6893, 0, 3.3913999, -3.3446, -2.9566998, 3.3913999, 0, -3.6378, 3.3913999, -2.0792, 0, 3.3913999, -3.3446, -3.6378, 3.3913999, -2.0792, -3.3446, 3.3913999, -6.6893, 0, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, -3.3446, 3.3913999, -6.6893, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, 0, 3.3913999, -3.3446, 0, 3.3913999, 0, 0, 3.3913999, 0, 0, 3.3913999, -3.3446, 3.3446, 3.3913999, -3.3446, -2.9566998, 3.3913999, 3.3446, -2.9566998, 3.3913999, 0, 0, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 0, 0, 3.3913999, 3.3446, -6.6893, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -3.3446, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -3.9101999, 3.3913999, -9.8592, -3.3446, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -3.7326, 0, 3.3913999, 3.3446, 0, 3.3913999, 0, 3.3446, 3.3913999, 0, 0, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 0, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 3.3446, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 3.3446, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, 0, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -3.3446, 6.6893, 3.3913999, -3.3446, 6.6893, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 6.6893, 3.3913999, -3.3446, 10.033899, 3.3913999, -6.6893, 10.033899, 3.3913999, -3.3446, -6.6893, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -9.8592, -6.6893, 3.3913999, -10.033899, -3.9101999, 3.3913999, -12.538199, -3.9101999, 3.3913999, -9.8592, -10.033899, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -10.033899, -6.6893, 3.3913999, -12.538199, -3.9101999, 3.3913999, -12.538199, -13.3786, 3.3913999, -3.7326, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -6.6893, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -10.033899, 3.3913999, -10.033899, -10.033899, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -19.7545, 3.3913999, -2.7851999, -16.7232, 3.3913999, -6.6893, -16.191599, 3.3913999, -3.0971, -19.7545, 3.3913999, -2.7851999, -19.280699, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -17.1112, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -16.191599, 3.3913999, -3.0971, -17.1112, 3.3913999, 0, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -20.0679, 3.3913999, 0, -17.1112, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 0, -17.1112, 3.3913999, 3.3044999, -13.3786, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -10.033899, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.033899, 3.3913999, -10.033899, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -10.033899, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -13.3786, 3.3913999, -13.3786, -10.699599, 3.3913999, -15.835, -10.699599, 3.3913999, -13.175799, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -15.835, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -6.6893, 3.175, -12.867, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 3.3446, -17.1112, 3.3913999, 3.3044999, -22.5541, 3.3913999, 9.2058, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 9.167399, -20.0679, 3.3913999, 6.6893, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.3913999, 6.6893, -20.0679, 3.3913999, 9.167399, -16.7232, 3.3913999, 6.6893, -16.285099, 3.3913999, 9.5865, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.7232, 3.3913999, 6.6893, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -13.1355, 3.3913999, 6.7549996, -16.7232, 3.3913999, 6.6893, -16.053999, 3.3913999, 9.8082, -13.1355, 3.3913999, 6.7549996, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -17.1112, 3.3913999, 3.3044999, -14.877199, 3.3913999, 4.6657, -14.877199, 3.3913999, 4.6657, -17.1112, 3.3913999, 3.3044999, -15.582299, 3.3913999, 4.0366, -13.1355, 3.3913999, 6.7549996, -14.877199, 3.3913999, 4.6657, -14.0948, 3.3913999, 5.5073, -13.3786, 3.3913999, 10.033899, -13.1355, 3.3913999, 6.7549996, -10.033899, 3.3913999, 7.0772, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.3913999, 7.0772, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -6.6893, 3.3913999, 10.033899, -10.033899, 3.0033998, 6.6893, -13.1355, 3.3913999, 6.7549996, -12.747499, 3.0033998, 6.3671, -10.033899, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -13.1355, 3.3913999, 6.7549996, -2.5674999, 2.4164, 7.6215, -6.6893, 3.3913999, 7.0772, -6.6893, 3.0033998, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1794999, 2.8042998, 8.009399, -6.6893, 3.3913999, 7.0772, -12.747499, 3.0033998, 6.3671, -14.0948, 3.3913999, 5.5073, -13.6942, 3.0033998, 5.1798, -12.747499, 3.0033998, 6.3671, -13.1355, 3.3913999, 6.7549996, -14.0948, 3.3913999, 5.5073, -6.6893, 3.0033998, 6.6893, -10.033899, 3.3913999, 7.0772, -10.033899, 3.0033998, 6.6893, -6.6893, 3.0033998, 6.6893, -6.6893, 3.3913999, 7.0772, -10.033899, 3.3913999, 7.0772, -16.7232, 3.0033998, 0, -16.191599, 3.3913999, -3.0971, -15.8036995, 3.0033998, -2.7091, -16.7232, 3.0033998, 0, -17.1112, 3.3913999, 0, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -15.8036995, 3.0033998, -2.7091, -16.191599, 3.3913999, -3.0971, -13.3786, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -15.8036995, 3.0033998, -2.7091, -2.9566998, 3.3913999, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -2.9566998, 3.3913999, 0, -3.3446, 3.0033998, 0, -4.0257998, 3.0033998, -1.6911999, -3.6378, 3.3913999, -2.0792, -6.6893, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -3.6378, 3.3913999, -2.0792, -4.0257998, 3.0033998, -1.6911999, -6.6893, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -13.3786, 3.0033998, -3.3446, -13.3786, 3.3913999, -3.7326, -10.033899, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -13.3786, 3.0033998, -3.3446, -6.6893, 3.3913999, -3.7326, -10.033899, 3.0033998, -3.3446, -10.033899, 3.3913999, -3.7326, -6.6893, 3.3913999, -3.7326, -6.6893, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 0, -16.7232, 3.0033998, 0, -16.7232, 3.0033998, 2.9166, -17.1112, 3.3913999, 3.3044999, -17.1112, 3.3913999, 0, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -15.372, 3.0033998, 3.6132998, -14.4892, 3.0033998, 4.2778, -14.877199, 3.3913999, 4.6657, -15.582299, 3.3913999, 4.0366, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 0, -2.9566998, 3.3913999, 0, -2.9566998, 3.3913999, 3.3446, -3.3446, 3.0033998, 3.3446, -3.3446, 3.0033998, 0, -2.1794999, 2.8042998, 8.009399, -2.1397, 3.0033998, 5.1795, -1.7832999, 3.3913999, 5.2162, -2.1794999, 2.8042998, 8.009399, -2.5674999, 2.4164, 7.6215, -2.1397, 3.0033998, 5.1795, -6.6893, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, -3.3446, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -6.6893, 3.3913999, 7.0772, -2.1794999, 2.8042998, 8.009399, -1.7832999, 3.3913999, 5.2162, 0, 3.3913999, 6.6893, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -1.7832999, 3.3913999, 5.2162, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 6.6893, -2.9566998, 3.3913999, 3.3446, 0, 3.3913999, 3.3446, -3.3446, 3.3913999, 10.033899, 0, 3.3913999, 6.6893, 0, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -2.1794999, 2.8042998, 8.009399, 0, 3.3913999, 6.6893, -2.1397, 3.0033998, 5.1795, -2.9566998, 3.3913999, 3.3446, -1.7832999, 3.3913999, 5.2162, -2.1397, 3.0033998, 5.1795, -3.3446, 3.0033998, 3.3446, -2.9566998, 3.3913999, 3.3446, -14.0948, 3.3913999, 5.5073, -14.4892, 3.0033998, 4.2778, -13.6942, 3.0033998, 5.1798, -14.0948, 3.3913999, 5.5073, -14.877199, 3.3913999, 4.6657, -14.4892, 3.0033998, 4.2778, -15.582299, 3.3913999, 4.0366, -16.7232, 3.0033998, 2.9166, -15.372, 3.0033998, 3.6132998, -15.582299, 3.3913999, 4.0366, -17.1112, 3.3913999, 3.3044999, -16.7232, 3.0033998, 2.9166, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 20.198, 3.1490998, -10.033899, 19.798899, 3.3913999, -10.033899, 19.798899, 3.3913999, -13.1096, 20.1539, 3.1299, -13.399799, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 20.1539, 3.1299, -13.399799, 19.798899, 3.3913999, -13.1096, 16.7232, 3.3913999, -13.1096, 16.756899, 3.1650999, -16.7286, 12.738999, 3.3913999, -15.894899, 12.7471, 3.1766999, -16.1988, 16.756899, 3.1650999, -16.7286, 16.495699, 3.3913999, -16.459, 12.738999, 3.3913999, -15.894899, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -16.459, 16.756899, 3.1650999, -16.7286, 16.8051, 3.1778, -13.479, 16.495699, 3.3913999, -13.42, 16.495699, 3.3913999, -16.459, 16.4543, 3.3913999, -13.3786, 16.8204, 3.138, -13.447599, 16.7232, 3.3913999, -13.1096, 16.8204, 3.138, -13.447599, 16.4543, 3.3913999, -13.3786, 16.495699, 3.3913999, -13.42, 16.8204, 3.138, -13.447599, 16.495699, 3.3913999, -13.42, 16.8051, 3.1778, -13.479, 10.033899, 3.0523999, -19.0294, 6.6893, 3.2782998, -18.727999, 6.6893, 3.0440998, -19.036999, 10.033899, 3.0523999, -19.0294, 10.033899, 3.2784998, -18.6997, 6.6893, 3.2782998, -18.727999, 12.723599, 2.9213, -19.2902, 10.033899, 3.2784998, -18.6997, 10.033899, 3.0523999, -19.0294, 12.723599, 2.9213, -19.2902, 12.446099, 3.1699998, -18.9401, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.446099, 3.1699998, -18.9401, 12.723599, 2.9213, -19.2902, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 10.033899, 3.2784998, -18.6997, 12.446099, 3.1699998, -18.9401, 10.033899, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 12.460899, 3.3913999, -16.1674, 10.033899, 3.3913999, -16.7232, 12.460899, 3.3913999, -16.1674, 12.460899, 3.3913999, -16.1674, 6.6893, 3.3913999, -16.7232, 10.033899, 3.2784998, -18.6997, 10.033899, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 6.6893, 3.2782998, -18.727999, 10.033899, 3.2784998, -18.6997, 12.738999, 3.3913999, -15.894899, 12.747, 3.1771, -16.1991, 12.7471, 3.1766999, -16.1988, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 12.747, 3.1771, -16.1991, 12.460899, 3.3913999, -16.1674, 12.738999, 3.3913999, -15.894899, 12.460899, 3.3913999, -16.1674, 3.8388, 3.3913999, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6443, 3.2897, -17.9799, 3.8388, 3.3913999, -16.7232, 3.5895, 3.2033, -16.7232, 4.4783998, 3.1067, -18.2665, 4.6821, 3.3913999, -13.3786, 3.5895, 3.2033, -16.7232, 3.8388, 3.3913999, -16.7232, 4.6821, 3.3913999, -13.3786, 4.4131, 3.2091, -13.357699, 3.5895, 3.2033, -16.7232, 6.6640997, 3.0702, -19.018099, 4.6443, 3.2897, -17.9799, 4.4783998, 3.1067, -18.2665, 6.6640997, 3.0702, -19.018099, 6.6705, 3.2772, -18.741, 4.6443, 3.2897, -17.9799, 4.6443, 3.2897, -17.9799, 6.6893, 3.3913999, -16.7232, 3.8388, 3.3913999, -16.7232, 6.6893, 3.3913999, -16.7232, 4.6443, 3.2897, -17.9799, 6.6705, 3.2772, -18.741, 6.6893, 3.3913999, -16.7232, 6.6705, 3.2772, -18.741, 6.6893, 3.2782998, -18.727999, 6.6893, 3.2782998, -18.727999, 6.6640997, 3.0702, -19.018099, 6.6893, 3.0440998, -19.036999, 6.6893, 3.2782998, -18.727999, 6.6705, 3.2772, -18.741, 6.6640997, 3.0702, -19.018099, 3.7529, 3.1712, -9.0494995, 0, 3.3913999, -8.7143, 0, 3.179, -9.0652, 3.7529, 3.1712, -9.0494995, 4.0225, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, 4.0225, 3.3913999, -8.7143, 4.4131, 3.2091, -13.357699, 4.6821, 3.3913999, -13.3786, 4.0225, 3.3913999, -8.7143, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, -3.6538, 3.1585999, -12.813399, -6.6893, 3.3913999, -12.538199, -6.6893, 3.175, -12.867, -3.6538, 3.1585999, -12.813399, -3.9101999, 3.3913999, -12.538199, -6.6893, 3.3913999, -12.538199, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -12.538199, -3.6538, 3.1585999, -12.813399, -3.6076, 3.1676, -10.0696, -3.9101999, 3.3913999, -9.8592, -3.9101999, 3.3913999, -12.538199, -0.0081, 3.1864998, -9.063499, -3.9101999, 3.3913999, -9.8592, -3.6076, 3.1676, -10.0696, -0.0081, 3.1864998, -9.063499, 0, 3.3913999, -8.7143, -3.9101999, 3.3913999, -9.8592, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, 0, 3.179, -9.0652, 0, 3.3913999, -8.7143, 0, 3.3913999, -8.7143, -0.0081, 3.1864998, -9.063499, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -10.4043, 3.1608999, -13.4295, -10.699599, 3.3913999, -13.175799, -10.699599, 3.3913999, -15.835, -10.4319, 3.1557999, -16.1556, -13.3786, 3.3913999, -15.4154, -13.3786, 3.1771998, -15.7625, -10.4319, 3.1557999, -16.1556, -10.699599, 3.3913999, -15.835, -13.3786, 3.3913999, -15.4154, -10.699599, 3.3913999, -13.175799, -6.6893, 3.175, -12.867, -6.6893, 3.3913999, -12.538199, -10.699599, 3.3913999, -13.175799, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -16.130499, 3.6227, -13.623799, -16.0243, 3.3509998, -15.752, -15.7941, 3.5591, -15.4641, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -15.7941, 3.5591, -15.4641, -16.0243, 3.3509998, -15.752, -13.3911, 3.1892, -15.757, -13.396, 3.3925, -15.4333, -15.7941, 3.5591, -15.4641, -15.7941, 3.5591, -15.4641, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -15.7941, 3.5591, -15.4641, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -13.3786, -13.396, 3.3925, -15.4333, -13.3786, 3.3913999, -15.4154, -13.3786, 3.3913999, -15.4154, -13.3911, 3.1892, -15.757, -13.3786, 3.1771998, -15.7625, -13.3786, 3.3913999, -15.4154, -13.396, 3.3925, -15.4333, -13.3911, 3.1892, -15.757, -16.3753, 3.4225, -13.6277, -16.1241, 3.3832998, -9.5097, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -13.3786, 3.3913999, -10.033899, -13.3786, 3.3913999, -6.6893, -16.7232, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -13.3786, 3.3913999, -13.3786, -13.3786, 3.3913999, -10.033899, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -13.3786, 3.3913999, -13.3786, -16.130499, 3.6227, -13.623799, -16.1241, 3.3832998, -9.5097, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -16.3753, 3.4225, -13.6277, -16.130499, 3.6227, -13.623799, -16.130499, 3.6227, -13.623799, -16.3753, 3.4225, -13.6277, -19.7545, 3.3913999, -2.7851999, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.515, 3.2122, -6.6893, -19.280699, 3.3913999, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.3965, 3.3909, -9.5092, -19.280699, 3.3913999, -6.6893, -19.515, 3.2122, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.280699, 3.3913999, -6.6893, -16.1241, 3.3832998, -9.5097, -16.7232, 3.3913999, -6.6893, -19.280699, 3.3913999, -6.6893, -19.3965, 3.3909, -9.5092, -16.1241, 3.3832998, -9.5097, -16.1241, 3.3832998, -9.5097, -19.6237, 3.1655998, -9.757899, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.1241, 3.3832998, -9.5097, -19.3965, 3.3909, -9.5092, -19.6237, 3.1655998, -9.757899, -19.3965, 3.3909, -9.5092, -19.6161, 3.2075999, -9.7116995, -22.8657, 3.4937, 3.3613, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -22.8657, 3.4937, 3.3613, -23.0809, 3.3083, 3.3615, -23.3676, 3.4459999, 0.1372, -23.170399, 3.6251, 0.122999996, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -23.170399, 3.6251, 0.122999996, -23.3676, 3.4459999, 0.1372, -23.390299, 3.3349998, -2.6938999, -23.192099, 3.5300999, -2.4668999, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -23.192099, 3.5300999, -2.4668999, -20.0679, 3.3913999, 0, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -19.9511, 3.3913999, -2.5834, -23.192099, 3.5300999, -2.4668999, -19.9511, 3.3913999, -2.5834, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 0, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.170399, 3.6251, 0.122999996, -20.0679, 3.3913999, 0, -19.7545, 3.3913999, -2.7851999, -19.9489, 3.2063, -2.8082, -19.9489, 3.2063, -2.8082, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -19.9489, 3.2063, -2.8082, -19.9511, 3.3913999, -2.5834, -19.7545, 3.3913999, -2.7851999, -19.9511, 3.3913999, -2.5834, -23.0777, 3.3197, 3.3734, -22.3151, 3.3913999, 6.6893, -22.563799, 3.2219, 6.6893, -23.0777, 3.3197, 3.3734, -22.8764, 3.4937, 3.3741, -22.3151, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -20.0679, 3.3913999, 6.6893, -22.3151, 3.3913999, 6.6893, -20.0679, 3.3913999, 6.6893, -22.8764, 3.4937, 3.3741, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 6.6893, -22.8657, 3.4937, 3.3613, -20.0679, 3.3913999, 3.3446, -22.8657, 3.4937, 3.3613, -23.0777, 3.3197, 3.3734, -23.0809, 3.3083, 3.3615, -22.8657, 3.4937, 3.3613, -22.8764, 3.4937, 3.3741, -23.0777, 3.3197, 3.3734, -16.285099, 3.3913999, 9.5865, -20.0679, 3.1943, 9.407499, -20.0679, 3.3913999, 9.167399, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -20.0679, 3.3913999, 9.167399, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -20.0679, 3.3913999, 9.167399, -22.5541, 3.3913999, 9.2058, -22.563799, 3.2219, 6.6893, -22.3151, 3.3913999, 6.6893, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -22.5541, 3.3913999, 9.2058, -22.791399, 3.2124999, 9.4432, -13.3786, 3.3922, 12.571899, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -16.076399, 3.04, 12.735, -15.847199, 3.2614, 12.4973, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -15.847199, 3.2614, 12.4973, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -13.3786, 3.3913999, 10.033899, -16.053999, 3.3913999, 9.8082, -15.847199, 3.2614, 12.4973, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.2818, 3.1913998, 9.8056, -16.2818, 3.1913998, 9.8056, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -16.2818, 3.1913998, 9.8056, -16.053999, 3.3913999, 9.8082, -16.285099, 3.3913999, 9.5865, -16.053999, 3.3913999, 9.8082, -5.9742, 3.3994, 12.8817, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -5.9742, 3.3994, 12.8817, -6.2748, 3.126, 13.122, -10.033899, 2.9384, 12.4537, -10.033899, 3.2142, 12.1061, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -10.033899, 3.2142, 12.1061, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -10.033899, 3.2142, 12.1061, -6.6893, 3.3913999, 10.033899, -5.9742, 3.3994, 12.8817, -10.033899, 3.2142, 12.1061, -10.033899, 3.3913999, 10.033899, -6.6893, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -10.033899, 3.3913999, 10.033899, -10.033899, 3.2142, 12.1061, -13.3786, 3.3922, 12.571899, -13.3786, 3.3913999, 10.033899, -10.033899, 3.3913999, 10.033899, -13.3786, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 10.033899, -3.3446, 3.3913999, 13.3786, -5.9742, 3.3994, 12.8817, -6.6893, 3.3913999, 10.033899, -3.3446, 3.3913999, 10.033899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, -13.3786, 3.194, 12.8089, -13.3786, 3.3922, 12.571899, -13.3786, 3.3922, 12.571899, -13.3786, 3.194, 12.8089, 3.6399, 3.3913999, 16.2405, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 0, 2.9636998, 16.0179, 0, 3.2243998, 15.7093, -3.3446, 3.1497998, 15.914599, -3.3446, 3.3913999, 15.6011, 0, 3.2243998, 15.7093, 0, 2.9636998, 16.0179, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -3.3446, 3.3913999, 15.6011, -3.3446, 3.1497998, 15.914599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 15.6011, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, -3.3446, 3.3913999, 15.6011, -3.3446, 3.3913999, 13.3786, 0, 3.3913999, 13.3786, 0, 3.2243998, 15.7093, 3.3446, 3.3913999, 13.3786, 3.6399, 3.3913999, 16.2405, 0, 3.2243998, 15.7093, 0, 3.3913999, 13.3786, 3.3446, 3.3913999, 13.3786, -5.9737997, 3.392, 16.087599, -3.3446, 3.3913999, 13.3786, -3.3446, 3.3913999, 15.6011, -5.9737997, 3.392, 16.087599, -5.9742, 3.3994, 12.8817, -3.3446, 3.3913999, 13.3786, -6.2748, 3.1260998, 16.4145, -5.9737997, 3.392, 16.087599, -6.2558, 3.1427999, 16.4098, -5.9737997, 3.392, 16.087599, -6.2748, 3.1260998, 16.4145, -6.2748, 3.126, 13.122, -5.9737997, 3.392, 16.087599, -6.2748, 3.126, 13.122, -5.9742, 3.3994, 12.8817, 6.6893, 3.3913999, 18.9861, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 6.6893, 3.2050998, 19.228699, 3.9266999, 3.5967, 19.6223, 4.1273, 3.7335, 19.3804, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 4.1273, 3.7335, 19.3804, 3.9266999, 3.5967, 19.6223, 3.6536, 3.2078998, 16.5669, 3.8651, 3.3981998, 16.5647, 6.6893, 3.3913999, 18.9861, 4.1273, 3.7335, 19.3804, 6.6893, 3.3913999, 18.9861, 3.8651, 3.3981998, 16.5647, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 18.9861, 3.9148, 3.3913999, 16.514599, 6.6893, 3.3913999, 16.7232, 3.9148, 3.3913999, 16.514599, 3.6425998, 3.1413999, 16.5127, 3.6399, 3.3913999, 16.2405, 3.6425998, 3.1413999, 16.5127, 3.9148, 3.3913999, 16.514599, 3.8651, 3.3981998, 16.5647, 3.6425998, 3.1413999, 16.5127, 3.8651, 3.3981998, 16.5647, 3.6536, 3.2078998, 16.5669, 9.3066, 3.2186, 19.0653, 10.3743, 3.3913999, 16.7232, 10.5913, 3.1985998, 16.7232, 9.3066, 3.2186, 19.0653, 9.1275, 3.3913999, 18.830599, 10.3743, 3.3913999, 16.7232, 9.1275, 3.3913999, 18.830599, 6.6991997, 3.2148, 19.2255, 6.6949, 3.3913999, 18.9914, 9.1275, 3.3913999, 18.830599, 9.3066, 3.2186, 19.0653, 6.6991997, 3.2148, 19.2255, 6.6893, 3.3913999, 18.9861, 6.6991997, 3.2148, 19.2255, 6.6893, 3.2050998, 19.228699, 6.6893, 3.3913999, 18.9861, 6.6949, 3.3913999, 18.9914, 6.6991997, 3.2148, 19.2255, 9.8131, 3.3546, 13.1979, 10.5893, 3.2117, 16.7106, 10.403999, 3.3911998, 16.6938, 9.8131, 3.3546, 13.1979, 10.0546, 3.1885, 13.4071, 10.5893, 3.2117, 16.7106, 6.6893, 3.3913999, 13.3786, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 16.7232, 10.3743, 3.3913999, 16.7232, 6.6893, 3.3913999, 13.3786, 9.8131, 3.3546, 13.1979, 10.3743, 3.3913999, 16.7232, 9.8131, 3.3546, 13.1979, 10.403999, 3.3911998, 16.6938, 6.6893, 3.3913999, 13.3786, 10.033899, 3.3913999, 10.033899, 9.8131, 3.3546, 13.1979, 6.6893, 3.3913999, 13.3786, 6.6893, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.3743, 3.3913999, 16.7232, 10.5893, 3.2117, 16.7106, 10.5913, 3.1985998, 16.7232, 10.3743, 3.3913999, 16.7232, 10.403999, 3.3911998, 16.6938, 10.5893, 3.2117, 16.7106, 13.1839, 3.2744, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 13.1839, 3.2744, 6.6893, 13.3786, 3.2744, 6.496, 13.5511, 3.1797, 6.6893, 12.9758, 3.2036, 10.033899, 13.1839, 3.2744, 6.6893, 13.4036, 3.0749998, 6.6893, 12.9758, 3.2036, 10.033899, 12.7325, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 13.2631, 3.5611, 13.4043, 12.7325, 3.3913999, 10.033899, 12.9758, 3.2036, 10.033899, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 13.1839, 3.2744, 6.6893, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 10.033899, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 9.8131, 3.3546, 13.1979, 12.7325, 3.3913999, 10.033899, 13.025499, 3.6999, 13.1985, 9.8131, 3.3546, 13.1979, 10.033899, 3.3913999, 10.033899, 12.7325, 3.3913999, 10.033899, 10.033899, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 6.6893, 13.1839, 3.2744, 6.6893, 10.033899, 3.3913999, 3.3446, 13.3786, 3.3913999, 3.3446, 13.1839, 3.2744, 6.6893, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 13.025499, 3.6999, 13.1985, 10.0546, 3.1885, 13.4071, 9.8131, 3.3546, 13.1979, 13.025499, 3.6999, 13.1985, 13.2631, 3.5611, 13.4043, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.025499, 3.6999, 13.1985, 14.0489, 3.0042, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.6027, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.0865998, 13.1206, 3.3028998, -3.3446, 16.7232, 3.1513, -3.602, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.1513, -3.602, 16.7127, 2.8734, -3.3446, 14.0489, 3.0042, -3.3446, 13.3786, 3.3028998, -3.6027, 16.7232, 3.3913999, -6.6893, 16.7232, 3.1513, -3.602, 13.3786, 3.3028998, -3.6027, 13.3786, 3.3913999, -6.6893, 16.7232, 3.3913999, -6.6893, 10.033899, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 10.033899, 3.3913999, -6.6893, 13.3786, 3.3913999, -6.6893, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, -6.6893, 13.3786, 3.3028998, -3.6027, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 20.961199, 0, -3.3446, 20.0679, 0, 3.3446, 14.0489, 3.0042, -3.3446, 20.0679, 0, 0, 14.0489, 3.0042, -3.3446, 13.3786, 3.3913999, 0, 13.3786, 3.3028998, -3.0865998, 14.0489, 3.0042, -3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 14.0489, 3.0042, -3.3446, 20.0679, 0, 3.3446, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 0, 13.3786, 3.2744, 6.496, 13.3786, 3.3913999, 3.3446, 13.3786, 3.2744, 6.496, 20.0679, 0, 3.3446, 16.7232, 1.5715, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, 0, 3.3446, 20.0679, -0.124199994, 6.6893, 13.3786, 3.2744, 6.496, 16.7232, 1.5715, 6.6893, 13.5511, 3.1797, 6.6893, 10.033899, 3.3913999, -3.3446, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, 0, 13.3786, 3.3913999, 0, 10.033899, 3.3913999, -3.3446, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3913999, 0, 13.1206, 3.3028998, -3.3446, 13.3786, 3.3028998, -3.0865998, 19.831999, 3.3902998, -10.0008, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 19.831999, 3.3902998, -10.0008, 20.1796, 3.182, -9.995999, 20.147, 3.0588999, -6.6893, 19.8322, 3.2891998, -6.6893, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 19.8322, 3.2891998, -6.6893, 20.147, 3.0588999, -6.6893, 20.1349, 2.7974, -3.3783998, 16.7232, 3.1513, -3.602, 19.8322, 3.2891998, -6.6893, 19.8322, 3.0491, -3.602, 16.7232, 3.1513, -3.602, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -6.6893, 19.8322, 3.2891998, -6.6893, 16.7232, 3.3913999, -10.033899, 19.798899, 3.3913999, -10.033899, 19.8322, 3.2891998, -6.6893, 19.798899, 3.3913999, -10.033899, 19.831999, 3.3902998, -10.0008, 20.198, 3.1490998, -10.033899, 19.831999, 3.3902998, -10.0008, 19.798899, 3.3913999, -10.033899, 20.198, 3.1490998, -10.033899, 20.1796, 3.182, -9.995999, 19.831999, 3.3902998, -10.0008, 20.144999, 2.7605999, -3.3446, 19.8322, 3.0491, -3.602, 20.1349, 2.7974, -3.3783998, 19.8322, 3.0491, -3.602, 20.144999, 2.7605999, -3.3446, 16.7127, 2.8734, -3.3446, 19.8322, 3.0491, -3.602, 16.7127, 2.8734, -3.3446, 16.7232, 3.1513, -3.602, 15.0508995, 0, 6.6893, 16.7232, 1.5715, 6.6893, 16.7232, 0, 6.6893, 16.7232, 0, 6.6893, 16.7232, 1.5715, 6.6893, 20.0679, -0.124199994, 6.6893, 15.0508995, 0, 6.6893, 13.5511, 3.1797, 6.6893, 16.7232, 1.5715, 6.6893, 15.0508995, 0, 6.6893, 13.4036, 3.0749998, 6.6893, 13.5511, 3.1797, 6.6893, 13.4036, 3.0749998, 6.6893, 15.0508995, 0, 6.6893, 13.8046, 0, 6.6893, -16.7232, 0.6137, 0, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -16.7232, 0.6137, 0, -13.3786, 0.6137, 0, -16.7232, 0.6137, 0, -15.8036995, 0.6137, -2.7091, -13.3786, 0.6137, -3.3446, -16.7232, 0.6137, 0, -13.3786, 0.6137, -3.3446, -13.3786, 0.6137, 0, -13.3786, 0.6137, 0, -13.3786, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -15.7546, 0.6137, 3.5372, -13.3786, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, -3.3446, -10.033899, 0.6137, 0, -14.4892, 0.6137, 4.2778, -13.3786, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, 0, -10.033899, 0.6137, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, -3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 0, -6.6893, 0.6137, -3.3446, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 0, -6.6893, 0.6137, 0, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 0, -3.3446, 0.6137, 0, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 0, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 0, -3.3446, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -14.4892, 0.6137, 4.2778, -10.033899, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -10.033899, 0.6137, 3.3446, -6.6893, 0.6137, 3.3446, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 3.3446, -6.6893, 0.6137, 6.6893, -10.033899, 0.6137, 6.6893, -13.677099, 0.6137, 5.2616, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -10.033899, 0.6137, 6.6893, -12.747499, 0.6137, 6.3671, -6.6893, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -6.6893, 0.6137, 3.3446, -3.3446, 0.6137, 3.3446, -2.5674999, 0.0266, 7.6215, -3.3446, 0.6137, 3.3446, -2.1193, 0.6137, 5.2736998, -16.7232, 3.0033998, 2.9166, -15.7546, 0.6137, 3.5372, -15.372, 3.0033998, 3.6132998, -16.7232, 3.0033998, 2.9166, -16.7232, 0.6137, 2.9166, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -13.677099, 0.6137, 5.2616, -13.6942, 3.0033998, 5.1798, -14.4892, 3.0033998, 4.2778, -14.4892, 0.6137, 4.2778, -13.677099, 0.6137, 5.2616, -15.8036995, 3.0033998, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -15.8036995, 3.0033998, -2.7091, -15.8036995, 0.6137, -2.7091, -16.7232, 0.6137, 0, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 2.9166, -16.7232, 3.0033998, 2.9166, -16.7232, 3.0033998, 0, -16.7232, 0.6137, 0, -16.7232, 0.6137, 2.9166, -3.3446, 3.0033998, 0, -4.0257998, 0.6137, -1.6911999, -4.0257998, 3.0033998, -1.6911999, -3.3446, 3.0033998, 0, -3.3446, 0.6137, 0, -4.0257998, 0.6137, -1.6911999, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 0, -3.3446, 3.0033998, 0, -3.3446, 3.0033998, 3.3446, -3.3446, 0.6137, 3.3446, -3.3446, 0.6137, 0, -12.747499, 3.0033998, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, 6.6893, -12.747499, 3.0033998, 6.3671, -12.747499, 0.6137, 6.3671, -10.033899, 0.6137, 6.6893, -10.033899, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -10.033899, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -10.033899, 0.6137, -3.3446, -10.033899, 3.0033998, -3.3446, -6.6893, 3.0033998, -3.3446, -6.6893, 0.6137, -3.3446, -10.033899, 0.6137, -3.3446, -13.3786, 3.0033998, -3.3446, -15.8036995, 0.6137, -2.7091, -15.8036995, 3.0033998, -2.7091, -13.3786, 3.0033998, -3.3446, -13.3786, 0.6137, -3.3446, -15.8036995, 0.6137, -2.7091, -4.0257998, 3.0033998, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, -3.3446, -4.0257998, 3.0033998, -1.6911999, -4.0257998, 0.6137, -1.6911999, -6.6893, 0.6137, -3.3446, -6.6893, 3.0033998, 6.6893, -2.5674999, 0.0266, 7.6215, -2.5674999, 2.4164, 7.6215, -6.6893, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 0.0266, 7.6215, -10.033899, 3.0033998, 6.6893, -6.6893, 0.6137, 6.6893, -6.6893, 3.0033998, 6.6893, -10.033899, 3.0033998, 6.6893, -10.033899, 0.6137, 6.6893, -6.6893, 0.6137, 6.6893, -2.5674999, 2.4164, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1397, 3.0033998, 5.1795, -2.5674999, 2.4164, 7.6215, -2.5674999, 0.0266, 7.6215, -2.1193, 0.6137, 5.2736998, -2.1193, 0.6137, 5.2736998, -3.3446, 3.0033998, 3.3446, -2.1397, 3.0033998, 5.1795, -2.1193, 0.6137, 5.2736998, -3.3446, 0.6137, 3.3446, -3.3446, 3.0033998, 3.3446, -13.677099, 0.6137, 5.2616, -12.747499, 3.0033998, 6.3671, -13.6942, 3.0033998, 5.1798, -13.677099, 0.6137, 5.2616, -12.747499, 0.6137, 6.3671, -12.747499, 3.0033998, 6.3671, -15.7546, 0.6137, 3.5372, -14.4892, 3.0033998, 4.2778, -15.372, 3.0033998, 3.6132998, -15.7546, 0.6137, 3.5372, -14.4892, 0.6137, 4.2778, -14.4892, 3.0033998, 4.2778, 21.1831, 0, -13.6544, 16.8204, 3.138, -13.447599, 18.0241, 0, -14.3019, 21.1831, 0, -13.6544, 20.1539, 3.1299, -13.399799, 16.8204, 3.138, -13.447599, 21.8888, 0, -10.033899, 20.1539, 3.1299, -13.399799, 21.1831, 0, -13.6544, 21.8888, 0, -10.033899, 20.198, 3.1490998, -10.033899, 20.1539, 3.1299, -13.399799, 17.2285, 0, -16.8036, 12.7471, 3.1766999, -16.1988, 13.7014, 0, -17.416399, 17.2285, 0, -16.8036, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 16.8204, 3.138, -13.447599, 17.2285, 0, -16.8036, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 16.8204, 3.138, -13.447599, 16.8051, 3.1778, -13.479, 17.2285, 0, -16.8036, 16.8051, 3.1778, -13.479, 16.756899, 3.1650999, -16.7286, 12.7471, 3.1766999, -16.1988, 13.3786, 0, -20.5992, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 12.7471, 3.1766999, -16.1988, 12.747, 3.1771, -16.1991, 13.3786, 0, -20.5992, 12.747, 3.1771, -16.1991, 12.723599, 2.9213, -19.2902, 13.3786, 0, -20.5992, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 13.3786, 0, -20.5992, 12.723599, 2.9213, -19.2902, 10.033899, 3.0523999, -19.0294, 10.033899, 0, -20.467, 6.6893, 3.0440998, -19.036999, 6.6893, 0, -20.1318, 10.033899, 0, -20.467, 10.033899, 3.0523999, -19.0294, 6.6893, 3.0440998, -19.036999, 3.0140998, 0, -16.7232, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 3.0140998, 0, -16.7232, 3.5895, 3.2033, -16.7232, 4.4131, 3.2091, -13.357699, 6.6893, 3.0440998, -19.036999, 3.3446, 0, -20.5992, 6.6893, 0, -20.1318, 3.3446, 0, -20.5992, 6.6893, 3.0440998, -19.036999, 6.6640997, 3.0702, -19.018099, 3.3446, 0, -20.5992, 6.6640997, 3.0702, -19.018099, 4.4783998, 3.1067, -18.2665, 3.3446, 0, -20.5992, 3.5895, 3.2033, -16.7232, 3.0140998, 0, -16.7232, 3.3446, 0, -20.5992, 4.4783998, 3.1067, -18.2665, 3.5895, 3.2033, -16.7232, 2.8241, 0, -10.4594, 0, 3.179, -9.0652, 0, 0, -10.7654, 2.8241, 0, -10.4594, 3.7529, 3.1712, -9.0494995, 0, 3.179, -9.0652, 3.3446, -0.3989, -12.9443, 3.7529, 3.1712, -9.0494995, 2.8241, 0, -10.4594, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, 3.7529, 3.1712, -9.0494995, 4.4131, 3.2091, -13.357699, 3.3446, -0.3989, -12.9443, 4.4131, 3.2091, -13.357699, -2.6297, 0, -10.5745, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -2.6297, 0, -10.5745, -3.6076, 3.1676, -10.0696, -3.6538, 3.1585999, -12.813399, -3.3446, 0, -13.3786, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -3.3446, 0, -13.3786, -3.6538, 3.1585999, -12.813399, -6.6893, 3.175, -12.867, 0, 3.179, -9.0652, -2.6297, 0, -10.5745, 0, 0, -10.7654, -2.6297, 0, -10.5745, 0, 3.179, -9.0652, -0.0081, 3.1864998, -9.063499, -2.6297, 0, -10.5745, -0.0081, 3.1864998, -9.063499, -3.6076, 3.1676, -10.0696, -6.6893, 0, -14.2637, -10.4043, 3.1608999, -13.4295, -9.6168995, 0, -14.127899, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -10.4043, 3.1608999, -13.4295, -6.6893, 3.175, -12.867, -6.6893, 0, -14.2637, -6.6893, 3.175, -12.867, -9.6168995, 0, -14.127899, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -9.6168995, 0, -14.127899, -10.4043, 3.1608999, -13.4295, -10.4319, 3.1557999, -16.1556, -10.033899, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3786, 0, -17.3364, -10.033899, 0, -16.7232, -10.4319, 3.1557999, -16.1556, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.7232, 0, -16.7232, -16.0243, 3.3509998, -15.752, -16.3753, 3.4225, -13.6277, -13.3786, 3.1771998, -15.7625, -16.7232, 0, -16.7232, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -13.3786, 3.1771998, -15.7625, -13.3911, 3.1892, -15.757, -16.7232, 0, -16.7232, -13.3911, 3.1892, -15.757, -16.0243, 3.3509998, -15.752, -17.275, 0, -10.5169, -19.6237, 3.1655998, -9.757899, -20.0679, 0, -10.033899, -17.275, 0, -10.5169, -16.4131, 3.1706, -9.788899, -19.6237, 3.1655998, -9.757899, -16.7232, 0, -13.3786, -16.4131, 3.1706, -9.788899, -17.275, 0, -10.5169, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -16.4131, 3.1706, -9.788899, -16.3753, 3.4225, -13.6277, -16.7232, 0, -13.3786, -16.3753, 3.4225, -13.6277, -20.3764, 0, -6.6893, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -20.3764, 0, -6.6893, -19.515, 3.2122, -6.6893, -19.9489, 3.2063, -2.8082, -19.6237, 3.1655998, -9.757899, -20.3764, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -19.6237, 3.1655998, -9.757899, -19.6161, 3.2075999, -9.7116995, -20.3764, 0, -6.6893, -19.6161, 3.2075999, -9.7116995, -19.515, 3.2122, -6.6893, -23.412498, -0.2913, 0.26119998, -23.0809, 3.3083, 3.3615, -23.412498, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.3676, 3.4459999, 0.1372, -23.0809, 3.3083, 3.3615, -23.412498, 0, -3.3446, -23.3676, 3.4459999, 0.1372, -23.412498, -0.2913, 0.26119998, -23.412498, 0, -3.3446, -23.390299, 3.3349998, -2.6938999, -23.3676, 3.4459999, 0.1372, -20.0679, -0.3484, -3.5669, -23.390299, 3.3349998, -2.6938999, -23.412498, 0, -3.3446, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.390299, 3.3349998, -2.6938999, -19.9489, 3.2063, -2.8082, -20.0679, -0.3484, -3.5669, -19.9489, 3.2063, -2.8082, -23.0809, 3.3083, 3.3615, -23.8078, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -23.0809, 3.3083, 3.3615, -23.0777, 3.3197, 3.3734, -23.8078, 0, 6.6893, -23.0777, 3.3197, 3.3734, -22.563799, 3.2219, 6.6893, -23.8078, 0, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -23.8078, 0, 6.6893, -22.563799, 3.2219, 6.6893, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -20.0679, 3.1943, 9.407499, -20.0679, 0, 10.033899, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 3.1943, 9.407499, -22.791399, 3.2124999, 9.4432, -23.412498, 0, 10.033899, -22.791399, 3.2124999, 9.4432, -20.0679, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -20.0679, 0, 10.033899, -20.0679, 3.1943, 9.407499, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 13.3786, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -16.7232, 0, 13.3786, -16.076399, 3.04, 12.735, -13.3786, 3.194, 12.8089, -16.7232, 0, 10.033899, -16.076399, 3.04, 12.735, -16.7232, 0, 13.3786, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -16.076399, 3.04, 12.735, -16.2818, 3.1913998, 9.8056, -16.7232, 0, 10.033899, -16.2818, 3.1913998, 9.8056, -13.3786, 0, 13.3786, -10.033899, 2.9384, 12.4537, -10.033899, 0, 13.3786, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 2.9384, 12.4537, -13.3786, 3.194, 12.8089, -13.3786, 0, 13.3786, -13.3786, 3.194, 12.8089, -10.033899, 0, 13.3786, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -10.033899, 0, 13.3786, -10.033899, 2.9384, 12.4537, -6.2748, 3.126, 13.122, -6.6893, 0, 13.3786, -6.2748, 3.1260998, 16.4145, -6.6893, 0, 16.7232, -6.6893, 0, 13.3786, -6.2748, 3.126, 13.122, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, 0, 2.9636998, 16.0179, 0, 0, 16.7232, -3.3446, 0, 16.7232, -3.3446, 3.1497998, 15.914599, 0, 2.9636998, 16.0179, 0, 0, 16.7232, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 16.7232, 0, 0, 16.7232, 0, 2.9636998, 16.0179, 3.6425998, 3.1413999, 16.5127, -6.2748, 3.1260998, 16.4145, -3.3446, 0, 16.7232, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -6.2748, 3.1260998, 16.4145, -6.2558, 3.1427999, 16.4098, -3.3446, 0, 16.7232, -6.2558, 3.1427999, 16.4098, -3.3446, 3.1497998, 15.914599, 3.3446, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6893, 0, 20.0679, 3.3446, 0, 20.0679, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 3.6425998, 3.1413999, 16.5127, 3.3446, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 3.6425998, 3.1413999, 16.5127, 3.6536, 3.2078998, 16.5669, 3.3446, 0, 20.0679, 3.6536, 3.2078998, 16.5669, 3.9266999, 3.5967, 19.6223, 6.6893, 3.2050998, 19.228699, 10.572599, 0, 20.0679, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 6.6893, 3.2050998, 19.228699, 6.6991997, 3.2148, 19.2255, 10.572599, 0, 20.0679, 6.6991997, 3.2148, 19.2255, 9.3066, 3.2186, 19.0653, 10.572599, 0, 20.0679, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 20.0679, 9.3066, 3.2186, 19.0653, 10.5913, 3.1985998, 16.7232, 10.5913, 3.1985998, 16.7232, 10.572599, 0, 13.918799, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 10.5913, 3.1985998, 16.7232, 10.5893, 3.2117, 16.7106, 10.572599, 0, 13.918799, 10.5893, 3.2117, 16.7106, 10.0546, 3.1885, 13.4071, 10.572599, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 10.572599, 0, 13.918799, 10.0546, 3.1885, 13.4071, 13.2631, 3.5611, 13.4043, 13.8046, 0, 13.918799, 12.9758, 3.2036, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 12.9758, 3.2036, 10.033899, 13.8046, 0, 13.918799, 13.2631, 3.5611, 13.4043, 13.2631, 3.5611, 13.4043, 13.8046, 0, 10.033899, 13.4036, 3.0749998, 6.6893, 13.8046, 0, 6.6893, 13.8046, 0, 10.033899, 12.9758, 3.2036, 10.033899, 13.4036, 3.0749998, 6.6893, 20.961199, 0, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 20.961199, 0, -3.3446, 14.0489, 3.0042, -3.3446, 16.7127, 2.8734, -3.3446, 20.144999, 2.7605999, -3.3446, 21.2349, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 20.144999, 2.7605999, -3.3446, 20.1349, 2.7974, -3.3783998, 21.2349, 0, -6.6893, 20.1349, 2.7974, -3.3783998, 20.147, 3.0588999, -6.6893, 20.147, 3.0588999, -6.6893, 21.8888, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 20.147, 3.0588999, -6.6893, 20.1796, 3.182, -9.995999, 21.8888, 0, -10.033899, 20.1796, 3.182, -9.995999, 20.198, 3.1490998, -10.033899, 23.412498, 0, -26.7572, 26.7572, -0.2593, -23.412498, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 23.412498, 0, -26.7572, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -25.084799, 23.412498, 0, -26.7572, 26.7572, -0.2593, -26.7572, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -23.412498, 26.7572, -0.2593, -21.7402, 23.412498, 0, -23.412498, 26.7572, -0.2593, -20.0679, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -20.0679, 26.7572, -0.2593, -18.3955, 23.412498, 0, -20.0679, 26.7572, -0.2593, -16.7232, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -16.7232, 26.7572, -0.2593, -15.0508995, 23.412498, 0, -16.7232, 26.7572, -0.2593, -13.3786, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -13.3786, 26.7572, -0.2593, -11.7063, 23.412498, 0, -13.3786, 26.7572, -0.2593, -10.033899, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -10.033899, 26.7572, -0.2593, -8.3616, 23.412498, 0, -10.033899, 26.7572, -0.2593, -6.6893, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -6.6893, 26.7572, -0.2593, -5.0169997, 23.412498, 0, -6.6893, 26.7572, -0.2593, -3.3446, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, -3.3446, 26.7572, -0.2593, -1.6723, 23.412498, 0, -3.3446, 26.7572, -0.2593, 0, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 0, 26.7572, -0.2593, 1.6723, 23.412498, 0, 0, 26.7572, -0.2593, 3.3446, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 3.3446, 26.7572, -0.2593, 5.0169997, 23.412498, 0, 3.3446, 26.7572, -0.2593, 6.6893, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 6.6893, 26.7572, -0.2593, 8.3616, 23.412498, 0, 6.6893, 26.7572, -0.2593, 10.033899, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 10.033899, 26.7572, -0.2593, 11.7063, 23.412498, 0, 10.033899, 26.7572, -0.2593, 13.3786, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 13.3786, 26.7572, -0.2593, 15.0508995, 23.412498, 0, 13.3786, 26.7572, -0.2593, 16.7232, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 16.7232, 26.7572, -0.2593, 18.3955, 23.412498, 0, 16.7232, 26.7572, -0.2593, 20.0679, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 20.0679, 26.7572, -0.2593, 21.7402, 23.412498, 0, 20.0679, 26.7572, -0.2593, 23.412498, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 23.412498, 26.7572, -0.2593, 25.084799, 23.412498, 0, 23.412498, 26.7572, -0.2593, 26.7572, 23.412498, 0, 26.7572, -3.3446, 0, -23.412498, 0, 0, -26.7572, 0, 0, -23.412498, 0, 0, -23.412498, 0, 0, -26.7572, 3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -3.3446, 0, -26.7572, 0, 0, -26.7572, 0, 0, -23.412498, 3.3446, 0, -26.7572, 3.3446, 0, -23.412498, 3.3446, 0, -23.412498, 3.3446, 0, -26.7572, 6.6893, 0, -26.7572, -3.3446, 0, -20.0679, -3.3446, 0, -23.412498, 0, 0, -23.412498, 3.3446, 0, -23.412498, 6.6893, 0, -26.7572, 6.6893, 0, -23.412498, 6.6893, 0, -23.412498, 6.6893, 0, -26.7572, 10.033899, 0, -26.7572, 0, 0, -20.0679, 0, 0, -23.412498, 3.3446, 0, -23.412498, -3.3446, 0, -20.0679, 0, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -20.5992, 3.3446, 0, -23.412498, 6.6893, 0, -23.412498, 0, 0, -20.0679, 3.3446, 0, -23.412498, 3.3446, 0, -20.5992, 3.3446, 0, -20.5992, 6.6893, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -26.7572, 10.033899, 0, -23.412498, 6.6893, 0, -20.1318, 6.6893, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -23.412498, 10.033899, 0, -26.7572, 13.3786, 0, -26.7572, 6.6893, 0, -20.1318, 10.033899, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -26.7572, 13.3786, 0, -23.412498, 10.033899, 0, -20.467, 10.033899, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -23.412498, 13.3786, 0, -26.7572, 16.7232, 0, -26.7572, 10.033899, 0, -20.467, 13.3786, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -26.7572, 16.7232, 0, -23.412498, 13.3786, 0, -20.5992, 13.3786, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -23.412498, 16.7232, 0, -26.7572, 20.0679, 0, -26.7572, 13.3786, 0, -20.5992, 16.7232, 0, -23.412498, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 13.3786, 0, -20.5992, 16.7232, 0, -20.0679, 13.7014, 0, -17.416399, 16.7232, 0, -20.0679, 17.2285, 0, -16.8036, 16.7232, 0, -23.412498, 20.0679, 0, -26.7572, 20.0679, 0, -23.412498, 16.7232, 0, -20.0679, 16.7232, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -23.412498, 20.0679, 0, -26.7572, 23.412498, 0, -26.7572, 20.0679, 0, -23.412498, 23.412498, 0, -26.7572, 23.412498, 0, -23.412498, 16.7232, 0, -20.0679, 20.0679, 0, -23.412498, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -23.412498, 23.412498, 0, -23.412498, 17.2285, 0, -16.8036, 16.7232, 0, -20.0679, 20.0679, 0, -20.0679, 20.0679, 0, -20.0679, 23.412498, 0, -23.412498, 23.412498, 0, -20.0679, 17.2285, 0, -16.8036, 20.0679, 0, -20.0679, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 20.0679, 0, -20.0679, 23.412498, 0, -20.0679, 18.0241, 0, -14.3019, 17.2285, 0, -16.8036, 20.0679, 0, -16.7232, 20.0679, 0, -16.7232, 23.412498, 0, -20.0679, 23.412498, 0, -16.7232, 18.0241, 0, -14.3019, 20.0679, 0, -16.7232, 21.1831, 0, -13.6544, 21.1831, 0, -13.6544, 20.0679, 0, -16.7232, 23.412498, 0, -16.7232, 21.1831, 0, -13.6544, 23.412498, 0, -16.7232, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 21.1831, 0, -13.6544, 23.412498, 0, -13.3786, 21.8888, 0, -10.033899, 23.412498, 0, -13.3786, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 21.8888, 0, -10.033899, 23.412498, 0, -10.033899, 21.2349, 0, -6.6893, 23.412498, 0, -10.033899, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 21.2349, 0, -6.6893, 23.412498, 0, -6.6893, 20.961199, 0, -3.3446, 23.412498, 0, -6.6893, 23.412498, 0, -3.3446, 20.0679, 0, 0, 20.961199, 0, -3.3446, 23.412498, 0, -3.3446, 20.0679, 0, 0, 23.412498, 0, -3.3446, 23.412498, 0, 0, 20.0679, 0, 3.3446, 20.0679, 0, 0, 23.412498, 0, 0, 20.0679, 0, 3.3446, 23.412498, 0, 0, 23.412498, 0, 3.3446, 10.572599, 0, 16.7232, 13.8046, 0, 13.918799, 13.3786, 0, 16.7232, 10.572599, 0, 16.7232, 10.572599, 0, 13.918799, 13.8046, 0, 13.918799, 10.572599, 0, 20.0679, 10.572599, 0, 16.7232, 13.3786, 0, 16.7232, 13.3786, 0, 16.7232, 13.8046, 0, 13.918799, 15.0508995, 0, 13.3786, 10.572599, 0, 20.0679, 13.3786, 0, 16.7232, 13.3786, 0, 20.0679, 13.8046, 0, 13.918799, 15.0508995, 0, 10.033899, 15.0508995, 0, 13.3786, 13.8046, 0, 13.918799, 13.8046, 0, 10.033899, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 13.8046, 0, 10.033899, 13.8046, 0, 6.6893, 15.0508995, 0, 6.6893, 15.0508995, 0, 10.033899, 15.0508995, 0, 6.6893, 16.7232, 0, 6.6893, 15.0508995, 0, 10.033899, 16.7232, 0, 6.6893, 16.7232, 0, 10.033899, 15.0508995, 0, 13.3786, 15.0508995, 0, 10.033899, 16.7232, 0, 10.033899, 13.3786, 0, 16.7232, 15.0508995, 0, 13.3786, 15.0508995, 0, 16.7232, 13.3786, 0, 20.0679, 13.3786, 0, 16.7232, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 10.033899, 16.7232, 0, 13.3786, 15.0508995, 0, 16.7232, 15.0508995, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 13.3786, 16.7232, 0, 10.033899, 20.0679, 0, 10.033899, 16.7232, 0, 13.3786, 20.0679, 0, 10.033899, 20.0679, 0, 13.3786, 20.0679, 0, 13.3786, 20.0679, 0, 10.033899, 23.412498, 0, 10.033899, 20.0679, 0, 13.3786, 23.412498, 0, 10.033899, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 16.7232, 0, 13.3786, 20.0679, 0, 13.3786, 15.0508995, 0, 16.7232, 16.7232, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 20.0679, 0, 13.3786, 23.412498, 0, 13.3786, 16.7232, 0, 16.7232, 20.0679, 0, 13.3786, 20.0679, 0, 16.7232, 20.0679, 0, 16.7232, 23.412498, 0, 13.3786, 23.412498, 0, 16.7232, 15.0508995, 0, 20.0679, 15.0508995, 0, 16.7232, 16.7232, 0, 16.7232, 13.3786, 0, 20.0679, 15.0508995, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 16.7232, 0, 16.7232, 20.0679, 0, 16.7232, 15.0508995, 0, 20.0679, 16.7232, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 20.0679, 0, 16.7232, 23.412498, 0, 16.7232, 16.7232, 0, 20.0679, 20.0679, 0, 16.7232, 20.0679, 0, 20.0679, 20.0679, 0, 20.0679, 23.412498, 0, 16.7232, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 20.0679, 0, 20.0679, 23.412498, 0, 20.0679, 20.0679, 0, 23.412498, 23.412498, 0, 20.0679, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 20.0679, 0, 23.412498, 23.412498, 0, 23.412498, 20.0679, 0, 26.7572, 23.412498, 0, 23.412498, 23.412498, 0, 26.7572, 16.7232, 0, 26.7572, 20.0679, 0, 23.412498, 20.0679, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 20.0679, 20.0679, 0, 23.412498, 16.7232, 0, 26.7572, 16.7232, 0, 23.412498, 20.0679, 0, 23.412498, 16.7232, 0, 23.412498, 16.7232, 0, 20.0679, 20.0679, 0, 20.0679, 15.0508995, 0, 26.7572, 16.7232, 0, 23.412498, 16.7232, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 20.0679, 16.7232, 0, 23.412498, 15.0508995, 0, 26.7572, 15.0508995, 0, 23.412498, 16.7232, 0, 23.412498, 15.0508995, 0, 23.412498, 15.0508995, 0, 20.0679, 16.7232, 0, 20.0679, 13.3786, 0, 26.7572, 15.0508995, 0, 23.412498, 15.0508995, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 20.0679, 15.0508995, 0, 23.412498, 13.3786, 0, 26.7572, 13.3786, 0, 23.412498, 15.0508995, 0, 23.412498, 13.3786, 0, 23.412498, 13.3786, 0, 20.0679, 15.0508995, 0, 20.0679, 10.033899, 0, 26.7572, 13.3786, 0, 23.412498, 13.3786, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 20.0679, 13.3786, 0, 23.412498, 10.033899, 0, 26.7572, 10.033899, 0, 23.412498, 13.3786, 0, 23.412498, 10.033899, 0, 23.412498, 10.572599, 0, 20.0679, 13.3786, 0, 20.0679, 6.6893, 0, 26.7572, 10.033899, 0, 23.412498, 10.033899, 0, 26.7572, 6.6893, 0, 23.412498, 10.572599, 0, 20.0679, 10.033899, 0, 23.412498, 6.6893, 0, 26.7572, 6.6893, 0, 23.412498, 10.033899, 0, 23.412498, 6.6893, 0, 23.412498, 6.6893, 0, 20.0679, 10.572599, 0, 20.0679, 3.3446, 0, 26.7572, 6.6893, 0, 23.412498, 6.6893, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 20.0679, 6.6893, 0, 23.412498, 3.3446, 0, 26.7572, 3.3446, 0, 23.412498, 6.6893, 0, 23.412498, 3.3446, 0, 23.412498, 3.3446, 0, 20.0679, 6.6893, 0, 20.0679, 0, 0, 26.7572, 3.3446, 0, 23.412498, 3.3446, 0, 26.7572, 0, 0, 26.7572, 0, 0, 23.412498, 3.3446, 0, 23.412498, 0, 0, 23.412498, 3.3446, 0, 20.0679, 3.3446, 0, 23.412498, -3.3446, 0, 26.7572, 0, 0, 23.412498, 0, 0, 26.7572, 0, 0, 23.412498, 0, 0, 20.0679, 3.3446, 0, 20.0679, 0, 0, 20.0679, 3.3446, 0, 16.7232, 3.3446, 0, 20.0679, 0, 0, 20.0679, 0, 0, 16.7232, 3.3446, 0, 16.7232, -3.3446, 0, 26.7572, -3.3446, 0, 23.412498, 0, 0, 23.412498, -3.3446, 0, 23.412498, 0, 0, 20.0679, 0, 0, 23.412498, -6.6893, 0, 26.7572, -3.3446, 0, 23.412498, -3.3446, 0, 26.7572, -3.3446, 0, 20.0679, 0, 0, 16.7232, 0, 0, 20.0679, -3.3446, 0, 23.412498, -3.3446, 0, 20.0679, 0, 0, 20.0679, -3.3446, 0, 20.0679, -3.3446, 0, 16.7232, 0, 0, 16.7232, -6.6893, 0, 26.7572, -6.6893, 0, 23.412498, -3.3446, 0, 23.412498, -6.6893, 0, 23.412498, -3.3446, 0, 20.0679, -3.3446, 0, 23.412498, -10.033899, 0, 26.7572, -6.6893, 0, 23.412498, -6.6893, 0, 26.7572, -6.6893, 0, 20.0679, -3.3446, 0, 16.7232, -3.3446, 0, 20.0679, -6.6893, 0, 23.412498, -6.6893, 0, 20.0679, -3.3446, 0, 20.0679, -6.6893, 0, 20.0679, -6.6893, 0, 16.7232, -3.3446, 0, 16.7232, -10.033899, 0, 26.7572, -10.033899, 0, 23.412498, -6.6893, 0, 23.412498, -10.033899, 0, 23.412498, -6.6893, 0, 20.0679, -6.6893, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 23.412498, -10.033899, 0, 26.7572, -10.033899, 0, 20.0679, -6.6893, 0, 16.7232, -6.6893, 0, 20.0679, -10.033899, 0, 23.412498, -10.033899, 0, 20.0679, -6.6893, 0, 20.0679, -13.3786, 0, 26.7572, -13.3786, 0, 23.412498, -10.033899, 0, 23.412498, -13.3786, 0, 23.412498, -10.033899, 0, 20.0679, -10.033899, 0, 23.412498, -16.7232, 0, 26.7572, -13.3786, 0, 23.412498, -13.3786, 0, 26.7572, -10.033899, 0, 20.0679, -10.033899, 0, 16.7232, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -6.6893, 0, 13.3786, -6.6893, 0, 16.7232, -10.033899, 0, 16.7232, -10.033899, 0, 13.3786, -6.6893, 0, 13.3786, -13.3786, 0, 20.0679, -10.033899, 0, 16.7232, -10.033899, 0, 20.0679, -13.3786, 0, 23.412498, -13.3786, 0, 20.0679, -10.033899, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 13.3786, -10.033899, 0, 16.7232, -13.3786, 0, 20.0679, -13.3786, 0, 16.7232, -10.033899, 0, 16.7232, -13.3786, 0, 16.7232, -13.3786, 0, 13.3786, -10.033899, 0, 13.3786, -16.7232, 0, 26.7572, -16.7232, 0, 23.412498, -13.3786, 0, 23.412498, -16.7232, 0, 23.412498, -13.3786, 0, 20.0679, -13.3786, 0, 23.412498, -20.0679, 0, 26.7572, -16.7232, 0, 23.412498, -16.7232, 0, 26.7572, -16.7232, 0, 20.0679, -13.3786, 0, 16.7232, -13.3786, 0, 20.0679, -16.7232, 0, 23.412498, -16.7232, 0, 20.0679, -13.3786, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 13.3786, -13.3786, 0, 16.7232, -16.7232, 0, 20.0679, -16.7232, 0, 16.7232, -13.3786, 0, 16.7232, -16.7232, 0, 16.7232, -16.7232, 0, 13.3786, -13.3786, 0, 13.3786, -20.0679, 0, 26.7572, -20.0679, 0, 23.412498, -16.7232, 0, 23.412498, -20.0679, 0, 23.412498, -16.7232, 0, 20.0679, -16.7232, 0, 23.412498, -23.412498, 0, 26.7572, -20.0679, 0, 23.412498, -20.0679, 0, 26.7572, -20.0679, 0, 20.0679, -16.7232, 0, 16.7232, -16.7232, 0, 20.0679, -20.0679, 0, 23.412498, -20.0679, 0, 20.0679, -16.7232, 0, 20.0679, -23.412498, 0, 26.7572, -23.412498, 0, 23.412498, -20.0679, 0, 23.412498, -23.412498, 0, 23.412498, -20.0679, 0, 20.0679, -20.0679, 0, 23.412498, -26.7572, 0, 26.7572, -23.412498, 0, 23.412498, -23.412498, 0, 26.7572, -26.7572, 0, 26.7572, -26.7572, 0, 23.412498, -23.412498, 0, 23.412498, -26.7572, 0, 23.412498, -23.412498, 0, 20.0679, -23.412498, 0, 23.412498, -23.412498, 0, 23.412498, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -26.7572, 0, 23.412498, -26.7572, 0, 20.0679, -23.412498, 0, 20.0679, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 16.7232, -23.412498, 0, 20.0679, -20.0679, 0, 16.7232, -20.0679, 0, 20.0679, -20.0679, 0, 16.7232, -16.7232, 0, 13.3786, -16.7232, 0, 16.7232, -26.7572, 0, 20.0679, -23.412498, 0, 16.7232, -23.412498, 0, 20.0679, -23.412498, 0, 20.0679, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -26.7572, 0, 20.0679, -26.7572, 0, 16.7232, -23.412498, 0, 16.7232, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 13.3786, -23.412498, 0, 16.7232, -20.0679, 0, 13.3786, -20.0679, 0, 16.7232, -20.0679, 0, 13.3786, -16.7232, 0, 10.033899, -16.7232, 0, 13.3786, -20.0679, 0, 13.3786, -20.0679, 0, 10.033899, -16.7232, 0, 10.033899, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -20.0679, 0, 13.3786, -23.412498, 0, 13.3786, -20.0679, 0, 10.033899, -20.0679, 0, 13.3786, -26.7572, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 16.7232, -23.412498, 0, 13.3786, -23.412498, 0, 10.033899, -20.0679, 0, 10.033899, -26.7572, 0, 16.7232, -26.7572, 0, 13.3786, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -23.412498, 0, 10.033899, -23.412498, 0, 13.3786, -26.7572, 0, 13.3786, -26.7572, 0, 10.033899, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -23.8078, 0, 6.6893, -23.412498, 0, 10.033899, -26.7572, 0, 10.033899, -26.7572, 0, 6.6893, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -23.412498, 0, 3.3446, -23.8078, 0, 6.6893, -26.7572, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, 0, 3.3446, -16.7232, 0, -23.412498, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -13.3786, 0, -23.412498, -13.3786, 0, -26.7572, -10.033899, 0, -26.7572, -16.7232, 0, -23.412498, -16.7232, 0, -26.7572, -13.3786, 0, -26.7572, -13.3786, 0, -23.412498, -10.033899, 0, -26.7572, -10.033899, 0, -23.412498, -10.033899, 0, -23.412498, -10.033899, 0, -26.7572, -6.6893, 0, -26.7572, -16.7232, 0, -20.0679, -16.7232, 0, -23.412498, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -6.6893, 0, -26.7572, -6.6893, 0, -23.412498, -6.6893, 0, -23.412498, -6.6893, 0, -26.7572, -3.3446, 0, -26.7572, -6.6893, 0, -23.412498, -3.3446, 0, -26.7572, -3.3446, 0, -23.412498, -13.3786, 0, -20.0679, -13.3786, 0, -23.412498, -10.033899, 0, -23.412498, -16.7232, 0, -20.0679, -13.3786, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -10.033899, 0, -23.412498, -6.6893, 0, -23.412498, -13.3786, 0, -20.0679, -10.033899, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -6.6893, 0, -23.412498, -3.3446, 0, -23.412498, -10.033899, 0, -20.0679, -6.6893, 0, -23.412498, -6.6893, 0, -20.0679, -6.6893, 0, -20.0679, -3.3446, 0, -23.412498, -3.3446, 0, -20.0679, -13.3786, 0, -17.3364, -13.3786, 0, -20.0679, -10.033899, 0, -20.0679, -13.3786, 0, -17.3364, -10.033899, 0, -20.0679, -10.033899, 0, -16.7232, -10.033899, 0, -16.7232, -10.033899, 0, -20.0679, -6.6893, 0, -20.0679, -16.7232, 0, -16.7232, -13.3786, 0, -20.0679, -13.3786, 0, -17.3364, -16.7232, 0, -16.7232, -16.7232, 0, -20.0679, -13.3786, 0, -20.0679, -10.033899, 0, -16.7232, -6.6893, 0, -20.0679, -6.6893, 0, -16.7232, -6.6893, 0, -16.7232, -6.6893, 0, -20.0679, -3.3446, 0, -20.0679, -9.6168995, 0, -14.127899, -10.033899, 0, -16.7232, -6.6893, 0, -16.7232, -9.6168995, 0, -14.127899, -6.6893, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -20.0679, -3.3446, 0, -16.7232, -6.6893, 0, -14.2637, -6.6893, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -16.7232, -3.3446, 0, -20.0679, 0, 0, -20.0679, -6.6893, 0, -14.2637, -3.3446, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -20.0679, 0, 0, -16.7232, -3.3446, 0, -13.3786, -3.3446, 0, -16.7232, 0, 0, -16.7232, 0, 0, -16.7232, 0, 0, -20.0679, 3.3446, 0, -20.5992, 0, 0, -16.7232, 3.3446, 0, -20.5992, 3.0140998, 0, -16.7232, -3.3446, 0, -13.3786, 0, 0, -16.7232, 0, 0, -13.3786, -2.6297, 0, -10.5745, -3.3446, 0, -13.3786, 0, 0, -13.3786, -2.6297, 0, -10.5745, 0, 0, -13.3786, 0, 0, -10.7654, -20.0679, 0, -16.7232, -16.7232, 0, -20.0679, -16.7232, 0, -16.7232, -20.0679, 0, -16.7232, -20.0679, 0, -20.0679, -16.7232, 0, -20.0679, -20.0679, 0, -20.0679, -16.7232, 0, -23.412498, -16.7232, 0, -20.0679, -20.0679, 0, -13.3786, -20.0679, 0, -16.7232, -16.7232, 0, -16.7232, -20.0679, 0, -13.3786, -16.7232, 0, -16.7232, -16.7232, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -20.0679, -20.0679, 0, -16.7232, -20.0679, 0, -10.033899, -20.0679, 0, -13.3786, -16.7232, 0, -13.3786, -20.0679, 0, -10.033899, -16.7232, 0, -13.3786, -17.275, 0, -10.5169, -23.412498, 0, -13.3786, -20.0679, 0, -16.7232, -20.0679, 0, -13.3786, -23.412498, 0, -13.3786, -23.412498, 0, -16.7232, -20.0679, 0, -16.7232, -23.412498, 0, -10.033899, -20.0679, 0, -13.3786, -20.0679, 0, -10.033899, -23.412498, 0, -10.033899, -23.412498, 0, -13.3786, -20.0679, 0, -13.3786, -26.7572, 0, -10.033899, -23.412498, 0, -13.3786, -23.412498, 0, -10.033899, -26.7572, 0, -10.033899, -26.7572, 0, -13.3786, -23.412498, 0, -13.3786, -26.7572, 0, -13.3786, -23.412498, 0, -16.7232, -23.412498, 0, -13.3786, -26.7572, 0, -6.6893, -26.7572, 0, -10.033899, -23.412498, 0, -10.033899, -26.7572, 0, -13.3786, -26.7572, 0, -16.7232, -23.412498, 0, -16.7232, -26.7572, 0, -6.6893, -23.412498, 0, -10.033899, -23.412498, 0, -6.6893, -23.412498, 0, -6.6893, -23.412498, 0, -10.033899, -20.0679, 0, -10.033899, -23.412498, 0, -6.6893, -20.0679, 0, -10.033899, -20.3764, 0, -6.6893, -26.7572, 0, -3.3446, -26.7572, 0, -6.6893, -23.412498, 0, -6.6893, -26.7572, 0, -3.3446, -23.412498, 0, -6.6893, -23.412498, 0, -3.3446, -26.7572, 0, -16.7232, -23.412498, 0, -20.0679, -23.412498, 0, -16.7232, -23.412498, 0, -16.7232, -23.412498, 0, -20.0679, -20.0679, 0, -20.0679, -26.7572, 0, -16.7232, -26.7572, 0, -20.0679, -23.412498, 0, -20.0679, -23.412498, 0, -20.0679, -20.0679, 0, -23.412498, -20.0679, 0, -20.0679, -20.0679, 0, -20.0679, -20.0679, 0, -23.412498, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -16.7232, 0, -26.7572, -16.7232, 0, -23.412498, -20.0679, 0, -23.412498, -20.0679, 0, -26.7572, -16.7232, 0, -26.7572, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -20.0679, 0, -23.412498, -23.412498, 0, -23.412498, -20.0679, 0, -26.7572, -20.0679, 0, -23.412498, -26.7572, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -20.0679, -23.412498, 0, -23.412498, -23.412498, 0, -26.7572, -20.0679, 0, -26.7572, -26.7572, 0, -20.0679, -26.7572, 0, -23.412498, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -23.412498, 0, -26.7572, -23.412498, 0, -23.412498, -26.7572, 0, -23.412498, -26.7572, 0, -26.7572, -23.412498, 0, -26.7572, -23.412498, 0, -3.3446, -20.3764, 0, -6.6893, -20.0679, -0.3484, -3.5669, -23.412498, 0, -3.3446, -23.412498, 0, -6.6893, -20.3764, 0, -6.6893, 16.7232, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 16.7232, 0, 10.033899, 16.7232, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 10.033899, 23.412498, 0, 6.6893, 23.412498, 0, 10.033899, 20.0679, 0, 10.033899, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 6.6893, -26.7572, 0, 3.3446, -23.412498, -0.2913, 0.26119998, -23.412498, 0, 3.3446, -26.7572, 0, 3.3446, -26.7572, 0, 0, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -23.412498, 0, -3.3446, -23.412498, -0.2913, 0.26119998, -26.7572, 0, 0, -26.7572, 0, -3.3446, -23.412498, 0, -3.3446, 0, 0, -13.3786, 3.0140998, 0, -16.7232, 3.3446, -0.3989, -12.9443, 0, 0, -13.3786, 0, 0, -16.7232, 3.0140998, 0, -16.7232, 0, 0, -10.7654, 3.3446, -0.3989, -12.9443, 2.8241, 0, -10.4594, 0, 0, -10.7654, 0, 0, -13.3786, 3.3446, -0.3989, -12.9443, 20.0679, -0.124199994, 6.6893, 23.412498, 0, 3.3446, 23.412498, 0, 6.6893, 20.0679, -0.124199994, 6.6893, 20.0679, 0, 3.3446, 23.412498, 0, 3.3446, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -15.0508995, 54.072197, -3.9413, -15.0508995, 54.072197, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 54.072197, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 54.072197, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -15.0508995, 51.2184, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -13.3786, 51.2184, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 54.072197, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 48.3645, -3.9413, -11.7063, 51.2184, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -13.3786, 48.3645, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 51.2184, -3.9413, -8.3616, 54.072197, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 48.3645, -3.9413, -10.033899, 51.2184, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 45.5107, -3.9413, -11.7063, 48.3645, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 54.072197, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 48.3645, -3.9413, -8.3616, 51.2184, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 45.5107, -3.9413, -10.033899, 48.3645, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 54.072197, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 48.3645, -3.9413, -6.6893, 51.2184, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 45.5107, -3.9413, -8.3616, 48.3645, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 54.072197, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, -1.6723, 54.072197, -3.9413, 0, 48.3645, -3.9413, -5.0169997, 51.2184, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 45.5107, -3.9413, -6.6893, 48.3645, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 54.072197, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 0, 54.072197, -3.9413, 0, 54.072197, -3.9413, 1.6723, 48.3645, -3.9413, -3.3446, 51.2184, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, -1.6723, 51.2184, -3.9413, 0, 45.5107, -3.9413, -5.0169997, 48.3645, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 54.072197, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 48.3645, -3.9413, -1.6723, 51.2184, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 0, 51.2184, -3.9413, 0, 51.2184, -3.9413, 1.6723, 45.5107, -3.9413, -3.3446, 48.3645, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, -1.6723, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 54.072197, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 48.3645, -3.9413, 0, 51.2184, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 45.5107, -3.9413, -1.6723, 48.3645, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 0, 48.3645, -3.9413, 0, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 54.072197, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 48.3645, -3.9413, 1.6723, 51.2184, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 45.5107, -3.9413, 0, 48.3645, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 54.072197, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 48.3645, -3.9413, 3.3446, 51.2184, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 45.5107, -3.9413, 1.6723, 48.3645, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 54.072197, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 48.3645, -3.9413, 5.0169997, 51.2184, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 45.5107, -3.9413, 3.3446, 48.3645, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 54.072197, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 48.3645, -3.9413, 6.6893, 51.2184, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 45.5107, -3.9413, 5.0169997, 48.3645, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 54.072197, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 48.3645, -3.9413, 8.3616, 51.2184, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 45.5107, -3.9413, 6.6893, 48.3645, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 54.072197, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 48.3645, -3.9413, 10.033899, 51.2184, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 45.5107, -3.9413, 8.3616, 48.3645, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 54.072197, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 48.3645, -3.9413, 11.7063, 51.2184, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 45.5107, -3.9413, 10.033899, 48.3645, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 54.072197, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 48.3645, -3.9413, 13.3786, 51.2184, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 45.5107, -3.9413, 11.7063, 48.3645, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 54.072197, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 48.3645, -3.9413, 15.0508995, 51.2184, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 45.5107, -3.9413, 13.3786, 48.3645, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 54.072197, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 48.3645, -3.9413, 16.7232, 51.2184, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 45.5107, -3.9413, 15.0508995, 48.3645, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 54.072197, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 48.3645, -3.9413, 18.3955, 51.2184, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 45.5107, -3.9413, 16.7232, 48.3645, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 54.072197, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 48.3645, -3.9413, 20.0679, 51.2184, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 45.5107, -3.9413, 18.3955, 48.3645, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 54.072197, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 25.084799, 54.072197, -3.9413, 26.7572, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 21.7402, 51.2184, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 23.412498, 51.2184, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 51.2184, -3.9413, 26.7572, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 20.0679, 48.3645, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 21.7402, 48.3645, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 23.412498, 48.3645, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 48.3645, -3.9413, 26.7572, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 25.084799, 45.5107, -3.9413, 26.7572, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 26.7572, 39.7973, -3.9413, 26.7572, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 42.6568, -3.9413, 25.084799, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 25.084799, 42.6568, -3.9413, 23.412498, 45.5107, -3.9413, 23.412498, 45.5107, -3.9413, 25.084799, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 42.6568, -3.9413, 23.412498, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 23.412498, 42.6568, -3.9413, 21.7402, 45.5107, -3.9413, 21.7402, 45.5107, -3.9413, 23.412498, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 42.6568, -3.9413, 21.7402, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 21.7402, 42.6568, -3.9413, 20.0679, 45.5107, -3.9413, 20.0679, 45.5107, -3.9413, 21.7402, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 42.6568, -3.9413, 20.0679, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 20.0679, 42.6568, -3.9413, 18.3955, 45.5107, -3.9413, 18.3955, 45.5107, -3.9413, 20.0679, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 42.6568, -3.9413, 18.3955, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 18.3955, 42.6568, -3.9413, 16.7232, 45.5107, -3.9413, 16.7232, 45.5107, -3.9413, 18.3955, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 42.6568, -3.9413, 16.7232, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 16.7232, 42.6568, -3.9413, 15.0508995, 45.5107, -3.9413, 15.0508995, 45.5107, -3.9413, 16.7232, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 42.6568, -3.9413, 15.0508995, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 15.0508995, 42.6568, -3.9413, 13.3786, 45.5107, -3.9413, 13.3786, 45.5107, -3.9413, 15.0508995, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 42.6568, -3.9413, 13.3786, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 13.3786, 42.6568, -3.9413, 11.7063, 45.5107, -3.9413, 11.7063, 45.5107, -3.9413, 13.3786, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 42.6568, -3.9413, 11.7063, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 11.7063, 42.6568, -3.9413, 10.033899, 45.5107, -3.9413, 10.033899, 45.5107, -3.9413, 11.7063, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 42.6568, -3.9413, 10.033899, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 10.033899, 42.6568, -3.9413, 8.3616, 45.5107, -3.9413, 8.3616, 45.5107, -3.9413, 10.033899, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 42.6568, -3.9413, 8.3616, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 8.3616, 42.6568, -3.9413, 6.6893, 45.5107, -3.9413, 6.6893, 45.5107, -3.9413, 8.3616, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 42.6568, -3.9413, 6.6893, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 6.6893, 42.6568, -3.9413, 5.0169997, 45.5107, -3.9413, 5.0169997, 45.5107, -3.9413, 6.6893, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 42.6568, -3.9413, 5.0169997, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 5.0169997, 42.6568, -3.9413, 3.3446, 45.5107, -3.9413, 3.3446, 45.5107, -3.9413, 5.0169997, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 42.6568, -3.9413, 3.3446, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 3.3446, 42.6568, -3.9413, 1.6723, 45.5107, -3.9413, 1.6723, 45.5107, -3.9413, 3.3446, 39.7973, -3.9413, 0, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 1.6723, 42.6568, -3.9413, 1.6723, 39.7973, -3.9413, 0, 42.6568, -3.9413, 0, 42.6568, -3.9413, 1.6723, 42.6568, -3.9413, 0, 45.5107, -3.9413, 0, 45.5107, -3.9413, 1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, 0, 39.7973, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, 0, 42.6568, -3.9413, 0, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, 0, 42.6568, -3.9413, -1.6723, 45.5107, -3.9413, -1.6723, 45.5107, -3.9413, 0, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 42.6568, -3.9413, -1.6723, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -1.6723, 42.6568, -3.9413, -3.3446, 45.5107, -3.9413, -3.3446, 45.5107, -3.9413, -1.6723, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 42.6568, -3.9413, -3.3446, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -3.3446, 42.6568, -3.9413, -5.0169997, 45.5107, -3.9413, -5.0169997, 45.5107, -3.9413, -3.3446, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 42.6568, -3.9413, -5.0169997, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -5.0169997, 42.6568, -3.9413, -6.6893, 45.5107, -3.9413, -6.6893, 45.5107, -3.9413, -5.0169997, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 42.6568, -3.9413, -6.6893, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -6.6893, 42.6568, -3.9413, -8.3616, 45.5107, -3.9413, -8.3616, 45.5107, -3.9413, -6.6893, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 42.6568, -3.9413, -8.3616, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -8.3616, 42.6568, -3.9413, -10.033899, 45.5107, -3.9413, -10.033899, 45.5107, -3.9413, -8.3616, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 42.6568, -3.9413, -10.033899, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -10.033899, 42.6568, -3.9413, -11.7063, 45.5107, -3.9413, -11.7063, 45.5107, -3.9413, -10.033899, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 42.6568, -3.9413, -11.7063, 39.7973, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -11.7063, 42.6568, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -11.7063, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -13.3786, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 42.6568, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -13.3786, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 45.5107, -3.9413, -13.3786, 39.7973, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -15.0508995, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -15.0508995, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -13.3786, 39.7973, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -15.0508995, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 45.5107, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 42.6568, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 48.3645, -3.9413, -15.0508995, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 48.3645, -3.9413, -15.0508995, 42.6568, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 45.5107, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -16.7232, 39.7973, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -20.0679, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 51.2184, -3.9413, -15.0508995, 51.2184, -3.9413, -16.7232, 54.072197, -3.9413, -16.7232, 54.072197, -3.9413, -15.0508995, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -16.7232, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 48.3645, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 51.2184, -3.9413, -16.7232, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -16.7232, 51.2184, -3.9413, -18.3955, 54.072197, -3.9413, -18.3955, 54.072197, -3.9413, -16.7232, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -18.3955, 42.6568, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 45.5107, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -18.3955, 45.5107, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 51.2184, -3.9413, -18.3955, 48.3645, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -18.3955, 51.2184, -3.9413, -20.0679, 54.072197, -3.9413, -20.0679, 54.072197, -3.9413, -18.3955, 39.7973, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 45.5107, -3.9413, -20.0679, 42.6568, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -20.0679, 39.7973, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -21.7402, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 42.6568, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 48.3645, -3.9413, -20.0679, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -20.0679, 42.6568, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -21.7402, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -21.7402, 39.7973, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -23.412498, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -23.412498, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -26.7572, 42.6568, -3.9413, -26.7572, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 42.6568, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 42.6568, -3.9413, -26.7572, 45.5107, -3.9413, -26.7572, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 48.3645, -3.9413, -21.7402, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 45.5107, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -23.412498, 45.5107, -3.9413, -26.7572, 48.3645, -3.9413, -26.7572, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 51.2184, -3.9413, -20.0679, 51.2184, -3.9413, -21.7402, 54.072197, -3.9413, -21.7402, 54.072197, -3.9413, -20.0679, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -21.7402, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 51.2184, -3.9413, -21.7402, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 54.072197, -3.9413, -23.412498, 54.072197, -3.9413, -21.7402, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 48.3645, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -23.412498, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -23.412498, 48.3645, -3.9413, -26.7572, 51.2184, -3.9413, -26.7572, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 54.072197, -3.9413, -25.084799, 54.072197, -3.9413, -23.412498, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 51.2184, -3.9413, -25.084799, 51.2184, -3.9413, -26.7572, 54.072197, -3.9413, -26.7572, 54.072197, -3.9413, -25.084799, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -13.3786, 29.679499, -0.6044, -13.3786, 32.4649, -1.1213, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -15.0508995, 29.679499, -0.6044, -11.7063, 32.4649, -1.1213, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -16.7232, 29.679499, -0.6044, -10.033899, 32.4649, -1.1213, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -18.3955, 29.679499, -0.6044, -8.3616, 32.4649, -1.1213, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -20.0679, 29.679499, -0.6044, -6.6893, 32.4649, -1.1213, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -21.7402, 29.679499, -0.6044, -5.0169997, 32.4649, -1.1213, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -23.412498, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -26.7572, 32.4649, -1.1213, -26.7572, 32.4649, -1.1213, -25.084799, 29.679499, -0.6044, -3.3446, 32.4649, -1.1213, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, -1.6723, 32.4649, -1.1213, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 0, 32.4649, -1.1213, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 1.6723, 32.4649, -1.1213, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 3.3446, 32.4649, -1.1213, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 5.0169997, 32.4649, -1.1213, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 6.6893, 32.4649, -1.1213, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 8.3616, 32.4649, -1.1213, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 10.033899, 32.4649, -1.1213, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 11.7063, 32.4649, -1.1213, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 13.3786, 32.4649, -1.1213, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 15.0508995, 32.4649, -1.1213, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 16.7232, 32.4649, -1.1213, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 18.3955, 32.4649, -1.1213, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 20.0679, 32.4649, -1.1213, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 21.7402, 32.4649, -1.1213, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 23.412498, 32.4649, -1.1213, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 25.084799, 32.4649, -1.1213, 26.7572, 29.679499, -0.6044, 26.7572, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -15.0508995, 39.7973, -3.9413, -15.0508995, 39.7973, -3.9413, -13.3786, 32.4649, -1.1213, -13.3786, 39.7973, -3.9413, -11.7063, 32.4649, -1.1213, -11.7063, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -16.7232, 39.7973, -3.9413, -16.7232, 39.7973, -3.9413, -15.0508995, 32.4649, -1.1213, -11.7063, 39.7973, -3.9413, -10.033899, 32.4649, -1.1213, -10.033899, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -18.3955, 39.7973, -3.9413, -18.3955, 39.7973, -3.9413, -16.7232, 32.4649, -1.1213, -10.033899, 39.7973, -3.9413, -8.3616, 32.4649, -1.1213, -8.3616, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -20.0679, 39.7973, -3.9413, -20.0679, 39.7973, -3.9413, -18.3955, 32.4649, -1.1213, -8.3616, 39.7973, -3.9413, -6.6893, 32.4649, -1.1213, -6.6893, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -21.7402, 39.7973, -3.9413, -21.7402, 39.7973, -3.9413, -20.0679, 32.4649, -1.1213, -6.6893, 39.7973, -3.9413, -5.0169997, 32.4649, -1.1213, -5.0169997, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -23.412498, 39.7973, -3.9413, -23.412498, 39.7973, -3.9413, -21.7402, 32.4649, -1.1213, -5.0169997, 39.7973, -3.9413, -3.3446, 32.4649, -1.1213, -3.3446, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -23.412498, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -25.084799, 39.7973, -3.9413, -25.084799, 39.7973, -3.9413, -23.412498, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -25.084799, 32.4649, -1.1213, -26.7572, 39.7973, -3.9413, -26.7572, 39.7973, -3.9413, -25.084799, 32.4649, -1.1213, -3.3446, 39.7973, -3.9413, -1.6723, 32.4649, -1.1213, -1.6723, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, -1.6723, 39.7973, -3.9413, 0, 32.4649, -1.1213, 0, 32.4649, -1.1213, 0, 39.7973, -3.9413, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 0, 39.7973, -3.9413, 1.6723, 32.4649, -1.1213, 1.6723, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 1.6723, 39.7973, -3.9413, 3.3446, 32.4649, -1.1213, 3.3446, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 3.3446, 39.7973, -3.9413, 5.0169997, 32.4649, -1.1213, 5.0169997, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 5.0169997, 39.7973, -3.9413, 6.6893, 32.4649, -1.1213, 6.6893, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 6.6893, 39.7973, -3.9413, 8.3616, 32.4649, -1.1213, 8.3616, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 8.3616, 39.7973, -3.9413, 10.033899, 32.4649, -1.1213, 10.033899, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 10.033899, 39.7973, -3.9413, 11.7063, 32.4649, -1.1213, 11.7063, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 11.7063, 39.7973, -3.9413, 13.3786, 32.4649, -1.1213, 13.3786, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 13.3786, 39.7973, -3.9413, 15.0508995, 32.4649, -1.1213, 15.0508995, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 15.0508995, 39.7973, -3.9413, 16.7232, 32.4649, -1.1213, 16.7232, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 16.7232, 39.7973, -3.9413, 18.3955, 32.4649, -1.1213, 18.3955, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 18.3955, 39.7973, -3.9413, 20.0679, 32.4649, -1.1213, 20.0679, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 20.0679, 39.7973, -3.9413, 21.7402, 32.4649, -1.1213, 21.7402, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 21.7402, 39.7973, -3.9413, 23.412498, 32.4649, -1.1213, 23.412498, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 23.412498, 39.7973, -3.9413, 25.084799, 32.4649, -1.1213, 25.084799, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 25.084799, 39.7973, -3.9413, 26.7572, 32.4649, -1.1213, 26.7572, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 16.7232, 29.679499, -0.6044, 16.7232, 29.679499, -0.6044, 18.3955, 26.7572, -0.2593, 18.3955, 29.679499, -0.6044, 20.0679, 26.7572, -0.2593, 20.0679, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 15.0508995, 29.679499, -0.6044, 15.0508995, 29.679499, -0.6044, 16.7232, 26.7572, -0.2593, 20.0679, 29.679499, -0.6044, 21.7402, 26.7572, -0.2593, 21.7402, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 13.3786, 29.679499, -0.6044, 13.3786, 29.679499, -0.6044, 15.0508995, 26.7572, -0.2593, 21.7402, 29.679499, -0.6044, 23.412498, 26.7572, -0.2593, 23.412498, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 11.7063, 29.679499, -0.6044, 11.7063, 29.679499, -0.6044, 13.3786, 26.7572, -0.2593, 23.412498, 29.679499, -0.6044, 25.084799, 26.7572, -0.2593, 25.084799, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 25.084799, 29.679499, -0.6044, 26.7572, 26.7572, -0.2593, 26.7572, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 11.7063, 26.7572, -0.2593, 10.033899, 29.679499, -0.6044, 10.033899, 29.679499, -0.6044, 11.7063, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 10.033899, 26.7572, -0.2593, 8.3616, 29.679499, -0.6044, 8.3616, 29.679499, -0.6044, 10.033899, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 8.3616, 26.7572, -0.2593, 6.6893, 29.679499, -0.6044, 6.6893, 29.679499, -0.6044, 8.3616, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 6.6893, 26.7572, -0.2593, 5.0169997, 29.679499, -0.6044, 5.0169997, 29.679499, -0.6044, 6.6893, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 5.0169997, 26.7572, -0.2593, 3.3446, 29.679499, -0.6044, 3.3446, 29.679499, -0.6044, 5.0169997, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 3.3446, 26.7572, -0.2593, 1.6723, 29.679499, -0.6044, 1.6723, 29.679499, -0.6044, 3.3446, 26.7572, -0.2593, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, 1.6723, 26.7572, -0.2593, 0, 29.679499, -0.6044, 0, 29.679499, -0.6044, 1.6723, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, 0, 26.7572, -0.2593, -1.6723, 29.679499, -0.6044, -1.6723, 29.679499, -0.6044, 0, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -1.6723, 26.7572, -0.2593, -3.3446, 29.679499, -0.6044, -3.3446, 29.679499, -0.6044, -1.6723, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -3.3446, 26.7572, -0.2593, -5.0169997, 29.679499, -0.6044, -5.0169997, 29.679499, -0.6044, -3.3446, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -5.0169997, 26.7572, -0.2593, -6.6893, 29.679499, -0.6044, -6.6893, 29.679499, -0.6044, -5.0169997, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -6.6893, 26.7572, -0.2593, -8.3616, 29.679499, -0.6044, -8.3616, 29.679499, -0.6044, -6.6893, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -8.3616, 26.7572, -0.2593, -10.033899, 29.679499, -0.6044, -10.033899, 29.679499, -0.6044, -8.3616, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -10.033899, 26.7572, -0.2593, -11.7063, 29.679499, -0.6044, -11.7063, 29.679499, -0.6044, -10.033899, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -11.7063, 26.7572, -0.2593, -13.3786, 29.679499, -0.6044, -13.3786, 29.679499, -0.6044, -11.7063, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -13.3786, 26.7572, -0.2593, -15.0508995, 29.679499, -0.6044, -15.0508995, 29.679499, -0.6044, -13.3786, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -15.0508995, 26.7572, -0.2593, -16.7232, 29.679499, -0.6044, -16.7232, 29.679499, -0.6044, -15.0508995, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -16.7232, 26.7572, -0.2593, -18.3955, 29.679499, -0.6044, -18.3955, 29.679499, -0.6044, -16.7232, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -18.3955, 26.7572, -0.2593, -20.0679, 29.679499, -0.6044, -20.0679, 29.679499, -0.6044, -18.3955, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -20.0679, 26.7572, -0.2593, -21.7402, 29.679499, -0.6044, -21.7402, 29.679499, -0.6044, -20.0679, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -21.7402, 26.7572, -0.2593, -23.412498, 29.679499, -0.6044, -23.412498, 29.679499, -0.6044, -21.7402, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -23.412498, 26.7572, -0.2593, -25.084799, 29.679499, -0.6044, -25.084799, 29.679499, -0.6044, -23.412498, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -25.084799, 26.7572, -0.2593, -25.084799, 26.7572, -0.2593, -26.7572, 29.679499, -0.6044, -26.7572, 29.679499, -0.6044, -25.084799) @@ -71,7 +70,6 @@ size = Vector3(48, 5, 18) [node name="StarterIslandRegion" type="Node3D" unique_id=1830415700] script = ExtResource("1_region") grass_material = ExtResource("9_grass") -sand_material = ExtResource("11_sand") region_id = &"starter_island" fishable_water_root = NodePath("WaterBodies") water_recovery_root = NodePath("WaterBodies") diff --git a/world/water_recovery_controller.gd b/world/water_recovery_controller.gd index d5f46ae..1333b6d 100644 --- a/world/water_recovery_controller.gd +++ b/world/water_recovery_controller.gd @@ -2,7 +2,6 @@ class_name WaterRecoveryController extends Node signal recovery_starting -signal local_respawn_completed(entry_position: Vector3) enum RecoveryState { IDLE, @@ -166,7 +165,6 @@ func _respawn_player() -> void: _player.global_transform = respawn_transform _player.restore_gameplay_orientation_after_recovery() _player.velocity = Vector3.ZERO - local_respawn_completed.emit(_entry_position) func _finish_recovery() -> void: