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.
- package/LICENSE +21 -0
- package/README.md +268 -0
- package/dist/commands/care.d.ts +3 -0
- package/dist/commands/care.d.ts.map +1 -0
- package/dist/commands/care.js +103 -0
- package/dist/commands/care.js.map +1 -0
- package/dist/commands/clean.d.ts +3 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +105 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/feed.d.ts +3 -0
- package/dist/commands/feed.d.ts.map +1 -0
- package/dist/commands/feed.js +106 -0
- package/dist/commands/feed.js.map +1 -0
- package/dist/commands/git.d.ts +3 -0
- package/dist/commands/git.d.ts.map +1 -0
- package/dist/commands/git.js +138 -0
- package/dist/commands/git.js.map +1 -0
- package/dist/commands/heal.d.ts +3 -0
- package/dist/commands/heal.d.ts.map +1 -0
- package/dist/commands/heal.js +106 -0
- package/dist/commands/heal.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +89 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/inventory.d.ts +3 -0
- package/dist/commands/inventory.d.ts.map +1 -0
- package/dist/commands/inventory.js +113 -0
- package/dist/commands/inventory.js.map +1 -0
- package/dist/commands/play.d.ts +3 -0
- package/dist/commands/play.d.ts.map +1 -0
- package/dist/commands/play.js +110 -0
- package/dist/commands/play.js.map +1 -0
- package/dist/commands/shop.d.ts +3 -0
- package/dist/commands/shop.d.ts.map +1 -0
- package/dist/commands/shop.js +197 -0
- package/dist/commands/shop.js.map +1 -0
- package/dist/commands/sleep.d.ts +3 -0
- package/dist/commands/sleep.d.ts.map +1 -0
- package/dist/commands/sleep.js +48 -0
- package/dist/commands/sleep.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +98 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +66 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/tutorial.d.ts +3 -0
- package/dist/commands/tutorial.d.ts.map +1 -0
- package/dist/commands/tutorial.js +210 -0
- package/dist/commands/tutorial.js.map +1 -0
- package/dist/core/auto-care.d.ts +63 -0
- package/dist/core/auto-care.d.ts.map +1 -0
- package/dist/core/auto-care.js +295 -0
- package/dist/core/auto-care.js.map +1 -0
- package/dist/core/config.d.ts +89 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +195 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/database.d.ts +29 -0
- package/dist/core/database.d.ts.map +1 -0
- package/dist/core/database.js +81 -0
- package/dist/core/database.js.map +1 -0
- package/dist/core/inventory.d.ts +63 -0
- package/dist/core/inventory.d.ts.map +1 -0
- package/dist/core/inventory.js +140 -0
- package/dist/core/inventory.js.map +1 -0
- package/dist/core/level-system.d.ts +32 -0
- package/dist/core/level-system.d.ts.map +1 -0
- package/dist/core/level-system.js +76 -0
- package/dist/core/level-system.js.map +1 -0
- package/dist/core/pet.d.ts +123 -0
- package/dist/core/pet.d.ts.map +1 -0
- package/dist/core/pet.js +781 -0
- package/dist/core/pet.js.map +1 -0
- package/dist/core/shop.d.ts +93 -0
- package/dist/core/shop.d.ts.map +1 -0
- package/dist/core/shop.js +205 -0
- package/dist/core/shop.js.map +1 -0
- package/dist/core/time-decay.d.ts +30 -0
- package/dist/core/time-decay.d.ts.map +1 -0
- package/dist/core/time-decay.js +149 -0
- package/dist/core/time-decay.js.map +1 -0
- package/dist/core/welcome.d.ts +31 -0
- package/dist/core/welcome.d.ts.map +1 -0
- package/dist/core/welcome.js +180 -0
- package/dist/core/welcome.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +80 -0
- package/dist/index.js.map +1 -0
- package/dist/monitor/git-monitor.d.ts +90 -0
- package/dist/monitor/git-monitor.d.ts.map +1 -0
- package/dist/monitor/git-monitor.js +342 -0
- package/dist/monitor/git-monitor.js.map +1 -0
- package/dist/types/auto-care.d.ts +86 -0
- package/dist/types/auto-care.d.ts.map +1 -0
- package/dist/types/auto-care.js +15 -0
- package/dist/types/auto-care.js.map +1 -0
- package/dist/types/config.d.ts +42 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +24 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/git.d.ts +68 -0
- package/dist/types/git.d.ts.map +1 -0
- package/dist/types/git.js +14 -0
- package/dist/types/git.js.map +1 -0
- package/dist/types/items.d.ts +41 -0
- package/dist/types/items.d.ts.map +1 -0
- package/dist/types/items.js +286 -0
- package/dist/types/items.js.map +1 -0
- package/dist/types/pet.d.ts +42 -0
- package/dist/types/pet.d.ts.map +1 -0
- package/dist/types/pet.js +16 -0
- package/dist/types/pet.js.map +1 -0
- package/dist/types/species.d.ts +30 -0
- package/dist/types/species.d.ts.map +1 -0
- package/dist/types/species.js +164 -0
- package/dist/types/species.js.map +1 -0
- package/dist/types/stats.d.ts +22 -0
- package/dist/types/stats.d.ts.map +1 -0
- package/dist/types/stats.js +18 -0
- package/dist/types/stats.js.map +1 -0
- package/dist/types/time.d.ts +30 -0
- package/dist/types/time.d.ts.map +1 -0
- package/dist/types/time.js +79 -0
- package/dist/types/time.js.map +1 -0
- package/dist/ui/ascii-art.d.ts +4 -0
- package/dist/ui/ascii-art.d.ts.map +1 -0
- package/dist/ui/ascii-art.js +170 -0
- package/dist/ui/ascii-art.js.map +1 -0
- package/dist/ui/display.d.ts +11 -0
- package/dist/ui/display.d.ts.map +1 -0
- package/dist/ui/display.js +93 -0
- package/dist/ui/display.js.map +1 -0
- package/dist/ui/help.d.ts +17 -0
- package/dist/ui/help.d.ts.map +1 -0
- package/dist/ui/help.js +280 -0
- package/dist/ui/help.js.map +1 -0
- package/dist/ui/progress-bar.d.ts +9 -0
- package/dist/ui/progress-bar.d.ts.map +1 -0
- package/dist/ui/progress-bar.js +57 -0
- package/dist/ui/progress-bar.js.map +1 -0
- 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"}
|