@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,43 @@
1
+ import { PrebuiltGui } from '@rpgjs/common'
2
+ import { Gui } from './Gui'
3
+ import { RpgPlayer } from '../Player/Player'
4
+ import { IGui } from '../Interfaces/Gui'
5
+
6
+ export class ShopGui extends Gui implements IGui {
7
+ constructor(player: RpgPlayer) {
8
+ super(PrebuiltGui.Shop, player)
9
+ }
10
+
11
+ open(items: any[]) {
12
+ items = items.map(item => {
13
+ const it = new item()
14
+ return {
15
+ price: it.price,
16
+ name: it.name,
17
+ description: it.description,
18
+ id: it.id,
19
+ type: item.type
20
+ }
21
+ })
22
+ this.on('buyItem', ({ id, nb }) => {
23
+ try {
24
+ this.player.buyItem(id, nb)
25
+ }
26
+ catch (err) {
27
+ console.log(err)
28
+ }
29
+ })
30
+ this.on('sellItem', ({ id, nb }) => {
31
+ try {
32
+ this.player.sellItem(id, nb)
33
+ }
34
+ catch (err) {
35
+ console.log(err)
36
+ }
37
+ })
38
+ return super.open({ items }, {
39
+ waitingAction: true,
40
+ blockPlayerInput: true
41
+ })
42
+ }
43
+ }
@@ -0,0 +1,13 @@
1
+ import { Gui } from './Gui'
2
+ import { DialogGui } from './DialogGui'
3
+ import { MenuGui } from './MenuGui'
4
+ import { ShopGui } from './ShopGui'
5
+ import { NotificationGui } from './NotificationGui'
6
+
7
+ export {
8
+ Gui,
9
+ DialogGui,
10
+ MenuGui,
11
+ ShopGui,
12
+ NotificationGui
13
+ }
@@ -0,0 +1,4 @@
1
+ export interface IGui {
2
+ open(...any): Promise<any>
3
+ close?()
4
+ }
@@ -0,0 +1,5 @@
1
+ export interface IStoreState {
2
+ connect(): Promise<any>
3
+ get(key: string): Promise<string | null>
4
+ set(key: string, val: string): Promise<any>
5
+ }
@@ -0,0 +1,63 @@
1
+
2
+ import axios from 'axios'
3
+ import { Utils } from '@rpgjs/common'
4
+ import { RpgPlayer } from './Player/Player'
5
+
6
+ interface MatchMakerPayload {
7
+ playerId: string
8
+ mapName: string
9
+ }
10
+
11
+ export interface MatchMakerResponse {
12
+ url: string
13
+ port: number
14
+ serverId: string
15
+ }
16
+
17
+ export interface MatchMakerOption {
18
+ endpoint?: string
19
+ headers?: any
20
+ callback?: (payload: MatchMakerPayload) => MatchMakerResponse
21
+ }
22
+
23
+ export class RpgMatchMaker {
24
+ private endpoint?: string
25
+ private headers?: any
26
+ private callback?: (payload: MatchMakerPayload) => MatchMakerResponse
27
+
28
+ constructor(private options: MatchMakerOption) {
29
+ this.endpoint = options.endpoint
30
+ this.headers = options.headers
31
+ this.callback = options.callback
32
+ }
33
+
34
+ async getServer(player: RpgPlayer): Promise<MatchMakerResponse | null> {
35
+ const currentServerId = player.server.serverId
36
+ const payload: MatchMakerPayload = {
37
+ playerId: player.id,
38
+ mapName: player.map
39
+ }
40
+ let res = {} as MatchMakerResponse
41
+ if (this.callback) {
42
+ res = this.callback(payload)
43
+ if (Utils.isPromise(res)) {
44
+ res = await res
45
+ }
46
+ }
47
+ if (this.endpoint) {
48
+ try {
49
+ res = await axios.post<MatchMakerResponse>(this.endpoint, payload, {
50
+ headers: this.headers
51
+ }).then(res => res.data)
52
+ }
53
+ catch (err) {
54
+ console.log('There is a problem with the MatchMaker webservice.')
55
+ throw err
56
+ }
57
+ }
58
+ if (currentServerId == res.serverId) {
59
+ return null
60
+ }
61
+ return res
62
+ }
63
+ }
@@ -0,0 +1,78 @@
1
+ import { EventEmitter } from '@rpgjs/common'
2
+ import os from 'os'
3
+
4
+ class Monitor extends EventEmitter {
5
+ private monitors: Map<string, any> = new Map()
6
+ private lastTime: any
7
+ loopMs
8
+ totalConnected: number = 0
9
+
10
+ get status() {
11
+ return {
12
+ loop: this.loopMs,
13
+ totalConnected: this.totalConnected
14
+ }
15
+ }
16
+
17
+ getStatusOf(id) {
18
+ return this.monitors.get(id)
19
+ }
20
+
21
+ update(server) {
22
+ const { scheduler, options } = server
23
+ if (this.lastTime) {
24
+ const hrtime = process.hrtime(this.lastTime)
25
+ this.loopMs = hrtime[1] / 1e6
26
+ }
27
+ const period = scheduler.options.period
28
+ if (this.loopMs > period + 20) {
29
+ const { stepRate } = options
30
+ console.warn('%s - Warning Low FPS. %s players connected. Game Loop: %s FPS', new Date(), this.totalConnected, Math.round(stepRate / (this.loopMs / period)))
31
+ }
32
+ this.lastTime = process.hrtime()
33
+ }
34
+
35
+ addMonitor(socket) {
36
+ // TODO
37
+ /*
38
+ let bytesIn = 0
39
+ let bytesOut = 0
40
+ const update = () => {
41
+ this.monitors.set(id, {
42
+ bytesIn: bytesIn.toFixed(2),
43
+ bytesOut: bytesOut.toFixed(2)
44
+ })
45
+ }
46
+ const id = socket.id
47
+ socket.use((packet, next) => {
48
+ const size = ('42'+JSON.stringify(packet)).length
49
+ bytesIn += size
50
+ update()
51
+ this.emit('update', this.monitors.get(id))
52
+ next()
53
+ })
54
+ socket._emit = socket.emit.bind(socket)
55
+ socket.emit = (name, data) => {
56
+ let size = 0
57
+ let obj = data
58
+ if (name == 'worldUpdate') {
59
+ obj = Object.assign({}, data)
60
+ size += Buffer.byteLength(obj.dataBuffer)
61
+ obj.dataBuffer = {_placeholder: true, num: 0}
62
+ }
63
+ size += `451-["${name},${JSON.stringify(obj)}"]`.length
64
+ bytesOut += size
65
+ update()
66
+ return socket._emit(name, data)
67
+ }
68
+ */
69
+ this.totalConnected++
70
+ }
71
+
72
+ removeMonitor(id) {
73
+ this.monitors.delete(id)
74
+ this.totalConnected--
75
+ }
76
+ }
77
+
78
+ export default new Monitor()
@@ -0,0 +1,123 @@
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'
13
+
14
+ const {
15
+ applyMixins
16
+ } = Utils
17
+
18
+ export class BattleManager {
19
+
20
+ /**
21
+ * Apply damage. Player will lose HP. the `otherPlayer` parameter is the other player, the one who attacks.
22
+ *
23
+ * If you don't set the skill parameter, it will be a physical attack.
24
+ * The attack formula is already defined but you can customize it in the server options
25
+ *
26
+ * ```ts
27
+ * player.applyDamage(otherPlayer) // returns { damage: number }
28
+ * ```
29
+ *
30
+ * @title Apply Damage
31
+ * @method player.applyDamage(otherPlayer,skill)
32
+ * @param {RpgPlayer} otherPlayer The attacking player
33
+ * @param {any} [skill]
34
+ * @returns {object}
35
+ * @memberof BattleManager
36
+ * */
37
+ applyDamage(otherPlayer: RpgPlayer, skill?: any): {
38
+ damage: number,
39
+ critical: boolean,
40
+ elementVulnerable: boolean,
41
+ guard: boolean,
42
+ superGuard: boolean
43
+ } {
44
+ const getParam = (player) => {
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(otherPlayer)
62
+ const paramB = getParam(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)
69
+ }
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(otherPlayer)
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
+ }
89
+ }
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
+ }
99
+ }
100
+ if (this.hasEffect(Effect.SUPER_GUARD)) {
101
+ damage /= 4
102
+ }
103
+ this.hp -= damage
104
+ return {
105
+ damage,
106
+ critical,
107
+ elementVulnerable,
108
+ guard,
109
+ superGuard
110
+ }
111
+ }
112
+
113
+ getFormulas(name: string) {
114
+ return this.server.damageFormulas[name]
115
+ }
116
+ }
117
+
118
+ applyMixins(BattleManager, [ParameterManager, ElementManager, EffectManager])
119
+
120
+ export interface BattleManager extends ParameterManager, ElementManager, EffectManager {
121
+ name: string,
122
+ server: RpgServerEngine
123
+ }
@@ -0,0 +1,72 @@
1
+ import { Utils } from '@rpgjs/common'
2
+ import { ParameterManager } from './ParameterManager'
3
+ import { ItemManager } from './ItemManager'
4
+
5
+ const {
6
+ applyMixins
7
+ } = Utils
8
+
9
+ export class ClassManager {
10
+
11
+ _class: any
12
+
13
+ /**
14
+ * Assign a class to the player
15
+ *
16
+ * ```ts
17
+ * import { Fighter } from 'my-database/classes/fighter'
18
+ *
19
+ * player.setClass(Fighter)
20
+ * ```
21
+ *
22
+ * @title Set Class
23
+ * @method player.setClass(ClassClass)
24
+ * @param {ClassClass} class
25
+ * @returns {instance of ClassClass}
26
+ * @memberof ClassManager
27
+ * */
28
+ setClass(_class) {
29
+ this._class = new _class()
30
+ this['execMethod']('onSet', [this], this._class)
31
+ return this._class
32
+ }
33
+
34
+ /**
35
+ * 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)
36
+ *
37
+ * ```ts
38
+ * import { Hero } from 'my-database/classes/hero'
39
+ *
40
+ * player.setActor(Hero)
41
+ * ```
42
+ *
43
+ * @title Set Actor
44
+ * @method player.setActor(ActorClass)
45
+ * @param {ActorClass} actorClass
46
+ * @returns {instance of ActorClass}
47
+ * @memberof ClassManager
48
+ * */
49
+ setActor(actorClass) {
50
+ const actor = new actorClass()
51
+ this.name = actor.name
52
+ this.initialLevel = actor.initialLevel
53
+ this.finalLevel = actor.finalLevel
54
+ this.expCurve = actor.expCurve
55
+ for (let param in actor.parameters) {
56
+ this.addParameter(param, actor.parameters[param])
57
+ }
58
+ for (let item of actor.startingEquipment) {
59
+ this.addItem(item)
60
+ this.equip(item, true)
61
+ }
62
+ this.setClass(actor.class)
63
+ this['execMethod']('onSet', [this], actor)
64
+ return actor
65
+ }
66
+ }
67
+
68
+ applyMixins(ClassManager, [ParameterManager, ItemManager])
69
+
70
+ export interface ClassManager extends ParameterManager, ItemManager {
71
+ name: string
72
+ }