diff --git a/public/assets/json/Gems.json b/public/assets/json/Gems.json index 880ee75..aab44ba 100644 --- a/public/assets/json/Gems.json +++ b/public/assets/json/Gems.json @@ -7,20 +7,23 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], + "initialGemValue": 10, "genericImprovements": [ { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 0 }, { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 10 } ], "gemResistanceModifications": [ @@ -48,20 +51,23 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], + "initialGemValue": 10, "genericImprovements": [ { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 0 }, { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 10 } ], "gemResistanceModifications": [ @@ -89,27 +95,31 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], + "initialGemValue": 10, "genericImprovements": [ { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 0 }, { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 10 }, { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 10 } ], "gemResistanceModifications": [ @@ -144,20 +154,23 @@ "textures": [], "cantCombineWith": [], "specialCombine": [], + "initialGemValue": 10, "genericImprovements": [ { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 0 }, { "damageUp": 2, "attackSpeedUp": 100, "rangeUp": 0.5, "timeToLiveUp": 0, - "pierceUp": 1 + "pierceUp": 1, + "gemValueUp": 10 } ], "gemResistanceModifications": [ diff --git a/src/classes/Definitions.ts b/src/classes/Definitions.ts index 4bee02e..3026d7e 100644 --- a/src/classes/Definitions.ts +++ b/src/classes/Definitions.ts @@ -78,6 +78,7 @@ export type GemDefinition = { textures: PIXI.Texture[]; cantCombineWith: GemType[]; specialCombine: GemType[]; + initialGemValue: number; genericImprovements: GenericGemImprovement[]; gemResistanceModifications: CreepResistancesDefinition[]; }; @@ -88,6 +89,7 @@ export type GenericGemImprovement = { rangeUp: number; timeToLiveUp: number; pierceUp: number; + gemValueUp: number; }; export type PathDefinition = [[row: number, column: number]]; diff --git a/src/classes/game/Gem.ts b/src/classes/game/Gem.ts index f3742c1..b699dbc 100644 --- a/src/classes/game/Gem.ts +++ b/src/classes/game/Gem.ts @@ -25,6 +25,7 @@ export default class Gem { rangeUp: 0, timeToLiveUp: 0, pierceUp: 0, + gemValueUp: 0, }; for (let i = 0; i < this.level; i++) { const item = this.definition.genericImprovements[i]; @@ -33,10 +34,19 @@ export default class Gem { totalGemImprovement.rangeUp += item.rangeUp; totalGemImprovement.timeToLiveUp += item.timeToLiveUp; totalGemImprovement.pierceUp += item.pierceUp; + totalGemImprovement.gemValueUp += item.gemValueUp; } return totalGemImprovement; } public currentGemResistanceModifications() { return this.definition.gemResistanceModifications[this.level - 1]; } + public isMaxLevel() { + return this.level == this.definition.totalLevels; + } + public levelUp(howMuch) { + if (!howMuch) howMuch = 1; + this.level += howMuch; + this.texture = this.definition.textures[this.level - 1]; + } } diff --git a/src/classes/gui/GemTab.ts b/src/classes/gui/GemTab.ts index f7da1d5..c2c063f 100644 --- a/src/classes/gui/GemTab.ts +++ b/src/classes/gui/GemTab.ts @@ -76,10 +76,22 @@ export default class GemTab extends GuiObject { } } public pointerMoveEvent() { - if (!this.isDragAndDroppingGem || !Engine.GameScene.towerPanel.isShown || !this.dragAndDroppingGem) return; + if (!this.isDragAndDroppingGem || !this.dragAndDroppingGem) return; this.dragAndDroppingGem.container.x = Engine.MouseX - 32; this.dragAndDroppingGem.container.y = Engine.MouseY - 32; } + private isOverlappingGemsmith(me: VisualGemSlot, other: VisualGemSlot, otherParent: PIXI.Container) { + let ddbb = me.copyContainerToBB(); + let vb = other.copyContainerToBB(); + let x = otherParent.x + vb.x + Engine.GameScene.sidebar.container.x; + let y = otherParent.y + vb.y + Engine.GameScene.sidebar.container.y; + + let vgbb = new PIXI.Rectangle(x, y, vb.width, vb.height); + // console.log(ddbb, vgbb, ddbb.getBounds().intersects(vgbb)); + if (ddbb.getBounds().intersects(vgbb)) { + if (other && other.gem == null) return true; + } + } public RebuildInventoryVisual() { this.vGems.forEach((vGem) => vGem.destroy()); this.vGems = []; @@ -112,7 +124,6 @@ export default class GemTab extends GuiObject { this.selectingGemTowerObject.SlotGem(takenGem, this.selectingGemSlotIndex); this.RebuildInventoryVisual(); } else { - if (!Engine.GameScene.towerPanel.isShown) return; // initialise drag and drop this.isDragAndDroppingGem = true; this.dragAndDroppingGem = vGem; @@ -124,6 +135,63 @@ export default class GemTab extends GuiObject { vGem.container.onpointerup = () => { if (this.isSelectingGem) return; let overlapping = null; + let wantToSell = this.isOverlappingGemsmith( + this.dragAndDroppingGem, + Engine.GameScene.sidebar.gemsmith.sellVGem, + Engine.GameScene.sidebar.gemsmith.container + ); + if (wantToSell) { + let sellFor = + this.dragAndDroppingGem.gem.definition.initialGemValue + + this.dragAndDroppingGem.gem.currentGemImprovement().gemValueUp; + Engine.GameScene.MissionStats.earnGold(Math.ceil(sellFor * 0.8)); + Engine.NotificationManager.Notify( + `Sold Lv. ${this.dragAndDroppingGem.gem.level} ${ + this.dragAndDroppingGem.gem.definition.name + } for ${Math.ceil(sellFor * 0.8)} gold.`, + 'info' + ); + Engine.GameScene.MissionStats.takeGem(this.dragAndDroppingGem.gem); + this.isDragAndDroppingGem = false; + this.dragAndDroppingGem = null; + this.RebuildInventoryVisual(); + return; + } + let wantToUpgrade = this.isOverlappingGemsmith( + this.dragAndDroppingGem, + Engine.GameScene.sidebar.gemsmith.upgradeVGem, + Engine.GameScene.sidebar.gemsmith.container + ); + if (wantToUpgrade) { + if (this.dragAndDroppingGem.gem.isMaxLevel()) + Engine.NotificationManager.Notify('Gem is max level.', 'warn'); + else { + let cost = + this.dragAndDroppingGem.gem.definition.genericImprovements[ + this.dragAndDroppingGem.gem.level + ].gemValueUp; + if (Engine.GameScene.MissionStats.hasEnoughGold(cost)) { + Engine.GameScene.MissionStats.spendGold(cost); + this.dragAndDroppingGem.gem.levelUp(1); + Engine.NotificationManager.Notify( + `Spent ${cost} gold to upgrade ${this.dragAndDroppingGem.gem.definition.name} Lv. ${ + this.dragAndDroppingGem.gem.level - 1 + } -> Lv. ${this.dragAndDroppingGem.gem.level}!`, + 'warn' + ); + } else { + Engine.NotificationManager.Notify( + "You don't have enough, you need " + cost + ' gold to upgrade this gem.', + 'warn' + ); + } + } + this.isDragAndDroppingGem = false; + this.dragAndDroppingGem = null; + this.RebuildInventoryVisual(); + + return; + } Engine.GameScene.towerPanel.vGems.forEach((internVG) => { if (overlapping || !this.dragAndDroppingGem) return; let ddbb = this.dragAndDroppingGem.copyContainerToBB(); @@ -132,7 +200,7 @@ export default class GemTab extends GuiObject { let y = Engine.GameScene.towerPanel.container.y + vb.y; let vgbb = new PIXI.Rectangle(x, y, vb.width, vb.height); - console.log(ddbb, vgbb, ddbb.getBounds().intersects(vgbb)); + // console.log(ddbb, vgbb, ddbb.getBounds().intersects(vgbb)); if (ddbb.getBounds().intersects(vgbb)) { if (internVG && internVG.gem == null) overlapping = internVG; } diff --git a/src/classes/gui/Gemsmith.ts b/src/classes/gui/Gemsmith.ts index 0b3441c..eb509de 100644 --- a/src/classes/gui/Gemsmith.ts +++ b/src/classes/gui/Gemsmith.ts @@ -8,6 +8,7 @@ export default class Gemsmith extends GuiObject { public sellVGem: VisualGemSlot; public upgradeVGem: VisualGemSlot; + // ! NOTE: Gemsmith logic is contained within GemTab.ts constructor(bounds: PIXI.Rectangle) { super(false); this.bounds = bounds; diff --git a/src/classes/gui/Tooltip.ts b/src/classes/gui/Tooltip.ts index b6767f3..7678ba2 100644 --- a/src/classes/gui/Tooltip.ts +++ b/src/classes/gui/Tooltip.ts @@ -179,7 +179,9 @@ export default class Tooltip extends GuiObject { this.gemDescriptionText.alpha = 1; this.titleText.text = `Lv. ${gem.level} ` + gem.definition.name; - this.gemDescriptionText.text = gem.definition.description; + this.gemDescriptionText.text = + `Valued at ${gem.definition.initialGemValue + gem.currentGemImprovement().gemValueUp} gold. ` + + gem.definition.description; } public Show(x, y) { this.container.alpha = 1;