@rpgjs/client 5.0.0-beta.10 → 5.0.0-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/Game/ProjectileManager.d.ts +89 -0
  3. package/dist/Game/ProjectileManager.js +179 -0
  4. package/dist/Game/ProjectileManager.js.map +1 -0
  5. package/dist/Game/ProjectileManager.spec.d.ts +1 -0
  6. package/dist/RpgClient.d.ts +53 -13
  7. package/dist/RpgClientEngine.d.ts +25 -4
  8. package/dist/RpgClientEngine.js +197 -48
  9. package/dist/RpgClientEngine.js.map +1 -1
  10. package/dist/components/animations/hit.ce.js.map +1 -1
  11. package/dist/components/character.ce.js +32 -30
  12. package/dist/components/character.ce.js.map +1 -1
  13. package/dist/components/dynamics/bar.ce.js +4 -3
  14. package/dist/components/dynamics/bar.ce.js.map +1 -1
  15. package/dist/components/dynamics/image.ce.js +2 -1
  16. package/dist/components/dynamics/image.ce.js.map +1 -1
  17. package/dist/components/dynamics/shape.ce.js +3 -2
  18. package/dist/components/dynamics/shape.ce.js.map +1 -1
  19. package/dist/components/dynamics/text.ce.js +9 -8
  20. package/dist/components/dynamics/text.ce.js.map +1 -1
  21. package/dist/components/gui/dialogbox/index.ce.js +3 -2
  22. package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
  23. package/dist/components/gui/gameover.ce.js +3 -2
  24. package/dist/components/gui/gameover.ce.js.map +1 -1
  25. package/dist/components/gui/hud/hud.ce.js.map +1 -1
  26. package/dist/components/gui/menu/equip-menu.ce.js +2 -1
  27. package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
  28. package/dist/components/gui/menu/exit-menu.ce.js +2 -1
  29. package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
  30. package/dist/components/gui/menu/items-menu.ce.js +3 -2
  31. package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
  32. package/dist/components/gui/menu/main-menu.ce.js +3 -2
  33. package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
  34. package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
  35. package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
  36. package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
  37. package/dist/components/gui/notification/notification.ce.js.map +1 -1
  38. package/dist/components/gui/save-load.ce.js +2 -1
  39. package/dist/components/gui/save-load.ce.js.map +1 -1
  40. package/dist/components/gui/shop/shop.ce.js +3 -2
  41. package/dist/components/gui/shop/shop.ce.js.map +1 -1
  42. package/dist/components/gui/title-screen.ce.js +3 -2
  43. package/dist/components/gui/title-screen.ce.js.map +1 -1
  44. package/dist/components/index.d.ts +2 -1
  45. package/dist/components/index.js +1 -0
  46. package/dist/components/player-components.ce.js +11 -10
  47. package/dist/components/player-components.ce.js.map +1 -1
  48. package/dist/components/prebuilt/hp-bar.ce.js +4 -3
  49. package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
  50. package/dist/components/prebuilt/light-halo.ce.js +2 -1
  51. package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
  52. package/dist/components/scenes/canvas.ce.js +12 -4
  53. package/dist/components/scenes/canvas.ce.js.map +1 -1
  54. package/dist/components/scenes/draw-map.ce.js +6 -3
  55. package/dist/components/scenes/draw-map.ce.js.map +1 -1
  56. package/dist/components/scenes/event-layer.ce.js.map +1 -1
  57. package/dist/index.d.ts +3 -0
  58. package/dist/index.js +9 -5
  59. package/dist/module.js +11 -0
  60. package/dist/module.js.map +1 -1
  61. package/dist/services/actionInput.d.ts +12 -0
  62. package/dist/services/actionInput.js +27 -0
  63. package/dist/services/actionInput.js.map +1 -0
  64. package/dist/services/actionInput.spec.d.ts +1 -0
  65. package/dist/services/mmorpg-connection.d.ts +5 -0
  66. package/dist/services/mmorpg-connection.js +50 -0
  67. package/dist/services/mmorpg-connection.js.map +1 -0
  68. package/dist/services/mmorpg-connection.spec.d.ts +1 -0
  69. package/dist/services/mmorpg.d.ts +10 -4
  70. package/dist/services/mmorpg.js +48 -30
  71. package/dist/services/mmorpg.js.map +1 -1
  72. package/dist/services/pointerContext.d.ts +11 -0
  73. package/dist/services/pointerContext.js +48 -0
  74. package/dist/services/pointerContext.js.map +1 -0
  75. package/dist/services/pointerContext.spec.d.ts +1 -0
  76. package/dist/services/standalone-message.d.ts +1 -0
  77. package/dist/services/standalone-message.js +9 -0
  78. package/dist/services/standalone-message.js.map +1 -0
  79. package/dist/services/standalone.js +3 -2
  80. package/dist/services/standalone.js.map +1 -1
  81. package/dist/services/standalone.spec.d.ts +1 -0
  82. package/package.json +7 -7
  83. package/src/Game/ProjectileManager.spec.ts +338 -0
  84. package/src/Game/ProjectileManager.ts +324 -0
  85. package/src/RpgClient.ts +62 -15
  86. package/src/RpgClientEngine.ts +287 -65
  87. package/src/components/character.ce +34 -32
  88. package/src/components/dynamics/bar.ce +4 -3
  89. package/src/components/dynamics/image.ce +2 -1
  90. package/src/components/dynamics/shape.ce +3 -2
  91. package/src/components/dynamics/text.ce +9 -8
  92. package/src/components/gui/dialogbox/index.ce +3 -2
  93. package/src/components/gui/gameover.ce +2 -1
  94. package/src/components/gui/menu/equip-menu.ce +2 -1
  95. package/src/components/gui/menu/exit-menu.ce +2 -1
  96. package/src/components/gui/menu/items-menu.ce +3 -2
  97. package/src/components/gui/menu/main-menu.ce +2 -1
  98. package/src/components/gui/save-load.ce +2 -1
  99. package/src/components/gui/shop/shop.ce +3 -2
  100. package/src/components/gui/title-screen.ce +2 -1
  101. package/src/components/index.ts +2 -1
  102. package/src/components/player-components.ce +11 -10
  103. package/src/components/prebuilt/hp-bar.ce +4 -3
  104. package/src/components/prebuilt/light-halo.ce +2 -2
  105. package/src/components/scenes/canvas.ce +10 -2
  106. package/src/components/scenes/draw-map.ce +17 -3
  107. package/src/index.ts +3 -0
  108. package/src/module.ts +13 -0
  109. package/src/services/actionInput.spec.ts +101 -0
  110. package/src/services/actionInput.ts +53 -0
  111. package/src/services/mmorpg-connection.spec.ts +99 -0
  112. package/src/services/mmorpg-connection.ts +69 -0
  113. package/src/services/mmorpg.ts +60 -34
  114. package/src/services/pointerContext.spec.ts +36 -0
  115. package/src/services/pointerContext.ts +84 -0
  116. package/src/services/standalone-message.ts +7 -0
  117. package/src/services/standalone.spec.ts +34 -0
  118. package/src/services/standalone.ts +3 -2
@@ -0,0 +1,84 @@
1
+ export interface ClientPointerPosition {
2
+ x: number;
3
+ y: number;
4
+ }
5
+
6
+ export interface ClientPointerContext {
7
+ screen(): ClientPointerPosition | null;
8
+ world(): ClientPointerPosition | null;
9
+ update(screen: ClientPointerPosition | null, world?: ClientPointerPosition | null): ClientPointerPosition | null;
10
+ updateFromEvent(event: any): ClientPointerPosition | null;
11
+ }
12
+
13
+ function toPosition(point: any): ClientPointerPosition | null {
14
+ const x = Number(point?.x);
15
+ const y = Number(point?.y);
16
+
17
+ if (!Number.isFinite(x) || !Number.isFinite(y)) {
18
+ return null;
19
+ }
20
+
21
+ return { x, y };
22
+ }
23
+
24
+ function extractGlobalPoint(event: any): ClientPointerPosition | null {
25
+ return toPosition(event?.global)
26
+ ?? toPosition(event?.data?.global)
27
+ ?? toPosition(event);
28
+ }
29
+
30
+ function extractWorldPoint(event: any, global: ClientPointerPosition | null): ClientPointerPosition | null {
31
+ const target = event?.currentTarget ?? event?.target;
32
+
33
+ if (target && global && typeof target.toLocal === "function") {
34
+ return toPosition(target.toLocal(global));
35
+ }
36
+
37
+ if (typeof event?.getLocalPosition === "function") {
38
+ return toPosition(event.getLocalPosition(target));
39
+ }
40
+
41
+ if (typeof event?.data?.getLocalPosition === "function") {
42
+ return toPosition(event.data.getLocalPosition(target));
43
+ }
44
+
45
+ return global;
46
+ }
47
+
48
+ export function createClientPointerContext(): ClientPointerContext {
49
+ let lastScreen: ClientPointerPosition | null = null;
50
+ let lastWorld: ClientPointerPosition | null = null;
51
+
52
+ const update = (screen: ClientPointerPosition | null, world?: ClientPointerPosition | null) => {
53
+ const nextScreen = toPosition(screen);
54
+ const nextWorld = toPosition(world) ?? nextScreen;
55
+
56
+ if (nextScreen) {
57
+ lastScreen = nextScreen;
58
+ }
59
+
60
+ if (nextWorld) {
61
+ lastWorld = nextWorld;
62
+ }
63
+
64
+ return lastWorld ? { ...lastWorld } : null;
65
+ };
66
+
67
+ return {
68
+ screen() {
69
+ return lastScreen ? { ...lastScreen } : null;
70
+ },
71
+
72
+ world() {
73
+ return lastWorld ? { ...lastWorld } : null;
74
+ },
75
+
76
+ update,
77
+
78
+ updateFromEvent(event: any) {
79
+ const global = extractGlobalPoint(event);
80
+ const world = extractWorldPoint(event, global);
81
+ return update(global, world);
82
+ },
83
+ };
84
+ }
@@ -0,0 +1,7 @@
1
+ export function normalizeStandaloneMessage(event: unknown): any {
2
+ const raw = event && typeof event === "object" && "data" in event
3
+ ? (event as MessageEvent).data
4
+ : event;
5
+
6
+ return typeof raw === "string" ? JSON.parse(raw) : raw;
7
+ }
@@ -0,0 +1,34 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import { normalizeStandaloneMessage } from "./standalone-message";
3
+
4
+ describe("standalone websocket bridge", () => {
5
+ test("dispatches mock room object broadcasts to named listeners", () => {
6
+ const onSpawn = vi.fn();
7
+ const object = normalizeStandaloneMessage({
8
+ type: "projectile:spawnBatch",
9
+ value: {
10
+ projectiles: [{ id: "p1", type: "bolt" }],
11
+ },
12
+ });
13
+
14
+ if (object.type === "projectile:spawnBatch") {
15
+ onSpawn(object.value);
16
+ }
17
+
18
+ expect(onSpawn).toHaveBeenCalledWith({
19
+ projectiles: [{ id: "p1", type: "bolt" }],
20
+ });
21
+ });
22
+
23
+ test("still accepts browser-style string messages", () => {
24
+ expect(normalizeStandaloneMessage({
25
+ data: JSON.stringify({
26
+ type: "projectile:spawnBatch",
27
+ value: { projectiles: [] },
28
+ }),
29
+ })).toEqual({
30
+ type: "projectile:spawnBatch",
31
+ value: { projectiles: [] },
32
+ });
33
+ });
34
+ });
@@ -7,6 +7,7 @@ import { LoadMapToken } from "./loadMap";
7
7
  import { RpgGui } from "../Gui/Gui";
8
8
  import { provideKeyboardControls } from "./keyboardControls";
9
9
  import { provideSaveClient } from "./save";
10
+ import { normalizeStandaloneMessage } from "./standalone-message";
10
11
 
11
12
  type ServerIo = any;
12
13
  type ClientIo = any;
@@ -58,16 +59,16 @@ class BridgeWebsocket extends AbstractWebsocket {
58
59
  }
59
60
  })
60
61
  listeners?.(this.socket)
61
- await this.serverInstance.onConnect(this.socket.conn as any, { request } as any);
62
62
  this.room.clients.set(this.socket.id, this.socket);
63
63
  this.pendingOn.forEach(({ event, callback }) => this.socket.addEventListener(event, callback));
64
64
  this.pendingOn = [];
65
+ await this.serverInstance.onConnect(this.socket.conn as any, { request } as any);
65
66
  return this.socket
66
67
  }
67
68
 
68
69
  on(key: string, callback: (data: any) => void) {
69
70
  const handler = (event) => {
70
- const object = JSON.parse(event);
71
+ const object = normalizeStandaloneMessage(event);
71
72
  if (object.type === key) {
72
73
  callback(object.value);
73
74
  }