1
0
Fork 0
forked from OpenNeo/impress
impress/src/server/getValidPetPoses.js

86 lines
2.6 KiB
JavaScript
Raw Normal View History

import connectToDb from "./db";
2020-05-23 12:47:06 -07:00
import { getPoseFromPetState, normalizeRow } from "./util";
export default async function getValidPetPoses() {
const db = await connectToDb();
const numSpeciesPromise = getNumSpecies(db);
const numColorsPromise = getNumColors(db);
2020-05-23 12:47:06 -07:00
const distinctPetStatesPromise = getDistinctPetStates(db);
2020-05-23 12:47:06 -07:00
const [numSpecies, numColors, distinctPetStates] = await Promise.all([
numSpeciesPromise,
numColorsPromise,
2020-05-23 12:47:06 -07:00
distinctPetStatesPromise,
]);
const poseStrs = new Set();
2020-05-23 12:47:06 -07:00
for (const petState of distinctPetStates) {
const { speciesId, colorId } = petState;
const pose = getPoseFromPetState(petState);
const poseStr = `${speciesId}-${colorId}-${pose}`;
poseStrs.add(poseStr);
}
2020-05-23 11:48:53 -07:00
function hasPose(speciesId, colorId, pose) {
const poseStr = `${speciesId}-${colorId}-${pose}`;
return poseStrs.has(poseStr);
}
const numPairs = numSpecies * numColors;
const buffer = Buffer.alloc(numPairs + 2);
buffer.writeUInt8(numSpecies, 0);
buffer.writeUInt8(numColors, 1);
for (let speciesId = 1; speciesId <= numSpecies; speciesId++) {
const speciesIndex = speciesId - 1;
for (let colorId = 1; colorId <= numColors; colorId++) {
const colorIndex = colorId - 1;
// We fill in the high bits first, and shift left as we go!
let byte = 0;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "UNKNOWN") ? 1 : 0;
byte <<= 1;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "UNCONVERTED") ? 1 : 0;
byte <<= 1;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "SICK_FEM") ? 1 : 0;
byte <<= 1;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "SAD_FEM") ? 1 : 0;
byte <<= 1;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "HAPPY_FEM") ? 1 : 0;
byte <<= 1;
2020-05-23 11:48:53 -07:00
byte += hasPose(speciesId, colorId, "SICK_MASC") ? 1 : 0;
byte <<= 1;
byte += hasPose(speciesId, colorId, "SAD_MASC") ? 1 : 0;
byte <<= 1;
byte += hasPose(speciesId, colorId, "HAPPY_MASC") ? 1 : 0;
buffer.writeUInt8(byte, speciesIndex * numColors + colorIndex + 2);
}
}
return buffer;
}
async function getNumSpecies(db) {
const [rows, _] = await db.query(`SELECT count(*) FROM species`);
return rows[0]["count(*)"];
}
async function getNumColors(db) {
const [rows, _] = await db.query(
`SELECT count(*) FROM colors WHERE prank = 0`
);
return rows[0]["count(*)"];
}
2020-05-23 12:47:06 -07:00
async function getDistinctPetStates(db) {
const [rows, _] = await db.query(`
2020-05-23 11:48:53 -07:00
SELECT DISTINCT species_id, color_id, mood_id, female, unconverted
FROM pet_states
INNER JOIN pet_types ON pet_types.id = pet_states.pet_type_id
2020-05-23 11:48:53 -07:00
WHERE glitched IS false AND color_id >= 1`);
2020-05-23 12:47:06 -07:00
return rows.map(normalizeRow);
}