@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
@@ -1,40 +1,67 @@
1
- import { Utils } from '@rpgjs/common'
2
- import { ItemFixture } from './ItemFixture'
3
- import { RpgPlayer } from './Player'
4
- import { StateLog } from '../logs/state'
1
+ import { isInstanceOf, isString, type Constructor } from "@rpgjs/common";
2
+ import { RpgCommonPlayer, Matter, SeekAvoid } from "@rpgjs/common";
3
+ import { signal, type WritableArraySignal } from "@signe/reactive";
4
+ import { ATK, PDEF, SDEF } from "../presets";
5
+ import { ItemLog, StateLog } from "../logs";
6
+ import { persist } from "@signe/sync";
7
+ import { RpgPlayer } from "./Player";
5
8
 
6
- const {
7
- isInstanceOf,
8
- applyMixins,
9
- isString
10
- } = Utils
11
-
12
- type StateClass = { new(...args: any[]) }
9
+ interface StateManagerDependencies {
10
+ equipments(): any[];
11
+ databaseById(id: string | StateClass): any;
12
+ addState(stateClass: StateClass | string, chance?: number): object | null;
13
+ removeState(stateClass: StateClass | string, chance?: number): void;
14
+ }
13
15
 
14
- export class StateManager {
16
+ /**
17
+ * Interface defining what MoveManager adds to a class
18
+ */
19
+ export interface IStateManager {
20
+ statesDefense: { rate: number; state: any }[];
21
+ statesEfficiency: WritableArraySignal<any[]>;
22
+ applyStates(
23
+ player: RpgPlayer,
24
+ states: { addStates?: any[]; removeStates?: any[] }
25
+ ): void;
26
+ getState(stateClass: StateClass | string): any;
27
+ addState(stateClass: StateClass | string, chance?: number): object | null;
28
+ removeState(stateClass: StateClass | string, chance?: number): void;
29
+ }
15
30
 
16
- states: any[] = []
31
+ type StateClass = { new (...args: any[]) };
17
32
 
18
- _statesEfficiency: { rate: number, state: any }[]
33
+ /**
34
+ * Move Manager mixin
35
+ *
36
+ * Adds methods to manage player movement
37
+ *
38
+ * @param Base - The base class to extend
39
+ * @returns A new class with move management capabilities
40
+ */
41
+ export function WithStateManager<
42
+ TBase extends Constructor<RpgCommonPlayer & StateManagerDependencies>
43
+ >(Base: TBase): Constructor<IStateManager> & TBase {
44
+ return class extends Base implements IStateManager {
45
+ _statesEfficiency = signal<any[]>([]);
19
46
 
20
- /**
47
+ /**
21
48
  * Recovers the player's states defense on inventory. This list is generated from the `statesDefense` property defined on the weapons or armors equipped.
22
49
  * If several items have the same element, only the highest rate will be taken into account.
23
- *
50
+ *
24
51
  * ```ts
25
52
  * import { Armor, State } from '@rpgjs/server'
26
- *
53
+ *
27
54
  * @State({
28
55
  * name: 'Paralyze'
29
56
  * })
30
57
  * class Paralyze {}
31
- *
58
+ *
32
59
  * @Armor({
33
60
  * name: 'Shield',
34
61
  * statesDefense: [{ rate: 1, state: Paralyze }]
35
62
  * })
36
63
  * class Shield {}
37
- *
64
+ *
38
65
  * @Armor({
39
66
  * name: 'FireShield',
40
67
  * statesDefense: [{ rate: 0.5, state: Paralyze }]
@@ -45,81 +72,84 @@ export class StateManager {
45
72
  * player.addItem(FireShield)
46
73
  * player.equip(Shield)
47
74
  * player.equip(FireShield)
48
- *
75
+ *
49
76
  * console.log(player.statesDefense) // [{ rate: 1, state: instance of Paralyze }]
50
- * ```
77
+ * ```
51
78
  * @title Get States Defense
52
79
  * @prop {Array<{ rate: number, state: StateClass}>} player.statesDefense
53
80
  * @readonly
54
81
  * @memberof StateManager
55
82
  * */
56
- get statesDefense(): { rate: number, state: any }[] {
57
- return this.getFeature('statesDefense', 'state')
83
+ get statesDefense(): { rate: number; state: any }[] {
84
+ return this.getFeature("statesDefense", "state");
58
85
  }
59
86
 
60
- /**
61
- * Set or retrieves all the states where the player is vulnerable or not.
62
- *
87
+ /**
88
+ * Set or retrieves all the states where the player is vulnerable or not.
89
+ *
63
90
  * ```ts
64
91
  * import { Class, State } from '@rpgjs/server'
65
- *
92
+ *
66
93
  * @State({
67
94
  * name: 'Paralyze'
68
95
  * })
69
96
  * class Paralyze {}
70
- *
97
+ *
71
98
  * @State({
72
99
  * name: 'Sleep'
73
100
  * })
74
101
  * class Sleep {}
75
- *
102
+ *
76
103
  * @Class({
77
104
  * name: 'Fighter',
78
105
  * statesEfficiency: [{ rate: 1, state: Paralyze }]
79
106
  * })
80
107
  * class Hero {}
81
- *
108
+ *
82
109
  * player.setClass(Hero)
83
- *
110
+ *
84
111
  * console.log(player.statesEfficiency) // [{ rate: 1, instance of Paralyze }]
85
- *
112
+ *
86
113
  * player.statesEfficiency = [{ rate: 2, state: Sleep }]
87
- *
114
+ *
88
115
  * console.log(player.statesEfficiency) // [{ rate: 1, state: instance of Paralyze }, { rate: 2, state: instance of Sleep }]
89
- * ```
116
+ * ```
90
117
  * @title Set/Get States Efficiency
91
118
  * @prop {Array<{ rate: number, state: StateClass}>} player.statesEfficiency
92
119
  * @memberof StateManager
93
120
  * */
94
121
  get statesEfficiency() {
95
- return this._statesEfficiency
122
+ return this._statesEfficiency;
96
123
  }
97
124
 
98
125
  set statesEfficiency(val) {
99
- this._statesEfficiency = val
126
+ this._statesEfficiency = val;
100
127
  }
101
128
 
102
- applyStates(player: RpgPlayer, { addStates, removeStates }) {
103
- if (addStates) {
104
- for (let { state, rate } of addStates) {
105
- player.addState(state, rate)
106
- }
129
+ applyStates(
130
+ player: RpgPlayer & IStateManager,
131
+ { addStates, removeStates }
132
+ ) {
133
+ if (addStates) {
134
+ for (let { state, rate } of addStates) {
135
+ player.addState(state, rate);
107
136
  }
108
- if (removeStates) {
109
- for (let { state, rate } of removeStates) {
110
- player.removeState(state, rate)
111
- }
112
- }
137
+ }
138
+ if (removeStates) {
139
+ for (let { state, rate } of removeStates) {
140
+ player.removeState(state, rate);
141
+ }
142
+ }
113
143
  }
114
144
 
115
145
  /**
116
146
  * Get a state to the player. Returns `null` if the state is not present on the player
117
147
  * ```ts
118
148
  * import Paralyze from 'your-database/states/paralyze'
119
- *
149
+ *
120
150
  * player.getState(Paralyze)
121
151
  * ```
122
- *
152
+ *
123
153
  * @title Get State
124
154
  * @method player.getState(stateClass)
125
155
  * @param {StateClass | string} stateClass or state id
@@ -127,33 +157,33 @@ export class StateManager {
127
157
  * @memberof StateManager
128
158
  */
129
159
  getState(stateClass: StateClass | string) {
130
- if (isString(stateClass)) stateClass = this.databaseById(stateClass)
131
- return this.states.find((state) => {
132
- if (isString(stateClass)) {
133
- return state.id == stateClass
134
- }
135
- return isInstanceOf(state, stateClass)
136
- })
160
+ if (isString(stateClass)) stateClass = this.databaseById(stateClass);
161
+ return this.states().find((state) => {
162
+ if (isString(stateClass)) {
163
+ return state.id == stateClass;
164
+ }
165
+ return isInstanceOf(state, stateClass);
166
+ });
137
167
  }
138
168
 
139
169
  /**
140
170
  * Adds a state to the player. Set the chance between 0 and 1 that the state can apply
141
171
  * ```ts
142
172
  * import Paralyze from 'your-database/states/paralyze'
143
- *
144
- * try {
173
+ *
174
+ * try {
145
175
  * player.addState(Paralyze)
146
176
  * }
147
177
  * catch (err) {
148
178
  * console.log(err)
149
179
  * }
150
180
  * ```
151
- *
181
+ *
152
182
  * @title Add State
153
183
  * @method player.addState(stateClass,chance=1)
154
184
  * @param {StateClass | string} stateClass state class or state id
155
185
  * @param {number} [chance] 1 by default
156
- * @throws {StateLog} addFailed
186
+ * @throws {StateLog} addFailed
157
187
  * If the chance to add the state has failed (defined with the `chance` param)
158
188
  * ```
159
189
  * {
@@ -166,41 +196,41 @@ export class StateManager {
166
196
  * @todo
167
197
  */
168
198
  addState(stateClass: StateClass | string, chance = 1): object | null {
169
- const state = this.getState(stateClass)
170
- if (isString(stateClass)) {
171
- stateClass = this.databaseById(stateClass)
199
+ const state = this.getState(stateClass);
200
+ if (isString(stateClass)) {
201
+ stateClass = this.databaseById(stateClass);
202
+ }
203
+ if (!state) {
204
+ if (Math.random() > chance) {
205
+ throw StateLog.addFailed(stateClass);
172
206
  }
173
- if (!state) {
174
- if (Math.random() > chance) {
175
- throw StateLog.addFailed(stateClass)
176
- }
177
- //const efficiency = this.findStateEfficiency(stateClass)
178
- const instance = new (stateClass as StateClass)()
179
- this.states.push(instance)
180
- this.applyStates(<any>this, instance)
181
- return instance
182
- }
183
- return null
207
+ //const efficiency = this.findStateEfficiency(stateClass)
208
+ const instance = new (stateClass as StateClass)();
209
+ this.states().push(instance);
210
+ this.applyStates(<any>this, instance);
211
+ return instance;
212
+ }
213
+ return null;
184
214
  }
185
215
 
186
216
  /**
187
217
  * Remove a state to the player. Set the chance between 0 and 1 that the state can be removed
188
218
  * ```ts
189
219
  * import Paralyze from 'your-database/states/paralyze'
190
- *
191
- * try {
220
+ *
221
+ * try {
192
222
  * player.removeState(Paralyze)
193
223
  * }
194
224
  * catch (err) {
195
225
  * console.log(err)
196
226
  * }
197
227
  * ```
198
- *
228
+ *
199
229
  * @title Remove State
200
230
  * @method player.removeState(stateClass,chance=1)
201
231
  * @param {StateClass|string} stateClass class state or state id
202
232
  * @param {number} [chance] 1 by default
203
- * @throws {StateLog} removeFailed
233
+ * @throws {StateLog} removeFailed
204
234
  * If the chance to remove the state has failed (defined with the `chance` param)
205
235
  * ```
206
236
  * {
@@ -208,7 +238,7 @@ export class StateManager {
208
238
  * msg: '...'
209
239
  * }
210
240
  * ```
211
- * @throws {StateLog} notApplied
241
+ * @throws {StateLog} notApplied
212
242
  * If the status does not exist
213
243
  * ```
214
244
  * {
@@ -220,30 +250,26 @@ export class StateManager {
220
250
  * @memberof StateManager
221
251
  */
222
252
  removeState(stateClass: StateClass | string, chance = 1) {
223
- const index = this.states.findIndex((state) => {
224
- if (isString(stateClass)) {
225
- return state.id == stateClass
226
- }
227
- return isInstanceOf(state, stateClass)
228
- })
229
- if (index != -1) {
230
- if (Math.random() > chance) {
231
- throw StateLog.removeFailed(stateClass)
232
- }
233
- this.states.splice(index, 1)
253
+ const index = this.states().findIndex((state) => {
254
+ if (isString(stateClass)) {
255
+ return state.id == stateClass;
234
256
  }
235
- else {
236
- throw StateLog.notApplied(stateClass)
257
+ return isInstanceOf(state, stateClass);
258
+ });
259
+ if (index != -1) {
260
+ if (Math.random() > chance) {
261
+ throw StateLog.removeFailed(stateClass);
237
262
  }
263
+ this.states().splice(index, 1);
264
+ } else {
265
+ throw StateLog.notApplied(stateClass);
266
+ }
238
267
  }
239
268
 
240
269
  private findStateEfficiency(stateClass) {
241
- return this.statesEfficiency.find(state => isInstanceOf(state.state, stateClass))
270
+ return this.statesEfficiency().find((state) =>
271
+ isInstanceOf(state.state, stateClass)
272
+ );
242
273
  }
274
+ };
243
275
  }
244
-
245
- applyMixins(StateManager, [ItemFixture])
246
-
247
- export interface StateManager extends ItemFixture {
248
- databaseById(stateClass: any),
249
- }
@@ -1,5 +1,24 @@
1
- export class VariableManager {
2
- variables: Map<string, any>
1
+ import { type Constructor } from "@rpgjs/common";
2
+ import { RpgCommonPlayer } from "@rpgjs/common";
3
+
4
+ /**
5
+ * Interface defining what MoveManager adds to a class
6
+ */
7
+ export interface IWithVariableManager {
8
+ variables: Map<string, any>
9
+ }
10
+
11
+ /**
12
+ * Move Manager mixin
13
+ *
14
+ * Adds methods to manage player movement
15
+ *
16
+ * @param Base - The base class to extend
17
+ * @returns A new class with move management capabilities
18
+ */
19
+ export function WithVariableManager<TBase extends Constructor<RpgCommonPlayer>>(Base: TBase) {
20
+ return class extends Base implements IWithVariableManager {
21
+ variables: Map<string, any> = new Map()
3
22
 
4
23
  /**
5
24
  * Assign a variable to the player
@@ -52,4 +71,5 @@ export class VariableManager {
52
71
  removeVariable(key: string) {
53
72
  return this.variables.delete(key)
54
73
  }
55
- }
74
+ };
75
+ }
package/src/RpgServer.ts CHANGED
@@ -1,13 +1,17 @@
1
- import { ModuleType, RpgShape, Direction, Control } from '@rpgjs/common'
2
- import { RpgClassEvent, RpgEvent, RpgPlayer } from './Player/Player'
3
- import { RpgMap } from './Game/Map'
4
- import { RpgServerEngine } from './server'
5
- import { MapOptions } from './decorators/map'
6
- import { RpgClassMap } from './Scenes/Map'
7
- import { TiledMap } from '@rpgjs/tiled'
8
- import { WorldMap } from './Game/WorldMaps'
9
- import { MatchMakerOption, RpgMatchMaker } from './MatchMaker'
10
- import { IStoreState } from './Interfaces/StateStore'
1
+ import { RpgPlayer } from "./Player/Player"
2
+ import { type RpgMap } from "./rooms/map"
3
+ import { RpgServerEngine } from "./RpgServerEngine"
4
+
5
+ type RpgShape = any
6
+ type RpgClassMap<T> = any
7
+ type RpgClassEvent<T> = any
8
+ type RpgEvent = any
9
+ type MatchMakerOption = any
10
+ type RpgMatchMaker = any
11
+ type IStoreState = any
12
+ type TiledMap = any
13
+ type WorldMap = any
14
+ type MapOptions = any
11
15
 
12
16
  export interface RpgServerEngineHooks {
13
17
  /**
@@ -39,7 +43,7 @@ export interface RpgServerEngineHooks {
39
43
  *
40
44
  * @param {RpgServerEngine} server - The instance of the game server.
41
45
  * @param {SocketIO.Socket} socket - The socket instance for the connecting player. This can be used to access client-sent data, like tokens or other credentials.
42
- * @returns {Promise<string> | string} The function should return a promise that resolves to a player's unique identifier (e.g., user ID) if authentication is successful, or a string representing the user's ID. Alternatively, it can throw an error if authentication fails.
46
+ * @returns {Promise<string> | string | undefined} The function should return a promise that resolves to a player's unique identifier (e.g., user ID) if authentication is successful, or a string representing the user's ID. Alternatively, it can throw an error if authentication fails. If undefined is returned, the player id is generated.
43
47
  * @throws {string} Throwing an error will prevent the player from connecting, signifying a failed authentication attempt.
44
48
  *
45
49
  * @example
@@ -54,7 +58,7 @@ export interface RpgServerEngineHooks {
54
58
  * };
55
59
  * ```
56
60
  */
57
- auth?: (server: RpgServerEngine, socket: any) => Promise<string> | string | never
61
+ auth?: (server: RpgServerEngine, socket: any) => Promise<string> | string | never | undefined
58
62
  }
59
63
 
60
64
  export interface RpgPlayerHooks {
@@ -152,7 +156,7 @@ export interface RpgPlayerHooks {
152
156
  * @prop { (player: RpgPlayer, data: { input: Direction | Control | string, moving: boolean }) => any } [onInput]
153
157
  * @memberof RpgPlayerHooks
154
158
  */
155
- onInput?: (player: RpgPlayer, data: { input: Direction | Control | string, moving: boolean }) => any
159
+ onInput?: (player: RpgPlayer, data: any) => any
156
160
 
157
161
  /**
158
162
  * When the player leaves the map
@@ -223,6 +227,22 @@ export interface RpgPlayerHooks {
223
227
  canChangeMap?: (player: RpgPlayer, nextMap: RpgClassMap<RpgMap>) => boolean | Promise<boolean>
224
228
  }
225
229
 
230
+ export interface RpgEventHooks {
231
+ onInit?: (event: RpgEvent) => any,
232
+ onAction?: (event: RpgEvent, player: RpgPlayer) => any
233
+ onBeforeCreated?: (object: any, map: RpgMap) => any
234
+ onDetectInShape?: (event: RpgEvent, player: RpgPlayer, shape: RpgShape) => any
235
+ onDetectOutShape?: (event: RpgEvent, player: RpgPlayer, shape: RpgShape) => any
236
+ onInShape?: (event: RpgEvent, shape: RpgShape) => any
237
+ onOutShape?: (event: RpgEvent, shape: RpgShape) => any
238
+ onPlayerTouch?: (event: RpgEvent, player: RpgPlayer) => any
239
+ onChanges?: (event: RpgEvent, player: RpgPlayer) => any
240
+ }
241
+
242
+ export interface RpgMapHooks {
243
+ onBeforeUpdate<T = RpgMap>(mapData: any, map: T): T
244
+ }
245
+
226
246
  export interface RpgServer {
227
247
  /**
228
248
  * Add hooks to the player or engine. All modules can listen to the hook
@@ -275,7 +295,7 @@ export interface RpgServer {
275
295
  * @prop { { client: null | Function, server: null | Function }[]} [imports]
276
296
  * @memberof RpgServer
277
297
  */
278
- imports?: ModuleType[]
298
+ imports?: any
279
299
 
280
300
  /**
281
301
  * Object containing the hooks concerning the engine
@@ -395,6 +415,10 @@ export interface RpgServer {
395
415
  * */
396
416
  maps?: RpgClassMap<RpgMap>[] | MapOptions[] | string[] | TiledMap[],
397
417
 
418
+ map?: RpgMapHooks
419
+
420
+ event?: RpgEventHooks
421
+
398
422
  /**
399
423
  * Array of all events. Each element is an `RpgEvent` class
400
424
  * Events can be used by placing a shape with the name of the event on Tiled Map Editor
@@ -0,0 +1,7 @@
1
+ import { Server } from "@signe/room";
2
+ import { RpgMap } from "./rooms/map";
3
+ import { LobbyRoom } from "./rooms/lobby";
4
+
5
+ export class RpgServerEngine extends Server {
6
+ rooms = [RpgMap, LobbyRoom];
7
+ }
@@ -0,0 +1,3 @@
1
+ import { Context } from "@signe/di";
2
+
3
+ export const context = new Context();
@@ -0,0 +1,17 @@
1
+ import { Context, inject as injector } from "@signe/di";
2
+
3
+ export let context: Context | null = null
4
+
5
+ export function inject<T>(service: (new (...args: any[]) => T) | string, _context?: Context): T {
6
+ const c = _context ?? context
7
+ if (!c) throw new Error("Context is not set. use setInject() to set the context");
8
+ return injector(c, service);
9
+ }
10
+
11
+ export function setInject(_context: Context) {
12
+ context = _context;
13
+ }
14
+
15
+ export function clearInject() {
16
+ context = null
17
+ }
@@ -0,0 +1,20 @@
1
+ import { injector, Providers } from "@signe/di";
2
+ import { RpgServerEngine } from "../RpgServerEngine";
3
+ import { context } from "./context";
4
+ import { setInject } from "./inject";
5
+
6
+ interface SetupOptions {
7
+ providers: Providers;
8
+ }
9
+
10
+ export function createServer(options: SetupOptions): any {
11
+ return class extends RpgServerEngine {
12
+ config = options;
13
+
14
+ async onStart() {
15
+ setInject(context);
16
+ await injector(context, options.providers);
17
+ return super.onStart();
18
+ }
19
+ };
20
+ }
package/src/index.ts CHANGED
@@ -1,31 +1,9 @@
1
- export { default as entryPoint } from './entry-point'
2
- export {
3
- Direction,
4
- Input,
5
- Control,
6
- RpgPlugin,
7
- HookServer,
8
- HookClient,
9
- RpgModule,
10
- RpgShape,
11
- ShapePositioning,
12
- AbstractObject
13
- } from '@rpgjs/common'
14
- export type { RpgServer, RpgPlayerHooks, RpgServerEngineHooks } from './RpgServer'
15
- export { EventData } from './decorators/event'
16
- export { MapData } from './decorators/map'
17
- export { RpgPlayer, RpgEvent } from './Player/Player'
18
- export { EventMode } from './Game/EventManager'
19
- export { RpgMap } from './Game/Map'
20
- export { RpgWorldMaps } from './Game/WorldMaps'
21
- export { Query, Query as RpgWorld } from './Query'
22
- export { default as Monitor } from './Monitor'
23
- export * as Presets from './presets'
24
- export { Move, Frequency, Speed } from './Player/MoveManager'
25
- export { RpgServerEngine } from './server'
26
- export { SceneMap as RpgSceneMap, type RpgClassMap } from './Scenes/Map'
27
- export { RpgMatchMaker } from './MatchMaker'
28
- export type { IStoreState } from './Interfaces/StateStore'
29
- export { Components } from './Player/ComponentManager'
30
- export { Gui } from './Gui/Gui'
31
- export { inject } from './inject'
1
+ export * from "./RpgServerEngine";
2
+ export * from "./Player/MoveManager";
3
+ export * from "./RpgServer";
4
+ export * from "./core/setup";
5
+ export * from "./core/inject";
6
+ export * from "./Player/Player";
7
+ export * from "./module";
8
+ export * from "./rooms/map";
9
+ export * from "./presets";
package/src/module.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { findModules, provideModules } from "@rpgjs/common";
2
+ import { FactoryProvider } from "@signe/di";
3
+ import { RpgServerEngine } from "./RpgServerEngine";
4
+ import { RpgMap } from "./rooms/map";
5
+
6
+ export function provideServerModules(modules: any[]): FactoryProvider {
7
+ return provideModules(modules, "server", (modules, context) => {
8
+ const mainModuleServer = findModules(context, 'Server')
9
+ modules = [...mainModuleServer, ...modules]
10
+ modules = modules.map((module) => {
11
+ if ('server' in module) {
12
+ module = module.server as any;
13
+ }
14
+ if (module.maps && Array.isArray(module.maps)) {
15
+ const maps = [...module.maps];
16
+ module = {
17
+ ...module,
18
+ maps: {
19
+ load: (engine: RpgMap) => {
20
+ maps.forEach((map) => {
21
+ engine.maps.push(map);
22
+ });
23
+ },
24
+ }
25
+ };
26
+ }
27
+ return module;
28
+ })
29
+ return modules
30
+ });
31
+ }
32
+
@@ -1,6 +1,4 @@
1
- import { Utils } from '@rpgjs/common'
2
-
3
- const { random } = Utils
1
+ import { random } from "@rpgjs/common"
4
2
 
5
3
  export const MAXHP: string = 'maxHp'
6
4
  export const MAXSP: string = 'maxSp'
@@ -0,0 +1,24 @@
1
+ import { inject } from "@signe/di";
2
+ import { MockConnection, Room } from "@signe/room";
3
+ import { Hooks, ModulesToken } from "@rpgjs/common";
4
+ import { context } from "../core/context";
5
+ import { users } from "@signe/sync";
6
+ import { signal } from "@signe/reactive";
7
+ import { RpgPlayer } from "../Player/Player";
8
+
9
+ @Room({
10
+ path: "lobby-{id}",
11
+ })
12
+ export class LobbyRoom {
13
+ @users(RpgPlayer) players = signal({});
14
+
15
+ onJoin(player: RpgPlayer, conn: MockConnection) {
16
+ player.map = this;
17
+ player.context = context;
18
+ player.conn = conn;
19
+ const hooks = inject<Hooks>(context, ModulesToken);
20
+ hooks
21
+ .callHooks("server-player-onConnected", player)
22
+ .subscribe();
23
+ }
24
+ }