16. アップグレード

はじめに

レベルアップ時に3つのアップグレードを表示し、1つを選択する機能を追加しました。

(その前に、Weapon周りを大幅にリファクタしています。)

方針

アップグレードには、以下のような種類があります。

  • 武器の新規取得(Lv.1)
  • 武器のレベルアップ(Lv.2~5)
  • HP回復
  • MaxHP増加
  • スピード増加
  • マグネット範囲の増加

取得可能なアップグレードで選択肢プールを作成し、その中から3つを抽選して画面に表示します。プレイヤーは1つを選びます。

実装

アップグレードの定義

アップグレードはUpgradeインターフェースで定義され、iconKey, name, desc, requires, excludes, customAvailable, applyなどのプロパティを持ちます。

upgradeManagerでkey=upgradeId, value=Upgrade として保存しておきます。

interface Upgrade {
  iconKey: UpgradeIconKey;
  name: string;
  desc: string;
  requires: string[];
  excludes: string[];
  customAvailable?: () => boolean;
  apply: () => void;
}

requiresには、そのアップグレードの前提となる必要条件となるupgradeIdを、excludesには、排他条件となるupgradeIdを指定します。 これにより、選択肢プールを作成します。

例えば、shuriken_lv2の必要条件はshuriken_lv1を持っていることであり、排他条件はshuriken_lv2を持っていることです。

customAvailableメソッドは、より複雑な条件を指定します。たとえば、HPが最大であれば、「HP回復」はプールに入りません。

アップグレードの登録

アップグレードはregisterUpgrades関数で一括登録されます。
ここで武器アップグレード・非武器アップグレードがそれぞれ関数でまとめて登録されます。

アップグレードの選択画面

レベルアップ時にLevelUpSceneが起動し、3つの候補が表示されます。

これは、upgradeManager.getRandomUpgradeIdsで抽選されたアップグレード候補を、 UpgradeCardでカードUIを表示しています。

LevelUpSceneでカード選択・アニメーション・効果音などを制御します。

アップグレードの適用

プレイヤーが選択すると、upgradeManager.applyが呼ばれ、実際の効果がプレイヤーに反映されます。 適用済みupgradeIdはUpgradeListComponentacquired配列に追加されます。(プレイヤーエンティティが保持)

アップグレードの抽選ロジック

getAvaiableUpgradesで、依存・排他・カスタム条件を満たすアップグレードのみ抽選対象になります。 候補がなければダミーの"gold"アップグレードが選ばれます。
(現在はgoldパラメータが存在しないため、これは意味のないアップグレードです。)

まとめ

アップグレードを追加しました。