<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<atom:link href="https://alt.bbtalk.me/export.php?type=rss" rel="self" type="application/rss+xml" />
		<title>Альт</title>
		<link>https://alt.bbtalk.me/</link>
		<description>Альт</description>
		<language>ru-ru</language>
		<lastBuildDate>Sun, 24 May 2026 21:41:33 +0300</lastBuildDate>
		<generator>MyBB/mybb.ru</generator>
		<item>
			<title>...</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=622#p622</link>
			<description>&lt;p&gt;//=============================================================================&lt;br /&gt;// NetworkCoop_P2P.js - Версия 15.0: Фикс ИИ (State Machine) и Фикс HP&lt;br /&gt;//=============================================================================&lt;/p&gt;
						&lt;p&gt;(() =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; const NETWORK_EVENT_ID = 1; &lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; const CHAR_LIST = [&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { name: &amp;quot;People2&amp;quot;, index: 0, label: &amp;quot;1. Дед (Воин)&amp;quot;, playerId: 1, actorId: 1,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vars: { hp: 22, luck: 23, speed: 24, baseStat: 25, weaponId: 26, resource: 27, agility: 35 } },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { name: &amp;quot;People2&amp;quot;, index: 1, label: &amp;quot;2. Кабачок (Маг)&amp;quot;, playerId: 1, actorId: 2,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vars: { hp: 29, luck: 30, speed: 31, baseStat: 32, weaponId: 33, resource: 34, agility: 36 } },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { name: &amp;quot;People2&amp;quot;, index: 4, label: &amp;quot;3. Богач (Воин)&amp;quot;, playerId: 2, actorId: 3,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vars: { hp: 42, luck: 43, speed: 44, baseStat: 45, weaponId: 46, resource: 47, agility: 37 } },&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; { name: &amp;quot;People2&amp;quot;, index: 5, label: &amp;quot;4. Монашка (Маг)&amp;quot;, playerId: 2, actorId: 4,&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; vars: { hp: 49, luck: 50, speed: 51, baseStat: 52, weaponId: 53, resource: 54, agility: 38 } }&lt;br /&gt;&amp;#160; &amp;#160; ];&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let peer = null;&lt;br /&gt;&amp;#160; &amp;#160; let conn = null;&lt;br /&gt;&amp;#160; &amp;#160; let lastSentX = -1;&lt;br /&gt;&amp;#160; &amp;#160; let lastSentY = -1;&lt;br /&gt;&amp;#160; &amp;#160; let lastSentDir = -1;&lt;br /&gt;&amp;#160; &amp;#160; let networkActive = false;&lt;br /&gt;&amp;#160; &amp;#160; let isHost = false;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let remoteTargetX = 0;&lt;br /&gt;&amp;#160; &amp;#160; let remoteTargetY = 0;&lt;br /&gt;	let lastSentEventPos = {}; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let currentTargetId = 0;&lt;br /&gt;&amp;#160; &amp;#160; let currentTargetVarId = 0;&lt;br /&gt;&amp;#160; &amp;#160; let currentTargetDeathSwitch = 0;&lt;br /&gt;&amp;#160; &amp;#160; let autoAttackTimer = 0;&lt;br /&gt;&amp;#160; &amp;#160; const ATTACK_RANGE = 2; &lt;br /&gt;&amp;#160; &amp;#160; const BASE_COOLDOWN = 90; &lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; let myStats = null; &lt;br /&gt;&amp;#160; &amp;#160; let remotePlayerStats = null; &lt;br /&gt;&amp;#160; &amp;#160; let myActorId = 1;&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; let targetNameCache = &amp;quot;&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; let targetMaxHpCache = 100;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // ИИ ВРАГОВ (State Machine)&lt;br /&gt;&amp;#160; &amp;#160; // Состояния: 0 = Спокойствие, 1 = Тревога, 2 = Бой&lt;br /&gt;&amp;#160; &amp;#160; let enemyAI = {}; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; Input.keyMapper[82] = &#039;targetKey&#039;; // R&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; // HTML UI&lt;br /&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; let targetFrame = null;&lt;br /&gt;&amp;#160; &amp;#160; let hpBarInner = null;&lt;br /&gt;&amp;#160; &amp;#160; let targetNameEl = null;&lt;br /&gt;&amp;#160; &amp;#160; let targetHpTextEl = null;&lt;br /&gt;&amp;#160; &amp;#160; let damageNumberEl = null;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; let playerFrame = null;&lt;br /&gt;&amp;#160; &amp;#160; let playerHpBarInner = null;&lt;br /&gt;&amp;#160; &amp;#160; let playerNameEl = null;&lt;br /&gt;&amp;#160; &amp;#160; let playerHpTextEl = null;&lt;br /&gt;&amp;#160; &amp;#160; let playerAvatarEl = null;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; function createHTMLUI() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (document.getElementById(&#039;mmo-target-frame&#039;)) return; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- ФРЕЙМ ВРАГА ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.id = &#039;mmo-target-frame&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.style.cssText = `position: fixed; top: 20px; left: 50%; transform: translateX(-50%); width: 300px; height: 50px; background: rgba(0, 0, 0, 0.8); border: 2px solid #c9a034; border-radius: 8px; padding: 10px; display: none; z-index: 9999; font-family: Arial, sans-serif; color: white; pointer-events: none;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetNameEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetNameEl.style.cssText = `font-size: 16px; font-weight: bold; margin-bottom: 5px; text-align: center; color: #ffcc00;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.appendChild(targetNameEl);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let hpBarOuter = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; hpBarOuter.style.cssText = `width: 100%; height: 15px; background: #333; border-radius: 3px; border: 1px solid #000;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; hpBarInner = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; hpBarInner.style.cssText = `width: 100%; height: 100%; background: linear-gradient(to bottom, #ff4444, #cc0000); border-radius: 3px; transition: width 0.2s;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; hpBarOuter.appendChild(hpBarInner);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.appendChild(hpBarOuter);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetHpTextEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetHpTextEl.style.cssText = `font-size: 12px; text-align: center; margin-top: 2px;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.appendChild(targetHpTextEl);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- ФРЕЙМ ИГРОКА ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerFrame = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerFrame.id = &#039;mmo-player-frame&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerFrame.style.cssText = `position: fixed; bottom: 20px; right: 20px; width: 250px; height: 60px; background: rgba(0, 0, 0, 0.8); border: 2px solid #1e3a5f; border-radius: 8px; padding: 10px; display: flex; align-items: center; z-index: 9999; font-family: Arial, sans-serif; color: white; pointer-events: none;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerAvatarEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerAvatarEl.style.cssText = `width: 40px; height: 40px; background: #555; border: 2px solid #fff; border-radius: 5px; margin-right: 10px; display: flex; justify-content: center; align-items: center; font-weight: bold;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerFrame.appendChild(playerAvatarEl);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let playerInfoDiv = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerInfoDiv.style.cssText = `flex-grow: 1;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerNameEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerNameEl.style.cssText = `font-size: 14px; font-weight: bold; margin-bottom: 5px;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerInfoDiv.appendChild(playerNameEl);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; let pHpBarOuter = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; pHpBarOuter.style.cssText = `width: 100%; height: 10px; background: #333; border-radius: 3px; border: 1px solid #000;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpBarInner = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpBarInner.style.cssText = `width: 100%; height: 100%; background: linear-gradient(to bottom, #2ecc71, #27ae60); border-radius: 3px; transition: width 0.2s;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; pHpBarOuter.appendChild(playerHpBarInner);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerInfoDiv.appendChild(pHpBarOuter);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpTextEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpTextEl.style.cssText = `font-size: 10px; text-align: right; margin-top: 2px;`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerInfoDiv.appendChild(playerHpTextEl);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; playerFrame.appendChild(playerInfoDiv);&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- ВСПЛЫВАЮЩИЙ УРОН ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; damageNumberEl = document.createElement(&#039;div&#039;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; damageNumberEl.id = &#039;mmo-damage-number&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; damageNumberEl.style.cssText = `position: fixed; top: 35%; left: 50%; transform: translateX(-50%); font-size: 40px; font-weight: bold; color: white; text-shadow: 2px 2px 0 #000; z-index: 10000; pointer-events: none; display: none; opacity: 0; transition: all 0.5s ease-out;`;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.body.appendChild(targetFrame);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.body.appendChild(playerFrame);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; document.body.appendChild(damageNumberEl);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; function showDamageNumber(text, isCrit, isDodge) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!damageNumberEl) return;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; damageNumberEl.textContent = text;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (isDodge) { damageNumberEl.style.color = &amp;quot;#ffff00&amp;quot;; damageNumberEl.style.fontSize = &amp;quot;45px&amp;quot;; } &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; else { damageNumberEl.style.color = isCrit ? &amp;quot;#ffaa00&amp;quot; : &amp;quot;#ffffff&amp;quot;; damageNumberEl.style.fontSize = isCrit ? &amp;quot;55px&amp;quot; : &amp;quot;40px&amp;quot;; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; damageNumberEl.style.transition = &#039;none&#039;; damageNumberEl.style.display = &#039;block&#039;; damageNumberEl.style.opacity = 1; damageNumberEl.style.top = &#039;35%&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; setTimeout(() =&amp;gt; { damageNumberEl.style.transition = &#039;all 0.5s ease-out&#039;; damageNumberEl.style.opacity = 0; damageNumberEl.style.top = &#039;25%&#039;; }, 50);&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; function updateUI() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!targetFrame) return;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // Враг&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (currentTargetId &amp;gt; 0 &amp;amp;&amp;amp; currentTargetDeathSwitch &amp;gt; 0 &amp;amp;&amp;amp; !$gameSwitches.value(currentTargetDeathSwitch)) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; targetFrame.style.display = &#039;block&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let currentHp = $gameVariables.value(currentTargetVarId);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; targetNameEl.textContent = targetNameCache; targetHpTextEl.textContent = `${currentHp} / ${targetMaxHpCache}`;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; hpBarInner.style.width = Math.max(0, (currentHp / targetMaxHpCache) * 100) + &#039;%&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; } else { targetFrame.style.display = &#039;none&#039;; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // Игрок (БЕЗ БАЗЫ ДАННЫХ!)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (myStats &amp;amp;&amp;amp; $gameActors &amp;amp;&amp;amp; $gameActors.actor(myActorId)) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let actor = $gameActors.actor(myActorId);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let currentHp = $gameVariables.value(myStats.hp);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; playerNameEl.textContent = actor.name();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpTextEl.textContent = `HP: ${currentHp}`; // Только текущее HP из переменной&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Полоска будет просто показывать текущее значение. Так как мы не знаем макс, &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // сделаем так: если HP &amp;gt; 20, считаем что максимум = текущее. Иначе 20. &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Позже ты добавишь переменную Max HP и мы сделаем идеально!&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let maxHp = Math.max(currentHp, 20); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; playerHpBarInner.style.width = Math.max(0, (currentHp / maxHp) * 100) + &#039;%&#039;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; playerAvatarEl.textContent = actor.name().charAt(0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; playerAvatarEl.style.backgroundColor = myStats.agility === 35 ? &amp;quot;#c0392b&amp;quot; : &amp;quot;#2980b9&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; // ИНИЦИАЛИЗАЦИЯ И СЕТЬ&lt;br /&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; window.InitializeEnemyHP = function(varId, enemyId) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameVariables.value(varId) === 0) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let enemyData = $dataEnemies[enemyId];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (enemyData) { let maxHp = enemyData.params[0]; $gameVariables.setValue(varId, maxHp); if (isHost &amp;amp;&amp;amp; networkActive) NetworkSendVariable(varId, maxHp); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; };&lt;br /&gt;&amp;#160; &amp;#160; window.NetworkSendSwitch = function(switchId, value) { if (networkActive &amp;amp;&amp;amp; conn &amp;amp;&amp;amp; conn.open) conn.send({ type: &#039;switch&#039;, switchId: switchId, value: value }); };&lt;br /&gt;&amp;#160; &amp;#160; window.NetworkSendVariable = function(varId, value) { if (networkActive &amp;amp;&amp;amp; conn &amp;amp;&amp;amp; conn.open) conn.send({ type: &#039;variable&#039;, varId: varId, value: value }); };&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; function sendFullSync() {&lt;br /&gt;&amp;#160; &amp;#160; 	if (!networkActive || !conn || !conn.open || !$gameSwitches || !$gameVariables) return;&lt;br /&gt;&amp;#160; &amp;#160; 	let swData = []; let varData = [];&lt;br /&gt;&amp;#160; &amp;#160; 	for (let i = 1; i &amp;lt; $gameSwitches._data.length; i++) { if ($gameSwitches._data[i]) swData.push({ id: i, val: true }); }&lt;br /&gt;&amp;#160; &amp;#160; 	for (let i = 1; i &amp;lt; $gameVariables._data.length; i++) { if ($gameVariables._data[i] !== 0) varData.push({ id: i, val: $gameVariables._data[i] }); }&lt;br /&gt;&amp;#160; &amp;#160; 	conn.send({ type: &#039;full_sync&#039;, switches: swData, variables: varData });&lt;br /&gt;&amp;#160; &amp;#160; 	&lt;br /&gt;&amp;#160; &amp;#160; 	// Добавляем синхронизацию позиций врагов при подключении&lt;br /&gt;&amp;#160; &amp;#160; 	if ($gameMap) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameMap.events().forEach(event =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	if (event.event().meta &amp;amp;&amp;amp; event.event().meta.enemy) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;event_move&#039;, eventId: event.eventId(), x: event.x, y: event.y, dir: event.direction() });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; 	}&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; function setupConnection(connection) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; conn = connection;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.on(&#039;open&#039;, function() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; networkActive = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gamePlayer) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;init_graphic&#039;, graphicName: $gamePlayer.characterName(), graphicIndex: $gamePlayer.characterIndex() }); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;init_stats&#039;, stats: myStats }); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (isHost) setTimeout(sendFullSync, 1000);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.on(&#039;data&#039;, function(data) { // &amp;lt;--- ОШИБКА БЫЛА ЗДЕСЬ: обязательно должно быть (data)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!$gameMap) return;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Движение второго игрока&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;move&#039;) { remoteTargetX = data.x; remoteTargetY = data.y; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Инициализация графики и статов&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;init_graphic&#039;) { const event = $gameMap.event(NETWORK_EVENT_ID); if (event) event.setImage(data.graphicName, data.graphicIndex); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;init_stats&#039;) { remotePlayerStats = data.stats; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Синхронизация переключателей и переменных&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;switch&#039; &amp;amp;&amp;amp; $gameSwitches) $gameSwitches.setValue(data.switchId, data.value);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;variable&#039; &amp;amp;&amp;amp; $gameVariables) $gameVariables.setValue(data.varId, data.value);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Полная синхронизация&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;full_sync&#039;) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameSwitches) data.switches.forEach(sw =&amp;gt; $gameSwitches.setValue(sw.id, sw.val)); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameVariables) data.variables.forEach(vr =&amp;gt; $gameVariables.setValue(vr.id, vr.val)); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameMap) $gameMap.refresh(); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Анимации атак&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;attack_anim&#039;) { let targetEvent = $gameMap.event(data.targetId); if (targetEvent) $gameTemp.requestAnimation([targetEvent], 1); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;player_hit_anim&#039;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Если хост говорит, что ударили его — на экране клиента анимация на модельке хоста (Event)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Если хост говорит, что ударили клиента — на экране клиента анимация на $gamePlayer (Игрок)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let target = data.targetNetworkId === &amp;quot;host&amp;quot; ? $gameMap.event(NETWORK_EVENT_ID) : $gamePlayer;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Проигрываем анимацию удара (если не уворот)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (target &amp;amp;&amp;amp; data.animId &amp;gt; 0) $gameTemp.requestAnimation([target], data.animId);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Если ударили тебя (клиента), показываем всплывающий урон и звуки&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.targetNetworkId === &amp;quot;client&amp;quot;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.isDodge) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; showDamageNumber(&amp;quot;DODGE!&amp;quot;, false, true);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Cancel2&amp;quot;, volume: 90, pitch: 150, pan: 0});&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; showDamageNumber(&amp;quot;-&amp;quot; + data.damage, false, false);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Damage1&amp;quot;, volume: 90, pitch: 100, pan: 0});&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // НОВОЕ: Синхронизация движения врагов/событий&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (data.type === &#039;event_move&#039;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let event = $gameMap.event(data.eventId);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (event) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!event.isMoving()) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dx = data.x - event.x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dy = data.y - event.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Если враг слишком далеко (рассинхрон), телепортируем&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (Math.abs(dx) &amp;gt; 1 || Math.abs(dy) &amp;gt; 1) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.setPosition(data.x, data.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else if (dx !== 0 || dy !== 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Иначе плавно двигаем&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.setDirection(data.dir);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.moveStraight(data.dir);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Если координаты совпадают, просто обновляем направление взгляда&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.setDirection(data.dir);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else if (Math.abs(data.x - event.x) &amp;gt; 2 || Math.abs(data.y - event.y) &amp;gt; 2) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Жесткий фикс: если враг застрял в анимации ходьбы, но сильно отстал — телепортируем&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.setPosition(data.x, data.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.on(&#039;close&#039;, function() { networkActive = false; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.on(&#039;error&#039;, function(err) { console.error(&amp;quot;P2P Ошибка:&amp;quot;, err); });&lt;br /&gt;&amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; const _Scene_Map_start = Scene_Map.prototype.start;&lt;br /&gt;&amp;#160; &amp;#160; Scene_Map.prototype.start = function() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; _Scene_Map_start.call(this);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; createHTMLUI(); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!peer) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let promptText = &amp;quot;CHOOSE YOUR CLASS:\n\n&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; for (let i = 0; i &amp;lt; CHAR_LIST.length; i++) promptText += CHAR_LIST[i].label + &amp;quot;\n&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; promptText += &amp;quot;\n(Type a number)&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const charChoice = prompt(promptText, &amp;quot;1&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let charIndex = parseInt(charChoice) - 1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (charIndex &amp;lt; 0 || charIndex &amp;gt;= CHAR_LIST.length) charIndex = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let chosenChar = CHAR_LIST[charIndex];&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gamePlayer.setImage(chosenChar.name, chosenChar.index);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; myStats = chosenChar.vars;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; myActorId = chosenChar.actorId;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const choice = prompt(&amp;quot;CO-OP MULTIPLAYER\n\n1. Type &#039;host&#039; to CREATE room\n2. Type &#039;join&#039; to CONNECT&amp;quot;, &amp;quot;host&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (choice === &#039;host&#039;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; isHost = true;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const roomCode = Math.floor(1000 + Math.random() * 9000);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer = new Peer(&#039;rpg&#039; + roomCode, { secure: true, debug: 1 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer.on(&#039;open&#039;, id =&amp;gt; alert(&amp;quot;YOUR ROOM CODE:\n\n&amp;quot; + roomCode));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer.on(&#039;connection&#039;, conn =&amp;gt; { setupConnection(conn); alert(&amp;quot;FRIEND CONNECTED!&amp;quot;); });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer.on(&#039;error&#039;, err =&amp;gt; alert(&amp;quot;Error: &amp;quot; + err.type));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else if (choice === &#039;join&#039;) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; isHost = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const inputCode = prompt(&amp;quot;ENTER HOST&#039;S 4-DIGIT CODE:&amp;quot;);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (inputCode) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer = new Peer({ secure: true, debug: 1 });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer.on(&#039;open&#039;, () =&amp;gt; { setupConnection(peer.connect(&#039;rpg&#039; + inputCode, { reliable: true })); setTimeout(() =&amp;gt; alert(networkActive ? &amp;quot;CONNECTED!&amp;quot; : &amp;quot;Failed.&amp;quot;), 3000); });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; peer.on(&#039;error&#039;, err =&amp;gt; alert(&amp;quot;Error: &amp;quot; + err.type));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; };&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; // ОБНОВЛЕНИЕ КАРТЫ&lt;br /&gt;&amp;#160; &amp;#160; // ==========================================================&lt;br /&gt;&amp;#160; &amp;#160; const _Scene_Map_update = Scene_Map.prototype.update;&lt;br /&gt;&amp;#160; &amp;#160; Scene_Map.prototype.update = function() {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; _Scene_Map_update.call(this);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!$gameMap || !$gamePlayer || !myStats) return;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- СЕТЬ ДВИЖЕНИЯ ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (networkActive &amp;amp;&amp;amp; conn &amp;amp;&amp;amp; conn.open) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const x = $gamePlayer.x; const y = $gamePlayer.y; const dir = $gamePlayer.direction();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (x !== lastSentX || y !== lastSentY || dir !== lastSentDir) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; try { conn.send({ type: &#039;move&#039;, x: x, y: y, dir: dir }); } catch(e) {}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; lastSentX = x; lastSentY = y; lastSentDir = dir;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const friendEvent = $gameMap.event(NETWORK_EVENT_ID);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (friendEvent &amp;amp;&amp;amp; !friendEvent.isMoving()) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dx = remoteTargetX - friendEvent.x; let dy = remoteTargetY - friendEvent.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (Math.abs(dx) &amp;gt; 1 || Math.abs(dy) &amp;gt; 1) friendEvent.setPosition(remoteTargetX, remoteTargetY);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; else if (dx !== 0 || dy !== 0) { let dir = Math.abs(dx) &amp;gt; Math.abs(dy) ? (dx &amp;gt; 0 ? 6 : 4) : (dy &amp;gt; 0 ? 2 : 8); friendEvent.setDirection(dir); friendEvent.moveStraight(dir); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- ТАГРЕТИНГ (R) ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (Input.isTriggered(&#039;targetKey&#039;)) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Cursor1&amp;quot;, volume: 90, pitch: 100, pan: 0});&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let closestDist = 999; let closestId = 0; let closestVar = 0; let closestDeathSw = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameMap.events().forEach(event =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (event.event().meta &amp;amp;&amp;amp; event.event().meta.enemy) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let varId = parseInt(event.event().meta.enemy);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let deathSw = parseInt(event.event().meta.deathSwitch || 0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let isDead = deathSw &amp;gt; 0 ? $gameSwitches.value(deathSw) : false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameVariables.value(varId) &amp;gt; 0 &amp;amp;&amp;amp; !isDead) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dist = Math.abs($gamePlayer.x - event.x) + Math.abs($gamePlayer.y - event.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (dist &amp;lt; closestDist) { closestDist = dist; closestId = event.eventId(); closestVar = varId; closestDeathSw = deathSw; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (closestId &amp;gt; 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; currentTargetId = closestId; currentTargetVarId = closestVar; currentTargetDeathSwitch = closestDeathSw; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let event = $gameMap.event(closestId); targetNameCache = event.event().name;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let enemyDbId = parseInt(event.event().meta.enemyId || 1);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; targetMaxHpCache = $dataEnemies[enemyDbId] ? $dataEnemies[enemyDbId].params[0] : 100;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Decision1&amp;quot;, volume: 90, pitch: 150, pan: 0});&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else { currentTargetId = 0; currentTargetVarId = 0; currentTargetDeathSwitch = 0; targetNameCache = &amp;quot;&amp;quot;; AudioManager.playSe({name: &amp;quot;Buzzer1&amp;quot;, volume: 90, pitch: 100, pan: 0}); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- АВТОАТАКА ИГРОКА ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (currentTargetId &amp;gt; 0 &amp;amp;&amp;amp; autoAttackTimer &amp;lt;= 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetEvent = $gameMap.event(currentTargetId);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let isDead = currentTargetDeathSwitch &amp;gt; 0 ? $gameSwitches.value(currentTargetDeathSwitch) : false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetEvent &amp;amp;&amp;amp; $gameVariables.value(currentTargetVarId) &amp;gt; 0 &amp;amp;&amp;amp; !isDead) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dist = Math.abs($gamePlayer.x - targetEvent.x) + Math.abs($gamePlayer.y - targetEvent.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (dist &amp;lt;= ATTACK_RANGE) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (isHost || !networkActive) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let baseStatVal = $gameVariables.value(myStats.baseStat); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let weaponIdVal = $gameVariables.value(myStats.weaponId); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let luckVal = $gameVariables.value(myStats.luck);&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let weaponDmg = (weaponIdVal &amp;gt; 0 &amp;amp;&amp;amp; $dataWeapons[weaponIdVal]) ? $dataWeapons[weaponIdVal].params[3] : 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let totalDamage = baseStatVal + weaponDmg;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let isCrit = false;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (Math.randomInt(100) + 1 &amp;lt;= luckVal) { totalDamage *= 2; isCrit = true; AudioManager.playSe({name: &amp;quot;Crossbow&amp;quot;, volume: 90, pitch: 150, pan: 0}); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; totalDamage = Math.max(1, totalDamage); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let newHp = Math.max(0, $gameVariables.value(currentTargetVarId) - totalDamage);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameVariables.setValue(currentTargetVarId, newHp);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; showDamageNumber(&amp;quot;-&amp;quot; + totalDamage, isCrit, false);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (newHp &amp;lt;= 0 &amp;amp;&amp;amp; currentTargetDeathSwitch &amp;gt; 0) { $gameSwitches.setValue(currentTargetDeathSwitch, true); if (networkActive) NetworkSendSwitch(currentTargetDeathSwitch, true); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (networkActive) { NetworkSendVariable(currentTargetVarId, newHp); conn.send({ type: &#039;attack_anim&#039;, targetId: currentTargetId }); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameTemp.requestAnimation([targetEvent], 1); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; autoAttackTimer = Math.max(20, BASE_COOLDOWN - ($gameVariables.value(myStats.speed) * 5));&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else { currentTargetId = 0; currentTargetVarId = 0; currentTargetDeathSwitch = 0; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (autoAttackTimer &amp;gt; 0) autoAttackTimer--;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // --- УМНЫЙ ИИ ВРАГОВ (State Machine) ---&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (isHost || !networkActive) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const AGGRO_RANGE = 4; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const DEAGGRO_RANGE = 6; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const ENEMY_ATK_RANGE = 1; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const ENEMY_COOLDOWN = 120; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; const AGGRO_DELAY = 90; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameMap.events().forEach(event =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!event.event().meta || !event.event().meta.enemy) return; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let varId = parseInt(event.event().meta.enemy);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let deathSw = parseInt(event.event().meta.deathSwitch || 0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if ($gameVariables.value(varId) &amp;lt;= 0 || (deathSw &amp;gt; 0 &amp;amp;&amp;amp; $gameSwitches.value(deathSw))) return; &lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let eId = event.eventId();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!enemyAI[eId]) enemyAI[eId] = { state: 0, timer: 0, cooldown: 0 };&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let ai = enemyAI[eId];&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let p1Dist = Math.abs($gamePlayer.x - event.x) + Math.abs($gamePlayer.y - event.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let p2Dist = 999;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (networkActive &amp;amp;&amp;amp; remotePlayerStats) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let p2Event = $gameMap.event(NETWORK_EVENT_ID);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; p2Dist = Math.abs(p2Event.x - event.x) + Math.abs(p2Event.y - event.y);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetIsP1 = (p1Dist &amp;lt;= p2Dist);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetDist = targetIsP1 ? p1Dist : p2Dist;&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Деагро (Сброс состояния)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetDist &amp;gt; DEAGGRO_RANGE) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ai.state = 0; ai.timer = 0;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Игрок в радиусе агро&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetDist &amp;lt;= AGGRO_RANGE) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // СОСТОЯНИЕ 0: СПОКОЙСТВИЕ -&amp;gt; ТРЕВОГА&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (ai.state === 0) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ai.state = 1;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ai.timer = AGGRO_DELAY;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Skill3&amp;quot;, volume: 90, pitch: 100, pan: 0}); // Звук 1 раз!&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // СОСТОЯНИЕ 1: ТРЕВОГА (Ждет)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (ai.state === 1) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ai.timer--;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (ai.timer &amp;lt;= 0) ai.state = 2; // Переходим к бою&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; return; // Стоим на месте&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // СОСТОЯНИЕ 2: БОЙ (Гоняется и бьет)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (ai.state === 2) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (ai.cooldown &amp;gt; 0) { ai.cooldown--; return; }&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetDist &amp;lt;= ENEMY_ATK_RANGE) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // АТАКА&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetAgilityVar = targetIsP1 ? myStats.agility : (remotePlayerStats ? remotePlayerStats.agility : 0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetHpVar = targetIsP1 ? myStats.hp : (remotePlayerStats ? remotePlayerStats.hp : 0);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let targetEntity = targetIsP1 ? $gamePlayer : $gameMap.event(NETWORK_EVENT_ID);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let agility = $gameVariables.value(targetAgilityVar);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (Math.randomInt(100) + 1 &amp;lt;= agility) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // УВОРОТ&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetIsP1) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; showDamageNumber(&amp;quot;DODGE!&amp;quot;, false, true);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Cancel2&amp;quot;, volume: 90, pitch: 150, pan: 0});&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (networkActive) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let hitTarget = targetIsP1 ? &amp;quot;host&amp;quot; : &amp;quot;client&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;player_hit_anim&#039;, targetNetworkId: hitTarget, animId: 0, isDodge: true });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // ПОПАДАНИЕ&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let enemyAtk = parseInt(event.event().meta.atk || 3); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let currentHp = $gameVariables.value(targetHpVar);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let newHp = Math.max(0, currentHp - enemyAtk);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameVariables.setValue(targetHpVar, newHp);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; $gameTemp.requestAnimation([targetEntity], 1);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetIsP1) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; showDamageNumber(&amp;quot;-&amp;quot; + enemyAtk, false, false); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; AudioManager.playSe({name: &amp;quot;Damage1&amp;quot;, volume: 90, pitch: 100, pan: 0}); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (networkActive) { &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; NetworkSendVariable(targetHpVar, newHp); &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let hitTarget = targetIsP1 ? &amp;quot;host&amp;quot; : &amp;quot;client&amp;quot;;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;player_hit_anim&#039;, targetNetworkId: hitTarget, animId: 1, damage: enemyAtk, isDodge: false });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; ai.cooldown = ENEMY_COOLDOWN;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // ПРЕСЛЕДОВАНИЕ&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!event.isMoving()) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (targetIsP1) { event.moveTowardPlayer(); }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; else {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let p2Event = $gameMap.event(NETWORK_EVENT_ID);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dx = p2Event.x - event.x; let dy = p2Event.y - event.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let dir = Math.abs(dx) &amp;gt; Math.abs(dy) ? (dx &amp;gt; 0 ? 6 : 4) : (dy &amp;gt; 0 ? 2 : 8);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; event.setDirection(dir); event.moveStraight(dir);&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; // --- СИНХРОНИЗАЦИЯ ПОЗИЦИЙ ВРАГОВ ---&lt;br /&gt;if (isHost &amp;amp;&amp;amp; networkActive &amp;amp;&amp;amp; conn &amp;amp;&amp;amp; conn.open) {&lt;br /&gt;&amp;#160; &amp;#160; $gameMap.events().forEach(event =&amp;gt; {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; // Синхронизируем только врагов (можно убрать проверку meta.enemy, если нужны все NPC)&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; if (event.event().meta &amp;amp;&amp;amp; event.event().meta.enemy) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let eId = event.eventId();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let eX = event.x;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let eY = event.y;&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; let eDir = event.direction();&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; // Отправляем только если позиция или направление изменились&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; if (!lastSentEventPos[eId] || lastSentEventPos[eId].x !== eX || lastSentEventPos[eId].y !== eY || lastSentEventPos[eId].dir !== eDir) {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; try {&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; conn.send({ type: &#039;event_move&#039;, eventId: eId, x: eX, y: eY, dir: eDir });&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; } catch(e) {}&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; lastSentEventPos[eId] = { x: eX, y: eY, dir: eDir };&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;br /&gt;&amp;#160; &amp;#160; });&lt;br /&gt;}&lt;/p&gt;
						&lt;p&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; updateUI(); &lt;br /&gt;&amp;#160; &amp;#160; };&lt;br /&gt;})();&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sun, 24 May 2026 21:41:33 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=622#p622</guid>
		</item>
		<item>
			<title>рыцари и сок добрый</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=619#p619</link>
			<description>&lt;div class=&quot;code-box&quot;&gt;&lt;strong class=&quot;legend&quot;&gt;Код:&lt;/strong&gt;&lt;div class=&quot;blockcode&quot;&gt;&lt;div class=&quot;scrollbox&quot; style=&quot;height: 35em&quot;&gt;&lt;pre&gt;//=============================================================================
// PK_Platformer.js
//=============================================================================

/*: 
 * @plugindesc Полноценная платформерная физика и плавная камера поверх RPG Maker MZ
 * @author YourName
 *
 * @help
 * 1. Поставь на события-платформы тег в Note: &amp;lt;platform:X&amp;gt;
 *    Где X - ширина платформы в тайлах (1 тайл = 48px). Высота всегда 24px.
 *    Пример: &amp;lt;platform:3&amp;gt; создаст платформу 144x24 пикселей.
 * 2. Управление: Стрелки / A,D - бег. Пробел / Enter / Z - прыжок.
 */

(() =&amp;gt; {
    // --- НАСТРОЙКИ ФИЗИКИ ---
    const TILE_SIZE = 48;
    
    // Изменено: Увеличена гравитация для ощущения веса
    const GRAVITY = 1.1;         // Было 0.6
    const MAX_FALL_SPEED = 18;   // Было 12 (падаем быстрее)
    const MOVE_ACCEL = 1.0;      // Было 0.8 (чуть быстрее разгоняется)
    const FRICTION = 0.85;       
    const MAX_SPEED = 6;         
    
    // Изменено: Снижена сила прыжка
    const JUMP_FORCE = -12;    // Было -11 (прыгаем ниже)
    const JUMP_MOMENTUM_BONUS = 0.1; // Было 0.15
    const JUMP_CUT_MULTIPLIER = 0.4; 
    const LOW_GRAVITY_MULTIPLIER = 0.55; // Было 0.5 (чуть быстрее отпускаем вершину прыжка)

    // --- Наш кастомный игрок ---
    const player = {
        x: 0, y: 0, 
        width: 30, height: 30,
        vx: 0, vy: 0, 
        isGrounded: false, 
        isJumping: false
    };

    // --- Массивы ---
    let platforms = [];
    let platformSprites = [];
    let playerSprite = null;

    // ==========================================
    // 1. ИНИЦИАЛИЗАЦИЯ КАРТЫ
    // ==========================================
    const _Game_Map_setup = Game_Map.prototype.setup;
    Game_Map.prototype.setup = function(mapId) {
        _Game_Map_setup.call(this, mapId);
        cachePlatforms();
        player.x = $gamePlayer.x * TILE_SIZE;
        player.y = $gamePlayer.y * TILE_SIZE;
        player.vx = 0;
        player.vy = 0;
        playerSprite = null;
        platformSprites = [];
    };

    function cachePlatforms() {
        platforms = [];
        $gameMap.events().forEach(event =&amp;gt; {
            const platformWidthStr = event.event().meta.platform;
            if (platformWidthStr) {
                const widthInTiles = Number(platformWidthStr);
                platforms.push({
                    x: event.x * TILE_SIZE,
                    y: event.y * TILE_SIZE,
                    width: widthInTiles * TILE_SIZE,
                    height: TILE_SIZE / 2 
                });
            }
        });
    }

    // ==========================================
    // 2. СКРЫВАЕМ СТАНДАРТНОГО ГЕРОЯ
    // ==========================================
    const _Spriteset_Map_createCharacters = Spriteset_Map.prototype.createCharacters;
    Spriteset_Map.prototype.createCharacters = function() {
        _Spriteset_Map_createCharacters.call(this);
        this._characterSprites.forEach(sprite =&amp;gt; {
            if (sprite._character === $gamePlayer) {
                sprite.opacity = 0; 
            }
        });
    };

    // ==========================================
    // 3. СОЗДАНИЕ СПРАЙТОВ
    // ==========================================
    const _Spriteset_Map_createLowerLayer = Spriteset_Map.prototype.createLowerLayer;
    Spriteset_Map.prototype.createLowerLayer = function() {
        _Spriteset_Map_createLowerLayer.call(this);

        if (platformSprites.length === 0 &amp;amp;&amp;amp; platforms.length &amp;gt; 0) {
            platforms.forEach(p =&amp;gt; {
                let spr = new Sprite();
                spr.bitmap = new Bitmap(p.width, p.height);
                spr.bitmap.fillRect(0, 0, p.width, p.height, &#039;#444444&#039;);
                spr.bitmap.fillRect(0, 0, p.width, 3, &#039;#666666&#039;);
                this.addChild(spr);
                platformSprites.push({ sprite: spr, x: p.x, y: p.y });
            });
        }

        if (!playerSprite) {
            playerSprite = new Sprite();
            playerSprite.bitmap = new Bitmap(player.width, player.height);
            this.addChild(playerSprite);
        }
    };

    // ==========================================
    // 4. ОБНОВЛЕНИЕ ПОЗИЦИЙ СПРАЙТОВ
    // ==========================================
    const _Spriteset_Map_update = Spriteset_Map.prototype.update;
    Spriteset_Map.prototype.update = function() {
        _Spriteset_Map_update.call(this);

        if (!$gameMap) return;

        const camX = $gameMap.displayX() * TILE_SIZE;
        const camY = $gameMap.displayY() * TILE_SIZE;

        platformSprites.forEach(ps =&amp;gt; {
            ps.sprite.x = ps.x - camX;
            ps.sprite.y = ps.y - camY;
        });

        if (playerSprite) {
            playerSprite.x = player.x - camX;
            playerSprite.y = player.y - camY;

            playerSprite.bitmap.clear();
            if (!player.isGrounded) {
                playerSprite.bitmap.fillRect(0, 0, player.width, player.height, &#039;#ff5555&#039;);
            } else if (Math.abs(player.vx) &amp;gt; 0.5) {
                playerSprite.bitmap.fillRect(0, 0, player.width, player.height, &#039;#55ff55&#039;);
            } else {
                playerSprite.bitmap.fillRect(0, 0, player.width, player.height, &#039;#ffffff&#039;);
            }
        }
    };

    // ==========================================
    // 5. ПЛАВНАЯ КАМЕРА
    // ==========================================
    Game_Player.prototype.updateScroll = function() {};

    function updateCamera() {
        const targetX = (player.x + player.width / 2) - Graphics.width / 2;
        const targetY = (player.y + player.height / 2) - Graphics.height / 2;

        const lerpSpeed = 0.1;
        
        $gameMap._displayX += ((targetX / TILE_SIZE) - $gameMap._displayX) * lerpSpeed;
        $gameMap._displayY += ((targetY / TILE_SIZE) - $gameMap._displayY) * lerpSpeed;

        const maxX = Math.max(0, $gameMap.width() - Graphics.width / TILE_SIZE);
        const maxY = Math.max(0, $gameMap.height() - Graphics.height / TILE_SIZE);
        
        $gameMap._displayX = Math.max(0, Math.min(maxX, $gameMap._displayX));
        $gameMap._displayY = Math.max(0, Math.min(maxY, $gameMap._displayY));
    }

    // ==========================================
    // 6. ИГРОВОЙ ЦИКЛ И ФИЗИКА
    // ==========================================
    const _Scene_Map_update = Scene_Map.prototype.update;
    Scene_Map.prototype.update = function() {
        _Scene_Map_update.call(this);
        if (!$gameMessage.isBusy()) {
            updatePhysics();
            updateCamera();
        }
    };

    function updatePhysics() {
        const left = Input.isPressed(&#039;left&#039;);
        const right = Input.isPressed(&#039;right&#039;);
        const ok = Input.isPressed(&#039;ok&#039;);
        const okTriggered = Input.isTriggered(&#039;ok&#039;);

        if (left) player.vx -= MOVE_ACCEL;
        if (right) player.vx += MOVE_ACCEL;
        
        if (!left &amp;amp;&amp;amp; !right) {
            player.vx *= FRICTION;
            if (Math.abs(player.vx) &amp;lt; 0.1) player.vx = 0;
        }
        player.vx = Math.max(-MAX_SPEED, Math.min(MAX_SPEED, player.vx));

        if (okTriggered &amp;amp;&amp;amp; player.isGrounded) {
            let currentJumpForce = JUMP_FORCE - (Math.abs(player.vx) * JUMP_MOMENTUM_BONUS);
            player.vy = currentJumpForce;
            player.isGrounded = false;
            player.isJumping = true;
        }

        if (!ok &amp;amp;&amp;amp; player.isJumping &amp;amp;&amp;amp; player.vy &amp;lt; 0) {
            player.vy *= JUMP_CUT_MULTIPLIER;
            player.isJumping = false;
        }

        if (ok &amp;amp;&amp;amp; player.vy &amp;lt; 0) {
            player.vy += GRAVITY * LOW_GRAVITY_MULTIPLIER;
        } else {
            player.vy += GRAVITY;
        }

        if (player.vy &amp;gt; MAX_FALL_SPEED) player.vy = MAX_FALL_SPEED;

        player.x += player.vx;
        player.y += player.vy;

        player.isGrounded = false;
        
        // ИЗМЕНЕНО: Логика One-Way платформ (проходимые снизу)
        for (let p of platforms) {
            // Проверка пересечения
            if (player.x &amp;lt; p.x + p.width &amp;amp;&amp;amp;
                player.x + player.width &amp;gt; p.x &amp;amp;&amp;amp;
                player.y &amp;lt; p.y + p.height &amp;amp;&amp;amp;
                player.y + player.height &amp;gt; p.y) {
                
                // Мы приземляемся ТОЛЬКО если падаем вниз (vy &amp;gt; 0)
                // И в предыдущем кадре мы были ВЫШЕ платформы
                if (player.vy &amp;gt; 0 &amp;amp;&amp;amp; (player.y + player.height) - player.vy &amp;lt;= p.y) {
                    player.y = p.y - player.height;
                    player.vy = 0;
                    player.isGrounded = true;
                    player.isJumping = false;
                }
                // Убрана проверка на удар головой (else if). 
                // Теперь, если vy &amp;lt;= 0, мы просто пролетаем сквозь платформу!
            }
        }

        const mapWidth = $gameMap.width() * TILE_SIZE;
        if (player.x &amp;lt; 0) { player.x = 0; player.vx = 0; }
        if (player.x + player.width &amp;gt; mapWidth) { player.x = mapWidth - player.width; player.vx = 0; }

        if (player.y &amp;gt; $gameMap.height() * TILE_SIZE) {
            player.x = $gamePlayer.x * TILE_SIZE;
            player.y = $gamePlayer.y * TILE_SIZE;
            player.vx = 0;
            player.vy = 0;
        }

        $gamePlayer._x = Math.floor((player.x + player.width/2) / TILE_SIZE);
        $gamePlayer._y = Math.floor((player.y + player.height/2) / TILE_SIZE);
        $gamePlayer._realX = $gamePlayer._x;
        $gamePlayer._realY = $gamePlayer._y;
        $gamePlayer._through = true;
    }

})();&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sat, 23 May 2026 01:32:32 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=619#p619</guid>
		</item>
		<item>
			<title>A</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=604#p604</link>
			<description>&lt;p&gt;&lt;a href=&quot;https://upforme.ru/uploads/001c/aa/0e/5/678154.jpg&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://upforme.ru/uploads/001c/aa/0e/5/t678154.jpg&quot; alt=&quot;https://upforme.ru/uploads/001c/aa/0e/5/t678154.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (Cheremsha)</author>
			<pubDate>Thu, 14 May 2026 14:09:39 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=604#p604</guid>
		</item>
		<item>
			<title>муз</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=603#p603</link>
			<description>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lPfU7OEfBm8&amp;amp;list=PLa-Rj8npHelnkAYbqIyRKVOqkEZq_rmYy&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://www.youtube.com/watch?v=lPfU7OE &amp;#8230; qkEZq_rmYy&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sat, 09 May 2026 11:34:46 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=603#p603</guid>
		</item>
		<item>
			<title>ёмаё</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=601#p601</link>
			<description>&lt;p&gt;Однажды кот по имени Пержик устроился на РАБ оту. Это была большая ошибка. Ведь теперь он заимел долг в пять миллионов боливарских рублей! Пержик крупье, его миссия стать самым хитрым крупье в отеле и вернуть долг.&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Thu, 07 May 2026 15:08:36 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=601#p601</guid>
		</item>
		<item>
			<title>у вас пациент сбежал</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=596#p596</link>
			<description>&lt;p&gt;спасибо бро&amp;#160; :idea:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Sun, 03 May 2026 10:53:40 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=596#p596</guid>
		</item>
		<item>
			<title>The Most Relaxing Ambient Music from Heroes</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=582#p582</link>
			<description>&lt;p&gt;&lt;a href=&quot;https://tezumie.github.io/Image-to-Pixel/&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;https://tezumie.github.io/Image-to-Pixel/&lt;/a&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Fri, 24 Apr 2026 18:53:06 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=582#p582</guid>
		</item>
		<item>
			<title>игра которая ассоциируется с админом. поиграй</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=580#p580</link>
			<description>&lt;div class=&quot;quote-box answer-box&quot;&gt;&lt;cite&gt;mimes написал(а):&lt;/cite&gt;&lt;blockquote&gt;&lt;p&gt;кароче. получаешь данные о клетке, записываешь в переменную&lt;br /&gt;потом сравниваешь переменную с регионом&lt;br /&gt;&amp;#160; &amp;#9670;Получить данные о клетке&amp;#65306;ID_события, Номер события, ({Игрок_X},{Игрок_Y})&lt;/p&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;p&gt;а что значит куда переместить?&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Fri, 03 Apr 2026 11:48:46 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=580#p580</guid>
		</item>
		<item>
			<title>1 апреля умер интернет</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=578#p578</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://i.pinimg.com/736x/49/35/af/4935af80021ae117fd2b556afccb4541.jpg&quot; alt=&quot;https://i.pinimg.com/736x/49/35/af/4935af80021ae117fd2b556afccb4541.jpg&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Wed, 01 Apr 2026 18:08:04 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=578#p578</guid>
		</item>
		<item>
			<title>выбор без выбора</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=573#p573</link>
			<description>&lt;p&gt;+&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Mon, 30 Mar 2026 09:22:27 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=573#p573</guid>
		</item>
		<item>
			<title>АХАХАХХАХАХА</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=544#p544</link>
			<description>&lt;p&gt;ща зайду, поможешь&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Wed, 25 Mar 2026 02:24:37 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=544#p544</guid>
		</item>
		<item>
			<title>я не играю, но жиза</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=510#p510</link>
			<description>&lt;p&gt;блин жиза&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Wed, 25 Mar 2026 02:09:43 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=510#p510</guid>
		</item>
		<item>
			<title>1</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=508#p508</link>
			<description>&lt;p&gt;ура весна&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Tue, 24 Mar 2026 10:41:26 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=508#p508</guid>
		</item>
		<item>
			<title>стена</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=506#p506</link>
			<description>&lt;p&gt;есс!&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Tue, 24 Mar 2026 05:24:19 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=506#p506</guid>
		</item>
		<item>
			<title>ебаа</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=503#p503</link>
			<description>&lt;p&gt;кароче нам сюда гача нужна&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sun, 22 Mar 2026 13:52:54 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=503#p503</guid>
		</item>
		<item>
			<title>жук</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=490#p490</link>
			<description>&lt;p&gt;j^j&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Sat, 14 Mar 2026 08:11:40 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=490#p490</guid>
		</item>
		<item>
			<title>мост...</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=488#p488</link>
			<description>&lt;p&gt;&lt;img class=&quot;postimg&quot; loading=&quot;lazy&quot; src=&quot;https://i.pinimg.com/736x/42/3c/5d/423c5d04cac3e5ffab6bed6358c74ef4.jpg&quot; alt=&quot;https://i.pinimg.com/736x/42/3c/5d/423c5d04cac3e5ffab6bed6358c74ef4.jpg&quot; /&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Fri, 13 Mar 2026 01:23:22 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=488#p488</guid>
		</item>
		<item>
			<title>муз</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=478#p478</link>
			<description>&lt;p&gt;&lt;/p&gt;
						&lt;p&gt;Теги: музыка&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Fri, 06 Mar 2026 00:37:18 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=478#p478</guid>
		</item>
		<item>
			<title>A Rainy Day in Skyrim • Distant Thunder Sounds</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=477#p477</link>
			<description>&lt;p&gt;&lt;/p&gt;
						&lt;p&gt;Теги: музыка, атмосфера&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Thu, 05 Mar 2026 20:37:31 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=477#p477</guid>
		</item>
		<item>
			<title>&quot;Да, это классическая проблема.&quot;</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=476#p476</link>
			<description>&lt;p&gt;:cool:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Thu, 05 Mar 2026 04:12:10 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=476#p476</guid>
		</item>
		<item>
			<title>здорово</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=474#p474</link>
			<description>&lt;p&gt;хороший&amp;#160; :rain:&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Wed, 04 Mar 2026 02:58:15 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=474#p474</guid>
		</item>
		<item>
			<title>моя версия безмятежности</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=472#p472</link>
			<description>&lt;p&gt;оу щет, мне это нужно&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Tue, 03 Mar 2026 23:52:50 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=472#p472</guid>
		</item>
		<item>
			<title>Обьявляю конкурс иконок для сайта</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=453#p453</link>
			<description>&lt;p&gt;чего делаешь?&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sat, 28 Feb 2026 17:35:22 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=453#p453</guid>
		</item>
		<item>
			<title>муз</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=442#p442</link>
			<description>&lt;p&gt;&lt;/p&gt;</description>
			<author>mybb@mybb.ru (mimes)</author>
			<pubDate>Sat, 28 Feb 2026 14:46:39 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=442#p442</guid>
		</item>
		<item>
			<title>5н6546</title>
			<link>https://alt.bbtalk.me/viewtopic.php?pid=441#p441</link>
			<description>&lt;p&gt;5465464&lt;/p&gt;</description>
			<author>mybb@mybb.ru (lua)</author>
			<pubDate>Sat, 28 Feb 2026 14:44:37 +0300</pubDate>
			<guid>https://alt.bbtalk.me/viewtopic.php?pid=441#p441</guid>
		</item>
	</channel>
</rss>
