@rpgjs/client 5.0.0-beta.6 → 5.0.0-beta.8
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/CHANGELOG.md +14 -0
- package/dist/Game/AnimationManager.d.ts +2 -2
- package/dist/Game/AnimationManager.js +18 -9
- package/dist/Game/AnimationManager.js.map +1 -1
- package/dist/Game/AnimationManager.spec.d.ts +1 -0
- package/dist/Game/Map.d.ts +7 -9
- package/dist/Game/Map.js +5 -4
- package/dist/Game/Map.js.map +1 -1
- package/dist/Game/Object.d.ts +44 -20
- package/dist/Game/Object.js +28 -14
- package/dist/Game/Object.js.map +1 -1
- package/dist/Gui/Gui.d.ts +19 -6
- package/dist/Gui/Gui.js +64 -34
- package/dist/Gui/Gui.js.map +1 -1
- package/dist/Gui/Gui.spec.d.ts +1 -0
- package/dist/Gui/NotificationManager.d.ts +1 -1
- package/dist/Gui/NotificationManager.js.map +1 -1
- package/dist/Resource.js +1 -1
- package/dist/Resource.js.map +1 -1
- package/dist/RpgClient.d.ts +57 -2
- package/dist/RpgClientEngine.d.ts +55 -16
- package/dist/RpgClientEngine.js +60 -5
- package/dist/RpgClientEngine.js.map +1 -1
- package/dist/Sound.js.map +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.128.0}/helpers/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.127.0 → _@oxc-project_runtime@0.128.0}/helpers/decorateMetadata.js +1 -1
- package/dist/components/animations/animation.ce.js.map +1 -1
- package/dist/components/animations/hit.ce.js.map +1 -1
- package/dist/components/character.ce.js +280 -3
- package/dist/components/character.ce.js.map +1 -1
- package/dist/components/dynamics/bar.ce.js +96 -0
- package/dist/components/dynamics/bar.ce.js.map +1 -0
- package/dist/components/dynamics/image.ce.js +23 -0
- package/dist/components/dynamics/image.ce.js.map +1 -0
- package/dist/components/dynamics/parse-value.d.ts +4 -1
- package/dist/components/dynamics/parse-value.js +51 -35
- package/dist/components/dynamics/parse-value.js.map +1 -1
- package/dist/components/dynamics/parse-value.spec.d.ts +1 -0
- package/dist/components/dynamics/shape-utils.d.ts +16 -0
- package/dist/components/dynamics/shape-utils.js +73 -0
- package/dist/components/dynamics/shape-utils.js.map +1 -0
- package/dist/components/dynamics/shape-utils.spec.d.ts +1 -0
- package/dist/components/dynamics/shape.ce.js +83 -0
- package/dist/components/dynamics/shape.ce.js.map +1 -0
- package/dist/components/dynamics/text.ce.js +28 -41
- package/dist/components/dynamics/text.ce.js.map +1 -1
- package/dist/components/gui/box.ce.js.map +1 -1
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
- package/dist/components/gui/gameover.ce.js.map +1 -1
- package/dist/components/gui/hud/hud.ce.js.map +1 -1
- package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
- package/dist/components/gui/mobile/index.d.ts +1 -1
- package/dist/components/gui/mobile/index.js.map +1 -1
- package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
- package/dist/components/gui/notification/notification.ce.js.map +1 -1
- package/dist/components/gui/save-load.ce.js.map +1 -1
- package/dist/components/gui/shop/shop.ce.js.map +1 -1
- package/dist/components/gui/title-screen.ce.js.map +1 -1
- package/dist/components/player-components-utils.d.ts +67 -0
- package/dist/components/player-components-utils.js +162 -0
- package/dist/components/player-components-utils.js.map +1 -0
- package/dist/components/player-components-utils.spec.d.ts +1 -0
- package/dist/components/player-components.ce.js +188 -0
- package/dist/components/player-components.ce.js.map +1 -0
- package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
- package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
- package/dist/components/scenes/canvas.ce.js.map +1 -1
- package/dist/components/scenes/draw-map.ce.js.map +1 -1
- package/dist/components/scenes/event-layer.ce.js.map +1 -1
- package/dist/core/inject.js +1 -1
- package/dist/core/inject.js.map +1 -1
- package/dist/core/setup.js +1 -1
- package/dist/core/setup.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/module.js +4 -1
- package/dist/module.js.map +1 -1
- package/dist/node_modules/.pnpm/{@signe_di@2.9.0 → @signe_di@2.10.0}/node_modules/@signe/di/dist/index.js +7 -117
- package/dist/node_modules/.pnpm/@signe_di@2.10.0/node_modules/@signe/di/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/@signe_reactive@2.10.0/node_modules/@signe/reactive/dist/index.js +239 -0
- package/dist/node_modules/.pnpm/@signe_reactive@2.10.0/node_modules/@signe/reactive/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/@signe_room@2.10.0/node_modules/@signe/room/dist/index.js +611 -0
- package/dist/node_modules/.pnpm/@signe_room@2.10.0/node_modules/@signe/room/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/client/index.js +44 -0
- package/dist/node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/client/index.js.map +1 -0
- package/dist/node_modules/.pnpm/{@signe_sync@2.9.0 → @signe_sync@2.10.0}/node_modules/@signe/sync/dist/index.js +29 -136
- package/dist/node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/index.js.map +1 -0
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-HAC622V3.js.map +1 -1
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
- package/dist/presets/animation.js.map +1 -1
- package/dist/presets/faceset.js.map +1 -1
- package/dist/presets/icon.js.map +1 -1
- package/dist/presets/lpc.js.map +1 -1
- package/dist/presets/rmspritesheet.js.map +1 -1
- package/dist/services/AbstractSocket.js.map +1 -1
- package/dist/services/keyboardControls.js.map +1 -1
- package/dist/services/loadMap.d.ts +6 -0
- package/dist/services/loadMap.js +1 -1
- package/dist/services/loadMap.js.map +1 -1
- package/dist/services/mmorpg.js +1 -1
- package/dist/services/mmorpg.js.map +1 -1
- package/dist/services/save.js.map +1 -1
- package/dist/services/standalone.js +1 -1
- package/dist/services/standalone.js.map +1 -1
- package/dist/utils/getEntityProp.js.map +1 -1
- package/package.json +8 -8
- package/src/Game/AnimationManager.spec.ts +30 -0
- package/src/Game/AnimationManager.ts +22 -10
- package/src/Game/Map.ts +12 -2
- package/src/Game/Object.ts +68 -43
- package/src/Gui/Gui.spec.ts +273 -0
- package/src/Gui/Gui.ts +105 -50
- package/src/Resource.ts +1 -2
- package/src/RpgClient.ts +63 -2
- package/src/RpgClientEngine.ts +82 -12
- package/src/components/character.ce +353 -1
- package/src/components/dynamics/bar.ce +87 -0
- package/src/components/dynamics/image.ce +20 -0
- package/src/components/dynamics/parse-value.spec.ts +41 -0
- package/src/components/dynamics/parse-value.ts +102 -37
- package/src/components/dynamics/shape-utils.spec.ts +46 -0
- package/src/components/dynamics/shape-utils.ts +61 -0
- package/src/components/dynamics/shape.ce +89 -0
- package/src/components/dynamics/text.ce +34 -149
- package/src/components/player-components-utils.spec.ts +109 -0
- package/src/components/player-components-utils.ts +205 -0
- package/src/components/player-components.ce +221 -0
- package/src/core/setup.ts +2 -2
- package/src/module.ts +5 -1
- package/src/services/loadMap.ts +2 -0
- package/dist/node_modules/.pnpm/@signe_di@2.9.0/node_modules/@signe/di/dist/index.js.map +0 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js +0 -463
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js.map +0 -1
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js +0 -2191
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js.map +0 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/chunk-7QVYU63E.js +0 -10
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/chunk-7QVYU63E.js.map +0 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js +0 -91
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js.map +0 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js.map +0 -1
- package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js +0 -14
- package/dist/node_modules/.pnpm/dset@3.1.4/node_modules/dset/dist/index.js.map +0 -1
package/CHANGELOG.md
ADDED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { RpgCommonPlayer } from '@rpgjs/common';
|
|
2
2
|
export declare class AnimationManager {
|
|
3
|
-
current:
|
|
3
|
+
current: any;
|
|
4
4
|
displayEffect(params: any, player: RpgCommonPlayer | {
|
|
5
5
|
x: number;
|
|
6
6
|
y: number;
|
|
7
|
-
}): void
|
|
7
|
+
}): Promise<void>;
|
|
8
8
|
}
|
|
@@ -7,16 +7,25 @@ var AnimationManager = class {
|
|
|
7
7
|
}
|
|
8
8
|
displayEffect(params, player) {
|
|
9
9
|
const id = generateUID();
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
onFinish: () => {
|
|
10
|
+
const effectParams = params ?? {};
|
|
11
|
+
return new Promise((resolve) => {
|
|
12
|
+
let finished = false;
|
|
13
|
+
const finish = (data) => {
|
|
14
|
+
if (finished) return;
|
|
15
|
+
finished = true;
|
|
17
16
|
const index = this.current().findIndex((value) => value.id === id);
|
|
18
|
-
this.current().splice(index, 1);
|
|
19
|
-
|
|
17
|
+
if (index !== -1) this.current().splice(index, 1);
|
|
18
|
+
effectParams.onFinish?.(data);
|
|
19
|
+
resolve();
|
|
20
|
+
};
|
|
21
|
+
this.current().push({
|
|
22
|
+
...effectParams,
|
|
23
|
+
id,
|
|
24
|
+
x: player.x,
|
|
25
|
+
y: player.y,
|
|
26
|
+
object: player,
|
|
27
|
+
onFinish: finish
|
|
28
|
+
});
|
|
20
29
|
});
|
|
21
30
|
}
|
|
22
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnimationManager.js","names":[],"sources":["../../src/Game/AnimationManager.ts"],"sourcesContent":["import { generateUID, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { signal } from \"canvasengine\";\n\nexport class AnimationManager {\n current = signal<any[]>([]);\n\n displayEffect(params: any, player: RpgCommonPlayer | { x: number, y: number }) {\n const id = generateUID();\n
|
|
1
|
+
{"version":3,"file":"AnimationManager.js","names":[],"sources":["../../src/Game/AnimationManager.ts"],"sourcesContent":["import { generateUID, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { signal } from \"canvasengine\";\n\nexport class AnimationManager {\n current = signal<any[]>([]);\n\n displayEffect(params: any, player: RpgCommonPlayer | { x: number, y: number }): Promise<void> {\n const id = generateUID();\n const effectParams = params ?? {};\n return new Promise<void>((resolve) => {\n let finished = false;\n const finish = (data?: any) => {\n if (finished) return;\n finished = true;\n const index = this.current().findIndex((value) => value.id === id);\n if (index !== -1) {\n this.current().splice(index, 1);\n }\n effectParams.onFinish?.(data);\n resolve();\n };\n\n this.current().push({\n ...effectParams,\n id,\n x: player.x,\n y: player.y,\n object: player,\n onFinish: finish,\n });\n });\n }\n}\n"],"mappings":";;;AAGA,IAAa,mBAAb,MAA8B;;iBAClB,OAAc,EAAE,CAAC;;CAE3B,cAAc,QAAa,QAAmE;EAC5F,MAAM,KAAK,aAAa;EACxB,MAAM,eAAe,UAAU,EAAE;EACjC,OAAO,IAAI,SAAe,YAAY;GACpC,IAAI,WAAW;GACf,MAAM,UAAU,SAAe;IAC7B,IAAI,UAAU;IACd,WAAW;IACX,MAAM,QAAQ,KAAK,SAAS,CAAC,WAAW,UAAU,MAAM,OAAO,GAAG;IAClE,IAAI,UAAU,IACZ,KAAK,SAAS,CAAC,OAAO,OAAO,EAAE;IAEjC,aAAa,WAAW,KAAK;IAC7B,SAAS;;GAGX,KAAK,SAAS,CAAC,KAAK;IAClB,GAAG;IACH;IACA,GAAG,OAAO;IACV,GAAG,OAAO;IACV,QAAQ;IACR,UAAU;IACX,CAAC;IACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/Game/Map.d.ts
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
import { RpgCommonMap, WeatherState, MapPhysicsInitContext, MapPhysicsEntityContext } from '@rpgjs/common';
|
|
2
|
-
import { RpgClientPlayer } from './Player';
|
|
3
|
-
import { RpgClientEvent } from './Event';
|
|
4
2
|
import { RpgClientEngine } from '../RpgClientEngine';
|
|
5
3
|
export declare class RpgClientMap extends RpgCommonMap<any> {
|
|
6
4
|
engine: RpgClientEngine;
|
|
7
|
-
players:
|
|
8
|
-
events:
|
|
9
|
-
currentPlayer:
|
|
10
|
-
weatherState:
|
|
11
|
-
localWeatherOverride:
|
|
12
|
-
weather:
|
|
5
|
+
players: any;
|
|
6
|
+
events: any;
|
|
7
|
+
currentPlayer: any;
|
|
8
|
+
weatherState: any;
|
|
9
|
+
localWeatherOverride: any;
|
|
10
|
+
weather: any;
|
|
13
11
|
private manualClientPhysicsTick;
|
|
14
12
|
private readonly isTestEnvironment;
|
|
15
13
|
constructor();
|
|
16
14
|
configureClientPrediction(enabled: boolean): void;
|
|
17
|
-
getCurrentPlayer():
|
|
15
|
+
getCurrentPlayer(): any;
|
|
18
16
|
reset(force?: boolean): void;
|
|
19
17
|
getWeather(): WeatherState | null;
|
|
20
18
|
setLocalWeather(next: WeatherState | null): void;
|
package/dist/Game/Map.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { inject } from "../core/inject.js";
|
|
2
|
-
import { sync, users } from "../node_modules/.pnpm/@signe_sync@2.
|
|
2
|
+
import { sync, users } from "../node_modules/.pnpm/@signe_sync@2.10.0/node_modules/@signe/sync/dist/index.js";
|
|
3
3
|
import { RpgClientPlayer } from "./Player.js";
|
|
4
4
|
import { RpgClientEvent } from "./Event.js";
|
|
5
|
-
import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.
|
|
6
|
-
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.
|
|
5
|
+
import { __decorateMetadata } from "../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorateMetadata.js";
|
|
6
|
+
import { __decorate } from "../_virtual/_@oxc-project_runtime@0.128.0/helpers/decorate.js";
|
|
7
7
|
import { RpgClientEngine } from "../RpgClientEngine.js";
|
|
8
8
|
import { computed, signal } from "canvasengine";
|
|
9
9
|
import { RpgCommonMap } from "@rpgjs/common";
|
|
@@ -23,7 +23,8 @@ var RpgClientMap = class extends RpgCommonMap {
|
|
|
23
23
|
return local ?? state;
|
|
24
24
|
});
|
|
25
25
|
this.manualClientPhysicsTick = false;
|
|
26
|
-
const
|
|
26
|
+
const testGlobal = globalThis;
|
|
27
|
+
const isTest = testGlobal.process?.env?.TEST === "true" || testGlobal.__RPGJS_TEST__ === true;
|
|
27
28
|
this.isTestEnvironment = isTest;
|
|
28
29
|
if (isTest) this.autoTickEnabled = false;
|
|
29
30
|
}
|
package/dist/Game/Map.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Map.js","names":[],"sources":["../../src/Game/Map.ts"],"sourcesContent":["import {\n RpgCommonMap,\n type WeatherState,\n type MapPhysicsInitContext,\n type MapPhysicsEntityContext,\n} from \"@rpgjs/common\";\nimport { sync, users } from \"@signe/sync\";\nimport { RpgClientPlayer } from \"./Player\";\nimport { Signal, signal, computed, effect } from \"canvasengine\";\nimport { RpgClientEvent } from \"./Event\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { inject } from \"../core/inject\";\n\nexport class RpgClientMap extends RpgCommonMap<any> {\n engine: RpgClientEngine = inject(RpgClientEngine)\n @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});\n @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});\n currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])\n weatherState = signal<WeatherState | null>(null);\n localWeatherOverride = signal<WeatherState | null>(null);\n weather = computed<WeatherState | null>(() => {\n const local = this.localWeatherOverride() \n const state = this.weatherState()\n return local ?? state\n });\n private manualClientPhysicsTick = false;\n private readonly isTestEnvironment: boolean;\n\n constructor() {\n super();\n // Détecter l'environnement de test\n const
|
|
1
|
+
{"version":3,"file":"Map.js","names":[],"sources":["../../src/Game/Map.ts"],"sourcesContent":["import {\n RpgCommonMap,\n type WeatherState,\n type MapPhysicsInitContext,\n type MapPhysicsEntityContext,\n} from \"@rpgjs/common\";\nimport { sync, users } from \"@signe/sync\";\nimport { RpgClientPlayer } from \"./Player\";\nimport { Signal, signal, computed, effect } from \"canvasengine\";\nimport { RpgClientEvent } from \"./Event\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport { inject } from \"../core/inject\";\n\ntype TestGlobalScope = typeof globalThis & {\n process?: {\n env?: {\n TEST?: string;\n };\n };\n __RPGJS_TEST__?: boolean;\n};\n\nexport class RpgClientMap extends RpgCommonMap<any> {\n engine: RpgClientEngine = inject(RpgClientEngine)\n @users(RpgClientPlayer) players = signal<Record<string, RpgClientPlayer>>({});\n @sync(RpgClientEvent) events = signal<Record<string, RpgClientEvent>>({});\n currentPlayer = computed(() => this.players()[this.engine.playerIdSignal()!])\n weatherState = signal<WeatherState | null>(null);\n localWeatherOverride = signal<WeatherState | null>(null);\n weather = computed<WeatherState | null>(() => {\n const local = this.localWeatherOverride() \n const state = this.weatherState()\n return local ?? state\n });\n private manualClientPhysicsTick = false;\n private readonly isTestEnvironment: boolean;\n\n constructor() {\n super();\n // Détecter l'environnement de test\n const testGlobal = globalThis as TestGlobalScope;\n const isTest = testGlobal.process?.env?.TEST === 'true'\n || testGlobal.__RPGJS_TEST__ === true;\n this.isTestEnvironment = isTest;\n if (isTest) {\n this.autoTickEnabled = false;\n }\n }\n\n configureClientPrediction(enabled: boolean): void {\n this.manualClientPhysicsTick = enabled;\n this.autoTickEnabled = enabled ? false : !this.isTestEnvironment;\n }\n\n getCurrentPlayer() {\n return this.currentPlayer()\n }\n\n reset(force = false) {\n const currentPlayerId = this.engine.playerIdSignal();\n const currentPlayer = !force && currentPlayerId\n ? this.players()[currentPlayerId]\n : undefined;\n\n this.players.set(\n currentPlayerId && currentPlayer ? { [currentPlayerId]: currentPlayer } : {}\n );\n this.events.set({})\n this.weatherState.set(null);\n this.localWeatherOverride.set(null);\n this.clearPhysic()\n }\n\n getWeather(): WeatherState | null {\n return this.weather();\n }\n\n setLocalWeather(next: WeatherState | null): void {\n this.localWeatherOverride.set(next);\n }\n\n clearLocalWeather(): void {\n this.localWeatherOverride.set(null);\n }\n\n stepClientPhysics(deltaMs: number): number {\n if (!this.manualClientPhysicsTick) {\n return 0;\n }\n return this.nextTick(deltaMs);\n }\n\n stepPredictionTick(): void {\n this.forceSingleTick();\n }\n\n protected emitPhysicsInit(context: MapPhysicsInitContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsInit\", this, context);\n }\n\n protected emitPhysicsEntityAdd(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityAdd\", this, context);\n }\n\n protected emitPhysicsEntityRemove(context: MapPhysicsEntityContext): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsEntityRemove\", this, context);\n }\n\n protected emitPhysicsReset(): void {\n this.engine?.emitSceneMapHook?.(\"onPhysicsReset\", this);\n }\n}\n"],"mappings":";;;;;;;;;;AAsBA,IAAa,eAAb,cAAkC,aAAkB;CAelD,cAAc;EACZ,OAAO;gBAfiB,OAAO,gBAAgB;iBACf,OAAwC,EAAE,CAAC;gBAC9C,OAAuC,EAAE,CAAC;uBACzD,eAAe,KAAK,SAAS,CAAC,KAAK,OAAO,gBAAgB,EAAG;sBAC9D,OAA4B,KAAK;8BACzB,OAA4B,KAAK;iBAC9C,eAAoC;GAC5C,MAAM,QAAQ,KAAK,sBAAsB;GACzC,MAAM,QAAQ,KAAK,cAAc;GACjC,OAAO,SAAS;IAChB;iCACgC;EAMhC,MAAM,aAAa;EACnB,MAAM,SAAS,WAAW,SAAS,KAAK,SAAS,UAC5C,WAAW,mBAAmB;EACnC,KAAK,oBAAoB;EACzB,IAAI,QACF,KAAK,kBAAkB;;CAI3B,0BAA0B,SAAwB;EAChD,KAAK,0BAA0B;EAC/B,KAAK,kBAAkB,UAAU,QAAQ,CAAC,KAAK;;CAGjD,mBAAmB;EACjB,OAAO,KAAK,eAAe;;CAG7B,MAAM,QAAQ,OAAO;EACnB,MAAM,kBAAkB,KAAK,OAAO,gBAAgB;EACpD,MAAM,gBAAgB,CAAC,SAAS,kBAC5B,KAAK,SAAS,CAAC,mBACf,KAAA;EAEJ,KAAK,QAAQ,IACX,mBAAmB,gBAAgB,GAAG,kBAAkB,eAAe,GAAG,EAAE,CAC7E;EACD,KAAK,OAAO,IAAI,EAAE,CAAC;EACnB,KAAK,aAAa,IAAI,KAAK;EAC3B,KAAK,qBAAqB,IAAI,KAAK;EACnC,KAAK,aAAa;;CAGpB,aAAkC;EAChC,OAAO,KAAK,SAAS;;CAGvB,gBAAgB,MAAiC;EAC/C,KAAK,qBAAqB,IAAI,KAAK;;CAGrC,oBAA0B;EACxB,KAAK,qBAAqB,IAAI,KAAK;;CAGrC,kBAAkB,SAAyB;EACzC,IAAI,CAAC,KAAK,yBACR,OAAO;EAET,OAAO,KAAK,SAAS,QAAQ;;CAG/B,qBAA2B;EACzB,KAAK,iBAAiB;;CAGxB,gBAA0B,SAAsC;EAC9D,KAAK,QAAQ,mBAAmB,iBAAiB,MAAM,QAAQ;;CAGjE,qBAA+B,SAAwC;EACrE,KAAK,QAAQ,mBAAmB,sBAAsB,MAAM,QAAQ;;CAGtE,wBAAkC,SAAwC;EACxE,KAAK,QAAQ,mBAAmB,yBAAyB,MAAM,QAAQ;;CAGzE,mBAAmC;EACjC,KAAK,QAAQ,mBAAmB,kBAAkB,KAAK;;;YArFxD,MAAM,gBAAgB,EAAA,mBAAA,eAAA,OAAA,CAAA,EAAA,aAAA,WAAA,WAAA,KAAA,EAAA;YACtB,KAAK,eAAe,EAAA,mBAAA,eAAA,OAAA,CAAA,EAAA,aAAA,WAAA,UAAA,KAAA,EAAA"}
|
package/dist/Game/Object.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Hooks, RpgCommonPlayer } from '@rpgjs/common';
|
|
2
|
+
import { Trigger } from 'canvasengine';
|
|
2
3
|
import { RpgClientEngine } from '../RpgClientEngine';
|
|
3
4
|
type Frame = {
|
|
4
5
|
x: number;
|
|
@@ -8,18 +9,32 @@ type Frame = {
|
|
|
8
9
|
type AnimationRestoreOptions = {
|
|
9
10
|
restoreAnimationName?: string;
|
|
10
11
|
restoreGraphics?: any[];
|
|
12
|
+
timeoutMs?: number;
|
|
13
|
+
};
|
|
14
|
+
type FlashType = 'alpha' | 'tint' | 'both';
|
|
15
|
+
type FlashOptions = {
|
|
16
|
+
type?: FlashType;
|
|
17
|
+
duration?: number;
|
|
18
|
+
cycles?: number;
|
|
19
|
+
alpha?: number;
|
|
20
|
+
tint?: number | string;
|
|
21
|
+
};
|
|
22
|
+
type FlashTriggerOptions = Omit<FlashOptions, "tint"> & {
|
|
23
|
+
tint: number;
|
|
24
|
+
};
|
|
25
|
+
type ConfigurableTrigger<T> = Omit<Trigger<T>, "start"> & {
|
|
26
|
+
start(config?: T): Promise<void>;
|
|
11
27
|
};
|
|
12
28
|
export declare abstract class RpgClientObject extends RpgCommonPlayer {
|
|
13
29
|
abstract _type: string;
|
|
14
|
-
emitParticleTrigger:
|
|
15
|
-
particleName:
|
|
16
|
-
animationCurrentIndex:
|
|
17
|
-
animationIsPlaying:
|
|
18
|
-
_param:
|
|
30
|
+
emitParticleTrigger: any;
|
|
31
|
+
particleName: any;
|
|
32
|
+
animationCurrentIndex: any;
|
|
33
|
+
animationIsPlaying: any;
|
|
34
|
+
_param: any;
|
|
19
35
|
frames: Frame[];
|
|
20
|
-
graphicsSignals:
|
|
21
|
-
|
|
22
|
-
flashTrigger: import('canvasengine').Trigger<any>;
|
|
36
|
+
graphicsSignals: any;
|
|
37
|
+
flashTrigger: ConfigurableTrigger<FlashTriggerOptions>;
|
|
23
38
|
private animationRestoreState?;
|
|
24
39
|
constructor();
|
|
25
40
|
/**
|
|
@@ -36,7 +51,9 @@ export declare abstract class RpgClientObject extends RpgCommonPlayer {
|
|
|
36
51
|
get engine(): RpgClientEngine<unknown>;
|
|
37
52
|
private animationSubscription?;
|
|
38
53
|
private animationResetTimeout?;
|
|
54
|
+
private animationWaitResolve?;
|
|
39
55
|
private clearAnimationControls;
|
|
56
|
+
private resolveAnimationWait;
|
|
40
57
|
private finishTemporaryAnimation;
|
|
41
58
|
/**
|
|
42
59
|
* Trigger a flash animation on this sprite
|
|
@@ -84,13 +101,7 @@ export declare abstract class RpgClientObject extends RpgCommonPlayer {
|
|
|
84
101
|
* });
|
|
85
102
|
* ```
|
|
86
103
|
*/
|
|
87
|
-
flash(options?:
|
|
88
|
-
type?: 'alpha' | 'tint' | 'both';
|
|
89
|
-
duration?: number;
|
|
90
|
-
cycles?: number;
|
|
91
|
-
alpha?: number;
|
|
92
|
-
tint?: number | string;
|
|
93
|
-
}): void;
|
|
104
|
+
flash(options?: FlashOptions): void;
|
|
94
105
|
/**
|
|
95
106
|
* Reset animation state when animation changes externally
|
|
96
107
|
*
|
|
@@ -113,17 +124,19 @@ export declare abstract class RpgClientObject extends RpgCommonPlayer {
|
|
|
113
124
|
*
|
|
114
125
|
* @param animationName - Name of the animation to play
|
|
115
126
|
* @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)
|
|
127
|
+
* @param options - Restore and timeout options
|
|
128
|
+
* @returns A promise resolved when a finite animation finishes, is interrupted, or times out
|
|
116
129
|
*
|
|
117
130
|
* @example
|
|
118
131
|
* ```ts
|
|
119
132
|
* // Play attack animation 3 times
|
|
120
|
-
* player.setAnimation('attack', 3);
|
|
133
|
+
* await player.setAnimation('attack', 3);
|
|
121
134
|
*
|
|
122
135
|
* // Play continuous spell animation
|
|
123
136
|
* player.setAnimation('spell');
|
|
124
137
|
* ```
|
|
125
138
|
*/
|
|
126
|
-
setAnimation(animationName: string, nbTimes?: number, options?: AnimationRestoreOptions): void
|
|
139
|
+
setAnimation(animationName: string, nbTimes?: number, options?: AnimationRestoreOptions): Promise<void>;
|
|
127
140
|
/**
|
|
128
141
|
* Set a custom animation with temporary graphic change
|
|
129
142
|
*
|
|
@@ -134,21 +147,32 @@ export declare abstract class RpgClientObject extends RpgCommonPlayer {
|
|
|
134
147
|
* @param animationName - Name of the animation to play
|
|
135
148
|
* @param graphic - The graphic(s) to temporarily use during the animation
|
|
136
149
|
* @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)
|
|
150
|
+
* @param options - Restore and timeout options
|
|
151
|
+
* @returns A promise resolved when a finite animation finishes, is interrupted, or times out
|
|
137
152
|
*
|
|
138
153
|
* @example
|
|
139
154
|
* ```ts
|
|
140
155
|
* // Play attack animation with temporary graphic change
|
|
141
|
-
* player.setAnimation('attack', 'hero_attack', 3);
|
|
156
|
+
* await player.setAnimation('attack', 'hero_attack', 3);
|
|
142
157
|
* ```
|
|
143
158
|
*/
|
|
144
|
-
setAnimation(animationName: string, graphic?: string | string[], nbTimes?: number, options?: AnimationRestoreOptions): void
|
|
159
|
+
setAnimation(animationName: string, graphic?: string | string[], nbTimes?: number, options?: AnimationRestoreOptions): Promise<void>;
|
|
145
160
|
/**
|
|
146
161
|
* Display a registered component animation effect on this object.
|
|
147
162
|
*
|
|
148
163
|
* @param id - Identifier of the component animation to play.
|
|
149
164
|
* @param params - Parameters forwarded to the animation effect.
|
|
165
|
+
* @returns A promise resolved when the animation component calls `onFinish`.
|
|
166
|
+
*/
|
|
167
|
+
showComponentAnimation(id: string, params: any): Promise<void>;
|
|
168
|
+
/**
|
|
169
|
+
* Display a registered spritesheet animation effect on this object.
|
|
170
|
+
*
|
|
171
|
+
* @param graphic - Identifier of the spritesheet to use.
|
|
172
|
+
* @param animationName - Name of the animation inside the spritesheet.
|
|
173
|
+
* @returns A promise resolved when the animation component calls `onFinish`.
|
|
150
174
|
*/
|
|
151
|
-
|
|
175
|
+
showAnimation(graphic: string, animationName?: string): Promise<void>;
|
|
152
176
|
/**
|
|
153
177
|
* Check whether this client object represents an event.
|
|
154
178
|
*
|
package/dist/Game/Object.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { inject } from "../core/inject.js";
|
|
2
|
-
import __ce_component from "../components/dynamics/text.ce.js";
|
|
3
2
|
import { RpgClientEngine } from "../RpgClientEngine.js";
|
|
4
3
|
import { signal, trigger } from "canvasengine";
|
|
5
4
|
import { ModulesToken, RpgCommonPlayer } from "@rpgjs/common";
|
|
6
|
-
import {
|
|
5
|
+
import { from, map, of, switchMap } from "rxjs";
|
|
7
6
|
//#region src/Game/Object.ts
|
|
8
|
-
var DYNAMIC_COMPONENTS = { text: __ce_component };
|
|
9
7
|
var RpgClientObject = class extends RpgCommonPlayer {
|
|
10
8
|
constructor() {
|
|
11
9
|
super();
|
|
@@ -16,7 +14,6 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
16
14
|
this._param = signal({});
|
|
17
15
|
this.frames = [];
|
|
18
16
|
this.graphicsSignals = signal([]);
|
|
19
|
-
this._component = {};
|
|
20
17
|
this.flashTrigger = trigger();
|
|
21
18
|
this.hooks.callHooks("client-sprite-onInit", this).subscribe();
|
|
22
19
|
this._frames.observable.subscribe(({ items }) => {
|
|
@@ -30,14 +27,6 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
30
27
|
})).subscribe((sheets) => {
|
|
31
28
|
this.graphicsSignals.set(sheets);
|
|
32
29
|
});
|
|
33
|
-
this.componentsTop.observable.pipe(filter((value) => value !== null && value !== void 0), map((value) => typeof value === "string" ? JSON.parse(value) : value)).subscribe(({ components }) => {
|
|
34
|
-
for (const component of components) for (const [key, value] of Object.entries(component)) {
|
|
35
|
-
this._component = value;
|
|
36
|
-
console.log(value);
|
|
37
|
-
const type = value.type;
|
|
38
|
-
if (DYNAMIC_COMPONENTS[type]) this.engine.addSpriteComponentInFront(DYNAMIC_COMPONENTS[type]);
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
30
|
this.engine.tick.pipe().subscribe(() => {
|
|
42
31
|
const frame = this.frames.shift();
|
|
43
32
|
if (frame) {
|
|
@@ -72,6 +61,11 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
72
61
|
this.animationResetTimeout = void 0;
|
|
73
62
|
}
|
|
74
63
|
}
|
|
64
|
+
resolveAnimationWait() {
|
|
65
|
+
const resolve = this.animationWaitResolve;
|
|
66
|
+
this.animationWaitResolve = void 0;
|
|
67
|
+
resolve?.();
|
|
68
|
+
}
|
|
75
69
|
finishTemporaryAnimation() {
|
|
76
70
|
const restoreState = this.animationRestoreState;
|
|
77
71
|
this.clearAnimationControls();
|
|
@@ -82,6 +76,7 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
82
76
|
}
|
|
83
77
|
this.animationRestoreState = void 0;
|
|
84
78
|
this.animationIsPlaying.set(false);
|
|
79
|
+
this.resolveAnimationWait();
|
|
85
80
|
}
|
|
86
81
|
/**
|
|
87
82
|
* Trigger a flash animation on this sprite
|
|
@@ -173,6 +168,7 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
173
168
|
this.animationIsPlaying.set(false);
|
|
174
169
|
this.animationCurrentIndex.set(0);
|
|
175
170
|
this.clearAnimationControls();
|
|
171
|
+
this.resolveAnimationWait();
|
|
176
172
|
}
|
|
177
173
|
setAnimation(animationName, graphicOrNbTimes, nbTimesOrOptions, options) {
|
|
178
174
|
let graphic;
|
|
@@ -190,6 +186,9 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
190
186
|
}
|
|
191
187
|
} else finalNbTimes = Infinity;
|
|
192
188
|
if (this.animationIsPlaying()) this.finishTemporaryAnimation();
|
|
189
|
+
const waitPromise = finalNbTimes === Infinity ? Promise.resolve() : new Promise((resolve) => {
|
|
190
|
+
this.animationWaitResolve = resolve;
|
|
191
|
+
});
|
|
193
192
|
this.animationIsPlaying.set(true);
|
|
194
193
|
const previousAnimationName = restoreOptions?.restoreAnimationName ?? this.animationName();
|
|
195
194
|
const previousGraphics = restoreOptions?.restoreGraphics ? [...restoreOptions.restoreGraphics] : [...this.graphics()];
|
|
@@ -206,17 +205,32 @@ var RpgClientObject = class extends RpgCommonPlayer {
|
|
|
206
205
|
});
|
|
207
206
|
if (finalNbTimes !== Infinity) this.animationResetTimeout = setTimeout(() => {
|
|
208
207
|
if (this.animationIsPlaying()) this.finishTemporaryAnimation();
|
|
209
|
-
}, Math.max(1e3, finalNbTimes * 1e3));
|
|
208
|
+
}, restoreOptions?.timeoutMs ?? Math.max(1e3, finalNbTimes * 1e3));
|
|
210
209
|
this.animationName.set(animationName);
|
|
210
|
+
return waitPromise;
|
|
211
211
|
}
|
|
212
212
|
/**
|
|
213
213
|
* Display a registered component animation effect on this object.
|
|
214
214
|
*
|
|
215
215
|
* @param id - Identifier of the component animation to play.
|
|
216
216
|
* @param params - Parameters forwarded to the animation effect.
|
|
217
|
+
* @returns A promise resolved when the animation component calls `onFinish`.
|
|
217
218
|
*/
|
|
218
219
|
showComponentAnimation(id, params) {
|
|
219
|
-
inject(RpgClientEngine).getComponentAnimation(id).displayEffect(params, this);
|
|
220
|
+
return inject(RpgClientEngine).getComponentAnimation(id).displayEffect(params, this);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Display a registered spritesheet animation effect on this object.
|
|
224
|
+
*
|
|
225
|
+
* @param graphic - Identifier of the spritesheet to use.
|
|
226
|
+
* @param animationName - Name of the animation inside the spritesheet.
|
|
227
|
+
* @returns A promise resolved when the animation component calls `onFinish`.
|
|
228
|
+
*/
|
|
229
|
+
showAnimation(graphic, animationName = "default") {
|
|
230
|
+
return this.showComponentAnimation("animation", {
|
|
231
|
+
graphic,
|
|
232
|
+
animationName
|
|
233
|
+
});
|
|
220
234
|
}
|
|
221
235
|
/**
|
|
222
236
|
* Check whether this client object represents an event.
|
package/dist/Game/Object.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Object.js","names":[],"sources":["../../src/Game/Object.ts"],"sourcesContent":["import { Hooks, ModulesToken, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { trigger, signal, effect } from \"canvasengine\";\nimport { filter, from, map, of, Subscription, switchMap } from \"rxjs\";\nimport { inject } from \"../core/inject\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\nimport TextComponent from \"../components/dynamics/text.ce\";\n\nconst DYNAMIC_COMPONENTS = {\n text: TextComponent,\n}\n\ntype Frame = { x: number; y: number; ts: number };\n\ntype AnimationRestoreOptions = {\n restoreAnimationName?: string;\n restoreGraphics?: any[];\n};\n\nexport abstract class RpgClientObject extends RpgCommonPlayer {\n abstract _type: string;\n emitParticleTrigger = trigger();\n particleName = signal(\"\");\n animationCurrentIndex = signal(0);\n animationIsPlaying = signal(false);\n _param = signal({});\n frames: Frame[] = [];\n graphicsSignals = signal<any[]>([]);\n _component = {} // temporary component memory\n flashTrigger = trigger();\n private animationRestoreState?: {\n animationName: string;\n graphics: any[];\n };\n\n constructor() {\n super();\n this.hooks.callHooks(\"client-sprite-onInit\", this).subscribe();\n\n this._frames.observable.subscribe(({ items }) => {\n if (!this.id) return;\n //if (this.id == this.engine.playerIdSignal()!) return;\n const nextFrames = items.flatMap((item): Frame[] =>\n Array.isArray(item) ? item : [item]\n );\n this.frames = [...this.frames, ...nextFrames];\n });\n\n this.graphics.observable\n .pipe(\n map(({ items }) => items),\n switchMap(graphics => {\n if (graphics.length === 0) return of([]);\n return from(Promise.all(graphics.map(graphic => this.engine.getSpriteSheet(graphic))));\n })\n )\n .subscribe((sheets) => { \n this.graphicsSignals.set(sheets);\n });\n\n this.componentsTop.observable\n .pipe(\n filter(value => value !== null && value !== undefined),\n map((value) => typeof value === 'string' ? JSON.parse(value) : value),\n )\n .subscribe(({components}) => {\n for (const component of components) {\n for (const [key, value] of Object.entries(component)) {\n this._component = value as any; // temporary component memory\n console.log(value)\n const type = (value as any).type as keyof typeof DYNAMIC_COMPONENTS;\n if (DYNAMIC_COMPONENTS[type]) {\n this.engine.addSpriteComponentInFront(DYNAMIC_COMPONENTS[type]);\n }\n }\n }\n });\n\n this.engine.tick\n .pipe\n //throttleTime(10)\n ()\n .subscribe(() => {\n const frame = this.frames.shift();\n if (frame) {\n if (typeof frame.x !== \"number\" || typeof frame.y !== \"number\") return;\n this.engine.scene.setBodyPosition(\n this.id,\n frame.x,\n frame.y,\n \"top-left\"\n );\n }\n });\n }\n\n /**\n * Access the shared client hook registry.\n *\n * @returns The hook service used to register and trigger client-side hooks.\n */\n get hooks() {\n return inject<Hooks>(ModulesToken);\n }\n\n /**\n * Access the current client engine instance.\n *\n * @returns The active {@link RpgClientEngine} instance.\n */\n get engine() {\n return inject(RpgClientEngine);\n }\n\n private animationSubscription?: Subscription;\n private animationResetTimeout?: ReturnType<typeof setTimeout>;\n\n private clearAnimationControls() {\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n this.animationSubscription = undefined;\n }\n if (this.animationResetTimeout) {\n clearTimeout(this.animationResetTimeout);\n this.animationResetTimeout = undefined;\n }\n }\n\n private finishTemporaryAnimation() {\n const restoreState = this.animationRestoreState;\n this.clearAnimationControls();\n this.animationCurrentIndex.set(0);\n if (restoreState) {\n this.animationName.set(restoreState.animationName);\n this.graphics.set([...restoreState.graphics]);\n }\n this.animationRestoreState = undefined;\n this.animationIsPlaying.set(false);\n }\n\n /**\n * Trigger a flash animation on this sprite\n * \n * This method triggers a flash effect using CanvasEngine's flash directive.\n * The flash can be configured with various options including type (alpha, tint, or both),\n * duration, cycles, and color.\n * \n * ## Design\n * \n * The flash uses a trigger system that is connected to the flash directive in the\n * character component. This allows for flexible configuration and can be triggered\n * from both server events and client-side code.\n * \n * @param options - Flash configuration options\n * @param options.type - Type of flash effect: 'alpha' (opacity), 'tint' (color), or 'both' (default: 'alpha')\n * @param options.duration - Duration of the flash animation in milliseconds (default: 300)\n * @param options.cycles - Number of flash cycles (flash on/off) (default: 1)\n * @param options.alpha - Alpha value when flashing, from 0 to 1 (default: 0.3)\n * @param options.tint - Tint color when flashing as hex value or color name (default: 0xffffff - white)\n * \n * @example\n * ```ts\n * // Simple flash with default settings (alpha flash)\n * player.flash();\n * \n * // Flash with red tint\n * player.flash({ type: 'tint', tint: 0xff0000 });\n * \n * // Flash with both alpha and tint\n * player.flash({ \n * type: 'both', \n * alpha: 0.5, \n * tint: 0xff0000,\n * duration: 200,\n * cycles: 2\n * });\n * \n * // Quick damage flash\n * player.flash({ \n * type: 'tint', \n * tint: 0xff0000, \n * duration: 150,\n * cycles: 1\n * });\n * ```\n */\n flash(options?: {\n type?: 'alpha' | 'tint' | 'both';\n duration?: number;\n cycles?: number;\n alpha?: number;\n tint?: number | string;\n }): void {\n const flashOptions = {\n type: options?.type || 'alpha',\n duration: options?.duration ?? 300,\n cycles: options?.cycles ?? 1,\n alpha: options?.alpha ?? 0.3,\n tint: options?.tint ?? 0xffffff,\n };\n \n // Convert color name to hex if needed\n let tintValue = flashOptions.tint;\n if (typeof tintValue === 'string') {\n // Common color name to hex mapping\n const colorMap: Record<string, number> = {\n 'white': 0xffffff,\n 'red': 0xff0000,\n 'green': 0x00ff00,\n 'blue': 0x0000ff,\n 'yellow': 0xffff00,\n 'cyan': 0x00ffff,\n 'magenta': 0xff00ff,\n 'black': 0x000000,\n };\n tintValue = colorMap[tintValue.toLowerCase()] ?? 0xffffff;\n }\n \n this.flashTrigger.start({\n ...flashOptions,\n tint: tintValue,\n });\n }\n\n /**\n * Reset animation state when animation changes externally\n *\n * This method should be called when the animation changes due to movement\n * or other external factors to ensure the animation system doesn't get stuck\n *\n * @example\n * ```ts\n * // Reset when player starts moving\n * player.resetAnimationState();\n * ```\n */\n resetAnimationState() {\n if (this.animationRestoreState) {\n this.finishTemporaryAnimation();\n return;\n }\n this.animationIsPlaying.set(false);\n this.animationCurrentIndex.set(0);\n this.clearAnimationControls();\n }\n\n /**\n * Set a custom animation for a specific number of times\n *\n * Plays a custom animation for the specified number of repetitions.\n * The animation system prevents overlapping animations and automatically\n * returns to the previous animation when complete.\n *\n * @param animationName - Name of the animation to play\n * @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)\n *\n * @example\n * ```ts\n * // Play attack animation 3 times\n * player.setAnimation('attack', 3);\n *\n * // Play continuous spell animation\n * player.setAnimation('spell');\n * ```\n */\n setAnimation(animationName: string, nbTimes?: number, options?: AnimationRestoreOptions): void;\n /**\n * Set a custom animation with temporary graphic change\n *\n * Plays a custom animation for the specified number of repetitions and temporarily\n * changes the player's graphic (sprite sheet) during the animation. The graphic\n * is automatically reset when the animation finishes.\n *\n * @param animationName - Name of the animation to play\n * @param graphic - The graphic(s) to temporarily use during the animation\n * @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)\n *\n * @example\n * ```ts\n * // Play attack animation with temporary graphic change\n * player.setAnimation('attack', 'hero_attack', 3);\n * ```\n */\n setAnimation(animationName: string, graphic?: string | string[], nbTimes?: number, options?: AnimationRestoreOptions): void;\n setAnimation(\n animationName: string,\n graphicOrNbTimes?: string | string[] | number,\n nbTimesOrOptions?: number | AnimationRestoreOptions,\n options?: AnimationRestoreOptions\n ): void {\n let graphic: string | string[] | undefined;\n let finalNbTimes: number = Infinity;\n let restoreOptions: AnimationRestoreOptions | undefined = options;\n\n // Handle overloads\n if (typeof graphicOrNbTimes === 'number') {\n // setAnimation(animationName, nbTimes)\n finalNbTimes = graphicOrNbTimes;\n restoreOptions = typeof nbTimesOrOptions === 'object' ? nbTimesOrOptions : options;\n } else if (graphicOrNbTimes !== undefined) {\n // setAnimation(animationName, graphic, nbTimes)\n graphic = graphicOrNbTimes;\n if (typeof nbTimesOrOptions === 'number') {\n finalNbTimes = nbTimesOrOptions;\n } else {\n finalNbTimes = Infinity;\n restoreOptions = nbTimesOrOptions ?? options;\n }\n } else {\n // setAnimation(animationName) - nbTimes remains Infinity\n finalNbTimes = Infinity;\n }\n\n if (this.animationIsPlaying()) {\n this.finishTemporaryAnimation();\n }\n\n this.animationIsPlaying.set(true);\n const previousAnimationName =\n restoreOptions?.restoreAnimationName ?? this.animationName();\n const previousGraphics = restoreOptions?.restoreGraphics\n ? [...restoreOptions.restoreGraphics]\n : [...this.graphics()];\n this.animationRestoreState = {\n animationName: previousAnimationName,\n graphics: previousGraphics,\n };\n this.animationCurrentIndex.set(0);\n\n // Temporarily change graphic if provided\n if (graphic !== undefined) {\n if (Array.isArray(graphic)) {\n this.graphics.set(graphic);\n } else {\n this.graphics.set([graphic]);\n }\n }\n\n this.clearAnimationControls();\n\n this.animationSubscription =\n this.animationCurrentIndex.observable.subscribe((index) => {\n if (index >= finalNbTimes) {\n this.finishTemporaryAnimation();\n }\n });\n\n if (finalNbTimes !== Infinity) {\n this.animationResetTimeout = setTimeout(() => {\n if (this.animationIsPlaying()) {\n this.finishTemporaryAnimation();\n }\n }, Math.max(1000, finalNbTimes * 1000));\n }\n\n this.animationName.set(animationName);\n }\n\n /**\n * Display a registered component animation effect on this object.\n *\n * @param id - Identifier of the component animation to play.\n * @param params - Parameters forwarded to the animation effect.\n */\n showComponentAnimation(id: string, params: any) {\n const engine = inject(RpgClientEngine);\n engine.getComponentAnimation(id).displayEffect(params, this);\n }\n \n /**\n * Check whether this client object represents an event.\n *\n * @returns `true` if the object type is `event`, otherwise `false`.\n */\n isEvent(): boolean {\n return this._type === 'event';\n }\n\n /**\n * Check whether this client object represents a player.\n *\n * @returns `true` if the object type is `player`, otherwise `false`.\n */\n isPlayer(): boolean {\n return this._type === 'player';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Object.js","names":[],"sources":["../../src/Game/Object.ts"],"sourcesContent":["import { Hooks, ModulesToken, RpgCommonPlayer } from \"@rpgjs/common\";\nimport { trigger, signal, type Trigger } from \"canvasengine\";\nimport { from, map, of, Subscription, switchMap } from \"rxjs\";\nimport { inject } from \"../core/inject\";\nimport { RpgClientEngine } from \"../RpgClientEngine\";\ntype Frame = { x: number; y: number; ts: number };\n\ntype AnimationRestoreOptions = {\n restoreAnimationName?: string;\n restoreGraphics?: any[];\n timeoutMs?: number;\n};\n\ntype FlashType = 'alpha' | 'tint' | 'both';\n\ntype FlashOptions = {\n type?: FlashType;\n duration?: number;\n cycles?: number;\n alpha?: number;\n tint?: number | string;\n};\n\ntype FlashTriggerOptions = Omit<FlashOptions, \"tint\"> & {\n tint: number;\n};\n\ntype ConfigurableTrigger<T> = Omit<Trigger<T>, \"start\"> & {\n start(config?: T): Promise<void>;\n};\n\nexport abstract class RpgClientObject extends RpgCommonPlayer {\n abstract _type: string;\n emitParticleTrigger = trigger();\n particleName = signal(\"\");\n animationCurrentIndex = signal(0);\n animationIsPlaying = signal(false);\n _param = signal({});\n frames: Frame[] = [];\n graphicsSignals = signal<any[]>([]);\n flashTrigger: ConfigurableTrigger<FlashTriggerOptions> = trigger<FlashTriggerOptions>();\n private animationRestoreState?: {\n animationName: string;\n graphics: any[];\n };\n\n constructor() {\n super();\n this.hooks.callHooks(\"client-sprite-onInit\", this).subscribe();\n\n this._frames.observable.subscribe(({ items }) => {\n if (!this.id) return;\n //if (this.id == this.engine.playerIdSignal()!) return;\n const nextFrames = items.flatMap((item): Frame[] =>\n Array.isArray(item) ? item : [item]\n );\n this.frames = [...this.frames, ...nextFrames];\n });\n\n this.graphics.observable\n .pipe(\n map(({ items }) => items),\n switchMap(graphics => {\n if (graphics.length === 0) return of([]);\n return from(Promise.all(graphics.map(graphic => this.engine.getSpriteSheet(graphic))));\n })\n )\n .subscribe((sheets) => { \n this.graphicsSignals.set(sheets);\n });\n\n this.engine.tick\n .pipe\n //throttleTime(10)\n ()\n .subscribe(() => {\n const frame = this.frames.shift();\n if (frame) {\n if (typeof frame.x !== \"number\" || typeof frame.y !== \"number\") return;\n this.engine.scene.setBodyPosition(\n this.id,\n frame.x,\n frame.y,\n \"top-left\"\n );\n }\n });\n }\n\n /**\n * Access the shared client hook registry.\n *\n * @returns The hook service used to register and trigger client-side hooks.\n */\n get hooks() {\n return inject<Hooks>(ModulesToken);\n }\n\n /**\n * Access the current client engine instance.\n *\n * @returns The active {@link RpgClientEngine} instance.\n */\n get engine() {\n return inject(RpgClientEngine);\n }\n\n private animationSubscription?: Subscription;\n private animationResetTimeout?: ReturnType<typeof setTimeout>;\n private animationWaitResolve?: () => void;\n\n private clearAnimationControls() {\n if (this.animationSubscription) {\n this.animationSubscription.unsubscribe();\n this.animationSubscription = undefined;\n }\n if (this.animationResetTimeout) {\n clearTimeout(this.animationResetTimeout);\n this.animationResetTimeout = undefined;\n }\n }\n\n private resolveAnimationWait() {\n const resolve = this.animationWaitResolve;\n this.animationWaitResolve = undefined;\n resolve?.();\n }\n\n private finishTemporaryAnimation() {\n const restoreState = this.animationRestoreState;\n this.clearAnimationControls();\n this.animationCurrentIndex.set(0);\n if (restoreState) {\n this.animationName.set(restoreState.animationName);\n this.graphics.set([...restoreState.graphics]);\n }\n this.animationRestoreState = undefined;\n this.animationIsPlaying.set(false);\n this.resolveAnimationWait();\n }\n\n /**\n * Trigger a flash animation on this sprite\n * \n * This method triggers a flash effect using CanvasEngine's flash directive.\n * The flash can be configured with various options including type (alpha, tint, or both),\n * duration, cycles, and color.\n * \n * ## Design\n * \n * The flash uses a trigger system that is connected to the flash directive in the\n * character component. This allows for flexible configuration and can be triggered\n * from both server events and client-side code.\n * \n * @param options - Flash configuration options\n * @param options.type - Type of flash effect: 'alpha' (opacity), 'tint' (color), or 'both' (default: 'alpha')\n * @param options.duration - Duration of the flash animation in milliseconds (default: 300)\n * @param options.cycles - Number of flash cycles (flash on/off) (default: 1)\n * @param options.alpha - Alpha value when flashing, from 0 to 1 (default: 0.3)\n * @param options.tint - Tint color when flashing as hex value or color name (default: 0xffffff - white)\n * \n * @example\n * ```ts\n * // Simple flash with default settings (alpha flash)\n * player.flash();\n * \n * // Flash with red tint\n * player.flash({ type: 'tint', tint: 0xff0000 });\n * \n * // Flash with both alpha and tint\n * player.flash({ \n * type: 'both', \n * alpha: 0.5, \n * tint: 0xff0000,\n * duration: 200,\n * cycles: 2\n * });\n * \n * // Quick damage flash\n * player.flash({ \n * type: 'tint', \n * tint: 0xff0000, \n * duration: 150,\n * cycles: 1\n * });\n * ```\n */\n flash(options?: FlashOptions): void {\n const flashOptions = {\n type: options?.type || 'alpha',\n duration: options?.duration ?? 300,\n cycles: options?.cycles ?? 1,\n alpha: options?.alpha ?? 0.3,\n tint: options?.tint ?? 0xffffff,\n };\n \n // Convert color name to hex if needed\n let tintValue = flashOptions.tint;\n if (typeof tintValue === 'string') {\n // Common color name to hex mapping\n const colorMap: Record<string, number> = {\n 'white': 0xffffff,\n 'red': 0xff0000,\n 'green': 0x00ff00,\n 'blue': 0x0000ff,\n 'yellow': 0xffff00,\n 'cyan': 0x00ffff,\n 'magenta': 0xff00ff,\n 'black': 0x000000,\n };\n tintValue = colorMap[tintValue.toLowerCase()] ?? 0xffffff;\n }\n \n this.flashTrigger.start({\n ...flashOptions,\n tint: tintValue,\n });\n }\n\n /**\n * Reset animation state when animation changes externally\n *\n * This method should be called when the animation changes due to movement\n * or other external factors to ensure the animation system doesn't get stuck\n *\n * @example\n * ```ts\n * // Reset when player starts moving\n * player.resetAnimationState();\n * ```\n */\n resetAnimationState() {\n if (this.animationRestoreState) {\n this.finishTemporaryAnimation();\n return;\n }\n this.animationIsPlaying.set(false);\n this.animationCurrentIndex.set(0);\n this.clearAnimationControls();\n this.resolveAnimationWait();\n }\n\n /**\n * Set a custom animation for a specific number of times\n *\n * Plays a custom animation for the specified number of repetitions.\n * The animation system prevents overlapping animations and automatically\n * returns to the previous animation when complete.\n *\n * @param animationName - Name of the animation to play\n * @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)\n * @param options - Restore and timeout options\n * @returns A promise resolved when a finite animation finishes, is interrupted, or times out\n *\n * @example\n * ```ts\n * // Play attack animation 3 times\n * await player.setAnimation('attack', 3);\n *\n * // Play continuous spell animation\n * player.setAnimation('spell');\n * ```\n */\n setAnimation(animationName: string, nbTimes?: number, options?: AnimationRestoreOptions): Promise<void>;\n /**\n * Set a custom animation with temporary graphic change\n *\n * Plays a custom animation for the specified number of repetitions and temporarily\n * changes the player's graphic (sprite sheet) during the animation. The graphic\n * is automatically reset when the animation finishes.\n *\n * @param animationName - Name of the animation to play\n * @param graphic - The graphic(s) to temporarily use during the animation\n * @param nbTimes - Number of times to repeat the animation (default: Infinity for continuous)\n * @param options - Restore and timeout options\n * @returns A promise resolved when a finite animation finishes, is interrupted, or times out\n *\n * @example\n * ```ts\n * // Play attack animation with temporary graphic change\n * await player.setAnimation('attack', 'hero_attack', 3);\n * ```\n */\n setAnimation(animationName: string, graphic?: string | string[], nbTimes?: number, options?: AnimationRestoreOptions): Promise<void>;\n setAnimation(\n animationName: string,\n graphicOrNbTimes?: string | string[] | number,\n nbTimesOrOptions?: number | AnimationRestoreOptions,\n options?: AnimationRestoreOptions\n ): Promise<void> {\n let graphic: string | string[] | undefined;\n let finalNbTimes: number = Infinity;\n let restoreOptions: AnimationRestoreOptions | undefined = options;\n\n // Handle overloads\n if (typeof graphicOrNbTimes === 'number') {\n // setAnimation(animationName, nbTimes)\n finalNbTimes = graphicOrNbTimes;\n restoreOptions = typeof nbTimesOrOptions === 'object' ? nbTimesOrOptions : options;\n } else if (graphicOrNbTimes !== undefined) {\n // setAnimation(animationName, graphic, nbTimes)\n graphic = graphicOrNbTimes;\n if (typeof nbTimesOrOptions === 'number') {\n finalNbTimes = nbTimesOrOptions;\n } else {\n finalNbTimes = Infinity;\n restoreOptions = nbTimesOrOptions ?? options;\n }\n } else {\n // setAnimation(animationName) - nbTimes remains Infinity\n finalNbTimes = Infinity;\n }\n\n if (this.animationIsPlaying()) {\n this.finishTemporaryAnimation();\n }\n\n const waitPromise =\n finalNbTimes === Infinity\n ? Promise.resolve()\n : new Promise<void>((resolve) => {\n this.animationWaitResolve = resolve;\n });\n\n this.animationIsPlaying.set(true);\n const previousAnimationName =\n restoreOptions?.restoreAnimationName ?? this.animationName();\n const previousGraphics = restoreOptions?.restoreGraphics\n ? [...restoreOptions.restoreGraphics]\n : [...this.graphics()];\n this.animationRestoreState = {\n animationName: previousAnimationName,\n graphics: previousGraphics,\n };\n this.animationCurrentIndex.set(0);\n\n // Temporarily change graphic if provided\n if (graphic !== undefined) {\n if (Array.isArray(graphic)) {\n this.graphics.set(graphic);\n } else {\n this.graphics.set([graphic]);\n }\n }\n\n this.clearAnimationControls();\n\n this.animationSubscription =\n this.animationCurrentIndex.observable.subscribe((index) => {\n if (index >= finalNbTimes) {\n this.finishTemporaryAnimation();\n }\n });\n\n if (finalNbTimes !== Infinity) {\n this.animationResetTimeout = setTimeout(() => {\n if (this.animationIsPlaying()) {\n this.finishTemporaryAnimation();\n }\n }, restoreOptions?.timeoutMs ?? Math.max(1000, finalNbTimes * 1000));\n }\n\n this.animationName.set(animationName);\n\n return waitPromise;\n }\n\n /**\n * Display a registered component animation effect on this object.\n *\n * @param id - Identifier of the component animation to play.\n * @param params - Parameters forwarded to the animation effect.\n * @returns A promise resolved when the animation component calls `onFinish`.\n */\n showComponentAnimation(id: string, params: any): Promise<void> {\n const engine = inject(RpgClientEngine);\n return engine.getComponentAnimation(id).displayEffect(params, this);\n }\n\n /**\n * Display a registered spritesheet animation effect on this object.\n *\n * @param graphic - Identifier of the spritesheet to use.\n * @param animationName - Name of the animation inside the spritesheet.\n * @returns A promise resolved when the animation component calls `onFinish`.\n */\n showAnimation(graphic: string, animationName: string = 'default'): Promise<void> {\n return this.showComponentAnimation('animation', {\n graphic,\n animationName,\n });\n }\n \n /**\n * Check whether this client object represents an event.\n *\n * @returns `true` if the object type is `event`, otherwise `false`.\n */\n isEvent(): boolean {\n return this._type === 'event';\n }\n\n /**\n * Check whether this client object represents a player.\n *\n * @returns `true` if the object type is `player`, otherwise `false`.\n */\n isPlayer(): boolean {\n return this._type === 'player';\n }\n}\n"],"mappings":"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"}
|
package/dist/Gui/Gui.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Subscription } from 'rxjs';
|
|
|
4
4
|
interface GuiOptions {
|
|
5
5
|
name?: string;
|
|
6
6
|
id?: string;
|
|
7
|
-
component
|
|
7
|
+
component?: any;
|
|
8
8
|
display?: boolean;
|
|
9
9
|
data?: any;
|
|
10
10
|
/**
|
|
@@ -24,14 +24,18 @@ interface GuiOptions {
|
|
|
24
24
|
* @default false
|
|
25
25
|
*/
|
|
26
26
|
attachToSprite?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Vue v4 compatibility flag. Prefer attachToSprite in v5 projects.
|
|
29
|
+
*/
|
|
30
|
+
rpgAttachToSprite?: boolean;
|
|
27
31
|
}
|
|
28
|
-
interface GuiInstance {
|
|
32
|
+
export interface GuiInstance {
|
|
29
33
|
name: string;
|
|
30
34
|
component: any;
|
|
31
35
|
display: WritableSignal<boolean>;
|
|
32
36
|
data: WritableSignal<any>;
|
|
33
37
|
autoDisplay: boolean;
|
|
34
|
-
dependencies?:
|
|
38
|
+
dependencies?: Signal[];
|
|
35
39
|
subscription?: Subscription;
|
|
36
40
|
attachToSprite?: boolean;
|
|
37
41
|
}
|
|
@@ -45,7 +49,7 @@ type OptimisticReducer = (data: any, action: GuiAction) => any;
|
|
|
45
49
|
export declare class RpgGui {
|
|
46
50
|
private context;
|
|
47
51
|
private webSocket;
|
|
48
|
-
gui:
|
|
52
|
+
gui: any;
|
|
49
53
|
extraGuis: GuiInstance[];
|
|
50
54
|
private vueGuiInstance;
|
|
51
55
|
private optimisticReducers;
|
|
@@ -54,7 +58,7 @@ export declare class RpgGui {
|
|
|
54
58
|
* Signal tracking which player IDs should display attached GUIs
|
|
55
59
|
* Key: player ID, Value: boolean (true = show, false = hide)
|
|
56
60
|
*/
|
|
57
|
-
attachedGuiDisplayState:
|
|
61
|
+
attachedGuiDisplayState: any;
|
|
58
62
|
constructor(context: Context);
|
|
59
63
|
_initialize(): Promise<void>;
|
|
60
64
|
/**
|
|
@@ -113,7 +117,7 @@ export declare class RpgGui {
|
|
|
113
117
|
* });
|
|
114
118
|
* ```
|
|
115
119
|
*/
|
|
116
|
-
add(gui: GuiOptions): void;
|
|
120
|
+
add(gui: GuiOptions | any): void;
|
|
117
121
|
registerOptimisticReducer(guiId: string, reducer: OptimisticReducer): void;
|
|
118
122
|
/**
|
|
119
123
|
* Get all attached GUI components (attachToSprite: true)
|
|
@@ -130,6 +134,8 @@ export declare class RpgGui {
|
|
|
130
134
|
* ```
|
|
131
135
|
*/
|
|
132
136
|
getAttachedGuis(): GuiInstance[];
|
|
137
|
+
getVueGuis(): GuiInstance[];
|
|
138
|
+
getAttachedVueGuis(): GuiInstance[];
|
|
133
139
|
/**
|
|
134
140
|
* Check if a player should display attached GUIs
|
|
135
141
|
*
|
|
@@ -187,6 +193,13 @@ export declare class RpgGui {
|
|
|
187
193
|
*/
|
|
188
194
|
hide(id: string): void;
|
|
189
195
|
private isVueComponent;
|
|
196
|
+
private isVueComponentInstance;
|
|
197
|
+
private removeCanvasGui;
|
|
198
|
+
private removeVueGui;
|
|
199
|
+
private resolveComponent;
|
|
200
|
+
private resolveGuiId;
|
|
201
|
+
private resolveAttachToSprite;
|
|
202
|
+
private toGuiState;
|
|
190
203
|
private clearPendingActions;
|
|
191
204
|
private applyReducers;
|
|
192
205
|
private applyOptimisticAction;
|