bc-deeplib 1.0.0
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 +21 -0
- package/README.md +2 -0
- package/dist/Base/BaseModule.d.ts +13 -0
- package/dist/Base/BaseModule.js +37 -0
- package/dist/Base/BaseSetting.d.ts +39 -0
- package/dist/Base/BaseSetting.js +210 -0
- package/dist/Base/Modules.d.ts +5 -0
- package/dist/Base/Modules.js +11 -0
- package/dist/Base/SettingDefinitions.d.ts +8 -0
- package/dist/Base/SettingDefinitions.js +14 -0
- package/dist/Base/SettingUtils.d.ts +18 -0
- package/dist/Base/SettingUtils.js +66 -0
- package/dist/DeepLib.d.ts +5 -0
- package/dist/DeepLib.js +5 -0
- package/dist/Models/Base.d.ts +3 -0
- package/dist/Models/Base.js +1 -0
- package/dist/Models/Settings.d.ts +4 -0
- package/dist/Models/Settings.js +1 -0
- package/dist/Screens/MainMenu.d.ts +11 -0
- package/dist/Screens/MainMenu.js +76 -0
- package/dist/Screens/Support.d.ts +14 -0
- package/dist/Screens/Support.js +94 -0
- package/dist/Utils/Data.d.ts +4 -0
- package/dist/Utils/Data.js +27 -0
- package/dist/Utils/String.d.ts +5 -0
- package/dist/Utils/String.js +26 -0
- package/package.json +28 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 dDeepLb
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BaseSettingsModel } from "../Models/Base.js";
|
|
2
|
+
import { Subscreen } from "./SettingDefinitions.js";
|
|
3
|
+
export declare abstract class BaseModule {
|
|
4
|
+
get settingsScreen(): Subscreen | null;
|
|
5
|
+
get settingsStorage(): string | null;
|
|
6
|
+
get settings(): BaseSettingsModel;
|
|
7
|
+
get defaultSettings(): BaseSettingsModel | null;
|
|
8
|
+
Init(): void;
|
|
9
|
+
registerDefaultSettings(): void;
|
|
10
|
+
Load(): void;
|
|
11
|
+
Run(): void;
|
|
12
|
+
Unload(): void;
|
|
13
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PlayerStorage } from "../Utils/Data.js";
|
|
2
|
+
import { GUI } from './SettingUtils.js';
|
|
3
|
+
export class BaseModule {
|
|
4
|
+
get settingsScreen() {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
get settingsStorage() {
|
|
8
|
+
return this.constructor.name;
|
|
9
|
+
}
|
|
10
|
+
get settings() {
|
|
11
|
+
if (!this.settingsStorage)
|
|
12
|
+
return {};
|
|
13
|
+
if (!PlayerStorage(GUI.modName)) {
|
|
14
|
+
Player[GUI.modName] = {};
|
|
15
|
+
this.registerDefaultSettings();
|
|
16
|
+
}
|
|
17
|
+
else if (!PlayerStorage(GUI.modName)[this.settingsStorage])
|
|
18
|
+
this.registerDefaultSettings();
|
|
19
|
+
return PlayerStorage(GUI.modName)[this.settingsStorage];
|
|
20
|
+
}
|
|
21
|
+
get defaultSettings() {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
Init() {
|
|
25
|
+
this.registerDefaultSettings();
|
|
26
|
+
}
|
|
27
|
+
registerDefaultSettings() {
|
|
28
|
+
const storage = this.settingsStorage;
|
|
29
|
+
const defaults = this.defaultSettings;
|
|
30
|
+
if (!storage || !defaults)
|
|
31
|
+
return;
|
|
32
|
+
PlayerStorage(GUI.modName)[storage] = Object.assign(defaults, PlayerStorage(GUI.modName)[storage] ?? {});
|
|
33
|
+
}
|
|
34
|
+
Load() { }
|
|
35
|
+
Run() { }
|
|
36
|
+
Unload() { }
|
|
37
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Setting } from "../../.types/setting.js";
|
|
2
|
+
import { BaseSettingsModel } from "../Models/Base.js";
|
|
3
|
+
import { BaseModule } from "./BaseModule.js";
|
|
4
|
+
export declare abstract class GuiSubscreen {
|
|
5
|
+
static START_X: number;
|
|
6
|
+
static START_Y: number;
|
|
7
|
+
static X_MOD: number;
|
|
8
|
+
static Y_MOD: number;
|
|
9
|
+
static POS_BAK: number;
|
|
10
|
+
static TEXT_ALIGN_BAK: CanvasTextAlign;
|
|
11
|
+
readonly module: BaseModule | null;
|
|
12
|
+
constructor(module?: BaseModule);
|
|
13
|
+
get name(): string;
|
|
14
|
+
get icon(): string;
|
|
15
|
+
get label(): string;
|
|
16
|
+
get message(): string;
|
|
17
|
+
set message(message: string);
|
|
18
|
+
get SubscreenName(): string;
|
|
19
|
+
setSubscreen(screen: GuiSubscreen | string | null): GuiSubscreen | null;
|
|
20
|
+
get settings(): BaseSettingsModel;
|
|
21
|
+
get multipageStructure(): Setting[][];
|
|
22
|
+
get structure(): Setting[];
|
|
23
|
+
get character(): Character;
|
|
24
|
+
getYPos(ix: number): number;
|
|
25
|
+
getXPos(ix: number): number;
|
|
26
|
+
hideElements(): void;
|
|
27
|
+
Load(): void;
|
|
28
|
+
Run(): void;
|
|
29
|
+
Click(): void;
|
|
30
|
+
Exit(): void;
|
|
31
|
+
Unload(): void;
|
|
32
|
+
tooltip(text: string): void;
|
|
33
|
+
drawCheckbox(label: string, description: string, value: boolean, order: number, disabled?: boolean): void;
|
|
34
|
+
drawBetterButton(position: number[], size: number[], label: string, color: string, image?: string, disabled?: boolean): void;
|
|
35
|
+
drawButton(label: string, color: string, order: number, XOffset: number, disabled?: boolean): void;
|
|
36
|
+
elementHide(elementId: string): void;
|
|
37
|
+
elementPosition(elementId: string, label: string, description: string, order: number, disabled?: boolean): void;
|
|
38
|
+
drawLabel(label: string, description: string, order: number): void;
|
|
39
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { modules } from "./Modules.js";
|
|
2
|
+
import { dataStore } from "../Utils/Data.js";
|
|
3
|
+
import { SETTING_FUNC_NAMES, SETTING_FUNC_PREFIX, SETTING_NAME_PREFIX, setSubscreen } from "./SettingDefinitions.js";
|
|
4
|
+
import { GUI } from "./SettingUtils.js";
|
|
5
|
+
export class GuiSubscreen {
|
|
6
|
+
static START_X = 180;
|
|
7
|
+
static START_Y = 205;
|
|
8
|
+
static X_MOD = 950;
|
|
9
|
+
static Y_MOD = 75;
|
|
10
|
+
static POS_BAK = GuiSubscreen.START_X;
|
|
11
|
+
static TEXT_ALIGN_BAK;
|
|
12
|
+
module = null;
|
|
13
|
+
constructor(module) {
|
|
14
|
+
if (module)
|
|
15
|
+
this.module = module;
|
|
16
|
+
SETTING_FUNC_NAMES.forEach((name) => {
|
|
17
|
+
const fName = SETTING_FUNC_PREFIX + SETTING_NAME_PREFIX + this.name + name;
|
|
18
|
+
if (typeof this[name] === "function" && typeof window[fName] !== "function")
|
|
19
|
+
window[fName] = () => {
|
|
20
|
+
this[name]();
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
get name() {
|
|
25
|
+
return "UNKNOWN";
|
|
26
|
+
}
|
|
27
|
+
get icon() {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
get label() {
|
|
31
|
+
return "UNDEFINED SETTING SCREEN";
|
|
32
|
+
}
|
|
33
|
+
get message() {
|
|
34
|
+
return PreferenceMessage;
|
|
35
|
+
}
|
|
36
|
+
set message(message) {
|
|
37
|
+
PreferenceMessage = message;
|
|
38
|
+
}
|
|
39
|
+
get SubscreenName() {
|
|
40
|
+
return SETTING_NAME_PREFIX + this.constructor.name;
|
|
41
|
+
}
|
|
42
|
+
setSubscreen(screen) {
|
|
43
|
+
return setSubscreen(screen);
|
|
44
|
+
}
|
|
45
|
+
get settings() {
|
|
46
|
+
return this.module?.settings;
|
|
47
|
+
}
|
|
48
|
+
get multipageStructure() {
|
|
49
|
+
return [[]];
|
|
50
|
+
}
|
|
51
|
+
get structure() {
|
|
52
|
+
return this.multipageStructure[Math.min(PreferencePageCurrent - 1, this.multipageStructure.length - 1)];
|
|
53
|
+
}
|
|
54
|
+
get character() {
|
|
55
|
+
return GUI.instance?.currentCharacter;
|
|
56
|
+
}
|
|
57
|
+
getYPos(ix) {
|
|
58
|
+
return GuiSubscreen.START_Y + GuiSubscreen.Y_MOD * (ix % 9);
|
|
59
|
+
}
|
|
60
|
+
getXPos(ix) {
|
|
61
|
+
return GuiSubscreen.START_X + GuiSubscreen.X_MOD * Math.floor(ix / 9);
|
|
62
|
+
}
|
|
63
|
+
hideElements() {
|
|
64
|
+
this.multipageStructure.forEach((item, ix, arr) => {
|
|
65
|
+
if (ix != PreferencePageCurrent - 1) {
|
|
66
|
+
item.forEach((setting) => {
|
|
67
|
+
if (setting.type == "text" || setting.type == "number")
|
|
68
|
+
this.elementHide(setting.id);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
Load() {
|
|
74
|
+
for (const module of modules()) {
|
|
75
|
+
if (!module.settingsScreen)
|
|
76
|
+
continue;
|
|
77
|
+
if (!Object.keys(module.settings).length)
|
|
78
|
+
module.registerDefaultSettings();
|
|
79
|
+
}
|
|
80
|
+
this.multipageStructure.forEach((s) => s.forEach((item) => {
|
|
81
|
+
switch (item.type) {
|
|
82
|
+
case "text":
|
|
83
|
+
let input = ElementCreateInput(item.id, "text", item.setting(), "255");
|
|
84
|
+
input.setAttribute("autocomplete", "off");
|
|
85
|
+
break;
|
|
86
|
+
case "number":
|
|
87
|
+
ElementCreateInput(item.id, "number", item.setting(), "255");
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
}));
|
|
91
|
+
CharacterAppearanceForceUpCharacter = Player.MemberNumber ?? -1;
|
|
92
|
+
}
|
|
93
|
+
Run() {
|
|
94
|
+
GuiSubscreen.POS_BAK = GuiSubscreen.START_X;
|
|
95
|
+
GuiSubscreen.TEXT_ALIGN_BAK = MainCanvas.textAlign;
|
|
96
|
+
GuiSubscreen.START_X = 550;
|
|
97
|
+
MainCanvas.textAlign = "left";
|
|
98
|
+
DrawCharacter(Player, 50, 50, 0.9, false);
|
|
99
|
+
DrawButton(1815, 75, 90, 90, "", "White", "Icons/Exit.png", "Responsive");
|
|
100
|
+
if (this.multipageStructure.length > 1) {
|
|
101
|
+
MainCanvas.textAlign = "center";
|
|
102
|
+
PreferencePageChangeDraw(1595, 75, this.multipageStructure.length);
|
|
103
|
+
MainCanvas.textAlign = "left";
|
|
104
|
+
}
|
|
105
|
+
this.hideElements();
|
|
106
|
+
this.structure.forEach((item, ix, arr) => {
|
|
107
|
+
switch (item.type) {
|
|
108
|
+
case "checkbox":
|
|
109
|
+
this.drawCheckbox(item.label, item.description, item.setting(), ix, item.disabled);
|
|
110
|
+
break;
|
|
111
|
+
case "text":
|
|
112
|
+
case "number":
|
|
113
|
+
this.elementPosition(item.id, item.label, item.description, ix, item.disabled);
|
|
114
|
+
break;
|
|
115
|
+
case "label":
|
|
116
|
+
this.drawLabel(item.label, item.description, ix);
|
|
117
|
+
break;
|
|
118
|
+
case "button":
|
|
119
|
+
this.drawBetterButton(item.position, item.size, item.label, item.color, item.image, item.disabled);
|
|
120
|
+
break;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
GuiSubscreen.START_X = GuiSubscreen.POS_BAK;
|
|
124
|
+
MainCanvas.textAlign = GuiSubscreen.TEXT_ALIGN_BAK;
|
|
125
|
+
}
|
|
126
|
+
Click() {
|
|
127
|
+
GuiSubscreen.POS_BAK = GuiSubscreen.START_X;
|
|
128
|
+
GuiSubscreen.TEXT_ALIGN_BAK = MainCanvas.textAlign;
|
|
129
|
+
GuiSubscreen.START_X = 550;
|
|
130
|
+
MainCanvas.textAlign = "left";
|
|
131
|
+
if (MouseIn(1815, 75, 90, 90))
|
|
132
|
+
return this.Exit();
|
|
133
|
+
if (this.multipageStructure.length > 1)
|
|
134
|
+
PreferencePageChangeClick(1595, 75, this.multipageStructure.length);
|
|
135
|
+
this.structure.forEach((item, ix, arr) => {
|
|
136
|
+
switch (item.type) {
|
|
137
|
+
case "checkbox":
|
|
138
|
+
if (MouseIn(this.getXPos(ix) + 600, this.getYPos(ix) - 32, 64, 64) && !item.disabled) {
|
|
139
|
+
item.setSetting(!item.setting());
|
|
140
|
+
}
|
|
141
|
+
break;
|
|
142
|
+
case "button":
|
|
143
|
+
if (MouseIn(item.position[0], item.position[1], item.size[0], item.size[1]))
|
|
144
|
+
item.callback();
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
GuiSubscreen.START_X = GuiSubscreen.POS_BAK;
|
|
149
|
+
MainCanvas.textAlign = GuiSubscreen.TEXT_ALIGN_BAK;
|
|
150
|
+
}
|
|
151
|
+
Exit() {
|
|
152
|
+
this.multipageStructure.forEach((s) => s.forEach((item) => {
|
|
153
|
+
switch (item.type) {
|
|
154
|
+
case "number":
|
|
155
|
+
if (!CommonIsNumeric(ElementValue(item.id))) {
|
|
156
|
+
ElementRemove(item.id);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case "text":
|
|
160
|
+
item.setSetting(ElementValue(item.id));
|
|
161
|
+
ElementRemove(item.id);
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
}));
|
|
165
|
+
CharacterAppearanceForceUpCharacter = -1;
|
|
166
|
+
CharacterLoadCanvas(Player);
|
|
167
|
+
setSubscreen("mainmenu");
|
|
168
|
+
dataStore(GUI.modName);
|
|
169
|
+
}
|
|
170
|
+
Unload() {
|
|
171
|
+
}
|
|
172
|
+
tooltip(text) {
|
|
173
|
+
drawTooltip(300, 850, 1400, text, "left");
|
|
174
|
+
}
|
|
175
|
+
drawCheckbox(label, description, value, order, disabled = false) {
|
|
176
|
+
var isHovering = MouseIn(this.getXPos(order), this.getYPos(order) - 32, 600, 64);
|
|
177
|
+
DrawCheckbox(this.getXPos(order) + 600, this.getYPos(order) - 32, 64, 64, "", value ?? false, disabled);
|
|
178
|
+
}
|
|
179
|
+
drawBetterButton(position, size, label, color, image = "", disabled = false) {
|
|
180
|
+
var isHovering = MouseIn(position[0], position[1] - 32, size[0], size[1]);
|
|
181
|
+
DrawButton(position[0], position[1], size[0], size[1], "", color, "", "", disabled);
|
|
182
|
+
DrawImageResize(image, position[0] + 10, position[1] + 10, 60, 60);
|
|
183
|
+
}
|
|
184
|
+
drawButton(label, color, order, XOffset, disabled = false) {
|
|
185
|
+
var isHovering = MouseIn(this.getXPos(order) + XOffset, this.getYPos(order) - 32, 200, 64);
|
|
186
|
+
DrawButton(this.getXPos(order) + XOffset, this.getYPos(order) - 32, 200, 64, "", color, "", "", disabled);
|
|
187
|
+
}
|
|
188
|
+
elementHide(elementId) {
|
|
189
|
+
ElementPosition(elementId, -999, -999, 1, 1);
|
|
190
|
+
}
|
|
191
|
+
elementPosition(elementId, label, description, order, disabled = false) {
|
|
192
|
+
var isHovering = MouseIn(this.getXPos(order), this.getYPos(order) - 32, 600, 64);
|
|
193
|
+
ElementPosition(elementId, this.getXPos(order) + 750 + 225, this.getYPos(order), 800, 64);
|
|
194
|
+
if (disabled)
|
|
195
|
+
ElementSetAttribute(elementId, "disabled", "true");
|
|
196
|
+
if (!disabled)
|
|
197
|
+
document.getElementById(elementId)?.removeAttribute("disabled");
|
|
198
|
+
}
|
|
199
|
+
drawLabel(label, description, order) {
|
|
200
|
+
var isHovering = MouseIn(this.getXPos(order), this.getYPos(order) - 32, 600, 64);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
function drawTooltip(x, y, width, text, align) {
|
|
204
|
+
const bak = MainCanvas.textAlign;
|
|
205
|
+
MainCanvas.textAlign = align;
|
|
206
|
+
DrawRect(x, y, width, 65, "#ffff88");
|
|
207
|
+
DrawEmptyRect(x, y, width, 65, "Black");
|
|
208
|
+
DrawTextFit(text, align === "left" ? x + 3 : x + width / 2, y + 33, width - 6, "black");
|
|
209
|
+
MainCanvas.textAlign = bak;
|
|
210
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BaseModule } from "./BaseModule.js";
|
|
2
|
+
export declare const modulesMap: Map<string, BaseModule>;
|
|
3
|
+
export declare function modules(): BaseModule[];
|
|
4
|
+
export declare function registerModule<T extends BaseModule>(module: T): T;
|
|
5
|
+
export declare function getModule<T extends BaseModule>(moduleType: string): T;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const modulesMap = new Map();
|
|
2
|
+
export function modules() {
|
|
3
|
+
return [...modulesMap.values()];
|
|
4
|
+
}
|
|
5
|
+
export function registerModule(module) {
|
|
6
|
+
modulesMap.set(module.constructor.name, module);
|
|
7
|
+
return module;
|
|
8
|
+
}
|
|
9
|
+
export function getModule(moduleType) {
|
|
10
|
+
return modulesMap.get(moduleType);
|
|
11
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { BaseModule } from "./BaseModule.js";
|
|
2
|
+
import { GuiSubscreen } from "./BaseSetting.js";
|
|
3
|
+
export declare const SETTING_FUNC_PREFIX: string;
|
|
4
|
+
export declare const SETTING_NAME_PREFIX: string;
|
|
5
|
+
export declare const SETTING_FUNC_NAMES: string[];
|
|
6
|
+
export type Subscreen = new (module: BaseModule) => GuiSubscreen;
|
|
7
|
+
export declare function getCurrentSubscreen(): GuiSubscreen | null;
|
|
8
|
+
export declare function setSubscreen(subscreen: GuiSubscreen | string | null): GuiSubscreen | null;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GUI } from "./SettingUtils.js";
|
|
2
|
+
export const SETTING_FUNC_PREFIX = "PreferenceSubscreen";
|
|
3
|
+
export const SETTING_NAME_PREFIX = "BCR";
|
|
4
|
+
export const SETTING_FUNC_NAMES = ["Load", "Run", "Click", "Unload", "Exit"];
|
|
5
|
+
export function getCurrentSubscreen() {
|
|
6
|
+
return GUI.instance && GUI.instance.currentSubscreen;
|
|
7
|
+
}
|
|
8
|
+
export function setSubscreen(subscreen) {
|
|
9
|
+
if (!GUI.instance) {
|
|
10
|
+
throw new Error("Attempt to set subscreen before init");
|
|
11
|
+
}
|
|
12
|
+
GUI.instance.currentSubscreen = subscreen;
|
|
13
|
+
return GUI.instance.currentSubscreen;
|
|
14
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { BaseModule } from "./BaseModule.js";
|
|
2
|
+
import { GuiSubscreen } from "./BaseSetting.js";
|
|
3
|
+
import { MainMenu } from '../Screens/MainMenu.js';
|
|
4
|
+
export declare class GUI extends BaseModule {
|
|
5
|
+
static instance: GUI | null;
|
|
6
|
+
static modName: string | null;
|
|
7
|
+
private _subscreens;
|
|
8
|
+
private _mainMenu;
|
|
9
|
+
private _currentSubscreen;
|
|
10
|
+
get subscreens(): GuiSubscreen[];
|
|
11
|
+
get mainMenu(): MainMenu;
|
|
12
|
+
get currentSubscreen(): GuiSubscreen | null;
|
|
13
|
+
set currentSubscreen(subscreen: GuiSubscreen | string | null);
|
|
14
|
+
get currentCharacter(): Character;
|
|
15
|
+
constructor(ModName: string);
|
|
16
|
+
get defaultSettings(): null;
|
|
17
|
+
Load(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { BaseModule } from "./BaseModule.js";
|
|
2
|
+
import { modules } from "./Modules.js";
|
|
3
|
+
import { SETTING_NAME_PREFIX } from "./SettingDefinitions.js";
|
|
4
|
+
import { MainMenu } from '../Screens/MainMenu.js';
|
|
5
|
+
export class GUI extends BaseModule {
|
|
6
|
+
static instance = null;
|
|
7
|
+
static modName = null;
|
|
8
|
+
_subscreens;
|
|
9
|
+
_mainMenu;
|
|
10
|
+
_currentSubscreen = null;
|
|
11
|
+
get subscreens() {
|
|
12
|
+
return this._subscreens;
|
|
13
|
+
}
|
|
14
|
+
get mainMenu() {
|
|
15
|
+
return this._mainMenu;
|
|
16
|
+
}
|
|
17
|
+
get currentSubscreen() {
|
|
18
|
+
return this._currentSubscreen;
|
|
19
|
+
}
|
|
20
|
+
set currentSubscreen(subscreen) {
|
|
21
|
+
if (this._currentSubscreen) {
|
|
22
|
+
this._currentSubscreen.Unload();
|
|
23
|
+
}
|
|
24
|
+
if (typeof subscreen === "string") {
|
|
25
|
+
const scr = this._subscreens?.find((s) => s.name === subscreen);
|
|
26
|
+
if (!scr)
|
|
27
|
+
throw `Failed to find screen name ${subscreen}`;
|
|
28
|
+
this._currentSubscreen = scr;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this._currentSubscreen = subscreen;
|
|
32
|
+
}
|
|
33
|
+
PreferenceMessage = "";
|
|
34
|
+
PreferencePageCurrent = 1;
|
|
35
|
+
let subscreenName = "";
|
|
36
|
+
if (this._currentSubscreen) {
|
|
37
|
+
subscreenName = SETTING_NAME_PREFIX + this._currentSubscreen?.name;
|
|
38
|
+
this._currentSubscreen.Load();
|
|
39
|
+
}
|
|
40
|
+
PreferenceSubscreen = subscreenName;
|
|
41
|
+
}
|
|
42
|
+
get currentCharacter() {
|
|
43
|
+
return Player;
|
|
44
|
+
}
|
|
45
|
+
constructor(ModName) {
|
|
46
|
+
super();
|
|
47
|
+
if (GUI.instance) {
|
|
48
|
+
throw new Error("Duplicate initialization");
|
|
49
|
+
}
|
|
50
|
+
this._mainMenu = new MainMenu(this);
|
|
51
|
+
this._subscreens = [this._mainMenu];
|
|
52
|
+
GUI.modName = ModName;
|
|
53
|
+
GUI.instance = this;
|
|
54
|
+
}
|
|
55
|
+
get defaultSettings() {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
Load() {
|
|
59
|
+
for (const module of modules()) {
|
|
60
|
+
if (!module.settingsScreen)
|
|
61
|
+
continue;
|
|
62
|
+
this._subscreens.push(new module.settingsScreen(module));
|
|
63
|
+
}
|
|
64
|
+
this._mainMenu.subscreens = this._subscreens;
|
|
65
|
+
}
|
|
66
|
+
}
|
package/dist/DeepLib.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { GuiSubscreen } from '../Base/BaseSetting.js';
|
|
2
|
+
import { GUI } from '../Base/SettingUtils.js';
|
|
3
|
+
export declare class MainMenu extends GuiSubscreen {
|
|
4
|
+
subscreens: GuiSubscreen[];
|
|
5
|
+
get name(): string;
|
|
6
|
+
constructor(module: GUI);
|
|
7
|
+
Load(): void;
|
|
8
|
+
Run(): void;
|
|
9
|
+
Click(): void;
|
|
10
|
+
Exit(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { GuiSubscreen } from '../Base/BaseSetting.js';
|
|
2
|
+
import { GUI } from '../Base/SettingUtils.js';
|
|
3
|
+
export class MainMenu extends GuiSubscreen {
|
|
4
|
+
subscreens = [];
|
|
5
|
+
get name() {
|
|
6
|
+
return 'mainmenu';
|
|
7
|
+
}
|
|
8
|
+
constructor(module) {
|
|
9
|
+
super(module);
|
|
10
|
+
this.subscreens = module.subscreens;
|
|
11
|
+
}
|
|
12
|
+
Load() {
|
|
13
|
+
if (!GUI.instance?.currentSubscreen) {
|
|
14
|
+
this.setSubscreen(this);
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
super.Load();
|
|
18
|
+
}
|
|
19
|
+
Run() {
|
|
20
|
+
let tmp = GuiSubscreen.START_X;
|
|
21
|
+
var prev = MainCanvas.textAlign;
|
|
22
|
+
GuiSubscreen.START_X = 550;
|
|
23
|
+
MainCanvas.textAlign = 'left';
|
|
24
|
+
DrawCharacter(Player, 50, 50, 0.9, false);
|
|
25
|
+
DrawButton(1815, 75, 90, 90, '', 'White', 'Icons/Exit.png');
|
|
26
|
+
MainCanvas.textAlign = 'center';
|
|
27
|
+
let i = 0;
|
|
28
|
+
for (const screen of this.subscreens) {
|
|
29
|
+
const PX = Math.floor(i / 6);
|
|
30
|
+
const PY = i % 6;
|
|
31
|
+
if (screen.name == 'mainmenu')
|
|
32
|
+
continue;
|
|
33
|
+
DrawButton(GuiSubscreen.START_X + 430 * PX, 190 + 120 * PY, 450, 90, '', 'White', '', '');
|
|
34
|
+
DrawImageResize(screen.icon, GuiSubscreen.START_X + 430 * PX + 10, 190 + 120 * PY + 10, 70, 70);
|
|
35
|
+
MainCanvas.textAlign = 'left';
|
|
36
|
+
MainCanvas.textAlign = 'center';
|
|
37
|
+
i++;
|
|
38
|
+
MainCanvas.textAlign = 'left';
|
|
39
|
+
}
|
|
40
|
+
DrawButton(1500, 630, 405, 80, '', 'IndianRed');
|
|
41
|
+
DrawImageResize('Icons/ServiceBell.png', 1510, 640, 60, 60);
|
|
42
|
+
DrawTextFit('Reset', 1580, 670, 320, 'Black');
|
|
43
|
+
DrawButton(1500, 730, 405, 80, '', '#BDA203', '', 'Open Responsive Wiki on GitHub.', false);
|
|
44
|
+
DrawImageResize('Icons/Introduction.png', 1510, 740, 60, 60);
|
|
45
|
+
DrawTextFit('Wiki', 1580, 770, 320, 'Black');
|
|
46
|
+
DrawButton(1500, 830, 405, 80, '', '#49225C');
|
|
47
|
+
DrawImageResize('Assets/Female3DCG/Emoticon/Coffee/Icon.png', 1510, 840, 60, 60);
|
|
48
|
+
DrawTextFit('Support Me❤', 1580, 870, 320, 'Black');
|
|
49
|
+
GuiSubscreen.START_X = tmp;
|
|
50
|
+
MainCanvas.textAlign = prev;
|
|
51
|
+
}
|
|
52
|
+
Click() {
|
|
53
|
+
if (MouseIn(1815, 75, 90, 90))
|
|
54
|
+
return this.Exit();
|
|
55
|
+
let tmp = GuiSubscreen.START_X;
|
|
56
|
+
GuiSubscreen.START_X = 550;
|
|
57
|
+
let i = 0;
|
|
58
|
+
for (const screen of this.subscreens) {
|
|
59
|
+
const PX = Math.floor(i / 6);
|
|
60
|
+
const PY = i % 6;
|
|
61
|
+
if (screen.name == 'mainmenu')
|
|
62
|
+
continue;
|
|
63
|
+
if (MouseIn(GuiSubscreen.START_X + 430 * PX, 190 + 120 * PY, 450, 90)) {
|
|
64
|
+
this.setSubscreen(screen);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
i++;
|
|
68
|
+
}
|
|
69
|
+
GuiSubscreen.START_X = tmp;
|
|
70
|
+
}
|
|
71
|
+
Exit() {
|
|
72
|
+
CharacterAppearanceForceUpCharacter = -1;
|
|
73
|
+
CharacterLoadCanvas(Player);
|
|
74
|
+
this.setSubscreen(null);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GuiSubscreen } from '../Base/BaseSetting.js';
|
|
2
|
+
export declare class GuiSupport extends GuiSubscreen {
|
|
3
|
+
private static thankYouList;
|
|
4
|
+
private static thankYouNext;
|
|
5
|
+
private static thankYou;
|
|
6
|
+
get name(): string;
|
|
7
|
+
get structure(): any[];
|
|
8
|
+
static getSupporter(): string;
|
|
9
|
+
static doNextThankYou(): void;
|
|
10
|
+
Load(): void;
|
|
11
|
+
Run(): void;
|
|
12
|
+
Click(): void;
|
|
13
|
+
Exit(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { GuiSubscreen } from '../Base/BaseSetting.js';
|
|
2
|
+
export class GuiSupport extends GuiSubscreen {
|
|
3
|
+
static thankYouList = ['Ellena'];
|
|
4
|
+
static thankYouNext = 0;
|
|
5
|
+
static thankYou = '';
|
|
6
|
+
get name() {
|
|
7
|
+
return 'Support';
|
|
8
|
+
}
|
|
9
|
+
get structure() {
|
|
10
|
+
return [
|
|
11
|
+
{
|
|
12
|
+
type: 'button',
|
|
13
|
+
position: [GuiSubscreen.START_X, GuiSubscreen.START_Y],
|
|
14
|
+
size: [405, 80],
|
|
15
|
+
label: 'support.button.ko-fi',
|
|
16
|
+
color: '#49225C',
|
|
17
|
+
image: 'https://storage.ko-fi.com/cdn/nav-logo-stroke.png',
|
|
18
|
+
disabled: false,
|
|
19
|
+
callback() {
|
|
20
|
+
window.open('https://ko-fi.com/monikka_bc', '_blank');
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: 'any',
|
|
25
|
+
position: [GuiSubscreen.START_X, GuiSubscreen.START_Y + GuiSubscreen.Y_MOD + 20],
|
|
26
|
+
size: [405, 80],
|
|
27
|
+
label: 'support.button.patreon',
|
|
28
|
+
color: '#49225C',
|
|
29
|
+
image: 'https://c5.patreon.com/external/favicon/rebrand/favicon-32.png?v=af5597c2ef',
|
|
30
|
+
disabled: false,
|
|
31
|
+
callback() {
|
|
32
|
+
window.open('https://patreon.com/monikka_bc', '_blank');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
static getSupporter() {
|
|
38
|
+
if (GuiSupport.thankYouNext < CommonTime())
|
|
39
|
+
GuiSupport.doNextThankYou();
|
|
40
|
+
return `${'support.other.thankyou'}, ${GuiSupport.thankYou}`;
|
|
41
|
+
}
|
|
42
|
+
static doNextThankYou() {
|
|
43
|
+
if (GuiSupport.thankYou && GuiSupport.thankYouList.length < 2)
|
|
44
|
+
return;
|
|
45
|
+
GuiSupport.thankYou = CommonRandomItemFromList(GuiSupport.thankYou, GuiSupport.thankYouList);
|
|
46
|
+
GuiSupport.thankYouNext = CommonTime() + 4000;
|
|
47
|
+
}
|
|
48
|
+
Load() {
|
|
49
|
+
GuiSupport.doNextThankYou();
|
|
50
|
+
ElementCreateDiv('ResponsiveGratitude');
|
|
51
|
+
let elm = document.getElementById('ResponsiveGratitude');
|
|
52
|
+
ElementContent('ResponsiveGratitude', gratitudeHtml);
|
|
53
|
+
const font = MainCanvas.canvas.clientWidth <= MainCanvas.canvas.clientHeight * 2
|
|
54
|
+
? MainCanvas.canvas.clientWidth / 50
|
|
55
|
+
: MainCanvas.canvas.clientHeight / 25;
|
|
56
|
+
Object.assign(elm.style, {
|
|
57
|
+
fontFamily: CommonGetFontName(),
|
|
58
|
+
fontSize: font + 'px'
|
|
59
|
+
});
|
|
60
|
+
super.Load();
|
|
61
|
+
}
|
|
62
|
+
Run() {
|
|
63
|
+
super.Run();
|
|
64
|
+
let tmp = GuiSubscreen.START_X;
|
|
65
|
+
GuiSubscreen.START_X = 550;
|
|
66
|
+
DrawText(GuiSupport.getSupporter(), GuiSubscreen.START_X + 300, GuiSubscreen.START_Y - GuiSubscreen.Y_MOD, 'Black', '#D7F6E9');
|
|
67
|
+
GuiSubscreen.START_X = tmp;
|
|
68
|
+
}
|
|
69
|
+
Click() {
|
|
70
|
+
super.Click();
|
|
71
|
+
}
|
|
72
|
+
Exit() {
|
|
73
|
+
ElementRemove('ResponsiveGratitude');
|
|
74
|
+
super.Exit();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const gratitudeHtml = `
|
|
78
|
+
<h1 class="ResponsiveH">Dear Supporters!</h1>
|
|
79
|
+
<p class="ResponsiveP">
|
|
80
|
+
I want to take a moment to express my heartfelt gratitude for considering supporting me. Your willingness to stand by
|
|
81
|
+
my side in this creative journey means the world to me, and I am truly humbled by your generosity.
|
|
82
|
+
</p>
|
|
83
|
+
<p class="ResponsiveP">
|
|
84
|
+
Your support goes far beyond the financial contributions; it represents belief in my work and a shared passion for
|
|
85
|
+
what I do. Your encouragement inspires me to continue developing.
|
|
86
|
+
</p>
|
|
87
|
+
<p class="ResponsiveP">
|
|
88
|
+
Your support not only helps me sustain and grow as a developer, but also enables me to dedicate more time and
|
|
89
|
+
resources to producing high-quality mods. It allows me to explore new ideas, enhance my skills, and bring even more
|
|
90
|
+
meaningful and enjoyable content to you.
|
|
91
|
+
</p>
|
|
92
|
+
<p class="ResponsiveP">Thank you all~</p>
|
|
93
|
+
<p class="ResponsiveP">With love, Monikka♥</p>
|
|
94
|
+
`;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { modules } from '../DeepLib.js';
|
|
2
|
+
import { _String } from "./String.js";
|
|
3
|
+
export const PlayerStorage = (modName) => Player[modName];
|
|
4
|
+
export const ExtensionStorage = (modName) => Player.ExtensionSettings[modName];
|
|
5
|
+
export function dataTake(modName) {
|
|
6
|
+
if (ExtensionStorage(modName)) {
|
|
7
|
+
Player[modName] = JSON.parse(LZString.decompressFromBase64(ExtensionStorage(modName)));
|
|
8
|
+
}
|
|
9
|
+
else {
|
|
10
|
+
Player[modName] = {};
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function dataStore(modName) {
|
|
14
|
+
if (!ExtensionStorage(modName))
|
|
15
|
+
Player.ExtensionSettings[modName] = "";
|
|
16
|
+
let Data = {
|
|
17
|
+
Version: "1.0.0"
|
|
18
|
+
};
|
|
19
|
+
for (let module of modules()) {
|
|
20
|
+
if (!module.settingsStorage)
|
|
21
|
+
continue;
|
|
22
|
+
Data[module.settingsStorage] = PlayerStorage(modName)[module.settingsStorage];
|
|
23
|
+
}
|
|
24
|
+
;
|
|
25
|
+
Player.ExtensionSettings[modName] = _String.encode(Data);
|
|
26
|
+
ServerPlayerExtensionSettingsSync(modName);
|
|
27
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export class _String {
|
|
2
|
+
static encode(string) {
|
|
3
|
+
return LZString.compressToBase64(JSON.stringify(string));
|
|
4
|
+
}
|
|
5
|
+
static decode(string) {
|
|
6
|
+
let d = LZString.decompressFromBase64(string);
|
|
7
|
+
let data = {};
|
|
8
|
+
try {
|
|
9
|
+
let decoded = JSON.parse(d);
|
|
10
|
+
data = decoded;
|
|
11
|
+
}
|
|
12
|
+
catch { }
|
|
13
|
+
if (data)
|
|
14
|
+
return data;
|
|
15
|
+
}
|
|
16
|
+
static shuffle(string) {
|
|
17
|
+
let temp = JSON.parse(JSON.stringify(string));
|
|
18
|
+
let ret = [];
|
|
19
|
+
while (temp.length > 0) {
|
|
20
|
+
let d = Math.floor(Math.random() * temp.length);
|
|
21
|
+
ret.push(temp[d]);
|
|
22
|
+
temp.splice(d, 1);
|
|
23
|
+
}
|
|
24
|
+
return ret;
|
|
25
|
+
}
|
|
26
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bc-deeplib",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"author": "dDeepLb",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"module": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"type": "module",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist",
|
|
11
|
+
"LICENSE",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"prepare": "tsc"
|
|
16
|
+
},
|
|
17
|
+
"dependencies": {
|
|
18
|
+
"bondage-club-mod-sdk": "^1.1.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^20.11.19",
|
|
22
|
+
"lz-string": "^1.5.0",
|
|
23
|
+
"typescript": "^5.3.3",
|
|
24
|
+
"bc-stubs": "github:bananarama92/BC-stubs"
|
|
25
|
+
},
|
|
26
|
+
"description": "Package for easier development of BC mods without need to repeat myself in every mod",
|
|
27
|
+
"main": "index.js"
|
|
28
|
+
}
|