character-ref/src/sebin/sebin.11tydata.js
Sebin Nyshkim 779e7f92a3 refactor: ♻️ make ability component standalone
This allows to move things that are actually content out of the character data file into page content files
2025-06-26 15:19:01 +02:00

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
};