clibuddy 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/adventure/adventureUI.d.ts +24 -0
- package/dist/adventure/adventureUI.js +290 -0
- package/dist/adventure/adventures.d.ts +4 -0
- package/dist/adventure/adventures.js +206 -0
- package/dist/adventure/biomes.d.ts +30 -0
- package/dist/adventure/biomes.js +80 -0
- package/dist/adventure/combat/combat.d.ts +14 -0
- package/dist/adventure/combat/combat.js +638 -0
- package/dist/adventure/combat/combatUI.d.ts +5 -0
- package/dist/adventure/combat/combatUI.js +116 -0
- package/dist/adventure/combat/conditions.d.ts +20 -0
- package/dist/adventure/combat/conditions.js +111 -0
- package/dist/adventure/combat/enemies.d.ts +4 -0
- package/dist/adventure/combat/enemies.js +430 -0
- package/dist/adventure/combat/gear.d.ts +3 -0
- package/dist/adventure/combat/gear.js +199 -0
- package/dist/adventure/combat/skills.d.ts +6 -0
- package/dist/adventure/combat/skills.js +197 -0
- package/dist/adventure/combat.d.ts +31 -0
- package/dist/adventure/combat.js +732 -0
- package/dist/adventure/combatUI.d.ts +5 -0
- package/dist/adventure/combatUI.js +116 -0
- package/dist/adventure/endless.d.ts +18 -0
- package/dist/adventure/endless.js +154 -0
- package/dist/adventure/enemies.d.ts +4 -0
- package/dist/adventure/enemies.js +320 -0
- package/dist/adventure/engine.d.ts +20 -0
- package/dist/adventure/engine.js +137 -0
- package/dist/adventure/gear.d.ts +3 -0
- package/dist/adventure/gear.js +149 -0
- package/dist/adventure/generation/biomes.d.ts +30 -0
- package/dist/adventure/generation/biomes.js +102 -0
- package/dist/adventure/generation/endless.d.ts +18 -0
- package/dist/adventure/generation/endless.js +154 -0
- package/dist/adventure/generation/generator.d.ts +9 -0
- package/dist/adventure/generation/generator.js +245 -0
- package/dist/adventure/generation/templates.d.ts +25 -0
- package/dist/adventure/generation/templates.js +228 -0
- package/dist/adventure/generator.d.ts +9 -0
- package/dist/adventure/generator.js +245 -0
- package/dist/adventure/skills.d.ts +6 -0
- package/dist/adventure/skills.js +197 -0
- package/dist/adventure/templates.d.ts +25 -0
- package/dist/adventure/templates.js +228 -0
- package/dist/adventure/types.d.ts +236 -0
- package/dist/adventure/types.js +97 -0
- package/dist/app/state.d.ts +49 -0
- package/dist/app/state.js +51 -0
- package/dist/buddy/activities.d.ts +16 -0
- package/dist/buddy/activities.js +90 -0
- package/dist/buddy/decay.d.ts +3 -0
- package/dist/buddy/decay.js +45 -0
- package/dist/buddy/leveling.d.ts +11 -0
- package/dist/buddy/leveling.js +25 -0
- package/dist/buddy/roll.d.ts +4 -0
- package/dist/buddy/roll.js +61 -0
- package/dist/buddy/species.d.ts +4 -0
- package/dist/buddy/species.js +592 -0
- package/dist/buddy/titles.d.ts +17 -0
- package/dist/buddy/titles.js +89 -0
- package/dist/buddy/types.d.ts +92 -0
- package/dist/buddy/types.js +21 -0
- package/dist/commands/actions.d.ts +2 -0
- package/dist/commands/actions.js +141 -0
- package/dist/commands/admin.d.ts +2 -0
- package/dist/commands/admin.js +202 -0
- package/dist/commands/registry.d.ts +25 -0
- package/dist/commands/registry.js +31 -0
- package/dist/commands/social.d.ts +2 -0
- package/dist/commands/social.js +92 -0
- package/dist/dialogue/engine.d.ts +7 -0
- package/dist/dialogue/engine.js +68 -0
- package/dist/dialogue/lines.d.ts +26 -0
- package/dist/dialogue/lines.js +294 -0
- package/dist/events/engine.d.ts +20 -0
- package/dist/events/engine.js +51 -0
- package/dist/events/events.d.ts +13 -0
- package/dist/events/events.js +149 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +1665 -0
- package/dist/inventory/finding.d.ts +11 -0
- package/dist/inventory/finding.js +99 -0
- package/dist/inventory/items.d.ts +31 -0
- package/dist/inventory/items.js +63 -0
- package/dist/minigames/copycat.d.ts +2 -0
- package/dist/minigames/copycat.js +153 -0
- package/dist/minigames/fetch.d.ts +2 -0
- package/dist/minigames/fetch.js +179 -0
- package/dist/minigames/moodmatch.d.ts +2 -0
- package/dist/minigames/moodmatch.js +144 -0
- package/dist/minigames/quickpaws.d.ts +2 -0
- package/dist/minigames/quickpaws.js +142 -0
- package/dist/minigames/registry.d.ts +5 -0
- package/dist/minigames/registry.js +16 -0
- package/dist/minigames/rpsplus.d.ts +2 -0
- package/dist/minigames/rpsplus.js +168 -0
- package/dist/minigames/treasurehunt.d.ts +2 -0
- package/dist/minigames/treasurehunt.js +146 -0
- package/dist/minigames/types.d.ts +30 -0
- package/dist/minigames/types.js +69 -0
- package/dist/rendering/commandPalette.d.ts +16 -0
- package/dist/rendering/commandPalette.js +77 -0
- package/dist/rendering/display.d.ts +9 -0
- package/dist/rendering/display.js +231 -0
- package/dist/rendering/inventoryUI.d.ts +14 -0
- package/dist/rendering/inventoryUI.js +99 -0
- package/dist/rendering/items.d.ts +7 -0
- package/dist/rendering/items.js +34 -0
- package/dist/rendering/listUtils.d.ts +3 -0
- package/dist/rendering/listUtils.js +24 -0
- package/dist/rendering/minigameUI.d.ts +11 -0
- package/dist/rendering/minigameUI.js +37 -0
- package/dist/rendering/overlayUI.d.ts +24 -0
- package/dist/rendering/overlayUI.js +184 -0
- package/dist/rendering/scene.d.ts +8 -0
- package/dist/rendering/scene.js +87 -0
- package/dist/rendering/screen.d.ts +43 -0
- package/dist/rendering/screen.js +97 -0
- package/dist/sound/sound.d.ts +11 -0
- package/dist/sound/sound.js +55 -0
- package/dist/state/save.d.ts +5 -0
- package/dist/state/save.js +100 -0
- package/dist/state/settings.d.ts +7 -0
- package/dist/state/settings.js +81 -0
- package/dist/story/mainStory.d.ts +4 -0
- package/dist/story/mainStory.js +3111 -0
- package/dist/story/npcs.d.ts +17 -0
- package/dist/story/npcs.js +137 -0
- package/dist/story/progress.d.ts +26 -0
- package/dist/story/progress.js +168 -0
- package/dist/story/seasonal.d.ts +6 -0
- package/dist/story/seasonal.js +96 -0
- package/dist/story/shop.d.ts +7 -0
- package/dist/story/shop.js +26 -0
- package/dist/story/sideQuests.d.ts +4 -0
- package/dist/story/sideQuests.js +151 -0
- package/dist/story/types.d.ts +61 -0
- package/dist/story/types.js +36 -0
- package/dist/updates.d.ts +23 -0
- package/dist/updates.js +142 -0
- package/package.json +53 -0
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.startActivity = startActivity;
|
|
4
|
+
exports.applyActivityProgress = applyActivityProgress;
|
|
5
|
+
exports.isActivityBlocked = isActivityBlocked;
|
|
6
|
+
exports.activityTimeRemaining = activityTimeRemaining;
|
|
7
|
+
exports.formatTimeRemaining = formatTimeRemaining;
|
|
8
|
+
const leveling_1 = require("./leveling");
|
|
9
|
+
const ACTIVITY_DEFS = {
|
|
10
|
+
sleeping: { durationMs: 120_000, statDeltas: { energy: 30 }, xpReward: 0 },
|
|
11
|
+
eating: { durationMs: 10_000, statDeltas: { hunger: 25 }, xpReward: 5 },
|
|
12
|
+
playing: { durationMs: 15_000, statDeltas: { happiness: 20, energy: -15 }, xpReward: 10 },
|
|
13
|
+
};
|
|
14
|
+
function clamp(value, min, max) {
|
|
15
|
+
return Math.max(min, Math.min(max, value));
|
|
16
|
+
}
|
|
17
|
+
/** Build an ActivityState for the given activity type based on current stats */
|
|
18
|
+
/** Build an ActivityState. Pass statOverrides to use custom stat deltas (e.g. from inventory items). */
|
|
19
|
+
function startActivity(state, type, statOverrides) {
|
|
20
|
+
const def = ACTIVITY_DEFS[type];
|
|
21
|
+
const deltas = statOverrides ?? def.statDeltas;
|
|
22
|
+
const baseline = {};
|
|
23
|
+
const target = {};
|
|
24
|
+
for (const [key, delta] of Object.entries(deltas)) {
|
|
25
|
+
baseline[key] = state.stats[key];
|
|
26
|
+
target[key] = clamp(state.stats[key] + delta, 0, 100);
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
type,
|
|
30
|
+
startedAt: Date.now(),
|
|
31
|
+
durationMs: def.durationMs,
|
|
32
|
+
statBaseline: baseline,
|
|
33
|
+
statTarget: target,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Apply activity progress using linear interpolation.
|
|
38
|
+
* Returns updated state. Clears activity and awards XP when complete.
|
|
39
|
+
*/
|
|
40
|
+
function applyActivityProgress(state) {
|
|
41
|
+
if (!state.activity || state.activity.type === "idle")
|
|
42
|
+
return state;
|
|
43
|
+
const { activity } = state;
|
|
44
|
+
const elapsed = Date.now() - activity.startedAt;
|
|
45
|
+
const progress = clamp(elapsed / activity.durationMs, 0, 1);
|
|
46
|
+
// Interpolate stats
|
|
47
|
+
const stats = { ...state.stats };
|
|
48
|
+
for (const [key, baseVal] of Object.entries(activity.statBaseline)) {
|
|
49
|
+
const targetVal = activity.statTarget[key] ?? baseVal;
|
|
50
|
+
stats[key] = clamp(baseVal + (targetVal - baseVal) * progress, 0, 100);
|
|
51
|
+
}
|
|
52
|
+
// Activity complete
|
|
53
|
+
if (progress >= 1) {
|
|
54
|
+
const def = ACTIVITY_DEFS[activity.type];
|
|
55
|
+
let completed = {
|
|
56
|
+
...state,
|
|
57
|
+
stats,
|
|
58
|
+
xp: state.xp + (def?.xpReward ?? 0),
|
|
59
|
+
activity: undefined,
|
|
60
|
+
};
|
|
61
|
+
// Check for level-up from activity XP
|
|
62
|
+
const { state: leveled } = (0, leveling_1.checkLevelUp)(completed);
|
|
63
|
+
return leveled;
|
|
64
|
+
}
|
|
65
|
+
return { ...state, stats };
|
|
66
|
+
}
|
|
67
|
+
/** Check if the current activity blocks a new action */
|
|
68
|
+
function isActivityBlocked(currentActivity, attempted) {
|
|
69
|
+
const current = currentActivity ?? "idle";
|
|
70
|
+
if (current === "idle")
|
|
71
|
+
return false;
|
|
72
|
+
// Any active activity blocks new activities
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
/** Returns seconds remaining for the current activity */
|
|
76
|
+
function activityTimeRemaining(activity) {
|
|
77
|
+
const elapsed = Date.now() - activity.startedAt;
|
|
78
|
+
return Math.max(0, Math.ceil((activity.durationMs - elapsed) / 1000));
|
|
79
|
+
}
|
|
80
|
+
/** Format remaining time as "1:42" or "8s" */
|
|
81
|
+
function formatTimeRemaining(activity) {
|
|
82
|
+
const seconds = activityTimeRemaining(activity);
|
|
83
|
+
if (seconds >= 60) {
|
|
84
|
+
const m = Math.floor(seconds / 60);
|
|
85
|
+
const s = seconds % 60;
|
|
86
|
+
return `${m}:${s.toString().padStart(2, "0")}`;
|
|
87
|
+
}
|
|
88
|
+
return `${seconds}s`;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=activities.js.map
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyDecay = applyDecay;
|
|
4
|
+
/** Stat decay per hour of real time */
|
|
5
|
+
const DECAY_PER_HOUR = {
|
|
6
|
+
hunger: 3, // gets hungry slowly
|
|
7
|
+
happiness: 4, // gets bored faster
|
|
8
|
+
energy: 2, // rests slowly
|
|
9
|
+
health: 0, // health only decays when other stats are critically low
|
|
10
|
+
};
|
|
11
|
+
/** If hunger or happiness are below this, health starts decaying */
|
|
12
|
+
const CRITICAL_THRESHOLD = 20;
|
|
13
|
+
const HEALTH_DECAY_PER_HOUR = 5;
|
|
14
|
+
function applyDecay(state) {
|
|
15
|
+
if (!state.alive)
|
|
16
|
+
return state;
|
|
17
|
+
// Don't decay while buddy is doing an activity
|
|
18
|
+
if (state.activity && state.activity.type !== "idle")
|
|
19
|
+
return state;
|
|
20
|
+
const now = Date.now();
|
|
21
|
+
const hoursElapsed = (now - state.lastUpdated) / (1000 * 60 * 60);
|
|
22
|
+
if (hoursElapsed < 0.01)
|
|
23
|
+
return state; // less than ~36 seconds, skip
|
|
24
|
+
const stats = { ...state.stats };
|
|
25
|
+
// Apply base decay
|
|
26
|
+
stats.hunger = Math.max(0, stats.hunger - DECAY_PER_HOUR.hunger * hoursElapsed);
|
|
27
|
+
stats.happiness = Math.max(0, stats.happiness - DECAY_PER_HOUR.happiness * hoursElapsed);
|
|
28
|
+
stats.energy = Math.max(0, stats.energy - DECAY_PER_HOUR.energy * hoursElapsed);
|
|
29
|
+
// Health decays if other stats are critical
|
|
30
|
+
if (stats.hunger < CRITICAL_THRESHOLD || stats.happiness < CRITICAL_THRESHOLD) {
|
|
31
|
+
stats.health = Math.max(0, stats.health - HEALTH_DECAY_PER_HOUR * hoursElapsed);
|
|
32
|
+
}
|
|
33
|
+
// Calculate age in hours
|
|
34
|
+
const age = (now - state.createdAt) / (1000 * 60 * 60);
|
|
35
|
+
// Check for death
|
|
36
|
+
const alive = stats.health > 0;
|
|
37
|
+
return {
|
|
38
|
+
...state,
|
|
39
|
+
stats,
|
|
40
|
+
age,
|
|
41
|
+
alive,
|
|
42
|
+
lastUpdated: now,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=decay.js.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BuddyState } from "./types";
|
|
2
|
+
export declare function xpForLevel(level: number): number;
|
|
3
|
+
/**
|
|
4
|
+
* Check and apply level-up if XP threshold is met.
|
|
5
|
+
* Can level up multiple times if enough XP accumulated.
|
|
6
|
+
*/
|
|
7
|
+
export declare function checkLevelUp(state: BuddyState): {
|
|
8
|
+
state: BuddyState;
|
|
9
|
+
levelsGained: number;
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=leveling.d.ts.map
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.xpForLevel = xpForLevel;
|
|
4
|
+
exports.checkLevelUp = checkLevelUp;
|
|
5
|
+
function xpForLevel(level) {
|
|
6
|
+
return level * 50;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Check and apply level-up if XP threshold is met.
|
|
10
|
+
* Can level up multiple times if enough XP accumulated.
|
|
11
|
+
*/
|
|
12
|
+
function checkLevelUp(state) {
|
|
13
|
+
let levelsGained = 0;
|
|
14
|
+
let current = state;
|
|
15
|
+
while (current.xp >= xpForLevel(current.level)) {
|
|
16
|
+
current = {
|
|
17
|
+
...current,
|
|
18
|
+
xp: current.xp - xpForLevel(current.level),
|
|
19
|
+
level: current.level + 1,
|
|
20
|
+
};
|
|
21
|
+
levelsGained++;
|
|
22
|
+
}
|
|
23
|
+
return { state: current, levelsGained };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=leveling.js.map
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.rollBuddy = rollBuddy;
|
|
4
|
+
exports.createBuddyState = createBuddyState;
|
|
5
|
+
const species_1 = require("./species");
|
|
6
|
+
const types_1 = require("../story/types");
|
|
7
|
+
/** Rarity weights — higher = more likely to be rolled */
|
|
8
|
+
const RARITY_WEIGHTS = {
|
|
9
|
+
common: 50,
|
|
10
|
+
uncommon: 25,
|
|
11
|
+
rare: 15,
|
|
12
|
+
epic: 8,
|
|
13
|
+
legendary: 2,
|
|
14
|
+
};
|
|
15
|
+
function pickRarity() {
|
|
16
|
+
const entries = Object.entries(RARITY_WEIGHTS);
|
|
17
|
+
const totalWeight = entries.reduce((sum, [, w]) => sum + w, 0);
|
|
18
|
+
let roll = Math.random() * totalWeight;
|
|
19
|
+
for (const [rarity, weight] of entries) {
|
|
20
|
+
roll -= weight;
|
|
21
|
+
if (roll <= 0)
|
|
22
|
+
return rarity;
|
|
23
|
+
}
|
|
24
|
+
return "common";
|
|
25
|
+
}
|
|
26
|
+
function pickSpeciesOfRarity(rarity) {
|
|
27
|
+
const candidates = species_1.SPECIES.filter((s) => s.rarity === rarity);
|
|
28
|
+
return candidates[Math.floor(Math.random() * candidates.length)];
|
|
29
|
+
}
|
|
30
|
+
function rollBuddy() {
|
|
31
|
+
const rarity = pickRarity();
|
|
32
|
+
return pickSpeciesOfRarity(rarity);
|
|
33
|
+
}
|
|
34
|
+
function createBuddyState(species, name) {
|
|
35
|
+
return {
|
|
36
|
+
name,
|
|
37
|
+
speciesId: species.id,
|
|
38
|
+
stats: {
|
|
39
|
+
hunger: 80,
|
|
40
|
+
happiness: 80,
|
|
41
|
+
health: 100,
|
|
42
|
+
energy: 100,
|
|
43
|
+
},
|
|
44
|
+
xp: 0,
|
|
45
|
+
level: 1,
|
|
46
|
+
age: 0,
|
|
47
|
+
alive: true,
|
|
48
|
+
createdAt: Date.now(),
|
|
49
|
+
lastUpdated: Date.now(),
|
|
50
|
+
titles: [],
|
|
51
|
+
actionCounts: { feeds: 0, plays: 0, sleeps: 0, heals: 0, revives: 0, pets: 0, minigamesWon: 0, itemsFound: 0, combosTriggered: 0 },
|
|
52
|
+
inventory: [],
|
|
53
|
+
notifications: [],
|
|
54
|
+
adventureStats: {
|
|
55
|
+
adventuresCompleted: 0, battlesWon: 0, battlesLost: 0,
|
|
56
|
+
battlesFled: 0, bossesDefeated: 0, totalDamageDealt: 0, perfectAdventures: 0,
|
|
57
|
+
},
|
|
58
|
+
questProgress: (0, types_1.createDefaultQuestProgress)(),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=roll.js.map
|