ИГРОВАЯ СИСТЕМА

ТехноКрыльяРоссии

Загрузка миссии и подготовка игрового мира

Инициализация интерфейса…
0%
Подготовка ядра
  1. Запуск ядра
  2. Загрузка героев
  3. Подключение модулей
  4. Синхронизация миссий
  5. Открытие штаба
Мультфильмы о цифровой безопасности
Мяу! Умный Герой! Поиграй со мной!
Три режима · три котика
Информатика
Инфобез
Фишинг
Дополнительные
GAME
игровые модули
(function(){ 'use strict'; var INFO_META = { hint:{title:'Подсказка', desc:'Открывает аккуратный намёк к текущей карточке и не раскрывает ответ полностью.', count:'2', active:true}, scan:{title:'Сканер', desc:'Подсвечивает отправителя, тему, ссылку и подозрительные слова.', count:'1', active:true}, shield:{title:'Щит', desc:'Восстанавливает 20 HP, если здоровье ниже 100.', count:'1', active:true}, skiptoken:{title:'Жетон', desc:'Возвращает один потраченный пропуск.', count:'1', active:true}, antivirus:{title:'Антивирус', desc:'Слот под будущую механику.', count:'0', active:false}, flash:{title:'Флешка', desc:'Короткая памятка по безопасному ответу.', count:'0', active:true} }; function qs(s, r){ return (r || document).querySelector(s); } function qsa(s, r){ return Array.prototype.slice.call((r || document).querySelectorAll(s)); } function count(card){ var el = card && qs('[data-info-count]', card); var n = el ? parseInt((el.textContent || '0').replace(/\D+/g,''), 10) : 0; return Number.isFinite(n) ? n : 0; } function setCount(card, n){ if(!card) return; var el = qs('[data-info-count]', card); if(el) el.textContent = String(Math.max(0, n|0)); card.classList.toggle('is-empty', (n|0) <= 0); } function selectedCard(){ return qs('#infoInvGrid .info-inv-card.is-selected') || qs('#infoInvGrid .info-inv-card'); } function keyOf(card){ return card ? card.getAttribute('data-info-item') : 'hint'; } function setStatus(text, tone){ var st = qs('#infoInvStatus'); if(!st) return; st.textContent = text; st.classList.toggle('is-good', tone === 'good'); st.classList.toggle('is-warn', tone === 'warn'); } function syncFeature(){ var card = selectedCard(); var key = keyOf(card); var meta = INFO_META[key] || INFO_META.hint; var n = count(card); var title = qs('#infoInvFeatureTitle'); if(title) title.textContent = meta.title; var desc = qs('#infoInvFeatureDesc'); if(desc) desc.textContent = meta.desc; var cnt = qs('#infoInvFeatureCount'); if(cnt) cnt.textContent = 'x' + n; var use = qs('#infoInvUseBtn'); if(use){ use.disabled = !meta.active || n <= 0 || !!qs('#infoSecGame .panel[data-step="play"].tk-terminal-active'); use.textContent = meta.active ? 'Использовать' : 'Скоро'; } } function selectCard(card){ if(!card) return; qsa('#infoInvGrid .info-inv-card').forEach(function(c){ c.classList.toggle('is-selected', c === card); }); syncFeature(); } function pulseTargets(){ qsa('#infoMsgFromName,#infoMsgFromEmail,#infoMsgSubject,#infoMsgBody,#infoMsgLink').forEach(function(el){ if(!el) return; el.style.outline='2px solid rgba(124,232,255,.95)'; el.style.boxShadow='0 0 0 4px rgba(124,232,255,.13), 0 0 24px rgba(124,232,255,.22)'; setTimeout(function(){ el.style.outline=''; el.style.boxShadow=''; },1350); }); } function writeHint(text){ var link = qs('#infoMsgLink'); if(link){ link.textContent = text; link.hidden = false; link.classList.add('is-on'); } } function heal(){ try{ if(window.__tkHpHeal && window.__tkHpHeal('info',20)) return true; }catch(_e){} var val=qs('#infoHpVal'), fill=qs('#infoHpFill'); if(!val||!fill) return false; var cur=parseInt(val.textContent||'0',10); if(!Number.isFinite(cur)) cur=0; var next=Math.min(100,cur+20); val.textContent=String(next); fill.style.width=next+'%'; var bar=fill.closest('.hpbar'); if(bar) bar.setAttribute('aria-valuenow',String(next)); return next>cur; } function applyDirectUse(){ var card=selectedCard(); if(!card) return false; var key=keyOf(card), meta=INFO_META[key]||INFO_META.hint, n=count(card); if(!meta.active){ setStatus('Этот предмет пока не активен.','warn'); return false; } if(n<=0){ setStatus('Предмет закончился — выбери другой.','warn'); return false; } var consumed=true; if(key==='hint'){ writeHint('💡 Подсказка: проверь отправителя, тему, ссылку, спешку и просьбу о секретных данных.'); setStatus('Подсказка активирована.','good'); } else if(key==='scan'){ pulseTargets(); setStatus('Сканер активирован: важные зоны подсвечены.','good'); } else if(key==='shield'){ var ok=heal(); consumed=ok; setStatus(ok?'Щит активирован: +20 HP.':'Щит готов, но здоровье уже полное или недоступно.', ok?'good':'warn'); } else if(key==='skiptoken'){ var btn=qs('#infoBtnSkip'); var txt=btn?(btn.textContent||''):''; var m=txt.match(/\((\d+)\s*\/\s*3\)/); if(btn&&m&&Number(m[1])>0){ var left=Math.max(0,Number(m[1])-1); btn.textContent=txt.replace(/\(\s*\d+\s*\/\s*3\s*\)/,'('+left+'/3)'); btn.disabled=false; setStatus('Жетон сработал: один пропуск возвращён.','good'); } else { consumed=false; setStatus('Пропуски ещё не тратились — жетон лучше оставить.','warn'); } } else if(key==='flash'){ writeHint('💾 Памятка: безопасное сообщение не просит пароль, код из SMS и не давит срочностью.'); setStatus('Флешка знаний открыта.','good'); } if(consumed){ setCount(card, Math.max(0,n-1)); syncFeature(); } return consumed; } function clearPortal(reason){ try{ qsa('.tk-info-teleport-fx').forEach(function(fx){ fx.dataset.tkV132Release=reason||'release'; fx.classList.add('is-fading'); fx.style.pointerEvents='none'; setTimeout(function(){ try{ fx.remove(); }catch(_e){} },80); }); }catch(_e){} try{ document.body.classList.remove('tk-teleport-running'); }catch(_e){} try{ var bd=qs('#infoBackdrop'); if(bd) bd.classList.remove('tk-info-teleporting'); }catch(_e){} try{ window.__tkInfoTeleportLaunchActive=false; }catch(_e){} ['infoToPlayBtn','infoResetBtn'].forEach(function(id){ var b=document.getElementById(id); if(b){ b.removeAttribute('aria-busy'); if(id==='infoResetBtn') b.disabled=false; } }); } function bind(){ if(document.documentElement.dataset.tkV132StableBound) return; document.documentElement.dataset.tkV132StableBound='1'; document.addEventListener('click',function(e){ var card=e.target&&e.target.closest&&e.target.closest('#infoInvGrid .info-inv-card[data-info-item]'); if(card) selectCard(card); },true); document.addEventListener('click',function(e){ var btn=e.target&&e.target.closest&&e.target.closest('#infoInvUseBtn'); if(!btn||btn.disabled) return; var st=qs('#infoInvStatus'); var before=st?st.textContent:''; var c=selectedCard(); var beforeCount=count(c); setTimeout(function(){ var after=st?st.textContent:''; var afterCount=count(c); if(after===before&&afterCount===beforeCount) applyDirectUse(); syncFeature(); },90); },true); document.addEventListener('click',function(e){ /* tk-v139: removed legacy play portal watchdog; game launch is deterministic now. */ if(e.target&&e.target.closest&&e.target.closest('#infoResetBtn')){ try{ localStorage.removeItem('tk_infosec_progress_v1'); }catch(_e){} setTimeout(function(){ syncFeature(); },250); } },true); qsa('#infoInvGrid,.info-inv-body').forEach(function(scroller){ scroller.addEventListener('wheel',function(ev){ if(scroller.scrollHeight>scroller.clientHeight) ev.stopPropagation(); },{passive:true}); scroller.addEventListener('touchmove',function(ev){ if(scroller.scrollHeight>scroller.clientHeight) ev.stopPropagation(); },{passive:true}); }); } function boot(){ bind(); syncFeature(); [120,400,900,1600].forEach(function(ms){ setTimeout(syncFeature,ms); }); } if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',boot,{once:true}); else boot(); })(); \n\n \n