forked from League-of-Foundry-Developers/torch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
token.js
172 lines (154 loc) · 4.76 KB
/
token.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
import TorchSocket from "./socket.js";
import Settings from "./settings.js";
let DEBUG = true;
const debugLog = (...args) => {
if (DEBUG) {
console.log(...args);
}
};
const getLightUpdates = function(lightSettings) {
let result = {}
for (let setting in lightSettings) {
result["light." + setting] = lightSettings[setting];
}
return result;
}
export default class TorchToken {
STATE_ON = "on";
STATE_DIM = "dim";
STATE_OFF = "off";
_token;
_library;
_ownedSources;
constructor(token, library) {
this._token = token;
this._library = library;
this._ownedSources = library.actorLightSources(this._token.actor);
}
get ownedLightSources() {
return this._ownedSources;
}
get lightSourceState() {
let state = this._token.getFlag("torch", "lightSourceState");
return typeof state === "undefined" ? this.STATE_OFF : state;
}
get currentLightSource() {
// The one we saved
let lightSource = this._token.getFlag("torch", "lightSource");
if (lightSource && this._ownedSources.find(
(item) => item.name === lightSource
)
) {
return lightSource;
}
// The one the GM asked for
let itemName = Settings.inventoryItemName;
let namedSource = itemName
? this._ownedSources.find(
(item) => item.name.toLowerCase() === itemName.toLowerCase()
)
: undefined;
if (itemName &&!!namedSource) {
return namedSource.name;
}
// The top one on the list
if (this._ownedSources.length > 0) {
return this._ownedSources[0].name;
}
// Nothing
return;
}
async setCurrentLightSource(value) {
await this._token.setFlag("torch", "lightSource", value);
}
lightSourceIsExhausted(source) {
if (this._library.getLightSource(source).consumable) {
let inventory = this._library.getInventory(this._token.actor, source);
return inventory === 0;
}
return false;
}
getInventory(source) {
let sourceObj = this._library.getLightSource(source);
if (sourceObj && sourceObj.consumable) {
return this._library.getInventory(this._token.actor, source);
} else if (sourceObj) {
return -1;
}
}
/* Orchestrate State Management */
async forceStateOff() {
// Need to deal with dancing lights
await this._token.setFlag("torch", "lightSourceState", this.STATE_OFF);
await this._turnOffSource();
}
async advanceState() {
let source = this.currentLightSource;
let state = this.lightSourceState;
if (this._library.getLightSource(source).states === 3) {
state =
state === this.STATE_OFF
? this.STATE_ON
: state === this.STATE_ON
? this.STATE_DIM
: this.STATE_OFF;
} else {
state = state === this.STATE_OFF ? this.STATE_ON : this.STATE_OFF;
}
await this._token.setFlag("torch", "lightSourceState", state);
switch (state) {
case this.STATE_OFF:
await this._turnOffSource();
break;
case this.STATE_ON:
await this._turnOnSource();
break;
case this.STATE_DIM:
await this._dimSource();
break;
default:
await this._turnOffSource();
}
return state;
}
// Private internal methods
async _turnOffSource() {
let source = this._library.getLightSource(this.currentLightSource);
if (TorchSocket.requestSupported("delete", this.currentLightSource)) {
// separate token lighting
TorchSocket.sendRequest(this._token.id, "delete", this.currentLightSource, source.light);
} else {
// self lighting - to turn off, use light settings from prototype token
let protoToken = game.actors.get(this._token.actorId).prototypeToken;
await this._token.update(getLightUpdates(protoToken.light));
if (source.consumable) {
await this._consumeSource(source);
}
}
}
async _turnOnSource() {
let source = this._library.getLightSource(this.currentLightSource);
if (TorchSocket.requestSupported("create", this.currentLightSource)) {
// separate token lighting
TorchSocket.sendRequest(this._token.id, "create", this.currentLightSource, source.light[0]);
} else {
// self lighting
await this._token.update(getLightUpdates(source.light[0]));
}
}
async _dimSource() {
let source = this._library.getLightSource(this.currentLightSource);
if (source.states === 3) {
await this._token.update(getLightUpdates(source.light[1]));
}
}
async _consumeSource(source) {
if ((game.user.isGM && Settings.gmUsesInventory) ||
(!game.user.isGM && Settings.userUsesInventory)) {
let count = this._library.getInventory(this._token.actor, source.name);
if (count) {
await this._library.decrementInventory(this._token.actor, source.name);
}
}
}
}