mirror of
https://github.com/Sendouc/sendou.ink.git
synced 2026-05-09 04:02:40 -05:00
* Add DB tables
* Toggle TO Tools in new calendar event page
* TO tools page initial
* Add counter pick map pool UI
* Save tie breaker map pool
* Save team name
* Layout initial
* Load users own team
* Make team name input required
* Rename team
* Divide to sections
* Submit team map pool
* New style for counter pick map pool section expand
* Fix tiebreaker map pool not saved when new event made
* Split to many forms
* According for team name
* Small UI consistency tweaks
* Add explanation to tie breaker maps
* Remove redundant prop
* Fix new calendar event todos
* Use required hidden input component in new build page
* Fix to tools page showing even when toToolsEnabled = 0
* Delete team
* Map list generation tests initial
* Add tournament map list generation tests
* First version of map list generation
* Add seeded RNG
* Rearrange files
* Generation with strats initial
* Default map pool + allow one team not to have any maps
* Implement map generation via backtracking
* Make order of stages irrelevant
* Add one more TODO
* Seed
* Fixes
* Tournament map list generator initial
* More functional maplist
* Fix any
* Persist in search params initial
* Add date to calendar seed
* Revert "Persist in search params initial"
This reverts commit f01a9e6982.
* Allow admin to start tournament
* Rate maplist instead of optimal / suboptimal
* Add fallback if map list generation errors out
* Hide TO Tools if not admin
* Submit team roster and delete members
* Teams page
* Give roster s p a c e
* Clear user combobox on sent + layout tweaks
* Gracefully handle updating after tournament has started
* Add title
* Persist map list in search params
* Add i18n
65 lines
1.5 KiB
TypeScript
65 lines
1.5 KiB
TypeScript
// https://stackoverflow.com/a/68523152
|
|
|
|
function cyrb128(str: string) {
|
|
let h1 = 1779033703,
|
|
h2 = 3144134277,
|
|
h3 = 1013904242,
|
|
h4 = 2773480762;
|
|
for (let i = 0, k; i < str.length; i++) {
|
|
k = str.charCodeAt(i);
|
|
h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
|
|
h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
|
|
h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
|
|
h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
|
|
}
|
|
h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);
|
|
h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);
|
|
h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);
|
|
h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);
|
|
return [
|
|
(h1 ^ h2 ^ h3 ^ h4) >>> 0,
|
|
(h2 ^ h1) >>> 0,
|
|
(h3 ^ h1) >>> 0,
|
|
(h4 ^ h1) >>> 0,
|
|
];
|
|
}
|
|
|
|
function mulberry32(a: number) {
|
|
return function () {
|
|
var t = (a += 0x6d2b79f5);
|
|
t = Math.imul(t ^ (t >>> 15), t | 1);
|
|
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
|
|
return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
|
|
};
|
|
}
|
|
|
|
export const seededRandom = (seed: string) => {
|
|
const rng = mulberry32(cyrb128(seed)[0]!);
|
|
|
|
const rnd = (lo: number, hi?: number, defaultHi = 1) => {
|
|
if (hi === undefined) {
|
|
hi = lo === undefined ? defaultHi : lo;
|
|
lo = 0;
|
|
}
|
|
|
|
return rng() * (hi - lo) + lo;
|
|
};
|
|
|
|
const rndInt = (lo: number, hi?: number) => Math.floor(rnd(lo, hi, 2));
|
|
|
|
const shuffle = <T>(o: T[]) => {
|
|
const a = o.slice();
|
|
|
|
for (let i = a.length - 1; i > 0; i--) {
|
|
const j = rndInt(i + 1);
|
|
const x = a[i];
|
|
a[i] = a[j]!;
|
|
a[j] = x!;
|
|
}
|
|
|
|
return a;
|
|
};
|
|
|
|
return { rnd, rndInt, shuffle };
|
|
};
|