@rpgjs/server 4.2.2 → 5.0.0-alpha.0

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 (219) hide show
  1. package/{lib → dist}/Gui/DialogGui.d.ts +1 -2
  2. package/{lib → dist}/Gui/Gui.d.ts +1 -2
  3. package/dist/Player/BattleManager.d.ts +22 -0
  4. package/dist/Player/ClassManager.d.ts +18 -0
  5. package/dist/Player/Event.d.ts +0 -0
  6. package/dist/Player/ItemManager.d.ts +17 -0
  7. package/dist/Player/MoveManager.d.ts +177 -0
  8. package/dist/Player/ParameterManager.d.ts +42 -0
  9. package/dist/Player/Player.d.ts +73 -0
  10. package/dist/Player/SkillManager.d.ts +23 -0
  11. package/dist/Player/StateManager.d.ts +39 -0
  12. package/{lib → dist}/RpgServer.d.ts +34 -17
  13. package/dist/RpgServerEngine.d.ts +5 -0
  14. package/dist/core/context.d.ts +2 -0
  15. package/dist/core/inject.d.ts +5 -0
  16. package/dist/core/setup.d.ts +6 -0
  17. package/dist/index.d.ts +9 -0
  18. package/dist/index.js +29673 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/module.d.ts +2 -0
  21. package/dist/rooms/lobby.d.ts +6 -0
  22. package/dist/rooms/map.d.ts +110 -0
  23. package/package.json +16 -38
  24. package/src/Gui/DialogGui.ts +3 -4
  25. package/src/Gui/Gui.ts +4 -6
  26. package/src/Player/BattleManager.ts +108 -99
  27. package/src/Player/ClassManager.ts +47 -46
  28. package/src/Player/ComponentManager.ts +26 -535
  29. package/src/Player/EffectManager.ts +44 -59
  30. package/src/Player/ElementManager.ts +70 -72
  31. package/src/Player/Event.ts +0 -0
  32. package/src/Player/GoldManager.ts +24 -6
  33. package/src/Player/GuiManager.ts +106 -97
  34. package/src/Player/ItemFixture.ts +22 -17
  35. package/src/Player/ItemManager.ts +234 -225
  36. package/src/Player/MoveManager.ts +1047 -457
  37. package/src/Player/ParameterManager.ts +59 -37
  38. package/src/Player/Player.ts +272 -1058
  39. package/src/Player/SkillManager.ts +146 -137
  40. package/src/Player/StateManager.ts +124 -98
  41. package/src/Player/VariableManager.ts +23 -3
  42. package/src/RpgServer.ts +38 -14
  43. package/src/RpgServerEngine.ts +7 -0
  44. package/src/core/context.ts +3 -0
  45. package/src/core/inject.ts +17 -0
  46. package/src/core/setup.ts +20 -0
  47. package/src/index.ts +9 -31
  48. package/src/module.ts +32 -0
  49. package/src/presets/index.ts +1 -3
  50. package/src/rooms/lobby.ts +24 -0
  51. package/src/rooms/map.ts +311 -0
  52. package/tsconfig.json +26 -23
  53. package/vite.config.ts +21 -0
  54. package/CHANGELOG.md +0 -163
  55. package/LICENSE +0 -19
  56. package/browser/manifest.json +0 -7
  57. package/browser/rpg.server.js +0 -22372
  58. package/browser/rpg.server.umd.cjs +0 -22403
  59. package/lib/Game/EventManager.d.ts +0 -54
  60. package/lib/Game/EventManager.js +0 -107
  61. package/lib/Game/EventManager.js.map +0 -1
  62. package/lib/Game/Map.d.ts +0 -191
  63. package/lib/Game/Map.js +0 -414
  64. package/lib/Game/Map.js.map +0 -1
  65. package/lib/Game/WorldMaps.d.ts +0 -17
  66. package/lib/Game/WorldMaps.js +0 -28
  67. package/lib/Game/WorldMaps.js.map +0 -1
  68. package/lib/Gui/DialogGui.js +0 -57
  69. package/lib/Gui/DialogGui.js.map +0 -1
  70. package/lib/Gui/Gui.js +0 -37
  71. package/lib/Gui/Gui.js.map +0 -1
  72. package/lib/Gui/MenuGui.js +0 -23
  73. package/lib/Gui/MenuGui.js.map +0 -1
  74. package/lib/Gui/NotificationGui.js +0 -8
  75. package/lib/Gui/NotificationGui.js.map +0 -1
  76. package/lib/Gui/ShopGui.js +0 -40
  77. package/lib/Gui/ShopGui.js.map +0 -1
  78. package/lib/Gui/index.js +0 -7
  79. package/lib/Gui/index.js.map +0 -1
  80. package/lib/Interfaces/Gui.d.ts +0 -4
  81. package/lib/Interfaces/Gui.js +0 -2
  82. package/lib/Interfaces/Gui.js.map +0 -1
  83. package/lib/Interfaces/StateStore.d.ts +0 -5
  84. package/lib/Interfaces/StateStore.js +0 -2
  85. package/lib/Interfaces/StateStore.js.map +0 -1
  86. package/lib/MatchMaker.d.ts +0 -24
  87. package/lib/MatchMaker.js +0 -42
  88. package/lib/MatchMaker.js.map +0 -1
  89. package/lib/Monitor/index.d.ts +0 -17
  90. package/lib/Monitor/index.js +0 -72
  91. package/lib/Monitor/index.js.map +0 -1
  92. package/lib/Player/BattleManager.d.ts +0 -36
  93. package/lib/Player/BattleManager.js +0 -101
  94. package/lib/Player/BattleManager.js.map +0 -1
  95. package/lib/Player/ClassManager.d.ts +0 -47
  96. package/lib/Player/ClassManager.js +0 -65
  97. package/lib/Player/ClassManager.js.map +0 -1
  98. package/lib/Player/ComponentManager.d.ts +0 -397
  99. package/lib/Player/ComponentManager.js +0 -505
  100. package/lib/Player/ComponentManager.js.map +0 -1
  101. package/lib/Player/EffectManager.d.ts +0 -46
  102. package/lib/Player/EffectManager.js +0 -75
  103. package/lib/Player/EffectManager.js.map +0 -1
  104. package/lib/Player/ElementManager.d.ts +0 -108
  105. package/lib/Player/ElementManager.js +0 -120
  106. package/lib/Player/ElementManager.js.map +0 -1
  107. package/lib/Player/GoldManager.d.ts +0 -17
  108. package/lib/Player/GoldManager.js +0 -27
  109. package/lib/Player/GoldManager.js.map +0 -1
  110. package/lib/Player/GuiManager.d.ts +0 -247
  111. package/lib/Player/GuiManager.js +0 -291
  112. package/lib/Player/GuiManager.js.map +0 -1
  113. package/lib/Player/ItemFixture.d.ts +0 -7
  114. package/lib/Player/ItemFixture.js +0 -19
  115. package/lib/Player/ItemFixture.js.map +0 -1
  116. package/lib/Player/ItemManager.d.ts +0 -331
  117. package/lib/Player/ItemManager.js +0 -475
  118. package/lib/Player/ItemManager.js.map +0 -1
  119. package/lib/Player/MoveManager.d.ts +0 -333
  120. package/lib/Player/MoveManager.js +0 -450
  121. package/lib/Player/MoveManager.js.map +0 -1
  122. package/lib/Player/ParameterManager.d.ts +0 -316
  123. package/lib/Player/ParameterManager.js +0 -408
  124. package/lib/Player/ParameterManager.js.map +0 -1
  125. package/lib/Player/Player.d.ts +0 -828
  126. package/lib/Player/Player.js +0 -927
  127. package/lib/Player/Player.js.map +0 -1
  128. package/lib/Player/SkillManager.d.ts +0 -163
  129. package/lib/Player/SkillManager.js +0 -223
  130. package/lib/Player/SkillManager.js.map +0 -1
  131. package/lib/Player/StateManager.d.ts +0 -185
  132. package/lib/Player/StateManager.js +0 -228
  133. package/lib/Player/StateManager.js.map +0 -1
  134. package/lib/Player/VariableManager.d.ts +0 -46
  135. package/lib/Player/VariableManager.js +0 -52
  136. package/lib/Player/VariableManager.js.map +0 -1
  137. package/lib/Query.d.ts +0 -127
  138. package/lib/Query.js +0 -159
  139. package/lib/Query.js.map +0 -1
  140. package/lib/RpgServer.js +0 -2
  141. package/lib/RpgServer.js.map +0 -1
  142. package/lib/Scenes/Map.d.ts +0 -136
  143. package/lib/Scenes/Map.js +0 -273
  144. package/lib/Scenes/Map.js.map +0 -1
  145. package/lib/decorators/event.d.ts +0 -43
  146. package/lib/decorators/event.js +0 -13
  147. package/lib/decorators/event.js.map +0 -1
  148. package/lib/decorators/map.d.ts +0 -178
  149. package/lib/decorators/map.js +0 -43
  150. package/lib/decorators/map.js.map +0 -1
  151. package/lib/entry-point.d.ts +0 -34
  152. package/lib/entry-point.js +0 -70
  153. package/lib/entry-point.js.map +0 -1
  154. package/lib/express/api.d.ts +0 -3
  155. package/lib/express/api.js +0 -105
  156. package/lib/express/api.js.map +0 -1
  157. package/lib/express/errors/NotAuthorized.d.ts +0 -4
  158. package/lib/express/errors/NotAuthorized.js +0 -7
  159. package/lib/express/errors/NotAuthorized.js.map +0 -1
  160. package/lib/express/errors/NotFound.d.ts +0 -4
  161. package/lib/express/errors/NotFound.js +0 -7
  162. package/lib/express/errors/NotFound.js.map +0 -1
  163. package/lib/express/server.d.ts +0 -16
  164. package/lib/express/server.js +0 -65
  165. package/lib/express/server.js.map +0 -1
  166. package/lib/index.d.ts +0 -20
  167. package/lib/index.js +0 -19
  168. package/lib/index.js.map +0 -1
  169. package/lib/inject.d.ts +0 -22
  170. package/lib/inject.js +0 -29
  171. package/lib/inject.js.map +0 -1
  172. package/lib/logs/index.js +0 -6
  173. package/lib/logs/index.js.map +0 -1
  174. package/lib/logs/item.js +0 -34
  175. package/lib/logs/item.js.map +0 -1
  176. package/lib/logs/log.js +0 -7
  177. package/lib/logs/log.js.map +0 -1
  178. package/lib/logs/skill.js +0 -19
  179. package/lib/logs/skill.js.map +0 -1
  180. package/lib/logs/state.js +0 -13
  181. package/lib/logs/state.js.map +0 -1
  182. package/lib/models/Item.d.ts +0 -10
  183. package/lib/models/Item.js +0 -2
  184. package/lib/models/Item.js.map +0 -1
  185. package/lib/presets/index.js +0 -65
  186. package/lib/presets/index.js.map +0 -1
  187. package/lib/server.d.ts +0 -137
  188. package/lib/server.js +0 -443
  189. package/lib/server.js.map +0 -1
  190. package/rpg.toml +0 -14
  191. package/src/Game/EventManager.ts +0 -125
  192. package/src/Game/Map.ts +0 -495
  193. package/src/Game/WorldMaps.ts +0 -45
  194. package/src/Interfaces/Gui.ts +0 -4
  195. package/src/Interfaces/StateStore.ts +0 -5
  196. package/src/MatchMaker.ts +0 -65
  197. package/src/Monitor/index.ts +0 -78
  198. package/src/Query.ts +0 -172
  199. package/src/Scenes/Map.ts +0 -310
  200. package/src/decorators/event.ts +0 -58
  201. package/src/decorators/map.ts +0 -226
  202. package/src/entry-point.ts +0 -111
  203. package/src/express/api.ts +0 -118
  204. package/src/express/errors/NotAuthorized.ts +0 -6
  205. package/src/express/errors/NotFound.ts +0 -6
  206. package/src/express/server.ts +0 -87
  207. package/src/inject.ts +0 -33
  208. package/src/models/Item.ts +0 -11
  209. package/src/server.ts +0 -459
  210. /package/{lib → dist}/Gui/MenuGui.d.ts +0 -0
  211. /package/{lib → dist}/Gui/NotificationGui.d.ts +0 -0
  212. /package/{lib → dist}/Gui/ShopGui.d.ts +0 -0
  213. /package/{lib → dist}/Gui/index.d.ts +0 -0
  214. /package/{lib → dist}/logs/index.d.ts +0 -0
  215. /package/{lib → dist}/logs/item.d.ts +0 -0
  216. /package/{lib → dist}/logs/log.d.ts +0 -0
  217. /package/{lib → dist}/logs/skill.d.ts +0 -0
  218. /package/{lib → dist}/logs/state.d.ts +0 -0
  219. /package/{lib → dist}/presets/index.d.ts +0 -0
@@ -0,0 +1,2 @@
1
+ import { FactoryProvider } from '@signe/di';
2
+ export declare function provideServerModules(modules: any[]): FactoryProvider;
@@ -0,0 +1,6 @@
1
+ import { MockConnection } from '@signe/room';
2
+ import { RpgPlayer } from '../Player/Player';
3
+ export declare class LobbyRoom {
4
+ players: import('@signe/reactive').WritableObjectSignal<{}>;
5
+ onJoin(player: RpgPlayer, conn: MockConnection): void;
6
+ }
@@ -0,0 +1,110 @@
1
+ import { MockConnection, RoomOnJoin } from '@signe/room';
2
+ import { Hooks, RpgCommonMap, ZoneData } from '@rpgjs/common';
3
+ import { RpgPlayer, RpgEvent } from '../Player/Player';
4
+ import { BehaviorSubject } from 'rxjs';
5
+ /**
6
+ * Interface representing hook methods available for map events
7
+ *
8
+ * These hooks are triggered at specific moments during the event lifecycle
9
+ */
10
+ export interface EventHooks {
11
+ /** Called when the event is first initialized */
12
+ onInit?: () => void;
13
+ /** Called when the event properties change */
14
+ onChanges?: (player: RpgPlayer) => void;
15
+ /** Called when a player performs an action on this event */
16
+ onAction?: (player: RpgPlayer) => void;
17
+ /** Called when a player touches this event */
18
+ onPlayerTouch?: (player: RpgPlayer) => void;
19
+ /** Called when a player enters a shape */
20
+ onInShape?: (zone: ZoneData, player: RpgPlayer) => void;
21
+ /** Called when a player exits a shape */
22
+ onOutShape?: (zone: ZoneData, player: RpgPlayer) => void;
23
+ onDetectInShape?: (player: RpgPlayer, shape: ZoneData) => void;
24
+ onDetectOutShape?: (player: RpgPlayer, shape: ZoneData) => void;
25
+ }
26
+ /** Type for event class constructor */
27
+ export type EventConstructor = new () => RpgPlayer;
28
+ /** Options for positioning and defining an event on the map */
29
+ export type EventPosOption = {
30
+ /** ID of the event */
31
+ id?: string;
32
+ /** X position of the event on the map */
33
+ x: number;
34
+ /** Y position of the event on the map */
35
+ y: number;
36
+ /**
37
+ * Event definition - can be either:
38
+ * - A class that extends RpgPlayer
39
+ * - An object with hook methods
40
+ */
41
+ event: EventConstructor | (EventHooks & Record<string, any>);
42
+ };
43
+ export declare class RpgMap extends RpgCommonMap<RpgPlayer> implements RoomOnJoin {
44
+ players: import('@signe/reactive').WritableObjectSignal<{}>;
45
+ events: import('@signe/reactive').WritableObjectSignal<{}>;
46
+ database: import('@signe/reactive').WritableObjectSignal<{}>;
47
+ maps: any[];
48
+ dataIsReady$: BehaviorSubject<void>;
49
+ globalConfig: any;
50
+ damageFormulas: any;
51
+ onJoin(player: RpgPlayer, conn: MockConnection): void;
52
+ get hooks(): Hooks;
53
+ guiInteraction(player: RpgPlayer, value: any): void;
54
+ guiExit(player: RpgPlayer, { guiId, data }: {
55
+ guiId: any;
56
+ data: any;
57
+ }): void;
58
+ onAction(player: RpgPlayer, action: any): void;
59
+ onInput(player: RpgPlayer, input: any): void;
60
+ updateMap(request: Request): Promise<void>;
61
+ addInDatabase(id: string, data: any): void;
62
+ /**
63
+ * Creates a dynamic event on the map
64
+ *
65
+ * This method handles both class-based events and object-based events with hooks.
66
+ * For class-based events, it creates a new instance of the class.
67
+ * For object-based events, it creates a dynamic class that extends RpgPlayer and
68
+ * implements the hook methods from the object.
69
+ *
70
+ * @param eventObj - The event position and definition
71
+ *
72
+ * @example
73
+ * // Using a class-based event
74
+ * class MyEvent extends RpgPlayer {
75
+ * onInit() {
76
+ * console.log('Event initialized');
77
+ * }
78
+ * }
79
+ *
80
+ * map.createDynamicEvent({
81
+ * x: 100,
82
+ * y: 200,
83
+ * event: MyEvent
84
+ * });
85
+ *
86
+ * // Using an object-based event
87
+ * map.createDynamicEvent({
88
+ * x: 100,
89
+ * y: 200,
90
+ * event: {
91
+ * onInit() {
92
+ * console.log('Event initialized');
93
+ * },
94
+ * onPlayerTouch(player) {
95
+ * console.log('Player touched event');
96
+ * }
97
+ * }
98
+ * });
99
+ */
100
+ createDynamicEvent(eventObj: EventPosOption): Promise<void>;
101
+ getEvent<T extends RpgPlayer>(eventId: string): T | undefined;
102
+ getPlayer(playerId: string): RpgPlayer | undefined;
103
+ getEvents(): RpgEvent[];
104
+ removeEvent(eventId: string): void;
105
+ showAnimation(animationName: string, object: RpgPlayer): void;
106
+ }
107
+ export interface RpgMap {
108
+ $send: (conn: MockConnection, data: any) => void;
109
+ $broadcast: (data: any) => void;
110
+ }
package/package.json CHANGED
@@ -1,53 +1,31 @@
1
1
  {
2
2
  "name": "@rpgjs/server",
3
- "version": "4.2.2",
4
- "description": "",
5
- "main": "./lib/index.js",
6
- "types": "./lib/index.d.ts",
3
+ "version": "5.0.0-alpha.0",
4
+ "main": "./dist/index.js",
5
+ "types": "./dist/index.d.ts",
7
6
  "publishConfig": {
8
7
  "access": "public"
9
8
  },
10
9
  "scripts": {
11
- "build": "tsc && npm run build:browser",
12
- "build:browser": "RPG_TYPE=rpg npx rpgjs build",
13
- "watch": "tsc -w"
14
- },
15
- "typesVersions": {
16
- "*": {
17
- "express": [
18
- "lib/express/server.d.ts"
19
- ]
20
- }
21
- },
22
- "exports": {
23
- ".": "./lib/index.js",
24
- "./express": "./lib/express/server.js"
10
+ "dev": "vite build --watch",
11
+ "build": "vite build"
25
12
  },
26
13
  "keywords": [],
27
- "author": "Samuel Ronce",
14
+ "author": "",
28
15
  "license": "MIT",
16
+ "description": "",
29
17
  "dependencies": {
30
- "@rpgjs/common": "^4.2.1",
31
- "@rpgjs/database": "^4.2.1",
32
- "@rpgjs/tiled": "^4.2.1",
33
- "@rpgjs/types": "^4.0.5",
34
- "axios": "^1.3.6",
35
- "cors": "^2.8.5",
36
- "express": "^4.18.2",
37
- "lodash.merge": "^4.6.2",
38
- "pretty-error": "^4.0.0",
39
- "rxjs": "7.8.0",
40
- "sat": "^0.9.0",
41
- "simple-room": "^3.1.3",
42
- "socket.io": "^4.6.1"
18
+ "@rpgjs/common": "workspace:*",
19
+ "@rpgjs/database": "^4.3.0",
20
+ "@signe/di": "^2.3.2",
21
+ "@signe/reactive": "^2.3.2",
22
+ "@signe/room": "^2.3.2",
23
+ "@signe/sync": "^2.3.2",
24
+ "rxjs": "^7.8.2"
43
25
  },
44
- "gitHead": "35eb6d01ae6e13f195df46a92fe785eeaf806189",
45
26
  "devDependencies": {
46
- "@rpgjs/compiler": "^4.2.1",
47
- "typescript": "^5.0.4"
48
- },
49
- "alias": {
50
- "express": "./lib/express/server"
27
+ "vite": "^6.2.5",
28
+ "vite-plugin-dts": "^4.5.3"
51
29
  },
52
30
  "type": "module"
53
31
  }
@@ -1,7 +1,6 @@
1
1
  import { PrebuiltGui } from '@rpgjs/common'
2
2
  import { Gui } from './Gui'
3
3
  import { RpgPlayer } from '../Player/Player'
4
- import { IGui } from '../Interfaces/Gui'
5
4
  import { Move } from '../Player/MoveManager'
6
5
 
7
6
  export enum DialogPosition {
@@ -22,7 +21,7 @@ export interface DialogOptions {
22
21
  talkWith?: RpgPlayer
23
22
  }
24
23
 
25
- export class DialogGui extends Gui implements IGui {
24
+ export class DialogGui extends Gui {
26
25
  constructor(player: RpgPlayer) {
27
26
  super(PrebuiltGui.Dialog, player)
28
27
  }
@@ -36,7 +35,7 @@ export class DialogGui extends Gui implements IGui {
36
35
  const event = options.talkWith
37
36
  let memoryDir
38
37
  if (event) {
39
- memoryDir = event.direction
38
+ memoryDir = event.direction()
40
39
  event.breakRoutes(true)
41
40
  event.moveRoutes([ Move.turnTowardPlayer(this.player) ])
42
41
  }
@@ -59,7 +58,7 @@ export class DialogGui extends Gui implements IGui {
59
58
  }).then((val: any) => {
60
59
  if (event) {
61
60
  event.replayRoutes()
62
- event.direction = memoryDir
61
+ event.changeDirection(memoryDir)
63
62
  }
64
63
  return val
65
64
  })
package/src/Gui/Gui.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import { RpgPlayer } from '../Player/Player'
2
- import { EventEmitter } from '@rpgjs/common'
3
2
 
4
- export class Gui extends EventEmitter {
3
+ export class Gui {
5
4
 
6
5
  private _close: Function = () => {}
7
6
  private _blockPlayerInput: boolean = false
@@ -10,7 +9,7 @@ export class Gui extends EventEmitter {
10
9
  public id: string,
11
10
  protected player: RpgPlayer,
12
11
  ) {
13
- super()
12
+
14
13
  }
15
14
 
16
15
  open(data?, {
@@ -18,14 +17,13 @@ export class Gui extends EventEmitter {
18
17
  blockPlayerInput = false
19
18
  } = {}): Promise<any> {
20
19
  return new Promise((resolve) => {
21
- this.player.moving = false
22
20
  this.player.emit('gui.open', {
23
21
  guiId: this.id,
24
22
  data
25
23
  })
26
24
  this._blockPlayerInput = blockPlayerInput
27
25
  if (blockPlayerInput) {
28
- this.player.canMove = false
26
+ this.player.canMove.set(false)
29
27
  }
30
28
  if (!waitingAction) {
31
29
  resolve(null)
@@ -39,7 +37,7 @@ export class Gui extends EventEmitter {
39
37
  close(data?) {
40
38
  this.player.emit('gui.exit', this.id)
41
39
  if (this._blockPlayerInput) {
42
- this.player.canMove = true
40
+ this.player.canMove.set(true)
43
41
  }
44
42
  this._close(data)
45
43
  }
@@ -1,124 +1,133 @@
1
- import { Utils } from '@rpgjs/common'
2
- import { ParameterManager } from './ParameterManager'
3
- import { RpgPlayer } from './Player'
4
- import {
5
- ATK,
6
- PDEF,
7
- SDEF
8
- } from '../presets'
9
- import { Effect } from '@rpgjs/database'
10
- import { ElementManager } from './ElementManager';
11
- import { EffectManager } from './EffectManager';
12
- import { RpgServerEngine } from '../server'
1
+ import { Constructor, RpgCommonPlayer } from "@rpgjs/common";
2
+ import { RpgPlayer } from "./Player";
3
+ import { ATK, PDEF, SDEF } from "../presets";
4
+ import { Effect } from "./EffectManager";
13
5
 
14
- const {
15
- applyMixins
16
- } = Utils
6
+ interface PlayerWithMixins extends RpgCommonPlayer {
7
+ parameters: any[];
8
+ getFormulas(name: string): any;
9
+ hasEffect(effect: string): boolean;
10
+ coefficientElements(attackerPlayer: RpgPlayer): number;
11
+ hp: number;
12
+ getFormulas(name: string): any;
13
+ hasEffect(effect: string): boolean;
14
+ }
17
15
 
18
- export class BattleManager {
16
+ export interface IBattleManager {
17
+ applyDamage(attackerPlayer: RpgPlayer, skill?: any): {
18
+ damage: number;
19
+ critical: boolean;
20
+ elementVulnerable: boolean;
21
+ guard: boolean;
22
+ superGuard: boolean;
23
+ };
24
+ }
19
25
 
20
- /**
26
+ export function WithBattleManager<TBase extends Constructor<PlayerWithMixins>>(
27
+ Base: TBase
28
+ ): Constructor<IBattleManager> & TBase {
29
+ return class extends Base implements IBattleManager {
30
+ /**
21
31
  * Apply damage. Player will lose HP. the `attackerPlayer` parameter is the other player, the one who attacks.
22
- *
32
+ *
23
33
  * If you don't set the skill parameter, it will be a physical attack.
24
34
  * The attack formula is already defined but you can customize it in the server options
25
- *
35
+ *
26
36
  * ```ts
27
37
  * player.applyDamage(attackerPlayer) // returns { damage: number }
28
38
  * ```
29
- *
39
+ *
30
40
  * @title Apply Damage
31
41
  * @method player.applyDamage(attackerPlayer,skill)
32
42
  * @param {RpgPlayer} attackerPlayer The attacking player
33
43
  * @param {any} [skill]
34
- * @returns {object}
44
+ * @returns {object}
35
45
  * @memberof BattleManager
36
46
  * */
37
- applyDamage(attackerPlayer: RpgPlayer, skill?: any): {
38
- damage: number,
39
- critical: boolean,
40
- elementVulnerable: boolean,
41
- guard: boolean,
42
- superGuard: boolean
47
+ applyDamage(
48
+ attackerPlayer: RpgPlayer,
49
+ skill?: any
50
+ ): {
51
+ damage: number;
52
+ critical: boolean;
53
+ elementVulnerable: boolean;
54
+ guard: boolean;
55
+ superGuard: boolean;
43
56
  } {
44
- const getParam = (player: RpgPlayer) => {
45
- const params = {}
46
- this.parameters.forEach((val, key) => {
47
- params[key] = player.param[key]
48
- })
49
- return {
50
- [ATK]: player.atk,
51
- [PDEF]: player.pdef,
52
- [SDEF]: player.sdef,
53
- ...params
54
- }
55
- }
56
- let damage = 0, fn
57
- let critical = false
58
- let guard = false
59
- let superGuard = false
60
- let elementVulnerable = false
61
- const paramA = getParam(attackerPlayer)
62
- const paramB = getParam(<any>this)
63
- if (skill) {
64
- fn = this.getFormulas('damageSkill')
65
- if (!fn) {
66
- throw new Error('Skill Formulas not exists')
67
- }
68
- damage = fn(paramA, paramB, skill)
57
+ const getParam = (player: RpgPlayer) => {
58
+ const params = {};
59
+ this.parameters.forEach((val, key) => {
60
+ params[key] = player.param[key];
61
+ });
62
+ return {
63
+ [ATK]: player.atk,
64
+ [PDEF]: player.pdef,
65
+ [SDEF]: player.sdef,
66
+ ...params,
67
+ };
68
+ };
69
+ let damage = 0,
70
+ fn;
71
+ let critical = false;
72
+ let guard = false;
73
+ let superGuard = false;
74
+ let elementVulnerable = false;
75
+ const paramA = getParam(attackerPlayer);
76
+ const paramB = getParam(<any>this);
77
+ console.log(paramA, paramB)
78
+ if (skill) {
79
+ fn = this.getFormulas("damageSkill");
80
+ if (!fn) {
81
+ throw new Error("Skill Formulas not exists");
69
82
  }
70
- else {
71
- fn = this.getFormulas('damagePhysic')
72
- if (!fn) {
73
- throw new Error('Physic Formulas not exists')
74
- }
75
- damage = fn(paramA, paramB)
76
- const coef = this.coefficientElements(attackerPlayer)
77
- if (coef >= 2) {
78
- elementVulnerable = true
79
- }
80
- damage *= coef
81
- fn = this.getFormulas('damageCritical')
82
- if (fn) {
83
- let newDamage = fn(damage, paramA, paramB)
84
- if (damage != newDamage) {
85
- critical = true
86
- }
87
- damage = newDamage
88
- }
83
+ damage = fn(paramA, paramB, skill);
84
+ } else {
85
+ fn = this.getFormulas("damagePhysic");
86
+ if (!fn) {
87
+ throw new Error("Physic Formulas not exists");
89
88
  }
90
- if (this.hasEffect(Effect.GUARD)) {
91
- fn = this.getFormulas('damageGuard')
92
- if (fn) {
93
- let newDamage = fn(damage, paramA, paramB)
94
- if (damage != newDamage) {
95
- guard = true
96
- }
97
- damage = newDamage
98
- }
89
+ damage = fn(paramA, paramB);
90
+ const coef = this.coefficientElements(attackerPlayer);
91
+ if (coef >= 2) {
92
+ elementVulnerable = true;
99
93
  }
100
- if (this.hasEffect(Effect.SUPER_GUARD)) {
101
- damage /= 4
102
- superGuard = true
94
+ damage *= coef;
95
+ fn = this.getFormulas("damageCritical");
96
+ if (fn) {
97
+ let newDamage = fn(damage, paramA, paramB);
98
+ if (damage != newDamage) {
99
+ critical = true;
100
+ }
101
+ damage = newDamage;
103
102
  }
104
- this.hp -= damage
105
- return {
106
- damage,
107
- critical,
108
- elementVulnerable,
109
- guard,
110
- superGuard
103
+ }
104
+ if (this.hasEffect(Effect.GUARD)) {
105
+ fn = this.getFormulas("damageGuard");
106
+ if (fn) {
107
+ let newDamage = fn(damage, paramA, paramB);
108
+ if (damage != newDamage) {
109
+ guard = true;
110
+ }
111
+ damage = newDamage;
111
112
  }
113
+ }
114
+ if (this.hasEffect(Effect.SUPER_GUARD)) {
115
+ damage /= 4;
116
+ superGuard = true;
117
+ }
118
+ this.hp -= damage;
119
+ return {
120
+ damage,
121
+ critical,
122
+ elementVulnerable,
123
+ guard,
124
+ superGuard,
125
+ };
112
126
  }
113
-
127
+
114
128
  getFormulas(name: string) {
115
- return this.server.damageFormulas[name]
129
+ const map = this.getCurrentMap();
130
+ return map.damageFormulas[name];
116
131
  }
132
+ };
117
133
  }
118
-
119
- applyMixins(BattleManager, [ParameterManager, ElementManager, EffectManager])
120
-
121
- export interface BattleManager extends ParameterManager, ElementManager, EffectManager {
122
- name: string,
123
- server: RpgServerEngine
124
- }
@@ -1,77 +1,78 @@
1
- import { Utils } from '@rpgjs/common'
2
- import { ParameterManager } from './ParameterManager'
3
- import { ItemManager } from './ItemManager'
1
+ import { Constructor, isString, RpgCommonPlayer } from "@rpgjs/common";
4
2
 
5
- const {
6
- applyMixins,
7
- isString
8
- } = Utils
3
+ type ClassClass = any;
4
+ type ActorClass = any;
9
5
 
10
- type ClassClass = { new(...args: any[]) }
11
- type ActorClass = { new(...args: any[]) }
6
+ interface PlayerWithMixins extends RpgCommonPlayer {
7
+ databaseById(id: string): any;
8
+ addParameter(name: string, { start, end }: { start: number, end: number }): void;
9
+ addItem(item: any): void;
10
+ equip(item: any, equip: boolean): void;
11
+ }
12
12
 
13
- export class ClassManager {
13
+ export interface IClassManager {
14
+ setClass(_class: ClassClass | string): ClassClass;
15
+ setActor(actorClass: ActorClass | string): ActorClass;
16
+ }
14
17
 
15
- _class: any
18
+ export function WithClassManager<TBase extends Constructor<PlayerWithMixins>>(
19
+ Base: TBase
20
+ ): Constructor<IClassManager> & TBase {
21
+ return class extends Base implements IClassManager {
16
22
 
17
- /**
23
+ /**
18
24
  * Assign a class to the player
19
- *
25
+ *
20
26
  * ```ts
21
27
  * import { Fighter } from 'my-database/classes/fighter'
22
- *
28
+ *
23
29
  * player.setClass(Fighter)
24
30
  * ```
25
- *
31
+ *
26
32
  * @title Set Class
27
33
  * @method player.setClass(ClassClass)
28
34
  * @param {ClassClass | string} class class or id
29
- * @returns {instance of ClassClass}
35
+ * @returns {instance of ClassClass}
30
36
  * @memberof ClassManager
31
37
  * */
32
38
  setClass(_class: ClassClass | string) {
33
- if (isString(_class)) _class = this.databaseById(_class)
34
- this._class = new (_class as ClassClass)()
35
- this['execMethod']('onSet', [this], this._class)
36
- return this._class
39
+ if (isString(_class)) _class = this.databaseById(_class);
40
+ const classInstance = new (_class as ClassClass)();
41
+ this["execMethod"]("onSet", [this], classInstance);
42
+ return classInstance;
37
43
  }
38
44
 
39
- /**
45
+ /**
40
46
  * Allows to give a set of already defined properties to the player (default equipment, or a list of skills to learn according to the level)
41
- *
47
+ *
42
48
  * ```ts
43
49
  * import { Hero } from 'my-database/classes/hero'
44
- *
50
+ *
45
51
  * player.setActor(Hero)
46
52
  * ```
47
- *
53
+ *
48
54
  * @title Set Actor
49
55
  * @method player.setActor(ActorClass)
50
56
  * @param {ActorClass | string} actorClass actor class or id
51
- * @returns {instance of ActorClass}
57
+ * @returns {instance of ActorClass}
52
58
  * @memberof ClassManager
53
59
  * */
54
60
  setActor(actorClass: ActorClass | string) {
55
- if (isString(actorClass)) actorClass = this.databaseById(actorClass)
56
- const actor = new (actorClass as ActorClass)();
57
- ['name', 'initialLevel', 'finalLevel', 'expCurve'].forEach(key => {
58
- if (actor[key]) this[key] = actor[key]
59
- })
60
- for (let param in actor.parameters) {
61
- this.addParameter(param, actor.parameters[param])
62
- }
63
- for (let item of actor.startingEquipment) {
64
- this.addItem(item)
65
- this.equip(item, true)
66
- }
67
- if (actor.class) this.setClass(actor.class)
68
- this['execMethod']('onSet', [this], actor)
69
- return actor
61
+ if (isString(actorClass)) actorClass = this.databaseById(actorClass);
62
+ const actor = new (actorClass as ActorClass)();
63
+ ["name", "initialLevel", "finalLevel", "expCurve"].forEach((key) => {
64
+ if (actor[key]) this[key] = actor[key];
65
+ });
66
+ for (let param in actor.parameters) {
67
+ this.addParameter(param, actor.parameters[param]);
68
+ }
69
+ for (let item of actor.startingEquipment) {
70
+ this.addItem(item);
71
+ this.equip(item, true);
72
+ }
73
+ if (actor.class) this.setClass(actor.class);
74
+ this["execMethod"]("onSet", [this], actor);
75
+ return actor;
70
76
  }
77
+ };
71
78
  }
72
-
73
- applyMixins(ClassManager, [ParameterManager, ItemManager])
74
-
75
- export interface ClassManager extends ParameterManager, ItemManager {
76
- name: string
77
- }