- Joined
- Aug 23, 2025
- Messages
- 154
- Time Online
- 6h 23m
- Reputation
- 222
title
@twinkdestroyer
@twinkdestroyer
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
he wants your assholewhy does n***a tag me
is that a bad thing?it might be possible to overthink looksmaxxing
wait this is goated
in the update i made true adam one in 257 billionwait this is goated
okI actually want to play this game
kindaIs it similar to Bitlife?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Blackpill Sim 2026</title>
<style>
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
body {
background: linear-gradient(135deg, #0f172a, #1e293b);
color: #e2e8f0;
line-height: 1.6;
padding: 20px;
min-height: 100vh;
}
.container {
max-width: 1200px;
margin: 0 auto;
background: rgba(30, 41, 59, 0.8);
border-radius: 10px;
padding: 20px;
box-shadow: 0 0 20px rgba(0, 0, 0, 0.5);
}
header {
text-align: center;
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #334155;
}
h1 {
color: #f8fafc;
font-size: 2.5rem;
margin-bottom: 10px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.disclaimer {
background: rgba(220, 38, 38, 0.2);
padding: 15px;
border-radius: 8px;
margin: 15px 0;
border-left: 4px solid #dc2626;
font-size: 0.9rem;
}
.stats-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin-bottom: 20px;
}
.stat-box {
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
.stat-title {
font-size: 1rem;
color: #94a3b8;
margin-bottom: 5px;
}
.stat-value {
font-size: 1.4rem;
font-weight: bold;
color: #f8fafc;
}
.trait-list {
display: flex;
flex-wrap: wrap;
gap: 10px;
margin: 10px 0;
}
.trait {
background: rgba(30, 64, 175, 0.3);
padding: 5px 10px;
border-radius: 20px;
font-size: 0.9rem;
}
.negative-trait {
background: rgba(220, 38, 38, 0.3);
}
.actions-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
margin: 20px 0;
}
.action-btn {
background: #3b82f6;
color: white;
border: none;
padding: 12px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
transition: all 0.3s ease;
}
.action-btn:hover {
background: #2563eb;
transform: translateY(-2px);
}
.action-btn:disabled {
background: #64748b;
cursor: not-allowed;
transform: none;
}
.log-container {
background: rgba(15, 23, 42, 0.7);
border-radius: 8px;
padding: 15px;
margin-top: 20px;
max-height: 300px;
overflow-y: auto;
}
.log-entry {
margin-bottom: 8px;
padding-bottom: 8px;
border-bottom: 1px solid #334155;
}
.log-entry:last-child {
border-bottom: none;
}
.age-badge {
display: inline-block;
background: #8b5cf6;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.8rem;
margin-right: 8px;
}
.success {
color: #10b981;
}
.danger {
color: #ef4444;
}
.warning {
color: #f59e0b;
}
.tier-badge {
display: inline-block;
padding: 5px 12px;
border-radius: 20px;
font-weight: bold;
margin-top: 5px;
}
.subhuman { background: #dc2626; color: white; }
.ltn { background: #ea580c; color: white; }
.mtn { background: #d97706; color: white; }
.htn { background: #65a30d; color: white; }
.chadlite { background: #16a34a; color: white; }
.chad { background: #059669; color: white; }
.trueadam { background: linear-gradient(45deg, #06b6d4, #8b5cf6); color: white; }
.progress-bar {
height: 8px;
background: #334155;
border-radius: 4px;
margin-top: 5px;
overflow: hidden;
}
.progress-fill {
height: 100%;
background: #3b82f6;
border-radius: 4px;
}
footer {
text-align: center;
margin-top: 20px;
padding-top: 15px;
border-top: 1px solid #334155;
font-size: 0.9rem;
color: #94a3b8;
}
.tab-container {
display: flex;
gap: 10px;
margin-bottom: 15px;
flex-wrap: wrap;
}
.tab {
padding: 10px 15px;
background: #334155;
border-radius: 5px;
cursor: pointer;
white-space: nowrap;
}
.tab.active {
background: #3b82f6;
}
.tab-content {
display: none;
}
.tab-content.active {
display: block;
}
.shop-item {
display: flex;
justify-content: space-between;
padding: 10px;
background: rgba(15, 23, 42, 0.7);
margin-bottom: 5px;
border-radius: 5px;
align-items: center;
}
.shop-item-info {
flex: 1;
}
.shop-item-title {
font-weight: bold;
margin-bottom: 5px;
}
.shop-item-desc {
font-size: 0.9rem;
color: #94a3b8;
}
.shop-item-action {
display: flex;
align-items: center;
gap: 10px;
}
.genetics-display {
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
}
.height-chart {
margin-top: 20px;
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
}
.chart-bar {
height: 20px;
background: #334155;
border-radius: 10px;
margin: 5px 0;
overflow: hidden;
position: relative;
}
.chart-fill {
height: 100%;
background: linear-gradient(90deg, #3b82f6, #8b5cf6);
border-radius: 10px;
width: 0%;
transition: width 1s ease;
}
.chart-label {
position: absolute;
left: 10px;
top: 0;
line-height: 20px;
color: white;
font-size: 0.8rem;
}
.degeneration-indicator {
display: inline-block;
padding: 2px 8px;
background: #dc2626;
border-radius: 10px;
font-size: 0.8rem;
margin-left: 5px;
animation: pulse 2s infinite;
}
@keyframes pulse {
0% { opacity: 0.7; }
50% { opacity: 1; }
100% { opacity: 0.7; }
}
.status-badge {
display: inline-block;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.8rem;
margin-left: 5px;
}
.gray-status { background: #64748b; color: white; }
.known-status { background: #3b82f6; color: white; }
.contributor-status { background: #8b5cf6; color: white; }
.orgmaster-status { background: linear-gradient(45deg, #06b6d4, #8b5cf6); color: white; }
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
z-index: 1000;
align-items: center;
justify-content: center;
}
.modal-content {
background: #1e293b;
padding: 20px;
border-radius: 10px;
max-width: 500px;
width: 90%;
max-height: 80vh;
overflow-y: auto;
}
.modal-title {
font-size: 1.5rem;
margin-bottom: 15px;
color: #f8fafc;
}
.modal-desc {
margin-bottom: 15px;
color: #e2e8f0;
}
.modal-buttons {
display: flex;
gap: 10px;
justify-content: flex-end;
}
.modal-btn {
padding: 8px 15px;
border-radius: 5px;
cursor: pointer;
border: none;
font-weight: bold;
}
.modal-btn-primary {
background: #3b82f6;
color: white;
}
.modal-btn-secondary {
background: #64748b;
color: white;
}
.risk-indicator {
display: inline-block;
padding: 2px 6px;
border-radius: 10px;
font-size: 0.7rem;
margin-left: 5px;
}
.low-risk { background: #10b981; color: white; }
.medium-risk { background: #f59e0b; color: white; }
.high-risk { background: #ef4444; color: white; }
.drug-warning {
color: #ef4444;
font-size: 0.9rem;
margin-top: 5px;
}
.family-class {
display: inline-block;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.8rem;
margin-left: 5px;
}
.lower-class { background: #dc2626; color: white; }
.middle-class { background: #d97706; color: white; }
.upper-class { background: #059669; color: white; }
.social-media-post {
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
}
.social-media-icon {
width: 24px;
height: 24px;
margin-right: 8px;
vertical-align: middle;
}
.job-item {
display: flex;
justify-content: space-between;
padding: 10px;
background: rgba(15, 23, 42, 0.7);
margin-bottom: 5px;
border-radius: 5px;
align-items: center;
}
.job-requirements {
font-size: 0.9rem;
color: #94a3b8;
}
.study-options {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
}
.study-option {
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
text-align: center;
}
.influencer-status {
display: inline-block;
padding: 3px 8px;
border-radius: 12px;
background: linear-gradient(45deg, #8b5cf6, #ec4899);
color: white;
font-size: 0.8rem;
margin-left: 5px;
}
/* New styles for additional features */
.relationship-status {
display: inline-block;
padding: 3px 8px;
border-radius: 12px;
font-size: 0.8rem;
margin-left: 5px;
}
.single { background: #64748b; color: white; }
.dating { background: #3b82f6; color: white; }
.married { background: #8b5cf6; color: white; }
.children-list {
margin-top: 10px;
max-height: 150px;
overflow-y: auto;
}
.child-item {
padding: 5px;
background: rgba(15, 23, 42, 0.5);
margin-bottom: 3px;
border-radius: 4px;
font-size: 0.9rem;
}
.bmi-value {
font-size: 1.2rem;
font-weight: bold;
color: #f8fafc;
}
.bmi-status {
display: inline-block;
padding: 2px 8px;
border-radius: 10px;
font-size: 0.8rem;
margin-left: 5px;
}
.underweight { background: #f59e0b; color: white; }
.normal { background: #10b981; color: white; }
.overweight { background: #f59e0b; color: white; }
.obese { background: #ef4444; color: white; }
.date-btn {
background: #ec4899;
color: white;
border: none;
padding: 8px 12px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
transition: all 0.3s ease;
margin-top: 5px;
}
.date-btn:hover {
background: #db2777;
}
.date-btn:disabled {
background: #64748b;
cursor: not-allowed;
}
.partner-info {
margin-top: 10px;
padding: 10px;
background: rgba(15, 23, 42, 0.5);
border-radius: 8px;
}
.eat-btn {
background: #10b981;
color: white;
border: none;
padding: 8px 12px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
transition: all 0.3s ease;
margin-top: 5px;
}
.eat-btn:hover {
background: #059669;
}
.eat-btn:disabled {
background: #64748b;
cursor: not-allowed;
}
.food-item {
display: flex;
justify-content: space-between;
padding: 8px;
background: rgba(15, 23, 42, 0.7);
margin-bottom: 5px;
border-radius: 5px;
align-items: center;
}
.food-item-info {
flex: 1;
}
.food-item-title {
font-weight: bold;
margin-bottom: 3px;
}
.food-item-desc {
font-size: 0.8rem;
color: #94a3b8;
}
.food-item-action {
display: flex;
align-items: center;
gap: 10px;
}
.harmonization-effect {
display: inline-block;
padding: 2px 8px;
background: #8b5cf6;
border-radius: 10px;
font-size: 0.8rem;
margin-left: 5px;
}
/* New styles for additional features */
.archetype-container {
background: rgba(15, 23, 42, 0.7);
padding: 15px;
border-radius: 8px;
margin-bottom: 15px;
}
.archetype-item {
margin-bottom: 10px;
padding: 10px;
background: rgba(30, 41, 59, 0.5);
border-radius: 5px;
}
.archetype-title {
font-weight: bold;
margin-bottom: 5px;
color: #f8fafc;
}
.archetype-desc {
font-size: 0.9rem;
color: #94a3b8;
}
.select-archetype-btn {
background: #8b5cf6;
color: white;
border: none;
padding: 8px 12px;
border-radius: 5px;
cursor: pointer;
margin-top: 5px;
font-size: 0.9rem;
}
.select-archetype-btn:hover {
background: #7c3aed;
}
.hair-style-item {
display: flex;
justify-content: space-between;
padding: 8px;
background: rgba(15, 23, 42, 0.7);
margin-bottom: 5px;
border-radius: 5px;
align-items: center;
}
.humor-stat {
display: inline-block;
padding: 2px 8px;
background: #f59e0b;
border-radius: 10px;
font-size: 0.8rem;
margin-left: 5px;
}
.cheating-risk {
display: inline-block;
padding: 2px 8px;
background: #ec4899;
border-radius: 10px;
font-size: 0.8rem;
margin-left: 5px;
}
.generation-btn {
background: linear-gradient(45deg, #06b6d4, #8b5cf6);
color: white;
border: none;
padding: 10px 15px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
margin-top: 10px;
}
.divorce-btn {
background: #dc2626;
color: white;
border: none;
padding: 8px 12px;
border-radius: 8px;
cursor: pointer;
margin-top: 5px;
}
.confront-btn {
background: #ea580c;
color: white;
border: none;
padding: 8px 12px;
border-radius: 8px;
cursor: pointer;
margin-top: 5px;
margin-left: 5px;
}
</style>
</head>
<body>
<div class="container">
<header>
<h1>Blackpill Simulator 2k26</h1>
<div class="disclaimer">
<strong>Content Warning:</strong> This game explores themes related to appearance-based discrimination, body image issues, body dysmorphia. Discretion is advised.
</div>
</header>
<div class="genetics-display">
<h3>Genetic Inheritance</h3>
<p>Father's Height: <span id="father-height">5'10"</span> | Mother's Height: <span id="mother-height">5'4"</span></p>
<p>Family Class: <span id="family-class-value" class="family-class middle-class">Middle Class</span></p>
<p>Genetic Potential: <span id="genetic-potential">Medium</span></p>
<p>Parental Bone Structure: <span id="parent-bone">Average</span></p>
<p>Race: <span id="race-value">Caucasian</span></p>
<p>Eye Color: <span id="eye-color">Brown</span></p>
<p>IQ Potential: <span id="iq-potential">100</span></p>
<p>SMV: <span id="smv-value">4.5</span> | Status: <span id="status-value">Neutral</span></p>
<p>Humor: <span id="humor-value">50</span> <span class="humor-stat">Neutral</span></p>
<div id="org-status-container" style="display: none;">
<p>.org Status: <span id="org-status-value" class="status-badge gray-status">Gray</span></p>
</div>
<div id="social-media-status-container" style="display: none; margin-top: 10px;">
<p>Social Media: <span id="social-media-status-value">No Presence</span></p>
</div>
<div id="relationship-container" style="display: none; margin-top: 10px;">
<p>Relationship: <span id="relationship-status-value" class="relationship-status single">Single</span></p>
<div id="partner-info-container" class="partner-info" style="display: none;">
<p>Partner: <span id="partner-name">Name</span> | Attractiveness: <span id="partner-attractiveness">5.0</span></p>
<p>Height: <span id="partner-height">5'8"</span> | Children: <span id="children-count">0</span></p>
<div id="children-container" class="children-list" style="display: none;">
</div>
</div>
</div>
</div>
<div class="stats-container">
<div class="stat-box">
<div class="stat-title">Age</div>
<div class="stat-value" id="age-value">0 years old</div>
<div class="progress-bar">
<div class="progress-fill" id="age-progress" style="width: 0%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Neurodiversity Status</div>
<div class="stat-value" id="neuro-status">Neurotypical</div>
</div>
<div class="stat-box">
<div class="stat-title">IQ</div>
<div class="stat-value" id="iq-value">100</div>
<div class="progress-bar">
<div class="progress-fill" id="iq-progress" style="width: 50%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Attractiveness Tier</div>
<div class="stat-value" id="attractiveness-value">High Low Tier Normie</div>
<div class="tier-badge ltn" id="tier-badge">HLTN</div>
</div>
<div class="stat-box">
<div class="stat-title">Height</div>
<div class="stat-value" id="height-value">1'8"</div>
<div class="progress-bar">
<div class="progress-fill" id="height-progress" style="width: 10%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Weight & BMI</div>
<div class="stat-value" id="weight-value">20 lbs</div>
<div class="bmi-value" id="bmi-value">16.2</div>
<div class="bmi-status underweight" id="bmi-status">Underweight</div>
<div class="progress-bar">
<div class="progress-fill" id="bmi-progress" style="width: 30%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Health</div>
<div class="stat-value" id="health-value">Good</div>
<div class="progress-bar">
<div class="progress-fill" id="health-progress" style="width: 80%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Money</div>
<div class="stat-value" id="money-value">$0</div>
</div>
<div class="stat-box">
<div class="stat-title">Social Status</div>
<div class="stat-value" id="social-value">Neutral</div>
<div class="progress-bar">
<div class="progress-fill" id="social-progress" style="width: 50%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Followers</div>
<div class="stat-value" id="followers-value">0</div>
</div>
<div class="stat-box">
<div class="stat-title">Bone Mass</div>
<div class="stat-value" id="bone-mass-value">Normal</div>
<div class="progress-bar">
<div class="progress-fill" id="bone-mass-progress" style="width: 50%"></div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Hair Type</div>
<div class="stat-value" id="hair-type-value">Straight</div>
<div class="stat-value" id="hair-length-value">Short</div>
<div class="progress-bar">
<div class="progress-fill" id="hair-health-progress" style="width: 80%"></div>
</div>
</div>
</div>
<div class="height-chart">
<h3>Height Percentile</h3>
<div class="chart-bar">
<div class="chart-fill" id="height-percentile" style="width: 50%"></div>
<div class="chart-label">Your height: <span id="height-percentile-value">50%</span></div>
</div>
<p>You are taller than <span id="taller-than">50%</span> of people your age and gender.</p>
</div>
<div class="tab-container">
<div class="tab active" data-tab="traits">Traits</div>
<div class="tab" data-tab="actions">Actions</div>
<div class="tab" data-tab="school">School</div>
<div class="tab" data-tab="procedures">Procedures</div>
<div class="tab" data-tab="peptides">Peptides</div>
<div class="tab" data-tab="steroids">Steroids</div>
<div class="tab" data-tab="nutrition">Nutrition</div>
<div class="tab" data-tab="social-media">Social Media</div>
<div class="tab" data-tab="jobs">Jobs</div>
<div class="tab" data-tab="family">Family</div>
<div class="tab" data-tab="dating">Dating</div>
<div class="tab" data-tab="forum">.org Forum</div>
<div class="tab" data-tab="archetypes">Archetypes</div>
<div class="tab" data-tab="hair">Hair</div>
</div>
<div class="tab-content active" id="traits-tab">
<div class="stat-box">
<div class="stat-title">Physical Traits</div>
<div class="trait-list" id="physical-traits">
<div class="trait">Symmetrical Face</div>
<div class="trait negative-trait">Narrow Clavicles</div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Facial Features</div>
<div class="trait-list" id="facial-traits">
<div class="trait">Positive Canthal Tilt</div>
<div class="trait negative-trait">Recessed Maxilla</div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Skin Conditions</div>
<div class="trait-list" id="skin-traits">
<div class="trait">Clear Skin</div>
</div>
</div>
<div class="stat-box">
<div class="stat-title">Health Conditions</div>
<div class="trait-list" id="health-traits">
<div class="trait">Good Metabolism</div>
</div>
</div>
</div>
<div class="tab-content" id="actions-tab">
<div class="actions-container">
<button class="action-btn" id="age-btn">Age Up (+1 year)</button>
<button class="action-btn" id="skincare-btn">Skincare Routine ($50)</button>
<button class="action-btn" id="gym-btn">Gym Workout ($30)</button>
<button class="action-btn" id="study-btn">Study ($20)</button>
<button class="action-btn" id="work-btn">Part-time Job ($100)</button>
<button class="action-btn" id="surgery-btn" disabled>Cosmetic Surgery ($5000)</button>
<button class="action-btn" id="fraud-btn">Frauding ($20)</button>
<button class="action-btn" id="diy-filler-btn" disabled>DIY Filler ($100)</button>
<button class="action-btn" id="rope-btn" style="background: #dc2626;">Rope (Restart)</button>
</div>
</div>
<div class="tab-content" id="school-tab">
<div class="study-options">
<div class="study-option">
<h3>Elementary School</h3>
<p>Available until age 12</p>
<button class="action-btn" id="elementary-study-btn" disabled>Study Basics</button>
</div>
<div class="study-option">
<h3>Middle School</h3>
<p>Available from age 12-15</p>
<button class="action-btn" id="middle-study-btn" disabled>Study Regular</button>
</div>
<div class="study-option">
<h3>High School</h3>
<p>Available from age 15-18</p>
<button class="action-btn" id="high-school-study-btn" disabled>Study Advanced</button>
</div>
<div class="study-option">
<h3>College</h3>
<p>Available from age 18+</p>
<button class="action-btn" id="college-study-btn" disabled>Study Higher Education</button>
</div>
</div>
<div class="stat-box" style="margin-top: 15px;">
<div class="stat-title">Study Effectiveness</div>
<p>Your IQ affects how efficiently you learn:</p>
<ul style="margin-left: 20px; margin-top: 10px;">
<li>Lower IQ: Slower learning</li>
<li>Average IQ: Moderate learning</li>
<li>Higher IQ: Faster learning</li>
</ul>
</div>
</div>
<div class="tab-content" id="procedures-tab">
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Braces <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Fixes malocclusion and crooked teeth. Risk of botch if no issues present.</div>
</div>
<div class="shop-item-action">
$3000 <button class="action-btn" disabled id="braces-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Jaw Surgery <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Fixes recessed maxilla/mandible. Can botch if not needed.</div>
</div>
<div class="shop-item-action">
$15000 <button class="action-btn" disabled id="jawsurgery-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Buccal Fat Removal <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Removes cheek fat for more defined cheekbones. Can cause premature aging if overdone.</div>
</div>
<div class="shop-item-action">
$4000 <button class="action-btn" disabled id="buccalfat-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Rhinoplasty <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Nose reshaping surgery. High botch potential.</div>
</div>
<div class="shop-item-action">
$8000 <button class="action-btn" disabled id="rhinoplasty-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Limb Lengthening Surgery <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Increases height by 3-4 inches. Extremely painful and risky.</div>
</div>
<div class="shop-item-action">
$70000 <button class="action-btn" disabled id="limblengthening-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Professional Filler <span class="risk-indicator low-risk">Low Risk</span></div>
<div class="shop-item-desc">Professional filler injection for lips, cheeks, or jawline.</div>
</div>
<div class="shop-item-action">
$2000 <button class="action-btn" disabled id="filler-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Facial Harmonization Filler <span class="harmonization-effect">Corrects Asymmetry</span> <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Advanced filler techniques to improve facial harmony and balance. Can ascend up to 2 tiers.</div>
</div>
<div class="shop-item-action">
$5000 <button class="action-btn" disabled id="harmonization-filler-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Palatal Expander <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Widens the upper jaw. Only effective before age 16. Risk of fusion with peptides.</div>
</div>
<div class="shop-item-action">
$4000 <button class="action-btn" disabled id="palatal-expander-btn">Purchase</button>
</div>
</div>
<!-- New eye area procedures -->
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Canthopexy <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Lifts the outer corner of the eyes for a more alert, positive canthal tilt.</div>
</div>
<div class="shop-item-action">
$6000 <button class="action-btn" disabled id="canthopexy-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Upper Eyelid Filler <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Adds volume to upper eyelids for a more hunter-eyed/hooded appearance.</div>
</div>
<div class="shop-item-action">
$3500 <button class="action-btn" disabled id="eyelid-filler-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Blepharoplasty <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Eyelid surgery to remove excess skin or fat from the eyelids.</div>
</div>
<div class="shop-item-action">
$8000 <button class="action-btn" disabled id="blepharoplasty-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Keratopigmentation <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Permanent eye color change procedure. Risk of blindness if botched.</div>
</div>
<div class="shop-item-action">
$7000 <button class="action-btn" disabled id="keratopigmentation-btn">Purchase</button>
</div>
</div>
</div>
<div class="tab-content" id="peptides-tab">
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">IGF-1 LR3 <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Stimulates growth before plates close. After closure, risk of acromegaly and diabetes.</div>
<div class="drug-warning">60% chance of suture fusion if using palatal expander</div>
</div>
<div class="shop-item-action">
$500 <button class="action-btn" id="igf1-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">MK-677 <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Growth hormone secretagogue. Increases height potential and bone mass.</div>
</div>
<div class="shop-item-action">
$300 <button class="action-btn" id="mk677-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">HGH <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Human Growth Hormone. Maximizes growth potential, increases bone mass, but high risk of side effects.</div>
</div>
<div class="shop-item-action">
$1000 <button class="action-btn" id="hgh-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">GHK-Cu <span class="risk-indicator low-risk">Low Risk</span></div>
<div class="shop-item-desc">Copper peptide for skin rejuvenation and improved complexion.</div>
</div>
<div class="shop-item-action">
$200 <button class="action-btn" id="ghk-cu-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Minoxidil <span class="risk-indicator low-risk">Low Risk</span></div>
<div class="shop-item-desc">Promotes facial hair growth and prevents balding.</div>
</div>
<div class="shop-item-action">
$50 <button class="action-btn" id="minoxidil-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Meclizine/Aromatase Inhibitors <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">May increase height by delaying growth plate closure. Very low success rate. Risk of dementia later in life.</div>
</div>
<div class="shop-item-action">
$400 <button class="action-btn" id="meclizine-btn" disabled>Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">CJC no DAC + IPA <span class="risk-indicator medium-risk">Medium Risk</span></div>
<div class="shop-item-desc">Growth hormone releasing peptide combination. May increase height and improve recovery.</div>
</div>
<div class="shop-item-action">
$600 <button class="action-btn" id="cjc-ipa-btn" disabled>Purchase</button>
</div>
</div>
</div>
<div class="tab-content" id="steroids-tab">
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Trenbolone <span class="risk-indicator high-risk">EXTREME RISK</span></div>
<div class="shop-item-desc">Extremely powerful steroid. Very dangerous for teens, dangerous for adults.</div>
<div class="drug-warning">High risk of permanent health damage</div>
</div>
<div class="shop-item-action">
$300 <button class="action-btn" disabled id="trenbolone-btn">Purchase</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Anavar <span class="risk-indicator high-risk">High Risk</span></div>
<div class="shop-item-desc">Milder steroid but still dangerous. Can cause liver damage.</div>
</div>
<div class="shop-item-action">
$200 <button class="action-btn" disabled id="anavar-btn">Purchase</button>
</div>
</div>
</div>
<div class="tab-content" id="nutrition-tab">
<div class="food-item">
<div class="food-item-info">
<div class="food-item-title">Basic Meal ($5)</div>
<div class="food-item-desc">A simple meal that satisfies hunger.</div>
</div>
<div class="food-item-action">
<button class="eat-btn" id="basic-meal-btn">Eat</button>
</div>
</div>
<div class="food-item">
<div class="food-item-info">
<div class="food-item-title">Healthy Meal ($15)</div>
<div class="food-item-desc">Nutritious meal that improves health and maintains weight.</div>
</div>
<div class="food-item-action">
<button class="eat-btn" id="healthy-meal-btn">Eat</button>
</div>
</div>
<div class="food-item">
<div class="food-item-info">
<div class="food-item-title">Weight Gain Meal ($10)</div>
<div class="food-item-desc">High-calorie meal for those looking to gain weight.</div>
</div>
<div class="food-item-action">
<button class="eat-btn" id="gain-weight-btn">Eat</button>
</div>
</div>
<div class="food-item">
<div class="food-item-info">
<div class="food-item-title">Weight Loss Meal ($12)</div>
<div class="food-item-desc">Low-calorie meal for those looking to lose weight.</div>
</div>
<div class="food-item-action">
<button class="eat-btn" id="lose-weight-btn">Eat</button>
</div>
</div>
<div class="stat-box" style="margin-top: 15px;">
<div class="stat-title">Nutrition Effects</div>
<ul style="margin-left: 20px; margin-top: 10px;">
<li>Starving decreases health and can cause organ failure</li>
<li>Being underweight reduces attractiveness and social status</li>
<li>Being overweight can lead to bloating and reduced attractiveness</li>
<li>Obesity significantly reduces attractiveness and health</li>
</ul>
</div>
</div>
<div class="tab-content" id="social-media-tab">
<div class="social-media-post">
<h3><img src="https://www.citypng.com/public/uploads/preview/tik-tok-logo-transparent-square-701751694793273qftyarldbx.png" class="social-media-icon"> TikTok</h3>
<p>Post short videos to gain followers. Risk of becoming a lolcow if below Mid Tier Normie.</p>
<button class="action-btn" id="tiktok-post-btn" disabled>Post Video</button>
</div>
<div class="social-media-post">
<h3><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Instagram_logo_2016.svg/2048px-Instagram_logo_2016.svg.png" class="social-media-icon"> Instagram</h3>
<p>Post photos to build your brand. Higher success if above Mid Tier Normie.</p>
<button class="action-btn" id="instagram-post-btn">Post Photo</button>
</div>
<div class="stat-box" style="margin-top: 15px;">
<div class="stat-title">Social Media Mechanics</div>
<ul style="margin-left: 20px; margin-top: 10px;">
<li>Below Mid Tier Normie: High risk of becoming a lolcow (lose social status and money)</li>
<li>Mid Tier Normie: Neutral outcome</li>
<li>Above Mid Tier Normie: Chance to become an influencer (gain followers and money)</li>
<li>High Tier Normie+: High chance of virality and sponsorship deals</li>
</ul>
</div>
</div>
<div class="tab-content" id="jobs-tab">
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Fast Food Worker</div>
<div class="job-requirements">No requirements. Earn $8/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="fastfood-job-btn">Apply</button>
</div>
</div>
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Retail Associate</div>
<div class="job-requirements">Minimum IQ 85. Earn $12/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="retail-job-btn">Apply</button>
</div>
</div>
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Office Assistant</div>
<div class="job-requirements">Minimum IQ 95. Earn $18/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="office-job-btn">Apply</button>
</div>
</div>
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Software Developer</div>
<div class="job-requirements">Minimum IQ 110, College Degree. Earn $45/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="developer-job-btn">Apply</button>
</div>
</div>
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Data Scientist</div>
<div class="job-requirements">Minimum IQ 120, College Degree. Earn $60/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="scientist-job-btn">Apply</button>
</div>
</div>
<div class="job-item">
<div class="shop-item-info">
<div class="shop-item-title">Surgeon</div>
<div class="job-requirements">Minimum IQ 130, Medical Degree. Earn $120/hour.</div>
</div>
<div class="shop-item-action">
<button class="action-btn" id="surgeon-job-btn">Apply</button>
</div>
</div>
</div>
<div class="tab-content" id="family-tab">
<div class="stat-box">
<div class="stat-title">Family Resources</div>
<p>Your family is <span id="family-class-text">middle class</span>.</p>
<p>Available support: <span id="family-support">$5000</span></p>
<div class="actions-container">
<button class="action-btn" id="ask-money-btn" disabled>Ask for Money</button>
<button class="action-btn" id="ask-braces-btn">Ask for Braces</button>
<button class="action-btn" id="ask-expander-btn">Ask for Palatal Expander</button>
</div>
</div>
</div>
<div class="tab-content" id="dating-tab">
<div class="stat-box">
<div class="stat-title">Dating & Relationships</div>
<p>Your dating success depends on your height, attractiveness, and social status.</p>
<div id="dating-status">
<p>You are <span id="dating-status-text">too young to date</span>.</p>
</div>
<div id="dating-actions" style="display: none;">
<button class="date-btn" id="date-btn">Go on a Date ($50)</button>
<button class="date-btn" id="propose-btn" style="display: none;">Propose Marriage ($500)</button>
<button class="date-btn" id="have-child-btn" style="display: none;">Have a Child ($1000)</button>
<button class="divorce-btn" id="divorce-btn" style="display: none;">Divorce</button>
<button class="confront-btn" id="confront-btn" style="display: none;">Confront About Cheating</button>
</div>
<div id="cheating-indicator" style="display: none; margin-top: 10px;">
<p>Cheating Risk: <span class="cheating-risk" id="cheating-risk-value">Low</span></p>
</div>
<div id="dating-requirements" style="margin-top: 15px;">
<p><strong>Dating Requirements:</strong></p>
<ul style="margin-left: 20px; margin-top: 5px;">
<li>Below 5'8": Very difficult to date</li>
<li>5'8" to 5'11": Need at least LTN face</li>
<li>6'0" to 6'2": Need at least MTN face</li>
<li>6'3"+: Need at least LTN face for HMTB</li>
</ul>
</div>
</div>
<div class="stat-box" style="margin-top: 15px;">
<div class="stat-title">Partner Preferences</div>
<p>Women generally prefer men who are taller than them with symmetrical features.</p>
<p>Men generally prefer women with feminine features and good fat distribution.</p>
</div>
</div>
<div class="tab-content" id="forum-tab">
<div class="stat-box">
<div class="stat-title">.org Forum</div>
<p>Status: <span id="forum-status">Not a member</span></p>
<div id="forum-join-container">
<p>Minimum age to join: 13 years old</p>
<button class="action-btn" id="join-org-btn" disabled>Join .org</button>
</div>
<div id="forum-actions-container" style="display: none;">
<div class="actions-container">
<button class="action-btn" id="post-thread-btn">Post Thread</button>
<button class="action-btn" id="comment-btn">Comment</button>
<button class="action-btn" id="share-experience-btn">Share Experience</button>
<button class="action-btn" id="ask-advice-btn">Ask for Advice</button>
</div>
</div>
</div>
</div>
<!-- New Archetypes Tab -->
<div class="tab-content" id="archetypes-tab">
<div class="archetype-container">
<h3>Male Archetypes (Requires .org Membership)</h3>
<div class="archetype-item">
<div class="archetype-title">Pretty Boy</div>
<div class="archetype-desc">Requirements: HMTN+, clear skin, feminine features, height 5'10"+</div>
<button class="select-archetype-btn" id="pretty-boy-btn" disabled>Select Archetype</button>
</div>
<div class="archetype-item">
<div class="archetype-title">Slender Triad</div>
<div class="archetype-desc">Requirements: Height 6'0"+, underweight BMI, narrow frame</div>
<button class="select-archetype-btn" id="slender-triad-btn" disabled>Select Archetype</button>
</div>
<div class="archetype-item">
<div class="archetype-title">Ogre</div>
<div class="archetype-desc">Requirements: Subhuman-Chad range, high bone mass, height 6'0"+</div>
<button class="select-archetype-btn" id="ogre-btn" disabled>Select Archetype</button>
</div>
</div>
<div class="archetype-container">
<h3>Female Archetypes</h3>
<div class="archetype-item">
<div class="archetype-title">Asian Baddie</div>
<div class="archetype-desc">Requirements: Asian race, MTN+, specific facial ratios, makeup frauding</div>
<button class="select-archetype-btn" id="asian-baddie-btn" disabled>Select Archetype</button>
</div>
<div class="archetype-item">
<div class="archetype-title">Latina Baddie</div>
<div class="archetype-desc">Requirements: Hispanic race, MTN+, specific body ratios, makeup frauding</div>
<button class="select-archetype-btn" id="latina-baddie-btn" disabled>Select Archetype</button>
</div>
<div class="archetype-item">
<div class="archetype-title">Baddie</div>
<div class="archetype-desc">Requirements: MTN+, ideal body ratios, no major failos</div>
<button class="select-archetype-btn" id="baddie-btn" disabled>Select Archetype</button>
</div>
</div>
</div>
<!-- New Hair Tab -->
<div class="tab-content" id="hair-tab">
<div class="stat-box">
<div class="stat-title">Hair Properties</div>
<p>Type: <span id="hair-type-display">Straight</span></p>
<p>Length: <span id="hair-length-display">Short</span></p>
<p>Health: <span id="hair-health-display">Healthy</span></p>
<div class="progress-bar">
<div class="progress-fill" id="hair-health-bar" style="width: 80%"></div>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Basic Haircut</div>
<div class="shop-item-desc">Standard haircut appropriate for your hair type.</div>
</div>
<div class="shop-item-action">
$30 <button class="action-btn" id="basic-haircut-btn">Get Haircut</button>
</div>
</div>
<div class="shop-item">
<div class="shop-item-info">
<div class="shop-item-title">Premium Styling</div>
<div class="shop-item-desc">Professional styling for maximum aesthetic appeal.</div>
</div>
<div class="shop-item-action">
$100 <button class="action-btn" id="premium-style-btn">Get Styled</button>
</div>
</div>
<div class="hair-style-item">
<div class="shop-item-info">
<div class="shop-item-title">Dreadlocks</div>
<div class="shop-item-desc">Best for Afro-textured hair. May damage other hair types.</div>
</div>
<div class="shop-item-action">
$200 <button class="action-btn" id="dreadlocks-btn">Get Style</button>
</div>
</div>
<div class="hair-style-item">
<div class="shop-item-info">
<div class="shop-item-title">Braids</div>
<div class="shop-item-desc">Works well on most hair types but best on Afro-textured hair.</div>
</div>
<div class="shop-item-action">
$150 <button class="action-btn" id="braids-btn">Get Style</button>
</div>
</div>
<div class="hair-style-item">
<div class="shop-item-info">
<div class="shop-item-title">Twists</div>
<div class="shop-item-desc">Ideal for Afro-textured hair. Requires regular retwisting.</div>
</div>
<div class="shop-item-action">
$180 <button class="action-btn" id="twists-btn">Get Style</button>
</div>
</div>
<div class="hair-style-item">
<div class="shop-item-info">
<div class="shop-item-title">UnderCut</div>
<div class="shop-item-desc">Popular modern cut. Works best on straight or wavy hair.</div>
</div>
<div class="shop-item-action">
$60 <button class="action-btn" id="undercut-btn">Get Style</button>
</div>
</div>
</div>
<div class="log-container" id="game-log">
<div class="log-entry"><span class="age-badge">Age 0</span> You were born. Your genetic traits have been determined.</div>
<div class="log-entry"><span class="age-badge">Age 0</span> Your parents have average height and bone structure.</div>
</div>
<footer>
<p>follow @trueslendertriad on tt</p>
</footer>
</div>
<!-- Modal for procedures -->
<div class="modal" id="procedure-modal">
<div class="modal-content">
<div class="modal-title" id="modal-procedure-title">Procedure</div>
<div class="modal-desc" id="modal-procedure-desc">Description of the procedure.</div>
<div class="modal-buttons">
<button class="modal-btn modal-btn-secondary" id="modal-cancel-btn">Cancel</button>
<button class="modal-btn modal-btn-primary" id="modal-confirm-btn">Confirm</button>
</div>
</div>
</div>
<!-- Generation selection modal (displayed after death) -->
<div class="modal" id="generation-modal">
<div class="modal-content">
<div class="modal-title">Continue Your Legacy</div>
<div class="modal-desc">You have died. Select a child to continue playing as:</div>
<div id="children-selection"></div>
<div class="modal-buttons">
<button class="modal-btn modal-btn-secondary" id="new-life-btn">Start New Life</button>
</div>
</div>
</div>
<script>
// Extensive game state with all new features
const gameState = {
age: 0,
neuroStatus: "Neurotypical",
iq: 100,
iqPotential: 100,
attractiveness: 4.5,
baseAttractiveness: 4.5,
height: 20, // in inches (1'8")
weight: 20, // in pounds
bmi: 0,
health: 80,
money: 0,
socialStatus: 50,
growthPlatesOpen: true,
alive: true,
fatherHeight: 70, // 5'10"
motherHeight: 64, // 5'4"
paternalGrandfatherHeight: 71,
paternalGrandmotherHeight: 65,
maternalGrandfatherHeight: 69,
maternalGrandmotherHeight: 63,
geneticPotential: 0.5,
physicalTraits: ["Symmetrical Face"],
facialTraits: ["Positive Canthal Tilt"],
skinTraits: ["Clear Skin"],
healthTraits: ["Good Metabolism"],
negativePhysical: ["Narrow Clavicles"],
negativeFacial: ["Recessed Maxilla"],
negativeSkin: [],
negativeHealth: [],
events: [],
heightPercentile: 50,
gender: Math.random() > 0.5 ? "male" : "female",
previousTier: "High Low Tier Normie",
race: "",
eyeColor: "",
smv: 4.5,
status: "Neutral",
onForum: false,
orgStatus: "gray",
forumReputation: 0,
peptidesUsed: [],
proceduresDone: [],
drugsUsed: [],
hardcapReached: false,
trueAdam: Math.random() < 0.0000000001, // 1 in 10 billion chance
palatalExpander: false,
futureDementia: false,
familyClass: "middle",
familySupport: 5000,
fillerActive: false,
gymAscension: 0,
steroidDamage: 0,
followers: 0,
socialMediaStatus: "none",
currentJob: null,
schoolLevel: "elementary",
boneMass: 50, // 0-100 scale
diabetesRisk: 0,
belowLtnResistance: 0, // Makes it hard to descend below LTN
// New properties for additional features
relationshipStatus: "single", // single, dating, married
partner: null,
children: [],
starving: false,
starvationEffects: 0,
lastMeal: 100, // 0-100 scale, 100 = fully fed
metabolismRate: 1.0,
bloating: false,
facialAsymmetry: Math.random() < 0.3, // 30% chance of facial asymmetry
feminineTraits: 0, // 0-100 scale for women
masculineTraits: 0, // 0-100 scale for men
breastAsymmetry: false,
obesity: false,
downSyndrome: Math.random() < 0.01, // 1% chance
fas: Math.random() < 0.02, // 2% chance
// New properties for additional features
hairType: "",
hairLength: 0, // 0-100 scale
hairHealth: 80,
hairStyle: "none",
archetype: "none",
humor: 50, // 0-100 scale
isCheating: false,
partnerCheating: false,
cheatingRisk: 0,
currentArchetype: "none"
};
// Updated tiers with adjusted distribution
const tiers = [
{ name: "Subhuman", min: 1, max: 2.9, class: "subhuman", rarity: 0.05 },
{ name: "Low Tier Normie", min: 3, max: 3.4, class: "ltn", rarity: 0.1 },
{ name: "High Low Tier Normie", min: 3.5, max: 4.9, class: "ltn", rarity: 0.25 },
{ name: "Low Mid Tier Normie", min: 5, max: 5.4, class: "mtn", rarity: 0.2 },
{ name: "High Mid Tier Normie", min: 5.5, max: 5.9, class: "mtn", rarity: 0.15 },
{ name: "Low High Tier Normie", min: 6, max: 6.3, class: "htn", rarity: 0.1 },
{ name: "High Tier Normie", min: 6.4, max: 6.6, class: "htn", rarity: 0.08 },
{ name: "Chad Lite", min: 6.7, max: 6.9, class: "chadlite", rarity: 0.05 },
{ name: "High Chad Lite", min: 7, max: 7.5, class: "chadlite", rarity: 0.015 },
{ name: "Chad", min: 7.6, max: 7.9, class: "chad", rarity: 0.005 },
{ name: "Adamlite", min: 8, max: 8.9, class: "chad", rarity: 0.0005 }, // Made extremely rare
{ name: "True Adam", min: 9, max: 10, class: "trueadam", rarity: 0.0000000001 }
];
// Jobs database
const jobs = [
{ id: "fastfood", name: "Fast Food Worker", iqReq: 0, pay: 8, hours: 20, degreeReq: false },
{ id: "retail", name: "Retail Associate", iqReq: 85, pay: 12, hours: 25, degreeReq: false },
{ id: "office", name: "Office Assistant", iqReq: 95, pay: 18, hours: 30, degreeReq: false },
{ id: "developer", name: "Software Developer", iqReq: 110, pay: 45, hours: 35, degreeReq: true },
{ id: "scientist", name: "Data Scientist", iqReq: 120, pay: 60, hours: 40, degreeReq: true },
{ id: "surgeon", name: "Surgeon", iqReq: 130, pay: 120, hours: 50, degreeReq: true }
];
// Biologically accurate height percentiles by age and gender
const heightPercentiles = {
male: {
0: 20, // newborn ~1'8"
1: 30, // 1 year ~2'6"
2: 34, // 2 years ~2'10"
3: 37, // 3 years ~3'1"
4: 40, // 4 years ~3'4"
5: 43, // 5 years ~3'7"
6: 45, // 6 years ~3'9"
7: 48, // 7 years ~4'0"
8: 50, // 8 years ~4'2"
9: 52, // 9 years ~4'4"
10: 54, // 10 years ~4'6"
11: 56, // 11 years ~4'8"
12: 59, // 12 years ~4'11"
13: 62, // 13 years ~5'2"
14: 65, // 14 years ~5'5"
15: 67, // 15 years ~5'7"
16: 68, // 16 years ~5'8"
17: 69, // 17 years ~5'9"
18: 69, // 18 years ~5'9"
19: 70, // 19 years ~5'10"
20: 70, // 20 years ~5'10"
},
female: {
0: 20, // newborn ~1'8"
1: 29, // 1 year ~2'5"
2: 33, // 2 years ~2'9"
3: 37, // 3 years ~3'1"
4: 40, // 4 years ~3'4"
5: 42, // 5 years ~3'6"
6: 45, // 6 years ~3'9"
7: 47, // 7 years ~3'11"
8: 50, // 8 years ~4'2"
9: 52, // 9 years ~4'4"
10: 54, // 10 years ~4'6"
11: 57, // 11 years ~4'9"
12: 60, // 12 years ~5'0"
13: 62, // 13 years ~5'2"
14: 63, // 14 years ~5'3"
15: 64, // 15 years ~5'4"
16: 64, // 16 years ~5'4"
17: 64, // 17 years ~5'4"
18: 64, // 18 years ~5'4"
19: 64, // 19 years ~5'4"
20: 64, // 20 years ~5'4"
}
};
// Weight percentiles by age and gender
const weightPercentiles = {
male: {
0: 7.5, // newborn
1: 22, // 1 year
2: 28, // 2 years
3: 32, // 3 years
4: 36, // 4 years
5: 40, // 5 years
6: 45, // 6 years
7: 50, // 7 years
8: 55, // 8 years
9: 60, // 9 years
10: 70, // 10 years
11: 80, // 11 years
12: 90, // 12 years
13: 105, // 13 years
14: 120, // 14 years
15: 135, // 15 years
16: 145, // 16 years
17: 155, // 17 years
18: 160, // 18 years
19: 165, // 19 years
20: 170, // 20 years
},
female: {
0: 7.5, // newborn
1: 21, // 1 year
2: 26, // 2 years
3: 31, // 3 years
4: 35, // 4 years
5: 39, // 5 years
6: 44, // 6 years
7: 49, // 7 years
8: 57, // 8 years
9: 68, // 9 years
10: 80, // 10 years
11: 95, // 11 years
12: 105, // 12 years
13: 115, // 13 years
14: 120, // 14 years
15: 125, // 15 years
16: 128, // 16 years
17: 130, // 17 years
18: 132, // 18 years
19: 134, // 19 years
20: 135, // 20 years
}
};
// Race modifiers for different features
const raceModifiers = {
caucasian: { boneStructure: 0.7, skinQuality: 0.6, hairQuality: 0.8, heightPotential: 0.8 },
asian: { boneStructure: 0.5, skinQuality: 0.9, hairQuality: 0.7, heightPotential: 0.6 },
black: { boneStructure: 0.8, skinQuality: 0.5, hairQuality: 0.4, heightPotential: 0.9 },
hispanic: { boneStructure: 0.6, skinQuality: 0.7, hairQuality: 0.8, heightPotential: 0.7 },
mixed: { boneStructure: 0.7, skinQuality: 0.8, hairQuality: 0.7, heightPotential: 0.8 }
};
// Hair types by race
const hairTypesByRace = {
caucasian: ["Straight", "Wavy", "Curly"],
asian: ["Straight", "Coarse"],
black: ["Afro", "Coily", "Kinky"],
hispanic: ["Straight", "Wavy", "Curly"],
mixed: ["Varies"] // Random selection from all types
};
// Eye colors by race
const eyeColors = {
caucasian: ["brown", "blue", "green", "hazel"],
asian: ["brown", "dark brown", "black"],
black: ["brown", "dark brown", "black"],
hispanic: ["brown", "hazel", "green"],
mixed: ["brown", "blue", "green", "hazel"]
};
// Family class modifiers
const familyClassModifiers = {
lower: { support: 1000, bracesChance: 0.1, expanderChance: 0.05, moneyRefusalChance: 0.7 },
middle: { support: 5000, bracesChance: 0.5, expanderChance: 0.3, moneyRefusalChance: 0.4 },
upper: { support: 20000, bracesChance: 0.9, expanderChance: 0.8, moneyRefusalChance: 0.2 }
};
// Partner preferences based on gender
const partnerPreferences = {
male: {
minHeight: 30, // 3'0"
maxHeight: 80, // 7'0"
minAttractiveness: 4.0,
importance: {
height: 0.3,
attractiveness: 0.6,
status: 0.1
}
},
female: {
minHeight: 30, // 3'0"
maxHeight: 80, // 7'0"
minAttractiveness: 5.0,
importance: {
height: 0.6,
attractiveness: 0.3,
status: 0.1
}
}
};
// DOM elements
const ageValue = document.getElementById('age-value');
const neuroStatus = document.getElementById('neuro-status');
const iqValue = document.getElementById('iq-value');
const iqPotential = document.getElementById('iq-potential');
const attractivenessValue = document.getElementById('attractiveness-value');
const tierBadge = document.getElementById('tier-badge');
const heightValue = document.getElementById('height-value');
const healthValue = document.getElementById('health-value');
const moneyValue = document.getElementById('money-value');
const socialValue = document.getElementById('social-value');
const physicalTraits = document.getElementById('physical-traits');
const facialTraits = document.getElementById('facial-traits');
const skinTraits = document.getElementById('skin-traits');
const healthTraits = document.getElementById('health-traits');
const gameLog = document.getElementById('game-log');
const heightPercentile = document.getElementById('height-percentile');
const heightPercentileValue = document.getElementById('height-percentile-value');
const tallerThan = document.getElementById('taller-than');
const raceValue = document.getElementById('race-value');
const eyeColorValue = document.getElementById('eye-color');
const smvValue = document.getElementById('smv-value');
const statusValue = document.getElementById('status-value');
const orgStatusValue = document.getElementById('org-status-value');
const orgStatusContainer = document.getElementById('org-status-container');
const forumStatus = document.getElementById('forum-status');
const forumJoinContainer = document.getElementById('forum-join-container');
const forumActionsContainer = document.getElementById('forum-actions-container');
const joinOrgBtn = document.getElementById('join-org-btn');
const familyClassValue = document.getElementById('family-class-value');
const familySupport = document.getElementById('family-support');
const familyClassText = document.getElementById('family-class-text');
const followersValue = document.getElementById('followers-value');
const socialMediaStatusContainer = document.getElementById('social-media-status-container');
const socialMediaStatusValue = document.getElementById('social-media-status-value');
const boneMassValue = document.getElementById('bone-mass-value');
const boneMassProgress = document.getElementById('bone-mass-progress');
const humorValue = document.getElementById('humor-value');
// Progress bars
const ageProgress = document.getElementById('age-progress');
const iqProgress = document.getElementById('iq-progress');
const heightProgress = document.getElementById('height-progress');
const healthProgress = document.getElementById('health-progress');
const socialProgress = document.getElementById('social-progress');
// Genetic display
const fatherHeight = document.getElementById('father-height');
const motherHeight = document.getElementById('mother-height');
const parentBone = document.getElementById('parent-bone');
const geneticPotential = document.getElementById('genetic-potential');
// Buttons
const ageBtn = document.getElementById('age-btn');
const skincareBtn = document.getElementById('skincare-btn');
const gymBtn = document.getElementById('gym-btn');
const studyBtn = document.getElementById('study-btn');
const workBtn = document.getElementById('work-btn');
const surgeryBtn = document.getElementById('surgery-btn');
const fraudBtn = document.getElementById('fraud-btn');
const diyFillerBtn = document.getElementById('diy-filler-btn');
const ropeBtn = document.getElementById('rope-btn');
const postThreadBtn = document.getElementById('post-thread-btn');
const commentBtn = document.getElementById('comment-btn');
const shareExperienceBtn = document.getElementById('share-experience-btn');
const askAdviceBtn = document.getElementById('ask-advice-btn');
const askMoneyBtn = document.getElementById('ask-money-btn');
const askBracesBtn = document.getElementById('ask-braces-btn');
const askExpanderBtn = document.getElementById('ask-expander-btn');
const tiktokPostBtn = document.getElementById('tiktok-post-btn');
const instagramPostBtn = document.getElementById('instagram-post-btn');
// Study buttons
const elementaryStudyBtn = document.getElementById('elementary-study-btn');
const middleStudyBtn = document.getElementById('middle-study-btn');
const highSchoolStudyBtn = document.getElementById('high-school-study-btn');
const collegeStudyBtn = document.getElementById('college-study-btn');
// Job buttons
const fastfoodJobBtn = document.getElementById('fastfood-job-btn');
const retailJobBtn = document.getElementById('retail-job-btn');
const officeJobBtn = document.getElementById('office-job-btn');
const developerJobBtn = document.getElementById('developer-job-btn');
const scientistJobBtn = document.getElementById('scientist-job-btn');
const surgeonJobBtn = document.getElementById('surgeon-job-btn');
// Procedure buttons
const bracesBtn = document.getElementById('braces-btn');
const jawSurgeryBtn = document.getElementById('jawsurgery-btn');
const buccalFatBtn = document.getElementById('buccalfat-btn');
const rhinoplastyBtn = document.getElementById('rhinoplasty-btn');
const limbLengtheningBtn = document.getElementById('limblengthening-btn');
const fillerBtn = document.getElementById('filler-btn');
const harmonizationFillerBtn = document.getElementById('harmonization-filler-btn');
const palatalExpanderBtn = document.getElementById('palatal-expander-btn');
const canthopexyBtn = document.getElementById('canthopexy-btn');
const eyelidFillerBtn = document.getElementById('eyelid-filler-btn');
const blepharoplastyBtn = document.getElementById('blepharoplasty-btn');
const keratopigmentationBtn = document.getElementById('keratopigmentation-btn');
// Peptide buttons
const igf1Btn = document.getElementById('igf1-btn');
const mk677Btn = document.getElementById('mk677-btn');
const hghBtn = document.getElementById('hgh-btn');
const ghkCuBtn = document.getElementById('ghk-cu-btn');
const minoxidilBtn = document.getElementById('minoxidil-btn');
const meclizineBtn = document.getElementById('meclizine-btn');
const cjcIpaBtn = document.getElementById('cjc-ipa-btn');
// Steroid buttons
const trenboloneBtn = document.getElementById('trenbolone-btn');
const anavarBtn = document.getElementById('anavar-btn');
// Nutrition buttons
const basicMealBtn = document.getElementById('basic-meal-btn');
const healthyMealBtn = document.getElementById('healthy-meal-btn');
const gainWeightBtn = document.getElementById('gain-weight-btn');
const loseWeightBtn = document.getElementById('lose-weight-btn');
// Dating buttons
const dateBtn = document.getElementById('date-btn');
const proposeBtn = document.getElementById('propose-btn');
const haveChildBtn = document.getElementById('have-child-btn');
const divorceBtn = document.getElementById('divorce-btn');
const confrontBtn = document.getElementById('confront-btn');
// Hair buttons
const basicHaircutBtn = document.getElementById('basic-haircut-btn');
const premiumStyleBtn = document.getElementById('premium-style-btn');
const dreadlocksBtn = document.getElementById('dreadlocks-btn');
const braidsBtn = document.getElementById('braids-btn');
const twistsBtn = document.getElementById('twists-btn');
const undercutBtn = document.getElementById('undercut-btn');
// Archetype buttons
const prettyBoyBtn = document.getElementById('pretty-boy-btn');
const slenderTriadBtn = document.getElementById('slender-triad-btn');
const ogreBtn = document.getElementById('ogre-btn');
const asianBaddieBtn = document.getElementById('asian-baddie-btn');
const latinaBaddieBtn = document.getElementById('latina-baddie-btn');
const baddieBtn = document.getElementById('baddie-btn');
// Tabs
const tabs = document.querySelectorAll('.tab');
const tabContents = document.querySelectorAll('.tab-content');
// Modal elements
const procedureModal = document.getElementById('procedure-modal');
const modalProcedureTitle = document.getElementById('modal-procedure-title');
const modalProcedureDesc = document.getElementById('modal-procedure-desc');
const modalCancelBtn = document.getElementById('modal-cancel-btn');
const modalConfirmBtn = document.getElementById('modal-confirm-btn');
const generationModal = document.getElementById('generation-modal');
const childrenSelection = document.getElementById('children-selection');
const newLifeBtn = document.getElementById('new-life-btn');
// New DOM elements for additional features
const weightValue = document.getElementById('weight-value');
const bmiValue = document.getElementById('bmi-value');
const bmiStatus = document.getElementById('bmi-status');
const bmiProgress = document.getElementById('bmi-progress');
const relationshipContainer = document.getElementById('relationship-container');
const relationshipStatusValue = document.getElementById('relationship-status-value');
const partnerInfoContainer = document.getElementById('partner-info-container');
const partnerName = document.getElementById('partner-name');
const partnerAttractiveness = document.getElementById('partner-attractiveness');
const partnerHeight = document.getElementById('partner-height');
const childrenCount = document.getElementById('children-count');
const childrenContainer = document.getElementById('children-container');
const datingStatusText = document.getElementById('dating-status-text');
const datingActions = document.getElementById('dating-actions');
const cheatingIndicator = document.getElementById('cheating-indicator');
const cheatingRiskValue = document.getElementById('cheating-risk-value');
const hairTypeDisplay = document.getElementById('hair-type-display');
const hairLengthDisplay = document.getElementById('hair-length-display');
const hairHealthDisplay = document.getElementById('hair-health-display');
const hairHealthBar = document.getElementById('hair-health-bar');
// Current procedure being considered
let currentProcedure = null;
// Initialize the game
function initGame() {
// Randomize initial stats with higher probability for lower tiers
gameState.neuroStatus = Math.random() > 0.8 ? "Neurodivergent" : "Neurotypical";
// Set IQ potential based on genetics (95-105 range, average 100)
gameState.iqPotential = Math.floor(Math.random() * 10) + 95;
// Apply conditions that lower IQ
if (gameState.downSyndrome) {
gameState.iqPotential = Math.floor(Math.random() * 30) + 40; // 40-70 for Down syndrome
gameState.negativeHealth.push("Down Syndrome");
}
if (gameState.fas) {
gameState.iqPotential = Math.max(60, gameState.iqPotential - 20); // Reduce IQ by 20 points
gameState.negativeHealth.push("Fetal Alcohol Syndrome");
}
gameState.iq = Math.floor(gameState.iqPotential * 0.8); // Start at 80% of potential
// Set True Adam if incredibly lucky
if (gameState.trueAdam) {
gameState.attractiveness = 9 + Math.random();
gameState.baseAttractiveness = gameState.attractiveness;
gameState.geneticPotential = 1;
} else {
// Most people between High Low Tier Normie and High Mid Tier Normie
// Adjusted distribution to make HLTN and HMTN most common
const tierRandom = Math.random();
if (tierRandom < 0.25) {
gameState.attractiveness = (Math.random() * 1.5) + 3.5; // 3.5 to 5.0 (HLTN)
} else if (tierRandom < 0.45) {
gameState.attractiveness = (Math.random() * 0.5) + 5.0; // 5.0 to 5.5 (LMTN)
} else if (tierRandom < 0.6) {
gameState.attractiveness = (Math.random() * 0.5) + 5.5; // 5.5 to 6.0 (HMTN)
} else if (tierRandom < 0.7) {
gameState.attractiveness = (Math.random() * 0.4) + 6.0; // 6.0 to 6.4 (LHTN)
} else if (tierRandom < 0.78) {
gameState.attractiveness = (Math.random() * 0.3) + 6.4; // 6.4 to 6.7 (HTN)
} else if (tierRandom < 0.83) {
gameState.attractiveness = (Math.random() * 0.3) + 6.7; // 6.7 to 7.0 (CL)
} else if (tierRandom < 0.845) {
gameState.attractiveness = (Math.random() * 0.5) + 7.0; // 7.0 to 7.5 (HCL)
} else if (tierRandom < 0.85) {
gameState.attractiveness = (Math.random() * 0.4) + 7.5; // 7.5 to 7.9 (Chad)
} else if (tierRandom < 0.8505) {
gameState.attractiveness = (Math.random() * 0.9) + 8.0; // 8.0 to 8.9 (Adamlite) - Extremely rare
} else {
gameState.attractiveness = (Math.random() * 1.5) + 2.0; // 2.0 to 3.5 (Subhuman to LTN)
}
gameState.baseAttractiveness = gameState.attractiveness;
}
// Apply conditions that lower attractiveness
if (gameState.downSyndrome) {
gameState.attractiveness = Math.max(1, gameState.attractiveness - 2);
gameState.baseAttractiveness = gameState.attractiveness;
}
if (gameState.fas) {
gameState.attractiveness = Math.max(1, gameState.attractiveness - 1);
gameState.baseAttractiveness = gameState.attractiveness;
}
// Set initial height based on age
gameState.height = heightPercentiles[gameState.gender][0];
gameState.weight = weightPercentiles[gameState.gender][0];
// Generate random parent and grandparent genetics
generateFamilyGenetics();
// Calculate genetic potential based on family
calculateGeneticPotential();
// Set race based on probability (predetermined at birth)
const raceRandom = Math.random();
if (raceRandom < 0.6) gameState.race = "caucasian";
else if (raceRandom < 0.75) gameState.race = "asian";
else if (raceRandom < 0.85) gameState.race = "black";
else if (raceRandom < 0.95) gameState.race = "hispanic";
else gameState.race = "mixed";
// Set eye color based on race
const eyeColorsForRace = eyeColors[gameState.race];
gameState.eyeColor = eyeColorsForRace[Math.floor(Math.random() * eyeColorsForRace.length)];
// Set family class
const classRandom = Math.random();
if (classRandom < 0.4) gameState.familyClass = "lower";
else if (classRandom < 0.8) gameState.familyClass = "middle";
else gameState.familyClass = "upper";
gameState.familySupport = familyClassModifiers[gameState.familyClass].support;
// Initialize hair system
initHairSystem();
// Generate random traits (without conflicts)
generateTraits();
// Update UI
updateUI();
// Add initial log entry
addLogEntry("You were born. Your genetic traits have been determined.");
addLogEntry(`Your father is ${formatHeight(gameState.fatherHeight)} and your mother is ${formatHeight(gameState.motherHeight)}.`);
addLogEntry(`You are ${gameState.gender}, ${gameState.race}, with ${gameState.eyeColor} eyes.`);
addLogEntry(`Your family is ${gameState.familyClass} class.`);
if (gameState.downSyndrome) {
addLogEntry("You were born with Down Syndrome.", "warning");
}
if (gameState.fas) {
addLogEntry("You have Fetal Alcohol Syndrome.", "warning");
}
if (gameState.trueAdam) {
addLogEntry("MIRACLE! You were born as a True Adam (1 in 10 billion chance)!", "success");
}
// Set up tab functionality
tabs.forEach(tab => {
tab.addEventListener('click', () => {
const tabId = tab.getAttribute('data-tab');
// Remove active class from all tabs and contents
tabs.forEach(t => t.classList.remove('active'));
tabContents.forEach(c => c.classList.remove('active'));
// Add active class to current tab and content
tab.classList.add('active');
document.getElementById(`${tabId}-tab`).classList.add('active');
});
});
// Set up modal buttons
modalCancelBtn.addEventListener('click', () => {
procedureModal.style.display = 'none';
});
modalConfirmBtn.addEventListener('click', () => {
procedureModal.style.display = 'none';
if (currentProcedure) {
performProcedure(currentProcedure);
}
});
newLifeBtn.addEventListener('click', () => {
generationModal.style.display = 'none';
restartGame();
});
// Set up procedure buttons
setupProcedureButton(bracesBtn, 'braces', 3000);
setupProcedureButton(jawSurgeryBtn, 'jawSurgery', 15000);
setupProcedureButton(buccalFatBtn, 'buccalFat', 4000);
setupProcedureButton(rhinoplastyBtn, 'rhinoplasty', 8000);
setupProcedureButton(limbLengtheningBtn, 'limbLengthening', 70000);
setupProcedureButton(fillerBtn, 'filler', 2000);
setupProcedureButton(harmonizationFillerBtn, 'harmonizationFiller', 5000);
setupProcedureButton(palatalExpanderBtn, 'palatalExpander', 4000);
setupProcedureButton(canthopexyBtn, 'canthopexy', 6000);
setupProcedureButton(eyelidFillerBtn, 'eyelidFiller', 3500);
setupProcedureButton(blepharoplastyBtn, 'blepharoplasty', 8000);
setupProcedureButton(keratopigmentationBtn, 'keratopigmentation', 7000);
// Set up peptide buttons
setupProcedureButton(igf1Btn, 'igf1', 500);
setupProcedureButton(mk677Btn, 'mk677', 300);
setupProcedureButton(hghBtn, 'hgh', 1000);
setupProcedureButton(ghkCuBtn, 'ghkCu', 200);
setupProcedureButton(minoxidilBtn, 'minoxidil', 50);
setupProcedureButton(meclizineBtn, 'meclizine', 400);
setupProcedureButton(cjcIpaBtn, 'cjcIpa', 600);
// Set up steroid buttons
setupProcedureButton(trenboloneBtn, 'trenbolone', 300);
setupProcedureButton(anavarBtn, 'anavar', 200);
// Set up nutrition buttons
basicMealBtn.addEventListener('click', () => eatMeal('basic', 5));
healthyMealBtn.addEventListener('click', () => eatMeal('healthy', 15));
gainWeightBtn.addEventListener('click', () => eatMeal('gain', 10));
loseWeightBtn.addEventListener('click', () => eatMeal('lose', 12));
// Set up dating buttons
dateBtn.addEventListener('click', goOnDate);
proposeBtn.addEventListener('click', proposeMarriage);
haveChildBtn.addEventListener('click', haveChild);
divorceBtn.addEventListener('click', initiateDivorce);
confrontBtn.addEventListener('click', confrontCheating);
// Set up forum button
joinOrgBtn.addEventListener('click', joinOrg);
postThreadBtn.addEventListener('click', () => forumAction('postThread'));
commentBtn.addEventListener('click', () => forumAction('comment'));
shareExperienceBtn.addEventListener('click', () => forumAction('shareExperience'));
askAdviceBtn.addEventListener('click', () => forumAction('askAdvice'));
// Set up family buttons
askMoneyBtn.addEventListener('click', askForMoney);
askBracesBtn.addEventListener('click', askForBraces);
askExpanderBtn.addEventListener('click', askForExpander);
// Set up social media buttons
tiktokPostBtn.addEventListener('click', () => postOnSocialMedia('tiktok'));
instagramPostBtn.addEventListener('click', () => postOnSocialMedia('instagram'));
// Set up study buttons
elementaryStudyBtn.addEventListener('click', () => study('elementary'));
middleStudyBtn.addEventListener('click', () => study('middle'));
highSchoolStudyBtn.addEventListener('click', () => study('highschool'));
collegeStudyBtn.addEventListener('click', () => study('college'));
// Set up job buttons
fastfoodJobBtn.addEventListener('click', () => applyForJob('fastfood'));
retailJobBtn.addEventListener('click', () => applyForJob('retail'));
officeJobBtn.addEventListener('click', () => applyForJob('office'));
developerJobBtn.addEventListener('click', () => applyForJob('developer'));
scientistJobBtn.addEventListener('click', () => applyForJob('scientist'));
surgeonJobBtn.addEventListener('click', () => applyForJob('surgeon'));
// Set up hair buttons
basicHaircutBtn.addEventListener('click', () => getHaircut('basic'));
premiumStyleBtn.addEventListener('click', () => getHaircut('premium'));
dreadlocksBtn.addEventListener('click', () => setHairstyle('dreadlocks'));
braidsBtn.addEventListener('click', () => setHairstyle('braids'));
twistsBtn.addEventListener('click', () => setHairstyle('twists'));
undercutBtn.addEventListener('click', () => setHairstyle('undercut'));
// Set up archetype buttons
prettyBoyBtn.addEventListener('click', () => selectArchetype('prettyBoy'));
slenderTriadBtn.addEventListener('click', () => selectArchetype('slenderTriad'));
ogreBtn.addEventListener('click', () => selectArchetype('ogre'));
asianBaddieBtn.addEventListener('click', () => selectArchetype('asianBaddie'));
latinaBaddieBtn.addEventListener('click', () => selectArchetype('latinaBaddie'));
baddieBtn.addEventListener('click', () => selectArchetype('baddie'));
// Set up other buttons
ageBtn.addEventListener('click', ageUp);
skincareBtn.addEventListener('click', doSkincare);
gymBtn.addEventListener('click', doGymWorkout);
studyBtn.addEventListener('click', doStudy);
workBtn.addEventListener('click', doWork);
fraudBtn.addEventListener('click', doFrauding);
diyFillerBtn.addEventListener('click', doDiyFiller);
ropeBtn.addEventListener('click', rope);
}
// Initialize hair system based on race
function initHairSystem() {
if (gameState.race === "mixed") {
// Combine all hair types for mixed race
const allTypes = [...hairTypesByRace.caucasian, ...hairTypesByRace.asian,
...hairTypesByRace.black, ...hairTypesByRace.hispanic];
gameState.hairType = allTypes[Math.floor(Math.random() * allTypes.length)];
} else {
const types = hairTypesByRace[gameState.race];
gameState.hairType = types[Math.floor(Math.random() * types.length)];
}
// Set initial hair length based on age
gameState.hairLength = Math.min(30, gameState.age * 2);
}
// Generate family genetics
function generateFamilyGenetics() {
// Generate grandparent heights
gameState.paternalGrandfatherHeight = Math.floor(Math.random() * 10) + 66; // 5'6" to 6'4"
gameState.paternalGrandmotherHeight = Math.floor(Math.random() * 10) + 60; // 5'0" to 5'10"
gameState.maternalGrandfatherHeight = Math.floor(Math.random() * 10) + 66; // 5'6" to 6'4"
gameState.maternalGrandmotherHeight = Math.floor(Math.random() * 10) + 60; // 5'0" to 5'10"
// Calculate parent heights based on grandparents (simplified)
gameState.fatherHeight = Math.floor((gameState.paternalGrandfatherHeight + gameState.paternalGrandmotherHeight + 5) / 2);
gameState.motherHeight = Math.floor((gameState.maternalGrandfatherHeight + gameState.maternalGrandmotherHeight) / 2);
}
// Calculate genetic potential based on family
function calculateGeneticPotential() {
// Calculate height potential based on family heights
const maleHeightPotential = (gameState.fatherHeight + gameState.paternalGrandfatherHeight + gameState.maternalGrandfatherHeight) / 3;
const femaleHeightPotential = (gameState.motherHeight + gameState.paternalGrandmotherHeight + gameState.maternalGrandmotherHeight) / 3;
// Adjust for gender
const heightPotential = gameState.gender === "male" ? maleHeightPotential : femaleHeightPotential;
// Convert to genetic potential (0 to 1 scale)
gameState.geneticPotential = (heightPotential - 74) / 12; // 5'4" to 7'4" becomes 0 to 1
gameState.geneticPotential = Math.max(0, Math.min(1, gameState.geneticPotential));
}
// Format height in feet and inches
function formatHeight(inches) {
const feet = Math.floor(inches / 12);
const remainingInches = inches % 12;
return `${feet}'${remainingInches}"`;
}
// Generate random traits without conflicts
function generateTraits() {
const attractivePhysicalTraits = [
"Symmetrical Face", "Wide Clavicles", "Broad Shoulders", "Tall Stature",
"Good Body Fat Distribution", "V-Taper Torso", "Long Limbs", "Good Posture"
];
const attractiveFacialTraits = [
"Positive Canthal Tilt", "Forward Grown Maxilla", "Strong Jawline",
"High Cheekbones", "Harmonious Features", "Good Facial Balance",
"Hooded Eyes", "Defined Cupid's Bow"
];
const attractiveSkinTraits = [
"Clear Skin", "Even Skin Tone", "Smooth Texture"
];
const unattractivePhysicalTraits = [
"Narrow Clavicles", "Short Stature", "Poor Body Fat Distribution",
"Round Shoulders", "Small Frame", "Poor Posture", "Short Neck",
"Small Wrists"
];
const unattractiveFacialTraits = [
"Recessed Maxilla", "Recessed Chin", "Negative Canthal Tilt",
"Asymmetrical Features", "Poor Facial Harmony", "Bug Eyes",
"Thin Lips", "Weak Jawline", "Malocclusion"
];
const unattractiveSkinTraits = [
"Acne", "Cystic Acne", "Hyperpigmentation", "Rosacea", "Large Pores",
"Scarring", "Oily Skin", "Dry Skin"
];
const healthTraits = [
"Good Metabolism", "Good Immune System", "Fast Recovery",
"Healthy Skin", "Thick Hair", "Good Cardiovascular Health"
];
const negativeHealthTraits = [
"Acne-Prone Skin", "Poor Metabolism", "Weak Immune System",
"Slow Recovery", "Balding Genes", "Allergies", "Asthma"
];
// Clear current traits
gameState.physicalTraits = [];
gameState.facialTraits = [];
gameState.skinTraits = [];
gameState.healthTraits = [];
gameState.negativePhysical = [];
gameState.negativeFacial = [];
gameState.negativeSkin = [];
gameState.negativeHealth = [];
// Add physical traits based on genetic potential
const physicalTraitCount = Math.floor(gameState.geneticPotential * 3) + 1;
for (let i = 0; i < physicalTraitCount; i++) {
const trait = attractivePhysicalTraits[Math.floor(Math.random() * attractivePhysicalTraits.length)];
if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.physicalTraits.push(trait);
}
}
// Add facial traits based on genetic potential
const facialTraitCount = Math.floor(gameState.geneticPotential * 3) + 1;
for (let i = 0; i < facialTraitCount; i++) {
const trait = attractiveFacialTraits[Math.floor(Math.random() * attractiveFacialTraits.length)];
if (!gameState.facialTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.facialTraits.push(trait);
}
}
// Add skin traits
const skinTraitCount = Math.floor(Math.random() * 2) + 1;
for (let i = 0; i < skinTraitCount; i++) {
const trait = attractiveSkinTraits[Math.floor(Math.random() * attractiveSkinTraits.length)];
if (!gameState.skinTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.skinTraits.push(trait);
}
}
// Add health traits
const healthTraitCount = Math.floor(Math.random() * 3) + 1;
for (let i = 0; i < healthTraitCount; i++) {
const trait = healthTraits[Math.floor(Math.random() * healthTraits.length)];
if (!gameState.healthTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.healthTraits.push(trait);
}
}
// Add negative physical traits (more likely with lower genetic potential)
const negativePhysicalCount = Math.floor((1 - gameState.geneticPotential) * 3) + 1;
for (let i = 0; i < negativePhysicalCount; i++) {
const trait = unattractivePhysicalTraits[Math.floor(Math.random() * unattractivePhysicalTraits.length)];
if (!gameState.negativePhysical.includes(trait) && !hasConflictingTrait(trait)) {
gameState.negativePhysical.push(trait);
}
}
// Add negative facial traits (more likely with lower genetic potential)
const negativeFacialCount = Math.floor((1 - gameState.geneticPotential) * 3) + 1;
for (let i = 0; i < negativeFacialCount; i++) {
const trait = unattractiveFacialTraits[Math.floor(Math.random() * unattractiveFacialTraits.length)];
if (!gameState.negativeFacial.includes(trait) && !hasConflictingTrait(trait)) {
gameState.negativeFacial.push(trait);
}
}
// Add negative skin traits
const negativeSkinCount = Math.floor(Math.random() * 3);
for (let i = 0; i < negativeSkinCount; i++) {
const trait = unattractiveSkinTraits[Math.floor(Math.random() * unattractiveSkinTraits.length)];
if (!gameState.negativeSkin.includes(trait) && !hasConflictingTrait(trait)) {
gameState.negativeSkin.push(trait);
}
}
// Add negative health traits
const negativeHealthCount = Math.floor(Math.random() * 2);
for (let i = 0; i < negativeHealthCount; i++) {
const trait = negativeHealthTraits[Math.floor(Math.random() * negativeHealthTraits.length)];
if (!gameState.negativeHealth.includes(trait) && !hasConflictingTrait(trait)) {
gameState.negativeHealth.push(trait);
}
}
// Add facial asymmetry if applicable
if (gameState.facialAsymmetry) {
gameState.negativeFacial.push("Facial Asymmetry");
}
// Add gender-specific traits
if (gameState.gender === "female") {
// Female-specific traits
const feminineTraitCount = Math.floor(gameState.geneticPotential * 2) + 1;
for (let i = 0; i < feminineTraitCount; i++) {
const trait = ["Wide Hips", "Narrow Shoulders", "Balanced Physique", "Clear Skin", "Good Fat Distribution"][Math.floor(Math.random() * 5)];
if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.physicalTraits.push(trait);
}
}
// Female-specific failos
if (Math.random() < 0.3) {
gameState.negativePhysical.push("Breast Asymmetry");
}
if (Math.random() < 0.2) {
gameState.negativeFacial.push("Masculinized Jaw");
}
} else {
// Male-specific traits
const masculineTraitCount = Math.floor(gameState.geneticPotential * 2) + 1;
for (let i = 0; i < masculineTraitCount; i++) {
const trait = ["Broad Shoulders", "Strong Jawline", "V-Taper Torso", "Defined Features"][Math.floor(Math.random() * 4)];
if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) {
gameState.physicalTraits.push(trait);
}
}
}
}
// Check for conflicting traits
function hasConflictingTrait(trait) {
const conflicts = {
"Good Metabolism": ["Poor Metabolism"],
"Poor Metabolism": ["Good Metabolism"],
"Good Immune System": ["Weak Immune System"],
"Weak Immune System": ["Good Immune System"],
"Fast Recovery": ["Slow Recovery"],
"Slow Recovery": ["Fast Recovery"],
"Clear Skin": ["Acne", "Cystic Acne", "Hyperpigmentation", "Rosacea", "Oily Skin", "Dry Skin"],
"Acne": ["Clear Skin"],
"Cystic Acne": ["Clear Skin"],
"Hyperpigmentation": ["Clear Skin"],
"Rosacea": ["Clear Skin"],
"Oily Skin": ["Clear Skin"],
"Dry Skin": ["Clear Skin"]
};
if (conflicts[trait]) {
for (const conflictingTrait of conflicts[trait]) {
if (gameState.physicalTraits.includes(conflictingTrait) ||
gameState.facialTraits.includes(conflictingTrait) ||
gameState.skinTraits.includes(conflictingTrait) ||
gameState.healthTraits.includes(conflictingTrait) ||
gameState.negativePhysical.includes(conflictingTrait) ||
gameState.negativeFacial.includes(conflictingTrait) ||
gameState.negativeSkin.includes(conflictingTrait) ||
gameState.negativeHealth.includes(conflictingTrait)) {
return true;
}
}
}
return false;
}
// Update the UI with current game state
function updateUI() {
// Update basic stats
ageValue.textContent = `${gameState.age} years old`;
neuroStatus.textContent = gameState.neuroStatus;
iqValue.textContent = gameState.iq;
iqPotential.textContent = gameState.iqPotential;
heightValue.textContent = formatHeight(gameState.height);
healthValue.textContent = getHealthStatus();
moneyValue.textContent = `$${gameState.money}`;
socialValue.textContent = getSocialStatus();
raceValue.textContent = gameState.race.charAt(0).toUpperCase() + gameState.race.slice(1);
eyeColorValue.textContent = gameState.eyeColor.charAt(0).toUpperCase() + gameState.eyeColor.slice(1);
smvValue.textContent = gameState.smv.toFixed(1);
statusValue.textContent = gameState.status;
followersValue.textContent = gameState.followers;
humorValue.textContent = gameState.humor;
// Update weight and BMI
weightValue.textContent = `${gameState.weight} lbs`;
// Calculate BMI: (weight in pounds / (height in inches)^2) * 703
gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703;
bmiValue.textContent = gameState.bmi.toFixed(1);
// Update BMI status
let bmiStatusText = "";
let bmiStatusClass = "";
if (gameState.bmi < 18.5) {
bmiStatusText = "Underweight";
bmiStatusClass = "underweight";
} else if (gameState.bmi < 25) {
bmiStatusText = "Normal";
bmiStatusClass = "normal";
} else if (gameState.bmi < 30) {
bmiStatusText = "Overweight";
bmiStatusClass = "overweight";
} else {
bmiStatusText = "Obese";
bmiStatusClass = "obese";
}
bmiStatus.textContent = bmiStatusText;
bmiStatus.className = "bmi-status " + bmiStatusClass;
// Update BMI progress bar (18.5-24.9 is normal range)
const bmiProgressValue = Math.max(0, Math.min(100, (gameState.bmi - 15) * 5));
bmiProgress.style.width = `${bmiProgressValue}%`;
// Update bone mass
boneMassValue.textContent = getBoneMassStatus();
boneMassProgress.style.width = `${gameState.boneMass}%`;
// Update genetic display
fatherHeight.textContent = formatHeight(gameState.fatherHeight);
motherHeight.textContent = formatHeight(gameState.motherHeight);
parentBone.textContent = gameState.geneticPotential > 0.6 ? "Good" : gameState.geneticPotential > 0.4 ? "Average" : "Poor";
geneticPotential.textContent = gameState.geneticPotential > 0.6 ? "High" : gameState.geneticPotential > 0.4 ? "Medium" : "Low";
// Update family class display
familyClassValue.textContent = gameState.familyClass.charAt(0).toUpperCase() + gameState.familyClass.slice(1);
familyClassValue.className = "family-class " + gameState.familyClass + "-class";
familySupport.textContent = `$${gameState.familySupport}`;
familyClassText.textContent = gameState.familyClass;
// Update height percentile
updateHeightPercentile();
heightPercentile.style.width = `${gameState.heightPercentile}%`;
heightPercentileValue.textContent = `${gameState.heightPercentile}%`;
tallerThan.textContent = `${gameState.heightPercentile}%`;
// Update attractiveness tier
const tier = getCurrentTier();
attractivenessValue.textContent = tier.name;
// Set tier badge text based on tier name
let tierBadgeText = "";
if (tier.name === "Subhuman") tierBadgeText = "SUB";
else if (tier.name === "Low Tier Normie") tierBadgeText = "LTN";
else if (tier.name === "High Low Tier Normie") tierBadgeText = "HLTN";
else if (tier.name === "Low Mid Tier Normie") tierBadgeText = "LMTN";
else if (tier.name === "High Mid Tier Normie") tierBadgeText = "HMTN";
else if (tier.name === "Low High Tier Normie") tierBadgeText = "LHTN";
else if (tier.name === "High Tier Normie") tierBadgeText = "HTN";
else if (tier.name === "Chad Lite") tierBadgeText = "CL";
else if (tier.name === "High Chad Lite") tierBadgeText = "HCL";
else if (tier.name === "Chad") tierBadgeText = "CHAD";
else if (tier.name === "Adamlite") tierBadgeText = "AL";
else if (tier.name === "True Adam") tierBadgeText = "TA";
tierBadge.textContent = tierBadgeText;
tierBadge.className = "tier-badge " + tier.class;
// Check if tier has decreased
if (tier.name !== gameState.previousTier && gameState.age > 0) {
const previousTierIndex = tiers.findIndex(t => t.name === gameState.previousTier);
const currentTierIndex = tiers.findIndex(t => t.name === tier.name);
if (currentTierIndex < previousTierIndex) {
addLogEntry(`Your attractiveness tier has decreased from ${gameState.previousTier} to ${tier.name}!`, "danger");
}
}
gameState.previousTier = tier.name;
// Update .org status if on forum
if (gameState.onForum) {
orgStatusContainer.style.display = 'block';
let orgStatusClass = 'gray-status';
let orgStatusText = 'Gray';
if (gameState.orgStatus === 'known') {
orgStatusClass = 'known-status';
orgStatusText = 'Known';
} else if (gameState.orgStatus === 'contributor') {
orgStatusClass = 'contributor-status';
orgStatusText = 'Contributor';
} else if (gameState.orgStatus === 'orgmaster') {
orgStatusClass = 'orgmaster-status';
orgStatusText = '.org Master';
}
orgStatusValue.className = 'status-badge ' + orgStatusClass;
orgStatusValue.textContent = orgStatusText;
forumStatus.textContent = 'Member';
forumJoinContainer.style.display = 'none';
forumActionsContainer.style.display = 'block';
} else {
orgStatusContainer.style.display = 'none';
forumStatus.textContent = 'Not a member';
forumJoinContainer.style.display = 'block';
forumActionsContainer.style.display = 'none';
}
// Enable/disable .org join button based on age
joinOrgBtn.disabled = gameState.age < 13;
// Update social media status
if (gameState.socialMediaStatus !== "none") {
socialMediaStatusContainer.style.display = 'block';
let statusText = "No Presence";
if (gameState.socialMediaStatus === "lolcow") {
statusText = "Lolcow (Negative Attention)";
} else if (gameState.socialMediaStatus === "influencer") {
statusText = "Influencer (" + gameState.followers + " followers)";
} else if (gameState.socialMediaStatus === "viral") {
statusText = "Viral Star (" + gameState.followers + " followers)";
}
socialMediaStatusValue.textContent = statusText;
} else {
socialMediaStatusContainer.style.display = 'none';
}
// Update relationship status
if (gameState.age >= 16) {
relationshipContainer.style.display = 'block';
let relationshipText = "";
let relationshipClass = "";
if (gameState.relationshipStatus === "single") {
relationshipText = "Single";
relationshipClass = "single";
} else if (gameState.relationshipStatus === "dating") {
relationshipText = "Dating";
relationshipClass = "dating";
} else if (gameState.relationshipStatus === "married") {
relationshipText = "Married";
relationshipClass = "married";
}
relationshipStatusValue.textContent = relationshipText;
relationshipStatusValue.className = "relationship-status " + relationshipClass;
// Show partner info if in a relationship
if (gameState.relationshipStatus !== "single" && gameState.partner) {
partnerInfoContainer.style.display = 'block';
partnerName.textContent = gameState.partner.name;
partnerAttractiveness.textContent = gameState.partner.attractiveness.toFixed(1);
partnerHeight.textContent = formatHeight(gameState.partner.height);
childrenCount.textContent = gameState.children.length;
// Show children if any
if (gameState.children.length > 0) {
childrenContainer.style.display = 'block';
childrenContainer.innerHTML = '';
gameState.children.forEach((child, index) => {
const childEl = document.createElement('div');
childEl.className = 'child-item';
childEl.textContent = `Child ${index + 1}: ${formatHeight(child.height)} tall, ${child.attractiveness.toFixed(1)} SMV`;
childrenContainer.appendChild(childEl);
});
} else {
childrenContainer.style.display = 'none';
}
} else {
partnerInfoContainer.style.display = 'none';
}
} else {
relationshipContainer.style.display = 'none';
}
// Update dating tab
if (gameState.age < 16) {
datingStatusText.textContent = "too young to date";
datingActions.style.display = 'none';
} else {
datingActions.style.display = 'block';
if (gameState.relationshipStatus === "single") {
datingStatusText.textContent = "single and looking";
dateBtn.style.display = 'block';
proposeBtn.style.display = 'none';
haveChildBtn.style.display = 'none';
divorceBtn.style.display = 'none';
confrontBtn.style.display = 'none';
} else if (gameState.relationshipStatus === "dating") {
datingStatusText.textContent = `dating ${gameState.partner.name}`;
dateBtn.style.display = 'none';
proposeBtn.style.display = 'block';
haveChildBtn.style.display = 'none';
divorceBtn.style.display = 'none';
confrontBtn.style.display = 'none';
} else if (gameState.relationshipStatus === "married") {
datingStatusText.textContent = `married to ${gameState.partner.name}`;
dateBtn.style.display = 'none';
proposeBtn.style.display = 'none';
haveChildBtn.style.display = 'block';
divorceBtn.style.display = 'block';
// Show confront button if cheating is detected
if (gameState.partnerCheating) {
confrontBtn.style.display = 'block';
} else {
confrontBtn.style.display = 'none';
}
}
// Show cheating indicator if married
if (gameState.relationshipStatus === "married") {
cheatingIndicator.style.display = 'block';
let riskText = "Low";
let riskClass = "low-risk";
if (gameState.cheatingRisk > 70) {
riskText = "High";
riskClass = "high-risk";
} else if (gameState.cheatingRisk > 40) {
riskText = "Medium";
riskClass = "medium-risk";
}
cheatingRiskValue.textContent = riskText;
cheatingRiskValue.className = "cheating-risk " + riskClass;
} else {
cheatingIndicator.style.display = 'none';
}
}
// Update hair UI
hairTypeDisplay.textContent = gameState.hairType;
let lengthText = "Short";
if (gameState.hairLength > 70) lengthText = "Very Long";
else if (gameState.hairLength > 50) lengthText = "Long";
else if (gameState.hairLength > 30) lengthText = "Medium";
hairLengthDisplay.textContent = lengthText;
let healthText = "Healthy";
if (gameState.hairHealth > 80) healthText = "Very Healthy";
else if (gameState.hairHealth > 60) healthText = "Healthy";
else if (gameState.hairHealth > 40) healthText = "Damaged";
else if (gameState.hairHealth > 20) healthText = "Very Damaged";
else healthText = "Unhealthy";
hairHealthDisplay.textContent = healthText;
hairHealthBar.style.width = `${gameState.hairHealth}%`;
// Update progress bars
ageProgress.style.width = `${(gameState.age / 80) * 100}%`;
iqProgress.style.width = `${((gameState.iq - 70) / 60) * 100}%`;
heightProgress.style.width = `${((gameState.height - 20) / 60) * 100}%`;
healthProgress.style.width = `${gameState.health}%`;
socialProgress.style.width = `${gameState.socialStatus}%`;
// Update traits
physicalTraits.innerHTML = '';
gameState.physicalTraits.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait';
traitEl.textContent = trait;
physicalTraits.appendChild(traitEl);
});
gameState.negativePhysical.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait negative-trait';
traitEl.textContent = trait;
physicalTraits.appendChild(traitEl);
});
facialTraits.innerHTML = '';
gameState.facialTraits.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait';
traitEl.textContent = trait;
facialTraits.appendChild(traitEl);
});
gameState.negativeFacial.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait negative-trait';
traitEl.textContent = trait;
facialTraits.appendChild(traitEl);
});
skinTraits.innerHTML = '';
gameState.skinTraits.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait';
traitEl.textContent = trait;
skinTraits.appendChild(traitEl);
});
gameState.negativeSkin.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait negative-trait';
traitEl.textContent = trait;
skinTraits.appendChild(traitEl);
});
healthTraits.innerHTML = '';
gameState.healthTraits.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait';
traitEl.textContent = trait;
healthTraits.appendChild(traitEl);
});
gameState.negativeHealth.forEach(trait => {
const traitEl = document.createElement('div');
traitEl.className = 'trait negative-trait';
traitEl.textContent = trait;
healthTraits.appendChild(traitEl);
});
// Update button states
surgeryBtn.disabled = gameState.age < 18 || gameState.money < 5000;
skincareBtn.disabled = gameState.money < 50;
gymBtn.disabled = gameState.money < 30 || gameState.gymAscension >= 2;
studyBtn.disabled = gameState.money < 20 || gameState.iq >= gameState.iqPotential;
workBtn.disabled = gameState.age < 16;
fraudBtn.disabled = gameState.money < 20;
diyFillerBtn.disabled = gameState.money < 100 || gameState.age < 11;
// Update procedure buttons
updateProcedureButton(bracesBtn, 3000);
updateProcedureButton(jawSurgeryBtn, 15000);
updateProcedureButton(buccalFatBtn, 4000);
updateProcedureButton(rhinoplastyBtn, 8000);
updateProcedureButton(limbLengtheningBtn, 70000);
updateProcedureButton(fillerBtn, 2000);
updateProcedureButton(harmonizationFillerBtn, 5000);
updateProcedureButton(palatalExpanderBtn, 4000, gameState.age >= 16);
updateProcedureButton(canthopexyBtn, 6000);
updateProcedureButton(eyelidFillerBtn, 3500);
updateProcedureButton(blepharoplastyBtn, 8000);
updateProcedureButton(keratopigmentationBtn, 7000);
// Update peptide buttons (available only from age 12)
updatePeptideButton(igf1Btn, 500, gameState.age >= 12);
updatePeptideButton(mk677Btn, 300, gameState.age >= 12);
updatePeptideButton(hghBtn, 1000, gameState.age >= 12);
updatePeptideButton(ghkCuBtn, 200, gameState.age >= 12);
updatePeptideButton(minoxidilBtn, 50, gameState.age >= 12);
updatePeptideButton(meclizineBtn, 400, gameState.age >= 12);
updatePeptideButton(cjcIpaBtn, 600, gameState.age >= 12);
// Update steroid buttons
updateProcedureButton(trenboloneBtn, 300, gameState.age >= 18);
updateProcedureButton(anavarBtn, 200, gameState.age >= 18);
// Update family buttons (ask for money only available from age 12)
askMoneyBtn.disabled = gameState.familySupport <= 0 || gameState.age < 12;
askBracesBtn.disabled = gameState.familySupport < 3000 || gameState.proceduresDone.includes("braces");
askExpanderBtn.disabled = gameState.familySupport < 4000 || gameState.age >= 16 || gameState.proceduresDone.includes("palatalExpander");
// Update study buttons based on age
elementaryStudyBtn.disabled = gameState.age > 12;
middleStudyBtn.disabled = gameState.age < 12 || gameState.age > 15;
highSchoolStudyBtn.disabled = gameState.age < 15 || gameState.age > 18;
collegeStudyBtn.disabled = gameState.age < 18;
// Update job buttons based on IQ requirements
updateJobButton(fastfoodJobBtn, 0);
updateJobButton(retailJobBtn, 85);
updateJobButton(officeJobBtn, 95);
updateJobButton(developerJobBtn, 110);
updateJobButton(scientistJobBtn, 120);
updateJobButton(surgeonJobBtn, 130);
// Update TikTok button based on age
tiktokPostBtn.disabled = gameState.age < 13;
// Update nutrition buttons
basicMealBtn.disabled = gameState.money < 5;
healthyMealBtn.disabled = gameState.money < 15;
gainWeightBtn.disabled = gameState.money < 10;
loseWeightBtn.disabled = gameState.money < 12;
// Update hair buttons
basicHaircutBtn.disabled = gameState.money < 30;
premiumStyleBtn.disabled = gameState.money < 100;
dreadlocksBtn.disabled = gameState.money < 200;
braidsBtn.disabled = gameState.money < 150;
twistsBtn.disabled = gameState.money < 180;
undercutBtn.disabled = gameState.money < 60;
// Update archetype buttons
updateArchetypeButtons();
}
// Get bone mass status text
function getBoneMassStatus() {
if (gameState.boneMass >= 80) return "Dense";
if (gameState.boneMass >= 60) return "Strong";
if (gameState.boneMass >= 40) return "Normal";
if (gameState.boneMass >= 20) return "Weak";
return "Fragile";
}
// Update height percentile based on age and gender
function updateHeightPercentile() {
const baseHeight = heightPercentiles[gameState.gender][gameState.age];
const heightDifference = gameState.height - baseHeight;
// Calculate percentile based on difference from average
if (heightDifference < -4) {
gameState.heightPercentile = 10;
} else if (heightDifference < -2) {
gameState.heightPercentile = 25;
} else if (heightDifference < 0) {
gameState.heightPercentile = 40;
} else if (heightDifference < 2) {
gameState.heightPercentile = 60;
} else if (heightDifference < 4) {
gameState.heightPercentile = 75;
} else if (heightDifference < 6) {
gameState.heightPercentile = 85;
} else if (heightDifference < 8) {
gameState.heightPercentile = 90;
} else if (heightDifference < 10) {
gameState.heightPercentile = 95;
} else {
gameState.heightPercentile = 99;
}
// Make above average height uncommon and very tall rare
if (gameState.height > 74) { // 6'2"
gameState.heightPercentile = 99;
} else if (gameState.height > 72) { // 6'0"
gameState.heightPercentile = 90;
} else if (gameState.height > 70) { // 5'10"
gameState.heightPercentile = 75;
}
}
// Get current attractiveness tier
function getCurrentTier() {
for (const tier of tiers) {
if (gameState.attractiveness >= tier.min && gameState.attractiveness <= tier.max) {
return tier;
}
}
return tiers[2]; // Default to High Low Tier Normie
}
// Get health status text
function getHealthStatus() {
if (gameState.health >= 80) return "Excellent";
if (gameState.health >= 60) return "Good";
if (gameState.health >= 40) return "Fair";
if (gameState.health >= 20) return "Poor";
return "Critical";
}
// Get social status text
function getSocialStatus() {
if (gameState.socialStatus >= 80) return "Popular";
if (gameState.socialStatus >= 60) return "Liked";
if (gameState.socialStatus >= 40) return "Neutral";
if (gameState.socialStatus >= 20) return "Disliked";
return "Bullied";
}
// Add a log entry
function addLogEntry(message, type = "info") {
const logEntry = document.createElement('div');
logEntry.className = 'log-entry';
let className = "";
if (type === "success") className = "success";
if (type === "danger") className = "danger";
if (type === "warning") className = "warning";
logEntry.innerHTML = `<span class="age-badge">Age ${gameState.age}</span> ${message}`;
if (className) logEntry.classList.add(className);
gameLog.appendChild(logEntry);
gameLog.scrollTop = gameLog.scrollHeight;
}
// Setup procedure button
function setupProcedureButton(button, procedure, cost) {
button.addEventListener('click', () => {
if (gameState.money >= cost) {
currentProcedure = procedure;
showProcedureModal(procedure, cost);
}
});
}
// Update procedure button state
function updateProcedureButton(button, cost, additionalCondition = true) {
button.disabled = gameState.money < cost || !additionalCondition;
}
// Update peptide button state (available only from age 12)
function updatePeptideButton(button, cost, additionalCondition = true) {
button.disabled = gameState.money < cost || !additionalCondition;
}
// Update job button state
function updateJobButton(button, iqReq) {
const job = jobs.find(j => j.id === button.id.replace('-job-btn', ''));
const hasDegree = gameState.schoolLevel === "college" && gameState.age >= 22;
button.disabled = gameState.iq < iqReq || gameState.currentJob === job.id || (job.degreeReq && !hasDegree);
}
// Update archetype button states
function updateArchetypeButtons() {
prettyBoyBtn.disabled = !canSelectArchetype('prettyBoy');
slenderTriadBtn.disabled = !canSelectArchetype('slenderTriad');
ogreBtn.disabled = !canSelectArchetype('ogre');
asianBaddieBtn.disabled = !canSelectArchetype('asianBaddie');
latinaBaddieBtn.disabled = !canSelectArchetype('latinaBaddie');
baddieBtn.disabled = !canSelectArchetype('baddie');
// Male archetypes require .org membership
if (gameState.gender === "male") {
prettyBoyBtn.disabled = prettyBoyBtn.disabled || !gameState.onForum;
slenderTriadBtn.disabled = slenderTriadBtn.disabled || !gameState.onForum;
ogreBtn.disabled = ogreBtn.disabled || !gameState.onForum;
}
}
// Check if player can select an archetype
function canSelectArchetype(archetype) {
const tier = getCurrentTier();
switch(archetype) {
case 'prettyBoy':
return tier.min >= 5.5 &&
gameState.height >= 70 &&
!gameState.negativeSkin.includes("Acne") &&
!gameState.negativeSkin.includes("Cystic Acne") &&
gameState.feminineTraits > 60;
case 'slenderTriad':
return gameState.height >= 72 &&
gameState.bmi < 18.5 &&
gameState.negativePhysical.includes("Narrow Clavicles");
case 'ogre':
return (tier.min >= 7.6 || tier.max <= 2.9) &&
gameState.height >= 72 &&
gameState.boneMass > 70;
case 'asianBaddie':
return gameState.race === "asian" &&
tier.min >= 5.0 &&
hasIdealRatios();
case 'latinaBaddie':
return gameState.race === "hispanic" &&
tier.min >= 5.0 &&
hasIdealRatios();
case 'baddie':
return tier.min >= 5.0 &&
hasIdealRatios() &&
gameState.negativeFacial.length === 0;
}
return false;
}
// Check if player has ideal facial/body ratios
function hasIdealRatios() {
// Simplified check for ideal ratios
return Math.random() > 0.7; // 30% chance of having ideal ratios
}
// Show procedure modal
function showProcedureModal(procedure, cost) {
let title = "";
let description = "";
let risk = "";
switch(procedure) {
case 'braces':
title = "Braces";
description = "Corrects malocclusion and straightens teeth. Risk of botch if no dental issues present.";
risk = "Medium";
break;
case 'jawSurgery':
title = "Jaw Surgery";
description = "Fixes recessed maxilla or mandible. Significant improvement to facial structure but high risk of complications.";
risk = "High";
break;
case 'buccalFat':
title = "Buccal Fat Removal";
description = "Removes cheek fat for more defined cheekbones. Can cause premature aging if overdone.";
risk = "Medium";
break;
case 'rhinoplasty':
title = "Rhinoplasty";
description = "Reshapes the nose. High botch potential but can significantly improve facial harmony.";
risk = "High";
break;
case 'limbLengthening':
title = "Limb Lengthening Surgery";
description = "Increases height by 3-4 inches. Extremely painful and risky with long recovery time.";
risk = "High";
break;
case 'filler':
title = "Professional Filler";
description = "Adds volume to lips, cheeks, or jawline. Low risk but temporary results.";
risk = "Low";
break;
case 'harmonizationFiller':
title = "Facial Harmonization Filler";
description = "Advanced filler techniques to improve facial harmony and balance. Can push past natural hardcaps and ascend up to 2 tiers.";
risk = "Medium";
break;
case 'palatalExpander':
title = "Palatal Expander";
description = "Widens the upper jaw. Only effective before age 16. Risk of fusion with peptides.";
risk = "Medium";
break;
case 'canthopexy':
title = "Canthopexy";
description = "Lifts the outer corner of the eyes for a more alert, positive canthal tilt.";
risk = "High";
break;
case 'eyelidFiller':
title = "Upper Eyelid Filler";
description = "Adds volume to upper eyelids for a more hunter-eyed/hooded appearance.";
risk = "Medium";
break;
case 'blepharoplasty':
title = "Blepharoplasty";
description = "Eyelid surgery to remove excess skin or fat from the eyelids.";
risk = "High";
break;
case 'keratopigmentation':
title = "Keratopigmentation";
description = "Permanent eye color change procedure. Risk of blindness if botched.";
risk = "Medium";
break;
case 'igf1':
title = "IGF-1 Peptides";
description = "Stimulates growth before plates close. After closure, risk of acromegaly, organ enlargement, and diabetes.";
risk = "High";
break;
case 'mk677':
title = "MK-677";
description = "Growth hormone secretagogue. Increases height potential and bone mass but may cause insulin resistance.";
risk = "Medium";
break;
case 'hgh':
title = "Human Growth Hormone";
description = "Maximizes growth potential and increases bone mass. High risk of side effects including acromegaly and cardiovascular issues.";
risk = "High";
break;
case 'ghkCu':
title = "GHK-Cu";
description = "Copper peptide for skin rejuvenation and improved complexion.";
risk = "Low";
break;
case 'minoxidil':
title = "Minoxidil";
description = "Promotes facial hair growth and prevents balding. Low risk but requires continuous use.";
risk = "Low";
break;
case 'meclizine':
title = "Meclizine/Aromatase Inhibitors";
description = "May increase height by delaying growth plate closure. Very low success rate. Risk of dementia later in life.";
risk = "High";
break;
case 'cjcIpa':
title = "CJC no DAC + IPA";
description = "Growth hormone releasing peptide combination. May increase height and improve recovery.";
risk = "Medium";
break;
case 'trenbolone':
title = "Trenbolone";
description = "Extremely powerful steroid. Very dangerous for teens, dangerous for adults.";
risk = "High";
break;
case 'anavar':
title = "Anavar";
description = "Milder steroid but still dangerous. Can cause liver damage.";
risk = "High";
break;
}
modalProcedureTitle.textContent = title;
modalProcedureDesc.innerHTML = `${description}<br><br>Cost: $${cost}<br>Risk: <span class="risk-indicator ${risk.toLowerCase()}-risk">${risk} Risk</span>`;
procedureModal.style.display = 'flex';
}
// Perform procedure
function performProcedure(procedure) {
let cost = 0;
let success = false;
let message = "";
let messageType = "info";
let attractivenessChange = 0;
let healthChange = 0;
let heightChange = 0;
let boneMassChange = 0;
switch(procedure) {
case 'braces':
cost = 3000;
if (gameState.negativeFacial.includes("Malocclusion")) {
success = true;
const index = gameState.negativeFacial.indexOf("Malocclusion");
gameState.negativeFacial.splice(index, 1);
message = "Braces successfully corrected your malocclusion.";
attractivenessChange = 0.3;
} else {
message = "Braces were unnecessary and caused dental problems.";
messageType = "danger";
healthChange = -5;
}
break;
case 'jawSurgery':
cost = 15000;
if (gameState.negativeFacial.includes("Recessed Maxilla") || gameState.negativeFacial.includes("Recessed Chin")) {
success = true;
if (gameState.negativeFacial.includes("Recessed Maxilla")) {
const index = gameState.negativeFacial.indexOf("Recessed Maxilla");
gameState.negativeFacial.splice(index, 1);
}
if (gameState.negativeFacial.includes("Recessed Chin")) {
const index = gameState.negativeFacial.indexOf("Recessed Chin");
gameState.negativeFacial.splice(index, 1);
}
message = "Jaw surgery successfully improved your facial structure.";
attractivenessChange = 0.8;
healthChange = -10; // Surgery recovery
} else {
if (Math.random() < 0.7) {
message = "Jaw surgery was unnecessary and resulted in a botched outcome.";
messageType = "danger";
attractivenessChange = -0.5;
healthChange = -15;
} else {
message = "Jaw surgery provided minor improvement despite not being necessary.";
attractivenessChange = 0.2;
healthChange = -10;
}
}
break;
case 'buccalFat':
cost = 4000;
if (gameState.negativePhysical.includes("Poor Body Fat Distribution") || Math.random() < 0.6) {
success = true;
if (gameState.negativePhysical.includes("Poor Body Fat Distribution")) {
const index = gameState.negativePhysical.indexOf("Poor Body Fat Distribution");
gameState.negativePhysical.splice(index, 1);
}
message = "Buccal fat removal improved your facial definition.";
attractivenessChange = 0.4;
} else {
message = "Buccal fat removal was overdone, causing premature aging.";
messageType = "danger";
attractivenessChange = -0.3;
healthChange = -5;
}
break;
case 'rhinoplasty':
cost = 8000;
if (gameState.negativeFacial.includes("Asymmetrical Features") || Math.random() < 0.5) {
success = true;
if (gameState.negativeFacial.includes("Asymmetrical Features")) {
const index = gameState.negativeFacial.indexOf("Asymmetrical Features");
gameState.negativeFacial.splice(index, 1);
}
message = "Rhinoplasty improved your nasal appearance.";
attractivenessChange = 0.5;
} else {
message = "Rhinoplasty resulted in a botched nose.";
messageType = "danger";
attractivenessChange = -0.7;
}
healthChange = -8;
break;
case 'limbLengthening':
cost = 70000;
if (gameState.height < 70 && Math.random() < 0.7) {
success = true;
gameState.height += 3;
message = "Limb lengthening surgery increased your height by 3 inches.";
attractivenessChange = 0.6;
} else {
message = "Limb lengthening surgery resulted in complications and poor outcomes.";
messageType = "danger";
healthChange = -20;
attractivenessChange = -0.3;
}
healthChange = -15;
break;
case 'filler':
cost = 2000;
success = true;
message = "Professional filler enhanced your facial features.";
attractivenessChange = 0.3;
gameState.fillerActive = true;
// Filler is temporary
setTimeout(() => {
gameState.attractiveness -= 0.2;
gameState.fillerActive = false;
addLogEntry("Your filler has worn off.", "warning");
updateUI();
}, 60000); // 1 minute = 1-2 years in game time
break;
case 'harmonizationFiller':
cost = 5000;
success = true;
// Correct facial asymmetry
if (gameState.facialAsymmetry) {
gameState.facialAsymmetry = false;
const index = gameState.negativeFacial.indexOf("Facial Asymmetry");
if (index !== -1) {
gameState.negativeFacial.splice(index, 1);
}
message = "Facial harmonization filler corrected your facial asymmetry and improved your facial harmony.";
attractivenessChange = 0.8;
} else {
// Calculate tier improvement (up to 2 tiers)
const currentTierIndex = tiers.findIndex(t =>
gameState.attractiveness >= t.min && gameState.attractiveness <= t.max
);
let maxTierIncrease = 2;
if (currentTierIndex + maxTierIncrease >= tiers.length) {
maxTierIncrease = tiers.length - currentTierIndex - 1;
}
// Determine actual improvement (1-2 tiers)
const tierIncrease = Math.floor(Math.random() * maxTierIncrease) + 1;
const targetTier = tiers[currentTierIndex + tierIncrease];
// Calculate attractiveness needed to reach target tier
const minAttractiveness = targetTier.min;
const maxAttractiveness = Math.min(targetTier.max, gameState.baseAttractiveness + 1.5);
// Set new attractiveness
gameState.attractiveness = minAttractiveness + (Math.random() * (maxAttractiveness - minAttractiveness));
message = `Facial harmonization filler significantly improved your facial harmony. You ascended ${tierIncrease} tier(s)!`;
}
gameState.fillerActive = true;
// Filler is temporary but with some permanent improvement
setTimeout(() => {
gameState.attractiveness -= 0.5;
gameState.fillerActive = false;
addLogEntry("Your harmonization filler has partially worn off, but you retained some improvement.", "warning");
updateUI();
}, 90000); // 1.5 minutes = 2-3 years in game time
break;
case 'palatalExpander':
cost = 4000;
if (gameState.age < 16) {
success = true;
gameState.palatalExpander = true;
message = "Palatal expander installed. It will gradually widen your jaw.";
attractivenessChange = 0.2;
} else {
message = "Palatal expander is only effective before age 16. It had no effect.";
messageType = "warning";
}
break;
case 'canthopexy':
cost = 6000;
if (gameState.negativeFacial.includes("Negative Canthal Tilt")) {
success = true;
const index = gameState.negativeFacial.indexOf("Negative Canthal Tilt");
gameState.negativeFacial.splice(index, 1);
gameState.facialTraits.push("Positive Canthal Tilt");
message = "Canthopexy successfully improved your eye shape.";
attractivenessChange = 0.4;
} else if (Math.random() < 0.7) {
success = true;
message = "Canthopexy provided a subtle improvement to your eye area.";
attractivenessChange = 0.2;
} else {
message = "Canthopexy resulted in an unnatural look.";
messageType = "danger";
attractivenessChange = -0.3;
}
healthChange = -8;
break;
case 'eyelidFiller':
cost = 3500;
success = true;
if (gameState.negativeFacial.includes("Bug Eyes")) {
const index = gameState.negativeFacial.indexOf("Bug Eyes");
gameState.negativeFacial.splice(index, 1);
message = "Eyelid filler improved your eye shape, making them less prominent.";
} else {
message = "Eyelid filler added a more hunter-eyed appearance.";
}
attractivenessChange = 0.3;
break;
case 'blepharoplasty':
cost = 8000;
if (Math.random() < 0.6) {
success = true;
if (gameState.negativeFacial.includes("Hooded Eyes")) {
const index = gameState.negativeFacial.indexOf("Hooded Eyes");
gameState.negativeFacial.splice(index, 1);
message = "Blepharoplasty successfully reduced your hooded eyelids.";
} else {
message = "Blepharoplasty improved your eyelid appearance.";
}
attractivenessChange = 0.4;
} else {
message = "Blepharoplasty resulted in an unnatural or overdone look.";
messageType = "danger";
attractivenessChange = -0.5;
}
healthChange = -10;
break;
case 'keratopigmentation':
cost = 7000;
if (Math.random() < 0.8) {
success = true;
const newColor = eyeColors[gameState.race][Math.floor(Math.random() * eyeColors[gameState.race].length)];
gameState.eyeColor = newColor;
message = `Keratopigmentation successfully changed your eye color to ${newColor}.`;
attractivenessChange = 0.3;
} else {
message = "Keratopigmentation resulted in an unnatural eye color.";
messageType = "danger";
attractivenessChange = -0.4;
healthChange = -5;
}
break;
case 'igf1':
cost = 500;
if (gameState.growthPlatesOpen) {
// Check for palatal expander interaction
if (gameState.palatalExpander && Math.random() < 0.6) {
message = "IGF-1 caused your sutures to fuse prematurely! Botched result.";
messageType = "danger";
gameState.negativeFacial.push("Futed Sutures");
attractivenessChange = -0.8;
healthChange = -10;
} else {
success = true;
// Calculate height increase based on genetic potential
const heightIncrease = 1 + (gameState.geneticPotential * 2); // 1-3 inches
gameState.height += heightIncrease;
message = `IGF-1 peptides increased your height by ${heightIncrease.toFixed(1)} inches.`;
attractivenessChange = 0.2;
// Chance of diabetes
if (Math.random() < 0.3) {
gameState.diabetesRisk += 20;
addLogEntry("IGF-1 use has increased your risk of developing diabetes.", "warning");
}
}
} else {
if (Math.random() < 0.4) {
message = "IGF-1 use after growth plate closure caused acromegaly.";
messageType = "danger";
gameState.negativeFacial.push("Acromegaly Features");
attractivenessChange = -0.8;
healthChange = -10;
} else {
message = "IGF-1 had no effect after growth plate closure.";
messageType = "warning";
}
}
gameState.peptidesUsed.push("IGF-1");
break;
case 'mk677':
cost = 300;
if (gameState.growthPlatesOpen) {
success = true;
// Calculate height increase based on genetic potential
const heightIncrease = 0.5 + (gameState.geneticPotential * 1); // 0.5-1.5 inches
gameState.height += heightIncrease;
gameState.boneMass += 5;
message = `MK-677 increased your height by ${heightIncrease.toFixed(1)} inches and improved bone mass.`;
attractivenessChange = 0.1;
} else {
message = "MK-677 had minimal effect after growth plate closure.";
messageType = "warning";
}
gameState.peptidesUsed.push("MK-677");
break;
case 'hgh':
cost = 1000;
if (gameState.growthPlatesOpen) {
success = true;
// Calculate height increase based on genetic potential
const heightIncrease = 1.5 + (gameState.geneticPotential * 2); // 1.5-3.5 inches
gameState.height += heightIncrease;
gameState.boneMass += 8;
message = `HGH significantly increased your height by ${heightIncrease.toFixed(1)} inches and improved bone mass.`;
attractivenessChange = 0.3;
} else {
if (Math.random() < 0.6) {
message = "HGH use after growth plate closure caused severe acromegaly.";
messageType = "danger";
gameState.negativeFacial.push("Severe Acromegaly");
attractivenessChange = -1.2;
healthChange = -15;
} else {
message = "HGH had no significant effect after growth plate closure.";
messageType = "warning";
}
}
gameState.peptidesUsed.push("HGH");
break;
case 'ghkCu':
cost = 200;
success = true;
if (gameState.negativeSkin.length > 0) {
const skinIssue = gameState.negativeSkin[Math.floor(Math.random() * gameState.negativeSkin.length)];
const index = gameState.negativeSkin.indexOf(skinIssue);
gameState.negativeSkin.splice(index, 1);
message = `GHK-Cu improved your skin and cleared your ${skinIssue}.`;
} else {
message = "GHK-Cu improved your skin quality.";
}
attractivenessChange = 0.2;
gameState.peptidesUsed.push("GHK-Cu");
break;
case 'minoxidil':
cost = 50;
success = true;
if (gameState.negativeHealth.includes("Balding Genes")) {
const index = gameState.negativeHealth.indexOf("Balding Genes");
gameState.negativeHealth.splice(index, 1);
message = "Minoxidil prevented hair loss and promoted beard growth.";
} else {
message = "Minoxidil promoted beard growth.";
}
attractivenessChange = 0.2;
gameState.peptidesUsed.push("Minoxidil");
break;
case 'meclizine':
cost = 400;
// 5% chance of working
if (Math.random() < 0.05 && gameState.growthPlatesOpen) {
success = true;
// Calculate height increase based on genetic potential
const heightIncrease = 1 + (gameState.geneticPotential * 1); // 1-2 inches
gameState.height += heightIncrease;
message = `Meclizine/Aromatase Inhibitors delayed growth plate closure and increased your height by ${heightIncrease.toFixed(1)} inches!`;
attractivenessChange = 0.2;
// Set future dementia risk
gameState.futureDementia = true;
addLogEntry("Warning: This medication may cause dementia later in life.", "warning");
} else {
message = "Meclizine/Aromatase Inhibitors had no effect on your height.";
messageType = "warning";
// Still risk dementia even if it doesn't work
if (Math.random() < 0.3) {
gameState.futureDementia = true;
addLogEntry("Warning: This medication may cause dementia later in life.", "warning");
}
}
gameState.peptidesUsed.push("Meclizine/AI");
break;
case 'cjcIpa':
cost = 600;
if (gameState.growthPlatesOpen) {
success = true;
// Calculate height increase based on genetic potential
const heightIncrease = 0.7 + (gameState.geneticPotential * 0.8); // 0.7-1.5 inches
gameState.height += heightIncrease;
message = `CJC no DAC + IPA increased your height by ${heightIncrease.toFixed(1)} inches.`;
attractivenessChange = 0.15;
} else {
message = "CJC no DAC + IPA had minimal effect after growth plate closure.";
messageType = "warning";
}
gameState.peptidesUsed.push("CJC+IPA");
break;
case 'trenbolone':
cost = 300;
// Extreme risk for teens
if (gameState.age < 18) {
message = "Trenbolone use as a teen caused permanent health damage!";
messageType = "danger";
healthChange = -30;
gameState.steroidDamage += 20;
} else {
if (Math.random() < 0.7) {
message = "Trenbolone use caused serious health complications.";
messageType = "danger";
healthChange = -20;
gameState.steroidDamage += 15;
} else {
success = true;
message = "Trenbolone increased your muscle mass but with side effects.";
attractivenessChange = 0.4;
healthChange = -10;
gameState.steroidDamage += 5;
}
}
gameState.drugsUsed.push("Trenbolone");
break;
case 'anavar':
cost = 200;
// High risk for teens
if (gameState.age < 18) {
message = "Anavar use as a teen caused health problems!";
messageType = "danger";
healthChange = -20;
gameState.steroidDamage += 10;
} else {
if (Math.random() < 0.5) {
message = "Anavar use caused health complications.";
messageType = "danger";
healthChange = -15;
gameState.steroidDamage += 8;
} else {
success = true;
message = "Anavar increased your muscle mass with some side effects.";
attractivenessChange = 0.3;
healthChange = -5;
gameState.steroidDamage += 3;
}
}
gameState.drugsUsed.push("Anavar");
break;
}
gameState.money -= cost;
gameState.attractiveness += attractivenessChange;
gameState.health += healthChange;
gameState.height += heightChange;
gameState.boneMass = Math.min(100, gameState.boneMass + boneMassChange);
// Make it extremely hard to descend below LTN
if (gameState.attractiveness < 3.0) {
// Build up resistance - the longer you're below LTN, the harder it is to go lower
gameState.belowLtnResistance += 0.1;
// Chance to resist further decrease based on resistance
const resistanceChance = Math.min(0.9, gameState.belowLtnResistance * 0.3);
if (Math.random() < resistanceChance) {
gameState.attractiveness = 3.0;
addLogEntry("You've hit the floor of Low Tier Normie. It's extremely difficult to descend further.", "warning");
}
} else {
// Reset resistance when above LTN
gameState.belowLtnResistance = 0;
}
// Make Adamlite virtually impossible to reach (only through extreme procedures)
if (gameState.attractiveness > 8.0 && !gameState.trueAdam) {
const adamLiteChance = 0.0005; // 0.05% chance to keep Adamlite status
if (Math.random() > adamLiteChance) {
gameState.attractiveness = 7.9;
addLogEntry("You've reached the genetic hardcap at Chad tier. Adamlite is virtually impossible to achieve.", "warning");
}
}
if (procedure !== 'igf1' && procedure !== 'mk677' && procedure !== 'hgh' &&
procedure !== 'ghkCu' && procedure !== 'minoxidil' && procedure !== 'meclizine' &&
procedure !== 'cjcIpa' && procedure !== 'trenbolone' && procedure !== 'anavar') {
gameState.proceduresDone.push(procedure);
}
addLogEntry(message, messageType);
updateUI();
}
// Eat a meal function
function eatMeal(type, cost) {
if (gameState.money < cost) {
addLogEntry(`You don't have enough money for this meal.`, "warning");
return;
}
gameState.money -= cost;
gameState.lastMeal = 100; // Reset hunger
let message = "";
let healthChange = 0;
let weightChange = 0;
switch(type) {
case 'basic':
message = "You ate a basic meal.";
healthChange = 2;
weightChange = 0.5;
break;
case 'healthy':
message = "You ate a healthy, nutritious meal.";
healthChange = 5;
weightChange = 0.2;
break;
case 'gain':
message = "You ate a high-calorie meal to gain weight.";
healthChange = 1;
weightChange = 2;
break;
case 'lose':
message = "You ate a low-calorie meal to lose weight.";
healthChange = 3;
weightChange = -1;
break;
}
gameState.health = Math.min(100, gameState.health + healthChange);
gameState.weight = Math.max(10, gameState.weight + weightChange);
// Update BMI
gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703;
// Update bloating based on BMI
if (gameState.bmi > 25 && !gameState.bloating) {
gameState.bloating = true;
if (!gameState.negativePhysical.includes("Bloated Face")) {
gameState.negativePhysical.push("Bloated Face");
}
addLogEntry("You've developed a bloated face from weight gain.", "warning");
} else if (gameState.bmi <= 25 && gameState.bloating) {
gameState.bloating = false;
const index = gameState.negativePhysical.indexOf("Bloated Face");
if (index !== -1) {
gameState.negativePhysical.splice(index, 1);
}
addLogEntry("Your face is less bloated after weight loss.", "success");
}
// Update obesity trait
if (gameState.bmi > 30 && !gameState.obesity) {
gameState.obesity = true;
if (!gameState.negativePhysical.includes("Obesity")) {
gameState.negativePhysical.push("Obesity");
}
addLogEntry("You've become obese, which affects your appearance and health.", "danger");
gameState.attractiveness -= 0.5;
gameState.health -= 10;
} else if (gameState.bmi <= 30 && gameState.obesity) {
gameState.obesity = false;
const index = gameState.negativePhysical.indexOf("Obesity");
if (index !== -1) {
gameState.negativePhysical.splice(index, 1);
}
addLogEntry("You're no longer obese. Your health has improved.", "success");
gameState.attractiveness += 0.3;
gameState.health += 5;
}
addLogEntry(message, "success");
updateUI();
}
// Ask family for money (with chance of refusal)
function askForMoney() {
if (gameState.familySupport <= 0) {
addLogEntry("Your family has no more money to give you.", "warning");
return;
}
if (gameState.age < 12) {
addLogEntry("You're too young to ask for money directly.", "warning");
return;
}
// Chance of refusal based on family class
const refusalChance = familyClassModifiers[gameState.familyClass].moneyRefusalChance;
if (Math.random() < refusalChance) {
addLogEntry("Your parents refused to give you money.", "warning");
return;
}
const amount = Math.min(500, gameState.familySupport);
gameState.money += amount;
gameState.familySupport -= amount;
addLogEntry(`Your family gave you $${amount}.`, "success");
updateUI();
}
// Ask family for braces
function askForBraces() {
if (gameState.familySupport < 3000) {
addLogEntry("Your family cannot afford braces.", "warning");
return;
}
if (gameState.proceduresDone.includes("braces")) {
addLogEntry("You already have braces.", "warning");
return;
}
// Chance based on family class
const chance = familyClassModifiers[gameState.familyClass].bracesChance;
if (Math.random() < chance) {
gameState.familySupport -= 3000;
performProcedure('braces');
addLogEntry("Your family agreed to pay for braces.", "success");
} else {
addLogEntry("Your family refused to pay for braces.", "warning");
}
}
// Ask family for palatal expander
function askForExpander() {
if (gameState.age >= 16) {
addLogEntry("You're too old for a palatal expander to be effective.", "warning");
return;
}
if (gameState.familySupport < 4000) {
addLogEntry("Your family cannot afford a palatal expander.", "warning");
return;
}
if (gameState.proceduresDone.includes("palatalExpander")) {
addLogEntry("You already have a palatal expander.", "warning");
return;
}
// Chance based on family class
const chance = familyClassModifiers[gameState.familyClass].expanderChance;
if (Math.random() < chance) {
gameState.familySupport -= 4000;
performProcedure('palatalExpander');
addLogEntry("Your family agreed to pay for a palatal expander.", "success");
} else {
addLogEntry("Your family refused to pay for a palatal expander.", "warning");
}
}
// Go on a date function
function goOnDate() {
if (gameState.money < 50) {
addLogEntry("You don't have enough money to go on a date.", "warning");
return;
}
gameState.money -= 50;
// Calculate dating success based on height, attractiveness, and social status
const heightScore = calculateHeightScore();
const attractivenessScore = gameState.attractiveness / 10;
const statusScore = gameState.socialStatus / 100;
let successChance = 0;
if (gameState.gender === "male") {
successChance = (heightScore * 0.6) + (attractivenessScore * 0.3) + (statusScore * 0.1);
} else {
successChance = (heightScore * 0.3) + (attractivenessScore * 0.6) + (statusScore * 0.1);
}
// Adjust for BMI
if (gameState.bmi < 18.5 || gameState.bmi > 25) {
successChance *= 0.7; // 30% penalty for underweight or overweight
}
// Adjust for humor if below MTN
const tier = getCurrentTier();
if (tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) {
successChance *= (1 + (gameState.humor / 200)); // Humor can help but not overcome looks completely
}
// Check if successful
if (Math.random() < successChance) {
// Create a partner
gameState.partner = generatePartner();
gameState.relationshipStatus = "dating";
addLogEntry(`You went on a successful date with ${gameState.partner.name}! You're now dating.`, "success");
} else {
addLogEntry("Your date didn't go well. Maybe try improving your appearance.", "warning");
}
updateUI();
}
// Propose marriage function
function proposeMarriage() {
if (gameState.money < 500) {
addLogEntry("You don't have enough money for a marriage proposal.", "warning");
return;
}
gameState.money -= 500;
// Marriage chance based on relationship length and compatibility
const heightCompatibility = 1 - Math.abs((gameState.height - gameState.partner.height) / gameState.partner.height);
const attractivenessCompatibility = 1 - Math.abs((gameState.attractiveness - gameState.partner.attractiveness) / gameState.partner.attractiveness);
const compatibilityScore = (heightCompatibility + attractivenessCompatibility) / 2;
const successChance = compatibilityScore * 0.8; // 80% of compatibility score
if (Math.random() < successChance) {
gameState.relationshipStatus = "married";
addLogEntry(`You proposed to ${gameState.partner.name} and they said yes! You're now married.`, "success");
// Reset cheating risk when getting married
gameState.cheatingRisk = 10;
} else {
addLogEntry(`You proposed to ${gameState.partner.name} but they said no. The relationship ended.`, "danger");
gameState.relationshipStatus = "single";
gameState.partner = null;
}
updateUI();
}
// Have a child function
function haveChild() {
if (gameState.money < 1000) {
addLogEntry("You don't have enough money to raise a child.", "warning");
return;
}
if (gameState.relationshipStatus !== "married") {
addLogEntry("You need to be married to have a child.", "warning");
return;
}
gameState.money -= 1000;
// Create a child with genetics from both parents
const child = generateChild();
gameState.children.push(child);
addLogEntry(`You and ${gameState.partner.name} had a child! ${child.name} has been born.`, "success");
updateUI();
}
// Generate a partner based on player's attributes
function generatePartner() {
const gender = gameState.gender === "male" ? "female" : "male";
const names = gender === "male" ? ["James", "John", "Robert", "Michael", "William"] : ["Mary", "Jennifer", "Linda", "Elizabeth", "Susan"];
// Partner height based on player height and preferences
let height = 0;
if (gender === "female") {
// Women prefer men taller than them
height = gameState.height - (Math.random() * 4 + 2); // 2-6 inches shorter
height = Math.max(partnerPreferences.female.minHeight, Math.min(partnerPreferences.female.maxHeight, height));
} else {
// Men prefer women shorter than them
height = gameState.height + (Math.random() * 4 + 2); // 2-6 inches taller
height = Math.max(partnerPreferences.male.minHeight, Math.min(partnerPreferences.male.maxHeight, height));
}
// Partner attractiveness based on player attractiveness
const attractiveness = gameState.attractiveness + (Math.random() * 2 - 1); // ±1 point
const minAttractiveness = gender === "female" ? partnerPreferences.female.minAttractiveness : partnerPreferences.male.minAttractiveness;
const cappedAttractiveness = Math.max(minAttractiveness, Math.min(10, attractiveness));
return {
name: names[Math.floor(Math.random() * names.length)],
gender: gender,
height: height,
attractiveness: cappedAttractiveness,
age: gameState.age + Math.floor(Math.random() * 5) - 2 // ±2 years
};
}
// Generate a child with genetics from both parents
function generateChild() {
const gender = Math.random() > 0.5 ? "male" : "female";
const names = gender === "male" ? ["James", "John", "Robert", "Michael", "William"] : ["Mary", "Jennifer", "Linda", "Elizabeth", "Susan"];
// Calculate potential height using mid-parental formula
let potentialHeight = 0;
if (gender === "male") {
potentialHeight = (gameState.height + gameState.partner.height + 5) / 2;
} else {
potentialHeight = (gameState.height + gameState.partner.height - 5) / 2;
}
// Add some genetic variation (±10%)
potentialHeight = potentialHeight * (0.9 + Math.random() * 0.2);
// Calculate potential attractiveness (average of parents ±1)
const potentialAttractiveness = (gameState.attractiveness + gameState.partner.attractiveness) / 2 + (Math.random() * 2 - 1);
return {
name: names[Math.floor(Math.random() * names.length)],
gender: gender,
height: potentialHeight,
attractiveness: Math.max(1, Math.min(10, potentialAttractiveness)),
iqPotential: Math.floor((gameState.iqPotential + (Math.random() * 30 + 85)) / 2) // Average of player's IQ and random
};
}
// Calculate height score for dating
function calculateHeightScore() {
if (gameState.gender === "male") {
if (gameState.height < 66) return 0.2; // Below 5'6"
if (gameState.height < 68) return 0.4; // 5'6" to 5'8"
if (gameState.height < 70) return 0.6; // 5'8" to 5'10"
if (gameState.height < 72) return 0.8; // 5'10" to 6'0"
if (gameState.height < 74) return 0.9; // 6'0" to 6'2"
return 1.0; // 6'2"+
} else {
if (gameState.height < 62) return 0.8; // Below 5'2"
if (gameState.height < 64) return 0.9; // 5'2" to 5'4"
if (gameState.height < 66) return 1.0; // 5'4" to 5'6"
if (gameState.height < 68) return 0.7; // 5'6" to 5'8"
return 0.5; // 5'8"+
}
}
// Post on social media
function postOnSocialMedia(platform) {
// Can't post on TikTok as a newborn
if (platform === 'tiktok' && gameState.age < 13) {
addLogEntry("You're too young to post on TikTok.", "warning");
return;
}
const tier = getCurrentTier();
let message = "";
let messageType = "info";
// If below MTN but has high humor, chance to go viral instead of becoming lolcow
if ((tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) &&
gameState.humor > 70) {
if (Math.random() < (gameState.humor / 100)) {
// Go viral due to humor
gameState.socialMediaStatus = "viral";
const newFollowers = Math.floor(Math.random() * 10000) + 5000;
gameState.followers += newFollowers;
gameState.money += newFollowers * 0.2;
gameState.socialStatus += 40;
message = `Your humorous content went viral on ${platform}! Gained ${newFollowers} followers and sponsorship opportunities.`;
messageType = "success";
} else {
// Still become lolcow but with less severity
gameState.socialMediaStatus = "lolcow";
gameState.socialStatus -= 10;
gameState.health -= 3;
message = `You posted on ${platform} and became a lolcow, but your humor made it less severe.`;
messageType = "warning";
}
} else if (tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) {
// Negative outcome - become a lolcow
gameState.socialMediaStatus = "lolcow";
gameState.socialStatus -= 20;
gameState.health -= 5;
message = `You posted on ${platform} and became a lolcow. People are making fun of your appearance.`;
messageType = "danger";
// Add negative trait if not already present
if (!gameState.negativeHealth.includes("Depression")) {
gameState.negativeHealth.push("Depression");
}
} else if (tier.name.includes("Mid Tier Normie")) {
// Neutral outcome
message = `You posted on ${platform}. You got a few likes but nothing special.`;
gameState.followers += Math.floor(Math.random() * 10) + 1;
} else {
// Positive outcome - chance to become influencer
const successChance = (gameState.attractiveness - 6) * 0.2; // Higher attractiveness = better chance
if (Math.random() < successChance) {
if (gameState.socialMediaStatus !== "viral" && gameState.attractiveness > 7.5) {
gameState.socialMediaStatus = "viral";
const newFollowers = Math.floor(Math.random() * 5000) + 1000;
gameState.followers += newFollowers;
gameState.money += newFollowers * 0.1;
gameState.socialStatus += 30;
message = `You went viral on ${platform}! Gained ${newFollowers} followers and sponsorship opportunities.`;
messageType = "success";
} else {
gameState.socialMediaStatus = "influencer";
const newFollowers = Math.floor(Math.random() * 500) + 100;
gameState.followers += newFollowers;
gameState.money += newFollowers * 0.05;
gameState.socialStatus += 15;
message = `You're gaining traction on ${platform}! Gained ${newFollowers} followers.`;
messageType = "success";
}
} else {
const newFollowers = Math.floor(Math.random() * 100) + 10;
gameState.followers += newFollowers;
message = `You posted on ${platform}. Gained ${newFollowers} followers.`;
}
}
addLogEntry(message, messageType);
updateUI();
}
// Study function with IQ-based efficiency
function study(level) {
let cost = 0;
let iqGain = 0;
let message = "";
switch(level) {
case 'elementary':
cost = 10;
break;
case 'middle':
cost = 15;
break;
case 'highschool':
cost = 20;
break;
case 'college':
cost = 30;
break;
}
if (gameState.money < cost) {
addLogEntry(`You don't have enough money to pay for ${level} school materials.`, "warning");
return;
}
gameState.money -= cost;
// Calculate study effectiveness based on IQ
let efficiency = 0.2; // Default for very low IQ
if (gameState.iq >= 115) efficiency = 1.0;
else if (gameState.iq >= 100) efficiency = 0.8;
else if (gameState.iq >= 85) efficiency = 0.5;
// Calculate IQ gain based on efficiency and school level
iqGain = Math.floor((Math.random() * 3 + 1) * efficiency);
if (gameState.iq + iqGain > gameState.iqPotential) {
iqGain = gameState.iqPotential - gameState.iq;
}
if (iqGain > 0) {
gameState.iq += iqGain;
message = `You studied at ${level} level. Your IQ increased by ${iqGain} points.`;
if (efficiency < 0.3) {
message += " It was difficult for you.";
} else if (efficiency > 0.8) {
message += " You learned quickly.";
}
} else {
message = `You studied at ${level} level but reached your genetic potential.`;
}
addLogEntry(message, "success");
updateUI();
}
// Apply for job
function applyForJob(jobId) {
const job = jobs.find(j => j.id === jobId);
if (!job) return;
if (gameState.iq < job.iqReq) {
addLogEntry(`You don't meet the IQ requirements for ${job.name}.`, "warning");
return;
}
// Check for degree requirements for high-level jobs
if (job.degreeReq && gameState.schoolLevel !== "college") {
addLogEntry(`You need a college degree to become a ${job.name}.`, "warning");
return;
}
gameState.currentJob = jobId;
addLogEntry(`You got a job as a ${job.name}. You'll earn $${job.pay}/hour.`, "success");
updateUI();
// Set up job income
if (gameState.jobInterval) {
clearInterval(gameState.jobInterval);
}
gameState.jobInterval = setInterval(() => {
if (gameState.currentJob === jobId) {
gameState.money += job.pay;
addLogEntry(`You worked as a ${job.name} and earned $${job.pay}.`, "success");
updateUI();
} else {
clearInterval(gameState.jobInterval);
}
}, 30000); // Every 30 seconds
}
// Age up function
function ageUp() {
if (!gameState.alive) return;
gameState.age++;
// Update school level based on age
if (gameState.age < 12) {
gameState.schoolLevel = "elementary";
} else if (gameState.age < 15) {
gameState.schoolLevel = "middle";
} else if (gameState.age < 18) {
gameState.schoolLevel = "highschool";
} else {
gameState.schoolLevel = "college";
}
// Update weight based on age
if (gameState.age in weightPercentiles[gameState.gender]) {
const baseWeight = weightPercentiles[gameState.gender][gameState.age];
const geneticModifier = (gameState.geneticPotential - 0.5) * 20;
const randomVariation = (Math.random() * 10) - 5; // -5 to +5 pounds
gameState.weight = baseWeight + geneticModifier + randomVariation;
// Adjust for starving
if (gameState.starving) {
gameState.weight -= 5;
gameState.starvationEffects += 1;
if (gameState.starvationEffects > 5) {
addLogEntry("Severe starvation is affecting your health.", "danger");
gameState.health -= 10;
if (gameState.health < 20) {
addLogEntry("Your organs are failing from starvation!", "danger");
gameState.health -= 10;
}
}
}
}
// Update BMI
gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703;
// Update bloating based on BMI
if (gameState.bmi > 25 && !gameState.bloating) {
gameState.bloating = true;
if (!gameState.negativePhysical.includes("Bloated Face")) {
gameState.negativePhysical.push("Bloated Face");
}
addLogEntry("You've developed a bloated face from weight gain.", "warning");
} else if (gameState.bmi <= 25 && gameState.bloating) {
gameState.bloating = false;
const index = gameState.negativePhysical.indexOf("Bloated Face");
if (index !== -1) {
gameState.negativePhysical.splice(index, 1);
}
addLogEntry("Your face is less bloated after weight loss.", "success");
}
// Update obesity trait
if (gameState.bmi > 30 && !gameState.obesity) {
gameState.obesity = true;
if (!gameState.negativePhysical.includes("Obesity")) {
gameState.negativePhysical.push("Obesity");
}
addLogEntry("You've become obese, which affects your appearance and health.", "danger");
gameState.attractiveness -= 0.5;
gameState.health -= 10;
} else if (gameState.bmi <= 30 && gameState.obesity) {
gameState.obesity = false;
const index = gameState.negativePhysical.indexOf("Obesity");
if (index !== -1) {
gameState.negativePhysical.splice(index, 1);
}
addLogEntry("You're no longer obese. Your health has improved.", "success");
gameState.attractiveness += 0.3;
gameState.health += 5;
}
// Hair grows over time
if (gameState.age < 50) { // Hair stops growing as much after 50
gameState.hairLength += Math.random() * 2;
// Natural length limit based on hair type
const maxLengths = {
"Straight": 100,
"Wavy": 90,
"Curly": 80,
"Coarse": 70,
"Afro": 60,
"Coily": 50,
"Kinky": 40,
"Varies": 80
};
const maxLength = maxLengths[gameState.hairType] || 80;
gameState.hairLength = Math.min(maxLength, gameState.hairLength);
}
// Check for cheating
if (gameState.age >= 18 && gameState.relationshipStatus === "married") {
checkForCheating();
}
// Update humor based on social status and IQ
if (gameState.socialStatus > 70 && gameState.iq > 110) {
gameState.humor += 5;
} else if (gameState.socialStatus > 50 && gameState.iq > 90) {
gameState.humor += 2;
}
gameState.humor = Math.min(100, gameState.humor);
// Apply hardcap at 18 if not True Adam or Adamlite
if (gameState.age === 18 && !gameState.trueAdam && gameState.baseAttractiveness < 8) {
const tier = getCurrentTier();
if (tier.min > 5.9) {
gameState.attractiveness = 5.9;
gameState.hardcapReached = true;
addLogEntry("You've reached the genetic hardcap at High High Tier Normie.", "warning");
}
// Close growth plates
gameState.growthPlatesOpen = false;
addLogEntry("Your growth plates have closed. No more natural height increase.", "warning");
}
// Update height based on biological growth patterns
if (gameState.age in heightPercentiles[gameState.gender] && gameState.growthPlatesOpen) {
const baseHeight = heightPercentiles[gameState.gender][gameState.age];
const geneticModifier = (gameState.geneticPotential - 0.5) * 8;
const raceModifier = (raceModifiers[gameState.race].heightPotential - 0.5) * 4;
const randomVariation = (Math.random() * 4) - 2; // -2 to +2 inches
gameState.height = baseHeight + geneticModifier + raceModifier + randomVariation;
}
// Increase IQ with age (up to potential)
if (gameState.age < 25 && gameState.iq < gameState.iqPotential) {
gameState.iq += Math.floor(Math.random() * 3);
if (gameState.iq > gameState.iqPotential) {
gameState.iq = gameState.iqPotential;
}
}
// Random events based on age
handleAgeEvents();
// Small chance of random events
if (Math.random() > 0.7) {
handleRandomEvents();
}
// Degeneration events that can decrease attractiveness
handleDegenerationEvents();
// Update social status based on attractiveness
updateSocialStatus();
// Update SMV based on various factors
updateSMV();
updateUI();
}
// Handle age-specific events
function handleAgeEvents() {
if (gameState.age === 5) {
addLogEntry("You started school. Other kids are noticing your appearance.");
// Bullying based on attractiveness
if (gameState.attractiveness < 4) {
addLogEntry("You're being bullied for your looks.", "danger");
gameState.health -= 10;
gameState.socialStatus -= 20;
gameState.attractiveness -= 0.2;
} else if (gameState.attractiveness > 5) {
addLogEntry("Other kids like you because of your looks.", "success");
gameState.socialStatus += 15;
}
}
if (gameState.age === 11) {
addLogEntry("You're now 11 years old. DIY filler options are available.");
}
if (gameState.age === 12) {
addLogEntry("You're now 12 years old. You can now use peptides and ask your parents for money directly.");
}
if (gameState.age === 13) {
addLogEntry("You're a teenager now. Appearance matters more than ever.");
// Acne development
if (gameState.negativeHealth.includes("Acne-Prone Skin") && Math.random() > 0.3) {
if (!gameState.negativeSkin.includes("Cystic Acne")) {
gameState.negativeSkin.push("Cystic Acne");
}
addLogEntry("You've developed severe cystic acne.", "warning");
gameState.attractiveness -= 0.5;
} else if (Math.random() > 0.5) {
if (!gameState.negativeSkin.includes("Acne")) {
gameState.negativeSkin.push("Acne");
}
addLogEntry("You've developed some acne.", "warning");
gameState.attractiveness -= 0.2;
}
// Can now join .org if LTN
const tier = getCurrentTier();
if (tier.name.includes("Low Tier Normie")) {
addLogEntry("You've discovered the .org forum and can now join.", "success");
}
// Can now post on TikTok
addLogEntry("You're now old enough to post on TikTok.");
}
if (gameState.age === 16) {
addLogEntry("You can now get a part-time job.");
// Palatal expander becomes ineffective
if (gameState.palatalExpander) {
addLogEntry("Your palatal expander is no longer effective at your age.", "warning");
}
}
if (gameState.age === 18) {
addLogEntry("You're now an adult. Cosmetic surgery options are available.");
}
if (gameState.age === 30) {
addLogEntry("You're 30 now. Aging effects are starting to show.");
gameState.attractiveness -= 0.2;
// Chance of hair loss
if (gameState.negativeHealth.includes("Balding Genes") && Math.random() > 0.5) {
addLogEntry("You're starting to lose your hair.", "warning");
gameState.attractiveness -= 0.3;
}
// Chance of diabetes from IGF-1 use
if (gameState.diabetesRisk > 0 && Math.random() < gameState.diabetesRisk / 100) {
addLogEntry("You've developed diabetes from past peptide use.", "danger");
gameState.health -= 15;
gameState.negativeHealth.push("Diabetes");
}
}
if (gameState.age > 40) {
// Aging effects accelerate
const ageEffect = (gameState.age - 40) * 0.05;
gameState.attractiveness -= ageEffect;
if (Math.random() > 0.8) {
addLogEntry("Aging is taking a toll on your appearance.", "warning");
}
// Risk of dementia from aromatase inhibitors
if (gameState.futureDementia && Math.random() < 0.1) {
addLogEntry("You're experiencing cognitive decline from past drug use.", "danger");
gameState.iq -= 10;
gameState.health -= 5;
}
// Risk from steroid damage
if (gameState.steroidDamage > 0 && Math.random() < 0.2) {
const damageEffect = gameState.steroidDamage * 0.1;
addLogEntry("Past steroid use is causing health problems.", "danger");
gameState.health -= damageEffect;
}
}
if (gameState.age > 70) {
// Health decline in old age
const healthDecline = Math.random() * 10;
gameState.health -= healthDecline;
if (gameState.health < 30) {
addLogEntry("Your health is deteriorating.", "danger");
}
// Chance of death increases with age and poor health
if (gameState.health < 10 && Math.random() > 0.7) {
gameState.alive = false;
addLogEntry("You have died due to poor health. Game over.", "danger");
// If you have children, offer to continue as one of them
if (gameState.children.length > 0) {
setTimeout(showGenerationSelection, 3000);
} else {
setTimeout(restartGame, 3000);
}
}
}
}
// Show generation selection after death
function showGenerationSelection() {
generationModal.style.display = 'flex';
childrenSelection.innerHTML = '';
gameState.children.forEach((child, index) => {
const childEl = document.createElement('div');
childEl.className = 'child-item';
childEl.innerHTML = `
<div>${child.name} (${child.gender}), ${formatHeight(child.height)} tall</div>
<div>Attractiveness: ${child.attractiveness.toFixed(1)} | IQ Potential: ${child.iqPotential}</div>
<button class="generation-btn" data-index="${index}">Play as ${child.name}</button>
`;
childrenSelection.appendChild(childEl);
});
// Add event listeners to generation buttons
document.querySelectorAll('.generation-btn').forEach(btn => {
btn.addEventListener('click', function() {
const index = parseInt(this.getAttribute('data-index'));
continueAsChild(index);
});
});
}
// Continue the game as a child
function continueAsChild(index) {
const child = gameState.children[index];
// Create new game state based on child
gameState.age = 20; // Start as young adult
gameState.height = child.height;
gameState.attractiveness = child.attractiveness;
gameState.iqPotential = child.iqPotential;
gameState.iq = Math.floor(child.iqPotential * 0.8);
gameState.gender = child.gender;
gameState.health = 80;
gameState.money = 1000; // Small inheritance
gameState.socialStatus = 50;
gameState.relationshipStatus = "single";
gameState.partner = null;
gameState.children = [];
gameState.alive = true;
// Reset some properties
gameState.growthPlatesOpen = false;
gameState.hardcapReached = true;
gameState.trueAdam = false;
generationModal.style.display = 'none';
addLogEntry(`You continue your life as ${child.name}, the next generation.`, "success");
updateUI();
}
// Handle cheating mechanics
function checkForCheating() {
if (gameState.relationshipStatus !== "married") return;
// Base chance of cheating based on relationship quality
let cheatChance = 0.1;
// Increased chance if partner is significantly more attractive
if (gameState.partner.attractiveness > gameState.attractiveness + 1) {
cheatChance += 0.2;
}
// Increased chance if player is neglecting relationship
cheatChance += (100 - gameState.socialStatus) * 0.001;
// Check if partner cheats
if (Math.random() < cheatChance) {
gameState.partnerCheating = true;
gameState.cheatingRisk = 100;
addLogEntry("You suspect your partner might be cheating on you.", "danger");
}
// Update cheating risk
gameState.cheatingRisk = Math.min(100, gameState.cheatingRisk + (cheatChance * 10));
updateUI();
}
// Initiate divorce
function initiateDivorce() {
if (gameState.relationshipStatus !== "married") return;
gameState.relationshipStatus = "single";
addLogEntry("You divorced your partner.", "danger");
// Financial consequences
const settlement = Math.floor(gameState.money * 0.3);
gameState.money -= settlement;
if (settlement > 0) {
addLogEntry(`You paid $${settlement} in the divorce settlement.`, "warning");
}
gameState.partner = null;
gameState.partnerCheating = false;
gameState.cheatingRisk = 0;
updateUI();
}
// Confront partner about cheating
function confrontCheating() {
if (!gameState.partnerCheating) return;
// 50% chance of confession
if (Math.random() > 0.5) {
addLogEntry("Your partner admitted to cheating. The relationship is over.", "danger");
initiateDivorce();
} else {
addLogEntry("Your partner denied cheating. You're not sure what to believe.", "warning");
gameState.cheatingRisk = 50;
}
gameState.partnerCheating = false;
updateUI();
}
// Select an archetype
function selectArchetype(archetype) {
if (!canSelectArchetype(archetype)) {
addLogEntry("You don't meet the requirements for this archetype.", "warning");
return;
}
gameState.currentArchetype = archetype;
// Apply archetype benefits
switch(archetype) {
case 'prettyBoy':
gameState.attractiveness += 0.3;
gameState.socialStatus += 15;
break;
case 'slenderTriad':
gameState.attractiveness += 0.4;
gameState.socialStatus += 10;
break;
case 'ogre':
gameState.attractiveness += 0.5;
gameState.socialStatus += 5;
break;
case 'asianBaddie':
case 'latinaBaddie':
case 'baddie':
gameState.attractiveness += 0.4;
gameState.socialStatus += 20;
break;
}
addLogEntry(`You've adopted the ${archetype} archetype.`, "success");
updateUI();
}
// Get a haircut
function getHaircut(type) {
let cost = type === 'basic' ? 30 : 100;
if (gameState.money < cost) {
addLogEntry(`You don't have enough money for this haircut.`, "warning");
return;
}
gameState.money -= cost;
if (type === 'basic') {
gameState.hairHealth += 5;
addLogEntry("You got a basic haircut. Your hair looks neat.", "success");
} else {
gameState.hairHealth += 10;
gameState.attractiveness += 0.2;
addLogEntry("You got a premium hairstyle. You look more attractive.", "success");
}
gameState.hairHealth = Math.min(100, gameState.hairHealth);
updateUI();
}
// Set a specific hairstyle
function setHairstyle(style) {
const costs = {
dreadlocks: 200,
braids: 150,
twists: 180,
undercut: 60
};
const cost = costs[style];
if (gameState.money < cost) {
addLogEntry(`You don't have enough money for this style.`, "warning");
return;
}
// Check if hairstyle is compatible with hair type
if (!isHairstyleCompatible(style)) {
addLogEntry(`This hairstyle is not compatible with your hair type and may cause damage.`, "warning");
if (Math.random() > 0.5) {
gameState.hairHealth -= 20;
addLogEntry(`The ${style} damaged your hair.`, "danger");
}
}
gameState.money -= cost;
gameState.hairStyle = style;
// Style-specific effects
if (style === 'dreadlocks' || style === 'braids' || style === 'twists') {
gameState.attractiveness += 0.3;
} else {
gameState.attractiveness += 0.2;
}
addLogEntry(`You got ${style} hairstyle.`, "success");
updateUI();
}
// Check if hairstyle is compatible with hair type
function isHairstyleCompatible(style) {
// Dreadlocks, braids, and twists work best on Afro-textured hair
if (style === 'dreadlocks' || style === 'braids' || style === 'twists') {
return gameState.hairType === "Afro" ||
gameState.hairType === "Coily" ||
gameState.hairType === "Kinky";
}
// Other styles work on most hair types
return true;
}
// Handle random events that can decrease attractiveness
function handleDegenerationEvents() {
// Poor health can decrease attractiveness
if (gameState.health < 50 && Math.random() > 0.7) {
addLogEntry("Poor health is affecting your appearance.", "warning");
gameState.attractiveness -= 0.1;
}
// Negative traits can worsen over time
if (gameState.negativeFacial.length > 0 && Math.random() > 0.8) {
const trait = gameState.negativeFacial[Math.floor(Math.random() * gameState.negativeFacial.length)];
addLogEntry(`Your ${trait} is becoming more pronounced.`, "warning");
gameState.attractiveness -= 0.15;
}
// Poor lifestyle choices can decrease attractiveness
if (gameState.money < 20 && Math.random() > 0.9) {
addLogEntry("Poor nutrition is affecting your appearance.", "warning");
gameState.attractiveness -= 0.1;
gameState.health -= 5;
}
// Injuries can decrease attractiveness
if (Math.random() > 0.95) {
addLogEntry("You suffered a minor injury that slightly affected your appearance.", "warning");
gameState.attractiveness -= 0.2;
gameState.health -= 5;
}
// Starvation effects
if (gameState.starving) {
gameState.lastMeal -= 10;
if (gameState.lastMeal <= 0) {
addLogEntry("You're starving! Your health is deteriorating.", "danger");
gameState.health -= 5;
gameState.attractiveness -= 0.1;
gameState.lastMeal = 0;
}
}
}
// Handle random events
function handleRandomEvents() {
const events = [
{
message: "You found $50 on the street.",
effect: () => gameState.money += 50
},
{
message: "You caught a cold. Health decreased slightly.",
effect: () => {
gameState.health -= 5;
if (gameState.health < 40) {
gameState.attractiveness -= 0.1;
}
}
},
{
message: "You read a book. IQ increased slightly.",
effect: () => {
if (gameState.iq < gameState.iqPotential) {
gameState.iq += 2;
if (gameState.iq > gameState.iqPotential) {
gameState.iq = gameState.iqPotential;
}
}
}
},
{
message: "You've been working out. Attractiveness increased slightly.",
effect: () => gameState.attractiveness += 0.1
},
{
message: "You developed a bad habit of mouth breathing.",
effect: () => {
if (!gameState.negativeFacial.includes("Malocclusion")) {
gameState.negativeFacial.push("Malocclusion");
addLogEntry("Mouth breathing has caused malocclusion.", "warning");
gameState.attractiveness -= 0.3;
}
}
},
{
message: "You spent time in the sun without protection.",
effect: () => {
gameState.health -= 3;
if (Math.random() > 0.7) {
addLogEntry("Sun damage has aged your skin prematurely.", "warning");
gameState.attractiveness -= 0.2;
}
}
},
{
message: "You've been stressed lately. It's affecting your appearance.",
effect: () => {
gameState.health -= 3;
gameState.attractiveness -= 0.1;
}
},
{
message: "Poor sleep quality is affecting your appearance.",
effect: () => {
gameState.health -= 2;
gameState.attractiveness -= 0.1;
}
}
];
const event = events[Math.floor(Math.random() * events.length)];
addLogEntry(event.message);
event.effect();
}
// Update social status based on attractiveness
function updateSocialStatus() {
if (gameState.attractiveness < 3) {
gameState.socialStatus -= 5;
} else if (gameState.attractiveness < 4) {
gameState.socialStatus -= 2;
} else if (gameState.attractiveness > 6) {
gameState.socialStatus += 5;
} else if (gameState.attractiveness > 5) {
gameState.socialStatus += 2;
}
// Ensure social status stays within bounds
gameState.socialStatus = Math.max(0, Math.min(100, gameState.socialStatus));
// Update status text
if (gameState.socialStatus >= 80) {
gameState.status = "Popular";
} else if (gameState.socialStatus >= 60) {
gameState.status = "Liked";
} else if (gameState.socialStatus >= 40) {
gameState.status = "Neutral";
} else if (gameState.socialStatus >= 20) {
gameState.status = "Disliked";
} else {
gameState.status = "Bullied";
}
}
// Update SMV based on various factors
function updateSMV() {
// Base SMV is attractiveness
gameState.smv = gameState.attractiveness;
// Adjust based on height
if (gameState.height >= 72) { // 6'0"
gameState.smv += 1;
} else if (gameState.height < 67) { // 5'7"
gameState.smv -= 1;
}
// Adjust based on race
const raceMod = raceModifiers[gameState.race];
gameState.smv += (raceMod.boneStructure + raceMod.skinQuality - 1) * 0.5;
// Ensure SMV doesn't go below 1 or above 10
gameState.smv = Math.max(1, Math.min(10, gameState.smv));
}
// Join .org forum
function joinOrg() {
if (gameState.age < 13) {
addLogEntry("You must be at least 13 years old to join .org.", "warning");
return;
}
gameState.onForum = true;
gameState.orgStatus = "gray";
addLogEntry("You've joined the .org forum. Your status is now 'Gray'.", "success");
updateUI();
}
// Perform forum action
function forumAction(action) {
let message = "";
let messageType = "info";
let repChange = 0;
switch(action) {
case 'postThread':
if (Math.random() < 0.7) {
message = "Your thread was well-received on the forum.";
repChange = 10;
} else {
message = "Your thread was criticized on the forum.";
repChange = -5;
}
break;
case 'comment':
message = "You commented on a thread.";
repChange = 2;
break;
case 'shareExperience':
if (Math.random() < 0.6) {
message = "You shared your looksmaxxing experience. Others found it helpful.";
repChange = 15;
} else {
message = "You shared your looksmaxxing experience. Some questioned your methods.";
repChange = -3;
}
break;
case 'askAdvice':
message = "You asked for advice on the forum.";
repChange = 5;
break;
}
gameState.forumReputation += repChange;
// Update .org status based on reputation
if (gameState.forumReputation >= 200) {
gameState.orgStatus = "orgmaster";
} else if (gameState.forumReputation >= 100) {
gameState.orgStatus = "contributor";
} else if (gameState.forumReputation >= 50) {
gameState.orgStatus = "known";
}
addLogEntry(message, repChange >= 0 ? "success" : "warning");
updateUI();
}
// Skincare routine
function doSkincare() {
if (gameState.money < 50) return;
gameState.money -= 50;
// Remove acne if present
const acneIndex = gameState.negativeSkin.indexOf("Acne");
const cysticAcneIndex = gameState.negativeSkin.indexOf("Cystic Acne");
if (cysticAcneIndex !== -1 && Math.random() > 0.7) {
gameState.negativeSkin.splice(cysticAcneIndex, 1);
addLogEntry("Skincare routine improved your cystic acne.", "success");
gameState.attractiveness += 0.4;
} else if (acneIndex !== -1 && Math.random() > 0.5) {
gameState.negativeSkin.splice(acneIndex, 1);
addLogEntry("Skincare routine cleared your acne.", "success");
gameState.attractiveness += 0.3;
} else {
addLogEntry("Skincare routine improved your complexion.", "success");
gameState.attractiveness += 0.1;
}
updateUI();
}
// Gym workout
function doGymWorkout() {
if (gameState.money < 30 || gameState.gymAscension >= 2) return;
gameState.money -= 30;
// Improve body fat distribution
const fatIndex = gameState.negativePhysical.indexOf("Poor Body Fat Distribution");
if (fatIndex !== -1 && Math.random() > 0.5) {
gameState.negativePhysical.splice(fatIndex, 1);
addLogEntry("Regular workouts improved your body fat distribution.", "success");
gameState.attractiveness += 0.3;
}
// Chance to widen clavicles
if (gameState.negativePhysical.includes("Narrow Clavicles") && Math.random() > 0.8) {
const clavicleIndex = gameState.negativePhysical.indexOf("Narrow Clavicles");
gameState.negativePhysical.splice(clavicleIndex, 1);
gameState.physicalTraits.push("Wide Clavicles");
addLogEntry("Your clavicles widened from weight training.", "success");
gameState.attractiveness += 0.4;
}
// Gym can only ascend you 1-2 tiers based on your base
const baseTierIndex = tiers.findIndex(t => gameState.baseAttractiveness >= t.min && gameState.baseAttractiveness <= t.max);
const maxAscension = Math.min(2, tiers.length - baseTierIndex - 1);
if (gameState.gymAscension < maxAscension) {
gameState.attractiveness += 0.3;
gameState.gymAscension++;
addLogEntry("Gym workout improved your physique.", "success");
} else {
addLogEntry("You've reached your maximum genetic potential from gym workouts.", "warning");
}
gameState.health += 2;
updateUI();
}
// Study
function doStudy() {
if (gameState.money < 20 || gameState.iq >= gameState.iqPotential) return;
gameState.money -= 20;
gameState.iq += Math.floor(Math.random() * 3) + 1;
if (gameState.iq > gameState.iqPotential) {
gameState.iq = gameState.iqPotential;
}
addLogEntry("You spent time studying. Your IQ increased.", "success");
updateUI();
}
// Work
function doWork() {
if (gameState.age < 16) {
addLogEntry("You're too young for a job.", "warning");
return;
}
const earnings = Math.floor(Math.random() * 50) + 75;
gameState.money += earnings;
addLogEntry(`You worked a part-time job and earned $${earnings}.`, "success");
updateUI();
}
// Frauding (makeup, height boosts, etc.)
function doFrauding() {
if (gameState.money < 20) return;
gameState.money -= 20;
const frauds = [
"You used makeup to enhance your features.",
"You wore height-boosting insoles.",
"You used clothing to create a more attractive silhouette.",
"You got a flattering haircut.",
"You practiced good posture to appear taller."
];
const fraud = frauds[Math.floor(Math.random() * frauds.length)];
addLogEntry(fraud, "success");
// Temporary attractiveness boost
gameState.attractiveness += 0.3;
updateUI();
// Fraud effects are temporary - reset after some time
setTimeout(() => {
gameState.attractiveness -= 0.3;
addLogEntry("The effects of your frauding have worn off.", "warning");
updateUI();
}, 3000);
}
// DIY Filler
function doDiyFiller() {
if (gameState.money < 100 || gameState.age < 11) return;
gameState.money -= 100;
if (Math.random() < 0.7) {
addLogEntry("DIY filler attempt failed and caused complications.", "danger");
gameState.health -= 10;
gameState.attractiveness -= 0.3;
if (Math.random() < 0.3) {
addLogEntry("DIY filler caused a serious infection.", "danger");
gameState.health -= 15;
}
} else {
addLogEntry("DIY filler provided a minor improvement.", "success");
gameState.attractiveness += 0.2;
// Temporary effect
setTimeout(() => {
gameState.attractiveness -= 0.15;
addLogEntry("Your DIY filler has dissolved.", "warning");
updateUI();
}, 4000);
}
updateUI();
}
// Restart game
function restartGame() {
if (confirm("Start a new life?")) {
location.reload();
}
}
// Rope (restart) function
function rope() {
if (confirm("Are you sure you want to end your life? All progress will be lost.")) {
restartGame();
}
}
// Initialize the game
initGame();
</script>
</body>
</html>
bill gates over hereHTML:<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Blackpill Sim 2026</title> <style> * { box-sizing: border-box; margin: 0; padding: 0; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; } body { background: linear-gradient(135deg, #0f172a, #1e293b); color: #e2e8f0; line-height: 1.6; padding: 20px; min-height: 100vh; } .container { max-width: 1200px; margin: 0 auto; background: rgba(30, 41, 59, 0.8); border-radius: 10px; padding: 20px; box-shadow: 0 0 20px rgba(0, 0, 0, 0.5); } header { text-align: center; margin-bottom: 20px; padding-bottom: 15px; border-bottom: 1px solid #334155; } h1 { color: #f8fafc; font-size: 2.5rem; margin-bottom: 10px; text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5); } .disclaimer { background: rgba(220, 38, 38, 0.2); padding: 15px; border-radius: 8px; margin: 15px 0; border-left: 4px solid #dc2626; font-size: 0.9rem; } .stats-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin-bottom: 20px; } .stat-box { background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); } .stat-title { font-size: 1rem; color: #94a3b8; margin-bottom: 5px; } .stat-value { font-size: 1.4rem; font-weight: bold; color: #f8fafc; } .trait-list { display: flex; flex-wrap: wrap; gap: 10px; margin: 10px 0; } .trait { background: rgba(30, 64, 175, 0.3); padding: 5px 10px; border-radius: 20px; font-size: 0.9rem; } .negative-trait { background: rgba(220, 38, 38, 0.3); } .actions-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 20px 0; } .action-btn { background: #3b82f6; color: white; border: none; padding: 12px; border-radius: 8px; cursor: pointer; font-weight: bold; transition: all 0.3s ease; } .action-btn:hover { background: #2563eb; transform: translateY(-2px); } .action-btn:disabled { background: #64748b; cursor: not-allowed; transform: none; } .log-container { background: rgba(15, 23, 42, 0.7); border-radius: 8px; padding: 15px; margin-top: 20px; max-height: 300px; overflow-y: auto; } .log-entry { margin-bottom: 8px; padding-bottom: 8px; border-bottom: 1px solid #334155; } .log-entry:last-child { border-bottom: none; } .age-badge { display: inline-block; background: #8b5cf6; padding: 3px 8px; border-radius: 12px; font-size: 0.8rem; margin-right: 8px; } .success { color: #10b981; } .danger { color: #ef4444; } .warning { color: #f59e0b; } .tier-badge { display: inline-block; padding: 5px 12px; border-radius: 20px; font-weight: bold; margin-top: 5px; } .subhuman { background: #dc2626; color: white; } .ltn { background: #ea580c; color: white; } .mtn { background: #d97706; color: white; } .htn { background: #65a30d; color: white; } .chadlite { background: #16a34a; color: white; } .chad { background: #059669; color: white; } .trueadam { background: linear-gradient(45deg, #06b6d4, #8b5cf6); color: white; } .progress-bar { height: 8px; background: #334155; border-radius: 4px; margin-top: 5px; overflow: hidden; } .progress-fill { height: 100%; background: #3b82f6; border-radius: 4px; } footer { text-align: center; margin-top: 20px; padding-top: 15px; border-top: 1px solid #334155; font-size: 0.9rem; color: #94a3b8; } .tab-container { display: flex; gap: 10px; margin-bottom: 15px; flex-wrap: wrap; } .tab { padding: 10px 15px; background: #334155; border-radius: 5px; cursor: pointer; white-space: nowrap; } .tab.active { background: #3b82f6; } .tab-content { display: none; } .tab-content.active { display: block; } .shop-item { display: flex; justify-content: space-between; padding: 10px; background: rgba(15, 23, 42, 0.7); margin-bottom: 5px; border-radius: 5px; align-items: center; } .shop-item-info { flex: 1; } .shop-item-title { font-weight: bold; margin-bottom: 5px; } .shop-item-desc { font-size: 0.9rem; color: #94a3b8; } .shop-item-action { display: flex; align-items: center; gap: 10px; } .genetics-display { background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; margin-bottom: 15px; } .height-chart { margin-top: 20px; background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; } .chart-bar { height: 20px; background: #334155; border-radius: 10px; margin: 5px 0; overflow: hidden; position: relative; } .chart-fill { height: 100%; background: linear-gradient(90deg, #3b82f6, #8b5cf6); border-radius: 10px; width: 0%; transition: width 1s ease; } .chart-label { position: absolute; left: 10px; top: 0; line-height: 20px; color: white; font-size: 0.8rem; } .degeneration-indicator { display: inline-block; padding: 2px 8px; background: #dc2626; border-radius: 10px; font-size: 0.8rem; margin-left: 5px; animation: pulse 2s infinite; } @keyframes pulse { 0% { opacity: 0.7; } 50% { opacity: 1; } 100% { opacity: 0.7; } } .status-badge { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 0.8rem; margin-left: 5px; } .gray-status { background: #64748b; color: white; } .known-status { background: #3b82f6; color: white; } .contributor-status { background: #8b5cf6; color: white; } .orgmaster-status { background: linear-gradient(45deg, #06b6d4, #8b5cf6); color: white; } .modal { display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.7); z-index: 1000; align-items: center; justify-content: center; } .modal-content { background: #1e293b; padding: 20px; border-radius: 10px; max-width: 500px; width: 90%; max-height: 80vh; overflow-y: auto; } .modal-title { font-size: 1.5rem; margin-bottom: 15px; color: #f8fafc; } .modal-desc { margin-bottom: 15px; color: #e2e8f0; } .modal-buttons { display: flex; gap: 10px; justify-content: flex-end; } .modal-btn { padding: 8px 15px; border-radius: 5px; cursor: pointer; border: none; font-weight: bold; } .modal-btn-primary { background: #3b82f6; color: white; } .modal-btn-secondary { background: #64748b; color: white; } .risk-indicator { display: inline-block; padding: 2px 6px; border-radius: 10px; font-size: 0.7rem; margin-left: 5px; } .low-risk { background: #10b981; color: white; } .medium-risk { background: #f59e0b; color: white; } .high-risk { background: #ef4444; color: white; } .drug-warning { color: #ef4444; font-size: 0.9rem; margin-top: 5px; } .family-class { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 0.8rem; margin-left: 5px; } .lower-class { background: #dc2626; color: white; } .middle-class { background: #d97706; color: white; } .upper-class { background: #059669; color: white; } .social-media-post { background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; margin-bottom: 15px; } .social-media-icon { width: 24px; height: 24px; margin-right: 8px; vertical-align: middle; } .job-item { display: flex; justify-content: space-between; padding: 10px; background: rgba(15, 23, 42, 0.7); margin-bottom: 5px; border-radius: 5px; align-items: center; } .job-requirements { font-size: 0.9rem; color: #94a3b8; } .study-options { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; } .study-option { background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; text-align: center; } .influencer-status { display: inline-block; padding: 3px 8px; border-radius: 12px; background: linear-gradient(45deg, #8b5cf6, #ec4899); color: white; font-size: 0.8rem; margin-left: 5px; } /* New styles for additional features */ .relationship-status { display: inline-block; padding: 3px 8px; border-radius: 12px; font-size: 0.8rem; margin-left: 5px; } .single { background: #64748b; color: white; } .dating { background: #3b82f6; color: white; } .married { background: #8b5cf6; color: white; } .children-list { margin-top: 10px; max-height: 150px; overflow-y: auto; } .child-item { padding: 5px; background: rgba(15, 23, 42, 0.5); margin-bottom: 3px; border-radius: 4px; font-size: 0.9rem; } .bmi-value { font-size: 1.2rem; font-weight: bold; color: #f8fafc; } .bmi-status { display: inline-block; padding: 2px 8px; border-radius: 10px; font-size: 0.8rem; margin-left: 5px; } .underweight { background: #f59e0b; color: white; } .normal { background: #10b981; color: white; } .overweight { background: #f59e0b; color: white; } .obese { background: #ef4444; color: white; } .date-btn { background: #ec4899; color: white; border: none; padding: 8px 12px; border-radius: 8px; cursor: pointer; font-weight: bold; transition: all 0.3s ease; margin-top: 5px; } .date-btn:hover { background: #db2777; } .date-btn:disabled { background: #64748b; cursor: not-allowed; } .partner-info { margin-top: 10px; padding: 10px; background: rgba(15, 23, 42, 0.5); border-radius: 8px; } .eat-btn { background: #10b981; color: white; border: none; padding: 8px 12px; border-radius: 8px; cursor: pointer; font-weight: bold; transition: all 0.3s ease; margin-top: 5px; } .eat-btn:hover { background: #059669; } .eat-btn:disabled { background: #64748b; cursor: not-allowed; } .food-item { display: flex; justify-content: space-between; padding: 8px; background: rgba(15, 23, 42, 0.7); margin-bottom: 5px; border-radius: 5px; align-items: center; } .food-item-info { flex: 1; } .food-item-title { font-weight: bold; margin-bottom: 3px; } .food-item-desc { font-size: 0.8rem; color: #94a3b8; } .food-item-action { display: flex; align-items: center; gap: 10px; } .harmonization-effect { display: inline-block; padding: 2px 8px; background: #8b5cf6; border-radius: 10px; font-size: 0.8rem; margin-left: 5px; } /* New styles for additional features */ .archetype-container { background: rgba(15, 23, 42, 0.7); padding: 15px; border-radius: 8px; margin-bottom: 15px; } .archetype-item { margin-bottom: 10px; padding: 10px; background: rgba(30, 41, 59, 0.5); border-radius: 5px; } .archetype-title { font-weight: bold; margin-bottom: 5px; color: #f8fafc; } .archetype-desc { font-size: 0.9rem; color: #94a3b8; } .select-archetype-btn { background: #8b5cf6; color: white; border: none; padding: 8px 12px; border-radius: 5px; cursor: pointer; margin-top: 5px; font-size: 0.9rem; } .select-archetype-btn:hover { background: #7c3aed; } .hair-style-item { display: flex; justify-content: space-between; padding: 8px; background: rgba(15, 23, 42, 0.7); margin-bottom: 5px; border-radius: 5px; align-items: center; } .humor-stat { display: inline-block; padding: 2px 8px; background: #f59e0b; border-radius: 10px; font-size: 0.8rem; margin-left: 5px; } .cheating-risk { display: inline-block; padding: 2px 8px; background: #ec4899; border-radius: 10px; font-size: 0.8rem; margin-left: 5px; } .generation-btn { background: linear-gradient(45deg, #06b6d4, #8b5cf6); color: white; border: none; padding: 10px 15px; border-radius: 8px; cursor: pointer; font-weight: bold; margin-top: 10px; } .divorce-btn { background: #dc2626; color: white; border: none; padding: 8px 12px; border-radius: 8px; cursor: pointer; margin-top: 5px; } .confront-btn { background: #ea580c; color: white; border: none; padding: 8px 12px; border-radius: 8px; cursor: pointer; margin-top: 5px; margin-left: 5px; } </style> </head> <body> <div class="container"> <header> <h1>Blackpill Simulator 2k26</h1> <div class="disclaimer"> <strong>Content Warning:</strong> This game explores themes related to appearance-based discrimination, body image issues, body dysmorphia. Discretion is advised. </div> </header> <div class="genetics-display"> <h3>Genetic Inheritance</h3> <p>Father's Height: <span id="father-height">5'10"</span> | Mother's Height: <span id="mother-height">5'4"</span></p> <p>Family Class: <span id="family-class-value" class="family-class middle-class">Middle Class</span></p> <p>Genetic Potential: <span id="genetic-potential">Medium</span></p> <p>Parental Bone Structure: <span id="parent-bone">Average</span></p> <p>Race: <span id="race-value">Caucasian</span></p> <p>Eye Color: <span id="eye-color">Brown</span></p> <p>IQ Potential: <span id="iq-potential">100</span></p> <p>SMV: <span id="smv-value">4.5</span> | Status: <span id="status-value">Neutral</span></p> <p>Humor: <span id="humor-value">50</span> <span class="humor-stat">Neutral</span></p> <div id="org-status-container" style="display: none;"> <p>.org Status: <span id="org-status-value" class="status-badge gray-status">Gray</span></p> </div> <div id="social-media-status-container" style="display: none; margin-top: 10px;"> <p>Social Media: <span id="social-media-status-value">No Presence</span></p> </div> <div id="relationship-container" style="display: none; margin-top: 10px;"> <p>Relationship: <span id="relationship-status-value" class="relationship-status single">Single</span></p> <div id="partner-info-container" class="partner-info" style="display: none;"> <p>Partner: <span id="partner-name">Name</span> | Attractiveness: <span id="partner-attractiveness">5.0</span></p> <p>Height: <span id="partner-height">5'8"</span> | Children: <span id="children-count">0</span></p> <div id="children-container" class="children-list" style="display: none;"> </div> </div> </div> </div> <div class="stats-container"> <div class="stat-box"> <div class="stat-title">Age</div> <div class="stat-value" id="age-value">0 years old</div> <div class="progress-bar"> <div class="progress-fill" id="age-progress" style="width: 0%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Neurodiversity Status</div> <div class="stat-value" id="neuro-status">Neurotypical</div> </div> <div class="stat-box"> <div class="stat-title">IQ</div> <div class="stat-value" id="iq-value">100</div> <div class="progress-bar"> <div class="progress-fill" id="iq-progress" style="width: 50%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Attractiveness Tier</div> <div class="stat-value" id="attractiveness-value">High Low Tier Normie</div> <div class="tier-badge ltn" id="tier-badge">HLTN</div> </div> <div class="stat-box"> <div class="stat-title">Height</div> <div class="stat-value" id="height-value">1'8"</div> <div class="progress-bar"> <div class="progress-fill" id="height-progress" style="width: 10%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Weight & BMI</div> <div class="stat-value" id="weight-value">20 lbs</div> <div class="bmi-value" id="bmi-value">16.2</div> <div class="bmi-status underweight" id="bmi-status">Underweight</div> <div class="progress-bar"> <div class="progress-fill" id="bmi-progress" style="width: 30%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Health</div> <div class="stat-value" id="health-value">Good</div> <div class="progress-bar"> <div class="progress-fill" id="health-progress" style="width: 80%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Money</div> <div class="stat-value" id="money-value">$0</div> </div> <div class="stat-box"> <div class="stat-title">Social Status</div> <div class="stat-value" id="social-value">Neutral</div> <div class="progress-bar"> <div class="progress-fill" id="social-progress" style="width: 50%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Followers</div> <div class="stat-value" id="followers-value">0</div> </div> <div class="stat-box"> <div class="stat-title">Bone Mass</div> <div class="stat-value" id="bone-mass-value">Normal</div> <div class="progress-bar"> <div class="progress-fill" id="bone-mass-progress" style="width: 50%"></div> </div> </div> <div class="stat-box"> <div class="stat-title">Hair Type</div> <div class="stat-value" id="hair-type-value">Straight</div> <div class="stat-value" id="hair-length-value">Short</div> <div class="progress-bar"> <div class="progress-fill" id="hair-health-progress" style="width: 80%"></div> </div> </div> </div> <div class="height-chart"> <h3>Height Percentile</h3> <div class="chart-bar"> <div class="chart-fill" id="height-percentile" style="width: 50%"></div> <div class="chart-label">Your height: <span id="height-percentile-value">50%</span></div> </div> <p>You are taller than <span id="taller-than">50%</span> of people your age and gender.</p> </div> <div class="tab-container"> <div class="tab active" data-tab="traits">Traits</div> <div class="tab" data-tab="actions">Actions</div> <div class="tab" data-tab="school">School</div> <div class="tab" data-tab="procedures">Procedures</div> <div class="tab" data-tab="peptides">Peptides</div> <div class="tab" data-tab="steroids">Steroids</div> <div class="tab" data-tab="nutrition">Nutrition</div> <div class="tab" data-tab="social-media">Social Media</div> <div class="tab" data-tab="jobs">Jobs</div> <div class="tab" data-tab="family">Family</div> <div class="tab" data-tab="dating">Dating</div> <div class="tab" data-tab="forum">.org Forum</div> <div class="tab" data-tab="archetypes">Archetypes</div> <div class="tab" data-tab="hair">Hair</div> </div> <div class="tab-content active" id="traits-tab"> <div class="stat-box"> <div class="stat-title">Physical Traits</div> <div class="trait-list" id="physical-traits"> <div class="trait">Symmetrical Face</div> <div class="trait negative-trait">Narrow Clavicles</div> </div> </div> <div class="stat-box"> <div class="stat-title">Facial Features</div> <div class="trait-list" id="facial-traits"> <div class="trait">Positive Canthal Tilt</div> <div class="trait negative-trait">Recessed Maxilla</div> </div> </div> <div class="stat-box"> <div class="stat-title">Skin Conditions</div> <div class="trait-list" id="skin-traits"> <div class="trait">Clear Skin</div> </div> </div> <div class="stat-box"> <div class="stat-title">Health Conditions</div> <div class="trait-list" id="health-traits"> <div class="trait">Good Metabolism</div> </div> </div> </div> <div class="tab-content" id="actions-tab"> <div class="actions-container"> <button class="action-btn" id="age-btn">Age Up (+1 year)</button> <button class="action-btn" id="skincare-btn">Skincare Routine ($50)</button> <button class="action-btn" id="gym-btn">Gym Workout ($30)</button> <button class="action-btn" id="study-btn">Study ($20)</button> <button class="action-btn" id="work-btn">Part-time Job ($100)</button> <button class="action-btn" id="surgery-btn" disabled>Cosmetic Surgery ($5000)</button> <button class="action-btn" id="fraud-btn">Frauding ($20)</button> <button class="action-btn" id="diy-filler-btn" disabled>DIY Filler ($100)</button> <button class="action-btn" id="rope-btn" style="background: #dc2626;">Rope (Restart)</button> </div> </div> <div class="tab-content" id="school-tab"> <div class="study-options"> <div class="study-option"> <h3>Elementary School</h3> <p>Available until age 12</p> <button class="action-btn" id="elementary-study-btn" disabled>Study Basics</button> </div> <div class="study-option"> <h3>Middle School</h3> <p>Available from age 12-15</p> <button class="action-btn" id="middle-study-btn" disabled>Study Regular</button> </div> <div class="study-option"> <h3>High School</h3> <p>Available from age 15-18</p> <button class="action-btn" id="high-school-study-btn" disabled>Study Advanced</button> </div> <div class="study-option"> <h3>College</h3> <p>Available from age 18+</p> <button class="action-btn" id="college-study-btn" disabled>Study Higher Education</button> </div> </div> <div class="stat-box" style="margin-top: 15px;"> <div class="stat-title">Study Effectiveness</div> <p>Your IQ affects how efficiently you learn:</p> <ul style="margin-left: 20px; margin-top: 10px;"> <li>Lower IQ: Slower learning</li> <li>Average IQ: Moderate learning</li> <li>Higher IQ: Faster learning</li> </ul> </div> </div> <div class="tab-content" id="procedures-tab"> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Braces <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Fixes malocclusion and crooked teeth. Risk of botch if no issues present.</div> </div> <div class="shop-item-action"> $3000 <button class="action-btn" disabled id="braces-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Jaw Surgery <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Fixes recessed maxilla/mandible. Can botch if not needed.</div> </div> <div class="shop-item-action"> $15000 <button class="action-btn" disabled id="jawsurgery-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Buccal Fat Removal <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Removes cheek fat for more defined cheekbones. Can cause premature aging if overdone.</div> </div> <div class="shop-item-action"> $4000 <button class="action-btn" disabled id="buccalfat-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Rhinoplasty <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Nose reshaping surgery. High botch potential.</div> </div> <div class="shop-item-action"> $8000 <button class="action-btn" disabled id="rhinoplasty-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Limb Lengthening Surgery <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Increases height by 3-4 inches. Extremely painful and risky.</div> </div> <div class="shop-item-action"> $70000 <button class="action-btn" disabled id="limblengthening-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Professional Filler <span class="risk-indicator low-risk">Low Risk</span></div> <div class="shop-item-desc">Professional filler injection for lips, cheeks, or jawline.</div> </div> <div class="shop-item-action"> $2000 <button class="action-btn" disabled id="filler-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Facial Harmonization Filler <span class="harmonization-effect">Corrects Asymmetry</span> <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Advanced filler techniques to improve facial harmony and balance. Can ascend up to 2 tiers.</div> </div> <div class="shop-item-action"> $5000 <button class="action-btn" disabled id="harmonization-filler-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Palatal Expander <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Widens the upper jaw. Only effective before age 16. Risk of fusion with peptides.</div> </div> <div class="shop-item-action"> $4000 <button class="action-btn" disabled id="palatal-expander-btn">Purchase</button> </div> </div> <!-- New eye area procedures --> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Canthopexy <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Lifts the outer corner of the eyes for a more alert, positive canthal tilt.</div> </div> <div class="shop-item-action"> $6000 <button class="action-btn" disabled id="canthopexy-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Upper Eyelid Filler <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Adds volume to upper eyelids for a more hunter-eyed/hooded appearance.</div> </div> <div class="shop-item-action"> $3500 <button class="action-btn" disabled id="eyelid-filler-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Blepharoplasty <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Eyelid surgery to remove excess skin or fat from the eyelids.</div> </div> <div class="shop-item-action"> $8000 <button class="action-btn" disabled id="blepharoplasty-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Keratopigmentation <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Permanent eye color change procedure. Risk of blindness if botched.</div> </div> <div class="shop-item-action"> $7000 <button class="action-btn" disabled id="keratopigmentation-btn">Purchase</button> </div> </div> </div> <div class="tab-content" id="peptides-tab"> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">IGF-1 LR3 <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Stimulates growth before plates close. After closure, risk of acromegaly and diabetes.</div> <div class="drug-warning">60% chance of suture fusion if using palatal expander</div> </div> <div class="shop-item-action"> $500 <button class="action-btn" id="igf1-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">MK-677 <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Growth hormone secretagogue. Increases height potential and bone mass.</div> </div> <div class="shop-item-action"> $300 <button class="action-btn" id="mk677-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">HGH <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Human Growth Hormone. Maximizes growth potential, increases bone mass, but high risk of side effects.</div> </div> <div class="shop-item-action"> $1000 <button class="action-btn" id="hgh-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">GHK-Cu <span class="risk-indicator low-risk">Low Risk</span></div> <div class="shop-item-desc">Copper peptide for skin rejuvenation and improved complexion.</div> </div> <div class="shop-item-action"> $200 <button class="action-btn" id="ghk-cu-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Minoxidil <span class="risk-indicator low-risk">Low Risk</span></div> <div class="shop-item-desc">Promotes facial hair growth and prevents balding.</div> </div> <div class="shop-item-action"> $50 <button class="action-btn" id="minoxidil-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Meclizine/Aromatase Inhibitors <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">May increase height by delaying growth plate closure. Very low success rate. Risk of dementia later in life.</div> </div> <div class="shop-item-action"> $400 <button class="action-btn" id="meclizine-btn" disabled>Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">CJC no DAC + IPA <span class="risk-indicator medium-risk">Medium Risk</span></div> <div class="shop-item-desc">Growth hormone releasing peptide combination. May increase height and improve recovery.</div> </div> <div class="shop-item-action"> $600 <button class="action-btn" id="cjc-ipa-btn" disabled>Purchase</button> </div> </div> </div> <div class="tab-content" id="steroids-tab"> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Trenbolone <span class="risk-indicator high-risk">EXTREME RISK</span></div> <div class="shop-item-desc">Extremely powerful steroid. Very dangerous for teens, dangerous for adults.</div> <div class="drug-warning">High risk of permanent health damage</div> </div> <div class="shop-item-action"> $300 <button class="action-btn" disabled id="trenbolone-btn">Purchase</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Anavar <span class="risk-indicator high-risk">High Risk</span></div> <div class="shop-item-desc">Milder steroid but still dangerous. Can cause liver damage.</div> </div> <div class="shop-item-action"> $200 <button class="action-btn" disabled id="anavar-btn">Purchase</button> </div> </div> </div> <div class="tab-content" id="nutrition-tab"> <div class="food-item"> <div class="food-item-info"> <div class="food-item-title">Basic Meal ($5)</div> <div class="food-item-desc">A simple meal that satisfies hunger.</div> </div> <div class="food-item-action"> <button class="eat-btn" id="basic-meal-btn">Eat</button> </div> </div> <div class="food-item"> <div class="food-item-info"> <div class="food-item-title">Healthy Meal ($15)</div> <div class="food-item-desc">Nutritious meal that improves health and maintains weight.</div> </div> <div class="food-item-action"> <button class="eat-btn" id="healthy-meal-btn">Eat</button> </div> </div> <div class="food-item"> <div class="food-item-info"> <div class="food-item-title">Weight Gain Meal ($10)</div> <div class="food-item-desc">High-calorie meal for those looking to gain weight.</div> </div> <div class="food-item-action"> <button class="eat-btn" id="gain-weight-btn">Eat</button> </div> </div> <div class="food-item"> <div class="food-item-info"> <div class="food-item-title">Weight Loss Meal ($12)</div> <div class="food-item-desc">Low-calorie meal for those looking to lose weight.</div> </div> <div class="food-item-action"> <button class="eat-btn" id="lose-weight-btn">Eat</button> </div> </div> <div class="stat-box" style="margin-top: 15px;"> <div class="stat-title">Nutrition Effects</div> <ul style="margin-left: 20px; margin-top: 10px;"> <li>Starving decreases health and can cause organ failure</li> <li>Being underweight reduces attractiveness and social status</li> <li>Being overweight can lead to bloating and reduced attractiveness</li> <li>Obesity significantly reduces attractiveness and health</li> </ul> </div> </div> <div class="tab-content" id="social-media-tab"> <div class="social-media-post"> <h3><img src="https://www.citypng.com/public/uploads/preview/tik-tok-logo-transparent-square-701751694793273qftyarldbx.png" class="social-media-icon"> TikTok</h3> <p>Post short videos to gain followers. Risk of becoming a lolcow if below Mid Tier Normie.</p> <button class="action-btn" id="tiktok-post-btn" disabled>Post Video</button> </div> <div class="social-media-post"> <h3><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e7/Instagram_logo_2016.svg/2048px-Instagram_logo_2016.svg.png" class="social-media-icon"> Instagram</h3> <p>Post photos to build your brand. Higher success if above Mid Tier Normie.</p> <button class="action-btn" id="instagram-post-btn">Post Photo</button> </div> <div class="stat-box" style="margin-top: 15px;"> <div class="stat-title">Social Media Mechanics</div> <ul style="margin-left: 20px; margin-top: 10px;"> <li>Below Mid Tier Normie: High risk of becoming a lolcow (lose social status and money)</li> <li>Mid Tier Normie: Neutral outcome</li> <li>Above Mid Tier Normie: Chance to become an influencer (gain followers and money)</li> <li>High Tier Normie+: High chance of virality and sponsorship deals</li> </ul> </div> </div> <div class="tab-content" id="jobs-tab"> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Fast Food Worker</div> <div class="job-requirements">No requirements. Earn $8/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="fastfood-job-btn">Apply</button> </div> </div> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Retail Associate</div> <div class="job-requirements">Minimum IQ 85. Earn $12/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="retail-job-btn">Apply</button> </div> </div> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Office Assistant</div> <div class="job-requirements">Minimum IQ 95. Earn $18/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="office-job-btn">Apply</button> </div> </div> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Software Developer</div> <div class="job-requirements">Minimum IQ 110, College Degree. Earn $45/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="developer-job-btn">Apply</button> </div> </div> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Data Scientist</div> <div class="job-requirements">Minimum IQ 120, College Degree. Earn $60/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="scientist-job-btn">Apply</button> </div> </div> <div class="job-item"> <div class="shop-item-info"> <div class="shop-item-title">Surgeon</div> <div class="job-requirements">Minimum IQ 130, Medical Degree. Earn $120/hour.</div> </div> <div class="shop-item-action"> <button class="action-btn" id="surgeon-job-btn">Apply</button> </div> </div> </div> <div class="tab-content" id="family-tab"> <div class="stat-box"> <div class="stat-title">Family Resources</div> <p>Your family is <span id="family-class-text">middle class</span>.</p> <p>Available support: <span id="family-support">$5000</span></p> <div class="actions-container"> <button class="action-btn" id="ask-money-btn" disabled>Ask for Money</button> <button class="action-btn" id="ask-braces-btn">Ask for Braces</button> <button class="action-btn" id="ask-expander-btn">Ask for Palatal Expander</button> </div> </div> </div> <div class="tab-content" id="dating-tab"> <div class="stat-box"> <div class="stat-title">Dating & Relationships</div> <p>Your dating success depends on your height, attractiveness, and social status.</p> <div id="dating-status"> <p>You are <span id="dating-status-text">too young to date</span>.</p> </div> <div id="dating-actions" style="display: none;"> <button class="date-btn" id="date-btn">Go on a Date ($50)</button> <button class="date-btn" id="propose-btn" style="display: none;">Propose Marriage ($500)</button> <button class="date-btn" id="have-child-btn" style="display: none;">Have a Child ($1000)</button> <button class="divorce-btn" id="divorce-btn" style="display: none;">Divorce</button> <button class="confront-btn" id="confront-btn" style="display: none;">Confront About Cheating</button> </div> <div id="cheating-indicator" style="display: none; margin-top: 10px;"> <p>Cheating Risk: <span class="cheating-risk" id="cheating-risk-value">Low</span></p> </div> <div id="dating-requirements" style="margin-top: 15px;"> <p><strong>Dating Requirements:</strong></p> <ul style="margin-left: 20px; margin-top: 5px;"> <li>Below 5'8": Very difficult to date</li> <li>5'8" to 5'11": Need at least LTN face</li> <li>6'0" to 6'2": Need at least MTN face</li> <li>6'3"+: Need at least LTN face for HMTB</li> </ul> </div> </div> <div class="stat-box" style="margin-top: 15px;"> <div class="stat-title">Partner Preferences</div> <p>Women generally prefer men who are taller than them with symmetrical features.</p> <p>Men generally prefer women with feminine features and good fat distribution.</p> </div> </div> <div class="tab-content" id="forum-tab"> <div class="stat-box"> <div class="stat-title">.org Forum</div> <p>Status: <span id="forum-status">Not a member</span></p> <div id="forum-join-container"> <p>Minimum age to join: 13 years old</p> <button class="action-btn" id="join-org-btn" disabled>Join .org</button> </div> <div id="forum-actions-container" style="display: none;"> <div class="actions-container"> <button class="action-btn" id="post-thread-btn">Post Thread</button> <button class="action-btn" id="comment-btn">Comment</button> <button class="action-btn" id="share-experience-btn">Share Experience</button> <button class="action-btn" id="ask-advice-btn">Ask for Advice</button> </div> </div> </div> </div> <!-- New Archetypes Tab --> <div class="tab-content" id="archetypes-tab"> <div class="archetype-container"> <h3>Male Archetypes (Requires .org Membership)</h3> <div class="archetype-item"> <div class="archetype-title">Pretty Boy</div> <div class="archetype-desc">Requirements: HMTN+, clear skin, feminine features, height 5'10"+</div> <button class="select-archetype-btn" id="pretty-boy-btn" disabled>Select Archetype</button> </div> <div class="archetype-item"> <div class="archetype-title">Slender Triad</div> <div class="archetype-desc">Requirements: Height 6'0"+, underweight BMI, narrow frame</div> <button class="select-archetype-btn" id="slender-triad-btn" disabled>Select Archetype</button> </div> <div class="archetype-item"> <div class="archetype-title">Ogre</div> <div class="archetype-desc">Requirements: Subhuman-Chad range, high bone mass, height 6'0"+</div> <button class="select-archetype-btn" id="ogre-btn" disabled>Select Archetype</button> </div> </div> <div class="archetype-container"> <h3>Female Archetypes</h3> <div class="archetype-item"> <div class="archetype-title">Asian Baddie</div> <div class="archetype-desc">Requirements: Asian race, MTN+, specific facial ratios, makeup frauding</div> <button class="select-archetype-btn" id="asian-baddie-btn" disabled>Select Archetype</button> </div> <div class="archetype-item"> <div class="archetype-title">Latina Baddie</div> <div class="archetype-desc">Requirements: Hispanic race, MTN+, specific body ratios, makeup frauding</div> <button class="select-archetype-btn" id="latina-baddie-btn" disabled>Select Archetype</button> </div> <div class="archetype-item"> <div class="archetype-title">Baddie</div> <div class="archetype-desc">Requirements: MTN+, ideal body ratios, no major failos</div> <button class="select-archetype-btn" id="baddie-btn" disabled>Select Archetype</button> </div> </div> </div> <!-- New Hair Tab --> <div class="tab-content" id="hair-tab"> <div class="stat-box"> <div class="stat-title">Hair Properties</div> <p>Type: <span id="hair-type-display">Straight</span></p> <p>Length: <span id="hair-length-display">Short</span></p> <p>Health: <span id="hair-health-display">Healthy</span></p> <div class="progress-bar"> <div class="progress-fill" id="hair-health-bar" style="width: 80%"></div> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Basic Haircut</div> <div class="shop-item-desc">Standard haircut appropriate for your hair type.</div> </div> <div class="shop-item-action"> $30 <button class="action-btn" id="basic-haircut-btn">Get Haircut</button> </div> </div> <div class="shop-item"> <div class="shop-item-info"> <div class="shop-item-title">Premium Styling</div> <div class="shop-item-desc">Professional styling for maximum aesthetic appeal.</div> </div> <div class="shop-item-action"> $100 <button class="action-btn" id="premium-style-btn">Get Styled</button> </div> </div> <div class="hair-style-item"> <div class="shop-item-info"> <div class="shop-item-title">Dreadlocks</div> <div class="shop-item-desc">Best for Afro-textured hair. May damage other hair types.</div> </div> <div class="shop-item-action"> $200 <button class="action-btn" id="dreadlocks-btn">Get Style</button> </div> </div> <div class="hair-style-item"> <div class="shop-item-info"> <div class="shop-item-title">Braids</div> <div class="shop-item-desc">Works well on most hair types but best on Afro-textured hair.</div> </div> <div class="shop-item-action"> $150 <button class="action-btn" id="braids-btn">Get Style</button> </div> </div> <div class="hair-style-item"> <div class="shop-item-info"> <div class="shop-item-title">Twists</div> <div class="shop-item-desc">Ideal for Afro-textured hair. Requires regular retwisting.</div> </div> <div class="shop-item-action"> $180 <button class="action-btn" id="twists-btn">Get Style</button> </div> </div> <div class="hair-style-item"> <div class="shop-item-info"> <div class="shop-item-title">UnderCut</div> <div class="shop-item-desc">Popular modern cut. Works best on straight or wavy hair.</div> </div> <div class="shop-item-action"> $60 <button class="action-btn" id="undercut-btn">Get Style</button> </div> </div> </div> <div class="log-container" id="game-log"> <div class="log-entry"><span class="age-badge">Age 0</span> You were born. Your genetic traits have been determined.</div> <div class="log-entry"><span class="age-badge">Age 0</span> Your parents have average height and bone structure.</div> </div> <footer> <p>follow @trueslendertriad on tt</p> </footer> </div> <!-- Modal for procedures --> <div class="modal" id="procedure-modal"> <div class="modal-content"> <div class="modal-title" id="modal-procedure-title">Procedure</div> <div class="modal-desc" id="modal-procedure-desc">Description of the procedure.</div> <div class="modal-buttons"> <button class="modal-btn modal-btn-secondary" id="modal-cancel-btn">Cancel</button> <button class="modal-btn modal-btn-primary" id="modal-confirm-btn">Confirm</button> </div> </div> </div> <!-- Generation selection modal (displayed after death) --> <div class="modal" id="generation-modal"> <div class="modal-content"> <div class="modal-title">Continue Your Legacy</div> <div class="modal-desc">You have died. Select a child to continue playing as:</div> <div id="children-selection"></div> <div class="modal-buttons"> <button class="modal-btn modal-btn-secondary" id="new-life-btn">Start New Life</button> </div> </div> </div> <script> // Extensive game state with all new features const gameState = { age: 0, neuroStatus: "Neurotypical", iq: 100, iqPotential: 100, attractiveness: 4.5, baseAttractiveness: 4.5, height: 20, // in inches (1'8") weight: 20, // in pounds bmi: 0, health: 80, money: 0, socialStatus: 50, growthPlatesOpen: true, alive: true, fatherHeight: 70, // 5'10" motherHeight: 64, // 5'4" paternalGrandfatherHeight: 71, paternalGrandmotherHeight: 65, maternalGrandfatherHeight: 69, maternalGrandmotherHeight: 63, geneticPotential: 0.5, physicalTraits: ["Symmetrical Face"], facialTraits: ["Positive Canthal Tilt"], skinTraits: ["Clear Skin"], healthTraits: ["Good Metabolism"], negativePhysical: ["Narrow Clavicles"], negativeFacial: ["Recessed Maxilla"], negativeSkin: [], negativeHealth: [], events: [], heightPercentile: 50, gender: Math.random() > 0.5 ? "male" : "female", previousTier: "High Low Tier Normie", race: "", eyeColor: "", smv: 4.5, status: "Neutral", onForum: false, orgStatus: "gray", forumReputation: 0, peptidesUsed: [], proceduresDone: [], drugsUsed: [], hardcapReached: false, trueAdam: Math.random() < 0.0000000001, // 1 in 10 billion chance palatalExpander: false, futureDementia: false, familyClass: "middle", familySupport: 5000, fillerActive: false, gymAscension: 0, steroidDamage: 0, followers: 0, socialMediaStatus: "none", currentJob: null, schoolLevel: "elementary", boneMass: 50, // 0-100 scale diabetesRisk: 0, belowLtnResistance: 0, // Makes it hard to descend below LTN // New properties for additional features relationshipStatus: "single", // single, dating, married partner: null, children: [], starving: false, starvationEffects: 0, lastMeal: 100, // 0-100 scale, 100 = fully fed metabolismRate: 1.0, bloating: false, facialAsymmetry: Math.random() < 0.3, // 30% chance of facial asymmetry feminineTraits: 0, // 0-100 scale for women masculineTraits: 0, // 0-100 scale for men breastAsymmetry: false, obesity: false, downSyndrome: Math.random() < 0.01, // 1% chance fas: Math.random() < 0.02, // 2% chance // New properties for additional features hairType: "", hairLength: 0, // 0-100 scale hairHealth: 80, hairStyle: "none", archetype: "none", humor: 50, // 0-100 scale isCheating: false, partnerCheating: false, cheatingRisk: 0, currentArchetype: "none" }; // Updated tiers with adjusted distribution const tiers = [ { name: "Subhuman", min: 1, max: 2.9, class: "subhuman", rarity: 0.05 }, { name: "Low Tier Normie", min: 3, max: 3.4, class: "ltn", rarity: 0.1 }, { name: "High Low Tier Normie", min: 3.5, max: 4.9, class: "ltn", rarity: 0.25 }, { name: "Low Mid Tier Normie", min: 5, max: 5.4, class: "mtn", rarity: 0.2 }, { name: "High Mid Tier Normie", min: 5.5, max: 5.9, class: "mtn", rarity: 0.15 }, { name: "Low High Tier Normie", min: 6, max: 6.3, class: "htn", rarity: 0.1 }, { name: "High Tier Normie", min: 6.4, max: 6.6, class: "htn", rarity: 0.08 }, { name: "Chad Lite", min: 6.7, max: 6.9, class: "chadlite", rarity: 0.05 }, { name: "High Chad Lite", min: 7, max: 7.5, class: "chadlite", rarity: 0.015 }, { name: "Chad", min: 7.6, max: 7.9, class: "chad", rarity: 0.005 }, { name: "Adamlite", min: 8, max: 8.9, class: "chad", rarity: 0.0005 }, // Made extremely rare { name: "True Adam", min: 9, max: 10, class: "trueadam", rarity: 0.0000000001 } ]; // Jobs database const jobs = [ { id: "fastfood", name: "Fast Food Worker", iqReq: 0, pay: 8, hours: 20, degreeReq: false }, { id: "retail", name: "Retail Associate", iqReq: 85, pay: 12, hours: 25, degreeReq: false }, { id: "office", name: "Office Assistant", iqReq: 95, pay: 18, hours: 30, degreeReq: false }, { id: "developer", name: "Software Developer", iqReq: 110, pay: 45, hours: 35, degreeReq: true }, { id: "scientist", name: "Data Scientist", iqReq: 120, pay: 60, hours: 40, degreeReq: true }, { id: "surgeon", name: "Surgeon", iqReq: 130, pay: 120, hours: 50, degreeReq: true } ]; // Biologically accurate height percentiles by age and gender const heightPercentiles = { male: { 0: 20, // newborn ~1'8" 1: 30, // 1 year ~2'6" 2: 34, // 2 years ~2'10" 3: 37, // 3 years ~3'1" 4: 40, // 4 years ~3'4" 5: 43, // 5 years ~3'7" 6: 45, // 6 years ~3'9" 7: 48, // 7 years ~4'0" 8: 50, // 8 years ~4'2" 9: 52, // 9 years ~4'4" 10: 54, // 10 years ~4'6" 11: 56, // 11 years ~4'8" 12: 59, // 12 years ~4'11" 13: 62, // 13 years ~5'2" 14: 65, // 14 years ~5'5" 15: 67, // 15 years ~5'7" 16: 68, // 16 years ~5'8" 17: 69, // 17 years ~5'9" 18: 69, // 18 years ~5'9" 19: 70, // 19 years ~5'10" 20: 70, // 20 years ~5'10" }, female: { 0: 20, // newborn ~1'8" 1: 29, // 1 year ~2'5" 2: 33, // 2 years ~2'9" 3: 37, // 3 years ~3'1" 4: 40, // 4 years ~3'4" 5: 42, // 5 years ~3'6" 6: 45, // 6 years ~3'9" 7: 47, // 7 years ~3'11" 8: 50, // 8 years ~4'2" 9: 52, // 9 years ~4'4" 10: 54, // 10 years ~4'6" 11: 57, // 11 years ~4'9" 12: 60, // 12 years ~5'0" 13: 62, // 13 years ~5'2" 14: 63, // 14 years ~5'3" 15: 64, // 15 years ~5'4" 16: 64, // 16 years ~5'4" 17: 64, // 17 years ~5'4" 18: 64, // 18 years ~5'4" 19: 64, // 19 years ~5'4" 20: 64, // 20 years ~5'4" } }; // Weight percentiles by age and gender const weightPercentiles = { male: { 0: 7.5, // newborn 1: 22, // 1 year 2: 28, // 2 years 3: 32, // 3 years 4: 36, // 4 years 5: 40, // 5 years 6: 45, // 6 years 7: 50, // 7 years 8: 55, // 8 years 9: 60, // 9 years 10: 70, // 10 years 11: 80, // 11 years 12: 90, // 12 years 13: 105, // 13 years 14: 120, // 14 years 15: 135, // 15 years 16: 145, // 16 years 17: 155, // 17 years 18: 160, // 18 years 19: 165, // 19 years 20: 170, // 20 years }, female: { 0: 7.5, // newborn 1: 21, // 1 year 2: 26, // 2 years 3: 31, // 3 years 4: 35, // 4 years 5: 39, // 5 years 6: 44, // 6 years 7: 49, // 7 years 8: 57, // 8 years 9: 68, // 9 years 10: 80, // 10 years 11: 95, // 11 years 12: 105, // 12 years 13: 115, // 13 years 14: 120, // 14 years 15: 125, // 15 years 16: 128, // 16 years 17: 130, // 17 years 18: 132, // 18 years 19: 134, // 19 years 20: 135, // 20 years } }; // Race modifiers for different features const raceModifiers = { caucasian: { boneStructure: 0.7, skinQuality: 0.6, hairQuality: 0.8, heightPotential: 0.8 }, asian: { boneStructure: 0.5, skinQuality: 0.9, hairQuality: 0.7, heightPotential: 0.6 }, black: { boneStructure: 0.8, skinQuality: 0.5, hairQuality: 0.4, heightPotential: 0.9 }, hispanic: { boneStructure: 0.6, skinQuality: 0.7, hairQuality: 0.8, heightPotential: 0.7 }, mixed: { boneStructure: 0.7, skinQuality: 0.8, hairQuality: 0.7, heightPotential: 0.8 } }; // Hair types by race const hairTypesByRace = { caucasian: ["Straight", "Wavy", "Curly"], asian: ["Straight", "Coarse"], black: ["Afro", "Coily", "Kinky"], hispanic: ["Straight", "Wavy", "Curly"], mixed: ["Varies"] // Random selection from all types }; // Eye colors by race const eyeColors = { caucasian: ["brown", "blue", "green", "hazel"], asian: ["brown", "dark brown", "black"], black: ["brown", "dark brown", "black"], hispanic: ["brown", "hazel", "green"], mixed: ["brown", "blue", "green", "hazel"] }; // Family class modifiers const familyClassModifiers = { lower: { support: 1000, bracesChance: 0.1, expanderChance: 0.05, moneyRefusalChance: 0.7 }, middle: { support: 5000, bracesChance: 0.5, expanderChance: 0.3, moneyRefusalChance: 0.4 }, upper: { support: 20000, bracesChance: 0.9, expanderChance: 0.8, moneyRefusalChance: 0.2 } }; // Partner preferences based on gender const partnerPreferences = { male: { minHeight: 30, // 3'0" maxHeight: 80, // 7'0" minAttractiveness: 4.0, importance: { height: 0.3, attractiveness: 0.6, status: 0.1 } }, female: { minHeight: 30, // 3'0" maxHeight: 80, // 7'0" minAttractiveness: 5.0, importance: { height: 0.6, attractiveness: 0.3, status: 0.1 } } }; // DOM elements const ageValue = document.getElementById('age-value'); const neuroStatus = document.getElementById('neuro-status'); const iqValue = document.getElementById('iq-value'); const iqPotential = document.getElementById('iq-potential'); const attractivenessValue = document.getElementById('attractiveness-value'); const tierBadge = document.getElementById('tier-badge'); const heightValue = document.getElementById('height-value'); const healthValue = document.getElementById('health-value'); const moneyValue = document.getElementById('money-value'); const socialValue = document.getElementById('social-value'); const physicalTraits = document.getElementById('physical-traits'); const facialTraits = document.getElementById('facial-traits'); const skinTraits = document.getElementById('skin-traits'); const healthTraits = document.getElementById('health-traits'); const gameLog = document.getElementById('game-log'); const heightPercentile = document.getElementById('height-percentile'); const heightPercentileValue = document.getElementById('height-percentile-value'); const tallerThan = document.getElementById('taller-than'); const raceValue = document.getElementById('race-value'); const eyeColorValue = document.getElementById('eye-color'); const smvValue = document.getElementById('smv-value'); const statusValue = document.getElementById('status-value'); const orgStatusValue = document.getElementById('org-status-value'); const orgStatusContainer = document.getElementById('org-status-container'); const forumStatus = document.getElementById('forum-status'); const forumJoinContainer = document.getElementById('forum-join-container'); const forumActionsContainer = document.getElementById('forum-actions-container'); const joinOrgBtn = document.getElementById('join-org-btn'); const familyClassValue = document.getElementById('family-class-value'); const familySupport = document.getElementById('family-support'); const familyClassText = document.getElementById('family-class-text'); const followersValue = document.getElementById('followers-value'); const socialMediaStatusContainer = document.getElementById('social-media-status-container'); const socialMediaStatusValue = document.getElementById('social-media-status-value'); const boneMassValue = document.getElementById('bone-mass-value'); const boneMassProgress = document.getElementById('bone-mass-progress'); const humorValue = document.getElementById('humor-value'); // Progress bars const ageProgress = document.getElementById('age-progress'); const iqProgress = document.getElementById('iq-progress'); const heightProgress = document.getElementById('height-progress'); const healthProgress = document.getElementById('health-progress'); const socialProgress = document.getElementById('social-progress'); // Genetic display const fatherHeight = document.getElementById('father-height'); const motherHeight = document.getElementById('mother-height'); const parentBone = document.getElementById('parent-bone'); const geneticPotential = document.getElementById('genetic-potential'); // Buttons const ageBtn = document.getElementById('age-btn'); const skincareBtn = document.getElementById('skincare-btn'); const gymBtn = document.getElementById('gym-btn'); const studyBtn = document.getElementById('study-btn'); const workBtn = document.getElementById('work-btn'); const surgeryBtn = document.getElementById('surgery-btn'); const fraudBtn = document.getElementById('fraud-btn'); const diyFillerBtn = document.getElementById('diy-filler-btn'); const ropeBtn = document.getElementById('rope-btn'); const postThreadBtn = document.getElementById('post-thread-btn'); const commentBtn = document.getElementById('comment-btn'); const shareExperienceBtn = document.getElementById('share-experience-btn'); const askAdviceBtn = document.getElementById('ask-advice-btn'); const askMoneyBtn = document.getElementById('ask-money-btn'); const askBracesBtn = document.getElementById('ask-braces-btn'); const askExpanderBtn = document.getElementById('ask-expander-btn'); const tiktokPostBtn = document.getElementById('tiktok-post-btn'); const instagramPostBtn = document.getElementById('instagram-post-btn'); // Study buttons const elementaryStudyBtn = document.getElementById('elementary-study-btn'); const middleStudyBtn = document.getElementById('middle-study-btn'); const highSchoolStudyBtn = document.getElementById('high-school-study-btn'); const collegeStudyBtn = document.getElementById('college-study-btn'); // Job buttons const fastfoodJobBtn = document.getElementById('fastfood-job-btn'); const retailJobBtn = document.getElementById('retail-job-btn'); const officeJobBtn = document.getElementById('office-job-btn'); const developerJobBtn = document.getElementById('developer-job-btn'); const scientistJobBtn = document.getElementById('scientist-job-btn'); const surgeonJobBtn = document.getElementById('surgeon-job-btn'); // Procedure buttons const bracesBtn = document.getElementById('braces-btn'); const jawSurgeryBtn = document.getElementById('jawsurgery-btn'); const buccalFatBtn = document.getElementById('buccalfat-btn'); const rhinoplastyBtn = document.getElementById('rhinoplasty-btn'); const limbLengtheningBtn = document.getElementById('limblengthening-btn'); const fillerBtn = document.getElementById('filler-btn'); const harmonizationFillerBtn = document.getElementById('harmonization-filler-btn'); const palatalExpanderBtn = document.getElementById('palatal-expander-btn'); const canthopexyBtn = document.getElementById('canthopexy-btn'); const eyelidFillerBtn = document.getElementById('eyelid-filler-btn'); const blepharoplastyBtn = document.getElementById('blepharoplasty-btn'); const keratopigmentationBtn = document.getElementById('keratopigmentation-btn'); // Peptide buttons const igf1Btn = document.getElementById('igf1-btn'); const mk677Btn = document.getElementById('mk677-btn'); const hghBtn = document.getElementById('hgh-btn'); const ghkCuBtn = document.getElementById('ghk-cu-btn'); const minoxidilBtn = document.getElementById('minoxidil-btn'); const meclizineBtn = document.getElementById('meclizine-btn'); const cjcIpaBtn = document.getElementById('cjc-ipa-btn'); // Steroid buttons const trenboloneBtn = document.getElementById('trenbolone-btn'); const anavarBtn = document.getElementById('anavar-btn'); // Nutrition buttons const basicMealBtn = document.getElementById('basic-meal-btn'); const healthyMealBtn = document.getElementById('healthy-meal-btn'); const gainWeightBtn = document.getElementById('gain-weight-btn'); const loseWeightBtn = document.getElementById('lose-weight-btn'); // Dating buttons const dateBtn = document.getElementById('date-btn'); const proposeBtn = document.getElementById('propose-btn'); const haveChildBtn = document.getElementById('have-child-btn'); const divorceBtn = document.getElementById('divorce-btn'); const confrontBtn = document.getElementById('confront-btn'); // Hair buttons const basicHaircutBtn = document.getElementById('basic-haircut-btn'); const premiumStyleBtn = document.getElementById('premium-style-btn'); const dreadlocksBtn = document.getElementById('dreadlocks-btn'); const braidsBtn = document.getElementById('braids-btn'); const twistsBtn = document.getElementById('twists-btn'); const undercutBtn = document.getElementById('undercut-btn'); // Archetype buttons const prettyBoyBtn = document.getElementById('pretty-boy-btn'); const slenderTriadBtn = document.getElementById('slender-triad-btn'); const ogreBtn = document.getElementById('ogre-btn'); const asianBaddieBtn = document.getElementById('asian-baddie-btn'); const latinaBaddieBtn = document.getElementById('latina-baddie-btn'); const baddieBtn = document.getElementById('baddie-btn'); // Tabs const tabs = document.querySelectorAll('.tab'); const tabContents = document.querySelectorAll('.tab-content'); // Modal elements const procedureModal = document.getElementById('procedure-modal'); const modalProcedureTitle = document.getElementById('modal-procedure-title'); const modalProcedureDesc = document.getElementById('modal-procedure-desc'); const modalCancelBtn = document.getElementById('modal-cancel-btn'); const modalConfirmBtn = document.getElementById('modal-confirm-btn'); const generationModal = document.getElementById('generation-modal'); const childrenSelection = document.getElementById('children-selection'); const newLifeBtn = document.getElementById('new-life-btn'); // New DOM elements for additional features const weightValue = document.getElementById('weight-value'); const bmiValue = document.getElementById('bmi-value'); const bmiStatus = document.getElementById('bmi-status'); const bmiProgress = document.getElementById('bmi-progress'); const relationshipContainer = document.getElementById('relationship-container'); const relationshipStatusValue = document.getElementById('relationship-status-value'); const partnerInfoContainer = document.getElementById('partner-info-container'); const partnerName = document.getElementById('partner-name'); const partnerAttractiveness = document.getElementById('partner-attractiveness'); const partnerHeight = document.getElementById('partner-height'); const childrenCount = document.getElementById('children-count'); const childrenContainer = document.getElementById('children-container'); const datingStatusText = document.getElementById('dating-status-text'); const datingActions = document.getElementById('dating-actions'); const cheatingIndicator = document.getElementById('cheating-indicator'); const cheatingRiskValue = document.getElementById('cheating-risk-value'); const hairTypeDisplay = document.getElementById('hair-type-display'); const hairLengthDisplay = document.getElementById('hair-length-display'); const hairHealthDisplay = document.getElementById('hair-health-display'); const hairHealthBar = document.getElementById('hair-health-bar'); // Current procedure being considered let currentProcedure = null; // Initialize the game function initGame() { // Randomize initial stats with higher probability for lower tiers gameState.neuroStatus = Math.random() > 0.8 ? "Neurodivergent" : "Neurotypical"; // Set IQ potential based on genetics (95-105 range, average 100) gameState.iqPotential = Math.floor(Math.random() * 10) + 95; // Apply conditions that lower IQ if (gameState.downSyndrome) { gameState.iqPotential = Math.floor(Math.random() * 30) + 40; // 40-70 for Down syndrome gameState.negativeHealth.push("Down Syndrome"); } if (gameState.fas) { gameState.iqPotential = Math.max(60, gameState.iqPotential - 20); // Reduce IQ by 20 points gameState.negativeHealth.push("Fetal Alcohol Syndrome"); } gameState.iq = Math.floor(gameState.iqPotential * 0.8); // Start at 80% of potential // Set True Adam if incredibly lucky if (gameState.trueAdam) { gameState.attractiveness = 9 + Math.random(); gameState.baseAttractiveness = gameState.attractiveness; gameState.geneticPotential = 1; } else { // Most people between High Low Tier Normie and High Mid Tier Normie // Adjusted distribution to make HLTN and HMTN most common const tierRandom = Math.random(); if (tierRandom < 0.25) { gameState.attractiveness = (Math.random() * 1.5) + 3.5; // 3.5 to 5.0 (HLTN) } else if (tierRandom < 0.45) { gameState.attractiveness = (Math.random() * 0.5) + 5.0; // 5.0 to 5.5 (LMTN) } else if (tierRandom < 0.6) { gameState.attractiveness = (Math.random() * 0.5) + 5.5; // 5.5 to 6.0 (HMTN) } else if (tierRandom < 0.7) { gameState.attractiveness = (Math.random() * 0.4) + 6.0; // 6.0 to 6.4 (LHTN) } else if (tierRandom < 0.78) { gameState.attractiveness = (Math.random() * 0.3) + 6.4; // 6.4 to 6.7 (HTN) } else if (tierRandom < 0.83) { gameState.attractiveness = (Math.random() * 0.3) + 6.7; // 6.7 to 7.0 (CL) } else if (tierRandom < 0.845) { gameState.attractiveness = (Math.random() * 0.5) + 7.0; // 7.0 to 7.5 (HCL) } else if (tierRandom < 0.85) { gameState.attractiveness = (Math.random() * 0.4) + 7.5; // 7.5 to 7.9 (Chad) } else if (tierRandom < 0.8505) { gameState.attractiveness = (Math.random() * 0.9) + 8.0; // 8.0 to 8.9 (Adamlite) - Extremely rare } else { gameState.attractiveness = (Math.random() * 1.5) + 2.0; // 2.0 to 3.5 (Subhuman to LTN) } gameState.baseAttractiveness = gameState.attractiveness; } // Apply conditions that lower attractiveness if (gameState.downSyndrome) { gameState.attractiveness = Math.max(1, gameState.attractiveness - 2); gameState.baseAttractiveness = gameState.attractiveness; } if (gameState.fas) { gameState.attractiveness = Math.max(1, gameState.attractiveness - 1); gameState.baseAttractiveness = gameState.attractiveness; } // Set initial height based on age gameState.height = heightPercentiles[gameState.gender][0]; gameState.weight = weightPercentiles[gameState.gender][0]; // Generate random parent and grandparent genetics generateFamilyGenetics(); // Calculate genetic potential based on family calculateGeneticPotential(); // Set race based on probability (predetermined at birth) const raceRandom = Math.random(); if (raceRandom < 0.6) gameState.race = "caucasian"; else if (raceRandom < 0.75) gameState.race = "asian"; else if (raceRandom < 0.85) gameState.race = "black"; else if (raceRandom < 0.95) gameState.race = "hispanic"; else gameState.race = "mixed"; // Set eye color based on race const eyeColorsForRace = eyeColors[gameState.race]; gameState.eyeColor = eyeColorsForRace[Math.floor(Math.random() * eyeColorsForRace.length)]; // Set family class const classRandom = Math.random(); if (classRandom < 0.4) gameState.familyClass = "lower"; else if (classRandom < 0.8) gameState.familyClass = "middle"; else gameState.familyClass = "upper"; gameState.familySupport = familyClassModifiers[gameState.familyClass].support; // Initialize hair system initHairSystem(); // Generate random traits (without conflicts) generateTraits(); // Update UI updateUI(); // Add initial log entry addLogEntry("You were born. Your genetic traits have been determined."); addLogEntry(`Your father is ${formatHeight(gameState.fatherHeight)} and your mother is ${formatHeight(gameState.motherHeight)}.`); addLogEntry(`You are ${gameState.gender}, ${gameState.race}, with ${gameState.eyeColor} eyes.`); addLogEntry(`Your family is ${gameState.familyClass} class.`); if (gameState.downSyndrome) { addLogEntry("You were born with Down Syndrome.", "warning"); } if (gameState.fas) { addLogEntry("You have Fetal Alcohol Syndrome.", "warning"); } if (gameState.trueAdam) { addLogEntry("MIRACLE! You were born as a True Adam (1 in 10 billion chance)!", "success"); } // Set up tab functionality tabs.forEach(tab => { tab.addEventListener('click', () => { const tabId = tab.getAttribute('data-tab'); // Remove active class from all tabs and contents tabs.forEach(t => t.classList.remove('active')); tabContents.forEach(c => c.classList.remove('active')); // Add active class to current tab and content tab.classList.add('active'); document.getElementById(`${tabId}-tab`).classList.add('active'); }); }); // Set up modal buttons modalCancelBtn.addEventListener('click', () => { procedureModal.style.display = 'none'; }); modalConfirmBtn.addEventListener('click', () => { procedureModal.style.display = 'none'; if (currentProcedure) { performProcedure(currentProcedure); } }); newLifeBtn.addEventListener('click', () => { generationModal.style.display = 'none'; restartGame(); }); // Set up procedure buttons setupProcedureButton(bracesBtn, 'braces', 3000); setupProcedureButton(jawSurgeryBtn, 'jawSurgery', 15000); setupProcedureButton(buccalFatBtn, 'buccalFat', 4000); setupProcedureButton(rhinoplastyBtn, 'rhinoplasty', 8000); setupProcedureButton(limbLengtheningBtn, 'limbLengthening', 70000); setupProcedureButton(fillerBtn, 'filler', 2000); setupProcedureButton(harmonizationFillerBtn, 'harmonizationFiller', 5000); setupProcedureButton(palatalExpanderBtn, 'palatalExpander', 4000); setupProcedureButton(canthopexyBtn, 'canthopexy', 6000); setupProcedureButton(eyelidFillerBtn, 'eyelidFiller', 3500); setupProcedureButton(blepharoplastyBtn, 'blepharoplasty', 8000); setupProcedureButton(keratopigmentationBtn, 'keratopigmentation', 7000); // Set up peptide buttons setupProcedureButton(igf1Btn, 'igf1', 500); setupProcedureButton(mk677Btn, 'mk677', 300); setupProcedureButton(hghBtn, 'hgh', 1000); setupProcedureButton(ghkCuBtn, 'ghkCu', 200); setupProcedureButton(minoxidilBtn, 'minoxidil', 50); setupProcedureButton(meclizineBtn, 'meclizine', 400); setupProcedureButton(cjcIpaBtn, 'cjcIpa', 600); // Set up steroid buttons setupProcedureButton(trenboloneBtn, 'trenbolone', 300); setupProcedureButton(anavarBtn, 'anavar', 200); // Set up nutrition buttons basicMealBtn.addEventListener('click', () => eatMeal('basic', 5)); healthyMealBtn.addEventListener('click', () => eatMeal('healthy', 15)); gainWeightBtn.addEventListener('click', () => eatMeal('gain', 10)); loseWeightBtn.addEventListener('click', () => eatMeal('lose', 12)); // Set up dating buttons dateBtn.addEventListener('click', goOnDate); proposeBtn.addEventListener('click', proposeMarriage); haveChildBtn.addEventListener('click', haveChild); divorceBtn.addEventListener('click', initiateDivorce); confrontBtn.addEventListener('click', confrontCheating); // Set up forum button joinOrgBtn.addEventListener('click', joinOrg); postThreadBtn.addEventListener('click', () => forumAction('postThread')); commentBtn.addEventListener('click', () => forumAction('comment')); shareExperienceBtn.addEventListener('click', () => forumAction('shareExperience')); askAdviceBtn.addEventListener('click', () => forumAction('askAdvice')); // Set up family buttons askMoneyBtn.addEventListener('click', askForMoney); askBracesBtn.addEventListener('click', askForBraces); askExpanderBtn.addEventListener('click', askForExpander); // Set up social media buttons tiktokPostBtn.addEventListener('click', () => postOnSocialMedia('tiktok')); instagramPostBtn.addEventListener('click', () => postOnSocialMedia('instagram')); // Set up study buttons elementaryStudyBtn.addEventListener('click', () => study('elementary')); middleStudyBtn.addEventListener('click', () => study('middle')); highSchoolStudyBtn.addEventListener('click', () => study('highschool')); collegeStudyBtn.addEventListener('click', () => study('college')); // Set up job buttons fastfoodJobBtn.addEventListener('click', () => applyForJob('fastfood')); retailJobBtn.addEventListener('click', () => applyForJob('retail')); officeJobBtn.addEventListener('click', () => applyForJob('office')); developerJobBtn.addEventListener('click', () => applyForJob('developer')); scientistJobBtn.addEventListener('click', () => applyForJob('scientist')); surgeonJobBtn.addEventListener('click', () => applyForJob('surgeon')); // Set up hair buttons basicHaircutBtn.addEventListener('click', () => getHaircut('basic')); premiumStyleBtn.addEventListener('click', () => getHaircut('premium')); dreadlocksBtn.addEventListener('click', () => setHairstyle('dreadlocks')); braidsBtn.addEventListener('click', () => setHairstyle('braids')); twistsBtn.addEventListener('click', () => setHairstyle('twists')); undercutBtn.addEventListener('click', () => setHairstyle('undercut')); // Set up archetype buttons prettyBoyBtn.addEventListener('click', () => selectArchetype('prettyBoy')); slenderTriadBtn.addEventListener('click', () => selectArchetype('slenderTriad')); ogreBtn.addEventListener('click', () => selectArchetype('ogre')); asianBaddieBtn.addEventListener('click', () => selectArchetype('asianBaddie')); latinaBaddieBtn.addEventListener('click', () => selectArchetype('latinaBaddie')); baddieBtn.addEventListener('click', () => selectArchetype('baddie')); // Set up other buttons ageBtn.addEventListener('click', ageUp); skincareBtn.addEventListener('click', doSkincare); gymBtn.addEventListener('click', doGymWorkout); studyBtn.addEventListener('click', doStudy); workBtn.addEventListener('click', doWork); fraudBtn.addEventListener('click', doFrauding); diyFillerBtn.addEventListener('click', doDiyFiller); ropeBtn.addEventListener('click', rope); } // Initialize hair system based on race function initHairSystem() { if (gameState.race === "mixed") { // Combine all hair types for mixed race const allTypes = [...hairTypesByRace.caucasian, ...hairTypesByRace.asian, ...hairTypesByRace.black, ...hairTypesByRace.hispanic]; gameState.hairType = allTypes[Math.floor(Math.random() * allTypes.length)]; } else { const types = hairTypesByRace[gameState.race]; gameState.hairType = types[Math.floor(Math.random() * types.length)]; } // Set initial hair length based on age gameState.hairLength = Math.min(30, gameState.age * 2); } // Generate family genetics function generateFamilyGenetics() { // Generate grandparent heights gameState.paternalGrandfatherHeight = Math.floor(Math.random() * 10) + 66; // 5'6" to 6'4" gameState.paternalGrandmotherHeight = Math.floor(Math.random() * 10) + 60; // 5'0" to 5'10" gameState.maternalGrandfatherHeight = Math.floor(Math.random() * 10) + 66; // 5'6" to 6'4" gameState.maternalGrandmotherHeight = Math.floor(Math.random() * 10) + 60; // 5'0" to 5'10" // Calculate parent heights based on grandparents (simplified) gameState.fatherHeight = Math.floor((gameState.paternalGrandfatherHeight + gameState.paternalGrandmotherHeight + 5) / 2); gameState.motherHeight = Math.floor((gameState.maternalGrandfatherHeight + gameState.maternalGrandmotherHeight) / 2); } // Calculate genetic potential based on family function calculateGeneticPotential() { // Calculate height potential based on family heights const maleHeightPotential = (gameState.fatherHeight + gameState.paternalGrandfatherHeight + gameState.maternalGrandfatherHeight) / 3; const femaleHeightPotential = (gameState.motherHeight + gameState.paternalGrandmotherHeight + gameState.maternalGrandmotherHeight) / 3; // Adjust for gender const heightPotential = gameState.gender === "male" ? maleHeightPotential : femaleHeightPotential; // Convert to genetic potential (0 to 1 scale) gameState.geneticPotential = (heightPotential - 74) / 12; // 5'4" to 7'4" becomes 0 to 1 gameState.geneticPotential = Math.max(0, Math.min(1, gameState.geneticPotential)); } // Format height in feet and inches function formatHeight(inches) { const feet = Math.floor(inches / 12); const remainingInches = inches % 12; return `${feet}'${remainingInches}"`; } // Generate random traits without conflicts function generateTraits() { const attractivePhysicalTraits = [ "Symmetrical Face", "Wide Clavicles", "Broad Shoulders", "Tall Stature", "Good Body Fat Distribution", "V-Taper Torso", "Long Limbs", "Good Posture" ]; const attractiveFacialTraits = [ "Positive Canthal Tilt", "Forward Grown Maxilla", "Strong Jawline", "High Cheekbones", "Harmonious Features", "Good Facial Balance", "Hooded Eyes", "Defined Cupid's Bow" ]; const attractiveSkinTraits = [ "Clear Skin", "Even Skin Tone", "Smooth Texture" ]; const unattractivePhysicalTraits = [ "Narrow Clavicles", "Short Stature", "Poor Body Fat Distribution", "Round Shoulders", "Small Frame", "Poor Posture", "Short Neck", "Small Wrists" ]; const unattractiveFacialTraits = [ "Recessed Maxilla", "Recessed Chin", "Negative Canthal Tilt", "Asymmetrical Features", "Poor Facial Harmony", "Bug Eyes", "Thin Lips", "Weak Jawline", "Malocclusion" ]; const unattractiveSkinTraits = [ "Acne", "Cystic Acne", "Hyperpigmentation", "Rosacea", "Large Pores", "Scarring", "Oily Skin", "Dry Skin" ]; const healthTraits = [ "Good Metabolism", "Good Immune System", "Fast Recovery", "Healthy Skin", "Thick Hair", "Good Cardiovascular Health" ]; const negativeHealthTraits = [ "Acne-Prone Skin", "Poor Metabolism", "Weak Immune System", "Slow Recovery", "Balding Genes", "Allergies", "Asthma" ]; // Clear current traits gameState.physicalTraits = []; gameState.facialTraits = []; gameState.skinTraits = []; gameState.healthTraits = []; gameState.negativePhysical = []; gameState.negativeFacial = []; gameState.negativeSkin = []; gameState.negativeHealth = []; // Add physical traits based on genetic potential const physicalTraitCount = Math.floor(gameState.geneticPotential * 3) + 1; for (let i = 0; i < physicalTraitCount; i++) { const trait = attractivePhysicalTraits[Math.floor(Math.random() * attractivePhysicalTraits.length)]; if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.physicalTraits.push(trait); } } // Add facial traits based on genetic potential const facialTraitCount = Math.floor(gameState.geneticPotential * 3) + 1; for (let i = 0; i < facialTraitCount; i++) { const trait = attractiveFacialTraits[Math.floor(Math.random() * attractiveFacialTraits.length)]; if (!gameState.facialTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.facialTraits.push(trait); } } // Add skin traits const skinTraitCount = Math.floor(Math.random() * 2) + 1; for (let i = 0; i < skinTraitCount; i++) { const trait = attractiveSkinTraits[Math.floor(Math.random() * attractiveSkinTraits.length)]; if (!gameState.skinTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.skinTraits.push(trait); } } // Add health traits const healthTraitCount = Math.floor(Math.random() * 3) + 1; for (let i = 0; i < healthTraitCount; i++) { const trait = healthTraits[Math.floor(Math.random() * healthTraits.length)]; if (!gameState.healthTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.healthTraits.push(trait); } } // Add negative physical traits (more likely with lower genetic potential) const negativePhysicalCount = Math.floor((1 - gameState.geneticPotential) * 3) + 1; for (let i = 0; i < negativePhysicalCount; i++) { const trait = unattractivePhysicalTraits[Math.floor(Math.random() * unattractivePhysicalTraits.length)]; if (!gameState.negativePhysical.includes(trait) && !hasConflictingTrait(trait)) { gameState.negativePhysical.push(trait); } } // Add negative facial traits (more likely with lower genetic potential) const negativeFacialCount = Math.floor((1 - gameState.geneticPotential) * 3) + 1; for (let i = 0; i < negativeFacialCount; i++) { const trait = unattractiveFacialTraits[Math.floor(Math.random() * unattractiveFacialTraits.length)]; if (!gameState.negativeFacial.includes(trait) && !hasConflictingTrait(trait)) { gameState.negativeFacial.push(trait); } } // Add negative skin traits const negativeSkinCount = Math.floor(Math.random() * 3); for (let i = 0; i < negativeSkinCount; i++) { const trait = unattractiveSkinTraits[Math.floor(Math.random() * unattractiveSkinTraits.length)]; if (!gameState.negativeSkin.includes(trait) && !hasConflictingTrait(trait)) { gameState.negativeSkin.push(trait); } } // Add negative health traits const negativeHealthCount = Math.floor(Math.random() * 2); for (let i = 0; i < negativeHealthCount; i++) { const trait = negativeHealthTraits[Math.floor(Math.random() * negativeHealthTraits.length)]; if (!gameState.negativeHealth.includes(trait) && !hasConflictingTrait(trait)) { gameState.negativeHealth.push(trait); } } // Add facial asymmetry if applicable if (gameState.facialAsymmetry) { gameState.negativeFacial.push("Facial Asymmetry"); } // Add gender-specific traits if (gameState.gender === "female") { // Female-specific traits const feminineTraitCount = Math.floor(gameState.geneticPotential * 2) + 1; for (let i = 0; i < feminineTraitCount; i++) { const trait = ["Wide Hips", "Narrow Shoulders", "Balanced Physique", "Clear Skin", "Good Fat Distribution"][Math.floor(Math.random() * 5)]; if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.physicalTraits.push(trait); } } // Female-specific failos if (Math.random() < 0.3) { gameState.negativePhysical.push("Breast Asymmetry"); } if (Math.random() < 0.2) { gameState.negativeFacial.push("Masculinized Jaw"); } } else { // Male-specific traits const masculineTraitCount = Math.floor(gameState.geneticPotential * 2) + 1; for (let i = 0; i < masculineTraitCount; i++) { const trait = ["Broad Shoulders", "Strong Jawline", "V-Taper Torso", "Defined Features"][Math.floor(Math.random() * 4)]; if (!gameState.physicalTraits.includes(trait) && !hasConflictingTrait(trait)) { gameState.physicalTraits.push(trait); } } } } // Check for conflicting traits function hasConflictingTrait(trait) { const conflicts = { "Good Metabolism": ["Poor Metabolism"], "Poor Metabolism": ["Good Metabolism"], "Good Immune System": ["Weak Immune System"], "Weak Immune System": ["Good Immune System"], "Fast Recovery": ["Slow Recovery"], "Slow Recovery": ["Fast Recovery"], "Clear Skin": ["Acne", "Cystic Acne", "Hyperpigmentation", "Rosacea", "Oily Skin", "Dry Skin"], "Acne": ["Clear Skin"], "Cystic Acne": ["Clear Skin"], "Hyperpigmentation": ["Clear Skin"], "Rosacea": ["Clear Skin"], "Oily Skin": ["Clear Skin"], "Dry Skin": ["Clear Skin"] }; if (conflicts[trait]) { for (const conflictingTrait of conflicts[trait]) { if (gameState.physicalTraits.includes(conflictingTrait) || gameState.facialTraits.includes(conflictingTrait) || gameState.skinTraits.includes(conflictingTrait) || gameState.healthTraits.includes(conflictingTrait) || gameState.negativePhysical.includes(conflictingTrait) || gameState.negativeFacial.includes(conflictingTrait) || gameState.negativeSkin.includes(conflictingTrait) || gameState.negativeHealth.includes(conflictingTrait)) { return true; } } } return false; } // Update the UI with current game state function updateUI() { // Update basic stats ageValue.textContent = `${gameState.age} years old`; neuroStatus.textContent = gameState.neuroStatus; iqValue.textContent = gameState.iq; iqPotential.textContent = gameState.iqPotential; heightValue.textContent = formatHeight(gameState.height); healthValue.textContent = getHealthStatus(); moneyValue.textContent = `$${gameState.money}`; socialValue.textContent = getSocialStatus(); raceValue.textContent = gameState.race.charAt(0).toUpperCase() + gameState.race.slice(1); eyeColorValue.textContent = gameState.eyeColor.charAt(0).toUpperCase() + gameState.eyeColor.slice(1); smvValue.textContent = gameState.smv.toFixed(1); statusValue.textContent = gameState.status; followersValue.textContent = gameState.followers; humorValue.textContent = gameState.humor; // Update weight and BMI weightValue.textContent = `${gameState.weight} lbs`; // Calculate BMI: (weight in pounds / (height in inches)^2) * 703 gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703; bmiValue.textContent = gameState.bmi.toFixed(1); // Update BMI status let bmiStatusText = ""; let bmiStatusClass = ""; if (gameState.bmi < 18.5) { bmiStatusText = "Underweight"; bmiStatusClass = "underweight"; } else if (gameState.bmi < 25) { bmiStatusText = "Normal"; bmiStatusClass = "normal"; } else if (gameState.bmi < 30) { bmiStatusText = "Overweight"; bmiStatusClass = "overweight"; } else { bmiStatusText = "Obese"; bmiStatusClass = "obese"; } bmiStatus.textContent = bmiStatusText; bmiStatus.className = "bmi-status " + bmiStatusClass; // Update BMI progress bar (18.5-24.9 is normal range) const bmiProgressValue = Math.max(0, Math.min(100, (gameState.bmi - 15) * 5)); bmiProgress.style.width = `${bmiProgressValue}%`; // Update bone mass boneMassValue.textContent = getBoneMassStatus(); boneMassProgress.style.width = `${gameState.boneMass}%`; // Update genetic display fatherHeight.textContent = formatHeight(gameState.fatherHeight); motherHeight.textContent = formatHeight(gameState.motherHeight); parentBone.textContent = gameState.geneticPotential > 0.6 ? "Good" : gameState.geneticPotential > 0.4 ? "Average" : "Poor"; geneticPotential.textContent = gameState.geneticPotential > 0.6 ? "High" : gameState.geneticPotential > 0.4 ? "Medium" : "Low"; // Update family class display familyClassValue.textContent = gameState.familyClass.charAt(0).toUpperCase() + gameState.familyClass.slice(1); familyClassValue.className = "family-class " + gameState.familyClass + "-class"; familySupport.textContent = `$${gameState.familySupport}`; familyClassText.textContent = gameState.familyClass; // Update height percentile updateHeightPercentile(); heightPercentile.style.width = `${gameState.heightPercentile}%`; heightPercentileValue.textContent = `${gameState.heightPercentile}%`; tallerThan.textContent = `${gameState.heightPercentile}%`; // Update attractiveness tier const tier = getCurrentTier(); attractivenessValue.textContent = tier.name; // Set tier badge text based on tier name let tierBadgeText = ""; if (tier.name === "Subhuman") tierBadgeText = "SUB"; else if (tier.name === "Low Tier Normie") tierBadgeText = "LTN"; else if (tier.name === "High Low Tier Normie") tierBadgeText = "HLTN"; else if (tier.name === "Low Mid Tier Normie") tierBadgeText = "LMTN"; else if (tier.name === "High Mid Tier Normie") tierBadgeText = "HMTN"; else if (tier.name === "Low High Tier Normie") tierBadgeText = "LHTN"; else if (tier.name === "High Tier Normie") tierBadgeText = "HTN"; else if (tier.name === "Chad Lite") tierBadgeText = "CL"; else if (tier.name === "High Chad Lite") tierBadgeText = "HCL"; else if (tier.name === "Chad") tierBadgeText = "CHAD"; else if (tier.name === "Adamlite") tierBadgeText = "AL"; else if (tier.name === "True Adam") tierBadgeText = "TA"; tierBadge.textContent = tierBadgeText; tierBadge.className = "tier-badge " + tier.class; // Check if tier has decreased if (tier.name !== gameState.previousTier && gameState.age > 0) { const previousTierIndex = tiers.findIndex(t => t.name === gameState.previousTier); const currentTierIndex = tiers.findIndex(t => t.name === tier.name); if (currentTierIndex < previousTierIndex) { addLogEntry(`Your attractiveness tier has decreased from ${gameState.previousTier} to ${tier.name}!`, "danger"); } } gameState.previousTier = tier.name; // Update .org status if on forum if (gameState.onForum) { orgStatusContainer.style.display = 'block'; let orgStatusClass = 'gray-status'; let orgStatusText = 'Gray'; if (gameState.orgStatus === 'known') { orgStatusClass = 'known-status'; orgStatusText = 'Known'; } else if (gameState.orgStatus === 'contributor') { orgStatusClass = 'contributor-status'; orgStatusText = 'Contributor'; } else if (gameState.orgStatus === 'orgmaster') { orgStatusClass = 'orgmaster-status'; orgStatusText = '.org Master'; } orgStatusValue.className = 'status-badge ' + orgStatusClass; orgStatusValue.textContent = orgStatusText; forumStatus.textContent = 'Member'; forumJoinContainer.style.display = 'none'; forumActionsContainer.style.display = 'block'; } else { orgStatusContainer.style.display = 'none'; forumStatus.textContent = 'Not a member'; forumJoinContainer.style.display = 'block'; forumActionsContainer.style.display = 'none'; } // Enable/disable .org join button based on age joinOrgBtn.disabled = gameState.age < 13; // Update social media status if (gameState.socialMediaStatus !== "none") { socialMediaStatusContainer.style.display = 'block'; let statusText = "No Presence"; if (gameState.socialMediaStatus === "lolcow") { statusText = "Lolcow (Negative Attention)"; } else if (gameState.socialMediaStatus === "influencer") { statusText = "Influencer (" + gameState.followers + " followers)"; } else if (gameState.socialMediaStatus === "viral") { statusText = "Viral Star (" + gameState.followers + " followers)"; } socialMediaStatusValue.textContent = statusText; } else { socialMediaStatusContainer.style.display = 'none'; } // Update relationship status if (gameState.age >= 16) { relationshipContainer.style.display = 'block'; let relationshipText = ""; let relationshipClass = ""; if (gameState.relationshipStatus === "single") { relationshipText = "Single"; relationshipClass = "single"; } else if (gameState.relationshipStatus === "dating") { relationshipText = "Dating"; relationshipClass = "dating"; } else if (gameState.relationshipStatus === "married") { relationshipText = "Married"; relationshipClass = "married"; } relationshipStatusValue.textContent = relationshipText; relationshipStatusValue.className = "relationship-status " + relationshipClass; // Show partner info if in a relationship if (gameState.relationshipStatus !== "single" && gameState.partner) { partnerInfoContainer.style.display = 'block'; partnerName.textContent = gameState.partner.name; partnerAttractiveness.textContent = gameState.partner.attractiveness.toFixed(1); partnerHeight.textContent = formatHeight(gameState.partner.height); childrenCount.textContent = gameState.children.length; // Show children if any if (gameState.children.length > 0) { childrenContainer.style.display = 'block'; childrenContainer.innerHTML = ''; gameState.children.forEach((child, index) => { const childEl = document.createElement('div'); childEl.className = 'child-item'; childEl.textContent = `Child ${index + 1}: ${formatHeight(child.height)} tall, ${child.attractiveness.toFixed(1)} SMV`; childrenContainer.appendChild(childEl); }); } else { childrenContainer.style.display = 'none'; } } else { partnerInfoContainer.style.display = 'none'; } } else { relationshipContainer.style.display = 'none'; } // Update dating tab if (gameState.age < 16) { datingStatusText.textContent = "too young to date"; datingActions.style.display = 'none'; } else { datingActions.style.display = 'block'; if (gameState.relationshipStatus === "single") { datingStatusText.textContent = "single and looking"; dateBtn.style.display = 'block'; proposeBtn.style.display = 'none'; haveChildBtn.style.display = 'none'; divorceBtn.style.display = 'none'; confrontBtn.style.display = 'none'; } else if (gameState.relationshipStatus === "dating") { datingStatusText.textContent = `dating ${gameState.partner.name}`; dateBtn.style.display = 'none'; proposeBtn.style.display = 'block'; haveChildBtn.style.display = 'none'; divorceBtn.style.display = 'none'; confrontBtn.style.display = 'none'; } else if (gameState.relationshipStatus === "married") { datingStatusText.textContent = `married to ${gameState.partner.name}`; dateBtn.style.display = 'none'; proposeBtn.style.display = 'none'; haveChildBtn.style.display = 'block'; divorceBtn.style.display = 'block'; // Show confront button if cheating is detected if (gameState.partnerCheating) { confrontBtn.style.display = 'block'; } else { confrontBtn.style.display = 'none'; } } // Show cheating indicator if married if (gameState.relationshipStatus === "married") { cheatingIndicator.style.display = 'block'; let riskText = "Low"; let riskClass = "low-risk"; if (gameState.cheatingRisk > 70) { riskText = "High"; riskClass = "high-risk"; } else if (gameState.cheatingRisk > 40) { riskText = "Medium"; riskClass = "medium-risk"; } cheatingRiskValue.textContent = riskText; cheatingRiskValue.className = "cheating-risk " + riskClass; } else { cheatingIndicator.style.display = 'none'; } } // Update hair UI hairTypeDisplay.textContent = gameState.hairType; let lengthText = "Short"; if (gameState.hairLength > 70) lengthText = "Very Long"; else if (gameState.hairLength > 50) lengthText = "Long"; else if (gameState.hairLength > 30) lengthText = "Medium"; hairLengthDisplay.textContent = lengthText; let healthText = "Healthy"; if (gameState.hairHealth > 80) healthText = "Very Healthy"; else if (gameState.hairHealth > 60) healthText = "Healthy"; else if (gameState.hairHealth > 40) healthText = "Damaged"; else if (gameState.hairHealth > 20) healthText = "Very Damaged"; else healthText = "Unhealthy"; hairHealthDisplay.textContent = healthText; hairHealthBar.style.width = `${gameState.hairHealth}%`; // Update progress bars ageProgress.style.width = `${(gameState.age / 80) * 100}%`; iqProgress.style.width = `${((gameState.iq - 70) / 60) * 100}%`; heightProgress.style.width = `${((gameState.height - 20) / 60) * 100}%`; healthProgress.style.width = `${gameState.health}%`; socialProgress.style.width = `${gameState.socialStatus}%`; // Update traits physicalTraits.innerHTML = ''; gameState.physicalTraits.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait'; traitEl.textContent = trait; physicalTraits.appendChild(traitEl); }); gameState.negativePhysical.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait negative-trait'; traitEl.textContent = trait; physicalTraits.appendChild(traitEl); }); facialTraits.innerHTML = ''; gameState.facialTraits.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait'; traitEl.textContent = trait; facialTraits.appendChild(traitEl); }); gameState.negativeFacial.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait negative-trait'; traitEl.textContent = trait; facialTraits.appendChild(traitEl); }); skinTraits.innerHTML = ''; gameState.skinTraits.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait'; traitEl.textContent = trait; skinTraits.appendChild(traitEl); }); gameState.negativeSkin.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait negative-trait'; traitEl.textContent = trait; skinTraits.appendChild(traitEl); }); healthTraits.innerHTML = ''; gameState.healthTraits.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait'; traitEl.textContent = trait; healthTraits.appendChild(traitEl); }); gameState.negativeHealth.forEach(trait => { const traitEl = document.createElement('div'); traitEl.className = 'trait negative-trait'; traitEl.textContent = trait; healthTraits.appendChild(traitEl); }); // Update button states surgeryBtn.disabled = gameState.age < 18 || gameState.money < 5000; skincareBtn.disabled = gameState.money < 50; gymBtn.disabled = gameState.money < 30 || gameState.gymAscension >= 2; studyBtn.disabled = gameState.money < 20 || gameState.iq >= gameState.iqPotential; workBtn.disabled = gameState.age < 16; fraudBtn.disabled = gameState.money < 20; diyFillerBtn.disabled = gameState.money < 100 || gameState.age < 11; // Update procedure buttons updateProcedureButton(bracesBtn, 3000); updateProcedureButton(jawSurgeryBtn, 15000); updateProcedureButton(buccalFatBtn, 4000); updateProcedureButton(rhinoplastyBtn, 8000); updateProcedureButton(limbLengtheningBtn, 70000); updateProcedureButton(fillerBtn, 2000); updateProcedureButton(harmonizationFillerBtn, 5000); updateProcedureButton(palatalExpanderBtn, 4000, gameState.age >= 16); updateProcedureButton(canthopexyBtn, 6000); updateProcedureButton(eyelidFillerBtn, 3500); updateProcedureButton(blepharoplastyBtn, 8000); updateProcedureButton(keratopigmentationBtn, 7000); // Update peptide buttons (available only from age 12) updatePeptideButton(igf1Btn, 500, gameState.age >= 12); updatePeptideButton(mk677Btn, 300, gameState.age >= 12); updatePeptideButton(hghBtn, 1000, gameState.age >= 12); updatePeptideButton(ghkCuBtn, 200, gameState.age >= 12); updatePeptideButton(minoxidilBtn, 50, gameState.age >= 12); updatePeptideButton(meclizineBtn, 400, gameState.age >= 12); updatePeptideButton(cjcIpaBtn, 600, gameState.age >= 12); // Update steroid buttons updateProcedureButton(trenboloneBtn, 300, gameState.age >= 18); updateProcedureButton(anavarBtn, 200, gameState.age >= 18); // Update family buttons (ask for money only available from age 12) askMoneyBtn.disabled = gameState.familySupport <= 0 || gameState.age < 12; askBracesBtn.disabled = gameState.familySupport < 3000 || gameState.proceduresDone.includes("braces"); askExpanderBtn.disabled = gameState.familySupport < 4000 || gameState.age >= 16 || gameState.proceduresDone.includes("palatalExpander"); // Update study buttons based on age elementaryStudyBtn.disabled = gameState.age > 12; middleStudyBtn.disabled = gameState.age < 12 || gameState.age > 15; highSchoolStudyBtn.disabled = gameState.age < 15 || gameState.age > 18; collegeStudyBtn.disabled = gameState.age < 18; // Update job buttons based on IQ requirements updateJobButton(fastfoodJobBtn, 0); updateJobButton(retailJobBtn, 85); updateJobButton(officeJobBtn, 95); updateJobButton(developerJobBtn, 110); updateJobButton(scientistJobBtn, 120); updateJobButton(surgeonJobBtn, 130); // Update TikTok button based on age tiktokPostBtn.disabled = gameState.age < 13; // Update nutrition buttons basicMealBtn.disabled = gameState.money < 5; healthyMealBtn.disabled = gameState.money < 15; gainWeightBtn.disabled = gameState.money < 10; loseWeightBtn.disabled = gameState.money < 12; // Update hair buttons basicHaircutBtn.disabled = gameState.money < 30; premiumStyleBtn.disabled = gameState.money < 100; dreadlocksBtn.disabled = gameState.money < 200; braidsBtn.disabled = gameState.money < 150; twistsBtn.disabled = gameState.money < 180; undercutBtn.disabled = gameState.money < 60; // Update archetype buttons updateArchetypeButtons(); } // Get bone mass status text function getBoneMassStatus() { if (gameState.boneMass >= 80) return "Dense"; if (gameState.boneMass >= 60) return "Strong"; if (gameState.boneMass >= 40) return "Normal"; if (gameState.boneMass >= 20) return "Weak"; return "Fragile"; } // Update height percentile based on age and gender function updateHeightPercentile() { const baseHeight = heightPercentiles[gameState.gender][gameState.age]; const heightDifference = gameState.height - baseHeight; // Calculate percentile based on difference from average if (heightDifference < -4) { gameState.heightPercentile = 10; } else if (heightDifference < -2) { gameState.heightPercentile = 25; } else if (heightDifference < 0) { gameState.heightPercentile = 40; } else if (heightDifference < 2) { gameState.heightPercentile = 60; } else if (heightDifference < 4) { gameState.heightPercentile = 75; } else if (heightDifference < 6) { gameState.heightPercentile = 85; } else if (heightDifference < 8) { gameState.heightPercentile = 90; } else if (heightDifference < 10) { gameState.heightPercentile = 95; } else { gameState.heightPercentile = 99; } // Make above average height uncommon and very tall rare if (gameState.height > 74) { // 6'2" gameState.heightPercentile = 99; } else if (gameState.height > 72) { // 6'0" gameState.heightPercentile = 90; } else if (gameState.height > 70) { // 5'10" gameState.heightPercentile = 75; } } // Get current attractiveness tier function getCurrentTier() { for (const tier of tiers) { if (gameState.attractiveness >= tier.min && gameState.attractiveness <= tier.max) { return tier; } } return tiers[2]; // Default to High Low Tier Normie } // Get health status text function getHealthStatus() { if (gameState.health >= 80) return "Excellent"; if (gameState.health >= 60) return "Good"; if (gameState.health >= 40) return "Fair"; if (gameState.health >= 20) return "Poor"; return "Critical"; } // Get social status text function getSocialStatus() { if (gameState.socialStatus >= 80) return "Popular"; if (gameState.socialStatus >= 60) return "Liked"; if (gameState.socialStatus >= 40) return "Neutral"; if (gameState.socialStatus >= 20) return "Disliked"; return "Bullied"; } // Add a log entry function addLogEntry(message, type = "info") { const logEntry = document.createElement('div'); logEntry.className = 'log-entry'; let className = ""; if (type === "success") className = "success"; if (type === "danger") className = "danger"; if (type === "warning") className = "warning"; logEntry.innerHTML = `<span class="age-badge">Age ${gameState.age}</span> ${message}`; if (className) logEntry.classList.add(className); gameLog.appendChild(logEntry); gameLog.scrollTop = gameLog.scrollHeight; } // Setup procedure button function setupProcedureButton(button, procedure, cost) { button.addEventListener('click', () => { if (gameState.money >= cost) { currentProcedure = procedure; showProcedureModal(procedure, cost); } }); } // Update procedure button state function updateProcedureButton(button, cost, additionalCondition = true) { button.disabled = gameState.money < cost || !additionalCondition; } // Update peptide button state (available only from age 12) function updatePeptideButton(button, cost, additionalCondition = true) { button.disabled = gameState.money < cost || !additionalCondition; } // Update job button state function updateJobButton(button, iqReq) { const job = jobs.find(j => j.id === button.id.replace('-job-btn', '')); const hasDegree = gameState.schoolLevel === "college" && gameState.age >= 22; button.disabled = gameState.iq < iqReq || gameState.currentJob === job.id || (job.degreeReq && !hasDegree); } // Update archetype button states function updateArchetypeButtons() { prettyBoyBtn.disabled = !canSelectArchetype('prettyBoy'); slenderTriadBtn.disabled = !canSelectArchetype('slenderTriad'); ogreBtn.disabled = !canSelectArchetype('ogre'); asianBaddieBtn.disabled = !canSelectArchetype('asianBaddie'); latinaBaddieBtn.disabled = !canSelectArchetype('latinaBaddie'); baddieBtn.disabled = !canSelectArchetype('baddie'); // Male archetypes require .org membership if (gameState.gender === "male") { prettyBoyBtn.disabled = prettyBoyBtn.disabled || !gameState.onForum; slenderTriadBtn.disabled = slenderTriadBtn.disabled || !gameState.onForum; ogreBtn.disabled = ogreBtn.disabled || !gameState.onForum; } } // Check if player can select an archetype function canSelectArchetype(archetype) { const tier = getCurrentTier(); switch(archetype) { case 'prettyBoy': return tier.min >= 5.5 && gameState.height >= 70 && !gameState.negativeSkin.includes("Acne") && !gameState.negativeSkin.includes("Cystic Acne") && gameState.feminineTraits > 60; case 'slenderTriad': return gameState.height >= 72 && gameState.bmi < 18.5 && gameState.negativePhysical.includes("Narrow Clavicles"); case 'ogre': return (tier.min >= 7.6 || tier.max <= 2.9) && gameState.height >= 72 && gameState.boneMass > 70; case 'asianBaddie': return gameState.race === "asian" && tier.min >= 5.0 && hasIdealRatios(); case 'latinaBaddie': return gameState.race === "hispanic" && tier.min >= 5.0 && hasIdealRatios(); case 'baddie': return tier.min >= 5.0 && hasIdealRatios() && gameState.negativeFacial.length === 0; } return false; } // Check if player has ideal facial/body ratios function hasIdealRatios() { // Simplified check for ideal ratios return Math.random() > 0.7; // 30% chance of having ideal ratios } // Show procedure modal function showProcedureModal(procedure, cost) { let title = ""; let description = ""; let risk = ""; switch(procedure) { case 'braces': title = "Braces"; description = "Corrects malocclusion and straightens teeth. Risk of botch if no dental issues present."; risk = "Medium"; break; case 'jawSurgery': title = "Jaw Surgery"; description = "Fixes recessed maxilla or mandible. Significant improvement to facial structure but high risk of complications."; risk = "High"; break; case 'buccalFat': title = "Buccal Fat Removal"; description = "Removes cheek fat for more defined cheekbones. Can cause premature aging if overdone."; risk = "Medium"; break; case 'rhinoplasty': title = "Rhinoplasty"; description = "Reshapes the nose. High botch potential but can significantly improve facial harmony."; risk = "High"; break; case 'limbLengthening': title = "Limb Lengthening Surgery"; description = "Increases height by 3-4 inches. Extremely painful and risky with long recovery time."; risk = "High"; break; case 'filler': title = "Professional Filler"; description = "Adds volume to lips, cheeks, or jawline. Low risk but temporary results."; risk = "Low"; break; case 'harmonizationFiller': title = "Facial Harmonization Filler"; description = "Advanced filler techniques to improve facial harmony and balance. Can push past natural hardcaps and ascend up to 2 tiers."; risk = "Medium"; break; case 'palatalExpander': title = "Palatal Expander"; description = "Widens the upper jaw. Only effective before age 16. Risk of fusion with peptides."; risk = "Medium"; break; case 'canthopexy': title = "Canthopexy"; description = "Lifts the outer corner of the eyes for a more alert, positive canthal tilt."; risk = "High"; break; case 'eyelidFiller': title = "Upper Eyelid Filler"; description = "Adds volume to upper eyelids for a more hunter-eyed/hooded appearance."; risk = "Medium"; break; case 'blepharoplasty': title = "Blepharoplasty"; description = "Eyelid surgery to remove excess skin or fat from the eyelids."; risk = "High"; break; case 'keratopigmentation': title = "Keratopigmentation"; description = "Permanent eye color change procedure. Risk of blindness if botched."; risk = "Medium"; break; case 'igf1': title = "IGF-1 Peptides"; description = "Stimulates growth before plates close. After closure, risk of acromegaly, organ enlargement, and diabetes."; risk = "High"; break; case 'mk677': title = "MK-677"; description = "Growth hormone secretagogue. Increases height potential and bone mass but may cause insulin resistance."; risk = "Medium"; break; case 'hgh': title = "Human Growth Hormone"; description = "Maximizes growth potential and increases bone mass. High risk of side effects including acromegaly and cardiovascular issues."; risk = "High"; break; case 'ghkCu': title = "GHK-Cu"; description = "Copper peptide for skin rejuvenation and improved complexion."; risk = "Low"; break; case 'minoxidil': title = "Minoxidil"; description = "Promotes facial hair growth and prevents balding. Low risk but requires continuous use."; risk = "Low"; break; case 'meclizine': title = "Meclizine/Aromatase Inhibitors"; description = "May increase height by delaying growth plate closure. Very low success rate. Risk of dementia later in life."; risk = "High"; break; case 'cjcIpa': title = "CJC no DAC + IPA"; description = "Growth hormone releasing peptide combination. May increase height and improve recovery."; risk = "Medium"; break; case 'trenbolone': title = "Trenbolone"; description = "Extremely powerful steroid. Very dangerous for teens, dangerous for adults."; risk = "High"; break; case 'anavar': title = "Anavar"; description = "Milder steroid but still dangerous. Can cause liver damage."; risk = "High"; break; } modalProcedureTitle.textContent = title; modalProcedureDesc.innerHTML = `${description}<br><br>Cost: $${cost}<br>Risk: <span class="risk-indicator ${risk.toLowerCase()}-risk">${risk} Risk</span>`; procedureModal.style.display = 'flex'; } // Perform procedure function performProcedure(procedure) { let cost = 0; let success = false; let message = ""; let messageType = "info"; let attractivenessChange = 0; let healthChange = 0; let heightChange = 0; let boneMassChange = 0; switch(procedure) { case 'braces': cost = 3000; if (gameState.negativeFacial.includes("Malocclusion")) { success = true; const index = gameState.negativeFacial.indexOf("Malocclusion"); gameState.negativeFacial.splice(index, 1); message = "Braces successfully corrected your malocclusion."; attractivenessChange = 0.3; } else { message = "Braces were unnecessary and caused dental problems."; messageType = "danger"; healthChange = -5; } break; case 'jawSurgery': cost = 15000; if (gameState.negativeFacial.includes("Recessed Maxilla") || gameState.negativeFacial.includes("Recessed Chin")) { success = true; if (gameState.negativeFacial.includes("Recessed Maxilla")) { const index = gameState.negativeFacial.indexOf("Recessed Maxilla"); gameState.negativeFacial.splice(index, 1); } if (gameState.negativeFacial.includes("Recessed Chin")) { const index = gameState.negativeFacial.indexOf("Recessed Chin"); gameState.negativeFacial.splice(index, 1); } message = "Jaw surgery successfully improved your facial structure."; attractivenessChange = 0.8; healthChange = -10; // Surgery recovery } else { if (Math.random() < 0.7) { message = "Jaw surgery was unnecessary and resulted in a botched outcome."; messageType = "danger"; attractivenessChange = -0.5; healthChange = -15; } else { message = "Jaw surgery provided minor improvement despite not being necessary."; attractivenessChange = 0.2; healthChange = -10; } } break; case 'buccalFat': cost = 4000; if (gameState.negativePhysical.includes("Poor Body Fat Distribution") || Math.random() < 0.6) { success = true; if (gameState.negativePhysical.includes("Poor Body Fat Distribution")) { const index = gameState.negativePhysical.indexOf("Poor Body Fat Distribution"); gameState.negativePhysical.splice(index, 1); } message = "Buccal fat removal improved your facial definition."; attractivenessChange = 0.4; } else { message = "Buccal fat removal was overdone, causing premature aging."; messageType = "danger"; attractivenessChange = -0.3; healthChange = -5; } break; case 'rhinoplasty': cost = 8000; if (gameState.negativeFacial.includes("Asymmetrical Features") || Math.random() < 0.5) { success = true; if (gameState.negativeFacial.includes("Asymmetrical Features")) { const index = gameState.negativeFacial.indexOf("Asymmetrical Features"); gameState.negativeFacial.splice(index, 1); } message = "Rhinoplasty improved your nasal appearance."; attractivenessChange = 0.5; } else { message = "Rhinoplasty resulted in a botched nose."; messageType = "danger"; attractivenessChange = -0.7; } healthChange = -8; break; case 'limbLengthening': cost = 70000; if (gameState.height < 70 && Math.random() < 0.7) { success = true; gameState.height += 3; message = "Limb lengthening surgery increased your height by 3 inches."; attractivenessChange = 0.6; } else { message = "Limb lengthening surgery resulted in complications and poor outcomes."; messageType = "danger"; healthChange = -20; attractivenessChange = -0.3; } healthChange = -15; break; case 'filler': cost = 2000; success = true; message = "Professional filler enhanced your facial features."; attractivenessChange = 0.3; gameState.fillerActive = true; // Filler is temporary setTimeout(() => { gameState.attractiveness -= 0.2; gameState.fillerActive = false; addLogEntry("Your filler has worn off.", "warning"); updateUI(); }, 60000); // 1 minute = 1-2 years in game time break; case 'harmonizationFiller': cost = 5000; success = true; // Correct facial asymmetry if (gameState.facialAsymmetry) { gameState.facialAsymmetry = false; const index = gameState.negativeFacial.indexOf("Facial Asymmetry"); if (index !== -1) { gameState.negativeFacial.splice(index, 1); } message = "Facial harmonization filler corrected your facial asymmetry and improved your facial harmony."; attractivenessChange = 0.8; } else { // Calculate tier improvement (up to 2 tiers) const currentTierIndex = tiers.findIndex(t => gameState.attractiveness >= t.min && gameState.attractiveness <= t.max ); let maxTierIncrease = 2; if (currentTierIndex + maxTierIncrease >= tiers.length) { maxTierIncrease = tiers.length - currentTierIndex - 1; } // Determine actual improvement (1-2 tiers) const tierIncrease = Math.floor(Math.random() * maxTierIncrease) + 1; const targetTier = tiers[currentTierIndex + tierIncrease]; // Calculate attractiveness needed to reach target tier const minAttractiveness = targetTier.min; const maxAttractiveness = Math.min(targetTier.max, gameState.baseAttractiveness + 1.5); // Set new attractiveness gameState.attractiveness = minAttractiveness + (Math.random() * (maxAttractiveness - minAttractiveness)); message = `Facial harmonization filler significantly improved your facial harmony. You ascended ${tierIncrease} tier(s)!`; } gameState.fillerActive = true; // Filler is temporary but with some permanent improvement setTimeout(() => { gameState.attractiveness -= 0.5; gameState.fillerActive = false; addLogEntry("Your harmonization filler has partially worn off, but you retained some improvement.", "warning"); updateUI(); }, 90000); // 1.5 minutes = 2-3 years in game time break; case 'palatalExpander': cost = 4000; if (gameState.age < 16) { success = true; gameState.palatalExpander = true; message = "Palatal expander installed. It will gradually widen your jaw."; attractivenessChange = 0.2; } else { message = "Palatal expander is only effective before age 16. It had no effect."; messageType = "warning"; } break; case 'canthopexy': cost = 6000; if (gameState.negativeFacial.includes("Negative Canthal Tilt")) { success = true; const index = gameState.negativeFacial.indexOf("Negative Canthal Tilt"); gameState.negativeFacial.splice(index, 1); gameState.facialTraits.push("Positive Canthal Tilt"); message = "Canthopexy successfully improved your eye shape."; attractivenessChange = 0.4; } else if (Math.random() < 0.7) { success = true; message = "Canthopexy provided a subtle improvement to your eye area."; attractivenessChange = 0.2; } else { message = "Canthopexy resulted in an unnatural look."; messageType = "danger"; attractivenessChange = -0.3; } healthChange = -8; break; case 'eyelidFiller': cost = 3500; success = true; if (gameState.negativeFacial.includes("Bug Eyes")) { const index = gameState.negativeFacial.indexOf("Bug Eyes"); gameState.negativeFacial.splice(index, 1); message = "Eyelid filler improved your eye shape, making them less prominent."; } else { message = "Eyelid filler added a more hunter-eyed appearance."; } attractivenessChange = 0.3; break; case 'blepharoplasty': cost = 8000; if (Math.random() < 0.6) { success = true; if (gameState.negativeFacial.includes("Hooded Eyes")) { const index = gameState.negativeFacial.indexOf("Hooded Eyes"); gameState.negativeFacial.splice(index, 1); message = "Blepharoplasty successfully reduced your hooded eyelids."; } else { message = "Blepharoplasty improved your eyelid appearance."; } attractivenessChange = 0.4; } else { message = "Blepharoplasty resulted in an unnatural or overdone look."; messageType = "danger"; attractivenessChange = -0.5; } healthChange = -10; break; case 'keratopigmentation': cost = 7000; if (Math.random() < 0.8) { success = true; const newColor = eyeColors[gameState.race][Math.floor(Math.random() * eyeColors[gameState.race].length)]; gameState.eyeColor = newColor; message = `Keratopigmentation successfully changed your eye color to ${newColor}.`; attractivenessChange = 0.3; } else { message = "Keratopigmentation resulted in an unnatural eye color."; messageType = "danger"; attractivenessChange = -0.4; healthChange = -5; } break; case 'igf1': cost = 500; if (gameState.growthPlatesOpen) { // Check for palatal expander interaction if (gameState.palatalExpander && Math.random() < 0.6) { message = "IGF-1 caused your sutures to fuse prematurely! Botched result."; messageType = "danger"; gameState.negativeFacial.push("Futed Sutures"); attractivenessChange = -0.8; healthChange = -10; } else { success = true; // Calculate height increase based on genetic potential const heightIncrease = 1 + (gameState.geneticPotential * 2); // 1-3 inches gameState.height += heightIncrease; message = `IGF-1 peptides increased your height by ${heightIncrease.toFixed(1)} inches.`; attractivenessChange = 0.2; // Chance of diabetes if (Math.random() < 0.3) { gameState.diabetesRisk += 20; addLogEntry("IGF-1 use has increased your risk of developing diabetes.", "warning"); } } } else { if (Math.random() < 0.4) { message = "IGF-1 use after growth plate closure caused acromegaly."; messageType = "danger"; gameState.negativeFacial.push("Acromegaly Features"); attractivenessChange = -0.8; healthChange = -10; } else { message = "IGF-1 had no effect after growth plate closure."; messageType = "warning"; } } gameState.peptidesUsed.push("IGF-1"); break; case 'mk677': cost = 300; if (gameState.growthPlatesOpen) { success = true; // Calculate height increase based on genetic potential const heightIncrease = 0.5 + (gameState.geneticPotential * 1); // 0.5-1.5 inches gameState.height += heightIncrease; gameState.boneMass += 5; message = `MK-677 increased your height by ${heightIncrease.toFixed(1)} inches and improved bone mass.`; attractivenessChange = 0.1; } else { message = "MK-677 had minimal effect after growth plate closure."; messageType = "warning"; } gameState.peptidesUsed.push("MK-677"); break; case 'hgh': cost = 1000; if (gameState.growthPlatesOpen) { success = true; // Calculate height increase based on genetic potential const heightIncrease = 1.5 + (gameState.geneticPotential * 2); // 1.5-3.5 inches gameState.height += heightIncrease; gameState.boneMass += 8; message = `HGH significantly increased your height by ${heightIncrease.toFixed(1)} inches and improved bone mass.`; attractivenessChange = 0.3; } else { if (Math.random() < 0.6) { message = "HGH use after growth plate closure caused severe acromegaly."; messageType = "danger"; gameState.negativeFacial.push("Severe Acromegaly"); attractivenessChange = -1.2; healthChange = -15; } else { message = "HGH had no significant effect after growth plate closure."; messageType = "warning"; } } gameState.peptidesUsed.push("HGH"); break; case 'ghkCu': cost = 200; success = true; if (gameState.negativeSkin.length > 0) { const skinIssue = gameState.negativeSkin[Math.floor(Math.random() * gameState.negativeSkin.length)]; const index = gameState.negativeSkin.indexOf(skinIssue); gameState.negativeSkin.splice(index, 1); message = `GHK-Cu improved your skin and cleared your ${skinIssue}.`; } else { message = "GHK-Cu improved your skin quality."; } attractivenessChange = 0.2; gameState.peptidesUsed.push("GHK-Cu"); break; case 'minoxidil': cost = 50; success = true; if (gameState.negativeHealth.includes("Balding Genes")) { const index = gameState.negativeHealth.indexOf("Balding Genes"); gameState.negativeHealth.splice(index, 1); message = "Minoxidil prevented hair loss and promoted beard growth."; } else { message = "Minoxidil promoted beard growth."; } attractivenessChange = 0.2; gameState.peptidesUsed.push("Minoxidil"); break; case 'meclizine': cost = 400; // 5% chance of working if (Math.random() < 0.05 && gameState.growthPlatesOpen) { success = true; // Calculate height increase based on genetic potential const heightIncrease = 1 + (gameState.geneticPotential * 1); // 1-2 inches gameState.height += heightIncrease; message = `Meclizine/Aromatase Inhibitors delayed growth plate closure and increased your height by ${heightIncrease.toFixed(1)} inches!`; attractivenessChange = 0.2; // Set future dementia risk gameState.futureDementia = true; addLogEntry("Warning: This medication may cause dementia later in life.", "warning"); } else { message = "Meclizine/Aromatase Inhibitors had no effect on your height."; messageType = "warning"; // Still risk dementia even if it doesn't work if (Math.random() < 0.3) { gameState.futureDementia = true; addLogEntry("Warning: This medication may cause dementia later in life.", "warning"); } } gameState.peptidesUsed.push("Meclizine/AI"); break; case 'cjcIpa': cost = 600; if (gameState.growthPlatesOpen) { success = true; // Calculate height increase based on genetic potential const heightIncrease = 0.7 + (gameState.geneticPotential * 0.8); // 0.7-1.5 inches gameState.height += heightIncrease; message = `CJC no DAC + IPA increased your height by ${heightIncrease.toFixed(1)} inches.`; attractivenessChange = 0.15; } else { message = "CJC no DAC + IPA had minimal effect after growth plate closure."; messageType = "warning"; } gameState.peptidesUsed.push("CJC+IPA"); break; case 'trenbolone': cost = 300; // Extreme risk for teens if (gameState.age < 18) { message = "Trenbolone use as a teen caused permanent health damage!"; messageType = "danger"; healthChange = -30; gameState.steroidDamage += 20; } else { if (Math.random() < 0.7) { message = "Trenbolone use caused serious health complications."; messageType = "danger"; healthChange = -20; gameState.steroidDamage += 15; } else { success = true; message = "Trenbolone increased your muscle mass but with side effects."; attractivenessChange = 0.4; healthChange = -10; gameState.steroidDamage += 5; } } gameState.drugsUsed.push("Trenbolone"); break; case 'anavar': cost = 200; // High risk for teens if (gameState.age < 18) { message = "Anavar use as a teen caused health problems!"; messageType = "danger"; healthChange = -20; gameState.steroidDamage += 10; } else { if (Math.random() < 0.5) { message = "Anavar use caused health complications."; messageType = "danger"; healthChange = -15; gameState.steroidDamage += 8; } else { success = true; message = "Anavar increased your muscle mass with some side effects."; attractivenessChange = 0.3; healthChange = -5; gameState.steroidDamage += 3; } } gameState.drugsUsed.push("Anavar"); break; } gameState.money -= cost; gameState.attractiveness += attractivenessChange; gameState.health += healthChange; gameState.height += heightChange; gameState.boneMass = Math.min(100, gameState.boneMass + boneMassChange); // Make it extremely hard to descend below LTN if (gameState.attractiveness < 3.0) { // Build up resistance - the longer you're below LTN, the harder it is to go lower gameState.belowLtnResistance += 0.1; // Chance to resist further decrease based on resistance const resistanceChance = Math.min(0.9, gameState.belowLtnResistance * 0.3); if (Math.random() < resistanceChance) { gameState.attractiveness = 3.0; addLogEntry("You've hit the floor of Low Tier Normie. It's extremely difficult to descend further.", "warning"); } } else { // Reset resistance when above LTN gameState.belowLtnResistance = 0; } // Make Adamlite virtually impossible to reach (only through extreme procedures) if (gameState.attractiveness > 8.0 && !gameState.trueAdam) { const adamLiteChance = 0.0005; // 0.05% chance to keep Adamlite status if (Math.random() > adamLiteChance) { gameState.attractiveness = 7.9; addLogEntry("You've reached the genetic hardcap at Chad tier. Adamlite is virtually impossible to achieve.", "warning"); } } if (procedure !== 'igf1' && procedure !== 'mk677' && procedure !== 'hgh' && procedure !== 'ghkCu' && procedure !== 'minoxidil' && procedure !== 'meclizine' && procedure !== 'cjcIpa' && procedure !== 'trenbolone' && procedure !== 'anavar') { gameState.proceduresDone.push(procedure); } addLogEntry(message, messageType); updateUI(); } // Eat a meal function function eatMeal(type, cost) { if (gameState.money < cost) { addLogEntry(`You don't have enough money for this meal.`, "warning"); return; } gameState.money -= cost; gameState.lastMeal = 100; // Reset hunger let message = ""; let healthChange = 0; let weightChange = 0; switch(type) { case 'basic': message = "You ate a basic meal."; healthChange = 2; weightChange = 0.5; break; case 'healthy': message = "You ate a healthy, nutritious meal."; healthChange = 5; weightChange = 0.2; break; case 'gain': message = "You ate a high-calorie meal to gain weight."; healthChange = 1; weightChange = 2; break; case 'lose': message = "You ate a low-calorie meal to lose weight."; healthChange = 3; weightChange = -1; break; } gameState.health = Math.min(100, gameState.health + healthChange); gameState.weight = Math.max(10, gameState.weight + weightChange); // Update BMI gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703; // Update bloating based on BMI if (gameState.bmi > 25 && !gameState.bloating) { gameState.bloating = true; if (!gameState.negativePhysical.includes("Bloated Face")) { gameState.negativePhysical.push("Bloated Face"); } addLogEntry("You've developed a bloated face from weight gain.", "warning"); } else if (gameState.bmi <= 25 && gameState.bloating) { gameState.bloating = false; const index = gameState.negativePhysical.indexOf("Bloated Face"); if (index !== -1) { gameState.negativePhysical.splice(index, 1); } addLogEntry("Your face is less bloated after weight loss.", "success"); } // Update obesity trait if (gameState.bmi > 30 && !gameState.obesity) { gameState.obesity = true; if (!gameState.negativePhysical.includes("Obesity")) { gameState.negativePhysical.push("Obesity"); } addLogEntry("You've become obese, which affects your appearance and health.", "danger"); gameState.attractiveness -= 0.5; gameState.health -= 10; } else if (gameState.bmi <= 30 && gameState.obesity) { gameState.obesity = false; const index = gameState.negativePhysical.indexOf("Obesity"); if (index !== -1) { gameState.negativePhysical.splice(index, 1); } addLogEntry("You're no longer obese. Your health has improved.", "success"); gameState.attractiveness += 0.3; gameState.health += 5; } addLogEntry(message, "success"); updateUI(); } // Ask family for money (with chance of refusal) function askForMoney() { if (gameState.familySupport <= 0) { addLogEntry("Your family has no more money to give you.", "warning"); return; } if (gameState.age < 12) { addLogEntry("You're too young to ask for money directly.", "warning"); return; } // Chance of refusal based on family class const refusalChance = familyClassModifiers[gameState.familyClass].moneyRefusalChance; if (Math.random() < refusalChance) { addLogEntry("Your parents refused to give you money.", "warning"); return; } const amount = Math.min(500, gameState.familySupport); gameState.money += amount; gameState.familySupport -= amount; addLogEntry(`Your family gave you $${amount}.`, "success"); updateUI(); } // Ask family for braces function askForBraces() { if (gameState.familySupport < 3000) { addLogEntry("Your family cannot afford braces.", "warning"); return; } if (gameState.proceduresDone.includes("braces")) { addLogEntry("You already have braces.", "warning"); return; } // Chance based on family class const chance = familyClassModifiers[gameState.familyClass].bracesChance; if (Math.random() < chance) { gameState.familySupport -= 3000; performProcedure('braces'); addLogEntry("Your family agreed to pay for braces.", "success"); } else { addLogEntry("Your family refused to pay for braces.", "warning"); } } // Ask family for palatal expander function askForExpander() { if (gameState.age >= 16) { addLogEntry("You're too old for a palatal expander to be effective.", "warning"); return; } if (gameState.familySupport < 4000) { addLogEntry("Your family cannot afford a palatal expander.", "warning"); return; } if (gameState.proceduresDone.includes("palatalExpander")) { addLogEntry("You already have a palatal expander.", "warning"); return; } // Chance based on family class const chance = familyClassModifiers[gameState.familyClass].expanderChance; if (Math.random() < chance) { gameState.familySupport -= 4000; performProcedure('palatalExpander'); addLogEntry("Your family agreed to pay for a palatal expander.", "success"); } else { addLogEntry("Your family refused to pay for a palatal expander.", "warning"); } } // Go on a date function function goOnDate() { if (gameState.money < 50) { addLogEntry("You don't have enough money to go on a date.", "warning"); return; } gameState.money -= 50; // Calculate dating success based on height, attractiveness, and social status const heightScore = calculateHeightScore(); const attractivenessScore = gameState.attractiveness / 10; const statusScore = gameState.socialStatus / 100; let successChance = 0; if (gameState.gender === "male") { successChance = (heightScore * 0.6) + (attractivenessScore * 0.3) + (statusScore * 0.1); } else { successChance = (heightScore * 0.3) + (attractivenessScore * 0.6) + (statusScore * 0.1); } // Adjust for BMI if (gameState.bmi < 18.5 || gameState.bmi > 25) { successChance *= 0.7; // 30% penalty for underweight or overweight } // Adjust for humor if below MTN const tier = getCurrentTier(); if (tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) { successChance *= (1 + (gameState.humor / 200)); // Humor can help but not overcome looks completely } // Check if successful if (Math.random() < successChance) { // Create a partner gameState.partner = generatePartner(); gameState.relationshipStatus = "dating"; addLogEntry(`You went on a successful date with ${gameState.partner.name}! You're now dating.`, "success"); } else { addLogEntry("Your date didn't go well. Maybe try improving your appearance.", "warning"); } updateUI(); } // Propose marriage function function proposeMarriage() { if (gameState.money < 500) { addLogEntry("You don't have enough money for a marriage proposal.", "warning"); return; } gameState.money -= 500; // Marriage chance based on relationship length and compatibility const heightCompatibility = 1 - Math.abs((gameState.height - gameState.partner.height) / gameState.partner.height); const attractivenessCompatibility = 1 - Math.abs((gameState.attractiveness - gameState.partner.attractiveness) / gameState.partner.attractiveness); const compatibilityScore = (heightCompatibility + attractivenessCompatibility) / 2; const successChance = compatibilityScore * 0.8; // 80% of compatibility score if (Math.random() < successChance) { gameState.relationshipStatus = "married"; addLogEntry(`You proposed to ${gameState.partner.name} and they said yes! You're now married.`, "success"); // Reset cheating risk when getting married gameState.cheatingRisk = 10; } else { addLogEntry(`You proposed to ${gameState.partner.name} but they said no. The relationship ended.`, "danger"); gameState.relationshipStatus = "single"; gameState.partner = null; } updateUI(); } // Have a child function function haveChild() { if (gameState.money < 1000) { addLogEntry("You don't have enough money to raise a child.", "warning"); return; } if (gameState.relationshipStatus !== "married") { addLogEntry("You need to be married to have a child.", "warning"); return; } gameState.money -= 1000; // Create a child with genetics from both parents const child = generateChild(); gameState.children.push(child); addLogEntry(`You and ${gameState.partner.name} had a child! ${child.name} has been born.`, "success"); updateUI(); } // Generate a partner based on player's attributes function generatePartner() { const gender = gameState.gender === "male" ? "female" : "male"; const names = gender === "male" ? ["James", "John", "Robert", "Michael", "William"] : ["Mary", "Jennifer", "Linda", "Elizabeth", "Susan"]; // Partner height based on player height and preferences let height = 0; if (gender === "female") { // Women prefer men taller than them height = gameState.height - (Math.random() * 4 + 2); // 2-6 inches shorter height = Math.max(partnerPreferences.female.minHeight, Math.min(partnerPreferences.female.maxHeight, height)); } else { // Men prefer women shorter than them height = gameState.height + (Math.random() * 4 + 2); // 2-6 inches taller height = Math.max(partnerPreferences.male.minHeight, Math.min(partnerPreferences.male.maxHeight, height)); } // Partner attractiveness based on player attractiveness const attractiveness = gameState.attractiveness + (Math.random() * 2 - 1); // ±1 point const minAttractiveness = gender === "female" ? partnerPreferences.female.minAttractiveness : partnerPreferences.male.minAttractiveness; const cappedAttractiveness = Math.max(minAttractiveness, Math.min(10, attractiveness)); return { name: names[Math.floor(Math.random() * names.length)], gender: gender, height: height, attractiveness: cappedAttractiveness, age: gameState.age + Math.floor(Math.random() * 5) - 2 // ±2 years }; } // Generate a child with genetics from both parents function generateChild() { const gender = Math.random() > 0.5 ? "male" : "female"; const names = gender === "male" ? ["James", "John", "Robert", "Michael", "William"] : ["Mary", "Jennifer", "Linda", "Elizabeth", "Susan"]; // Calculate potential height using mid-parental formula let potentialHeight = 0; if (gender === "male") { potentialHeight = (gameState.height + gameState.partner.height + 5) / 2; } else { potentialHeight = (gameState.height + gameState.partner.height - 5) / 2; } // Add some genetic variation (±10%) potentialHeight = potentialHeight * (0.9 + Math.random() * 0.2); // Calculate potential attractiveness (average of parents ±1) const potentialAttractiveness = (gameState.attractiveness + gameState.partner.attractiveness) / 2 + (Math.random() * 2 - 1); return { name: names[Math.floor(Math.random() * names.length)], gender: gender, height: potentialHeight, attractiveness: Math.max(1, Math.min(10, potentialAttractiveness)), iqPotential: Math.floor((gameState.iqPotential + (Math.random() * 30 + 85)) / 2) // Average of player's IQ and random }; } // Calculate height score for dating function calculateHeightScore() { if (gameState.gender === "male") { if (gameState.height < 66) return 0.2; // Below 5'6" if (gameState.height < 68) return 0.4; // 5'6" to 5'8" if (gameState.height < 70) return 0.6; // 5'8" to 5'10" if (gameState.height < 72) return 0.8; // 5'10" to 6'0" if (gameState.height < 74) return 0.9; // 6'0" to 6'2" return 1.0; // 6'2"+ } else { if (gameState.height < 62) return 0.8; // Below 5'2" if (gameState.height < 64) return 0.9; // 5'2" to 5'4" if (gameState.height < 66) return 1.0; // 5'4" to 5'6" if (gameState.height < 68) return 0.7; // 5'6" to 5'8" return 0.5; // 5'8"+ } } // Post on social media function postOnSocialMedia(platform) { // Can't post on TikTok as a newborn if (platform === 'tiktok' && gameState.age < 13) { addLogEntry("You're too young to post on TikTok.", "warning"); return; } const tier = getCurrentTier(); let message = ""; let messageType = "info"; // If below MTN but has high humor, chance to go viral instead of becoming lolcow if ((tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) && gameState.humor > 70) { if (Math.random() < (gameState.humor / 100)) { // Go viral due to humor gameState.socialMediaStatus = "viral"; const newFollowers = Math.floor(Math.random() * 10000) + 5000; gameState.followers += newFollowers; gameState.money += newFollowers * 0.2; gameState.socialStatus += 40; message = `Your humorous content went viral on ${platform}! Gained ${newFollowers} followers and sponsorship opportunities.`; messageType = "success"; } else { // Still become lolcow but with less severity gameState.socialMediaStatus = "lolcow"; gameState.socialStatus -= 10; gameState.health -= 3; message = `You posted on ${platform} and became a lolcow, but your humor made it less severe.`; messageType = "warning"; } } else if (tier.name.includes("Subhuman") || tier.name.includes("Low Tier Normie")) { // Negative outcome - become a lolcow gameState.socialMediaStatus = "lolcow"; gameState.socialStatus -= 20; gameState.health -= 5; message = `You posted on ${platform} and became a lolcow. People are making fun of your appearance.`; messageType = "danger"; // Add negative trait if not already present if (!gameState.negativeHealth.includes("Depression")) { gameState.negativeHealth.push("Depression"); } } else if (tier.name.includes("Mid Tier Normie")) { // Neutral outcome message = `You posted on ${platform}. You got a few likes but nothing special.`; gameState.followers += Math.floor(Math.random() * 10) + 1; } else { // Positive outcome - chance to become influencer const successChance = (gameState.attractiveness - 6) * 0.2; // Higher attractiveness = better chance if (Math.random() < successChance) { if (gameState.socialMediaStatus !== "viral" && gameState.attractiveness > 7.5) { gameState.socialMediaStatus = "viral"; const newFollowers = Math.floor(Math.random() * 5000) + 1000; gameState.followers += newFollowers; gameState.money += newFollowers * 0.1; gameState.socialStatus += 30; message = `You went viral on ${platform}! Gained ${newFollowers} followers and sponsorship opportunities.`; messageType = "success"; } else { gameState.socialMediaStatus = "influencer"; const newFollowers = Math.floor(Math.random() * 500) + 100; gameState.followers += newFollowers; gameState.money += newFollowers * 0.05; gameState.socialStatus += 15; message = `You're gaining traction on ${platform}! Gained ${newFollowers} followers.`; messageType = "success"; } } else { const newFollowers = Math.floor(Math.random() * 100) + 10; gameState.followers += newFollowers; message = `You posted on ${platform}. Gained ${newFollowers} followers.`; } } addLogEntry(message, messageType); updateUI(); } // Study function with IQ-based efficiency function study(level) { let cost = 0; let iqGain = 0; let message = ""; switch(level) { case 'elementary': cost = 10; break; case 'middle': cost = 15; break; case 'highschool': cost = 20; break; case 'college': cost = 30; break; } if (gameState.money < cost) { addLogEntry(`You don't have enough money to pay for ${level} school materials.`, "warning"); return; } gameState.money -= cost; // Calculate study effectiveness based on IQ let efficiency = 0.2; // Default for very low IQ if (gameState.iq >= 115) efficiency = 1.0; else if (gameState.iq >= 100) efficiency = 0.8; else if (gameState.iq >= 85) efficiency = 0.5; // Calculate IQ gain based on efficiency and school level iqGain = Math.floor((Math.random() * 3 + 1) * efficiency); if (gameState.iq + iqGain > gameState.iqPotential) { iqGain = gameState.iqPotential - gameState.iq; } if (iqGain > 0) { gameState.iq += iqGain; message = `You studied at ${level} level. Your IQ increased by ${iqGain} points.`; if (efficiency < 0.3) { message += " It was difficult for you."; } else if (efficiency > 0.8) { message += " You learned quickly."; } } else { message = `You studied at ${level} level but reached your genetic potential.`; } addLogEntry(message, "success"); updateUI(); } // Apply for job function applyForJob(jobId) { const job = jobs.find(j => j.id === jobId); if (!job) return; if (gameState.iq < job.iqReq) { addLogEntry(`You don't meet the IQ requirements for ${job.name}.`, "warning"); return; } // Check for degree requirements for high-level jobs if (job.degreeReq && gameState.schoolLevel !== "college") { addLogEntry(`You need a college degree to become a ${job.name}.`, "warning"); return; } gameState.currentJob = jobId; addLogEntry(`You got a job as a ${job.name}. You'll earn $${job.pay}/hour.`, "success"); updateUI(); // Set up job income if (gameState.jobInterval) { clearInterval(gameState.jobInterval); } gameState.jobInterval = setInterval(() => { if (gameState.currentJob === jobId) { gameState.money += job.pay; addLogEntry(`You worked as a ${job.name} and earned $${job.pay}.`, "success"); updateUI(); } else { clearInterval(gameState.jobInterval); } }, 30000); // Every 30 seconds } // Age up function function ageUp() { if (!gameState.alive) return; gameState.age++; // Update school level based on age if (gameState.age < 12) { gameState.schoolLevel = "elementary"; } else if (gameState.age < 15) { gameState.schoolLevel = "middle"; } else if (gameState.age < 18) { gameState.schoolLevel = "highschool"; } else { gameState.schoolLevel = "college"; } // Update weight based on age if (gameState.age in weightPercentiles[gameState.gender]) { const baseWeight = weightPercentiles[gameState.gender][gameState.age]; const geneticModifier = (gameState.geneticPotential - 0.5) * 20; const randomVariation = (Math.random() * 10) - 5; // -5 to +5 pounds gameState.weight = baseWeight + geneticModifier + randomVariation; // Adjust for starving if (gameState.starving) { gameState.weight -= 5; gameState.starvationEffects += 1; if (gameState.starvationEffects > 5) { addLogEntry("Severe starvation is affecting your health.", "danger"); gameState.health -= 10; if (gameState.health < 20) { addLogEntry("Your organs are failing from starvation!", "danger"); gameState.health -= 10; } } } } // Update BMI gameState.bmi = (gameState.weight / (gameState.height * gameState.height)) * 703; // Update bloating based on BMI if (gameState.bmi > 25 && !gameState.bloating) { gameState.bloating = true; if (!gameState.negativePhysical.includes("Bloated Face")) { gameState.negativePhysical.push("Bloated Face"); } addLogEntry("You've developed a bloated face from weight gain.", "warning"); } else if (gameState.bmi <= 25 && gameState.bloating) { gameState.bloating = false; const index = gameState.negativePhysical.indexOf("Bloated Face"); if (index !== -1) { gameState.negativePhysical.splice(index, 1); } addLogEntry("Your face is less bloated after weight loss.", "success"); } // Update obesity trait if (gameState.bmi > 30 && !gameState.obesity) { gameState.obesity = true; if (!gameState.negativePhysical.includes("Obesity")) { gameState.negativePhysical.push("Obesity"); } addLogEntry("You've become obese, which affects your appearance and health.", "danger"); gameState.attractiveness -= 0.5; gameState.health -= 10; } else if (gameState.bmi <= 30 && gameState.obesity) { gameState.obesity = false; const index = gameState.negativePhysical.indexOf("Obesity"); if (index !== -1) { gameState.negativePhysical.splice(index, 1); } addLogEntry("You're no longer obese. Your health has improved.", "success"); gameState.attractiveness += 0.3; gameState.health += 5; } // Hair grows over time if (gameState.age < 50) { // Hair stops growing as much after 50 gameState.hairLength += Math.random() * 2; // Natural length limit based on hair type const maxLengths = { "Straight": 100, "Wavy": 90, "Curly": 80, "Coarse": 70, "Afro": 60, "Coily": 50, "Kinky": 40, "Varies": 80 }; const maxLength = maxLengths[gameState.hairType] || 80; gameState.hairLength = Math.min(maxLength, gameState.hairLength); } // Check for cheating if (gameState.age >= 18 && gameState.relationshipStatus === "married") { checkForCheating(); } // Update humor based on social status and IQ if (gameState.socialStatus > 70 && gameState.iq > 110) { gameState.humor += 5; } else if (gameState.socialStatus > 50 && gameState.iq > 90) { gameState.humor += 2; } gameState.humor = Math.min(100, gameState.humor); // Apply hardcap at 18 if not True Adam or Adamlite if (gameState.age === 18 && !gameState.trueAdam && gameState.baseAttractiveness < 8) { const tier = getCurrentTier(); if (tier.min > 5.9) { gameState.attractiveness = 5.9; gameState.hardcapReached = true; addLogEntry("You've reached the genetic hardcap at High High Tier Normie.", "warning"); } // Close growth plates gameState.growthPlatesOpen = false; addLogEntry("Your growth plates have closed. No more natural height increase.", "warning"); } // Update height based on biological growth patterns if (gameState.age in heightPercentiles[gameState.gender] && gameState.growthPlatesOpen) { const baseHeight = heightPercentiles[gameState.gender][gameState.age]; const geneticModifier = (gameState.geneticPotential - 0.5) * 8; const raceModifier = (raceModifiers[gameState.race].heightPotential - 0.5) * 4; const randomVariation = (Math.random() * 4) - 2; // -2 to +2 inches gameState.height = baseHeight + geneticModifier + raceModifier + randomVariation; } // Increase IQ with age (up to potential) if (gameState.age < 25 && gameState.iq < gameState.iqPotential) { gameState.iq += Math.floor(Math.random() * 3); if (gameState.iq > gameState.iqPotential) { gameState.iq = gameState.iqPotential; } } // Random events based on age handleAgeEvents(); // Small chance of random events if (Math.random() > 0.7) { handleRandomEvents(); } // Degeneration events that can decrease attractiveness handleDegenerationEvents(); // Update social status based on attractiveness updateSocialStatus(); // Update SMV based on various factors updateSMV(); updateUI(); } // Handle age-specific events function handleAgeEvents() { if (gameState.age === 5) { addLogEntry("You started school. Other kids are noticing your appearance."); // Bullying based on attractiveness if (gameState.attractiveness < 4) { addLogEntry("You're being bullied for your looks.", "danger"); gameState.health -= 10; gameState.socialStatus -= 20; gameState.attractiveness -= 0.2; } else if (gameState.attractiveness > 5) { addLogEntry("Other kids like you because of your looks.", "success"); gameState.socialStatus += 15; } } if (gameState.age === 11) { addLogEntry("You're now 11 years old. DIY filler options are available."); } if (gameState.age === 12) { addLogEntry("You're now 12 years old. You can now use peptides and ask your parents for money directly."); } if (gameState.age === 13) { addLogEntry("You're a teenager now. Appearance matters more than ever."); // Acne development if (gameState.negativeHealth.includes("Acne-Prone Skin") && Math.random() > 0.3) { if (!gameState.negativeSkin.includes("Cystic Acne")) { gameState.negativeSkin.push("Cystic Acne"); } addLogEntry("You've developed severe cystic acne.", "warning"); gameState.attractiveness -= 0.5; } else if (Math.random() > 0.5) { if (!gameState.negativeSkin.includes("Acne")) { gameState.negativeSkin.push("Acne"); } addLogEntry("You've developed some acne.", "warning"); gameState.attractiveness -= 0.2; } // Can now join .org if LTN const tier = getCurrentTier(); if (tier.name.includes("Low Tier Normie")) { addLogEntry("You've discovered the .org forum and can now join.", "success"); } // Can now post on TikTok addLogEntry("You're now old enough to post on TikTok."); } if (gameState.age === 16) { addLogEntry("You can now get a part-time job."); // Palatal expander becomes ineffective if (gameState.palatalExpander) { addLogEntry("Your palatal expander is no longer effective at your age.", "warning"); } } if (gameState.age === 18) { addLogEntry("You're now an adult. Cosmetic surgery options are available."); } if (gameState.age === 30) { addLogEntry("You're 30 now. Aging effects are starting to show."); gameState.attractiveness -= 0.2; // Chance of hair loss if (gameState.negativeHealth.includes("Balding Genes") && Math.random() > 0.5) { addLogEntry("You're starting to lose your hair.", "warning"); gameState.attractiveness -= 0.3; } // Chance of diabetes from IGF-1 use if (gameState.diabetesRisk > 0 && Math.random() < gameState.diabetesRisk / 100) { addLogEntry("You've developed diabetes from past peptide use.", "danger"); gameState.health -= 15; gameState.negativeHealth.push("Diabetes"); } } if (gameState.age > 40) { // Aging effects accelerate const ageEffect = (gameState.age - 40) * 0.05; gameState.attractiveness -= ageEffect; if (Math.random() > 0.8) { addLogEntry("Aging is taking a toll on your appearance.", "warning"); } // Risk of dementia from aromatase inhibitors if (gameState.futureDementia && Math.random() < 0.1) { addLogEntry("You're experiencing cognitive decline from past drug use.", "danger"); gameState.iq -= 10; gameState.health -= 5; } // Risk from steroid damage if (gameState.steroidDamage > 0 && Math.random() < 0.2) { const damageEffect = gameState.steroidDamage * 0.1; addLogEntry("Past steroid use is causing health problems.", "danger"); gameState.health -= damageEffect; } } if (gameState.age > 70) { // Health decline in old age const healthDecline = Math.random() * 10; gameState.health -= healthDecline; if (gameState.health < 30) { addLogEntry("Your health is deteriorating.", "danger"); } // Chance of death increases with age and poor health if (gameState.health < 10 && Math.random() > 0.7) { gameState.alive = false; addLogEntry("You have died due to poor health. Game over.", "danger"); // If you have children, offer to continue as one of them if (gameState.children.length > 0) { setTimeout(showGenerationSelection, 3000); } else { setTimeout(restartGame, 3000); } } } } // Show generation selection after death function showGenerationSelection() { generationModal.style.display = 'flex'; childrenSelection.innerHTML = ''; gameState.children.forEach((child, index) => { const childEl = document.createElement('div'); childEl.className = 'child-item'; childEl.innerHTML = ` <div>${child.name} (${child.gender}), ${formatHeight(child.height)} tall</div> <div>Attractiveness: ${child.attractiveness.toFixed(1)} | IQ Potential: ${child.iqPotential}</div> <button class="generation-btn" data-index="${index}">Play as ${child.name}</button> `; childrenSelection.appendChild(childEl); }); // Add event listeners to generation buttons document.querySelectorAll('.generation-btn').forEach(btn => { btn.addEventListener('click', function() { const index = parseInt(this.getAttribute('data-index')); continueAsChild(index); }); }); } // Continue the game as a child function continueAsChild(index) { const child = gameState.children[index]; // Create new game state based on child gameState.age = 20; // Start as young adult gameState.height = child.height; gameState.attractiveness = child.attractiveness; gameState.iqPotential = child.iqPotential; gameState.iq = Math.floor(child.iqPotential * 0.8); gameState.gender = child.gender; gameState.health = 80; gameState.money = 1000; // Small inheritance gameState.socialStatus = 50; gameState.relationshipStatus = "single"; gameState.partner = null; gameState.children = []; gameState.alive = true; // Reset some properties gameState.growthPlatesOpen = false; gameState.hardcapReached = true; gameState.trueAdam = false; generationModal.style.display = 'none'; addLogEntry(`You continue your life as ${child.name}, the next generation.`, "success"); updateUI(); } // Handle cheating mechanics function checkForCheating() { if (gameState.relationshipStatus !== "married") return; // Base chance of cheating based on relationship quality let cheatChance = 0.1; // Increased chance if partner is significantly more attractive if (gameState.partner.attractiveness > gameState.attractiveness + 1) { cheatChance += 0.2; } // Increased chance if player is neglecting relationship cheatChance += (100 - gameState.socialStatus) * 0.001; // Check if partner cheats if (Math.random() < cheatChance) { gameState.partnerCheating = true; gameState.cheatingRisk = 100; addLogEntry("You suspect your partner might be cheating on you.", "danger"); } // Update cheating risk gameState.cheatingRisk = Math.min(100, gameState.cheatingRisk + (cheatChance * 10)); updateUI(); } // Initiate divorce function initiateDivorce() { if (gameState.relationshipStatus !== "married") return; gameState.relationshipStatus = "single"; addLogEntry("You divorced your partner.", "danger"); // Financial consequences const settlement = Math.floor(gameState.money * 0.3); gameState.money -= settlement; if (settlement > 0) { addLogEntry(`You paid $${settlement} in the divorce settlement.`, "warning"); } gameState.partner = null; gameState.partnerCheating = false; gameState.cheatingRisk = 0; updateUI(); } // Confront partner about cheating function confrontCheating() { if (!gameState.partnerCheating) return; // 50% chance of confession if (Math.random() > 0.5) { addLogEntry("Your partner admitted to cheating. The relationship is over.", "danger"); initiateDivorce(); } else { addLogEntry("Your partner denied cheating. You're not sure what to believe.", "warning"); gameState.cheatingRisk = 50; } gameState.partnerCheating = false; updateUI(); } // Select an archetype function selectArchetype(archetype) { if (!canSelectArchetype(archetype)) { addLogEntry("You don't meet the requirements for this archetype.", "warning"); return; } gameState.currentArchetype = archetype; // Apply archetype benefits switch(archetype) { case 'prettyBoy': gameState.attractiveness += 0.3; gameState.socialStatus += 15; break; case 'slenderTriad': gameState.attractiveness += 0.4; gameState.socialStatus += 10; break; case 'ogre': gameState.attractiveness += 0.5; gameState.socialStatus += 5; break; case 'asianBaddie': case 'latinaBaddie': case 'baddie': gameState.attractiveness += 0.4; gameState.socialStatus += 20; break; } addLogEntry(`You've adopted the ${archetype} archetype.`, "success"); updateUI(); } // Get a haircut function getHaircut(type) { let cost = type === 'basic' ? 30 : 100; if (gameState.money < cost) { addLogEntry(`You don't have enough money for this haircut.`, "warning"); return; } gameState.money -= cost; if (type === 'basic') { gameState.hairHealth += 5; addLogEntry("You got a basic haircut. Your hair looks neat.", "success"); } else { gameState.hairHealth += 10; gameState.attractiveness += 0.2; addLogEntry("You got a premium hairstyle. You look more attractive.", "success"); } gameState.hairHealth = Math.min(100, gameState.hairHealth); updateUI(); } // Set a specific hairstyle function setHairstyle(style) { const costs = { dreadlocks: 200, braids: 150, twists: 180, undercut: 60 }; const cost = costs[style]; if (gameState.money < cost) { addLogEntry(`You don't have enough money for this style.`, "warning"); return; } // Check if hairstyle is compatible with hair type if (!isHairstyleCompatible(style)) { addLogEntry(`This hairstyle is not compatible with your hair type and may cause damage.`, "warning"); if (Math.random() > 0.5) { gameState.hairHealth -= 20; addLogEntry(`The ${style} damaged your hair.`, "danger"); } } gameState.money -= cost; gameState.hairStyle = style; // Style-specific effects if (style === 'dreadlocks' || style === 'braids' || style === 'twists') { gameState.attractiveness += 0.3; } else { gameState.attractiveness += 0.2; } addLogEntry(`You got ${style} hairstyle.`, "success"); updateUI(); } // Check if hairstyle is compatible with hair type function isHairstyleCompatible(style) { // Dreadlocks, braids, and twists work best on Afro-textured hair if (style === 'dreadlocks' || style === 'braids' || style === 'twists') { return gameState.hairType === "Afro" || gameState.hairType === "Coily" || gameState.hairType === "Kinky"; } // Other styles work on most hair types return true; } // Handle random events that can decrease attractiveness function handleDegenerationEvents() { // Poor health can decrease attractiveness if (gameState.health < 50 && Math.random() > 0.7) { addLogEntry("Poor health is affecting your appearance.", "warning"); gameState.attractiveness -= 0.1; } // Negative traits can worsen over time if (gameState.negativeFacial.length > 0 && Math.random() > 0.8) { const trait = gameState.negativeFacial[Math.floor(Math.random() * gameState.negativeFacial.length)]; addLogEntry(`Your ${trait} is becoming more pronounced.`, "warning"); gameState.attractiveness -= 0.15; } // Poor lifestyle choices can decrease attractiveness if (gameState.money < 20 && Math.random() > 0.9) { addLogEntry("Poor nutrition is affecting your appearance.", "warning"); gameState.attractiveness -= 0.1; gameState.health -= 5; } // Injuries can decrease attractiveness if (Math.random() > 0.95) { addLogEntry("You suffered a minor injury that slightly affected your appearance.", "warning"); gameState.attractiveness -= 0.2; gameState.health -= 5; } // Starvation effects if (gameState.starving) { gameState.lastMeal -= 10; if (gameState.lastMeal <= 0) { addLogEntry("You're starving! Your health is deteriorating.", "danger"); gameState.health -= 5; gameState.attractiveness -= 0.1; gameState.lastMeal = 0; } } } // Handle random events function handleRandomEvents() { const events = [ { message: "You found $50 on the street.", effect: () => gameState.money += 50 }, { message: "You caught a cold. Health decreased slightly.", effect: () => { gameState.health -= 5; if (gameState.health < 40) { gameState.attractiveness -= 0.1; } } }, { message: "You read a book. IQ increased slightly.", effect: () => { if (gameState.iq < gameState.iqPotential) { gameState.iq += 2; if (gameState.iq > gameState.iqPotential) { gameState.iq = gameState.iqPotential; } } } }, { message: "You've been working out. Attractiveness increased slightly.", effect: () => gameState.attractiveness += 0.1 }, { message: "You developed a bad habit of mouth breathing.", effect: () => { if (!gameState.negativeFacial.includes("Malocclusion")) { gameState.negativeFacial.push("Malocclusion"); addLogEntry("Mouth breathing has caused malocclusion.", "warning"); gameState.attractiveness -= 0.3; } } }, { message: "You spent time in the sun without protection.", effect: () => { gameState.health -= 3; if (Math.random() > 0.7) { addLogEntry("Sun damage has aged your skin prematurely.", "warning"); gameState.attractiveness -= 0.2; } } }, { message: "You've been stressed lately. It's affecting your appearance.", effect: () => { gameState.health -= 3; gameState.attractiveness -= 0.1; } }, { message: "Poor sleep quality is affecting your appearance.", effect: () => { gameState.health -= 2; gameState.attractiveness -= 0.1; } } ]; const event = events[Math.floor(Math.random() * events.length)]; addLogEntry(event.message); event.effect(); } // Update social status based on attractiveness function updateSocialStatus() { if (gameState.attractiveness < 3) { gameState.socialStatus -= 5; } else if (gameState.attractiveness < 4) { gameState.socialStatus -= 2; } else if (gameState.attractiveness > 6) { gameState.socialStatus += 5; } else if (gameState.attractiveness > 5) { gameState.socialStatus += 2; } // Ensure social status stays within bounds gameState.socialStatus = Math.max(0, Math.min(100, gameState.socialStatus)); // Update status text if (gameState.socialStatus >= 80) { gameState.status = "Popular"; } else if (gameState.socialStatus >= 60) { gameState.status = "Liked"; } else if (gameState.socialStatus >= 40) { gameState.status = "Neutral"; } else if (gameState.socialStatus >= 20) { gameState.status = "Disliked"; } else { gameState.status = "Bullied"; } } // Update SMV based on various factors function updateSMV() { // Base SMV is attractiveness gameState.smv = gameState.attractiveness; // Adjust based on height if (gameState.height >= 72) { // 6'0" gameState.smv += 1; } else if (gameState.height < 67) { // 5'7" gameState.smv -= 1; } // Adjust based on race const raceMod = raceModifiers[gameState.race]; gameState.smv += (raceMod.boneStructure + raceMod.skinQuality - 1) * 0.5; // Ensure SMV doesn't go below 1 or above 10 gameState.smv = Math.max(1, Math.min(10, gameState.smv)); } // Join .org forum function joinOrg() { if (gameState.age < 13) { addLogEntry("You must be at least 13 years old to join .org.", "warning"); return; } gameState.onForum = true; gameState.orgStatus = "gray"; addLogEntry("You've joined the .org forum. Your status is now 'Gray'.", "success"); updateUI(); } // Perform forum action function forumAction(action) { let message = ""; let messageType = "info"; let repChange = 0; switch(action) { case 'postThread': if (Math.random() < 0.7) { message = "Your thread was well-received on the forum."; repChange = 10; } else { message = "Your thread was criticized on the forum."; repChange = -5; } break; case 'comment': message = "You commented on a thread."; repChange = 2; break; case 'shareExperience': if (Math.random() < 0.6) { message = "You shared your looksmaxxing experience. Others found it helpful."; repChange = 15; } else { message = "You shared your looksmaxxing experience. Some questioned your methods."; repChange = -3; } break; case 'askAdvice': message = "You asked for advice on the forum."; repChange = 5; break; } gameState.forumReputation += repChange; // Update .org status based on reputation if (gameState.forumReputation >= 200) { gameState.orgStatus = "orgmaster"; } else if (gameState.forumReputation >= 100) { gameState.orgStatus = "contributor"; } else if (gameState.forumReputation >= 50) { gameState.orgStatus = "known"; } addLogEntry(message, repChange >= 0 ? "success" : "warning"); updateUI(); } // Skincare routine function doSkincare() { if (gameState.money < 50) return; gameState.money -= 50; // Remove acne if present const acneIndex = gameState.negativeSkin.indexOf("Acne"); const cysticAcneIndex = gameState.negativeSkin.indexOf("Cystic Acne"); if (cysticAcneIndex !== -1 && Math.random() > 0.7) { gameState.negativeSkin.splice(cysticAcneIndex, 1); addLogEntry("Skincare routine improved your cystic acne.", "success"); gameState.attractiveness += 0.4; } else if (acneIndex !== -1 && Math.random() > 0.5) { gameState.negativeSkin.splice(acneIndex, 1); addLogEntry("Skincare routine cleared your acne.", "success"); gameState.attractiveness += 0.3; } else { addLogEntry("Skincare routine improved your complexion.", "success"); gameState.attractiveness += 0.1; } updateUI(); } // Gym workout function doGymWorkout() { if (gameState.money < 30 || gameState.gymAscension >= 2) return; gameState.money -= 30; // Improve body fat distribution const fatIndex = gameState.negativePhysical.indexOf("Poor Body Fat Distribution"); if (fatIndex !== -1 && Math.random() > 0.5) { gameState.negativePhysical.splice(fatIndex, 1); addLogEntry("Regular workouts improved your body fat distribution.", "success"); gameState.attractiveness += 0.3; } // Chance to widen clavicles if (gameState.negativePhysical.includes("Narrow Clavicles") && Math.random() > 0.8) { const clavicleIndex = gameState.negativePhysical.indexOf("Narrow Clavicles"); gameState.negativePhysical.splice(clavicleIndex, 1); gameState.physicalTraits.push("Wide Clavicles"); addLogEntry("Your clavicles widened from weight training.", "success"); gameState.attractiveness += 0.4; } // Gym can only ascend you 1-2 tiers based on your base const baseTierIndex = tiers.findIndex(t => gameState.baseAttractiveness >= t.min && gameState.baseAttractiveness <= t.max); const maxAscension = Math.min(2, tiers.length - baseTierIndex - 1); if (gameState.gymAscension < maxAscension) { gameState.attractiveness += 0.3; gameState.gymAscension++; addLogEntry("Gym workout improved your physique.", "success"); } else { addLogEntry("You've reached your maximum genetic potential from gym workouts.", "warning"); } gameState.health += 2; updateUI(); } // Study function doStudy() { if (gameState.money < 20 || gameState.iq >= gameState.iqPotential) return; gameState.money -= 20; gameState.iq += Math.floor(Math.random() * 3) + 1; if (gameState.iq > gameState.iqPotential) { gameState.iq = gameState.iqPotential; } addLogEntry("You spent time studying. Your IQ increased.", "success"); updateUI(); } // Work function doWork() { if (gameState.age < 16) { addLogEntry("You're too young for a job.", "warning"); return; } const earnings = Math.floor(Math.random() * 50) + 75; gameState.money += earnings; addLogEntry(`You worked a part-time job and earned $${earnings}.`, "success"); updateUI(); } // Frauding (makeup, height boosts, etc.) function doFrauding() { if (gameState.money < 20) return; gameState.money -= 20; const frauds = [ "You used makeup to enhance your features.", "You wore height-boosting insoles.", "You used clothing to create a more attractive silhouette.", "You got a flattering haircut.", "You practiced good posture to appear taller." ]; const fraud = frauds[Math.floor(Math.random() * frauds.length)]; addLogEntry(fraud, "success"); // Temporary attractiveness boost gameState.attractiveness += 0.3; updateUI(); // Fraud effects are temporary - reset after some time setTimeout(() => { gameState.attractiveness -= 0.3; addLogEntry("The effects of your frauding have worn off.", "warning"); updateUI(); }, 3000); } // DIY Filler function doDiyFiller() { if (gameState.money < 100 || gameState.age < 11) return; gameState.money -= 100; if (Math.random() < 0.7) { addLogEntry("DIY filler attempt failed and caused complications.", "danger"); gameState.health -= 10; gameState.attractiveness -= 0.3; if (Math.random() < 0.3) { addLogEntry("DIY filler caused a serious infection.", "danger"); gameState.health -= 15; } } else { addLogEntry("DIY filler provided a minor improvement.", "success"); gameState.attractiveness += 0.2; // Temporary effect setTimeout(() => { gameState.attractiveness -= 0.15; addLogEntry("Your DIY filler has dissolved.", "warning"); updateUI(); }, 4000); } updateUI(); } // Restart game function restartGame() { if (confirm("Start a new life?")) { location.reload(); } } // Rope (restart) function function rope() { if (confirm("Are you sure you want to end your life? All progress will be lost.")) { restartGame(); } } // Initialize the game initGame(); </script> </body> </html>
i used ai in some parts to debug and add features i didnt know how to addbill gates over here
its ok twin you're still my idoli used ai in some parts to debug and add features i didnt know how to add
What’s the url