Meta upgrades

This commit is contained in:
Martin
2022-12-19 13:17:32 +01:00
parent e8fc5a1ec9
commit 714ea8883b
8 changed files with 302 additions and 67 deletions

View File

@@ -1,4 +1,4 @@
import { _decorator, Component } from "cc";
import { Component, _decorator } from "cc";
import { ModalWindowManager } from "../Services/ModalWindowSystem/ModalWindowManager";
import { UIButton } from "../Services/UI/Button/UIButton";
import { GameRunner } from "./GameRunner";

View File

@@ -2,6 +2,9 @@ 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 { ISignal } from "../../../Services/EventSystem/ISignal";
import { Signal } from "../../../Services/EventSystem/Signal";
import { UIButton } from "../../../Services/UI/Button/UIButton";
import { formatString } from "../../../Services/Utils/StringUtils";
import { UpgradeLevelPointUI } from "./UpgradeLevelPointUI";
const { ccclass, property } = _decorator;
@@ -13,21 +16,61 @@ export class UpgradeUI extends Component {
@property(Label) private title: Label;
@property(Label) private description: Label;
@property(Label) private cost: Label;
@property(Label) private maxLevel: Label;
@property(UIButton) private uiButton: UIButton;
private interactedEvent = new Signal<MetaUpgradeType>();
private upgradeType: MetaUpgradeType;
private upgradeSettings: MetaUpgradeSettings;
private translationData: TranslationData;
private levelPointUIs: UpgradeLevelPointUI[] = [];
public init(upgradeType: MetaUpgradeType, upgradeSettings: MetaUpgradeSettings, level: number, translationData: TranslationData): void {
for (let i = 0; i < upgradeSettings.bonuses.length; i++) {
this.upgradeType = upgradeType;
this.upgradeSettings = upgradeSettings;
this.translationData = translationData;
this.title.string = `${translationData[`${upgradeType}_TITLE`]}`;
this.uiButton.InteractedEvent.on(() => this.interactedEvent.trigger(upgradeType), this);
for (let i = 0; i < this.upgradeSettings.bonuses.length; i++) {
const node: Node = instantiate(this.levelPointPrefab);
node.setParent(this.levelPointsParent);
const levelPointUI = node.getComponent(UpgradeLevelPointUI);
levelPointUI.init();
if (i < 3) {
levelPointUI.upgrade();
this.levelPointUIs.push(levelPointUI);
}
this.updateLevel(level);
}
public updateLevel(level: number): void {
for (let i = 0; i < this.levelPointUIs.length; i++) {
if (i < level) {
this.levelPointUIs[i].upgrade();
}
}
this.title.string = `${translationData[`${upgradeType}_TITLE`]}`;
this.description.string = formatString(`${translationData[`${upgradeType}_DESC`]}`, [upgradeSettings.bonuses[level].toString()]);
this.cost.string = upgradeSettings.costs[level].toString();
if (level < this.upgradeSettings.bonuses.length) {
this.maxLevel.node.active = false;
this.description.string = formatString(`${this.translationData[`${this.upgradeType}_DESC`]}`, [
this.upgradeSettings.bonuses[level].toString()
]);
this.cost.string = this.upgradeSettings.costs[level].toString();
} else {
// reached max level
this.maxLevel.node.active = true;
this.cost.node.active = false;
this.description.node.active = false;
}
}
public get InteractedEvent(): ISignal<MetaUpgradeType> {
return this.interactedEvent;
}
}

View File

@@ -1,8 +1,8 @@
import { instantiate, Label, Node, Prefab, _decorator } from "cc";
import { instantiate, Label, Node, Prefab, TiledUserNodeData, _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 { UserData, GameData, MetaUpgradesData } from "../../../Game/Data/UserData";
import { MetaUpgradeType, UpgradeType } from "../../../Game/Upgrades/UpgradeType";
import { ModalWindow } from "../../../Services/ModalWindowSystem/ModalWindow";
import { UpgradeUI } from "./UpgradeUI";
@@ -14,28 +14,59 @@ export class UpgradesModalWindow extends ModalWindow<Empty, Empty> {
@property(Node) private upgradeButtonParent: Node;
@property(Label) private goldCoinsLabel: Label;
private gameData: GameData;
private typeToLevel = new Map<MetaUpgradeType, number>();
private typeToCosts = new Map<MetaUpgradeType, number[]>();
private typeToLevelKey = new Map<MetaUpgradeType, keyof MetaUpgradesData>();
private typeToUpgradeUI = new Map<MetaUpgradeType, UpgradeUI>();
private userData: UserData;
public setup(): void {
this.gameData = AppRoot.Instance.SaveSystem.load().game;
this.userData = AppRoot.Instance.SaveSystem.load();
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.createUpgradeButton(MetaUpgradeType.Health, settings.health, "healthLevel");
this.createUpgradeButton(MetaUpgradeType.OverallDamage, settings.overallDamage, "overallDamageLevel");
this.createUpgradeButton(MetaUpgradeType.ProjectilePiercing, settings.projectilePiercing, "projectilePiercingLevel");
this.createUpgradeButton(MetaUpgradeType.MovementSpeed, settings.movementSpeed, "movementSpeedLevel");
this.createUpgradeButton(MetaUpgradeType.XPGatherer, settings.xpGatherer, "xpGathererLevel");
this.createUpgradeButton(MetaUpgradeType.GoldGatherer, settings.goldGatherer, "goldGathererLevel");
this.goldCoinsLabel.string = this.gameData.goldCoins.toString();
this.goldCoinsLabel.string = this.userData.game.goldCoins.toString();
}
private createUpgradeButton(upgradeType: MetaUpgradeType, upgradeSettings: MetaUpgradeSettings, level: number): void {
private createUpgradeButton<T extends keyof MetaUpgradesData>(
upgradeType: MetaUpgradeType,
upgradeSettings: MetaUpgradeSettings,
levelKey: T
): void {
const upgradeButton: Node = instantiate(this.upgradeButtonPrefab);
upgradeButton.getComponent(UpgradeUI).init(upgradeType, upgradeSettings, level, AppRoot.Instance.TranslationData);
const upgradeUI: UpgradeUI = upgradeButton.getComponent(UpgradeUI);
upgradeUI.init(upgradeType, upgradeSettings, this.userData.game.metaUpgrades[levelKey], AppRoot.Instance.TranslationData);
upgradeUI.InteractedEvent.on(this.tryUpgrade, this);
upgradeButton.setParent(this.upgradeButtonParent);
this.typeToLevel.set(upgradeType, this.userData.game.metaUpgrades[levelKey]);
this.typeToCosts.set(upgradeType, upgradeSettings.costs);
this.typeToLevelKey.set(upgradeType, levelKey);
this.typeToUpgradeUI.set(upgradeType, upgradeUI);
}
private tryUpgrade(upgradeType: MetaUpgradeType): void {
console.log("Trying to upgrade " + upgradeType);
const costs: number[] = this.typeToCosts.get(upgradeType);
const currentLevel: number = this.typeToLevel.get(upgradeType);
if (costs.length <= currentLevel) return; // already max level
if (this.userData.game.goldCoins < costs[currentLevel]) return; // not enough gold
this.userData.game.goldCoins -= costs[currentLevel];
const level = ++this.userData.game.metaUpgrades[this.typeToLevelKey.get(upgradeType)];
this.typeToUpgradeUI.get(upgradeType).updateLevel(level);
AppRoot.Instance.SaveSystem.save(this.userData);
}
}