diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta
new file mode 100644
index 0000000..4257bdb
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 42ccb4a3b6aaaab47b73147c8be319bb
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png
new file mode 100644
index 0000000..f2a24b8
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b119eb6ab2d6c01573bce480df9fdb6676449398f4afde46673c3c2c2710fcc
+size 13324
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta
new file mode 100644
index 0000000..8523ae6
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: df5903159b157404d8e92942029f08f7
+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: 0
+ 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/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png
new file mode 100644
index 0000000..6503be4
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5569ff4e8d0780e2d79dfb9575f34856d59cb99ac751dd4f8caf4c2219eb7976
+size 8730
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta
new file mode 100644
index 0000000..eef1834
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: e81c6ebff6b98ac44b884d3006611ae6
+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: 0
+ 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/Art/Sprites/EnemyDraftIcons/FlightIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png
new file mode 100644
index 0000000..7ef1d14
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4779891d6890994436e47c586b11768d6a8eead32c4e740f4c99713598783fea
+size 15796
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta
new file mode 100644
index 0000000..eb15613
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 39ac5850677a092479550234de13e868
+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: 0
+ 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/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png
new file mode 100644
index 0000000..ffb3b3e
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e2d28ff550b9a9e83fe317c6c692115d3f5ef27f20f9aa9220e7f5aeb91768f
+size 15522
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta
new file mode 100644
index 0000000..42c8511
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: ea9802d37489c9442ba2ffd4a41c6cb2
+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: 0
+ 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/Art/Sprites/EnemyDraftIcons/SplitIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png
new file mode 100644
index 0000000..e57b4db
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f0919f710e6673a55f44b1dbd55a16e19105fa5fe7d643330a4baea97eff095
+size 19587
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta
new file mode 100644
index 0000000..57b7944
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 43490fdb6e2477643a275956ce5f4596
+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: 0
+ 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/Art/Sprites/EnemyDraftIcons/ThiefIcon.png b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png
new file mode 100644
index 0000000..92cd276
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90a7787cfc6120d1e6816d59a523093250f0f21200d3ad29fc6c99974837a7ef
+size 18309
diff --git a/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta
new file mode 100644
index 0000000..6198141
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: 315be3feae908714a911f596b8533317
+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: 0
+ 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/Art/Sprites/PlayerDraftIcons.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons.meta
new file mode 100644
index 0000000..16c1caf
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 319f59716d010174aa75cc757855ffd3
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Art/Sprites/Spells.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Spells.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells.meta
diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png
similarity index 100%
rename from Assets/_Project/Art/Sprites/Spells/FireballSpell.png
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png
diff --git a/Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Spells/FireballSpell.png.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/FireballSpell.png.meta
diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png
similarity index 100%
rename from Assets/_Project/Art/Sprites/Spells/SlowSpell.png
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png
diff --git a/Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Spells/SlowSpell.png.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Spells/SlowSpell.png.meta
diff --git a/Assets/_Project/Art/Sprites/Towers.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Towers.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers.meta
diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta
new file mode 100644
index 0000000..3e3ff27
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 06352dd9c76072941bbe7ad909c5f2f9
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png
new file mode 100644
index 0000000..d7e8a96
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e1b3dd4114b2639901392675da17a1c33146aa112157663fa13cf1dbb718cf4
+size 7076
diff --git a/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta
new file mode 100644
index 0000000..bbe72c7
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta
@@ -0,0 +1,117 @@
+fileFormatVersion: 2
+guid: a140f62a10b8dc04e84625f8008e0c24
+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: 0
+ 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/Art/Sprites/Towers/arrow.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png
similarity index 100%
rename from Assets/_Project/Art/Sprites/Towers/arrow.png
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png
diff --git a/Assets/_Project/Art/Sprites/Towers/arrow.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Towers/arrow.png.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/arrow.png.meta
diff --git a/Assets/_Project/Art/Sprites/Towers/siege.png b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png
similarity index 100%
rename from Assets/_Project/Art/Sprites/Towers/siege.png
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png
diff --git a/Assets/_Project/Art/Sprites/Towers/siege.png.meta b/Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Towers/siege.png.meta
rename to Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/siege.png.meta
diff --git a/Assets/_Project/Art/Sprites/RaceIcons.meta b/Assets/_Project/Art/Sprites/RaceIcons.meta
new file mode 100644
index 0000000..361ea99
--- /dev/null
+++ b/Assets/_Project/Art/Sprites/RaceIcons.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 45b4fc03b527ce444a7c37579965d990
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Art/Sprites/BloodAngels.jpg b/Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg
similarity index 100%
rename from Assets/_Project/Art/Sprites/BloodAngels.jpg
rename to Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg
diff --git a/Assets/_Project/Art/Sprites/BloodAngels.jpg.meta b/Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/BloodAngels.jpg.meta
rename to Assets/_Project/Art/Sprites/RaceIcons/BloodAngels.jpg.meta
diff --git a/Assets/_Project/Art/Sprites/Ultramarines.jpg b/Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg
similarity index 100%
rename from Assets/_Project/Art/Sprites/Ultramarines.jpg
rename to Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg
diff --git a/Assets/_Project/Art/Sprites/Ultramarines.jpg.meta b/Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg.meta
similarity index 100%
rename from Assets/_Project/Art/Sprites/Ultramarines.jpg.meta
rename to Assets/_Project/Art/Sprites/RaceIcons/Ultramarines.jpg.meta
diff --git a/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset b/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset
index 5a7e5c4..39b2af6 100644
--- a/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/01_Enemy_CrystalGolemBlue_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 01_Enemy_CrystalGolemBlue_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Crystal Elemental (Young)
- MaxHp: 100
- MoveSpeed: 3
+ HpMultiplier: 1.15
+ MoveSpeed: 2.6
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: 5839dc36140d67d4db94c4370a98ea2c, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset b/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset
index b616fca..2bad6f2 100644
--- a/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/02_Enemy_CyclopsGrey_Definition.asset
@@ -13,7 +13,7 @@ MonoBehaviour:
m_Name: 02_Enemy_CyclopsGrey_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Cyclops (Young)
- MaxHp: 200
+ HpMultiplier: 1.05
MoveSpeed: 3
IsFlying: 0
LivesCost: 1
diff --git a/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset b/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset
index 48c0a11..6ca1cb8 100644
--- a/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/03_Enemy_EntGreen_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 03_Enemy_EntGreen_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Ent (Juvenile)
- MaxHp: 400
- MoveSpeed: 3
+ HpMultiplier: 0.85
+ MoveSpeed: 3.4
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: dc462b86bdb8136488da56eb84d88ab5, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset b/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset
index 5129b58..ed14151 100644
--- a/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/04_Enemy_CrystalGolemYellow_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 04_Enemy_CrystalGolemYellow_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Crystal Elemental (Adolescent)
- MaxHp: 500
- MoveSpeed: 3
+ HpMultiplier: 1.25
+ MoveSpeed: 2.4
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: d4ca85138dd41244c9b0ab29c945f064, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset b/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset
index d516ea5..29dbef6 100644
--- a/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/05_Enemy_CyclopsGreen_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 05_Enemy_CyclopsGreen_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Cyclops (Adult)
- MaxHp: 600
- MoveSpeed: 3
+ HpMultiplier: 1.1
+ MoveSpeed: 2.9
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: 525e51e0dfac75744b39e4609b9245f9, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset b/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset
index dc74753..cd153bb 100644
--- a/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/06_Enemy_EntBlack_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 06_Enemy_EntBlack_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Ent (Mature)
- MaxHp: 700
- MoveSpeed: 3
+ HpMultiplier: 0.9
+ MoveSpeed: 3.3
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: c3cae952216a68b458b9a934d89b8be8, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset b/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset
index 9b8a5b3..c0b1005 100644
--- a/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/07_Enemy_CrystalGolemRed_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 07_Enemy_CrystalGolemRed_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Crystal Elemental (Mature)
- MaxHp: 800
- MoveSpeed: 3
+ HpMultiplier: 1.35
+ MoveSpeed: 2.2
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: 2f13fef371bd3464694526ff99edef03, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset b/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset
index 7ca2962..a71ed1a 100644
--- a/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/08_Enemy_CyclopsRed_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 08_Enemy_CyclopsRed_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Cyclops (Enraged)
- MaxHp: 900
- MoveSpeed: 3
+ HpMultiplier: 1.2
+ MoveSpeed: 2.8
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: 729e11f4ecd916d4fbeaf26dbbae8b7d, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset b/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset
index e9d57fa..e2d0b3b 100644
--- a/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/09_Enemy_EntOrange_Definition.asset
@@ -13,8 +13,8 @@ MonoBehaviour:
m_Name: 09_Enemy_EntOrange_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
DisplayName: Ent (Ancient)
- MaxHp: 1000
- MoveSpeed: 3
+ HpMultiplier: 0.95
+ MoveSpeed: 3.2
IsFlying: 0
LivesCost: 1
EnemyPrefab: {fileID: 1455822126534880203, guid: d6eed12cf96ab194ab8d35359e3bc8ee, type: 3}
diff --git a/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset b/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset
index 31d1eec..af46c2c 100644
--- a/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset
+++ b/Assets/_Project/Definitions/Enemies/10_Enemy_UndeadDrakeBone_Definition.asset
@@ -12,9 +12,9 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: c0d2521d49d21fe4380434f5951944d1, type: 3}
m_Name: 10_Enemy_UndeadDrakeBone_Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyDefinition
- DisplayName: Ent (Ancient)
- MaxHp: 800
- MoveSpeed: 4
+ DisplayName: Drake
+ HpMultiplier: 0.7
+ MoveSpeed: 4.5
IsFlying: 1
FlightHeight: 3
LivesCost: 1
diff --git a/Assets/_Project/Definitions/RunDefinitions.meta b/Assets/_Project/Definitions/RunDefinitions.meta
new file mode 100644
index 0000000..d07862f
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: d1d72155425add944a007932c121c951
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/Draft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft.meta
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta
new file mode 100644
index 0000000..359e56c
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 465572754aa5c7e48b1c00843f1b5d7c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset
new file mode 100644
index 0000000..98bd078
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset
@@ -0,0 +1,18 @@
+%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: d075c66b381872a4781b3916296ccdc9, type: 3}
+ m_Name: EnemyUpgrade_Blink
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption
+ DisplayName: Blink
+ Description: Enemies occasionally teleport a short distance ahead.
+ Icon: {fileID: 21300000, guid: df5903159b157404d8e92942029f08f7, type: 3}
+ Ability: {fileID: 11400000, guid: 030f10c9a264e544ea3e0f4fdb4171bd, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta
new file mode 100644
index 0000000..6570ea6
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: eef28ca7b8844504e9d75ff903a3bb61
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset
new file mode 100644
index 0000000..daa0979
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset
@@ -0,0 +1,19 @@
+%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: f5e90fe6b8e439e4f99769a6923c2262, type: 3}
+ m_Name: EnemyUpgrade_DoubleUp
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.DoubleUpEnemyUpgradeOption
+ DisplayName: Double Dip
+ Description: Enemies from this wave gain no upgrades, but enemies from the next
+ wave have two upgrades selected automatically
+ Icon: {fileID: 21300000, guid: e81c6ebff6b98ac44b884d3006611ae6, type: 3}
+ BuffsToAutoApply: 2
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta
new file mode 100644
index 0000000..db74d57
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 46e2a6a59c0a3034f9fa44681d9ba422
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset
new file mode 100644
index 0000000..5379694
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset
@@ -0,0 +1,18 @@
+%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: d075c66b381872a4781b3916296ccdc9, type: 3}
+ m_Name: EnemyUpgrade_Flight
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption
+ DisplayName: Flight
+ Description: Enemies gain the power of flight
+ Icon: {fileID: 21300000, guid: 39ac5850677a092479550234de13e868, type: 3}
+ Ability: {fileID: 11400000, guid: cb2ec6bb70f57d0429b99b7cd4c7db73, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta
new file mode 100644
index 0000000..c49dfc4
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80fb851b702ff304183cb6e89c4aa245
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset
new file mode 100644
index 0000000..58af079
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset
@@ -0,0 +1,18 @@
+%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: d075c66b381872a4781b3916296ccdc9, type: 3}
+ m_Name: EnemyUpgrade_NoBounty
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption
+ DisplayName: Peniless
+ Description: Enemies no longer drop gold upon death
+ Icon: {fileID: 21300000, guid: ea9802d37489c9442ba2ffd4a41c6cb2, type: 3}
+ Ability: {fileID: 11400000, guid: c64c7121b0456bb4a873acec9e0abf91, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta
new file mode 100644
index 0000000..bea9c35
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a67aa3644d2ad4847a47040f53fea26f
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset
new file mode 100644
index 0000000..2351102
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset
@@ -0,0 +1,19 @@
+%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: d075c66b381872a4781b3916296ccdc9, type: 3}
+ m_Name: EnemyUpgrade_Split
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption
+ DisplayName: Split on Death
+ Description: Enemies killed will spawn two more smaller, faster, weaker versions
+ of themselves. (This only triggers a single time per base enemy)
+ Icon: {fileID: 21300000, guid: 43490fdb6e2477643a275956ce5f4596, type: 3}
+ Ability: {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta
new file mode 100644
index 0000000..ca2e9c2
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: f6bfb033a15b6d0419587b80a8286bd1
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset
new file mode 100644
index 0000000..e0f0515
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset
@@ -0,0 +1,18 @@
+%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: d075c66b381872a4781b3916296ccdc9, type: 3}
+ m_Name: EnemyUpgrade_Theft
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.AbilityEnemyUpgradeOption
+ DisplayName: Thief
+ Description: Enemies that leak steal 15 gold on their way out
+ Icon: {fileID: 21300000, guid: 315be3feae908714a911f596b8533317, type: 3}
+ Ability: {fileID: 11400000, guid: a18691a20d75f17479a83b3e171759e7, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta
new file mode 100644
index 0000000..f4847ca
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 37d761966a349ba4cb4141f913224d5c
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta
new file mode 100644
index 0000000..18e2f50
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4a6f4d6ffa10ef44da3ac0dd7c7734db
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderEffect_GoldPerKill.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderEffect_GoldPerKill.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_Fireball.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_Fireball.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowArea.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowArea.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_SiegeCannon.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_SiegeCannon.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_TeslaCoil.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_TeslaCoil.asset.meta
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset
diff --git a/Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Draft/Draft_NewTower_Wall.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_NewTower_Wall.asset.meta
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset
new file mode 100644
index 0000000..016e045
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset
@@ -0,0 +1,21 @@
+%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: aeec22f152a57ef5798eae035c091543, type: 3}
+ m_Name: Draft_TowerUpgrade_Arrow_1
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.TowerUpgradeDraftOption
+ DisplayName: Arrow Tower Upgrade 1
+ Description: Unlock the ability to upgrade Arrow Towers with more damage and a
+ faster attack speed
+ Icon: {fileID: 21300000, guid: a140f62a10b8dc04e84625f8008e0c24, type: 3}
+ Weight: 1
+ BaseTower: {fileID: 11400000, guid: 0f693e29ca953e1439e10cb8f12e4b30, type: 2}
+ UpgradedTower: {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta
new file mode 100644
index 0000000..1009def
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 0b9f4905752751f44b9959b84b620266
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/EnemyAbilities.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta
similarity index 100%
rename from Assets/_Project/Definitions/EnemyAbilities.meta
rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities.meta
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset
new file mode 100644
index 0000000..6cc7cf7
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset
@@ -0,0 +1,19 @@
+%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: 4fbb09f55384ac44399ac4655b2b53ec, type: 3}
+ m_Name: BlinkAbility
+ 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
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta
new file mode 100644
index 0000000..78c2c0b
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 030f10c9a264e544ea3e0f4fdb4171bd
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset
new file mode 100644
index 0000000..725338e
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset
@@ -0,0 +1,18 @@
+%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: be77d353621f07e40bbdab2e9cc37f51, type: 3}
+ m_Name: FlightAbility
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.FlightAbilityDefinition
+ DisplayName: Flight
+ Description: Enemies gain flying
+ FlightHeight: 3
+ SpeedMultiplier: 1
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta
new file mode 100644
index 0000000..0b5d052
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: cb2ec6bb70f57d0429b99b7cd4c7db73
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset
new file mode 100644
index 0000000..fc16c66
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset
@@ -0,0 +1,17 @@
+%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: 3b770ce042b78f44d9a3df537fe25db0, type: 3}
+ m_Name: GoldTheftAbility
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.GoldTheftAbilityDefinition
+ DisplayName: Thief
+ Description: Enemies that leak out of a player's maze steal 15 gold as they go.
+ GoldStolen: 15
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta
new file mode 100644
index 0000000..11247d1
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: a18691a20d75f17479a83b3e171759e7
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset
new file mode 100644
index 0000000..0231479
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset
@@ -0,0 +1,17 @@
+%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: fd5b12948b24e9c4c8840ef3470b437e, type: 3}
+ m_Name: NoBountyAbility
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.NoBountyAbilityDefinition
+ DisplayName: Penniless
+ Description: Enemies no longer drop gold on death
+ BountyMultiplier: 0
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta
new file mode 100644
index 0000000..8aede82
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: c64c7121b0456bb4a873acec9e0abf91
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset
similarity index 100%
rename from Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset
rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset
diff --git a/Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/EnemyAbilities/SplitOnDeathAbility.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/SplitOnDeathAbility.asset.meta
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset
new file mode 100644
index 0000000..509a039
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset
@@ -0,0 +1,17 @@
+%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: de25a6333a11d074280b5ade557aa8b9, type: 3}
+ m_Name: EnemyScalingConfig
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyScalingConfig
+ BaseHpBudget: 5000
+ GrowthPerEncounter: 1.18
+ BossHpMultiplier: 1.2
diff --git a/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta
new file mode 100644
index 0000000..377b8a5
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: ae9fde0b564e20440ac2e20861fa1ca6
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/GoldConfig.asset b/Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset
similarity index 100%
rename from Assets/_Project/Definitions/GoldConfig.asset
rename to Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset
diff --git a/Assets/_Project/Definitions/GoldConfig.asset.meta b/Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/GoldConfig.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/GoldConfig.asset.meta
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta
new file mode 100644
index 0000000..5a3abf7
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 11ba3723e03690b47a4f2518bfc68a62
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset
new file mode 100644
index 0000000..8691b9a
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset
@@ -0,0 +1,28 @@
+%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: 4202a767d96e70f41b6a7e84eb08a832, type: 3}
+ m_Name: EnemyUpgradeGroup_Phase1_Basics
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyUpgrades.EnemyUpgradeGroup
+ DisplayName: Upgrade Group Phase 1
+ Options:
+ - Option: {fileID: 11400000, guid: eef28ca7b8844504e9d75ff903a3bb61, type: 2}
+ Weight: 1
+ - Option: {fileID: 11400000, guid: 46e2a6a59c0a3034f9fa44681d9ba422, type: 2}
+ Weight: 1
+ - Option: {fileID: 11400000, guid: 80fb851b702ff304183cb6e89c4aa245, type: 2}
+ Weight: 1
+ - Option: {fileID: 11400000, guid: a67aa3644d2ad4847a47040f53fea26f, type: 2}
+ Weight: 1
+ - Option: {fileID: 11400000, guid: f6bfb033a15b6d0419587b80a8286bd1, type: 2}
+ Weight: 1
+ - Option: {fileID: 11400000, guid: 37d761966a349ba4cb4141f913224d5c, type: 2}
+ Weight: 1
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta
new file mode 100644
index 0000000..04f87c2
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 3dfcbf5323c0a184c84f6b9e80e37257
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset
new file mode 100644
index 0000000..34c811a
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset
@@ -0,0 +1,21 @@
+%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: 8f73fcf0261654d44a6d0939bdc9b88f, type: 3}
+ m_Name: Phase1
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.PhaseDefinition
+ DisplayName: Phase 1
+ WaveGroups:
+ - {fileID: 11400000, guid: 80eaa5ec98fd5df4e950131a8984fd31, type: 2}
+ BossGroups:
+ - {fileID: 11400000, guid: 2981ffffb36dfc440aa4517c17cfbbf4, type: 2}
+ EnemyUpgradeGroups:
+ - {fileID: 11400000, guid: 3dfcbf5323c0a184c84f6b9e80e37257, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta
new file mode 100644
index 0000000..7fea787
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1d4f04f995c4c3b44be6e5f9d0f6e3f8
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset
new file mode 100644
index 0000000..c77b032
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset
@@ -0,0 +1,18 @@
+%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: 2b73bb9876b7fdb4480b13ff6bb8bd67, type: 3}
+ m_Name: Test_Run_Definition
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.RunDefinition
+ WavesPerCycle: 5
+ CyclesPerPhase: 3
+ Phases:
+ - {fileID: 11400000, guid: 1d4f04f995c4c3b44be6e5f9d0f6e3f8, type: 2}
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta
new file mode 100644
index 0000000..bcf6074
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 1bb81a966192c344d94cce2628c1832b
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset
new file mode 100644
index 0000000..2e739af
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset
@@ -0,0 +1,18 @@
+%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: 5625bd25f378bda429666820a4940cee, type: 3}
+ m_Name: WaveGroup_Phase1_Bosses
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.WaveGroup
+ DisplayName: Phase 1 Bosses
+ Waves:
+ - Wave: {fileID: 11400000, guid: 4db677d2940202340841471f90a5b73a, type: 2}
+ Weight: 1
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta
new file mode 100644
index 0000000..174e980
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 2981ffffb36dfc440aa4517c17cfbbf4
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset
new file mode 100644
index 0000000..265c492
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset
@@ -0,0 +1,34 @@
+%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: 5625bd25f378bda429666820a4940cee, type: 3}
+ m_Name: WaveGroup_Phase1_Normal
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Waves.WaveGroup
+ DisplayName:
+ Waves:
+ - Wave: {fileID: 11400000, guid: 65f66289ea1233b4897f46cd997d9c7a, type: 2}
+ Weight: 1
+ - Wave: {fileID: 11400000, guid: 190e39db44aa0794aa808fd60976f7c4, type: 2}
+ Weight: 1
+ - Wave: {fileID: 11400000, guid: 39921b44a1a0a56478200028940c5202, type: 2}
+ Weight: 1
+ - Wave: {fileID: 11400000, guid: 50f498bc5bfc46e44b064cc96403e2cb, type: 2}
+ Weight: 1
+ - Wave: {fileID: 11400000, guid: 9ee6dee12f0660844b4d46880f01c02f, type: 2}
+ Weight: 0.5
+ - Wave: {fileID: 11400000, guid: 41231de63e8f25d448f19f3816e0c22f, type: 2}
+ Weight: 0.5
+ - Wave: {fileID: 11400000, guid: 6290df178cbd3144aa92a0f09833a7be, type: 2}
+ Weight: 0.5
+ - Wave: {fileID: 11400000, guid: 86736fd52c18fa84e8ced40f30b514fa, type: 2}
+ Weight: 0.5
+ - Wave: {fileID: 11400000, guid: 8fdf53cfc405a5f41a00f376198b8d84, type: 2}
+ Weight: 0.5
diff --git a/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta
new file mode 100644
index 0000000..c2de13d
--- /dev/null
+++ b/Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 80eaa5ec98fd5df4e950131a8984fd31
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Definitions/Waves.meta b/Assets/_Project/Definitions/RunDefinitions/Waves.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave10Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset
similarity index 93%
rename from Assets/_Project/Definitions/Waves/Wave10Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset
index eb49ceb..1bc8617 100644
--- a/Assets/_Project/Definitions/Waves/Wave10Definition.asset
+++ b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset
@@ -13,7 +13,7 @@ MonoBehaviour:
m_Name: Wave10Definition
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveDefinition
PrepTime: 10
+ ReleaseInterval: 2
Entries:
- EnemyType: {fileID: 11400000, guid: 1d9809612c00ed049848a955613a4619, type: 2}
- Count: 50
- SpawnInterval: 0.5
+ Count: 5
diff --git a/Assets/_Project/Definitions/Waves/Wave10Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave10Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave10Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave1Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave1Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave1Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave1Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave1Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave2Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave2Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave2Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave2Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave2Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave3Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave3Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave3Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave3Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave3Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave4Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave4Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave4Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave4Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave4Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave5Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave5Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave5Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave5Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave5Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave6Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave6Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave6Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave6Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave6Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave7Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave7Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave7Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave7Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave7Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave8Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave8Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave8Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave8Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave8Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Waves/Wave9Definition.asset b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave9Definition.asset
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset
diff --git a/Assets/_Project/Definitions/Waves/Wave9Definition.asset.meta b/Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset.meta
similarity index 100%
rename from Assets/_Project/Definitions/Waves/Wave9Definition.asset.meta
rename to Assets/_Project/Definitions/RunDefinitions/Waves/Wave9Definition.asset.meta
diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset
index 3a1c5c4..d39d8d9 100644
--- a/Assets/_Project/Definitions/Towers/BasicArrowTower.asset
+++ b/Assets/_Project/Definitions/Towers/BasicArrowTower.asset
@@ -17,8 +17,12 @@ MonoBehaviour:
backbone of any maze.
FootprintSize: {x: 2, y: 2}
GoldCost: 25
+ SellRefundPercent: 0.75
+ FullRefundIfUnupgraded: 0
BuildTime: 0.5
TowerPrefab: {fileID: 6482414459531823157, guid: 1511641f145758b469e64376d2a0d434, type: 3}
+ ConstructionPhases: {fileID: 0}
+ Icon: {fileID: 21300000, guid: afe216737d1b46e783889299bda1c252, type: 3}
DamageType: 0
TargetPriority: 0
TargetType: 0
@@ -34,5 +38,5 @@ MonoBehaviour:
EffectDuration: 0
ProjectilePrefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3}
ProjectileSpeed: 15
- UpgradePaths: []
- Icon: {fileID: 21300000, guid: afe216737d1b46e783889299bda1c252, type: 3}
+ UpgradePaths:
+ - {fileID: 11400000, guid: 86d4c3ab00d4c654eb4c255280ee5701, type: 2}
diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset
new file mode 100644
index 0000000..226afff
--- /dev/null
+++ b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset
@@ -0,0 +1,41 @@
+%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: 7b353a757b6e6774d97e6fb8ba138fcc, type: 3}
+ m_Name: BasicArrowTower_Upgrade_1
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Towers.TowerDefinition
+ DisplayName: Basic Arrow Tower
+ Description: Single-target tower that fires arrows at ground and air enemies. The
+ backbone of any maze.
+ FootprintSize: {x: 2, y: 2}
+ GoldCost: 50
+ SellRefundPercent: 0.75
+ FullRefundIfUnupgraded: 0
+ BuildTime: 1.5
+ TowerPrefab: {fileID: 6482414459531823157, guid: 1511641f145758b469e64376d2a0d434, type: 3}
+ ConstructionPhases: {fileID: 0}
+ Icon: {fileID: 21300000, guid: a140f62a10b8dc04e84625f8008e0c24, type: 3}
+ DamageType: 0
+ TargetPriority: 0
+ TargetType: 0
+ GroundedOnly: 0
+ Damage: 15
+ Range: 20
+ AttacksPerSecond: 6
+ SplashRadius: 0
+ ChainCount: 0
+ ChainRange: 0
+ SlowFactor: 0
+ DotDamagePerSecond: 0
+ EffectDuration: 0
+ ProjectilePrefab: {fileID: 2664719039363295382, guid: dc2e4a4108e03874a8b2dab88dcc8fba, type: 3}
+ ProjectileSpeed: 15
+ UpgradePaths: []
diff --git a/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta
new file mode 100644
index 0000000..facefe3
--- /dev/null
+++ b/Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 86d4c3ab00d4c654eb4c255280ee5701
+NativeFormatImporter:
+ externalObjects: {}
+ mainObjectFileID: 11400000
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab
index f183f6e..d912bec 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Red.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: 7515565462997402737}
m_Layer: 10
m_Name: Enemy_CrystalGolem_Red
m_TagString: Untagged
@@ -52,7 +53,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
- GlobalObjectIdHash: 3715663997
+ GlobalObjectIdHash: 3037368120
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &7515565462997402737
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab
index 3144e35..bd7ac68 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_CrystalGolem_Yellow.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: -5265869660159140516}
m_Layer: 10
m_Name: Enemy_CrystalGolem_Yellow
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &-5265869660159140516
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab
index dfb934a..d721ee2 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Green.prefab
@@ -17,6 +17,7 @@ GameObject:
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
- component: {fileID: -4695266156693656620}
+ - component: {fileID: -7800194977638654489}
m_Layer: 10
m_Name: Enemy_Cyclops_Green
m_TagString: Untagged
@@ -215,9 +216,20 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 9df6fea9a86daafae998f8eecc44ee7d, type: 3}
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TD.Combat.EnemyDeathSound
- deathClips:
- - {fileID: 8300000, guid: e007e19b827137ce395021d825927dcc, type: 3}
- - {fileID: 8300000, guid: 6cea30689732db2f0a8989fe8f1a07a9, type: 3}
+ deathSounds: []
+--- !u!114 &-7800194977638654489
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab
index 055ef54..89ac836 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Grey.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: -5218620239817511880}
m_Layer: 10
m_Name: Enemy_Cyclops_Grey
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &-5218620239817511880
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab
index 5a0e904..f5ace60 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Cyclops_Red.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: -7009934292190590155}
m_Layer: 10
m_Name: Enemy_Cyclops_Red
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &-7009934292190590155
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab
index 0e12a01..60b1291 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Black.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: 3080180597758813642}
m_Layer: 10
m_Name: Enemy_Ent_Black
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &3080180597758813642
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab
index eeaca4c..2ab5755 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Green.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: -2371779262468771447}
m_Layer: 10
m_Name: Enemy_Ent_Green
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &-2371779262468771447
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab
index 9b366bb..bca0e4a 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_Ent_Orange.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: 2883007611589499530}
m_Layer: 10
m_Name: Enemy_Ent_Orange
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &2883007611589499530
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab
index 8acc7db..ef51e96 100644
--- a/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab
+++ b/Assets/_Project/Prefabs/Enemies/Enemy_UndeadDrake_Bone.prefab
@@ -16,6 +16,7 @@ GameObject:
- component: {fileID: 3283904430289710888}
- component: {fileID: 3756613737869398948}
- component: {fileID: 6036713598566100742}
+ - component: {fileID: 5647470509798016640}
m_Layer: 10
m_Name: Enemy_UndeadDrake_Bone
m_TagString: Untagged
@@ -202,6 +203,19 @@ CapsuleCollider:
m_Height: 2
m_Direction: 1
m_Center: {x: 0, y: 1, z: 0}
+--- !u!114 &5647470509798016640
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 1455822126534880203}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 9d1a26a32e8969cd29bce6010126a5f6, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbility
+ ShowTopMostFoldoutHeaderGroup: 1
--- !u!1 &5361867751622119598
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/_Project/Prefabs/Player/Player.prefab b/Assets/_Project/Prefabs/Player/Player.prefab
index ce17790..240ec88 100644
--- a/Assets/_Project/Prefabs/Player/Player.prefab
+++ b/Assets/_Project/Prefabs/Player/Player.prefab
@@ -18,6 +18,9 @@ GameObject:
- component: {fileID: 5683786710272852339}
- component: {fileID: 6856236869205671849}
- component: {fileID: -4438158474568445526}
+ - component: {fileID: 2871545571532934715}
+ - component: {fileID: 1298503032983562452}
+ - component: {fileID: 8755797571419628899}
m_Layer: 0
m_Name: Player
m_TagString: Untagged
@@ -52,7 +55,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Netcode.Runtime::Unity.Netcode.NetworkObject
- GlobalObjectIdHash: 1552073510
+ GlobalObjectIdHash: 121878297
InScenePlacedSourceGlobalObjectIdHash: 0
DeferredDespawnTick: 0
Ownership: 1
@@ -171,3 +174,42 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DebugCommandRelay
ShowTopMostFoldoutHeaderGroup: 1
+--- !u!114 &2871545571532934715
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3493329038866903420}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: f60f6928562351f4891142ad59ab6352, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerUpgrades
+ ShowTopMostFoldoutHeaderGroup: 1
+--- !u!114 &1298503032983562452
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3493329038866903420}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: b7e4c91a08f5d2461a3f8e6c25b09d74, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.PlayerTowerDeck
+ ShowTopMostFoldoutHeaderGroup: 1
+--- !u!114 &8755797571419628899
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 3493329038866903420}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 2b8f4d1e6c3a497051d8e2f7a9c1b063, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.Draft.PlayerDraft
+ ShowTopMostFoldoutHeaderGroup: 1
diff --git a/Assets/_Project/Scenes/Levels/9Player.unity b/Assets/_Project/Scenes/Levels/9Player.unity
index dd7bef0..a08f1d5 100644
--- a/Assets/_Project/Scenes/Levels/9Player.unity
+++ b/Assets/_Project/Scenes/Levels/9Player.unity
@@ -2307,7 +2307,10 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.EnemyAbilities.EnemyAbilityPool
abilities:
- {fileID: 11400000, guid: 0305468bc8f912d429a8b20bf23f947c, type: 2}
- noAbilityWeight: 100
+ - {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!4 &181002641
Transform:
m_ObjectHideFlags: 0
@@ -13016,6 +13019,57 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 24, y: 1, z: 30}
m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &875833597
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 875833599}
+ - component: {fileID: 875833598}
+ m_Layer: 0
+ m_Name: EnemyUpgradePool
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &875833598
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 875833597}
+ 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!4 &875833599
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 875833597}
+ 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: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &902199259
GameObject:
m_ObjectHideFlags: 0
@@ -13942,6 +13996,78 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 17, y: 1, z: 13}
m_Center: {x: 0, y: 0, z: 0}
+--- !u!1 &961493951
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 961493954}
+ - component: {fileID: 961493952}
+ - component: {fileID: 961493953}
+ m_Layer: 0
+ m_Name: RunState
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &961493952
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 961493951}
+ 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 &961493953
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 961493951}
+ 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!4 &961493954
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 961493951}
+ 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: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &993870443
GameObject:
m_ObjectHideFlags: 0
@@ -14522,6 +14648,7 @@ MonoBehaviour:
placementManager: {fileID: 1507514108}
cameraController: {fileID: 1239994223}
rejectionMessageDuration: 2.5
+ menuButtonIcon: {fileID: 0}
chatMaxHeight: 280
chatMaxMessages: 2147483647
chatSystemColor: {r: 1, g: 0.7, b: 0.2, a: 1}
@@ -18307,19 +18434,11 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Assembly-CSharp::TD.Gameplay.WaveManager
ShowTopMostFoldoutHeaderGroup: 1
- waveDefinitions:
- - {fileID: 11400000, guid: 65f66289ea1233b4897f46cd997d9c7a, type: 2}
- - {fileID: 11400000, guid: 190e39db44aa0794aa808fd60976f7c4, type: 2}
- - {fileID: 11400000, guid: 39921b44a1a0a56478200028940c5202, type: 2}
- - {fileID: 11400000, guid: 50f498bc5bfc46e44b064cc96403e2cb, type: 2}
- - {fileID: 11400000, guid: 9ee6dee12f0660844b4d46880f01c02f, type: 2}
- - {fileID: 11400000, guid: 41231de63e8f25d448f19f3816e0c22f, type: 2}
- - {fileID: 11400000, guid: 6290df178cbd3144aa92a0f09833a7be, type: 2}
- - {fileID: 11400000, guid: 86736fd52c18fa84e8ced40f30b514fa, type: 2}
- - {fileID: 11400000, guid: 8fdf53cfc405a5f41a00f376198b8d84, type: 2}
- - {fileID: 11400000, guid: 4db677d2940202340841471f90a5b73a, type: 2}
startingLives: 40
+ draftTimeSeconds: 30
+ voteTimeSeconds: 25
goldConfig: {fileID: 11400000, guid: d5e01c919f14a1e4888ad494a159241b, type: 2}
+ enemyScalingConfig: {fileID: 11400000, guid: ae9fde0b564e20440ac2e20861fa1ca6, type: 2}
--- !u!43 &1393870843
Mesh:
m_ObjectHideFlags: 0
@@ -20189,6 +20308,7 @@ MonoBehaviour:
- {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:
@@ -22897,6 +23017,7 @@ MonoBehaviour:
m_EditorClassIdentifier: Assembly-CSharp::TD.Dev.DevWaveControls
hotkey: 94
grantTowerHotkey: 101
+ skipToBossHotkey: 100
--- !u!4 &1731269687
Transform:
m_ObjectHideFlags: 0
@@ -27956,6 +28077,78 @@ Mesh:
- serializedVersion: 1
m_IndexStart: 0
m_IndexCount: 0
+--- !u!1 &2021000666
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 2021000669}
+ - component: {fileID: 2021000667}
+ - component: {fileID: 2021000668}
+ m_Layer: 0
+ m_Name: WaveVote
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!114 &2021000667
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021000666}
+ 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 &2021000668
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021000666}
+ 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!4 &2021000669
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 2021000666}
+ 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: 0}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!43 &2024389666
Mesh:
m_ObjectHideFlags: 0
@@ -28831,6 +29024,7 @@ MonoBehaviour:
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}
@@ -29237,3 +29431,6 @@ SceneRoots:
- {fileID: 759470735}
- {fileID: 954434161}
- {fileID: 181002641}
+ - {fileID: 961493954}
+ - {fileID: 2021000669}
+ - {fileID: 875833599}
diff --git a/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs
new file mode 100644
index 0000000..737b34a
--- /dev/null
+++ b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs
@@ -0,0 +1,122 @@
+// Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs
+using UnityEditor;
+using UnityEngine;
+using TD.Gameplay;
+
+namespace TD.Editor.Gameplay
+{
+ ///
+ /// Custom property drawer for . Labels each element by its
+ /// run position ("Encounter 3") rather than "Element 2", and renders a projected-earnings
+ /// line beneath the fields so the economy can be tuned without arithmetic.
+ ///
+ ///
+ /// Projections are estimates by necessity. Kill income depends on how many enemies the
+ /// encounter spawns, and the wave filling each slot is drawn at runtime from a phase pool —
+ /// so the drawer multiplies against
+ /// instead. The cumulative figure is the number worth watching: it answers "how much could a
+ /// player have banked by this point in the run", which is what tower prices get balanced
+ /// against.
+ ///
+ [CustomPropertyDrawer(typeof(EncounterGoldEntry))]
+ public class EncounterGoldEntryDrawer : PropertyDrawer
+ {
+ private const float PreviewLineExtraHeight = 4f;
+
+ public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
+ {
+ if (!property.isExpanded) return EditorGUIUtility.singleLineHeight;
+
+ float h = EditorGUIUtility.singleLineHeight; // foldout
+ h += SpacedLineHeight() * 3; // the three gold fields
+ h += SpacedLineHeight() * 2 + PreviewLineExtraHeight; // projection + cumulative
+ return h;
+ }
+
+ public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
+ {
+ int encounterNumber = EncounterNumberFrom(property);
+
+ // Re-label the foldout by run position. Element indices are 0-based and read as
+ // off-by-one against everything else in the run (RunState, the HUD, the checklist),
+ // which made miscounting the boss slot easy.
+ var header = new GUIContent(encounterNumber > 0
+ ? $"Encounter {encounterNumber}"
+ : label.text);
+
+ Rect headerRect = new Rect(position.x, position.y, position.width,
+ EditorGUIUtility.singleLineHeight);
+ property.isExpanded = EditorGUI.Foldout(headerRect, property.isExpanded, header,
+ toggleOnLabelClick: true);
+ if (!property.isExpanded) return;
+
+ float y = position.y + SpacedLineHeight();
+ const float indent = 14f;
+ Rect Row()
+ {
+ Rect r = new Rect(position.x + indent, y, position.width - indent,
+ EditorGUIUtility.singleLineHeight);
+ y += SpacedLineHeight();
+ return r;
+ }
+
+ var perEnemyProp = property.FindPropertyRelative("GoldPerEnemy");
+ var completionProp = property.FindPropertyRelative("CompletionBonus");
+ var noLeaksProp = property.FindPropertyRelative("NoLeaksBonus");
+
+ EditorGUI.PropertyField(Row(), perEnemyProp);
+ EditorGUI.PropertyField(Row(), completionProp);
+ EditorGUI.PropertyField(Row(), noLeaksProp);
+
+ // Read values off the SerializedProperties rather than the backing object: edits
+ // aren't applied to the instance until ApplyModifiedProperties runs at end of frame,
+ // so the object would show stale numbers while the designer is still typing.
+ int perEnemy = perEnemyProp.intValue;
+ int completion = completionProp.intValue;
+ int noLeaks = noLeaksProp.intValue;
+
+ var config = property.serializedObject.targetObject as GoldConfig;
+ int assumed = config != null ? config.PreviewEnemiesPerEncounter : 0;
+
+ int projected = perEnemy * assumed + completion + noLeaks;
+
+ y += PreviewLineExtraHeight;
+ var style = new GUIStyle(EditorStyles.miniLabel) { fontStyle = FontStyle.Italic };
+
+ using (new EditorGUI.DisabledScope(true))
+ {
+ EditorGUI.LabelField(
+ Row(),
+ $"Projected: {projected} g ({perEnemy} × {assumed} enemies " +
+ $"+ {completion} clear + {noLeaks} no-leak)",
+ style);
+
+ // Cumulative only makes sense once we know where this entry sits in the run.
+ if (config != null && encounterNumber > 0)
+ {
+ EditorGUI.LabelField(
+ Row(),
+ $"Cumulative by here: {config.ProjectedCumulativeThrough(encounterNumber)} g " +
+ $"(incl. {config.StartingGold} starting)",
+ style);
+ }
+ }
+ }
+
+ // Recovers the 1-based run position from a path like "Encounters.Array.data[2]".
+ // Returns 0 when the entry isn't being drawn as an array element.
+ private static int EncounterNumberFrom(SerializedProperty property)
+ {
+ string path = property.propertyPath;
+ int open = path.LastIndexOf('[');
+ int close = path.LastIndexOf(']');
+ if (open < 0 || close < open) return 0;
+
+ string inner = path.Substring(open + 1, close - open - 1);
+ return int.TryParse(inner, out int index) ? index + 1 : 0;
+ }
+
+ private static float SpacedLineHeight()
+ => EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
+ }
+}
diff --git a/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta
new file mode 100644
index 0000000..74b7ba7
--- /dev/null
+++ b/Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 62f688cf14ba23b42bd0edd63a11ba62
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs b/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs
deleted file mode 100644
index dff5ca8..0000000
--- a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs
+++ /dev/null
@@ -1,112 +0,0 @@
-// Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs
-using UnityEditor;
-using UnityEngine;
-using TD.Gameplay;
-
-namespace TD.Editor.Gameplay
-{
- ///
- /// Custom property drawer for . Renders the standard fields
- /// followed by a read-only "Preview Total" line computed from the entry's values, so
- /// designers can see at a glance how much a single player could earn from a wave.
- ///
- ///
- /// The preview includes the kill-reward portion only when the entry's Wave
- /// reference is assigned (it's needed to count enemies in that wave). When unset, the
- /// preview shows just CompletionBonus + NoLeaksBonus and labels itself so the
- /// designer knows to drop a WaveDefinition in for a complete number.
- ///
- [CustomPropertyDrawer(typeof(WaveGoldEntry))]
- public class WaveGoldEntryDrawer : PropertyDrawer
- {
- private const float PreviewLineExtraHeight = 4f;
-
- public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
- {
- // Sum the children + one extra line for the preview label. We render children
- // ourselves rather than using EditorGUI.PropertyField default since we want a
- // foldout with our custom preview tacked onto the end.
- if (!property.isExpanded) return EditorGUIUtility.singleLineHeight;
-
- float h = EditorGUIUtility.singleLineHeight; // foldout
- h += SpacedLineHeight() * 4; // Wave + GoldPerEnemy + Completion + NoLeaks
- h += SpacedLineHeight() + PreviewLineExtraHeight; // preview label
- return h;
- }
-
- public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
- {
- // Foldout header.
- Rect headerRect = new Rect(position.x, position.y, position.width,
- EditorGUIUtility.singleLineHeight);
- property.isExpanded = EditorGUI.Foldout(headerRect, property.isExpanded, label,
- toggleOnLabelClick: true);
- if (!property.isExpanded) return;
-
- float y = position.y + SpacedLineHeight();
- float indent = 14f;
- Rect Row()
- {
- Rect r = new Rect(position.x + indent, y, position.width - indent,
- EditorGUIUtility.singleLineHeight);
- y += SpacedLineHeight();
- return r;
- }
-
- // Standard property fields.
- var waveProp = property.FindPropertyRelative("Wave");
- var perEnemyProp = property.FindPropertyRelative("GoldPerEnemy");
- var completionProp = property.FindPropertyRelative("CompletionBonus");
- var noLeaksProp = property.FindPropertyRelative("NoLeaksBonus");
-
- EditorGUI.PropertyField(Row(), waveProp);
- EditorGUI.PropertyField(Row(), perEnemyProp);
- EditorGUI.PropertyField(Row(), completionProp);
- EditorGUI.PropertyField(Row(), noLeaksProp);
-
- // Compute the preview total. We instantiate the same logic as the runtime
- // property — read the serialized values, count enemies in the optional Wave,
- // sum it all up. Done inline (rather than calling WaveGoldEntry.PreviewTotalGold
- // directly) because SerializedProperty edits aren't applied to the target object
- // until ApplyModifiedProperties runs at the end of the frame, so reading the
- // backing class instance here would show stale data while the user is typing.
- int perEnemy = perEnemyProp.intValue;
- int completion = completionProp.intValue;
- int noLeaks = noLeaksProp.intValue;
- var waveAsset = waveProp.objectReferenceValue as WaveDefinition;
-
- int enemyCount = 0;
- if (waveAsset != null && waveAsset.Entries != null)
- {
- foreach (var e in waveAsset.Entries)
- {
- if (e.EnemyType != null && e.Count > 0)
- enemyCount += e.Count;
- }
- }
-
- int total = perEnemy * enemyCount + completion + noLeaks;
-
- // Preview line. Slightly dimmed style, italic, non-editable. Includes a
- // breakdown so the designer can see where the number came from.
- y += PreviewLineExtraHeight;
- Rect previewRect = new Rect(position.x + indent, y, position.width - indent,
- EditorGUIUtility.singleLineHeight);
-
- string breakdown = waveAsset != null
- ? $"Preview Total: {total} g ({perEnemy} × {enemyCount} enemies " +
- $"+ {completion} completion + {noLeaks} no-leak)"
- : $"Preview Total: {completion + noLeaks} g (bonuses only — assign Wave " +
- $"to include kill rewards)";
-
- var prevStyle = new GUIStyle(EditorStyles.miniLabel) { fontStyle = FontStyle.Italic };
- using (new EditorGUI.DisabledScope(true))
- {
- EditorGUI.LabelField(previewRect, breakdown, prevStyle);
- }
- }
-
- private static float SpacedLineHeight()
- => EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
- }
-}
diff --git a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta b/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta
deleted file mode 100644
index b9c6f5d..0000000
--- a/Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta
+++ /dev/null
@@ -1,2 +0,0 @@
-fileFormatVersion: 2
-guid: cc17000144b098340a210921594babca
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs
index d643fcf..67fda7b 100644
--- a/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs
+++ b/Assets/_Project/Scripts/Gameplay/EnemyAbilities/EnemySpawnContext.cs
@@ -28,15 +28,25 @@ namespace TD.Gameplay.EnemyAbilities
/// Uniform transform scale relative to the prefab's authored scale.
public float VisualScale;
- /// Seeds a context from an enemy definition's authored stats.
- public static EnemySpawnContext FromDefinition(EnemyDefinition def) => new EnemySpawnContext
- {
- MaxHp = def.MaxHp,
- MoveSpeed = def.MoveSpeed,
- IsFlying = def.IsFlying,
- FlightHeight = def.FlightHeight,
- LivesCost = def.LivesCost,
- VisualScale = 1f,
- };
+ ///
+ /// Seeds a context from an enemy definition's authored stats, with health supplied by the
+ /// caller.
+ ///
+ /// The type being spawned. Supplies everything except health.
+ /// Health this enemy spawns with, already resolved from the
+ /// encounter's budget and the type's — see
+ /// . Passed in rather than read off the
+ /// definition because it depends on run position and the wave's enemy count, neither of
+ /// which the asset knows about.
+ public static EnemySpawnContext FromDefinition(EnemyDefinition def, float resolvedMaxHp)
+ => new EnemySpawnContext
+ {
+ MaxHp = resolvedMaxHp,
+ MoveSpeed = def.MoveSpeed,
+ IsFlying = def.IsFlying,
+ FlightHeight = def.FlightHeight,
+ LivesCost = def.LivesCost,
+ VisualScale = 1f,
+ };
}
}
diff --git a/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs b/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs
index 15f45f8..bda4e45 100644
--- a/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs
+++ b/Assets/_Project/Scripts/Gameplay/EnemyDefinition.cs
@@ -12,6 +12,13 @@ namespace TD.Gameplay
/// in project assets, only the asset reference (or its fields) crosses runtime code.
/// Replace with a real mesh/animator when art is ready —
/// no code changes required.
+ ///
+ /// An enemy type is flavour, not a difficulty tier. There is deliberately no
+ /// absolute health field: health comes from based on how far
+ /// into the run the encounter sits, and this asset only says how the type deviates from that
+ /// (). Because waves are drawn at random from a phase pool, any
+ /// difficulty baked into the roster would be difficulty handed out by the luck of the draw.
+ /// Every type should be a viable occupant of any slot.
///
[CreateAssetMenu(fileName = "EnemyDefinition", menuName = "TD/Enemy Definition", order = 3)]
public class EnemyDefinition : ScriptableObject
@@ -21,10 +28,16 @@ namespace TD.Gameplay
public string DisplayName;
[Header("Stats")]
- [Tooltip("Maximum hit points for this enemy type.")]
- public float MaxHp = 100f;
+ [Tooltip("How tough this enemy is RELATIVE to its encounter's budget — not an absolute " +
+ "hit-point value. 1.0 = exactly its share of the budget; 1.25 = a quarter " +
+ "tougher than the slot calls for. Keep it near 1.0 and let the wave's enemy " +
+ "count express tankiness (fewer enemies each get a bigger share).")]
+ [Min(0.01f)]
+ public float HpMultiplier = 1f;
- [Tooltip("Movement speed in world units per second along the A* path.")]
+ [Tooltip("Movement speed in world units per second along the A* path. ABSOLUTE and " +
+ "unscaled — speed is a fixed character trait, not a progression axis. See " +
+ "EnemyScalingConfig for why.")]
public float MoveSpeed = 3f;
[Tooltip("When true this enemy flies: it paths on the baked terrain grid, ignoring " +
diff --git a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs
index ddd2e6a..28f6ab9 100644
--- a/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs
+++ b/Assets/_Project/Scripts/Gameplay/EnemyHealth.cs
@@ -73,9 +73,9 @@ namespace TD.Gameplay
// ----- Server-local runtime state -------------------------------------
- // Kill gold is no longer carried per-enemy — it comes from
- // GoldConfig.Waves[currentWaveIndex].GoldPerEnemy at the moment the kill
- // is registered. See WaveManager.HandleEnemyKilled.
+ // Kill gold is no longer carried per-enemy — it comes from the GoldConfig entry for
+ // the current encounter (GoldConfig.GetEncounterEntry) at the moment the kill is
+ // registered. See WaveManager.HandleEnemyKilled.
/// Lives deducted from the shared pool when this enemy reaches the goal.
public int LivesCost { get; private set; } = 1;
diff --git a/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs
new file mode 100644
index 0000000..8a833ee
--- /dev/null
+++ b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs
@@ -0,0 +1,85 @@
+// Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs
+using UnityEngine;
+
+namespace TD.Gameplay
+{
+ ///
+ /// How enemy health scales across a run. Single source of truth for difficulty progression,
+ /// the health counterpart to .
+ ///
+ ///
+ /// The problem this solves. Waves are drawn at random from a phase pool, so difficulty
+ /// can no longer live in the assets — an enemy authored at
+ /// 1000 HP is brutal at encounter 1 and trivial at encounter 40, and the draw decides which
+ /// you get. Progression has to be a property of how far the players have come, exactly
+ /// as gold payouts are.
+ ///
+ /// Budget, not per-enemy HP. This config scales the total health an
+ /// encounter presents; per-enemy health is that budget divided by the wave's enemy count. If
+ /// the curve set per-enemy health instead, enemy count would silently become a second
+ /// difficulty axis and a 150-strong swarm would hit three times harder than a 50-strong wave
+ /// in the same slot. Dividing a fixed budget turns count into a texture knob: eight
+ /// giants and a hundred rats threaten equally, but demand different mazes.
+ ///
+ /// Budget is per zone. Every player zone spawns the full wave, so this is the
+ /// health one player faces, not the lobby total. It does not change with player count.
+ ///
+ /// Speed is deliberately absent. Speed stays on the
+ /// , unscaled. Escalating speed alongside health compounds into
+ /// a difficulty cliff and quietly invalidates tower balance as a run goes — projectile lead,
+ /// slow-effect value and time-under-fire all shift. Fast-versus-slow reads best as a fixed
+ /// character trait; health and the voted wave buffs carry escalation.
+ ///
+ [CreateAssetMenu(fileName = "EnemyScalingConfig", menuName = "TD/Enemy Scaling Config", order = 3)]
+ public class EnemyScalingConfig : ScriptableObject
+ {
+ [Header("Health curve")]
+ [Tooltip("Total enemy health the run's FIRST encounter presents, per player zone. " +
+ "Per-enemy health is this divided by the wave's enemy count.")]
+ [Min(1f)]
+ public float BaseHpBudget = 5000f;
+
+ [Tooltip("Multiplier applied per encounter. 1.18 ≈ +18% health each encounter, so the " +
+ "budget roughly doubles every four. Encounters are counted continuously across " +
+ "the whole run, so cycle 2 is strictly harder than cycle 1.")]
+ [Min(1f)]
+ public float GrowthPerEncounter = 1.18f;
+
+ [Header("Boss")]
+ [Tooltip("Extra multiplier on a boss encounter's budget, on top of the curve. Bosses " +
+ "spawn few enemies, so nearly all of this lands on the single boss body.")]
+ [Min(1f)]
+ public float BossHpMultiplier = 6f;
+
+ ///
+ /// Total health budget for the given 1-based encounter number
+ /// (RunState.GlobalEncounterNumber), per player zone.
+ ///
+ public float GetEncounterHpBudget(int encounterNumber, bool isBoss)
+ {
+ int steps = Mathf.Max(0, encounterNumber - 1);
+ float budget = BaseHpBudget * Mathf.Pow(GrowthPerEncounter, steps);
+ if (isBoss) budget *= BossHpMultiplier;
+ return budget;
+ }
+
+ ///
+ /// Health for one enemy in the given encounter: the encounter's budget shared across
+ /// bodies, then skewed by the enemy type's
+ /// .
+ ///
+ ///
+ /// The archetype multiplier is a deliberate deviation from budget, not a
+ /// redistribution of it — a wave of 1.25× enemies really is 25% tougher than its slot
+ /// calls for. Keep multipliers near 1.0 and let the wave's enemy count express tankiness;
+ /// that is the knob the budget is designed to divide.
+ ///
+ public float ResolvePerEnemyHp(int encounterNumber, bool isBoss, int waveEnemyCount,
+ float archetypeMultiplier)
+ {
+ int bodies = Mathf.Max(1, waveEnemyCount);
+ float share = GetEncounterHpBudget(encounterNumber, isBoss) / bodies;
+ return Mathf.Max(1f, share * Mathf.Max(0.01f, archetypeMultiplier));
+ }
+ }
+}
diff --git a/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta
new file mode 100644
index 0000000..a428b6f
--- /dev/null
+++ b/Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: de25a6333a11d074280b5ade557aa8b9
\ No newline at end of file
diff --git a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs
index 460223a..2707d91 100644
--- a/Assets/_Project/Scripts/Gameplay/GoldConfig.cs
+++ b/Assets/_Project/Scripts/Gameplay/GoldConfig.cs
@@ -1,91 +1,68 @@
// Assets/_Project/Scripts/Gameplay/GoldConfig.cs
using System;
using UnityEngine;
+using UnityEngine.Serialization;
namespace TD.Gameplay
{
///
- /// Per-wave gold rules nested under . Each entry maps to one
- /// wave by array index in .
+ /// Gold rules for one encounter slot, addressed by position in the run rather than by
+ /// which wave happens to occupy it.
///
///
- /// Pairing with WaveDefinition. The runtime pairing of gold entry to wave is by
- /// array index — entry 0 applies to wave 1, etc. The reference here
- /// is OPTIONAL and exists purely so the inspector can compute and display the
- /// read-only value (which needs to know the wave's
- /// total enemy count to multiply against ). Leaving it
- /// unset just hides the kill-reward portion of the preview; runtime is unaffected.
+ /// Position, not identity. Under the 2.0 run structure the waves filling each slot are
+ /// drawn at random from a phase pool, so "the gold for wave 3" means the run's third
+ /// encounter, whatever spawns in it. Payouts are a property of how far the players have
+ /// progressed — not of which enemy they happened to draw.
///
[Serializable]
- public class WaveGoldEntry
+ public class EncounterGoldEntry
{
- [Tooltip("Optional reference to the WaveDefinition this entry pairs with. " +
- "Used ONLY for the inspector preview total — runtime pairing is by " +
- "array index in GoldConfig.Waves. Drag the matching WaveDefinition " +
- "here to see the live total computed under this entry.")]
- public WaveDefinition Wave;
-
- [Tooltip("Gold awarded to the killing player per enemy slain during this wave. " +
- "Applies uniformly to every enemy type in the wave.")]
+ [Tooltip("Gold awarded to the killing player per enemy slain during this encounter. " +
+ "Applies uniformly to every enemy type.")]
public int GoldPerEnemy = 10;
- [Tooltip("Flat bonus gold awarded to every active player when this wave is fully " +
+ [Tooltip("Flat bonus gold awarded to every active player when this encounter is fully " +
"cleared (all enemies dead or reached the goal).")]
public int CompletionBonus = 50;
- [Tooltip("Extra bonus gold awarded to a player who cleared this wave without any " +
+ [Tooltip("Extra bonus gold awarded to a player who cleared this encounter without any " +
"enemy from their own zone escaping their leak volume. Stacks on top of " +
- "CompletionBonus for the no-leak achievement.")]
+ "CompletionBonus.")]
public int NoLeaksBonus = 50;
///
- /// Read-only preview of the maximum gold a single player could earn in this wave:
- /// GoldPerEnemy × totalEnemyCount + CompletionBonus + NoLeaksBonus.
+ /// Guaranteed gold for a player who clears this encounter: the two bonuses, with no
+ /// kill income counted.
///
///
- /// Returns just CompletionBonus + NoLeaksBonus if is null
- /// (no enemy count to multiply against). Pure computation — safe at edit time and
- /// at runtime. The custom inspector under renders this as
- /// a non-editable label under the entry's fields.
+ /// Kill income can't be known here — the wave occupying this slot is drawn at runtime, so
+ /// its enemy count varies per run.
+ /// supplies an estimate for the inspector's projected totals.
///
- public int PreviewTotalGold
- {
- get
- {
- int total = CompletionBonus + NoLeaksBonus;
- if (Wave != null && Wave.Entries != null)
- {
- int enemies = 0;
- foreach (var e in Wave.Entries)
- {
- if (e.EnemyType != null && e.Count > 0)
- enemies += e.Count;
- }
- total += GoldPerEnemy * enemies;
- }
- return total;
- }
- }
+ public int GuaranteedBonusGold => CompletionBonus + NoLeaksBonus;
+
+ ///
+ /// Projected best-case earnings for one player this encounter, given an assumed enemy
+ /// count. Editor tuning aid only — nothing at runtime reads it.
+ ///
+ public int ProjectedTotal(int assumedEnemyCount)
+ => GoldPerEnemy * Mathf.Max(0, assumedEnemyCount) + GuaranteedBonusGold;
}
///
/// Single source of truth for every gold-related tunable in the game.
///
///
- /// Inspector layout. StartingGold is at the top and applies to every player.
- /// The Waves array follows, each element collapsible in the inspector with the
- /// per-wave rules and a read-only preview total computed from the entry's data.
+ /// Wiring. Assign one GoldConfig asset to WaveManager.goldConfig in the Match
+ /// scene. WaveManager seeds per-player starting gold from , reads
+ /// for kill rewards, and awards the completion
+ /// and no-leak bonuses as each encounter clears.
///
- /// Wiring. Assign one GoldConfig asset to WaveManager.goldConfig in
- /// the Match scene. WaveManager initializes per-player starting gold from
- /// at match start, uses
- /// to compute kill rewards, and awards /
- /// when each wave clears.
- ///
- /// No per-enemy-type bounties. Every enemy killed in wave N grants the same
- /// regardless of .
- /// If per-type variation becomes a design need, extend WaveGoldEntry with a per-type
- /// table; the current model intentionally favors simplicity.
+ /// No per-enemy-type bounties. Every enemy killed in a given encounter grants the
+ /// same reward regardless of . With enemy types now drawn at
+ /// random per phase, per-type bounties would make income depend on the luck of the draw
+ /// rather than on progression.
///
[CreateAssetMenu(fileName = "GoldConfig", menuName = "TD/Gold Config", order = 2)]
public class GoldConfig : ScriptableObject
@@ -93,28 +70,58 @@ namespace TD.Gameplay
[Tooltip("Gold each player starts the match with. Same for every player.")]
public int StartingGold = 100;
- [Tooltip("Per-encounter gold rules. Element 0 = the run's first encounter. Encounters " +
- "are counted continuously across the whole run — cycles do NOT restart the " +
- "count — so a phase of 5 waves × 3 cycles + a boss needs 16 entries. Missing " +
- "entries fall back to zero gold for that encounter.")]
- public WaveGoldEntry[] Waves;
+ [Tooltip("Gold rules per encounter, in run order. Element 0 = the run's first encounter. " +
+ "Encounters are counted continuously — cycles do NOT restart the count — so one " +
+ "phase of 5 waves × 3 cycles + a boss needs 16 entries. Missing entries pay " +
+ "zero for that encounter.")]
+ [FormerlySerializedAs("Waves")]
+ public EncounterGoldEntry[] Encounters;
+
+ [Header("Editor preview")]
+ [Tooltip("Assumed enemies per encounter, used ONLY to project totals in this inspector. " +
+ "Nothing at runtime reads it — the real count comes from whichever wave the run " +
+ "draws into each slot.")]
+ [Min(0)]
+ public int PreviewEnemiesPerEncounter = 40;
///
- /// Returns the gold entry for the given 1-based encounter number
+ /// Returns the gold rules for the given 1-based encounter number
/// (RunState.GlobalEncounterNumber), or null if out of range.
///
///
- /// Keyed by encounter, not by wave slot. Under the cyclical run structure the same
- /// five waves come round three times per phase, so a slot-keyed table would pay the same
- /// on cycle 3 as on cycle 1 while the enemies got steadily stronger. A run-long counter
- /// lets payouts climb monotonically with difficulty.
+ /// Keyed by run position, not by wave slot within a cycle. The same five waves come
+ /// round three times per phase, so a slot-keyed table would pay the same on cycle 3 as on
+ /// cycle 1 while the enemies grew steadily stronger from the buffs voted onto them. A
+ /// run-long counter lets payouts climb with the difficulty.
///
- public WaveGoldEntry GetWaveEntry(int encounterNumber)
+ public EncounterGoldEntry GetEncounterEntry(int encounterNumber)
{
- if (Waves == null) return null;
+ if (Encounters == null) return null;
int index = encounterNumber - 1;
- if (index < 0 || index >= Waves.Length) return null;
- return Waves[index];
+ if (index < 0 || index >= Encounters.Length) return null;
+ return Encounters[index];
+ }
+
+ /// Number of authored encounter entries.
+ public int EncounterCount => Encounters?.Length ?? 0;
+
+ ///
+ /// Editor tuning aid: cumulative projected earnings for one player from the run's first
+ /// encounter through inclusive, assuming
+ /// kills each time and no leaks.
+ ///
+ public int ProjectedCumulativeThrough(int encounterNumber)
+ {
+ if (Encounters == null) return StartingGold;
+
+ int total = StartingGold;
+ int last = Mathf.Min(encounterNumber, Encounters.Length);
+ for (int i = 0; i < last; i++)
+ {
+ if (Encounters[i] == null) continue;
+ total += Encounters[i].ProjectedTotal(PreviewEnemiesPerEncounter);
+ }
+ return total;
}
}
}
diff --git a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs
index 9943dc5..3706dfb 100644
--- a/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs
+++ b/Assets/_Project/Scripts/Gameplay/TowerPlacementManager.cs
@@ -388,6 +388,76 @@ namespace TD.Gameplay
spawner.Play(worldPos);
}
+ // ----- Phase teardown ---------------------------------------------
+
+ ///
+ /// Server-only: destroys every built tower on the map, refunding nothing. Called when a
+ /// phase ends so the next phase starts from bare ground.
+ ///
+ /// How many towers were destroyed.
+ ///
+ /// Deliberately not the sell path. Selling refunds gold, plays the coin VFX and is
+ /// owner-gated; none of that applies here. This is confiscation, not a transaction — the
+ /// maze players spent a whole phase building is the price of the boss going down.
+ ///
+ /// Cleanup rides on despawn.
+ /// already un-stamps the footprint, deregisters from the minimap and clears any local
+ /// selection pointing at it, so this method only has to despawn. Shelved
+ /// s self-clean the same way; queued and in-progress jobs are
+ /// cancelled through their own Builder, which restores their footprint tiles.
+ ///
+ /// Queued jobs DO refund. Those towers were never delivered, so eating the
+ /// gold would punish players for having a build queued when the boss happened to die. The
+ /// no-refund rule applies to towers that got built.
+ ///
+ /// Timing matters for performance. Every despawn fires a walkability change,
+ /// and a full maze is a lot of them. This runs with the field empty — the boss is dead and
+ /// the next wave hasn't spawned — so no enemy is registered with the re-path scheduler and
+ /// the recompute storm that would cause mid-wave never happens.
+ ///
+ public int ServerDestroyAllTowers()
+ {
+ if (!IsServer) return 0;
+
+ // Cancel build queues first. This despawns their non-shelved visuals and frees the
+ // footprint tiles they had reserved, so the sweep below only has to deal with what's
+ // left standing.
+ foreach (var pms in PlayerMatchState.AllPlayers)
+ {
+ var builder = Builder.GetForClient(pms.OwnerClientId);
+ builder?.ServerCancelAllJobs();
+ }
+
+ var spawnManager = NetworkManager.Singleton?.SpawnManager;
+ if (spawnManager == null) return 0;
+
+ // Snapshot before iterating — despawning mutates the live spawned-objects collection.
+ var snapshot = new System.Collections.Generic.List(
+ spawnManager.SpawnedObjectsList);
+
+ int destroyed = 0;
+ foreach (var no in snapshot)
+ {
+ if (no == null || !no.IsSpawned) continue;
+
+ if (no.GetComponent() != null)
+ {
+ no.Despawn(destroy: true);
+ destroyed++;
+ continue;
+ }
+
+ // Shelved build sites outlive their Builder's queue, so cancelling jobs above
+ // doesn't reach them. Left alone they'd sit on the map as ghosts of towers that
+ // no longer exist, still holding their footprint tiles occupied.
+ var visual = no.GetComponent();
+ if (visual != null && visual.IsShelved)
+ no.Despawn(destroy: true);
+ }
+
+ return destroyed;
+ }
+
// ----- Server-side commit hooks called by Builder ------------------
///
diff --git a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs
index f23c5fa..5eeb6e5 100644
--- a/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs
+++ b/Assets/_Project/Scripts/Gameplay/WaveDefinition.cs
@@ -87,6 +87,12 @@ namespace TD.Gameplay
}
/// Total enemies spawned per zone by this wave, across all entries.
+ ///
+ /// Also the divisor for the encounter's health budget — see
+ /// . That makes count a texture
+ /// knob rather than a difficulty one: a wave of 8 spawns eight tanks, a wave of 150 spawns
+ /// a fragile swarm, and both present the same total health for their slot in the run.
+ ///
public int TotalEnemyCount
{
get
diff --git a/Assets/_Project/Scripts/Gameplay/WaveManager.cs b/Assets/_Project/Scripts/Gameplay/WaveManager.cs
index b393f9f..a40ed28 100644
--- a/Assets/_Project/Scripts/Gameplay/WaveManager.cs
+++ b/Assets/_Project/Scripts/Gameplay/WaveManager.cs
@@ -83,6 +83,11 @@ namespace TD.Gameplay
"no kill/wave rewards (designer-error indicator, not a supported runtime mode).")]
[SerializeField] private GoldConfig goldConfig;
+ [Tooltip("How enemy health scales across the run. Required for a real match; if unset, " +
+ "every enemy spawns at a flat fallback health and difficulty never progresses " +
+ "(designer-error indicator, not a supported runtime mode).")]
+ [SerializeField] private EnemyScalingConfig enemyScalingConfig;
+
// ----- Networked state --------------------------------------------
// Per-slot total leak counters across the whole match. Index = (int)PlayerSlot;
@@ -372,9 +377,18 @@ namespace TD.Gameplay
break;
case RunAdvance.NextPhase:
+ {
+ // A phase boundary resets the board as well as the enemies: the maze players
+ // spent the phase building is torn down, unrefunded, so the new phase starts
+ // from bare ground. Runs here rather than inside RunState.ServerAdvance
+ // because it touches player structures, which the run has no business owning.
+ int destroyed = TowerPlacementManager.Instance?.ServerDestroyAllTowers() ?? 0;
+ NotifyTowersWipedClientRpc(destroyed);
+
Debug.Log($"[WaveManager] Boss down. New phase drawn: {run.ProgressLabel}. " +
- $"Enemy upgrades wiped.");
+ $"Enemy upgrades wiped; {destroyed} tower(s) destroyed.");
break;
+ }
case RunAdvance.NextCycle:
Debug.Log($"[WaveManager] Cycle complete — same waves return upgraded " +
@@ -492,6 +506,7 @@ namespace TD.Gameplay
// Must run AFTER the inter-wave step, since the vote that just closed may have added
// to a slot this very encounter re-runs on a later cycle.
ResolveCurrentWaveAbilities();
+ ResolveCurrentEncounterHealth(def);
// Spawn all enemies at once in a held (untargetable, immobile) state.
if (def.Entries != null)
@@ -668,6 +683,58 @@ namespace TD.Gameplay
$"{currentWaveAbilities.Count} wave buff(s).");
}
+ // ----- Encounter health resolution ---------------------------------
+
+ // Health one enemy of this encounter gets BEFORE its type's HpMultiplier is applied:
+ // the encounter's budget divided across the wave's bodies. Resolved once per encounter
+ // for the same reason the ability list is — it's fixed for the whole wave, and the
+ // divisor would otherwise be recomputed for every spawn.
+ private float currentEncounterHpShare = FallbackEnemyHp;
+
+ // Used only when no EnemyScalingConfig is assigned. Enemies stay killable so the match
+ // is still playable, but difficulty never progresses — see the field's tooltip.
+ private const float FallbackEnemyHp = 100f;
+
+ ///
+ /// Server-only: work out the per-enemy health share for the encounter about to spawn.
+ ///
+ ///
+ /// Splits the encounter's total budget across the wave's enemy count, so a swarm and an
+ /// elite wave in the same slot present the same threat. The type's
+ /// is applied later, per enemy, so a wave
+ /// mixing types skews each one independently off the shared share.
+ ///
+ private void ResolveCurrentEncounterHealth(WaveDefinition def)
+ {
+ if (enemyScalingConfig == null)
+ {
+ currentEncounterHpShare = FallbackEnemyHp;
+ Debug.LogWarning("[WaveManager] No EnemyScalingConfig assigned — enemies spawn at " +
+ $"a flat {FallbackEnemyHp} HP and difficulty will not progress.");
+ return;
+ }
+
+ var run = RunState.Instance;
+ int encounter = CurrentEncounterNumber;
+ bool isBoss = run?.IsBossStage ?? false;
+
+ int bodies = def != null ? def.TotalEnemyCount : 0;
+ if (bodies <= 0)
+ {
+ // An empty wave can't be divided into. Nothing will spawn from it either, so this
+ // only guards against a divide-by-zero on a misauthored asset.
+ currentEncounterHpShare = FallbackEnemyHp;
+ return;
+ }
+
+ currentEncounterHpShare =
+ enemyScalingConfig.ResolvePerEnemyHp(encounter, isBoss, bodies, archetypeMultiplier: 1f);
+
+ Debug.Log($"[WaveManager] Encounter {encounter}{(isBoss ? " (BOSS)" : "")}: " +
+ $"{enemyScalingConfig.GetEncounterHpBudget(encounter, isBoss):0} HP budget " +
+ $"across {bodies} enemies = {currentEncounterHpShare:0} each before type modifiers.");
+ }
+
// ----- Spawn helpers ----------------------------------------------
private void SpawnEnemyInAllZones(EnemyDefinition def, bool held = false)
@@ -742,7 +809,8 @@ namespace TD.Gameplay
// Resolve the stats this enemy will actually spawn with. Abilities get first say —
// flight, health and size all have to be settled before the position is computed and
// before EnemyHealth/EnemyMovement read them, since each is captured once.
- var context = contextOverride ?? EnemySpawnContext.FromDefinition(def);
+ var context = contextOverride
+ ?? EnemySpawnContext.FromDefinition(def, currentEncounterHpShare * def.HpMultiplier);
if (contextOverride == null && abilities != null)
{
for (int i = 0; i < abilities.Count; i++)
@@ -857,11 +925,11 @@ namespace TD.Gameplay
private void HandleEnemyKilled(EnemyHealth health)
{
- // Kill reward comes from GoldConfig for the current wave — same value for
- // every enemy in the wave regardless of EnemyDefinition type. Missing config
- // or out-of-range wave → 0 reward (gold flow disabled, designer-error mode).
+ // Kill reward comes from GoldConfig for the current encounter — same value for
+ // every enemy in it regardless of EnemyDefinition type. Missing config or an
+ // unauthored encounter → 0 reward (gold flow disabled, designer-error mode).
int killReward = 0;
- var goldEntry = goldConfig?.GetWaveEntry(CurrentEncounterNumber);
+ var goldEntry = goldConfig?.GetEncounterEntry(CurrentEncounterNumber);
if (goldEntry != null) killReward = goldEntry.GoldPerEnemy;
// Wave buffs get to alter the bounty before anything else sees it — this is what
@@ -983,8 +1051,24 @@ namespace TD.Gameplay
ShowGoldLossClientRpc(worldPos, amount);
}
+ // Announces the end-of-phase tower wipe on every peer. Sent rather than derived locally
+ // because the despawns arrive as individual NetworkObject removals with nothing tying them
+ // together — without this a client just watches its maze evaporate for no stated reason.
+ [ClientRpc]
+ private void NotifyTowersWipedClientRpc(int destroyedCount)
+ {
+ OnTowersWiped?.Invoke(destroyedCount);
+ }
+
// ----- Local-only notification events -----------------------------
+ ///
+ /// Fired on every peer when a phase ends and every built tower is destroyed. Argument is
+ /// how many towers went down. HUD subscribes to explain what just happened; audio and
+ /// camera-shake hooks can use it too.
+ ///
+ public static event System.Action OnTowersWiped;
+
///
/// Fired on every peer immediately after a life-loss popup spawns.
/// HUD subscribes to flash a centered banner; gameplay code can also
@@ -1045,10 +1129,10 @@ namespace TD.Gameplay
// Server-only. Iterates active players, awards CompletionBonus to each, plus
// NoLeaksBonus to those whose per-wave leak counter is zero. Floating-text popups
// are spawned at each player's builder position so the reward is visible in-world.
- // Skipped silently if no goldConfig or no entry for this wave.
+ // Skipped silently if no goldConfig or no entry for this encounter.
private void AwardWaveCompletionBonuses()
{
- var entry = goldConfig?.GetWaveEntry(CurrentEncounterNumber);
+ var entry = goldConfig?.GetEncounterEntry(CurrentEncounterNumber);
if (entry == null) return;
int completionBonus = entry.CompletionBonus;
diff --git a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs
index 5f0cd92..b31b585 100644
--- a/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs
+++ b/Assets/_Project/Scripts/Gameplay/Waves/RunState.cs
@@ -188,7 +188,7 @@ namespace TD.Gameplay.Waves
///
/// 1-based count of encounters since the run began, including bosses. This is the key
- /// GoldConfig is indexed by, so its per-wave entries scale monotonically across the
+ /// GoldConfig.Encounters is indexed by, so payouts scale monotonically across the
/// whole run rather than resetting every cycle.
///
public int GlobalEncounterNumber
diff --git a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs
index d870d94..9d1c129 100644
--- a/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs
+++ b/Assets/_Project/Scripts/Gameplay/Waves/WaveGroup.cs
@@ -19,7 +19,7 @@ namespace TD.Gameplay.Waves
/// A class rather than a struct specifically so can carry a
/// field initializer — Unity runs it when the inspector creates a fresh array element,
/// which is what gives new entries their equal-by-default weighting. Mirrors
- /// .
+ /// .
///
[Serializable]
public class WavePoolEntry
diff --git a/Assets/_Project/Scripts/UI/HUDController.cs b/Assets/_Project/Scripts/UI/HUDController.cs
index 29e2b0f..7b51380 100644
--- a/Assets/_Project/Scripts/UI/HUDController.cs
+++ b/Assets/_Project/Scripts/UI/HUDController.cs
@@ -77,6 +77,19 @@ namespace TD.UI
private Label nextWaveLabel; // prep countdown ("next: 0:12")
private Label leakedLabel; // local player's origin-leak count ("leaked: 3")
private Label incomeLabel; // top-bar per-wave gold-earned counter ("+150 g/wave")
+
+ // Top-bar row of buff badges for the wave currently spawning. Rebuilt only when the
+ // underlying set changes — see waveBuffSignature.
+ private VisualElement waveBuffRow;
+
+ // Cheap change-detector for the buff row. RefreshTopBar runs every frame, and rebuilding
+ // a handful of VisualElements at 60 Hz would churn the UI system for no reason. Encodes
+ // the slot plus the option ids on it, so it changes when the wave advances OR when a vote
+ // lands on the slot the players are about to face again.
+ private int waveBuffSignature = int.MinValue;
+
+ private readonly System.Collections.Generic.List waveBuffScratch
+ = new System.Collections.Generic.List();
private VisualElement playerListContainer; // right-panel scoreboard rows
private Label portraitName;
private Label levelLabel;
@@ -977,6 +990,7 @@ namespace TD.UI
nextWaveLabel = Require