From a91f2b98257c367fb7af0cb1a9d0c52a2a211708 Mon Sep 17 00:00:00 2001 From: Voyager Date: Sun, 26 Jul 2026 00:33:37 -0400 Subject: [PATCH] Add modular holdover fishing world --- main/main.gd | 2 +- main/main.tscn | 2 +- player/player.gd | 18 ++ world/README-WORLD-GRAYBOX.md | 110 ++++++++ world/interactables/fishing_shop_world.tscn | 83 ++++++ world/interactables/pelican_buyer_world.tscn | 50 ++++ world/regions/coastal_dock_region.tscn | 140 ++++++++++ world/regions/graybox_region.gd | 43 +++ world/regions/graybox_region.gd.uid | 1 + world/regions/lake_region.tscn | 141 ++++++++++ world/regions/marsh_region.tscn | 164 +++++++++++ world/regions/river_region.tscn | 143 ++++++++++ world/regions/starter_pond_region.tscn | 114 ++++++++ world/regions/village_region.tscn | 179 ++++++++++++ world/test_world.gd | 47 +++- world/test_world.tscn | 271 +++++++------------ world/water_recovery_controller.gd | 37 ++- 17 files changed, 1354 insertions(+), 191 deletions(-) create mode 100644 world/README-WORLD-GRAYBOX.md create mode 100644 world/interactables/fishing_shop_world.tscn create mode 100644 world/interactables/pelican_buyer_world.tscn create mode 100644 world/regions/coastal_dock_region.tscn create mode 100644 world/regions/graybox_region.gd create mode 100644 world/regions/graybox_region.gd.uid create mode 100644 world/regions/lake_region.tscn create mode 100644 world/regions/marsh_region.tscn create mode 100644 world/regions/river_region.tscn create mode 100644 world/regions/starter_pond_region.tscn create mode 100644 world/regions/village_region.tscn diff --git a/main/main.gd b/main/main.gd index 0deb188..abf93dd 100644 --- a/main/main.gd +++ b/main/main.gd @@ -100,7 +100,7 @@ func _ready() -> void: _fishing_spot, _game_ui, _game_ui.get_screen_fade(), - _test_world.get_player_water_trigger(), + _test_world.get_player_water_triggers(), _test_world.get_safe_respawn_points() ) if not _settings_manager.settings_changed.is_connected( diff --git a/main/main.tscn b/main/main.tscn index 5697a2f..aacf883 100644 --- a/main/main.tscn +++ b/main/main.tscn @@ -26,7 +26,7 @@ item_catalog = ExtResource("11_items") [node name="Player" parent="Players" instance=ExtResource("2_player")] unique_name_in_owner = true -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 5) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 16) [node name="FishingSpot" parent="." instance=ExtResource("4_spot")] unique_name_in_owner = true diff --git a/player/player.gd b/player/player.gd index 847492c..b06e5c5 100644 --- a/player/player.gd +++ b/player/player.gd @@ -308,6 +308,24 @@ func set_water_recovery_active(active: bool) -> void: velocity = Vector3.ZERO +func prepare_for_water_recovery() -> void: + _restore_gameplay_presentation_for_recovery() + + +func restore_gameplay_orientation_after_recovery() -> void: + _restore_gameplay_presentation_for_recovery() + + +func _restore_gameplay_presentation_for_recovery() -> void: + # Recovery owns presentation teardown. Ending immediately kills every + # showcase tween, invalidates its callbacks, and restores the gameplay yaw. + end_catch_showcase(Callable(), true) + var gameplay_rotation: Vector3 = _visuals.rotation + gameplay_rotation.x = 0.0 + gameplay_rotation.z = 0.0 + _visuals.rotation = gameplay_rotation + + func get_body_center_position() -> Vector3: return global_position + Vector3.UP * body_center_height diff --git a/world/README-WORLD-GRAYBOX.md b/world/README-WORLD-GRAYBOX.md new file mode 100644 index 0000000..d1da73f --- /dev/null +++ b/world/README-WORLD-GRAYBOX.md @@ -0,0 +1,110 @@ +# NETFISHING holdover world + +`world/test_world.tscn` remains the active world. It composes the complete +temporary map, lighting, paths, bounds, and six region scenes. The practical +footprint is approximately 180 × 220 world units, including the coastal water +and outer collision bounds. + +## Composition + +```text +TestWorld +├── Environment +├── SeabedBoundary +├── Regions +│ ├── VillageRegion (0, 0, 15) +│ ├── StarterPondRegion (-42, 0, 15) +│ ├── RiverRegion (0, 0, -40) +│ ├── LakeRegion (53, 0, -25) +│ ├── MarshRegion (56, 0, 38) +│ └── CoastalDockRegion (0, 0, -103) +├── Connectors +├── Safety +└── WorldBounds +``` + +Every region uses the same ownership groups: + +- `Visuals`: replaceable graybox meshes and labels. +- `StaticCollision`: simple gameplay collision paired with the visuals. +- `FishingWater`: explicit `FishableWaterRegion` children. +- `WaterRecovery`: explicit `PlayerWaterTrigger` children. +- `SafeRespawns`: known-safe `SafeRespawnPoint` markers. +- `Interactables`: region-owned services, currently used by the village. + +`GrayboxRegion` only exposes those explicit child groups plus a stable region +ID. `TestWorld` is the aggregation boundary; regions do not select fish, +control recovery, own progression, register globally, or stream themselves. + +## Safe editing + +Move a whole region by moving its region root under `TestWorld/Regions`. This +keeps visuals, collision, water, recovery triggers, safe points, and +interactables synchronized. Moving only a visual mesh does not move collision +or gameplay volumes, so update its paired collision intentionally when editing +inside a region. + +Safe designer targets: + +- Entire region roots under `TestWorld/Regions` +- Children of `Visuals`, together with paired `StaticCollision` +- Safe-respawn marker transforms +- Landmark and label transforms +- Connector transforms and their complete StaticBody children + +Structural land and route blocks extend from the common walkable elevation at +`y=0` down to approximately `y=-6`. Adjacent blocks meet at deliberate shared +edges instead of stacking collision surfaces. Decorative plaza/path color is +non-colliding and sits just above the authoritative ground. + +Gameplay-critical children that must stay aligned: + +- A water plane, its `FishingWater` Area3D, and its `WaterRecovery` Area3D +- A dock or bank mesh and its paired shape in `StaticCollision` +- Safe points and the land/dock they target +- The Fishing Shop visual root and `FishingShopInteraction` + +Rename-sensitive paths: + +- `TestWorld/Regions` +- `VillageRegion/Interactables/FishingShopWorld/FishingShopInteraction` +- `VillageRegion/Interactables/PelicanCoolerPerch` +- Each region's `FishingWater`, `WaterRecovery`, and `SafeRespawns` roots, + unless its exported NodePaths are updated at the same time + +## Adding water and recovery + +1. Add a `FishableWaterRegion` Area3D under the region's `FishingWater`. +2. Give it collision layer 4, a clear location tag, and an explicit fish pool. +3. Add a matching `PlayerWaterTrigger` under `WaterRecovery`. +4. Give the trigger collision layer 8, mask 2, matching horizontal coverage, + and the correct `surface_height`. +5. Place two or more safe respawns on nearby broad walkable land. +6. Validate casting, shoreline collision, recovery entry, and nearest-point + selection from every side. + +`TestWorld/Safety/BelowWorldFailsafe` is a temporary whole-map recovery net. +It catches seam and below-world falls that escape normal regional water +coverage. It supplements rather than replaces the five region-local triggers; +the recovery controller still permits only one recovery sequence at a time. + +## Services + +The Fishing Shop is an instanced scene at the east side of the village plaza. +Move the complete `FishingShopWorld` instance, not only its booth meshes. + +The Pelican perch is decorative signage, not an interaction NPC. Its sign says +“Sell to Pelicans from the Cooler”; the existing 0.25× Pelican sale remains +available from the Cooler anywhere in the world. Moving or removing the +decorative perch does not change that service. + +## Temporary by design + +All terrain, buildings, docks, reeds, landmarks, signage, palette, and lighting +are primitive holdover presentation. A future artist or level designer can +replace `Visuals` and paired static collision without changing fishing, +recovery, shop, save, economy, or player progression code. Region IDs and +gameplay volume ownership should remain stable while visuals are replaced. + +Water surfaces sit near `y=0.2`; the shared graybox seabed is near `y=-6`. +There is no structural walkable layer directly below the fishable surfaces. diff --git a/world/interactables/fishing_shop_world.tscn b/world/interactables/fishing_shop_world.tscn new file mode 100644 index 0000000..d5946ce --- /dev/null +++ b/world/interactables/fishing_shop_world.tscn @@ -0,0 +1,83 @@ +[gd_scene load_steps=10 format=3] + +[ext_resource type="Script" path="res://world/fishing_shop_interaction.gd" id="1_shop"] + +[sub_resource type="BoxMesh" id="CounterMesh"] +size = Vector3(4.2, 1.25, 1.8) + +[sub_resource type="BoxMesh" id="RoofMesh"] +size = Vector3(5.2, 0.35, 3.2) + +[sub_resource type="BoxMesh" id="PostMesh"] +size = Vector3(0.28, 3.2, 0.28) + +[sub_resource type="BoxMesh" id="BackMesh"] +size = Vector3(5, 2.8, 0.25) + +[sub_resource type="StandardMaterial3D" id="PrimaryMaterial"] +albedo_color = Color(0.12, 0.68, 0.62, 1) + +[sub_resource type="StandardMaterial3D" id="AccentMaterial"] +albedo_color = Color(1, 0.68, 0.18, 1) + +[sub_resource type="StandardMaterial3D" id="BackMaterial"] +albedo_color = Color(0.13, 0.34, 0.38, 1) + +[sub_resource type="SphereShape3D" id="InteractionShape"] +radius = 3.0 + +[sub_resource type="BoxShape3D" id="CounterShape"] +size = Vector3(4.2, 1.25, 1.8) + +[node name="FishingShopWorld" type="Node3D"] + +[node name="Visuals" type="Node3D" parent="."] + +[node name="Counter" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.625, 0) +mesh = SubResource("CounterMesh") +material_override = SubResource("PrimaryMaterial") + +[node name="Back" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 1.4, 1.25) +mesh = SubResource("BackMesh") +material_override = SubResource("BackMaterial") + +[node name="Roof" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 3.15, 0.35) +mesh = SubResource("RoofMesh") +material_override = SubResource("AccentMaterial") + +[node name="WestPost" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-2.15, 1.6, -0.8) +mesh = SubResource("PostMesh") +material_override = SubResource("PrimaryMaterial") + +[node name="EastPost" type="MeshInstance3D" parent="Visuals"] +position = Vector3(2.15, 1.6, -0.8) +mesh = SubResource("PostMesh") +material_override = SubResource("PrimaryMaterial") + +[node name="ShopName" type="Label3D" parent="Visuals"] +position = Vector3(0, 3.7, 0) +text = "Fishing Shop" +font_size = 42 +outline_size = 9 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="StaticBody3D" parent="."] + +[node name="CounterShape" type="CollisionShape3D" parent="StaticCollision"] +position = Vector3(0, 0.625, 0) +shape = SubResource("CounterShape") + +[node name="FishingShopInteraction" type="Area3D" parent="."] +unique_name_in_owner = true +position = Vector3(0, 1, -0.3) +collision_layer = 0 +collision_mask = 2 +script = ExtResource("1_shop") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="FishingShopInteraction"] +shape = SubResource("InteractionShape") diff --git a/world/interactables/pelican_buyer_world.tscn b/world/interactables/pelican_buyer_world.tscn new file mode 100644 index 0000000..bc204c4 --- /dev/null +++ b/world/interactables/pelican_buyer_world.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=5 format=3] + +[sub_resource type="BoxMesh" id="PerchMesh"] +size = Vector3(5, 0.7, 2.2) + +[sub_resource type="CylinderMesh" id="PostMesh"] +top_radius = 0.18 +bottom_radius = 0.24 +height = 2.5 + +[sub_resource type="StandardMaterial3D" id="WoodMaterial"] +albedo_color = Color(0.46, 0.28, 0.13, 1) + +[sub_resource type="StandardMaterial3D" id="SignMaterial"] +albedo_color = Color(0.95, 0.82, 0.42, 1) + +[node name="PelicanCoolerPerch" type="Node3D"] + +[node name="Visuals" type="Node3D" parent="."] + +[node name="Perch" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 1.65, 0) +mesh = SubResource("PerchMesh") +material_override = SubResource("WoodMaterial") + +[node name="WestPost" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-1.8, 0.7, 0) +mesh = SubResource("PostMesh") +material_override = SubResource("WoodMaterial") + +[node name="EastPost" type="MeshInstance3D" parent="Visuals"] +position = Vector3(1.8, 0.7, 0) +mesh = SubResource("PostMesh") +material_override = SubResource("WoodMaterial") + +[node name="Sign" type="Label3D" parent="Visuals"] +position = Vector3(0, 2.55, 0) +text = "Sell to Pelicans\nfrom the Cooler" +font_size = 30 +outline_size = 8 +billboard = 1 +no_depth_test = true + +[node name="ConvenienceLabel" type="Label3D" parent="Visuals"] +position = Vector3(0, 1.65, -1.15) +text = "Available anywhere • 0.25x" +font_size = 20 +outline_size = 6 +billboard = 1 +no_depth_test = true diff --git a/world/regions/coastal_dock_region.tscn b/world/regions/coastal_dock_region.tscn new file mode 100644 index 0000000..c8b02da --- /dev/null +++ b/world/regions/coastal_dock_region.tscn @@ -0,0 +1,140 @@ +[gd_scene load_steps=21 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"] +[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"] + +[sub_resource type="BoxShape3D" id="ShoreShape"] +size = Vector3(90, 6, 18) +[sub_resource type="BoxMesh" id="ShoreMesh"] +size = Vector3(90, 6, 18) +[sub_resource type="BoxShape3D" id="DockShape"] +size = Vector3(7, 0.4, 25) +[sub_resource type="BoxMesh" id="DockMesh"] +size = Vector3(7, 0.4, 25) +[sub_resource type="BoxShape3D" id="DockRampShape"] +size = Vector3(7, 0.35, 4) +[sub_resource type="BoxMesh" id="DockRampMesh"] +size = Vector3(7, 0.35, 4) +[sub_resource type="CylinderMesh" id="TowerMesh"] +top_radius = 2.4 +bottom_radius = 3.4 +height = 13 +[sub_resource type="CylinderMesh" id="BeaconMesh"] +top_radius = 1.4 +bottom_radius = 1.4 +height = 2.5 +[sub_resource type="BoxMesh" id="CraneArmMesh"] +size = Vector3(1, 1, 10) +[sub_resource type="PlaneMesh" id="WaterMesh"] +size = Vector2(90, 54) +[sub_resource type="BoxShape3D" id="WaterShape"] +size = Vector3(90, 0.2, 54) +[sub_resource type="BoxShape3D" id="RecoveryShape"] +size = Vector3(90, 5, 54) +[sub_resource type="StandardMaterial3D" id="ShoreMaterial"] +albedo_color = Color(0.7, 0.66, 0.5, 1) +[sub_resource type="StandardMaterial3D" id="DockMaterial"] +albedo_color = Color(0.58, 0.4, 0.2, 1) +[sub_resource type="StandardMaterial3D" id="TowerMaterial"] +albedo_color = Color(0.92, 0.9, 0.76, 1) +[sub_resource type="StandardMaterial3D" id="BeaconMaterial"] +albedo_color = Color(0.95, 0.28, 0.22, 1) +[sub_resource type="StandardMaterial3D" id="WaterMaterial"] +transparency = 1 +albedo_color = Color(0.04, 0.3, 0.62, 0.84) + +[node name="CoastalDockRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"coast" +[node name="Visuals" type="Node3D" parent="."] +[node name="Shore" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, 22) +mesh = SubResource("ShoreMesh") +material_override = SubResource("ShoreMaterial") +[node name="Ocean" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.2, -14) +mesh = SubResource("WaterMesh") +material_override = SubResource("WaterMaterial") +[node name="MainDock" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.45, -3.5) +mesh = SubResource("DockMesh") +material_override = SubResource("DockMaterial") +[node name="DockApproachRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.155, 11) +rotation_degrees = Vector3(9, 0, 0) +mesh = SubResource("DockRampMesh") +material_override = SubResource("DockMaterial") +[node name="Lighthouse" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-32, 6.5, 20) +mesh = SubResource("TowerMesh") +material_override = SubResource("TowerMaterial") +[node name="Beacon" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-32, 14, 20) +mesh = SubResource("BeaconMesh") +material_override = SubResource("BeaconMaterial") +[node name="CraneArm" type="MeshInstance3D" parent="Visuals"] +position = Vector3(17, 5, 19) +rotation_degrees = Vector3(0, 0, 60) +mesh = SubResource("CraneArmMesh") +material_override = SubResource("BeaconMaterial") +[node name="CoastLabel" type="Label3D" parent="Visuals"] +position = Vector3(25, 3.2, 23) +text = "COAST" +font_size = 38 +outline_size = 8 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] +[node name="Shore" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Shore"] +position = Vector3(0, -3, 22) +shape = SubResource("ShoreShape") +[node name="MainDock" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/MainDock"] +position = Vector3(0, 0.45, -3.5) +shape = SubResource("DockShape") +[node name="DockApproachRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/DockApproachRamp"] +position = Vector3(0, 0.155, 11) +rotation_degrees = Vector3(9, 0, 0) +shape = SubResource("DockRampShape") + +[node name="FishingWater" type="Node3D" parent="."] +[node name="CoastalWater" type="Area3D" parent="FishingWater"] +position = Vector3(0, 0.2, -14) +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("2_water") +location_tags = Array[StringName]([&"coast"]) +fish_pool = ExtResource("3_pool") +[node name="Shape" type="CollisionShape3D" parent="FishingWater/CoastalWater"] +shape = SubResource("WaterShape") + +[node name="WaterRecovery" type="Node3D" parent="."] +[node name="CoastalRecovery" type="Area3D" parent="WaterRecovery"] +position = Vector3(0, -2.3, -14) +collision_layer = 8 +collision_mask = 2 +script = ExtResource("4_trigger") +surface_height = 0.2 +[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/CoastalRecovery"] +shape = SubResource("RecoveryShape") + +[node name="SafeRespawns" type="Node3D" parent="."] +[node name="DockApproach" type="Marker3D" parent="SafeRespawns"] +position = Vector3(8, 0.58, 23) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("5_safe") +[node name="DockMidpoint" type="Marker3D" parent="SafeRespawns"] +position = Vector3(0, 1.23, 0) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("5_safe") +[node name="LighthouseShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-24, 0.58, 24) +rotation_degrees = Vector3(0, -135, 0) +script = ExtResource("5_safe") diff --git a/world/regions/graybox_region.gd b/world/regions/graybox_region.gd new file mode 100644 index 0000000..3edff84 --- /dev/null +++ b/world/regions/graybox_region.gd @@ -0,0 +1,43 @@ +class_name GrayboxRegion +extends Node3D + +@export var region_id: StringName +@export var fishable_water_root: NodePath = ^"FishingWater" +@export var water_recovery_root: NodePath = ^"WaterRecovery" +@export var safe_respawns_root: NodePath = ^"SafeRespawns" + + +func get_fishable_water_regions() -> Array[FishableWaterRegion]: + var regions: Array[FishableWaterRegion] = [] + var root: Node = get_node_or_null(fishable_water_root) + if root == null: + return regions + for child: Node in root.get_children(): + var water: FishableWaterRegion = child as FishableWaterRegion + if water != null: + regions.append(water) + return regions + + +func get_water_recovery_triggers() -> Array[PlayerWaterTrigger]: + var triggers: Array[PlayerWaterTrigger] = [] + var root: Node = get_node_or_null(water_recovery_root) + if root == null: + return triggers + for child: Node in root.get_children(): + var trigger: PlayerWaterTrigger = child as PlayerWaterTrigger + if trigger != null: + triggers.append(trigger) + return triggers + + +func get_safe_respawn_points() -> Array[SafeRespawnPoint]: + var points: Array[SafeRespawnPoint] = [] + var root: Node = get_node_or_null(safe_respawns_root) + if root == null: + return points + for child: Node in root.get_children(): + var point: SafeRespawnPoint = child as SafeRespawnPoint + if point != null: + points.append(point) + return points diff --git a/world/regions/graybox_region.gd.uid b/world/regions/graybox_region.gd.uid new file mode 100644 index 0000000..c0b07d7 --- /dev/null +++ b/world/regions/graybox_region.gd.uid @@ -0,0 +1 @@ +uid://bb1j0uhvrbf5n diff --git a/world/regions/lake_region.tscn b/world/regions/lake_region.tscn new file mode 100644 index 0000000..0d7ba8f --- /dev/null +++ b/world/regions/lake_region.tscn @@ -0,0 +1,141 @@ +[gd_scene load_steps=17 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"] +[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"] + +[sub_resource type="BoxShape3D" id="BankNSShape"] +size = Vector3(58, 6, 10) +[sub_resource type="BoxShape3D" id="BankEWShape"] +size = Vector3(8, 6, 36) +[sub_resource type="BoxMesh" id="BankNSMesh"] +size = Vector3(58, 6, 10) +[sub_resource type="BoxMesh" id="BankEWMesh"] +size = Vector3(8, 6, 36) +[sub_resource type="BoxShape3D" id="DockShape"] +size = Vector3(10, 0.4, 7) +[sub_resource type="BoxMesh" id="DockMesh"] +size = Vector3(10, 0.4, 7) +[sub_resource type="BoxShape3D" id="DockRampShape"] +size = Vector3(4, 0.35, 7) +[sub_resource type="BoxMesh" id="DockRampMesh"] +size = Vector3(4, 0.35, 7) +[sub_resource type="PlaneMesh" id="WaterMesh"] +size = Vector2(42, 36) +[sub_resource type="BoxShape3D" id="WaterShape"] +size = Vector3(42, 0.2, 36) +[sub_resource type="BoxShape3D" id="RecoveryShape"] +size = Vector3(42, 5, 36) +[sub_resource type="StandardMaterial3D" id="GrassMaterial"] +albedo_color = Color(0.34, 0.65, 0.3, 1) +[sub_resource type="StandardMaterial3D" id="DockMaterial"] +albedo_color = Color(0.55, 0.34, 0.16, 1) +[sub_resource type="StandardMaterial3D" id="WaterMaterial"] +transparency = 1 +albedo_color = Color(0.08, 0.43, 0.75, 0.82) + +[node name="LakeRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"lake" +[node name="Visuals" type="Node3D" parent="."] +[node name="NorthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, 23) +mesh = SubResource("BankNSMesh") +material_override = SubResource("GrassMaterial") +[node name="SouthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, -23) +mesh = SubResource("BankNSMesh") +material_override = SubResource("GrassMaterial") +[node name="WestBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-25, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("GrassMaterial") +[node name="EastBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(25, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("GrassMaterial") +[node name="Water" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.2, 0) +mesh = SubResource("WaterMesh") +material_override = SubResource("WaterMaterial") +[node name="WestDock" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-12, 0.45, 0) +mesh = SubResource("DockMesh") +material_override = SubResource("DockMaterial") +[node name="WestDockRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-19, 0.155, 0) +rotation_degrees = Vector3(0, 0, 9) +mesh = SubResource("DockRampMesh") +material_override = SubResource("DockMaterial") +[node name="LakeLabel" type="Label3D" parent="Visuals"] +position = Vector3(-25, 3, 20) +text = "LAKE" +font_size = 38 +outline_size = 8 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] +[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"] +position = Vector3(0, -3, 23) +shape = SubResource("BankNSShape") +[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"] +position = Vector3(0, -3, -23) +shape = SubResource("BankNSShape") +[node name="WestBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"] +position = Vector3(-25, -3, 0) +shape = SubResource("BankEWShape") +[node name="EastBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"] +position = Vector3(25, -3, 0) +shape = SubResource("BankEWShape") +[node name="WestDock" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestDock"] +position = Vector3(-12, 0.45, 0) +shape = SubResource("DockShape") +[node name="WestDockRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestDockRamp"] +position = Vector3(-19, 0.155, 0) +rotation_degrees = Vector3(0, 0, 9) +shape = SubResource("DockRampShape") + +[node name="FishingWater" type="Node3D" parent="."] +[node name="LakeWater" type="Area3D" parent="FishingWater"] +position = Vector3(0, 0.2, 0) +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("2_water") +location_tags = Array[StringName]([&"lake"]) +fish_pool = ExtResource("3_pool") +[node name="Shape" type="CollisionShape3D" parent="FishingWater/LakeWater"] +shape = SubResource("WaterShape") + +[node name="WaterRecovery" type="Node3D" parent="."] +[node name="LakeRecovery" type="Area3D" parent="WaterRecovery"] +position = Vector3(0, -2.3, 0) +collision_layer = 8 +collision_mask = 2 +script = ExtResource("4_trigger") +surface_height = 0.2 +[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/LakeRecovery"] +shape = SubResource("RecoveryShape") + +[node name="SafeRespawns" type="Node3D" parent="."] +[node name="WestDockApproach" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-25, 0.58, 8) +rotation_degrees = Vector3(0, -90, 0) +script = ExtResource("5_safe") +[node name="NorthShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(0, 0.58, 24) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("5_safe") +[node name="SouthEastShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(25, 0.58, -23) +rotation_degrees = Vector3(0, 45, 0) +script = ExtResource("5_safe") diff --git a/world/regions/marsh_region.tscn b/world/regions/marsh_region.tscn new file mode 100644 index 0000000..50e7c9e --- /dev/null +++ b/world/regions/marsh_region.tscn @@ -0,0 +1,164 @@ +[gd_scene load_steps=20 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"] +[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"] + +[sub_resource type="BoxShape3D" id="BankNSShape"] +size = Vector3(50, 6, 8) +[sub_resource type="BoxShape3D" id="BankEWShape"] +size = Vector3(8, 6, 30) +[sub_resource type="BoxMesh" id="BankNSMesh"] +size = Vector3(50, 6, 8) +[sub_resource type="BoxMesh" id="BankEWMesh"] +size = Vector3(8, 6, 30) +[sub_resource type="BoxShape3D" id="BoardwalkShape"] +size = Vector3(6, 0.4, 22) +[sub_resource type="BoxMesh" id="BoardwalkMesh"] +size = Vector3(6, 0.4, 22) +[sub_resource type="BoxShape3D" id="BoardwalkRampShape"] +size = Vector3(6, 0.35, 4) +[sub_resource type="BoxMesh" id="BoardwalkRampMesh"] +size = Vector3(6, 0.35, 4) +[sub_resource type="CylinderMesh" id="ReedMesh"] +top_radius = 0.06 +bottom_radius = 0.1 +height = 2.2 +[sub_resource type="PlaneMesh" id="WaterMesh"] +size = Vector2(38, 30) +[sub_resource type="BoxShape3D" id="WaterShape"] +size = Vector3(38, 0.2, 30) +[sub_resource type="BoxShape3D" id="RecoveryShape"] +size = Vector3(38, 5, 30) +[sub_resource type="StandardMaterial3D" id="BankMaterial"] +albedo_color = Color(0.38, 0.53, 0.27, 1) +[sub_resource type="StandardMaterial3D" id="BoardwalkMaterial"] +albedo_color = Color(0.48, 0.32, 0.18, 1) +[sub_resource type="StandardMaterial3D" id="ReedMaterial"] +albedo_color = Color(0.59, 0.67, 0.2, 1) +[sub_resource type="StandardMaterial3D" id="WaterMaterial"] +transparency = 1 +albedo_color = Color(0.1, 0.48, 0.48, 0.8) + +[node name="MarshRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"marsh" +[node name="Visuals" type="Node3D" parent="."] +[node name="NorthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, 19) +mesh = SubResource("BankNSMesh") +material_override = SubResource("BankMaterial") +[node name="SouthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, -19) +mesh = SubResource("BankNSMesh") +material_override = SubResource("BankMaterial") +[node name="WestBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-23, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("BankMaterial") +[node name="EastBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(23, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("BankMaterial") +[node name="Water" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.2, 0) +mesh = SubResource("WaterMesh") +material_override = SubResource("WaterMaterial") +[node name="Boardwalk" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.45, 0) +mesh = SubResource("BoardwalkMesh") +material_override = SubResource("BoardwalkMaterial") +[node name="BoardwalkNorthRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.155, 13) +rotation_degrees = Vector3(9, 0, 0) +mesh = SubResource("BoardwalkRampMesh") +material_override = SubResource("BoardwalkMaterial") +[node name="BoardwalkSouthRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.155, -13) +rotation_degrees = Vector3(-9, 0, 0) +mesh = SubResource("BoardwalkRampMesh") +material_override = SubResource("BoardwalkMaterial") +[node name="ReedWest" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-13, 1.1, -8) +mesh = SubResource("ReedMesh") +material_override = SubResource("ReedMaterial") +[node name="ReedEast" type="MeshInstance3D" parent="Visuals"] +position = Vector3(12, 1.1, 7) +mesh = SubResource("ReedMesh") +material_override = SubResource("ReedMaterial") +[node name="MarshLabel" type="Label3D" parent="Visuals"] +position = Vector3(21, 3, 17) +text = "MARSH" +font_size = 36 +outline_size = 8 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] +[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"] +position = Vector3(0, -3, 19) +shape = SubResource("BankNSShape") +[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"] +position = Vector3(0, -3, -19) +shape = SubResource("BankNSShape") +[node name="WestBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"] +position = Vector3(-23, -3, 0) +shape = SubResource("BankEWShape") +[node name="EastBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"] +position = Vector3(23, -3, 0) +shape = SubResource("BankEWShape") +[node name="Boardwalk" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Boardwalk"] +position = Vector3(0, 0.45, 0) +shape = SubResource("BoardwalkShape") +[node name="BoardwalkNorthRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/BoardwalkNorthRamp"] +position = Vector3(0, 0.155, 13) +rotation_degrees = Vector3(9, 0, 0) +shape = SubResource("BoardwalkRampShape") +[node name="BoardwalkSouthRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/BoardwalkSouthRamp"] +position = Vector3(0, 0.155, -13) +rotation_degrees = Vector3(-9, 0, 0) +shape = SubResource("BoardwalkRampShape") + +[node name="FishingWater" type="Node3D" parent="."] +[node name="MarshWater" type="Area3D" parent="FishingWater"] +position = Vector3(0, 0.2, 0) +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("2_water") +location_tags = Array[StringName]([&"marsh"]) +fish_pool = ExtResource("3_pool") +[node name="Shape" type="CollisionShape3D" parent="FishingWater/MarshWater"] +shape = SubResource("WaterShape") + +[node name="WaterRecovery" type="Node3D" parent="."] +[node name="MarshRecovery" type="Area3D" parent="WaterRecovery"] +position = Vector3(0, -2.3, 0) +collision_layer = 8 +collision_mask = 2 +script = ExtResource("4_trigger") +surface_height = 0.2 +[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/MarshRecovery"] +shape = SubResource("RecoveryShape") + +[node name="SafeRespawns" type="Node3D" parent="."] +[node name="BoardwalkNorth" type="Marker3D" parent="SafeRespawns"] +position = Vector3(8, 0.58, 19) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("5_safe") +[node name="BoardwalkSouth" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-8, 0.58, -19) +script = ExtResource("5_safe") +[node name="EastBank" type="Marker3D" parent="SafeRespawns"] +position = Vector3(23, 0.58, 7) +rotation_degrees = Vector3(0, 90, 0) +script = ExtResource("5_safe") diff --git a/world/regions/river_region.tscn b/world/regions/river_region.tscn new file mode 100644 index 0000000..6010084 --- /dev/null +++ b/world/regions/river_region.tscn @@ -0,0 +1,143 @@ +[gd_scene load_steps=19 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"] +[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"] + +[sub_resource type="BoxShape3D" id="BankShape"] +size = Vector3(13, 6, 61) +[sub_resource type="BoxMesh" id="BankMesh"] +size = Vector3(13, 6, 61) +[sub_resource type="BoxShape3D" id="BridgeShape"] +size = Vector3(6, 0.4, 7) +[sub_resource type="BoxMesh" id="BridgeMesh"] +size = Vector3(6, 0.4, 7) +[sub_resource type="BoxShape3D" id="BridgeRampShape"] +size = Vector3(4, 0.35, 7) +[sub_resource type="BoxMesh" id="BridgeRampMesh"] +size = Vector3(4, 0.35, 7) +[sub_resource type="BoxMesh" id="RailMesh"] +size = Vector3(14, 0.25, 0.25) +[sub_resource type="PlaneMesh" id="WaterMesh"] +size = Vector2(14, 58) +[sub_resource type="BoxShape3D" id="WaterShape"] +size = Vector3(14, 0.2, 58) +[sub_resource type="BoxShape3D" id="RecoveryShape"] +size = Vector3(14, 5, 58) +[sub_resource type="StandardMaterial3D" id="BankMaterial"] +albedo_color = Color(0.31, 0.61, 0.37, 1) +[sub_resource type="StandardMaterial3D" id="BridgeMaterial"] +albedo_color = Color(0.58, 0.58, 0.54, 1) +[sub_resource type="StandardMaterial3D" id="RailMaterial"] +albedo_color = Color(0.3, 0.32, 0.34, 1) +[sub_resource type="StandardMaterial3D" id="WaterMaterial"] +transparency = 1 +albedo_color = Color(0.12, 0.48, 0.72, 0.8) + +[node name="RiverRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"river" +[node name="Visuals" type="Node3D" parent="."] +[node name="WestBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-13.5, -3, -1.5) +mesh = SubResource("BankMesh") +material_override = SubResource("BankMaterial") +[node name="EastBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(13.5, -3, -1.5) +mesh = SubResource("BankMesh") +material_override = SubResource("BankMaterial") +[node name="Water" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.2, 0) +mesh = SubResource("WaterMesh") +material_override = SubResource("WaterMaterial") +[node name="Bridge" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.45, 7) +mesh = SubResource("BridgeMesh") +material_override = SubResource("BridgeMaterial") +[node name="WestBridgeRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-5, 0.155, 7) +rotation_degrees = Vector3(0, 0, 9) +mesh = SubResource("BridgeRampMesh") +material_override = SubResource("BridgeMaterial") +[node name="EastBridgeRamp" type="MeshInstance3D" parent="Visuals"] +position = Vector3(5, 0.155, 7) +rotation_degrees = Vector3(0, 0, -9) +mesh = SubResource("BridgeRampMesh") +material_override = SubResource("BridgeMaterial") +[node name="NorthRail" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 1.15, 10.2) +mesh = SubResource("RailMesh") +material_override = SubResource("RailMaterial") +[node name="SouthRail" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 1.15, 3.8) +mesh = SubResource("RailMesh") +material_override = SubResource("RailMaterial") +[node name="RiverLabel" type="Label3D" parent="Visuals"] +position = Vector3(-16, 3, 20) +text = "RIVER" +font_size = 34 +outline_size = 7 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] +[node name="WestBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"] +position = Vector3(-13.5, -3, -1.5) +shape = SubResource("BankShape") +[node name="EastBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"] +position = Vector3(13.5, -3, -1.5) +shape = SubResource("BankShape") +[node name="Bridge" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/Bridge"] +position = Vector3(0, 0.45, 7) +shape = SubResource("BridgeShape") +[node name="WestBridgeRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBridgeRamp"] +position = Vector3(-5, 0.155, 7) +rotation_degrees = Vector3(0, 0, 9) +shape = SubResource("BridgeRampShape") +[node name="EastBridgeRamp" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBridgeRamp"] +position = Vector3(5, 0.155, 7) +rotation_degrees = Vector3(0, 0, -9) +shape = SubResource("BridgeRampShape") + +[node name="FishingWater" type="Node3D" parent="."] +[node name="RiverWater" type="Area3D" parent="FishingWater"] +position = Vector3(0, 0.2, 0) +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("2_water") +location_tags = Array[StringName]([&"river"]) +fish_pool = ExtResource("3_pool") +[node name="Shape" type="CollisionShape3D" parent="FishingWater/RiverWater"] +shape = SubResource("WaterShape") + +[node name="WaterRecovery" type="Node3D" parent="."] +[node name="RiverRecovery" type="Area3D" parent="WaterRecovery"] +position = Vector3(0, -2.3, 0) +collision_layer = 8 +collision_mask = 2 +script = ExtResource("4_trigger") +surface_height = 0.2 +[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/RiverRecovery"] +shape = SubResource("RecoveryShape") + +[node name="SafeRespawns" type="Node3D" parent="."] +[node name="BridgeWest" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-15, 0.58, 14) +rotation_degrees = Vector3(0, -90, 0) +script = ExtResource("5_safe") +[node name="NorthEastBank" type="Marker3D" parent="SafeRespawns"] +position = Vector3(14, 0.58, 24) +rotation_degrees = Vector3(0, 90, 0) +script = ExtResource("5_safe") +[node name="SouthWestBank" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-14, 0.58, -25) +rotation_degrees = Vector3(0, -90, 0) +script = ExtResource("5_safe") diff --git a/world/regions/starter_pond_region.tscn b/world/regions/starter_pond_region.tscn new file mode 100644 index 0000000..7249437 --- /dev/null +++ b/world/regions/starter_pond_region.tscn @@ -0,0 +1,114 @@ +[gd_scene load_steps=14 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="2_water"] +[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="3_pool"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_trigger"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe"] + +[sub_resource type="BoxShape3D" id="BankNSShape"] +size = Vector3(36, 6, 8) +[sub_resource type="BoxShape3D" id="BankEWShape"] +size = Vector3(6, 6, 20) +[sub_resource type="BoxMesh" id="BankNSMesh"] +size = Vector3(36, 6, 8) +[sub_resource type="BoxMesh" id="BankEWMesh"] +size = Vector3(6, 6, 20) +[sub_resource type="PlaneMesh" id="WaterMesh"] +size = Vector2(24, 20) +[sub_resource type="BoxShape3D" id="WaterShape"] +size = Vector3(24, 0.2, 20) +[sub_resource type="BoxShape3D" id="RecoveryShape"] +size = Vector3(24, 5, 20) +[sub_resource type="StandardMaterial3D" id="GrassMaterial"] +albedo_color = Color(0.43, 0.75, 0.34, 1) +[sub_resource type="StandardMaterial3D" id="WaterMaterial"] +transparency = 1 +albedo_color = Color(0.16, 0.58, 0.78, 0.78) +roughness = 0.25 + +[node name="StarterPondRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"starter_pond" + +[node name="Visuals" type="Node3D" parent="."] +[node name="NorthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, 14) +mesh = SubResource("BankNSMesh") +material_override = SubResource("GrassMaterial") +[node name="SouthBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, -14) +mesh = SubResource("BankNSMesh") +material_override = SubResource("GrassMaterial") +[node name="WestBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-15, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("GrassMaterial") +[node name="EastBank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(15, -3, 0) +mesh = SubResource("BankEWMesh") +material_override = SubResource("GrassMaterial") +[node name="Water" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.2, 0) +mesh = SubResource("WaterMesh") +material_override = SubResource("WaterMaterial") +[node name="PondLabel" type="Label3D" parent="Visuals"] +position = Vector3(-14, 2.4, 11) +text = "POND" +font_size = 34 +outline_size = 7 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] +[node name="NorthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBank"] +position = Vector3(0, -3, 14) +shape = SubResource("BankNSShape") +[node name="SouthBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/SouthBank"] +position = Vector3(0, -3, -14) +shape = SubResource("BankNSShape") +[node name="WestBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBank"] +position = Vector3(-15, -3, 0) +shape = SubResource("BankEWShape") +[node name="EastBank" type="StaticBody3D" parent="StaticCollision"] +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/EastBank"] +position = Vector3(15, -3, 0) +shape = SubResource("BankEWShape") + +[node name="FishingWater" type="Node3D" parent="."] +[node name="StarterPondWater" type="Area3D" parent="FishingWater"] +position = Vector3(0, 0.2, 0) +collision_layer = 4 +collision_mask = 0 +monitoring = false +script = ExtResource("2_water") +location_tags = Array[StringName]([&"starter_pond"]) +fish_pool = ExtResource("3_pool") +[node name="Shape" type="CollisionShape3D" parent="FishingWater/StarterPondWater"] +shape = SubResource("WaterShape") + +[node name="WaterRecovery" type="Node3D" parent="."] +[node name="StarterPondRecovery" type="Area3D" parent="WaterRecovery"] +position = Vector3(0, -2.3, 0) +collision_layer = 8 +collision_mask = 2 +script = ExtResource("4_trigger") +surface_height = 0.2 +[node name="Shape" type="CollisionShape3D" parent="WaterRecovery/StarterPondRecovery"] +shape = SubResource("RecoveryShape") + +[node name="SafeRespawns" type="Node3D" parent="."] +[node name="EastShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(15, 0.58, 4) +rotation_degrees = Vector3(0, 90, 0) +script = ExtResource("5_safe") +[node name="NorthShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(0, 0.58, 14) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("5_safe") +[node name="SouthShore" type="Marker3D" parent="SafeRespawns"] +position = Vector3(0, 0.58, -14) +script = ExtResource("5_safe") diff --git a/world/regions/village_region.tscn b/world/regions/village_region.tscn new file mode 100644 index 0000000..f6b46b1 --- /dev/null +++ b/world/regions/village_region.tscn @@ -0,0 +1,179 @@ +[gd_scene load_steps=16 format=3] + +[ext_resource type="Script" path="res://world/regions/graybox_region.gd" id="1_region"] +[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="2_safe"] +[ext_resource type="PackedScene" path="res://world/interactables/fishing_shop_world.tscn" id="3_shop"] +[ext_resource type="PackedScene" path="res://world/interactables/pelican_buyer_world.tscn" id="4_pelican"] + +[sub_resource type="BoxShape3D" id="GroundShape"] +size = Vector3(48, 6, 36) + +[sub_resource type="BoxShape3D" id="BuildingShape"] +size = Vector3(8, 5, 7) + +[sub_resource type="BoxMesh" id="GroundMesh"] +size = Vector3(48, 6, 36) + +[sub_resource type="BoxMesh" id="PlazaMesh"] +size = Vector3(22, 0.02, 18) + +[sub_resource type="BoxMesh" id="BuildingMesh"] +size = Vector3(8, 5, 7) + +[sub_resource type="CylinderMesh" id="RoofMesh"] +top_radius = 0 +bottom_radius = 5.5 +height = 3 +radial_segments = 4 + +[sub_resource type="CylinderMesh" id="TowerMesh"] +top_radius = 2.4 +bottom_radius = 2.4 +height = 8 + +[sub_resource type="CylinderMesh" id="TowerTankMesh"] +top_radius = 3.2 +bottom_radius = 3.2 +height = 3.2 + +[sub_resource type="BoxMesh" id="PavilionRoofMesh"] +size = Vector3(9, 0.35, 7) + +[sub_resource type="BoxMesh" id="PavilionPostMesh"] +size = Vector3(0.3, 3.2, 0.3) + +[sub_resource type="StandardMaterial3D" id="GrassMaterial"] +albedo_color = Color(0.37, 0.68, 0.3, 1) + +[sub_resource type="StandardMaterial3D" id="PlazaMaterial"] +albedo_color = Color(0.76, 0.69, 0.54, 1) + +[sub_resource type="StandardMaterial3D" id="BuildingMaterial"] +albedo_color = Color(0.92, 0.55, 0.34, 1) + +[sub_resource type="StandardMaterial3D" id="RoofMaterial"] +albedo_color = Color(0.2, 0.46, 0.53, 1) + +[sub_resource type="StandardMaterial3D" id="LandmarkMaterial"] +albedo_color = Color(0.95, 0.82, 0.28, 1) + +[node name="VillageRegion" type="Node3D"] +script = ExtResource("1_region") +region_id = &"village" + +[node name="Visuals" type="Node3D" parent="."] + +[node name="Ground" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, -3, 0) +mesh = SubResource("GroundMesh") +material_override = SubResource("GrassMaterial") + +[node name="Plaza" type="MeshInstance3D" parent="Visuals"] +position = Vector3(0, 0.011, 0) +mesh = SubResource("PlazaMesh") +material_override = SubResource("PlazaMaterial") + +[node name="WestBuilding" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-17, 2.5, 9) +mesh = SubResource("BuildingMesh") +material_override = SubResource("BuildingMaterial") + +[node name="WestRoof" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-17, 6.1, 9) +rotation_degrees = Vector3(0, 45, 0) +mesh = SubResource("RoofMesh") +material_override = SubResource("RoofMaterial") + +[node name="NorthBuilding" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-7, 2.5, 13) +mesh = SubResource("BuildingMesh") +material_override = SubResource("BuildingMaterial") + +[node name="NorthRoof" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-7, 6.1, 13) +rotation_degrees = Vector3(0, 45, 0) +mesh = SubResource("RoofMesh") +material_override = SubResource("RoofMaterial") + +[node name="WaterTower" type="MeshInstance3D" parent="Visuals"] +position = Vector3(18, 4, 11) +mesh = SubResource("TowerMesh") +material_override = SubResource("RoofMaterial") + +[node name="WaterTank" type="MeshInstance3D" parent="Visuals"] +position = Vector3(18, 8.5, 11) +mesh = SubResource("TowerTankMesh") +material_override = SubResource("LandmarkMaterial") + +[node name="PavilionRoof" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-12, 3.3, -10) +mesh = SubResource("PavilionRoofMesh") +material_override = SubResource("LandmarkMaterial") + +[node name="PavilionPostNW" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-15.5, 1.6, -12.5) +mesh = SubResource("PavilionPostMesh") +material_override = SubResource("RoofMaterial") + +[node name="PavilionPostSE" type="MeshInstance3D" parent="Visuals"] +position = Vector3(-8.5, 1.6, -7.5) +mesh = SubResource("PavilionPostMesh") +material_override = SubResource("RoofMaterial") + +[node name="VillageLabel" type="Label3D" parent="Visuals"] +position = Vector3(0, 3.2, 7) +text = "VILLAGE" +font_size = 42 +outline_size = 8 +billboard = 1 +no_depth_test = true + +[node name="StaticCollision" type="Node3D" parent="."] + +[node name="Ground" type="StaticBody3D" parent="StaticCollision"] + +[node name="CollisionShape3D" type="CollisionShape3D" parent="StaticCollision/Ground"] +position = Vector3(0, -3, 0) +shape = SubResource("GroundShape") + +[node name="WestBuilding" type="StaticBody3D" parent="StaticCollision"] + +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/WestBuilding"] +position = Vector3(-17, 2.5, 9) +shape = SubResource("BuildingShape") + +[node name="NorthBuilding" type="StaticBody3D" parent="StaticCollision"] + +[node name="Shape" type="CollisionShape3D" parent="StaticCollision/NorthBuilding"] +position = Vector3(-7, 2.5, 13) +shape = SubResource("BuildingShape") + +[node name="FishingWater" type="Node3D" parent="."] + +[node name="WaterRecovery" type="Node3D" parent="."] + +[node name="SafeRespawns" type="Node3D" parent="."] + +[node name="VillageCenter" type="Marker3D" parent="SafeRespawns"] +position = Vector3(0, 0.58, 2) +script = ExtResource("2_safe") + +[node name="VillageWest" type="Marker3D" parent="SafeRespawns"] +position = Vector3(-19, 0.58, -2) +rotation_degrees = Vector3(0, -90, 0) +script = ExtResource("2_safe") + +[node name="VillageSouth" type="Marker3D" parent="SafeRespawns"] +position = Vector3(5, 0.58, -14) +rotation_degrees = Vector3(0, 180, 0) +script = ExtResource("2_safe") + +[node name="Interactables" type="Node3D" parent="."] + +[node name="FishingShopWorld" parent="Interactables" instance=ExtResource("3_shop")] +position = Vector3(12, 0, 3) +rotation_degrees = Vector3(0, -25, 0) + +[node name="PelicanCoolerPerch" parent="Interactables" instance=ExtResource("4_pelican")] +position = Vector3(-19, 0, -9) +rotation_degrees = Vector3(0, 20, 0) diff --git a/world/test_world.gd b/world/test_world.gd index f72ac0c..fe484b3 100644 --- a/world/test_world.gd +++ b/world/test_world.gd @@ -5,23 +5,52 @@ const FishingShopInteractionType = preload( "res://world/fishing_shop_interaction.gd" ) -@onready var _water_trigger: PlayerWaterTrigger = %PlayerWaterTrigger -@onready var _safe_respawn_points: Node3D = %SafeRespawnPoints -@onready var _fishing_shop: FishingShopInteractionType = %FishingShopInteraction +@onready var _regions_root: Node3D = $Regions +@onready var _below_world_failsafe: PlayerWaterTrigger = ( + $Safety/BelowWorldFailsafe +) +@onready var _fishing_shop: FishingShopInteractionType = ( + $Regions/VillageRegion/Interactables/FishingShopWorld/FishingShopInteraction +) -func get_player_water_trigger() -> PlayerWaterTrigger: - return _water_trigger +func get_player_water_triggers() -> Array[PlayerWaterTrigger]: + var triggers: Array[PlayerWaterTrigger] = [] + for region: GrayboxRegion in _get_regions(): + triggers.append_array(region.get_water_recovery_triggers()) + triggers.append(_below_world_failsafe) + return triggers func get_safe_respawn_points() -> Array[SafeRespawnPoint]: var points: Array[SafeRespawnPoint] = [] - for child: Node in _safe_respawn_points.get_children(): - var point: SafeRespawnPoint = child as SafeRespawnPoint - if point != null: - points.append(point) + for region: GrayboxRegion in _get_regions(): + points.append_array(region.get_safe_respawn_points()) return points func get_fishing_shop() -> FishingShopInteractionType: return _fishing_shop + + +func get_fishable_water_regions() -> Array[FishableWaterRegion]: + var waters: Array[FishableWaterRegion] = [] + for region: GrayboxRegion in _get_regions(): + waters.append_array(region.get_fishable_water_regions()) + return waters + + +func get_pelican_convenience_landmark() -> Node3D: + return ( + $Regions/VillageRegion/Interactables/PelicanCoolerPerch + as Node3D + ) + + +func _get_regions() -> Array[GrayboxRegion]: + var regions: Array[GrayboxRegion] = [] + for child: Node in _regions_root.get_children(): + var region: GrayboxRegion = child as GrayboxRegion + if region != null: + regions.append(region) + return regions diff --git a/world/test_world.tscn b/world/test_world.tscn index df6e929..f600b92 100644 --- a/world/test_world.tscn +++ b/world/test_world.tscn @@ -1,204 +1,137 @@ -[gd_scene load_steps=25 format=3] +[gd_scene load_steps=16 format=3] -[ext_resource type="Script" path="res://world/fishable_water_region.gd" id="1_water_region"] -[ext_resource type="Resource" path="res://fish/pools/test_water_pool.tres" id="2_fish_pool"] -[ext_resource type="Script" path="res://world/test_world.gd" id="3_world"] -[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="4_water_trigger"] -[ext_resource type="Script" path="res://world/safe_respawn_point.gd" id="5_safe_point"] -[ext_resource type="Script" path="res://world/fishing_shop_interaction.gd" id="6_shop"] - -[sub_resource type="BoxShape3D" id="GroundShape"] -size = Vector3(30, 1, 30) - -[sub_resource type="BoxMesh" id="GroundMesh"] -size = Vector3(30, 1, 30) - -[sub_resource type="StandardMaterial3D" id="GroundMaterial"] -albedo_color = Color(0.25, 0.52, 0.24, 1) - -[sub_resource type="BoxShape3D" id="DockShape"] -size = Vector3(5, 0.5, 10) - -[sub_resource type="BoxMesh" id="DockMesh"] -size = Vector3(5, 0.5, 10) - -[sub_resource type="StandardMaterial3D" id="DockMaterial"] -albedo_color = Color(0.42, 0.25, 0.12, 1) - -[sub_resource type="PlaneMesh" id="WaterMesh"] -size = Vector2(40, 25) - -[sub_resource type="BoxShape3D" id="FishableWaterShape"] -size = Vector3(40, 0.16, 19.5) - -[sub_resource type="BoxShape3D" id="FishableShoreShape"] -size = Vector3(17.5, 0.16, 5.5) - -[sub_resource type="BoxShape3D" id="PlayerWaterShape"] -size = Vector3(40, 5, 19.5) - -[sub_resource type="BoxShape3D" id="PlayerWaterShoreShape"] -size = Vector3(17.5, 5, 5.5) - -[sub_resource type="StandardMaterial3D" id="WaterMaterial"] -transparency = 1 -albedo_color = Color(0.1, 0.45, 0.7, 0.72) -roughness = 0.25 +[ext_resource type="Script" path="res://world/test_world.gd" id="1_world"] +[ext_resource type="PackedScene" path="res://world/regions/village_region.tscn" id="2_village"] +[ext_resource type="PackedScene" path="res://world/regions/starter_pond_region.tscn" id="3_pond"] +[ext_resource type="PackedScene" path="res://world/regions/river_region.tscn" id="4_river"] +[ext_resource type="PackedScene" path="res://world/regions/lake_region.tscn" id="5_lake"] +[ext_resource type="PackedScene" path="res://world/regions/marsh_region.tscn" id="6_marsh"] +[ext_resource type="PackedScene" path="res://world/regions/coastal_dock_region.tscn" id="7_coast"] +[ext_resource type="Script" path="res://world/player_water_trigger.gd" id="8_water_trigger"] [sub_resource type="Environment" id="Environment"] background_mode = 1 -background_color = Color(0.48, 0.72, 0.9, 1) +background_color = Color(0.48, 0.74, 0.92, 1) ambient_light_source = 3 -ambient_light_color = Color(0.65, 0.72, 0.8, 1) -ambient_light_energy = 0.65 +ambient_light_color = Color(0.72, 0.78, 0.84, 1) +ambient_light_energy = 0.72 -[sub_resource type="BoxMesh" id="ShopCounterMesh"] -size = Vector3(3.4, 1.25, 1.5) +[sub_resource type="BoxShape3D" id="SeabedShape"] +size = Vector3(180, 1, 220) +[sub_resource type="BoxMesh" id="SeabedMesh"] +size = Vector3(180, 1, 220) +[sub_resource type="StandardMaterial3D" id="SeabedMaterial"] +albedo_color = Color(0.18, 0.36, 0.27, 1) -[sub_resource type="BoxMesh" id="ShopRoofMesh"] -size = Vector3(4.2, 0.35, 2.2) +[sub_resource type="BoxShape3D" id="RiverPathShape"] +size = Vector3(40, 6, 8) +[sub_resource type="BoxMesh" id="RiverPathMesh"] +size = Vector3(40, 6, 8) +[sub_resource type="BoxShape3D" id="MarshPathShape"] +size = Vector3(5, 6, 10) +[sub_resource type="BoxMesh" id="MarshPathMesh"] +size = Vector3(5, 6, 10) +[sub_resource type="StandardMaterial3D" id="PathMaterial"] +albedo_color = Color(0.72, 0.62, 0.43, 1) -[sub_resource type="BoxMesh" id="ShopPostMesh"] -size = Vector3(0.25, 2.8, 0.25) - -[sub_resource type="StandardMaterial3D" id="ShopPrimaryMaterial"] -albedo_color = Color(0.18, 0.72, 0.68, 1) - -[sub_resource type="StandardMaterial3D" id="ShopAccentMaterial"] -albedo_color = Color(1, 0.72, 0.22, 1) - -[sub_resource type="SphereShape3D" id="ShopInteractionShape"] -radius = 3.0 +[sub_resource type="BoxShape3D" id="NorthSouthBoundsShape"] +size = Vector3(180, 12, 2) +[sub_resource type="BoxShape3D" id="EastWestBoundsShape"] +size = Vector3(2, 12, 220) +[sub_resource type="BoxShape3D" id="FailsafeShape"] +size = Vector3(178, 5, 218) [node name="TestWorld" type="Node3D"] -script = ExtResource("3_world") +script = ExtResource("1_world") -[node name="WorldEnvironment" type="WorldEnvironment" parent="."] +[node name="Environment" type="Node3D" parent="."] + +[node name="WorldEnvironment" type="WorldEnvironment" parent="Environment"] environment = SubResource("Environment") -[node name="Sun" type="DirectionalLight3D" parent="."] -rotation_degrees = Vector3(-55, -35, 0) +[node name="Sun" type="DirectionalLight3D" parent="Environment"] +rotation_degrees = Vector3(-54, -32, 0) +light_energy = 1.1 shadow_enabled = true -[node name="Ground" type="StaticBody3D" parent="."] +[node name="SeabedBoundary" type="StaticBody3D" parent="."] +position = Vector3(0, -6.5, -38) -[node name="CollisionShape3D" type="CollisionShape3D" parent="Ground"] -shape = SubResource("GroundShape") +[node name="CollisionShape3D" type="CollisionShape3D" parent="SeabedBoundary"] +shape = SubResource("SeabedShape") -[node name="MeshInstance3D" type="MeshInstance3D" parent="Ground"] -mesh = SubResource("GroundMesh") -material_override = SubResource("GroundMaterial") +[node name="MeshInstance3D" type="MeshInstance3D" parent="SeabedBoundary"] +mesh = SubResource("SeabedMesh") +material_override = SubResource("SeabedMaterial") -[node name="Dock" type="StaticBody3D" parent="."] -position = Vector3(0, 0.75, -15) +[node name="Regions" type="Node3D" parent="."] -[node name="CollisionShape3D" type="CollisionShape3D" parent="Dock"] -shape = SubResource("DockShape") +[node name="VillageRegion" parent="Regions" instance=ExtResource("2_village")] +position = Vector3(0, 0, 15) -[node name="MeshInstance3D" type="MeshInstance3D" parent="Dock"] -mesh = SubResource("DockMesh") -material_override = SubResource("DockMaterial") +[node name="StarterPondRegion" parent="Regions" instance=ExtResource("3_pond")] +position = Vector3(-42, 0, 15) -[node name="Water" type="MeshInstance3D" parent="."] -position = Vector3(0, 0.2, -27) -mesh = SubResource("WaterMesh") -material_override = SubResource("WaterMaterial") +[node name="RiverRegion" parent="Regions" instance=ExtResource("4_river")] +position = Vector3(0, 0, -40) -[node name="FishableWater" type="Area3D" parent="."] -position = Vector3(0, 0.2, -29.75) -collision_layer = 4 -collision_mask = 0 -monitoring = false -script = ExtResource("1_water_region") -location_tags = Array[StringName]([&"test_lake"]) -fish_pool = ExtResource("2_fish_pool") +[node name="LakeRegion" parent="Regions" instance=ExtResource("5_lake")] +position = Vector3(53, 0, -25) -[node name="CollisionShape3D" type="CollisionShape3D" parent="FishableWater"] -shape = SubResource("FishableWaterShape") +[node name="MarshRegion" parent="Regions" instance=ExtResource("6_marsh")] +position = Vector3(56, 0, 38) -[node name="ShoreLeft" type="CollisionShape3D" parent="FishableWater"] -position = Vector3(-11.25, 0, 12.5) -shape = SubResource("FishableShoreShape") +[node name="CoastalDockRegion" parent="Regions" instance=ExtResource("7_coast")] +position = Vector3(0, 0, -103) -[node name="ShoreRight" type="CollisionShape3D" parent="FishableWater"] -position = Vector3(11.25, 0, 12.5) -shape = SubResource("FishableShoreShape") +[node name="Connectors" type="Node3D" parent="."] -[node name="PlayerWaterTrigger" type="Area3D" parent="."] -unique_name_in_owner = true -position = Vector3(0, -2.3, -29.75) +[node name="VillageRiverPath" type="StaticBody3D" parent="Connectors"] +position = Vector3(0, -3, -7) +[node name="Shape" type="CollisionShape3D" parent="Connectors/VillageRiverPath"] +shape = SubResource("RiverPathShape") +[node name="Mesh" type="MeshInstance3D" parent="Connectors/VillageRiverPath"] +mesh = SubResource("RiverPathMesh") +material_override = SubResource("PathMaterial") + +[node name="VillageMarshPath" type="StaticBody3D" parent="Connectors"] +position = Vector3(26.5, -3, 28) +[node name="Shape" type="CollisionShape3D" parent="Connectors/VillageMarshPath"] +shape = SubResource("MarshPathShape") +[node name="Mesh" type="MeshInstance3D" parent="Connectors/VillageMarshPath"] +mesh = SubResource("MarshPathMesh") +material_override = SubResource("PathMaterial") + +[node name="Safety" type="Node3D" parent="."] + +[node name="BelowWorldFailsafe" type="Area3D" parent="Safety"] +position = Vector3(0, -5, -38) collision_layer = 8 collision_mask = 2 -script = ExtResource("4_water_trigger") +script = ExtResource("8_water_trigger") surface_height = 0.2 -[node name="DeepWater" type="CollisionShape3D" parent="PlayerWaterTrigger"] -shape = SubResource("PlayerWaterShape") +[node name="FailsafeShape" type="CollisionShape3D" parent="Safety/BelowWorldFailsafe"] +shape = SubResource("FailsafeShape") -[node name="ShoreLeft" type="CollisionShape3D" parent="PlayerWaterTrigger"] -position = Vector3(-11.25, 0, 12.5) -shape = SubResource("PlayerWaterShoreShape") +[node name="WorldBounds" type="Node3D" parent="."] -[node name="ShoreRight" type="CollisionShape3D" parent="PlayerWaterTrigger"] -position = Vector3(11.25, 0, 12.5) -shape = SubResource("PlayerWaterShoreShape") +[node name="North" type="StaticBody3D" parent="WorldBounds"] +position = Vector3(0, 5, 72) +[node name="Shape" type="CollisionShape3D" parent="WorldBounds/North"] +shape = SubResource("NorthSouthBoundsShape") -[node name="SafeRespawnPoints" type="Node3D" parent="."] -unique_name_in_owner = true +[node name="South" type="StaticBody3D" parent="WorldBounds"] +position = Vector3(0, 5, -148) +[node name="Shape" type="CollisionShape3D" parent="WorldBounds/South"] +shape = SubResource("NorthSouthBoundsShape") -[node name="DockApproach" type="Marker3D" parent="SafeRespawnPoints"] -position = Vector3(0, 0.58, -9) -script = ExtResource("5_safe_point") +[node name="West" type="StaticBody3D" parent="WorldBounds"] +position = Vector3(-90, 5, -38) +[node name="Shape" type="CollisionShape3D" parent="WorldBounds/West"] +shape = SubResource("EastWestBoundsShape") -[node name="WestShore" type="Marker3D" parent="SafeRespawnPoints"] -position = Vector3(-11.5, 0.58, -11.5) -script = ExtResource("5_safe_point") - -[node name="EastShore" type="Marker3D" parent="SafeRespawnPoints"] -position = Vector3(11.5, 0.58, -11.5) -script = ExtResource("5_safe_point") - -[node name="DockEnd" type="Marker3D" parent="SafeRespawnPoints"] -position = Vector3(0, 1.08, -17) -script = ExtResource("5_safe_point") - -[node name="FishingShop" type="Node3D" parent="."] -position = Vector3(8, 0, 5) - -[node name="Counter" type="MeshInstance3D" parent="FishingShop"] -position = Vector3(0, 0.625, 0) -mesh = SubResource("ShopCounterMesh") -material_override = SubResource("ShopPrimaryMaterial") - -[node name="Roof" type="MeshInstance3D" parent="FishingShop"] -position = Vector3(0, 2.25, 0) -mesh = SubResource("ShopRoofMesh") -material_override = SubResource("ShopAccentMaterial") - -[node name="WestPost" type="MeshInstance3D" parent="FishingShop"] -position = Vector3(-1.55, 1.4, 0.55) -mesh = SubResource("ShopPostMesh") -material_override = SubResource("ShopPrimaryMaterial") - -[node name="EastPost" type="MeshInstance3D" parent="FishingShop"] -position = Vector3(1.55, 1.4, 0.55) -mesh = SubResource("ShopPostMesh") -material_override = SubResource("ShopPrimaryMaterial") - -[node name="ShopName" type="Label3D" parent="FishingShop"] -position = Vector3(0, 2.7, 0) -text = "Fishing Shop" -font_size = 36 -outline_size = 8 -billboard = 1 -no_depth_test = true - -[node name="FishingShopInteraction" type="Area3D" parent="FishingShop"] -unique_name_in_owner = true -position = Vector3(0, 1, 0) -collision_layer = 0 -collision_mask = 2 -script = ExtResource("6_shop") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="FishingShop/FishingShopInteraction"] -shape = SubResource("ShopInteractionShape") +[node name="East" type="StaticBody3D" parent="WorldBounds"] +position = Vector3(90, 5, -38) +[node name="Shape" type="CollisionShape3D" parent="WorldBounds/East"] +shape = SubResource("EastWestBoundsShape") diff --git a/world/water_recovery_controller.gd b/world/water_recovery_controller.gd index 7a137b7..1333b6d 100644 --- a/world/water_recovery_controller.gd +++ b/world/water_recovery_controller.gd @@ -21,11 +21,12 @@ var _player: Player var _fishing_spot: FishingSpot var _game_ui: GameUI var _screen_fade: ScreenFade -var _water_trigger: PlayerWaterTrigger +var _water_triggers: Array[PlayerWaterTrigger] = [] var _safe_points: Array[SafeRespawnPoint] = [] var _initial_spawn_transform: Transform3D var _entry_position: Vector3 var _bob_base_position: Vector3 +var _recovery_root_basis: Basis var _bob_elapsed: float = 0.0 var _prior_movement_enabled: bool = true var _prior_camera_input_enabled: bool = true @@ -38,20 +39,26 @@ func setup( fishing_spot: FishingSpot, game_ui: GameUI, screen_fade: ScreenFade, - water_trigger: PlayerWaterTrigger, + water_triggers: Array[PlayerWaterTrigger], safe_points: Array[SafeRespawnPoint], ) -> void: _player = player _fishing_spot = fishing_spot _game_ui = game_ui _screen_fade = screen_fade - _water_trigger = water_trigger + _water_triggers = water_triggers _safe_points = safe_points _initial_spawn_transform = player.global_transform - if not _water_trigger.recovery_requested.is_connected( - _on_recovery_requested - ): - _water_trigger.recovery_requested.connect(_on_recovery_requested) + for water_trigger: PlayerWaterTrigger in _water_triggers: + if ( + water_trigger != null + and not water_trigger.recovery_requested.is_connected( + _on_recovery_requested + ) + ): + water_trigger.recovery_requested.connect( + _on_recovery_requested + ) if not _screen_fade.transition_completed.is_connected( _on_fade_transition_completed ): @@ -84,6 +91,7 @@ func _exit_tree() -> void: if _screen_fade != null and is_instance_valid(_screen_fade): _screen_fade.reset_immediately() if _player != null and is_instance_valid(_player): + _player.restore_gameplay_orientation_after_recovery() _player.set_water_recovery_active(false) _player.set_movement_enabled(_prior_movement_enabled) _player.set_camera_input_enabled(_prior_camera_input_enabled) @@ -105,7 +113,9 @@ func _on_recovery_requested( recovery_starting.emit() _generation += 1 _entry_position = _player.global_position + _recovery_root_basis = _player.global_basis _fishing_spot.begin_water_recovery() + _player.prepare_for_water_recovery() _prior_movement_enabled = _player.is_movement_enabled() _prior_camera_input_enabled = _player.is_camera_input_enabled() _player.set_movement_enabled(false) @@ -137,7 +147,7 @@ func _on_fade_transition_completed( func _respawn_player() -> void: - var target_transform: Transform3D = _initial_spawn_transform + var target_position: Vector3 = _initial_spawn_transform.origin var nearest_distance: float = INF for point: SafeRespawnPoint in _safe_points: if point == null or not is_instance_valid(point) or not point.enabled: @@ -147,13 +157,18 @@ func _respawn_player() -> void: ) if distance < nearest_distance: nearest_distance = distance - target_transform = point.global_transform - target_transform.origin.y += respawn_height_offset - _player.global_transform = target_transform + target_position = point.global_position + target_position.y += respawn_height_offset + var respawn_transform: Transform3D = _player.global_transform + respawn_transform.basis = _recovery_root_basis + respawn_transform.origin = target_position + _player.global_transform = respawn_transform + _player.restore_gameplay_orientation_after_recovery() _player.velocity = Vector3.ZERO func _finish_recovery() -> void: + _player.restore_gameplay_orientation_after_recovery() _player.set_water_recovery_active(false) _player.set_movement_enabled(_prior_movement_enabled) _player.set_camera_input_enabled(_prior_camera_input_enabled)