Add skill level filter

Fixes #691
This commit is contained in:
kvan7
2025-09-16 21:02:03 -05:00
parent e094751650
commit a59cd3ef9a
28 changed files with 1590 additions and 1385 deletions
+1 -1
View File
@@ -48,7 +48,7 @@ export enum ItemCategory {
Tincture = "Tincture",
Charm = "Charm",
Crossbow = "Crossbow",
SkillGem = "Skill Gem",
Gem = " Gem",
SupportGem = "Support Gem",
MetaGem = "Meta Gem",
Focus = "Focus",
+5 -5
View File
@@ -165,14 +165,14 @@ export function makeGenerator2Bases() {
"Gold",
"Map", // ++
"DivinationCard", // ++
"Active Skill Gem", // ++
"Support Skill Gem", // ++
"Meta Skill Gem", // ++
"Active Gem", // ++
"Support Gem", // ++
"Meta Gem", // ++
"SoulCore",
"UncutSkillGem",
"UncutGem",
"UncutSupportGem",
"ConventionTreasure",
"SkillGemToken",
"GemToken",
"PinnacleKey",
"UltimatumKey",
"UncutReservationGem",
+74 -74
View File
@@ -11,13 +11,13 @@ number of stackable unique jewels [1]
Megalomaniac Diamond
Allocates Passive Skill
Allocates Passive Skill
Allocates Passive Skill
Allocates Passive
Allocates Passive
Allocates Passive
From Nothing Diamond
Passives in Radius of Passive Skill can be Allocated
Passives in Radius of Passive can be Allocated
without being connected to your tree
Corrupted
@@ -30,11 +30,11 @@ Passives in Radius can be Allocated without being connected to your tree
Prism of Belief Diamond
+(13) to Level of all Specific Skill Skills
+(13) to Level of all Specific s
The Adorned Diamond
(0100)% increased Effect of Jewel Socket Passive Skills
(0100)% increased Effect of Jewel Socket Passive s
containing Corrupted Magic Jewels
@@ -120,7 +120,7 @@ Idol of Uldurn Crimson Amulet
(24) Life Regeneration per second
+(6080) to maximum Life
+(1020) to Dexterity
Skills have +1 to Limit
s have +1 to Limit
The Everlasting Gaze Azure Amulet
@@ -171,10 +171,10 @@ Surefooted Sigil Jade Amulet
Choir of the Storm Jade Amulet
+(1015) to Dexterity
Grants Skill: Lightning Bolt
Grants : Lightning Bolt
+(2030)% to Lightning Resistance
Critical Hits Ignore Enemy Monster Lightning Resistance
Trigger Greater Lightning Bolt Skill on Critical Hit
Trigger Greater Lightning Bolt on Critical Hit
Defiance of Destiny Jade Amulet
@@ -202,7 +202,7 @@ Blind Chilled enemies on Hit
Rondel of Fragility Lunar Amulet
+(2030) to maximum Energy Shield
(1530)% increased Skill Speed
(1530)% increased Speed
(2030)% increased Critical Hit Chance
-30% to all Elemental Resistances
(3050)% increased Damage
@@ -211,7 +211,7 @@ Rondel of Fragility Lunar Amulet
The Anvil Bloodstone Amulet
+(3040) to maximum Life
10% reduced Movement Speed
10% reduced Skill Speed
10% reduced Speed
(2550)% increased Armour
20% increased Block chance
+(35)% to maximum Block chance
@@ -251,7 +251,7 @@ Fireflower Solar Amulet
(1020)% increased Rarity of Items found
(3040)% increased Mana Regeneration Rate
Take 100 Fire Damage when you Ignite an Enemy
+(14) to Level of all Fire Skills
+(14) to Level of all Fire s
Eye of Chayula Gold Amulet
@@ -295,7 +295,7 @@ Seed of Cataclysm Lazuli Ring
(3050)% increased Critical Hit Chance for Spells
(3050)% increased Critical Spell Damage Bonus
+(1723)% to Chaos Resistance
10% increased Mana Cost of Skills
10% increased Mana Cost of s
Cracklecreep Ruby Ring
@@ -331,7 +331,7 @@ You cannot be Chilled or Frozen
Whisper of the Brotherhood Sapphire Ring
+(2030)% to Cold Resistance
(510)% increased Skill Speed
(510)% increased Speed
+(1020) to Dexterity
(3050)% increased Mana Regeneration Rate
100% of Cold Damage Converted to Lightning Damage
@@ -357,7 +357,7 @@ Levinstone Topaz Ring
+(2030)% to Lightning Resistance
+(4060) to maximum Mana
(1020)% increased chance to Shock
+1 to Level of all Lightning Skills
+1 to Level of all Lightning s
Ming's Heart Amethyst Ring
@@ -621,7 +621,7 @@ Culling Strike against Frozen Enemies
Trenchtimbre Spiked Club
Adds (1315) to (2225) Physical Damage
(2030)% increased Attack Speed
+(13) to Level of all Minion Skills
+(13) to Level of all Minion s
Increases and Reductions to Minion Attack Speed also affect you
@@ -653,7 +653,7 @@ Causes (3050)% increased Stun Buildup
(80120)% increased Physical Damage
+(1015) to Strength
Gain (1020) Life per Enemy Killed
Slam Skills you use yourself cause Aftershocks
Slam s you use yourself cause Aftershocks
Trephina Forge Maul
@@ -741,7 +741,7 @@ Adds 1 to (1929) Lightning Damage
+(35)% to Critical Hit Chance
(1520)% increased Attack Speed
(2540)% increased Mana Regeneration Rate
Skills reserve 50% less Spirit
s reserve 50% less Spirit
Nazir's Judgement Steelpoint Quarterstaff
@@ -754,12 +754,12 @@ Causes Daze buildup equal to 100% of Damage dealt
Collapsing Horizon Wyrm Quarterstaff
100% increased Elemental Damage with Attacks
+(510)% to Critical Hit Chance
+(24) to Level of all Elemental Skills
Trigger skills refund half of Energy spent
+(24) to Level of all Elemental s
Trigger s refund half of Energy spent
Sanguine Diviner Bone Wand
Grants Skill: Bone Blast
Grants : Bone Blast
(80100)% increased Spell Damage
Gain (1015) Life per Enemy Killed
25% chance to inflict Bleeding on Hit
@@ -767,15 +767,15 @@ Gain (1015) Life per Enemy Killed
Lifesprig Attuned Wand
Grants Skill: Mana Drain
Grants : Mana Drain
+(1020) to maximum Mana
+(13) to Level of all Spell Skills
+(13) to Level of all Spell s
(510)% increased Cast Speed
Leeches 1% of maximum Life when you Cast a Spell
Enezun's Charge Volatile Wand
Grants Skill: Volatile Dead
Grants : Volatile Dead
(80100)% increased Spell Damage
(3050)% increased Critical Hit Chance for Spells
Gain (1015) Mana per Enemy Killed
@@ -783,16 +783,16 @@ Gain (1015) Mana per Enemy Killed
Dusk Vigil Ashen Staff
Grants Skill: Firebolt
Grants Skill: Ember Fusillade
Grants : Firebolt
Grants : Ember Fusillade
(6080)% increased Spell Damage
Gain (510) Life per Enemy Killed
25% increased Mana Regeneration Rate
Trigger Ember Fusillade Skill on casting a Spell
Trigger Ember Fusillade on casting a Spell
Taryn's Shiver Gelid Staff
Grants Skill: Freezing Shards
Grants : Freezing Shards
(80120)% increased Cold Damage
(1020)% increased Cast Speed
100% increased Freeze Buildup
@@ -800,16 +800,16 @@ Enemies Frozen by you take 50% increased Damage
Earthbound Voltaic Staff
Grants Skill: Lightning Bolt
Grants Skill: Spark
Grants : Lightning Bolt
Grants : Spark
(80120)% increased Lightning Damage
(1020)% increased Cast Speed
(2030)% increased Mana Regeneration Rate
Trigger Spark Skill on killing a Shocked Enemy
Trigger Spark on killing a Shocked Enemy
The Searing Touch Pyrophyte Staff
Grants Skill: Living Bomb
Grants : Living Bomb
(80120)% increased Fire Damage
(1020)% increased Cast Speed
100% increased chance to Ignite
@@ -817,10 +817,10 @@ Grants Skill: Living Bomb
The Burden of Shadows Chiming Staff
Grants Skill: Sigil of Power
Grants : Sigil of Power
(2030)% increased Cast Speed
Skill Mana Costs Converted to Life Costs
Skills gain 1% of Damage as Chaos Damage per 3 Life Cost
Mana Costs Converted to Life Costs
s gain 1% of Damage as Chaos Damage per 3 Life Cost
Widowhail Crude Bow
@@ -866,7 +866,7 @@ Rampart Raptor Tense Crossbow
The Dark Defiler Rattling Sceptre
Grants Skill: Skeletal Warrior
Grants : Skeletal Warrior
+(2030) to maximum Mana
+(510) to Intelligence
(1030)% increased Mana Regeneration Rate
@@ -874,7 +874,7 @@ Gain 5% of Damage as Chaos Damage per Undead Minion
Font of Power Omen Sceptre
Grants Skill: Malice
Grants : Malice
(3050)% increased Spirit
+(4060) to maximum Mana
(2030)% increased Mana Regeneration Rate
@@ -883,7 +883,7 @@ Sacrifice 20% of Mana and they Leech that Mana
Sacred Flame Shrine Sceptre
Grants Skill: Purity of Fire
Grants : Purity of Fire
Gain (4060)% of Damage as Extra Fire Damage
Allies in your Presence Gain (2030)% of Damage as Extra Fire Damage
Allies in your Presence Regenerate (23)% of their Maximum Life per second
@@ -891,7 +891,7 @@ Enemies in your Presence Resist Elemental Damage based on their Lowest Resistanc
Guiding Palm Shrine Sceptre
Grants Skill: Purity of Fire
Grants : Purity of Fire
Allies in your Presence deal (46) to (710) additional Attack Fire Damage
+(510) to all Attributes
25% increased Light Radius
@@ -1081,7 +1081,7 @@ Temporalis Silk Robe
+(1020)% to all Elemental Resistances
(530)% of Damage taken Recouped as Life
(530)% of Damage taken Recouped as Mana
Skills have (-4-2) seconds to Cooldown
s have (-4-2) seconds to Cooldown
Prayers for Rain Keth Raiment
@@ -1104,7 +1104,7 @@ The Covenant Altar Robe
(100150)% increased Energy Shield
+(100150) to maximum Life
5% of Spell Damage Leeched as Life
Skills gain a Base Life Cost equal to 50% of Base Mana Cost
s gain a Base Life Cost equal to 50% of Base Mana Cost
Coat of Red Chain Mail
@@ -1135,7 +1135,7 @@ Pariah's Embrace Cloaked Mail
+50 to Spirit
+(1015) to all Attributes
(1015) Life Regeneration per second
20% reduced Mana Cost of Skills
20% reduced Mana Cost of s
Belly of the Beast Explorer Armour
@@ -1284,7 +1284,7 @@ Deidbell Elite Greathelm
(2030)% increased Warcry Speed
Corpses in your Presence Explode when you Warcry,
dealing 10% of their Life as Physical Damage
Warcry Skills have (2030)% increased Area of Effect
Warcry s have (2030)% increased Area of Effect
Corona of the Red Sun Warrior Greathelm
@@ -1339,7 +1339,7 @@ Presence Radius is doubled
Crown of Thorns Twig Circlet
+(100150) to maximum Energy Shield
Lose 5 Life when you use a Skill
Lose 5 Life when you use a
(35) to (610) Physical Thorns damage
Pain Attunement
@@ -1439,14 +1439,14 @@ Assailum Closed Helm
(50100)% increased Armour and Evasion
+(200400) to Accuracy Rating
(3050)% increased Critical Hit Chance
Skills have a (100150)% longer Perfect Timing window
s have a (100150)% longer Perfect Timing window
Crown of the Victor Iron Crown
(1020)% increased Rarity of Items found
Gain 10 Life per Enemy Killed
Gain 10 Mana per Enemy Killed
+1 to Level of all Skills
+1 to Level of all s
Bronzebeard Horned Crown
@@ -1525,7 +1525,7 @@ The Vertex Tribal Mask
(100150)% increased Evasion and Energy Shield
(3050)% increased Critical Hit Chance
+(1317)% to Chaos Resistance
Equipment and Skill Gems have 50% reduced Attribute Requirements
Equipment and Gems have 50% reduced Attribute Requirements
Glimpse of Chaos Tribal Mask
@@ -1555,7 +1555,7 @@ Giant's Blood
Lochtonial Caress Tempered Mitts
(1015)% increased Skill Speed
(1015)% increased Speed
+(1525) to Armour
+(4060) to maximum Life
(1015)% reduced maximum Mana
@@ -1659,7 +1659,7 @@ Jarngreipr Ringmail Gauntlets
Adds (23) to (56) Physical Damage to Attacks
+(6080) to maximum Life
(48)% increased Attack Speed
Strength can satisfy other Attribute Requirements of Melee Weapons and Melee Skills
Strength can satisfy other Attribute Requirements of Melee Weapons and Melee s
Aurseize Layered Gauntlets
@@ -1747,11 +1747,11 @@ Legionstride Rough Greaves
Corpsewade Iron Greaves
Grants Skill: Decompose
Grants : Decompose
10% increased Movement Speed
(3050)% increased Armour
+(510) to Strength
Trigger Decompose Skill on Step
Trigger Decompose on Step
The Infinite Pursuit Bronze Greaves
@@ -1898,7 +1898,7 @@ Aggravate Bleeding on Enemies when they Enter your Presence
Dionadair Splintered Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(6080)% increased Armour
+(1015) to Strength
(35) Life Regeneration per second
@@ -1907,7 +1907,7 @@ Double Stun Threshold while Shield is Raised
Wulfsbane Painted Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
+(4060) to maximum Life
+(1015) to Strength
+(6080) to Stun Threshold
@@ -1915,7 +1915,7 @@ Permanently Intimidate enemies on Block
Doomgate Braced Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
80% increased Block chance
(100150)% increased Armour
+(1317)% to Chaos Resistance
@@ -1924,16 +1924,16 @@ Enemies are Culled on Block
The Wailing Wall Effigial Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
10% reduced Movement Speed
(100150)% increased Armour
+(100150) to Stun Threshold
Can Block damage from all Hits
Cannot use Shield Skills
Cannot use Shield s
Lycosidae Rampart Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(3040)% increased Block chance
(60100)% increased Armour
Accuracy Rating is Doubled
@@ -1941,7 +1941,7 @@ Blocking Damage Poisons the Enemy as though dealing 200 Base Chaos Damage
The Surrender Stone Tower Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(4060)% increased Block chance
(150200)% increased Armour
+(150200) to Stun Threshold
@@ -1949,25 +1949,25 @@ Recover 4% of Life when you Block
Svalinn Crucible Tower Shield
Grants Skill: Raise Shield
Grants Skill: Cast on Block
Grants : Raise Shield
Grants : Cast on Block
(100150)% increased Armour
(-20-10)% to maximum Block chance
Block chance is Lucky
Arvil's Wheel Hardwood Targe
Grants Skill: Raise Shield
Grants : Raise Shield
(60100)% increased Armour and Evasion
+(4060) to maximum Life
+(4060) to maximum Mana
Lose 1% of Life on Kill
Lose 1% of Mana on Kill
(3050)% increased Skill Effect Duration
(3050)% increased Effect Duration
Merit of Service Pelage Targe
Grants Skill: Raise Shield
Grants : Raise Shield
(3050)% increased Block chance
(6080)% increased Armour and Evasion
+(6080) to Stun Threshold
@@ -1975,7 +1975,7 @@ Allies in your Presence have Block Chance equal to yours
Feathered Fortress Crescent Targe
Grants Skill: Raise Shield
Grants : Raise Shield
+(2030) to Strength
+(2030) to Dexterity
+(2030)% to Fire Resistance
@@ -1984,7 +1984,7 @@ No Movement Speed Penalty while Shield is Raised
Alkem Eira Blazon Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(3040)% increased Block chance
(3050)% increased Armour and Energy Shield
+(5070) to maximum Mana
@@ -1992,7 +1992,7 @@ Damage Blocked is Recouped as Mana
Oaksworn Sigil Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(4060)% increased Block chance
(80120)% increased Armour and Energy Shield
+50 to Spirit
@@ -2000,7 +2000,7 @@ Grants Skill: Raise Shield
Saffell's Frame Emblem Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
+(1525)% to Fire Resistance
+(1525)% to Cold Resistance
+(3040)% to Lightning Resistance
@@ -2010,7 +2010,7 @@ Modifiers to Maximum Block Chance instead apply to Maximum Resistances
Crest of Ardura Jingling Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(60100)% increased Armour and Energy Shield
+(1020) to Intelligence
(3050)% increased Mana Regeneration Rate
@@ -2018,13 +2018,13 @@ Grants Skill: Raise Shield
Mahuxotl's Machination Omen Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
(333666)% increased Armour and Energy Shield
(333666)% increased effect of Socketed Soul Cores
Rise of the Phoenix Omen Crest Shield
Grants Skill: Raise Shield
Grants : Raise Shield
+5% to Maximum Fire Resistance
+(2025)% to Fire Resistance
+25% to Fire Resistance while on Low Life
@@ -2086,12 +2086,12 @@ Solus Ipse Grand Visage
+(60100) to maximum Mana
25% increased Light Radius
(100150)% increased Armour, Evasion and Energy Shield
Equipment and Skill Gems have 25% increased Attribute Requirements
You can use two copies of the same Support Gem in different Skills
Equipment and Gems have 25% increased Attribute Requirements
You can use two copies of the same Support Gem in different s
Sine Aequo Grand Manchettes
(1015)% increased Skill Speed
(1015)% increased Speed
(4060)% increased Armour, Evasion and Energy Shield
Immobilise enemies at 50% buildup instead of 100%
Enemies Immobilised by you take 25% less Damage
@@ -2101,4 +2101,4 @@ Ab Aeterno Grand Cuisses
(1530)% increased Movement Speed
(6080)% increased Armour, Evasion and Energy Shield
Dodge Roll avoids all Hits
10% less Movement and Skill Speed per Dodge Roll in the past 20 seconds
10% less Movement and Speed per Dodge Roll in the past 20 seconds
+84 -67
View File
@@ -1,112 +1,129 @@
import * as fs from 'node:fs';
import * as path from 'node:path';
import * as fs from "node:fs";
import * as path from "node:path";
interface ArmourTypeRow {
BaseItemTypesKey: number;
Armour: number;
Evasion: number;
EnergyShield: number;
BaseItemTypesKey: number;
Armour: number;
Evasion: number;
EnergyShield: number;
}
export function ArmourTypes(): ArmourTypeRow[] {
const data = fs.readFileSync(path.join(__dirname, 'ArmourTypes.json'), { encoding: 'utf-8' });
return JSON.parse(data) as ArmourTypeRow[];
const data = fs.readFileSync(path.join(__dirname, "ArmourTypes.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as ArmourTypeRow[];
}
interface BaseItemTypeRow {
_index: number;
Id: string;
Width: number;
Height: number;
Name: string;
DropLevel: number;
Implicit_ModsKeys: string[];
ItemVisualIdentity: number;
IsCorrupted: boolean;
ItemClassesKey: string;
SiteVisibility: number;
TagsKeys: string[];
_index: number;
Id: string;
Width: number;
Height: number;
Name: string;
DropLevel: number;
Implicit_ModsKeys: string[];
ItemVisualIdentity: number;
IsCorrupted: boolean;
ItemClassesKey: string;
SiteVisibility: number;
TagsKeys: string[];
}
export function BaseItemTypes(lang: string = 'en'): BaseItemTypeRow[] {
const data = fs.readFileSync(path.join(__dirname, 'BaseItemTypes.json'), { encoding: 'utf-8' });
return JSON.parse(data) as BaseItemTypeRow[];
export function BaseItemTypes(lang: string = "en"): BaseItemTypeRow[] {
const data = fs.readFileSync(path.join(__dirname, "BaseItemTypes.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as BaseItemTypeRow[];
}
interface ItemClassRow {
Id: string;
Id: string;
}
export function ItemClasses(): ItemClassRow[] {
const data = fs.readFileSync(path.join(__dirname, 'ItemClasses.json'), { encoding: 'utf-8' });
return JSON.parse(data) as ItemClassRow[];
const data = fs.readFileSync(path.join(__dirname, "ItemClasses.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as ItemClassRow[];
}
interface ItemVisualIdentityRow {
_index: number;
Id: string;
DDSFile: string;
AOFile: string;
_index: number;
Id: string;
DDSFile: string;
AOFile: string;
}
export function ItemVisualIdentity(): ItemVisualIdentityRow[] {
const data = fs.readFileSync(path.join(__dirname, 'ItemVisualIdentity.json'), { encoding: 'utf-8' });
return JSON.parse(data) as ItemVisualIdentityRow[];
const data = fs.readFileSync(
path.join(__dirname, "ItemVisualIdentity.json"),
{ encoding: "utf-8" }
);
return JSON.parse(data) as ItemVisualIdentityRow[];
}
interface TagRow {
Id: string;
DisplayString: string;
Id: string;
DisplayString: string;
}
export function Tags(): TagRow[] {
const data = fs.readFileSync(path.join(__dirname, 'Tags.json'), { encoding: 'utf-8' });
return JSON.parse(data) as TagRow[];
const data = fs.readFileSync(path.join(__dirname, "Tags.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as TagRow[];
}
interface UniqueStashLayoutRow {
WordsKey: number;
ShowIfEmptyChallengeLeague: boolean;
RenamedVersion: number;
UniqueStashTypesKey: number;
ItemVisualIdentityKey: number;
ShowIfEmptyStandard: boolean;
IsAlternateArt: boolean;
WordsKey: number;
ShowIfEmptyChallengeLeague: boolean;
RenamedVersion: number;
UniqueStashTypesKey: number;
ItemVisualIdentityKey: number;
ShowIfEmptyStandard: boolean;
IsAlternateArt: boolean;
}
export function UniquesStashLayout(): UniqueStashLayoutRow[] {
const data = fs.readFileSync(path.join(__dirname, 'UniquesStashLayout.json'), { encoding: 'utf-8' });
return JSON.parse(data) as UniqueStashLayoutRow[];
const data = fs.readFileSync(
path.join(__dirname, "UniquesStashLayout.json"),
{ encoding: "utf-8" }
);
return JSON.parse(data) as UniqueStashLayoutRow[];
}
interface WordRow {
_index: number;
Wordlist: number;
Text: string;
SpawnWeight_Tags: number[];
SpawnWeight_Values: number[];
Text2: string;
_index: number;
Wordlist: number;
Text: string;
SpawnWeight_Tags: number[];
SpawnWeight_Values: number[];
Text2: string;
}
export function Words(lang: string = 'en'): WordRow[] {
const data = fs.readFileSync(path.join(__dirname, 'Words.json'), { encoding: 'utf-8' });
return JSON.parse(data) as WordRow[];
export function Words(lang: string = "en"): WordRow[] {
const data = fs.readFileSync(path.join(__dirname, "Words.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as WordRow[];
}
interface StatsRow {
Id: string;
IsLocal: boolean;
IsWeaponLocal: boolean;
Semantics: number;
Text: string;
IsVirtual: boolean;
HASH32: number;
BelongsActiveSkillsKey: string[];
IsScalable: boolean;
Id: string;
IsLocal: boolean;
IsWeaponLocal: boolean;
Semantics: number;
Text: string;
IsVirtual: boolean;
HASH32: number;
BelongsActivesKey: string[];
IsScalable: boolean;
}
export function Stats(): StatsRow[] {
const data = fs.readFileSync(path.join(__dirname, 'Stats.json'), { encoding: 'utf-8' });
return JSON.parse(data) as StatsRow[];
}
const data = fs.readFileSync(path.join(__dirname, "Stats.json"), {
encoding: "utf-8",
});
return JSON.parse(data) as StatsRow[];
}