diff --git a/.gitignore b/.gitignore index 36420af..136ad40 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules -config.json \ No newline at end of file +config.json +data/HandRanks.dat diff --git a/data/generate_table b/data/generate_table new file mode 100755 index 0000000..181922d Binary files /dev/null and b/data/generate_table differ diff --git a/package-lock.json b/package-lock.json index e168b6d..14b6c0c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,9 @@ "": { "name": "schmirc", "version": "1.0.0", + "cpu": [ + "x64" + ], "license": "ISC", "dependencies": { "@xpressit/winning-poker-hand-rank": "^0.1.6", diff --git a/package.json b/package.json index 0cec7ca..0c6dd72 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,13 @@ "name": "schmirc", "version": "1.0.0", "description": "", - "main": "index.js", + "main": "index.mjs", + "cpu": [ + "x64" + ], "scripts": { - "start": "node ./src/index.mjs" + "start": "node ./src/index.mjs", + "build": "cd ./data && ./generate_table" }, "author": "Flummi", "license": "ISC", diff --git a/src/inc/handranker.mjs b/src/inc/handranker.mjs index 38c2710..3c913a4 100644 --- a/src/inc/handranker.mjs +++ b/src/inc/handranker.mjs @@ -1,6 +1,44 @@ +import fs from 'node:fs'; + export default new class handranker { + #ranks; + constructor() { - return this; + this.#ranks = fs.readFileSync('./data/HandRanks.dat'); + + this.handtypes = [ + "InvalidHand", "HighCard", "Pair", + "TwoPairs", "ThreeOfAKind", "Straight", + "Flush", "FullHouse", "FourOfAKind", + "StraightFlush" + ]; + + this.cards = ['']; + for(const cv of [..."23456789TJQKA"]) + for(const cs of [..."CDHS"]) + this.cards.push(cv + cs); + }; + evalHand(cards) { + if(!this.#ranks) + throw new Error("HandRanks.dat not loaded, run 'npm run build' first!"); + + if(![7,6,5,3].includes(cards.length)) + throw new Error("Hand must be 3, 5, 6, or 7 cards"); + + cards = cards.map(c => this.cards.indexOf(c)); + + let p = 53; + for(let i = 0; i < cards.length; i++) + p = this.#ranks.readUInt32LE((p + cards[i]) * 4); + + if(cards.length == 5 || cards.length == 6) + p = this.#ranks.readUInt32LE(p * 4); + + return { + handType: p >> 12, + handRank: p & 0x00000fff, + value: p, + handName: this.handtypes[p >> 12] + }; }; - };