pet-terminal 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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +268 -0
  3. package/dist/commands/care.d.ts +3 -0
  4. package/dist/commands/care.d.ts.map +1 -0
  5. package/dist/commands/care.js +103 -0
  6. package/dist/commands/care.js.map +1 -0
  7. package/dist/commands/clean.d.ts +3 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +105 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/feed.d.ts +3 -0
  12. package/dist/commands/feed.d.ts.map +1 -0
  13. package/dist/commands/feed.js +106 -0
  14. package/dist/commands/feed.js.map +1 -0
  15. package/dist/commands/git.d.ts +3 -0
  16. package/dist/commands/git.d.ts.map +1 -0
  17. package/dist/commands/git.js +138 -0
  18. package/dist/commands/git.js.map +1 -0
  19. package/dist/commands/heal.d.ts +3 -0
  20. package/dist/commands/heal.d.ts.map +1 -0
  21. package/dist/commands/heal.js +106 -0
  22. package/dist/commands/heal.js.map +1 -0
  23. package/dist/commands/init.d.ts +3 -0
  24. package/dist/commands/init.d.ts.map +1 -0
  25. package/dist/commands/init.js +89 -0
  26. package/dist/commands/init.js.map +1 -0
  27. package/dist/commands/inventory.d.ts +3 -0
  28. package/dist/commands/inventory.d.ts.map +1 -0
  29. package/dist/commands/inventory.js +113 -0
  30. package/dist/commands/inventory.js.map +1 -0
  31. package/dist/commands/play.d.ts +3 -0
  32. package/dist/commands/play.d.ts.map +1 -0
  33. package/dist/commands/play.js +110 -0
  34. package/dist/commands/play.js.map +1 -0
  35. package/dist/commands/shop.d.ts +3 -0
  36. package/dist/commands/shop.d.ts.map +1 -0
  37. package/dist/commands/shop.js +197 -0
  38. package/dist/commands/shop.js.map +1 -0
  39. package/dist/commands/sleep.d.ts +3 -0
  40. package/dist/commands/sleep.d.ts.map +1 -0
  41. package/dist/commands/sleep.js +48 -0
  42. package/dist/commands/sleep.js.map +1 -0
  43. package/dist/commands/status.d.ts +3 -0
  44. package/dist/commands/status.d.ts.map +1 -0
  45. package/dist/commands/status.js +98 -0
  46. package/dist/commands/status.js.map +1 -0
  47. package/dist/commands/sync.d.ts +3 -0
  48. package/dist/commands/sync.d.ts.map +1 -0
  49. package/dist/commands/sync.js +66 -0
  50. package/dist/commands/sync.js.map +1 -0
  51. package/dist/commands/tutorial.d.ts +3 -0
  52. package/dist/commands/tutorial.d.ts.map +1 -0
  53. package/dist/commands/tutorial.js +210 -0
  54. package/dist/commands/tutorial.js.map +1 -0
  55. package/dist/core/auto-care.d.ts +63 -0
  56. package/dist/core/auto-care.d.ts.map +1 -0
  57. package/dist/core/auto-care.js +295 -0
  58. package/dist/core/auto-care.js.map +1 -0
  59. package/dist/core/config.d.ts +89 -0
  60. package/dist/core/config.d.ts.map +1 -0
  61. package/dist/core/config.js +195 -0
  62. package/dist/core/config.js.map +1 -0
  63. package/dist/core/database.d.ts +29 -0
  64. package/dist/core/database.d.ts.map +1 -0
  65. package/dist/core/database.js +81 -0
  66. package/dist/core/database.js.map +1 -0
  67. package/dist/core/inventory.d.ts +63 -0
  68. package/dist/core/inventory.d.ts.map +1 -0
  69. package/dist/core/inventory.js +140 -0
  70. package/dist/core/inventory.js.map +1 -0
  71. package/dist/core/level-system.d.ts +32 -0
  72. package/dist/core/level-system.d.ts.map +1 -0
  73. package/dist/core/level-system.js +76 -0
  74. package/dist/core/level-system.js.map +1 -0
  75. package/dist/core/pet.d.ts +123 -0
  76. package/dist/core/pet.d.ts.map +1 -0
  77. package/dist/core/pet.js +781 -0
  78. package/dist/core/pet.js.map +1 -0
  79. package/dist/core/shop.d.ts +93 -0
  80. package/dist/core/shop.d.ts.map +1 -0
  81. package/dist/core/shop.js +205 -0
  82. package/dist/core/shop.js.map +1 -0
  83. package/dist/core/time-decay.d.ts +30 -0
  84. package/dist/core/time-decay.d.ts.map +1 -0
  85. package/dist/core/time-decay.js +149 -0
  86. package/dist/core/time-decay.js.map +1 -0
  87. package/dist/core/welcome.d.ts +31 -0
  88. package/dist/core/welcome.d.ts.map +1 -0
  89. package/dist/core/welcome.js +180 -0
  90. package/dist/core/welcome.js.map +1 -0
  91. package/dist/index.d.ts +3 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +80 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/monitor/git-monitor.d.ts +90 -0
  96. package/dist/monitor/git-monitor.d.ts.map +1 -0
  97. package/dist/monitor/git-monitor.js +342 -0
  98. package/dist/monitor/git-monitor.js.map +1 -0
  99. package/dist/types/auto-care.d.ts +86 -0
  100. package/dist/types/auto-care.d.ts.map +1 -0
  101. package/dist/types/auto-care.js +15 -0
  102. package/dist/types/auto-care.js.map +1 -0
  103. package/dist/types/config.d.ts +42 -0
  104. package/dist/types/config.d.ts.map +1 -0
  105. package/dist/types/config.js +24 -0
  106. package/dist/types/config.js.map +1 -0
  107. package/dist/types/git.d.ts +68 -0
  108. package/dist/types/git.d.ts.map +1 -0
  109. package/dist/types/git.js +14 -0
  110. package/dist/types/git.js.map +1 -0
  111. package/dist/types/items.d.ts +41 -0
  112. package/dist/types/items.d.ts.map +1 -0
  113. package/dist/types/items.js +286 -0
  114. package/dist/types/items.js.map +1 -0
  115. package/dist/types/pet.d.ts +42 -0
  116. package/dist/types/pet.d.ts.map +1 -0
  117. package/dist/types/pet.js +16 -0
  118. package/dist/types/pet.js.map +1 -0
  119. package/dist/types/species.d.ts +30 -0
  120. package/dist/types/species.d.ts.map +1 -0
  121. package/dist/types/species.js +164 -0
  122. package/dist/types/species.js.map +1 -0
  123. package/dist/types/stats.d.ts +22 -0
  124. package/dist/types/stats.d.ts.map +1 -0
  125. package/dist/types/stats.js +18 -0
  126. package/dist/types/stats.js.map +1 -0
  127. package/dist/types/time.d.ts +30 -0
  128. package/dist/types/time.d.ts.map +1 -0
  129. package/dist/types/time.js +79 -0
  130. package/dist/types/time.js.map +1 -0
  131. package/dist/ui/ascii-art.d.ts +4 -0
  132. package/dist/ui/ascii-art.d.ts.map +1 -0
  133. package/dist/ui/ascii-art.js +170 -0
  134. package/dist/ui/ascii-art.js.map +1 -0
  135. package/dist/ui/display.d.ts +11 -0
  136. package/dist/ui/display.d.ts.map +1 -0
  137. package/dist/ui/display.js +93 -0
  138. package/dist/ui/display.js.map +1 -0
  139. package/dist/ui/help.d.ts +17 -0
  140. package/dist/ui/help.d.ts.map +1 -0
  141. package/dist/ui/help.js +280 -0
  142. package/dist/ui/help.js.map +1 -0
  143. package/dist/ui/progress-bar.d.ts +9 -0
  144. package/dist/ui/progress-bar.d.ts.map +1 -0
  145. package/dist/ui/progress-bar.js +57 -0
  146. package/dist/ui/progress-bar.js.map +1 -0
  147. package/package.json +61 -0
@@ -0,0 +1,89 @@
1
+ import { UserConfig, ConfigValidationResult } from '../types/config';
2
+ /**
3
+ * Configuration management for Pet Terminal
4
+ * Handles loading/saving user config from ~/.pet-terminal/config.json
5
+ */
6
+ export declare class Config {
7
+ private configPath;
8
+ private config;
9
+ constructor(configPath?: string);
10
+ /**
11
+ * Get the default config directory path
12
+ * ~/.pet-terminal/ on Unix/Mac
13
+ * %USERPROFILE%\.pet-terminal\ on Windows
14
+ */
15
+ private getDefaultConfigPath;
16
+ /**
17
+ * Load configuration from file
18
+ * Returns default config if file doesn't exist
19
+ */
20
+ load(): UserConfig;
21
+ /**
22
+ * Merge loaded config with defaults
23
+ */
24
+ private mergeWithDefaults;
25
+ /**
26
+ * Save configuration to file
27
+ */
28
+ save(config?: UserConfig): void;
29
+ /**
30
+ * Get current configuration
31
+ */
32
+ getConfig(): UserConfig;
33
+ /**
34
+ * Get decay rate multiplier
35
+ */
36
+ getDecayRate(): number;
37
+ /**
38
+ * Set decay rate multiplier
39
+ */
40
+ setDecayRate(rate: number): void;
41
+ /**
42
+ * Check if auto-care is enabled
43
+ */
44
+ isAutoCareEnabled(): boolean;
45
+ /**
46
+ * Set auto-care enabled state
47
+ */
48
+ setAutoCareEnabled(enabled: boolean): void;
49
+ /**
50
+ * Get auto-care thresholds
51
+ */
52
+ getAutoCareThresholds(): {
53
+ hunger: number;
54
+ happiness: number;
55
+ cleanliness: number;
56
+ energy: number;
57
+ health: number;
58
+ };
59
+ /**
60
+ * Set auto-care threshold
61
+ */
62
+ setAutoCareThreshold(stat: keyof UserConfig['autoCare']['thresholds'], value: number): void;
63
+ /**
64
+ * Get the config file path
65
+ */
66
+ getConfigPath(): string;
67
+ /**
68
+ * Reset config to defaults
69
+ */
70
+ resetToDefaults(): void;
71
+ /**
72
+ * Validate configuration values
73
+ */
74
+ validate(config: UserConfig): ConfigValidationResult;
75
+ /**
76
+ * Create default config file
77
+ * Returns true if file was created, false if it already exists
78
+ */
79
+ static createDefaultConfig(): boolean;
80
+ }
81
+ /**
82
+ * Get or create global config instance
83
+ */
84
+ export declare const getConfig: () => Config;
85
+ /**
86
+ * Reset global config instance (useful for testing)
87
+ */
88
+ export declare const resetGlobalConfig: () => void;
89
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAuB,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;;GAGG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAa;gBAEf,UAAU,CAAC,EAAE,MAAM;IAK/B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAK5B;;;OAGG;IACH,IAAI,IAAI,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAgBzB;;OAEG;IACH,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,IAAI;IAa/B;;OAEG;IACH,SAAS,IAAI,UAAU;IAIvB;;OAEG;IACH,YAAY,IAAI,MAAM;IAItB;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAMhC;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAK1C;;OAEG;IACH,qBAAqB;;;;;;;IAIrB;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAM3F;;OAEG;IACH,aAAa,IAAI,MAAM;IAIvB;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,sBAAsB;IAoBpD;;;OAGG;IACH,MAAM,CAAC,mBAAmB,IAAI,OAAO;CAWtC;AAOD;;GAEG;AACH,eAAO,MAAM,SAAS,QAAO,MAK5B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,iBAAiB,QAAO,IAEpC,CAAC"}
@@ -0,0 +1,195 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.resetGlobalConfig = exports.getConfig = exports.Config = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const os_1 = __importDefault(require("os"));
10
+ const config_1 = require("../types/config");
11
+ /**
12
+ * Configuration management for Pet Terminal
13
+ * Handles loading/saving user config from ~/.pet-terminal/config.json
14
+ */
15
+ class Config {
16
+ constructor(configPath) {
17
+ this.configPath = configPath || this.getDefaultConfigPath();
18
+ this.config = this.load();
19
+ }
20
+ /**
21
+ * Get the default config directory path
22
+ * ~/.pet-terminal/ on Unix/Mac
23
+ * %USERPROFILE%\.pet-terminal\ on Windows
24
+ */
25
+ getDefaultConfigPath() {
26
+ const configDir = path_1.default.join(os_1.default.homedir(), '.pet-terminal');
27
+ return path_1.default.join(configDir, 'config.json');
28
+ }
29
+ /**
30
+ * Load configuration from file
31
+ * Returns default config if file doesn't exist
32
+ */
33
+ load() {
34
+ // If config file doesn't exist, return defaults
35
+ if (!fs_1.default.existsSync(this.configPath)) {
36
+ return { ...config_1.DEFAULT_USER_CONFIG };
37
+ }
38
+ try {
39
+ const fileContent = fs_1.default.readFileSync(this.configPath, 'utf-8');
40
+ const loadedConfig = JSON.parse(fileContent);
41
+ // Merge with defaults to ensure all fields exist
42
+ return this.mergeWithDefaults(loadedConfig);
43
+ }
44
+ catch (error) {
45
+ // If parsing fails, return defaults
46
+ return { ...config_1.DEFAULT_USER_CONFIG };
47
+ }
48
+ }
49
+ /**
50
+ * Merge loaded config with defaults
51
+ */
52
+ mergeWithDefaults(partial) {
53
+ return {
54
+ decayRate: partial.decayRate ?? config_1.DEFAULT_USER_CONFIG.decayRate,
55
+ autoCare: {
56
+ enabled: partial.autoCare?.enabled ?? config_1.DEFAULT_USER_CONFIG.autoCare.enabled,
57
+ thresholds: {
58
+ hunger: partial.autoCare?.thresholds?.hunger ?? config_1.DEFAULT_USER_CONFIG.autoCare.thresholds.hunger,
59
+ happiness: partial.autoCare?.thresholds?.happiness ?? config_1.DEFAULT_USER_CONFIG.autoCare.thresholds.happiness,
60
+ cleanliness: partial.autoCare?.thresholds?.cleanliness ?? config_1.DEFAULT_USER_CONFIG.autoCare.thresholds.cleanliness,
61
+ energy: partial.autoCare?.thresholds?.energy ?? config_1.DEFAULT_USER_CONFIG.autoCare.thresholds.energy,
62
+ health: partial.autoCare?.thresholds?.health ?? config_1.DEFAULT_USER_CONFIG.autoCare.thresholds.health,
63
+ },
64
+ },
65
+ };
66
+ }
67
+ /**
68
+ * Save configuration to file
69
+ */
70
+ save(config) {
71
+ const configToSave = config || this.config;
72
+ // Ensure config directory exists
73
+ const configDir = path_1.default.dirname(this.configPath);
74
+ if (!fs_1.default.existsSync(configDir)) {
75
+ fs_1.default.mkdirSync(configDir, { recursive: true });
76
+ }
77
+ fs_1.default.writeFileSync(this.configPath, JSON.stringify(configToSave, null, 2), 'utf-8');
78
+ this.config = configToSave;
79
+ }
80
+ /**
81
+ * Get current configuration
82
+ */
83
+ getConfig() {
84
+ return { ...this.config };
85
+ }
86
+ /**
87
+ * Get decay rate multiplier
88
+ */
89
+ getDecayRate() {
90
+ return this.config.decayRate;
91
+ }
92
+ /**
93
+ * Set decay rate multiplier
94
+ */
95
+ setDecayRate(rate) {
96
+ // Clamp between 0.1 and 5.0
97
+ this.config.decayRate = Math.max(0.1, Math.min(5.0, rate));
98
+ this.save();
99
+ }
100
+ /**
101
+ * Check if auto-care is enabled
102
+ */
103
+ isAutoCareEnabled() {
104
+ return this.config.autoCare.enabled;
105
+ }
106
+ /**
107
+ * Set auto-care enabled state
108
+ */
109
+ setAutoCareEnabled(enabled) {
110
+ this.config.autoCare.enabled = enabled;
111
+ this.save();
112
+ }
113
+ /**
114
+ * Get auto-care thresholds
115
+ */
116
+ getAutoCareThresholds() {
117
+ return { ...this.config.autoCare.thresholds };
118
+ }
119
+ /**
120
+ * Set auto-care threshold
121
+ */
122
+ setAutoCareThreshold(stat, value) {
123
+ // Clamp between 0 and 100
124
+ this.config.autoCare.thresholds[stat] = Math.max(0, Math.min(100, value));
125
+ this.save();
126
+ }
127
+ /**
128
+ * Get the config file path
129
+ */
130
+ getConfigPath() {
131
+ return this.configPath;
132
+ }
133
+ /**
134
+ * Reset config to defaults
135
+ */
136
+ resetToDefaults() {
137
+ this.config = { ...config_1.DEFAULT_USER_CONFIG };
138
+ this.save();
139
+ }
140
+ /**
141
+ * Validate configuration values
142
+ */
143
+ validate(config) {
144
+ const errors = [];
145
+ if (config.decayRate < 0.1 || config.decayRate > 5.0) {
146
+ errors.push('decayRate must be between 0.1 and 5.0');
147
+ }
148
+ const thresholds = config.autoCare.thresholds;
149
+ for (const [key, value] of Object.entries(thresholds)) {
150
+ if (value < 0 || value > 100) {
151
+ errors.push(`${key} threshold must be between 0 and 100`);
152
+ }
153
+ }
154
+ return {
155
+ valid: errors.length === 0,
156
+ errors,
157
+ };
158
+ }
159
+ /**
160
+ * Create default config file
161
+ * Returns true if file was created, false if it already exists
162
+ */
163
+ static createDefaultConfig() {
164
+ const config = new Config();
165
+ const configPath = config.getConfigPath();
166
+ if (fs_1.default.existsSync(configPath)) {
167
+ return false;
168
+ }
169
+ config.save();
170
+ return true;
171
+ }
172
+ }
173
+ exports.Config = Config;
174
+ /**
175
+ * Global config instance
176
+ */
177
+ let globalConfig = null;
178
+ /**
179
+ * Get or create global config instance
180
+ */
181
+ const getConfig = () => {
182
+ if (!globalConfig) {
183
+ globalConfig = new Config();
184
+ }
185
+ return globalConfig;
186
+ };
187
+ exports.getConfig = getConfig;
188
+ /**
189
+ * Reset global config instance (useful for testing)
190
+ */
191
+ const resetGlobalConfig = () => {
192
+ globalConfig = null;
193
+ };
194
+ exports.resetGlobalConfig = resetGlobalConfig;
195
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { PetData } from '../types/pet';
2
+ export declare class Database {
3
+ private db;
4
+ constructor(dbPath?: string);
5
+ private writeDefaultSchema;
6
+ hasPet(): boolean;
7
+ getPet(): PetData | null;
8
+ savePet(pet: PetData): void;
9
+ deletePet(): void;
10
+ getLastSaveTime(): Date;
11
+ getSettings(): {
12
+ created: string;
13
+ version: string;
14
+ onboarded?: boolean;
15
+ };
16
+ /**
17
+ * Check if this is the first run (user hasn't been onboarded yet)
18
+ */
19
+ isFirstRun(): boolean;
20
+ /**
21
+ * Mark the onboarding as complete
22
+ */
23
+ markOnboardedComplete(): void;
24
+ /**
25
+ * Reset onboarding (for testing or re-running tutorial)
26
+ */
27
+ resetOnboarding(): void;
28
+ }
29
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"AAIA,OAAO,EAAkB,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvD,qBAAa,QAAQ;IACnB,OAAO,CAAC,EAAE,CAA4B;gBAE1B,MAAM,GAAE,MAAqD;IAgBzE,OAAO,CAAC,kBAAkB;IAW1B,MAAM,IAAI,OAAO;IAKjB,MAAM,IAAI,OAAO,GAAG,IAAI;IAIxB,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAK3B,SAAS,IAAI,IAAI;IAIjB,eAAe,IAAI,IAAI;IAKvB,WAAW;;;;;IAIX;;OAEG;IACH,UAAU,IAAI,OAAO;IAKrB;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAM7B;;OAEG;IACH,eAAe,IAAI,IAAI;CAKxB"}
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.Database = void 0;
7
+ const lowdb_1 = __importDefault(require("lowdb"));
8
+ const FileSync_1 = __importDefault(require("lowdb/adapters/FileSync"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const fs_1 = __importDefault(require("fs"));
11
+ class Database {
12
+ constructor(dbPath = path_1.default.join(process.cwd(), 'data', 'pet.json')) {
13
+ // Ensure data directory exists
14
+ const dir = path_1.default.dirname(dbPath);
15
+ if (!fs_1.default.existsSync(dir)) {
16
+ fs_1.default.mkdirSync(dir, { recursive: true });
17
+ }
18
+ const adapter = new FileSync_1.default(dbPath);
19
+ this.db = (0, lowdb_1.default)(adapter);
20
+ // Initialize with default schema if file doesn't exist or is empty
21
+ if (!fs_1.default.existsSync(dbPath) || fs_1.default.statSync(dbPath).size === 0) {
22
+ this.writeDefaultSchema();
23
+ }
24
+ }
25
+ writeDefaultSchema() {
26
+ const defaultSchema = {
27
+ pet: null,
28
+ settings: {
29
+ created: new Date().toISOString(),
30
+ version: '1.0.0',
31
+ },
32
+ };
33
+ this.db.setState(defaultSchema).write();
34
+ }
35
+ hasPet() {
36
+ const pet = this.db.get('pet').value();
37
+ return pet !== null && pet !== undefined;
38
+ }
39
+ getPet() {
40
+ return this.db.get('pet').value();
41
+ }
42
+ savePet(pet) {
43
+ pet.lastSaveTime = new Date().toISOString();
44
+ this.db.set('pet', pet).write();
45
+ }
46
+ deletePet() {
47
+ this.db.set('pet', null).write();
48
+ }
49
+ getLastSaveTime() {
50
+ const pet = this.getPet();
51
+ return pet ? new Date(pet.lastSaveTime) : new Date(0);
52
+ }
53
+ getSettings() {
54
+ return this.db.get('settings').value();
55
+ }
56
+ /**
57
+ * Check if this is the first run (user hasn't been onboarded yet)
58
+ */
59
+ isFirstRun() {
60
+ const settings = this.db.get('settings').value();
61
+ return !settings.onboarded;
62
+ }
63
+ /**
64
+ * Mark the onboarding as complete
65
+ */
66
+ markOnboardedComplete() {
67
+ const settings = this.db.get('settings').value();
68
+ settings.onboarded = true;
69
+ this.db.set('settings', settings).write();
70
+ }
71
+ /**
72
+ * Reset onboarding (for testing or re-running tutorial)
73
+ */
74
+ resetOnboarding() {
75
+ const settings = this.db.get('settings').value();
76
+ settings.onboarded = false;
77
+ this.db.set('settings', settings).write();
78
+ }
79
+ }
80
+ exports.Database = Database;
81
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/core/database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { InventoryItem, ItemType } from '../types/items';
2
+ export declare class Inventory {
3
+ private items;
4
+ constructor(items?: InventoryItem[]);
5
+ /**
6
+ * Create a new inventory with starting items
7
+ */
8
+ static createStarting(): Inventory;
9
+ /**
10
+ * Get the quantity of an item
11
+ */
12
+ getItemQuantity(itemId: string): number;
13
+ /**
14
+ * Get all items in inventory
15
+ */
16
+ getAllItems(): InventoryItem[];
17
+ /**
18
+ * Get items of a specific type
19
+ */
20
+ getItemsByType(type: ItemType): InventoryItem[];
21
+ /**
22
+ * Check if player has at least one of an item
23
+ */
24
+ hasItem(itemId: string): boolean;
25
+ /**
26
+ * Check if player has at least a certain quantity of an item
27
+ */
28
+ hasItemQuantity(itemId: string, quantity: number): boolean;
29
+ /**
30
+ * Check if inventory has any items of a specific type
31
+ */
32
+ hasItemType(type: ItemType): boolean;
33
+ /**
34
+ * Add items to inventory
35
+ */
36
+ addItem(itemId: string, quantity?: number): void;
37
+ /**
38
+ * Remove items from inventory
39
+ * Returns true if successful, false if not enough items
40
+ */
41
+ removeItem(itemId: string, quantity?: number): boolean;
42
+ /**
43
+ * Get total number of unique items
44
+ */
45
+ getUniqueItemCount(): number;
46
+ /**
47
+ * Get total count of all items
48
+ */
49
+ getTotalItemCount(): number;
50
+ /**
51
+ * Check if inventory is empty
52
+ */
53
+ isEmpty(): boolean;
54
+ /**
55
+ * Serialize inventory to array for storage
56
+ */
57
+ serialize(): InventoryItem[];
58
+ /**
59
+ * Clear all items from inventory
60
+ */
61
+ clear(): void;
62
+ }
63
+ //# sourceMappingURL=inventory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../src/core/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAiC,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAExF,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAsB;gBAEvB,KAAK,CAAC,EAAE,aAAa,EAAE;IAWnC;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,SAAS;IAIlC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAIvC;;OAEG;IACH,WAAW,IAAI,aAAa,EAAE;IAQ9B;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,aAAa,EAAE;IAW/C;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI1D;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAUpC;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,IAAI;IAMnD;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAU,GAAG,OAAO;IAiBzD;;OAEG;IACH,kBAAkB,IAAI,MAAM;IAI5B;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAQ3B;;OAEG;IACH,OAAO,IAAI,OAAO;IAIlB;;OAEG;IACH,SAAS,IAAI,aAAa,EAAE;IAI5B;;OAEG;IACH,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Inventory = void 0;
4
+ const items_1 = require("../types/items");
5
+ class Inventory {
6
+ constructor(items) {
7
+ this.items = new Map();
8
+ if (items) {
9
+ for (const item of items) {
10
+ if (item.quantity > 0) {
11
+ this.items.set(item.itemId, item.quantity);
12
+ }
13
+ }
14
+ }
15
+ }
16
+ /**
17
+ * Create a new inventory with starting items
18
+ */
19
+ static createStarting() {
20
+ return new Inventory((0, items_1.getStartingInventory)());
21
+ }
22
+ /**
23
+ * Get the quantity of an item
24
+ */
25
+ getItemQuantity(itemId) {
26
+ return this.items.get(itemId) || 0;
27
+ }
28
+ /**
29
+ * Get all items in inventory
30
+ */
31
+ getAllItems() {
32
+ const result = [];
33
+ for (const [itemId, quantity] of this.items.entries()) {
34
+ result.push({ itemId, quantity });
35
+ }
36
+ return result.sort((a, b) => b.quantity - a.quantity);
37
+ }
38
+ /**
39
+ * Get items of a specific type
40
+ */
41
+ getItemsByType(type) {
42
+ const result = [];
43
+ for (const [itemId, quantity] of this.items.entries()) {
44
+ const itemDef = (0, items_1.getItem)(itemId);
45
+ if (itemDef && itemDef.type === type) {
46
+ result.push({ itemId, quantity });
47
+ }
48
+ }
49
+ return result.sort((a, b) => b.quantity - a.quantity);
50
+ }
51
+ /**
52
+ * Check if player has at least one of an item
53
+ */
54
+ hasItem(itemId) {
55
+ return (this.items.get(itemId) || 0) > 0;
56
+ }
57
+ /**
58
+ * Check if player has at least a certain quantity of an item
59
+ */
60
+ hasItemQuantity(itemId, quantity) {
61
+ return (this.items.get(itemId) || 0) >= quantity;
62
+ }
63
+ /**
64
+ * Check if inventory has any items of a specific type
65
+ */
66
+ hasItemType(type) {
67
+ for (const itemId of this.items.keys()) {
68
+ const itemDef = (0, items_1.getItem)(itemId);
69
+ if (itemDef && itemDef.type === type && this.items.get(itemId) > 0) {
70
+ return true;
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ /**
76
+ * Add items to inventory
77
+ */
78
+ addItem(itemId, quantity = 1) {
79
+ if (quantity <= 0)
80
+ return;
81
+ const current = this.items.get(itemId) || 0;
82
+ this.items.set(itemId, current + quantity);
83
+ }
84
+ /**
85
+ * Remove items from inventory
86
+ * Returns true if successful, false if not enough items
87
+ */
88
+ removeItem(itemId, quantity = 1) {
89
+ if (quantity <= 0)
90
+ return true;
91
+ const current = this.items.get(itemId) || 0;
92
+ if (current < quantity) {
93
+ return false;
94
+ }
95
+ const newQuantity = current - quantity;
96
+ if (newQuantity === 0) {
97
+ this.items.delete(itemId);
98
+ }
99
+ else {
100
+ this.items.set(itemId, newQuantity);
101
+ }
102
+ return true;
103
+ }
104
+ /**
105
+ * Get total number of unique items
106
+ */
107
+ getUniqueItemCount() {
108
+ return this.items.size;
109
+ }
110
+ /**
111
+ * Get total count of all items
112
+ */
113
+ getTotalItemCount() {
114
+ let total = 0;
115
+ for (const quantity of this.items.values()) {
116
+ total += quantity;
117
+ }
118
+ return total;
119
+ }
120
+ /**
121
+ * Check if inventory is empty
122
+ */
123
+ isEmpty() {
124
+ return this.items.size === 0;
125
+ }
126
+ /**
127
+ * Serialize inventory to array for storage
128
+ */
129
+ serialize() {
130
+ return this.getAllItems();
131
+ }
132
+ /**
133
+ * Clear all items from inventory
134
+ */
135
+ clear() {
136
+ this.items.clear();
137
+ }
138
+ }
139
+ exports.Inventory = Inventory;
140
+ //# sourceMappingURL=inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../src/core/inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare class LevelSystem {
2
+ /**
3
+ * Calculate total XP required for a given level
4
+ * Formula: 100 * level * 1.5^(level-1)
5
+ */
6
+ static getXPForLevel(level: number): number;
7
+ /**
8
+ * Calculate XP needed to reach the next level
9
+ */
10
+ static getXPToNextLevel(currentLevel: number, currentXP: number): number;
11
+ /**
12
+ * Get the progress percentage towards the next level
13
+ */
14
+ static getLevelProgress(currentLevel: number, currentXP: number): number;
15
+ /**
16
+ * Check if the given XP is enough for a level up
17
+ */
18
+ static checkLevelUp(currentLevel: number, newXP: number): boolean;
19
+ /**
20
+ * Calculate the new level after gaining XP
21
+ */
22
+ static calculateNewLevel(currentLevel: number, newXP: number): number;
23
+ /**
24
+ * Get the level title/rank
25
+ */
26
+ static getLevelTitle(level: number): string;
27
+ /**
28
+ * Get max stats bonus based on level
29
+ */
30
+ static getStatBonus(level: number): number;
31
+ }
32
+ //# sourceMappingURL=level-system.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"level-system.d.ts","sourceRoot":"","sources":["../../src/core/level-system.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAM3C;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAMxE;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAUxE;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO;IAIjE;;OAEG;IACH,MAAM,CAAC,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAQrE;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAS3C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG3C"}