diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset index 6cc7cf7..ec1b7b5 100644 --- a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset +++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset @@ -14,6 +14,5 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.BlinkAbilityDefinition DisplayName: Blink Description: Enemies occasionally teleport a short distance ahead. - IntervalSeconds: 4 - BlinkWaypoints: 2 - StartJitterSeconds: 1.5 + IntervalSeconds: 8 + BlinkDistanceMeters: 4 diff --git a/Assets/_Project/Levels/LevelAuthoring.cs b/Assets/_Project/Levels/LevelAuthoring.cs index 792cc5d..5bd8ba5 100644 --- a/Assets/_Project/Levels/LevelAuthoring.cs +++ b/Assets/_Project/Levels/LevelAuthoring.cs @@ -51,16 +51,6 @@ namespace TD.Levels [Tooltip("Optional author/credit text. Empty triggers a soft warning at bake time.")] public string author = ""; - [Header("Rules")] - [Tooltip("OwnerOnly: players can only build inside their own PlayerZoneVolume — the classic " + - "one-maze-each layout.\n\n" + - "Shared: any player can build on any Buildable tile, so the whole map is one " + - "cooperative maze. Zones still define territory for leak attribution, camera " + - "start, builder spawn and minimap tinting — only the build restriction lifts.\n\n" + - "Towers always belong to whoever paid for them; sell and upgrade stay owner-gated " + - "under both modes.")] - public BuildAccess buildAccess = BuildAccess.OwnerOnly; - // ------------------------------------------------------------------- // Gizmo visibility toggles. Each volume type reads its own toggle to decide whether to // draw always-on or only-when-selected. diff --git a/Assets/_Project/Levels/LevelData.cs b/Assets/_Project/Levels/LevelData.cs index 288b056..faba95b 100644 --- a/Assets/_Project/Levels/LevelData.cs +++ b/Assets/_Project/Levels/LevelData.cs @@ -63,17 +63,6 @@ namespace TD.Levels public BakeOutcome LastBakeOutcome; public int LastBakeWarningCount; - // ------------------------------------------------------------------- - // Match rules. - // ------------------------------------------------------------------- - - [Header("Rules")] - [Tooltip("Whether players are restricted to building in their own zone (OwnerOnly) or can " + - "build anywhere on the map's buildable area (Shared). Affects placement permission " + - "only — OwnerGrid still drives leak attribution, camera start, builder spawn and " + - "minimap tinting under both modes.")] - public BuildAccess BuildAccess; - // ------------------------------------------------------------------- // Grid metadata. // ------------------------------------------------------------------- diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab index d912bec..4f54da4 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab @@ -53,7 +53,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} m_Name: m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3037368120 + GlobalObjectIdHash: 3715663997 InScenePlacedSourceGlobalObjectIdHash: 0 DeferredDespawnTick: 0 Ownership: 1 @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: edc686813aef43743bb15d356b511dff, type: 2} deathAnimator: {fileID: 8642767442976997525} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab index bd7ac68..fb8210c 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: fe31ccfc7a429b24fb8f57279ba96c95, type: 2} deathAnimator: {fileID: 7317567842465160949} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab index d721ee2..e11218f 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab @@ -126,7 +126,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 21c69bd4b2c55cd4fa9cd9b551c6e3fe, type: 2} deathAnimator: {fileID: 6910253555362952583} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab index 89ac836..d943a11 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 52d9af0c680bca64a86d66fce2a73668, type: 2} deathAnimator: {fileID: 5079596453572633521} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab index f5ace60..06a8723 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 4b981d8b44098894197507508f655072, type: 2} deathAnimator: {fileID: 162562342023078655} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab index 60b1291..829e743 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: bed87a08deeb7e048ba06c8268b0f959, type: 2} deathAnimator: {fileID: 6938810086909213800} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab index 2ab5755..b37096d 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 77f4545654c5b7b41b2760a580da6068, type: 2} deathAnimator: {fileID: 2830498994423139172} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab index bca0e4a..063f5d2 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 097d7ba78591cd443a06d637e0822a46, type: 2} deathAnimator: {fileID: 471366370285235598} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab index ef51e96..7994b3a 100644 --- a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab +++ b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab @@ -125,7 +125,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyHealth ShowTopMostFoldoutHeaderGroup: 1 - definition: {fileID: 0} + definition: {fileID: 11400000, guid: 1d9809612c00ed049848a955613a4619, type: 2} deathAnimator: {fileID: 3345626123719039665} deathAnimationDuration: 1.5 sinkDuration: 1.5 diff --git a/Assets/_Project/Prefabs/MatchCore.meta b/Assets/_Project/Prefabs/MatchCore.meta deleted file mode 100644 index 3efebf9..0000000 --- a/Assets/_Project/Prefabs/MatchCore.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: cf34e1b2cedcd9a4fa7f938f8f0bf3c2 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab b/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab deleted file mode 100644 index e8eb442..0000000 --- a/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab +++ /dev/null @@ -1,483 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &1348868032911320215 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2098889495380348335} - - component: {fileID: 8734966915826773517} - - component: {fileID: 6131651964009722688} - m_Layer: 0 - m_Name: TowerPlacementManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2098889495380348335 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348868032911320215} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8734966915826773517 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348868032911320215} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3734927306 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &6131651964009722688 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1348868032911320215} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d369496ba7887b844b1c220b524a507d, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.TowerPlacementManager - ShowTopMostFoldoutHeaderGroup: 1 - requestsPerFrame: 3 - towerDefinitions: - - {fileID: 0} - - {fileID: 11400000, guid: d5b2e8fa3c7e9b5f4a1d0c2e7f6b3a91, type: 2} - - {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} - - {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2} - - {fileID: 11400000, guid: 04219895bbea4fb9a94fd62fef35bf2a, type: 2} - - {fileID: 11400000, guid: e3f1a9c2b5d84e76a0c3f1e8d27b4905, type: 2} - startingDeck: - - {fileID: 11400000, guid: d5b2e8fa3c7e9b5f4a1d0c2e7f6b3a91, type: 2} - - {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} ---- !u!1 &5626802001211498962 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3648445760525794609} - - component: {fileID: 4563436515829454556} - - component: {fileID: 8936124320851695101} - m_Layer: 0 - m_Name: WaveManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3648445760525794609 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5626802001211498962} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4563436515829454556 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5626802001211498962} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3957247190 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &8936124320851695101 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5626802001211498962} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 81d8e215d8419404ea4d959196cd9cc3, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveManager - ShowTopMostFoldoutHeaderGroup: 1 - startingLives: 40 - draftTimeSeconds: 30 - voteTimeSeconds: 25 - goldConfig: {fileID: 11400000, guid: d5e01c919f14a1e4888ad494a159241b, type: 2} - enemyScalingConfig: {fileID: 11400000, guid: ae9fde0b564e20440ac2e20861fa1ca6, type: 2} ---- !u!1 &6226139915412633039 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8547990667945757531} - - component: {fileID: 4703036714451320211} - - component: {fileID: 2895480021437825520} - m_Layer: 0 - m_Name: MatchState - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &8547990667945757531 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6226139915412633039} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &4703036714451320211 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6226139915412633039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1618207171 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &2895480021437825520 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6226139915412633039} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a34585be59d49e94b811d96be51c5088, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.MatchState - ShowTopMostFoldoutHeaderGroup: 1 ---- !u!1 &8213601217886697539 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1789974153803072425} - - component: {fileID: 5759999417597858157} - - component: {fileID: 8805989965283647635} - m_Layer: 0 - m_Name: RunState - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1789974153803072425 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8213601217886697539} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5759999417597858157 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8213601217886697539} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3660389945 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &8805989965283647635 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8213601217886697539} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a293cf6dca91dd2478c9f4e799cf9e0d, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.RunState - ShowTopMostFoldoutHeaderGroup: 1 - runDefinition: {fileID: 11400000, guid: 1bb81a966192c344d94cce2628c1832b, type: 2} ---- !u!1 &8429081419068942390 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5251454257324784754} - m_Layer: 0 - m_Name: MatchNetwork - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5251454257324784754 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 8429081419068942390} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2182889149551291466} - - {fileID: 8547990667945757531} - - {fileID: 1789974153803072425} - - {fileID: 2098889495380348335} - - {fileID: 3648445760525794609} - - {fileID: 2625678984567986094} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &9094815948999422851 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2182889149551291466} - - component: {fileID: 8307773927879075679} - - component: {fileID: 3604854611554599773} - m_Layer: 0 - m_Name: ChatService - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2182889149551291466 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9094815948999422851} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8307773927879075679 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9094815948999422851} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1681065116 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &3604854611554599773 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9094815948999422851} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 816890bb20c416b419e38d3d4b91ffca, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.ChatService - ShowTopMostFoldoutHeaderGroup: 1 ---- !u!1 &9150709944481815107 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2625678984567986094} - - component: {fileID: 1287556557852043940} - - component: {fileID: 4386956365137913543} - m_Layer: 0 - m_Name: WaveVote - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2625678984567986094 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9150709944481815107} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 5251454257324784754} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1287556557852043940 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9150709944481815107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3520766009 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &4386956365137913543 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 9150709944481815107} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a18321dc2d138034fbdb5f705f19f893, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.WaveVote - ShowTopMostFoldoutHeaderGroup: 1 - optionsPerVote: 3 diff --git a/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab.meta b/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab.meta deleted file mode 100644 index 707a454..0000000 --- a/Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 7116de1968afffb4990ee24f709612fb -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab b/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab deleted file mode 100644 index edfdc8b..0000000 --- a/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab +++ /dev/null @@ -1,921 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1 &216401704418653358 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2369632775351055227} - - component: {fileID: 5469845921758518005} - - component: {fileID: 1431563384465486267} - m_Layer: 0 - m_Name: HUD - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2369632775351055227 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 216401704418653358} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3833381251955063088} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5469845921758518005 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 216401704418653358} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.UIDocument - m_PanelSettings: {fileID: 11400000, guid: 6aa0af71585acea4db4995c3931dc946, type: 2} - m_ParentUI: {fileID: 0} - sourceAsset: {fileID: 9197481963319205126, guid: eba711c1def2b194584102ceb5517c48, type: 3} - m_SortingOrder: 0 - m_Position: 0 - m_WorldSpaceSizeMode: 1 - m_WorldSpaceWidth: 1920 - m_WorldSpaceHeight: 1080 - m_PivotReferenceSize: 0 - m_Pivot: 0 - m_WorldSpaceCollider: {fileID: 0} ---- !u!114 &1431563384465486267 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 216401704418653358} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1c69cd177f09f0c419288f73b49df886, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.UI.HUDController - placementController: {fileID: 7706260725108150093} - paintController: {fileID: 559798155559411408} - placementManager: {fileID: 0} - cameraController: {fileID: 5042310339586537117} - rejectionMessageDuration: 2.5 - menuButtonIcon: {fileID: 0} - chatMaxHeight: 280 - chatMaxMessages: 2147483647 - chatSystemColor: {r: 1, g: 0.7, b: 0.2, a: 1} - chatPlayerColor: {r: 0.92, g: 0.92, b: 0.92, a: 1} ---- !u!1 &1445952844252628864 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 3833381251955063088} - - component: {fileID: 6850685008819507485} - - component: {fileID: 3524271020287320838} - - component: {fileID: 6600478213912852129} - - component: {fileID: 191939159250915621} - - component: {fileID: 7706260725108150093} - - component: {fileID: 559798155559411408} - - component: {fileID: 1988948222073846279} - - component: {fileID: 2077830364583566817} - - component: {fileID: 8797807118405570736} - - component: {fileID: 3273128039403554245} - - component: {fileID: 1661838386639436151} - - component: {fileID: 8864891455444378183} - - component: {fileID: 7594921744928559756} - - component: {fileID: 1678455881203478607} - - component: {fileID: 8637796564860235120} - - component: {fileID: 4396752746502665908} - - component: {fileID: 9162204174128098398} - - component: {fileID: 4044629536480845444} - - component: {fileID: 1951038390230828916} - m_Layer: 0 - m_Name: MatchServices - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &3833381251955063088 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2369632775351055227} - - {fileID: 2545698982756849348} - - {fileID: 9174177271844320236} - - {fileID: 7648787753941018277} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &6850685008819507485 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a303b690faebb0e4e930d1714afa424e, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.LevelLoader - level: {fileID: 0} - buildablePlaneLayerName: BuildablePlane - drawGridBounds: 1 - drawWalkability: 1 - drawBuildablePlane: 1 - drawOwnerBorders: 1 ---- !u!114 &3524271020287320838 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: de7d013503af0f74c950f215f8dae1c0, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PathfindingService - recomputeBudgetMs: 1.5 ---- !u!114 &6600478213912852129 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc307e7e94967894584e8e6050fc38cf, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.SelectionState ---- !u!114 &191939159250915621 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e28d10549c8d2ac4585eded3ad8d2198, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.SelectionVisualizer - selectionRingPrefab: {fileID: 8648063358813763958, guid: 74757e379bac0e444aabab5e388e17c6, type: 3} - yOffset: 0.02 - projectionLayerMask: - serializedVersion: 2 - m_Bits: 960 ---- !u!114 &7706260725108150093 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 124253f2cbc2d9f46befb6e1763cd6b9, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.TowerPlacementController - settings: {fileID: 11400000, guid: 18f99b4b94d13eb429d4dfb9b0b37b4b, type: 2} - buildablePlaneLayerMask: - serializedVersion: 2 - m_Bits: 64 - raycastMaxDistance: 500 ---- !u!114 &559798155559411408 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6b81770471b644b3aa0e58d4a108dddd, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.TowerPaintController - raycastMaxDistance: 500 - cursorSize: 28 ---- !u!114 &1988948222073846279 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: cc99a2b3d3e8d8178a74e1d68a34553c, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpellCastController - groundLayerMask: - serializedVersion: 2 - m_Bits: 128 - raycastMaxDistance: 500 - aimDecal: {fileID: 0} - pointReticleDiameter: 1.5 - projectionDepth: 50 ---- !u!114 &2077830364583566817 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a31401869def6d64c87e645f1da1aa2a, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.UI.FloatingTextSpawner - prefab: {fileID: 4844901775730304629, guid: e5002bdc91043d24994f0b1cb578de56, type: 3} - goldColor: {r: 1, g: 0.84, b: 0.2, a: 1} - livesColor: {r: 0.95, g: 0.25, b: 0.25, a: 1} - verticalOffset: 2 - positionJitter: 0.4 - verticalJitter: 0.2 ---- !u!114 &8797807118405570736 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2708c6bac8136f45b48c899d3d40630, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.VFX.SellEffectSpawner - coinBurstPrefab: {fileID: 2313150535691989867, guid: 31f8d8c320b42c54d886d610fb13a1e7, type: 3} - sellSound: - clip: {fileID: 8300000, guid: 778b3d5981f4c3045a475794435f43cc, type: 3} - volume: 1 - minPitch: 0.95 - maxPitch: 1.05 - verticalOffset: 0.75 ---- !u!114 &3273128039403554245 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9ec21c01769ef58d1ac26ba89668eeaa, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Audio.AudioManager - categories: - - category: 0 - maxVoices: 6 - volume: 0.5 - - category: 1 - maxVoices: 4 - volume: 0.5 - - category: 2 - maxVoices: 4 - volume: 0.5 ---- !u!82 &1661838386639436151 -AudioSource: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 0} - m_Resource: {fileID: 0} - m_PlayOnAwake: 1 - m_Volume: 1 - m_Pitch: 1 - Loop: 0 - Mute: 0 - Spatialize: 0 - SpatializePostEffects: 0 - Priority: 128 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!114 &8864891455444378183 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 292ad37b9e4d1d7c28e59cf4dc1e99fa, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Audio.MusicPlayer - clip: {fileID: 8300000, guid: d4626563ad3c90179b247207e7b9f0be, type: 3} - volume: 0.632 ---- !u!114 &7594921744928559756 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6226c6e672c5b358a9cdc2a1bee47daf, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderEffects.BuilderEffectPool - effects: - - {fileID: 11400000, guid: 419fac0976a3e0a20827beff81826161, type: 2} ---- !u!114 &1678455881203478607 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 36a7be1b3824682b8a183fbcf8564652, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.BuilderSpells.BuilderSpellPool - spells: - - {fileID: 11400000, guid: 051c48f416e5366b59d49b0e062333ac, type: 2} - - {fileID: 11400000, guid: d893f46b037536b4ba91307e184cecfe, type: 2} - - {fileID: 11400000, guid: 364edf6abc3c31e33b53d0a01142b8ab, type: 2} ---- !u!114 &8637796564860235120 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4409eb25a8be555de8dc3a73d4ed95db, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.EnemyAbilityPool - abilities: - - {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2} - - {fileID: 11400000, guid: 030f10c9a264e544ea3e0f4fdb4171bd, type: 2} - - {fileID: 11400000, guid: cb2ec6bb70f57d0429b99b7cd4c7db73, type: 2} - - {fileID: 11400000, guid: a18691a20d75f17479a83b3e171759e7, type: 2} - - {fileID: 11400000, guid: c64c7121b0456bb4a873acec9e0abf91, type: 2} ---- !u!114 &4396752746502665908 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: c4d98a01d9b9a7b438a6f91b0b7f498f, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.EnemyUpgradePool - options: - - {fileID: 11400000, guid: eef28ca7b8844504e9d75ff903a3bb61, type: 2} - - {fileID: 11400000, guid: 46e2a6a59c0a3034f9fa44681d9ba422, type: 2} - - {fileID: 11400000, guid: 80fb851b702ff304183cb6e89c4aa245, type: 2} - - {fileID: 11400000, guid: a67aa3644d2ad4847a47040f53fea26f, type: 2} - - {fileID: 11400000, guid: 37d761966a349ba4cb4141f913224d5c, type: 2} - - {fileID: 11400000, guid: f6bfb033a15b6d0419587b80a8286bd1, type: 2} ---- !u!114 &9162204174128098398 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5a7e1f3c9d2b4867a1c0e4f8b3d6792a, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.DraftPool - options: - - {fileID: 11400000, guid: 6b1d3f8a2c5e4097b8a1d0c3e6f9b240, type: 2} - - {fileID: 11400000, guid: f4a2b8d1c6e93f05a7b2d4c8e1f6a930, type: 2} - - {fileID: 11400000, guid: 0b9f4905752751f44b9959b84b620266, type: 2} - - {fileID: 11400000, guid: 65ff25c1c8a89f7df8e88f71968c1c98, type: 2} - - {fileID: 11400000, guid: 5f390de69ba43b2a6a0d89cf09580320, type: 2} - - {fileID: 11400000, guid: 29b35841f7e5db454903798cb5d83434, type: 2} - - {fileID: 11400000, guid: d180030b68a9a5e1da497bf6f83451d4, type: 2} ---- !u!114 &4044629536480845444 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9d3a7c5e1b8f42606a2d4e9f1c7b3850, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.DraftService - optionsPerDraft: 3 - rerollCost: 50 ---- !u!114 &1951038390230828916 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1445952844252628864} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 468de2ce61e73ce4595ba4792874b076, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DevWaveControls - hotkey: 94 - grantTowerHotkey: 101 - skipToBossHotkey: 100 ---- !u!1 &2434986514412567376 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 9174177271844320236} - - component: {fileID: 5042310339586537117} - m_Layer: 0 - m_Name: CameraRig - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &9174177271844320236 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2434986514412567376} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 7042465335914098461} - m_Father: {fileID: 3833381251955063088} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &5042310339586537117 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2434986514412567376} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1e670a36689801e428873c5712ea3679, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.CameraController - cameraChild: {fileID: 5566698628747533439} - basePanSpeed: 12 - edgePanMarginPixels: 16 - edgePanEnabled: 1 - minDollyDistance: 5 - maxDollyDistance: 50 - startDollyDistance: 25 - zoomSpeed: 3 - cursorAnchoredZoom: 1 - minPitchDegrees: 30 - maxPitchDegrees: 75 - startPitchDegrees: 50 - pitchSpeed: 4 ---- !u!1 &2936049029850371745 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7042465335914098461} - - component: {fileID: 5566698628747533439} - - component: {fileID: 9062733689301865828} - - component: {fileID: 7984992879034746998} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7042465335914098461 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2936049029850371745} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 9174177271844320236} - m_LocalEulerAnglesHint: {x: 45, y: -90, z: 0} ---- !u!20 &5566698628747533439 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2936049029850371745} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!81 &9062733689301865828 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2936049029850371745} - m_Enabled: 1 ---- !u!114 &7984992879034746998 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2936049029850371745} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_RenderShadows: 1 - m_RequiresDepthTextureOption: 2 - m_RequiresOpaqueTextureOption: 2 - m_CameraType: 0 - m_Cameras: [] - m_RendererIndex: -1 - m_VolumeLayerMask: - serializedVersion: 2 - m_Bits: 1 - m_VolumeTrigger: {fileID: 0} - m_VolumeFrameworkUpdateModeOption: 2 - m_RenderPostProcessing: 1 - m_Antialiasing: 0 - m_AntialiasingQuality: 2 - m_StopNaN: 0 - m_Dithering: 0 - m_ClearDepth: 1 - m_AllowXRRendering: 1 - m_AllowHDROutput: 1 - m_UseScreenCoordOverride: 0 - m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} - m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} - m_RequiresDepthTexture: 0 - m_RequiresColorTexture: 0 - m_TaaSettings: - m_Quality: 3 - m_FrameInfluence: 0.1 - m_JitterScale: 1 - m_MipBias: 0 - m_VarianceClampScale: 0.9 - m_ContrastAdaptiveSharpening: 0 - m_Version: 2 ---- !u!1 &3584612494616813666 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2545698982756849348} - - component: {fileID: 9037991996416952042} - - component: {fileID: 6848311735055501230} - m_Layer: 0 - m_Name: DebugConsole - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2545698982756849348 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3584612494616813666} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -52.51635, y: 0, z: -27.6311} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3833381251955063088} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &9037991996416952042 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3584612494616813666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} - m_Name: - m_EditorClassIdentifier: UnityEngine.dll::UnityEngine.UIElements.UIDocument - m_PanelSettings: {fileID: 11400000, guid: 6aa0af71585acea4db4995c3931dc946, type: 2} - m_ParentUI: {fileID: 0} - sourceAsset: {fileID: 0} - m_SortingOrder: 1 - m_Position: 0 - m_WorldSpaceSizeMode: 1 - m_WorldSpaceWidth: 1920 - m_WorldSpaceHeight: 1080 - m_PivotReferenceSize: 0 - m_Pivot: 0 - m_WorldSpaceCollider: {fileID: 0} ---- !u!114 &6848311735055501230 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3584612494616813666} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7c6a808e8291552d0b64e36a210879c4, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DebugConsole - toggleKey: 4 ---- !u!1 &5697898299420166755 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7648787753941018277} - - component: {fileID: 4271007794402033964} - - component: {fileID: 1710569614611447900} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7648787753941018277 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5697898299420166755} - serializedVersion: 2 - m_LocalRotation: {x: 0.0000014901161, y: 0.9063078, z: -0.42261824, w: 0.00000295043} - m_LocalPosition: {x: -17, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 3833381251955063088} - m_LocalEulerAnglesHint: {x: 50, y: 180, z: 0} ---- !u!108 &4271007794402033964 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5697898299420166755} - m_Enabled: 1 - serializedVersion: 13 - m_Type: 1 - m_Color: {r: 0.8156863, g: 0.9098039, b: 1, a: 1} - m_Intensity: 0.65 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize2D: {x: 10, y: 10} - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 7191 - m_UseColorTemperature: 1 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ForceVisible: 0 - m_ShapeRadius: 0 - m_ShadowAngle: 0 - m_LightUnit: 1 - m_LuxAtDistance: 1 - m_EnableSpotReflector: 1 ---- !u!114 &1710569614611447900 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5697898299420166755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UsePipelineSettings: 1 - m_AdditionalLightsShadowResolutionTier: 2 - m_CustomShadowLayers: 0 - m_LightCookieSize: {x: 1, y: 1} - m_LightCookieOffset: {x: 0, y: 0} - m_SoftShadowQuality: 1 - m_RenderingLayersMask: - serializedVersion: 0 - m_Bits: 1 - m_ShadowRenderingLayersMask: - serializedVersion: 0 - m_Bits: 1 - m_Version: 4 - m_LightLayerMask: 1 - m_ShadowLayerMask: 1 - m_RenderingLayers: 1 - m_ShadowRenderingLayers: 1 diff --git a/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab.meta b/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab.meta deleted file mode 100644 index 0ec6795..0000000 --- a/Assets/_Project/Prefabs/MatchCore/MatchServices.prefab.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 13be8328f6275e14da787f25c94683ee -PrefabImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/3Player.asset b/Assets/_Project/Scenes/Levels/3Player.asset deleted file mode 100644 index e991500..0000000 --- a/Assets/_Project/Scenes/Levels/3Player.asset +++ /dev/null @@ -1,327 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6d4e9c37b9205f3408a8225823f7a4da, type: 3} - m_Name: 3Player - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.LevelData - MapName: 3Player - PlayerCount: 3 - MapDescription: 3 Player new design map - Author: BigBoysFellowship - MapThumbnail: {fileID: 21300000, guid: 7e33bd8556d93f04eb4f5c38006a7880, type: 3} - ScenePath: Assets/_Project/Scenes/Levels/3Player.unity - AuthoringHash: bb69927c7e56c27f8073227f6af654d08b2b8a72ed8439ac4fb5392cb4132b67 - LastBakeTimestamp: 2026-08-05T05:39:40.7353238Z - LastBakeOutcome: 1 - LastBakeWarningCount: 3 - BuildAccess: 1 - GridOriginTile: {x: 0, y: 0} - GridSize: {x: 100, y: 100} - PlacementGrid: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020202020202020202020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020202020202020202020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010202020202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000002020202020101010101010101010101010101010101010101010101010101010101010101010101010101010102020202020202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101020202020202020202020101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010202020202020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101000000000002020202020101010101010101010101010101010101010101010101010101010101010101010101010101010102020202020202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101020202020202020202020101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010202020202020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101000000000002020202020101010101010101010101010101010101010101010101010101010101010101010101010101010102020202020202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101020202020202020202020101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010202020202020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101000000000002020202020101010101010101010101010101010101010101010101010101010101010101010101010101010102020202020202020202010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101020202020202020201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020202020202020202020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000202020202020202020200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002020202020202020202000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - WalkabilityGrid: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101010101010101010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010101010101010101000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - OwnerGrid: 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010000000000000000000001010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010100000000000000000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000002020202020202020202020202020202020202020202020202020202020202020202020202020202000000000000000000000202020202020202020202020202020202020202020202020202020202020202020202020202020200000000000000000000020202020202020202020202020202020202020202020202020202020202020202020202020202020000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303000000000000000000000303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - MapAreaGrid: 01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101 - PlayerZones: - - Owner: 1 - Spawners: - - SpawnerIdInZone: 0 - TilePosition: {x: 50, y: 3} - TileArea: - - {x: 45, y: 0} - - {x: 46, y: 0} - - {x: 47, y: 0} - - {x: 48, y: 0} - - {x: 49, y: 0} - - {x: 50, y: 0} - - {x: 51, y: 0} - - {x: 52, y: 0} - - {x: 53, y: 0} - - {x: 54, y: 0} - - {x: 45, y: 1} - - {x: 46, y: 1} - - {x: 47, y: 1} - - {x: 48, y: 1} - - {x: 49, y: 1} - - {x: 50, y: 1} - - {x: 51, y: 1} - - {x: 52, y: 1} - - {x: 53, y: 1} - - {x: 54, y: 1} - - {x: 45, y: 2} - - {x: 46, y: 2} - - {x: 47, y: 2} - - {x: 48, y: 2} - - {x: 49, y: 2} - - {x: 50, y: 2} - - {x: 51, y: 2} - - {x: 52, y: 2} - - {x: 53, y: 2} - - {x: 54, y: 2} - - {x: 45, y: 3} - - {x: 46, y: 3} - - {x: 47, y: 3} - - {x: 48, y: 3} - - {x: 49, y: 3} - - {x: 50, y: 3} - - {x: 51, y: 3} - - {x: 52, y: 3} - - {x: 53, y: 3} - - {x: 54, y: 3} - - {x: 45, y: 4} - - {x: 46, y: 4} - - {x: 47, y: 4} - - {x: 48, y: 4} - - {x: 49, y: 4} - - {x: 50, y: 4} - - {x: 51, y: 4} - - {x: 52, y: 4} - - {x: 53, y: 4} - - {x: 54, y: 4} - Facing: 0 - LeakExits: - - Target: 2 - TileArea: - - {x: 36, y: 44} - - {x: 37, y: 44} - - {x: 38, y: 44} - - {x: 39, y: 44} - - {x: 40, y: 44} - - {x: 41, y: 44} - - {x: 42, y: 44} - - {x: 43, y: 44} - NormalizedWeight: 1 - - Owner: 2 - Spawners: - - SpawnerIdInZone: 0 - TilePosition: {x: 2, y: 50} - TileArea: - - {x: 0, y: 45} - - {x: 1, y: 45} - - {x: 2, y: 45} - - {x: 3, y: 45} - - {x: 4, y: 45} - - {x: 0, y: 46} - - {x: 1, y: 46} - - {x: 2, y: 46} - - {x: 3, y: 46} - - {x: 4, y: 46} - - {x: 0, y: 47} - - {x: 1, y: 47} - - {x: 2, y: 47} - - {x: 3, y: 47} - - {x: 4, y: 47} - - {x: 0, y: 48} - - {x: 1, y: 48} - - {x: 2, y: 48} - - {x: 3, y: 48} - - {x: 4, y: 48} - - {x: 0, y: 49} - - {x: 1, y: 49} - - {x: 2, y: 49} - - {x: 3, y: 49} - - {x: 4, y: 49} - - {x: 0, y: 50} - - {x: 1, y: 50} - - {x: 2, y: 50} - - {x: 3, y: 50} - - {x: 4, y: 50} - - {x: 0, y: 51} - - {x: 1, y: 51} - - {x: 2, y: 51} - - {x: 3, y: 51} - - {x: 4, y: 51} - - {x: 0, y: 52} - - {x: 1, y: 52} - - {x: 2, y: 52} - - {x: 3, y: 52} - - {x: 4, y: 52} - - {x: 0, y: 53} - - {x: 1, y: 53} - - {x: 2, y: 53} - - {x: 3, y: 53} - - {x: 4, y: 53} - - {x: 0, y: 54} - - {x: 1, y: 54} - - {x: 2, y: 54} - - {x: 3, y: 54} - - {x: 4, y: 54} - Facing: 0 - LeakExits: - - Target: 3 - TileArea: - - {x: 36, y: 55} - - {x: 37, y: 55} - - {x: 38, y: 55} - - {x: 39, y: 55} - - {x: 40, y: 55} - - {x: 41, y: 55} - - {x: 42, y: 55} - - {x: 43, y: 55} - NormalizedWeight: 1 - - Owner: 3 - Spawners: - - SpawnerIdInZone: 0 - TilePosition: {x: 50, y: 97} - TileArea: - - {x: 45, y: 95} - - {x: 46, y: 95} - - {x: 47, y: 95} - - {x: 48, y: 95} - - {x: 49, y: 95} - - {x: 50, y: 95} - - {x: 51, y: 95} - - {x: 52, y: 95} - - {x: 53, y: 95} - - {x: 54, y: 95} - - {x: 45, y: 96} - - {x: 46, y: 96} - - {x: 47, y: 96} - - {x: 48, y: 96} - - {x: 49, y: 96} - - {x: 50, y: 96} - - {x: 51, y: 96} - - {x: 52, y: 96} - - {x: 53, y: 96} - - {x: 54, y: 96} - - {x: 45, y: 97} - - {x: 46, y: 97} - - {x: 47, y: 97} - - {x: 48, y: 97} - - {x: 49, y: 97} - - {x: 50, y: 97} - - {x: 51, y: 97} - - {x: 52, y: 97} - - {x: 53, y: 97} - - {x: 54, y: 97} - - {x: 45, y: 98} - - {x: 46, y: 98} - - {x: 47, y: 98} - - {x: 48, y: 98} - - {x: 49, y: 98} - - {x: 50, y: 98} - - {x: 51, y: 98} - - {x: 52, y: 98} - - {x: 53, y: 98} - - {x: 54, y: 98} - - {x: 45, y: 99} - - {x: 46, y: 99} - - {x: 47, y: 99} - - {x: 48, y: 99} - - {x: 49, y: 99} - - {x: 50, y: 99} - - {x: 51, y: 99} - - {x: 52, y: 99} - - {x: 53, y: 99} - - {x: 54, y: 99} - Facing: 0 - LeakExits: [] - Goals: - - TileArea: - - {x: 45, y: 45} - - {x: 46, y: 45} - - {x: 47, y: 45} - - {x: 48, y: 45} - - {x: 49, y: 45} - - {x: 50, y: 45} - - {x: 51, y: 45} - - {x: 52, y: 45} - - {x: 53, y: 45} - - {x: 54, y: 45} - - {x: 45, y: 46} - - {x: 46, y: 46} - - {x: 47, y: 46} - - {x: 48, y: 46} - - {x: 49, y: 46} - - {x: 50, y: 46} - - {x: 51, y: 46} - - {x: 52, y: 46} - - {x: 53, y: 46} - - {x: 54, y: 46} - - {x: 45, y: 47} - - {x: 46, y: 47} - - {x: 47, y: 47} - - {x: 48, y: 47} - - {x: 49, y: 47} - - {x: 50, y: 47} - - {x: 51, y: 47} - - {x: 52, y: 47} - - {x: 53, y: 47} - - {x: 54, y: 47} - - {x: 45, y: 48} - - {x: 46, y: 48} - - {x: 47, y: 48} - - {x: 48, y: 48} - - {x: 49, y: 48} - - {x: 50, y: 48} - - {x: 51, y: 48} - - {x: 52, y: 48} - - {x: 53, y: 48} - - {x: 54, y: 48} - - {x: 45, y: 49} - - {x: 46, y: 49} - - {x: 47, y: 49} - - {x: 48, y: 49} - - {x: 49, y: 49} - - {x: 50, y: 49} - - {x: 51, y: 49} - - {x: 52, y: 49} - - {x: 53, y: 49} - - {x: 54, y: 49} - - {x: 45, y: 50} - - {x: 46, y: 50} - - {x: 47, y: 50} - - {x: 48, y: 50} - - {x: 49, y: 50} - - {x: 50, y: 50} - - {x: 51, y: 50} - - {x: 52, y: 50} - - {x: 53, y: 50} - - {x: 54, y: 50} - - {x: 45, y: 51} - - {x: 46, y: 51} - - {x: 47, y: 51} - - {x: 48, y: 51} - - {x: 49, y: 51} - - {x: 50, y: 51} - - {x: 51, y: 51} - - {x: 52, y: 51} - - {x: 53, y: 51} - - {x: 54, y: 51} - - {x: 45, y: 52} - - {x: 46, y: 52} - - {x: 47, y: 52} - - {x: 48, y: 52} - - {x: 49, y: 52} - - {x: 50, y: 52} - - {x: 51, y: 52} - - {x: 52, y: 52} - - {x: 53, y: 52} - - {x: 54, y: 52} - - {x: 45, y: 53} - - {x: 46, y: 53} - - {x: 47, y: 53} - - {x: 48, y: 53} - - {x: 49, y: 53} - - {x: 50, y: 53} - - {x: 51, y: 53} - - {x: 52, y: 53} - - {x: 53, y: 53} - - {x: 54, y: 53} - - {x: 45, y: 54} - - {x: 46, y: 54} - - {x: 47, y: 54} - - {x: 48, y: 54} - - {x: 49, y: 54} - - {x: 50, y: 54} - - {x: 51, y: 54} - - {x: 52, y: 54} - - {x: 53, y: 54} - - {x: 54, y: 54} diff --git a/Assets/_Project/Scenes/Levels/3Player.asset.meta b/Assets/_Project/Scenes/Levels/3Player.asset.meta deleted file mode 100644 index 165c532..0000000 --- a/Assets/_Project/Scenes/Levels/3Player.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 4ca1d0054e9d3744e8802817bf0b69e2 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/3Player.unity b/Assets/_Project/Scenes/Levels/3Player.unity deleted file mode 100644 index f76a371..0000000 --- a/Assets/_Project/Scenes/Levels/3Player.unity +++ /dev/null @@ -1,1682 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 10 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 13 - m_BakeOnSceneLoad: 0 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 2 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 1 - m_PVRFilteringGaussRadiusAO: 1 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &33702846 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 33702847} - - component: {fileID: 33702849} - - component: {fileID: 33702848} - m_Layer: 0 - m_Name: Player2Zone - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &33702847 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 33702846} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 25, y: 0, z: 50} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1254053184} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &33702848 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 33702846} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5e8ab74b9038bd64782043bfc21f4cd7, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.PlayerZoneVolume - owner: 2 - placementValidity: 1 ---- !u!65 &33702849 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 33702846} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 40, y: 1, z: 10} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &134093951 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 134093952} - - component: {fileID: 134093954} - - component: {fileID: 134093953} - m_Layer: 0 - m_Name: Player1Zone - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &134093952 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 134093951} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 25} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 928556819} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &134093953 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 134093951} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5e8ab74b9038bd64782043bfc21f4cd7, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.PlayerZoneVolume - owner: 1 - placementValidity: 1 ---- !u!65 &134093954 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 134093951} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 90, y: 1, z: 40} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &266460570 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 266460571} - - component: {fileID: 266460573} - - component: {fileID: 266460572} - m_Layer: 0 - m_Name: Player2Leak - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &266460571 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 266460570} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 40.07, y: 0, z: 55.86} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1254053184} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &266460572 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 266460570} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d4da5d6673a12f546ac47563abc49d5a, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.LeakExitVolume - sourceZone: 2 - target: 3 - weight: 1 - placementValidity: 0 ---- !u!65 &266460573 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 266460570} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 8, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &401715852 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 401715853} - - component: {fileID: 401715855} - - component: {fileID: 401715854} - m_Layer: 0 - m_Name: Player1Spawn - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &401715853 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 401715852} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 3} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 928556819} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &401715854 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 401715852} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a756762f899008f45b2986bdcb11c819, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.SpawnerVolume - owner: 1 - spawnerIdInZone: 0 - spawnFacing: 0 - placementValidity: 0 ---- !u!65 &401715855 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 401715852} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 10, y: 1, z: 5} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &459910557 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 459910558} - - component: {fileID: 459910560} - - component: {fileID: 459910559} - m_Layer: 0 - m_Name: Player3Zone - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &459910558 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 459910557} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 74.8} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 795669283} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &459910559 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 459910557} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5e8ab74b9038bd64782043bfc21f4cd7, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.PlayerZoneVolume - owner: 3 - placementValidity: 1 ---- !u!65 &459910560 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 459910557} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 90, y: 1, z: 40} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &795669282 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 795669283} - m_Layer: 0 - m_Name: Player 3 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &795669283 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 795669282} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 459910558} - - {fileID: 798920373} - m_Father: {fileID: 2019237589} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &798920372 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 798920373} - - component: {fileID: 798920375} - - component: {fileID: 798920374} - m_Layer: 0 - m_Name: Player3Spawn - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &798920373 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 798920372} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 97.35} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 795669283} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &798920374 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 798920372} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a756762f899008f45b2986bdcb11c819, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.SpawnerVolume - owner: 3 - spawnerIdInZone: 0 - spawnFacing: 0 - placementValidity: 0 ---- !u!65 &798920375 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 798920372} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 10, y: 1, z: 5} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &818973742 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 818973745} - - component: {fileID: 818973744} - - component: {fileID: 818973743} - m_Layer: 7 - m_Name: Terrain - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 2147483647 - m_IsActive: 1 ---- !u!154 &818973743 -TerrainCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 818973742} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 2 - m_TerrainData: {fileID: 15600000, guid: ee9f119ba54c4b14d83c6818dc2f0ef8, type: 2} - m_EnableTreeColliders: 1 ---- !u!218 &818973744 -Terrain: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 818973742} - m_Enabled: 1 - serializedVersion: 6 - m_TerrainData: {fileID: 15600000, guid: ee9f119ba54c4b14d83c6818dc2f0ef8, type: 2} - m_TreeDistance: 5000 - m_TreeBillboardDistance: 50 - m_TreeCrossFadeLength: 5 - m_TreeMaximumFullLODCount: 50 - m_DetailObjectDistance: 80 - m_DetailObjectDensity: 1 - m_HeightmapPixelError: 5 - m_SplatMapDistance: 1000 - m_HeightmapMinimumLODSimplification: 0 - m_HeightmapMaximumLOD: 0 - m_ShadowCastingMode: 2 - m_DrawHeightmap: 1 - m_DrawInstanced: 0 - m_DrawTreesAndFoliage: 1 - m_StaticShadowCaster: 0 - m_IgnoreQualitySettings: 0 - m_ReflectionProbeUsage: 1 - m_MaterialTemplate: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} - m_BakeLightProbesForTrees: 1 - m_PreserveTreePrototypeLayers: 0 - m_DeringLightProbesForTrees: 1 - m_ReceiveGI: 1 - m_ScaleInLightmap: 0.18285714 - m_LightmapParameters: {fileID: 15203, guid: 0000000000000000f000000000000000, type: 0} - m_GroupingID: 0 - m_RenderingLayerMask: 1 - m_AllowAutoConnect: 1 - m_EnableHeightmapRayTracing: 1 - m_EnableTreesAndDetailsRayTracing: 0 - m_TreeMotionVectorModeOverride: 3 ---- !u!4 &818973745 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 818973742} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: -20, y: -5, z: -20} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &928556818 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 928556819} - m_Layer: 0 - m_Name: Player 1 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &928556819 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 928556818} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 134093952} - - {fileID: 401715853} - - {fileID: 1270045952} - m_Father: {fileID: 2019237589} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1001 &1085185471 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 1445952844252628864, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_Name - value: _MatchServices - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 3833381251955063088, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6850685008819507485, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - propertyPath: level - value: - objectReference: {fileID: 11400000, guid: 4ca1d0054e9d3744e8802817bf0b69e2, type: 2} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 13be8328f6275e14da787f25c94683ee, type: 3} ---- !u!1 &1254053183 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1254053184} - m_Layer: 0 - m_Name: Player 2 - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1254053184 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1254053183} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 33702847} - - {fileID: 1980551240} - - {fileID: 1422989821} - - {fileID: 266460571} - m_Father: {fileID: 2019237589} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1270045951 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1270045952} - - component: {fileID: 1270045954} - - component: {fileID: 1270045953} - m_Layer: 0 - m_Name: Player1Leak - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1270045952 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1270045951} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 40.49, y: 0, z: 44.4} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 928556819} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1270045953 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1270045951} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d4da5d6673a12f546ac47563abc49d5a, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.LeakExitVolume - sourceZone: 1 - target: 2 - weight: 1 - placementValidity: 0 ---- !u!65 &1270045954 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1270045951} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 8, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &1422989820 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1422989821} - - component: {fileID: 1422989823} - - component: {fileID: 1422989822} - m_Layer: 0 - m_Name: Player2Spawn - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1422989821 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1422989820} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 2.72, y: 0, z: 50} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1254053184} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1422989822 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1422989820} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a756762f899008f45b2986bdcb11c819, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.SpawnerVolume - owner: 2 - spawnerIdInZone: 0 - spawnFacing: 0 - placementValidity: 0 ---- !u!65 &1422989823 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1422989820} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 5, y: 1, z: 10} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &1725776290 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1725776291} - - component: {fileID: 1725776293} - - component: {fileID: 1725776292} - m_Layer: 0 - m_Name: Goal - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1725776291 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1725776290} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 50} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2019237589} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1725776292 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1725776290} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 755948f0244afea4da6ed2e4e3d27579, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.GoalVolume - placementValidity: 0 ---- !u!65 &1725776293 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1725776290} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 10, y: 1, z: 10} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &1980551239 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1980551240} - - component: {fileID: 1980551242} - - component: {fileID: 1980551241} - m_Layer: 0 - m_Name: Player2Zone (1) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &1980551240 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1980551239} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 75.5, y: 0, z: 50} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 1254053184} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1980551241 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1980551239} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 5e8ab74b9038bd64782043bfc21f4cd7, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.PlayerZoneVolume - owner: 2 - placementValidity: 1 ---- !u!65 &1980551242 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1980551239} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 40, y: 1, z: 10} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &2019237587 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2019237589} - - component: {fileID: 2019237588} - m_Layer: 0 - m_Name: _LevelAuthoring - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &2019237588 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2019237587} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 37de128911d7bbc4299ea87cdb520ed7, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.LevelAuthoring - targetAsset: {fileID: 11400000, guid: 4ca1d0054e9d3744e8802817bf0b69e2, type: 2} - mapName: 3Player - playerCount: 3 - expectedGoalCount: 1 - mapDescription: 3 Player new design map - author: BigBoysFellowship - buildAccess: 1 - alwaysShowPlayerZones: 1 - alwaysShowSpawners: 1 - alwaysShowLeakExits: 1 - alwaysShowGoals: 1 - alwaysShowMapArea: 1 ---- !u!4 &2019237589 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2019237587} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 2082667048} - - {fileID: 1725776291} - - {fileID: 928556819} - - {fileID: 1254053184} - - {fileID: 795669283} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &2082667047 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2082667048} - - component: {fileID: 2082667050} - - component: {fileID: 2082667049} - m_Layer: 0 - m_Name: MapArea - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &2082667048 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082667047} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 50, y: 0, z: 50} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 2019237589} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &2082667049 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082667047} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: bacb3662546735544bc6c56b5bf5830a, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Levels.MapAreaVolume ---- !u!65 &2082667050 -BoxCollider: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2082667047} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 - m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 100, y: 1, z: 100} - m_Center: {x: 0, y: 0, z: 0} ---- !u!1 &3017635515177826 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 8988393256734803841} - - component: {fileID: 8162852702969474156} - - component: {fileID: 3611798548410183501} - m_Layer: 0 - m_Name: WaveManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &140582381973810141 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4602750115185197811} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 2907458687 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!4 &503343020638521026 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4244307270187979398} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 5789372923279415034} - - {fileID: 4088215286431904235} - - {fileID: 6254257571613030681} - - {fileID: 5997689683896399647} - - {fileID: 8988393256734803841} - - {fileID: 7668674954522045726} - m_Father: {fileID: 0} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &1105731448975329059 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764112936023248767} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 33007430 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!1 &1764112936023248767 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 4088215286431904235} - - component: {fileID: 1105731448975329059} - - component: {fileID: 7363980916811660096} - m_Layer: 0 - m_Name: MatchState - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1946912819156519408 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6675731345053163047} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d369496ba7887b844b1c220b524a507d, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.TowerPlacementManager - ShowTopMostFoldoutHeaderGroup: 1 - requestsPerFrame: 3 - towerDefinitions: - - {fileID: 0} - - {fileID: 11400000, guid: d5b2e8fa3c7e9b5f4a1d0c2e7f6b3a91, type: 2} - - {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} - - {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2} - - {fileID: 11400000, guid: 04219895bbea4fb9a94fd62fef35bf2a, type: 2} - - {fileID: 11400000, guid: e3f1a9c2b5d84e76a0c3f1e8d27b4905, type: 2} - startingDeck: - - {fileID: 11400000, guid: d5b2e8fa3c7e9b5f4a1d0c2e7f6b3a91, type: 2} - - {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2} ---- !u!1 &3471031726177798451 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5789372923279415034} - - component: {fileID: 4420272328355700207} - - component: {fileID: 8942977016248842733} - m_Layer: 0 - m_Name: ChatService - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!1 &3522105368117485811 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7668674954522045726} - - component: {fileID: 6900222455741435924} - - component: {fileID: 8285861969374059639} - m_Layer: 0 - m_Name: WaveVote - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &3611798548410183501 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3017635515177826} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 81d8e215d8419404ea4d959196cd9cc3, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveManager - ShowTopMostFoldoutHeaderGroup: 1 - startingLives: 40 - draftTimeSeconds: 30 - voteTimeSeconds: 25 - goldConfig: {fileID: 11400000, guid: d5e01c919f14a1e4888ad494a159241b, type: 2} - enemyScalingConfig: {fileID: 11400000, guid: ae9fde0b564e20440ac2e20861fa1ca6, type: 2} ---- !u!114 &3758811521878612515 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4602750115185197811} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a293cf6dca91dd2478c9f4e799cf9e0d, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.RunState - ShowTopMostFoldoutHeaderGroup: 1 - runDefinition: {fileID: 11400000, guid: 1bb81a966192c344d94cce2628c1832b, type: 2} ---- !u!114 &3973305430985036989 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6675731345053163047} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 2279944997 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!4 &4088215286431904235 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764112936023248767} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &4244307270187979398 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 503343020638521026} - m_Layer: 0 - m_Name: _MatchNetwork - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &4420272328355700207 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3471031726177798451} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 3614769064 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!1 &4602750115185197811 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 6254257571613030681} - - component: {fileID: 140582381973810141} - - component: {fileID: 3758811521878612515} - m_Layer: 0 - m_Name: RunState - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &5789372923279415034 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3471031726177798451} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &5997689683896399647 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6675731345053163047} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!4 &6254257571613030681 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4602750115185197811} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &6675731345053163047 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 5997689683896399647} - - component: {fileID: 3973305430985036989} - - component: {fileID: 1946912819156519408} - m_Layer: 0 - m_Name: TowerPlacementManager - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &6900222455741435924 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3522105368117485811} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1445073833 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &7363980916811660096 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1764112936023248767} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a34585be59d49e94b811d96be51c5088, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.MatchState - ShowTopMostFoldoutHeaderGroup: 1 ---- !u!4 &7668674954522045726 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3522105368117485811} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 38.30481, y: 0.5, z: 155.93135} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!114 &8162852702969474156 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3017635515177826} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject - GlobalObjectIdHash: 1797533733 - InScenePlacedSourceGlobalObjectIdHash: 0 - DeferredDespawnTick: 0 - Ownership: 1 - AlwaysReplicateAsRoot: 0 - SynchronizeTransform: 1 - ActiveSceneSynchronization: 0 - SceneMigrationSynchronization: 0 - SpawnWithObservers: 1 - DontDestroyWithOwner: 0 - AutoObjectParentSync: 1 - SyncOwnerTransformWhenParented: 1 - AllowOwnerToParent: 0 ---- !u!114 &8285861969374059639 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3522105368117485811} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: a18321dc2d138034fbdb5f705f19f893, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.WaveVote - ShowTopMostFoldoutHeaderGroup: 1 - optionsPerVote: 3 ---- !u!114 &8942977016248842733 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3471031726177798451} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 816890bb20c416b419e38d3d4b91ffca, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.ChatService - ShowTopMostFoldoutHeaderGroup: 1 ---- !u!4 &8988393256734803841 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3017635515177826} - serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 503343020638521026} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1660057539 &9223372036854775807 -SceneRoots: - m_ObjectHideFlags: 0 - m_Roots: - - {fileID: 1085185471} - - {fileID: 503343020638521026} - - {fileID: 2019237589} - - {fileID: 818973745} diff --git a/Assets/_Project/Scenes/Levels/3Player.unity.meta b/Assets/_Project/Scenes/Levels/3Player.unity.meta deleted file mode 100644 index 757486c..0000000 --- a/Assets/_Project/Scenes/Levels/3Player.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 128de09101c3e3240b094d29d1eb9d22 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset b/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset deleted file mode 100644 index f27ca6b..0000000 Binary files a/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset and /dev/null differ diff --git a/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset.meta b/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset.meta deleted file mode 100644 index 8e8fbe8..0000000 --- a/Assets/_Project/Scenes/Levels/3Player_TerrainData.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ee9f119ba54c4b14d83c6818dc2f0ef8 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 15600000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png b/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png deleted file mode 100644 index 58162bb..0000000 --- a/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:e9721e2886a9b21f06f6f80010e37933fc07488fd6bb643dbe58e865503cb5b0 -size 868034 diff --git a/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png.meta b/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png.meta deleted file mode 100644 index d442f14..0000000 --- a/Assets/_Project/Scenes/Levels/3Player_Thumbnail.png.meta +++ /dev/null @@ -1,117 +0,0 @@ -fileFormatVersion: 2 -guid: 7e33bd8556d93f04eb4f5c38006a7880 -TextureImporter: - internalIDToNameTable: [] - externalObjects: {} - serializedVersion: 13 - mipmaps: - mipMapMode: 0 - enableMipMap: 0 - sRGBTexture: 1 - linearTexture: 0 - fadeOut: 0 - borderMipMap: 0 - mipMapsPreserveCoverage: 0 - alphaTestReferenceValue: 0.5 - mipMapFadeDistanceStart: 1 - mipMapFadeDistanceEnd: 3 - bumpmap: - convertToNormalMap: 0 - externalNormalMap: 0 - heightScale: 0.25 - normalMapFilter: 0 - flipGreenChannel: 0 - isReadable: 0 - streamingMipmaps: 0 - streamingMipmapsPriority: 0 - vTOnly: 0 - ignoreMipmapLimit: 0 - grayScaleToAlpha: 0 - generateCubemap: 6 - cubemapConvolution: 0 - seamlessCubemap: 0 - textureFormat: 1 - maxTextureSize: 2048 - textureSettings: - serializedVersion: 2 - filterMode: 1 - aniso: 1 - mipBias: 0 - wrapU: 1 - wrapV: 1 - wrapW: 1 - nPOTScale: 0 - lightmap: 0 - compressionQuality: 50 - spriteMode: 1 - spriteExtrude: 1 - spriteMeshType: 1 - alignment: 0 - spritePivot: {x: 0.5, y: 0.5} - spritePixelsToUnits: 100 - spriteBorder: {x: 0, y: 0, z: 0, w: 0} - spriteGenerateFallbackPhysicsShape: 1 - alphaUsage: 1 - alphaIsTransparency: 1 - spriteTessellationDetail: -1 - textureType: 8 - textureShape: 1 - singleChannelComponent: 0 - flipbookRows: 1 - flipbookColumns: 1 - maxTextureSizeSet: 0 - compressionQualitySet: 0 - textureFormatSet: 0 - ignorePngGamma: 0 - applyGammaDecoding: 0 - swizzle: 50462976 - cookieLightType: 0 - platformSettings: - - serializedVersion: 4 - buildTarget: DefaultTexturePlatform - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - - serializedVersion: 4 - buildTarget: Standalone - maxTextureSize: 2048 - resizeAlgorithm: 0 - textureFormat: -1 - textureCompression: 1 - compressionQuality: 50 - crunchedCompression: 0 - allowsAlphaSplitting: 0 - overridden: 0 - ignorePlatformSupport: 0 - androidETC2FallbackOverride: 0 - forceMaximumCompressionQuality_BC6H_BC7: 0 - spriteSheet: - serializedVersion: 2 - sprites: [] - outline: [] - customData: - physicsShape: [] - bones: [] - spriteID: 5e97eb03825dee720800000000000000 - internalID: 0 - vertices: [] - indices: - edges: [] - weights: [] - secondaryTextures: [] - spriteCustomMetadata: - entries: [] - nameFileIdTable: {} - mipmapLimitGroupName: - pSDRemoveMatte: 0 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/_Project/Scenes/UI_Scenes.meta b/Assets/_Project/Scenes/UI.meta similarity index 100% rename from Assets/_Project/Scenes/UI_Scenes.meta rename to Assets/_Project/Scenes/UI.meta diff --git a/Assets/_Project/Scenes/UI_Scenes/Lobby.unity b/Assets/_Project/Scenes/UI/Lobby.unity similarity index 100% rename from Assets/_Project/Scenes/UI_Scenes/Lobby.unity rename to Assets/_Project/Scenes/UI/Lobby.unity diff --git a/Assets/_Project/Scenes/UI_Scenes/Lobby.unity.meta b/Assets/_Project/Scenes/UI/Lobby.unity.meta similarity index 100% rename from Assets/_Project/Scenes/UI_Scenes/Lobby.unity.meta rename to Assets/_Project/Scenes/UI/Lobby.unity.meta diff --git a/Assets/_Project/Scenes/UI_Scenes/MainMenu.unity b/Assets/_Project/Scenes/UI/MainMenu.unity similarity index 99% rename from Assets/_Project/Scenes/UI_Scenes/MainMenu.unity rename to Assets/_Project/Scenes/UI/MainMenu.unity index 7ec922f..b6d1820 100644 --- a/Assets/_Project/Scenes/UI_Scenes/MainMenu.unity +++ b/Assets/_Project/Scenes/UI/MainMenu.unity @@ -638,7 +638,6 @@ MonoBehaviour: maps: - {fileID: 11400000, guid: e65cce766e92f604f85ab939cf374abd, type: 2} - {fileID: 11400000, guid: 9cc56fbc3ae460a4b862f8510fdf5f09, type: 2} - - {fileID: 11400000, guid: 4ca1d0054e9d3744e8802817bf0b69e2, type: 2} --- !u!4 &976902011 Transform: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scenes/UI_Scenes/MainMenu.unity.meta b/Assets/_Project/Scenes/UI/MainMenu.unity.meta similarity index 100% rename from Assets/_Project/Scenes/UI_Scenes/MainMenu.unity.meta rename to Assets/_Project/Scenes/UI/MainMenu.unity.meta diff --git a/Assets/_Project/Scripts/Core/Enums.cs b/Assets/_Project/Scripts/Core/Enums.cs index 43d7a92..7d49400 100644 --- a/Assets/_Project/Scripts/Core/Enums.cs +++ b/Assets/_Project/Scripts/Core/Enums.cs @@ -203,31 +203,6 @@ namespace TD.Core Restricted = 2, } - /// - /// Whether a map restricts tower placement to each player's own zone, or lets everyone build - /// anywhere on the map's buildable area. - /// - /// - /// This governs placement PERMISSION only. Zone ownership keeps doing everything else it - /// does today under both modes — leak attribution, camera start position, builder spawn point, - /// minimap tinting. A shared-build map still has distinct player territories; they are simply - /// all buildable by everyone. - /// - /// Backed by byte with OwnerOnly = 0 so LevelData assets baked before this - /// existed deserialize to the pre-existing behaviour without needing a re-bake. - /// - /// Tower OWNERSHIP is unaffected: a tower belongs to whoever paid for it, and sell / - /// upgrade stay owner-gated in both modes. - /// - public enum BuildAccess : byte - { - /// A player may only build on tiles covered by their own PlayerZoneVolume. - OwnerOnly = 0, - - /// Any player may build on any Buildable tile, whichever zone owns it. - Shared = 1, - } - /// /// Outcome of a bake operation, recorded on the baked asset. /// diff --git a/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs index 3af3076..360b2a3 100644 --- a/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs +++ b/Assets/_Project/Scripts/Dev/DebugCommandRelay.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using Unity.Netcode; using UnityEngine; using TD.Gameplay.Draft; +using TD.Gameplay.EnemyUpgrades; +using TD.Gameplay.Waves; namespace TD.Dev { @@ -74,5 +76,42 @@ namespace TD.Dev Debug.LogWarning($"[DebugCommandRelay] '{option.DisplayName}' could not be applied " + $"to client {OwnerClientId}."); } + + /// + /// Force-apply the at (its + /// index) to the run's current wave slot — the same + /// recording WaveVote.ServerResolve does for a vote winner, skipping the vote + /// entirely. Not player-scoped: the effect lands on the run's current wave slot rather + /// than the caller, so any connected client's relay can trigger it. + /// + /// + /// Takes effect the next time this wave slot's enemies spawn, not retroactively on + /// enemies already alive — see 's remarks on why + /// applying is "record on the slot," not a direct mutation. + /// + [Rpc(SendTo.Server, InvokePermission = RpcInvokePermission.Owner)] + public void DebugGrantEnemyUpgradeRpc(int optionId) + { + var pool = EnemyUpgradePool.Instance; + var option = pool != null ? pool.Get(optionId) : null; + if (option == null) + { + Debug.LogWarning($"[DebugCommandRelay] Grant requested for unknown enemy upgrade id {optionId}."); + return; + } + + var run = RunState.Instance; + if (run == null) + { + Debug.LogWarning("[DebugCommandRelay] No RunState in this scene."); + return; + } + + int slot = run.CurrentUpgradeSlot; + run.ServerAddUpgrade(slot, optionId); + option.ServerOnApplied(run, slot); + + Debug.Log($"[DebugCommandRelay] Granted '{option.DisplayName}' to wave slot {slot}."); + } } } diff --git a/Assets/_Project/Scripts/Dev/DebugConsole.cs b/Assets/_Project/Scripts/Dev/DebugConsole.cs index 03a7474..6ffbf2b 100644 --- a/Assets/_Project/Scripts/Dev/DebugConsole.cs +++ b/Assets/_Project/Scripts/Dev/DebugConsole.cs @@ -8,6 +8,7 @@ using UnityEngine.InputSystem; using UnityEngine.UIElements; using TD.UI; using TD.Gameplay.Draft; +using TD.Gameplay.EnemyUpgrades; namespace TD.Dev { @@ -49,13 +50,7 @@ namespace TD.Dev "System (UnityEngine.InputSystem.Key). Backquote is the physical ` / ~ key.")] [SerializeField] private Key toggleKey = Key.Backquote; - // Beyond this many candidates the list is truncated with a "+N more" row so a - // large DraftPool can't grow the console bar off the top of the screen. - private const int MaxVisibleSuggestions = 12; - - private VisualElement consoleContainer; - private TextField commandInput; - private VisualElement suggestionList; + private DebugConsoleUI ui; private bool consoleOpen; // Frame on which the console was opened or closed. The toggle key and Enter @@ -98,123 +93,23 @@ namespace TD.Dev return; } - BuildConsoleUi(root); - } - - private void BuildConsoleUi(VisualElement uiRoot) - { - // Top-anchored bar, closed by default. Distinct position from the HUD's - // bottom-left chat panel so the two never overlap. - consoleContainer = new VisualElement(); - consoleContainer.pickingMode = PickingMode.Ignore; - consoleContainer.style.position = Position.Absolute; - consoleContainer.style.left = 0; - consoleContainer.style.right = 0; - consoleContainer.style.top = 0; - consoleContainer.style.paddingTop = 8; - consoleContainer.style.paddingBottom = 8; - consoleContainer.style.paddingLeft = 12; - consoleContainer.style.paddingRight = 12; - // Fully opaque: the console is a text-entry overlay that has to stay readable - // over the level, the HUD, and whatever else is on screen. - consoleContainer.style.backgroundColor = new Color(0f, 0f, 0f, 1f); - consoleContainer.style.display = DisplayStyle.None; - - commandInput = new TextField(); - commandInput.style.minHeight = 28; - commandInput.style.width = Length.Percent(100); - commandInput.maxLength = 200; - commandInput.isDelayed = false; - StyleConsoleInput(commandInput); + ui = new DebugConsoleUI(root); // Focus tracking — contributes to the same flag HUDController's chat // input sets, so camera/builder/spell input all stay gated correctly // regardless of which text field currently has focus. - commandInput.RegisterCallback(_ => HUDController.IsTextInputActive = true); - commandInput.RegisterCallback(_ => HUDController.IsTextInputActive = false); + ui.CommandInput.RegisterCallback(_ => HUDController.IsTextInputActive = true); + ui.CommandInput.RegisterCallback(_ => HUDController.IsTextInputActive = false); - commandInput.RegisterValueChangedCallback(_ => RefreshSuggestions()); + ui.CommandInput.RegisterValueChangedCallback(_ => RefreshSuggestions()); // Tab and the arrows can't be polled from Keyboard.current the way Enter and // Escape are (below): UI Toolkit would still insert a tab character and move // the focus ring before Update runs. Intercept them on the field in the // trickle-down phase, before the text engine and the focus ring see them. - commandInput.RegisterCallback(OnConsoleKeyDown, TrickleDown.TrickleDown); - commandInput.RegisterCallback(OnConsoleNavigationMove, - TrickleDown.TrickleDown); - - suggestionList = new VisualElement(); - suggestionList.pickingMode = PickingMode.Ignore; - suggestionList.style.flexDirection = FlexDirection.Column; - suggestionList.style.marginTop = 4; - suggestionList.style.display = DisplayStyle.None; - - consoleContainer.Add(commandInput); - consoleContainer.Add(suggestionList); - uiRoot.Add(consoleContainer); - } - - // Mirrors HUDController.StyleChatInputDark — dark background, white text, - // a thin border, and inner padding so ascenders/descenders don't clip. - // Green border (vs. chat's neutral gray) as a quick visual "this is the - // debug console, not chat" cue. - private static void StyleConsoleInput(TextField field) - { - var darkBg = new Color(0.05f, 0.05f, 0.05f, 1f); - var borderClr = new Color(0.35f, 0.75f, 0.35f); - - field.style.backgroundColor = darkBg; - field.style.color = Color.white; - field.style.borderTopWidth = field.style.borderBottomWidth = - field.style.borderLeftWidth = field.style.borderRightWidth = 1; - field.style.borderTopColor = field.style.borderBottomColor = - field.style.borderLeftColor = field.style.borderRightColor = borderClr; - - var inner = field.Q("unity-text-input"); - if (inner != null) - { - inner.style.backgroundColor = darkBg; - inner.style.color = Color.white; - inner.style.paddingTop = 4; - inner.style.paddingBottom = 4; - inner.style.paddingLeft = 6; - inner.style.paddingRight = 6; - } - } - - // One autocomplete row: the candidate token plus an optional dim hint. Rows are - // pickingMode Ignore and keyboard-driven only — nothing here is clickable, which - // avoids the recursive picking-mode problem documented in HUDController's chat - // panel (clicks falling through to the game world via a ScrollView's internal - // wrapper element). - private static VisualElement BuildSuggestionRow(string text, string hint, bool selected) - { - var row = new VisualElement(); - row.pickingMode = PickingMode.Ignore; - row.style.flexDirection = FlexDirection.Row; - row.style.minHeight = 20; - row.style.paddingLeft = 6; - row.style.paddingRight = 6; - row.style.backgroundColor = selected - ? new Color(0.16f, 0.38f, 0.16f, 1f) // matches the green console cue - : new Color(0.05f, 0.05f, 0.05f, 1f); - - var label = new Label(text); - label.pickingMode = PickingMode.Ignore; - label.style.color = Color.white; - label.style.unityFontStyleAndWeight = selected ? FontStyle.Bold : FontStyle.Normal; - row.Add(label); - - if (!string.IsNullOrEmpty(hint)) - { - var hintLabel = new Label(hint); - hintLabel.pickingMode = PickingMode.Ignore; - hintLabel.style.color = new Color(0.6f, 0.6f, 0.6f); - hintLabel.style.marginLeft = 12; - row.Add(hintLabel); - } - - return row; + ui.CommandInput.RegisterCallback(OnConsoleKeyDown, TrickleDown.TrickleDown); + ui.CommandInput.RegisterCallback(OnConsoleNavigationMove, + TrickleDown.TrickleDown); } private void Update() @@ -279,15 +174,14 @@ namespace TD.Dev private void Swallow(EventBase evt) { evt.StopImmediatePropagation(); - commandInput?.panel?.focusController?.IgnoreEvent(evt); + ui.CommandInput?.panel?.focusController?.IgnoreEvent(evt); } private void OpenConsole() { - if (commandInput == null) return; - consoleContainer.style.display = DisplayStyle.Flex; - consoleContainer.pickingMode = PickingMode.Position; - commandInput.SetValueWithoutNotify(string.Empty); + if (ui.CommandInput == null) return; + ui.Show(); + ui.CommandInput.SetValueWithoutNotify(string.Empty); RefreshSuggestions(); // Suppress the toggle key and Enter for this frame and the next so the @@ -302,33 +196,25 @@ namespace TD.Dev private IEnumerator FocusNextFrame() { yield return null; - if (consoleOpen && commandInput != null) + if (consoleOpen && ui.CommandInput != null) { - commandInput.Focus(); - commandInput.SelectAll(); + ui.CommandInput.Focus(); + ui.CommandInput.SelectAll(); } } private void CloseConsole() { - if (commandInput != null) + if (ui.CommandInput != null) { - commandInput.SetValueWithoutNotify(string.Empty); - commandInput.Blur(); - } - if (consoleContainer != null) - { - consoleContainer.style.display = DisplayStyle.None; - consoleContainer.pickingMode = PickingMode.Ignore; + ui.CommandInput.SetValueWithoutNotify(string.Empty); + ui.CommandInput.Blur(); } + ui.Hide(); suggestions.Clear(); selectedIndex = 0; - if (suggestionList != null) - { - suggestionList.Clear(); - suggestionList.style.display = DisplayStyle.None; - } + ui.ClearSuggestions(); consoleOpen = false; toggleSuppressFrame = Time.frameCount + 1; @@ -346,7 +232,7 @@ namespace TD.Dev private void SubmitCommand() { - string text = commandInput?.value ?? string.Empty; + string text = ui.CommandInput?.value ?? string.Empty; // Enter doubles as "accept the highlighted suggestion" while the typed // command isn't runnable yet, so you can drive the whole thing with Enter @@ -377,11 +263,11 @@ namespace TD.Dev public string Hint; // dim one-liner shown beside the token public Func> Values; // non-null => this level takes a final value public bool Executable; // a complete command can end here - public Type OptionType; // "get": the DraftOption subclass to match + public Action Execute; // "Values" level: run the completed command public readonly List Children = new List(); } - private const string UsageHint = "Try: get "; + private const string UsageHint = "Try: get , grant enemy "; // Maps the type token in "get " to the DraftOption subclass it // should match against. Add an entry here whenever a new DraftOption subclass @@ -412,17 +298,34 @@ namespace TD.Dev foreach (var pair in DraftTypeAliases) { + string typeToken = pair.Key; var optionType = pair.Value; get.Children.Add(new CommandNode { - Token = pair.Key, + Token = typeToken, Hint = "", - OptionType = optionType, Executable = true, Values = () => DraftOptionNames(optionType), + Execute = name => ExecuteGet(typeToken, optionType, name), }); } + var grant = new CommandNode + { + Token = "grant", + Hint = "grant a buff to the enemies", + }; + root.Children.Add(grant); + + grant.Children.Add(new CommandNode + { + Token = "enemy", + Hint = "", + Executable = true, + Values = EnemyUpgradeNames, + Execute = ExecuteGrantEnemyAbility, + }); + return root; } @@ -454,6 +357,35 @@ namespace TD.Dev return names; } + // Display names of every pooled EnemyUpgradeOption, alphabetically. Mirrors + // DraftOptionNames above — EnemyUpgradePool is the enemy-side equivalent of DraftPool, + // and this is the same Count/Get surface ExecuteGrantEnemyAbility walks. Includes + // non-ability cards too (e.g. the vote-meta "Double Dip") — DebugGrantEnemyUpgradeRpc + // resolves through EnemyUpgradeOption.ServerOnApplied regardless of subclass, so + // there's nothing this command can't actually grant. + private static List EnemyUpgradeNames() + { + var names = new List(); + + var pool = EnemyUpgradePool.Instance; + if (pool == null) return names; + + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null) continue; + + string name = option.DisplayName; + if (string.IsNullOrWhiteSpace(name)) continue; + if (names.Contains(name)) continue; + + names.Add(name); + } + + names.Sort(StringComparer.OrdinalIgnoreCase); + return names; + } + // Valid literal tokens at a level, for error messages ("Expected one of: ..."). private static string ChildTokens(CommandNode node) { @@ -640,7 +572,7 @@ namespace TD.Dev private void RefreshSuggestions() { - if (commandInput == null) return; + if (ui.CommandInput == null) return; // Keep the highlight on the same candidate when it survives the new filter, // so typing another character doesn't silently move what Enter would accept. @@ -648,7 +580,7 @@ namespace TD.Dev ? suggestions[selectedIndex].Text : null; - suggestions = ComputeSuggestions(commandInput.value, out fragmentStart); + suggestions = ComputeSuggestions(ui.CommandInput.value, out fragmentStart); selectedIndex = 0; if (previouslySelected != null) @@ -662,38 +594,15 @@ namespace TD.Dev } } - RebuildSuggestionRows(); + ui.RenderSuggestions(ToSuggestionRows(suggestions), selectedIndex); } - private void RebuildSuggestionRows() + private static List ToSuggestionRows(List suggestions) { - if (suggestionList == null) return; - - suggestionList.Clear(); - - if (suggestions.Count == 0) - { - suggestionList.style.display = DisplayStyle.None; - return; - } - - suggestionList.style.display = DisplayStyle.Flex; - - // Window the list around the highlight so arrowing past row 12 keeps the - // selected row on screen instead of scrolling it out of the truncated view. - int start = suggestions.Count > MaxVisibleSuggestions - ? Mathf.Clamp(selectedIndex - MaxVisibleSuggestions / 2, 0, - suggestions.Count - MaxVisibleSuggestions) - : 0; - int end = Mathf.Min(start + MaxVisibleSuggestions, suggestions.Count); - - for (int i = start; i < end; i++) - suggestionList.Add(BuildSuggestionRow(suggestions[i].Text, suggestions[i].Hint, - i == selectedIndex)); - - int hidden = suggestions.Count - (end - start); - if (hidden > 0) - suggestionList.Add(BuildSuggestionRow($"+{hidden} more", null, false)); + var rows = new List(suggestions.Count); + for (int i = 0; i < suggestions.Count; i++) + rows.Add(new DebugConsoleUI.SuggestionRow(suggestions[i].Text, suggestions[i].Hint)); + return rows; } private void MoveSelection(int delta) @@ -703,16 +612,16 @@ namespace TD.Dev selectedIndex = (selectedIndex + delta) % suggestions.Count; if (selectedIndex < 0) selectedIndex += suggestions.Count; - RebuildSuggestionRows(); + ui.RenderSuggestions(ToSuggestionRows(suggestions), selectedIndex); } private bool AcceptSelectedSuggestion() { - if (commandInput == null) return false; + if (ui.CommandInput == null) return false; if (selectedIndex < 0 || selectedIndex >= suggestions.Count) return false; var suggestion = suggestions[selectedIndex]; - string text = commandInput.value ?? string.Empty; + string text = ui.CommandInput.value ?? string.Empty; int start = Mathf.Clamp(fragmentStart, 0, text.Length); string completed = text.Substring(0, start) + suggestion.Text + @@ -721,8 +630,8 @@ namespace TD.Dev // SetValueWithoutNotify + an explicit refresh instead of assigning value: // one deterministic recompute, and the caret placement below can't race the // change callback. - commandInput.SetValueWithoutNotify(completed); - commandInput.SelectRange(completed.Length, completed.Length); + ui.CommandInput.SetValueWithoutNotify(completed); + ui.CommandInput.SelectRange(completed.Length, completed.Length); RefreshSuggestions(); return true; } @@ -757,14 +666,14 @@ namespace TD.Dev } string nameToken = string.Join(" ", walkTokens.GetRange(i, walkTokens.Count - i)); - ExecuteGet(node.Token, node.OptionType, nameToken); + node.Execute(nameToken); } // "get ": grants any DraftOption of the given type whose DisplayName // matches , via the local player's DebugCommandRelay. Reuses DraftOption's // existing type-agnostic ServerApply dispatch instead of hardcoding a grant path // per option type. - private void ExecuteGet(string typeToken, Type optionType, string nameToken) + private static void ExecuteGet(string typeToken, Type optionType, string nameToken) { var pool = DraftPool.Instance; if (pool == null) @@ -795,6 +704,41 @@ namespace TD.Dev Debug.LogWarning($"[DebugConsole] No {typeToken} option named \"{nameToken}\" found."); } + // "grant enemy ": the same effect as the post-wave vote picking that ability + // card for the current wave slot — records it via RunState.ServerAddUpgrade and runs + // its ServerOnApplied, mirroring WaveVote.ServerResolve exactly (see DebugCommandRelay. + // DebugGrantEnemyUpgradeRpc). Takes effect the next time this wave slot's enemies + // spawn, not retroactively on enemies already alive. + private static void ExecuteGrantEnemyAbility(string nameToken) + { + var pool = EnemyUpgradePool.Instance; + if (pool == null) + { + Debug.LogWarning("[DebugConsole] No EnemyUpgradePool in this scene."); + return; + } + + string normalizedTarget = Normalize(nameToken); + for (int i = 0; i < pool.Count; i++) + { + var option = pool.Get(i); + if (option == null || Normalize(option.DisplayName) != normalizedTarget) continue; + + var relay = DebugCommandRelay.Local; + if (relay == null) + { + Debug.LogWarning("[DebugConsole] No local DebugCommandRelay found — " + + "is it on the Player prefab?"); + return; + } + + relay.DebugGrantEnemyUpgradeRpc(i); + return; + } + + Debug.LogWarning($"[DebugConsole] No enemy ability named \"{nameToken}\" found."); + } + // DisplayName is player-facing draft card text (its spacing/casing is chosen for // presentation, not for typing), so command matching strips everything but letters // and digits before comparing — "Slow Area", "slow_area", and "SlowArea" all match diff --git a/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs new file mode 100644 index 0000000..808dd29 --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs @@ -0,0 +1,185 @@ +// Assets/_Project/Scripts/Dev/DebugConsoleUI.cs +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UIElements; + +namespace TD.Dev +{ + /// + /// Builds and draws 's VisualElement tree: the input bar and + /// its autocomplete list. Owns presentation only — element construction, styling, and + /// row rendering — no command grammar, keybinding, or suggestion-selection logic; that + /// stays in , which drives this class through its public + /// members and reads/writes directly for focus and value. + /// + internal sealed class DebugConsoleUI + { + // Beyond this many candidates the list is truncated with a "+N more" row so a + // large DraftPool can't grow the console bar off the top of the screen. + private const int MaxVisibleSuggestions = 12; + + /// One row of the autocomplete list: a candidate token plus an optional dim hint. + public readonly struct SuggestionRow + { + public readonly string Text; + public readonly string Hint; + + public SuggestionRow(string text, string hint) + { + Text = text; + Hint = hint; + } + } + + public TextField CommandInput { get; } + + private readonly VisualElement consoleContainer; + private readonly VisualElement suggestionList; + + public DebugConsoleUI(VisualElement uiRoot) + { + // Top-anchored bar, closed by default. Distinct position from the HUD's + // bottom-left chat panel so the two never overlap. + consoleContainer = new VisualElement(); + consoleContainer.pickingMode = PickingMode.Ignore; + consoleContainer.style.position = Position.Absolute; + consoleContainer.style.left = 0; + consoleContainer.style.right = 0; + consoleContainer.style.top = 0; + consoleContainer.style.paddingTop = 8; + consoleContainer.style.paddingBottom = 8; + consoleContainer.style.paddingLeft = 12; + consoleContainer.style.paddingRight = 12; + // Fully opaque: the console is a text-entry overlay that has to stay readable + // over the level, the HUD, and whatever else is on screen. + consoleContainer.style.backgroundColor = new Color(0f, 0f, 0f, 1f); + consoleContainer.style.display = DisplayStyle.None; + + CommandInput = new TextField(); + CommandInput.style.minHeight = 28; + CommandInput.style.width = Length.Percent(100); + CommandInput.maxLength = 200; + CommandInput.isDelayed = false; + StyleConsoleInput(CommandInput); + + suggestionList = new VisualElement(); + suggestionList.pickingMode = PickingMode.Ignore; + suggestionList.style.flexDirection = FlexDirection.Column; + suggestionList.style.marginTop = 4; + suggestionList.style.display = DisplayStyle.None; + + consoleContainer.Add(CommandInput); + consoleContainer.Add(suggestionList); + uiRoot.Add(consoleContainer); + } + + // Mirrors HUDController.StyleChatInputDark — dark background, white text, + // a thin border, and inner padding so ascenders/descenders don't clip. + // Green border (vs. chat's neutral gray) as a quick visual "this is the + // debug console, not chat" cue. + private static void StyleConsoleInput(TextField field) + { + var darkBg = new Color(0.05f, 0.05f, 0.05f, 1f); + var borderClr = new Color(0.35f, 0.75f, 0.35f); + + field.style.backgroundColor = darkBg; + field.style.color = Color.white; + field.style.borderTopWidth = field.style.borderBottomWidth = + field.style.borderLeftWidth = field.style.borderRightWidth = 1; + field.style.borderTopColor = field.style.borderBottomColor = + field.style.borderLeftColor = field.style.borderRightColor = borderClr; + + var inner = field.Q("unity-text-input"); + if (inner != null) + { + inner.style.backgroundColor = darkBg; + inner.style.color = Color.white; + inner.style.paddingTop = 4; + inner.style.paddingBottom = 4; + inner.style.paddingLeft = 6; + inner.style.paddingRight = 6; + } + } + + // One autocomplete row: the candidate token plus an optional dim hint. Rows are + // pickingMode Ignore and keyboard-driven only — nothing here is clickable, which + // avoids the recursive picking-mode problem documented in HUDController's chat + // panel (clicks falling through to the game world via a ScrollView's internal + // wrapper element). + private static VisualElement BuildSuggestionRow(string text, string hint, bool selected) + { + var row = new VisualElement(); + row.pickingMode = PickingMode.Ignore; + row.style.flexDirection = FlexDirection.Row; + row.style.minHeight = 20; + row.style.paddingLeft = 6; + row.style.paddingRight = 6; + row.style.backgroundColor = selected + ? new Color(0.16f, 0.38f, 0.16f, 1f) // matches the green console cue + : new Color(0.05f, 0.05f, 0.05f, 1f); + + var label = new Label(text); + label.pickingMode = PickingMode.Ignore; + label.style.color = Color.white; + label.style.unityFontStyleAndWeight = selected ? FontStyle.Bold : FontStyle.Normal; + row.Add(label); + + if (!string.IsNullOrEmpty(hint)) + { + var hintLabel = new Label(hint); + hintLabel.pickingMode = PickingMode.Ignore; + hintLabel.style.color = new Color(0.6f, 0.6f, 0.6f); + hintLabel.style.marginLeft = 12; + row.Add(hintLabel); + } + + return row; + } + + public void Show() + { + consoleContainer.style.display = DisplayStyle.Flex; + consoleContainer.pickingMode = PickingMode.Position; + } + + public void Hide() + { + consoleContainer.style.display = DisplayStyle.None; + consoleContainer.pickingMode = PickingMode.Ignore; + } + + // Windows the list around selectedIndex so arrowing past MaxVisibleSuggestions + // keeps the selected row on screen instead of scrolling it out of the truncated view. + public void RenderSuggestions(List rows, int selectedIndex) + { + suggestionList.Clear(); + + if (rows == null || rows.Count == 0) + { + suggestionList.style.display = DisplayStyle.None; + return; + } + + suggestionList.style.display = DisplayStyle.Flex; + + int start = rows.Count > MaxVisibleSuggestions + ? Mathf.Clamp(selectedIndex - MaxVisibleSuggestions / 2, 0, + rows.Count - MaxVisibleSuggestions) + : 0; + int end = Mathf.Min(start + MaxVisibleSuggestions, rows.Count); + + for (int i = start; i < end; i++) + suggestionList.Add(BuildSuggestionRow(rows[i].Text, rows[i].Hint, i == selectedIndex)); + + int hidden = rows.Count - (end - start); + if (hidden > 0) + suggestionList.Add(BuildSuggestionRow($"+{hidden} more", null, false)); + } + + public void ClearSuggestions() + { + suggestionList.Clear(); + suggestionList.style.display = DisplayStyle.None; + } + } +} diff --git a/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta new file mode 100644 index 0000000..66e439e --- /dev/null +++ b/Assets/_Project/Scripts/Dev/DebugConsoleUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fce39b2f68ef0f3f9bec299aa46d353a \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Levels/LevelBakePipeline.cs b/Assets/_Project/Scripts/Editor/Levels/LevelBakePipeline.cs index a759032..dac565b 100644 --- a/Assets/_Project/Scripts/Editor/Levels/LevelBakePipeline.cs +++ b/Assets/_Project/Scripts/Editor/Levels/LevelBakePipeline.cs @@ -802,33 +802,17 @@ namespace TD.Levels.Editor } // P5-8: zones with neither outgoing leak nor goal adjacency. - // - // OwnerOnly maps only. The rule asserts the lane-chain topology those maps are built - // around: each player's zone either hands off to the next or is the final defender. - // - // On a Shared map that assertion is wrong, not merely unnecessary. Zones there are - // typically directly adjacent with no gate between them, so most have no outgoing leak - // and are not goal-adjacent — and that is the intended shape, because the whole map is - // one contiguous maze. The property P5-8 actually protects ("enemies from this zone have - // somewhere to go") is enforced more strictly by P5-4 above, which runs a real BFS from - // every spawner to the exit set — and with no leak volumes present, that exit set is the - // goal tiles, which is exactly the right requirement. Zones with no spawners can't - // strand anything: WaveManager skips them. - if (ctx.Authoring.buildAccess == BuildAccess.OwnerOnly) - { - var zonesWithLeaks = new HashSet(); - foreach (var l in ctx.LeakExitVolumes) zonesWithLeaks.Add(l.sourceZone); + var zonesWithLeaks = new HashSet(); + foreach (var l in ctx.LeakExitVolumes) zonesWithLeaks.Add(l.sourceZone); - foreach (var owner in ctx.DeclaredOwners) + foreach (var owner in ctx.DeclaredOwners) + { + bool hasLeak = zonesWithLeaks.Contains(owner); + bool isGoalAdj = goalAdjacentZones.Contains(owner); + if (!hasLeak && !isGoalAdj) { - bool hasLeak = zonesWithLeaks.Contains(owner); - bool isGoalAdj = goalAdjacentZones.Contains(owner); - if (!hasLeak && !isGoalAdj) - { - report.Error("P5-8", $"Player zone {owner} has no outgoing leak exit AND is not goal-adjacent. " + - "Every zone must either lead somewhere or be a final defender. " + - "(This rule is skipped on Shared-build maps.)"); - } + report.Error("P5-8", $"Player zone {owner} has no outgoing leak exit AND is not goal-adjacent. " + + "Every zone must either lead somewhere or be a final defender."); } } @@ -935,7 +919,6 @@ namespace TD.Levels.Editor data.PlayerCount = ctx.Authoring.playerCount; data.MapDescription = ctx.Authoring.mapDescription; data.Author = ctx.Authoring.author; - data.BuildAccess = ctx.Authoring.buildAccess; data.GridOriginTile = ctx.GridOriginTile; data.GridSize = ctx.GridSize; @@ -1169,10 +1152,7 @@ namespace TD.Levels.Editor sb.Append("playerCount=").Append(ctx.Authoring.playerCount.ToString(inv)).Append('|'); sb.Append("expectedGoalCount=").Append(ctx.Authoring.expectedGoalCount.ToString(inv)).Append('|'); sb.Append("mapDescription=").Append(ctx.Authoring.mapDescription ?? "").Append('|'); - sb.Append("author=").Append(ctx.Authoring.author ?? "").Append('|'); - // By NAME, matching the per-volume enum convention below — a future reordering of the - // enum must not silently produce a matching hash for different rules. - sb.Append("buildAccess=").Append(ctx.Authoring.buildAccess.ToString()).Append('\n'); + sb.Append("author=").Append(ctx.Authoring.author ?? "").Append('\n'); // Volume blocks, ordered by canonical path. var rootTransform = ctx.Authoring.transform; @@ -1374,7 +1354,6 @@ namespace TD.Levels.Editor target.PlayerCount = src.PlayerCount; target.MapDescription = src.MapDescription; target.Author = src.Author; - target.BuildAccess = src.BuildAccess; target.ScenePath = src.ScenePath; target.AuthoringHash = src.AuthoringHash; target.LastBakeTimestamp = src.LastBakeTimestamp; diff --git a/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs b/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs deleted file mode 100644 index 43fc91c..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs +++ /dev/null @@ -1,356 +0,0 @@ -// Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs -using System.Collections.Generic; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEditorInternal; -using UnityEngine; -using UnityEngine.SceneManagement; - -using TD.Audio; -using TD.Dev; -using TD.Gameplay; -using TD.Gameplay.BuilderEffects; -using TD.Gameplay.BuilderSpells; -using TD.Gameplay.Draft; -using TD.Gameplay.EnemyAbilities; -using TD.Gameplay.EnemyUpgrades; -using TD.Gameplay.Waves; -using TD.UI; -using TD.VFX; - -namespace TD.Levels.Editor -{ - /// - /// One-time (re-runnable) utility that lifts every map-independent scene object out of a - /// reference match scene and bakes it into the two prefabs TD/New Map… instantiates. - /// - /// - /// Why extract instead of generating from scratch? Several of these components hold - /// ORDER-SENSITIVE arrays that double as network identity — EnemyUpgradePool.options - /// indices are card network ids, and TowerPlacementManager.towerDefinitions indices are - /// TowerTypeId. Re-deriving those from an AssetDatabase scan would produce a different - /// order than the shipping map and desync peers. Copying the live components preserves them - /// exactly. - /// - /// Two prefabs, two lifetimes. MatchServices contains no NetworkObject, so - /// new maps keep it as a LINKED prefab instance and later edits propagate everywhere. - /// MatchNetwork holds the six scene-placed NetworkBehaviours and is UNPACKED on use, so - /// what NGO sees in a generated scene is indistinguishable from a hand-authored one. - /// - /// This does not modify the reference scene's contents — temporary objects are - /// created and destroyed — but Unity still marks the scene dirty. Don't save it afterwards. - /// - public static class MapCoreExtractor - { - private const string PrefabFolder = "Assets/_Project/Prefabs/MatchCore"; - private const string ServicesPrefabPath = PrefabFolder + "/MatchServices.prefab"; - private const string NetworkPrefabPath = PrefabFolder + "/MatchNetwork.prefab"; - - // Plain (non-networked, no UIDocument) singleton services, collapsed onto the - // _MatchServices ROOT GameObject in this order. - // - // Order matters in exactly one place: AudioSource must precede MusicPlayer, whose - // [RequireComponent(typeof(AudioSource))] would otherwise auto-add a second, default-valued - // AudioSource before we get a chance to copy the authored one. - private static readonly System.Type[] RootServiceTypes = - { - typeof(LevelLoader), - typeof(PathfindingService), - typeof(SelectionState), - typeof(SelectionVisualizer), - typeof(TowerPlacementController), - typeof(TowerPaintController), - typeof(BuilderSpellCastController), - typeof(FloatingTextSpawner), - typeof(SellEffectSpawner), - typeof(AudioManager), - typeof(AudioSource), // must come before MusicPlayer — see note above - typeof(MusicPlayer), - typeof(BuilderEffectPool), - typeof(BuilderSpellPool), - typeof(EnemyAbilityPool), - typeof(EnemyUpgradePool), - typeof(DraftPool), - typeof(DraftService), - typeof(DevWaveControls), - }; - - // Scene-placed NetworkBehaviours. Each keeps its own GameObject and its own NetworkObject — - // they are only re-parented under a shared root, so network topology is unchanged. - private static readonly System.Type[] NetworkServiceTypes = - { - typeof(ChatService), - typeof(MatchState), - typeof(RunState), - typeof(TowerPlacementManager), - typeof(WaveManager), - typeof(WaveVote), - }; - - // ------------------------------------------------------------------- - // Menu entry - // ------------------------------------------------------------------- - - [MenuItem("TD/Map Pipeline/Build Core Prefabs From Open Scene", false, 200)] - public static void BuildCorePrefabs() - { - Scene scene = EditorSceneManager.GetActiveScene(); - - if (!scene.IsValid() || string.IsNullOrEmpty(scene.path)) - { - EditorUtility.DisplayDialog( - "No saved scene open", - "Open a fully-wired match scene (9Player) before running this. The extractor " + - "reads its components to build the core prefabs.", - "OK"); - return; - } - - // Pre-scan so a missing service aborts before we create anything. - if (!TryResolveSources(scene, out var rootSources, out var missing)) - { - EditorUtility.DisplayDialog( - "Reference scene is incomplete", - $"'{scene.name}' is missing {missing.Count} component(s) the core prefabs need:\n\n" + - string.Join("\n", missing) + - "\n\nOpen a complete match scene (9Player) and try again.", - "OK"); - return; - } - - bool proceed = EditorUtility.DisplayDialog( - "Build core prefabs", - $"Read '{scene.name}' and (re)write:\n\n" + - $" {ServicesPrefabPath}\n" + - $" {NetworkPrefabPath}\n\n" + - "The scene's own contents are not changed, but Unity will mark it dirty. " + - "Don't save it afterwards.\n\nProceed?", - "Build Prefabs", - "Cancel"); - if (!proceed) return; - - MapTemplate.EnsureFolder(PrefabFolder); - - GameObject servicesPrefab = BuildServicesPrefab(scene, rootSources); - GameObject networkPrefab = BuildNetworkPrefab(scene); - - var template = MapTemplate.LoadOrCreate(); - template.matchServicesPrefab = servicesPrefab; - template.matchNetworkPrefab = networkPrefab; - CaptureTerrainDefaults(scene, template); - EditorUtility.SetDirty(template); - - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - - Debug.Log( - $"[MapPipeline] Core prefabs built from '{scene.name}'.\n" + - $" MatchServices: {RootServiceTypes.Length} components on the root + HUD / DebugConsole / " + - $"CameraRig / lighting children.\n" + - $" MatchNetwork: {NetworkServiceTypes.Length} NetworkBehaviours under one root.\n" + - $" Template: {MapTemplate.AssetPath}\n" + - $" '{scene.name}' is now marked dirty by the temporary objects — do NOT save it."); - - EditorGUIUtility.PingObject(template); - } - - // ------------------------------------------------------------------- - // Source resolution - // ------------------------------------------------------------------- - - // Resolves every root-service component up front. Returns false (with a human-readable list) - // if anything is absent, so we never write a half-populated prefab. - private static bool TryResolveSources(Scene scene, out List rootSources, - out List missing) - { - rootSources = new List(RootServiceTypes.Length); - missing = new List(); - - // AudioSource is resolved from MusicPlayer's GameObject rather than "first in scene", - // so we copy the music source's authored volume rather than some unrelated emitter. - var musicPlayer = FindOne(scene, typeof(MusicPlayer)) as MusicPlayer; - - foreach (var type in RootServiceTypes) - { - Component found = type == typeof(AudioSource) - ? (musicPlayer != null ? musicPlayer.GetComponent() : null) - : FindOne(scene, type); - - if (found == null) missing.Add(" • " + type.Name); - rootSources.Add(found); - } - - foreach (var type in NetworkServiceTypes) - { - if (FindOne(scene, type) == null) missing.Add(" • " + type.Name); - } - - if (FindOne(scene, typeof(HUDController)) == null) missing.Add(" • HUDController"); - if (FindOne(scene, typeof(CameraController)) == null) missing.Add(" • CameraController"); - - return missing.Count == 0; - } - - // Scans the scene's root objects rather than Object.FindObjectsByType: the FindObjectsByType - // overload set has churned across Unity 6.x (FindObjectsSortMode deprecation), and walking - // roots is stable across all of them. - private static Component FindOne(Scene scene, System.Type type) - { - foreach (var root in scene.GetRootGameObjects()) - { - var found = root.GetComponentInChildren(type, true); - if (found != null) return found; - } - return null; - } - - private static Light FindDirectionalLight(Scene scene) - { - foreach (var root in scene.GetRootGameObjects()) - { - foreach (var light in root.GetComponentsInChildren(true)) - { - if (light.type == LightType.Directional) return light; - } - } - return null; - } - - // ------------------------------------------------------------------- - // MatchServices prefab - // ------------------------------------------------------------------- - - private static GameObject BuildServicesPrefab(Scene scene, List rootSources) - { - var root = new GameObject("_MatchServices"); - - // Flatten every plain service onto the root. CopyComponent/PasteComponentAsNew carries - // all serialized values, including the order-sensitive asset arrays. - for (int i = 0; i < rootSources.Count; i++) - { - var src = rootSources[i]; - if (src == null) continue; - ComponentUtility.CopyComponent(src); - ComponentUtility.PasteComponentAsNew(root); - } - - // Components that need their own GameObject: UIDocument is [DisallowMultipleComponent], - // so HUD and DebugConsole can't share one; CameraRig needs an independently-moving - // transform with the Camera as its child. - GameObject hud = CloneUnder(FindOne(scene, typeof(HUDController)), root, "HUD"); - CloneUnder(FindOne(scene, typeof(DebugConsole)), root, "DebugConsole"); - GameObject cameraRig = CloneUnder(FindOne(scene, typeof(CameraController)), root, "CameraRig"); - CloneUnder(FindDirectionalLight(scene), root, "Directional Light"); - - // Post-processing volume is optional — 9Player doesn't have one, Main does. - CloneUnder(FindOne(scene, typeof(UnityEngine.Rendering.Volume)), root, "Global Volume"); - - RewireHudReferences(hud, root, cameraRig); - ClearBakedLevelReference(root); - - var prefab = PrefabUtility.SaveAsPrefabAsset(root, ServicesPrefabPath); - Object.DestroyImmediate(root); - return prefab; - } - - // Instantiate() remaps references that point INSIDE the copied hierarchy but leaves - // references that point outside it aimed at the original scene objects. Saving a prefab - // silently nulls those, so re-aim them at the prefab-internal equivalents first. - private static void RewireHudReferences(GameObject hud, GameObject root, GameObject cameraRig) - { - if (hud == null) return; - var controller = hud.GetComponent(); - if (controller == null) return; - - var so = new SerializedObject(controller); - SetRef(so, "placementController", root.GetComponent()); - SetRef(so, "paintController", root.GetComponent()); - SetRef(so, "cameraController", - cameraRig != null ? cameraRig.GetComponent() : null); - - // TowerPlacementManager lives in the OTHER prefab (it's a NetworkBehaviour), so this - // reference cannot be satisfied here. HUDController already falls back to - // TowerPlacementManager.Instance and retries per-frame until the object spawns, so - // leaving it null is the correct wiring, not a gap. - SetRef(so, "placementManager", null); - - so.ApplyModifiedPropertiesWithoutUndo(); - } - - // The reference scene's LevelLoader points at that map's LevelData. The prefab is map- - // independent, so blank it — NewMapBuilder sets it per-instance as a prefab override. - private static void ClearBakedLevelReference(GameObject root) - { - var loader = root.GetComponent(); - if (loader == null) return; - - var so = new SerializedObject(loader); - SetRef(so, "level", null); - so.ApplyModifiedPropertiesWithoutUndo(); - } - - // ------------------------------------------------------------------- - // MatchNetwork prefab - // ------------------------------------------------------------------- - - private static GameObject BuildNetworkPrefab(Scene scene) - { - var root = new GameObject("_MatchNetwork"); - - foreach (var type in NetworkServiceTypes) - { - CloneUnder(FindOne(scene, type), root, type.Name); - } - - var prefab = PrefabUtility.SaveAsPrefabAsset(root, NetworkPrefabPath); - Object.DestroyImmediate(root); - return prefab; - } - - // ------------------------------------------------------------------- - // Terrain defaults - // ------------------------------------------------------------------- - - private static void CaptureTerrainDefaults(Scene scene, MapTemplate template) - { - var terrain = FindOne(scene, typeof(Terrain)) as Terrain; - if (terrain == null) return; - - if (terrain.materialTemplate != null) template.terrainMaterial = terrain.materialTemplate; - if (terrain.terrainData != null && terrain.terrainData.terrainLayers != null && - terrain.terrainData.terrainLayers.Length > 0) - { - template.terrainLayers = terrain.terrainData.terrainLayers; - } - } - - // ------------------------------------------------------------------- - // Helpers - // ------------------------------------------------------------------- - - // Clones the component's whole GameObject subtree and parents it under root. - // Returns null (silently) when source is null — callers treat those as optional. - private static GameObject CloneUnder(Component source, GameObject root, string name) - { - if (source == null) return null; - - var clone = Object.Instantiate(source.gameObject); - clone.name = name; - clone.transform.SetParent(root.transform, worldPositionStays: false); - return clone; - } - - private static void SetRef(SerializedObject so, string propertyPath, Object value) - { - var prop = so.FindProperty(propertyPath); - if (prop == null) - { - Debug.LogWarning($"[MapPipeline] Serialized field '{propertyPath}' not found on " + - $"{so.targetObject.GetType().Name}. It was probably renamed — " + - "update MapCoreExtractor."); - return; - } - prop.objectReferenceValue = value; - } - } -} diff --git a/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs.meta b/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs.meta deleted file mode 100644 index 7dfcd04..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/MapCoreExtractor.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: d1b948bcbbe8d8b4788f2056372280b3 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs b/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs deleted file mode 100644 index 0d112c0..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs +++ /dev/null @@ -1,292 +0,0 @@ -// Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs -using UnityEditor; -using UnityEngine; - -namespace TD.Levels.Editor -{ - /// - /// Editor-only settings asset that drives TD/New Map…. Holds the two core prefabs - /// produced by plus every default the new-map generator needs, - /// so tuning the starter layout is an inspector edit rather than a code change. - /// - /// - /// Lives in the Editor assembly deliberately — nothing at runtime reads it, and keeping the - /// type editor-only stops it from being pulled into a player build. - /// - /// The asset is created on demand at . If it goes missing, both - /// TD/New Map… and the extractor recreate it with defaults; only the prefab references - /// and captured terrain settings are lost, and re-running the extractor restores those. - /// - public class MapTemplate : ScriptableObject - { - public const string AssetPath = "Assets/_Project/Settings/MapTemplate.asset"; - - // ------------------------------------------------------------------- - // Core prefabs. Populated by MapCoreExtractor; consumed by NewMapBuilder. - // ------------------------------------------------------------------- - - [Header("Core Prefabs (built by TD/Map Pipeline/Build Core Prefabs)")] - [Tooltip("Every map-independent, non-networked service collapsed onto one GameObject " + - "(plus HUD / DebugConsole / CameraRig / light children). Instantiated as a LINKED " + - "prefab instance so edits here propagate to every map.")] - public GameObject matchServicesPrefab; - - [Tooltip("The six scene-placed NetworkBehaviours, parented under one root. Instantiated " + - "and immediately UNPACKED so the scene contains plain GameObjects — network " + - "topology stays byte-identical to hand-authored maps.")] - public GameObject matchNetworkPrefab; - - // ------------------------------------------------------------------- - // Output locations. - // ------------------------------------------------------------------- - - [Header("Output Locations")] - [Tooltip("Folder new map scenes, their LevelData, and their TerrainData are written to. " + - "Drag the folder itself here — an asset reference follows renames and moves, " + - "which a path string does not.")] - public DefaultAsset sceneFolderAsset; - - [Tooltip("Scene holding the MapRegistry that the lobby's map browser reads. New maps are " + - "appended to its Maps array automatically.")] - public SceneAsset mainMenuScene; - - // Legacy path strings, superseded by the asset references above. Kept so an existing - // template migrates itself (see MigratePathsToAssets) and as a last resort if a reference - // is cleared. Hidden so there's exactly one obvious place to edit. - [HideInInspector] public string sceneFolder = "Assets/_Project/Scenes/Levels"; - [HideInInspector] public string mainMenuScenePath = "Assets/_Project/Scenes/UI/MainMenu.unity"; - - /// - /// Folder new maps are written to. Prefers ; falls back to the - /// legacy path string if the reference is unset or doesn't point at a folder. - /// - public string SceneFolderPath - { - get - { - if (sceneFolderAsset != null) - { - string path = AssetDatabase.GetAssetPath(sceneFolderAsset); - if (AssetDatabase.IsValidFolder(path)) return path; - - Debug.LogWarning($"[MapPipeline] MapTemplate's Scene Folder Asset points at " + - $"'{path}', which is not a folder. Falling back to '{sceneFolder}'."); - } - return sceneFolder; - } - } - - /// - /// Scene containing the MapRegistry. Prefers ; falls back to the - /// legacy path string. Returns empty if neither resolves. - /// - public string MainMenuScenePath - { - get - { - if (mainMenuScene != null) - { - string path = AssetDatabase.GetAssetPath(mainMenuScene); - if (!string.IsNullOrEmpty(path)) return path; - } - return mainMenuScenePath ?? string.Empty; - } - } - - // ------------------------------------------------------------------- - // Terrain defaults. Captured from the reference scene by the extractor. - // ------------------------------------------------------------------- - - [Header("Terrain Defaults")] - [Tooltip("Material applied to new terrain. Captured from the reference scene's Terrain.")] - public Material terrainMaterial; - - [Tooltip("Terrain layers (splat textures) applied to new terrain.")] - public TerrainLayer[] terrainLayers; - - [Tooltip("Heightmap resolution. Must be 2^n + 1 (129, 257, 513, 1025…).")] - public int terrainHeightmapResolution = 513; - - [Tooltip("Total vertical range of the terrain in world units.")] - public float terrainHeight = 60f; - - [Tooltip("How far the terrain extends past the map bounds on each side, in tiles. Gives " + - "the camera something to look at beyond the playable area.")] - public int terrainSkirtTiles = 20; - - [Tooltip("Terrain is created flattened to this height above its own base, and its transform " + - "is dropped by the same amount — so the flat surface lands exactly on the buildable " + - "plane (Y=0) while leaving headroom to carve DOWN as well as up. Set 0 to match the " + - "older 9Player setup (surface at the very bottom of the height range).")] - public float terrainCarveDepth = 5f; - - // ------------------------------------------------------------------- - // Starter layout. All values in tiles. - // ------------------------------------------------------------------- - - [Header("Starter Layout (tiles)")] - [Tooltip("Default map width for the New Map dialog.")] - public int defaultMapWidth = 60; - - [Tooltip("Default map height for the New Map dialog.")] - public int defaultMapHeight = 70; - - [Tooltip("Gap between the map edge (MapAreaVolume) and the gameplay volumes. The map area " + - "must fully contain every gameplay volume, and the buffer gives the camera room " + - "to pan past the playfield.")] - public int playAreaMargin = 4; - - [Tooltip("Depth (north-south) of the GoalVolume.")] - public int goalDepth = 5; - - [Tooltip("Width (east-west) of the GoalVolume.")] - public int goalWidth = 10; - - [Tooltip("Depth of each SpawnerVolume, measured from the south edge of its owner's band.")] - public int spawnerDepth = 3; - - [Tooltip("Width of each SpawnerVolume.")] - public int spawnerWidth = 10; - - [Tooltip("Width of the one-tile-deep LeakExitVolume gate between adjacent player bands.")] - public int leakGateWidth = 8; - - [Tooltip("Smallest acceptable north-south depth for a player band. The New Map dialog " + - "refuses to generate a layout thinner than this and tells you the map height needed.")] - public int minBandDepth = 8; - - // ------------------------------------------------------------------- - // Loading - // ------------------------------------------------------------------- - - /// - /// Returns the template asset, creating it with defaults if it doesn't exist yet. - /// Never returns null. - /// - public static MapTemplate LoadOrCreate() - { - var existing = AssetDatabase.LoadAssetAtPath(AssetPath); - if (existing != null) - { - existing.MigratePathsToAssets(); - return existing; - } - - EnsureFolder(System.IO.Path.GetDirectoryName(AssetPath).Replace("\\", "/")); - - var created = CreateInstance(); - AssetDatabase.CreateAsset(created, AssetPath); - created.MigratePathsToAssets(); - AssetDatabase.SaveAssets(); - Debug.Log($"[MapPipeline] Created default map template at '{AssetPath}'."); - return created; - } - - /// - /// Upgrades a template that still stores locations as path strings, resolving each to an - /// asset reference. Idempotent and cheap — safe to call on every load. - /// - /// - /// If the recorded path no longer resolves (the folder was renamed out from under it, which - /// is exactly the failure the asset references exist to prevent), falls back to searching - /// the project for a uniquely-named match. An ambiguous match is left unresolved on purpose: - /// guessing which of several same-named scenes holds the MapRegistry would be worse than - /// asking. - /// - private void MigratePathsToAssets() - { - bool changed = false; - - if (sceneFolderAsset == null && !string.IsNullOrEmpty(sceneFolder) - && AssetDatabase.IsValidFolder(sceneFolder)) - { - sceneFolderAsset = AssetDatabase.LoadAssetAtPath(sceneFolder); - changed |= sceneFolderAsset != null; - } - - if (mainMenuScene == null && !string.IsNullOrEmpty(mainMenuScenePath)) - { - var scene = AssetDatabase.LoadAssetAtPath(mainMenuScenePath); - - if (scene == null) - { - string wanted = System.IO.Path.GetFileNameWithoutExtension(mainMenuScenePath); - scene = FindUniqueSceneNamed(wanted); - if (scene != null) - { - Debug.Log($"[MapPipeline] MapTemplate's recorded Main Menu path " + - $"'{mainMenuScenePath}' no longer exists; relinked to " + - $"'{AssetDatabase.GetAssetPath(scene)}'."); - } - } - - if (scene != null) - { - mainMenuScene = scene; - changed = true; - } - } - - if (changed) - { - EditorUtility.SetDirty(this); - AssetDatabase.SaveAssets(); - } - } - - // Returns the one SceneAsset whose file name matches exactly, or null if there are zero or - // several. Name search only — the caller has already failed to resolve by path. - private static SceneAsset FindUniqueSceneNamed(string sceneName) - { - if (string.IsNullOrEmpty(sceneName)) return null; - - string[] guids = AssetDatabase.FindAssets($"{sceneName} t:SceneAsset"); - SceneAsset first = null; - int matches = 0; - - foreach (string guid in guids) - { - string path = AssetDatabase.GUIDToAssetPath(guid); - if (!string.Equals(System.IO.Path.GetFileNameWithoutExtension(path), sceneName, - System.StringComparison.OrdinalIgnoreCase)) - { - continue; // FindAssets does substring matching; we want an exact file name. - } - - matches++; - if (first == null) first = AssetDatabase.LoadAssetAtPath(path); - } - - if (matches > 1) - { - Debug.LogWarning($"[MapPipeline] Found {matches} scenes named '{sceneName}'. " + - "Assign Main Menu Scene on MapTemplate manually."); - return null; - } - - return first; - } - - /// - /// Creates and any missing ancestors. Path is asset-relative and - /// uses forward slashes ("Assets/_Project/Prefabs/MatchCore"). No-op if it already exists. - /// - public static void EnsureFolder(string folder) - { - if (string.IsNullOrEmpty(folder) || AssetDatabase.IsValidFolder(folder)) return; - - string[] parts = folder.Split('/'); - // parts[0] is always "Assets" for a valid asset path; walk down creating as needed. - string running = parts[0]; - for (int i = 1; i < parts.Length; i++) - { - string next = running + "/" + parts[i]; - if (!AssetDatabase.IsValidFolder(next)) - { - AssetDatabase.CreateFolder(running, parts[i]); - } - running = next; - } - } - } -} diff --git a/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs.meta b/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs.meta deleted file mode 100644 index 7fbc813..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/MapTemplate.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: fb7355881928ea146a26471078f207c2 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs b/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs deleted file mode 100644 index 737e97b..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs +++ /dev/null @@ -1,578 +0,0 @@ -// Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using UnityEditor; -using UnityEditor.SceneManagement; -using UnityEngine; -using UnityEngine.SceneManagement; - -using TD.Core; -using TD.Gameplay; - -namespace TD.Levels.Editor -{ - /// - /// Everything the TD/New Map… command does once the designer presses Create: build the - /// scene, generate a starter volume layout that bakes clean, create and wire the LevelData, and - /// perform the three registration steps that otherwise fail silently (Build Settings, the - /// LevelLoader reference, and the lobby's MapRegistry). - /// - /// - /// The generated scene has four roots — _LevelAuthoring, _MatchServices, - /// _MatchNetwork, Terrain — replacing the ~30 the hand-authored maps carry. - /// - public static class NewMapBuilder - { - // The physics layer terrain must sit on. Builder.SampleTerrainY and - // BuilderSpellCastController both raycast against it; terrain left on Default silently - // falls back to Y=0 and the builder walks through hills instead of over them. - private const string TerrainLayerName = "TerrainGeometry"; - - // Vertical size of every authoring volume's BoxCollider. Any value works so long as the - // bounds straddle Y=0 (bake rule P2-18); 1 unit centred on zero matches 9Player. - private const float VolumeHeight = 1f; - - private static readonly Regex ValidName = new Regex(@"^[A-Za-z0-9_]+$"); - - // ------------------------------------------------------------------- - // Request - // ------------------------------------------------------------------- - - public class Request - { - public string MapName = "NewMap"; - public int PlayerCount = 3; - public int MapWidth = 60; - public int MapHeight = 70; - public string Author = ""; - public string Description = ""; - public BuildAccess BuildAccess = BuildAccess.OwnerOnly; - public bool CreateTerrain = true; - public bool AddToBuildSettings = true; - public bool AddToMapRegistry = true; - public bool BakeImmediately = true; - } - - // ------------------------------------------------------------------- - // Starter layout - // ------------------------------------------------------------------- - - /// - /// Tile rectangles for a generated starter map. Zones are stacked south-to-north as - /// full-width bands; enemies spawn at the south edge of their owner's band and travel north - /// through a one-tile leak gate into the next player's band, with the goal north of the - /// final band. - /// - public struct Layout - { - public RectInt MapArea; - public RectInt[] Zones; // index 0 = Player1 - public RectInt[] Spawners; // parallel to Zones - public RectInt[] Leaks; // Zones.Length - 1 entries; Leaks[i] runs zone i -> zone i+1 - public RectInt Goal; - public int BandDepth; - } - - /// - /// Computes the starter layout, or explains why the requested dimensions can't hold one. - /// Pure — safe to call every OnGUI frame for live validation. - /// - public static bool TryComputeLayout(MapTemplate template, int mapWidth, int mapHeight, - int playerCount, BuildAccess buildAccess, - out Layout layout, out string error) - { - layout = default; - error = null; - - // OwnerOnly maps get a one-tile leak gate between bands: it is the only walkable - // connection, which is what forces enemies through a chokepoint and makes the handoff - // between lanes legible. Shared maps skip gates entirely and butt the bands together — - // the whole map is one maze, so a gate would just be an arbitrary pinch, and with no - // LeakExitVolume the gap row would not be walkable at all. - bool useLeakGates = buildAccess == BuildAccess.OwnerOnly; - int gapRows = useLeakGates ? playerCount - 1 : 0; - - int margin = Mathf.Max(0, template.playAreaMargin); - int playX0 = margin; - int playY0 = margin; - int playW = mapWidth - margin * 2; - int playH = mapHeight - margin * 2; - - int widestFeature = Mathf.Max(template.goalWidth, - Mathf.Max(template.spawnerWidth, template.leakGateWidth)); - if (playW < widestFeature) - { - error = $"Map is too narrow. The play area is {playW} tiles wide after the " + - $"{margin}-tile margin, but the widest starter feature needs {widestFeature}. " + - $"Use a width of at least {widestFeature + margin * 2}."; - return false; - } - - // Vertical budget: N bands + the gate rows (if any) + the goal. - int budget = playH - gapRows - template.goalDepth; - int bandDepth = playerCount > 0 ? budget / playerCount : 0; - - int minBand = Mathf.Max(template.minBandDepth, template.spawnerDepth + 1); - if (bandDepth < minBand) - { - int required = playerCount * minBand + gapRows - + template.goalDepth + margin * 2; - error = $"Map is too shallow for {playerCount} player band(s). Each band would be " + - $"{Mathf.Max(bandDepth, 0)} tiles deep; the minimum is {minBand}. " + - $"Use a height of at least {required}."; - return false; - } - - layout.MapArea = new RectInt(0, 0, mapWidth, mapHeight); - layout.BandDepth = bandDepth; - layout.Zones = new RectInt[playerCount]; - layout.Spawners = new RectInt[playerCount]; - layout.Leaks = new RectInt[useLeakGates ? Mathf.Max(0, playerCount - 1) : 0]; - - int y = playY0; - for (int i = 0; i < playerCount; i++) - { - layout.Zones[i] = new RectInt(playX0, y, playW, bandDepth); - - // Spawner sits at the south edge of its own band, so enemies always have the full - // band depth to walk through before reaching the exit (bake rule P5-5 wants it - // inside the owner's zone). - int spawnW = Mathf.Min(template.spawnerWidth, playW); - layout.Spawners[i] = new RectInt( - CenteredStart(playX0, playW, spawnW), y, spawnW, template.spawnerDepth); - - y += bandDepth; - - if (useLeakGates && i < playerCount - 1) - { - // One-tile gate wedged between two bands: its south neighbours are band i and - // its north neighbours are band i+1, satisfying both adjacency rules (P5-6/P5-7). - int gateW = Mathf.Min(template.leakGateWidth, playW); - layout.Leaks[i] = new RectInt( - CenteredStart(playX0, playW, gateW), y, gateW, 1); - y += 1; - } - } - - int goalW = Mathf.Min(template.goalWidth, playW); - layout.Goal = new RectInt( - CenteredStart(playX0, playW, goalW), y, goalW, template.goalDepth); - - return true; - } - - private static int CenteredStart(int areaStart, int areaWidth, int featureWidth) - { - return areaStart + (areaWidth - featureWidth) / 2; - } - - // ------------------------------------------------------------------- - // Creation - // ------------------------------------------------------------------- - - /// - /// Creates the map. Returns false with a human-readable reason on any precondition failure; - /// nothing is written to disk in that case. - /// - public static bool Create(Request request, out string error) - { - error = null; - var template = MapTemplate.LoadOrCreate(); - - if (!ValidatePreconditions(request, template, out error)) return false; - - if (!TryComputeLayout(template, request.MapWidth, request.MapHeight, - request.PlayerCount, request.BuildAccess, - out Layout layout, out error)) - { - return false; - } - - string folder = template.SceneFolderPath; - string scenePath = $"{folder}/{request.MapName}.unity"; - string dataPath = $"{folder}/{request.MapName}.asset"; - - // Give the designer a chance to save whatever they had open — NewScene(Single) would - // otherwise discard it. - if (!EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo()) - { - error = "Cancelled while saving the currently open scene."; - return false; - } - - MapTemplate.EnsureFolder(folder); - - Scene scene = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene, NewSceneMode.Single); - - // ---- Core objects ------------------------------------------- - var services = (GameObject)PrefabUtility.InstantiatePrefab(template.matchServicesPrefab); - services.name = "_MatchServices"; - - var network = (GameObject)PrefabUtility.InstantiatePrefab(template.matchNetworkPrefab); - network.name = "_MatchNetwork"; - // Unpack so the six NetworkObjects are plain scene objects. NGO treats in-scene placed - // NetworkObjects that are prefab instances differently from loose ones; unpacking keeps - // generated maps structurally identical to the hand-authored ones. - PrefabUtility.UnpackPrefabInstance( - network, PrefabUnpackMode.Completely, InteractionMode.AutomatedAction); - - // ---- LevelData ---------------------------------------------- - var levelData = ScriptableObject.CreateInstance(); - AssetDatabase.CreateAsset(levelData, dataPath); - - // ---- Authoring hierarchy ------------------------------------ - LevelAuthoring authoring = BuildAuthoring(request, layout, levelData); - - // ---- Terrain ------------------------------------------------- - if (request.CreateTerrain) - { - CreateTerrain(request, template); - } - - // ---- Wire the runtime loader --------------------------------- - // LevelLoader lives inside the linked MatchServices prefab; assigning here records a - // per-instance override, which is exactly the intent — the asset differs per map. - WireLevelLoader(services, levelData); - - // ---- Save + register ----------------------------------------- - EditorSceneManager.SaveScene(scene, scenePath); - - var notes = new List(); - - if (request.AddToBuildSettings) notes.Add(RegisterInBuildSettings(scenePath)); - if (request.AddToMapRegistry) notes.Add(RegisterInMapRegistry(template, levelData)); - - // Bake last: it stamps LevelData.ScenePath from the ACTIVE scene, so the scene has to - // be saved (and therefore have a path) before this runs. - if (request.BakeImmediately) - { - notes.Add(LevelBakePipeline.Bake(authoring) - ? "Baked LevelData (see console for the bake report)." - : "Bake FAILED — see console. The scene and assets were still created."); - } - - AssetDatabase.SaveAssets(); - AssetDatabase.Refresh(); - - Selection.activeGameObject = authoring.gameObject; - if (SceneView.lastActiveSceneView != null) SceneView.lastActiveSceneView.FrameSelected(); - - Debug.Log( - $"[MapPipeline] Created map '{request.MapName}' " + - $"({request.PlayerCount} player(s), {request.MapWidth}×{request.MapHeight} tiles, " + - $"band depth {layout.BandDepth}).\n" + - $" Scene: {scenePath}\n" + - $" LevelData: {dataPath}\n" + - string.Join("\n", notes.Where(n => !string.IsNullOrEmpty(n)).Select(n => " " + n))); - - return true; - } - - private static bool ValidatePreconditions(Request request, MapTemplate template, - out string error) - { - error = null; - - if (string.IsNullOrWhiteSpace(request.MapName) || !ValidName.IsMatch(request.MapName)) - { - error = "Map name must be letters, digits and underscores only — it becomes the " + - "scene file name and the string NGO uses to load the scene."; - return false; - } - - if (template.matchServicesPrefab == null || template.matchNetworkPrefab == null) - { - error = "Core prefabs are missing. Open the 9Player scene and run " + - "TD → Map Pipeline → Build Core Prefabs From Open Scene first."; - return false; - } - - string folder = template.SceneFolderPath; - if (string.IsNullOrEmpty(folder)) - { - error = "MapTemplate has no output folder. Assign Scene Folder Asset on " + - MapTemplate.AssetPath + "."; - return false; - } - - string scenePath = $"{folder}/{request.MapName}.unity"; - if (System.IO.File.Exists(scenePath)) - { - error = $"A scene already exists at '{scenePath}'. Pick a different name."; - return false; - } - - string dataPath = $"{folder}/{request.MapName}.asset"; - if (System.IO.File.Exists(dataPath)) - { - error = $"A LevelData asset already exists at '{dataPath}'. Pick a different name."; - return false; - } - - return true; - } - - // ------------------------------------------------------------------- - // Authoring hierarchy - // ------------------------------------------------------------------- - - private static LevelAuthoring BuildAuthoring(Request request, Layout layout, - LevelData levelData) - { - var rootGO = new GameObject("_LevelAuthoring"); - var authoring = rootGO.AddComponent(); - - authoring.targetAsset = levelData; - authoring.mapName = request.MapName; - authoring.playerCount = request.PlayerCount; - authoring.expectedGoalCount = 1; - authoring.mapDescription = request.Description ?? ""; - authoring.author = request.Author ?? ""; - authoring.buildAccess = request.BuildAccess; - - // Default every gizmo category on. A designer opening a fresh map wants to SEE the - // starter layout without hunting for toggles; turning them off is the deliberate act. - authoring.alwaysShowPlayerZones = true; - authoring.alwaysShowSpawners = true; - authoring.alwaysShowLeakExits = true; - authoring.alwaysShowGoals = true; - authoring.alwaysShowMapArea = true; - - CreateVolume("MapArea", rootGO.transform, layout.MapArea); - - var goal = CreateVolume("Goal", rootGO.transform, layout.Goal); - goal.GetComponent().placementValidity = PlacementValidity.Invalid; - - for (int i = 0; i < request.PlayerCount; i++) - { - int playerNumber = i + 1; - var slot = (PlayerSlot)(byte)playerNumber; - - var group = new GameObject($"Player {playerNumber}"); - group.transform.SetParent(rootGO.transform, worldPositionStays: false); - - var zone = CreateVolume( - $"Player{playerNumber}Zone", group.transform, layout.Zones[i]); - var zoneVolume = zone.GetComponent(); - zoneVolume.owner = slot; - zoneVolume.placementValidity = PlacementValidity.Allowed; - - var spawn = CreateVolume( - $"Player{playerNumber}Spawn", group.transform, layout.Spawners[i]); - var spawnVolume = spawn.GetComponent(); - spawnVolume.owner = slot; - spawnVolume.spawnerIdInZone = 0; - spawnVolume.spawnFacing = Direction.North; // bands run south -> north - spawnVolume.placementValidity = PlacementValidity.Invalid; - - // The northernmost band has no leak — it's the final defender, and its zone is - // goal-adjacent instead (bake rule P5-8). - if (i < layout.Leaks.Length) - { - var leak = CreateVolume( - $"Player{playerNumber}Leak", group.transform, layout.Leaks[i]); - var leakVolume = leak.GetComponent(); - leakVolume.sourceZone = slot; - leakVolume.target = (PlayerSlot)(byte)(playerNumber + 1); - leakVolume.weight = 1f; - leakVolume.placementValidity = PlacementValidity.Invalid; - } - } - - return authoring; - } - - // Builds one authoring volume covering the given tile rectangle. Tiles are edge-aligned, so - // a rect spanning tiles [x0..x1] occupies world X [x0, x1+1] — which is exactly - // RectInt.xMin..RectInt.xMax. Geometry goes on the BoxCollider (centre zero, size = extent) - // with the transform at the volume's centre, matching the existing maps and keeping - // VolumeEditTool's edge-drag behaviour predictable. - private static GameObject CreateVolume(string name, Transform parent, RectInt tiles) - where T : VolumeBase - { - var go = new GameObject(name); - go.transform.SetParent(parent, worldPositionStays: false); - go.transform.localPosition = new Vector3( - (tiles.xMin + tiles.xMax) * 0.5f * GridCoordinates.TILE_SIZE, - 0f, - (tiles.yMin + tiles.yMax) * 0.5f * GridCoordinates.TILE_SIZE); - - // Added before the volume component so VolumeBase's [RequireComponent] doesn't add a - // second, default-sized collider. - var collider = go.AddComponent(); - collider.center = Vector3.zero; - collider.size = new Vector3( - tiles.width * GridCoordinates.TILE_SIZE, - VolumeHeight, - tiles.height * GridCoordinates.TILE_SIZE); - - go.AddComponent(); - return go; - } - - // ------------------------------------------------------------------- - // Terrain - // ------------------------------------------------------------------- - - private static void CreateTerrain(Request request, MapTemplate template) - { - int skirt = Mathf.Max(0, template.terrainSkirtTiles); - float carve = Mathf.Clamp(template.terrainCarveDepth, 0f, template.terrainHeight); - - var data = new TerrainData { name = request.MapName + "_TerrainData" }; - // Resolution before size: changing heightmapResolution resets size. - data.heightmapResolution = template.terrainHeightmapResolution; - data.size = new Vector3( - request.MapWidth + skirt * 2f, - Mathf.Max(1f, template.terrainHeight), - request.MapHeight + skirt * 2f); - - if (template.terrainLayers != null && template.terrainLayers.Length > 0) - { - data.terrainLayers = template.terrainLayers; - } - - // Start the surface partway up its own height range and drop the transform to match, so - // the flat ground lands on the buildable plane (Y=0) with room to carve downwards. - if (carve > 0f) - { - int res = data.heightmapResolution; - float normalized = carve / Mathf.Max(1f, template.terrainHeight); - var heights = new float[res, res]; - for (int y = 0; y < res; y++) - { - for (int x = 0; x < res; x++) heights[y, x] = normalized; - } - data.SetHeights(0, 0, heights); - } - - AssetDatabase.CreateAsset( - data, $"{template.SceneFolderPath}/{request.MapName}_TerrainData.asset"); - - var terrainGO = Terrain.CreateTerrainGameObject(data); - terrainGO.name = "Terrain"; - terrainGO.transform.position = new Vector3(-skirt, -carve, -skirt); - - int layer = LayerMask.NameToLayer(TerrainLayerName); - if (layer >= 0) - { - terrainGO.layer = layer; - } - else - { - Debug.LogWarning( - $"[MapPipeline] Layer '{TerrainLayerName}' does not exist, so the new terrain was " + - "left on Default. The builder's ground raycast and spell targeting both filter " + - "on that layer and will ignore this terrain until it's fixed."); - } - - if (template.terrainMaterial != null) - { - terrainGO.GetComponent().materialTemplate = template.terrainMaterial; - } - } - - // ------------------------------------------------------------------- - // Wiring and registration - // ------------------------------------------------------------------- - - private static void WireLevelLoader(GameObject services, LevelData levelData) - { - var loader = services.GetComponentInChildren(true); - if (loader == null) - { - Debug.LogError("[MapPipeline] MatchServices prefab has no LevelLoader — the map " + - "will not load at runtime. Re-run Build Core Prefabs."); - return; - } - - var so = new SerializedObject(loader); - var prop = so.FindProperty("level"); - if (prop == null) - { - Debug.LogError("[MapPipeline] LevelLoader has no serialized field 'level'. It was " + - "renamed — update NewMapBuilder."); - return; - } - prop.objectReferenceValue = levelData; - so.ApplyModifiedPropertiesWithoutUndo(); - } - - private static string RegisterInBuildSettings(string scenePath) - { - var scenes = EditorBuildSettings.scenes.ToList(); - if (scenes.Any(s => s.path == scenePath)) - { - return "Already in Build Settings."; - } - - scenes.Add(new EditorBuildSettingsScene(scenePath, true)); - EditorBuildSettings.scenes = scenes.ToArray(); - return $"Added to Build Settings (index {scenes.Count - 1})."; - } - - // MapRegistry lives in the MainMenu scene, not the map scene — the one registration step - // that isn't visible from where the designer is working, and therefore the one most often - // forgotten. Open it additively, append, save, close. - private static string RegisterInMapRegistry(MapTemplate template, LevelData levelData) - { - string path = template.MainMenuScenePath; - if (string.IsNullOrEmpty(path) || !System.IO.File.Exists(path)) - { - return $"SKIPPED MapRegistry — no scene at '{path}'. Assign Main Menu Scene on " + - $"{MapTemplate.AssetPath}, then add this LevelData to the registry by hand."; - } - - Scene menu = default; - bool opened = false; - try - { - menu = EditorSceneManager.OpenScene(path, OpenSceneMode.Additive); - opened = true; - - MapRegistry registry = null; - foreach (var root in menu.GetRootGameObjects()) - { - registry = root.GetComponentInChildren(true); - if (registry != null) break; - } - - if (registry == null) - { - return $"SKIPPED MapRegistry — none found in '{menu.name}'. Add the LevelData by hand."; - } - - var so = new SerializedObject(registry); - var maps = so.FindProperty("maps"); - if (maps == null) - { - return "SKIPPED MapRegistry — serialized field 'maps' not found (renamed?)."; - } - - for (int i = 0; i < maps.arraySize; i++) - { - if (maps.GetArrayElementAtIndex(i).objectReferenceValue == levelData) - { - return "Already in MapRegistry."; - } - } - - maps.InsertArrayElementAtIndex(maps.arraySize); - maps.GetArrayElementAtIndex(maps.arraySize - 1).objectReferenceValue = levelData; - so.ApplyModifiedPropertiesWithoutUndo(); - - EditorSceneManager.MarkSceneDirty(menu); - EditorSceneManager.SaveScene(menu); - return $"Added to MapRegistry in '{menu.name}' (slot {maps.arraySize - 1})."; - } - finally - { - if (opened && menu.IsValid()) - { - EditorSceneManager.CloseScene(menu, removeScene: true); - } - } - } - } -} diff --git a/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs.meta b/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs.meta deleted file mode 100644 index e60c9fd..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/NewMapBuilder.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 5eda54745c5c78c489eb2cf9aa6265b7 \ No newline at end of file diff --git a/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs b/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs deleted file mode 100644 index b1e07ba..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs +++ /dev/null @@ -1,205 +0,0 @@ -// Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs -using UnityEditor; -using UnityEngine; - -using TD.Core; - -namespace TD.Levels.Editor -{ - /// - /// The TD/New Map… dialog. Collects the handful of decisions only a designer can make, - /// validates the resulting layout live, and hands off to . - /// - public class NewMapWindow : EditorWindow - { - // Mirrors LevelBakePipeline's accepted set — anything else is a hard bake error (P2-15), - // so there's no point offering it here. - private static readonly int[] PlayerCountValues = { 1, 2, 3, 4, 5, 9 }; - private static readonly string[] PlayerCountLabels = - { "1 player", "2 players", "3 players", "4 players", "5 players", "9 players" }; - - private const string AuthorPrefKey = "TD.MapPipeline.LastAuthor"; - - private readonly NewMapBuilder.Request request = new NewMapBuilder.Request(); - private bool initialized; - private Vector2 scroll; - - [MenuItem("TD/New Map...", false, 100)] - public static void Open() - { - var window = GetWindow(utility: true, title: "New Map", focus: true); - window.minSize = new Vector2(420f, 460f); - window.Show(); - } - - private void Initialize() - { - if (initialized) return; - initialized = true; - - var template = MapTemplate.LoadOrCreate(); - request.MapWidth = template.defaultMapWidth; - request.MapHeight = template.defaultMapHeight; - request.Author = EditorPrefs.GetString(AuthorPrefKey, ""); - } - - private void OnGUI() - { - Initialize(); - var template = MapTemplate.LoadOrCreate(); - - scroll = EditorGUILayout.BeginScrollView(scroll); - - bool prefabsReady = template.matchServicesPrefab != null - && template.matchNetworkPrefab != null; - if (!prefabsReady) - { - EditorGUILayout.HelpBox( - "Core prefabs haven't been built yet.\n\n" + - "Open the 9Player scene, then run:\n" + - "TD → Map Pipeline → Build Core Prefabs From Open Scene", - MessageType.Error); - EditorGUILayout.Space(6); - } - - EditorGUILayout.LabelField("Identity", EditorStyles.boldLabel); - request.MapName = EditorGUILayout.TextField( - new GUIContent("Map Name", - "Becomes the scene file name, the LevelData asset name, and the string NGO " + - "uses to load the scene. Letters, digits and underscores only."), - request.MapName); - request.Author = EditorGUILayout.TextField("Author", request.Author); - - EditorGUILayout.LabelField(new GUIContent("Description", - "Shown in the lobby's map browser. Empty produces a bake warning.")); - request.Description = EditorGUILayout.TextArea( - request.Description, GUILayout.Height(38f)); - - EditorGUILayout.Space(8); - EditorGUILayout.LabelField("Shape", EditorStyles.boldLabel); - request.PlayerCount = EditorGUILayout.IntPopup( - "Players", request.PlayerCount, PlayerCountLabels, PlayerCountValues); - request.MapWidth = Mathf.Max(8, EditorGUILayout.IntField( - new GUIContent("Width (tiles)", "1 tile = 1 world unit."), request.MapWidth)); - request.MapHeight = Mathf.Max(8, EditorGUILayout.IntField( - new GUIContent("Height (tiles)", "1 tile = 1 world unit."), request.MapHeight)); - - request.BuildAccess = (BuildAccess)EditorGUILayout.EnumPopup( - new GUIContent("Build Access", - "OwnerOnly: each player builds only in their own zone.\n" + - "Shared: everyone builds anywhere on the map's buildable area.\n\n" + - "Changeable later on _LevelAuthoring — it just needs a re-bake."), - request.BuildAccess); - - if (request.BuildAccess == BuildAccess.Shared) - { - EditorGUILayout.HelpBox( - "Shared: every band forms one cooperative maze. Zones still define " + - "territory for leak attribution, camera start and builder spawn. Towers stay " + - "owned by whoever paid — only that player can sell or upgrade them.", - MessageType.None); - } - - EditorGUILayout.Space(8); - EditorGUILayout.LabelField("On Create", EditorStyles.boldLabel); - request.CreateTerrain = EditorGUILayout.Toggle( - new GUIContent("Create Terrain", - "Adds a Terrain sized to the map plus a skirt, on the TerrainGeometry layer, " + - "flattened onto the buildable plane."), - request.CreateTerrain); - request.AddToBuildSettings = EditorGUILayout.Toggle( - new GUIContent("Add to Build Settings", - "Required — NGO cannot load a scene that isn't in the build list."), - request.AddToBuildSettings); - request.AddToMapRegistry = EditorGUILayout.Toggle( - new GUIContent("Add to MapRegistry", - "Opens the MainMenu scene, appends the LevelData to the lobby's map browser, " + - "and saves it."), - request.AddToMapRegistry); - request.BakeImmediately = EditorGUILayout.Toggle( - new GUIContent("Bake immediately", - "Runs the bake on the generated starter layout so the map is valid and " + - "playable the moment it's created."), - request.BakeImmediately); - - // Registry wiring is the one step that reaches into a scene the designer isn't looking - // at, so a broken reference should be visible BEFORE Create, not in the summary after. - if (request.AddToMapRegistry && !System.IO.File.Exists(template.MainMenuScenePath)) - { - EditorGUILayout.HelpBox( - "Main Menu Scene isn't resolving, so the new map won't be added to the lobby's " + - "map browser. Assign it on MapTemplate, or add the LevelData to MapRegistry.Maps " + - "by hand afterwards.", - MessageType.Warning); - } - - EditorGUILayout.Space(8); - DrawLayoutPreview(template); - - EditorGUILayout.EndScrollView(); - - EditorGUILayout.Space(6); - bool canCreate = prefabsReady && - NewMapBuilder.TryComputeLayout( - template, request.MapWidth, request.MapHeight, - request.PlayerCount, request.BuildAccess, out _, out _); - - using (new EditorGUI.DisabledScope(!canCreate)) - { - if (GUILayout.Button("Create Map", GUILayout.Height(30f))) - { - CreateMap(); - } - } - } - - private void DrawLayoutPreview(MapTemplate template) - { - EditorGUILayout.LabelField("Starter Layout", EditorStyles.boldLabel); - - if (!NewMapBuilder.TryComputeLayout(template, request.MapWidth, request.MapHeight, - request.PlayerCount, request.BuildAccess, - out var layout, out string error)) - { - EditorGUILayout.HelpBox(error, MessageType.Error); - return; - } - - string routing = layout.Leaks.Length > 0 - ? $"through {layout.Leaks.Length} one-tile leak gate(s) " + - $"{Mathf.Min(template.leakGateWidth, layout.Zones[0].width)} tiles wide" - : "across directly-adjacent band borders (no leak gates)"; - - EditorGUILayout.HelpBox( - $"{request.PlayerCount} full-width band(s), {layout.BandDepth} tiles deep each, " + - $"stacked south to north.\n" + - $"Each band gets a spawner at its south edge; enemies travel north " + - $"{routing} to the goal.\n\n" + - $"Grid will bake to {layout.MapArea.width}×{layout.MapArea.height} with its " + - $"south-west corner at tile (0, 0).", - MessageType.Info); - - EditorGUILayout.LabelField( - "Tune the starter proportions on the MapTemplate asset:", - EditorStyles.miniLabel); - if (GUILayout.Button("Select MapTemplate", EditorStyles.miniButton)) - { - Selection.activeObject = template; - EditorGUIUtility.PingObject(template); - } - } - - private void CreateMap() - { - EditorPrefs.SetString(AuthorPrefKey, request.Author ?? ""); - - if (NewMapBuilder.Create(request, out string error)) - { - Close(); - return; - } - - EditorUtility.DisplayDialog("Could not create map", error, "OK"); - } - } -} diff --git a/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs.meta b/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs.meta deleted file mode 100644 index 850067e..0000000 --- a/Assets/_Project/Scripts/Editor/Levels/NewMapWindow.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 50a9cf35b1b63204da8774b8afe7003e \ No newline at end of file diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs index 236c8b7..c00904c 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/BlinkAbilityDefinition.cs @@ -25,26 +25,22 @@ namespace TD.Gameplay.EnemyAbilities [Header("Blink")] [Tooltip("Seconds between blinks.")] [Min(0.1f)] - public float IntervalSeconds = 4f; + public float IntervalSeconds = 8f; - [Tooltip("How many path waypoints to skip per blink. Note that path smoothing can make " + - "one waypoint span several tiles, so this is a coarser dial than it looks.")] - [Min(1)] - public int BlinkWaypoints = 2; - - [Tooltip("Random spread (seconds) added to each enemy's first blink so a wave doesn't " + - "blink in one synchronized block. Applied once, at spawn.")] - [Min(0f)] - public float StartJitterSeconds = 1.5f; + [Tooltip("World units to advance along the path per blink.")] + [Min(0.1f)] + public float BlinkDistanceMeters = 4f; public override void ServerOnSpawn(EnemyAbility instance, int abilityIndex) { - // Seed each enemy's cooldown with a different negative offset so the wave's first - // blink is staggered. Done once, here, rather than on the first tick — a tick-time + // Seed each enemy's cooldown with a random point within the full interval, as if it + // spawned already partway through a cooldown. A small jitter window near zero would + // still let a burst of enemies spawned together sync up and blink as a visible cluster + // every cycle; spreading across the whole interval avoids that regardless of how + // IntervalSeconds is tuned. Done once, here, rather than on the first tick — a tick-time // check would have to distinguish "never started" from "just blinked", and both // states read as a zero timer. - if (StartJitterSeconds > 0f) - instance.TimerFor(abilityIndex) = -Random.Range(0f, StartJitterSeconds); + instance.TimerFor(abilityIndex) = -Random.Range(0f, IntervalSeconds); } public override void ServerTick(EnemyAbility instance, int abilityIndex, float dt) @@ -54,7 +50,7 @@ namespace TD.Gameplay.EnemyAbilities if (timer < IntervalSeconds) return; timer = 0f; - instance.GetComponent()?.ServerBlinkForward(BlinkWaypoints); + instance.GetComponent()?.ServerBlinkForward(BlinkDistanceMeters); } } } diff --git a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs index 147eaf9..6815ff2 100644 --- a/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs +++ b/Assets/_Project/Scripts/Gameplay/EnemyMovement.cs @@ -286,39 +286,70 @@ namespace TD.Gameplay /// /// Server-only: teleport this enemy forward along its existing path by up to - /// waypoints. Used by the Blink wave buff. + /// world units. Used by the Blink wave buff. /// /// /// Follows the path rather than the straight line to the goal. Jumping toward the /// goal as the crow flies would let a grounded enemy blink through walls, which is the - /// flying buff's job, not this one. Skipping waypoints keeps the enemy inside the maze — + /// flying buff's job, not this one. Walking the path keeps the enemy inside the maze — /// it cuts corners, it doesn't ignore them. /// - /// Zone tracking still runs on the destination tile, so an enemy that blinks out of - /// its origin zone still credits its owner a leak. Skipping that would make the buff a way - /// to launder leaks past the no-leak bonus. + /// Distance is measured along the path (waypoint to waypoint), consuming the + /// budget one segment at a time, so the landing spot can fall mid-segment rather than + /// snapping to a waypoint. This keeps the blink distance predictable regardless of how + /// far apart the path's waypoints happen to be — unlike skipping a fixed waypoint count, + /// where one blink could span a few tiles or the length of the whole map depending on + /// path smoothing. /// - /// Blinking onto the final waypoint resolves as a normal goal arrival, despawn and - /// life cost included. + /// Zone tracking runs once, on the final landing tile, so an enemy that blinks out + /// of its origin zone still credits its owner a leak. Skipping that would make the buff a + /// way to launder leaks past the no-leak bonus. + /// + /// Blinking onto (or past) the final waypoint resolves as a normal goal arrival, + /// despawn and life cost included. /// - public void ServerBlinkForward(int tiles) + public void ServerBlinkForward(float meters) { - if (!IsServer || tiles <= 0) return; + if (!IsServer || meters <= 0f) return; if (hasReachedGoal || remainingPath.Count == 0) return; if (health != null && health.IsHeld) return; - int skip = Mathf.Min(tiles, remainingPath.Count); - Vector2Int destination = remainingPath[skip - 1]; - remainingPath.RemoveRange(0, skip); + float remaining = meters; + Vector3 position = transform.position; + + while (remaining > 0f && remainingPath.Count > 0) + { + Vector3 targetWorld = GridCoordinates.GridToWorld(remainingPath[0]); + Vector3 toTarget = targetWorld - position; + toTarget.y = 0f; + float distance = toTarget.magnitude; + + if (distance <= remaining) + { + // Reach this waypoint fully and keep walking the leftover budget + // into the next segment. + remaining -= distance; + position = new Vector3(targetWorld.x, position.y, targetWorld.z); + remainingPath.RemoveAt(0); + } + else + { + // Budget runs out partway along this segment. + position += toTarget.normalized * remaining; + remaining = 0f; + } + } // Preserve Y so flyers stay at altitude and grounded pivots don't sink. - Vector3 world = GridCoordinates.GridToWorld(destination); - transform.position = new Vector3(world.x, transform.position.y, world.z); - - CheckZoneTransition(destination); + transform.position = position; if (remainingPath.Count == 0) + { HandleGoalReached(); + return; + } + + CheckZoneTransition(GridCoordinates.WorldToGrid(position)); } // ----- Path invalidation ---------------------------------------------- diff --git a/Assets/_Project/Scripts/Gameplay/LevelLoader.cs b/Assets/_Project/Scripts/Gameplay/LevelLoader.cs index b93427f..3a29dfb 100644 --- a/Assets/_Project/Scripts/Gameplay/LevelLoader.cs +++ b/Assets/_Project/Scripts/Gameplay/LevelLoader.cs @@ -355,39 +355,6 @@ namespace TD.Gameplay return level.OwnerGrid[idx]; } - /// - /// This map's build-permission rule. for an unloaded - /// or unbaked level, which is the safe default (it can only ever reject more). - /// - public BuildAccess BuildAccess => level != null ? level.BuildAccess : BuildAccess.OwnerOnly; - - /// - /// True if is permitted to build on under - /// this map's rule. - /// - /// - /// Permission ONLY — the caller still has to check and - /// . Keeping them separate is deliberate: each produces a different - /// PlacementRejectionReason, and collapsing them would cost the player a useful - /// message. - /// - /// Both the client's ghost preview and the server's authoritative check call this, so - /// they cannot drift apart and show a white ghost that then gets rejected. - /// - /// Under the tile must still belong to SOME player - /// zone. In practice every Buildable tile does, but stating it here keeps the method - /// meaningful on its own rather than relying on a caller's later check. - /// - public bool HasBuildPermission(Vector2Int tile, PlayerSlot slot) - { - if (slot == PlayerSlot.None) return false; - - PlayerSlot owner = GetOwner(tile); // PlayerSlot.None when out of bounds - return BuildAccess == BuildAccess.Shared - ? owner != PlayerSlot.None - : owner == slot; - } - /// /// True if is currently occupied by a placed tower footprint. /// Returns false for out-of-bounds tiles. Unlike , this grid diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementController.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementController.cs index 8800175..9b1db7c 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPlacementController.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementController.cs @@ -353,7 +353,7 @@ namespace TD.Gameplay foreach (var tile in GridCoordinates.GetFootprintTiles(anchor, def.FootprintSize)) { - if (!loader.HasBuildPermission(tile, localSlot)) return false; + if (loader.GetOwner(tile) != localSlot) return false; if (loader.GetPlacement(tile) != PlacementState.Buildable) return false; if (loader.IsOccupied(tile)) return false; } diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs index 24dacba..3706dfb 100644 --- a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs +++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs @@ -217,10 +217,8 @@ namespace TD.Gameplay footprint.Add(tile); // ------------------------------------------------------------------ - // Check 1: Build permission - // On an OwnerOnly map every footprint tile must be owned by the placing - // player's zone; on a Shared map any zone's tile will do. LevelLoader owns - // that rule so the client's ghost preview can't disagree with us. + // Check 1: Ownership + // Every footprint tile must be owned by the placing player's zone. // ------------------------------------------------------------------ PlayerSlot placingSlot = ClientIdToPlayerSlot(req.SenderClientId); if (placingSlot == PlayerSlot.None) @@ -231,7 +229,7 @@ namespace TD.Gameplay foreach (var tile in footprint) { - if (!loader.HasBuildPermission(tile, placingSlot)) + if (loader.GetOwner(tile) != placingSlot) { Reject(req, PlacementRejectionReason.WrongOwner); return; @@ -535,67 +533,37 @@ namespace TD.Gameplay // ----- Path-validity BFS ------------------------------------------ /// - /// Returns true if the map's mazes are still solvable with the candidate footprint in - /// place — every spawner can still reach an exit tile (any leak exit from its own zone, - /// OR any goal tile) via walkable tiles, given LevelLoader's runtime grid. + /// Returns true if every spawner in 's zone can still + /// reach an exit tile (any leak exit tile OR any goal tile) via walkable tiles, + /// given the current state of LevelLoader's runtime walkability grid. /// /// - /// Mirrors bake-time P5-4. Reuses and - /// scratch collections (cleared between BFS runs) to avoid GC allocation per call. - /// - /// Scope depends on the map's build rule. Under - /// a player can only build inside their own zone, so - /// their footprint can only ever strand their OWN spawners — checking - /// 's zone alone is both sufficient and cheapest. Under - /// anyone can wall off anyone's lane, so every zone has to - /// be checked or a player could strand a teammate's spawner and leave its enemies with no - /// route at all. + /// Mirrors bake-time P5-4. Runs a BFS per spawner against the runtime walkability + /// grid. Reuses and scratch + /// collections (cleared between BFS runs) to avoid GC allocation per call. /// - private bool CheckPathValidity(LevelLoader loader, PlayerSlot placingSlot, + private bool CheckPathValidity(LevelLoader loader, PlayerSlot slot, HashSet virtualBlocked = null) { var levelData = loader.LevelData; - if (levelData?.PlayerZones == null) return true; - - if (loader.BuildAccess == BuildAccess.Shared) - { - foreach (var zone in levelData.PlayerZones) - { - if (!ZoneSpawnersCanReachExit(loader, levelData, zone, virtualBlocked)) - return false; - } - return true; - } + // Find the PlayerZoneData for this slot. + PlayerZoneData zoneData = null; foreach (var zone in levelData.PlayerZones) { - if (zone.Owner == placingSlot) - return ZoneSpawnersCanReachExit(loader, levelData, zone, virtualBlocked); + if (zone.Owner == slot) { zoneData = zone; break; } } - - // Placing player has no zone — nothing of theirs to strand. - return true; - } - - /// - /// Runs the reachability BFS for every spawner in one zone. Returns true if they can all - /// still reach an exit (or the zone has no spawners to strand). - /// - private bool ZoneSpawnersCanReachExit(LevelLoader loader, LevelData levelData, - PlayerZoneData zoneData, - HashSet virtualBlocked) - { - if (zoneData?.Spawners == null || zoneData.Spawners.Length == 0) + if (zoneData == null || zoneData.Spawners == null || zoneData.Spawners.Length == 0) { // No spawners means nothing to block — treat as valid. return true; } - // Build the exit tile set: this zone's leak exits, plus all goal tiles. - var exitTiles = BuildExitTileSet(levelData, zoneData.Owner); + // Build the exit tile set: union of all leak exit tiles and all goal tiles. + var exitTiles = BuildExitTileSet(levelData, slot); if (exitTiles.Count == 0) { - Debug.LogWarning($"[TowerPlacementManager] Zone {zoneData.Owner} has no exit tiles. " + + Debug.LogWarning($"[TowerPlacementManager] Zone {slot} has no exit tiles. " + $"This should have been caught at bake time (P5-8)."); return true; } diff --git a/Assets/_Project/Settings/MapTemplate.asset b/Assets/_Project/Settings/MapTemplate.asset deleted file mode 100644 index a82dd59..0000000 --- a/Assets/_Project/Settings/MapTemplate.asset +++ /dev/null @@ -1,39 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!114 &11400000 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 0} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fb7355881928ea146a26471078f207c2, type: 3} - m_Name: MapTemplate - m_EditorClassIdentifier: Assembly-CSharp-Editor::TD.Levels.Editor.MapTemplate - matchServicesPrefab: {fileID: 1445952844252628864, guid: 13be8328f6275e14da787f25c94683ee, type: 3} - matchNetworkPrefab: {fileID: 8429081419068942390, guid: 7116de1968afffb4990ee24f709612fb, type: 3} - sceneFolderAsset: {fileID: 102900000, guid: 1ac41b242a484844a85bb02ca1ae9f1f, type: 3} - mainMenuScene: {fileID: 102900000, guid: 1f4cb4a6391f5e94285960890282b70e, type: 3} - sceneFolder: Assets/_Project/Scenes/Levels - mainMenuScenePath: Assets/_Project/Scenes/UI_Scenes/MainMenu.unity - terrainMaterial: {fileID: 2100000, guid: 594ea882c5a793440b60ff72d896021e, type: 2} - terrainLayers: - - {fileID: 8574412962073106934, guid: f72a840f9f0991747a2d10c3c220bd27, type: 2} - - {fileID: 8574412962073106934, guid: 445b935ebf050f74a96e491cb1596964, type: 2} - - {fileID: 8574412962073106934, guid: faa5ef4eade0336408d27e4e78ebf1a6, type: 2} - - {fileID: 8574412962073106934, guid: 79a46a4f0f2c8a04a9f50c26dc17dc48, type: 2} - terrainHeightmapResolution: 513 - terrainHeight: 60 - terrainSkirtTiles: 20 - terrainCarveDepth: 5 - defaultMapWidth: 100 - defaultMapHeight: 100 - playAreaMargin: 4 - goalDepth: 5 - goalWidth: 10 - spawnerDepth: 5 - spawnerWidth: 10 - leakGateWidth: 8 - minBandDepth: 8 diff --git a/Assets/_Project/Settings/MapTemplate.asset.meta b/Assets/_Project/Settings/MapTemplate.asset.meta deleted file mode 100644 index f79b9ea..0000000 --- a/Assets/_Project/Settings/MapTemplate.asset.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: ac495796f7ea6a9478aa5512f162d264 -NativeFormatImporter: - externalObjects: {} - mainObjectFileID: 11400000 - userData: - assetBundleName: - assetBundleVariant: diff --git a/Docs/Map_Pipeline.md b/Docs/Map_Pipeline.md deleted file mode 100644 index c1e16ea..0000000 --- a/Docs/Map_Pipeline.md +++ /dev/null @@ -1,188 +0,0 @@ -# Map Pipeline - -How to make a new map, and what the generator puts in the scene for you. - ---- - -## One-time setup - -Open **`9Player`** and run **`TD → Map Pipeline → Build Core Prefabs From Open Scene`**. - -This reads the fully-wired reference scene and writes: - -| Output | What it holds | -|---|---| -| `Assets/_Project/Prefabs/MatchCore/MatchServices.prefab` | Every map-independent, non-networked service | -| `Assets/_Project/Prefabs/MatchCore/MatchNetwork.prefab` | The six scene-placed `NetworkBehaviour`s | -| `Assets/_Project/Settings/MapTemplate.asset` | Prefab references, terrain defaults, starter-layout proportions | - -It **copies live components** rather than rebuilding them from an asset scan. `AssetDatabase.FindAssets` -order isn't guaranteed stable across machines or re-imports, and several of these arrays double as -network identity — `EnemyUpgradePool.options` indices *are* card network ids, and -`TowerPlacementManager.towerDefinitions` indices *are* `TowerTypeId`. Two people generating the same -map could commit different orders, and *that* desyncs a host from a client. Copying sidesteps it, and -gives each new map the same known-good content as the reference. - -> Maps having **different** catalogs from each other is fine and supported — every peer loads the same -> scene, and `PlayerTowerDeck.ServerInitialize` clears the deck at match start. Per-map enemy rosters -> are a matter of assigning a different `RunDefinition` on `_MatchNetwork/RunState`. - -> The reference scene's contents aren't modified, but Unity marks it dirty. **Don't save it.** - -Re-run this any time the shared boilerplate changes in a way the prefab should pick up. - ---- - -## Making a map - -**`TD → New Map...`** - -Fill in name, player count, and size. The dialog validates the starter layout live and tells you the -exact width or height to use if the shape can't hold one. - -On Create it does all of this: - -1. Creates and saves the scene in `Assets/_Project/Scenes/Levels/` -2. Instantiates `_MatchServices` (**linked** prefab instance) and `_MatchNetwork` (**unpacked**) -3. Creates the `LevelData` asset and assigns it to **both** `LevelAuthoring.targetAsset` *and* - `LevelLoader.level` -4. Generates a bakeable starter volume layout -5. Creates a `Terrain` on the `TerrainGeometry` layer, sized to the map plus a skirt -6. Registers the scene in **Build Settings** -7. Appends the `LevelData` to the **`MapRegistry`** in `MainMenu.unity` -8. Runs the bake - -Steps 3, 6 and 7 are the ones that used to fail silently — a map missing any of them looks fine in -the editor and breaks only at match start, or just never appears in the lobby. - -A generated map bakes with **zero warnings** as long as you filled in author and description. - ---- - -## What you get, and where to edit it - -Four roots instead of the ~30 the hand-authored maps carry: - -``` -_LevelAuthoring ← yours: shape the volumes here -_MatchServices ← shared prefab: don't edit per-map (except LevelLoader.level) -_MatchNetwork ← the six NetworkBehaviours, unpacked -Terrain ← yours: sculpt here -``` - -`_MatchServices` is a **linked prefab instance**, so fixing something in -`MatchServices.prefab` fixes it in every map at once. The one field that is legitimately a -per-instance override is `LevelLoader.level`. - -**Never press "Apply All" on the `_MatchServices` instance** — that would push this map's -`LevelData` into the shared prefab. - -`_MatchNetwork` is unpacked deliberately: NGO treats in-scene placed `NetworkObject`s that are prefab -instances differently from loose ones, and unpacking keeps generated scenes structurally identical to -hand-authored ones. The cost is that changes to `MatchNetwork.prefab` don't propagate to maps already -created — there are only three asset references in it (`RunDefinition`, `GoldConfig`, -`EnemyScalingConfig`), so fix those by hand if they ever change. - ---- - -## The starter layout - -Player bands stacked south → north, full map width: - -``` - ┌─────────── Goal ───────────┐ north - │ Player N band │ - │ ····· leak gate ····· │ - │ Player N-1 band │ - │ ····· leak gate ····· │ - │ Player 1 band │ - │ [Player 1 spawner] │ south - └── MapArea (margin border) ─┘ -``` - -Enemies spawn at the south edge of their owner's band and walk north. Each band leaks through a -one-tile gate into the next; the northernmost band is goal-adjacent instead of having a leak. - -Proportions (margin, band depth, gate width, goal size, terrain skirt and carve depth) all live on -**`MapTemplate.asset`** — tune them there, not in code. - ---- - -## Build Access: one maze each, or one maze together - -`_LevelAuthoring → Rules → Build Access` is a per-map choice. Also offered in the New Map dialog. - -| Mode | Meaning | -|---|---| -| `OwnerOnly` | Default. A player builds only inside their own `PlayerZoneVolume`. | -| `Shared` | Any player builds on any Buildable tile — the whole map is one cooperative maze. | - -**Ownership doesn't disappear in Shared mode.** `OwnerGrid` still drives leak attribution, camera -start position, builder spawn point, and minimap tinting; zones still own their spawners and leak -exits. The only thing that lifts is the placement restriction. That's why this is a per-map enum and -not a change to how maps are authored — a Shared map is authored exactly like an OwnerOnly one. - -**Towers still belong to whoever paid.** Sell, upgrade and paint stay owner-gated in both modes, so a -teammate can't sell your tower out of the lane you put it in. - -Both modes route through `LevelLoader.HasBuildPermission`, which the client's ghost preview and the -server's authoritative check both call — they can't drift apart and show a white ghost that then gets -rejected. - -> **Shared mode widens path validation.** Under `OwnerOnly` a player can only strand their own -> spawners, so `TowerPlacementManager.CheckPathValidity` checks one zone. Under `Shared` anyone can -> wall off anyone's lane, so it checks *every* zone's spawners — otherwise a player could leave a -> teammate's enemies with no route to any exit. Cost is one BFS per spawner per placement attempt -> rather than one per placement; placements are already throttled to `requestsPerFrame`. - -Changing the mode on an existing map just needs a re-bake. - -### Leak exits are optional on Shared maps - -Bake rule **P5-8** ("every zone must have an outgoing leak or be goal-adjacent") is **skipped on -Shared maps**, so you can delete the `LeakExitVolume`s entirely. Every other leak rule is conditional -on a leak existing, so they're vacuously satisfied at zero. - -That's safe because leak exits do almost nothing at runtime. `PathfindingService.ComputePath` takes no -destination — enemies always path to `LevelData.Goals`, and the route through a gate is *emergent* -from walkability, never directed. `LeakExitData.NormalizedWeight` is written by the bake and read -nowhere. Leak *attribution* runs off `OwnerGrid`, not leak volumes, so it keeps working. The safety -property P5-8 protected is enforced more strictly by **P5-4**, which BFSes every spawner to the exit -set — and with no leaks present that set is the goal tiles, which is exactly the right requirement. - -> **Zones must then be directly adjacent.** A `LeakExitVolume`'s tiles are walkable; a bare gap -> between two zones is not. Delete the leaks without closing the gap and the bands become -> disconnected — P5-4 hard-errors and P5-11 warns, so the bake catches it loudly rather than shipping -> a map whose enemies can't move. - -New Map handles this for you: choosing **Shared** generates bands butted directly together with no -gate rows and no leak volumes. Choosing **OwnerOnly** generates the one-tile gates. - ---- - -## Changing the Quick Play map - -Quick Start skips the lobby and loads **`MapRegistry.Default`**, which is the *first valid entry* in -the `Maps` array — not a separate setting. - -Open `MainMenu`, select the `MapRegistry` GameObject, and drag the map you want to element **0**. -Entries with an empty `MapName` or `ScenePath` are skipped, so "first" means first *usable*. - -New maps are **appended** to the array, so creating one never silently changes what Quick Play loads. -Reordering is deliberate. - ---- - -## Things worth knowing - -- **Walkability is the union of the gameplay volumes**, not something you paint. Walls are the - *absence* of a `PlayerZone` / `Spawner` / `LeakExit` / `Goal` volume. `MapAreaVolume` tiles are - deliberately **not** walkable — that volume only bounds camera pan and builder movement. -- **Terrain must stay on the `TerrainGeometry` layer.** The builder's ground raycast and spell - targeting both filter on it; on `Default` the builder silently walks at Y=0. -- **Terrain visuals have no relationship to the grid.** Nothing validates that the hills you sculpt - match the volumes you placed. That correspondence is yours to keep. -- **Volumes must be axis-aligned and unit-scaled.** Rotation is a hard bake error; non-unit - `Transform.Scale` is a warning. Size volumes with `BoxCollider.Size`, or use the - **Resize Volume Edge** scene tool. -- `MatchRules.MaxPlayers` is **3**. Larger player counts bake fine but no lobby can fill them yet. diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index ebac9f7..789ebb2 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -6,10 +6,10 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/_Project/Scenes/UI_Scenes/MainMenu.unity + path: Assets/_Project/Scenes/UI/MainMenu.unity guid: 1f4cb4a6391f5e94285960890282b70e - enabled: 1 - path: Assets/_Project/Scenes/UI_Scenes/Lobby.unity + path: Assets/_Project/Scenes/UI/Lobby.unity guid: 3a3639dca674a8049a570cb848bb69d2 - enabled: 1 path: Assets/_Project/Scenes/Levels/Main.unity @@ -17,8 +17,5 @@ EditorBuildSettings: - enabled: 1 path: Assets/_Project/Scenes/Levels/9Player.unity guid: 74fdeec477e257d4484b38108c283d84 - - enabled: 1 - path: Assets/_Project/Scenes/Levels/3Player.unity - guid: 128de09101c3e3240b094d29d1eb9d22 m_configObjects: com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 052faaac586de48259a63d0c4782560b, type: 3}