74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
|
import connectToDb from "./db";
|
||
|
|
||
|
import { getEmotion, getGenderPresentation } from "./util";
|
||
|
|
||
|
export default async function getValidPetPoses() {
|
||
|
const db = await connectToDb();
|
||
|
|
||
|
const numSpeciesPromise = getNumSpecies(db);
|
||
|
const numColorsPromise = getNumColors(db);
|
||
|
const poseTuplesPromise = getPoseTuples(db);
|
||
|
|
||
|
const [numSpecies, numColors, poseTuples] = await Promise.all([
|
||
|
numSpeciesPromise,
|
||
|
numColorsPromise,
|
||
|
poseTuplesPromise,
|
||
|
]);
|
||
|
|
||
|
const poseStrs = new Set();
|
||
|
for (const poseTuple of poseTuples) {
|
||
|
const { species_id, color_id, mood_id, female } = poseTuple;
|
||
|
const emotion = getEmotion(mood_id);
|
||
|
const genderPresentation = getGenderPresentation(female);
|
||
|
const poseStr = `${species_id}-${color_id}-${emotion}-${genderPresentation}`;
|
||
|
poseStrs.add(poseStr);
|
||
|
}
|
||
|
|
||
|
function hasPose(speciesId, colorId, emotion, genderPresentation) {
|
||
|
const poseStr = `${speciesId}-${colorId}-${emotion}-${genderPresentation}`;
|
||
|
return poseStrs.has(poseStr);
|
||
|
}
|
||
|
|
||
|
const numPairs = numSpecies * numColors;
|
||
|
const buffer = Buffer.alloc(numPairs);
|
||
|
|
||
|
for (let speciesId = 1; speciesId <= numSpecies; speciesId++) {
|
||
|
for (let colorId = 1; colorId <= numColors; colorId++) {
|
||
|
let byte = 0;
|
||
|
byte += hasPose(speciesId, colorId, "HAPPY", "MASCULINE") ? 1 : 0;
|
||
|
byte <<= 1;
|
||
|
byte += hasPose(speciesId, colorId, "SAD", "MASCULINE") ? 1 : 0;
|
||
|
byte <<= 1;
|
||
|
byte += hasPose(speciesId, colorId, "SICK", "MASCULINE") ? 1 : 0;
|
||
|
byte <<= 1;
|
||
|
byte += hasPose(speciesId, colorId, "HAPPY", "FEMININE") ? 1 : 0;
|
||
|
byte <<= 1;
|
||
|
byte += hasPose(speciesId, colorId, "SAD", "FEMININE") ? 1 : 0;
|
||
|
byte <<= 1;
|
||
|
byte += hasPose(speciesId, colorId, "SICK", "FEMININE") ? 1 : 0;
|
||
|
|
||
|
buffer.writeUInt8(byte);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
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`);
|
||
|
return rows[0]["count(*)"];
|
||
|
}
|
||
|
|
||
|
async function getPoseTuples(db) {
|
||
|
const [rows, _] = await db.query(`
|
||
|
SELECT DISTINCT species_id, color_id, mood_id, female FROM pet_states
|
||
|
INNER JOIN pet_types ON pet_types.id = pet_states.pet_type_id
|
||
|
WHERE mood_id IS NOT NULL AND female IS NOT NULL AND color_id >= 1`);
|
||
|
return rows;
|
||
|
}
|