UNPKG

facesjs

Version:

A JavaScript library for generating vector-based cartoon faces

96 lines (91 loc) 3.36 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateRelative = void 0; var _dlv = _interopRequireDefault(require("dlv")); var _dset = require("dset"); var _generate = require("./generate.js"); var _common = require("./common.js"); var _utils = require("./utils.js"); var _svgsIndex = require("./svgs-index.js"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } // Currently, race just affects skin color and hair color. Let's ignore hair color (since you could imagine it being dyed anyway) and figure out someone's race just based on skin color. If no race is found, return undefined. const imputeRace = face => { return _common.races.find(race => _generate.colors[race].skin.includes(face.body.color)); }; const generateRelative = ({ gender, race: inputRace, relative }) => { const face = (0, _utils.deepCopy)(relative); const race = inputRace ?? imputeRace(face); const randomFace = (0, _generate.generate)(undefined, { gender, race }); // Regenerate some properties always, and others with some probability const regenerateProperties = { accessories: "always", body: { color: inputRace !== undefined ? "always" : "sometimesIfRaceIsKnown", id: "sometimes", size: "always" }, ear: "sometimes", eye: "sometimes", eyebrow: "sometimes", eyeLine: "sometimes", facialHair: "always", fatness: "always", glasses: "always", hair: { color: inputRace !== undefined ? "always" : "sometimesIfRaceIsKnown", flip: "always", id: "always" }, hairBg: "always", head: { id: "sometimes", shave: "always" }, jersey: "never", miscLine: "sometimes", mouth: "sometimes", nose: "sometimes", smileLine: "sometimes", teamColors: "never" }; const probRegenerate = 0.25; const processRegenerateProperties = (objOutput, objRandom, regeneratePropertiesLocal) => { for (const [key, value] of Object.entries(regeneratePropertiesLocal)) { if (typeof value === "string") { if (value === "always" || (value === "sometimes" || value === "sometimesIfRaceIsKnown" && race !== undefined) && Math.random() < probRegenerate) { objOutput[key] = objRandom[key]; } } else { processRegenerateProperties(objOutput[key], objRandom[key], value); } } }; processRegenerateProperties(face, randomFace, regenerateProperties); // Override any ID properties that are not valid for the specified gender for (const key of _common.features) { const svgIndex = _svgsIndex.svgsIndex[key].findIndex(id => id === face[key].id); const svgGender = _svgsIndex.svgsGenders[key][svgIndex]; if (svgIndex < 0 || svgGender === "male" && gender === "female" || svgGender === "female" && gender === "male") { face[key].id = randomFace[key].id; } } // Override any numeric properties that are not valid for the specified gender for (const [path, ranges] of Object.entries(_generate.numberRanges)) { const current = (0, _dlv.default)(face, path); const range = ranges[gender]; if (current < range[0] || current > range[1]) { (0, _dset.dset)(face, path, (0, _dlv.default)(randomFace, path)); } } return face; }; exports.generateRelative = generateRelative;