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.
Files changed (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/adventure/adventureUI.d.ts +24 -0
  4. package/dist/adventure/adventureUI.js +290 -0
  5. package/dist/adventure/adventures.d.ts +4 -0
  6. package/dist/adventure/adventures.js +206 -0
  7. package/dist/adventure/biomes.d.ts +30 -0
  8. package/dist/adventure/biomes.js +80 -0
  9. package/dist/adventure/combat/combat.d.ts +14 -0
  10. package/dist/adventure/combat/combat.js +638 -0
  11. package/dist/adventure/combat/combatUI.d.ts +5 -0
  12. package/dist/adventure/combat/combatUI.js +116 -0
  13. package/dist/adventure/combat/conditions.d.ts +20 -0
  14. package/dist/adventure/combat/conditions.js +111 -0
  15. package/dist/adventure/combat/enemies.d.ts +4 -0
  16. package/dist/adventure/combat/enemies.js +430 -0
  17. package/dist/adventure/combat/gear.d.ts +3 -0
  18. package/dist/adventure/combat/gear.js +199 -0
  19. package/dist/adventure/combat/skills.d.ts +6 -0
  20. package/dist/adventure/combat/skills.js +197 -0
  21. package/dist/adventure/combat.d.ts +31 -0
  22. package/dist/adventure/combat.js +732 -0
  23. package/dist/adventure/combatUI.d.ts +5 -0
  24. package/dist/adventure/combatUI.js +116 -0
  25. package/dist/adventure/endless.d.ts +18 -0
  26. package/dist/adventure/endless.js +154 -0
  27. package/dist/adventure/enemies.d.ts +4 -0
  28. package/dist/adventure/enemies.js +320 -0
  29. package/dist/adventure/engine.d.ts +20 -0
  30. package/dist/adventure/engine.js +137 -0
  31. package/dist/adventure/gear.d.ts +3 -0
  32. package/dist/adventure/gear.js +149 -0
  33. package/dist/adventure/generation/biomes.d.ts +30 -0
  34. package/dist/adventure/generation/biomes.js +102 -0
  35. package/dist/adventure/generation/endless.d.ts +18 -0
  36. package/dist/adventure/generation/endless.js +154 -0
  37. package/dist/adventure/generation/generator.d.ts +9 -0
  38. package/dist/adventure/generation/generator.js +245 -0
  39. package/dist/adventure/generation/templates.d.ts +25 -0
  40. package/dist/adventure/generation/templates.js +228 -0
  41. package/dist/adventure/generator.d.ts +9 -0
  42. package/dist/adventure/generator.js +245 -0
  43. package/dist/adventure/skills.d.ts +6 -0
  44. package/dist/adventure/skills.js +197 -0
  45. package/dist/adventure/templates.d.ts +25 -0
  46. package/dist/adventure/templates.js +228 -0
  47. package/dist/adventure/types.d.ts +236 -0
  48. package/dist/adventure/types.js +97 -0
  49. package/dist/app/state.d.ts +49 -0
  50. package/dist/app/state.js +51 -0
  51. package/dist/buddy/activities.d.ts +16 -0
  52. package/dist/buddy/activities.js +90 -0
  53. package/dist/buddy/decay.d.ts +3 -0
  54. package/dist/buddy/decay.js +45 -0
  55. package/dist/buddy/leveling.d.ts +11 -0
  56. package/dist/buddy/leveling.js +25 -0
  57. package/dist/buddy/roll.d.ts +4 -0
  58. package/dist/buddy/roll.js +61 -0
  59. package/dist/buddy/species.d.ts +4 -0
  60. package/dist/buddy/species.js +592 -0
  61. package/dist/buddy/titles.d.ts +17 -0
  62. package/dist/buddy/titles.js +89 -0
  63. package/dist/buddy/types.d.ts +92 -0
  64. package/dist/buddy/types.js +21 -0
  65. package/dist/commands/actions.d.ts +2 -0
  66. package/dist/commands/actions.js +141 -0
  67. package/dist/commands/admin.d.ts +2 -0
  68. package/dist/commands/admin.js +202 -0
  69. package/dist/commands/registry.d.ts +25 -0
  70. package/dist/commands/registry.js +31 -0
  71. package/dist/commands/social.d.ts +2 -0
  72. package/dist/commands/social.js +92 -0
  73. package/dist/dialogue/engine.d.ts +7 -0
  74. package/dist/dialogue/engine.js +68 -0
  75. package/dist/dialogue/lines.d.ts +26 -0
  76. package/dist/dialogue/lines.js +294 -0
  77. package/dist/events/engine.d.ts +20 -0
  78. package/dist/events/engine.js +51 -0
  79. package/dist/events/events.d.ts +13 -0
  80. package/dist/events/events.js +149 -0
  81. package/dist/index.d.ts +10 -0
  82. package/dist/index.js +1665 -0
  83. package/dist/inventory/finding.d.ts +11 -0
  84. package/dist/inventory/finding.js +99 -0
  85. package/dist/inventory/items.d.ts +31 -0
  86. package/dist/inventory/items.js +63 -0
  87. package/dist/minigames/copycat.d.ts +2 -0
  88. package/dist/minigames/copycat.js +153 -0
  89. package/dist/minigames/fetch.d.ts +2 -0
  90. package/dist/minigames/fetch.js +179 -0
  91. package/dist/minigames/moodmatch.d.ts +2 -0
  92. package/dist/minigames/moodmatch.js +144 -0
  93. package/dist/minigames/quickpaws.d.ts +2 -0
  94. package/dist/minigames/quickpaws.js +142 -0
  95. package/dist/minigames/registry.d.ts +5 -0
  96. package/dist/minigames/registry.js +16 -0
  97. package/dist/minigames/rpsplus.d.ts +2 -0
  98. package/dist/minigames/rpsplus.js +168 -0
  99. package/dist/minigames/treasurehunt.d.ts +2 -0
  100. package/dist/minigames/treasurehunt.js +146 -0
  101. package/dist/minigames/types.d.ts +30 -0
  102. package/dist/minigames/types.js +69 -0
  103. package/dist/rendering/commandPalette.d.ts +16 -0
  104. package/dist/rendering/commandPalette.js +77 -0
  105. package/dist/rendering/display.d.ts +9 -0
  106. package/dist/rendering/display.js +231 -0
  107. package/dist/rendering/inventoryUI.d.ts +14 -0
  108. package/dist/rendering/inventoryUI.js +99 -0
  109. package/dist/rendering/items.d.ts +7 -0
  110. package/dist/rendering/items.js +34 -0
  111. package/dist/rendering/listUtils.d.ts +3 -0
  112. package/dist/rendering/listUtils.js +24 -0
  113. package/dist/rendering/minigameUI.d.ts +11 -0
  114. package/dist/rendering/minigameUI.js +37 -0
  115. package/dist/rendering/overlayUI.d.ts +24 -0
  116. package/dist/rendering/overlayUI.js +184 -0
  117. package/dist/rendering/scene.d.ts +8 -0
  118. package/dist/rendering/scene.js +87 -0
  119. package/dist/rendering/screen.d.ts +43 -0
  120. package/dist/rendering/screen.js +97 -0
  121. package/dist/sound/sound.d.ts +11 -0
  122. package/dist/sound/sound.js +55 -0
  123. package/dist/state/save.d.ts +5 -0
  124. package/dist/state/save.js +100 -0
  125. package/dist/state/settings.d.ts +7 -0
  126. package/dist/state/settings.js +81 -0
  127. package/dist/story/mainStory.d.ts +4 -0
  128. package/dist/story/mainStory.js +3111 -0
  129. package/dist/story/npcs.d.ts +17 -0
  130. package/dist/story/npcs.js +137 -0
  131. package/dist/story/progress.d.ts +26 -0
  132. package/dist/story/progress.js +168 -0
  133. package/dist/story/seasonal.d.ts +6 -0
  134. package/dist/story/seasonal.js +96 -0
  135. package/dist/story/shop.d.ts +7 -0
  136. package/dist/story/shop.js +26 -0
  137. package/dist/story/sideQuests.d.ts +4 -0
  138. package/dist/story/sideQuests.js +151 -0
  139. package/dist/story/types.d.ts +61 -0
  140. package/dist/story/types.js +36 -0
  141. package/dist/updates.d.ts +23 -0
  142. package/dist/updates.js +142 -0
  143. 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,3 @@
1
+ import { BuddyState } from "./types";
2
+ export declare function applyDecay(state: BuddyState): BuddyState;
3
+ //# sourceMappingURL=decay.d.ts.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,4 @@
1
+ import { BuddyState, BuddySpecies } from "./types";
2
+ export declare function rollBuddy(): BuddySpecies;
3
+ export declare function createBuddyState(species: BuddySpecies, name: string): BuddyState;
4
+ //# sourceMappingURL=roll.d.ts.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
@@ -0,0 +1,4 @@
1
+ import { BuddySpecies } from "./types";
2
+ export declare const SPECIES: BuddySpecies[];
3
+ export declare function getSpecies(id: string): BuddySpecies | undefined;
4
+ //# sourceMappingURL=species.d.ts.map