This allows to move things that are actually content out of the character data file into page content files
229 lines
8 KiB
JavaScript
229 lines
8 KiB
JavaScript
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
|
|
};
|