/
chewy
/
BDZ_GenAI
Обзор
Документация
Войти
/
chewy
/
BDZ_GenAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/events.js
102 строки
4 KB
pichugin.sa
Раскидал все по папкам, чтобы нормально выглядел репозиторий
16 ноя 2025, 21:55
16 ноя 2025, 21:55
bd854ee
Код
Авторство
О чём код?
import * as NOTIF from './notify.js'; import * as HUD from '../hud.js'; import * as E from './engine.js'; import { updateWorldStatus } from './ui.js'; let scheduler = { _signalAudio: null, _nextAt: 0, _running: false }; function ensureSignal(){ if(scheduler._signalAudio) return scheduler._signalAudio; scheduler._signalAudio = new Audio('./wind.mp3'); scheduler._signalAudio.volume = 0.16; return scheduler._signalAudio; } function scheduleNext(){ scheduler._nextAt = Date.now() + (60 + Math.floor(Math.random()*61)) * 1000; } function startEvent(ev){ ensureSignal(); try{ scheduler._signalAudio.currentTime = 0; scheduler._signalAudio.play().catch(()=>{}); }catch(e){} window.__worldEvent = ev; if(ev.type === 'inspector'){ ev.checkInterval = setInterval(()=>{ const noisy = (!E.player.sneak && (Math.hypot(E.player.vx||0,E.player.vy||0) > 18)); if(noisy){ HUD.RuleEngine.changeRep('MiniTribe', -2 * (window.__silenceNightMultiplier || 1.0)); NOTIF.notify('Инспектор заметил шум — штраф репутации', 'warn'); } else { HUD.RuleEngine.changeRep('MiniTribe', 1); NOTIF.notify('Инспектор доволен порядком — +1 репутация', 'success'); } }, 1500); } else if(ev.type === 'song'){ window.__tradeBonus = true; NOTIF.notify('Песня племени — торговля выгоднее на 20s', 'info'); } else if(ev.type === 'breath'){ ev._prevWeather = Object.assign({}, E.weather); E.weather.kind = 'fog'; window.__npcSightModifier = 0.6; window.__giantSpeedMul = 0.85; NOTIF.notify('Дыхание острова — настал краткий туман', 'info'); } ev.expiresAt = Date.now() + (ev.duration * 1000); ev._expiryTimer = setTimeout(()=> endEvent(ev), ev.duration * 1000); } function endEvent(ev){ try{ if(ev.checkInterval) clearInterval(ev.checkInterval); if(ev._expiryTimer) clearTimeout(ev._expiryTimer); if(ev.type === 'song'){ window.__tradeBonus = false; NOTIF.notify('Песня закончилась — торговля в норме', 'info'); } if(ev.type === 'breath'){ if(ev._prevWeather) { E.weather = ev._prevWeather; window.__weatherState = E.weather; } window.__npcSightModifier = (E.weather.kind === 'fog') ? 0.7 : 1.0; window.__giantSpeedMul = (E.weather.kind === 'rain') ? 0.9 : 1.0; NOTIF.notify('Туман рассеялся', 'info'); } }catch(e){} window.__worldEvent = null; scheduleNext(); } function tick(){ const now = Date.now(); if(!window.__worldEvent && now >= scheduler._nextAt){ const roll = Math.random(); let ev; if(roll < 0.36){ ev = {type:'inspector', name:'Инспектор традиций', duration: 10}; } else if(roll < 0.72){ ev = {type:'song', name:'Песнь племени', duration: 20}; } else { ev = {type:'breath', name:'Дыхание острова', duration: 18}; } startEvent(ev); } window.__worldEvent && (window.__worldEvent); // noop to keep reference alive // update HUD world status regularly so countdown refreshes updateWorldStatus && updateWorldStatus(); requestAnimationFrame(tick); } export function startScheduler(){ if(scheduler._running) return; scheduler._running = true; scheduleNext(); requestAnimationFrame(tick); } export function stopScheduler(){ scheduler._running = false; if(scheduler._signalAudio){ try{ scheduler._signalAudio.pause(); }catch(e){} } window.__worldEvent = null; } export default { startScheduler, stopScheduler };