@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,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
|
+
}
|
package/src/Gui/index.ts
ADDED
|
@@ -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,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
|
+
}
|