Meta upgrades

This commit is contained in:
Martin
2022-12-16 13:52:54 +01:00
parent c85345cba0
commit 499fbac2b2
15 changed files with 688 additions and 415 deletions

View File

@@ -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));
}

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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<MetaUpgradeType, number>();
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 {

View File

@@ -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"
}

View File

@@ -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();
}
}

View File

@@ -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<Empty, Empty> {
@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);
}
}

View File

@@ -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;
}

View File

@@ -0,0 +1,9 @@
{
"ver": "4.0.23",
"importer": "typescript",
"imported": true,
"uuid": "ceda74cb-8b1e-4bd3-9cfb-0bbf0315fc40",
"files": [],
"subMetas": {},
"userData": {}
}