@rpgjs/server 5.0.0-alpha.10 → 5.0.0-alpha.12

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.
@@ -17,6 +17,10 @@ export interface DialogOptions {
17
17
  tranparent?: boolean;
18
18
  typewriterEffect?: boolean;
19
19
  talkWith?: RpgPlayer;
20
+ face?: {
21
+ id: string;
22
+ expression: string;
23
+ };
20
24
  }
21
25
  export declare class DialogGui extends Gui {
22
26
  constructor(player: RpgPlayer);
@@ -4,3 +4,4 @@ import { MenuGui } from './MenuGui';
4
4
  import { ShopGui } from './ShopGui';
5
5
  import { NotificationGui } from './NotificationGui';
6
6
  export { Gui, DialogGui, MenuGui, ShopGui, NotificationGui };
7
+ export { DialogPosition } from './DialogGui';
@@ -1,50 +1,371 @@
1
1
  import { PlayerCtor } from '@rpgjs/common';
2
2
  /**
3
- * Mixin that adds parameter management functionality to a player class.
3
+ * Interface for Parameter Manager functionality
4
4
  *
5
- * This mixin provides comprehensive parameter management including:
6
- * - Health Points (HP) and Skill Points (SP) management
7
- * - Experience and level progression system
8
- * - Custom parameter creation and modification
9
- * - Parameter modifiers for temporary stat changes
10
- *
11
- * @template TBase - The base class constructor type
12
- * @param Base - The base class to extend
13
- * @returns A new class that extends the base with parameter management capabilities
14
- *
15
- * @example
16
- * ```ts
17
- * class MyPlayer extends WithParameterManager(BasePlayer) {
18
- * constructor() {
19
- * super();
20
- * this.addParameter('strength', { start: 10, end: 100 });
21
- * }
22
- * }
23
- * ```
5
+ * Provides comprehensive parameter management including health points (HP), skill points (SP),
6
+ * experience and level progression, custom parameters, and parameter modifiers.
24
7
  */
8
+ export interface IParameterManager {
9
+ /**
10
+ * ```ts
11
+ * player.initialLevel = 5
12
+ * ```
13
+ *
14
+ * @title Set initial level
15
+ * @prop {number} player.initialLevel
16
+ * @default 1
17
+ * @memberof ParameterManager
18
+ * */
19
+ initialLevel: number;
20
+ /**
21
+ * ```ts
22
+ * player.finalLevel = 50
23
+ * ```
24
+ *
25
+ * @title Set final level
26
+ * @prop {number} player.finalLevel
27
+ * @default 99
28
+ * @memberof ParameterManager
29
+ * */
30
+ finalLevel: number;
31
+ /**
32
+ * With Object-based syntax, you can use following options:
33
+ * - `basis: number`
34
+ * - `extra: number`
35
+ * - `accelerationA: number`
36
+ * - `accelerationB: number`
37
+ * @title Change Experience Curve
38
+ * @prop {object} player.expCurve
39
+ * @default
40
+ * ```ts
41
+ * {
42
+ * basis: 30,
43
+ * extra: 20,
44
+ * accelerationA: 30,
45
+ * accelerationB: 30
46
+ * }
47
+ * ```
48
+ * @memberof ParameterManager
49
+ * */
50
+ expCurve: {
51
+ basis: number;
52
+ extra: number;
53
+ accelerationA: number;
54
+ accelerationB: number;
55
+ };
56
+ /**
57
+ * Changes the health points
58
+ * - Cannot exceed the MaxHP parameter
59
+ * - Cannot have a negative value
60
+ * - If the value is 0, a hook named `onDead()` is called in the RpgPlayer class.
61
+ *
62
+ * ```ts
63
+ * player.hp = 100
64
+ * ```
65
+ * @title Change HP
66
+ * @prop {number} player.hp
67
+ * @default MaxHPValue
68
+ * @memberof ParameterManager
69
+ * */
70
+ hp: number;
71
+ /**
72
+ * Changes the skill points
73
+ * - Cannot exceed the MaxSP parameter
74
+ * - Cannot have a negative value
75
+ *
76
+ * ```ts
77
+ * player.sp = 200
78
+ * ```
79
+ * @title Change SP
80
+ * @prop {number} player.sp
81
+ * @default MaxSPValue
82
+ * @memberof ParameterManager
83
+ * */
84
+ sp: number;
85
+ /**
86
+ * Changing the player's experience.
87
+ * ```ts
88
+ * player.exp += 100
89
+ * ```
90
+ *
91
+ * Levels are based on the experience curve.
92
+ *
93
+ * ```ts
94
+ * console.log(player.level) // 1
95
+ * console.log(player.expForNextlevel) // 150
96
+ * player.exp += 160
97
+ * console.log(player.level) // 2
98
+ * ```
99
+ *
100
+ * @title Change Experience
101
+ * @prop {number} player.exp
102
+ * @default 0
103
+ * @memberof ParameterManager
104
+ * */
105
+ exp: number;
106
+ /**
107
+ * Changing the player's level.
108
+ *
109
+ * ```ts
110
+ * player.level += 1
111
+ * ```
112
+ *
113
+ * The level will be between the initial level given by the `initialLevel` and final level given by `finalLevel`
114
+ *
115
+ * ```ts
116
+ * player.finalLevel = 50
117
+ * player.level = 60
118
+ * console.log(player.level) // 50
119
+ * ```
120
+ *
121
+ * @title Change Level
122
+ * @prop {number} player.level
123
+ * @default 1
124
+ * @memberof ParameterManager
125
+ * */
126
+ level: number;
127
+ /**
128
+ * ```ts
129
+ * console.log(player.expForNextlevel) // 150
130
+ * ```
131
+ * @title Experience for next level ?
132
+ * @prop {number} player.expForNextlevel
133
+ * @readonly
134
+ * @memberof ParameterManager
135
+ * */
136
+ readonly expForNextlevel: number;
137
+ /**
138
+ * Read the value of a parameter. Put the name of the parameter.
139
+ *
140
+ * ```ts
141
+ * import { Presets } from '@rpgjs/server'
142
+ *
143
+ * const { MAXHP } = Presets
144
+ *
145
+ * console.log(player.param[MAXHP])
146
+ * ```
147
+ *
148
+ * > Possible to use the `player.getParamValue(name)` method instead
149
+ * @title Get Param Value
150
+ * @prop {object} player.param
151
+ * @readonly
152
+ * @memberof ParameterManager
153
+ * */
154
+ readonly param: {
155
+ [key: string]: number;
156
+ };
157
+ /**
158
+ * Direct parameter modifiers (reactive signal)
159
+ *
160
+ * > It is important that these parameters have been created beforehand with the `addParameter()` method.
161
+ * > By default, the following settings have been created:
162
+ * - maxhp
163
+ * - maxsp
164
+ * - str
165
+ * - int
166
+ * - dex
167
+ * - agi
168
+ *
169
+ * **Object Key**
170
+ *
171
+ * The key of the object is the name of the parameter
172
+ *
173
+ * > The good practice is to retrieve the name coming from a constant
174
+ *
175
+ * **Object Value**
176
+ *
177
+ * The value of the key is an object containing:
178
+ * ```
179
+ * {
180
+ * value: number,
181
+ * rate: number
182
+ * }
183
+ * ```
184
+ *
185
+ * - value: Adds a number to the parameter
186
+ * - rate: Adds a rate to the parameter
187
+ *
188
+ * > Note that you can put both (value and rate)
189
+ *
190
+ * This property uses reactive signals - changes automatically trigger parameter recalculation.
191
+ * The final parameter values in `param` include aggregated modifiers from equipment, states, etc.
192
+ *
193
+ * @prop {Object} [paramsModifier]
194
+ * @example
195
+ *
196
+ * ```ts
197
+ * import { Presets } from '@rpgjs/server'
198
+ *
199
+ * const { MAXHP } = Presets
200
+ *
201
+ * // Set direct modifiers (reactive)
202
+ * player.paramsModifier = {
203
+ * [MAXHP]: {
204
+ * value: 100
205
+ * }
206
+ * }
207
+ *
208
+ * // Parameters automatically recalculate
209
+ * console.log(player.param[MAXHP]); // Updated value
210
+ * ```
211
+ *
212
+ * @title Set Parameters Modifier
213
+ * @prop {object} paramsModifier
214
+ * @memberof ParameterManager
215
+ * */
216
+ paramsModifier: {
217
+ [key: string]: {
218
+ value?: number;
219
+ rate?: number;
220
+ };
221
+ };
222
+ /**
223
+ * Get or set the parameters object
224
+ *
225
+ * @prop {object} parameters
226
+ * @memberof ParameterManager
227
+ */
228
+ parameters: {
229
+ [key: string]: {
230
+ start: number;
231
+ end: number;
232
+ };
233
+ };
234
+ /**
235
+ * Get the value of a specific parameter by name
236
+ *
237
+ * @deprecated Use `player.param[name]` instead for better reactivity
238
+ * @param name - The name of the parameter to get
239
+ * @returns The calculated parameter value
240
+ *
241
+ * @example
242
+ * ```ts
243
+ * import { Presets } from '@rpgjs/server'
244
+ *
245
+ * const { MAXHP } = Presets
246
+ *
247
+ * // Preferred way (reactive)
248
+ * const maxHp = player.param[MAXHP];
249
+ *
250
+ * // Legacy way (still works)
251
+ * const maxHp = player.getParamValue(MAXHP);
252
+ * ```
253
+ */
254
+ getParamValue(name: string): number;
255
+ /**
256
+ * Give a new parameter. Give a start value and an end value.
257
+ * The start value will be set to the level set at `player.initialLevel` and the end value will be linked to the level set at `player.finalLevel`.
258
+ *
259
+ * ```ts
260
+ * const SPEED = 'speed'
261
+ *
262
+ * player.addParameter(SPEED, {
263
+ * start: 10,
264
+ * end: 100
265
+ * })
266
+ *
267
+ * player.param[SPEED] // 10
268
+ * player.level += 5
269
+ * player.param[SPEED] // 14
270
+ * ```
271
+ *
272
+ * @title Add custom parameters
273
+ * @method player.addParameter(name,curve)
274
+ * @param {string} name - The name of the parameter
275
+ * @param {object} curve - Scheme of the object: { start: number, end: number }
276
+ * @returns {void}
277
+ * @memberof ParameterManager
278
+ * */
279
+ addParameter(name: string, curve: {
280
+ start: number;
281
+ end: number;
282
+ }): void;
283
+ /**
284
+ * Gives back in percentage of health points to skill points
285
+ *
286
+ * ```ts
287
+ * import { Presets } from '@rpgjs/server'
288
+ *
289
+ * const { MAXHP } = Presets
290
+ *
291
+ * console.log(player.param[MAXHP]) // 800
292
+ * player.hp = 100
293
+ * player.recovery({ hp: 0.5 }) // = 800 * 0.5
294
+ * console.log(player.hp) // 400
295
+ * ```
296
+ *
297
+ * @title Recovery HP and/or SP
298
+ * @method player.recovery(params)
299
+ * @param {object} params - Scheme of the object: { hp: number, sp: number }. The values of the numbers must be in 0 and 1
300
+ * @returns {void}
301
+ * @memberof ParameterManager
302
+ * */
303
+ recovery(params: {
304
+ hp?: number;
305
+ sp?: number;
306
+ }): void;
307
+ /**
308
+ * restores all HP and SP
309
+ *
310
+ * ```ts
311
+ * import { Presets } from '@rpgjs/server'
312
+ *
313
+ * const { MAXHP, MAXSP } = Presets
314
+ *
315
+ * console.log(player.param[MAXHP], player.param[MAXSP]) // 800, 230
316
+ * player.hp = 100
317
+ * player.sp = 0
318
+ * player.allRecovery()
319
+ * console.log(player.hp, player.sp) // 800, 230
320
+ * ```
321
+ *
322
+ * @title All Recovery
323
+ * @method player.allRecovery()
324
+ * @returns {void}
325
+ * @memberof ParameterManager
326
+ * */
327
+ allRecovery(): void;
328
+ }
25
329
  /**
26
- * Parameter Manager Mixin
330
+ * Parameter Manager Mixin with Reactive Signals
331
+ *
332
+ * Provides comprehensive parameter management functionality using reactive signals from `@signe/reactive`.
333
+ * This mixin handles health points (HP), skill points (SP), experience and level progression,
334
+ * custom parameters, and parameter modifiers with automatic reactivity.
27
335
  *
28
- * Provides comprehensive parameter management functionality to any class. This mixin handles
29
- * health points (HP), skill points (SP), experience and level progression, custom parameters,
30
- * and parameter modifiers for temporary stat changes.
336
+ * **Key Features:**
337
+ * - **Reactive Parameters**: All parameters automatically recalculate when level or modifiers change
338
+ * - 🚀 **Performance Optimized**: Uses computed signals to avoid unnecessary recalculations
339
+ * - 🔄 **Real-time Updates**: Changes propagate automatically throughout the system
340
+ * - 🎯 **Type Safe**: Full TypeScript support with proper type inference
31
341
  *
342
+ * @template TBase - The base class constructor type
32
343
  * @param Base - The base class to extend with parameter management
33
- * @returns Extended class with parameter management methods
344
+ * @returns Extended class with reactive parameter management methods
34
345
  *
35
346
  * @example
36
347
  * ```ts
37
348
  * class MyPlayer extends WithParameterManager(BasePlayer) {
38
349
  * constructor() {
39
350
  * super();
351
+ *
352
+ * // Add custom parameters
40
353
  * this.addParameter('strength', { start: 10, end: 100 });
354
+ * this.addParameter('magic', { start: 5, end: 80 });
41
355
  * }
42
356
  * }
43
357
  *
44
358
  * const player = new MyPlayer();
45
- * player.hp = 100;
359
+ *
360
+ * // Reactive parameter updates
46
361
  * player.level = 5;
362
+ * console.log(player.param.strength); // Automatically calculated for level 5
363
+ *
364
+ * // Reactive modifiers
365
+ * player.paramsModifier = {
366
+ * [MAXHP]: { value: 100, rate: 1.2 }
367
+ * };
368
+ * console.log(player.param[MAXHP]); // Automatically includes modifiers
47
369
  * ```
48
370
  */
49
371
  export declare function WithParameterManager<TBase extends PlayerCtor>(Base: TBase): TBase;
50
- export type IParameterManager = InstanceType<ReturnType<typeof WithParameterManager>>;
@@ -1,4 +1,4 @@
1
- import { RpgCommonPlayer } from '@rpgjs/common';
1
+ import { Hooks } from '@rpgjs/common';
2
2
  import { IComponentManager } from './ComponentManager';
3
3
  import { RpgMap } from '../rooms/map';
4
4
  import { Context } from '@signe/di';
@@ -24,7 +24,7 @@ interface ZoneOptions {
24
24
  linkedTo?: string;
25
25
  limitedByWalls?: boolean;
26
26
  }
27
- declare const RpgPlayer_base: typeof RpgCommonPlayer;
27
+ declare const RpgPlayer_base: import('@rpgjs/common').PlayerCtor;
28
28
  /**
29
29
  * RPG Player class with component management capabilities
30
30
  *
@@ -50,6 +50,8 @@ export declare class RpgPlayer extends RpgPlayer_base {
50
50
  conn: MockConnection | null;
51
51
  events: import('@signe/reactive').WritableArraySignal<RpgEvent[]>;
52
52
  constructor();
53
+ _onInit(): void;
54
+ get hooks(): Hooks;
53
55
  execMethod(method: string, methodData?: any[], target?: any): Promise<any>;
54
56
  /**
55
57
  * Change the map for this player
@@ -78,6 +80,8 @@ export declare class RpgPlayer extends RpgPlayer_base {
78
80
  }): Promise<false | undefined>;
79
81
  getCurrentMap<T extends RpgMap = RpgMap>(): T | null;
80
82
  emit(type: string, value?: any): void;
83
+ save(): Promise<string>;
84
+ load(snapshot: string): Promise<void>;
81
85
  /**
82
86
  * Set the current animation of the player's sprite
83
87
  *
@@ -142,36 +146,13 @@ export declare class RpgPlayer extends RpgPlayer_base {
142
146
  * });
143
147
  * ```
144
148
  */
145
- showComponentAnimation(id: string, params: any): void;
149
+ showComponentAnimation(id: string, params?: any): void;
150
+ showHit(text: string): void;
146
151
  /**
147
- * Display a spritesheet animation on the player
148
- *
149
- * This method displays a temporary visual animation using a spritesheet.
150
- * The animation can either be displayed as an overlay on the player or replace
151
- * the player's current graphic temporarily. This is useful for spell effects,
152
- * transformations, or other visual feedback that uses predefined spritesheets.
153
- *
154
- * @param graphic - The ID of the spritesheet to use for the animation
155
- * @param animationName - The name of the animation within the spritesheet (default: 'default')
156
- * @param replaceGraphic - Whether to replace the player's sprite with the animation (default: false)
157
- *
158
- * @example
159
- * ```ts
160
- * // Show explosion animation as overlay on player
161
- * player.showAnimation("explosion");
162
- *
163
- * // Show specific spell effect animation
164
- * player.showAnimation("spell-effects", "fireball");
165
- *
166
- * // Transform player graphic temporarily with animation
167
- * player.showAnimation("transformation", "werewolf", true);
168
- *
169
- * // Show healing effect on player
170
- * player.showAnimation("healing-effects", "holy-light");
171
- * ```
152
+ * Set the sync schema for the map
153
+ * @param schema - The schema to set
172
154
  */
173
- showAnimation(graphic: string, animationName?: string, replaceGraphic?: boolean): void;
174
- showHit(text: string): void;
155
+ setSync(schema: any): void;
175
156
  }
176
157
  export declare class RpgEvent extends RpgPlayer {
177
158
  execMethod(methodName: string, methodData?: any[], instance?: this): Promise<any>;
package/dist/index.d.ts CHANGED
@@ -7,3 +7,5 @@ export * from './Player/Player';
7
7
  export * from './module';
8
8
  export * from './rooms/map';
9
9
  export * from './presets';
10
+ export * from '@signe/reactive';
11
+ export * from './Gui';