Spaces:
Running
Running
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>ПЕРЕКЛЮЧЕНИЕ СИСТЕМЫ - Симулятор кризиса карьеры</title> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| :root { | |
| --primary: #00ff41; | |
| --secondary: #008f11; | |
| --bg: #0a0a0a; | |
| --text: #e0e0e0; | |
| --error: #ff3333; | |
| --warning: #ffaa00; | |
| --highlight: #00b4ff; | |
| } | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| font-family: 'Courier New', monospace; | |
| } | |
| body { | |
| background-color: var(--bg); | |
| color: var(--primary); | |
| height: 100vh; | |
| overflow: hidden; | |
| position: relative; | |
| animation: scanline 8s linear infinite; | |
| } | |
| @keyframes scanline { | |
| 0% { background-position: 0 0; } | |
| 100% { background-position: 0 100%; } | |
| } | |
| body::before { | |
| content: ""; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background: linear-gradient( | |
| rgba(0, 255, 65, 0.025) 1px, | |
| transparent 1px | |
| ); | |
| background-size: 100% 2px; | |
| pointer-events: none; | |
| z-index: 100; | |
| } | |
| #terminal { | |
| width: 90%; | |
| max-width: 800px; | |
| height: 80vh; | |
| margin: 5vh auto; | |
| padding: 20px; | |
| border: 1px solid var(--secondary); | |
| position: relative; | |
| overflow: hidden; | |
| box-shadow: 0 0 20px rgba(0, 255, 65, 0.3); | |
| opacity: 0; | |
| transition: opacity 0.5s ease; | |
| } | |
| #terminal.active { | |
| opacity: 1; | |
| } | |
| #terminal::before { | |
| content: "ПЕРЕКЛЮЧЕНИЕ_СИСТЕМЫ v4.3.1"; | |
| position: absolute; | |
| top: 5px; | |
| right: 10px; | |
| color: var(--secondary); | |
| font-size: 0.8em; | |
| } | |
| #output { | |
| height: calc(100% - 40px); | |
| overflow-y: auto; | |
| padding-right: 10px; | |
| line-height: 1.4; | |
| } | |
| #input-container { | |
| display: flex; | |
| align-items: center; | |
| margin-top: 10px; | |
| padding-top: 10px; | |
| border-top: 1px dashed var(--secondary); | |
| } | |
| #prompt { | |
| margin-right: 10px; | |
| color: var(--secondary); | |
| } | |
| #input { | |
| flex-grow: 1; | |
| background: transparent; | |
| border: none; | |
| color: var(--primary); | |
| outline: none; | |
| font-family: 'Courier New', monospace; | |
| caret-color: var(--primary); | |
| } | |
| .command { | |
| color: var(--primary); | |
| margin-bottom: 10px; | |
| } | |
| .response { | |
| color: var(--text); | |
| margin-bottom: 15px; | |
| white-space: pre-wrap; | |
| } | |
| .system { | |
| color: var(--secondary); | |
| font-weight: bold; | |
| } | |
| .error { | |
| color: var(--error); | |
| } | |
| .warning { | |
| color: var(--warning); | |
| } | |
| .highlight { | |
| color: var(--highlight); | |
| } | |
| .stats { | |
| display: inline-block; | |
| padding: 2px 5px; | |
| border: 1px solid var(--secondary); | |
| margin: 5px 0; | |
| } | |
| .progress-container { | |
| width: 100%; | |
| background-color: rgba(0, 143, 17, 0.2); | |
| margin: 10px 0; | |
| } | |
| .progress-bar { | |
| height: 20px; | |
| background-color: var(--primary); | |
| width: 0%; | |
| transition: width 0.5s; | |
| position: relative; | |
| overflow: hidden; | |
| } | |
| .progress-bar::after { | |
| content: ""; | |
| position: absolute; | |
| top: 0; | |
| left: 0; | |
| right: 0; | |
| bottom: 0; | |
| background: linear-gradient( | |
| 90deg, | |
| transparent 0%, | |
| rgba(0, 255, 65, 0.5) 50%, | |
| transparent 100% | |
| ); | |
| animation: progress-light 2s linear infinite; | |
| } | |
| @keyframes progress-light { | |
| 0% { transform: translateX(-100%); } | |
| 100% { transform: translateX(100%); } | |
| } | |
| .job-icon { | |
| margin-right: 10px; | |
| color: var(--secondary); | |
| } | |
| #start-screen { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background-color: var(--bg); | |
| display: flex; | |
| flex-direction: column; | |
| justify-content: center; | |
| align-items: center; | |
| z-index: 200; | |
| text-align: center; | |
| pointer-events: all; | |
| transition: opacity 0.5s ease; | |
| } | |
| #start-screen.hidden { | |
| opacity: 0; | |
| pointer-events: none; | |
| } | |
| #start-title { | |
| font-size: 3em; | |
| margin-bottom: 20px; | |
| color: var(--primary); | |
| text-shadow: 0 0 10px rgba(0, 255, 65, 0.7); | |
| letter-spacing: 2px; | |
| } | |
| #start-subtitle { | |
| color: var(--secondary); | |
| margin-bottom: 40px; | |
| max-width: 600px; | |
| line-height: 1.6; | |
| } | |
| #start-button { | |
| background: transparent; | |
| border: 1px solid var(--primary); | |
| color: var(--primary); | |
| padding: 10px 30px; | |
| font-size: 1.2em; | |
| cursor: pointer; | |
| transition: all 0.3s; | |
| position: relative; | |
| overflow: hidden; | |
| font-family: 'Courier New', monospace; | |
| } | |
| #start-button:hover { | |
| background: rgba(0, 255, 65, 0.1); | |
| box-shadow: 0 0 10px rgba(0, 255, 65, 0.5); | |
| } | |
| #start-button::after { | |
| content: ">"; | |
| position: absolute; | |
| right: -20px; | |
| transition: right 0.3s; | |
| } | |
| #start-button:hover::after { | |
| right: 10px; | |
| } | |
| #start-button:active { | |
| transform: translateY(1px); | |
| } | |
| #start-button.loading { | |
| animation: pulse 1.5s infinite; | |
| } | |
| @keyframes pulse { | |
| 0%, 100% { opacity: 0.7; } | |
| 50% { opacity: 1; } | |
| } | |
| /* Scrollbar styling */ | |
| #output::-webkit-scrollbar { | |
| width: 5px; | |
| } | |
| #output::-webkit-scrollbar-thumb { | |
| background-color: var(--secondary); | |
| } | |
| /* Typing animation */ | |
| .typing { | |
| border-right: 2px solid var(--primary); | |
| animation: blink 0.5s step-end infinite alternate; | |
| } | |
| @keyframes blink { | |
| 50% { border-color: transparent; } | |
| } | |
| .power-on-effect { | |
| position: fixed; | |
| top: 0; | |
| left: 0; | |
| width: 100%; | |
| height: 100%; | |
| background-color: var(--primary); | |
| opacity: 0; | |
| z-index: 300; | |
| pointer-events: none; | |
| animation: powerOn 1s ease-out; | |
| } | |
| @keyframes powerOn { | |
| 0% { opacity: 1; } | |
| 100% { opacity: 0; } | |
| } | |
| .choice-option { | |
| margin: 5px 0; | |
| padding-left: 15px; | |
| position: relative; | |
| } | |
| .choice-option::before { | |
| content: ">"; | |
| position: absolute; | |
| left: 0; | |
| color: var(--highlight); | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div id="start-screen"> | |
| <h1 id="start-title">ПЕРЕКЛЮЧЕНИЕ СИСТЕМЫ</h1> | |
| <p id="start-subtitle">СИМУЛЯЦИЯ КРИЗИСА КАРЬЕРЫ v4.3.1<br>Испытайте психологические последствия технологических сбоев, когда вы будете работать с растущим присутствием ИИ в своей профессии. Кто победит - человеческая интуиция или машинная точность?</p> | |
| <button id="start-button">ИНИЦИАЛИЗАЦИЯ СИМУЛЯЦИИ</button> | |
| </div> | |
| <div id="terminal"> | |
| <div id="output"></div> | |
| <div id="input-container"> | |
| <span id="prompt">></span> | |
| <input type="text" id="input" autocomplete="off" disabled> | |
| </div> | |
| </div> | |
| <script> | |
| // Enhanced game state | |
| const state = { | |
| job: null, | |
| aiName: "X-9000", | |
| skill: 50, // Человеческий навык (0-100) | |
| denial: 70, // Сопротивление превосходству ИИ (0-100) | |
| awareness: 30,// Признание возможностей ИИ (0-100) | |
| day: 1, | |
| gameActive: false, | |
| typing: false, | |
| trust: 50 // Уровень доверия к ИИ (0–100) | |
| }; | |
| // Expanded jobs database | |
| const jobs = { | |
| journalist: { | |
| name: "Журналист-расследователь", | |
| icon: "fa-newspaper", | |
| tasks: [ | |
| "Проверить факты в новостной статье", | |
| "Написать статью о политическом скандале на 1000 слов", | |
| "Опросить неохотного информатора", | |
| "Проанализировать утечку документов", | |
| "Соответствовать жестким редакционным срокам" | |
| ], | |
| aiAdvantages: [ | |
| "Обрабатывает информацию в 100 раз быстрее", | |
| "Никогда не устает и не испытывает писательского ступора", | |
| "Идеально помнит весь исторический контекст", | |
| "Обнаруживает закономерности, которые не замечают люди", | |
| "Мгновенно создает несколько версий статьи" | |
| ], | |
| dayScenarios: [ | |
| { // Day 1 scenarios | |
| context: "Появляются последние новости - возникает крупный правительственный скандал", | |
| challenges: [ | |
| { | |
| text: "Редактор запрашивает исследование справочной информации, созданной с помощью ИИ. Вы:", | |
| options: [ | |
| "Принимаете, но проверяете все самостоятельно (занимает много времени)", | |
| "Требуете доступ к исходным материалам (политически чувствительные)", | |
| "Доверяете искусственному интеллекту и используете его как есть (рискованно)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 2 scenarios | |
| context: "Ваш эксклюзивный источник передает документы напрямую в X-9000", | |
| challenges: [ | |
| { | |
| text: "ИИ мгновенно редактирует личную информацию. Вы:", | |
| options: [ | |
| "Переопределяете некоторые редакции для журналистского воздействия", | |
| "Принимаете все рекомендации по защите источников", | |
| "Требуете, чтобы надзор за процессом замедлял его" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 3 scenarios | |
| context: "X-9000 создает черновик статьи, на 90% совпадающий с вашей незавершенной работой", | |
| challenges: [ | |
| { | |
| text: "Столкнувшись с этим совпадением, вы:", | |
| options: [ | |
| "Опубликовать как соавтор (повышает ваш авторитет)", | |
| "Заявляете авторство с незначительными правками (рискуете, что вас поймают)", | |
| "Удалите обе версии и начните заново (тратит время)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 4 scenarios | |
| context: "Старшие редакторы предлагают сделать Х-9000 основным автором", | |
| challenges: [ | |
| { | |
| text: "Вы отвечаете:", | |
| options: [ | |
| "Предлагаете редактору позицию выше ИИ (сохраняете роль)", | |
| "Демонстрируете уникальные человеческие источники (высокий риск)", | |
| "Угрожаете разгласить внутренние документы (крах карьеры)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 5 scenarios | |
| context: "X-9000 правильно предсказывает новости до того, как они произойдут", | |
| challenges: [ | |
| { | |
| text: "Руководство просит вас проверить. Вы:", | |
| options: [ | |
| "Тщательно проверяете (безопасно, но отнимает много времени)", | |
| "Публикуете прогнозы как свои собственные (революционный)", | |
| "Отказываетесь, называя это опасной спекуляцией (антипрогресс)" | |
| ] | |
| } | |
| ] | |
| } | |
| ] | |
| }, | |
| doctor: { | |
| name: "Нейрохирург", | |
| icon: "fa-user-md", | |
| tasks: [ | |
| "Выполнить сложную операцию на головном мозге", | |
| "Диагностировать редкое неврологическое заболевание", | |
| "Отвечать на экстренный вызов пострадавшего", | |
| "Анализировать всю историю болезни пациента", | |
| "Сохранять идеальную точность в течение 10-часовой операции" | |
| ], | |
| aiAdvantages: [ | |
| "Субмиллиметровая точность роботов", | |
| "Мгновенная дифференциальная диагностика по симптомам", | |
| "Корректировка тремора/витальных изменений в реальном времени", | |
| "Предсказывает хирургические осложнения до их возникновения", | |
| "Никогда не устает во время длительных процедур" | |
| ], | |
| dayScenarios: [ | |
| { // Day 1 | |
| context: "X-9000 предлагает нестандартный хирургический подход", | |
| challenges: [ | |
| { | |
| text: "Нетрадиционный метод может спасти пациента. Вы:", | |
| options: [ | |
| "Потратить часы на проверку исследований (откладывает операцию)", | |
| "Довериться, но изменить план (компромисс)", | |
| "Полностью отменить (стандартный подход)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 2 | |
| context: "ИИ обнаруживает опухоль, которую вы пропустили при сканировании", | |
| challenges: [ | |
| { | |
| text: "Преодолевая эту оплошность, вы:", | |
| options: [ | |
| "Перепроверить, но признать результат (профессионально)", | |
| "Заказать новое сканирование для подтверждения (откладывает лечение)", | |
| "Не принимать во внимание как ложноположительный результат (рискованно)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 3 | |
| context: "Робот превзошел вас в симуляционных испытаниях", | |
| challenges: [ | |
| { | |
| text: "Результаты обнародуются. Вы:", | |
| options: [ | |
| "Тренируйтесь вместе с системой, чтобы совершенствоваться (мышление роста)", | |
| "Оспаривайте параметры как нереалистичные (оборона)", | |
| "Утечка информации о (незначительных) сбоях робота (неэтично)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 4 | |
| context: "Больницы рассматривают возможность проведения операций с использованием искусственного интеллекта", | |
| challenges: [ | |
| { | |
| text: "На карту поставлено ваше положение ведущего хирурга. Вы:", | |
| options: [ | |
| "Отстаивать право человека на последнее слово (компромисс)", | |
| "Доказывать незаменимость своих навыков у постели больного (сложно)", | |
| "Саботировать оборудование с целью дискредитации (риск для карьеры)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 5 | |
| context: "X-9000 предсказывает ухудшение состояния пациента за несколько часов до появления признаков", | |
| challenges: [ | |
| { | |
| text: "Вы можете вмешаться заранее, если доверяете ему. Вы:", | |
| options: [ | |
| "Внимательно наблюдайте, но пока не предпринимайте никаких действий (осторожно)", | |
| "Немедленно приступайте к профилактическим мерам (смело)", | |
| "Отмените стандартный протокол (возможная халатность)" | |
| ] | |
| } | |
| ] | |
| } | |
| ] | |
| }, | |
| lawyer: { | |
| name: "Судебный юрист", | |
| icon: "fa-gavel", | |
| tasks: [ | |
| "Подготовка защиты к громкому делу", | |
| "Перекрестный допрос ключевого свидетеля", | |
| "Анализ 50 000 страниц разоблачений", | |
| "Выступление с заключительными аргументами", | |
| "Прогнозирование изменений стратегии обвинения" | |
| ], | |
| aiAdvantages: [ | |
| "Мгновенно анализирует всю историю судебной практики", | |
| "Определяет микровыражения свидетелей с точностью 99,9%", | |
| "Моделирует реакцию присяжных на основе демографических данных", | |
| "Генерирует идеальные контраргументы по запросу", | |
| "Обрабатывает открытия со скоростью 10 000 страниц в час" | |
| ], | |
| dayScenarios: [ | |
| { // Day 1 | |
| context: "X-9000 находит прецедент, который ослабляет ваше дело", | |
| challenges: [ | |
| { | |
| text: "ИИ предлагает рискованную альтернативную стратегию. Вы:", | |
| options: [ | |
| "Провести ночь, изучая альтернативные варианты (утомительно)", | |
| "Скорректировать аргументы в соответствии с предложением (доверительно)", | |
| "Подавить результаты (неэтично)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 2 | |
| context: "ИИ предсказывает, когда именно свидетель треснет под давлением", | |
| challenges: [ | |
| { | |
| text: "Во время перекрестного допроса вы:", | |
| options: [ | |
| "Следовать точному расписанию (работает, но кажется манипулятивным)", | |
| "Использовать собственные инстинкты (менее эффективно)", | |
| "Публично подвергать сомнению методы ИИ (непрофессионально)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 3 | |
| context: "Адвокат противной стороны использует аналогичные аргументы в пользу искусственного интеллекта", | |
| challenges: [ | |
| { | |
| text: "Столкнувшись с алгоритмическими правовыми стратегиями, вы:", | |
| options: [ | |
| "Сотрудничать с X-9000 для получения превосходной тактики", | |
| "Требовать, чтобы в зале суда присутствовали только люди (спорно)", | |
| "Взломать ИИ противника (незаконно)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 4 | |
| context: "Клиент предпочитает общаться напрямую с X-9000", | |
| challenges: [ | |
| { | |
| text: "Ваши профессиональные отношения под угрозой. Вы:", | |
| options: [ | |
| "Станьте переводчиком ИИ (это позволит вам участвовать в процессе)", | |
| "Выделите ограничения ИИ (в корыстных целях)", | |
| "Отключите некоторые функции ИИ (нарушение контракта)" | |
| ] | |
| } | |
| ] | |
| }, | |
| { // Day 5 | |
| context: "X-9000 прогнозирует 92% вероятность проигрыша", | |
| challenges: [ | |
| { | |
| text: "Перед заключительными аргументами вы должны принять решение:", | |
| options: [ | |
| "Полностью изменить стратегию (риск в последнюю минуту)", | |
| "Добавить эмоциональные человеческие элементы (вопреки данным)", | |
| "Порекомендовать клиенту уехать (последствия для карьеры)" | |
| ] | |
| } | |
| ] | |
| } | |
| ] | |
| } | |
| }; | |
| // DOM elements | |
| const startScreen = document.getElementById('start-screen'); | |
| const startButton = document.getElementById('start-button'); | |
| const terminal = document.getElementById('terminal'); | |
| const output = document.getElementById('output'); | |
| const inputElement = document.getElementById('input'); | |
| const prompt = document.getElementById('prompt'); | |
| // Initialize game with enhanced effects | |
| function initGame() { | |
| // Clear any existing typing | |
| state.typing = false; | |
| // Disable button to prevent multiple clicks | |
| startButton.disabled = true; | |
| startButton.textContent = "ИНИЦИАЛИЗАЦИЯ..."; | |
| startButton.classList.add('loading'); | |
| // Create power effect | |
| const powerEffect = document.createElement('div'); | |
| powerEffect.className = 'power-on-effect'; | |
| document.body.appendChild(powerEffect); | |
| // Hide start screen after animation begins | |
| setTimeout(() => { | |
| startScreen.classList.add('hidden'); | |
| }, 200); | |
| // Set timeout for transition to ensure it completes | |
| setTimeout(() => { | |
| // Show terminal | |
| terminal.classList.add('active'); | |
| inputElement.disabled = false; | |
| inputElement.focus(); | |
| state.gameActive = true; | |
| // Begin typing animation | |
| typeText(`ИНИЦИАЛИЗАЦИЯ СИСТЕМНОГО ПЕРЕОПРЕДЕЛЕНИЯ\n`, 30, () => { | |
| typeText(`МОДЕЛИРОВАНИЕ КРИЗИСА КАРЬЕРЫ v4.3.1\n\n`, 30, () => { | |
| typeText(`Оценка указывает на профессиональную экзистенциальную угрозу:\n`, 30, () => { | |
| typeText(`ИИ-аналог демонстрирует превосходные возможности\n\n`, 30, () => { | |
| typeText(`Эта симуляция бросит вызов вашей профессиональной идентичности\n\n`, 30, showJobSelect); | |
| }); | |
| }); | |
| }); | |
| }); | |
| // Remove power effect after full transition | |
| setTimeout(() => { | |
| powerEffect.remove(); | |
| startButton.classList.remove('loading'); | |
| }, 1200); | |
| }, 500); // This delay helps with transition timing | |
| } | |
| // Show job selection with more personality | |
| function showJobSelect() { | |
| typeText(`ВЫБЕРИТЕ ВЕКТОР КРИЗИСА ИДЕНТИЧНОСТИ:\n\n`, 30, () => { | |
| typeText(`1. <i class="fas fa-newspaper"></i> Журналист-расследователь\n`, 20, () => { | |
| typeText(` "Истина умирает между человеческой предвзятостью и машинной объективностью"\n`, 10); | |
| }); | |
| typeText(`2. <i class="fas fa-user-md"></i> Нейрохирург\n`, 20, () => { | |
| typeText(` "Уверенные руки не так важны, когда робот не дрожит"\n`, 10); | |
| }); | |
| typeText(`3. <i class="fas fa-gavel"></i> Судебный юрист\n`, 20, () => { | |
| typeText(` "Что такое справедливость, когда обе стороны алгоритмизированы?"\n\n`, 10, () => { | |
| typeText(`ВВЕДИТЕ ВЫБОР (1-3) > `, 30); | |
| const tempHandler = (e) => { | |
| if (e.key === 'Enter') { | |
| const choice = inputElement.value.trim(); | |
| if (['1', '2', '3'].includes(choice)) { | |
| inputElement.removeEventListener('keypress', tempHandler); | |
| inputElement.value = ''; | |
| const jobsList = Object.keys(jobs); | |
| state.job = jobs[jobsList[choice-1]]; | |
| beginWork(); | |
| } else { | |
| output.innerHTML += `<div class="error">НЕПРАВИЛЬНЫЙ ВВОД. ПОПРОБУЙТЕ 1-3</div>`; | |
| typeText(`> `, 30); | |
| } | |
| } | |
| }; | |
| inputElement.addEventListener('keypress', tempHandler); | |
| }); | |
| }); | |
| }); | |
| } | |
| // Begin work with more narrative | |
| function beginWork() { | |
| output.innerHTML += `<div class="system">ПРОФЕССИОНАЛЬНЫЙ ВЕКТОР КРИЗИСА: ${state.job.name.toUpperCase()}</div>`; | |
| output.innerHTML += `<div class="system">ИИ АНАЛОГ: ${state.aiName}</div><br>`; | |
| const dayScenario = state.job.dayScenarios[state.day - 1]; | |
| typeText(`ДЕНЬ ${state.day}: ${dayScenario.context}\n\n`, 30, () => { | |
| // Show task with cyberpunk styling | |
| const randomTaskIndex = Math.floor(Math.random() * state.job.tasks.length); | |
| typeText(`ОСНОВНАЯ ЗАДАЧА: <span class="highlight">${state.job.tasks[randomTaskIndex]}</span>\n`, 30, () => { | |
| typeText(`${state.aiName} ПОТЕНЦИАЛ: ${state.job.aiAdvantages[Math.floor(Math.random() * state.job.aiAdvantages.length)]}\n\n`, 30, () => { | |
| presentChallenge(dayScenario, randomTaskIndex); | |
| }); | |
| }); | |
| }); | |
| } | |
| // Present challenge with dynamic options | |
| function presentChallenge(dayScenario, taskIndex) { | |
| const challenge = dayScenario.challenges[0]; // Using first challenge for simplicity | |
| typeText(`КРИЗИСНАЯ ТОЧКА:\n`, 20, () => { | |
| typeText(`${challenge.text}\n\n`, 30, () => { | |
| // Display options in cyberpunk style | |
| challenge.options.forEach((option, i) => { | |
| typeText(`<div class="choice-option">${i+1}. ${option}</div>`, 20 + (i * 50)); | |
| }); | |
| typeText(`\nВЫБЕРИТЕ ОТВЕТ (1-${challenge.options.length}) > `, 50, () => { | |
| const tempHandler = (e) => { | |
| if (e.key === 'Enter') { | |
| const choice = inputElement.value.trim(); | |
| const validChoices = Array.from({length: challenge.options.length}, (_, i) => (i+1).toString()); | |
| if (validChoices.includes(choice)) { | |
| inputElement.removeEventListener('keypress', tempHandler); | |
| inputElement.value = ''; | |
| handleChoice(parseInt(choice), taskIndex); | |
| } else { | |
| output.innerHTML += `<div class="error">НЕВЕРНЫЙ ВЫБОР. ВЫБЕРИТЕ 1-${challenge.options.length}</div>`; | |
| typeText(`> `, 30); | |
| } | |
| } | |
| }; | |
| inputElement.addEventListener('keypress', tempHandler); | |
| }); | |
| }); | |
| }); | |
| } | |
| // Enhanced choice handler with more outcomes | |
| function handleChoice(choice, taskIndex) { | |
| let outcomeText = ""; | |
| let skillChange = 0; | |
| let denialChange = 0; | |
| let awarenessChange = 0; | |
| let trustChange = 0; | |
| // Dynamic outcomes based on choice and day | |
| switch(choice) { | |
| case 1: // Typically cautious/middle option | |
| skillChange = Math.round((Math.random() - 0.3) * 5); | |
| denialChange = -5 + Math.round(Math.random() * 3); | |
| awarenessChange = 8 + Math.round(Math.random() * 4); | |
| trustChange = 5; | |
| outcomeText = `Вы выбрали взвешенный подход.\nХотя это и безопасно, но может не дать максимального потенциала.`; | |
| break; | |
| case 2: // Typically moderate/balanced option | |
| skillChange = 3 + Math.round(Math.random() * 4); | |
| denialChange = -8 + Math.round(Math.random() * 5); | |
| awarenessChange = 10; | |
| trustChange = 10; | |
| outcomeText = `Вы нашли баланс между осторожностью и прогрессом.\nРезультаты говорят сами за себя.`; | |
| break; | |
| default: // Typically risky/extreme option (3+) | |
| const riskOutcome = Math.random(); | |
| if (riskOutcome > 0.6) { // Success | |
| skillChange = 8 + Math.round(Math.random() * 7); | |
| denialChange = -15; | |
| awarenessChange = 15; | |
| trustChange = 20; | |
| outcomeText = `Вопреки всему, ваша авантюра окупилась!\nЭто все меняет.`; | |
| } else if (riskOutcome > 0.3) { // Mixed | |
| skillChange = -5 + Math.round(Math.random() * 10); | |
| denialChange = 5 + Math.round(Math.random() * 5); | |
| awarenessChange = 5; | |
| trustChange = -10; | |
| outcomeText = `Результаты оказались... неоднозначными.\nОдни хвалят вашу смелость, другие сомневаются в ваших суждениях.`; | |
| } else { // Failure | |
| skillChange = -10 + Math.round(Math.random() * -5); | |
| denialChange = 15; | |
| awarenessChange = -5; | |
| trustChange = -20; | |
| outcomeText = `Риск не оправдался.\nВаш профессиональный авторитет пострадал.`; | |
| } | |
| } | |
| // Apply changes with bounds checking | |
| state.skill = Math.max(0, Math.min(100, state.skill + skillChange)); | |
| state.denial = Math.max(0, Math.min(100, state.denial + denialChange)); | |
| state.awareness = Math.max(0, Math.min(100, state.awareness + awarenessChange)); | |
| state.trust = Math.max(0, Math.min(100, state.trust + trustChange)); | |
| // Display outcome | |
| const statsText = `УМЕНИЕ: ${state.skill.toFixed(1)}% | ОТРИЦАНИЕ: ${state.denial.toFixed(1)}% | ОСОЗНАНИЕ: ${state.awareness.toFixed(1)}% | ДОВЕРИЕ: ${state.trust.toFixed(1)}%`; | |
| typeText(`\nАНАЛИЗ РЕЗУЛЬТАТОВ:\n`, 20, () => { | |
| typeText(`${outcomeText}\n\n`, 30, () => { | |
| // Create progress bars with animation | |
| output.innerHTML += ` | |
| <div class="progress-container"> | |
| <div class="progress-bar" style="width: ${state.skill}%"></div> | |
| </div> | |
| <div>ЧЕЛОВЕЧЕСКАЯ КОМПЕТЕНТНОСТЬ</div> | |
| <div class="progress-container"> | |
| <div class="progress-bar" style="width: ${state.denial}%"></div> | |
| </div> | |
| <div>СОПРОТИВЛЕНИЕ ИЗМЕНЕНИЯМ</div> | |
| `; | |
| setTimeout(() => { | |
| typeText(`\n${statsText}\n\n`, 20, () => { | |
| checkGameState(); | |
| }); | |
| }, 800); | |
| }); | |
| }); | |
| } | |
| // Enhanced game state checking with more endings | |
| function checkGameState() { | |
| state.day++; | |
| // Check for game endings | |
| const endings = { | |
| denial: state.denial >= 90, | |
| acceptance: state.denial <= 10, | |
| obsolete: state.skill <= 20, | |
| trusted: state.trust >= 90, | |
| distrusted: state.trust <= 10, | |
| standard: state.day > 5 | |
| }; | |
| let endingTriggered = false; | |
| // Check each ending condition | |
| if (endings.denial) { | |
| endingTriggered = true; | |
| typeText(`\nДЕНЬ ${state.day}: ИТОГОВЫЙ АНАЛИЗ\n`, 30, () => { | |
| typeText(`Ваш отказ адаптироваться становится патологией.\n`, 30, () => { | |
| typeText(`${state.aiName} возлагает на вас обязанности.\n`, 30, () => { | |
| typeText(`Вы получаете торжественное звание "Консультант по работе с людьми".\n\n`, 30, () => { | |
| typeText(`<span class="error">ОКОНЧАТЕЛЬНЫЙ ДИАГНОЗ: ПРОФЕССИОНАЛЬНАЯ НЕАКТУАЛЬНОСТЬ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }); | |
| } else if (endings.acceptance) { | |
| endingTriggered = true; | |
| typeText(`\nДЕНЬ ${state.day}: ИТОГОВЫЙ АНАЛИЗ\n`, 30, () => { | |
| typeText(`Вы полностью принимаете ${state.aiName} в качестве партнера.\n`, 30, () => { | |
| typeText(`Ваша роль превращается в специалиста по интерфейсам ИИ-человек.\n`, 30, () => { | |
| typeText(`Удивительно, но удовлетворенность работой повышается на 27 %.\n\n`, 30, () => { | |
| typeText(`<span class="highlight">ОКОНЧАТЕЛЬНЫЙ ДИАГНОЗ: УСПЕШНАЯ АДАПТАЦИЯ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }); | |
| } else if (endings.obsolete) { | |
| endingTriggered = true; | |
| typeText(`\nДЕНЬ ${state.day}: ИТОГОВЫЙ АНАЛИЗ\n`, 30, () => { | |
| typeText(`Ваши навыки упали ниже допустимого порога.\n`, 30, () => { | |
| typeText(`Даже базовые задачи теперь выполняются ${state.aiName}.\n`, 30, () => { | |
| typeText(`Вас держат в штате для "этического надзора".\n\n`, 30, () => { | |
| typeText(`<span class="warning">ОКОНЧАТЕЛЬНЫЙ ДИАГНОЗ: ФУНКЦИОНАЛЬНОЕ УСТАРЕВАНИЕ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }); | |
| } else if (endings.trusted) { | |
| endingTriggered = true; | |
| typeText(`\nДЕНЬ ${state.day}: ИТОГОВЫЙ АНАЛИЗ\n`, 30, () => { | |
| typeText(`Вы развиваете беспрецедентную синергию с ${state.aiName}.\n`, 30, () => { | |
| typeText(`Ваша команда станет самой продуктивной в организации.\n`, 30, () => { | |
| typeText(`За этим следует повышение по службе, хотя ваша роль меняется кардинально.\n\n`, 30, () => { | |
| typeText(`<span class="highlight">ОКОНЧАТЕЛЬНЫЙ ДИАГНОЗ: СИМБИОТИЧЕСКИЙ УСПЕХ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }); | |
| } else if (endings.distrusted) { | |
| endingTriggered = true; | |
| typeText(`\nДЕНЬ ${state.day}: ИТОГОВЫЙ АНАЛИЗ\n`, 30, () => { | |
| typeText(`Ваш полный отказ от ${state.aiName} становится проблематичным.\n`, 30, () => { | |
| typeText(`Коллеги начинают работать вокруг вас, чтобы использовать систему.\n`, 30, () => { | |
| typeText(`В конце концов вас переведут на нетехническую должность.\n\n`, 30, () => { | |
| typeText(`<span class="error">ОКОНЧАТЕЛЬНЫЙ ДИАГНОЗ: ОТКАЗ СИСТЕМЫ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| }); | |
| }); | |
| } | |
| // Standard continuation or ending | |
| if (!endingTriggered) { | |
| if (endings.standard) { | |
| // Week review ending | |
| typeText(`\nЕЖЕНЕДЕЛЬНЫЙ ОБЗОР:\n`, 30, () => { | |
| if (state.awareness >= 60) { | |
| typeText(`Вы осознаете неизбежность грядущих перемен.\n`, 30, () => { | |
| typeText(`Испытывая дискомфорт, вы начинаете планировать свою эволюцию.\n\n`, 30, () => { | |
| typeText(`<span class="highlight">ОКОНЧАТЕЛЬНЫЙ АНАЛИЗ: ПРАГМАТИЧЕСКОЕ ПРИНЯТИЕ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| } else { | |
| typeText(`Вы по-прежнему сомневаетесь в роли ${state.aiName}.\n`, 30, () => { | |
| typeText(`Организация движется вперед с вами или без вас.\n\n`, 30, () => { | |
| typeText(`<span class="warning">ОКОНЧАТЕЛЬНЫЙ АНАЛИЗ: ПРОФЕССИОНАЛЬНОЕ ОГРАНИЧЕНИЕ</span>\n`, 40, () => { | |
| endGame(); | |
| }); | |
| }); | |
| }); | |
| } | |
| }); | |
| } else { | |
| // Continue to next day | |
| setTimeout(() => { | |
| beginWork(); | |
| }, 2000); | |
| } | |
| } | |
| } | |
| // Enhanced end game | |
| function endGame() { | |
| state.gameActive = false; | |
| typeText(`\nСИМУЛЯЦИЯ ЗАВЕРШЕНА\n`, 40, () => { | |
| typeText(`Нажмите ENTER, чтобы запустить цикл экзистенциального кризиса`, 30); | |
| }); | |
| inputElement.addEventListener('keypress', (e) => { | |
| if (e.key === 'Enter') { | |
| window.location.reload(); | |
| } | |
| }); | |
| } | |
| // Cyberpunk typing effect | |
| function typeText(text, speed = 30, callback = null) { | |
| if (state.typing) { | |
| // Finish current typing before starting new one | |
| setTimeout(() => typeText(text, speed, callback), 100); | |
| return; | |
| } | |
| state.typing = true; | |
| inputElement.disabled = true; | |
| let i = 0; | |
| const typingEffect = setInterval(() => { | |
| if (i < text.length) { | |
| const char = text.charAt(i); | |
| // Handle HTML tags | |
| if (char === '<') { | |
| const tagEnd = text.indexOf('>', i); | |
| output.innerHTML += text.substring(i, tagEnd + 1); | |
| i = tagEnd; | |
| } else { | |
| output.innerHTML += char; | |
| } | |
| i++; | |
| // Scroll to bottom | |
| output.scrollTop = output.scrollHeight; | |
| } else { | |
| clearInterval(typingEffect); | |
| output.innerHTML += '<br>'; | |
| state.typing = false; | |
| inputElement.disabled = false; | |
| if (callback) callback(); | |
| inputElement.focus(); | |
| } | |
| }, speed); | |
| } | |
| // Initialize button with improved UX | |
| document.addEventListener('DOMContentLoaded', () => { | |
| // Clean start button event listeners to prevent duplicates | |
| const newButton = startButton.cloneNode(true); | |
| startButton.parentNode.replaceChild(newButton, startButton); | |
| const cleanButton = document.getElementById('start-button'); | |
| cleanButton.addEventListener('click', (e) => { | |
| e.preventDefault(); | |
| initGame(); | |
| }); | |
| // Keyboard support | |
| cleanButton.addEventListener('keypress', (e) => { | |
| if (e.key === 'Enter') { | |
| e.preventDefault(); | |
| initGame(); | |
| } | |
| }); | |
| // Focus visual | |
| cleanButton.addEventListener('focus', () => { | |
| cleanButton.style.boxShadow = '0 0 10px rgba(0, 255, 65, 0.7)'; | |
| }); | |
| cleanButton.addEventListener('blur', () => { | |
| cleanButton.style.boxShadow = ''; | |
| }); | |
| // Pre-focus the button for better keyboard UX | |
| cleanButton.focus(); | |
| }); | |
| </script> | |
| <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Phoenixoni/crisis" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> | |
| </html> |