From a3e8be3c187d8eacf7fc39c3e3db92a6f28c2bbb Mon Sep 17 00:00:00 2001 From: koneko <67551503+koneko@users.noreply.github.com> Date: Fri, 7 Mar 2025 01:08:17 +0100 Subject: [PATCH] balanced gems --- public/assets/json/Gems.json | 285 ++++++++++++++++----------------- public/assets/json/Towers.json | 54 +++---- src/classes/Bastion.ts | 5 +- src/classes/gui/TowerPanel.ts | 21 ++- src/scenes/Game.ts | 2 +- 5 files changed, 193 insertions(+), 174 deletions(-) diff --git a/public/assets/json/Gems.json b/public/assets/json/Gems.json index 685f8f6..ab4106b 100644 --- a/public/assets/json/Gems.json +++ b/public/assets/json/Gems.json @@ -8,7 +8,7 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], - "initialGemValue": 50, + "initialGemValue": 75, "genericImprovements": [ { "damageUp": 1, @@ -29,9 +29,9 @@ { "damageUp": 2, "attackSpeedUp": 0, - "rangeUp": 0, + "rangeUp": 2, "timeToLiveUp": 0, - "pierceUp": 1, + "pierceUp": 0, "gemValueUp": 250 }, { @@ -47,12 +47,12 @@ "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, + "pierceUp": 0, "gemValueUp": 650 }, { "damageUp": 2, - "attackSpeedUp": 0, + "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, @@ -63,7 +63,7 @@ "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, + "pierceUp": 0, "gemValueUp": 900 }, { @@ -76,7 +76,7 @@ }, { "damageUp": 2, - "attackSpeedUp": 0, + "attackSpeedUp": 250, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, @@ -158,71 +158,71 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], - "initialGemValue": 10, + "initialGemValue": 80, "genericImprovements": [ { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 1, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 100 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 150 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 0, + "rangeUp": 2, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 250 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 400 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 650 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 750 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 900 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 1000 } ], "gemResistanceModifications": [ @@ -230,14 +230,7 @@ "physical": 0, "divine": 0, "fire": 0, - "ice": 0.1, - "frostfire": 0 - }, - { - "physical": 0, - "divine": 0, - "fire": 0, - "ice": 0.2, + "ice": 0.05, "frostfire": 0 }, { @@ -251,14 +244,7 @@ "physical": 0, "divine": 0, "fire": 0, - "ice": 0.2, - "frostfire": 0 - }, - { - "physical": 0, - "divine": 0, - "fire": 0, - "ice": 0.1, + "ice": 0.15, "frostfire": 0 }, { @@ -272,15 +258,29 @@ "physical": 0, "divine": 0, "fire": 0, - "ice": 0.1, - "frostfire": 0 + "ice": 0.25, + "frostfire": 0.1 }, { "physical": 0, "divine": 0, "fire": 0, - "ice": 0.2, - "frostfire": 0 + "ice": 0.3, + "frostfire": 0.1 + }, + { + "physical": 0, + "divine": 0, + "fire": 0, + "ice": 0.35, + "frostfire": 0.2 + }, + { + "physical": 0, + "divine": 0, + "fire": 0, + "ice": 0.4, + "frostfire": 0.25 } ] }, @@ -293,63 +293,63 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], - "initialGemValue": 10, + "initialGemValue": 100, "genericImprovements": [ { - "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "damageUp": 1, + "attackSpeedUp": 0, + "rangeUp": 1, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 200 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 0, + "rangeUp": 1, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 350 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 0, + "rangeUp": 1, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 2, + "gemValueUp": 450 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 200, + "rangeUp": 1, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 600 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 0, + "rangeUp": 1, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 850 }, { "damageUp": 2, - "attackSpeedUp": 10, + "attackSpeedUp": 0, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 10 + "pierceUp": 0, + "gemValueUp": 900 }, { "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "attackSpeedUp": 0, + "rangeUp": 2, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 900 } ], "gemResistanceModifications": [ @@ -357,49 +357,56 @@ "physical": 0, "divine": 0, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.05, "divine": 0, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.1, "divine": 0, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.1, "divine": 0, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.15, "divine": 0, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.2, "divine": 0, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { - "physical": 0, + "physical": 0.25, "divine": 0, "fire": 0, - "ice": 0.1, + "ice": 0, + "frostfire": 0 + }, + { + "physical": 0.3, + "divine": 0, + "fire": 0, + "ice": 0, "frostfire": 0 } ] @@ -409,132 +416,124 @@ "description": "Made from the wandering souls of the damned, the Soulforge gem accelerates your towers cooldowns and acts as a repellant for all things unholy.", "color": "gray", "type": "Soulforge", - "totalLevels": 2, + "totalLevels": 7, "textures": [], "cantCombineWith": [], "specialCombine": [], - "initialGemValue": 10, + "initialGemValue": 150, "genericImprovements": [ { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 200 }, { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 10 + "gemValueUp": 350 }, { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 150, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 + "pierceUp": 0, + "gemValueUp": 450 }, { - "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, + "damageUp": 0, + "attackSpeedUp": 100, + "rangeUp": 1, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 10 + "pierceUp": 0, + "gemValueUp": 600 }, { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 250, "rangeUp": 0, "timeToLiveUp": 0, "pierceUp": 1, - "gemValueUp": 0 + "gemValueUp": 850 }, { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 400, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 10 + "pierceUp": 0, + "gemValueUp": 900 }, { - "damageUp": 2, - "attackSpeedUp": 10, + "damageUp": 0, + "attackSpeedUp": 500, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 0 - }, - { - "damageUp": 2, - "attackSpeedUp": 10, - "rangeUp": 0, - "timeToLiveUp": 0, - "pierceUp": 1, - "gemValueUp": 10 + "pierceUp": 0, + "gemValueUp": 900 } ], "gemResistanceModifications": [ { "physical": 0, - "divine": 0, + "divine": 0.2, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.3, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.4, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.5, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.6, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.7, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.75, "fire": 0, - "ice": 0.1, + "ice": 0, "frostfire": 0 }, { "physical": 0, - "divine": 0, + "divine": 0.8, "fire": 0, - "ice": 0.2, + "ice": 0, "frostfire": 0 } ] diff --git a/public/assets/json/Towers.json b/public/assets/json/Towers.json index 2d4b497..7f15e5f 100644 --- a/public/assets/json/Towers.json +++ b/public/assets/json/Towers.json @@ -9,13 +9,13 @@ "projectileTexturesArrayLength": 5, "description": "The building block of society, nothing more basic exists.", "stats": { - "damage": 2, + "damage": 1, "cooldown": 1500, "gemSlotsAmount": 1, - "cost": 50, + "cost": 25, "range": 3, "timeToLive": 20, - "pierce": 2 + "pierce": 1 } }, { @@ -26,15 +26,15 @@ "projectile": "blue", "projectileTextures": [], "projectileTexturesArrayLength": 4, - "description": "If you feel like shooting in a circle around you, projectiles may miss.", + "description": "Shoots 8 projectiles in a circle, they may miss.", "stats": { "damage": 3, - "cooldown": 4000, + "cooldown": 3000, "gemSlotsAmount": 2, - "cost": 100, - "range": 2.5, - "timeToLive": 12, - "pierce": 30 + "cost": 50, + "range": 3, + "timeToLive": 20, + "pierce": 5 } }, { @@ -50,10 +50,10 @@ "damage": 3, "cooldown": 3500, "gemSlotsAmount": 2, - "cost": 150, + "cost": 100, "range": 3, "timeToLive": 12, - "pierce": 10 + "pierce": 1 } }, { @@ -64,13 +64,13 @@ "projectile": "blue", "projectileTextures": [], "projectileTexturesArrayLength": 4, - "description": "Doesn't shoot, instead buffs other towers with 50% of its power.", + "description": "Doesn't shoot, instead buffs other towers with some of its power.", "stats": { "damage": 4, "cooldown": 1000, "gemSlotsAmount": 3, "cost": 200, - "range": 2, + "range": 2.5, "timeToLive": 15, "pierce": 5 } @@ -83,13 +83,13 @@ "projectile": "white", "projectileTextures": [], "projectileTexturesArrayLength": 5, - "description": "Like a regular tower, just slows down creeps.", + "description": "Behaves like the Basic Tower, only its shots stop creeps in their tracks!", "stats": { "damage": 2, - "cooldown": 2000, - "gemSlotsAmount": 3, - "cost": 125, - "range": 2.5, + "cooldown": 2250, + "gemSlotsAmount": 2, + "cost": 75, + "range": 3.25, "timeToLive": 12, "pierce": 1 } @@ -104,8 +104,8 @@ "projectileTexturesArrayLength": 4, "description": "Shoots a quick, high pierce rail projectile at creeps.", "stats": { - "damage": 2, - "cooldown": 2000, + "damage": 4, + "cooldown": 3750, "gemSlotsAmount": 3, "cost": 125, "range": 2.5, @@ -121,15 +121,15 @@ "projectile": "stone", "projectileTextures": [], "projectileTexturesArrayLength": 1, - "description": "Randomly places traps on the track, instead of attacking creeps.", + "description": "Randomly places expiring traps on the track, instead of attacking creeps.", "stats": { "damage": 2, "cooldown": 2000, "gemSlotsAmount": 3, - "cost": 125, - "range": 2.5, + "cost": 150, + "range": 3, "timeToLive": 400, - "pierce": 2 + "pierce": 3 } }, { @@ -143,12 +143,12 @@ "description": "On top of a regular attack, this tower gives creeps a debuff, making them take more damage.", "stats": { "damage": 2, - "cooldown": 2000, + "cooldown": 1750, "gemSlotsAmount": 3, - "cost": 125, + "cost": 200, "range": 2.5, "timeToLive": 12, - "pierce": 30 + "pierce": 2 } } ] diff --git a/src/classes/Bastion.ts b/src/classes/Bastion.ts index b3bd4cf..3991889 100644 --- a/src/classes/Bastion.ts +++ b/src/classes/Bastion.ts @@ -34,11 +34,12 @@ export class Engine { public static TestSuite() { let params = new URLSearchParams(location.href); if (params.entries().next().value[1] != 'game') return; - Engine.NotificationManager.Notify('Loaded testing suite.', 'danger'); + Engine.NotificationManager.Notify('Loaded.', 'danger'); let tower = GameAssets.Towers[TowerType.Electric]; Engine.TowerManager.ToggleChoosingTowerLocation('RESET'); Engine.TowerManager.PlaceTower(tower, 6, 10, tower.behaviour, true); - for (let i = 0; i < 29; i++) { + Engine.GameScene.MissionStats.earnGold(2000); + for (let i = 0; i < 24; i++) { this.GameScene.MissionStats.giveGem(new Gem(i % 6), true); } } diff --git a/src/classes/gui/TowerPanel.ts b/src/classes/gui/TowerPanel.ts index d6ccef4..8fa9ff7 100644 --- a/src/classes/gui/TowerPanel.ts +++ b/src/classes/gui/TowerPanel.ts @@ -20,7 +20,7 @@ export class VisualGemSlot extends GuiObject { let gtexture; this.i = index; this.container.x = 10; - this.container.y = index * (Engine.GridCellSize + 6) + 300; + this.container.y = index * (Engine.GridCellSize + 6) + 350; this.background = new PIXI.Sprite({ texture: GameAssets.Frame01Texture, }); @@ -115,6 +115,7 @@ export default class TowerPanel extends GuiObject { public divineResDamage: PIXI.Text; public physicalResDamage: PIXI.Text; private sellButton: Button; + private description: PIXI.Text; constructor(bounds: PIXI.Rectangle) { super(false); @@ -282,6 +283,23 @@ export default class TowerPanel extends GuiObject { }), }); this.container.addChild(this.physicalResDamage); + this.description = new PIXI.Text({ + x: 10, + y: 270, + zIndex: 5, + style: { + fontSize: 18, + wordWrap: true, + wordWrapWidth: 245, + fill: 0x00ff00, + fontStyle: 'italic', + stroke: { + color: 0x000000, + width: 2, + }, + }, + }); + this.container.addChild(this.description); this.sellButton = new Button( new PIXI.Rectangle(5, this.towerPanel.height - 70, this.towerPanel.width - 115, 60), 'Sell', @@ -348,6 +366,7 @@ export default class TowerPanel extends GuiObject { this.frostFireResDamage.text = `+${tower.totalGemResistanceModifications.frostfire * 100}% FrostFire damage`; this.divineResDamage.text = `+${tower.totalGemResistanceModifications.divine * 100}% Divine damage`; this.physicalResDamage.text = `+${tower.totalGemResistanceModifications.physical * 100}% Physical damage`; + this.description.text = `"${tower.definition.description}"`; this.sellButton.setCaption('Sell for ' + tower.definition.stats.cost + ' gold'); this.sellButton.onClick = () => { tower.Sell(); diff --git a/src/scenes/Game.ts b/src/scenes/Game.ts index ed1d8fc..0570a41 100644 --- a/src/scenes/Game.ts +++ b/src/scenes/Game.ts @@ -123,7 +123,7 @@ export class GameScene extends Scene { this.changeRoundButton.buttonIcon.texture = GameAssets.FastForwardIconTexture; this.events.emit(WaveManagerEvents.NewWave, `${this.currentRound + 1}`); }; - this.MissionStats = new MissionStats(100, 250); + this.MissionStats = new MissionStats(100, 75); this.events.on(GemEvents.TowerPanelSelectGem, (gem, index, tower) => { if (gem == null) { if (!this.MissionStats.checkIfPlayerHasAnyGems())