@rpg-engine/long-bow 0.1.21 → 0.1.24
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/dist/NPCDialog/NPCDialog.d.ts +5 -1
- package/dist/NPCDialog/QuestionDialog/QuestionDialog.d.ts +17 -0
- package/dist/RPGUI/RPGUIContainer.d.ts +1 -0
- package/dist/RPGUI/RPGUIRoot.d.ts +9 -0
- package/dist/RPGUI/RPGUISlider.d.ts +13 -0
- package/dist/components/ListMenu.d.ts +10 -0
- package/dist/index.d.ts +5 -1
- package/dist/long-bow.cjs.development.js +334 -32
- package/dist/long-bow.cjs.development.js.map +1 -1
- package/dist/long-bow.cjs.production.min.js +1 -1
- package/dist/long-bow.cjs.production.min.js.map +1 -1
- package/dist/long-bow.esm.js +331 -32
- package/dist/long-bow.esm.js.map +1 -1
- package/package.json +5 -2
- package/src/NPCDialog/NPCDialog.tsx +72 -36
- package/src/NPCDialog/NPCDialogText.tsx +0 -5
- package/src/NPCDialog/QuestionDialog/QuestionDialog.tsx +240 -0
- package/src/RPGUI/RPGUIContainer.tsx +12 -2
- package/src/RPGUI/RPGUIRoot.tsx +14 -0
- package/src/RPGUI/RPGUISlider.tsx +71 -0
- package/src/components/ListMenu.tsx +48 -0
- package/src/index.tsx +5 -1
- package/src/typography/DynamicText.tsx +1 -0
- package/dist/RPGUI/RPGUI.d.ts +0 -8
- package/src/RPGUI/RPGUI.tsx +0 -11
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
+
import { IQuestionDialog, IQuestionDialogAnswer } from '..';
|
|
2
3
|
export declare enum NPCDialogType {
|
|
3
4
|
TextOnly = "TextOnly",
|
|
4
5
|
TextAndThumbnail = "TextAndThumbnail"
|
|
5
6
|
}
|
|
6
7
|
export interface INPCDialogProps {
|
|
7
|
-
text
|
|
8
|
+
text?: string;
|
|
8
9
|
type: NPCDialogType;
|
|
9
10
|
imagePath?: string;
|
|
10
11
|
onClose?: () => void;
|
|
12
|
+
isQuestionDialog: boolean;
|
|
13
|
+
answers?: IQuestionDialogAnswer[];
|
|
14
|
+
questions?: IQuestionDialog[];
|
|
11
15
|
}
|
|
12
16
|
export declare const NPCDialog: React.FC<INPCDialogProps>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface IQuestionDialogAnswer {
|
|
3
|
+
id: number;
|
|
4
|
+
text: string;
|
|
5
|
+
nextQuestionId?: number;
|
|
6
|
+
}
|
|
7
|
+
export interface IQuestionDialog {
|
|
8
|
+
id: number;
|
|
9
|
+
text: string;
|
|
10
|
+
answerIds?: number[];
|
|
11
|
+
}
|
|
12
|
+
export interface IProps {
|
|
13
|
+
questions: IQuestionDialog[];
|
|
14
|
+
answers: IQuestionDialogAnswer[];
|
|
15
|
+
onClose: () => void;
|
|
16
|
+
}
|
|
17
|
+
export declare const QuestionDialog: React.FC<IProps>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export declare enum SliderType {
|
|
3
|
+
Slider = "rpgui-slider",
|
|
4
|
+
GoldSlider = "rpgui-slider golden"
|
|
5
|
+
}
|
|
6
|
+
export interface ISliderProps {
|
|
7
|
+
type: SliderType;
|
|
8
|
+
valueMin: number;
|
|
9
|
+
valueMax: number;
|
|
10
|
+
width: string;
|
|
11
|
+
onChange: (value: number) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const RPGUISlider: React.FC<ISliderProps>;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
+
export * from './components/ListMenu';
|
|
2
|
+
export { useEventListener } from './hooks/useEventListener';
|
|
1
3
|
export * from './NPCDialog/NPCDialog';
|
|
2
|
-
export * from './
|
|
4
|
+
export * from './NPCDialog/QuestionDialog/QuestionDialog';
|
|
3
5
|
export * from './RPGUI/RPGUIContainer';
|
|
6
|
+
export * from './RPGUI/RPGUIRoot';
|
|
7
|
+
export * from './RPGUI/RPGUISlider';
|
|
4
8
|
export * from './typography/DynamicText';
|
|
@@ -7,30 +7,81 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
|
|
|
7
7
|
var React = require('react');
|
|
8
8
|
var React__default = _interopDefault(React);
|
|
9
9
|
var styled = _interopDefault(require('styled-components'));
|
|
10
|
-
require('rpgui/rpgui.css');
|
|
11
|
-
require('rpgui/rpgui.js');
|
|
10
|
+
require('rpgui/rpgui.min.css');
|
|
11
|
+
require('rpgui/rpgui.min.js');
|
|
12
|
+
var uuid = require('uuid');
|
|
12
13
|
|
|
13
|
-
var
|
|
14
|
+
var _RPGUI = RPGUI;
|
|
15
|
+
var RPGUIRoot = function RPGUIRoot(_ref) {
|
|
14
16
|
var children = _ref.children;
|
|
15
17
|
return React__default.createElement("div", {
|
|
16
18
|
className: "rpgui-content"
|
|
17
19
|
}, children);
|
|
18
20
|
};
|
|
19
21
|
|
|
22
|
+
var ListMenu = function ListMenu(_ref) {
|
|
23
|
+
var title = _ref.title,
|
|
24
|
+
options = _ref.options,
|
|
25
|
+
onSelected = _ref.onSelected;
|
|
26
|
+
return React__default.createElement(RPGUIRoot, null, React__default.createElement(Container, null, React__default.createElement("p", null, title, ": "), React__default.createElement("ul", {
|
|
27
|
+
className: "rpgui-list-imp",
|
|
28
|
+
style: {
|
|
29
|
+
overflow: 'hidden'
|
|
30
|
+
}
|
|
31
|
+
}, options.map(function (params) {
|
|
32
|
+
return React__default.createElement("li", {
|
|
33
|
+
key: params.text,
|
|
34
|
+
onClick: function onClick() {
|
|
35
|
+
onSelected(params.id);
|
|
36
|
+
}
|
|
37
|
+
}, params.text);
|
|
38
|
+
}))));
|
|
39
|
+
};
|
|
40
|
+
var Container = /*#__PURE__*/styled.div.withConfig({
|
|
41
|
+
displayName: "ListMenu__Container",
|
|
42
|
+
componentId: "sc-i9097t-0"
|
|
43
|
+
})(["display:flex;flex-direction:column;width:100%;justify-content:start;align-items:flex-start;"]);
|
|
44
|
+
|
|
45
|
+
var useEventListener = function useEventListener(type, handler, el) {
|
|
46
|
+
if (el === void 0) {
|
|
47
|
+
el = window;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
var savedHandler = React__default.useRef();
|
|
51
|
+
React__default.useEffect(function () {
|
|
52
|
+
savedHandler.current = handler;
|
|
53
|
+
}, [handler]);
|
|
54
|
+
React__default.useEffect(function () {
|
|
55
|
+
//@ts-ignore
|
|
56
|
+
var listener = function listener(e) {
|
|
57
|
+
return savedHandler.current(e);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
el.addEventListener(type, listener);
|
|
61
|
+
return function () {
|
|
62
|
+
el.removeEventListener(type, listener);
|
|
63
|
+
};
|
|
64
|
+
}, [type, el]);
|
|
65
|
+
};
|
|
66
|
+
|
|
20
67
|
var RPGUIContainer = function RPGUIContainer(_ref) {
|
|
21
68
|
var children = _ref.children,
|
|
22
69
|
type = _ref.type,
|
|
23
70
|
_ref$width = _ref.width,
|
|
24
|
-
width = _ref$width === void 0 ? '50%' : _ref$width
|
|
25
|
-
|
|
71
|
+
width = _ref$width === void 0 ? '50%' : _ref$width,
|
|
72
|
+
height = _ref.height;
|
|
73
|
+
return React__default.createElement(Container$1, {
|
|
26
74
|
width: width,
|
|
75
|
+
height: height || 'auto',
|
|
27
76
|
className: "rpgui-container " + type
|
|
28
77
|
}, children);
|
|
29
78
|
};
|
|
30
|
-
var Container = /*#__PURE__*/styled.div.withConfig({
|
|
79
|
+
var Container$1 = /*#__PURE__*/styled.div.withConfig({
|
|
31
80
|
displayName: "RPGUIContainer__Container",
|
|
32
81
|
componentId: "sc-3xvrxc-0"
|
|
33
|
-
})(["
|
|
82
|
+
})(["height:", ";width:", ";display:flex;flex-wrap:wrap;"], function (props) {
|
|
83
|
+
return props.height;
|
|
84
|
+
}, function (_ref2) {
|
|
34
85
|
var width = _ref2.width;
|
|
35
86
|
return width;
|
|
36
87
|
});
|
|
@@ -82,7 +133,7 @@ var DynamicText = function DynamicText(_ref) {
|
|
|
82
133
|
var TextContainer = /*#__PURE__*/styled.p.withConfig({
|
|
83
134
|
displayName: "DynamicText__TextContainer",
|
|
84
135
|
componentId: "sc-acj2q5-0"
|
|
85
|
-
})(["font-size:0.7rem !important;color:white;text-shadow:1px 1px 0px #000000;letter-spacing:1.2px;"]);
|
|
136
|
+
})(["font-size:0.7rem !important;color:white;text-shadow:1px 1px 0px #000000;letter-spacing:1.2px;word-break:normal;"]);
|
|
86
137
|
|
|
87
138
|
var NPCDialogText = function NPCDialogText(_ref) {
|
|
88
139
|
var text = _ref.text,
|
|
@@ -97,11 +148,7 @@ var NPCDialogText = function NPCDialogText(_ref) {
|
|
|
97
148
|
|
|
98
149
|
var onHandleSpacePress = function onHandleSpacePress(event) {
|
|
99
150
|
if (event.code === 'Space') {
|
|
100
|
-
console.log('space pressed!');
|
|
101
151
|
var hasNextChunk = (textChunks == null ? void 0 : textChunks[chunkIndex + 1]) || false;
|
|
102
|
-
console.log(textChunks);
|
|
103
|
-
console.log(chunkIndex);
|
|
104
|
-
console.log(hasNextChunk);
|
|
105
152
|
|
|
106
153
|
if (hasNextChunk) {
|
|
107
154
|
setChunkIndex(function (prev) {
|
|
@@ -120,17 +167,201 @@ var NPCDialogText = function NPCDialogText(_ref) {
|
|
|
120
167
|
return document.removeEventListener('keydown', onHandleSpacePress);
|
|
121
168
|
};
|
|
122
169
|
}, [chunkIndex]);
|
|
123
|
-
return React__default.createElement(Container$
|
|
170
|
+
return React__default.createElement(Container$2, null, React__default.createElement(DynamicText, {
|
|
124
171
|
text: (textChunks == null ? void 0 : textChunks[chunkIndex]) || '',
|
|
125
172
|
onFinish: onEndStep,
|
|
126
173
|
onStart: onStartStep
|
|
127
174
|
}));
|
|
128
175
|
};
|
|
129
|
-
var Container$
|
|
176
|
+
var Container$2 = /*#__PURE__*/styled.div.withConfig({
|
|
130
177
|
displayName: "NPCDialogText__Container",
|
|
131
178
|
componentId: "sc-ahseq0-0"
|
|
132
179
|
})([""]);
|
|
133
180
|
|
|
181
|
+
var QuestionDialog = function QuestionDialog(_ref) {
|
|
182
|
+
var questions = _ref.questions,
|
|
183
|
+
answers = _ref.answers,
|
|
184
|
+
onClose = _ref.onClose;
|
|
185
|
+
|
|
186
|
+
var _useState = React.useState(questions[0]),
|
|
187
|
+
currentQuestion = _useState[0],
|
|
188
|
+
setCurrentQuestion = _useState[1];
|
|
189
|
+
|
|
190
|
+
var _useState2 = React.useState(false),
|
|
191
|
+
canShowAnswers = _useState2[0],
|
|
192
|
+
setCanShowAnswers = _useState2[1];
|
|
193
|
+
|
|
194
|
+
var onGetFirstAnswer = function onGetFirstAnswer() {
|
|
195
|
+
if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
var firstAnswerId = currentQuestion.answerIds[0];
|
|
200
|
+
return answers.find(function (answer) {
|
|
201
|
+
return answer.id === firstAnswerId;
|
|
202
|
+
});
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
var _useState3 = React.useState(onGetFirstAnswer()),
|
|
206
|
+
currentAnswer = _useState3[0],
|
|
207
|
+
setCurrentAnswer = _useState3[1];
|
|
208
|
+
|
|
209
|
+
React.useEffect(function () {
|
|
210
|
+
setCurrentAnswer(onGetFirstAnswer());
|
|
211
|
+
}, [currentQuestion]);
|
|
212
|
+
|
|
213
|
+
var onGetAnswers = function onGetAnswers(answerIds) {
|
|
214
|
+
return answerIds.map(function (answerId) {
|
|
215
|
+
return answers.find(function (answer) {
|
|
216
|
+
return answer.id === answerId;
|
|
217
|
+
});
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
|
|
221
|
+
var onKeyPress = function onKeyPress(e) {
|
|
222
|
+
switch (e.key) {
|
|
223
|
+
case 'ArrowDown':
|
|
224
|
+
// select next answer, if any.
|
|
225
|
+
// if no next answer, select first answer
|
|
226
|
+
// const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(
|
|
227
|
+
// (answer) => answer?.id === currentAnswer!.id + 1
|
|
228
|
+
// );
|
|
229
|
+
var nextAnswerIndex = onGetAnswers(currentQuestion.answerIds).findIndex(function (answer) {
|
|
230
|
+
return (answer == null ? void 0 : answer.id) === currentAnswer.id + 1;
|
|
231
|
+
});
|
|
232
|
+
var nextAnswerID = currentQuestion.answerIds[nextAnswerIndex]; // console.log(nextAnswerIndex);
|
|
233
|
+
|
|
234
|
+
var nextAnswer = onGetAnswers(currentQuestion.answerIds).find(function (answer) {
|
|
235
|
+
return (answer == null ? void 0 : answer.id) === nextAnswerID;
|
|
236
|
+
});
|
|
237
|
+
setCurrentAnswer(nextAnswer || onGetFirstAnswer());
|
|
238
|
+
break;
|
|
239
|
+
|
|
240
|
+
case 'ArrowUp':
|
|
241
|
+
// select previous answer, if any.
|
|
242
|
+
// if no previous answer, select last answer
|
|
243
|
+
var previousAnswerIndex = onGetAnswers(currentQuestion.answerIds).findIndex(function (answer) {
|
|
244
|
+
return (answer == null ? void 0 : answer.id) === currentAnswer.id - 1;
|
|
245
|
+
});
|
|
246
|
+
var previousAnswerID = currentQuestion.answerIds && currentQuestion.answerIds[previousAnswerIndex];
|
|
247
|
+
var previousAnswer = onGetAnswers(currentQuestion.answerIds).find(function (answer) {
|
|
248
|
+
return (answer == null ? void 0 : answer.id) === previousAnswerID;
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
if (previousAnswer) {
|
|
252
|
+
setCurrentAnswer(previousAnswer);
|
|
253
|
+
} else {
|
|
254
|
+
setCurrentAnswer(onGetAnswers(currentQuestion.answerIds).pop());
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
break;
|
|
258
|
+
|
|
259
|
+
case 'Enter':
|
|
260
|
+
setCanShowAnswers(false);
|
|
261
|
+
|
|
262
|
+
if (!(currentAnswer != null && currentAnswer.nextQuestionId)) {
|
|
263
|
+
onClose();
|
|
264
|
+
return;
|
|
265
|
+
} else {
|
|
266
|
+
setCurrentQuestion(questions.find(function (question) {
|
|
267
|
+
return question.id === currentAnswer.nextQuestionId;
|
|
268
|
+
}));
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
useEventListener('keydown', onKeyPress);
|
|
276
|
+
|
|
277
|
+
var onAnswerClick = function onAnswerClick(answer) {
|
|
278
|
+
setCanShowAnswers(false);
|
|
279
|
+
|
|
280
|
+
if (answer.nextQuestionId) {
|
|
281
|
+
// if there is a next question, go to it
|
|
282
|
+
setCurrentQuestion(questions.find(function (question) {
|
|
283
|
+
return question.id === answer.nextQuestionId;
|
|
284
|
+
}));
|
|
285
|
+
} else {
|
|
286
|
+
// else, finish dialog!
|
|
287
|
+
onClose();
|
|
288
|
+
}
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
var onRenderCurrentAnswers = function onRenderCurrentAnswers() {
|
|
292
|
+
var answerIds = currentQuestion.answerIds;
|
|
293
|
+
|
|
294
|
+
if (!answerIds) {
|
|
295
|
+
return null;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
var answers = onGetAnswers(answerIds);
|
|
299
|
+
|
|
300
|
+
if (!answers) {
|
|
301
|
+
return null;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
return answers.map(function (answer) {
|
|
305
|
+
var isSelected = (currentAnswer == null ? void 0 : currentAnswer.id) === (answer == null ? void 0 : answer.id);
|
|
306
|
+
var selectedColor = isSelected ? 'yellow' : 'white';
|
|
307
|
+
|
|
308
|
+
if (answer) {
|
|
309
|
+
return React__default.createElement(AnswerRow, {
|
|
310
|
+
key: "answer_" + answer.id
|
|
311
|
+
}, React__default.createElement(AnswerSelectedIcon, {
|
|
312
|
+
color: selectedColor
|
|
313
|
+
}, isSelected ? 'X' : null), React__default.createElement(Answer, {
|
|
314
|
+
key: answer.id,
|
|
315
|
+
onClick: function onClick() {
|
|
316
|
+
return onAnswerClick(answer);
|
|
317
|
+
},
|
|
318
|
+
color: selectedColor
|
|
319
|
+
}, answer.text));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return null;
|
|
323
|
+
});
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
return React__default.createElement(Container$3, null, React__default.createElement(QuestionContainer, null, React__default.createElement(DynamicText, {
|
|
327
|
+
text: currentQuestion.text,
|
|
328
|
+
onStart: function onStart() {
|
|
329
|
+
return setCanShowAnswers(false);
|
|
330
|
+
},
|
|
331
|
+
onFinish: function onFinish() {
|
|
332
|
+
return setCanShowAnswers(true);
|
|
333
|
+
}
|
|
334
|
+
})), canShowAnswers && React__default.createElement(AnswersContainer, null, onRenderCurrentAnswers()));
|
|
335
|
+
};
|
|
336
|
+
var Container$3 = /*#__PURE__*/styled.div.withConfig({
|
|
337
|
+
displayName: "QuestionDialog__Container",
|
|
338
|
+
componentId: "sc-15nvgq5-0"
|
|
339
|
+
})(["display:flex;word-break:break-all;box-sizing:border-box;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap;"]);
|
|
340
|
+
var QuestionContainer = /*#__PURE__*/styled.div.withConfig({
|
|
341
|
+
displayName: "QuestionDialog__QuestionContainer",
|
|
342
|
+
componentId: "sc-15nvgq5-1"
|
|
343
|
+
})(["flex:100%;width:100%;"]);
|
|
344
|
+
var AnswersContainer = /*#__PURE__*/styled.div.withConfig({
|
|
345
|
+
displayName: "QuestionDialog__AnswersContainer",
|
|
346
|
+
componentId: "sc-15nvgq5-2"
|
|
347
|
+
})(["flex:100%;"]);
|
|
348
|
+
var Answer = /*#__PURE__*/styled.p.withConfig({
|
|
349
|
+
displayName: "QuestionDialog__Answer",
|
|
350
|
+
componentId: "sc-15nvgq5-3"
|
|
351
|
+
})(["flex:auto;color:", " !important;font-size:0.65rem !important;background:inherit;border:none;"], function (props) {
|
|
352
|
+
return props.color;
|
|
353
|
+
});
|
|
354
|
+
var AnswerSelectedIcon = /*#__PURE__*/styled.span.withConfig({
|
|
355
|
+
displayName: "QuestionDialog__AnswerSelectedIcon",
|
|
356
|
+
componentId: "sc-15nvgq5-4"
|
|
357
|
+
})(["flex:5% 0 0;color:", " !important;"], function (props) {
|
|
358
|
+
return props.color;
|
|
359
|
+
});
|
|
360
|
+
var AnswerRow = /*#__PURE__*/styled.div.withConfig({
|
|
361
|
+
displayName: "QuestionDialog__AnswerRow",
|
|
362
|
+
componentId: "sc-15nvgq5-5"
|
|
363
|
+
})(["display:flex;flex-wrap:wrap;justify-content:center;align-items:center;margin-bottom:0.5rem;height:22px;p{line-height:unset;margin-top:0;margin-bottom:0rem;}"]);
|
|
364
|
+
|
|
134
365
|
(function (NPCDialogType) {
|
|
135
366
|
NPCDialogType["TextOnly"] = "TextOnly";
|
|
136
367
|
NPCDialogType["TextAndThumbnail"] = "TextAndThumbnail";
|
|
@@ -140,19 +371,33 @@ var NPCDialog = function NPCDialog(_ref) {
|
|
|
140
371
|
var text = _ref.text,
|
|
141
372
|
type = _ref.type,
|
|
142
373
|
_onClose = _ref.onClose,
|
|
143
|
-
imagePath = _ref.imagePath
|
|
374
|
+
imagePath = _ref.imagePath,
|
|
375
|
+
_ref$isQuestionDialog = _ref.isQuestionDialog,
|
|
376
|
+
isQuestionDialog = _ref$isQuestionDialog === void 0 ? false : _ref$isQuestionDialog,
|
|
377
|
+
questions = _ref.questions,
|
|
378
|
+
answers = _ref.answers;
|
|
144
379
|
|
|
145
|
-
var _useState = React.useState(
|
|
146
|
-
|
|
147
|
-
|
|
380
|
+
var _useState = React.useState(false),
|
|
381
|
+
showGoNextIndicator = _useState[0],
|
|
382
|
+
setShowGoNextIndicator = _useState[1];
|
|
148
383
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
type:
|
|
155
|
-
}, React__default.createElement(
|
|
384
|
+
return React__default.createElement(RPGUIRoot, null, React__default.createElement(RPGUIContainer, {
|
|
385
|
+
type: "framed-golden",
|
|
386
|
+
width: isQuestionDialog ? '600px' : '50%',
|
|
387
|
+
height: '180px'
|
|
388
|
+
}, isQuestionDialog && questions && answers ? React__default.createElement(React__default.Fragment, null, React__default.createElement(TextContainer$1, {
|
|
389
|
+
flex: type === exports.NPCDialogType.TextAndThumbnail ? '70%' : '100%'
|
|
390
|
+
}, React__default.createElement(QuestionDialog, {
|
|
391
|
+
questions: questions,
|
|
392
|
+
answers: answers,
|
|
393
|
+
onClose: function onClose() {
|
|
394
|
+
if (_onClose) {
|
|
395
|
+
_onClose();
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
})), type === exports.NPCDialogType.TextAndThumbnail && React__default.createElement(ThumbnailContainer, null, React__default.createElement(NPCThumbnail, {
|
|
399
|
+
src: imagePath || img
|
|
400
|
+
}))) : React__default.createElement(React__default.Fragment, null, React__default.createElement(Container$4, null, React__default.createElement(TextContainer$1, {
|
|
156
401
|
flex: type === exports.NPCDialogType.TextAndThumbnail ? '70%' : '100%'
|
|
157
402
|
}, React__default.createElement(NPCDialogText, {
|
|
158
403
|
onStartStep: function onStartStep() {
|
|
@@ -161,12 +406,10 @@ var NPCDialog = function NPCDialog(_ref) {
|
|
|
161
406
|
onEndStep: function onEndStep() {
|
|
162
407
|
return setShowGoNextIndicator(true);
|
|
163
408
|
},
|
|
164
|
-
text: text,
|
|
409
|
+
text: text || 'No text provided.',
|
|
165
410
|
onClose: function onClose() {
|
|
166
411
|
if (_onClose) {
|
|
167
412
|
_onClose();
|
|
168
|
-
|
|
169
|
-
setIsOpen(false);
|
|
170
413
|
}
|
|
171
414
|
}
|
|
172
415
|
})), type === exports.NPCDialogType.TextAndThumbnail && React__default.createElement(ThumbnailContainer, null, React__default.createElement(NPCThumbnail, {
|
|
@@ -174,12 +417,12 @@ var NPCDialog = function NPCDialog(_ref) {
|
|
|
174
417
|
}))), showGoNextIndicator && React__default.createElement(PressSpaceIndicator, {
|
|
175
418
|
right: type === exports.NPCDialogType.TextOnly ? '1rem' : '10.5rem',
|
|
176
419
|
src: img$1
|
|
177
|
-
})))
|
|
420
|
+
}))));
|
|
178
421
|
};
|
|
179
|
-
var Container$
|
|
422
|
+
var Container$4 = /*#__PURE__*/styled.div.withConfig({
|
|
180
423
|
displayName: "NPCDialog__Container",
|
|
181
424
|
componentId: "sc-omm2zk-0"
|
|
182
|
-
})(["display:flex;width:100%;height:
|
|
425
|
+
})(["display:flex;width:100%;height:100%;box-sizing:border-box;justify-content:center;align-items:flex-start;position:relative;"]);
|
|
183
426
|
var TextContainer$1 = /*#__PURE__*/styled.div.withConfig({
|
|
184
427
|
displayName: "NPCDialog__TextContainer",
|
|
185
428
|
componentId: "sc-omm2zk-1"
|
|
@@ -203,8 +446,67 @@ var PressSpaceIndicator = /*#__PURE__*/styled.img.withConfig({
|
|
|
203
446
|
return right;
|
|
204
447
|
});
|
|
205
448
|
|
|
449
|
+
(function (SliderType) {
|
|
450
|
+
SliderType["Slider"] = "rpgui-slider";
|
|
451
|
+
SliderType["GoldSlider"] = "rpgui-slider golden";
|
|
452
|
+
})(exports.SliderType || (exports.SliderType = {}));
|
|
453
|
+
|
|
454
|
+
var RPGUISlider = function RPGUISlider(_ref) {
|
|
455
|
+
var type = _ref.type,
|
|
456
|
+
valueMin = _ref.valueMin,
|
|
457
|
+
valueMax = _ref.valueMax,
|
|
458
|
+
width = _ref.width,
|
|
459
|
+
onChange = _ref.onChange;
|
|
460
|
+
var sliderId = uuid.v4();
|
|
461
|
+
|
|
462
|
+
var _useState = React.useState(false),
|
|
463
|
+
wasMouseDownFirst = _useState[0],
|
|
464
|
+
setWasMouseDownFirst = _useState[1];
|
|
465
|
+
|
|
466
|
+
useEventListener('mouseup', function () {
|
|
467
|
+
if (wasMouseDownFirst) {
|
|
468
|
+
onHandleMouseUp();
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
setWasMouseDownFirst(false);
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
var onHandleMouseUp = function onHandleMouseUp() {
|
|
475
|
+
var rpguiSlider = document.getElementById("rpgui-slider-" + sliderId);
|
|
476
|
+
|
|
477
|
+
var value = _RPGUI.get_value(rpguiSlider);
|
|
478
|
+
|
|
479
|
+
onChange(Number(value));
|
|
480
|
+
};
|
|
481
|
+
|
|
482
|
+
return React__default.createElement(RPGUIRoot, null, React__default.createElement("div", {
|
|
483
|
+
onMouseUp: onHandleMouseUp,
|
|
484
|
+
onMouseDown: function onMouseDown() {
|
|
485
|
+
return setWasMouseDownFirst(true);
|
|
486
|
+
}
|
|
487
|
+
}, React__default.createElement(Input, {
|
|
488
|
+
className: type === exports.SliderType.Slider ? exports.SliderType.Slider : exports.SliderType.GoldSlider,
|
|
489
|
+
type: "range",
|
|
490
|
+
style: {
|
|
491
|
+
width: width
|
|
492
|
+
},
|
|
493
|
+
min: valueMin,
|
|
494
|
+
max: valueMax,
|
|
495
|
+
id: "rpgui-slider-" + sliderId
|
|
496
|
+
})));
|
|
497
|
+
};
|
|
498
|
+
var Input = /*#__PURE__*/styled.input.withConfig({
|
|
499
|
+
displayName: "RPGUISlider__Input",
|
|
500
|
+
componentId: "sc-1sjghaz-0"
|
|
501
|
+
})(["opacity:0;"]);
|
|
502
|
+
|
|
206
503
|
exports.DynamicText = DynamicText;
|
|
504
|
+
exports.ListMenu = ListMenu;
|
|
207
505
|
exports.NPCDialog = NPCDialog;
|
|
208
|
-
exports.
|
|
506
|
+
exports.QuestionDialog = QuestionDialog;
|
|
209
507
|
exports.RPGUIContainer = RPGUIContainer;
|
|
508
|
+
exports.RPGUIRoot = RPGUIRoot;
|
|
509
|
+
exports.RPGUISlider = RPGUISlider;
|
|
510
|
+
exports._RPGUI = _RPGUI;
|
|
511
|
+
exports.useEventListener = useEventListener;
|
|
210
512
|
//# sourceMappingURL=long-bow.cjs.development.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUI.tsx","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/NPCDialog.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.css';\nimport 'rpgui/rpgui.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\nexport const RPGUI: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n}) => {\n return (\n <Container width={width} className={`rpgui-container ${type}`}>\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n max-width: ${({ width }) => width};\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n console.log('space pressed!');\n\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n console.log(textChunks);\n console.log(chunkIndex);\n console.log(hasNextChunk);\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { RPGUI } from '../RPGUI/RPGUI';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n}) => {\n const [isOpen, setIsOpen] = useState<boolean>(true);\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return isOpen ? (\n <RPGUI>\n <RPGUIContainer type=\"framed-golden\">\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text}\n onClose={() => {\n if (onClose) {\n onClose();\n setIsOpen(false);\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </RPGUIContainer>\n </RPGUI>\n ) : null;\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 125px;\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n"],"names":["RPGUI","children","React","className","RPGUIContainer","type","width","Container","styled","div","img","chunkString","str","length","match","RegExp","DynamicText","text","onFinish","onStart","useState","textState","setTextState","useEffect","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","console","log","hasNextChunk","prev","document","addEventListener","removeEventListener","NPCDialogType","NPCDialog","imagePath","isOpen","setIsOpen","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif"],"mappings":";;;;;;;;;;;;IAQaA,KAAK,GAAqB,SAA1BA,KAA0B;MAAGC,gBAAAA;AACxC,SAAOC,4BAAA,MAAA;AAAKC,IAAAA,SAAS,EAAC;GAAf,EAAgCF,QAAhC,CAAP;AACD;;ICDYG,cAAc,GAAqB,SAAnCA,cAAmC;MAC9CH,gBAAAA;MACAI,YAAAA;wBACAC;MAAAA,gCAAQ;AAER,SACEJ,4BAAA,CAACK,SAAD;AAAWD,IAAAA,KAAK,EAAEA;AAAOH,IAAAA,SAAS,uBAAqBE;GAAvD,EACGJ,QADH,CADF;AAKD,CAVM;AAgBP,IAAMM,SAAS,gBAAGC,MAAM,CAACC,GAAV;AAAA;AAAA;AAAA,wBACA;AAAA,MAAGH,KAAH,SAAGA,KAAH;AAAA,SAAeA,KAAf;AAAA,CADA,CAAf;;ACzBA,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;;ACAnC,MAAMI,KAAG,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;;ACA5B,IAAMC,WAAW,GAAG,SAAdA,WAAc,CAACC,GAAD,EAAcC,MAAd;AACzB,SAAOD,GAAG,CAACE,KAAJ,CAAU,IAAIC,MAAJ,CAAW,SAASF,MAAT,GAAkB,GAA7B,EAAkC,GAAlC,CAAV,CAAP;AACD,CAFM;;ICSMG,WAAW,GAAqB,SAAhCA,WAAgC;MAAGC,YAAAA;MAAMC,gBAAAA;MAAUC,eAAAA;;AAC9D,kBAAkCC,cAAQ,CAAS,EAAT,CAA1C;AAAA,MAAOC,SAAP;AAAA,MAAkBC,YAAlB;;AAEAC,EAAAA,eAAS,CAAC;AACR,QAAIC,CAAC,GAAG,CAAR;AACA,QAAMC,QAAQ,GAAGC,WAAW,CAAC;AAC3B;AAEA,UAAIF,CAAC,KAAK,CAAV,EAAa;AACX,YAAIL,OAAJ,EAAa;AACXA,UAAAA,OAAO;AACR;AACF;;AAED,UAAIK,CAAC,GAAGP,IAAI,CAACJ,MAAb,EAAqB;AACnBS,QAAAA,YAAY,CAACL,IAAI,CAACU,SAAL,CAAe,CAAf,EAAkBH,CAAC,GAAG,CAAtB,CAAD,CAAZ;AACAA,QAAAA,CAAC;AACF,OAHD,MAGO;AACLI,QAAAA,aAAa,CAACH,QAAD,CAAb;;AACA,YAAIP,QAAJ,EAAc;AACZA,UAAAA,QAAQ;AACT;AACF;AACF,KAlB2B,EAkBzB,EAlByB,CAA5B;AAoBA,WAAO;AACLU,MAAAA,aAAa,CAACH,QAAD,CAAb;AACD,KAFD;AAGD,GAzBQ,EAyBN,CAACR,IAAD,CAzBM,CAAT;AA2BA,SAAOf,4BAAA,CAAC2B,aAAD,MAAA,EAAgBR,SAAhB,CAAP;AACD,CA/BM;AAiCP,IAAMQ,aAAa,gBAAGrB,MAAM,CAACsB,CAAV;AAAA;AAAA;AAAA,qGAAnB;;AC9BO,IAAMC,aAAa,GAAqB,SAAlCA,aAAkC;MAC7Cd,YAAAA;MACAe,eAAAA;MACAC,iBAAAA;MACAC,mBAAAA;AAEA,MAAMC,UAAU,GAAGxB,WAAW,CAACM,IAAD,EAAO,EAAP,CAA9B;;AAEA,kBAAoCG,cAAQ,CAAS,CAAT,CAA5C;AAAA,MAAOgB,UAAP;AAAA,MAAmBC,aAAnB;;AAEA,MAAMC,kBAAkB,GAAG,SAArBA,kBAAqB,CAACC,KAAD;AACzB,QAAIA,KAAK,CAACC,IAAN,KAAe,OAAnB,EAA4B;AAC1BC,MAAAA,OAAO,CAACC,GAAR,CAAY,gBAAZ;AAEA,UAAMC,YAAY,GAAG,CAAAR,UAAU,QAAV,YAAAA,UAAU,CAAGC,UAAU,GAAG,CAAhB,CAAV,KAAgC,KAArD;AACAK,MAAAA,OAAO,CAACC,GAAR,CAAYP,UAAZ;AACAM,MAAAA,OAAO,CAACC,GAAR,CAAYN,UAAZ;AACAK,MAAAA,OAAO,CAACC,GAAR,CAAYC,YAAZ;;AAEA,UAAIA,YAAJ,EAAkB;AAChBN,QAAAA,aAAa,CAAC,UAACO,IAAD;AAAA,iBAAUA,IAAI,GAAG,CAAjB;AAAA,SAAD,CAAb;AACD,OAFD,MAEO;AACL;AACAZ,QAAAA,OAAO;AACR;AACF;AACF,GAhBD;;AAkBAT,EAAAA,eAAS,CAAC;AACRsB,IAAAA,QAAQ,CAACC,gBAAT,CAA0B,SAA1B,EAAqCR,kBAArC;AAEA,WAAO;AAAA,aAAMO,QAAQ,CAACE,mBAAT,CAA6B,SAA7B,EAAwCT,kBAAxC,CAAN;AAAA,KAAP;AACD,GAJQ,EAIN,CAACF,UAAD,CAJM,CAAT;AAMA,SACElC,4BAAA,CAACK,WAAD,MAAA,EACEL,4BAAA,CAACc,WAAD;AACEC,IAAAA,IAAI,EAAE,CAAAkB,UAAU,QAAV,YAAAA,UAAU,CAAGC,UAAH,CAAV,KAA4B;AAClClB,IAAAA,QAAQ,EAAEe;AACVd,IAAAA,OAAO,EAAEe;GAHX,CADF,CADF;AASD,CA3CM;AA6CP,IAAM3B,WAAS,gBAAGC,MAAM,CAACC,GAAV;AAAA;AAAA;AAAA,QAAf;;AClDA,WAAYuC;AACVA,EAAAA,yBAAA,aAAA;AACAA,EAAAA,iCAAA,qBAAA;AACD,CAHD,EAAYA,qBAAa,KAAbA,qBAAa,KAAA,CAAzB;;AAYA,IAAaC,SAAS,GAA8B,SAAvCA,SAAuC;MAClDhC,YAAAA;MACAZ,YAAAA;MACA2B,gBAAAA;MACAkB,iBAAAA;;AAEA,kBAA4B9B,cAAQ,CAAU,IAAV,CAApC;AAAA,MAAO+B,MAAP;AAAA,MAAeC,SAAf;;AACA,mBACEhC,cAAQ,CAAU,KAAV,CADV;AAAA,MAAOiC,mBAAP;AAAA,MAA4BC,sBAA5B;;AAGA,SAAOH,MAAM,GACXjD,4BAAA,CAACF,KAAD,MAAA,EACEE,4BAAA,CAACE,cAAD;AAAgBC,IAAAA,IAAI,EAAC;GAArB,EACEH,4BAAA,CAACK,WAAD,MAAA,EACEL,4BAAA,CAAC2B,eAAD;AACE0B,IAAAA,IAAI,EAAElD,IAAI,KAAK2C,qBAAa,CAACQ,gBAAvB,GAA0C,KAA1C,GAAkD;GAD1D,EAGEtD,4BAAA,CAAC6B,aAAD;AACEG,IAAAA,WAAW,EAAE;AAAA,aAAMoB,sBAAsB,CAAC,KAAD,CAA5B;AAAA;AACbrB,IAAAA,SAAS,EAAE;AAAA,aAAMqB,sBAAsB,CAAC,IAAD,CAA5B;AAAA;AACXrC,IAAAA,IAAI,EAAEA;AACNe,IAAAA,OAAO,EAAE;AACP,UAAIA,QAAJ,EAAa;AACXA,QAAAA,QAAO;;AACPoB,QAAAA,SAAS,CAAC,KAAD,CAAT;AACD;AACF;GATH,CAHF,CADF,EAgBG/C,IAAI,KAAK2C,qBAAa,CAACQ,gBAAvB,IACCtD,4BAAA,CAACuD,kBAAD,MAAA,EACEvD,4BAAA,CAACwD,YAAD;AAAcC,IAAAA,GAAG,EAAET,SAAS,IAAIU;GAAhC,CADF,CAjBJ,CADF,EAuBGP,mBAAmB,IAClBnD,4BAAA,CAAC2D,mBAAD;AACEC,IAAAA,KAAK,EAAEzD,IAAI,KAAK2C,qBAAa,CAACe,QAAvB,GAAkC,MAAlC,GAA2C;AAClDJ,IAAAA,GAAG,EAAEK;GAFP,CAxBJ,CADF,CADW,GAiCT,IAjCJ;AAkCD,CA5CM;AA8CP,IAAMzD,WAAS,gBAAGC,MAAM,CAACC,GAAV;AAAA;AAAA;AAAA,mIAAf;AAcA,IAAMoB,eAAa,gBAAGrB,MAAM,CAACC,GAAV;AAAA;AAAA;AAAA,mCACT;AAAA,MAAG8C,IAAH,SAAGA,IAAH;AAAA,SAAcA,IAAd;AAAA,CADS,CAAnB;AAKA,IAAME,kBAAkB,gBAAGjD,MAAM,CAACC,GAAV;AAAA;AAAA;AAAA,2DAAxB;AAMA,IAAMiD,YAAY,gBAAGlD,MAAM,CAACE,GAAV;AAAA;AAAA;AAAA,2DAAlB;AAUA,IAAMmD,mBAAmB,gBAAGrD,MAAM,CAACE,GAAV;AAAA;AAAA;AAAA,0GAEd;AAAA,MAAGoD,KAAH,SAAGA,KAAH;AAAA,SAAeA,KAAf;AAAA,CAFc,CAAzB;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\nexport interface IListMenuProps {\n title: string;\n options: [\n {\n id: string;\n text: string;\n }\n ];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n title,\n options,\n onSelected,\n}) => {\n return (\n <RPGUIRoot>\n <Container>\n <p>{title}: </p>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","title","options","onSelected","Container","style","overflow","map","params","key","text","onClick","id","styled","div","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","props","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}
|