mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-22 10:14:16 +00:00
c7ca457c45
## Description: Task: #1075 Enable typescript strict mode First (out of many) PR in order to enable typescript Strict mode in the project. This PR fixes all type issues present under the `/server` path. ## Specifics Most changes are just basic type fixes, however here are some further explanation for some of the more complex changes: 1. `PatternDecoder.ts` used to accept `Uint8Array` as an input, however this was never used, so to simplify the typing and avoid casting in various places, I just removed support for it. 2. `MapPlaylist.ts` has a `frequency` object with map names, used to specify how often each map should appear in the playlist. However this list is not in sync with the actual map list, so some maps were missing from that list. I fixed that while adding stronger typing for the future. Also removed an un-necessary call to `parseInt`. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I have read and accepted the CLA aggreement (only required once). ## Please put your Discord username so you can be contacted if a bug or regression is found: azlod
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
export class PatternDecoder {
|
|
private bytes: Uint8Array;
|
|
|
|
readonly height: number;
|
|
readonly width: number;
|
|
readonly scale: number;
|
|
|
|
constructor(base64: string, base64urlDecode: (input: string) => Uint8Array) {
|
|
this.bytes = base64urlDecode(base64);
|
|
|
|
if (this.bytes.length < 3) {
|
|
throw new Error(
|
|
"Pattern data is too short to contain required metadata.",
|
|
);
|
|
}
|
|
|
|
const version = this.bytes[0];
|
|
if (version !== 0) {
|
|
throw new Error(`Unrecognized pattern version ${version}.`);
|
|
}
|
|
|
|
const byte1 = this.bytes[1];
|
|
const byte2 = this.bytes[2];
|
|
this.scale = byte1 & 0x07;
|
|
|
|
this.width = (((byte2 & 0x03) << 5) | ((byte1 >> 3) & 0x1f)) + 2;
|
|
this.height = ((byte2 >> 2) & 0x3f) + 2;
|
|
|
|
const expectedBits = this.width * this.height;
|
|
const expectedBytes = (expectedBits + 7) >> 3; // Equivalent to: ceil(expectedBits / 8);
|
|
if (this.bytes.length - 3 < expectedBytes) {
|
|
throw new Error(
|
|
"Pattern data is too short for the specified dimensions.",
|
|
);
|
|
}
|
|
}
|
|
|
|
isSet(x: number, y: number): boolean {
|
|
const px = (x >> this.scale) % this.width;
|
|
const py = (y >> this.scale) % this.height;
|
|
const idx = py * this.width + px;
|
|
const byteIndex = idx >> 3;
|
|
const bitIndex = idx & 7;
|
|
const byte = this.bytes[3 + byteIndex];
|
|
if (byte === undefined) throw new Error("Invalid pattern");
|
|
return (byte & (1 << bitIndex)) !== 0;
|
|
}
|
|
|
|
scaledHeight(): number {
|
|
return this.height << this.scale;
|
|
}
|
|
|
|
scaledWidth(): number {
|
|
return this.width << this.scale;
|
|
}
|
|
}
|