feat: goddess expansion chunks 6–9 — UI panels, tick engine, CSS theme, about page

- Add 11 goddess panels (zones, bosses, quests, disciples, equipment,
  upgrades, consecration, enlightenment, crafting, exploration, achievements)
- Wire all panels into gameLayout via mode/tab routing
- Add goddess passive income, disciple tick, quest timers, zone/quest
  unlock logic, and achievement checking to the tick engine
- Add goddess CSS variables, .goddess-mode overrides, 300ms fade
  transition, and full panel stylesheet coverage
- Add 13 Goddess expansion entries to the How to Play guide
- Add web-side data files for crafting recipes, exploration areas, materials
This commit is contained in:
2026-04-13 18:38:27 -07:00
committed by Naomi Carrigan
parent 96d6759661
commit 91c9f52daf
21 changed files with 7093 additions and 108 deletions
+169
View File
@@ -4,6 +4,7 @@
* @license Naomi's Public License
* @author Naomi Carrigan
*/
/* eslint-disable max-lines -- API client grows with each new endpoint group */
import type {
AboutResponse,
ApotheosisRequest,
@@ -11,18 +12,37 @@ import type {
AuthResponse,
BossChallengeRequest,
BossChallengeResponse,
BuyConsecrationUpgradeRequest,
BuyConsecrationUpgradeResponse,
BuyEchoUpgradeRequest,
BuyEchoUpgradeResponse,
BuyEnlightenmentUpgradeRequest,
BuyEnlightenmentUpgradeResponse,
BuyGoddessUpgradeRequest,
BuyGoddessUpgradeResponse,
BuyPrestigeUpgradeRequest,
BuyPrestigeUpgradeResponse,
ConsecrationRequest,
ConsecrationResponse,
CraftRecipeRequest,
CraftRecipeResponse,
EnlightenmentRequest,
EnlightenmentResponse,
ExploreClaimableResponse,
ExploreCollectRequest,
ExploreCollectResponse,
ExploreStartRequest,
ExploreStartResponse,
ForceUnlocksResponse,
GoddessBossChallengeRequest,
GoddessBossChallengeResponse,
GoddessCraftRequest,
GoddessCraftResponse,
GoddessExploreClaimableResponse,
GoddessExploreCollectRequest,
GoddessExploreCollectResponse,
GoddessExploreStartRequest,
GoddessExploreStartResponse,
LoadResponse,
PrestigeRequest,
PrestigeResponse,
@@ -328,6 +348,145 @@ const debugHardReset = async(): Promise<LoadResponse> => {
return await fetchJson<LoadResponse>("/debug/hard-reset", { method: "POST" });
};
/**
* Challenges a goddess boss.
* @param body - The goddess boss challenge request payload.
* @returns The goddess boss challenge response data.
*/
const challengeGoddessBoss = async(
body: GoddessBossChallengeRequest,
): Promise<GoddessBossChallengeResponse> => {
return await fetchJson<GoddessBossChallengeResponse>("/goddess/boss", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Triggers a consecration reset on the server.
* @param body - The consecration request payload.
* @returns The consecration response data.
*/
const consecrate = async(
body: ConsecrationRequest,
): Promise<ConsecrationResponse> => {
return await fetchJson<ConsecrationResponse>("/consecration", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Purchases a consecration upgrade on the server.
* @param body - The buy consecration upgrade request payload.
* @returns The buy consecration upgrade response data.
*/
const buyConsecrationUpgrade = async(
body: BuyConsecrationUpgradeRequest,
): Promise<BuyConsecrationUpgradeResponse> => {
return await fetchJson<BuyConsecrationUpgradeResponse>(
"/consecration/buy-upgrade",
{ body: JSON.stringify(body), method: "POST" },
);
};
/**
* Triggers an enlightenment reset on the server.
* @param body - The enlightenment request payload.
* @returns The enlightenment response data.
*/
const enlighten = async(
body: EnlightenmentRequest,
): Promise<EnlightenmentResponse> => {
return await fetchJson<EnlightenmentResponse>("/enlightenment", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Purchases an enlightenment upgrade on the server.
* @param body - The buy enlightenment upgrade request payload.
* @returns The buy enlightenment upgrade response data.
*/
const buyEnlightenmentUpgrade = async(
body: BuyEnlightenmentUpgradeRequest,
): Promise<BuyEnlightenmentUpgradeResponse> => {
return await fetchJson<BuyEnlightenmentUpgradeResponse>(
"/enlightenment/buy-upgrade",
{ body: JSON.stringify(body), method: "POST" },
);
};
/**
* Purchases a goddess upgrade on the server.
* @param body - The buy goddess upgrade request payload.
* @returns The buy goddess upgrade response data.
*/
const buyGoddessUpgrade = async(
body: BuyGoddessUpgradeRequest,
): Promise<BuyGoddessUpgradeResponse> => {
return await fetchJson<BuyGoddessUpgradeResponse>("/goddess/upgrade", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Crafts a goddess recipe on the server.
* @param body - The goddess craft request payload.
* @returns The goddess craft response data.
*/
const craftGoddessRecipe = async(
body: GoddessCraftRequest,
): Promise<GoddessCraftResponse> => {
return await fetchJson<GoddessCraftResponse>("/goddess/craft", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Starts a goddess exploration in a given area.
* @param body - The goddess exploration start request payload.
* @returns The goddess exploration start response data.
*/
const startGoddessExploration = async(
body: GoddessExploreStartRequest,
): Promise<GoddessExploreStartResponse> => {
return await fetchJson<GoddessExploreStartResponse>("/goddess/explore", {
body: JSON.stringify(body),
method: "POST",
});
};
/**
* Collects the rewards from a completed goddess exploration.
* @param body - The goddess exploration collect request payload.
* @returns The goddess exploration collect response data.
*/
const collectGoddessExploration = async(
body: GoddessExploreCollectRequest,
): Promise<GoddessExploreCollectResponse> => {
return await fetchJson<GoddessExploreCollectResponse>("/goddess/explore", {
body: JSON.stringify(body),
method: "PUT",
});
};
/**
* Checks whether a given goddess exploration area is ready to claim on the server.
* @param areaId - The area ID to check.
* @returns Whether the goddess exploration is claimable.
*/
const checkGoddessExplorationClaimable = async(
areaId: string,
): Promise<GoddessExploreClaimableResponse> => {
return await fetchJson<GoddessExploreClaimableResponse>(
`/goddess/explore/claimable?areaId=${encodeURIComponent(areaId)}`,
);
};
/**
* Fetches a public player profile by Discord ID.
* @param discordId - The Discord ID of the player to look up.
@@ -356,13 +515,22 @@ const updateProfile = async(
export {
ValidationError,
achieveApotheosis,
buyConsecrationUpgrade,
buyEchoUpgrade,
buyEnlightenmentUpgrade,
buyGoddessUpgrade,
buyPrestigeUpgrade,
challengeBoss,
challengeGoddessBoss,
checkExplorationClaimable,
checkGoddessExplorationClaimable,
collectExploration,
collectGoddessExploration,
consecrate,
craftGoddessRecipe,
craftRecipe,
debugHardReset,
enlighten,
forceUnlocks,
syncNewContent,
getAbout,
@@ -374,6 +542,7 @@ export {
resetProgress,
saveGame,
startExploration,
startGoddessExploration,
transcend,
updateProfile,
};