@rpgjs/client 5.0.0-alpha.17 → 5.0.0-alpha.19
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/dist/RpgClient.d.ts +63 -5
- package/dist/RpgClientEngine.d.ts +118 -0
- package/dist/Sound.d.ts +199 -0
- package/dist/components/dynamics/parse-value.d.ts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/prebuilt/index.d.ts +18 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/index10.js +1 -1
- package/dist/index11.js +4 -3
- package/dist/index11.js.map +1 -1
- package/dist/index12.js +2 -2
- package/dist/index13.js +4 -4
- package/dist/index15.js +4 -4
- package/dist/index15.js.map +1 -1
- package/dist/index16.js +95 -222
- package/dist/index16.js.map +1 -1
- package/dist/index17.js +92 -45
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +362 -5
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +45 -382
- package/dist/index19.js.map +1 -1
- package/dist/index2.js +217 -8
- package/dist/index2.js.map +1 -1
- package/dist/index20.js +5 -42
- package/dist/index20.js.map +1 -1
- package/dist/index21.js +393 -18
- package/dist/index21.js.map +1 -1
- package/dist/index22.js +43 -2621
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +19 -108
- package/dist/index23.js.map +1 -1
- package/dist/index24.js +2619 -57
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +110 -17
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +67 -23
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +17 -91
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +19 -33
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +90 -19
- package/dist/index29.js.map +1 -1
- package/dist/index3.js +2 -2
- package/dist/index30.js +39 -3
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +20 -331
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +10 -25
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +6 -10
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +330 -6
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +3686 -183
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +71 -498
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +3 -10
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +26 -6
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +7 -3686
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +2 -2
- package/dist/index40.js +8 -74
- package/dist/index40.js.map +1 -1
- package/dist/index41.js +184 -3
- package/dist/index41.js.map +1 -1
- package/dist/index42.js +485 -112
- package/dist/index42.js.map +1 -1
- package/dist/index43.js +3 -17
- package/dist/index43.js.map +1 -1
- package/dist/index44.js +17 -9
- package/dist/index44.js.map +1 -1
- package/dist/index45.js +136 -103
- package/dist/index45.js.map +1 -1
- package/dist/index46.js +10 -134
- package/dist/index46.js.map +1 -1
- package/dist/index47.js +99 -123
- package/dist/index47.js.map +1 -1
- package/dist/index48.js +126 -102
- package/dist/index48.js.map +1 -1
- package/dist/index49.js +135 -7
- package/dist/index49.js.map +1 -1
- package/dist/index5.js +1 -1
- package/dist/index50.js +112 -0
- package/dist/index50.js.map +1 -0
- package/dist/index51.js +141 -0
- package/dist/index51.js.map +1 -0
- package/dist/index52.js +9 -0
- package/dist/index52.js.map +1 -0
- package/dist/index53.js +54 -0
- package/dist/index53.js.map +1 -0
- package/dist/index6.js +1 -1
- package/dist/index7.js +1 -1
- package/dist/index8.js +37 -2
- package/dist/index8.js.map +1 -1
- package/dist/index9.js +7 -6
- package/dist/index9.js.map +1 -1
- package/package.json +10 -10
- package/src/Game/Object.ts +37 -22
- package/src/RpgClient.ts +64 -5
- package/src/RpgClientEngine.ts +251 -4
- package/src/Sound.ts +253 -0
- package/src/components/character.ce +28 -4
- package/src/components/dynamics/parse-value.ts +80 -0
- package/src/components/dynamics/text.ce +183 -0
- package/src/components/index.ts +3 -0
- package/src/components/prebuilt/hp-bar.ce +255 -0
- package/src/components/prebuilt/index.ts +21 -0
- package/src/index.ts +1 -0
- package/src/module.ts +41 -1
package/dist/RpgClient.d.ts
CHANGED
|
@@ -322,6 +322,30 @@ export interface RpgClient {
|
|
|
322
322
|
* @memberof RpgClient
|
|
323
323
|
* */
|
|
324
324
|
spritesheetResolver?: (id: string) => any | Promise<any>;
|
|
325
|
+
/**
|
|
326
|
+
* Resolver function for dynamically loading sounds
|
|
327
|
+
*
|
|
328
|
+
* The resolver is called when a sound is requested but not found in the cache.
|
|
329
|
+
* It can be synchronous (returns directly) or asynchronous (returns a Promise).
|
|
330
|
+
* The resolved sound is automatically cached for future use.
|
|
331
|
+
*
|
|
332
|
+
* ```ts
|
|
333
|
+
* import { defineModule, RpgClient } from '@rpgjs/client'
|
|
334
|
+
*
|
|
335
|
+
* defineModule<RpgClient>({
|
|
336
|
+
* soundResolver: (id: string) => {
|
|
337
|
+
* if (id === 'dynamic-sound') {
|
|
338
|
+
* return { id: 'dynamic-sound', src: 'path/to/sound.mp3' };
|
|
339
|
+
* }
|
|
340
|
+
* return undefined;
|
|
341
|
+
* }
|
|
342
|
+
* })
|
|
343
|
+
* ```
|
|
344
|
+
*
|
|
345
|
+
* @prop {(id: string) => any | Promise<any>} [soundResolver]
|
|
346
|
+
* @memberof RpgClient
|
|
347
|
+
* */
|
|
348
|
+
soundResolver?: (id: string) => any | Promise<any>;
|
|
325
349
|
/**
|
|
326
350
|
* Array containing the list of GUI components
|
|
327
351
|
*
|
|
@@ -362,22 +386,56 @@ export interface RpgClient {
|
|
|
362
386
|
} | any)[];
|
|
363
387
|
/**
|
|
364
388
|
* Array containing the list of sounds
|
|
365
|
-
* Each element
|
|
389
|
+
* Each element can be:
|
|
390
|
+
* - A simple object containing sound definitions
|
|
391
|
+
* - A class decorated with @Sound
|
|
366
392
|
*
|
|
367
393
|
* ```ts
|
|
368
|
-
* import { defineModule, RpgClient } from '@rpgjs/client'
|
|
394
|
+
* import { defineModule, RpgClient, Sound } from '@rpgjs/client'
|
|
369
395
|
*
|
|
396
|
+
* // Using simple objects
|
|
370
397
|
* defineModule<RpgClient>({
|
|
371
398
|
* sounds: [
|
|
372
399
|
* {
|
|
373
|
-
*
|
|
374
|
-
*
|
|
400
|
+
* id: 'typewriter',
|
|
401
|
+
* src: 'typewriter.wav'
|
|
402
|
+
* },
|
|
403
|
+
* {
|
|
404
|
+
* id: 'cursor',
|
|
405
|
+
* src: 'cursor.wav'
|
|
375
406
|
* }
|
|
376
407
|
* ]
|
|
377
408
|
* })
|
|
409
|
+
*
|
|
410
|
+
* // Using @Sound decorator
|
|
411
|
+
* @Sound({
|
|
412
|
+
* id: 'town-music',
|
|
413
|
+
* sound: require('./sound/town.ogg'),
|
|
414
|
+
* loop: true,
|
|
415
|
+
* volume: 0.5
|
|
416
|
+
* })
|
|
417
|
+
* export class TownMusic {}
|
|
418
|
+
*
|
|
419
|
+
* defineModule<RpgClient>({
|
|
420
|
+
* sounds: [TownMusic]
|
|
421
|
+
* })
|
|
422
|
+
*
|
|
423
|
+
* // Multiple sounds in one class
|
|
424
|
+
* @Sound({
|
|
425
|
+
* sounds: {
|
|
426
|
+
* hero: require('./assets/hero.ogg'),
|
|
427
|
+
* monster: require('./assets/monster.ogg')
|
|
428
|
+
* },
|
|
429
|
+
* loop: true
|
|
430
|
+
* })
|
|
431
|
+
* export class CharacterSounds {}
|
|
432
|
+
*
|
|
433
|
+
* defineModule<RpgClient>({
|
|
434
|
+
* sounds: [CharacterSounds]
|
|
435
|
+
* })
|
|
378
436
|
* ```
|
|
379
437
|
*
|
|
380
|
-
* @prop {Array<Object>} [sounds]
|
|
438
|
+
* @prop {Array<Object | Class>} [sounds]
|
|
381
439
|
* @memberof RpgClient
|
|
382
440
|
* */
|
|
383
441
|
sounds?: any[];
|
|
@@ -22,6 +22,7 @@ export declare class RpgClientEngine<T = any> {
|
|
|
22
22
|
sounds: Map<string, any>;
|
|
23
23
|
componentAnimations: any[];
|
|
24
24
|
private spritesheetResolver?;
|
|
25
|
+
private soundResolver?;
|
|
25
26
|
particleSettings: {
|
|
26
27
|
emitters: any[];
|
|
27
28
|
};
|
|
@@ -138,7 +139,124 @@ export declare class RpgClientEngine<T = any> {
|
|
|
138
139
|
* ```
|
|
139
140
|
*/
|
|
140
141
|
getSpriteSheet(id: string): any | Promise<any>;
|
|
142
|
+
/**
|
|
143
|
+
* Add a sound to the engine
|
|
144
|
+
*
|
|
145
|
+
* Adds a sound to the engine's sound cache. The sound can be:
|
|
146
|
+
* - A simple object with `id` and `src` properties
|
|
147
|
+
* - A Howler instance
|
|
148
|
+
* - An object with a `play()` method
|
|
149
|
+
*
|
|
150
|
+
* If the sound has a `src` property, a Howler instance will be created automatically.
|
|
151
|
+
*
|
|
152
|
+
* @param sound - The sound object or Howler instance
|
|
153
|
+
* @param id - Optional sound ID (if not provided, uses sound.id)
|
|
154
|
+
* @returns The added sound
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```ts
|
|
158
|
+
* // Simple sound object
|
|
159
|
+
* engine.addSound({ id: 'click', src: 'click.mp3' });
|
|
160
|
+
*
|
|
161
|
+
* // With explicit ID
|
|
162
|
+
* engine.addSound({ src: 'music.mp3' }, 'background-music');
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
141
165
|
addSound(sound: any, id?: string): any;
|
|
166
|
+
/**
|
|
167
|
+
* Set a resolver function for sounds
|
|
168
|
+
*
|
|
169
|
+
* The resolver is called when a sound is requested but not found in the cache.
|
|
170
|
+
* It can be synchronous (returns directly) or asynchronous (returns a Promise).
|
|
171
|
+
* The resolved sound is automatically cached for future use.
|
|
172
|
+
*
|
|
173
|
+
* @param resolver - Function that takes a sound ID and returns a sound or Promise of sound
|
|
174
|
+
*
|
|
175
|
+
* @example
|
|
176
|
+
* ```ts
|
|
177
|
+
* // Synchronous resolver
|
|
178
|
+
* engine.setSoundResolver((id) => {
|
|
179
|
+
* if (id === 'dynamic-sound') {
|
|
180
|
+
* return { id: 'dynamic-sound', src: 'path/to/sound.mp3' };
|
|
181
|
+
* }
|
|
182
|
+
* return undefined;
|
|
183
|
+
* });
|
|
184
|
+
*
|
|
185
|
+
* // Asynchronous resolver (loading from API)
|
|
186
|
+
* engine.setSoundResolver(async (id) => {
|
|
187
|
+
* const response = await fetch(`/api/sounds/${id}`);
|
|
188
|
+
* const data = await response.json();
|
|
189
|
+
* return data;
|
|
190
|
+
* });
|
|
191
|
+
* ```
|
|
192
|
+
*/
|
|
193
|
+
setSoundResolver(resolver: (id: string) => any | Promise<any>): void;
|
|
194
|
+
/**
|
|
195
|
+
* Get a sound by ID, using resolver if not found in cache
|
|
196
|
+
*
|
|
197
|
+
* This method first checks if the sound exists in the cache.
|
|
198
|
+
* If not found and a resolver is set, it calls the resolver to create the sound.
|
|
199
|
+
* The resolved sound is automatically cached for future use.
|
|
200
|
+
*
|
|
201
|
+
* @param id - The sound ID to retrieve
|
|
202
|
+
* @returns The sound if found or created, or undefined if not found and no resolver
|
|
203
|
+
* @returns Promise<any> if the resolver is asynchronous
|
|
204
|
+
*
|
|
205
|
+
* @example
|
|
206
|
+
* ```ts
|
|
207
|
+
* // Synchronous usage
|
|
208
|
+
* const sound = engine.getSound('my-sound');
|
|
209
|
+
*
|
|
210
|
+
* // Asynchronous usage (when resolver returns Promise)
|
|
211
|
+
* const sound = await engine.getSound('dynamic-sound');
|
|
212
|
+
* ```
|
|
213
|
+
*/
|
|
214
|
+
getSound(id: string): any | Promise<any>;
|
|
215
|
+
/**
|
|
216
|
+
* Play a sound by its ID
|
|
217
|
+
*
|
|
218
|
+
* This method retrieves a sound from the cache or resolver and plays it.
|
|
219
|
+
* If the sound is not found, it will attempt to resolve it using the soundResolver.
|
|
220
|
+
* Uses Howler.js for audio playback instead of native Audio elements.
|
|
221
|
+
*
|
|
222
|
+
* @param soundId - The sound ID to play
|
|
223
|
+
* @param options - Optional sound configuration
|
|
224
|
+
* @param options.volume - Volume level (0.0 to 1.0, overrides sound default)
|
|
225
|
+
* @param options.loop - Whether the sound should loop (overrides sound default)
|
|
226
|
+
*
|
|
227
|
+
* @example
|
|
228
|
+
* ```ts
|
|
229
|
+
* // Play a sound synchronously
|
|
230
|
+
* engine.playSound('item-pickup');
|
|
231
|
+
*
|
|
232
|
+
* // Play a sound with volume and loop
|
|
233
|
+
* engine.playSound('background-music', { volume: 0.5, loop: true });
|
|
234
|
+
*
|
|
235
|
+
* // Play a sound asynchronously (when resolver returns Promise)
|
|
236
|
+
* await engine.playSound('dynamic-sound', { volume: 0.8 });
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
playSound(soundId: string, options?: {
|
|
240
|
+
volume?: number;
|
|
241
|
+
loop?: boolean;
|
|
242
|
+
}): Promise<void>;
|
|
243
|
+
/**
|
|
244
|
+
* Stop a sound that is currently playing
|
|
245
|
+
*
|
|
246
|
+
* This method stops a sound that was previously started with `playSound()`.
|
|
247
|
+
*
|
|
248
|
+
* @param soundId - The sound ID to stop
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```ts
|
|
252
|
+
* // Start a looping sound
|
|
253
|
+
* engine.playSound('background-music', { loop: true });
|
|
254
|
+
*
|
|
255
|
+
* // Later, stop it
|
|
256
|
+
* engine.stopSound('background-music');
|
|
257
|
+
* ```
|
|
258
|
+
*/
|
|
259
|
+
stopSound(soundId: string): void;
|
|
142
260
|
addParticle(particle: any): any;
|
|
143
261
|
/**
|
|
144
262
|
* Add a component to render behind sprites
|
package/dist/Sound.d.ts
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Howler } from 'canvasengine';
|
|
2
|
+
import { RpgClientEngine } from './RpgClientEngine';
|
|
3
|
+
/**
|
|
4
|
+
* Sound decorator options
|
|
5
|
+
*
|
|
6
|
+
* Defines the configuration for a sound that can be played in the game.
|
|
7
|
+
* The sound can be a single file or multiple files (for different formats).
|
|
8
|
+
*
|
|
9
|
+
* @interface SoundOptions
|
|
10
|
+
*/
|
|
11
|
+
export interface SoundOptions {
|
|
12
|
+
/**
|
|
13
|
+
* Sound identifier. Used to retrieve the sound later with RpgSound.get()
|
|
14
|
+
*
|
|
15
|
+
* @type {string}
|
|
16
|
+
*/
|
|
17
|
+
id?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Single sound file path. Use require() to wrap the path.
|
|
20
|
+
*
|
|
21
|
+
* @type {string}
|
|
22
|
+
* @example
|
|
23
|
+
* sound: require('./assets/sound.ogg')
|
|
24
|
+
*/
|
|
25
|
+
sound?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Multiple sounds with different IDs. The key is the sound ID and the value is the file path.
|
|
28
|
+
* Use require() to wrap each path.
|
|
29
|
+
*
|
|
30
|
+
* @type {{ [id: string]: string }}
|
|
31
|
+
* @example
|
|
32
|
+
* sounds: {
|
|
33
|
+
* hero: require('./assets/hero.ogg'),
|
|
34
|
+
* monster: require('./assets/monster.ogg')
|
|
35
|
+
* }
|
|
36
|
+
*/
|
|
37
|
+
sounds?: {
|
|
38
|
+
[id: string]: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Whether the sound should loop when it finishes playing.
|
|
42
|
+
*
|
|
43
|
+
* @type {boolean}
|
|
44
|
+
* @default false
|
|
45
|
+
*/
|
|
46
|
+
loop?: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Volume level (0.0 to 1.0).
|
|
49
|
+
*
|
|
50
|
+
* @type {number}
|
|
51
|
+
* @default 1.0
|
|
52
|
+
*/
|
|
53
|
+
volume?: number;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Metadata stored on the class decorated with @Sound
|
|
57
|
+
*
|
|
58
|
+
* @interface SoundMetadata
|
|
59
|
+
*/
|
|
60
|
+
interface SoundMetadata {
|
|
61
|
+
id?: string;
|
|
62
|
+
sound?: string;
|
|
63
|
+
sounds?: {
|
|
64
|
+
[id: string]: string;
|
|
65
|
+
};
|
|
66
|
+
loop?: boolean;
|
|
67
|
+
volume?: number;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Sound decorator
|
|
71
|
+
*
|
|
72
|
+
* Decorates a class to define a sound configuration. The decorated class can be
|
|
73
|
+
* added to the RpgClient module configuration, and the sound will be automatically
|
|
74
|
+
* registered and available through RpgSound.get().
|
|
75
|
+
*
|
|
76
|
+
* ## Design
|
|
77
|
+
*
|
|
78
|
+
* The decorator stores metadata on the class that is later used by the module loader
|
|
79
|
+
* to register sounds with the engine. The sound is created using Howler.js for
|
|
80
|
+
* advanced audio features like looping, volume control, and cross-browser compatibility.
|
|
81
|
+
*
|
|
82
|
+
* @param options - Sound configuration options
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* ```ts
|
|
86
|
+
* import { Sound } from '@rpgjs/client'
|
|
87
|
+
*
|
|
88
|
+
* @Sound({
|
|
89
|
+
* id: 'town-music',
|
|
90
|
+
* sound: require('./sound/town.ogg'),
|
|
91
|
+
* loop: true,
|
|
92
|
+
* volume: 0.5
|
|
93
|
+
* })
|
|
94
|
+
* export class TownMusic {}
|
|
95
|
+
*
|
|
96
|
+
* // Multiple sounds in one class
|
|
97
|
+
* @Sound({
|
|
98
|
+
* sounds: {
|
|
99
|
+
* hero: require('./assets/hero.ogg'),
|
|
100
|
+
* monster: require('./assets/monster.ogg')
|
|
101
|
+
* },
|
|
102
|
+
* loop: true
|
|
103
|
+
* })
|
|
104
|
+
* export class CharacterSounds {}
|
|
105
|
+
* ```
|
|
106
|
+
*/
|
|
107
|
+
export declare function Sound(options: SoundOptions): <T extends {
|
|
108
|
+
new (...args: any[]): {};
|
|
109
|
+
}>(constructor: T) => T;
|
|
110
|
+
/**
|
|
111
|
+
* Get sound metadata from a decorated class
|
|
112
|
+
*
|
|
113
|
+
* @param soundClass - The class decorated with @Sound
|
|
114
|
+
* @returns The sound metadata or undefined
|
|
115
|
+
*/
|
|
116
|
+
export declare function getSoundMetadata(soundClass: any): SoundMetadata | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* RpgSound class
|
|
119
|
+
*
|
|
120
|
+
* Provides a unified API to manage sounds in the game. Uses Howler.js internally
|
|
121
|
+
* for advanced audio features. Sounds can be retrieved by ID and controlled
|
|
122
|
+
* using Howler.js methods.
|
|
123
|
+
*
|
|
124
|
+
* ## Design
|
|
125
|
+
*
|
|
126
|
+
* RpgSound acts as a facade over Howler.js, providing easy access to sounds
|
|
127
|
+
* registered in the engine. It supports both individual sound control and
|
|
128
|
+
* global sound management (volume, mute, etc.).
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```ts
|
|
132
|
+
* import { RpgSound } from '@rpgjs/client'
|
|
133
|
+
*
|
|
134
|
+
* // Play a sound
|
|
135
|
+
* RpgSound.get('town-music').play()
|
|
136
|
+
*
|
|
137
|
+
* // Control volume
|
|
138
|
+
* RpgSound.get('town-music').volume(0.5)
|
|
139
|
+
*
|
|
140
|
+
* // Stop a sound
|
|
141
|
+
* RpgSound.get('town-music').stop()
|
|
142
|
+
*
|
|
143
|
+
* // Global volume control
|
|
144
|
+
* RpgSound.global.volume(0.2)
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
export declare class RpgSound {
|
|
148
|
+
private static engine;
|
|
149
|
+
/**
|
|
150
|
+
* Initialize RpgSound with the engine instance
|
|
151
|
+
*
|
|
152
|
+
* This is called automatically by the engine during initialization.
|
|
153
|
+
*
|
|
154
|
+
* @param engine - The RpgClientEngine instance
|
|
155
|
+
*/
|
|
156
|
+
static init(engine: RpgClientEngine): void;
|
|
157
|
+
/**
|
|
158
|
+
* Get a sound by its ID
|
|
159
|
+
*
|
|
160
|
+
* Retrieves a Howler sound instance from the engine's sound cache.
|
|
161
|
+
* The sound must be registered beforehand (via @Sound decorator or manually).
|
|
162
|
+
*
|
|
163
|
+
* @param id - The sound identifier
|
|
164
|
+
* @returns The Howler sound instance, or undefined if not found
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* ```ts
|
|
168
|
+
* // Get and play a sound
|
|
169
|
+
* const sound = RpgSound.get('town-music');
|
|
170
|
+
* if (sound) {
|
|
171
|
+
* sound.play();
|
|
172
|
+
* }
|
|
173
|
+
*
|
|
174
|
+
* // Chain methods
|
|
175
|
+
* RpgSound.get('battle-theme')?.volume(0.8).play();
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
static get(id: string): any;
|
|
179
|
+
/**
|
|
180
|
+
* Global Howler instance for managing all sounds
|
|
181
|
+
*
|
|
182
|
+
* Provides access to Howler.js global methods for controlling all sounds
|
|
183
|
+
* at once (volume, mute, etc.).
|
|
184
|
+
*
|
|
185
|
+
* @example
|
|
186
|
+
* ```ts
|
|
187
|
+
* // Set global volume to 20%
|
|
188
|
+
* RpgSound.global.volume(0.2)
|
|
189
|
+
*
|
|
190
|
+
* // Mute all sounds
|
|
191
|
+
* RpgSound.global.mute(true)
|
|
192
|
+
*
|
|
193
|
+
* // Unmute all sounds
|
|
194
|
+
* RpgSound.global.mute(false)
|
|
195
|
+
* ```
|
|
196
|
+
*/
|
|
197
|
+
static get global(): typeof Howler;
|
|
198
|
+
}
|
|
199
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const parseDynamicValue: (value: any, object?: any) => import('canvasengine').ComputedSignal<string>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prebuilt sprite components for common UI elements
|
|
3
|
+
*
|
|
4
|
+
* This module exports ready-to-use components that can be attached
|
|
5
|
+
* to sprites using componentsInFront or componentsBehind configuration.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { HpBar } from '@rpgjs/client/components/prebuilt';
|
|
10
|
+
*
|
|
11
|
+
* export default defineModule<RpgClient>({
|
|
12
|
+
* sprite: {
|
|
13
|
+
* componentsInFront: [HpBar]
|
|
14
|
+
* }
|
|
15
|
+
* })
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export { default as HpBar } from './hp-bar.ce';
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -12,5 +12,7 @@ export { PrebuiltComponentAnimations } from './index12.js';
|
|
|
12
12
|
export { Presets } from './index13.js';
|
|
13
13
|
export { default as EventLayerComponent } from './index14.js';
|
|
14
14
|
export { default as CharacterComponent } from './index15.js';
|
|
15
|
-
export {
|
|
15
|
+
export { default as HpBar } from './index16.js';
|
|
16
|
+
export { RpgSound, Sound, getSoundMetadata } from './index17.js';
|
|
17
|
+
export { Context } from './index18.js';
|
|
16
18
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
|
package/dist/index10.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { useProps, useDefineProps, signal, animatedSignal, computed, trigger, mount, effect, h, Container, Rect, cond, Text, Sprite } from 'canvasengine';
|
|
2
|
-
import component$1 from './
|
|
2
|
+
import component$1 from './index36.js';
|
|
3
3
|
import { inject } from './index6.js';
|
|
4
4
|
import { RpgClientEngine } from './index2.js';
|
|
5
5
|
|
package/dist/index11.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useProps, useDefineProps, computed, h, Container, Rect } from 'canvasengine';
|
|
2
2
|
import { RpgClientEngine } from './index2.js';
|
|
3
|
-
import './
|
|
3
|
+
import './index24.js';
|
|
4
4
|
import '@rpgjs/common';
|
|
5
|
-
import './
|
|
5
|
+
import './index18.js';
|
|
6
6
|
import { inject } from './index6.js';
|
|
7
7
|
import 'rxjs';
|
|
8
|
-
import './
|
|
8
|
+
import './index25.js';
|
|
9
|
+
import './index17.js';
|
|
9
10
|
import '@canvasengine/presets';
|
|
10
11
|
|
|
11
12
|
function component($$props) {
|
package/dist/index11.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index11.js","sources":["../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index11.js","sources":["../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"names":[],"mappings":";;;;;;;;;;;AAOqB,SAAS,SAAS,CAAC,OAAO,EAAE;AACjD,QAAuB,QAAQ,CAAC,OAAO;AACvC,QAAQ,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO;AAClD,QAAQ,IAAI,EAAE,GAAG,WAAW,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAC,IAAI;AAC5I,IAAI,MAAM,GAAG,MAAM,CAAC,eAAe,CAAC;AACpC,IAAI,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC;AACvB,IAAI,MAAM,GAAG,QAAQ,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,KAAK,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC,WAAW,MAAM,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC;AAClN,QAAQ,IAAI,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACvM,QAAQ,OAAO;AACf,MAAM;;;;"}
|
package/dist/index12.js
CHANGED
package/dist/index13.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AnimationSpritesheetPreset } from './
|
|
2
|
-
import { LPCSpritesheetPreset } from './
|
|
3
|
-
import { RMSpritesheet } from './
|
|
4
|
-
import { FacesetPreset } from './
|
|
1
|
+
import { AnimationSpritesheetPreset } from './index28.js';
|
|
2
|
+
import { LPCSpritesheetPreset } from './index29.js';
|
|
3
|
+
import { RMSpritesheet } from './index30.js';
|
|
4
|
+
import { FacesetPreset } from './index31.js';
|
|
5
5
|
|
|
6
6
|
const Presets = {
|
|
7
7
|
RMSpritesheet,
|
package/dist/index15.js
CHANGED
|
@@ -52,7 +52,7 @@ var playerId = client.playerId;
|
|
|
52
52
|
var componentsBehind = client.spriteComponentsBehind;
|
|
53
53
|
var componentsInFront = client.spriteComponentsInFront;
|
|
54
54
|
var isMe = computed(function () { return id() === playerId; });
|
|
55
|
-
var x = object.x, y = object.y, tint = object.tint, direction = object.direction, animationName = object.animationName, animationCurrentIndex = object.animationCurrentIndex, emitParticleTrigger = object.emitParticleTrigger, particleName = object.particleName
|
|
55
|
+
var x = object.x, y = object.y, tint = object.tint, direction = object.direction, animationName = object.animationName, animationCurrentIndex = object.animationCurrentIndex, emitParticleTrigger = object.emitParticleTrigger, particleName = object.particleName; object.graphics; var hitbox = object.hitbox, isConnected = object.isConnected, graphicsSignals = object.graphicsSignals;
|
|
56
56
|
var particleSettings = client.particleSettings;
|
|
57
57
|
var canControls = function () { return isMe() && object.canMove(); };
|
|
58
58
|
var keyboardControls = client.globalConfig.keyboardControls;
|
|
@@ -120,9 +120,9 @@ var xSubscription = x.observable.subscribe(function (value) {
|
|
|
120
120
|
var ySubscription = y.observable.subscribe(function (value) {
|
|
121
121
|
smoothY.set(value);
|
|
122
122
|
});
|
|
123
|
-
var sheet = function (
|
|
123
|
+
var sheet = function (graphicObject) {
|
|
124
124
|
return {
|
|
125
|
-
definition:
|
|
125
|
+
definition: graphicObject,
|
|
126
126
|
playing: realAnimationName,
|
|
127
127
|
params: {
|
|
128
128
|
direction: direction
|
|
@@ -190,7 +190,7 @@ mount(function (element) {
|
|
|
190
190
|
tick(function () {
|
|
191
191
|
hooks.callHooks("client-sprite-onUpdate").subscribe();
|
|
192
192
|
});
|
|
193
|
-
let $this = h(Container, { x: smoothX, y: smoothY, zIndex: y, viewportFollow: isMe, controls, onBeforeDestroy, visible }, [loop(componentsBehind, component => h(Container, null, h(component, { object }))), h(Particle, { emit: emitParticleTrigger, settings: particleSettings, zIndex: 1000, name: particleName }), h(Container, null, loop(
|
|
193
|
+
let $this = h(Container, { x: smoothX, y: smoothY, zIndex: y, viewportFollow: isMe, controls, onBeforeDestroy, visible }, [loop(componentsBehind, component => h(Container, null, h(component, { object }))), h(Particle, { emit: emitParticleTrigger, settings: particleSettings, zIndex: 1000, name: particleName }), h(Container, null, loop(graphicsSignals, graphicObj => h(Sprite, { sheet: sheet(graphicObj), direction, tint, hitbox }))), loop(componentsInFront, component => h(Container, null, h(component, { object })))]);
|
|
194
194
|
return $this
|
|
195
195
|
}
|
|
196
196
|
|
package/dist/index15.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index15.js","sources":["../src/components/character.ce"],"sourcesContent":["<Container x={smoothX} y={smoothY} zIndex={y} viewportFollow={isMe} controls onBeforeDestroy visible>\n @for (component of componentsBehind) {\n <Container>\n <component object />\n </Container>\n } \n <Particle emit={@emitParticleTrigger} settings={@particleSettings} zIndex={1000} name={particleName} />\n <Container>\n @for (graphicId of graphics) {\n <Sprite sheet={@sheet(@graphicId)} direction tint hitbox />\n }\n </Container>\n @for (component of componentsInFront) {\n <Container>\n <component object />\n </Container>\n } \n</Container>\n\n<script>\n import { signal, effect, mount, computed, tick, animatedSignal } from \"canvasengine\";\n import { lastValueFrom, combineLatest, pairwise, filter, map, startWith } from \"rxjs\";\n import { Particle } from \"@canvasengine/presets\";\n import { GameEngineToken, ModulesToken } from \"@rpgjs/common\";\n import { RpgClientEngine } from \"../RpgClientEngine\";\n import { inject } from \"../core/inject\"; \n import { Direction } from \"@rpgjs/common\";\n import Hit from \"./effects/hit.ce\";\n\n const { object, id } = defineProps();\n\n const client = inject(RpgClientEngine);\n const hooks = inject(ModulesToken);\n\n const spritesheets = client.spritesheets;\n const playerId = client.playerId;\n const componentsBehind = client.spriteComponentsBehind;\n const componentsInFront = client.spriteComponentsInFront;\n const isMe = computed(() => id() === playerId);\n\n const { \n x, \n y, \n tint, \n direction, \n animationName, \n animationCurrentIndex,\n emitParticleTrigger, \n particleName, \n graphics, \n hitbox,\n isConnected,\n } = object;\n\n const particleSettings = client.particleSettings;\n\n const canControls = () => isMe() && object.canMove()\n const keyboardControls = client.globalConfig.keyboardControls;\n\n const visible = computed(() => {\n if (object.type === 'event') {\n return true\n }\n return isConnected()\n });\n\n const controls = signal({\n down: {\n repeat: true,\n bind: keyboardControls.down,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Down })\n },\n },\n up: {\n repeat: true,\n bind: keyboardControls.up,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Up })\n },\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Left })\n },\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Right })\n },\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (canControls()) {\n client.processAction({ action: 'action' })\n // particleName.set('hit') \n // emitParticleTrigger.start()\n // object.flash('red')\n }\n },\n },\n });\n\n const smoothX = animatedSignal(x(), {\n duration: isMe() ? 0 : 0\n });\n\n const smoothY = animatedSignal(y(), {\n duration: isMe() ? 0 : 0,\n });\n\n const realAnimationName = signal(animationName());\n\n const xSubscription = x.observable.subscribe((value) => {\n smoothX.set(value);\n });\n\n const ySubscription = y.observable.subscribe((value) => {\n smoothY.set(value);\n });\n \n const sheet = (graphicId) => {\n return {\n definition: client.getSpriteSheet(graphicId),\n playing: realAnimationName,\n params: {\n direction\n },\n onFinish() {\n animationCurrentIndex.update(index => index + 1)\n }\n };\n }\n\n // Combine animation change detection with movement state from smoothX/smoothY\n const movementAnimations = ['walk', 'stand'];\n const epsilon = 0; // movement threshold to consider the easing still running\n\n const stateX$ = smoothX.animatedState.observable;\n const stateY$ = smoothY.animatedState.observable;\n const animationName$ = animationName.observable;\n\n const moving$ = combineLatest([stateX$, stateY$]).pipe(\n map(([sx, sy]) => {\n const xFinished = Math.abs(sx.value.current - sx.value.end) <= epsilon;\n const yFinished = Math.abs(sy.value.current - sy.value.end) <= epsilon;\n return !xFinished || !yFinished; // moving if X or Y is not finished\n }),\n startWith(false)\n );\n\n const animationChange$ = animationName$.pipe(\n startWith(animationName()),\n pairwise(),\n filter(([prev, curr]) => prev !== curr)\n );\n\n const animationMovementSubscription = combineLatest([animationChange$, moving$]).subscribe(([[prev, curr], isMoving]) => {\n if (curr == 'stand' && !isMoving) {\n realAnimationName.set(curr);\n }\n else if (curr == 'walk' && isMoving) {\n realAnimationName.set(curr);\n }\n else if (!movementAnimations.includes(curr)) {\n realAnimationName.set(curr);\n }\n if (!isMoving && object.animationIsPlaying && object.animationIsPlaying()) {\n if (movementAnimations.includes(curr)) {\n if (typeof object.resetAnimationState === 'function') {\n object.resetAnimationState();\n }\n }\n }\n });\n\n /**\n * Cleanup subscriptions and call hooks before sprite destruction.\n *\n * # Design\n * - Prevent memory leaks by unsubscribing from all local subscriptions created in this component.\n * - Execute destruction hooks to notify modules and scene map of sprite removal.\n *\n * @example\n * await onBeforeDestroy();\n */\n const onBeforeDestroy = async () => {\n animationMovementSubscription.unsubscribe();\n xSubscription.unsubscribe();\n ySubscription.unsubscribe();\n await lastValueFrom(hooks.callHooks(\"client-sprite-onDestroy\", object)) \n await lastValueFrom(hooks.callHooks(\"client-sceneMap-onRemoveSprite\", client.sceneMap, object))\n }\n\n mount((element) => {\n hooks.callHooks(\"client-sprite-onAdd\", object).subscribe()\n hooks.callHooks(\"client-sceneMap-onAddSprite\", client.sceneMap, object).subscribe()\n })\n\n tick(() => {\n hooks.callHooks(\"client-sprite-onUpdate\").subscribe()\n })\n</script>"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index15.js","sources":["../src/components/character.ce"],"sourcesContent":["<Container x={smoothX} y={smoothY} zIndex={y} viewportFollow={isMe} controls onBeforeDestroy visible>\n @for (component of componentsBehind) {\n <Container>\n <component object />\n </Container>\n } \n <Particle emit={@emitParticleTrigger} settings={@particleSettings} zIndex={1000} name={particleName} />\n <Container>\n @for (graphicObj of graphicsSignals) {\n <Sprite sheet={@sheet(@graphicObj)} direction tint hitbox />\n }\n </Container>\n @for (component of componentsInFront) {\n <Container>\n <component object />\n </Container>\n } \n</Container>\n\n<script>\n import { signal, effect, mount, computed, tick, animatedSignal } from \"canvasengine\";\n import { lastValueFrom, combineLatest, pairwise, filter, map, startWith } from \"rxjs\";\n import { Particle } from \"@canvasengine/presets\";\n import { GameEngineToken, ModulesToken } from \"@rpgjs/common\";\n import { RpgClientEngine } from \"../RpgClientEngine\";\n import { inject } from \"../core/inject\"; \n import { Direction } from \"@rpgjs/common\";\n import Hit from \"./effects/hit.ce\";\n import PlayerComponents from \"./player-components.ce\";\n\n const { object, id } = defineProps();\n\n const client = inject(RpgClientEngine);\n const hooks = inject(ModulesToken);\n\n const spritesheets = client.spritesheets;\n const playerId = client.playerId;\n const componentsBehind = client.spriteComponentsBehind;\n const componentsInFront = client.spriteComponentsInFront;\n const isMe = computed(() => id() === playerId);\n\n const { \n x, \n y, \n tint, \n direction, \n animationName, \n animationCurrentIndex,\n emitParticleTrigger, \n particleName, \n graphics, \n hitbox,\n isConnected,\n graphicsSignals\n } = object;\n\n const particleSettings = client.particleSettings;\n\n const canControls = () => isMe() && object.canMove()\n const keyboardControls = client.globalConfig.keyboardControls;\n\n const visible = computed(() => {\n if (object.type === 'event') {\n return true\n }\n return isConnected()\n });\n\n const controls = signal({\n down: {\n repeat: true,\n bind: keyboardControls.down,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Down })\n },\n },\n up: {\n repeat: true,\n bind: keyboardControls.up,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Up })\n },\n },\n left: {\n repeat: true,\n bind: keyboardControls.left,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Left })\n },\n },\n right: {\n repeat: true,\n bind: keyboardControls.right,\n keyDown() {\n if (canControls()) client.processInput({ input: Direction.Right })\n },\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (canControls()) {\n client.processAction({ action: 'action' })\n // particleName.set('hit') \n // emitParticleTrigger.start()\n // object.flash('red')\n }\n },\n },\n });\n\n const smoothX = animatedSignal(x(), {\n duration: isMe() ? 0 : 0\n });\n\n const smoothY = animatedSignal(y(), {\n duration: isMe() ? 0 : 0,\n });\n\n const realAnimationName = signal(animationName());\n\n const xSubscription = x.observable.subscribe((value) => {\n smoothX.set(value);\n });\n\n const ySubscription = y.observable.subscribe((value) => {\n smoothY.set(value);\n });\n \n const sheet = (graphicObject) => {\n return {\n definition: graphicObject,\n playing: realAnimationName,\n params: {\n direction\n },\n onFinish() {\n animationCurrentIndex.update(index => index + 1)\n }\n };\n }\n\n // Combine animation change detection with movement state from smoothX/smoothY\n const movementAnimations = ['walk', 'stand'];\n const epsilon = 0; // movement threshold to consider the easing still running\n\n const stateX$ = smoothX.animatedState.observable;\n const stateY$ = smoothY.animatedState.observable;\n const animationName$ = animationName.observable;\n\n const moving$ = combineLatest([stateX$, stateY$]).pipe(\n map(([sx, sy]) => {\n const xFinished = Math.abs(sx.value.current - sx.value.end) <= epsilon;\n const yFinished = Math.abs(sy.value.current - sy.value.end) <= epsilon;\n return !xFinished || !yFinished; // moving if X or Y is not finished\n }),\n startWith(false)\n );\n\n const animationChange$ = animationName$.pipe(\n startWith(animationName()),\n pairwise(),\n filter(([prev, curr]) => prev !== curr)\n );\n\n const animationMovementSubscription = combineLatest([animationChange$, moving$]).subscribe(([[prev, curr], isMoving]) => {\n if (curr == 'stand' && !isMoving) {\n realAnimationName.set(curr);\n }\n else if (curr == 'walk' && isMoving) {\n realAnimationName.set(curr);\n }\n else if (!movementAnimations.includes(curr)) {\n realAnimationName.set(curr);\n }\n if (!isMoving && object.animationIsPlaying && object.animationIsPlaying()) {\n if (movementAnimations.includes(curr)) {\n if (typeof object.resetAnimationState === 'function') {\n object.resetAnimationState();\n }\n }\n }\n });\n\n /**\n * Cleanup subscriptions and call hooks before sprite destruction.\n *\n * # Design\n * - Prevent memory leaks by unsubscribing from all local subscriptions created in this component.\n * - Execute destruction hooks to notify modules and scene map of sprite removal.\n *\n * @example\n * await onBeforeDestroy();\n */\n const onBeforeDestroy = async () => {\n animationMovementSubscription.unsubscribe();\n xSubscription.unsubscribe();\n ySubscription.unsubscribe();\n await lastValueFrom(hooks.callHooks(\"client-sprite-onDestroy\", object)) \n await lastValueFrom(hooks.callHooks(\"client-sceneMap-onRemoveSprite\", client.sceneMap, object))\n }\n\n mount((element) => {\n hooks.callHooks(\"client-sprite-onAdd\", object).subscribe()\n hooks.callHooks(\"client-sceneMap-onAddSprite\", client.sceneMap, object).subscribe()\n })\n\n /**\n * Calculate Y position for components above player\n */\n const getComponentsTopY = () => {\n const layout = componentsTopData()?.layout || {};\n const hitboxValue = typeof hitbox === 'function' ? hitbox() : hitbox;\n const playerHeight = hitboxValue?.h || 32;\n const marginBottom = layout.marginBottom ?? 0;\n return -(playerHeight / 2) - marginBottom;\n };\n\n /**\n * Calculate Y position for components below player\n */\n const getComponentsBottomY = () => {\n const layout = componentsBottomData()?.layout || {};\n const hitboxValue = typeof hitbox === 'function' ? hitbox() : hitbox;\n const playerHeight = hitboxValue?.h || 32;\n const marginTop = layout.marginTop ?? 0;\n return (playerHeight / 2) + marginTop;\n };\n\n tick(() => {\n hooks.callHooks(\"client-sprite-onUpdate\").subscribe()\n })\n</script>"],"names":[],"mappings":"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"}
|