sliver-engine 0.0.1-alpha-4
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/README.md +37 -0
- package/dist/Assets/Shapes/Arrow.d.ts +12 -0
- package/dist/Assets/Shapes/Arrow.d.ts.map +1 -0
- package/dist/Assets/Shapes/Arrow.js +32 -0
- package/dist/Assets/Shapes/Arrow.js.map +1 -0
- package/dist/Assets/Shapes/index.d.ts +4 -0
- package/dist/Assets/Shapes/index.d.ts.map +1 -0
- package/dist/Assets/Shapes/index.js +2 -0
- package/dist/Assets/Shapes/index.js.map +1 -0
- package/dist/CanvasController/SpriteLibrary.d.ts +58 -0
- package/dist/CanvasController/SpriteLibrary.d.ts.map +1 -0
- package/dist/CanvasController/SpriteLibrary.js +412 -0
- package/dist/CanvasController/SpriteLibrary.js.map +1 -0
- package/dist/CanvasController/Transformations.d.ts +5 -0
- package/dist/CanvasController/Transformations.d.ts.map +1 -0
- package/dist/CanvasController/Transformations.js +19 -0
- package/dist/CanvasController/Transformations.js.map +1 -0
- package/dist/CanvasController/index.d.ts +238 -0
- package/dist/CanvasController/index.d.ts.map +1 -0
- package/dist/CanvasController/index.js +418 -0
- package/dist/CanvasController/index.js.map +1 -0
- package/dist/Context/index.d.ts +53 -0
- package/dist/Context/index.d.ts.map +1 -0
- package/dist/Context/index.js +103 -0
- package/dist/Context/index.js.map +1 -0
- package/dist/Events/decorators.d.ts +74 -0
- package/dist/Events/decorators.d.ts.map +1 -0
- package/dist/Events/decorators.js +417 -0
- package/dist/Events/decorators.js.map +1 -0
- package/dist/Events/index.d.ts +50 -0
- package/dist/Events/index.d.ts.map +1 -0
- package/dist/Events/index.js +73 -0
- package/dist/Events/index.js.map +1 -0
- package/dist/Events/keyAccumulator.d.ts +9 -0
- package/dist/Events/keyAccumulator.d.ts.map +1 -0
- package/dist/Events/keyAccumulator.js +17 -0
- package/dist/Events/keyAccumulator.js.map +1 -0
- package/dist/Game/Saves/index.d.ts +39 -0
- package/dist/Game/Saves/index.d.ts.map +1 -0
- package/dist/Game/Saves/index.js +213 -0
- package/dist/Game/Saves/index.js.map +1 -0
- package/dist/Game/index.d.ts +45 -0
- package/dist/Game/index.d.ts.map +1 -0
- package/dist/Game/index.js +101 -0
- package/dist/Game/index.js.map +1 -0
- package/dist/GameObject/Decorators/index.d.ts +81 -0
- package/dist/GameObject/Decorators/index.d.ts.map +1 -0
- package/dist/GameObject/Decorators/index.js +183 -0
- package/dist/GameObject/Decorators/index.js.map +1 -0
- package/dist/GameObject/Hitboxes/ColisionHandler.d.ts +23 -0
- package/dist/GameObject/Hitboxes/ColisionHandler.d.ts.map +1 -0
- package/dist/GameObject/Hitboxes/ColisionHandler.js +458 -0
- package/dist/GameObject/Hitboxes/ColisionHandler.js.map +1 -0
- package/dist/GameObject/Hitboxes/index.d.ts +50 -0
- package/dist/GameObject/Hitboxes/index.d.ts.map +1 -0
- package/dist/GameObject/Hitboxes/index.js +306 -0
- package/dist/GameObject/Hitboxes/index.js.map +1 -0
- package/dist/GameObject/Library/Button.d.ts +15 -0
- package/dist/GameObject/Library/Button.d.ts.map +1 -0
- package/dist/GameObject/Library/Button.js +45 -0
- package/dist/GameObject/Library/Button.js.map +1 -0
- package/dist/GameObject/Library/Clickableshape.d.ts +14 -0
- package/dist/GameObject/Library/Clickableshape.d.ts.map +1 -0
- package/dist/GameObject/Library/Clickableshape.js +36 -0
- package/dist/GameObject/Library/Clickableshape.js.map +1 -0
- package/dist/GameObject/Library/FloatingView.d.ts +20 -0
- package/dist/GameObject/Library/FloatingView.d.ts.map +1 -0
- package/dist/GameObject/Library/FloatingView.js +39 -0
- package/dist/GameObject/Library/FloatingView.js.map +1 -0
- package/dist/GameObject/Library/Group.d.ts +8 -0
- package/dist/GameObject/Library/Group.d.ts.map +1 -0
- package/dist/GameObject/Library/Group.js +26 -0
- package/dist/GameObject/Library/Group.js.map +1 -0
- package/dist/GameObject/Library/HoverableShape.d.ts +15 -0
- package/dist/GameObject/Library/HoverableShape.d.ts.map +1 -0
- package/dist/GameObject/Library/HoverableShape.js +41 -0
- package/dist/GameObject/Library/HoverableShape.js.map +1 -0
- package/dist/GameObject/Library/SceneTranslator.d.ts +14 -0
- package/dist/GameObject/Library/SceneTranslator.d.ts.map +1 -0
- package/dist/GameObject/Library/SceneTranslator.js +104 -0
- package/dist/GameObject/Library/SceneTranslator.js.map +1 -0
- package/dist/GameObject/Library/ScrollView.d.ts +41 -0
- package/dist/GameObject/Library/ScrollView.d.ts.map +1 -0
- package/dist/GameObject/Library/ScrollView.js +112 -0
- package/dist/GameObject/Library/ScrollView.js.map +1 -0
- package/dist/GameObject/Library/ShowOnHover.d.ts +13 -0
- package/dist/GameObject/Library/ShowOnHover.d.ts.map +1 -0
- package/dist/GameObject/Library/ShowOnHover.js +33 -0
- package/dist/GameObject/Library/ShowOnHover.js.map +1 -0
- package/dist/GameObject/Library/Text.d.ts +25 -0
- package/dist/GameObject/Library/Text.d.ts.map +1 -0
- package/dist/GameObject/Library/Text.js +35 -0
- package/dist/GameObject/Library/Text.js.map +1 -0
- package/dist/GameObject/Library/TextBox.d.ts +45 -0
- package/dist/GameObject/Library/TextBox.d.ts.map +1 -0
- package/dist/GameObject/Library/TextBox.js +170 -0
- package/dist/GameObject/Library/TextBox.js.map +1 -0
- package/dist/GameObject/Library/index.d.ts +11 -0
- package/dist/GameObject/Library/index.d.ts.map +1 -0
- package/dist/GameObject/Library/index.js +11 -0
- package/dist/GameObject/Library/index.js.map +1 -0
- package/dist/GameObject/Walker.d.ts +91 -0
- package/dist/GameObject/Walker.d.ts.map +1 -0
- package/dist/GameObject/Walker.js +634 -0
- package/dist/GameObject/Walker.js.map +1 -0
- package/dist/GameObject/index.d.ts +97 -0
- package/dist/GameObject/index.d.ts.map +1 -0
- package/dist/GameObject/index.js +386 -0
- package/dist/GameObject/index.js.map +1 -0
- package/dist/Lib/Math.d.ts +2 -0
- package/dist/Lib/Math.d.ts.map +1 -0
- package/dist/Lib/Math.js +4 -0
- package/dist/Lib/Math.js.map +1 -0
- package/dist/Lib/MinHeap/index.d.ts +12 -0
- package/dist/Lib/MinHeap/index.d.ts.map +1 -0
- package/dist/Lib/MinHeap/index.js +64 -0
- package/dist/Lib/MinHeap/index.js.map +1 -0
- package/dist/Lib/Mixins/index.d.ts +8 -0
- package/dist/Lib/Mixins/index.d.ts.map +1 -0
- package/dist/Lib/Mixins/index.js +45 -0
- package/dist/Lib/Mixins/index.js.map +1 -0
- package/dist/Lib/PathfindingProxy/index.d.ts +16 -0
- package/dist/Lib/PathfindingProxy/index.d.ts.map +1 -0
- package/dist/Lib/PathfindingProxy/index.js +48 -0
- package/dist/Lib/PathfindingProxy/index.js.map +1 -0
- package/dist/Lib/Vector/index.d.ts +24 -0
- package/dist/Lib/Vector/index.d.ts.map +1 -0
- package/dist/Lib/Vector/index.js +94 -0
- package/dist/Lib/Vector/index.js.map +1 -0
- package/dist/Lib/index.d.ts +6 -0
- package/dist/Lib/index.d.ts.map +1 -0
- package/dist/Lib/index.js +6 -0
- package/dist/Lib/index.js.map +1 -0
- package/dist/Scenes/SceneManager/Transitions.d.ts +37 -0
- package/dist/Scenes/SceneManager/Transitions.d.ts.map +1 -0
- package/dist/Scenes/SceneManager/Transitions.js +165 -0
- package/dist/Scenes/SceneManager/Transitions.js.map +1 -0
- package/dist/Scenes/SceneManager/index.d.ts +24 -0
- package/dist/Scenes/SceneManager/index.d.ts.map +1 -0
- package/dist/Scenes/SceneManager/index.js +151 -0
- package/dist/Scenes/SceneManager/index.js.map +1 -0
- package/dist/Scenes/index.d.ts +44 -0
- package/dist/Scenes/index.d.ts.map +1 -0
- package/dist/Scenes/index.js +252 -0
- package/dist/Scenes/index.js.map +1 -0
- package/dist/ScriptedEvents/Combinators/index.d.ts +17 -0
- package/dist/ScriptedEvents/Combinators/index.d.ts.map +1 -0
- package/dist/ScriptedEvents/Combinators/index.js +127 -0
- package/dist/ScriptedEvents/Combinators/index.js.map +1 -0
- package/dist/ScriptedEvents/Library/TextBoxSequence.d.ts +7 -0
- package/dist/ScriptedEvents/Library/TextBoxSequence.d.ts.map +1 -0
- package/dist/ScriptedEvents/Library/TextBoxSequence.js +16 -0
- package/dist/ScriptedEvents/Library/TextBoxSequence.js.map +1 -0
- package/dist/ScriptedEvents/Library/WaitForKeyPress.d.ts +2 -0
- package/dist/ScriptedEvents/Library/WaitForKeyPress.d.ts.map +1 -0
- package/dist/ScriptedEvents/Library/WaitForKeyPress.js +1 -0
- package/dist/ScriptedEvents/Library/WaitForKeyPress.js.map +1 -0
- package/dist/ScriptedEvents/Library/WalkCharacter.d.ts +4 -0
- package/dist/ScriptedEvents/Library/WalkCharacter.d.ts.map +1 -0
- package/dist/ScriptedEvents/Library/WalkCharacter.js +14 -0
- package/dist/ScriptedEvents/Library/WalkCharacter.js.map +1 -0
- package/dist/ScriptedEvents/Library/index.d.ts +3 -0
- package/dist/ScriptedEvents/Library/index.d.ts.map +1 -0
- package/dist/ScriptedEvents/Library/index.js +3 -0
- package/dist/ScriptedEvents/Library/index.js.map +1 -0
- package/dist/ScriptedEvents/index.d.ts +42 -0
- package/dist/ScriptedEvents/index.d.ts.map +1 -0
- package/dist/ScriptedEvents/index.js +61 -0
- package/dist/ScriptedEvents/index.js.map +1 -0
- package/dist/SoundManager/index.d.ts +69 -0
- package/dist/SoundManager/index.d.ts.map +1 -0
- package/dist/SoundManager/index.js +208 -0
- package/dist/SoundManager/index.js.map +1 -0
- package/dist/index.d.ts +19 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
const getLocalStorage = () => {
|
|
2
|
+
if (typeof window === "undefined") {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
try {
|
|
6
|
+
return window.localStorage ?? null;
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const encodeUtf8ToBase64 = (value) => {
|
|
13
|
+
// Prefer Node/Bun (tests, tooling) if available.
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
15
|
+
const maybeBuffer = globalThis.Buffer;
|
|
16
|
+
if (maybeBuffer) {
|
|
17
|
+
return maybeBuffer.from(value, "utf-8").toString("base64");
|
|
18
|
+
}
|
|
19
|
+
if (typeof TextEncoder !== "undefined" && typeof btoa !== "undefined") {
|
|
20
|
+
const bytes = new TextEncoder().encode(value);
|
|
21
|
+
let binary = "";
|
|
22
|
+
const chunkSize = 0x8000;
|
|
23
|
+
for (let i = 0; i < bytes.length; i += chunkSize) {
|
|
24
|
+
const chunk = bytes.subarray(i, i + chunkSize);
|
|
25
|
+
binary += String.fromCharCode(...chunk);
|
|
26
|
+
}
|
|
27
|
+
return btoa(binary);
|
|
28
|
+
}
|
|
29
|
+
if (typeof btoa !== "undefined") {
|
|
30
|
+
return btoa(unescape(encodeURIComponent(value)));
|
|
31
|
+
}
|
|
32
|
+
throw new Error("Base64 encoding is not available in this environment.");
|
|
33
|
+
};
|
|
34
|
+
const decodeBase64ToUtf8 = (base64) => {
|
|
35
|
+
// Prefer Node/Bun (tests, tooling) if available.
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
const maybeBuffer = globalThis.Buffer;
|
|
38
|
+
if (maybeBuffer) {
|
|
39
|
+
return maybeBuffer.from(base64, "base64").toString("utf-8");
|
|
40
|
+
}
|
|
41
|
+
if (typeof atob !== "undefined") {
|
|
42
|
+
const binary = atob(base64);
|
|
43
|
+
if (typeof TextDecoder !== "undefined") {
|
|
44
|
+
const bytes = new Uint8Array(binary.length);
|
|
45
|
+
for (let i = 0; i < binary.length; i++) {
|
|
46
|
+
bytes[i] = binary.charCodeAt(i);
|
|
47
|
+
}
|
|
48
|
+
return new TextDecoder().decode(bytes);
|
|
49
|
+
}
|
|
50
|
+
return decodeURIComponent(escape(binary));
|
|
51
|
+
}
|
|
52
|
+
throw new Error("Base64 decoding is not available in this environment.");
|
|
53
|
+
};
|
|
54
|
+
const encodeJsonToBase64 = (data) => {
|
|
55
|
+
return encodeUtf8ToBase64(JSON.stringify(data));
|
|
56
|
+
};
|
|
57
|
+
const decodeBase64ToJson = (base64) => {
|
|
58
|
+
return JSON.parse(decodeBase64ToUtf8(base64));
|
|
59
|
+
};
|
|
60
|
+
const generateSaveId = () => {
|
|
61
|
+
if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
|
|
62
|
+
return crypto.randomUUID();
|
|
63
|
+
}
|
|
64
|
+
return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
|
|
65
|
+
};
|
|
66
|
+
class GameSaves {
|
|
67
|
+
namespace;
|
|
68
|
+
onLoadSaveFileCallback = null;
|
|
69
|
+
constructor(options) {
|
|
70
|
+
this.namespace = options?.namespace ?? "sliver-engine";
|
|
71
|
+
}
|
|
72
|
+
onLoadSaveFile(callback) {
|
|
73
|
+
this.onLoadSaveFileCallback = callback;
|
|
74
|
+
return this;
|
|
75
|
+
}
|
|
76
|
+
create(data, options) {
|
|
77
|
+
const id = options?.id ?? generateSaveId();
|
|
78
|
+
this.write(id, data, { label: options?.label, createIfMissing: true });
|
|
79
|
+
return id;
|
|
80
|
+
}
|
|
81
|
+
write(id, data, options) {
|
|
82
|
+
const storage = getLocalStorage();
|
|
83
|
+
if (!storage) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const now = Date.now();
|
|
87
|
+
const index = this.readIndex(storage);
|
|
88
|
+
const existing = index.find((s) => s.id === id);
|
|
89
|
+
if (!existing && options?.createIfMissing === false) {
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const createdAt = existing?.createdAt ?? now;
|
|
93
|
+
const entry = {
|
|
94
|
+
id,
|
|
95
|
+
createdAt,
|
|
96
|
+
updatedAt: now,
|
|
97
|
+
label: options?.label ?? existing?.label,
|
|
98
|
+
};
|
|
99
|
+
const payload = encodeJsonToBase64(data);
|
|
100
|
+
storage.setItem(this.saveKey(id), payload);
|
|
101
|
+
const nextIndex = [
|
|
102
|
+
...index.filter((s) => s.id !== id),
|
|
103
|
+
entry,
|
|
104
|
+
].sort((a, b) => b.updatedAt - a.updatedAt);
|
|
105
|
+
this.writeIndex(storage, nextIndex);
|
|
106
|
+
}
|
|
107
|
+
read(id) {
|
|
108
|
+
const storage = getLocalStorage();
|
|
109
|
+
if (!storage) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
const index = this.readIndex(storage);
|
|
113
|
+
const entry = index.find((s) => s.id === id);
|
|
114
|
+
if (!entry) {
|
|
115
|
+
return null;
|
|
116
|
+
}
|
|
117
|
+
const encoded = storage.getItem(this.saveKey(id));
|
|
118
|
+
if (!encoded) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
try {
|
|
122
|
+
const data = decodeBase64ToJson(encoded);
|
|
123
|
+
return { ...entry, data };
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
list() {
|
|
130
|
+
const storage = getLocalStorage();
|
|
131
|
+
if (!storage) {
|
|
132
|
+
return [];
|
|
133
|
+
}
|
|
134
|
+
return this.readIndex(storage);
|
|
135
|
+
}
|
|
136
|
+
loadAll() {
|
|
137
|
+
const storage = getLocalStorage();
|
|
138
|
+
if (!storage) {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const index = this.readIndex(storage);
|
|
142
|
+
const loaded = [];
|
|
143
|
+
for (const entry of index) {
|
|
144
|
+
const encoded = storage.getItem(this.saveKey(entry.id));
|
|
145
|
+
if (!encoded)
|
|
146
|
+
continue;
|
|
147
|
+
try {
|
|
148
|
+
const data = decodeBase64ToJson(encoded);
|
|
149
|
+
const save = { ...entry, data };
|
|
150
|
+
loaded.push(save);
|
|
151
|
+
this.onLoadSaveFileCallback?.(save);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return loaded;
|
|
158
|
+
}
|
|
159
|
+
delete(id) {
|
|
160
|
+
const storage = getLocalStorage();
|
|
161
|
+
if (!storage) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
storage.removeItem(this.saveKey(id));
|
|
165
|
+
const index = this.readIndex(storage).filter((s) => s.id !== id);
|
|
166
|
+
this.writeIndex(storage, index);
|
|
167
|
+
}
|
|
168
|
+
clear() {
|
|
169
|
+
const storage = getLocalStorage();
|
|
170
|
+
if (!storage) {
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
const index = this.readIndex(storage);
|
|
174
|
+
for (const entry of index) {
|
|
175
|
+
storage.removeItem(this.saveKey(entry.id));
|
|
176
|
+
}
|
|
177
|
+
storage.removeItem(this.indexKey());
|
|
178
|
+
}
|
|
179
|
+
indexKey() {
|
|
180
|
+
return `${this.namespace}:saves:index`;
|
|
181
|
+
}
|
|
182
|
+
saveKey(id) {
|
|
183
|
+
return `${this.namespace}:saves:${id}`;
|
|
184
|
+
}
|
|
185
|
+
readIndex(storage) {
|
|
186
|
+
const raw = storage.getItem(this.indexKey());
|
|
187
|
+
if (!raw) {
|
|
188
|
+
return [];
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
const parsed = JSON.parse(raw);
|
|
192
|
+
if (!Array.isArray(parsed)) {
|
|
193
|
+
return [];
|
|
194
|
+
}
|
|
195
|
+
return parsed
|
|
196
|
+
.filter((s) => {
|
|
197
|
+
return (!!s &&
|
|
198
|
+
typeof s.id === "string" &&
|
|
199
|
+
typeof s.createdAt === "number" &&
|
|
200
|
+
typeof s.updatedAt === "number");
|
|
201
|
+
})
|
|
202
|
+
.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
writeIndex(storage, index) {
|
|
209
|
+
storage.setItem(this.indexKey(), JSON.stringify(index));
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export { GameSaves };
|
|
213
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Game/Saves/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CanvasController } from "../CanvasController";
|
|
2
|
+
import type { GameEvent } from "../Events";
|
|
3
|
+
import type { SceneManager } from "../Scenes/SceneManager";
|
|
4
|
+
import { GameContext } from "../Context";
|
|
5
|
+
import { KeyAccumulator } from "../Events";
|
|
6
|
+
import { SoundManager } from "../SoundManager";
|
|
7
|
+
import { GameSaves, type SaveFile } from "./Saves";
|
|
8
|
+
type GameOptions = {
|
|
9
|
+
canvas: CanvasController;
|
|
10
|
+
scenes: SceneManager;
|
|
11
|
+
soundManager: SoundManager;
|
|
12
|
+
ticksPerSecond?: number;
|
|
13
|
+
saveNamespace?: string;
|
|
14
|
+
};
|
|
15
|
+
declare class Game {
|
|
16
|
+
canvas: CanvasController;
|
|
17
|
+
private scenes;
|
|
18
|
+
private ticksPerSecond;
|
|
19
|
+
private lastTickTime;
|
|
20
|
+
private didSetup;
|
|
21
|
+
context: GameContext;
|
|
22
|
+
private keyAccumulator;
|
|
23
|
+
private eventsDispatcher;
|
|
24
|
+
saves: GameSaves;
|
|
25
|
+
constructor({ canvas, scenes, ticksPerSecond, soundManager, saveNamespace, }: GameOptions);
|
|
26
|
+
setup(): void;
|
|
27
|
+
onLoadSaveFile(callback: ((save: SaveFile) => void) | null): this;
|
|
28
|
+
saveGame<T = unknown>(data: T, options?: {
|
|
29
|
+
label?: string;
|
|
30
|
+
id?: string;
|
|
31
|
+
}): string;
|
|
32
|
+
protected onSetup(): void;
|
|
33
|
+
start(): void;
|
|
34
|
+
render(): void;
|
|
35
|
+
protected onTick(): void;
|
|
36
|
+
handleEvent(event: GameEvent): void;
|
|
37
|
+
getContext(): GameContext;
|
|
38
|
+
getTickRate(): number;
|
|
39
|
+
getKeyAccumulator(): KeyAccumulator;
|
|
40
|
+
}
|
|
41
|
+
export { Game };
|
|
42
|
+
export type { GameOptions };
|
|
43
|
+
export { GameSaves };
|
|
44
|
+
export type { SaveFile };
|
|
45
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Game/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAwB,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnD,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,gBAAgB,CAAC;IACzB,MAAM,EAAE,YAAY,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,cAAM,IAAI;IACD,MAAM,EAAE,gBAAgB,CAAC;IAChC,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,YAAY,CAAa;IACjC,OAAO,CAAC,QAAQ,CAAkB;IAC3B,OAAO,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,cAAc,CAAwB;IAC9C,OAAO,CAAC,gBAAgB,CAAuB;IACxC,KAAK,EAAE,SAAS,CAAC;gBAEZ,EACV,MAAM,EACN,MAAM,EACN,cAAc,EACd,YAAY,EACZ,aAAa,GACd,EAAE,WAAW;IAgBd,KAAK;IAWL,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;IAKjE,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAOjF,SAAS,CAAC,OAAO,IAAI,IAAI;IAEzB,KAAK;IAyBL,MAAM;IASN,SAAS,CAAC,MAAM,IAAI,IAAI;IAExB,WAAW,CAAC,KAAK,EAAE,SAAS;IAS5B,UAAU,IAAI,WAAW;IAIzB,WAAW,IAAI,MAAM;IAIrB,iBAAiB,IAAI,cAAc;CAGpC;AAED,OAAO,EAAE,IAAI,EAAE,CAAC;AAChB,YAAY,EAAE,WAAW,EAAE,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,YAAY,EAAE,QAAQ,EAAE,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { GameContext } from "../Context";
|
|
2
|
+
import { GameEventsdispatcher, KeyAccumulator } from "../Events";
|
|
3
|
+
import { SoundManager } from "../SoundManager";
|
|
4
|
+
import { GameSaves } from "./Saves";
|
|
5
|
+
class Game {
|
|
6
|
+
canvas;
|
|
7
|
+
scenes;
|
|
8
|
+
ticksPerSecond = 60;
|
|
9
|
+
lastTickTime = 0;
|
|
10
|
+
didSetup = false;
|
|
11
|
+
context;
|
|
12
|
+
keyAccumulator = new KeyAccumulator();
|
|
13
|
+
eventsDispatcher;
|
|
14
|
+
saves;
|
|
15
|
+
constructor({ canvas, scenes, ticksPerSecond, soundManager, saveNamespace, }) {
|
|
16
|
+
this.canvas = canvas;
|
|
17
|
+
this.scenes = scenes;
|
|
18
|
+
this.ticksPerSecond = ticksPerSecond || this.ticksPerSecond;
|
|
19
|
+
this.context = new GameContext({
|
|
20
|
+
game: this,
|
|
21
|
+
canvas,
|
|
22
|
+
sceneManager: scenes,
|
|
23
|
+
keyAccumulator: this.keyAccumulator,
|
|
24
|
+
soundManager: soundManager,
|
|
25
|
+
});
|
|
26
|
+
this.scenes.bindContext(this.context);
|
|
27
|
+
this.eventsDispatcher = new GameEventsdispatcher(this, this.keyAccumulator);
|
|
28
|
+
this.saves = new GameSaves({ namespace: saveNamespace });
|
|
29
|
+
}
|
|
30
|
+
setup() {
|
|
31
|
+
if (this.didSetup) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.didSetup = true;
|
|
35
|
+
this.saves.loadAll();
|
|
36
|
+
this.onSetup();
|
|
37
|
+
console.log("Game setup complete.");
|
|
38
|
+
}
|
|
39
|
+
onLoadSaveFile(callback) {
|
|
40
|
+
this.saves.onLoadSaveFile(callback);
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
saveGame(data, options) {
|
|
44
|
+
return this.saves.create(data, options);
|
|
45
|
+
}
|
|
46
|
+
// Meant to be overridden by game-specific implementations to inject logic
|
|
47
|
+
// that should run once during game setup (after save files are loaded).
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
49
|
+
onSetup() { }
|
|
50
|
+
start() {
|
|
51
|
+
this.setup();
|
|
52
|
+
console.log("Game started.");
|
|
53
|
+
// Tick interval
|
|
54
|
+
setInterval(() => {
|
|
55
|
+
const now = performance.now();
|
|
56
|
+
const tickInterval = 1000 / this.ticksPerSecond;
|
|
57
|
+
const lastTickTime = this.lastTickTime || 0;
|
|
58
|
+
if (now - lastTickTime >= tickInterval) {
|
|
59
|
+
this.onTick();
|
|
60
|
+
this.scenes.tick();
|
|
61
|
+
this.lastTickTime = now;
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
// Render loop
|
|
65
|
+
const renderLoop = () => {
|
|
66
|
+
this.canvas.clearCanvas();
|
|
67
|
+
this.render();
|
|
68
|
+
requestAnimationFrame(renderLoop);
|
|
69
|
+
};
|
|
70
|
+
requestAnimationFrame(renderLoop);
|
|
71
|
+
}
|
|
72
|
+
render() {
|
|
73
|
+
this.scenes.getActiveScenes().forEach((scene) => {
|
|
74
|
+
scene.render(this.canvas);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// Meant to be overridden by game-specific implementations to inject logic
|
|
78
|
+
// that should run once per tick, before the scenes tick.
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
80
|
+
onTick() { }
|
|
81
|
+
handleEvent(event) {
|
|
82
|
+
this.scenes
|
|
83
|
+
.getActiveScenes()
|
|
84
|
+
.toReversed()
|
|
85
|
+
.forEach((scene) => {
|
|
86
|
+
scene.handleEvent(event);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
getContext() {
|
|
90
|
+
return this.context;
|
|
91
|
+
}
|
|
92
|
+
getTickRate() {
|
|
93
|
+
return this.ticksPerSecond;
|
|
94
|
+
}
|
|
95
|
+
getKeyAccumulator() {
|
|
96
|
+
return this.keyAccumulator;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export { Game };
|
|
100
|
+
export { GameSaves };
|
|
101
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Game/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { GameObject } from "..";
|
|
2
|
+
import type { Vector } from "../../Lib/Vector";
|
|
3
|
+
type MirroringMode = "horizontal" | "vertical" | "both" | null;
|
|
4
|
+
type AnimationDefinition<TObj extends GameObject> = string[] | ((obj: TObj) => string[]);
|
|
5
|
+
type OptionValue<TObj extends GameObject, TValue> = TValue | ((obj: TObj) => TValue);
|
|
6
|
+
type RenderOptions<TObj extends GameObject> = {
|
|
7
|
+
when?: OptionValue<TObj, boolean>;
|
|
8
|
+
scale?: OptionValue<TObj, number>;
|
|
9
|
+
mirroring?: OptionValue<TObj, MirroringMode>;
|
|
10
|
+
overridePosition?: OptionValue<TObj, Vector>;
|
|
11
|
+
};
|
|
12
|
+
type TileAnimationOptions<TObj extends GameObject> = RenderOptions<TObj> & {
|
|
13
|
+
ticksPerFrame: OptionValue<TObj, number>;
|
|
14
|
+
};
|
|
15
|
+
export declare const onColision: <TObj extends GameObject = GameObject>(predicate: (self: TObj, other: GameObject) => boolean, handler: (self: TObj, other: GameObject) => void) => (_target: Object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(this: TObj, other: GameObject, penetration: Vector) => unknown>) => TypedPropertyDescriptor<(this: TObj, other: GameObject, penetration: Vector) => unknown>;
|
|
16
|
+
/**
|
|
17
|
+
* Render a sprite definition by name.
|
|
18
|
+
*
|
|
19
|
+
* @param spriteDefinitionName - Sprite definition name (or a function returning one).
|
|
20
|
+
* @param options - Optional render settings.
|
|
21
|
+
* @param options.when - Render guard; defaults to true.
|
|
22
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
23
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
24
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* @renderSprite("human_down_0", { scale: 2 })
|
|
28
|
+
* @renderSprite((obj) => obj.spriteName, { mirroring: "horizontal" })
|
|
29
|
+
*/
|
|
30
|
+
export declare const renderSprite: <TObj extends GameObject = GameObject>(spriteDefinitionName: OptionValue<TObj, string>, options?: RenderOptions<TObj>) => (_target: Object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
|
|
31
|
+
/**
|
|
32
|
+
* Render a single tile from a sprite sheet by index.
|
|
33
|
+
*
|
|
34
|
+
* @param spriteSheetName - Sprite sheet name (or a function returning one).
|
|
35
|
+
* @param index - Frame index (or a function returning one).
|
|
36
|
+
* @param options - Optional render settings.
|
|
37
|
+
* @param options.when - Render guard; defaults to true.
|
|
38
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
39
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
40
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* @renderTile("items", 0, { scale: 4 })
|
|
44
|
+
* @renderTile("hero", (obj) => obj.frame, { when: (obj) => obj.visible })
|
|
45
|
+
*/
|
|
46
|
+
export declare const renderTile: <TObj extends GameObject = GameObject>(spriteSheetName: OptionValue<TObj, string>, index: OptionValue<TObj, number>, options?: RenderOptions<TObj>) => (_target: Object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
|
|
47
|
+
/**
|
|
48
|
+
* Render a sprite sheet animation by index list.
|
|
49
|
+
*
|
|
50
|
+
* @param spriteSheetName - Sprite sheet name (or a function returning one).
|
|
51
|
+
* @param indexes - Frame index list (or a function returning one).
|
|
52
|
+
* @param options - Animation + render settings.
|
|
53
|
+
* @param options.when - Render guard; defaults to true.
|
|
54
|
+
* @param options.ticksPerFrame - Ticks per frame; required.
|
|
55
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
56
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
57
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* @renderTileAnimation("hero", [0, 1, 2, 3], { ticksPerFrame: 6, scale: 2 })
|
|
61
|
+
* @renderTileAnimation("hero", (obj) => obj.frames, { ticksPerFrame: 4 })
|
|
62
|
+
*/
|
|
63
|
+
export declare const renderTileAnimation: <TObj extends GameObject = GameObject>(spriteSheetName: OptionValue<TObj, string>, indexes: OptionValue<TObj, number[]>, options: TileAnimationOptions<TObj>) => (_target: Object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
|
|
64
|
+
/**
|
|
65
|
+
* Render a sprite definition animation by name list.
|
|
66
|
+
*
|
|
67
|
+
* @param definitions - Sprite definition names (or a function returning them).
|
|
68
|
+
* @param options - Animation + render settings.
|
|
69
|
+
* @param options.when - Render guard; defaults to true.
|
|
70
|
+
* @param options.ticksPerFrame - Ticks per frame; required.
|
|
71
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
72
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
73
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* @renderSpriteAnimation(["human_down_0", "human_down_1"], { ticksPerFrame: 6 })
|
|
77
|
+
* @renderSpriteAnimation((obj) => obj.frames, { ticksPerFrame: 4, scale: 2 })
|
|
78
|
+
*/
|
|
79
|
+
export declare const renderSpriteAnimation: <TObj extends GameObject = GameObject>(definitions: AnimationDefinition<TObj>, options: TileAnimationOptions<TObj>) => (_target: Object, _propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<any>) => TypedPropertyDescriptor<any>;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/GameObject/Decorators/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
const resolveOption = (value, fallback, obj) => {
|
|
2
|
+
if (typeof value === "function") {
|
|
3
|
+
return value(obj);
|
|
4
|
+
}
|
|
5
|
+
return value ?? fallback;
|
|
6
|
+
};
|
|
7
|
+
export const onColision = (predicate, handler) => {
|
|
8
|
+
return function (_target, _propertyKey, descriptor) {
|
|
9
|
+
const original = descriptor.value;
|
|
10
|
+
if (!original)
|
|
11
|
+
return descriptor;
|
|
12
|
+
descriptor.value = function (other, penetration) {
|
|
13
|
+
if (predicate(this, other)) {
|
|
14
|
+
handler(this, other);
|
|
15
|
+
}
|
|
16
|
+
return original.call(this, other, penetration);
|
|
17
|
+
};
|
|
18
|
+
return descriptor;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Render a sprite definition by name.
|
|
23
|
+
*
|
|
24
|
+
* @param spriteDefinitionName - Sprite definition name (or a function returning one).
|
|
25
|
+
* @param options - Optional render settings.
|
|
26
|
+
* @param options.when - Render guard; defaults to true.
|
|
27
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
28
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
29
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* @renderSprite("human_down_0", { scale: 2 })
|
|
33
|
+
* @renderSprite((obj) => obj.spriteName, { mirroring: "horizontal" })
|
|
34
|
+
*/
|
|
35
|
+
export const renderSprite = (spriteDefinitionName, options = {}) => {
|
|
36
|
+
return function (_target, _propertyKey, descriptor) {
|
|
37
|
+
const original = descriptor.value;
|
|
38
|
+
if (!original)
|
|
39
|
+
return descriptor;
|
|
40
|
+
descriptor.value = function (canvas, scene) {
|
|
41
|
+
const shouldRender = resolveOption(options.when, true, this);
|
|
42
|
+
if (!shouldRender) {
|
|
43
|
+
return original.call(this, canvas, scene);
|
|
44
|
+
}
|
|
45
|
+
const spriteLib = canvas.getSpriteLibrary();
|
|
46
|
+
const context = canvas.getContext();
|
|
47
|
+
const definitionName = typeof spriteDefinitionName === "function"
|
|
48
|
+
? spriteDefinitionName(this)
|
|
49
|
+
: spriteDefinitionName;
|
|
50
|
+
const position = resolveOption(options.overridePosition, this.getPosition(), this);
|
|
51
|
+
const resolvedScale = resolveOption(options.scale, 1, this);
|
|
52
|
+
const mirroring = resolveOption(options.mirroring, null, this);
|
|
53
|
+
const mirrorHorizontal = mirroring === "horizontal" || mirroring === "both";
|
|
54
|
+
const mirrorVertical = mirroring === "vertical" || mirroring === "both";
|
|
55
|
+
spriteLib.drawSpriteDefinition(context, definitionName, position, resolvedScale, mirrorHorizontal, mirrorVertical);
|
|
56
|
+
return original.call(this, canvas, scene);
|
|
57
|
+
};
|
|
58
|
+
return descriptor;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Render a single tile from a sprite sheet by index.
|
|
63
|
+
*
|
|
64
|
+
* @param spriteSheetName - Sprite sheet name (or a function returning one).
|
|
65
|
+
* @param index - Frame index (or a function returning one).
|
|
66
|
+
* @param options - Optional render settings.
|
|
67
|
+
* @param options.when - Render guard; defaults to true.
|
|
68
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
69
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
70
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* @renderTile("items", 0, { scale: 4 })
|
|
74
|
+
* @renderTile("hero", (obj) => obj.frame, { when: (obj) => obj.visible })
|
|
75
|
+
*/
|
|
76
|
+
export const renderTile = (spriteSheetName, index, options = {}) => {
|
|
77
|
+
return function (_target, _propertyKey, descriptor) {
|
|
78
|
+
const original = descriptor.value;
|
|
79
|
+
if (!original)
|
|
80
|
+
return descriptor;
|
|
81
|
+
descriptor.value = function (canvas, scene) {
|
|
82
|
+
const shouldRender = resolveOption(options.when, true, this);
|
|
83
|
+
if (!shouldRender) {
|
|
84
|
+
return original.call(this, canvas, scene);
|
|
85
|
+
}
|
|
86
|
+
const spriteLib = canvas.getSpriteLibrary();
|
|
87
|
+
const context = canvas.getContext();
|
|
88
|
+
const position = resolveOption(options.overridePosition, this.getPosition(), this);
|
|
89
|
+
const resolvedIndex = resolveOption(index, 0, this);
|
|
90
|
+
const resolvedScale = resolveOption(options.scale, 1, this);
|
|
91
|
+
const mirroring = resolveOption(options.mirroring, null, this);
|
|
92
|
+
spriteLib.drawSpriteFrame(context, resolveOption(spriteSheetName, "", this), resolvedIndex, position, resolvedScale, mirroring === "horizontal" || mirroring === "both", mirroring === "vertical" || mirroring === "both");
|
|
93
|
+
return original.call(this, canvas, scene);
|
|
94
|
+
};
|
|
95
|
+
return descriptor;
|
|
96
|
+
};
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* Render a sprite sheet animation by index list.
|
|
100
|
+
*
|
|
101
|
+
* @param spriteSheetName - Sprite sheet name (or a function returning one).
|
|
102
|
+
* @param indexes - Frame index list (or a function returning one).
|
|
103
|
+
* @param options - Animation + render settings.
|
|
104
|
+
* @param options.when - Render guard; defaults to true.
|
|
105
|
+
* @param options.ticksPerFrame - Ticks per frame; required.
|
|
106
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
107
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
108
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* @renderTileAnimation("hero", [0, 1, 2, 3], { ticksPerFrame: 6, scale: 2 })
|
|
112
|
+
* @renderTileAnimation("hero", (obj) => obj.frames, { ticksPerFrame: 4 })
|
|
113
|
+
*/
|
|
114
|
+
export const renderTileAnimation = (spriteSheetName, indexes, options) => {
|
|
115
|
+
return function (_target, _propertyKey, descriptor) {
|
|
116
|
+
const original = descriptor.value;
|
|
117
|
+
if (!original)
|
|
118
|
+
return descriptor;
|
|
119
|
+
descriptor.value = function (canvas, scene) {
|
|
120
|
+
const shouldRender = resolveOption(options.when, true, this);
|
|
121
|
+
if (!shouldRender) {
|
|
122
|
+
return original.call(this, canvas, scene);
|
|
123
|
+
}
|
|
124
|
+
const spriteLib = canvas.getSpriteLibrary();
|
|
125
|
+
const context = canvas.getContext();
|
|
126
|
+
const gameContext = this.getContext();
|
|
127
|
+
const mirroring = resolveOption(options.mirroring, null, this);
|
|
128
|
+
const ticksPerFrame = resolveOption(options.ticksPerFrame, 1, this);
|
|
129
|
+
const position = resolveOption(options.overridePosition, this.getPosition(), this);
|
|
130
|
+
const resolvedScale = resolveOption(options.scale, 1, this);
|
|
131
|
+
const resolvedIndexes = resolveOption(indexes, [], this);
|
|
132
|
+
const frameIndex = Math.floor(gameContext.getTickCount() / ticksPerFrame) %
|
|
133
|
+
resolvedIndexes.length;
|
|
134
|
+
const spriteIndex = resolvedIndexes[frameIndex];
|
|
135
|
+
spriteLib.drawSpriteFrame(context, resolveOption(spriteSheetName, "", this), spriteIndex, position, resolvedScale, mirroring === "horizontal" || mirroring === "both", mirroring === "vertical" || mirroring === "both");
|
|
136
|
+
return original.call(this, canvas, scene);
|
|
137
|
+
};
|
|
138
|
+
return descriptor;
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
/**
|
|
142
|
+
* Render a sprite definition animation by name list.
|
|
143
|
+
*
|
|
144
|
+
* @param definitions - Sprite definition names (or a function returning them).
|
|
145
|
+
* @param options - Animation + render settings.
|
|
146
|
+
* @param options.when - Render guard; defaults to true.
|
|
147
|
+
* @param options.ticksPerFrame - Ticks per frame; required.
|
|
148
|
+
* @param options.scale - Scale multiplier; defaults to 1.
|
|
149
|
+
* @param options.mirroring - Mirror mode: horizontal, vertical, both, or null.
|
|
150
|
+
* @param options.overridePosition - Override draw position (defaults to object position).
|
|
151
|
+
*
|
|
152
|
+
* @example
|
|
153
|
+
* @renderSpriteAnimation(["human_down_0", "human_down_1"], { ticksPerFrame: 6 })
|
|
154
|
+
* @renderSpriteAnimation((obj) => obj.frames, { ticksPerFrame: 4, scale: 2 })
|
|
155
|
+
*/
|
|
156
|
+
export const renderSpriteAnimation = (definitions, options) => {
|
|
157
|
+
return function (_target, _propertyKey, descriptor) {
|
|
158
|
+
const original = descriptor.value;
|
|
159
|
+
if (!original)
|
|
160
|
+
return descriptor;
|
|
161
|
+
descriptor.value = function (canvas, scene) {
|
|
162
|
+
const shouldRender = resolveOption(options.when, true, this);
|
|
163
|
+
if (!shouldRender) {
|
|
164
|
+
return original.call(this, canvas, scene);
|
|
165
|
+
}
|
|
166
|
+
const spriteLib = canvas.getSpriteLibrary();
|
|
167
|
+
const context = canvas.getContext();
|
|
168
|
+
const gameContext = this.getContext();
|
|
169
|
+
const mirroring = resolveOption(options.mirroring, null, this);
|
|
170
|
+
const ticksPerFrame = resolveOption(options.ticksPerFrame, 1, this);
|
|
171
|
+
const position = resolveOption(options.overridePosition, this.getPosition(), this);
|
|
172
|
+
const resolvedScale = resolveOption(options.scale, 1, this);
|
|
173
|
+
const resolvedDefinitions = typeof definitions === "function" ? definitions(this) : definitions;
|
|
174
|
+
const frameIndex = Math.floor(gameContext.getTickCount() / ticksPerFrame) %
|
|
175
|
+
resolvedDefinitions.length;
|
|
176
|
+
const definitionName = resolvedDefinitions[frameIndex];
|
|
177
|
+
spriteLib.drawSpriteDefinition(context, definitionName, position, resolvedScale, mirroring === "horizontal" || mirroring === "both", mirroring === "vertical" || mirroring === "both");
|
|
178
|
+
return original.call(this, canvas, scene);
|
|
179
|
+
};
|
|
180
|
+
return descriptor;
|
|
181
|
+
};
|
|
182
|
+
};
|
|
183
|
+
//# sourceMappingURL=index.js.map
|