diff --git a/assets/Data/GameSettings.json b/assets/Data/GameSettings.json index 8bcbadd..b4007dd 100644 --- a/assets/Data/GameSettings.json +++ b/assets/Data/GameSettings.json @@ -61,343 +61,409 @@ "maxRegenerationUpgrades": 5 }, "metaUpgrades": { - "healthPointsPerLevel": 0, - "bonusDamagePerLevel": 0, - "projectilePiercingPerLevel": 0, - "movementSpeedPerLevel": 0, - "xpBonusPerLevel": 0, - "goldBonusPerLevel": 0 + "health": { + "costs": [ + 5, + 10, + 15 + ], + "bonuses": [ + 10, + 20, + 30 + ] + }, + "overallDamage": { + "costs": [ + 6, + 10, + 15 + ], + "bonuses": [ + 1, + 2, + 3 + ] + }, + "projectilePiercing": { + "costs": [ + 7, + 10, + 15 + ], + "bonuses": [ + 1, + 2, + 3 + ] + }, + "movementSpeed": { + "costs": [ + 8, + 10, + 15 + ], + "bonuses": [ + 10, + 20, + 30 + ] + }, + "xpGatherer": { + "costs": [ + 9, + 10, + 15 + ], + "bonuses": [ + 0.1, + 0.2, + 0.3 + ] + }, + "goldGatherer": { + "costs": [ + 10, + 10, + 15 + ], + "bonuses": [ + 0.1, + 0.2, + 0.3 + ] + } }, "enemyManager": { - "enemies": [ - { - "id": "BasicEnemy", - "moveType": "Follow", - "health": 2, - "damage": 1, - "speed": 60, - "lifetime": -1, - "xpReward": 0, - "goldReward": 0 - }, - { - "id": "StandardEnemy", - "moveType": "Follow", - "health": 3, - "damage": 2, - "speed": 65, - "lifetime": -1, - "xpReward": 0, - "goldReward": 0.1 - }, - { - "id": "FastEnemy", - "moveType": "Follow", - "health": 3, - "damage": 2, - "speed": 75, - "lifetime": -1, - "xpReward": 0, - "goldReward": 0.1 - }, - { - "id": "CircleEnemy", - "moveType": "Follow", - "health": 4, - "damage": 1, - "speed": 25, - "lifetime": 29, - "xpReward": 0, - "goldReward": 1 - }, - { - "id": "CircleEnemyStandard", - "moveType": "Follow", - "health": 7, - "damage": 2, - "speed": 35, - "lifetime": 27, - "xpReward": 0, - "goldReward": 2 - }, - { - "id": "WaveEnemy", - "moveType": "Launch", - "health": 1, - "damage": 2, - "speed": 390, - "lifetime": 20, - "xpReward": 0, - "goldReward": 0.2 - }, - { - "id": "WaveEnemyArmor", - "moveType": "Launch", - "health": 5, - "damage": 3, - "speed": 70, - "lifetime": 30, - "xpReward": 0, - "goldReward": 1 - }, - { - "id": "WaveEnemyArmorFast", - "moveType": "Launch", - "health": 5, - "damage": 3, - "speed": 320, - "lifetime": 30, - "xpReward": 0, - "goldReward": 1 - }, - { - "id": "BasicBoss", - "moveType": "Follow", - "health": 8, - "damage": 2, - "speed": 65, - "lifetime": -1, - "xpReward": 0, - "goldReward": 3 - }, - { - "id": "StandardBoss", - "moveType": "Follow", - "health": 12, - "damage": 3, - "speed": 75, - "lifetime": -1, - "xpReward": 2, - "goldReward": 5 - }, - { - "id": "BasicCheetah", - "moveType": "PeriodicFollow", - "health": 4, - "damage": 1, - "speed": 120, - "lifetime": -1, - "xpReward": 0, - "goldReward": 1 - } - ], - "individualEnemySpawners": [ - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 0, - "stopDelay": 59, - "cooldown": 1 - } - }, - { - "common": { - "enemyId": "BasicBoss", - "startDelay": 89, - "stopDelay": 90, - "cooldown": 0.9 - } - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 61, - "stopDelay": 120, - "cooldown": 0.9 - } - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 121, - "stopDelay": 190, - "cooldown": 0.8 - } - }, - { - "common": { - "enemyId": "StandardBoss", - "startDelay": 199, - "stopDelay": 200, - "cooldown": 0.9 - } - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 191, - "stopDelay": 220, - "cooldown": 1.5 - } - }, - { - "common": { - "enemyId": "StandardEnemy", - "startDelay": 210, - "stopDelay": 250, - "cooldown": 0.9 - } - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 290, - "stopDelay": 320, - "cooldown": 1 - } - }, - { - "common": { - "enemyId": "StandardEnemy", - "startDelay": 335, - "stopDelay": 420, - "cooldown": 0.7 - } - }, - { - "common": { - "enemyId": "StandardEnemy", - "startDelay": 421, - "stopDelay": 520, - "cooldown": 0.5 - } - }, - { - "common": { - "enemyId": "StandardEnemy", - "startDelay": 520, - "stopDelay": 600, - "cooldown": 0.3 - } - }, - { - "common": { - "enemyId": "FastEnemy", - "startDelay": 310, - "stopDelay": 340, - "cooldown": 0.5 - } - }, - { - "common": { - "enemyId": "FastEnemy", - "startDelay": 260, - "stopDelay": 300, - "cooldown": 0.8 - } - } - ], - "circularEnemySpawners": [ - { - "common": { - "enemyId": "CircleEnemy", - "startDelay": 1, - "stopDelay": 130, - "cooldown": 45 - }, - "enemiesToSpawn": 38 - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 0, - "stopDelay": 122, - "cooldown": 60 - }, - "enemiesToSpawn": 10 - }, - { - "common": { - "enemyId": "CircleEnemyStandard", - "startDelay": 280, - "stopDelay": 520, - "cooldown": 50 - }, - "enemiesToSpawn": 44 - }, - { - "common": { - "enemyId": "CircleEnemyStandard", - "startDelay": 383, - "stopDelay": 390, - "cooldown": 3 - }, - "enemiesToSpawn": 44 - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 245, - "stopDelay": 280, - "cooldown": 5 - }, - "enemiesToSpawn": 12 - }, - { - "common": { - "enemyId": "BasicEnemy", - "startDelay": 278, - "stopDelay": 291, - "cooldown": 3 - }, - "enemiesToSpawn": 30 - }, - { - "common": { - "enemyId": "BasicBoss", - "startDelay": 300, - "stopDelay": 303, - "cooldown": 2 - }, - "enemiesToSpawn": 8 - }, - { - "common": { - "enemyId": "BasicCheetah", - "startDelay": 139, - "stopDelay": 140, - "cooldown": 0.9 - }, - "enemiesToSpawn": 6 - } - ], - "waveEnemySpawners": [ - { - "common": { - "enemyId": "WaveEnemy", - "startDelay": 1, - "stopDelay": 201, - "cooldown": 25 - }, - "enemiesToSpawn": 12 - }, - { - "common": { - "enemyId": "WaveEnemy", - "startDelay": 420, - "stopDelay": 600, - "cooldown": 35 - }, - "enemiesToSpawn": 30 - }, - { - "common": { - "enemyId": "WaveEnemyArmor", - "startDelay": 1, - "stopDelay": 199, - "cooldown": 50 - }, - "enemiesToSpawn": 10 - }, - { - "common": { - "enemyId": "WaveEnemyArmorFast", - "startDelay": 200, - "stopDelay": 600, - "cooldown": 27 - }, - "enemiesToSpawn": 14 - } - ] + "enemies": [ + { + "id": "BasicEnemy", + "moveType": "Follow", + "health": 2, + "damage": 1, + "speed": 60, + "lifetime": -1, + "xpReward": 0, + "goldReward": 0 + }, + { + "id": "StandardEnemy", + "moveType": "Follow", + "health": 3, + "damage": 2, + "speed": 65, + "lifetime": -1, + "xpReward": 0, + "goldReward": 0.1 + }, + { + "id": "FastEnemy", + "moveType": "Follow", + "health": 3, + "damage": 2, + "speed": 75, + "lifetime": -1, + "xpReward": 0, + "goldReward": 0.1 + }, + { + "id": "CircleEnemy", + "moveType": "Follow", + "health": 4, + "damage": 1, + "speed": 25, + "lifetime": 29, + "xpReward": 0, + "goldReward": 1 + }, + { + "id": "CircleEnemyStandard", + "moveType": "Follow", + "health": 7, + "damage": 2, + "speed": 35, + "lifetime": 27, + "xpReward": 0, + "goldReward": 2 + }, + { + "id": "WaveEnemy", + "moveType": "Launch", + "health": 1, + "damage": 2, + "speed": 390, + "lifetime": 20, + "xpReward": 0, + "goldReward": 0.2 + }, + { + "id": "WaveEnemyArmor", + "moveType": "Launch", + "health": 5, + "damage": 3, + "speed": 70, + "lifetime": 30, + "xpReward": 0, + "goldReward": 1 + }, + { + "id": "WaveEnemyArmorFast", + "moveType": "Launch", + "health": 5, + "damage": 3, + "speed": 320, + "lifetime": 30, + "xpReward": 0, + "goldReward": 1 + }, + { + "id": "BasicBoss", + "moveType": "Follow", + "health": 8, + "damage": 2, + "speed": 65, + "lifetime": -1, + "xpReward": 0, + "goldReward": 3 + }, + { + "id": "StandardBoss", + "moveType": "Follow", + "health": 12, + "damage": 3, + "speed": 75, + "lifetime": -1, + "xpReward": 2, + "goldReward": 5 + }, + { + "id": "BasicCheetah", + "moveType": "PeriodicFollow", + "health": 4, + "damage": 1, + "speed": 120, + "lifetime": -1, + "xpReward": 0, + "goldReward": 1 + } + ], + "individualEnemySpawners": [ + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 0, + "stopDelay": 59, + "cooldown": 1 + } + }, + { + "common": { + "enemyId": "BasicBoss", + "startDelay": 89, + "stopDelay": 90, + "cooldown": 0.9 + } + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 61, + "stopDelay": 120, + "cooldown": 0.9 + } + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 121, + "stopDelay": 190, + "cooldown": 0.8 + } + }, + { + "common": { + "enemyId": "StandardBoss", + "startDelay": 199, + "stopDelay": 200, + "cooldown": 0.9 + } + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 191, + "stopDelay": 220, + "cooldown": 1.5 + } + }, + { + "common": { + "enemyId": "StandardEnemy", + "startDelay": 210, + "stopDelay": 250, + "cooldown": 0.9 + } + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 290, + "stopDelay": 320, + "cooldown": 1 + } + }, + { + "common": { + "enemyId": "StandardEnemy", + "startDelay": 335, + "stopDelay": 420, + "cooldown": 0.7 + } + }, + { + "common": { + "enemyId": "StandardEnemy", + "startDelay": 421, + "stopDelay": 520, + "cooldown": 0.5 + } + }, + { + "common": { + "enemyId": "StandardEnemy", + "startDelay": 520, + "stopDelay": 600, + "cooldown": 0.3 + } + }, + { + "common": { + "enemyId": "FastEnemy", + "startDelay": 310, + "stopDelay": 340, + "cooldown": 0.5 + } + }, + { + "common": { + "enemyId": "FastEnemy", + "startDelay": 260, + "stopDelay": 300, + "cooldown": 0.8 + } + } + ], + "circularEnemySpawners": [ + { + "common": { + "enemyId": "CircleEnemy", + "startDelay": 1, + "stopDelay": 130, + "cooldown": 45 + }, + "enemiesToSpawn": 38 + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 0, + "stopDelay": 122, + "cooldown": 60 + }, + "enemiesToSpawn": 10 + }, + { + "common": { + "enemyId": "CircleEnemyStandard", + "startDelay": 280, + "stopDelay": 520, + "cooldown": 50 + }, + "enemiesToSpawn": 44 + }, + { + "common": { + "enemyId": "CircleEnemyStandard", + "startDelay": 383, + "stopDelay": 390, + "cooldown": 3 + }, + "enemiesToSpawn": 44 + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 245, + "stopDelay": 280, + "cooldown": 5 + }, + "enemiesToSpawn": 12 + }, + { + "common": { + "enemyId": "BasicEnemy", + "startDelay": 278, + "stopDelay": 291, + "cooldown": 3 + }, + "enemiesToSpawn": 30 + }, + { + "common": { + "enemyId": "BasicBoss", + "startDelay": 300, + "stopDelay": 303, + "cooldown": 2 + }, + "enemiesToSpawn": 8 + }, + { + "common": { + "enemyId": "BasicCheetah", + "startDelay": 139, + "stopDelay": 140, + "cooldown": 0.9 + }, + "enemiesToSpawn": 6 + } + ], + "waveEnemySpawners": [ + { + "common": { + "enemyId": "WaveEnemy", + "startDelay": 1, + "stopDelay": 201, + "cooldown": 25 + }, + "enemiesToSpawn": 12 + }, + { + "common": { + "enemyId": "WaveEnemy", + "startDelay": 420, + "stopDelay": 600, + "cooldown": 35 + }, + "enemiesToSpawn": 30 + }, + { + "common": { + "enemyId": "WaveEnemyArmor", + "startDelay": 1, + "stopDelay": 199, + "cooldown": 50 + }, + "enemiesToSpawn": 10 + }, + { + "common": { + "enemyId": "WaveEnemyArmorFast", + "startDelay": 200, + "stopDelay": 600, + "cooldown": 27 + }, + "enemiesToSpawn": 14 + } + ] } } \ No newline at end of file diff --git a/assets/Data/eng.json b/assets/Data/eng.json index c9e1ee6..32eab75 100644 --- a/assets/Data/eng.json +++ b/assets/Data/eng.json @@ -10,5 +10,17 @@ "HALO_PROJECTILE_TITLE": "Halo Projectile", "HALO_PROJECTILE_DESC": "", "REGENERATION_TITLE": "Regeneration", - "REGENERATION_DESC": "" + "REGENERATION_DESC": "", + "META_HEALTH_TITLE": "HEALTH", + "META_HEALTH_DESC": "Increases max health by {0}", + "META_OVERALL_DAMAGE_TITLE": "OVERALL DAMAGE", + "META_OVERALL_DAMAGE_DESC": "Increases overall damage by {0}", + "META_PROJECTILE_PIERCING_TITLE": "", + "META_PROJECTILE_PIERCING_DESC": "", + "META_MOVEMENT_SPEED_TITLE": "", + "META_MOVEMENT_SPEED_DESC": "", + "META_XP_GATHERER_TITLE": "", + "META_XP_GATHERER_DESC": "", + "META_GOLD_GATHERER_TITLE": "", + "META_GOLD_GATHERER_DESC": "" } \ No newline at end of file diff --git a/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradeButton.prefab b/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradeButton.prefab index d0e47fe..6846ebc 100644 --- a/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradeButton.prefab +++ b/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradeButton.prefab @@ -270,8 +270,8 @@ }, "_contentSize": { "__type__": "cc.Size", - "width": 56.43, - "height": 20 + "width": 120, + "height": 50 }, "_anchorPoint": { "__type__": "cc.Vec2", @@ -300,19 +300,19 @@ "_dstBlendFactor": 4, "_color": { "__type__": "cc.Color", - "r": 255, - "g": 255, - "b": 255, + "r": 0, + "g": 0, + "b": 0, "a": 255 }, "_string": "label", "_horizontalAlign": 1, "_verticalAlign": 1, - "_actualFontSize": 20, - "_fontSize": 20, + "_actualFontSize": 15, + "_fontSize": 15, "_fontFamily": "Arial", - "_lineHeight": 20, - "_overflow": 0, + "_lineHeight": 15, + "_overflow": 1, "_enableWrapText": true, "_font": { "__uuid__": "c96b42a9-d20d-4c59-8e99-8ed749a715c8", diff --git a/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradesModalWindow.prefab b/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradesModalWindow.prefab index 156c147..b9052e6 100644 --- a/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradesModalWindow.prefab +++ b/assets/Media/Prefabs/ModalWindows/Upgrades/UpgradesModalWindow.prefab @@ -25,17 +25,17 @@ "_active": true, "_components": [ { - "__id__": 42 + "__id__": 48 }, { - "__id__": 44 + "__id__": 50 }, { - "__id__": 46 + "__id__": 52 } ], "_prefab": { - "__id__": 48 + "__id__": 54 }, "_lpos": { "__type__": "cc.Vec3", @@ -84,14 +84,14 @@ "_active": true, "_components": [ { - "__id__": 37 + "__id__": 43 }, { - "__id__": 39 + "__id__": 45 } ], "_prefab": { - "__id__": 41 + "__id__": 47 }, "_lpos": { "__type__": "cc.Vec3", @@ -289,11 +289,11 @@ "_active": true, "_components": [ { - "__id__": 34 + "__id__": 40 } ], "_prefab": { - "__id__": 36 + "__id__": 42 }, "_lpos": { "__type__": "cc.Vec3", @@ -482,22 +482,25 @@ "_children": [ { "__id__": 21 + }, + { + "__id__": 27 } ], "_active": true, "_components": [ { - "__id__": 27 + "__id__": 33 }, { - "__id__": 29 + "__id__": 35 }, { - "__id__": 31 + "__id__": 37 } ], "_prefab": { - "__id__": 33 + "__id__": 39 }, "_lpos": { "__type__": "cc.Vec3", @@ -529,7 +532,7 @@ }, { "__type__": "cc.Node", - "_name": "UpgradesParent", + "_name": "CoinsLabel", "_objFlags": 0, "_parent": { "__id__": 20 @@ -550,7 +553,7 @@ "_lpos": { "__type__": "cc.Vec3", "x": 0, - "y": 0, + "y": 224.95, "z": 0 }, "_lrot": { @@ -586,6 +589,138 @@ "__prefab": { "__id__": 23 }, + "_contentSize": { + "__type__": "cc.Size", + "width": 30, + "height": 40 + }, + "_anchorPoint": { + "__type__": "cc.Vec2", + "x": 0.5, + "y": 0.5 + }, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "0bWTFM0iJOd7lx2YvOQbs5" + }, + { + "__type__": "cc.Label", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 21 + }, + "_enabled": true, + "__prefab": { + "__id__": 25 + }, + "_customMaterial": null, + "_srcBlendFactor": 2, + "_dstBlendFactor": 4, + "_color": { + "__type__": "cc.Color", + "r": 255, + "g": 179, + "b": 82, + "a": 255 + }, + "_string": "13", + "_horizontalAlign": 1, + "_verticalAlign": 1, + "_actualFontSize": 40, + "_fontSize": 40, + "_fontFamily": "Arial", + "_lineHeight": 40, + "_overflow": 0, + "_enableWrapText": true, + "_font": { + "__uuid__": "c96b42a9-d20d-4c59-8e99-8ed749a715c8", + "__expectedType__": "cc.BitmapFont" + }, + "_isSystemFontUsed": false, + "_spacingX": 0, + "_isItalic": false, + "_isBold": false, + "_isUnderline": false, + "_underlineHeight": 2, + "_cacheMode": 0, + "_id": "" + }, + { + "__type__": "cc.CompPrefabInfo", + "fileId": "1cr4//m/9C8pCUMzr5q/G8" + }, + { + "__type__": "cc.PrefabInfo", + "root": { + "__id__": 1 + }, + "asset": { + "__id__": 0 + }, + "fileId": "1dzqEDPs9PGrSJaf6rz4yO" + }, + { + "__type__": "cc.Node", + "_name": "UpgradesParent", + "_objFlags": 0, + "_parent": { + "__id__": 20 + }, + "_children": [], + "_active": true, + "_components": [ + { + "__id__": 28 + }, + { + "__id__": 30 + } + ], + "_prefab": { + "__id__": 32 + }, + "_lpos": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_lrot": { + "__type__": "cc.Quat", + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "_lscale": { + "__type__": "cc.Vec3", + "x": 1, + "y": 1, + "z": 1 + }, + "_layer": 33554432, + "_euler": { + "__type__": "cc.Vec3", + "x": 0, + "y": 0, + "z": 0 + }, + "_id": "" + }, + { + "__type__": "cc.UITransform", + "_name": "", + "_objFlags": 0, + "node": { + "__id__": 27 + }, + "_enabled": true, + "__prefab": { + "__id__": 29 + }, "_contentSize": { "__type__": "cc.Size", "width": 430, @@ -607,11 +742,11 @@ "_name": "", "_objFlags": 0, "node": { - "__id__": 21 + "__id__": 27 }, "_enabled": true, "__prefab": { - "__id__": 25 + "__id__": 31 }, "_resizeMode": 1, "_layoutType": 3, @@ -658,7 +793,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 28 + "__id__": 34 }, "_contentSize": { "__type__": "cc.Size", @@ -685,7 +820,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 30 + "__id__": 36 }, "_customMaterial": null, "_srcBlendFactor": 2, @@ -729,7 +864,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 32 + "__id__": 38 }, "_id": "" }, @@ -756,7 +891,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 35 + "__id__": 41 }, "_contentSize": { "__type__": "cc.Size", @@ -793,7 +928,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 38 + "__id__": 44 }, "_contentSize": { "__type__": "cc.Size", @@ -820,7 +955,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 40 + "__id__": 46 }, "playOnLoad": false, "_clips": [ @@ -862,7 +997,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 43 + "__id__": 49 }, "_contentSize": { "__type__": "cc.Size", @@ -890,7 +1025,7 @@ }, "_enabled": true, "__prefab": { - "__id__": 45 + "__id__": 51 }, "_alignFlags": 45, "_target": null, @@ -925,10 +1060,10 @@ }, "_enabled": true, "__prefab": { - "__id__": 47 + "__id__": 53 }, "animation": { - "__id__": 39 + "__id__": 45 }, "closeButton": { "__id__": 17 @@ -941,7 +1076,10 @@ "__expectedType__": "cc.Prefab" }, "upgradeButtonParent": { - "__id__": 21 + "__id__": 27 + }, + "goldCoinsLabel": { + "__id__": 24 }, "_id": "" }, diff --git a/assets/Scripts/AppRoot/SaveSystem.ts b/assets/Scripts/AppRoot/SaveSystem.ts index 9a7eb31..cd9ee55 100644 --- a/assets/Scripts/AppRoot/SaveSystem.ts +++ b/assets/Scripts/AppRoot/SaveSystem.ts @@ -2,7 +2,7 @@ import { sys } from "cc"; import { UserData } from "../Game/Data/UserData"; export class SaveSystem { - private userDataIdentifier = "user-dat"; + private userDataIdentifier = "user-da"; public save(userData: UserData): void { sys.localStorage.setItem(this.userDataIdentifier, JSON.stringify(userData)); } diff --git a/assets/Scripts/Game/Data/GameSettings.ts b/assets/Scripts/Game/Data/GameSettings.ts index 1f5039c..bc419cb 100644 --- a/assets/Scripts/Game/Data/GameSettings.ts +++ b/assets/Scripts/Game/Data/GameSettings.ts @@ -1,7 +1,7 @@ export class GameSettings { public player: PlayerSettings = new PlayerSettings(); public upgrades: UpgradeSettings = new UpgradeSettings(); - public metaUpgrades: MetaUpgradeSettings = new MetaUpgradeSettings(); + public metaUpgrades: MetaUpgradesSettings = new MetaUpgradesSettings(); public enemyManager: EnemyManagerSettings = new EnemyManagerSettings(); } @@ -50,13 +50,18 @@ export class UpgradeSettings { public maxRegenerationUpgrades = 0; } +export class MetaUpgradesSettings { + public health = new MetaUpgradeSettings(); + public overallDamage = new MetaUpgradeSettings(); + public projectilePiercing = new MetaUpgradeSettings(); + public movementSpeed = new MetaUpgradeSettings(); + public xpGatherer = new MetaUpgradeSettings(); + public goldGatherer = new MetaUpgradeSettings(); +} + export class MetaUpgradeSettings { - public healthPointsPerLevel = 0; - public bonusDamagePerLevel = 0; - public projectilePiercingPerLevel = 0; - public movementSpeedPerLevel = 0; - public xpBonusPerLevel = 0; - public goldBonusPerLevel = 0; + public costs: number[] = []; + public bonuses: number[] = []; } export class EnemyManagerSettings { diff --git a/assets/Scripts/Game/Data/UserData.ts b/assets/Scripts/Game/Data/UserData.ts index fac3a67..50f2dce 100644 --- a/assets/Scripts/Game/Data/UserData.ts +++ b/assets/Scripts/Game/Data/UserData.ts @@ -11,8 +11,8 @@ export class GameData { } export class MetaUpgradesData { - public maxHpLevel = 0; - public bonusDamageLevel = 2; + public healthLevel = 0; + public overallDamageLevel = 2; public projectilePiercingLevel = 0; public movementSpeedLevel = 0; public xpGathererLevel = 0; diff --git a/assets/Scripts/Game/Game.ts b/assets/Scripts/Game/Game.ts index 64ddef4..39c0a60 100644 --- a/assets/Scripts/Game/Game.ts +++ b/assets/Scripts/Game/Game.ts @@ -142,7 +142,7 @@ export class Game extends Component { private createPlayerData(settings: PlayerSettings, metaUpgrades: MetaUpgrades): PlayerData { const playerData: PlayerData = Object.assign(new PlayerData(), settings); - playerData.maxHp = metaUpgrades.getUpgradeValue(MetaUpgradeType.MaxHp) + settings.defaultHP; + playerData.maxHp = metaUpgrades.getUpgradeValue(MetaUpgradeType.Health) + settings.defaultHP; playerData.requiredXP = settings.requiredXP; playerData.speed = metaUpgrades.getUpgradeValue(MetaUpgradeType.MovementSpeed) + settings.speed; playerData.regenerationDelay = settings.regenerationDelay; diff --git a/assets/Scripts/Game/TestGameRunner.ts b/assets/Scripts/Game/TestGameRunner.ts index 669e8db..f47a7f9 100644 --- a/assets/Scripts/Game/TestGameRunner.ts +++ b/assets/Scripts/Game/TestGameRunner.ts @@ -24,8 +24,8 @@ export class TestGameRunner extends Component { while (Game.Instance == null || AppRoot.Instance == null) await delay(100); const testUserData = new UserData(); - testUserData.game.metaUpgrades.maxHpLevel = this.maxHpLevel; - testUserData.game.metaUpgrades.bonusDamageLevel = this.bonusDamageLevel; + testUserData.game.metaUpgrades.healthLevel = this.maxHpLevel; + testUserData.game.metaUpgrades.overallDamageLevel = this.bonusDamageLevel; testUserData.game.metaUpgrades.projectilePiercingLevel = this.projectilePiercingLevel; testUserData.game.metaUpgrades.movementSpeedLevel = this.movementSpeedLevel; testUserData.game.metaUpgrades.xpGathererLevel = this.xpGathererLevel; diff --git a/assets/Scripts/Game/Unit/MetaUpgrades/MetaUpgrades.ts b/assets/Scripts/Game/Unit/MetaUpgrades/MetaUpgrades.ts index a95223d..59edefb 100644 --- a/assets/Scripts/Game/Unit/MetaUpgrades/MetaUpgrades.ts +++ b/assets/Scripts/Game/Unit/MetaUpgrades/MetaUpgrades.ts @@ -1,16 +1,26 @@ -import { MetaUpgradeSettings } from "../../Data/GameSettings"; +import { MetaUpgradesSettings } from "../../Data/GameSettings"; import { MetaUpgradesData } from "../../Data/UserData"; import { MetaUpgradeType } from "../../Upgrades/UpgradeType"; export class MetaUpgrades { private upgradeTypeToValue = new Map(); - public constructor(data: MetaUpgradesData, settings: MetaUpgradeSettings) { - this.upgradeTypeToValue.set(MetaUpgradeType.MaxHp, data.maxHpLevel * settings.healthPointsPerLevel); - this.upgradeTypeToValue.set(MetaUpgradeType.OverallDamage, data.bonusDamageLevel * settings.bonusDamagePerLevel); - this.upgradeTypeToValue.set(MetaUpgradeType.ProjectilePiercing, data.projectilePiercingLevel * settings.projectilePiercingPerLevel); - this.upgradeTypeToValue.set(MetaUpgradeType.MovementSpeed, data.movementSpeedLevel * settings.movementSpeedPerLevel); - this.upgradeTypeToValue.set(MetaUpgradeType.XPGatherer, data.xpGathererLevel * settings.xpBonusPerLevel); - this.upgradeTypeToValue.set(MetaUpgradeType.GoldGatherer, data.goldGathererLevel * settings.goldBonusPerLevel); + public constructor(data: MetaUpgradesData, settings: MetaUpgradesSettings) { + this.upgradeTypeToValue.set(MetaUpgradeType.Health, this.getBonusValue(data.healthLevel, settings.health.bonuses)); + this.upgradeTypeToValue.set(MetaUpgradeType.OverallDamage, this.getBonusValue(data.overallDamageLevel, settings.overallDamage.bonuses)); + this.upgradeTypeToValue.set( + MetaUpgradeType.ProjectilePiercing, + this.getBonusValue(data.projectilePiercingLevel, settings.projectilePiercing.bonuses) + ); + this.upgradeTypeToValue.set(MetaUpgradeType.MovementSpeed, this.getBonusValue(data.movementSpeedLevel, settings.movementSpeed.bonuses)); + this.upgradeTypeToValue.set(MetaUpgradeType.XPGatherer, this.getBonusValue(data.xpGathererLevel, settings.xpGatherer.bonuses)); + this.upgradeTypeToValue.set(MetaUpgradeType.GoldGatherer, this.getBonusValue(data.goldGathererLevel, settings.goldGatherer.bonuses)); + } + + private getBonusValue(level: number, bonuses: number[]): number { + if (level <= 0) return 0; + if (bonuses.length < level) throw new Error(`Meta upgrade does not have settings for level ${level}`); + + return bonuses[level - 1]; } public getUpgradeValue(type: MetaUpgradeType): number { diff --git a/assets/Scripts/Game/Upgrades/UpgradeType.ts b/assets/Scripts/Game/Upgrades/UpgradeType.ts index 1a3e880..d6a5cdf 100644 --- a/assets/Scripts/Game/Upgrades/UpgradeType.ts +++ b/assets/Scripts/Game/Upgrades/UpgradeType.ts @@ -8,10 +8,10 @@ export enum UpgradeType { } export enum MetaUpgradeType { - MaxHp, - OverallDamage, - ProjectilePiercing, - MovementSpeed, - XPGatherer, - GoldGatherer + Health = "META_HEALTH", + OverallDamage = "META_OVERALL_DAMAGE", + ProjectilePiercing = "META_PROJECTILE_PIERCING", + MovementSpeed = "META_MOVEMENT_SPEED", + XPGatherer = "META_XP_GATHERER", + GoldGatherer = "META_GOLD_GATHERER" } diff --git a/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradeUI.ts b/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradeUI.ts index 808d986..5010a65 100644 --- a/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradeUI.ts +++ b/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradeUI.ts @@ -1,4 +1,8 @@ import { Component, instantiate, Label, Node, Prefab, _decorator } from "cc"; +import { MetaUpgradeSettings } from "../../../Game/Data/GameSettings"; +import { TranslationData } from "../../../Game/Data/TranslationData"; +import { MetaUpgradeType } from "../../../Game/Upgrades/UpgradeType"; +import { formatString } from "../../../Services/Utils/StringUtils"; import { UpgradeLevelPointUI } from "./UpgradeLevelPointUI"; const { ccclass, property } = _decorator; @@ -10,8 +14,8 @@ export class UpgradeUI extends Component { @property(Label) private description: Label; @property(Label) private cost: Label; - public init(titleText: string, descriptionText: string, levels: number): void { - for (let i = 0; i < levels; i++) { + public init(upgradeType: MetaUpgradeType, upgradeSettings: MetaUpgradeSettings, level: number, translationData: TranslationData): void { + for (let i = 0; i < upgradeSettings.bonuses.length; i++) { const node: Node = instantiate(this.levelPointPrefab); node.setParent(this.levelPointsParent); @@ -22,8 +26,8 @@ export class UpgradeUI extends Component { } } - this.title.string = titleText; - this.description.string = descriptionText; - this.cost.string = "55"; + this.title.string = `${translationData[`${upgradeType}_TITLE`]}`; + this.description.string = formatString(`${translationData[`${upgradeType}_DESC`]}`, [upgradeSettings.bonuses[level].toString()]); + this.cost.string = upgradeSettings.costs[level].toString(); } } diff --git a/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradesModalWindow.ts b/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradesModalWindow.ts index d4b45b2..fc650f2 100644 --- a/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradesModalWindow.ts +++ b/assets/Scripts/Menu/ModalWindows/Upgrades/UpgradesModalWindow.ts @@ -1,4 +1,8 @@ -import { instantiate, Prefab, _decorator, Node } from "cc"; +import { instantiate, Label, Node, Prefab, _decorator } from "cc"; +import { AppRoot } from "../../../AppRoot/AppRoot"; +import { MetaUpgradeSettings } from "../../../Game/Data/GameSettings"; +import { GameData } from "../../../Game/Data/UserData"; +import { MetaUpgradeType } from "../../../Game/Upgrades/UpgradeType"; import { ModalWindow } from "../../../Services/ModalWindowSystem/ModalWindow"; import { UpgradeUI } from "./UpgradeUI"; @@ -6,15 +10,32 @@ const { ccclass, property } = _decorator; @ccclass("UpgradesModalWindow") export class UpgradesModalWindow extends ModalWindow { - @property(Prefab) upgradeButtonPrefab: Prefab; - @property(Node) upgradeButtonParent: Node; + @property(Prefab) private upgradeButtonPrefab: Prefab; + @property(Node) private upgradeButtonParent: Node; + @property(Label) private goldCoinsLabel: Label; - public setup(params: Empty): void { - for (let index = 0; index < 6; index++) { - const upgradeButton: Node = instantiate(this.upgradeButtonPrefab); - upgradeButton.getComponent(UpgradeUI).init("Title", "Description", 5); - upgradeButton.setParent(this.upgradeButtonParent); - } + private gameData: GameData; + + public setup(): void { + this.gameData = AppRoot.Instance.SaveSystem.load().game; + + const settings = AppRoot.Instance.Settings.metaUpgrades; + const data = this.gameData.metaUpgrades; + + this.createUpgradeButton(MetaUpgradeType.Health, settings.health, data.healthLevel); + this.createUpgradeButton(MetaUpgradeType.OverallDamage, settings.overallDamage, data.healthLevel); + this.createUpgradeButton(MetaUpgradeType.ProjectilePiercing, settings.projectilePiercing, data.healthLevel); + this.createUpgradeButton(MetaUpgradeType.MovementSpeed, settings.movementSpeed, data.healthLevel); + this.createUpgradeButton(MetaUpgradeType.XPGatherer, settings.xpGatherer, data.healthLevel); + this.createUpgradeButton(MetaUpgradeType.GoldGatherer, settings.goldGatherer, data.healthLevel); + + this.goldCoinsLabel.string = this.gameData.goldCoins.toString(); + } + + private createUpgradeButton(upgradeType: MetaUpgradeType, upgradeSettings: MetaUpgradeSettings, level: number): void { + const upgradeButton: Node = instantiate(this.upgradeButtonPrefab); + upgradeButton.getComponent(UpgradeUI).init(upgradeType, upgradeSettings, level, AppRoot.Instance.TranslationData); + upgradeButton.setParent(this.upgradeButtonParent); } } diff --git a/assets/Scripts/Services/Utils/StringUtils.ts b/assets/Scripts/Services/Utils/StringUtils.ts new file mode 100644 index 0000000..a9d829f --- /dev/null +++ b/assets/Scripts/Services/Utils/StringUtils.ts @@ -0,0 +1,8 @@ +export function formatString(text: string, params: string[]): string { + let textWithParams = text; + for (let i = 0; i < params.length; i++) { + textWithParams = textWithParams.replace(`{${i}}`, params[i]); + } + + return textWithParams; +} diff --git a/assets/Scripts/Services/Utils/StringUtils.ts.meta b/assets/Scripts/Services/Utils/StringUtils.ts.meta new file mode 100644 index 0000000..128b4ef --- /dev/null +++ b/assets/Scripts/Services/Utils/StringUtils.ts.meta @@ -0,0 +1,9 @@ +{ + "ver": "4.0.23", + "importer": "typescript", + "imported": true, + "uuid": "ceda74cb-8b1e-4bd3-9cfb-0bbf0315fc40", + "files": [], + "subMetas": {}, + "userData": {} +}