@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.
- package/LICENSE +19 -0
- package/lib/Game/Map.d.ts +58 -5
- package/lib/Game/Map.js +185 -80
- package/lib/Game/Map.js.map +1 -1
- package/lib/Game/WorldMaps.d.ts +3 -2
- package/lib/Game/WorldMaps.js +6 -11
- package/lib/Game/WorldMaps.js.map +1 -1
- package/lib/Gui/DialogGui.d.ts +1 -1
- package/lib/Gui/DialogGui.js +12 -13
- package/lib/Gui/DialogGui.js.map +1 -1
- package/lib/Gui/Gui.js +2 -6
- package/lib/Gui/Gui.js.map +1 -1
- package/lib/Gui/MenuGui.js +4 -8
- package/lib/Gui/MenuGui.js.map +1 -1
- package/lib/Gui/NotificationGui.js +4 -8
- package/lib/Gui/NotificationGui.js.map +1 -1
- package/lib/Gui/ShopGui.js +4 -8
- package/lib/Gui/ShopGui.js.map +1 -1
- package/lib/Gui/index.js +6 -13
- package/lib/Gui/index.js.map +1 -1
- package/lib/Interfaces/Gui.js +1 -2
- package/lib/Interfaces/StateStore.js +1 -2
- package/lib/MatchMaker.js +28 -46
- package/lib/MatchMaker.js.map +1 -1
- package/lib/Monitor/index.js +3 -5
- package/lib/Monitor/index.js.map +1 -1
- package/lib/Player/BattleManager.js +17 -16
- package/lib/Player/BattleManager.js.map +1 -1
- package/lib/Player/ClassManager.js +6 -10
- package/lib/Player/ClassManager.js.map +1 -1
- package/lib/Player/ComponentManager.d.ts +4 -4
- package/lib/Player/ComponentManager.js +37 -24
- package/lib/Player/ComponentManager.js.map +1 -1
- package/lib/Player/EffectManager.js +8 -12
- package/lib/Player/EffectManager.js.map +1 -1
- package/lib/Player/ElementManager.js +5 -9
- package/lib/Player/ElementManager.js.map +1 -1
- package/lib/Player/GoldManager.js +1 -5
- package/lib/Player/GoldManager.js.map +1 -1
- package/lib/Player/GuiManager.js +17 -15
- package/lib/Player/GuiManager.js.map +1 -1
- package/lib/Player/ItemFixture.js +1 -5
- package/lib/Player/ItemFixture.js.map +1 -1
- package/lib/Player/ItemManager.d.ts +3 -3
- package/lib/Player/ItemManager.js +29 -31
- package/lib/Player/ItemManager.js.map +1 -1
- package/lib/Player/MoveManager.d.ts +7 -6
- package/lib/Player/MoveManager.js +67 -74
- package/lib/Player/MoveManager.js.map +1 -1
- package/lib/Player/ParameterManager.js +10 -14
- package/lib/Player/ParameterManager.js.map +1 -1
- package/lib/Player/Player.d.ts +7 -1
- package/lib/Player/Player.js +193 -191
- package/lib/Player/Player.js.map +1 -1
- package/lib/Player/SkillManager.js +18 -22
- package/lib/Player/SkillManager.js.map +1 -1
- package/lib/Player/StateManager.js +9 -13
- package/lib/Player/StateManager.js.map +1 -1
- package/lib/Player/VariableManager.js +1 -5
- package/lib/Player/VariableManager.js.map +1 -1
- package/lib/Query.d.ts +2 -1
- package/lib/Query.js +19 -15
- package/lib/Query.js.map +1 -1
- package/lib/RpgServer.d.ts +11 -3
- package/lib/RpgServer.js +1 -2
- package/lib/Scenes/Map.d.ts +27 -4
- package/lib/Scenes/Map.js +117 -122
- package/lib/Scenes/Map.js.map +1 -1
- package/lib/decorators/event.js +4 -7
- package/lib/decorators/event.js.map +1 -1
- package/lib/decorators/map.d.ts +1 -1
- package/lib/decorators/map.js +5 -9
- package/lib/decorators/map.js.map +1 -1
- package/lib/entry-point.js +59 -65
- package/lib/entry-point.js.map +1 -1
- package/lib/express/api.d.ts +3 -0
- package/lib/express/api.js +105 -0
- package/lib/express/api.js.map +1 -0
- package/lib/express/errors/NotAuthorized.d.ts +4 -0
- package/lib/express/errors/NotAuthorized.js +7 -0
- package/lib/express/errors/NotAuthorized.js.map +1 -0
- package/lib/express/errors/NotFound.d.ts +4 -0
- package/lib/express/errors/NotFound.js +7 -0
- package/lib/express/errors/NotFound.js.map +1 -0
- package/lib/express/server.js +20 -5
- package/lib/express/server.js.map +1 -1
- package/lib/index.js +15 -68
- package/lib/index.js.map +1 -1
- package/lib/logs/index.js +5 -11
- package/lib/logs/index.js.map +1 -1
- package/lib/logs/item.js +11 -15
- package/lib/logs/item.js.map +1 -1
- package/lib/logs/log.js +1 -5
- package/lib/logs/log.js.map +1 -1
- package/lib/logs/skill.js +6 -10
- package/lib/logs/skill.js.map +1 -1
- package/lib/logs/state.js +5 -9
- package/lib/logs/state.js.map +1 -1
- package/lib/models/Item.js +1 -2
- package/lib/presets/index.js +28 -36
- package/lib/presets/index.js.map +1 -1
- package/lib/server.d.ts +23 -2
- package/lib/server.js +227 -134
- package/lib/server.js.map +1 -1
- package/package.json +24 -16
- package/src/Game/Map.ts +513 -0
- package/src/Game/WorldMaps.ts +45 -0
- package/src/Gui/DialogGui.ts +67 -0
- package/src/Gui/Gui.ts +45 -0
- package/src/Gui/MenuGui.ts +26 -0
- package/src/Gui/NotificationGui.ts +10 -0
- package/src/Gui/ShopGui.ts +43 -0
- package/src/Gui/index.ts +13 -0
- package/src/Interfaces/Gui.ts +4 -0
- package/src/Interfaces/StateStore.ts +5 -0
- package/src/MatchMaker.ts +63 -0
- package/src/Monitor/index.ts +78 -0
- package/src/Player/BattleManager.ts +123 -0
- package/src/Player/ClassManager.ts +72 -0
- package/src/Player/ComponentManager.ts +538 -0
- package/src/Player/EffectManager.ts +94 -0
- package/src/Player/ElementManager.ts +142 -0
- package/src/Player/GoldManager.ts +26 -0
- package/src/Player/GuiManager.ts +308 -0
- package/src/Player/ItemFixture.ts +24 -0
- package/src/Player/ItemManager.ts +474 -0
- package/src/Player/MoveManager.ts +635 -0
- package/src/Player/ParameterManager.ts +468 -0
- package/src/Player/Player.ts +931 -0
- package/src/Player/SkillManager.ts +229 -0
- package/src/Player/StateManager.ts +230 -0
- package/src/Player/VariableManager.ts +55 -0
- package/src/Query.ts +172 -0
- package/src/RpgServer.ts +429 -0
- package/src/Scenes/Map.ts +302 -0
- package/src/decorators/event.ts +57 -0
- package/src/decorators/map.ts +223 -0
- package/src/entry-point.ts +102 -0
- package/src/express/api.ts +118 -0
- package/src/express/errors/NotAuthorized.ts +6 -0
- package/src/express/errors/NotFound.ts +6 -0
- package/src/express/server.ts +93 -0
- package/src/index.ts +28 -0
- package/src/logs/index.ts +11 -0
- package/src/logs/item.ts +31 -0
- package/src/logs/log.ts +3 -0
- package/src/logs/skill.ts +16 -0
- package/src/logs/state.ts +13 -0
- package/src/models/Item.ts +11 -0
- package/src/presets/index.ts +71 -0
- package/src/server.ts +394 -0
- 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()
|