@rpgjs/server 3.3.2 → 4.0.0-beta.3

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 (152) hide show
  1. package/LICENSE +19 -0
  2. package/lib/Game/Map.d.ts +58 -5
  3. package/lib/Game/Map.js +185 -80
  4. package/lib/Game/Map.js.map +1 -1
  5. package/lib/Game/WorldMaps.d.ts +3 -2
  6. package/lib/Game/WorldMaps.js +6 -11
  7. package/lib/Game/WorldMaps.js.map +1 -1
  8. package/lib/Gui/DialogGui.d.ts +1 -1
  9. package/lib/Gui/DialogGui.js +12 -13
  10. package/lib/Gui/DialogGui.js.map +1 -1
  11. package/lib/Gui/Gui.js +2 -6
  12. package/lib/Gui/Gui.js.map +1 -1
  13. package/lib/Gui/MenuGui.js +4 -8
  14. package/lib/Gui/MenuGui.js.map +1 -1
  15. package/lib/Gui/NotificationGui.js +4 -8
  16. package/lib/Gui/NotificationGui.js.map +1 -1
  17. package/lib/Gui/ShopGui.js +4 -8
  18. package/lib/Gui/ShopGui.js.map +1 -1
  19. package/lib/Gui/index.js +6 -13
  20. package/lib/Gui/index.js.map +1 -1
  21. package/lib/Interfaces/Gui.js +1 -2
  22. package/lib/Interfaces/StateStore.js +1 -2
  23. package/lib/MatchMaker.js +28 -46
  24. package/lib/MatchMaker.js.map +1 -1
  25. package/lib/Monitor/index.js +3 -5
  26. package/lib/Monitor/index.js.map +1 -1
  27. package/lib/Player/BattleManager.js +17 -16
  28. package/lib/Player/BattleManager.js.map +1 -1
  29. package/lib/Player/ClassManager.js +6 -10
  30. package/lib/Player/ClassManager.js.map +1 -1
  31. package/lib/Player/ComponentManager.d.ts +4 -4
  32. package/lib/Player/ComponentManager.js +37 -24
  33. package/lib/Player/ComponentManager.js.map +1 -1
  34. package/lib/Player/EffectManager.js +8 -12
  35. package/lib/Player/EffectManager.js.map +1 -1
  36. package/lib/Player/ElementManager.js +5 -9
  37. package/lib/Player/ElementManager.js.map +1 -1
  38. package/lib/Player/GoldManager.js +1 -5
  39. package/lib/Player/GoldManager.js.map +1 -1
  40. package/lib/Player/GuiManager.js +17 -15
  41. package/lib/Player/GuiManager.js.map +1 -1
  42. package/lib/Player/ItemFixture.js +1 -5
  43. package/lib/Player/ItemFixture.js.map +1 -1
  44. package/lib/Player/ItemManager.d.ts +3 -3
  45. package/lib/Player/ItemManager.js +29 -31
  46. package/lib/Player/ItemManager.js.map +1 -1
  47. package/lib/Player/MoveManager.d.ts +7 -6
  48. package/lib/Player/MoveManager.js +67 -74
  49. package/lib/Player/MoveManager.js.map +1 -1
  50. package/lib/Player/ParameterManager.js +10 -14
  51. package/lib/Player/ParameterManager.js.map +1 -1
  52. package/lib/Player/Player.d.ts +7 -1
  53. package/lib/Player/Player.js +193 -191
  54. package/lib/Player/Player.js.map +1 -1
  55. package/lib/Player/SkillManager.js +18 -22
  56. package/lib/Player/SkillManager.js.map +1 -1
  57. package/lib/Player/StateManager.js +9 -13
  58. package/lib/Player/StateManager.js.map +1 -1
  59. package/lib/Player/VariableManager.js +1 -5
  60. package/lib/Player/VariableManager.js.map +1 -1
  61. package/lib/Query.d.ts +2 -1
  62. package/lib/Query.js +19 -15
  63. package/lib/Query.js.map +1 -1
  64. package/lib/RpgServer.d.ts +11 -3
  65. package/lib/RpgServer.js +1 -2
  66. package/lib/Scenes/Map.d.ts +27 -4
  67. package/lib/Scenes/Map.js +117 -122
  68. package/lib/Scenes/Map.js.map +1 -1
  69. package/lib/decorators/event.js +4 -7
  70. package/lib/decorators/event.js.map +1 -1
  71. package/lib/decorators/map.d.ts +1 -1
  72. package/lib/decorators/map.js +5 -9
  73. package/lib/decorators/map.js.map +1 -1
  74. package/lib/entry-point.js +59 -65
  75. package/lib/entry-point.js.map +1 -1
  76. package/lib/express/api.d.ts +3 -0
  77. package/lib/express/api.js +105 -0
  78. package/lib/express/api.js.map +1 -0
  79. package/lib/express/errors/NotAuthorized.d.ts +4 -0
  80. package/lib/express/errors/NotAuthorized.js +7 -0
  81. package/lib/express/errors/NotAuthorized.js.map +1 -0
  82. package/lib/express/errors/NotFound.d.ts +4 -0
  83. package/lib/express/errors/NotFound.js +7 -0
  84. package/lib/express/errors/NotFound.js.map +1 -0
  85. package/lib/express/server.js +20 -5
  86. package/lib/express/server.js.map +1 -1
  87. package/lib/index.js +15 -68
  88. package/lib/index.js.map +1 -1
  89. package/lib/logs/index.js +5 -11
  90. package/lib/logs/index.js.map +1 -1
  91. package/lib/logs/item.js +11 -15
  92. package/lib/logs/item.js.map +1 -1
  93. package/lib/logs/log.js +1 -5
  94. package/lib/logs/log.js.map +1 -1
  95. package/lib/logs/skill.js +6 -10
  96. package/lib/logs/skill.js.map +1 -1
  97. package/lib/logs/state.js +5 -9
  98. package/lib/logs/state.js.map +1 -1
  99. package/lib/models/Item.js +1 -2
  100. package/lib/presets/index.js +28 -36
  101. package/lib/presets/index.js.map +1 -1
  102. package/lib/server.d.ts +23 -2
  103. package/lib/server.js +227 -134
  104. package/lib/server.js.map +1 -1
  105. package/package.json +24 -16
  106. package/src/Game/Map.ts +513 -0
  107. package/src/Game/WorldMaps.ts +45 -0
  108. package/src/Gui/DialogGui.ts +67 -0
  109. package/src/Gui/Gui.ts +45 -0
  110. package/src/Gui/MenuGui.ts +26 -0
  111. package/src/Gui/NotificationGui.ts +10 -0
  112. package/src/Gui/ShopGui.ts +43 -0
  113. package/src/Gui/index.ts +13 -0
  114. package/src/Interfaces/Gui.ts +4 -0
  115. package/src/Interfaces/StateStore.ts +5 -0
  116. package/src/MatchMaker.ts +63 -0
  117. package/src/Monitor/index.ts +78 -0
  118. package/src/Player/BattleManager.ts +123 -0
  119. package/src/Player/ClassManager.ts +72 -0
  120. package/src/Player/ComponentManager.ts +538 -0
  121. package/src/Player/EffectManager.ts +94 -0
  122. package/src/Player/ElementManager.ts +142 -0
  123. package/src/Player/GoldManager.ts +26 -0
  124. package/src/Player/GuiManager.ts +308 -0
  125. package/src/Player/ItemFixture.ts +24 -0
  126. package/src/Player/ItemManager.ts +474 -0
  127. package/src/Player/MoveManager.ts +635 -0
  128. package/src/Player/ParameterManager.ts +468 -0
  129. package/src/Player/Player.ts +931 -0
  130. package/src/Player/SkillManager.ts +229 -0
  131. package/src/Player/StateManager.ts +230 -0
  132. package/src/Player/VariableManager.ts +55 -0
  133. package/src/Query.ts +172 -0
  134. package/src/RpgServer.ts +429 -0
  135. package/src/Scenes/Map.ts +302 -0
  136. package/src/decorators/event.ts +57 -0
  137. package/src/decorators/map.ts +223 -0
  138. package/src/entry-point.ts +102 -0
  139. package/src/express/api.ts +118 -0
  140. package/src/express/errors/NotAuthorized.ts +6 -0
  141. package/src/express/errors/NotFound.ts +6 -0
  142. package/src/express/server.ts +93 -0
  143. package/src/index.ts +28 -0
  144. package/src/logs/index.ts +11 -0
  145. package/src/logs/item.ts +31 -0
  146. package/src/logs/log.ts +3 -0
  147. package/src/logs/skill.ts +16 -0
  148. package/src/logs/state.ts +13 -0
  149. package/src/models/Item.ts +11 -0
  150. package/src/presets/index.ts +71 -0
  151. package/src/server.ts +394 -0
  152. package/tsconfig.json +27 -0
@@ -0,0 +1,229 @@
1
+ import { Utils } from '@rpgjs/common'
2
+ import { Effect } from '@rpgjs/database'
3
+ import { SkillLog } from '../logs'
4
+ import { StateManager } from './StateManager'
5
+ import { EffectManager } from './EffectManager'
6
+ import { ParameterManager } from './ParameterManager';
7
+ import { RpgPlayer } from './Player';
8
+
9
+ import {
10
+ INT
11
+ } from '../presets'
12
+
13
+ const {
14
+ isArray,
15
+ isString,
16
+ isInstanceOf,
17
+ applyMixins
18
+ } = Utils
19
+
20
+ export class SkillManager {
21
+
22
+ skills: any[]
23
+
24
+ private _getSkillIndex(skillClass) {
25
+ return this.skills.findIndex(skill => {
26
+ if (isString(skill)) {
27
+ return skill.id == skillClass
28
+ }
29
+ return isInstanceOf(skill, skillClass)
30
+ })
31
+ }
32
+
33
+ /**
34
+ * Retrieves a skill. Returns null, if not found
35
+ * ```ts
36
+ * import Fire from 'your-database/skills/fire'
37
+ *
38
+ * player.getSkill(Fire)
39
+ * ```
40
+ *
41
+ * @title Get Skill
42
+ * @method player.getSkill(skillClass)
43
+ * @param {SkillClass} skillClass
44
+ * @returns {instance of SkillClass | null}
45
+ * @memberof SkillManager
46
+ */
47
+ getSkill(skillClass) {
48
+ const index = this._getSkillIndex(skillClass)
49
+ return this.skills[index]
50
+ }
51
+
52
+ /**
53
+ * Learn a skill. Attributes the coefficient 1 to the parameter INT (intelligence) if cd is not present on the class.
54
+ *
55
+ * `onLearn()` method is called on the SkillClass
56
+ *
57
+ * ```ts
58
+ * import Fire from 'your-database/skills/fire'
59
+ *
60
+ * player.learnSkill(Fire)
61
+ * ```
62
+ *
63
+ * @title Learn Skill
64
+ * @method player.learnSkill(skillClass)
65
+ * @param {SkillClass} skillClass
66
+ * @returns {instance of SkillClass}
67
+ * @memberof SkillManager
68
+ */
69
+ learnSkill(skillClass) {
70
+ const instance = new skillClass()
71
+ if (!instance.coefficient) instance.coefficient = {
72
+ [INT]: 1
73
+ }
74
+ this.skills.push(instance)
75
+ this['execMethod']('onLearn', [this], instance)
76
+ return instance
77
+ }
78
+
79
+ /**
80
+ * Forget a skill
81
+ *
82
+ * `onForget()` method is called on the SkillClass
83
+ *
84
+ * ```ts
85
+ * import Fire from 'your-database/skills/fire'
86
+ *
87
+ * try {
88
+ * player.forgetSkill(Fire)
89
+ * }
90
+ * catch (err) {
91
+ * console.log(err)
92
+ * }
93
+ * ```
94
+ *
95
+ * @title Forget Skill
96
+ * @method player.learnSkill(skillClass)
97
+ * @param {SkillClass} skillClass
98
+ * @throws {SkillLog} notLearned
99
+ * If trying to forget a skill not learned
100
+ * ```
101
+ * {
102
+ * id: SKILL_NOT_LEARNED,
103
+ * msg: '...'
104
+ * }
105
+ * ```
106
+ * @returns {instance of SkillClass}
107
+ * @memberof SkillManager
108
+ */
109
+ forgetSkill(skillClass) {
110
+ const index = this._getSkillIndex(skillClass)
111
+ if (index == -1) {
112
+ throw SkillLog.notLearned(skillClass)
113
+ }
114
+ this.skills.splice(index, 1)
115
+ const instance = this.skills[index]
116
+ this['execMethod']('onForget', [this], instance)
117
+ return instance
118
+ }
119
+
120
+ /**
121
+ * Using a skill
122
+ *
123
+ * `onUse()` method is called on the SkillClass
124
+ *
125
+ * If other players are indicated then damage will be done to these other players. The method `applyDamage()` will be executed
126
+ *
127
+ * ```ts
128
+ * import Fire from 'your-database/skills/fire'
129
+ *
130
+ * try {
131
+ * player.useSkill(Fire)
132
+ * }
133
+ * catch (err) {
134
+ * console.log(err)
135
+ * }
136
+ * ```
137
+ *
138
+ * or
139
+ *
140
+ *
141
+ * * ```ts
142
+ * import Fire from 'your-database/skills/fire'
143
+ *
144
+ * try {
145
+ * player.useSkill(Fire, otherPlayer)
146
+ * }
147
+ * catch (err) {
148
+ * console.log(err)
149
+ * }
150
+ * ```
151
+ *
152
+ * @title Use Skill
153
+ * @method player.useSkill(skillClass,otherPlayer)
154
+ * @param {SkillClass} skillClass
155
+ * @param {Array<RpgPlayer> | RpgPlayer} [otherPlayer]
156
+ * @throws {SkillLog} restriction
157
+ * If the player has the `Effect.CAN_NOT_SKILL` effect
158
+ * ```
159
+ * {
160
+ * id: RESTRICTION_SKILL,
161
+ * msg: '...'
162
+ * }
163
+ * ```
164
+ * @throws {SkillLog} notLearned
165
+ * If the player tries to use an unlearned skill
166
+ * ```
167
+ * {
168
+ * id: SKILL_NOT_LEARNED,
169
+ * msg: '...'
170
+ * }
171
+ * ```
172
+ * @throws {SkillLog} notEnoughSp
173
+ * If the player does not have enough SP to use the skill
174
+ * ```
175
+ * {
176
+ * id: NOT_ENOUGH_SP,
177
+ * msg: '...'
178
+ * }
179
+ * ```
180
+ * @throws {SkillLog} chanceToUseFailed
181
+ * If the chance to use the skill has failed (defined with the `hitRate` property)
182
+ * ```
183
+ * {
184
+ * id: USE_CHANCE_SKILL_FAILED,
185
+ * msg: '...'
186
+ * }
187
+ * ```
188
+ *
189
+ * `onUseFailed()` method is called on the SkillClass
190
+ *
191
+ * @returns {instance of SkillClass}
192
+ * @memberof SkillManager
193
+ * @todo
194
+ */
195
+ useSkill(skillClass, otherPlayer?: RpgPlayer | RpgPlayer[]) {
196
+ const skill = this.getSkill(skillClass)
197
+ if (this.hasEffect(Effect.CAN_NOT_SKILL)) {
198
+ throw SkillLog.restriction(skillClass)
199
+ }
200
+ if (!skill) {
201
+ throw SkillLog.notLearned(skillClass)
202
+ }
203
+ if (skill.spCost > this.sp) {
204
+ throw SkillLog.notEnoughSp(skillClass, skill.spCost, this.sp)
205
+ }
206
+ this.sp -= (skill.spCost / (this.hasEffect(Effect.HALF_SP_COST) ? 2 : 1))
207
+ const hitRate = skill.hitRate || 1
208
+ if (Math.random() > hitRate) {
209
+ this['execMethod']('onUseFailed', [this, otherPlayer], skill)
210
+ throw SkillLog.chanceToUseFailed(skillClass)
211
+ }
212
+ if (otherPlayer) {
213
+ let players: any = otherPlayer
214
+ if (!isArray(players)) {
215
+ players = [otherPlayer]
216
+ }
217
+ for (let player of players) {
218
+ this.applyStates(player, skill)
219
+ player.applyDamage(this, skill)
220
+ }
221
+ }
222
+ this['execMethod']('onUse', [this, otherPlayer], skill)
223
+ return skill
224
+ }
225
+ }
226
+
227
+ applyMixins(SkillManager, [ParameterManager, StateManager, EffectManager])
228
+
229
+ export interface SkillManager extends ParameterManager, StateManager, EffectManager { }
@@ -0,0 +1,230 @@
1
+ import { Utils } from '@rpgjs/common'
2
+ import { ItemFixture } from './ItemFixture'
3
+ import { RpgPlayer } from './Player'
4
+ import { StateLog } from '../logs/state'
5
+
6
+ const {
7
+ isInstanceOf,
8
+ applyMixins
9
+ } = Utils
10
+
11
+ export class StateManager {
12
+
13
+ states: any[] = []
14
+
15
+ _statesEfficiency: { rate: number, state: any }[]
16
+
17
+ /**
18
+ * Recovers the player's states defense on inventory. This list is generated from the `statesDefense` property defined on the weapons or armors equipped.
19
+ * If several items have the same element, only the highest rate will be taken into account.
20
+ *
21
+ * ```ts
22
+ * import { Armor, State } from '@rpgjs/server'
23
+ *
24
+ * @State({
25
+ * name: 'Paralyze'
26
+ * })
27
+ * class Paralyze {}
28
+ *
29
+ * @Armor({
30
+ * name: 'Shield',
31
+ * statesDefense: [{ rate: 1, state: Paralyze }]
32
+ * })
33
+ * class Shield {}
34
+ *
35
+ * @Armor({
36
+ * name: 'FireShield',
37
+ * statesDefense: [{ rate: 0.5, state: Paralyze }]
38
+ * })
39
+ * class FireShield {}
40
+ *
41
+ * player.addItem(Shield)
42
+ * player.addItem(FireShield)
43
+ * player.equip(Shield)
44
+ * player.equip(FireShield)
45
+ *
46
+ * console.log(player.statesDefense) // [{ rate: 1, state: instance of Paralyze }]
47
+ * ```
48
+ * @title Get States Defense
49
+ * @prop {Array<{ rate: number, state: StateClass}>} player.statesDefense
50
+ * @readonly
51
+ * @memberof StateManager
52
+ * */
53
+ get statesDefense(): { rate: number, state: any }[] {
54
+ return this.getFeature('statesDefense', 'state')
55
+ }
56
+
57
+ /**
58
+ * Set or retrieves all the states where the player is vulnerable or not.
59
+ *
60
+ * ```ts
61
+ * import { Class, State } from '@rpgjs/server'
62
+ *
63
+ * @State({
64
+ * name: 'Paralyze'
65
+ * })
66
+ * class Paralyze {}
67
+ *
68
+ * @State({
69
+ * name: 'Sleep'
70
+ * })
71
+ * class Sleep {}
72
+ *
73
+ * @Class({
74
+ * name: 'Fighter',
75
+ * statesEfficiency: [{ rate: 1, state: Paralyze }]
76
+ * })
77
+ * class Hero {}
78
+ *
79
+ * player.setClass(Hero)
80
+ *
81
+ * console.log(player.statesEfficiency) // [{ rate: 1, instance of Paralyze }]
82
+ *
83
+ * player.statesEfficiency = [{ rate: 2, state: Sleep }]
84
+ *
85
+ * console.log(player.statesEfficiency) // [{ rate: 1, state: instance of Paralyze }, { rate: 2, state: instance of Sleep }]
86
+ * ```
87
+ * @title Set/Get States Efficiency
88
+ * @prop {Array<{ rate: number, state: StateClass}>} player.statesEfficiency
89
+ * @memberof StateManager
90
+ * */
91
+ get statesEfficiency() {
92
+ return this._statesEfficiency
93
+ }
94
+
95
+ set statesEfficiency(val) {
96
+ this._statesEfficiency = val
97
+ }
98
+
99
+ applyStates(player: RpgPlayer, { addStates, removeStates }) {
100
+ if (addStates) {
101
+ for (let { state, rate } of addStates) {
102
+ player.addState(state, rate)
103
+ }
104
+ }
105
+ if (removeStates) {
106
+ for (let { state, rate } of removeStates) {
107
+ player.removeState(state, rate)
108
+ }
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Get a state to the player. Returns `null` if the state is not present on the player
114
+ * ```ts
115
+ * import Paralyze from 'your-database/states/paralyze'
116
+ *
117
+ * player.getState(Paralyze)
118
+ * ```
119
+ *
120
+ * @title Get State
121
+ * @method player.getState(stateClass)
122
+ * @param {StateClass} stateClass
123
+ * @returns {instance of StateClass | null}
124
+ * @memberof StateManager
125
+ */
126
+ getState(stateClass) {
127
+ return this.states.find(({ state }) => state instanceof stateClass)
128
+ }
129
+
130
+ /**
131
+ * Adds a state to the player. Set the chance between 0 and 1 that the state can apply
132
+ * ```ts
133
+ * import Paralyze from 'your-database/states/paralyze'
134
+ *
135
+ * try {
136
+ * player.addState(Paralyze)
137
+ * }
138
+ * catch (err) {
139
+ * console.log(err)
140
+ * }
141
+ * ```
142
+ *
143
+ * @title Add State
144
+ * @method player.addState(stateClass,chance=1)
145
+ * @param {StateClass} stateClass
146
+ * @param {number} [chance] 1 by default
147
+ * @throws {StateLog} addFailed
148
+ * If the chance to add the state has failed (defined with the `chance` param)
149
+ * ```
150
+ * {
151
+ * id: ADD_STATE_FAILED,
152
+ * msg: '...'
153
+ * }
154
+ * ```
155
+ * @returns {instance of StateClass}
156
+ * @memberof StateManager
157
+ * @todo
158
+ */
159
+ addState(stateClass, chance = 1): object | null {
160
+ const state = this.getState(stateClass)
161
+ if (!state) {
162
+ if (Math.random() > chance) {
163
+ throw StateLog.addFailed(stateClass)
164
+ }
165
+ //const efficiency = this.findStateEfficiency(stateClass)
166
+ const instance = new stateClass()
167
+ this.states.push(instance)
168
+ this.applyStates(<any>this, instance)
169
+ return instance
170
+ }
171
+ return null
172
+ }
173
+
174
+ /**
175
+ * Remove a state to the player. Set the chance between 0 and 1 that the state can be removed
176
+ * ```ts
177
+ * import Paralyze from 'your-database/states/paralyze'
178
+ *
179
+ * try {
180
+ * player.removeState(Paralyze)
181
+ * }
182
+ * catch (err) {
183
+ * console.log(err)
184
+ * }
185
+ * ```
186
+ *
187
+ * @title Remove State
188
+ * @method player.removeState(stateClass,chance=1)
189
+ * @param {StateClass} stateClass
190
+ * @param {number} [chance] 1 by default
191
+ * @throws {StateLog} removeFailed
192
+ * If the chance to remove the state has failed (defined with the `chance` param)
193
+ * ```
194
+ * {
195
+ * id: REMOVE_STATE_FAILED,
196
+ * msg: '...'
197
+ * }
198
+ * ```
199
+ * @throws {StateLog} notApplied
200
+ * If the status does not exist
201
+ * ```
202
+ * {
203
+ * id: STATE_NOT_APPLIED,
204
+ * msg: '...'
205
+ * }
206
+ * ```
207
+ * @returns {instance of StateClass}
208
+ * @memberof StateManager
209
+ */
210
+ removeState(stateClass, chance = 1) {
211
+ const index = this.states.findIndex(state => state instanceof stateClass)
212
+ if (index != -1) {
213
+ if (Math.random() > chance) {
214
+ throw StateLog.removeFailed(stateClass)
215
+ }
216
+ this.states.splice(index, 1)
217
+ }
218
+ else {
219
+ throw StateLog.notApplied(stateClass)
220
+ }
221
+ }
222
+
223
+ private findStateEfficiency(stateClass) {
224
+ return this.statesEfficiency.find(state => isInstanceOf(state.state, stateClass))
225
+ }
226
+ }
227
+
228
+ applyMixins(StateManager, [ItemFixture])
229
+
230
+ export interface StateManager extends ItemFixture { }
@@ -0,0 +1,55 @@
1
+ export class VariableManager {
2
+ variables: Map<string, any>
3
+
4
+ /**
5
+ * Assign a variable to the player
6
+ *
7
+ * ```ts
8
+ * player.setVariable('OPEN_CHEST', true)
9
+ * ```
10
+ *
11
+ * @title Set variable
12
+ * @method player.setVariable(key,val)
13
+ * @param {string} key
14
+ * @param {any} val
15
+ * @returns {void}
16
+ * @memberof VariableManager
17
+ * */
18
+ setVariable(key: string, val) {
19
+ this.variables.set(key, val)
20
+ }
21
+
22
+ /**
23
+ * Get a variable
24
+ *
25
+ * ```ts
26
+ * const val = player.getVariable('OPEN_CHEST')
27
+ * ```
28
+ *
29
+ * @title Get variable
30
+ * @method player.setVariable(key,val)
31
+ * @param {string} key
32
+ * @returns {any}
33
+ * @memberof VariableManager
34
+ * */
35
+ getVariable(key: string) {
36
+ return this.variables.get(key)
37
+ }
38
+
39
+ /**
40
+ * Remove a variable
41
+ *
42
+ * ```ts
43
+ * player.removeVariable('OPEN_CHEST')
44
+ * ```
45
+ *
46
+ * @title Remove variable
47
+ * @method player.removeVariable(key)
48
+ * @param {string} key
49
+ * @returns {boolean} true if a variable existed and has been removed, or false if the variable does not exist.
50
+ * @memberof VariableManager
51
+ * */
52
+ removeVariable(key: string) {
53
+ return this.variables.delete(key)
54
+ }
55
+ }
package/src/Query.ts ADDED
@@ -0,0 +1,172 @@
1
+ import { World } from 'simple-room'
2
+ import { RpgShape, Utils } from '@rpgjs/common'
3
+ import { RpgPlayer } from './Player/Player'
4
+ import { Observable } from 'rxjs'
5
+
6
+ const { isString } = Utils
7
+
8
+ class QueryClass {
9
+ /**
10
+ * Listen to the changes on all the rooms
11
+ *
12
+ * ```ts
13
+ * import { RpgWorld } from '@rpgjs/server'
14
+ * import { map } from 'rxjs/operators' // install rxjs
15
+ *
16
+ * RpgWorld.changes
17
+ * .pipe(
18
+ * map(rooms => rooms['mymap'])
19
+ * )
20
+ * .subscribe((room) => {
21
+ * const users: any = Object.values(room.users)
22
+ * console.log(users)
23
+ * })
24
+ * ```
25
+ *
26
+ * @title Subscribe to the world
27
+ * @prop {Observable} RpgWorld.changes
28
+ * @memberof RpgWorld
29
+ * */
30
+ get changes(): Observable<any> {
31
+ return World.changes.asObservable() as any
32
+ }
33
+
34
+ /**
35
+ * Retrieve a player according to his ID
36
+ *
37
+ * ```ts
38
+ * import { RpgWorld } from '@rpgjs/server'
39
+ *
40
+ * const player = RpgWorld.getPlayer(player) // player is RpgPlayer (player.id) or string (id)
41
+ * ```
42
+ *
43
+ * @title Get Player
44
+ * @method RpgWorld.getPlayer(player)
45
+ * @param {RpgPlayer | string} player identifier
46
+ * @returns {RpgPlayer}
47
+ * @memberof RpgWorld
48
+ */
49
+ getPlayer(player: RpgPlayer | string): RpgPlayer {
50
+ const id: any = isString(player) ? player : '' + (player as RpgPlayer).id
51
+ const _player: any = World.getUser(id)
52
+ return _player as RpgPlayer
53
+ }
54
+
55
+ /**
56
+ * Recover all the players of the game
57
+ *
58
+ * ```ts
59
+ * import { RpgWorld } from '@rpgjs/server'
60
+ *
61
+ * const players = RpgWorld.getPlayers()
62
+ * ```
63
+ *
64
+ * @title Get all Players
65
+ * @method RpgWorld.getPlayers()
66
+ * @returns {Array<RpgPlayer>}
67
+ * @memberof RpgWorld
68
+ */
69
+ getPlayers(): RpgPlayer[] {
70
+ const users: any = World.getUsers()
71
+ const array = Object.values(users) as RpgPlayer[]
72
+ return array.map((user: RpgPlayer) => this.getPlayer(user))
73
+ }
74
+
75
+ /**
76
+ * Recover all map objects: players and events. If you specify the `player` parameter, it also retrieves the events in scenario mode of the player in question
77
+ *
78
+ * ```ts
79
+ * import { RpgWorld } from '@rpgjs/server'
80
+ *
81
+ * const objects = RpgWorld.getObjectsOfMap('mapname')
82
+ * console.log(objects)
83
+ * ```
84
+ *
85
+ * Also retrieve events in Scenario mode:
86
+ *
87
+ * ```ts
88
+ * import { RpgWorld } from '@rpgjs/server'
89
+ *
90
+ * const objects = RpgWorld.getObjectsOfMap('mapname', 'playerid')
91
+ * ```
92
+ *
93
+ * @title Get all objects of map
94
+ * @method RpgWorld.getObjectsOfMap(map,playerId?)
95
+ * @param {string} map Map Name
96
+ * @param {RpgPlayer | string} playerId player identifier
97
+ * @returns {Array<RpgPlayer>}
98
+ * @memberof RpgWorld
99
+ */
100
+ getObjectsOfMap(map: string, playerId?: RpgPlayer | string): RpgPlayer[] {
101
+ return Object.values(this._getObjectsOfMap(map, playerId)) as RpgPlayer[]
102
+ }
103
+
104
+ _getObjectsOfMap(map: string, playerId?: RpgPlayer | string): { [id: string]: RpgPlayer } {
105
+ const room: any = World.getRoom(map)
106
+ let player: any = null
107
+ if (playerId) {
108
+ player = this.getPlayer(playerId)
109
+ }
110
+ return {
111
+ ...room.users,
112
+ ...room.events,
113
+ ...(player ? player.events : {})
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Find all the shapes of the map
119
+ *
120
+ * ```ts
121
+ * import { RpgWorld } from '@rpgjs/server'
122
+ *
123
+ * const shapes = RpgWorld.getShapesOfMap('mapname')
124
+ * console.log(shapes)
125
+ * ```
126
+ *
127
+ * @title Get all shapes of map
128
+ * @method RpgWorld.getShapesOfMap(map)
129
+ * @param {string} map Map Name
130
+ * @returns {Array<RpgShape>}
131
+ * @memberof RpgWorld
132
+ */
133
+ getShapesOfMap(map: string): RpgShape[] {
134
+ return Object.values(this._getShapesOfMap(map))
135
+ }
136
+
137
+ _getShapesOfMap(map: string): { [id: string]: RpgShape } {
138
+ const room: any = World.getRoom(map)
139
+ return room.shapes
140
+ }
141
+
142
+ // TODO
143
+ getRooms<T>(): Map<string, T> {
144
+ return World.getRooms() as Map<string, T>
145
+ }
146
+
147
+ getRoom<T>(name: string): T {
148
+ return World.getRoom(name) as T
149
+ }
150
+
151
+ /**
152
+ * Recover all the players of a map
153
+ *
154
+ * ```ts
155
+ * import { RpgWorld } from '@rpgjs/server'
156
+ *
157
+ * const players = RpgWorld.getPlayersOfMap('mapname')
158
+ * ```
159
+ *
160
+ * @title Get all Players a map
161
+ * @method RpgWorld.getPlayersOfMap(map)
162
+ * @param {string} map Map Name
163
+ * @returns {Array<RpgPlayer>}
164
+ * @memberof RpgWorld
165
+ */
166
+ getPlayersOfMap(map: string): RpgPlayer[] {
167
+ const room: any = World.getRoom(map)
168
+ return Object.values(room.users) as RpgPlayer[]
169
+ }
170
+ }
171
+
172
+ export const Query = new QueryClass()