new rpg mode
This commit is contained in:
+53
-12
@@ -1,9 +1,11 @@
|
||||
import type { BossGroupCollection, GameModeId, GameSettings, HunterSave, SaveSlotId } from "./types";
|
||||
import { AVAILABLE_BOSS_IDS, BOSS_DEFINITIONS, BOSS_GROUPS } from "../game/bossCatalog";
|
||||
import { createClassInventory } from "../game/healers";
|
||||
import { createClassInventory, HEALER_CLASS_ORDER } from "../game/healers";
|
||||
import type { BossId } from "../game/types";
|
||||
import { createDefaultGearProgress } from "../game/progression/gear";
|
||||
import { BOSS_PET_DROPS, GROUP_DROP_TABLES, createEmptyCollectionLog, type CollectionLog, type LootRarity, type MaterialStack } from "../game/progression/loot";
|
||||
import { BLOCKBREAKER_BREACH_DAMAGE } from "../game/blockbreaker";
|
||||
import { createDefaultHealerAppearance } from "../game/healerVisuals";
|
||||
|
||||
export const DEFAULT_SETTINGS: GameSettings = {
|
||||
masterVolume: 80,
|
||||
@@ -66,10 +68,10 @@ export const DEFAULT_COLLECTIONS: BossGroupCollection[] = buildCollections(DEFAU
|
||||
|
||||
export const MODE_COPY: Record<GameModeId, { eyebrow: string; title: string; description: string; detail: string; status: string }> = {
|
||||
"roguelike-pve": {
|
||||
eyebrow: "1–4 hunters · randomized PVE",
|
||||
title: "PVE",
|
||||
description: "Enter without an encounter briefing, adapt to two randomized guardians, and build toward a full roguelike run.",
|
||||
detail: "Two bosses selected when the run begins",
|
||||
eyebrow: "Solo healer · drafted RPG expedition",
|
||||
title: "RPG Roguelike",
|
||||
description: "Draft a random four-companion party and mixed healing spellbook, clear escalating arcade hallways, defeat ten bosses, and build a run-only loadout.",
|
||||
detail: "Three acts, three shops, and a final guardian",
|
||||
status: "Playable now",
|
||||
},
|
||||
"rogue-trials": {
|
||||
@@ -86,11 +88,39 @@ export const MODE_COPY: Record<GameModeId, { eyebrow: string; title: string; des
|
||||
detail: `${AVAILABLE_BOSS_IDS.length} animated guardians available`,
|
||||
status: "Playable now",
|
||||
},
|
||||
"hockey-healing": {
|
||||
eyebrow: "1–4 hunters · endless healer pressure",
|
||||
title: "Hockey Healing",
|
||||
description: "Defend a wide goal while healing through two active bosses. Aim returns past a moving Pong paddle that strikes back.",
|
||||
detail: "Every fallen boss drops loot, rolls its pet chance, then receives a replacement",
|
||||
status: "Playable now",
|
||||
},
|
||||
"hockey-healing-pvp": {
|
||||
eyebrow: "1v1 healer duel · online queue",
|
||||
title: "Healing Hockey PVP",
|
||||
description: "Defend your net, keep your party alive, and race a rival through the same endless boss order in a mirrored hockey arena.",
|
||||
detail: "Goals deal 45 partywide damage · 5% Dampening per boss · normalized base gear",
|
||||
status: "Playable now",
|
||||
},
|
||||
blockbreaker: {
|
||||
eyebrow: "1–4 hunters · endless color-break PVE",
|
||||
title: "Blockbreaker",
|
||||
description: "Heal through two endless bosses while aiming a puck into advancing rows of linked color bricks.",
|
||||
detail: `Breaches deal ${BLOCKBREAKER_BREACH_DAMAGE} damage to every party member · survive while four allies stand`,
|
||||
status: "Playable now",
|
||||
},
|
||||
"aether-assault": {
|
||||
eyebrow: "1–4 hunters · endless movement-only arcade PVE",
|
||||
title: "Aether Assault",
|
||||
description: "Move freely and heal through endless bosses while automatic spellfire cuts through arcane ship formations.",
|
||||
detail: "No extra buttons · fixed-forward auto-fire · ship strikes damage only the healer",
|
||||
status: "Playable now",
|
||||
},
|
||||
"roguelike-pvp": {
|
||||
eyebrow: "3v3 · mirrored expeditions",
|
||||
title: "Roguelike PvP",
|
||||
description: "Race a rival squad through shifting rooms. Send hazards across the veil while keeping your own formation alive.",
|
||||
detail: "Draft order, rival pressure, and sudden-death rules",
|
||||
detail: "Draft order, normalized base gear, rival pressure, and sudden-death rules",
|
||||
status: "Mode shell ready",
|
||||
},
|
||||
"stadium-pvp": {
|
||||
@@ -120,15 +150,15 @@ export function createHunterSave(slotId: SaveSlotId, now: string, hunterName: st
|
||||
const normalizedName = normalizeHunterName(hunterName);
|
||||
if (!normalizedName) throw new Error("Hunter name is required.");
|
||||
return {
|
||||
schemaVersion: 5,
|
||||
schemaVersion: 6,
|
||||
slotId,
|
||||
hunterName: normalizedName,
|
||||
activeClassId: "priest",
|
||||
healers: {
|
||||
priest: { level: 1, inventory: createClassInventory("priest") },
|
||||
druid: { level: 1, inventory: createClassInventory("druid") },
|
||||
shaman: { level: 1, inventory: createClassInventory("shaman") },
|
||||
},
|
||||
healers: Object.fromEntries(HEALER_CLASS_ORDER.map((classId) => [classId, {
|
||||
level: 1,
|
||||
inventory: createClassInventory(classId),
|
||||
appearance: createDefaultHealerAppearance(classId),
|
||||
}])) as HunterSave["healers"],
|
||||
location: "Ember Vault Approach",
|
||||
playSeconds: 0,
|
||||
updatedAt: now,
|
||||
@@ -140,6 +170,17 @@ export function createHunterSave(slotId: SaveSlotId, now: string, hunterName: st
|
||||
bossKills: {},
|
||||
highestRoguelikeRound: 0,
|
||||
highestRogueTrialsEndlessKills: 0,
|
||||
highestHockeyHealingReturns: 0,
|
||||
longestHockeyHealingSecondsAtBest: 0,
|
||||
hockeyHealingPvpWins: 0,
|
||||
hockeyHealingPvpLosses: 0,
|
||||
hockeyHealingPvpBossKills: 0,
|
||||
highestBlockbreakerBricks: 0,
|
||||
longestBlockbreakerSeconds: 0,
|
||||
highestBlockbreakerScore: 0,
|
||||
highestAetherAssaultScore: 0,
|
||||
highestAetherAssaultWaveAtBest: 0,
|
||||
longestAetherAssaultSecondsAtBest: 0,
|
||||
},
|
||||
materials: [] as MaterialStack[],
|
||||
collectionLog: createEmptyCollectionLog(),
|
||||
|
||||
Reference in New Issue
Block a user