const firstName = 'Sebin', middleName = 'Antario', lastName = 'Nyshkim', species = 'Anthro Dragon', dateOfBirth = new Date('1993-10-17'), gender = 'male', pronouns = 'he/him', orientation = 'gay', position = 'vers, prefers top', height = 210, // cm weight = 124, // kg tailLength = 104, // cm wingspan = 417, // cm colors = { hairPrimary: '#4b608f', hairSecondary: '#6684c0', eyes: '#31c215', scalesPrimary: '#c64c35', scalesSecondary: '#eda958', eyebrows: '#eda958', tailspikes: '#7f4539', horns: '#413a3a', claws: '#413a3a', nipples: '#413a3a', penis: '#413a3a' }, penis = { shape: 'humanoid', type: 'grower', special: 'ridged, no foreskin', size: 20, // cm girth: 5 // cm }, description = 'Learn all about that derg!', kinks = [ { name: 'Absorption', rating: 0 }, { name: 'Anal', rating: 3, receive: true, give: true }, { name: 'Auto-Fellatio', rating: 2 }, { name: 'Biting', rating: 2, receive: true, give: true }, { name: 'Bukkake', rating: 2, give: true }, { name: 'Chastity', rating: 0 }, { name: 'Chubby', rating: 1 }, { name: 'Clothed Sex', rating: 2 }, { name: 'Cock Slapping', rating: 2, give: true }, { name: 'Coiling', rating: 1, give: true }, { name: 'Competition', rating: 1, give: true }, { name: 'Creampie', rating: 2, give: true }, { name: 'Crushing (Living/Objects)', rating: 0 }, { name: 'Cum From Mouth/Nose', rating: 2, give: true }, { name: 'Cum Inflation (Light/Medium)', rating: 2 }, { name: 'Deep-throat', rating: 2, receive: true }, { name: 'Dirty Talking', rating: 2 }, { name: 'Excessive Cum', rating: 3, receive: true, give: true }, { name: 'Face-Fucking', rating: 2, give: true }, { name: 'Facial', rating: 2, give: true }, { name: 'Feet', rating: 0 }, { name: 'Filled Condoms', rating: 2 }, { name: 'Foreplay', rating: 2, receive: true, give: true }, { name: 'Frotting', rating: 2 }, { name: 'Gangbangs', rating: 2 }, { name: 'Growth', rating: 3, receive: true }, { name: 'Handjobs', rating: 2, receive: true, give: true }, { name: 'Hotdogging', rating: 2, give: true }, { name: 'Kissing', rating: 2, receive: true, give: true }, { name: 'Macro', rating: 3 }, { name: 'Milking', rating: 2 }, { name: 'Muscle Growth', rating: 3, receive: true, give: true }, { name: 'Muscle Worship', rating: 2, receive: true, give: true }, { name: 'Nipple Play', rating: 2, receive: true, give: true }, { name: 'Oral', rating: 3, receive: true, give: true }, { name: 'Rough', rating: 2, receive: true, give: true }, { name: 'Sheath Play', rating: 2, receive: true, give: true }, { name: 'Size Difference', rating: 3 }, { name: 'Slime/Goo Characters', rating: 2 }, { name: 'Spanking', rating: 1, give: true }, { name: 'Tailsex', rating: 2, receive: true, give: true }, { name: 'Toys', rating: 2, receive: true, give: true }, { name: 'Underwear', rating: 3 }, { name: 'Unsanitary', rating: 0 }, { name: 'Verbal Abuse', rating: 1, give: true }, { name: 'Vore', rating: 0 } ]; const getClientLocale = () => { return navigator.languages.length > 0 ? navigator.languages[0] : 'en-US'; }; const getAge = (dateOfBirth) => { const today = new Date(); const thisYear = today.getFullYear(); const thisMonth = today.getMonth(); const thisDay = today.getDate(); const dobYear = dateOfBirth.getFullYear(); const dobMonth = dateOfBirth.getMonth(); const dobDay = dateOfBirth.getDate(); let age = thisYear - dobYear; if (thisMonth < dobMonth) age--; if (thisMonth === dobMonth && thisDay < dobDay) age--; return age; }; const toImperial = (cm) => { const realFeet = (cm * 0.3937) / 12; const feet = Math.floor(realFeet); const inches = Math.round((realFeet - feet) * 12); return `${feet}'${inches}"`; }; const toInch = (cm) => { return `${Math.round(cm / 2.45)} in`; }; const toLbs = (kg) => { const nearExact = kg / 0.45359237; const lbs = Math.floor(nearExact); return lbs; }; const toFahrenheit = (celsius) => { return celsius * 1.8 + 32; }; const dateFormat = new Intl.DateTimeFormat(getClientLocale(), { year: 'numeric', month: 'long', day: '2-digit' }); const getFullName = () => `${firstName} ${middleName} ${lastName}`; const getDateOfBirth = () => `${dateFormat.format(dateOfBirth)} (${getAge(dateOfBirth)})`; const getHeight = () => `${height} cm (${toImperial(height)})`; const getWeight = () => `${weight} kg (${toLbs(weight)} lbs)`; const getTailLength = () => `${tailLength / 100} m (${toImperial(tailLength)})`; const getWingspan = () => `${wingspan / 100} m (${toImperial(wingspan)})`; const getTraits = (type) => { switch (type) { case 'hobbies': return [ { icon: 'fa6-solid:dumbbell', type: 'Hobby', text: 'working out' }, { icon: 'fa6-solid:plane', type: 'Hobby', text: 'traveling' }, { icon: 'fa6-solid:campground', type: 'Hobby', text: 'camping' }, { icon: 'fa6-solid:gamepad', type: 'Hobby', text: 'video games' }, { icon: 'fa6-solid:laptop-code', type: 'Hobby', text: 'tech' } ]; case 'general': return [ { icon: 'fa6-solid:ruler', type: 'Tail Length', text: getTailLength() }, { icon: 'fa6-solid:shoe-prints', type: 'Walk', text: 'plantigrade' }, { icon: 'fa6-solid:info', type: 'Claws', text: 'sharp, hands & feet' }, { icon: 'fa6-solid:info', type: 'Nipples', text: 'yes' } ]; case 'wings': return [ { icon: 'fa6-solid:ruler', type: 'Wingspan', text: getWingspan() }, { icon: 'fa6-solid:feather', type: 'Arms', text: 2 }, { icon: 'fa6-solid:feather', type: 'Fingers', text: 3 }, { icon: 'fa6-solid:star', type: 'Special Features', text: 'talon on top' } ]; case 'head': return [ { icon: 'fa6-solid:eye', type: 'Pupils', text: 'round' }, { icon: 'fa6-solid:eye', type: 'Eyebrows', text: 'yellow spikes' }, { icon: 'fa6-solid:info', type: 'Cheeks', text: 'yellow spikes' }, { icon: 'fa6-solid:dragon', type: 'Horns', text: 'curved' }, { icon: 'fa6-solid:info', type: 'Hair', text: 'mid-long, mullet' }, { icon: 'fa6-solid:ear-listen', type: 'Ears', text: 'long, pointy, movable' }, { icon: 'fa6-solid:tooth', type: 'Teeth', text: 'sharp fangs' }, { icon: 'fa6-solid:face-grin-tongue', type: 'Tongue', text: 'pointy tip' } ]; case 'muscle': return [ { icon: 'fa6-solid:dumbbell', type: 'Build', text: 'muscular' }, { icon: 'fa6-solid:dumbbell', type: 'Pecs', text: 'big' }, { icon: 'fa6-solid:dumbbell', type: 'abs', text: 'defined' } ]; case 'naughty': return [ { icon: 'fa6-solid:ruler', type: 'Length', text: `${penis.size} cm (${toInch(penis.size)})` }, { icon: 'fa6-solid:ruler', type: 'Girth', text: `${penis.girth} cm (${toInch(penis.girth)})` }, { icon: 'fa6-solid:shapes', type: 'Shape', text: penis.shape }, { icon: 'fa6-solid:maximize', type: 'Type', text: penis.type }, { icon: 'fa6-solid:star', type: 'Special Features', text: penis.special } ]; default: return [ { icon: 'fa6-solid:cake-candles', type: 'Date of Birth', text: getDateOfBirth() }, { icon: 'fa6-solid:mars', type: 'Sex/Gender', text: `${gender} (${pronouns})` }, { icon: 'fa6-solid:ruler', type: 'Height', text: getHeight() }, { icon: 'fa6-solid:weight-hanging', type: 'Weight', text: getWeight() } ]; } }; const getColors = () => [ { name: 'Scales', value: colors.scalesPrimary }, { name: 'Chest, Membranes, Facial Spikes', value: colors.scalesSecondary }, { name: 'Hair', value: colors.hairPrimary }, { name: 'Eyes', value: colors.eyes }, { name: 'Horns, Claws, Nipples', value: colors.horns }, { name: 'Tail Spikes', value: colors.tailspikes } ]; export default { firstName, species, gender, pronouns, orientation, position, kinks, description, getFullName, getTraits, getColors };