CYOA 2ch game
CYOA 2ch gameunknown
html
4 months ago
71 kB
15
Indexable
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Межмировой Астральный Бур</title>
<style>
:root {
--primary-color: #2c3e50;
--secondary-color: #3498db;
--accent-color: #e74c3c;
--background-color: #ecf0f1;
--text-color: #2c3e50;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: var(--background-color);
color: var(--text-color);
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
#powers-section {
width: 90%;
max-width: 1800px;
margin: 0 auto 2rem auto;
padding: 2rem;
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
#powers-section .options-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 1rem;
}
#powers-section .option-card {
min-width: 180px;
}
@media (max-width: 1800px) {
#powers-section .options-grid {
grid-template-columns: repeat(4, 1fr);
}
}
@media (max-width: 1200px) {
#powers-section {
width: 95%;
}
#powers-section .options-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 900px) {
#powers-section .options-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
#powers-section {
width: 100%;
padding: 1rem;
}
#powers-section .options-grid {
grid-template-columns: 1fr;
}
}
.header {
text-align: center;
padding: 2rem 0;
background-color: var(--primary-color);
color: white;
margin-bottom: 2rem;
}
.points-display {
position: fixed;
top: 20px;
left: 50%;
transform: translateX(-50%);
background-color: var(--secondary-color);
color: white;
padding: 10px 20px;
border-radius: 5px;
font-size: 1.2rem;
font-weight: bold;
}
.section {
background-color: white;
border-radius: 10px;
padding: 2rem;
margin-bottom: 2rem;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
.section-title {
color: var(--primary-color);
margin-bottom: 1.5rem;
font-size: 1.8rem;
}
.section-description {
margin-bottom: 1.5rem;
font-size: 1.1rem;
color: var(--text-color);
line-height: 1.5;
}
.quest-info {
margin-bottom: 1.5rem;
padding: 1rem;
background-color: var(--background-color);
border-radius: 8px;
font-weight: bold;
color: var(--primary-color);
}
.options-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 1.5rem;
}
.option-card {
background-color: var(--background-color);
border-radius: 8px;
padding: 1.5rem;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
text-align: center;
display: flex;
flex-direction: column;
justify-content: center;
min-height: 150px;
}
.option-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
}
.option-card.selected {
background-color: var(--secondary-color);
color: white;
}
.option-card.disabled {
opacity: 0.5;
cursor: not-allowed;
}
.option-card h3 {
font-size: 1.3rem;
margin-bottom: 0.5rem;
}
.option-card .points {
font-weight: bold;
margin-top: 0.5rem;
}
.option-card .description {
font-size: 1.2rem;
margin: 0.5rem 0;
font-style: italic;
color: #333;
line-height: 1.4;
}
.navigation-buttons {
display: flex;
justify-content: space-between;
margin-top: 2rem;
}
.btn {
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 1rem;
transition: background-color 0.2s;
}
.btn-primary {
background-color: var(--secondary-color);
color: white;
}
.btn-secondary {
background-color: var(--accent-color);
color: white;
}
.btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.subsection-title {
color: var(--secondary-color);
margin: 1.5rem 0 1rem 0;
font-size: 1.4rem;
border-bottom: 1px solid var(--background-color);
padding-bottom: 0.5rem;
}
#appearance-grid {
margin-top: 1.5rem;
margin-bottom: 1rem;
}
#gender-grid {
margin-bottom: 1.5rem;
}
#body-section {
width: 90%;
max-width: 1800px;
margin: 0 auto 2rem auto;
}
#body-section .options-grid {
display: grid;
grid-template-columns: repeat(5, 1fr);
gap: 1rem;
}
#body-section .option-card {
min-width: 180px;
}
@media (max-width: 1200px) {
#body-section .options-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 768px) {
#body-section .options-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 480px) {
#body-section .options-grid {
grid-template-columns: 1fr;
}
}
#perks-section {
width: 90%;
max-width: 1800px;
margin: 0 auto 2rem auto;
padding: 2rem;
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
#perks-section .options-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 1rem;
}
#perks-section .option-card {
min-width: 180px;
}
@media (max-width: 1800px) {
#perks-section .options-grid {
grid-template-columns: repeat(4, 1fr);
}
}
@media (max-width: 1200px) {
#perks-section .options-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 900px) {
#perks-section .options-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
#perks-section {
width: 100%;
padding: 1rem;
}
#perks-section .options-grid {
grid-template-columns: 1fr;
}
}
#drawbacks-section {
width: 90%;
max-width: 1800px;
margin: 0 auto 2rem auto;
padding: 2rem;
background-color: white;
border-radius: 10px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
#drawbacks-section .options-grid {
display: grid;
grid-template-columns: repeat(6, 1fr);
gap: 1rem;
}
#drawbacks-section .option-card {
min-width: 180px;
}
@media (max-width: 1800px) {
#drawbacks-section .options-grid {
grid-template-columns: repeat(4, 1fr);
}
}
@media (max-width: 1200px) {
#drawbacks-section .options-grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (max-width: 900px) {
#drawbacks-section .options-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 600px) {
#drawbacks-section {
width: 100%;
padding: 1rem;
}
#drawbacks-section .options-grid {
grid-template-columns: 1fr;
}
}
</style>
</head>
<body>
<div class="header">
<h1>Межмировой Астральный Бур CYOA</h1>
</div>
<div class="points-display">
Очки: <span id="total-points">0</span>
</div>
<div id="powers-section" class="section" style="display: none;">
<h2 class="section-title">Выберите Ваши Силы</h2>
<div class="options-grid" id="powers-grid"></div>
</div>
<div id="perks-section" class="section" style="display: none;">
<h2 class="section-title">Выберите Ваши Перки</h2>
<div class="options-grid" id="perks-grid"></div>
</div>
<div id="drawbacks-section" class="section" style="display: none;">
<h2 class="section-title">Выберите Ваши Недостатки</h2>
<div class="options-grid" id="drawbacks-grid"></div>
</div>
<div class="container">
<div id="worlds-section" class="section">
<h2 class="section-title">Выберите Ваш Мир</h2>
<div class="options-grid" id="worlds-grid"></div>
</div>
<div id="body-section" class="section" style="display: none;">
<h2 class="section-title">Выберите Ваше Тело</h2>
<h3 class="subsection-title">Пол</h3>
<div class="options-grid" id="gender-grid"></div>
<h3 class="subsection-title">Внешность</h3>
<div class="options-grid" id="appearance-grid"></div>
<h3 class="subsection-title">Рост</h3>
<div class="options-grid" id="height-grid"></div>
<h3 class="subsection-title" id="penis-size-title" style="display: none;">Размер Пениса</h3>
<div class="options-grid" id="penis-size-grid" style="display: none;"></div>
<h3 class="subsection-title" id="breast-size-title" style="display: none;">Размер Груди</h3>
<div class="options-grid" id="breast-size-grid" style="display: none;"></div>
</div>
<div class="navigation-buttons">
<button id="prev-btn" class="btn btn-secondary" disabled>Назад</button>
<button id="next-btn" class="btn btn-primary">Далее</button>
</div>
</div>
<script>
// Game state
let currentSection = 0;
let totalPoints = 0;
let selectedWorlds = [];
let selectedGender = null;
let selectedAppearance = null;
let selectedPenisSize = null;
let selectedBreastSize = null;
let selectedHeight = null;
let selectedPowers = [];
let selectedPerks = [];
let selectedDrawbacks = [];
// Game data
const gameData = {
worlds: [
{ name: 'Warhammer 40k', points: 30 },
{ name: 'Киновселенная Marvel', points: 22 },
{ name: 'Warhammer Fantasy', points: 22 },
{ name: 'Фейрун (Dungeons and Dragons)', points: 22 },
{ name: 'Наруто', points: 22 },
{ name: 'Warcraft', points: 22 },
{ name: 'The Elder Scrolls', points: 18 },
{ name: 'Ведьмак', points: 14 },
{ name: 'Блич', points: 16 },
{ name: 'DXD High School', points: 12 },
{ name: 'Fallout', points: 14 },
{ name: 'Человек-Бензопила', points: 12 },
{ name: 'Аватар', points: 14 },
{ name: 'Коносуба', points: 10 },
{ name: 'Гарри Поттер', points: 12 },
{ name: 'Песнь Льда и Огня', points: 10 },
{ name: 'Звездные Войны', points: 14 },
{ name: 'Киберпанк 2077', points: 12 },
{ name: 'Средиземье', points: 12 },
{ name: 'Youjo Senki', points: 10 },
{ name: 'Mushoku Tensei', points: 14 },
{ name: 'One Piece', points: 14 },
{ name: 'JoJo', points: 10 },
{ name: 'Gantz', points: 10 },
{ name: 'Star Trek', points: 6 },
{ name: 'Мир Тьмы (Vampire: The Masquerade)', points: 12 },
{ name: 'Бесконечное лето', points: 4 },
{ name: 'MiSide', points: 4 }
],
genders: [
{ name: 'Мужик', points: -1 },
{ name: 'Тянока', points: 1 },
{ name: 'Футанари', points: 2 }
],
appearances: [
{ name: 'Урод/уродка', points: 3 },
{ name: 'Невзрачный/невзрачная', points: 1 },
{ name: 'Средне-кун/тян', points: 0 },
{ name: 'Красавчик/красавица', points: -1 },
{ name: 'Гига-чад/богиня', points: -3 }
],
penisSizes: [
{ name: 'Микро 3-5 см', points: 4 },
{ name: 'Маленький 5-12см', points: 2 },
{ name: 'Нормальный 13-17 см', points: 0 },
{ name: 'Большой 18-22 см', points: -2 },
{ name: 'Огромный 23-30 см', points: -4 }
],
breastSizes: [
{ name: '1-й размер', points: 3 },
{ name: '2-й размер', points: 1 },
{ name: '3-й размер', points: 0 },
{ name: '4-й размер', points: -1 },
{ name: '5-й размер', points: -3 }
],
heights: [
{ name: 'Очень низкий (до 150 см)', points: 2 },
{ name: 'Низкий (150-169 см)', points: 1 },
{ name: 'Средний (170-179 см)', points: 0 },
{ name: 'Высокий (180-200 см)', points: -1 },
{ name: 'Очень высокий (200+ см)', points: -2 }
],
powers: [
{ name: 'Регенерация I', points: -2, description: 'Раны заживают за сутки, новая конечность за неделю. Вирусы и бактерии более не страшны.' },
{ name: 'Регенерация II', points: -3, requires: 'Регенерация I', description: 'Раны заживают за минуты, новая конечность за часы' },
{ name: 'Регенерация III', points: -4, requires: 'Регенерация II', description: 'Возможно восстановление после смертельных ран, включая мозг и сердце за секунды, новая конечность вырастает за несколько минут' },
{ name: 'Улучшенная физиология I', points: -2, description: 'Сила, выносливость и рефлексы на уровне пикового человека. Ты способен поднять 500 кг, бежать со скоростью 30 км/ч и прыгать на 3 метра в высоту.' },
{ name: 'Улучшенная физиология II', points: -3, requires: 'Улучшенная физиология I', description: 'Сверхчеловеческие сила и выносливость, позволяющие поднимать до трех тонн, бежать со скоростью 80 км/ч и прыгать на 7 метров в высоту.' },
{ name: 'Улучшенная физиология III', points: -4, requires: 'Улучшенная физиология II', description: 'Титаническая сила и выносливость, позволяющие сравниться с сильнейшими существами. Десятки тонн, скорость бега 160 км/ч, прыжки на 10 и более метров в высоту.' },
{ name: 'Сопротивление магии', points: -4, description: 'Высокий уровень сопротивления любой магии и магическим эффектам либо их аналогам (варп, чакра, реацу)' },
{ name: 'Долголетие I', points: -3, description: 'Ты гарантированно проживешь 200 лет, старея в замедленном темпе. В 100 лет ты будешь выглядеть как 40-летний.' },
{ name: 'Долголетие II', points: -3, requires: 'Долголетие I', description: 'Ты гарантированно проживешь 1000 лет. В 700 лет, ты будешь выглядеть как 40-летний.' },
{ name: 'Долголетие III', points: -3, requires: 'Долголетие II', description: 'Ты никогда не умрешь от старости. Будешь вечно молодым, не старше 25 лет на вид.' },
{ name: 'Местная система силы I', points: -3, description: 'Базовый доступ к магической системе выбранного мира, средний уровень например как у выпускника хогвартса, среднего псайкера или чунина из Наруто' },
{ name: 'Местная система силы II', points: -4, requires: 'Местная система силы I', description: 'Высокий уровень доступа к магической системе выбранного мира, например как у Волдеморта, Какаши или мага 20 уровня из D&D ' },
{ name: 'Местная система силы III', points: -5, requires: 'Местная система силы II', description: 'Высочайший уровень владения магией для смертных, изначально, ты будешь равен по силам, а потенциально и превзойдешь Мерлина, Бога-императора Человечества, Мудреца Шести Путей или другого топового смертного человека' },
{ name: 'Защита разума', points: -3, description: 'Иммунитет к ментальным воздействиям и чтению мыслей, включая гендзюцу, воздействие варпа' },
{ name: 'Неподвластная реальности душа', points: -3, description: 'Душа неуязвима для любых воздействий и манипуляций. Авада-кевада не подействует, Пейн не сможет вытянуть из тебя душу риннеганом' },
{ name: 'Быстрая регенерация энергии', points: -5, description: 'Твоя мана/чакра/реяцу восстанавливается в три раза быстрее ' },
{ name: 'Система геймера', points: -4, requires: ['Инвентарь', 'Защита разума'], description: 'Взаимодействие с миром как в манхве Геймер с интерфейсом, статистикой и уровнями. Аукциона, ачивок, данжей нет.' },
{ name: 'Телепортация', points: -4, description: 'Мгновенное перемещение в любую точку вселенной силой мысли.' },
{ name: 'Порталы', points: -4, requires: 'Телепортация', description: 'Создание стабильных порталов для перемещения себя и других.' },
{ name: 'Старшая кровь', points: -4, requires: 'Порталы', description: 'Ты обладаешь силой превосходящей силу Цири, ты можешь открывать порталы в другие миры и времена. К тому же, твои магические способности становятся сильнее на уровень.' },
{ name: 'Интеллект I', points: -2, description: 'Ты на уровне Эйнштейна, Аристотеля и лучших умов человечества.' },
{ name: 'Интеллект II', points: -2, requires: 'Интеллект I', description: 'Сверхчеловеческий интеллект, твой IQ выше 300' },
{ name: 'Интеллект III', points: -2, requires: 'Интеллект II', description: 'Ты по сути живой компьютер, обладаешь способностью ментата, можешь обрабатывать огромные объемы информации за секунды.' },
{ name: 'Полет', points: -3, description: 'Ты умеешь летать как супермен на дозвуковых скоростях.' }
],
perks: [
{ name: 'Полиглот', points: -1, description: 'Быстрое освоение любых языков.' },
{ name: 'Феромоны', points: -1, description: 'Твой запах привлекает и возбуждает противоположный пол.' },
{ name: 'Харизматичный', points: -1, description: 'Ты харизматичен как суперзвезда.' },
{ name: 'Мастер холодного оружия', points: -1, description: 'Врожденный талант к владению холодным оружием.' },
{ name: 'Мастер огнестрельного оружия', points: -1, description: 'Превосходная точность и навыки стрельбы.' },
{ name: 'Мастер алхимик', points: -2, description: 'Талант к созданию зелий и эликсиров. Если мир не магический, то ты обладаешь знаниями прикладной химии.' },
{ name: 'Мастер ремесленник', points: -2, description: 'Искусное создание предметов и инструментов на технологическом уровне твоего мира' },
{ name: 'Мастер стратег', points: -2, description: 'Тактический гений, способность планировать на несколько шагов вперед.' },
{ name: 'Как вчера', points: -2, description: 'У тебя идеальная фотографическая память, ты никогда ничего не забываешь' },
{ name: 'Мастер рукопашного боя', points: -1, description: 'Природный талант к боевым искусствам и рукопашному бою.' },
{ name: 'Мастер маг', points: -3, description: 'Ты получаешь знания о местной магии на профессорском уровне, но только знания, сами способности не включены в этот перк. ' },
{ name: 'Быстрый ученик', points: -3, description: 'Способность осваивать новые навыки в несколько раз быстрее обычного. Ты можешь освоить программу бакалавра топового вуза за 2-3 месяца.' },
{ name: 'Местный', points: -1, description: 'Во всех базах правительства есть информация о тебе, а так же у тебя есть набор документов для легального проживания в мире и стране.' },
{ name: 'Мастер Камасутры', points: -1, description: 'Исключительное мастерство в искусстве любви. Ты подсознательно знаешь как удолетворить тяночку или кунчика.' },
{ name: 'Бессонный', points: -2, description: 'Сон больше тебе не нужен.' },
{ name: 'Мастер учитель', points: -1, description: 'Умение эффективно передавать знания и навыки другим.' },
{ name: 'Креативный', points: -1, description: 'Выбери творческую деятельность - музыка, рисование, скульптура, пение, писательство, программирование и ты будешь на уровне суперзвезд этой отрасли. Ты будешь творцом уровня Фреди Меркьюри, Микелянджело, Стивен Кинг.' },
{ name: 'Атлет', points: -1, description: 'Твое тело становится на уровне хорошего спортсмена. Ты можешь пробежать марафон, сделать жим лежа в 250 кг и так далее.' },
{ name: 'ТНУС', points: -1, description: 'Тебе не нужно срать и ссать.' },
{ name: 'Гаремник', points: -1, description: 'Все твои сексуальные партнерши или партнеры не против того, чтобы ты завел отношения с другими. Но одноразовые связи все равно считаются изменой.' },
{ name: 'Открытые отношения', points: -1, description: 'Твои партнеры или партнерши не против одноразовых половых связей, пока уверенны в том, что ты их единственный постоянный партнер. Но романтические связи заставят их чувствовать себя преданными. Если взять с перком гаремник, то это ограничение снимается, трахайся сколько влезет.' },
{ name: 'Гига-чад', points: -1, description: 'Ты становишься образцом мужественности и уверенности в себе. Ты ничего не боишься и тебе все по плечу.' },
{ name: 'Супер-ебарь/супер-шлюха', points: -1, description: 'У тебя бесконечная сексуальная выносливость. У тебя иммунитет к ЗПП. Ты готов(а) ебаться сутками без перерыва' },
{ name: 'Стартовый капитал I', points: -1, description: 'У тебя есть сумма местных денег в эквиваленте $10,000 по ППС.' },
{ name: 'Стартовый капитал II', points: -1, requires: 'Стартовый капитал I', description: 'У тебя есть сумма местных денег в эквиваленте $150,000 по ППС.' },
{ name: 'Стартовый капитал III', points: -1, requires: 'Стартовый капитал II', description: 'У тебя есть сумма местных денег в эквиваленте $1,000,000 по ППС.' },
{ name: 'Ловкий', points: -2, description: 'Ты становишься амбидекстером, твоя скорость реакции, координация тела выходят на уровень слегка превыщающий пиковый для человека.' },
{ name: 'Стартовый Набор', points: -1, description: 'Дает вам набор характерный для целевого мира - местную одежду, броню, набор для выживания, какое-то оружие. Если это современный мир, то набор будет состоять из простой местной одежды, бронежилета и пистолета glock с запасной обоймой и рюкзаком где будут сухпайки на трое суток, палатка, компас, фляга, спальный мешок, аптечка.' },
],
drawbacks: [
{ name: 'Утроенное либидо', points: 1, description: 'Твое либидо в три раза выше обычного, практически нимфомания, но ты все таки можешь получать удовольствие от секса.' },
{ name: 'Высокий метаболизм', points: 1, description: 'Требуется в три раза больше пищи, чем обычно. Придется сьедать по 10-20 бигмаков в день' },
{ name: 'Чухан', points: 2, description: 'От вас исходит стойкий неприятный запах, отталкивающий окружающих.' },
{ name: 'Жиробас', points: 3, description: 'Ты страдаешь ожирением. Похудеть не получится.' },
{ name: 'Плохое зрение', points: 3, description: 'Сильная близорукость или дальнозоркость без возможности коррекции. Придется носить очки или линзы, или вставить импланты.' },
{ name: 'Сабмиссив', points: 2, description: 'Ты подсознательно хочешь подчиняться в сексе и в отношениях. Ты не хочешь быть лидером. Ты будешь хотеть быть традиционной женой если ты девушка, или подкаблучником если ты мужик.' },
{ name: 'Мазохист', points: 1, description: 'Ты кайфуешь от боли и унижения, как конченный мазохист. У тебя появляются фантазии о том, чтобы быть изнасилованной(ым)' },
{ name: 'Вслепую', points: 3, description: 'Ты забываешь всю информацию о мире, куда попадешь.' },
{ name: 'Плодовитый', points: 2, description: '100% вероятность зачатия при сексуальном контакте, контрацепция не работает. Придется заходить через черный ход.' },
{ name: 'Супер плодовитый', points: 2, requires: 'Плодовитый', description: 'Ты или твои партнерши всегда рожают минимум двойню, а то и три-четыре ребенка' },
{ name: 'В розыске', points: 4, description: 'Вы разыскиваетесь властями за тяжкое преступление, которого не совершали - убийство, ересь, крупная кража.' },
{ name: 'Рабство', points: 4, description: 'Вы начинаете как раб/рабыня, со всеми вытекающими последствиями.' },
{ name: 'Немой', points: 5, description: 'Полная неспособность говорить или издавать звуки. Исправить не получиться.' },
{ name: 'Невезучий', points: 5, description: 'Ты ходячая катастрофа, тебя постоянно преследуют неудачи и провалы, как и всех окружающих включая врагов.' },
{ name: 'Амнезия', points: 5, description: 'Полная потеря памяти о прошлой жизни, мире и личности, но у тебя останутся знания о мире, а так же общие знания, например что надо мыть руки перед едой.' },
{ name: 'Кукич', points: 2, description: 'Твоя ЕОТ или ЕОК будут тебе изменять, и что интересно, тебе это будет нравится. Если у тебя гарем, то это условие распространяется на всех его членов. Плохо влияет на репутацию.' },
{ name: 'Омежка', points: 3, incompatible: ['Харизматичный', 'Гига-чад'], description: 'Думал в сказку попал? Ты типичный битард омежка, как и в жизни. Неуверенный в себе и тревожный.' },
{ name: 'Причина тряски?', points: 2, description: 'Ты трус, и этим все сказано.' },
{ name: 'Титан Одиночества', points: 4, description: 'Ты никогда никого не полюбишь, и тебя никто ниогда не полюбит. Даже если ты будешь платить за это, ты все равно будешь чувствовать фальш. Ты форевер алоун.' },
{ name: 'Дискриминация', points: 3, description: 'Ты принадлежишь к дискриминируемой группе. Например ты мутант/нелюдь в мире Warhammer или грязнокровка в мире Поттера, представитель племени изгоев в Скайриме. Так или иначе всюду будешь ты сталкиваться с предрассудками и дискриминацией.' },
{ name: 'Без вкуса и запаха', points: 3, description: 'Ты как будто заболел ковидом, у тебя пропало чувство вкуса и обоняние и вернуть фих никак нельзя.' },
{ name: 'Приступы Гнева I', points: 2, description: 'Ты раздражителен. Раз в неделю у тебя случается приступ неконтролируемого гнева, во время которого ты можешь наговорить грубостей или оскорбить окружающих.' },
{ name: 'Приступы Гнева II', points: 2, requires: 'Приступы Гнева I', description: 'Твоя ярость усиливается. Приступы случаются два-три раза в неделю, и во время них ты можешь сломать вещи или ударить кого-то.' },
{ name: 'Приступы Гнева III', points: 3, requires: 'Приступы Гнева II', description: 'Ты берсерк. Два-три раза в неделю у тебя бывают моменты, когда ты впадаешь в состояние бешеной ярости и можешь серьезно навредить окружающим. В таком состоянии ты не различаешь друзей и врагов.' },
{ name: 'Гендерсвап', points: 3, description: 'Твой пол меняется на противоположный и ничто во вселенной не сможет изменить его, ни боги ни даже магия.' },
{ name: 'Аддикция', points: 3, description: 'У тебя появляется сильная вредная привычка, например ты куришь по две пачки в день, алкоголик или наркоман. Вылечиться не получится.' },
{ name: 'Беды с Башкой', points: 5, description: 'У тебя появляется психическое расстройство на выбор. Полностью вылечиться не получится, лекарства лишь облегчают состояние.' },
{ name: 'Комплекс Героя', points: 4, description: 'У тебя появляется сильное чувство справедливости, эмпатии и сострадания. Ты не можешь бросить никого в беде, даже если ситуация безнадежная.' },
{ name: 'Бесплодие', points: 3, incompatible: ['Плодовитый', 'Супер плодовитый'], description: 'Ты не можешь иметь детей, и ни что во вселенной не исправит этого.' },
{ name: 'Нофап', points: 2, description: 'Вы не можете удолетворить сам себя.' },
{ name: 'Маньяк', points: 5, description: 'ВЫ ЛЮБИТЕ УБИВАТЬ, УБИВАТЬ НАХУЙ, БЛЯЯЯДЬ, УБИВАААТАЬ, ОН ЛЮБИТ УБИВАТЬ!!! КРОВЬ КИШКИ РАСПИДОРАСИЛО!' },
{ name: 'Правдоруб', points: 3, description: 'Вы не можете лгать.' },
{ name: 'Плохая Репутация', points: 2, description: 'Гарантируется событие которое оставит несмываемое пятно на вашей репутации. Как например Геральт стал мясником из Блавикена.' },
{ name: 'Дурак/Дура', points: 2, description: 'Ты глупый(ая), твой IQ снижается на 20 пунктов, но не ниже 88' },
{ name: 'Слабоумие', points: 4, requires: 'Дурак/Дура', description: 'Ты почти дебилен, твой IQ не выше 75' },
{ name: 'Какой еще тред?', points: 2, description: 'Ты забываешь о том, что играл в какую-то игру на дваче, и какие выборы ты сделал.' }
]
};
// Update points display
function updatePoints() {
document.getElementById('total-points').textContent = totalPoints;
}
// Create option cards
function createOptionCard(option, section) {
const card = document.createElement('div');
card.className = 'option-card';
let cardContent = '';
// Для сил, перков и недостатков добавляем описания
if (section === 'powers' || section === 'perks' || section === 'drawbacks') {
let description = option.description || "";
// Add requirement info if applicable
if (option.requires) {
if (Array.isArray(option.requires)) {
description += ` (Требуется: ${option.requires.join(', ')})`;
} else {
description += ` (Требуется: ${option.requires})`;
}
}
// Add incompatibility info if applicable
if (option.incompatible) {
description += ` (Несовместимо с: ${Array.isArray(option.incompatible) ? option.incompatible.join(', ') : option.incompatible})`;
}
cardContent = `
<h3>${option.name}</h3>
<div class="description">${description}</div>
<div class="points">${option.points > 0 ? '+' : ''}${option.points} очков</div>
`;
} else {
cardContent = `
<h3>${option.name}</h3>
<div class="points">${option.points > 0 ? '+' : ''}${option.points} очков</div>
`;
}
card.innerHTML = cardContent;
card.addEventListener('click', () => {
if (section === 'worlds') {
handleWorldSelection(option);
} else if (section === 'gender') {
handleGenderSelection(option);
} else if (section === 'appearance') {
handleAppearanceSelection(option);
} else if (section === 'height') {
handleHeightSelection(option);
} else if (section === 'penisSize') {
handlePenisSizeSelection(option);
} else if (section === 'breastSize') {
handleBreastSizeSelection(option);
} else if (section === 'powers') {
handlePowerSelection(option);
} else if (section === 'perks') {
handlePerkSelection(option);
} else if (section === 'drawbacks') {
handleDrawbackSelection(option);
}
});
return card;
}
// Helper function to get colors for sections
function getColorForSection(section) {
switch (section) {
case 'worlds':
return '#2c3e50';
case 'gender':
return '#3498db';
case 'appearance':
return '#f1c40f';
case 'penisSize':
return '#95a5a6';
case 'breastSize':
return '#e74c3c';
case 'powers':
return '#2ecc71';
case 'perks':
return '#9b59b6';
case 'drawbacks':
return '#e67e22';
case 'quests':
return '#9b59b6';
default:
return '#bdc3c7';
}
}
// Handle selections
function handleWorldSelection(option) {
// If there's already a selected world, deselect it
if (selectedWorlds.length > 0) {
const previousWorld = selectedWorlds[0];
totalPoints -= previousWorld.points;
selectedWorlds = [];
}
// Select the new world
selectedWorlds.push(option);
totalPoints += option.points;
updatePoints();
updateWorldsGrid();
}
function handleGenderSelection(option) {
if (selectedGender) {
totalPoints -= selectedGender.points;
}
selectedGender = option;
totalPoints += option.points;
updatePoints();
updateGenderGrid();
// Show/hide penis size and breast size sections based on gender
const penisSizeTitle = document.getElementById('penis-size-title');
const penisSizeGrid = document.getElementById('penis-size-grid');
const breastSizeTitle = document.getElementById('breast-size-title');
const breastSizeGrid = document.getElementById('breast-size-grid');
// Reset selections when gender changes
if (selectedPenisSize) {
totalPoints -= selectedPenisSize.points;
selectedPenisSize = null;
}
if (selectedBreastSize) {
totalPoints -= selectedBreastSize.points;
selectedBreastSize = null;
}
// Show/hide based on gender
if (option.name === 'Мужик' || option.name === 'Футанари') {
penisSizeTitle.style.display = 'block';
penisSizeGrid.style.display = 'grid';
updatePenisSizeGrid();
} else {
penisSizeTitle.style.display = 'none';
penisSizeGrid.style.display = 'none';
}
if (option.name === 'Тянока' || option.name === 'Футанари') {
breastSizeTitle.style.display = 'block';
breastSizeGrid.style.display = 'grid';
updateBreastSizeGrid();
} else {
breastSizeTitle.style.display = 'none';
breastSizeGrid.style.display = 'none';
}
updatePoints();
}
function handleAppearanceSelection(option) {
if (selectedAppearance) {
totalPoints -= selectedAppearance.points;
}
selectedAppearance = option;
totalPoints += option.points;
updatePoints();
updateAppearanceGrid();
}
function handleHeightSelection(option) {
if (selectedHeight) {
totalPoints -= selectedHeight.points;
}
selectedHeight = option;
totalPoints += option.points;
updatePoints();
updateHeightGrid();
}
function handlePenisSizeSelection(option) {
if (selectedPenisSize) {
totalPoints -= selectedPenisSize.points;
}
selectedPenisSize = option;
totalPoints += option.points;
updatePoints();
updatePenisSizeGrid();
}
function handleBreastSizeSelection(option) {
if (selectedBreastSize) {
totalPoints -= selectedBreastSize.points;
}
selectedBreastSize = option;
totalPoints += option.points;
updatePoints();
updateBreastSizeGrid();
}
function handlePowerSelection(option) {
const index = selectedPowers.findIndex(p => p.name === option.name);
if (index === -1) {
if (canSelectPower(option)) {
selectedPowers.push(option);
totalPoints += option.points;
updatePoints();
updatePowersGrid();
}
} else {
selectedPowers.splice(index, 1);
totalPoints -= option.points;
updatePoints();
updatePowersGrid();
}
}
function handlePerkSelection(option) {
const index = selectedPerks.findIndex(p => p.name === option.name);
if (index === -1) {
// Проверка требований перед выбором
if (canSelectPerk(option)) {
selectedPerks.push(option);
totalPoints += option.points;
updatePoints();
updatePerksGrid();
}
} else {
// Проверка, не является ли этот перк требованием для других выбранных перков
const isRequired = selectedPerks.some(p => {
if (typeof p.requires === 'string') {
return p.requires === option.name;
} else if (Array.isArray(p.requires)) {
return p.requires.includes(option.name);
}
return false;
});
if (isRequired) {
return; // Нельзя отменить выбор, если перк требуется для других
}
selectedPerks.splice(index, 1);
totalPoints -= option.points;
updatePoints();
updatePerksGrid();
}
}
// Проверка, можно ли выбрать перк
function canSelectPerk(perk) {
if (!perk.requires) return true;
// Обработка массива требований (несколько предварительных условий)
if (Array.isArray(perk.requires)) {
return perk.requires.every(req =>
selectedPerks.some(p => p.name === req)
);
}
// Обработка одного требования
return selectedPerks.some(p => p.name === perk.requires);
}
function handleDrawbackSelection(option) {
const index = selectedDrawbacks.findIndex(d => d.name === option.name);
if (index === -1) {
// Check if this drawback has requirements that are met
if (option.requires && !selectedDrawbacks.some(d => d.name === option.requires)) {
return; // Can't select a drawback if its requirement isn't met
}
// Check if this drawback is incompatible with any selected powers
if (option.incompatible) {
const hasIncompatiblePower = option.incompatible.some(incompatiblePower =>
selectedPowers.some(p => p.name === incompatiblePower)
);
if (hasIncompatiblePower) {
return; // Can't select if there's an incompatible power
}
}
selectedDrawbacks.push(option);
totalPoints += option.points;
updatePoints();
updateDrawbacksGrid();
} else {
// Check if any other selected drawback requires this one
const isRequired = selectedDrawbacks.some(d => d.requires === option.name);
if (isRequired) {
return; // Can't deselect if another drawback requires it
}
selectedDrawbacks.splice(index, 1);
totalPoints -= option.points;
updatePoints();
updateDrawbacksGrid();
}
}
// Check if a power can be selected
function canSelectPower(power) {
if (!power.requires) return true;
// Handle array of requirements (multiple prerequisites)
if (Array.isArray(power.requires)) {
return power.requires.every(req =>
selectedPowers.some(p => p.name === req)
);
}
// Handle single requirement
return selectedPowers.some(p => p.name === power.requires);
}
// Update grids
function updateWorldsGrid() {
const grid = document.getElementById('worlds-grid');
grid.innerHTML = '';
// Сортировка миров по поинтам (от большего к меньшему)
const sortedWorlds = [...gameData.worlds].sort((a, b) => b.points - a.points);
sortedWorlds.forEach(world => {
const card = createOptionCard(world, 'worlds');
card.style.borderLeft = '4px solid var(--primary-color)';
if (selectedWorlds.some(w => w.name === world.name)) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updateGenderGrid() {
const grid = document.getElementById('gender-grid');
grid.innerHTML = '';
gameData.genders.forEach((gender, index) => {
const card = createOptionCard(gender, 'gender');
const colors = ['#3498db', '#e74c3c', '#9b59b6'];
card.style.borderLeft = `4px solid ${colors[index]}`;
if (selectedGender && selectedGender.name === gender.name) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updateAppearanceGrid() {
const grid = document.getElementById('appearance-grid');
grid.innerHTML = '';
gameData.appearances.forEach((appearance, index) => {
const card = createOptionCard(appearance, 'appearance');
const colors = ['#95a5a6', '#bdc3c7', '#d5dbdb', '#f1c40f', '#f39c12'];
card.style.borderLeft = `4px solid ${colors[index]}`;
if (selectedAppearance && selectedAppearance.name === appearance.name) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updateHeightGrid() {
const grid = document.getElementById('height-grid');
grid.innerHTML = '';
gameData.heights.forEach((height, index) => {
const card = createOptionCard(height, 'height');
const colors = ['#95a5a6', '#bdc3c7', '#d5dbdb', '#f1c40f', '#f39c12'];
card.style.borderLeft = `4px solid ${colors[index]}`;
if (selectedHeight && selectedHeight.name === height.name) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updatePenisSizeGrid() {
const grid = document.getElementById('penis-size-grid');
grid.innerHTML = '';
gameData.penisSizes.forEach((penisSize, index) => {
const card = createOptionCard(penisSize, 'penisSize');
const colors = ['#95a5a6', '#bdc3c7', '#d5dbdb', '#f1c40f', '#f39c12'];
card.style.borderLeft = `4px solid ${colors[index]}`;
if (selectedPenisSize && selectedPenisSize.name === penisSize.name) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updateBreastSizeGrid() {
const grid = document.getElementById('breast-size-grid');
grid.innerHTML = '';
gameData.breastSizes.forEach((breastSize, index) => {
const card = createOptionCard(breastSize, 'breastSize');
const colors = ['#95a5a6', '#bdc3c7', '#d5dbdb', '#f1c40f', '#f39c12'];
card.style.borderLeft = `4px solid ${colors[index]}`;
if (selectedBreastSize && selectedBreastSize.name === breastSize.name) {
card.classList.add('selected');
}
grid.appendChild(card);
});
}
function updatePowersGrid() {
const grid = document.getElementById('powers-grid');
grid.innerHTML = '';
gameData.powers.forEach(power => {
const card = createOptionCard(power, 'powers');
// Color coding based on power type
if (power.name.includes('Регенерация')) {
card.style.borderLeft = '4px solid #2ecc71';
} else if (power.name.includes('Физиология')) {
card.style.borderLeft = '4px solid #e67e22';
} else if (power.name.includes('Система силы')) {
card.style.borderLeft = '4px solid #8e44ad';
} else if (power.name.includes('Телепортация') || power.name.includes('Порталы')) {
card.style.borderLeft = '4px solid #1abc9c';
} else if (power.name.includes('Интеллект')) {
card.style.borderLeft = '4px solid #3498db';
} else if (power.name.includes('Защита разума') || power.name.includes('Душа')) {
card.style.borderLeft = '4px solid #9b59b6';
} else if (power.name.includes('Инвентарь') || power.name.includes('Геймер')) {
card.style.borderLeft = '4px solid #2ecc71';
} else if (power.name.includes('Древняя кровь')) {
card.style.borderLeft = '4px solid #147d6e';
} else {
card.style.borderLeft = '4px solid #3498db';
}
if (selectedPowers.some(p => p.name === power.name)) {
card.classList.add('selected');
}
if (!canSelectPower(power)) {
card.classList.add('disabled');
}
grid.appendChild(card);
});
}
function updatePerksGrid() {
const grid = document.getElementById('perks-grid');
grid.innerHTML = '';
// Группируем связанные перки и сортируем их
const sortedPerks = sortRelatedItems(gameData.perks, false);
sortedPerks.forEach(perk => {
const card = createOptionCard(perk, 'perks');
card.style.borderLeft = '4px solid #3498db';
if (selectedPerks.some(p => p.name === perk.name)) {
card.classList.add('selected');
}
// Отключаем карточку, если требования не выполнены
if (!canSelectPerk(perk)) {
card.classList.add('disabled');
}
grid.appendChild(card);
});
}
function updateDrawbacksGrid() {
const grid = document.getElementById('drawbacks-grid');
grid.innerHTML = '';
// Группируем связанные недостатки и сортируем их
const sortedDrawbacks = sortRelatedItems(gameData.drawbacks, true);
sortedDrawbacks.forEach(drawback => {
const card = createOptionCard(drawback, 'drawbacks');
// Color based on severity
if (drawback.points === 5) {
card.style.borderLeft = '4px solid #34495e';
} else if (drawback.points === 4) {
card.style.borderLeft = '4px solid #8e44ad';
} else if (drawback.points === 3) {
card.style.borderLeft = '4px solid #c0392b';
} else if (drawback.points === 2) {
card.style.borderLeft = '4px solid #e74c3c';
} else {
card.style.borderLeft = '4px solid #f39c12';
}
if (selectedDrawbacks.some(d => d.name === drawback.name)) {
card.classList.add('selected');
}
// Check if this drawback has requirements
if (drawback.requires && !selectedDrawbacks.some(d => d.name === drawback.requires)) {
card.classList.add('disabled');
}
// Check if this drawback is incompatible with any selected powers
if (drawback.incompatible) {
const hasIncompatiblePower = drawback.incompatible.some(incompatiblePower =>
selectedPowers.some(p => p.name === incompatiblePower)
);
if (hasIncompatiblePower) {
card.classList.add('disabled');
}
}
grid.appendChild(card);
});
}
// Navigation
const sections = ['worlds', 'body', 'powers', 'perks', 'drawbacks'];
const sectionElements = sections.map(section => document.getElementById(`${section}-section`));
function showSection(index) {
sectionElements.forEach((section, i) => {
section.style.display = i === index ? 'block' : 'none';
});
currentSection = index;
updateNavigationButtons();
// If we're showing the body section, check if we need to show penis/breast size sections
if (index === 1 && selectedGender) { // Body section is now index 1
// Show/hide penis size and breast size sections based on gender
const penisSizeTitle = document.getElementById('penis-size-title');
const penisSizeGrid = document.getElementById('penis-size-grid');
const breastSizeTitle = document.getElementById('breast-size-title');
const breastSizeGrid = document.getElementById('breast-size-grid');
if (selectedGender.name === 'Мужик' || selectedGender.name === 'Футанари') {
penisSizeTitle.style.display = 'block';
penisSizeGrid.style.display = 'grid';
updatePenisSizeGrid();
} else {
penisSizeTitle.style.display = 'none';
penisSizeGrid.style.display = 'none';
}
if (selectedGender.name === 'Тянока' || selectedGender.name === 'Футанари') {
breastSizeTitle.style.display = 'block';
breastSizeGrid.style.display = 'grid';
updateBreastSizeGrid();
} else {
breastSizeTitle.style.display = 'none';
breastSizeGrid.style.display = 'none';
}
}
}
function updateNavigationButtons() {
document.getElementById('prev-btn').disabled = currentSection === 0;
document.getElementById('next-btn').disabled = currentSection === sections.length - 1;
}
document.getElementById('prev-btn').addEventListener('click', () => {
if (currentSection > 0) {
showSection(currentSection - 1);
}
});
document.getElementById('next-btn').addEventListener('click', () => {
if (currentSection < sections.length - 1) {
showSection(currentSection + 1);
}
});
// Initialize the game
function initGame() {
updateWorldsGrid();
updateGenderGrid();
updateAppearanceGrid();
updateHeightGrid();
updatePenisSizeGrid();
updateBreastSizeGrid();
updatePowersGrid();
updatePerksGrid();
updateDrawbacksGrid();
updatePoints();
showSection(0);
// Initially hide penis and breast size sections
document.getElementById('penis-size-title').style.display = 'none';
document.getElementById('penis-size-grid').style.display = 'none';
document.getElementById('breast-size-title').style.display = 'none';
document.getElementById('breast-size-grid').style.display = 'none';
}
// Функция для сортировки связанных элементов (перков/недостатков)
function sortRelatedItems(items, isDrawbacks) {
// Копируем массив для работы с ним
const allItems = [...items];
const result = [];
const processed = new Set();
// Находим все группы связанных элементов
const groups = [];
// Функция для нахождения корневого элемента и всех его зависимых
function findRelatedGroup(item, group = []) {
if (processed.has(item.name)) return group;
group.push(item);
processed.add(item.name);
// Находим все элементы, которые требуют текущий элемент
const dependents = allItems.filter(i => {
if (Array.isArray(i.requires)) {
return i.requires.includes(item.name);
}
return i.requires === item.name;
});
// Рекурсивно добавляем зависимые элементы в группу
dependents.forEach(dep => findRelatedGroup(dep, group));
return group;
}
// Находим корневые элементы (которые ничего не требуют)
const rootItems = allItems.filter(item => !item.requires);
// Для каждого корневого элемента находим его группу
rootItems.forEach(rootItem => {
const group = findRelatedGroup(rootItem);
if (group.length > 0) {
groups.push(group);
}
});
// Проверяем, остались ли непроверенные элементы (могут быть циклические зависимости)
allItems.forEach(item => {
if (!processed.has(item.name)) {
const group = findRelatedGroup(item);
if (group.length > 0) {
groups.push(group);
}
}
});
// Сортируем группы по наивысшему значению points
groups.sort((groupA, groupB) => {
// Для drawbacks сортировка от большего к меньшему
// Для perks сортировка от меньшего (более отрицательного) к большему
if (isDrawbacks) {
const maxPointsA = Math.max(...groupA.map(i => i.points));
const maxPointsB = Math.max(...groupB.map(i => i.points));
return maxPointsB - maxPointsA;
} else {
const minPointsA = Math.min(...groupA.map(i => i.points));
const minPointsB = Math.min(...groupB.map(i => i.points));
return minPointsA - minPointsB;
}
});
// Добавляем все элементы из групп в результирующий массив
groups.forEach(group => {
result.push(...group);
});
return result;
}
initGame();
</script>
</body>
</html>
Editor is loading...
Leave a Comment