@futdevpro/fsm-dynamo 1.16.29 → 1.16.31
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/build/_modules/game/_collections/audio-mixer.util.d.ts +55 -0
- package/build/_modules/game/_collections/audio-mixer.util.d.ts.map +1 -0
- package/build/_modules/game/_collections/audio-mixer.util.js +114 -0
- package/build/_modules/game/_collections/audio-mixer.util.js.map +1 -0
- package/build/_modules/game/_enums/audio-channel.enum.d.ts +17 -0
- package/build/_modules/game/_enums/audio-channel.enum.d.ts.map +1 -0
- package/build/_modules/game/_enums/audio-channel.enum.js +21 -0
- package/build/_modules/game/_enums/audio-channel.enum.js.map +1 -0
- package/build/_modules/game/_models/audio-mixer-settings.interface.d.ts +23 -0
- package/build/_modules/game/_models/audio-mixer-settings.interface.d.ts.map +1 -0
- package/build/_modules/game/_models/audio-mixer-settings.interface.js +3 -0
- package/build/_modules/game/_models/audio-mixer-settings.interface.js.map +1 -0
- package/build/_modules/game/_models/seeded-random-state.interface.d.ts +17 -0
- package/build/_modules/game/_models/seeded-random-state.interface.d.ts.map +1 -0
- package/build/_modules/game/_models/seeded-random-state.interface.js +3 -0
- package/build/_modules/game/_models/seeded-random-state.interface.js.map +1 -0
- package/build/_modules/game/_models/seeded-random.control-model.d.ts +125 -0
- package/build/_modules/game/_models/seeded-random.control-model.d.ts.map +1 -0
- package/build/_modules/game/_models/seeded-random.control-model.js +263 -0
- package/build/_modules/game/_models/seeded-random.control-model.js.map +1 -0
- package/build/_modules/game/index.d.ts +6 -0
- package/build/_modules/game/index.d.ts.map +1 -0
- package/build/_modules/game/index.js +12 -0
- package/build/_modules/game/index.js.map +1 -0
- package/package.json +12 -3
- package/src/_modules/game/_collections/audio-mixer.util.spec.ts +198 -0
- package/src/_modules/game/_collections/audio-mixer.util.ts +143 -0
- package/src/_modules/game/_enums/audio-channel.enum.ts +18 -0
- package/src/_modules/game/_models/audio-mixer-settings.interface.ts +28 -0
- package/src/_modules/game/_models/seeded-random-state.interface.ts +21 -0
- package/src/_modules/game/_models/seeded-random.control-model.spec.ts +290 -0
- package/src/_modules/game/_models/seeded-random.control-model.ts +311 -0
- package/src/_modules/game/index.ts +10 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyFM_SeededRandom = void 0;
|
|
4
|
+
const error_control_model_1 = require("../../../_models/control-models/error.control-model");
|
|
5
|
+
/**
|
|
6
|
+
* Determinisztikus, **seed-elt** veletlenszam-generator mentheto allapottal.
|
|
7
|
+
*
|
|
8
|
+
* **Miert letezik:** a `DyFM_Random` `Math.random()`-ra epul — gyors es kenyelmes, de
|
|
9
|
+
* NEM reprodukalhato es nincs allapota. A flotta harom jateka ezert epitett maganak sajat
|
|
10
|
+
* PRNG-t (`sm-random.service.ts`, `random-seed.service.ts`, Portalhold `worldSeed`).
|
|
11
|
+
* Ez az osztaly az egysegesitett valtozat.
|
|
12
|
+
*
|
|
13
|
+
* **Algoritmus:** sfc32 (Small Fast Counting) — 128 bites allapot (4x32 bit), kivalo
|
|
14
|
+
* statisztikai minoseg, gyors, es az allapota trivialisan serializalhato. A string-seedet
|
|
15
|
+
* cyrb128 hash-eli 4x32 bitre, tehat `'my-world-seed'` es `42` egyarant ervenyes seed.
|
|
16
|
+
*
|
|
17
|
+
* **Mire jo (a jatekon tul):**
|
|
18
|
+
* - reprodukalhato vilag-generalas es mentheto RNG-allapot,
|
|
19
|
+
* - **determinisztikus e2e/QA** — ugyanaz a seed ugyanazt a jatekmenetet adja,
|
|
20
|
+
* - perf-osszemeres azonos bemeneten,
|
|
21
|
+
* - mock-adat es teszt-fixture stabil generalasa.
|
|
22
|
+
*
|
|
23
|
+
* **Hasznalat:**
|
|
24
|
+
* ```typescript
|
|
25
|
+
* const rng = DyFM_SeededRandom.fromSeed('world-42');
|
|
26
|
+
* const damage: number = rng.nextInt(5, 15);
|
|
27
|
+
* const loot = rng.getRandomWeighted([
|
|
28
|
+
* { chance: 0.7, result: 'common' },
|
|
29
|
+
* { chance: 0.3, result: 'rare' },
|
|
30
|
+
* ]);
|
|
31
|
+
*
|
|
32
|
+
* // mentes
|
|
33
|
+
* save.rngState = rng.getState();
|
|
34
|
+
*
|
|
35
|
+
* // betoltes — a sorozat ott folytatodik, ahol abbamaradt
|
|
36
|
+
* const restored = DyFM_SeededRandom.fromState(save.rngState);
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* **Fontos:** ket kulon instance NEM befolyasolja egymast; ha determinisztikus alrendszereket
|
|
40
|
+
* akarsz (pl. vilag-generalas kulon a harci dobasoktol), adj mindegyiknek sajat instance-ot.
|
|
41
|
+
*/
|
|
42
|
+
class DyFM_SeededRandom {
|
|
43
|
+
/** 2^32 — a 32 bites egeszek normalizalasahoz. */
|
|
44
|
+
static uint32Range = 4294967296;
|
|
45
|
+
/** sfc32 allapot-szo #1. */
|
|
46
|
+
a;
|
|
47
|
+
/** sfc32 allapot-szo #2. */
|
|
48
|
+
b;
|
|
49
|
+
/** sfc32 allapot-szo #3. */
|
|
50
|
+
c;
|
|
51
|
+
/** sfc32 counter-szo. */
|
|
52
|
+
d;
|
|
53
|
+
/**
|
|
54
|
+
* Kozvetlen allapotbol epit. A tipikus belepesi pont a `fromSeed()` / `fromState()`
|
|
55
|
+
* statikus factory.
|
|
56
|
+
*/
|
|
57
|
+
constructor(state) {
|
|
58
|
+
if (!state || typeof state.a !== 'number' || typeof state.b !== 'number'
|
|
59
|
+
|| typeof state.c !== 'number' || typeof state.d !== 'number') {
|
|
60
|
+
throw new error_control_model_1.DyFM_Error({
|
|
61
|
+
errorCode: 'DYFM-SEEDED-RANDOM-001',
|
|
62
|
+
message: 'DyFM_SeededRandom: invalid state — all four state words must be numbers',
|
|
63
|
+
additionalContent: { state: state },
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
this.a = state.a | 0;
|
|
67
|
+
this.b = state.b | 0;
|
|
68
|
+
this.c = state.c | 0;
|
|
69
|
+
this.d = state.d | 0;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Generator letrehozasa seed-bol. A seed lehet string (pl. mentett `worldSeed`) vagy szam.
|
|
73
|
+
* Ugyanaz a seed MINDIG ugyanazt a sorozatot adja.
|
|
74
|
+
*/
|
|
75
|
+
static fromSeed(seed) {
|
|
76
|
+
if (typeof seed !== 'string' && typeof seed !== 'number') {
|
|
77
|
+
throw new error_control_model_1.DyFM_Error({
|
|
78
|
+
errorCode: 'DYFM-SEEDED-RANDOM-002',
|
|
79
|
+
message: 'DyFM_SeededRandom.fromSeed: seed must be a string or a number',
|
|
80
|
+
additionalContent: { seed: seed },
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return new DyFM_SeededRandom(this.hashSeed(String(seed)));
|
|
84
|
+
}
|
|
85
|
+
/** Generator letrehozasa korabban elmentett allapotbol (save-betoltes). */
|
|
86
|
+
static fromState(state) {
|
|
87
|
+
return new DyFM_SeededRandom(state);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* String seed -> 4x32 bites allapot (cyrb128). Determinisztikus es jol szoro:
|
|
91
|
+
* a `'a'` es `'b'` seed teljesen kulonbozo sorozatot ad.
|
|
92
|
+
*/
|
|
93
|
+
static hashSeed(seed) {
|
|
94
|
+
let h1 = 1779033703;
|
|
95
|
+
let h2 = 3144134277;
|
|
96
|
+
let h3 = 1013904242;
|
|
97
|
+
let h4 = 2773480762;
|
|
98
|
+
for (let i = 0; i < seed.length; i++) {
|
|
99
|
+
const k = seed.charCodeAt(i);
|
|
100
|
+
h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
|
|
101
|
+
h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
|
|
102
|
+
h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
|
|
103
|
+
h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
|
|
104
|
+
}
|
|
105
|
+
h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);
|
|
106
|
+
h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);
|
|
107
|
+
h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);
|
|
108
|
+
h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);
|
|
109
|
+
// a 0-allapot degeneralt lenne (az sfc32 megallna) — ezert biztositjuk hogy ne legyen csupa 0
|
|
110
|
+
return {
|
|
111
|
+
a: ((h1 ^ h2 ^ h3 ^ h4) >>> 0) || 1,
|
|
112
|
+
b: ((h2 ^ h1) >>> 0) || 2,
|
|
113
|
+
c: ((h3 ^ h1) >>> 0) || 3,
|
|
114
|
+
d: ((h4 ^ h1) >>> 0) || 4,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** A generator teljes allapotanak masolata — ezt kell a save-payloadba tenni. */
|
|
118
|
+
getState() {
|
|
119
|
+
return { a: this.a, b: this.b, c: this.c, d: this.d };
|
|
120
|
+
}
|
|
121
|
+
/** Allapot visszatoltese — a sorozat innentol az elmentett ponton folytatodik. */
|
|
122
|
+
setState(state) {
|
|
123
|
+
if (!state || typeof state.a !== 'number' || typeof state.b !== 'number'
|
|
124
|
+
|| typeof state.c !== 'number' || typeof state.d !== 'number') {
|
|
125
|
+
throw new error_control_model_1.DyFM_Error({
|
|
126
|
+
errorCode: 'DYFM-SEEDED-RANDOM-003',
|
|
127
|
+
message: 'DyFM_SeededRandom.setState: invalid state — all four state words must be numbers',
|
|
128
|
+
additionalContent: { state: state },
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
this.a = state.a | 0;
|
|
132
|
+
this.b = state.b | 0;
|
|
133
|
+
this.c = state.c | 0;
|
|
134
|
+
this.d = state.d | 0;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Fuggetlen masolat az AKTUALIS allapotrol — a klon ugyanazt a sorozatot folytatja,
|
|
138
|
+
* de a ket instance tovabbiakban nem befolyasolja egymast.
|
|
139
|
+
*
|
|
140
|
+
* Tipikus hasznalat: „mi lenne, ha" elore-szimulacio a fo-jatekmenet elrontasa nelkul.
|
|
141
|
+
*/
|
|
142
|
+
clone() {
|
|
143
|
+
return new DyFM_SeededRandom(this.getState());
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* A kovetkezo veletlen lebegopontos szam a `[0, 1)` tartomanybol (sfc32 mag).
|
|
147
|
+
* Minden mas metodus erre epul.
|
|
148
|
+
*/
|
|
149
|
+
nextFloat() {
|
|
150
|
+
this.a |= 0;
|
|
151
|
+
this.b |= 0;
|
|
152
|
+
this.c |= 0;
|
|
153
|
+
this.d |= 0;
|
|
154
|
+
const t = (((this.a + this.b) | 0) + this.d) | 0;
|
|
155
|
+
this.d = (this.d + 1) | 0;
|
|
156
|
+
this.a = this.b ^ (this.b >>> 9);
|
|
157
|
+
this.b = (this.c + (this.c << 3)) | 0;
|
|
158
|
+
this.c = (this.c << 21) | (this.c >>> 11);
|
|
159
|
+
this.c = (this.c + t) | 0;
|
|
160
|
+
return (t >>> 0) / DyFM_SeededRandom.uint32Range;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Veletlen egesz a `[min, max]` tartomanybol (mindket veg ZART) — a `DyFM_Random.getRandomInt`
|
|
164
|
+
* seedelt parja. Ha `max < min`, a ket erteket felcsereli.
|
|
165
|
+
*/
|
|
166
|
+
nextInt(min, max) {
|
|
167
|
+
const low = Math.min(min, max);
|
|
168
|
+
const high = Math.max(min, max);
|
|
169
|
+
return low + Math.floor(this.nextFloat() * (high - low + 1));
|
|
170
|
+
}
|
|
171
|
+
/** A `DyFM_Random.getRandomInt` API-paritas alias — l. `nextInt`. */
|
|
172
|
+
getRandomInt(min, max) {
|
|
173
|
+
return this.nextInt(min, max);
|
|
174
|
+
}
|
|
175
|
+
/** Veletlen lebegopontos szam a `[min, max)` tartomanybol. */
|
|
176
|
+
nextRange(min, max) {
|
|
177
|
+
const low = Math.min(min, max);
|
|
178
|
+
const high = Math.max(min, max);
|
|
179
|
+
return low + this.nextFloat() * (high - low);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Veletlen logikai ertek. A `chance` a `true` valoszinusege (0..1; default 0.5).
|
|
183
|
+
*/
|
|
184
|
+
nextBool(chance = 0.5) {
|
|
185
|
+
return this.nextFloat() < chance;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Veletlen elem a listabol (`null`, ha a lista ures) — a `DyFM_Random.getRandomListElement`
|
|
189
|
+
* seedelt parja.
|
|
190
|
+
*/
|
|
191
|
+
getRandomListElement(list) {
|
|
192
|
+
if (!list?.length) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
return list[this.nextInt(0, list.length - 1)];
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Sulyozott veletlen elem (`null`, ha a lista ures) — a `DyFM_Random.getRandomWeighted`
|
|
199
|
+
* seedelt parja.
|
|
200
|
+
*
|
|
201
|
+
* **Elteres a `DyFM_Random`-tol:** ez a valtozat NEM mutalja a bemeneti tombot
|
|
202
|
+
* (a statikus verzio helyben rendez es atirja a `chance` ertekeket).
|
|
203
|
+
*/
|
|
204
|
+
getRandomWeighted(weights) {
|
|
205
|
+
if (!weights?.length) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
let chanceSum = 0;
|
|
209
|
+
weights.forEach((weight) => { chanceSum += weight.chance; });
|
|
210
|
+
if (chanceSum <= 0) {
|
|
211
|
+
return this.getRandomListElement(weights.map((weight) => weight.result));
|
|
212
|
+
}
|
|
213
|
+
const roll = this.nextFloat() * chanceSum;
|
|
214
|
+
let cumulated = 0;
|
|
215
|
+
for (let i = 0; i < weights.length; i++) {
|
|
216
|
+
cumulated += weights[i].chance;
|
|
217
|
+
if (roll < cumulated) {
|
|
218
|
+
return weights[i].result;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
// lebegopontos kerekitesi maradek eseten az utolso elem a nyertes
|
|
222
|
+
return weights[weights.length - 1].result;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Sulyozott veletlen egesz — a `DyFM_Random.getRandomWeightedInt` seedelt parja.
|
|
226
|
+
* Ha a sulyozas nem ad talalatot, `nextInt(min, max)`-ra esik vissza.
|
|
227
|
+
*/
|
|
228
|
+
getRandomWeightedInt(min, max, weights) {
|
|
229
|
+
const weighted = this.getRandomWeighted(weights);
|
|
230
|
+
if (weighted === null) {
|
|
231
|
+
return this.nextInt(min, max);
|
|
232
|
+
}
|
|
233
|
+
return weighted;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Fisher-Yates keveres — UJ tombot ad vissza, a bemenetet nem mutalja.
|
|
237
|
+
*/
|
|
238
|
+
shuffle(list) {
|
|
239
|
+
if (!list?.length) {
|
|
240
|
+
return [];
|
|
241
|
+
}
|
|
242
|
+
const result = list.slice();
|
|
243
|
+
for (let i = result.length - 1; 0 < i; i--) {
|
|
244
|
+
const j = this.nextInt(0, i);
|
|
245
|
+
const swap = result[i];
|
|
246
|
+
result[i] = result[j];
|
|
247
|
+
result[j] = swap;
|
|
248
|
+
}
|
|
249
|
+
return result;
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* `count` darab KULONBOZO elem kivalasztasa a listabol (sorrendje veletlen).
|
|
253
|
+
* Ha `count` nagyobb a lista hosszanal, a teljes (megkevert) listat adja vissza.
|
|
254
|
+
*/
|
|
255
|
+
pick(list, count) {
|
|
256
|
+
if (!list?.length || count <= 0) {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
return this.shuffle(list).slice(0, Math.min(count, list.length));
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.DyFM_SeededRandom = DyFM_SeededRandom;
|
|
263
|
+
//# sourceMappingURL=seeded-random.control-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seeded-random.control-model.js","sourceRoot":"","sources":["../../../../src/_modules/game/_models/seeded-random.control-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './_enums/audio-channel.enum';
|
|
2
|
+
export * from './_models/audio-mixer-settings.interface';
|
|
3
|
+
export * from './_models/seeded-random-state.interface';
|
|
4
|
+
export * from './_models/seeded-random.control-model';
|
|
5
|
+
export * from './_collections/audio-mixer.util';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAG5C,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,uCAAuC,CAAC;AAGtD,cAAc,iCAAiC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
// ENUMS
|
|
5
|
+
tslib_1.__exportStar(require("./_enums/audio-channel.enum"), exports);
|
|
6
|
+
// MODELS
|
|
7
|
+
tslib_1.__exportStar(require("./_models/audio-mixer-settings.interface"), exports);
|
|
8
|
+
tslib_1.__exportStar(require("./_models/seeded-random-state.interface"), exports);
|
|
9
|
+
tslib_1.__exportStar(require("./_models/seeded-random.control-model"), exports);
|
|
10
|
+
// COLLECTIONS
|
|
11
|
+
tslib_1.__exportStar(require("./_collections/audio-mixer.util"), exports);
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/game/index.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,sEAA4C;AAE5C,SAAS;AACT,mFAAyD;AACzD,kFAAwD;AACxD,gFAAsD;AAEtD,cAAc;AACd,0EAAgD"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@futdevpro/fsm-dynamo",
|
|
3
|
-
"version": "01.16.
|
|
3
|
+
"version": "01.16.31",
|
|
4
4
|
"description": "Full Stack Model Collection for Dynamic (NodeJS-Typescript) Framework called Dynamo, by Future Development Ltd.",
|
|
5
5
|
"DyBu_settings": {
|
|
6
6
|
"packageType": "full-stack-package",
|
|
@@ -195,6 +195,12 @@
|
|
|
195
195
|
"module": "./build/_modules/ngx-models/index.js",
|
|
196
196
|
"types": "./build/_modules/ngx-models/index.d.ts",
|
|
197
197
|
"typings": "./build/_modules/ngx-models/index.d.ts"
|
|
198
|
+
},
|
|
199
|
+
"./game": {
|
|
200
|
+
"default": "./build/_modules/game/index.js",
|
|
201
|
+
"module": "./build/_modules/game/index.js",
|
|
202
|
+
"types": "./build/_modules/game/index.d.ts",
|
|
203
|
+
"typings": "./build/_modules/game/index.d.ts"
|
|
198
204
|
}
|
|
199
205
|
},
|
|
200
206
|
"typesVersions": {
|
|
@@ -261,6 +267,9 @@
|
|
|
261
267
|
],
|
|
262
268
|
"ngx-models": [
|
|
263
269
|
"build/_modules/ngx-models/index.d.ts"
|
|
270
|
+
],
|
|
271
|
+
"game": [
|
|
272
|
+
"build/_modules/game/index.d.ts"
|
|
264
273
|
]
|
|
265
274
|
}
|
|
266
275
|
},
|
|
@@ -269,6 +278,7 @@
|
|
|
269
278
|
},
|
|
270
279
|
"dependencies": {
|
|
271
280
|
"@types/node": "~24.1.0",
|
|
281
|
+
"crypto-js": "~4.2.0",
|
|
272
282
|
"socket.io": "~4.8.1",
|
|
273
283
|
"socket.io-client": "~4.8.1",
|
|
274
284
|
"ts-node": "~10.9.1",
|
|
@@ -277,7 +287,7 @@
|
|
|
277
287
|
"uuid": "11.1.0"
|
|
278
288
|
},
|
|
279
289
|
"devDependencies": {
|
|
280
|
-
"@futdevpro/dynamo-eslint": "1.15.
|
|
290
|
+
"@futdevpro/dynamo-eslint": "1.15.22",
|
|
281
291
|
"@types/jasmine": "~4.3.5",
|
|
282
292
|
"@typescript-eslint/eslint-plugin": "^8.41.0",
|
|
283
293
|
"@typescript-eslint/parser": "^8.41.0",
|
|
@@ -290,7 +300,6 @@
|
|
|
290
300
|
"jasmine": "5.10.0",
|
|
291
301
|
"jasmine-spec-reporter": "^7.0.0",
|
|
292
302
|
"prettier": "^3.3.0",
|
|
293
|
-
"crypto-js": "~4.2.0",
|
|
294
303
|
"openai": "~5.23.2",
|
|
295
304
|
"husky": "^9.1.7"
|
|
296
305
|
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
|
|
2
|
+
import { DyFM_AudioChannel } from '../_enums/audio-channel.enum';
|
|
3
|
+
import { DyFM_AudioMixer_Settings } from '../_models/audio-mixer-settings.interface';
|
|
4
|
+
|
|
5
|
+
import { DyFM_AudioMixer_Util } from './audio-mixer.util';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
describe('DyFM_AudioMixer_Util', (): void => {
|
|
9
|
+
|
|
10
|
+
describe('getDefaults', (): void => {
|
|
11
|
+
|
|
12
|
+
it('minden csatornara ervenyes 0..1 erteket ad, nem nemitva', (): void => {
|
|
13
|
+
const defaults: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.getDefaults();
|
|
14
|
+
|
|
15
|
+
expect(defaults.master).toBeGreaterThan(0);
|
|
16
|
+
expect(defaults.master).toBeLessThanOrEqual(1);
|
|
17
|
+
expect(defaults.music).toBeGreaterThan(0);
|
|
18
|
+
expect(defaults.ambience).toBeGreaterThan(0);
|
|
19
|
+
expect(defaults.effects).toBeGreaterThan(0);
|
|
20
|
+
expect(defaults.muted).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('minden hivas UJ objektumot ad (nincs megosztott referencia)', (): void => {
|
|
24
|
+
const first: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.getDefaults();
|
|
25
|
+
const second: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.getDefaults();
|
|
26
|
+
|
|
27
|
+
first.master = 0.1;
|
|
28
|
+
|
|
29
|
+
expect(second.master).not.toBe(0.1);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe('clamp', (): void => {
|
|
34
|
+
|
|
35
|
+
it('a 0..1 tartomanyba szorit', (): void => {
|
|
36
|
+
expect(DyFM_AudioMixer_Util.clamp(-3)).toBe(0);
|
|
37
|
+
expect(DyFM_AudioMixer_Util.clamp(7)).toBe(1);
|
|
38
|
+
expect(DyFM_AudioMixer_Util.clamp(0.35)).toBe(0.35);
|
|
39
|
+
expect(DyFM_AudioMixer_Util.clamp(0)).toBe(0);
|
|
40
|
+
expect(DyFM_AudioMixer_Util.clamp(1)).toBe(1);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('NaN / undefined / nem-szam eseten a fallback-et adja', (): void => {
|
|
44
|
+
expect(DyFM_AudioMixer_Util.clamp(Number.NaN, 0.5)).toBe(0.5);
|
|
45
|
+
expect(DyFM_AudioMixer_Util.clamp(undefined, 0.5)).toBe(0.5);
|
|
46
|
+
expect(DyFM_AudioMixer_Util.clamp(null, 0.5)).toBe(0.5);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe('merge — a migracios biztositek', (): void => {
|
|
51
|
+
|
|
52
|
+
it('hianyzo bemenetre a defaultot adja', (): void => {
|
|
53
|
+
expect(DyFM_AudioMixer_Util.merge(null)).toEqual(DyFM_AudioMixer_Util.getDefaults());
|
|
54
|
+
expect(DyFM_AudioMixer_Util.merge(undefined)).toEqual(DyFM_AudioMixer_Util.getDefaults());
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('reszleges (legacy) payloadot teljesse egeszit ki', (): void => {
|
|
58
|
+
const legacy: Partial<DyFM_AudioMixer_Settings> = { master: 0.4, music: 0.2 };
|
|
59
|
+
const merged: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.merge(legacy);
|
|
60
|
+
|
|
61
|
+
expect(merged.master).toBe(0.4);
|
|
62
|
+
expect(merged.music).toBe(0.2);
|
|
63
|
+
expect(merged.ambience).toBe(DyFM_AudioMixer_Util.getDefaults().ambience);
|
|
64
|
+
expect(merged.effects).toBe(DyFM_AudioMixer_Util.getDefaults().effects);
|
|
65
|
+
expect(merged.muted).toBe(false);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('a tartomanyon kivuli mentett erteket beszoritja', (): void => {
|
|
69
|
+
const corrupted: Partial<DyFM_AudioMixer_Settings> = { master: 42, effects: -1 };
|
|
70
|
+
const merged: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.merge(corrupted);
|
|
71
|
+
|
|
72
|
+
expect(merged.master).toBe(1);
|
|
73
|
+
expect(merged.effects).toBe(0);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it('a muted-ot szigoruan boolean-na alakitja', (): void => {
|
|
77
|
+
expect(DyFM_AudioMixer_Util.merge({ muted: true }).muted).toBe(true);
|
|
78
|
+
expect(DyFM_AudioMixer_Util.merge({}).muted).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
describe('getEffectiveVolume', (): void => {
|
|
83
|
+
|
|
84
|
+
const settings: DyFM_AudioMixer_Settings = {
|
|
85
|
+
master: 0.5,
|
|
86
|
+
music: 0.4,
|
|
87
|
+
ambience: 0.6,
|
|
88
|
+
effects: 1,
|
|
89
|
+
muted: false,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
it('a csatorna erteket a master-rel szorozza', (): void => {
|
|
93
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(settings, DyFM_AudioChannel.music))
|
|
94
|
+
.toBeCloseTo(0.2, 10);
|
|
95
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(settings, DyFM_AudioChannel.ambience))
|
|
96
|
+
.toBeCloseTo(0.3, 10);
|
|
97
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(settings, DyFM_AudioChannel.effects))
|
|
98
|
+
.toBeCloseTo(0.5, 10);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('a master csatornara a sajat erteket adja (nem negyzetre emelve)', (): void => {
|
|
102
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(settings, DyFM_AudioChannel.master)).toBe(0.5);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('nemitas eseten minden csatorna 0', (): void => {
|
|
106
|
+
const muted: DyFM_AudioMixer_Settings = { ...settings, muted: true };
|
|
107
|
+
|
|
108
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(muted, DyFM_AudioChannel.master)).toBe(0);
|
|
109
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(muted, DyFM_AudioChannel.music)).toBe(0);
|
|
110
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(muted, DyFM_AudioChannel.ambience)).toBe(0);
|
|
111
|
+
expect(DyFM_AudioMixer_Util.getEffectiveVolume(muted, DyFM_AudioChannel.effects)).toBe(0);
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it('serult settingsbol sem ad NaN-t', (): void => {
|
|
115
|
+
const corrupted: DyFM_AudioMixer_Settings = {
|
|
116
|
+
master: Number.NaN,
|
|
117
|
+
music: undefined,
|
|
118
|
+
ambience: -5,
|
|
119
|
+
effects: 99,
|
|
120
|
+
muted: false,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
[
|
|
124
|
+
DyFM_AudioChannel.master,
|
|
125
|
+
DyFM_AudioChannel.music,
|
|
126
|
+
DyFM_AudioChannel.ambience,
|
|
127
|
+
DyFM_AudioChannel.effects,
|
|
128
|
+
].forEach((channel: DyFM_AudioChannel): void => {
|
|
129
|
+
const volume: number = DyFM_AudioMixer_Util.getEffectiveVolume(corrupted, channel);
|
|
130
|
+
|
|
131
|
+
expect(Number.isNaN(volume)).toBe(false);
|
|
132
|
+
expect(volume).toBeGreaterThanOrEqual(0);
|
|
133
|
+
expect(volume).toBeLessThanOrEqual(1);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
describe('immutable update-ek', (): void => {
|
|
139
|
+
|
|
140
|
+
it('a withChannelVolume UJ objektumot ad, az eredetit nem mutalja', (): void => {
|
|
141
|
+
const original: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.getDefaults();
|
|
142
|
+
const updated: DyFM_AudioMixer_Settings =
|
|
143
|
+
DyFM_AudioMixer_Util.withChannelVolume(original, DyFM_AudioChannel.music, 0.25);
|
|
144
|
+
|
|
145
|
+
expect(updated.music).toBe(0.25);
|
|
146
|
+
expect(original.music).not.toBe(0.25);
|
|
147
|
+
expect(updated).not.toBe(original);
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
it('a withChannelVolume beszoritja a tartomanyon kivuli erteket', (): void => {
|
|
151
|
+
const updated: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util
|
|
152
|
+
.withChannelVolume(DyFM_AudioMixer_Util.getDefaults(), DyFM_AudioChannel.effects, 5);
|
|
153
|
+
|
|
154
|
+
expect(updated.effects).toBe(1);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
it('a withMuted UJ objektumot ad, az eredetit nem mutalja', (): void => {
|
|
158
|
+
const original: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.getDefaults();
|
|
159
|
+
const updated: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.withMuted(original, true);
|
|
160
|
+
|
|
161
|
+
expect(updated.muted).toBe(true);
|
|
162
|
+
expect(original.muted).toBe(false);
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
describe('isEqual', (): void => {
|
|
167
|
+
|
|
168
|
+
it('ertek szerint hasonlit, nem referencia szerint', (): void => {
|
|
169
|
+
expect(DyFM_AudioMixer_Util.isEqual(
|
|
170
|
+
DyFM_AudioMixer_Util.getDefaults(),
|
|
171
|
+
DyFM_AudioMixer_Util.getDefaults(),
|
|
172
|
+
)).toBe(true);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('elteres eseten false', (): void => {
|
|
176
|
+
const changed: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util
|
|
177
|
+
.withChannelVolume(DyFM_AudioMixer_Util.getDefaults(), DyFM_AudioChannel.music, 0.1);
|
|
178
|
+
|
|
179
|
+
expect(DyFM_AudioMixer_Util.isEqual(DyFM_AudioMixer_Util.getDefaults(), changed)).toBe(false);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
describe('kompatibilitas a flotta 4 meglevo interfeszevel', (): void => {
|
|
184
|
+
|
|
185
|
+
it('a PCR / PCS / PG / HC alak mezoi hianytalanul lefedve', (): void => {
|
|
186
|
+
const fromLegacyProject: DyFM_AudioMixer_Settings = {
|
|
187
|
+
master: 0.9,
|
|
188
|
+
music: 0.7,
|
|
189
|
+
ambience: 0.5,
|
|
190
|
+
effects: 0.3,
|
|
191
|
+
muted: false,
|
|
192
|
+
};
|
|
193
|
+
const merged: DyFM_AudioMixer_Settings = DyFM_AudioMixer_Util.merge(fromLegacyProject);
|
|
194
|
+
|
|
195
|
+
expect(merged).toEqual(fromLegacyProject);
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
});
|