@rpgjs/action-battle 5.0.0-beta.1 → 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 (103) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/LICENSE +19 -0
  3. package/README.md +392 -22
  4. package/dist/{ai.server.d.ts → client/ai.server.d.ts} +90 -28
  5. package/dist/client/animations.d.ts +16 -0
  6. package/dist/{client.d.ts → client/client.d.ts} +3 -2
  7. package/dist/{config.d.ts → client/config.d.ts} +2 -0
  8. package/dist/client/core/attack-profile.d.ts +9 -0
  9. package/dist/client/core/attack-runtime.d.ts +20 -0
  10. package/dist/client/core/context.d.ts +5 -0
  11. package/dist/client/core/defaults.d.ts +81 -0
  12. package/dist/client/core/enemy-attack-profiles.d.ts +6 -0
  13. package/dist/client/core/equipment.d.ts +2 -0
  14. package/dist/client/core/hit-reaction.d.ts +5 -0
  15. package/dist/client/core/hit.d.ts +2 -0
  16. package/dist/client/enemies/factory.d.ts +7 -0
  17. package/dist/client/index.d.ts +21 -0
  18. package/dist/client/index.js +24 -31
  19. package/dist/client/index10.js +61 -0
  20. package/dist/client/index11.js +55 -0
  21. package/dist/client/index12.js +106 -0
  22. package/dist/client/index13.js +143 -0
  23. package/dist/client/index14.js +25 -0
  24. package/dist/client/index15.js +72 -0
  25. package/dist/client/index16.js +1343 -0
  26. package/dist/client/index17.js +13 -0
  27. package/dist/client/index18.js +60 -0
  28. package/dist/client/index19.js +10 -0
  29. package/dist/client/index2.js +30 -45
  30. package/dist/client/index20.js +504 -0
  31. package/dist/client/index3.js +45 -1288
  32. package/dist/client/index4.js +105 -330
  33. package/dist/client/index5.js +84 -291
  34. package/dist/client/index6.js +309 -95
  35. package/dist/client/index7.js +35 -59
  36. package/dist/client/index8.js +101 -54
  37. package/dist/client/index9.js +79 -30
  38. package/dist/{server.d.ts → client/server.d.ts} +12 -4
  39. package/dist/client/ui/state.d.ts +35 -0
  40. package/dist/server/ai.server.d.ts +569 -0
  41. package/dist/server/animations.d.ts +16 -0
  42. package/dist/server/config.d.ts +5 -0
  43. package/dist/server/core/attack-profile.d.ts +9 -0
  44. package/dist/server/core/attack-runtime.d.ts +20 -0
  45. package/dist/server/core/context.d.ts +5 -0
  46. package/dist/server/core/defaults.d.ts +81 -0
  47. package/dist/server/core/enemy-attack-profiles.d.ts +6 -0
  48. package/dist/server/core/equipment.d.ts +2 -0
  49. package/dist/server/core/hit-reaction.d.ts +5 -0
  50. package/dist/server/core/hit.d.ts +2 -0
  51. package/dist/server/enemies/factory.d.ts +7 -0
  52. package/dist/server/index.d.ts +21 -0
  53. package/dist/server/index.js +23 -31
  54. package/dist/server/index10.js +1342 -0
  55. package/dist/server/index11.js +37 -0
  56. package/dist/server/index12.js +60 -0
  57. package/dist/server/index13.js +13 -0
  58. package/dist/server/index14.js +503 -0
  59. package/dist/server/index15.js +10 -0
  60. package/dist/server/index2.js +59 -332
  61. package/dist/server/index3.js +29 -1286
  62. package/dist/server/index4.js +45 -53
  63. package/dist/server/index5.js +107 -29
  64. package/dist/server/index6.js +143 -0
  65. package/dist/server/index7.js +25 -0
  66. package/dist/server/index8.js +72 -0
  67. package/dist/server/index9.js +55 -0
  68. package/dist/server/server.d.ts +106 -0
  69. package/dist/server/targeting.d.ts +19 -0
  70. package/package.json +15 -15
  71. package/src/ai.server.spec.ts +120 -0
  72. package/src/ai.server.ts +515 -91
  73. package/src/animations.ts +149 -0
  74. package/src/canvas-engine-shim.ts +4 -0
  75. package/src/client.ts +130 -2
  76. package/src/components/action-bar.ce +7 -5
  77. package/src/components/attack-preview.ce +90 -0
  78. package/src/config.ts +61 -0
  79. package/src/core/attack-profile.spec.ts +118 -0
  80. package/src/core/attack-profile.ts +100 -0
  81. package/src/core/attack-runtime.spec.ts +103 -0
  82. package/src/core/attack-runtime.ts +83 -0
  83. package/src/core/context.ts +35 -0
  84. package/src/core/contracts.ts +126 -0
  85. package/src/core/defaults.ts +162 -0
  86. package/src/core/enemy-attack-profiles.spec.ts +35 -0
  87. package/src/core/enemy-attack-profiles.ts +103 -0
  88. package/src/core/equipment.spec.ts +37 -0
  89. package/src/core/equipment.ts +17 -0
  90. package/src/core/hit-reaction.spec.ts +43 -0
  91. package/src/core/hit-reaction.ts +70 -0
  92. package/src/core/hit.spec.ts +111 -0
  93. package/src/core/hit.ts +92 -0
  94. package/src/enemies/factory.ts +25 -0
  95. package/src/index.ts +94 -1
  96. package/src/server.ts +427 -93
  97. package/src/targeting.spec.ts +24 -0
  98. package/src/types/canvas-engine.d.ts +4 -0
  99. package/src/types.ts +148 -0
  100. package/src/ui/state.ts +57 -0
  101. package/dist/index.d.ts +0 -11
  102. package/dist/ui/state.d.ts +0 -18
  103. /package/dist/{targeting.d.ts → client/targeting.d.ts} +0 -0
package/package.json CHANGED
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "@rpgjs/action-battle",
3
- "version": "5.0.0-beta.1",
4
- "main": "dist/index.js",
5
- "types": "dist/index.d.ts",
3
+ "version": "5.0.0-beta.11",
4
+ "main": "dist/client/index.js",
5
+ "types": "dist/client/index.d.ts",
6
6
  "exports": {
7
7
  ".": {
8
8
  "import": "./dist/client/index.js",
9
- "types": "./dist/index.d.ts"
9
+ "types": "./dist/client/index.d.ts"
10
10
  },
11
11
  "./client": {
12
12
  "import": "./dist/client/index.js",
13
- "types": "./dist/index.d.ts"
13
+ "types": "./dist/client/index.d.ts"
14
14
  },
15
15
  "./server": {
16
16
  "import": "./dist/server/index.js",
17
- "types": "./dist/server.d.ts"
17
+ "types": "./dist/server/index.d.ts"
18
18
  }
19
19
  },
20
20
  "keywords": [],
@@ -22,20 +22,20 @@
22
22
  "license": "MIT",
23
23
  "description": "RPGJS is a framework for creating RPG/MMORPG games",
24
24
  "peerDependencies": {
25
- "@canvasengine/presets": "*",
26
- "@rpgjs/client": "5.0.0-beta.1",
27
- "@rpgjs/common": "5.0.0-beta.1",
28
- "@rpgjs/server": "5.0.0-beta.1",
29
- "@rpgjs/vite": "5.0.0-beta.1",
30
- "canvasengine": "*"
25
+ "@canvasengine/presets": "^2.0.0-rc.4",
26
+ "@rpgjs/client": "5.0.0-beta.11",
27
+ "@rpgjs/common": "5.0.0-beta.11",
28
+ "@rpgjs/server": "5.0.0-beta.11",
29
+ "@rpgjs/vite": "5.0.0-beta.11",
30
+ "canvasengine": "^2.0.0-rc.4"
31
31
  },
32
32
  "publishConfig": {
33
33
  "access": "public"
34
34
  },
35
35
  "devDependencies": {
36
- "@canvasengine/compiler": "^2.0.0-beta.52",
37
- "vite": "^7.3.1",
38
- "vite-plugin-dts": "^4.5.4"
36
+ "@canvasengine/compiler": "2.0.0-rc.4",
37
+ "vite": "^8.0.13",
38
+ "vite-plugin-dts": "^5.0.0"
39
39
  },
40
40
  "type": "module",
41
41
  "scripts": {
@@ -0,0 +1,120 @@
1
+ import { MAXHP } from "@rpgjs/server";
2
+ import { afterEach, describe, expect, test, vi } from "vitest";
3
+ import { BattleAi } from "./ai.server";
4
+
5
+ const createEvent = () => ({
6
+ id: "monster-1",
7
+ hp: 0,
8
+ param: {
9
+ [MAXHP]: 10,
10
+ },
11
+ attachShape: vi.fn(),
12
+ flash: vi.fn(),
13
+ showHit: vi.fn(),
14
+ setGraphicAnimation: vi.fn(),
15
+ stopMoveTo: vi.fn(),
16
+ getCurrentMap: vi.fn(() => ({})),
17
+ remove: vi.fn(),
18
+ x: vi.fn(() => 0),
19
+ y: vi.fn(() => 0),
20
+ direction: vi.fn(() => "down"),
21
+ });
22
+
23
+ const createPlayer = () => ({
24
+ id: "player-1",
25
+ exp: 0,
26
+ gold: 0,
27
+ addItem: vi.fn(() => ({ name: () => "Potion" })),
28
+ showNotification: vi.fn(),
29
+ getCurrentMap: vi.fn(() => ({
30
+ database: () => ({
31
+ potion: { icon: "potion-icon" },
32
+ }),
33
+ })),
34
+ });
35
+
36
+ describe("BattleAi defeat flow", () => {
37
+ afterEach(() => {
38
+ vi.useRealTimers();
39
+ vi.restoreAllMocks();
40
+ });
41
+
42
+ test("awards the attacker and requests a defeated remove transition", () => {
43
+ const event = createEvent();
44
+ const attacker = createPlayer();
45
+ const ai = new BattleAi(event as any, {
46
+ animations: {
47
+ die: {
48
+ animationName: "die",
49
+ repeat: 1,
50
+ delayMs: 700,
51
+ },
52
+ },
53
+ rewards: {
54
+ exp: 25,
55
+ gold: 7,
56
+ items: [{ itemId: "potion", amount: 2, chance: 100 }],
57
+ showNotification: true,
58
+ },
59
+ });
60
+
61
+ expect(ai.handleDamage(attacker as any, { damage: 10, defeated: true })).toBe(true);
62
+
63
+ expect(attacker.exp).toBe(25);
64
+ expect(attacker.gold).toBe(7);
65
+ expect(attacker.addItem).toHaveBeenCalledWith("potion", 2);
66
+ expect(event.setGraphicAnimation).not.toHaveBeenCalledWith("die", 1);
67
+ expect(event.remove).toHaveBeenCalledWith({
68
+ reason: "defeated",
69
+ data: {
70
+ animation: expect.objectContaining({
71
+ animationName: "die",
72
+ delayMs: 700,
73
+ }),
74
+ },
75
+ transition: {
76
+ animation: "die",
77
+ graphic: undefined,
78
+ duration: 700,
79
+ },
80
+ timeoutMs: 700,
81
+ });
82
+ });
83
+
84
+ test("supports the context onDefeated callback and manual reward control", () => {
85
+ const event = createEvent();
86
+ const attacker = createPlayer();
87
+ const onDefeated = vi.fn(({ reward }) => {
88
+ expect(reward.awarded).toBe(false);
89
+ reward.giveTo(attacker as any);
90
+ expect(reward.awarded).toBe(true);
91
+ });
92
+ const ai = new BattleAi(event as any, {
93
+ autoAwardRewards: false,
94
+ rewards: {
95
+ exp: 10,
96
+ },
97
+ onDefeated,
98
+ });
99
+
100
+ ai.handleDamage(attacker as any, { damage: 10, defeated: true });
101
+
102
+ expect(onDefeated).toHaveBeenCalledWith(
103
+ expect.objectContaining({
104
+ event,
105
+ attacker,
106
+ reward: expect.any(Object),
107
+ remove: expect.any(Function),
108
+ })
109
+ );
110
+ expect(attacker.exp).toBe(10);
111
+ expect(event.remove).toHaveBeenCalledWith({
112
+ reason: "defeated",
113
+ data: {
114
+ animation: null,
115
+ },
116
+ transition: undefined,
117
+ timeoutMs: 0,
118
+ });
119
+ });
120
+ });