From 16706a1ecfa12b28f93d057f1aef8535032e035f Mon Sep 17 00:00:00 2001 From: Matt F Date: Fri, 31 Jul 2026 00:32:33 -0700 Subject: [PATCH] Scale difficulty by run position; wipe towers at phase end Follow-up pass on the 2.0 refactor, closing the gap between "waves are drawn at random" and "difficulty still lives in the enemy assets". - Enemy health is no longer authored per enemy type. New EnemyScalingConfig scales a per-zone HP *budget* by encounter number; per-enemy health is that budget divided by the wave's enemy count. Scaling the total rather than the per-enemy value keeps enemy count a texture knob (few tanks vs many swarmers) instead of a second, uncontrolled difficulty axis. EnemyDefinition.MaxHp becomes HpMultiplier, a deviation around 1.0. Speed stays archetype-only and unscaled -- escalating it compounds with health and invalidates tower balance mid-run. - GoldConfig entries no longer reference a WaveDefinition. Payout is a property of run position, not of which wave got drawn: WaveGoldEntry -> EncounterGoldEntry, Waves -> Encounters, keyed by global encounter number. Its inspector labels elements "Encounter N" and projects cumulative earnings. - The wave's voted buffs now show as icon badges in the top bar, read from the same RunState slot the spawn path uses so the display can't drift from what the enemies actually carry. Hover names the buff; unillustrated cards fall back to a lettered badge rather than vanishing. - Clearing a phase's boss destroys every built tower, unrefunded. Queued build jobs still refund -- those towers were never delivered. Runs with the field empty, so the walkability churn doesn't hit the re-path scheduler. - Fixed an RPC codegen break: [ClientRpc] requires a ClientRpc suffix, unlike the newer [Rpc(SendTo...)] style this file doesn't use. - Setup checklist reordered into dependency order; it previously asked for a RunDefinition two sections before creating one. Also carries the editor-side asset reorganisation into Definitions/RunDefinitions and the sprite move into Enemy/Player draft icon folders. Co-Authored-By: Claude Opus 5 --- .../_Project/Art/Sprites/EnemyDraftIcons.meta | 8 + .../Art/Sprites/EnemyDraftIcons/BlinkIcon.png | 3 + .../EnemyDraftIcons/BlinkIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/DoubleUpIcon.png | 3 + .../EnemyDraftIcons/DoubleUpIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/FlightIcon.png | 3 + .../EnemyDraftIcons/FlightIcon.png.meta | 117 ++++++++++ .../Sprites/EnemyDraftIcons/NoBountyIcon.png | 3 + .../EnemyDraftIcons/NoBountyIcon.png.meta | 117 ++++++++++ .../Art/Sprites/EnemyDraftIcons/SplitIcon.png | 3 + .../EnemyDraftIcons/SplitIcon.png.meta | 117 ++++++++++ .../Art/Sprites/EnemyDraftIcons/ThiefIcon.png | 3 + .../EnemyDraftIcons/ThiefIcon.png.meta | 117 ++++++++++ .../Art/Sprites/PlayerDraftIcons.meta | 8 + .../{ => PlayerDraftIcons}/Spells.meta | 0 .../Spells/FireballSpell.png | 0 .../Spells/FireballSpell.png.meta | 0 .../Spells/SlowSpell.png | 0 .../Spells/SlowSpell.png.meta | 0 .../{ => PlayerDraftIcons}/Towers.meta | 0 .../PlayerDraftIcons/Towers/ArrowTower.meta | 8 + .../Towers/ArrowTower/ArrowTowerUpgrade_1.png | 3 + .../ArrowTower/ArrowTowerUpgrade_1.png.meta | 117 ++++++++++ .../Towers/ArrowTower}/arrow.png | 0 .../Towers/ArrowTower}/arrow.png.meta | 0 .../{ => PlayerDraftIcons}/Towers/siege.png | 0 .../Towers/siege.png.meta | 0 Assets/_Project/Art/Sprites/RaceIcons.meta | 8 + .../Sprites/{ => RaceIcons}/BloodAngels.jpg | 0 .../{ => RaceIcons}/BloodAngels.jpg.meta | 0 .../Sprites/{ => RaceIcons}/Ultramarines.jpg | 0 .../{ => RaceIcons}/Ultramarines.jpg.meta | 0 ...01_Enemy_CrystalGolemBlue_Definition.asset | 4 +- .../02_Enemy_CyclopsGrey_Definition.asset | 2 +- .../03_Enemy_EntGreen_Definition.asset | 4 +- ..._Enemy_CrystalGolemYellow_Definition.asset | 4 +- .../05_Enemy_CyclopsGreen_Definition.asset | 4 +- .../06_Enemy_EntBlack_Definition.asset | 4 +- .../07_Enemy_CrystalGolemRed_Definition.asset | 4 +- .../08_Enemy_CyclopsRed_Definition.asset | 4 +- .../09_Enemy_EntOrange_Definition.asset | 4 +- .../10_Enemy_UndeadDrakeBone_Definition.asset | 6 +- .../_Project/Definitions/RunDefinitions.meta | 8 + .../{ => RunDefinitions}/Draft.meta | 0 .../RunDefinitions/Draft/EnemyDraft.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Blink.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Blink.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_DoubleUp.asset | 19 ++ .../EnemyUpgrade_DoubleUp.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_Flight.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Flight.asset.meta | 8 + .../EnemyDraft/EnemyUpgrade_NoBounty.asset | 18 ++ .../EnemyUpgrade_NoBounty.asset.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Split.asset | 19 ++ .../EnemyDraft/EnemyUpgrade_Split.asset.meta | 8 + .../Draft/EnemyDraft/EnemyUpgrade_Theft.asset | 18 ++ .../EnemyDraft/EnemyUpgrade_Theft.asset.meta | 8 + .../RunDefinitions/Draft/PlayerDraft.meta | 8 + .../Draft_BuilderEffect_GoldPerKill.asset | 0 ...Draft_BuilderEffect_GoldPerKill.asset.meta | 0 .../Draft_BuilderSpellOption_Fireball.asset | 0 ...aft_BuilderSpellOption_Fireball.asset.meta | 0 .../Draft_BuilderSpellOption_SlowArea.asset | 0 ...aft_BuilderSpellOption_SlowArea.asset.meta | 0 ...t_BuilderSpellOption_SlowAreaUpgrade.asset | 0 ...lderSpellOption_SlowAreaUpgrade.asset.meta | 0 .../Draft_NewTower_SiegeCannon.asset | 0 .../Draft_NewTower_SiegeCannon.asset.meta | 0 .../Draft_NewTower_TeslaCoil.asset | 0 .../Draft_NewTower_TeslaCoil.asset.meta | 0 .../PlayerDraft}/Draft_NewTower_Wall.asset | 0 .../Draft_NewTower_Wall.asset.meta | 0 .../Draft_TowerUpgrade_Arrow_1.asset | 21 ++ .../Draft_TowerUpgrade_Arrow_1.asset.meta | 8 + .../{ => RunDefinitions}/EnemyAbilities.meta | 0 .../EnemyAbilities/BlinkAbility.asset | 19 ++ .../EnemyAbilities/BlinkAbility.asset.meta | 8 + .../EnemyAbilities/FlightAbility.asset | 18 ++ .../EnemyAbilities/FlightAbility.asset.meta | 8 + .../EnemyAbilities/GoldTheftAbility.asset | 17 ++ .../GoldTheftAbility.asset.meta | 8 + .../EnemyAbilities/NoBountyAbility.asset | 17 ++ .../EnemyAbilities/NoBountyAbility.asset.meta | 8 + .../EnemyAbilities/SplitOnDeathAbility.asset | 0 .../SplitOnDeathAbility.asset.meta | 0 .../RunDefinitions/EnemyScalingConfig.asset | 17 ++ .../EnemyScalingConfig.asset.meta | 8 + .../{ => RunDefinitions}/GoldConfig.asset | 0 .../GoldConfig.asset.meta | 0 .../RunDefinitions/RunStructure.meta | 8 + .../EnemyUpgradeGroup_Phase1_Basics.asset | 28 +++ ...EnemyUpgradeGroup_Phase1_Basics.asset.meta | 8 + .../RunDefinitions/RunStructure/Phase1.asset | 21 ++ .../RunStructure/Phase1.asset.meta | 8 + .../RunStructure/Test_Run_Definition.asset | 18 ++ .../Test_Run_Definition.asset.meta | 8 + .../WaveGroup_Phase1_Bosses.asset | 18 ++ .../WaveGroup_Phase1_Bosses.asset.meta | 8 + .../WaveGroup_Phase1_Normal.asset | 34 +++ .../WaveGroup_Phase1_Normal.asset.meta | 8 + .../{ => RunDefinitions}/Waves.meta | 0 .../Waves/Wave10Definition.asset | 4 +- .../Waves/Wave10Definition.asset.meta | 0 .../Waves/Wave1Definition.asset | 0 .../Waves/Wave1Definition.asset.meta | 0 .../Waves/Wave2Definition.asset | 0 .../Waves/Wave2Definition.asset.meta | 0 .../Waves/Wave3Definition.asset | 0 .../Waves/Wave3Definition.asset.meta | 0 .../Waves/Wave4Definition.asset | 0 .../Waves/Wave4Definition.asset.meta | 0 .../Waves/Wave5Definition.asset | 0 .../Waves/Wave5Definition.asset.meta | 0 .../Waves/Wave6Definition.asset | 0 .../Waves/Wave6Definition.asset.meta | 0 .../Waves/Wave7Definition.asset | 0 .../Waves/Wave7Definition.asset.meta | 0 .../Waves/Wave8Definition.asset | 0 .../Waves/Wave8Definition.asset.meta | 0 .../Waves/Wave9Definition.asset | 0 .../Waves/Wave9Definition.asset.meta | 0 .../Definitions/Towers/BasicArrowTower.asset | 8 +- .../Towers/BasicArrowTower_Upgrade_1.asset | 41 ++++ .../BasicArrowTower_Upgrade_1.asset.meta | 8 + .../Enemies/Enemy_CrystalGolem_Red.prefab | 16 +- .../Enemies/Enemy_CrystalGolem_Yellow.prefab | 14 ++ .../Enemies/Enemy_Cyclops_Green.prefab | 18 +- .../Prefabs/Enemies/Enemy_Cyclops_Grey.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Cyclops_Red.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Black.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Green.prefab | 14 ++ .../Prefabs/Enemies/Enemy_Ent_Orange.prefab | 14 ++ .../Enemies/Enemy_UndeadDrake_Bone.prefab | 14 ++ Assets/_Project/Prefabs/Player/Player.prefab | 44 +++- Assets/_Project/Scenes/Levels/9Player.unity | 221 +++++++++++++++++- .../Gameplay/EncounterGoldEntryDrawer.cs | 122 ++++++++++ .../Gameplay/EncounterGoldEntryDrawer.cs.meta | 2 + .../Editor/Gameplay/WaveGoldEntryDrawer.cs | 112 --------- .../Gameplay/WaveGoldEntryDrawer.cs.meta | 2 - .../EnemyAbilities/EnemySpawnContext.cs | 30 ++- .../Scripts/Gameplay/EnemyDefinition.cs | 19 +- .../_Project/Scripts/Gameplay/EnemyHealth.cs | 6 +- .../Scripts/Gameplay/EnemyScalingConfig.cs | 85 +++++++ .../Gameplay/EnemyScalingConfig.cs.meta | 2 + .../_Project/Scripts/Gameplay/GoldConfig.cs | 149 ++++++------ .../Scripts/Gameplay/TowerPlacementManager.cs | 70 ++++++ .../Scripts/Gameplay/WaveDefinition.cs | 6 + .../_Project/Scripts/Gameplay/WaveManager.cs | 100 +++++++- .../Scripts/Gameplay/Waves/RunState.cs | 2 +- .../Scripts/Gameplay/Waves/WaveGroup.cs | 2 +- Assets/_Project/Scripts/UI/HUDController.cs | 117 +++++++++- Assets/_Project/UI/HUD.uss | 28 +++ Assets/_Project/UI/HUD.uxml | 4 + Docs/2.0_Setup_Checklist.md | 161 ++++++++++--- 154 files changed, 2608 insertions(+), 287 deletions(-) create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/BlinkIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/DoubleUpIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/FlightIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/NoBountyIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/SplitIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png create mode 100644 Assets/_Project/Art/Sprites/EnemyDraftIcons/ThiefIcon.png.meta create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons.meta rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/FireballSpell.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/FireballSpell.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/SlowSpell.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Spells/SlowSpell.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers.meta (100%) create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower.meta create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png create mode 100644 Assets/_Project/Art/Sprites/PlayerDraftIcons/Towers/ArrowTower/ArrowTowerUpgrade_1.png.meta rename Assets/_Project/Art/Sprites/{Towers => PlayerDraftIcons/Towers/ArrowTower}/arrow.png (100%) rename Assets/_Project/Art/Sprites/{Towers => PlayerDraftIcons/Towers/ArrowTower}/arrow.png.meta (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers/siege.png (100%) rename Assets/_Project/Art/Sprites/{ => PlayerDraftIcons}/Towers/siege.png.meta (100%) create mode 100644 Assets/_Project/Art/Sprites/RaceIcons.meta rename Assets/_Project/Art/Sprites/{ => RaceIcons}/BloodAngels.jpg (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/BloodAngels.jpg.meta (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/Ultramarines.jpg (100%) rename Assets/_Project/Art/Sprites/{ => RaceIcons}/Ultramarines.jpg.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/Draft.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Blink.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_DoubleUp.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Flight.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_NoBounty.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Split.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/EnemyDraft/EnemyUpgrade_Theft.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft.meta rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderEffect_GoldPerKill.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderEffect_GoldPerKill.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_Fireball.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_Fireball.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowArea.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowArea.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowAreaUpgrade.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_BuilderSpellOption_SlowAreaUpgrade.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_SiegeCannon.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_SiegeCannon.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_TeslaCoil.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_TeslaCoil.asset.meta (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_Wall.asset (100%) rename Assets/_Project/Definitions/{Draft => RunDefinitions/Draft/PlayerDraft}/Draft_NewTower_Wall.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/Draft/PlayerDraft/Draft_TowerUpgrade_Arrow_1.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/BlinkAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/FlightAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/GoldTheftAbility.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyAbilities/NoBountyAbility.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities/SplitOnDeathAbility.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/EnemyAbilities/SplitOnDeathAbility.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/EnemyScalingConfig.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/GoldConfig.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/GoldConfig.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/EnemyUpgradeGroup_Phase1_Basics.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Phase1.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/Test_Run_Definition.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Bosses.asset.meta create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset create mode 100644 Assets/_Project/Definitions/RunDefinitions/RunStructure/WaveGroup_Phase1_Normal.asset.meta rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave10Definition.asset (93%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave10Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave1Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave1Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave2Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave2Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave3Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave3Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave4Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave4Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave5Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave5Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave6Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave6Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave7Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave7Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave8Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave8Definition.asset.meta (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave9Definition.asset (100%) rename Assets/_Project/Definitions/{ => RunDefinitions}/Waves/Wave9Definition.asset.meta (100%) create mode 100644 Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset create mode 100644 Assets/_Project/Definitions/Towers/BasicArrowTower_Upgrade_1.asset.meta create mode 100644 Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs create mode 100644 Assets/_Project/Scripts/Editor/Gameplay/EncounterGoldEntryDrawer.cs.meta delete mode 100644 Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs delete mode 100644 Assets/_Project/Scripts/Editor/Gameplay/WaveGoldEntryDrawer.cs.meta create mode 100644 Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs create mode 100644 Assets/_Project/Scripts/Gameplay/EnemyScalingConfig.cs.meta 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