@rpgjs/client 5.0.0-beta.1 → 5.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/dist/Game/Map.js +2 -2
- package/dist/Game/Object.js.map +1 -1
- package/dist/Gui/Gui.js.map +1 -1
- package/dist/Gui/NotificationManager.js.map +1 -1
- package/dist/RpgClientEngine.js +2 -1
- package/dist/RpgClientEngine.js.map +1 -1
- package/dist/Sound.js.map +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorate.js +1 -1
- package/dist/_virtual/{_@oxc-project_runtime@0.122.0 → _@oxc-project_runtime@0.127.0}/helpers/decorateMetadata.js +1 -1
- package/dist/components/animations/animation.ce.js +2 -4
- package/dist/components/animations/animation.ce.js.map +1 -1
- package/dist/components/animations/hit.ce.js +17 -24
- package/dist/components/animations/hit.ce.js.map +1 -1
- package/dist/components/character.ce.js +75 -222
- package/dist/components/character.ce.js.map +1 -1
- package/dist/components/dynamics/text.ce.js +14 -25
- package/dist/components/dynamics/text.ce.js.map +1 -1
- package/dist/components/gui/box.ce.js +4 -7
- package/dist/components/gui/box.ce.js.map +1 -1
- package/dist/components/gui/dialogbox/index.ce.js +37 -54
- package/dist/components/gui/dialogbox/index.ce.js.map +1 -1
- package/dist/components/gui/gameover.ce.js +36 -61
- package/dist/components/gui/gameover.ce.js.map +1 -1
- package/dist/components/gui/hud/hud.ce.js +18 -28
- package/dist/components/gui/hud/hud.ce.js.map +1 -1
- package/dist/components/gui/menu/equip-menu.ce.js +108 -163
- package/dist/components/gui/menu/equip-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/exit-menu.ce.js +4 -4
- package/dist/components/gui/menu/exit-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/items-menu.ce.js +47 -66
- package/dist/components/gui/menu/items-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/main-menu.ce.js +58 -77
- package/dist/components/gui/menu/main-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/options-menu.ce.js +3 -3
- package/dist/components/gui/menu/options-menu.ce.js.map +1 -1
- package/dist/components/gui/menu/skills-menu.ce.js +10 -16
- package/dist/components/gui/menu/skills-menu.ce.js.map +1 -1
- package/dist/components/gui/mobile/mobile.ce.js +3 -3
- package/dist/components/gui/mobile/mobile.ce.js.map +1 -1
- package/dist/components/gui/notification/notification.ce.js +13 -19
- package/dist/components/gui/notification/notification.ce.js.map +1 -1
- package/dist/components/gui/save-load.ce.js +68 -247
- package/dist/components/gui/save-load.ce.js.map +1 -1
- package/dist/components/gui/shop/shop.ce.js +84 -123
- package/dist/components/gui/shop/shop.ce.js.map +1 -1
- package/dist/components/gui/title-screen.ce.js +38 -65
- package/dist/components/gui/title-screen.ce.js.map +1 -1
- package/dist/components/prebuilt/hp-bar.ce.js +39 -43
- package/dist/components/prebuilt/hp-bar.ce.js.map +1 -1
- package/dist/components/prebuilt/light-halo.ce.js +33 -58
- package/dist/components/prebuilt/light-halo.ce.js.map +1 -1
- package/dist/components/scenes/canvas.ce.js +11 -19
- package/dist/components/scenes/canvas.ce.js.map +1 -1
- package/dist/components/scenes/draw-map.ce.js +20 -25
- package/dist/components/scenes/draw-map.ce.js.map +1 -1
- package/dist/components/scenes/event-layer.ce.js +4 -4
- package/dist/components/scenes/event-layer.ce.js.map +1 -1
- package/dist/core/setup.js.map +1 -1
- package/dist/module.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_di@2.9.0/node_modules/@signe/di/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/@signe_reactive@2.9.0/node_modules/@signe/reactive/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js +1 -1
- package/dist/node_modules/.pnpm/@signe_room@2.9.0/node_modules/@signe/room/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/client/index.js.map +1 -1
- package/dist/node_modules/.pnpm/@signe_sync@2.9.0/node_modules/@signe/sync/dist/index.js.map +1 -1
- package/dist/node_modules/.pnpm/partysocket@1.1.3/node_modules/partysocket/dist/chunk-S74YV6PU.js.map +1 -1
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js +27 -27
- package/dist/node_modules/.pnpm/zod@3.24.2/node_modules/zod/lib/index.js.map +1 -1
- package/dist/services/keyboardControls.js.map +1 -1
- package/dist/services/mmorpg.js +2 -1
- package/dist/services/mmorpg.js.map +1 -1
- package/package.json +7 -8
- package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js +0 -457
- package/dist/node_modules/.pnpm/@signe_reactive@2.8.3/node_modules/@signe/reactive/dist/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"box.ce.js","names":[],"sources":["../../../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"mappings":";;;;;AAOE,SAAS,UAAA,SAAA;;CAGH,
|
|
1
|
+
{"version":3,"file":"box.ce.js","names":[],"sources":["../../../src/components/gui/box.ce"],"sourcesContent":["<Container positionType=\"absolute\" top={top} left={left}>\n <Container\n anchor={[0.5, 0.5]}\n >\n <Rect width height color={_color} />\n <Container attach={child}></Container>\n </Container> \n</Container>\n\n<script>\n import { RpgClientEngine, inject } from \"../../index\";\n\n const { width, height, children, color, top, left } = defineProps();\n const engine = inject(RpgClientEngine)\n const child = children[0]\n const _color = computed(() => engine.globalConfig.gui?.windowColor || color?.() || \"#1a1a2e\")\n</script>"],"mappings":";;;;;AAOE,SAAS,UAAA,SAAA;;CAGH,MAAG,EAAA,OAAA,QAAiB,UAAa,OAAO,KAAC,SAD1C,eAAA,QACgD,EAAA;;CAEvD,MAAE,QAAQ,SAAa;CACvB,MAAE,SAAa,eAAS,OAAA,aAAe,KAAA,eAAA,SAAA,IAAA,UAAA;AAE/B,QADQ,EAAA,WAAU;EAAA,cAAA;EAAA;EAAA;EAAA,EAAA,EAAA,WAAA,EAAA,QAAA,CAAA,IAAA,GAAA,EAAA,EAAA,CAAA,EAAA,MAAA;EAAA;EAAA;EAAA,OAAA;EAAA,CAAA,EAAA,EAAA,WAAA,EAAA,QAAA,OAAA,CAAA,CAAA,CAAA,CACT"}
|
|
@@ -6,45 +6,34 @@ import { delay } from "@rpgjs/common";
|
|
|
6
6
|
function component($$props) {
|
|
7
7
|
useProps($$props);
|
|
8
8
|
const defineProps = useDefineProps($$props);
|
|
9
|
-
|
|
9
|
+
const engine = inject(RpgClientEngine);
|
|
10
10
|
engine.scene.currentPlayer;
|
|
11
|
-
|
|
11
|
+
const keyboardControls = engine.globalConfig.keyboardControls;
|
|
12
12
|
engine.stopProcessingInput = true;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var resolveProp = function(value) {
|
|
21
|
-
return typeof value === "function" ? value() : value;
|
|
22
|
-
};
|
|
23
|
-
var speakerName = computed(function() {
|
|
24
|
-
var value = resolveProp(speaker);
|
|
13
|
+
const selectedItem = signal(0);
|
|
14
|
+
const { data, onFinish, onInteraction } = defineProps();
|
|
15
|
+
const { message, choices, face, speaker, position, typewriterEffect, autoClose } = data();
|
|
16
|
+
const fullWidth = computed(() => data().fullWidth || false);
|
|
17
|
+
const resolveProp = (value) => typeof value === "function" ? value() : value;
|
|
18
|
+
const speakerName = computed(() => {
|
|
19
|
+
const value = resolveProp(speaker);
|
|
25
20
|
return value ? String(value) : "";
|
|
26
21
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
var displayMessage = signal("");
|
|
37
|
-
var fullMessage = signal("");
|
|
38
|
-
var isTyping = signal(false);
|
|
39
|
-
var typewriterTimer = null;
|
|
40
|
-
mount(function(element) {});
|
|
41
|
-
var startTypewriter = function(text) {
|
|
22
|
+
const dialogPosition = computed(() => resolveProp(position) || "bottom");
|
|
23
|
+
const isFullWidth = computed(() => resolveProp(fullWidth) !== false);
|
|
24
|
+
const hasFace = computed(() => !!resolveProp(face));
|
|
25
|
+
const displayMessage = signal("");
|
|
26
|
+
const fullMessage = signal("");
|
|
27
|
+
const isTyping = signal(false);
|
|
28
|
+
let typewriterTimer = null;
|
|
29
|
+
mount((element) => {});
|
|
30
|
+
const startTypewriter = (text) => {
|
|
42
31
|
if (typewriterTimer) clearInterval(typewriterTimer);
|
|
43
32
|
displayMessage.set("");
|
|
44
33
|
if (!text) return;
|
|
45
|
-
|
|
34
|
+
let index = 0;
|
|
46
35
|
isTyping.set(true);
|
|
47
|
-
typewriterTimer = setInterval(
|
|
36
|
+
typewriterTimer = setInterval(() => {
|
|
48
37
|
index += 1;
|
|
49
38
|
displayMessage.set(text.slice(0, index));
|
|
50
39
|
if (index >= text.length) {
|
|
@@ -54,14 +43,14 @@ function component($$props) {
|
|
|
54
43
|
}
|
|
55
44
|
}, 20);
|
|
56
45
|
};
|
|
57
|
-
|
|
46
|
+
const finishTyping = () => {
|
|
58
47
|
if (typewriterTimer) clearInterval(typewriterTimer);
|
|
59
48
|
typewriterTimer = null;
|
|
60
49
|
displayMessage.set(fullMessage());
|
|
61
50
|
isTyping.set(false);
|
|
62
51
|
};
|
|
63
|
-
effect(
|
|
64
|
-
|
|
52
|
+
effect(() => {
|
|
53
|
+
const text = resolveProp(message) || "";
|
|
65
54
|
fullMessage.set(text);
|
|
66
55
|
if (!(resolveProp(typewriterEffect) !== false)) {
|
|
67
56
|
finishTyping();
|
|
@@ -69,15 +58,9 @@ function component($$props) {
|
|
|
69
58
|
}
|
|
70
59
|
startTypewriter(text);
|
|
71
60
|
});
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
});
|
|
75
|
-
var showIndicator = computed(function() {
|
|
76
|
-
return !hasChoices() && !isTyping();
|
|
77
|
-
});
|
|
78
|
-
var nav = createTabindexNavigator(selectedItem, { count: function() {
|
|
79
|
-
return choices.length;
|
|
80
|
-
} }, "wrap");
|
|
61
|
+
const hasChoices = computed(() => choices.length > 0);
|
|
62
|
+
const showIndicator = computed(() => !hasChoices() && !isTyping());
|
|
63
|
+
const nav = createTabindexNavigator(selectedItem, { count: () => choices.length }, "wrap");
|
|
81
64
|
function selectChoice(index) {
|
|
82
65
|
return function() {
|
|
83
66
|
selectedItem.set(index);
|
|
@@ -87,15 +70,15 @@ function component($$props) {
|
|
|
87
70
|
function _onFinish(value) {
|
|
88
71
|
if (onFinish) onFinish(value);
|
|
89
72
|
}
|
|
90
|
-
|
|
73
|
+
const onSelect = (index) => {
|
|
91
74
|
_onFinish(index);
|
|
92
75
|
};
|
|
93
|
-
|
|
76
|
+
const controls = signal({
|
|
94
77
|
up: {
|
|
95
78
|
repeat: true,
|
|
96
79
|
bind: keyboardControls.up,
|
|
97
80
|
throttle: 150,
|
|
98
|
-
keyDown
|
|
81
|
+
keyDown() {
|
|
99
82
|
if (!hasChoices()) return;
|
|
100
83
|
nav.next(-1);
|
|
101
84
|
}
|
|
@@ -104,14 +87,14 @@ function component($$props) {
|
|
|
104
87
|
repeat: true,
|
|
105
88
|
bind: keyboardControls.down,
|
|
106
89
|
throttle: 150,
|
|
107
|
-
keyDown
|
|
90
|
+
keyDown() {
|
|
108
91
|
if (!hasChoices()) return;
|
|
109
92
|
nav.next(1);
|
|
110
93
|
}
|
|
111
94
|
},
|
|
112
95
|
action: {
|
|
113
96
|
bind: keyboardControls.action,
|
|
114
|
-
keyDown
|
|
97
|
+
keyDown() {
|
|
115
98
|
if (isTyping()) {
|
|
116
99
|
finishTyping();
|
|
117
100
|
return;
|
|
@@ -122,9 +105,9 @@ function component($$props) {
|
|
|
122
105
|
},
|
|
123
106
|
gamepad: { enabled: true }
|
|
124
107
|
});
|
|
125
|
-
|
|
108
|
+
const dialogControls = signal({ action: {
|
|
126
109
|
bind: keyboardControls.action,
|
|
127
|
-
keyDown
|
|
110
|
+
keyDown() {
|
|
128
111
|
if (isTyping()) {
|
|
129
112
|
finishTyping();
|
|
130
113
|
return;
|
|
@@ -133,15 +116,15 @@ function component($$props) {
|
|
|
133
116
|
_onFinish();
|
|
134
117
|
}
|
|
135
118
|
} });
|
|
136
|
-
|
|
119
|
+
const faceSheet = (graphicId, animationName) => {
|
|
137
120
|
return {
|
|
138
121
|
definition: engine.getSpriteSheet(graphicId),
|
|
139
122
|
playing: animationName
|
|
140
123
|
};
|
|
141
124
|
};
|
|
142
|
-
mount(
|
|
143
|
-
return
|
|
144
|
-
delay(
|
|
125
|
+
mount((element) => {
|
|
126
|
+
return () => {
|
|
127
|
+
delay(() => {
|
|
145
128
|
engine.stopProcessingInput = false;
|
|
146
129
|
});
|
|
147
130
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.ce.js","names":[],"sources":["../../../../src/components/gui/dialogbox/index.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={dialogControls}>\n <div\n class=\"rpg-ui-dialog-container\"\n data-position={dialogPosition()}\n data-full-width={isFullWidth() ? \"true\" : \"false\"}\n data-has-face={hasFace() ? \"true\" : \"false\"}\n >\n <div class=\"rpg-ui-dialog rpg-anim-fade-in\">\n <div class=\"rpg-ui-dialog-body\">\n <div>\n @if (speakerName()) {\n <div class=\"rpg-ui-dialog-speaker\">{speakerName()}</div>\n }\n <div class=\"rpg-ui-dialog-content\">\n {displayMessage()}\n </div>\n @if (hasChoices()) {\n <Navigation tabindex={selectedItem} controls={controls}>\n <div class=\"rpg-ui-dialog-choices\">\n @for ((choice,index) of choices) {\n <div\n class=\"rpg-ui-dialog-choice\"\n class={{active: selectedItem() === index}}\n tabindex={index}\n data-choice-index={index}\n click={selectChoice(index)}\n >{{ choice.text }}</div>\n }\n </div>\n </Navigation>\n }\n </div>\n @if (hasFace()) {\n <div class=\"rpg-ui-dialog-face\">\n <DOMSprite sheet={faceSheet(face.id, face.expression)} />\n </div>\n }\n </div>\n @if (showIndicator) {\n <div class=\"rpg-ui-dialog-indicator\"></div>\n }\n </div>\n </div>\n</DOMContainer>\n \n<script>\n import { effect, signal, computed, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n engine.stopProcessingInput = true;\n\n const selectedItem = signal(0)\n let isDestroyed = false;\n\n const {\n data,\n onFinish,\n onInteraction\n } = defineProps();\n\n const { message, choices, face, speaker, position, typewriterEffect, autoClose } = data();\n const fullWidth = computed(() => data().fullWidth || false);\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n\n const speakerName = computed(() => {\n const value = resolveProp(speaker);\n return value ? String(value) : \"\";\n });\n\n const dialogPosition = computed(() => resolveProp(position) || \"bottom\");\n const isFullWidth = computed(() => resolveProp(fullWidth) !== false);\n const hasFace = computed(() => !!resolveProp(face));\n\n const displayMessage = signal(\"\");\n const fullMessage = signal(\"\");\n const isTyping = signal(false);\n let typewriterTimer = null;\n let rootElement = null;\n\n mount((element) => {\n rootElement = element;\n });\n\n const startTypewriter = (text) => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n displayMessage.set(\"\");\n if (!text) return;\n let index = 0;\n isTyping.set(true);\n typewriterTimer = setInterval(() => {\n index += 1;\n displayMessage.set(text.slice(0, index));\n if (index >= text.length) {\n clearInterval(typewriterTimer);\n typewriterTimer = null;\n isTyping.set(false);\n }\n }, 20);\n };\n\n const finishTyping = () => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n typewriterTimer = null;\n displayMessage.set(fullMessage());\n isTyping.set(false);\n };\n\n effect(() => {\n const text = resolveProp(message) || \"\";\n fullMessage.set(text);\n const useTypewriter = resolveProp(typewriterEffect) !== false;\n if (!useTypewriter) {\n finishTyping();\n return;\n }\n startTypewriter(text);\n });\n\n\n const hasChoices = computed(() => choices.length > 0);\n const showIndicator = computed(() => !hasChoices() && !isTyping());\n const nav = createTabindexNavigator(selectedItem, { count: () => choices.length }, 'wrap');\n\n function selectChoice(index) {\n return function() {\n selectedItem.set(index);\n onSelect(index);\n }\n }\n\n function _onFinish(value) {\n if (onFinish) onFinish(value);\n }\n\n const onSelect = (index) => {\n _onFinish(index);\n };\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (!hasChoices()) return;\n onSelect(selectedItem());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n \n const dialogControls = signal({\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (hasChoices()) return;\n _onFinish();\n }\n },\n })\n\n const faceSheet = (graphicId, animationName) => {\n return {\n definition: engine.getSpriteSheet(graphicId),\n playing: animationName,\n };\n }\n\n mount((element) => {\n return () => {\n isDestroyed = true;\n // Wait destroy is finished before start processing input\n delay(() => {\n engine.stopProcessingInput = false;\n })\n }\n })\n</script>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.ce.js","names":[],"sources":["../../../../src/components/gui/dialogbox/index.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\" controls={dialogControls}>\n <div\n class=\"rpg-ui-dialog-container\"\n data-position={dialogPosition()}\n data-full-width={isFullWidth() ? \"true\" : \"false\"}\n data-has-face={hasFace() ? \"true\" : \"false\"}\n >\n <div class=\"rpg-ui-dialog rpg-anim-fade-in\">\n <div class=\"rpg-ui-dialog-body\">\n <div>\n @if (speakerName()) {\n <div class=\"rpg-ui-dialog-speaker\">{speakerName()}</div>\n }\n <div class=\"rpg-ui-dialog-content\">\n {displayMessage()}\n </div>\n @if (hasChoices()) {\n <Navigation tabindex={selectedItem} controls={controls}>\n <div class=\"rpg-ui-dialog-choices\">\n @for ((choice,index) of choices) {\n <div\n class=\"rpg-ui-dialog-choice\"\n class={{active: selectedItem() === index}}\n tabindex={index}\n data-choice-index={index}\n click={selectChoice(index)}\n >{{ choice.text }}</div>\n }\n </div>\n </Navigation>\n }\n </div>\n @if (hasFace()) {\n <div class=\"rpg-ui-dialog-face\">\n <DOMSprite sheet={faceSheet(face.id, face.expression)} />\n </div>\n }\n </div>\n @if (showIndicator) {\n <div class=\"rpg-ui-dialog-indicator\"></div>\n }\n </div>\n </div>\n</DOMContainer>\n \n<script>\n import { effect, signal, computed, createTabindexNavigator, mount } from \"canvasengine\";\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { delay } from \"@rpgjs/common\";\n\n const engine = inject(RpgClientEngine);\n const currentPlayer = engine.scene.currentPlayer\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n engine.stopProcessingInput = true;\n\n const selectedItem = signal(0)\n let isDestroyed = false;\n\n const {\n data,\n onFinish,\n onInteraction\n } = defineProps();\n\n const { message, choices, face, speaker, position, typewriterEffect, autoClose } = data();\n const fullWidth = computed(() => data().fullWidth || false);\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n\n const speakerName = computed(() => {\n const value = resolveProp(speaker);\n return value ? String(value) : \"\";\n });\n\n const dialogPosition = computed(() => resolveProp(position) || \"bottom\");\n const isFullWidth = computed(() => resolveProp(fullWidth) !== false);\n const hasFace = computed(() => !!resolveProp(face));\n\n const displayMessage = signal(\"\");\n const fullMessage = signal(\"\");\n const isTyping = signal(false);\n let typewriterTimer = null;\n let rootElement = null;\n\n mount((element) => {\n rootElement = element;\n });\n\n const startTypewriter = (text) => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n displayMessage.set(\"\");\n if (!text) return;\n let index = 0;\n isTyping.set(true);\n typewriterTimer = setInterval(() => {\n index += 1;\n displayMessage.set(text.slice(0, index));\n if (index >= text.length) {\n clearInterval(typewriterTimer);\n typewriterTimer = null;\n isTyping.set(false);\n }\n }, 20);\n };\n\n const finishTyping = () => {\n if (typewriterTimer) clearInterval(typewriterTimer);\n typewriterTimer = null;\n displayMessage.set(fullMessage());\n isTyping.set(false);\n };\n\n effect(() => {\n const text = resolveProp(message) || \"\";\n fullMessage.set(text);\n const useTypewriter = resolveProp(typewriterEffect) !== false;\n if (!useTypewriter) {\n finishTyping();\n return;\n }\n startTypewriter(text);\n });\n\n\n const hasChoices = computed(() => choices.length > 0);\n const showIndicator = computed(() => !hasChoices() && !isTyping());\n const nav = createTabindexNavigator(selectedItem, { count: () => choices.length }, 'wrap');\n\n function selectChoice(index) {\n return function() {\n selectedItem.set(index);\n onSelect(index);\n }\n }\n\n function _onFinish(value) {\n if (onFinish) onFinish(value);\n }\n\n const onSelect = (index) => {\n _onFinish(index);\n };\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n if (!hasChoices()) return;\n nav.next(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (!hasChoices()) return;\n onSelect(selectedItem());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n \n const dialogControls = signal({\n action: {\n bind: keyboardControls.action,\n keyDown() {\n if (isTyping()) {\n finishTyping();\n return;\n }\n if (hasChoices()) return;\n _onFinish();\n }\n },\n })\n\n const faceSheet = (graphicId, animationName) => {\n return {\n definition: engine.getSpriteSheet(graphicId),\n playing: animationName,\n };\n }\n\n mount((element) => {\n return () => {\n isDestroyed = true;\n // Wait destroy is finished before start processing input\n delay(() => {\n engine.stopProcessingInput = false;\n })\n }\n })\n</script>\n"],"mappings":"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"}
|
|
@@ -7,81 +7,55 @@ import { PrebuiltGui } from "@rpgjs/common";
|
|
|
7
7
|
function component($$props) {
|
|
8
8
|
useProps($$props);
|
|
9
9
|
const defineProps = useDefineProps($$props);
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return t;
|
|
17
|
-
};
|
|
18
|
-
return __assign.apply(this, arguments);
|
|
19
|
-
};
|
|
20
|
-
var engine = inject(RpgClientEngine);
|
|
21
|
-
var guiService = inject(RpgGui);
|
|
22
|
-
var keyboardControls = engine.globalConfig.keyboardControls;
|
|
23
|
-
var _a = defineProps({
|
|
24
|
-
entries: { default: function() {
|
|
25
|
-
return [];
|
|
26
|
-
} },
|
|
27
|
-
saveLoad: { default: function() {
|
|
28
|
-
return {};
|
|
29
|
-
} },
|
|
10
|
+
const engine = inject(RpgClientEngine);
|
|
11
|
+
const guiService = inject(RpgGui);
|
|
12
|
+
const keyboardControls = engine.globalConfig.keyboardControls;
|
|
13
|
+
const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({
|
|
14
|
+
entries: { default: () => [] },
|
|
15
|
+
saveLoad: { default: () => ({}) },
|
|
30
16
|
localActions: { default: false }
|
|
31
|
-
})
|
|
32
|
-
|
|
17
|
+
});
|
|
18
|
+
const defaultEntries = [{
|
|
33
19
|
id: "title",
|
|
34
20
|
label: "Title Screen"
|
|
35
21
|
}, {
|
|
36
22
|
id: "load",
|
|
37
23
|
label: "Load Game"
|
|
38
24
|
}];
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
var subtitleText = computed(function() {
|
|
46
|
-
return resolveProp(subtitle) || "";
|
|
47
|
-
});
|
|
48
|
-
var localActionsEnabled = computed(function() {
|
|
49
|
-
return resolveProp(localActions) === true;
|
|
50
|
-
});
|
|
51
|
-
var entryList = computed(function() {
|
|
52
|
-
var list = resolveProp(entries);
|
|
25
|
+
const resolveProp = (value) => typeof value === "function" ? value() : value;
|
|
26
|
+
const titleText = computed(() => resolveProp(title) || "Game Over");
|
|
27
|
+
const subtitleText = computed(() => resolveProp(subtitle) || "");
|
|
28
|
+
const localActionsEnabled = computed(() => resolveProp(localActions) === true);
|
|
29
|
+
const entryList = computed(() => {
|
|
30
|
+
const list = resolveProp(entries);
|
|
53
31
|
if (Array.isArray(list) && list.length) return list;
|
|
54
32
|
return defaultEntries;
|
|
55
33
|
});
|
|
56
|
-
|
|
34
|
+
const isEntryDisabled = (entry) => {
|
|
57
35
|
if (!entry) return true;
|
|
58
36
|
if (entry.disabled) return true;
|
|
59
37
|
if (entry.enabled === false) return true;
|
|
60
38
|
return false;
|
|
61
39
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return entryList().map(
|
|
65
|
-
return isEntryDisabled(entry) ? null : index;
|
|
66
|
-
}).filter(function(value) {
|
|
67
|
-
return value !== null;
|
|
68
|
-
});
|
|
40
|
+
const selectedEntry = signal(0);
|
|
41
|
+
const selectableIndexes = computed(() => {
|
|
42
|
+
return entryList().map((entry, index) => isEntryDisabled(entry) ? null : index).filter((value) => value !== null);
|
|
69
43
|
});
|
|
70
|
-
effect(
|
|
71
|
-
|
|
44
|
+
effect(() => {
|
|
45
|
+
const available = selectableIndexes();
|
|
72
46
|
if (!available.length) return;
|
|
73
|
-
|
|
47
|
+
const current = selectedEntry();
|
|
74
48
|
if (!available.includes(current)) selectedEntry.set(available[0]);
|
|
75
49
|
});
|
|
76
|
-
|
|
77
|
-
|
|
50
|
+
const moveSelection = (delta) => {
|
|
51
|
+
const available = selectableIndexes();
|
|
78
52
|
if (!available.length) return;
|
|
79
|
-
|
|
80
|
-
|
|
53
|
+
const current = selectedEntry();
|
|
54
|
+
const nextIndex = (Math.max(0, available.indexOf(current)) + delta + available.length) % available.length;
|
|
81
55
|
selectedEntry.set(available[nextIndex]);
|
|
82
56
|
};
|
|
83
|
-
|
|
84
|
-
|
|
57
|
+
const triggerSelect = (index) => {
|
|
58
|
+
const entry = entryList()[index];
|
|
85
59
|
if (!entry || isEntryDisabled(entry)) return;
|
|
86
60
|
if (localActionsEnabled()) {
|
|
87
61
|
if (entry.id === "title") {
|
|
@@ -89,16 +63,17 @@ function component($$props) {
|
|
|
89
63
|
guiService.display(PrebuiltGui.TitleScreen);
|
|
90
64
|
}
|
|
91
65
|
if (entry.id === "load") {
|
|
92
|
-
|
|
93
|
-
|
|
66
|
+
const config = resolveProp(saveLoad) || {};
|
|
67
|
+
const slots = Array.isArray(config.slots) ? config.slots : [
|
|
94
68
|
null,
|
|
95
69
|
null,
|
|
96
70
|
null
|
|
97
71
|
];
|
|
98
|
-
guiService.display(PrebuiltGui.Save,
|
|
72
|
+
guiService.display(PrebuiltGui.Save, {
|
|
73
|
+
...config,
|
|
99
74
|
mode: config.mode || "load",
|
|
100
75
|
slots
|
|
101
|
-
})
|
|
76
|
+
});
|
|
102
77
|
}
|
|
103
78
|
}
|
|
104
79
|
if (onInteraction) onInteraction("select", {
|
|
@@ -113,12 +88,12 @@ function component($$props) {
|
|
|
113
88
|
triggerSelect(index);
|
|
114
89
|
};
|
|
115
90
|
}
|
|
116
|
-
|
|
91
|
+
const controls = signal({
|
|
117
92
|
up: {
|
|
118
93
|
repeat: true,
|
|
119
94
|
bind: keyboardControls.up,
|
|
120
95
|
throttle: 150,
|
|
121
|
-
keyDown
|
|
96
|
+
keyDown() {
|
|
122
97
|
moveSelection(-1);
|
|
123
98
|
}
|
|
124
99
|
},
|
|
@@ -126,13 +101,13 @@ function component($$props) {
|
|
|
126
101
|
repeat: true,
|
|
127
102
|
bind: keyboardControls.down,
|
|
128
103
|
throttle: 150,
|
|
129
|
-
keyDown
|
|
104
|
+
keyDown() {
|
|
130
105
|
moveSelection(1);
|
|
131
106
|
}
|
|
132
107
|
},
|
|
133
108
|
action: {
|
|
134
109
|
bind: keyboardControls.action,
|
|
135
|
-
keyDown
|
|
110
|
+
keyDown() {
|
|
136
111
|
triggerSelect(selectedEntry());
|
|
137
112
|
}
|
|
138
113
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gameover.ce.js","names":[],"sources":["../../../src/components/gui/gameover.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-gameover-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-left\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-right\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-center\"></div>\n <div class=\"rpg-ui-gameover-header rpg-anim-shake\">\n <div class=\"rpg-ui-gameover-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-gameover-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-gameover-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const defaultEntries = [\n { id: \"title\", label: \"Title Screen\" },\n { id: \"load\", label: \"Load Game\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || \"Game Over\");\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"title\") {\n guiService.hide(PrebuiltGui.Gameover);\n guiService.display(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n moveSelection(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":";;;;;;AAYM,SAAwB,UAAU,SAAG;AACpB,UAAM,QAAU;CAC/B,MAAM,cAAO,eAAA,QAAA;CACb,
|
|
1
|
+
{"version":3,"file":"gameover.ce.js","names":[],"sources":["../../../src/components/gui/gameover.ce"],"sourcesContent":["<DOMContainer width=\"100%\" height=\"100%\">\n <div class=\"rpg-ui-gameover-screen rpg-anim-fade-in\">\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-left\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-right\"></div>\n <div class=\"rpg-ui-gameover-splatter rpg-ui-gameover-splatter-center\"></div>\n <div class=\"rpg-ui-gameover-header rpg-anim-shake\">\n <div class=\"rpg-ui-gameover-title\">{titleText()}</div>\n @if (subtitleText()) {\n <div class=\"rpg-ui-gameover-subtitle\">{subtitleText()}</div>\n }\n </div>\n <Navigation tabindex={selectedEntry} controls={controls}>\n <div class=\"rpg-ui-menu rpg-ui-gameover-menu rpg-anim-slide-up\">\n @for ((entry,index) of entryList()) {\n <div\n class=\"rpg-ui-menu-item\"\n class={{disabled: isEntryDisabled(entry)}}\n data-selected={selectedEntry() === index ? \"true\" : \"false\"}\n tabindex={index}\n click={selectEntry(index)}\n >{entry.label}</div>\n }\n </div>\n </Navigation>\n </div>\n</DOMContainer>\n\n<script>\n import { signal, computed, effect } from \"canvasengine\";\n import { PrebuiltGui } from \"@rpgjs/common\";\n import { inject } from \"../../core/inject\";\n import { RpgClientEngine } from \"../../RpgClientEngine\";\n import { RpgGui } from \"../../Gui/Gui\";\n\n const engine = inject(RpgClientEngine);\n const guiService = inject(RpgGui);\n const keyboardControls = engine.globalConfig.keyboardControls;\n\n const { entries, title, subtitle, saveLoad, localActions, onInteraction } = defineProps({\n entries: {\n default: () => []\n },\n saveLoad: {\n default: () => ({})\n },\n localActions: {\n default: false\n }\n });\n\n const defaultEntries = [\n { id: \"title\", label: \"Title Screen\" },\n { id: \"load\", label: \"Load Game\" }\n ];\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const titleText = computed(() => resolveProp(title) || \"Game Over\");\n const subtitleText = computed(() => resolveProp(subtitle) || \"\");\n const localActionsEnabled = computed(() => resolveProp(localActions) === true);\n\n const entryList = computed(() => {\n const list = resolveProp(entries);\n if (Array.isArray(list) && list.length) return list;\n return defaultEntries;\n });\n\n const isEntryDisabled = (entry) => {\n if (!entry) return true;\n if (entry.disabled) return true;\n if (entry.enabled === false) return true;\n return false;\n };\n\n const selectedEntry = signal(0);\n const selectableIndexes = computed(() => {\n const list = entryList();\n return list\n .map((entry, index) => (isEntryDisabled(entry) ? null : index))\n .filter((value) => value !== null);\n });\n\n effect(() => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n if (!available.includes(current)) {\n selectedEntry.set(available[0]);\n }\n });\n\n const moveSelection = (delta) => {\n const available = selectableIndexes();\n if (!available.length) return;\n const current = selectedEntry();\n const currentIndex = Math.max(0, available.indexOf(current));\n const nextIndex = (currentIndex + delta + available.length) % available.length;\n selectedEntry.set(available[nextIndex]);\n };\n\n const triggerSelect = (index) => {\n const list = entryList();\n const entry = list[index];\n if (!entry || isEntryDisabled(entry)) return;\n if (localActionsEnabled()) {\n if (entry.id === \"title\") {\n guiService.hide(PrebuiltGui.Gameover);\n guiService.display(PrebuiltGui.TitleScreen);\n }\n if (entry.id === \"load\") {\n const config = resolveProp(saveLoad) || {};\n const slots = Array.isArray(config.slots) ? config.slots : [null, null, null];\n guiService.display(PrebuiltGui.Save, {\n ...config,\n mode: config.mode || \"load\",\n slots\n });\n }\n }\n if (onInteraction) {\n onInteraction(\"select\", { id: entry.id, index, entry });\n }\n };\n\n function selectEntry(index) {\n return function() {\n selectedEntry.set(index);\n triggerSelect(index);\n };\n }\n\n const controls = signal({\n up: {\n repeat: true,\n bind: keyboardControls.up,\n throttle: 150,\n keyDown() {\n moveSelection(-1);\n }\n },\n down: {\n repeat: true,\n bind: keyboardControls.down,\n throttle: 150,\n keyDown() {\n moveSelection(1);\n }\n },\n action: {\n bind: keyboardControls.action,\n keyDown() {\n triggerSelect(selectedEntry());\n }\n },\n gamepad: {\n enabled: true\n }\n });\n</script>\n"],"mappings":"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"}
|
|
@@ -6,37 +6,27 @@ import { DOMContainer, DOMElement, DOMSprite, computed, cond, h, useDefineProps,
|
|
|
6
6
|
function component($$props) {
|
|
7
7
|
useProps($$props);
|
|
8
8
|
const defineProps = useDefineProps($$props);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
data()
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
return resolveProp(data().faceset);
|
|
18
|
-
});
|
|
19
|
-
var hasFace = computed(function() {
|
|
20
|
-
var value = face();
|
|
9
|
+
const engine = inject(RpgClientEngine);
|
|
10
|
+
const currentPlayer = engine.scene.currentPlayer;
|
|
11
|
+
const { data } = defineProps();
|
|
12
|
+
const { faceset } = data();
|
|
13
|
+
const resolveProp = (value) => typeof value === "function" ? value() : value;
|
|
14
|
+
const face = computed(() => resolveProp(data().faceset));
|
|
15
|
+
const hasFace = computed(() => {
|
|
16
|
+
const value = face();
|
|
21
17
|
return !!(value && value.id);
|
|
22
18
|
});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
playing: faceValue.expression || "default"
|
|
27
|
-
};
|
|
28
|
-
};
|
|
29
|
-
var hp = getEntityProp(currentPlayer, "hp");
|
|
30
|
-
var hpMax = getEntityProp(currentPlayer, "params.maxHp");
|
|
31
|
-
var percentHp = computed(function() {
|
|
32
|
-
return hp() / hpMax() * 100 + "%";
|
|
33
|
-
});
|
|
34
|
-
var sp = getEntityProp(currentPlayer, "sp");
|
|
35
|
-
var spMax = getEntityProp(currentPlayer, "params.maxSp");
|
|
36
|
-
var percentSp = computed(function() {
|
|
37
|
-
return sp() / spMax() * 100 + "%";
|
|
19
|
+
const faceSheet = (faceValue) => ({
|
|
20
|
+
definition: engine.getSpriteSheet(faceValue.id),
|
|
21
|
+
playing: faceValue.expression || "default"
|
|
38
22
|
});
|
|
39
|
-
|
|
23
|
+
const hp = getEntityProp(currentPlayer, "hp");
|
|
24
|
+
const hpMax = getEntityProp(currentPlayer, "params.maxHp");
|
|
25
|
+
const percentHp = computed(() => hp() / hpMax() * 100 + "%");
|
|
26
|
+
const sp = getEntityProp(currentPlayer, "sp");
|
|
27
|
+
const spMax = getEntityProp(currentPlayer, "params.maxSp");
|
|
28
|
+
const percentSp = computed(() => sp() / spMax() * 100 + "%");
|
|
29
|
+
const level = getEntityProp(currentPlayer, "level");
|
|
40
30
|
return h(DOMContainer, null, h(DOMElement, {
|
|
41
31
|
element: "div",
|
|
42
32
|
attrs: { class: "rpg-hud" }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hud.ce.js","names":[],"sources":["../../../../src/components/gui/hud/hud.ce"],"sourcesContent":["<DOMContainer>\n <div class=\"rpg-hud\">\n <div class=\"rpg-avatar\">\n @if (hasFace()) {\n <div class=\"rpg-avatar-face\">\n <DOMSprite \n sheet={faceSheet(face())} \n width={64} \n height={64} \n objectFit=\"contain\" \n />\n </div>\n }\n <div class=\"rpg-avatar-level\">{{ level() }}</div>\n </div>\n <div class=\"rpg-status-bars\">\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">HP {{ hp() }}/{{ hpMax() }}</span>\n <div class=\"rpg-bar-fill health\" style={{width: percentHp}}></div>\n </div>\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">SP {{ sp() }}/{{ spMax() }}</span>\n <div class=\"rpg-bar-fill mana\" style={{width: percentSp}}></div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { computed } from \"canvasengine\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const { data } = defineProps();\n const { faceset } = data();\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const face = computed(() => resolveProp(data().faceset));\n\n const hasFace = computed(() => {\n const value = face();\n return !!(value && value.id);\n });\n const faceSheet = (faceValue) => ({\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n });\n const hp = getEntityProp(currentPlayer, \"hp\")\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\")\n const percentHp = computed(() => (hp() / hpMax() * 100) + '%')\n\n const sp = getEntityProp(currentPlayer, \"sp\")\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\")\n const percentSp = computed(() => (sp() / spMax() * 100) + '%')\n\n const level = getEntityProp(currentPlayer, \"level\")\n</script>\n \n"],"mappings":";;;;;AAWM,SAAe,UAAA,SAAA;AACT,UAAA,QAAA;CACJ,MAAK,cAAe,eAAe,QAAQ;CAC3C,
|
|
1
|
+
{"version":3,"file":"hud.ce.js","names":[],"sources":["../../../../src/components/gui/hud/hud.ce"],"sourcesContent":["<DOMContainer>\n <div class=\"rpg-hud\">\n <div class=\"rpg-avatar\">\n @if (hasFace()) {\n <div class=\"rpg-avatar-face\">\n <DOMSprite \n sheet={faceSheet(face())} \n width={64} \n height={64} \n objectFit=\"contain\" \n />\n </div>\n }\n <div class=\"rpg-avatar-level\">{{ level() }}</div>\n </div>\n <div class=\"rpg-status-bars\">\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">HP {{ hp() }}/{{ hpMax() }}</span>\n <div class=\"rpg-bar-fill health\" style={{width: percentHp}}></div>\n </div>\n <div class=\"rpg-bar-container\">\n <span class=\"rpg-bar-text\">SP {{ sp() }}/{{ spMax() }}</span>\n <div class=\"rpg-bar-fill mana\" style={{width: percentSp}}></div>\n </div>\n </div>\n </div>\n</DOMContainer>\n\n<script>\n import { inject } from \"../../../core/inject\";\n import { RpgClientEngine } from \"../../../RpgClientEngine\";\n import { computed } from \"canvasengine\";\n import { getEntityProp } from \"../../../utils/getEntityProp\";\n\n const engine = inject(RpgClientEngine)\n const currentPlayer = engine.scene.currentPlayer\n const { data } = defineProps();\n const { faceset } = data();\n\n const resolveProp = (value) => typeof value === \"function\" ? value() : value;\n const face = computed(() => resolveProp(data().faceset));\n\n const hasFace = computed(() => {\n const value = face();\n return !!(value && value.id);\n });\n const faceSheet = (faceValue) => ({\n definition: engine.getSpriteSheet(faceValue.id),\n playing: faceValue.expression || \"default\",\n });\n const hp = getEntityProp(currentPlayer, \"hp\")\n const hpMax = getEntityProp(currentPlayer, \"params.maxHp\")\n const percentHp = computed(() => (hp() / hpMax() * 100) + '%')\n\n const sp = getEntityProp(currentPlayer, \"sp\")\n const spMax = getEntityProp(currentPlayer, \"params.maxSp\")\n const percentSp = computed(() => (sp() / spMax() * 100) + '%')\n\n const level = getEntityProp(currentPlayer, \"level\")\n</script>\n \n"],"mappings":";;;;;AAWM,SAAe,UAAA,SAAA;AACT,UAAA,QAAA;CACJ,MAAK,cAAe,eAAe,QAAQ;CAC3C,MAAK,SAAA,OAAA,gBAAA;CACb,MAAM,gBAAc,OAAI,MAAW;CACnC,MAAM,EAAE,SAAS,aAAW;CAC5B,MAAM,EAAE,YAAS,MAAK;CACtB,MAAM,eAAe,UAAU,OAAK,UAAY,aAAS,OAAO,GAAA;CAChE,MAAM,OAAO,eAAI,YAAA,MAAA,CAAA,QAAA,CAAA;CACjB,MAAM,UAAU,eAAe;EAC3B,MAAM,QAAO,MAAK;AAClB,SAAO,CAAC,EAAE,SAAO,MAAO;GAC1B;CACF,MAAM,aAAO,eAAA;EACT,YAAK,OAAA,eAAA,UAAA,GAAA;EACP,SAAA,UAAY,cAAA;;CAEd,MAAC,KAAM,cAAA,eAAA,KAAA;CACP,MAAI,QAAS,cAAe,eAAc,eAAO;CACjD,MAAI,YAAS,eAAkB,IAAO,GAAG,OAAK,GAAA,MAAA,IAAgB;CAC9D,MAAI,KAAO,cAAa,eAAM,KAAa;CAC3C,MAAI,QAAS,cAAe,eAAe,eAAO;;CAElD,MAAI,QAAM,cAAgB,eAAe,QAAA;AAErC,QADM,EAAA,cAAuB,MAAM,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,WAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,cAAA;EAAA,EAAA,CAAA,KAAA,SAAA,QAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,EAAA,EAAA,WAAA;EAAA,OAAA,eAAA,UAAA,MAAA,CAAA,CAAA;EAAA,OAAA;EAAA,QAAA;EAAA,WAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,oBAAA;EAAA,aAAA,eAAA,OAAA,CAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,mBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,aAAA,eAAA,QAAA,IAAA,GAAA,MAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,WAAA;GAAA;EAAA,CAAA,CAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,qBAAA;EAAA,EAAA,CAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA,EAAA,OAAA,gBAAA;EAAA,aAAA,eAAA,QAAA,IAAA,GAAA,MAAA,OAAA,CAAA;EAAA,CAAA,EAAA,EAAA,YAAA;EAAA,SAAA;EAAA,OAAA;GAAA,OAAA;GAAA,OAAA,EAAA,OAAA,WAAA;GAAA;EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CACnB"}
|