CYOA 2ch game
CYOA 2ch gameunknown
html
2 days ago
71 kB
12
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