Files
fishing-game/index.html
T
andrey 4c257e19ec Встроенный emoji-шрифт (Этап 28): субсет Noto Color Emoji (COLRv1, OFL) как base64 @font-face 'EmojiEmbedded' в index.html — 57 глифов (все emoji игры), 78 КБ woff2, +105 КБ base64 (155→260 КБ; публикуемый zip 110.9 КБ, лимит 1.22 — 100 МБ). Внешний .woff2 невозможен: pack.mjs публикует строго один index.html. Шрифт ПЕРВЫМ в font-stack html,body и во всех 10 ctx.font (константа UI_FONT, секция «ОТРИСОВКА») — единый Google-стиль emoji на всех платформах; headless-скриншоты больше не зависят от системных emoji-шрифтов. Первый кадр ждёт document.fonts.load('16px "EmojiEmbedded"') с timeout-фолбэком 1.5 с (canvas-emoji 💥🌀⚡💪🐟💤). tools/emoji-font.py — генератор: вытаскивает emoji-кодопоинты из index.html (одна точка истины) → fontTools.subset (woff2, без SVG-таблицы) → вписывает base64 между маркерами EMOJI-FONT:BEGIN/END; --check — регрессия (падает, если новый emoji не в субсете; ✓№●○↩ в NCE нет — ок). venv tools/.venv + исходник tools/fonts-src/ — в gitignore. Осознанно: ⚡⭐☀⚠⏸⚖⛵⚒ теперь цветные на всех платформах (унификация). Тесты §Y7 (164/164, exit 0), check.mjs OK, pack 5/5, pack-smoke 6/6, emoji-font.py --check OK; рендер-пробы canvas 🪙⚠️⏸⭐ — цветные пиксели. screenshots/ — 14 кадров пересняты (среда: системный шрифт Emoji One — на кадрах встроенный Google-стиль). Доки: AGENTS.md (раздел «Встроенный emoji-шрифт», 164 чека), DEVLOG Этап 28.
2026-09-09 13:45:51 +03:00

2757 lines
258 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, viewport-fit=cover">
<meta name="theme-color" content="#0d3b66">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>Рыбалка</title>
<!-- EMOJI-FONT:BEGIN — генерируется tools/emoji-font.py, не редактировать руками -->
<style>
@font-face{
font-family:'EmojiEmbedded';
font-style:normal;
font-weight:400;
font-display:block;
src:url(data:font/woff2;base64,AAEAAAAPAIAAAwBwQ09MUh4EwwUAAPoEAAA250NQQUytdI7HAAEw7AAABF5HU1VCuPq49AABNUwAAAAqT1MvMkFfYDoAAAF4AAAAYGNtYXBQg7f4AAAH2AAAA7lnbHlmcracxAAAEZQAAObYaGVhZDGWhE4AAAD8AAAANmhoZWEIwAgoAAABNAAAACRobXR4krWC9wAAAdgAAAX+bG9jYS7v9Z8AAAuUAAAF/m1heHADGQEFAAABWAAAACBuYW1lGcQzwwAA+GwAAAF2cG9zdP+2ADMAAPnkAAAAIHZoZWEHMAKXAAE1eAAAACR2bXR4BOIAAAABNZwAAAX+AAEAAAADDhSPY9N0Xw889QADBAAAAAAA5q5QlQAAAADmxuHsADP/BgTVA7gAAAAGAAIAAAAAAAAAAQAAA7b/BgAABPsAMwAmBNUEAAAAAAAAAAAAAAAAAAAAAAEAAQAAAv4BBAAaAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAEBPsBkAAFAAACmgJmAAAATQKaAmYAAAFmADMBMwAAAAAAAAAAAAAAAAAAAAACAMCgAAAAAAAAAABOT05FAMAhlP//A7b/BgAAA7YA+gAAAAEAAAAAAgACzQAAACAACQT7ADMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlwBLATcASgBUBDwAgAD1AW8B4QJSArsB0gBFAFkASwKEA0sBJwBQAE8CPwETAYQCvQN6A5MCTgGZASUC1ABJAq8ASQD3AEkBMgBpADsASwFDARkBmQEMASwB+QIYAYkBYAFSAW8B3wI2AlUAeACtAqsC5wMxAxwDqgPFA4wC/wNKA9kDGQNNAwEDNgOFA8ED3AOlA/IDYwLQAUgA0gDrAE0CzQLFAzwDTQObAz0DkQDIANEBpADfAPYBOQHuAskDcQBGAFIB2AD3AjkDSgHZAPUCLQNBAQIA/QJOAR8BGgNaAHgAZAP2AGQCcgJ9AUsASQFtALQBugDwAw0CtQNDA70CsAPRAHEA5gFDAa4CCwJ4Am4CtALpAyEDUAMZA6QCGgG+AkABOAFiARMBbgGwAEMAYgJEAfsBtwGcAhoCMwFlAtoBVAFoAhcAlQBGA+QDGwFiA+MAdwFAASgBgABLAsYDvAKvAFQDaQClAo0CLwCRAN4BYgBKAYsAbQG+AfAAUQEsAZMCBQCdA58BtQG1As4CzgCnAF4B3wKIAfwB+wBnAE4BawD6AQ8BdgJAAu8DkAClAVUB+QKQAwgASgCnAU0B+wK2A0MDuAO3A8cAqQB9ASoCBAGVAn8C5AG/As8BEgEzAJYApQHwAfAAmgJXAbcAmgCiAgkCtwNFA6ECgwNsAD8CJgI7AlQEFQQuAIYDbAFLA30AwwD/AL4BFQFPAvYAqwBrBE8CPQBLAEYBrAORAG8APgF2AUIArACsAkcBkgKuAmMBZQHhAoIDKgLRAIEBnAIeAnwDogPQAOgBbQDTAQMAuQDAAeMB4wHjAoUClQBGAesAbwRVAnwApABvAI4B6gDZAfcBOwDZAZMA2QFGAccA2QDZAVcB2wDZAUYA2QGvANkBoQNiArwD5QK8A7UCvAOLArwDvAP+ArwDkwK8A90CvANYArwDOgI3BAAA9QFUAcIC/AHCA0UCmgG5ApoBuQHCAcICOwGMAVQBIADlATUAugCbAWcCdAHbAEoAdACHAJcAcgPcAOQECgPrAO0A/wEEAE4AcAFyAlIBKQBfAakAuwJJAksA1wB5AIQA9ABPAG4BWQIlARYAXwGLALICHAIeAMsAdgGwAeoCnQKdAqMAzwDGAQYBCQKRARUASwD0AMQBogEPAkACZQEPAjkCVwG0ATUBPwCzAOgAgwOrAKMASwBjAIcB+AIlAgIDbAQIA4UDzQPxBDsDsQEZAKQAnQEPAXgCAgJbAskDEwLiAk8CJAMlAyUCKgIqAEsA3wIlAQADMQM0AgkCDQNMAikA2gEgAQwA4QISAlQCQgISAlECVwI7AgwASABJANsAUAI1AvMCQQBqAuoDBQL4At4DtAC+AdcCQwLOAb4BNQFoAWsCEwCHAEwAlgDSAUUBHQFMAX0BVwKBAtACNwEvAXgBJwDUAbgClQIeAk0COgIrAkgCEQIZAiEDagNlAT4AkgIWAhIAWgIoAigBRAIkAE4BWwGWAIgAxgEXAXsB7AJxAvUDZgPKBCAEYQCQAGQBVwDBAV0DOQFXAVQBNQGOAX8BfwFUAZ4BNANCAzIDMgGOAPcA9wG5Ac8DgwHxAi8AXAPdApIDiQJu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ADQANwA1ADgAYgBjAGYANQA3AGEAMQA5ADYAOABmAGMAYgA3ADIANABlAE4AbwB0AG8AQwBvAGwAbwByAEUAbQBvAGoAaQAAAAMAAAAAAAD/swAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAACIAAALSAAA0JwAAAAAAAAAAAAAAOQABAAABWgACAAABYAADAAABZgAEAAABbAAFAAABcgAGAAABeAAHAAABfgAIAAABhAAJAAABigAKAAABkAALAAABlgAMAAABnAANAAABogAOAAABqAAPAAABrgAQAAABtAARAAABugASAAABwAATAAABxgAUAAABzAAVAAAB0gAWAAAB2AAXAAAB3gAYAAAB5AAZAAAB6gAaAAAB8AAbAAAB9gAcAAAB/AAdAAACAgAeAAACCAAfAAACDgAgAAACFAAhAAACGgAiAAACIAAjAAACJgAkAAACLAAlAAACMgAmAAACOAAnAAACPgAoAAACRAApAAACSgAqAAACUAArAAACVgAsAAACXAAtAAACYgAuAAACaAAvAAACbgAwAAACdAAxAAACegAyAAACgAAzAAAChgA0AAACjAA1AAACkgA2AAACmAA3AAACngA4AAACpAA5AAACqgEEAAAAAAENAAAABAELAAAAEQEzAAAAHAETAAAAWgEOAAAAbQEFAAAAewEJAAAAgAEYAAAAiQERAAAAoQFCAAAAsgEQAAAA9AEEAAABBAEFAAABCAEcAAABDQEHAAABKwEUAAABMgEHAAABRgEEAAABTQEJAAABUQEIAAABWgoAJYwAPgEGAAABYgECAAABaAEDAAABagEKAAABbQEMAAABdwEGAAABgwEpAAABiQEUAAABsgERAAABxgERAAAB1wENAAAB6AEIAAAB9QEJAAAB/QENAAACBgEJAAACEwEHAAACHAEUAAACIwEeAAACNwEbAAACVQEDAAACcAEEAAACcwEJAAACdwEOAAACgAEPAAACjgECAAACnQEHAAACnwEHAAACpgEgAAACrQEVAAACzQENAAAC4gEKAAAC7wEHAAAC+QEPAAADAAEEAAADDwEIAAADEwAAAxsAAAxwAAAMdgAADH0AAAyDAAAMogAADKgAAAyuAAAMuQAADMQAAAzKAAAM0AAADNsAAAzhAAAM5wAADO0AAAzzAAAM/gAA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I3kAACN/AAAjhQAAI6oAACOwAAAjtgAAI8EAACPHAAAj0gAAI90AACPoAAAj8wAAI/kAACP/AAAkBQAAJBAAACQWAAAkIQAAJCcAACQtAAAkOAAAJEMAACRJAAAkVAAAJF8AACRqAAAkdQAAJHsAACSGAAAkjAAAJJIAACSYAAAkowAAJK4AACTnAAAkuQAAJL8AACTFAAAkywAAJUQAACTWAAAk3AAAJOcAACTyAAAk+AAAJQMAACUOAAAlFAAAJRoAACVEAAAlTwAAJVoAACVlAAAlawAAJXEAACV8AAAlggAAJY0AACWYAAAlngAAJaQAACWqAAAltQAAJcAAACXLAAAl0QAAJdwAACXnAAAl8gAAJf0AACYIAAAmEwAAJhkAACYkAAAmWwAAJmEAACZnAAAmcgAAJn0AACaDAAAmjgAAJpkAACafAAAmpQAAJqsAACaxAAAmvAAAJscAACcjAAAneQAAJ4QAACeKAAAnlQAAJ6AAACerAAAntgAAJ8EAACfMAAAoIgAAKEcAACipAAAotAAAKLoAACjAAAAoxgAAKMwAACjSAAAo2AAAKN4AACjkAAAo6gAAKPAAACj2AAAo/AAAKQIAACkIAAApEwAAKWMAAClpAAApbwAAKXUAACl7AAAphgAAKYwAACmXAAApogAAKa0AACm4AAApwwAAKc4AACngAAAp2QAAKf4AACoEAAAqCgAAKhAAACoWAAAqLgAAKiEAAConAAAqUQAAKmMAACpcAAAqgQAAKocAACqSAAAqmAAAKp4AACqpAAAqvAAAKq8AACq1AAAq5wAAKtoAACrgAAArBQAAKwsAACsRAAArFwAAKx0AACsoAAArMwAAKzkAACteAAAraQAAK28AACt1AAArewAAK4EAACuHAAArjQAAK5gAACujAAArqQAAK68AACu1AAAruwAAK8EAACvHAAArzQAAK9MAACvZAAAr3wAAK+UAACvrAAAr8QAAK/cAACwCAAAsCAAALA4AACwZAAAsJAAALC8AACw6AAAsRQAALFAAACxWAAAsYQAALGcAACxyAAAsfQAALIMAACyOAAAs2AAALUYAAC1MAAAtUgAALVgAAC1jAAAtbgAALXkAAC2EAAAtigAALZUAAC26AAAt5wAALfIAAC34AAAuAwAALgkAAC4UAAAuHwAALioAAC41AAAuQAAA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AqUACAAIAAGFAAkACQACpQAKAAoAAY4ACwALAAGXAAwADAABoAANABAAAqUAEQARAAGpABIAEgABsgATABMAAqUAFAAUAAG7ABUAFQABxAAWABYAAmYAFwAXAAHNABgAGAAB1gAZABkAAd8AGgAaAAHoABsAGwAB8QAcABwAAqUAHQAdAAJCAB4AHgACZgAfAB8AAfoAIAAgAAIDACEAIQACDAAiACMAAhUAJAAkAAIeACUAJQACVAAmACYAAicAJwAnAAIwACgAKAACOQApACkAAkIAKgAqAAJLACsAKwACVAAsACwAAl0ALQAtAAJmAC4ALgACbwAvAC8AAngAMAAwAAKBADEAMQACigAyADIAArcAMwAzAAKTADQANQACpQA2ADYAApwANwA3AAKlADgAOAACrgA5ADkAArcBAKD/QARgA4ABAED/wATAAwABAED/IATAA4ABAOD/IAQAA2ABAMD/IARAA6ABAGD/IASgA6ABAED/wASgAsABAID/IASgA6ABASD/IAPgA6ABAID/IAQgA6ABAKD/IASAA6ABACD/IASAA8ABAED/AATAA6ABACD/QATAA6ABACD/AATgA8ABAED/AATAA8ABACD/IATAA8ABACD/YATAA2ABAGD/QATgA4ABAQD/AAPgA6ABACD/IATgA6ABAED/oATAAsABAED/YATAA4ABAED/YATAA0ABACD/IATAA4ABAED/oATAAyABACD/AATAA6ABACD/AASAA6ABAED/IATAA8ABAED/IATgA8ABAKD/IARAA6ABAQD/IAQAA6ABAID/IASAA6ABACD/IATAA2ABAKD/AAQgA6ABAED/IATAA6ABAMD/AARAA6ABAED/QATAA4AAAAABFAABARQAAAAOAAAAAAD/qWwA/2t5AP/KiAD/mowA/+qRAP/gpgD/6cAA/5tXAf+iawH//9ME/+HBCv/YbxP/vIMU/8ZrF//HbBf/UT0Z/9PCGv+mZRv/+YUe/8KLHv9JQx///Ycf/8KMH/8hISH/My0m/8aGJv+apib/Ly8o/1ZMKv9ANSv/Li0t/y0vLv8vMC7/9J0u/y8vL/+JeC//aF4z/2ZWNv/itDb/T0c3/2FVOf/jvTn/0qM8/9OkPP96cj//e3JA/1LCQP9CQkL/hnVC/4d2Qv9kWkX/T0xG/5uITP8uNE7/+MRP/09PUP9sY1P/L4tV/3prVv9lYl3/aGVg/2FhYf/owmL/rvBp/62lav9GS2v/rKRr/66ka//2y2z/QUxt/wxTb/+WinL/dXV1/7yfd/8wTXj/AHx5/wJ9ev+K3Hr/hsp7/0KzfP8zUX3/+neB/8Gvgf/AroL/wa+C/8GwhP+FhYX/UFyG/w1khv9SW4j/VFqK/76ui/+/r4z/1saU/+DRlP84Z5b/N8yX/+/Wmf+ampr/nZub/zxnnv8LdJ7/QWig/wqkof8JpKL/2c2j/xUmpP/VzqX/1tCl/z5fpv8SJqj/8OOo/xBYrP+1saz//eau/7CwsP/r37D/4NCy/+3htP8ZXrX/tbW1/9XOtv/Uzrj/0s65/+rkuf8+ebr/co26/yAPvP8Ab7z/0828/ww2v//c2MD/3NjB/0zQwv8nJ8X/KCjG/9/bxv/IyMj/3djI/zUZzP8zM8z/VXnN/9LNzv/b2c//i/7Q/xxw0f9sn9L/AILT/w7G1f9Si9b/MI/W/+Th1/+csdj/5uXZ/yoN2//37Nv/4eLd/+rn3f//+N3/6Ofe/xR/3/8Wf+D/AI/g/+Dg4P/z7OD/EKbi/+Li4v/u6+L/j7/j/+np4/+t/+P/qsXn/+vr5/8eoOv/rH/s/1Sz7P/u7uz/KdTu/+7u7v/y8e7/NJXx/7LS8f/w8fH/MW3y/1mi8v8ApvL/Grzy/3K98v82QvP/XKLz/3bJ8/82Q/T/N0P0/x5R9P8AtPT/tdb0//X09P9VoPX/9fX1/yqT+P/9//j/SML5/x7Y+f8Ap/r/+vr6/x0b+/8iK/v/GcL7//7/+/8Dvvz/GsH8/xnC/P/N6/z/Ndj9/////f8EkP7/p6j+/wS4/v8XxP7/FsX+/2ni/v/G6f7/+v/+/yMq//8lK///F1H//wBe//9ZXv//AF///2Zm//8Abf//Q3D//wCO//8AmP//AKD//yKn//8oqP//pKj//5Gr//8DuP//IMD//yfJ//8oyv//Kcr//zLM//8c1v//odj//zvb//8e3P//guD//1zh//9n5f//ceX//3nn//876///s+z//1ju//+r7///rfD//3Dx//928f//ffL//43z//+P9P//nfX//6v2//+t9///vfj//8T5///9/P//5/3///79///9/v//jf////////8AAAABAAAACgAmACgAAkRGTFQADmxhdG4AGAAEAAAAAP//AAAAAAAAAAAAAAAAAAEAAAJ+/YIAAATiAAAAMgSwAAAAAAAAAAAAAAAAAAAAAAABBOIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA) format('woff2');
unicode-range:U+2194,U+21A9,U+23F8,U+2600,U+2692,U+2696,U+26A0-U+26A1,U+26F5,U+2728,U+2753,U+2B06,U+2B50,U+1F300,U+1F308,U+1F319,U+1F327,U+1F32B,U+1F38F,U+1F3A3,U+1F3A8,U+1F3AD,U+1F3AF,U+1F3C5-U+1F3C6,U+1F3F9,U+1F40B,U+1F41F-U+1F421,U+1F446,U+1F451,U+1F4A4-U+1F4A5,U+1F4AA,U+1F4B0,U+1F4D4,U+1F4D6,U+1F4DC,U+1F4FA,U+1F504,U+1F507,U+1F50A,U+1F512,U+1F525,U+1F5B1,U+1F5D1,U+1F5FA,U+1F6A2,U+1F6D2,U+1F948,U+1F988,U+1F99E,U+1F9F9,U+1FA99,U+1FA9D,U+1FAB1;
}
</style>
<!-- EMOJI-FONT:END -->
<style>
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}
html,body{width:100%;height:100%;overflow:hidden;background:#0d3b66;font-family:'EmojiEmbedded',system-ui,-apple-system,'Segoe UI',Roboto,sans-serif} /* Э28: встроенный emoji-шрифт первым — единый вид на всех платформах (генерация: tools/emoji-font.py) */
#game{position:fixed;inset:0;touch-action:none;display:block}
button{font-family:inherit;cursor:pointer}
.hidden{display:none!important}
/* ---------- HUD ---------- */
#hud{position:fixed;top:0;left:0;right:0;display:flex;justify-content:space-between;align-items:center;
padding:calc(8px + env(safe-area-inset-top)) 10px 8px;z-index:10;pointer-events:none}
.hudleft{display:flex;gap:8px;align-items:center}
#coins,#weather{background:linear-gradient(rgba(9,32,58,.72),rgba(6,25,45,.62));padding:8px 15px;border-radius:999px;color:#ffe9a8;font-weight:700;
font-size:17px;border:1px solid rgba(255,233,168,.22);
box-shadow:0 3px 12px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.12);text-shadow:0 1px 2px rgba(0,0,0,.4)}
.hudbtns{display:flex;gap:8px;pointer-events:auto}
.hudbtns button{width:46px;height:46px;font-size:21px;border-radius:14px;
border:1px solid rgba(255,255,255,.16);background:linear-gradient(rgba(9,32,58,.72),rgba(6,25,45,.62));color:#fff;
box-shadow:0 3px 10px rgba(0,0,0,.3),inset 0 1px 0 rgba(255,255,255,.1);
transition:background .15s,transform .12s,box-shadow .12s}
.hudbtns button:hover{background:rgba(30,60,95,.8);transform:translateY(-1px)}
.hudbtns button:active{background:rgba(30,60,95,.85);transform:translateY(1px);box-shadow:0 1px 4px rgba(0,0,0,.3)}
#btnRecall{position:fixed;right:12px;bottom:calc(16px + env(safe-area-inset-bottom));width:54px;height:54px;
border-radius:50%;font-size:24px;background:linear-gradient(rgba(9,32,58,.8),rgba(6,25,45,.7));color:#fff;
border:1px solid rgba(255,255,255,.22);z-index:10;
box-shadow:0 4px 14px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.12);
transition:background .15s,transform .12s}
#btnRecall:hover{background:rgba(30,60,95,.85);transform:scale(1.05)}
#btnRecall:active{background:rgba(30,60,95,.9);transform:scale(.96)}
#toast{position:fixed;left:50%;bottom:calc(92px + env(safe-area-inset-bottom));transform:translateX(-50%);
background:linear-gradient(rgba(9,32,58,.94),rgba(5,20,38,.92));color:#fff;padding:11px 20px;border-radius:14px;font-size:15px;font-weight:600;
z-index:30;opacity:0;transition:opacity .25s;pointer-events:none;white-space:normal;text-align:center;max-width:min(88vw,560px);
border:1px solid rgba(255,255,255,.18);
box-shadow:0 6px 20px rgba(0,0,0,.45),inset 0 1px 0 rgba(255,255,255,.1)}
/* ---------- Overlays ---------- */
.overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;
background:rgba(4,16,32,.62);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);z-index:20;padding:16px}
.panel{position:relative;background:linear-gradient(165deg,#1a4d7d 0%,#123a61 55%,#0d2f4e 100%);
border:1px solid rgba(120,180,235,.35);border-radius:22px;
padding:22px;width:min(92vw,370px);max-height:86vh;overflow-y:auto;color:#eaf4ff;text-align:center;
box-shadow:0 24px 60px rgba(0,0,0,.55),0 4px 14px rgba(0,0,0,.35),inset 0 1px 0 rgba(255,255,255,.14)}
.panel::-webkit-scrollbar{width:8px}
.panel::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:99px}
.panel::-webkit-scrollbar-track{background:transparent}
.title{font-size:34px;font-weight:800;letter-spacing:1px;margin-bottom:10px;
text-shadow:0 2px 10px rgba(0,0,0,.4),0 1px 0 rgba(255,255,255,.15)}
.panel p{font-size:14.5px;line-height:1.5;color:#bcd6ee;margin-bottom:4px}
.big{width:100%;margin-top:16px;padding:15px;font-size:19px;font-weight:800;color:#04263d;
background:linear-gradient(#ffe08a,#f5a623);border:none;border-radius:14px;
box-shadow:0 4px 0 #b97708,0 8px 18px rgba(245,166,35,.35);
transition:transform .12s,box-shadow .12s,filter .12s}
.big:hover{filter:brightness(1.07)}
.big:active{transform:translateY(2px);box-shadow:0 2px 0 #b97708,0 4px 10px rgba(245,166,35,.3)}
.panelhead{font-size:22px;font-weight:800;margin-bottom:4px;text-shadow:0 1px 6px rgba(0,0,0,.35)}
#btnCloseShop{position:absolute;top:12px;right:12px;width:36px;height:36px;border-radius:50%;border:none;
background:rgba(255,255,255,.12);color:#fff;font-size:17px;transition:background .15s,transform .12s}
#btnCloseShop:hover{background:rgba(255,255,255,.22);transform:rotate(90deg)}
#btnCloseShop:active{transform:rotate(90deg) scale(.92)}
.tabs{display:flex;gap:8px;margin:10px 0 6px}
.tabs button{flex:1;padding:11px;border-radius:12px;border:none;background:rgba(255,255,255,.1);
color:#cfe4f7;font-weight:700;font-size:15px;box-shadow:inset 0 1px 0 rgba(255,255,255,.08);
transition:background .15s,color .15s,transform .12s,box-shadow .15s}
.tabs button:hover{background:rgba(255,255,255,.17)}
.tabs button:active{transform:scale(.96)}
.tabs button.active{background:linear-gradient(#ffd76e,#f5a623);color:#04263d;
box-shadow:0 3px 12px rgba(245,166,35,.4),inset 0 1px 0 rgba(255,255,255,.35)}
.section-title{font-size:12px;letter-spacing:1.5px;color:#8fb8dd;text-transform:uppercase;margin:14px 0 8px;text-align:left}
.item{display:flex;align-items:center;justify-content:space-between;gap:10px;background:rgba(255,255,255,.06);
border:1px solid rgba(255,255,255,.09);border-radius:12px;padding:10px 12px;margin-bottom:8px;text-align:left;
transition:background .15s,border-color .15s,transform .12s}
.item:hover{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.2);transform:translateY(-1px)}
.itemname{font-weight:700;font-size:15px}
.itemdesc{font-size:12px;color:#9fc3e2;margin-top:2px;line-height:1.35}
.buybtn{min-width:96px;padding:10px 10px;border-radius:10px;border:none;font-weight:700;font-size:13px;
background:#2e6da3;color:#fff;white-space:nowrap;flex-shrink:0;
box-shadow:0 2px 6px rgba(0,0,0,.25),inset 0 1px 0 rgba(255,255,255,.15);transition:filter .12s,transform .12s,background .15s}
.buybtn:hover{filter:brightness(1.15)}
.buybtn:active{transform:scale(.96)}
.buybtn.owned{background:rgba(255,255,255,.14)}
.buybtn.owned:hover{filter:none;background:rgba(255,255,255,.22)}
.buybtn.current{background:#2ecc71;color:#04263d;box-shadow:0 2px 8px rgba(46,204,113,.4)}
.buybtn:disabled{opacity:.45;cursor:default}
.buybtn.upgbt{background:#5c55a8}
.rowbtns{display:flex;flex-direction:column;gap:6px;flex-shrink:0;max-width:48%;align-items:stretch}
.rowbtns .buybtn{min-width:0;white-space:normal}
.lvtag{color:#ffd75e;font-weight:800;font-size:12px;margin-left:5px;white-space:nowrap}
.item.locked{opacity:.5}
.item.locked:hover{background:rgba(255,255,255,.06);border-color:rgba(255,255,255,.09);transform:none}
.statsline{font-size:13px;color:#9fc3e2;margin-bottom:6px}
.jrow{display:flex;align-items:center;gap:10px;padding:9px 10px;background:rgba(255,255,255,.05);
border:1px solid rgba(255,255,255,.06);border-radius:10px;margin-bottom:6px;font-size:14px;text-align:left;
transition:background .15s,border-color .15s}
.jrow:hover{background:rgba(255,255,255,.09);border-color:rgba(255,255,255,.14)}
.jrow .je{font-size:22px;width:30px;text-align:center}
.jrow .jn{flex:1}
.jrow .jc{color:#9fc3e2;font-weight:600;font-size:13px}
/* M6: мини-счётчики вариантов в дневнике (обычная/серебряная/золотая/радужная) */
.jrow .jv{font-weight:800;font-size:11px;margin-left:5px;white-space:nowrap}
.jrow .jv-n{color:#8fb8dd}
.jrow .jv-sv{color:#dbe7f3}
.jrow .jv-sn{color:#ffd75e}
.jrow .jv-rb{color:#c56cf0}
.jrow.unknown .je,.jrow.unknown .jn{color:#5d7f9e}
.jrow .adesc{font-size:11px;color:#9fc3e2}
.jrow.locked{opacity:.5}
.jrow.got .jc{color:#2ecc71;font-weight:800;font-size:16px}
.jrow.qdone{background:rgba(46,204,113,.14)}
.jrow.qdone .jc{color:#2ecc71;font-weight:700}
.streak{display:flex;gap:6px;justify-content:center;margin:8px 0 4px}
.st-dot{width:34px;height:34px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:800;
background:rgba(255,255,255,.08);color:#5d7f9e;border:2px solid rgba(255,255,255,.12);
transition:transform .15s,box-shadow .15s}
.st-dot.on{background:linear-gradient(#ffd76e,#f5a623);color:#04263d;border-color:#ffd75e}
.st-dot.cur{box-shadow:0 0 12px rgba(255,215,94,.85);transform:scale(1.12)}
#card .bigemoji{font-size:74px;margin:4px 0 2px;display:block;animation:bob 1.2s ease-in-out infinite;
filter:drop-shadow(0 6px 10px rgba(0,0,0,.4))}
@keyframes bob{0%,100%{transform:translateY(0)}50%{transform:translateY(-9px)}}
#card .rarity{display:inline-block;font-weight:800;font-size:12px;letter-spacing:1.5px;text-transform:uppercase;
padding:5px 14px;border-radius:999px;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.15)}
#card .cname{font-size:24px;font-weight:800;margin:6px 0 6px;text-shadow:0 1px 6px rgba(0,0,0,.4)}
#card .cval{font-size:20px;font-weight:800;color:#ffe9a8;margin-bottom:6px;text-shadow:0 1px 4px rgba(0,0,0,.3)}
#card .csub{font-size:13px;color:#9fc3e2;margin-bottom:4px}
.record{display:inline-block;background:linear-gradient(#ffd76e,#f5a623);color:#04263d;font-weight:800;font-size:14px;letter-spacing:1px;padding:4px 14px;border-radius:999px;animation:recpulse .8s ease-in-out infinite;box-shadow:0 0 14px rgba(255,215,94,.5)}
@keyframes recpulse{0%,100%{transform:scale(1)}50%{transform:scale(1.09)}}
/* M6: бейдж варианта и оформление карточки (silver/gold/rainbow; normal — без оформления) */
.variant-badge{display:inline-block;font-weight:800;font-size:14px;letter-spacing:1px;padding:4px 14px;border-radius:999px;margin-left:8px;
border:1px solid #fff;animation:recpulse .8s ease-in-out infinite}
#card.silver-card .variant-badge{background:linear-gradient(#f7fafd,#c3d4e6);color:#2f4d6d;border-color:#dbe7f3;box-shadow:0 0 14px rgba(200,220,240,.8)}
#card.gold-card .variant-badge{background:linear-gradient(#fff6c9,#ffd75e);color:#6b4a00;border-color:#ffd75e;box-shadow:0 0 14px rgba(255,215,94,.75)}
#card.rainbow-card .variant-badge{background:linear-gradient(#f3ddff,#c56cf0);color:#4b1a70;border-color:#e0b3ff;box-shadow:0 0 14px rgba(197,108,240,.8)}
#card.silver-card .panel{border-color:#c3d4e6;box-shadow:0 0 34px rgba(200,220,240,.45),0 10px 40px rgba(0,0,0,.5)}
#card.silver-card .bigemoji{filter:grayscale(.85) brightness(1.25) drop-shadow(0 0 12px rgba(210,228,245,.9))}
#card.gold-card .panel{border-color:#ffd75e;box-shadow:0 0 34px rgba(255,215,94,.5),0 10px 40px rgba(0,0,0,.5)}
#card.gold-card .bigemoji{filter:drop-shadow(0 0 12px rgba(255,215,94,.9))}
#card.rainbow-card .panel{border-color:#c56cf0;box-shadow:0 0 34px rgba(197,108,240,.5),0 10px 40px rgba(0,0,0,.5)}
#card.rainbow-card .bigemoji{animation:bob 1.2s ease-in-out infinite,rainbowhue 2.4s linear infinite}
@keyframes rainbowhue{from{filter:hue-rotate(0deg) drop-shadow(0 0 12px rgba(255,120,220,.8))}to{filter:hue-rotate(360deg) drop-shadow(0 0 12px rgba(120,220,255,.8))}}
.boss-badge{display:inline-block;background:linear-gradient(#fff6c9,#ffd75e);color:#6b4a00;font-weight:800;font-size:14px;letter-spacing:1px;padding:4px 14px;border-radius:999px;margin-left:8px;
border:1px solid #ffd75e;box-shadow:0 0 14px rgba(255,215,94,.75);animation:recpulse .8s ease-in-out infinite}
#card.boss-card .panel{border-color:#ffd75e;box-shadow:0 0 34px rgba(255,215,94,.55),0 10px 40px rgba(0,0,0,.5)}
#card.boss-card .bigemoji{filter:drop-shadow(0 0 12px rgba(255,215,94,.95))}
#card{animation:pop .3s ease}
@keyframes pop{from{transform:scale(.75);opacity:0}to{transform:scale(1);opacity:1}}
/* Y2: rewarded «монеты ×2» (карточка улова) — тёмно-синяя в духе карточки,
янтарная обводка «читается» как бонус; простой текстовый button (треб. 1.16 —
НЕ имитация рекламного блока платформы) */
.rvbtn{width:100%;min-height:44px;margin-top:10px;padding:11px 12px;font-size:15px;font-weight:800;color:#ffe9a8;
background:linear-gradient(#14406b,#0b2a49);border:1.5px solid #ffd75e;border-radius:12px;
box-shadow:0 0 12px rgba(255,215,94,.22),inset 0 1px 0 rgba(255,255,255,.08);
transition:transform .12s,box-shadow .12s,filter .12s}
.rvbtn:hover{filter:brightness(1.18);box-shadow:0 0 16px rgba(255,215,94,.4),inset 0 1px 0 rgba(255,255,255,.1)}
.rvbtn:active{transform:scale(.97)}
.rvbtn:disabled{opacity:.55;cursor:default;filter:none;transform:none}
.twobtns{display:flex;gap:10px;margin-top:16px}
.twobtns .big{margin-top:0;width:auto;flex:1}
.big.danger{background:linear-gradient(#ff8a7a,#e74c3c);box-shadow:0 4px 0 #96281b,0 8px 18px rgba(231,76,60,.35);color:#fff}
.big.danger:hover{filter:brightness(1.08)}
.big.danger:active{box-shadow:0 2px 0 #96281b,0 4px 10px rgba(231,76,60,.3)}
/* ---------- Адаптив: узкие и низкие экраны ---------- */
@media (max-width:420px){
.title{font-size:27px}
.panel{padding:16px;border-radius:18px}
.panelhead{font-size:19px}
.panel p{font-size:13.5px}
.big{padding:13px;font-size:17px;border-radius:12px}
#card .bigemoji{font-size:58px}
#card .cname{font-size:21px}
.hudbtns button{width:42px;height:42px;font-size:19px;border-radius:12px}
#coins,#weather{font-size:15px;padding:7px 12px}
.tabs button{padding:10px 6px;font-size:13.5px}
.jrow .je{font-size:20px;width:26px}
}
@media (max-height:620px){
.panel{max-height:92vh;padding:14px 16px}
.title{font-size:24px;margin-bottom:6px}
.panel p{font-size:13px;line-height:1.4}
#card .bigemoji{font-size:50px;margin:2px 0 0}
.big{margin-top:10px;padding:11px;font-size:16px}
.tabs button{padding:8px}
}
</style>
</head>
<body>
<canvas id="game"></canvas>
<div id="hud">
<div class="hudleft">
<div id="coins">🪙 0</div>
<span id="weather" class="hidden"></span>
</div>
<div class="hudbtns">
<button id="btnShop">🛒</button>
<button id="btnReset" title="Сбросить прогресс">🗑️</button>
<button id="btnMute">🔊</button>
<button id="btnPause" class="hidden" title="Пауза">⏸</button>
</div>
</div>
<button id="btnRecall" class="hidden">↩</button>
<div id="toast"></div>
<!-- Меню -->
<div id="menu" class="overlay">
<div class="panel">
<div class="title" id="menuTitle">🎣 РЫБАЛКА</div>
<!-- Y5: i18n — содержимое <p> и кнопки заполняет renderMenu() из T (RU-значения те же) -->
<p id="menuP1">👆 <b>Держи палец</b> — заряжай бросок,<br>
<b>отпусти</b> — кидай удочку.<br>
Дальше бросок = реже и жирнее рыба!</p>
<p id="menuP2" style="margin-top:8px">Видишь <b style="color:#ff6b5e">!</b> — быстро жми, чтобы зацепить.<br>
При вываживании: тяни, когда рыба отдыхает,<br>
отпусти, когда она <b>тянет</b> — иначе лопнет!<br>
Не тяни слишком долго — рыба <b>сбегает</b> (красная полоса)!</p>
<p id="menuP3" style="margin-top:8px">У каждой рыбы свой <b>вес</b>, продажа — по цене за кг.<br>
У удочек есть <b>предел веса</b>: перевесишь — шнур лопнет! <br>
Лучшие снасти = больше шансов на трофей 🏆</p>
<p id="menuP4" style="margin-top:8px">Не каждый заброс — с клёвом: если молчит — подожди.<br>
У удилищ есть <b>тормоз (drag)</b>: рывок сильнее — леска скользит!</p>
<button id="btnPlay" class="big">Играть</button>
</div>
</div>
<!-- Магазин -->
<div id="shop" class="overlay hidden">
<div class="panel">
<button id="btnCloseShop">×</button>
<div class="panelhead" id="shopTitle">🛒 Лавка рыбака</div>
<div class="tabs">
<button id="tabTackle" class="active" title="Снасти">🎣</button>
<button id="tabJournal" title="Дневник">📔</button>
<button id="tabRewards" title="Награды">🎯</button>
<button id="tabAch" title="Достижения">🏅</button>
<button id="tabSkins" title="Скины">🎨</button>
<button id="tabLocations" title="Локации">🗺️</button>
</div>
<div id="shopBody"></div>
</div>
</div>
<!-- Подтверждение сброса -->
<div id="resetDlg" class="overlay hidden">
<div class="panel">
<div class="panelhead" id="resetTitle">🗑️ Сбросить прогресс?</div>
<p id="resetText" style="margin-top:8px">Монеты, снасти и коллекция будут стёрты.<br>Это действие <b>нельзя отменить</b>.</p>
<div class="twobtns">
<button id="btnResetNo" class="big">Отмена</button>
<button id="btnResetYes" class="big danger">Сбросить</button>
</div>
</div>
</div>
<!-- Пауза (треб. Яндекс Игр 6.3) -->
<div id="pause" class="overlay hidden">
<div class="panel">
<div class="panelhead" id="pauseTitle">⏸ Пауза</div>
<div class="twobtns">
<button id="btnPauseResume" class="big">Продолжить</button>
<button id="btnPauseMenu" class="big">В меню</button>
</div>
</div>
</div>
<!-- Карточка улова -->
<div id="card" class="overlay hidden">
<div class="panel">
<div class="rarity" id="cardRarity">Обычная</div>
<div><span class="record hidden" id="cardRecord">🏆 РЕКОРД!</span><span class="variant-badge hidden" id="cardVariant">ЗОЛОТАЯ</span><span class="boss-badge hidden" id="cardBoss">🏆 БОСС!</span></div>
<span class="bigemoji" id="cardEmoji">🐟</span>
<div class="cname" id="cardName">Карась</div>
<div class="csub" id="cardSub">0.0 кг · 0 🪙/кг</div>
<div class="cval" id="cardVal">+0 🪙</div>
<!-- Y2: rewarded-видео «монеты ×2» (чистый бонус; 4.5.1 — что получим, написано прямо на кнопке) -->
<button id="btnRv" class="rvbtn hidden" title="Посмотрите рекламу — двойная цена за этот улов">📺 Реклама: ×2 за этот улов</button>
<div class="twobtns">
<button id="btnCardOk" class="big">Отлично!</button>
</div>
</div>
</div>
<script>
'use strict';
/* =========================================================
ДАННЫЕ
========================================================= */
const SPECIES=[
{id:'carass', name:'Карась', nameEn:'Crucian carp', emoji:'🐟', rarity:0, weight:100, minDist:0.00, strength:0.25, wMin:0.1, wMax:0.8, price:20, hue:45},
{id:'perch', name:'Окунь', nameEn:'Perch', emoji:'🐠', rarity:0, weight:55, minDist:0.05, strength:0.30, wMin:0.1, wMax:1.5, price:22, hue:120},
{id:'bream', name:'Лещ', nameEn:'Bream', emoji:'🐠', rarity:1, weight:26, minDist:0.30, strength:0.40, wMin:0.3, wMax:3.0, price:25, hue:210},
{id:'carp', name:'Карп', nameEn:'Carp', emoji:'🐡', rarity:1, weight:22, minDist:0.35, strength:0.45, wMin:0.5, wMax:8.0, price:28, hue:30},
{id:'pike', name:'Щука', nameEn:'Pike', emoji:'🦈', rarity:2, weight:9, minDist:0.50, strength:0.60, wMin:1.0, wMax:10.0, price:35, hue:100},
{id:'catfish',name:'Сом', nameEn:'Catfish', emoji:'🐡', rarity:2, weight:5, minDist:0.65, strength:0.75, wMin:2.0, wMax:20.0, price:45, hue:260},
{id:'sturge', name:'Осётр', nameEn:'Sturgeon', emoji:'🐋', rarity:3, weight:2.5, minDist:0.80, strength:0.85, wMin:5.0, wMax:40.0, price:65, hue:200},
{id:'gold', name:'Золотая рыбка', nameEn:'Golden Fish', emoji:'🎏', rarity:4, weight:1.2, minDist:0.90, strength:0.90, wMin:0.05, wMax:1.0, price:1500, hue:45},
/* Этап 5: жильцы Озёр (в реку не заходят — ролл реки по RIVER_*; порядок 0..7 не трогаем);
weight у новых видов не используется для ролла: река — RIVER_*, Озёра — LAKE_DAY_WEIGHTS/LAKE_NIGHT_WEIGHTS */
{id:'zander', name:'Судак', nameEn:'Zander', emoji:'🐟', rarity:2, weight:8, minDist:0.45, strength:0.60, wMin:1.0, wMax:6.0, price:40, hue:180},
{id:'chuch', name:'Хариус', nameEn:'Grayling', emoji:'🐠', rarity:1, weight:18, minDist:0.35, strength:0.35, wMin:0.2, wMax:2.0, price:30, hue:25},
{id:'crayfish',name:'Гигантский рак', nameEn:'Giant Crayfish', emoji:'🦞', rarity:3, weight:1.5, minDist:0.70, strength:0.50, wMin:0.2, wMax:1.0, price:200, hue:0},
];
const RARITY_NAMES=['Обычная','Необычная','Редкая','Эпическая','Легендарная'];
const RARITY_NAMES_EN=['Common','Uncommon','Rare','Epic','Legendary']; // Y5: i18n — EN-названия редкостей
const RARITY_COLORS=['#9fc3e2','#2ecc71','#4da3ff','#c56cf0','#ffd75e'];
/* M3: ночная таблица — те же виды, но веса спавна смещены к ночной рыбе (клон SPECIES);
Этап 5: +ночные веса новых видов (zander 6 / chuch 10 / crayfish 2.5) */
const NIGHT_WEIGHTS={carass:40,perch:80,bream:10,carp:8,pike:22,catfish:18,sturge:4,gold:1.2,zander:6,chuch:10,crayfish:2.5};
const SPECIES_NIGHT=SPECIES.map(s=>Object.assign({},s,{weight:NIGHT_WEIGHTS[s.id]}));
/* Этап 5: Локации — Река (родная вода, бесплатно) и Озёра (100000 🪙, новые рыбы).
water: [dayTop, dayMid, dayBot, nightTop, nightMid, nightBot] — базовые пары цветов
градиента drawWater(): день ↔ ночь плавно через nightMix (логика не меняется) */
const LOCATIONS=[
{id:0, name:'Река', nameEn:'River', cost:0, desc:'родная вода', descEn:'home waters',
water:['#2f9bd8','#1f6fb0','#0a2f52','#0d2246','#091c3a','#041226']},
{id:1, name:'Озёра', nameEn:'Lakes', cost:100000, desc:'новые рыбы: судак, хариус, гигантский рак', descEn:'new fish: zander, grayling, giant crayfish',
water:['#3d9c8a','#20726a','#0c423c','#0f2b33','#0a2129','#04141a']}
];
/* Река — только 8 базовых видов: роллы реки остаются прежними (новые виды заходят только в Озёра).
Фильтр по id: порядок и веса записей — ровно как в SPECIES/SPECIES_NIGHT */
const RIVER_IDS=['carass','perch','bream','carp','pike','catfish','sturge','gold'];
const RIVER_SPECIES=SPECIES.filter(s=>RIVER_IDS.indexOf(s.id)>=0);
const RIVER_SPECIES_NIGHT=SPECIES_NIGHT.filter(s=>RIVER_IDS.indexOf(s.id)>=0);
/* Озёра — все 11 видов: «рыбное» озеро (день) и ночное смещение к хищникам (ночь:
больше окуня/щуки/сома/судача, меньше карася/хариуса, рак 2).
SPECIES_NIGHT — источник весов только для реки (RIVER_SPECIES_NIGHT); у Озёр свои
LAKE_NIGHT_WEIGHTS — правьте ночные озёра здесь */
const LAKE_DAY_WEIGHTS={carass:60,perch:40,bream:30,carp:25,zander:14,chuch:22,pike:12,catfish:8,crayfish:1.5,sturge:3,gold:1.2};
const LAKE_NIGHT_WEIGHTS={carass:25,perch:70,bream:10,carp:8,zander:18,chuch:10,pike:24,catfish:16,crayfish:2,sturge:4,gold:1.2};
const LAKE_SPECIES=SPECIES.map(s=>Object.assign({},s,{weight:LAKE_DAY_WEIGHTS[s.id]}));
const LAKE_SPECIES_NIGHT=SPECIES.map(s=>Object.assign({},s,{weight:LAKE_NIGHT_WEIGHTS[s.id]}));
/* M6: шанс gold-варианта (let — автотест форсирует значения, как раньше) */
let SHINY_CHANCE=0.03;
/* M6: варианты рыб — таблица. Ролл по порядку: gold (SHINY_CHANCE) → silver → rainbow, иначе normal (E[mult]≈1.13) */
const VARIANTS=[
{id:'normal', name:'Обычная', nameEn:'Normal', mult:1, chance:0, css:''},
{id:'silver', name:'Серебряная', nameEn:'Silver', mult:2, chance:0.05, css:'silver'},
{id:'gold', name:'Золотая', nameEn:'Gold', mult:3, chance:0.03, css:'gold'},
{id:'rainbow', name:'Радужная', nameEn:'Rainbow', mult:5, chance:0.005, css:'rainbow'},
];
let forceVariant=null; // M6: тест-форс варианта ('silver'/'gold'/'rainbow'/null — всегда даёт его, паттерн forceBoss)
function variantChance(v){
let c=v.id==='gold'?SHINY_CHANCE:v.chance; // chance gold — живая SHINY_CHANCE
// M8: дождь — варианты ярче (silver/gold/rainbow ×2,5; normal не трогаем; босс всегда normal — не доходит сюда)
if(v.id!=='normal'&&weatherActive()==='rain') c*=WEATHER.rain.variantMult;
return c;
}
/* M6: ролл варианта улова */
function rollVariant(){
if(forceVariant){
const v=VARIANTS.find(x=>x.id===forceVariant);
if(v) return v;
}
for(const id of ['gold','silver','rainbow']){
const v=VARIANTS.find(x=>x.id===id);
if(Math.random()<variantChance(v)) return v;
}
return VARIANTS.find(x=>x.id==='normal');
}
/* M4: босс-рыба (Осётр-босс) — тест-форс появления (let — автотест, как SHINY_CHANCE) */
let forceBoss=false;
/* Спринт 4: пустые клёвы — тест-форс клёва (let — автотест, паттерн forceBoss) */
let forceBite=false;
/* M8: погода — дождь (варианты ×2,5) и туман (клёв ×1,5); события раз в 120–240 с, длятся 120 с */
const WEATHER={
rain:{icon:'🌧️', variantMult:2.5, toast:'Дождь: шанс серебряной/золотой/радужной ×2,5'},
fog:{icon:'🌫️', biteMult:1.5, toast:'Туман: клёв чаще ×1,5'}
};
const WEATHER_GAP_MIN=120, WEATHER_GAP_MAX=240; // сек до следующего события (случайный разброс)
const WEATHER_DURATION=120; // сек активного события
let forceWeather=null; // M8: тест-форс погоды ('rain'/'fog'/null — активна всегда, паттерн forceBoss)
const RODS=[
{id:0, name:'Дедова удочка', nameEn:"Grandpa's Rod", icon:'🧹', cost:0, maxW:3, line:100, drag:34, reel:1.0, size:0.00, desc:'До 3 кг · Нагрузка 100 · Drag 34 · Подсечка ×1.0', descEn:'Up to 3 kg · Load 100 · Drag 34 · Hookset ×1.0'},
{id:1, name:'Стеклопластик', nameEn:'Fiberglass', icon:'🎣', cost:875, maxW:8, line:140, drag:47, reel:1.3, size:0.08, desc:'До 8 кг · Нагрузка 140 · Drag 47 · Подсечка ×1.3', descEn:'Up to 8 kg · Load 140 · Drag 47 · Hookset ×1.3'},
{id:2, name:'Карбоновая', nameEn:'Carbon', icon:'🏹', cost:4500, maxW:18, line:190, drag:63, reel:1.7, size:0.16, desc:'До 18 кг · Нагрузка 190 · Drag 63 · Подсечка ×1.7', descEn:'Up to 18 kg · Load 190 · Drag 63 · Hookset ×1.7'},
{id:3, name:'Титан', nameEn:'Titanium', icon:'💪', cost:15000, maxW:40, line:260, drag:87, reel:2.3, size:0.28, desc:'До 40 кг · Нагрузка 260 · Drag 87 · Подсечка ×2.3', descEn:'Up to 40 kg · Load 260 · Drag 87 · Hookset ×2.3'},
];
const LURES=[
{id:0, name:'Простой крючок', nameEn:'Simple Hook', icon:'🪝', cost:0, cast:1.00, bite:1.0, rare:0.0, size:0.00, desc:'Надёжно, но рыба не в восторге', descEn:'Reliable, but the fish are not thrilled'},
{id:1, name:'Червь', nameEn:'Worm', icon:'🪱', cost:625, cast:1.00, bite:1.3, rare:0.2, size:0.12, desc:'Клёв на 30% чаще, шанс крупной выше', descEn:'30% more bites, better chance of big fish'},
{id:2, name:'Воблер', nameEn:'Wobbler', icon:'🐟', cost:3000, cast:1.15, bite:1.2, rare:0.8, size:0.28, desc:'Дальше бросок, приманивает крупных', descEn:'Farther casts, attracts big fish'},
{id:3, name:'Золотая блёстка', nameEn:'Gold Spinner', icon:'✨', cost:11250, cast:1.20, bite:1.4, rare:2.0, size:0.50, desc:'Лучшее, что есть. К ней плывут легенды', descEn:'The best there is — legends come to it'},
];
/* M5: апгрейды снастей — уровни 1..4 (макс). id 0 (база 0) — фиксированные цены
переходов 1→2, 2→3, 3→4; снасти id>0 — доля UPG_MULT от их базовой стоимости */
const ROD_UPG_COST=[70,210,500];
const LURE_UPG_COST=[60,160,400];
const UPG_MULT=[0.2,0.6,1.2]; // доля базы: →2 ур ×0.2, →3 ур ×0.6, →4 ур ×1.2
/* Что даёт следующий уровень (индекс = текущий уровень − 1) — подпись в лавке */
const ROD_UPG_NEXT=['фонарик (ночь), леска ×1.15','тормоз ×1.15, катушка ×1.10','леска ещё ×1.15, крупные +0.10'];
const LURE_UPG_NEXT=['клёв ×1.15','редкие +1.0','крупные +0.15'];
/* Y5: i18n — EN-версии подписей уровней (индексы те же) */
const ROD_UPG_NEXT_EN=['flashlight (night), line ×1.15','drag ×1.15, reel ×1.10','line ×1.15 more, big fish +0.10'];
const LURE_UPG_NEXT_EN=['bites ×1.15','rare +1.0','big fish +0.15'];
/* Цена перехода снасти i на следующий уровень (lv — текущий 1..3): id 0 — фикс, id>0 — база×множитель */
function upgCost(type,i,lv){
if(i===0) return (type==='rod'?ROD_UPG_COST:LURE_UPG_COST)[lv-1];
const base=(type==='rod'?RODS:LURES)[i].cost;
return Math.round(base*UPG_MULT[lv-1]/10)*10;
}
/* Этап 4: скины лодки и поплавка — чистая косметика (coin-sink), в лавке вкладка «Скины» */
const BOAT_SKINS=[
{id:0, name:'Обычная', nameEn:'Classic', cost:0},
{id:1, name:'Красная лодка', nameEn:'Red Boat', cost:800},
{id:2, name:'Лодка-домик', nameEn:'Boat House', cost:2000}
];
const BOBBER_SKINS=[
{id:0, name:'Обычный', nameEn:'Classic', cost:0},
{id:1, name:'Красный', nameEn:'Red', cost:500},
{id:2, name:'Неоновый', nameEn:'Neon', cost:1500}
];
/* =========================================================
СОХРАНЕНИЕ
========================================================= */
const SAVE_KEY='fishing-save-v1';
let save={coins:0,rod:0,lure:0,rods:[0],lures:[0],rodLv:{0:1},lureLv:{0:1},caught:{},muted:false,casts:0,earned:0,
snaps:0,ach:{},quests:null,streak:{last:null,days:0,shieldWeek:null},questsDoneTotal:0,
bossBeaten:false,bossCount:0,
boatSkins:[0],boatSkin:0,bobberSkins:[0],bobberSkin:0,
locations:[0],location:0,
kgTotal:0,nightCatch:false,wxRainV:0,wxFog:0}; // Этап 4: скины; Этап 5: локации; Этап 22: счётчики ачивок (кг/ночь/погода)
function freshSave(muted){
return {coins:0,rod:0,lure:0,rods:[0],lures:[0],rodLv:{0:1},lureLv:{0:1},caught:{},muted:muted,casts:0,earned:0,
snaps:0,ach:{},quests:null,streak:{last:null,days:0,shieldWeek:null},questsDoneTotal:0,
bossBeaten:false,bossCount:0,
boatSkins:[0],boatSkin:0,bobberSkins:[0],bobberSkin:0,
locations:[0],location:0,
kgTotal:0,nightCatch:false,wxRainV:0,wxFog:0}; // Этап 4: скины; Этап 5: локации; Этап 22: счётчики ачивок
}
function loadSave(){
try{ const s=localStorage.getItem(SAVE_KEY); if(s) Object.assign(save,JSON.parse(s)); }catch(e){}
// миграция старых сейвов: caught[id] был числом → теперь {n, best}
for(const k in save.caught){
if(typeof save.caught[k]==='number') save.caught[k]={n:save.caught[k],best:0};
}
// миграция M1: у записи появился счётчик shiny (sn)
for(const k in save.caught){
const c=save.caught[k];
if(c&&typeof c==='object'&&typeof c.sn!=='number') c.sn=0;
}
// миграция M6: счётчики вариантов sv (silver) и rb (rainbow)
for(const k in save.caught){
const c=save.caught[k];
if(c&&typeof c==='object'){
if(typeof c.sv!=='number') c.sv=0;
if(typeof c.rb!=='number') c.rb=0;
}
}
// миграция M2: новые поля (старые сейвы обязаны читаться)
if(typeof save.snaps!=='number') save.snaps=0;
if(!save.ach||typeof save.ach!=='object') save.ach={};
if(typeof save.questsDoneTotal!=='number') save.questsDoneTotal=0;
if(!save.quests||typeof save.quests!=='object') save.quests=null;
if(!save.streak||typeof save.streak!=='object') save.streak={last:null,days:0,shieldWeek:null};
// M3: приманки — дефолт для старых сейвов
if(!save.lures||!Array.isArray(save.lures)) save.lures=[0];
if(!save.rods||!Array.isArray(save.rods)) save.rods=[0];
// M5: фонарик больше не приманка (id=4) — убираем из старых сейвов
if(save.lures.includes(4)) save.lures=save.lures.filter(x=>x!==4);
if(!save.lures.length) save.lures=[0];
if(save.lure===4) save.lure=0;
// M5: уровни снастей 1..4 — в старых сейвах их нет: купленным — уровень 1
if(!save.rodLv||typeof save.rodLv!=='object') save.rodLv={};
if(!save.lureLv||typeof save.lureLv!=='object') save.lureLv={};
for(const i of save.rods) if(!(save.rodLv[i]>=1)) save.rodLv[i]=1;
for(const i of save.lures) if(!(save.lureLv[i]>=1)) save.lureLv[i]=1;
delete save.lureLv[4];
// M3: цикл дня/ночи — без dayTime старт с утра; день идёт в реальном времени,
// пока игрока не было, сдвиг догоняет (mod 1)
if(typeof save.dayTime!=='number'||save.dayTime<0) save.dayTime=0;
setDayTime(save.dayTime+(Date.now()-(save.lastSaveMs||Date.now()))/1000/DAY_LENGTH);
save.lastSaveMs=Date.now();
// M4: босс (Осётр-босс) — новые поля, дефолты для старых сейвов
if(typeof save.bossBeaten!=='boolean') save.bossBeaten=false;
if(typeof save.bossCount!=='number') save.bossCount=0;
// Этап 4: скины лодки/поплавка — дефолты для старых сейвов и чинка битых значений
if(!save.boatSkins||!Array.isArray(save.boatSkins)) save.boatSkins=[0];
if(save.boatSkins.indexOf(0)<0) save.boatSkins.push(0); // бесплатный скин 0 гарантирован (битый сейв)
if(!save.bobberSkins||!Array.isArray(save.bobberSkins)) save.bobberSkins=[0];
if(save.bobberSkins.indexOf(0)<0) save.bobberSkins.push(0);
if(typeof save.boatSkin!=='number'||save.boatSkin<0||save.boatSkin>2) save.boatSkin=0;
if(typeof save.bobberSkin!=='number'||save.bobberSkin<0||save.bobberSkin>2) save.bobberSkin=0;
if(save.boatSkins.indexOf(save.boatSkin)<0) save.boatSkin=0; // экипированного нет в купленных (битый сейв)
if(save.bobberSkins.indexOf(save.bobberSkin)<0) save.bobberSkin=0;
// Этап 5: локации (Река/Озёра) — дефолты для старых сейвов и чинка битых значений (паттерн скинов)
if(!save.locations||!Array.isArray(save.locations)) save.locations=[0];
if(save.locations.indexOf(0)<0) save.locations.push(0); // родная Река гарантирована (битый сейв)
if(typeof save.location!=='number'||save.location<0||save.location>1) save.location=0;
if(save.locations.indexOf(save.location)<0) save.location=0; // выбранной локации нет в купленных (битый сейв)
// M2: стрик входа и квесты дня (новый день — перегенерация)
applyStreak();
refreshQuests();
}
function persist(){
save.dayTime=dayTime; // M3: время суток храним в сейве
save.lastSaveMs=Date.now(); // M3: время последнего сейва (для догона дня)
try{ localStorage.setItem(SAVE_KEY,JSON.stringify(save)); }catch(e){}
}
/* =========================================================
M3: ЦИКЛ ДНЯ/НОЧИ
========================================================= */
const DAY_LENGTH=300; // секунд на полный день
let dayTime=0; // 0..1 — позиция в сутках
let dayPhase='morning'; // morning (0-0.25) day (0.25-0.5) evening (0.5-0.75) night (0.75-1.0)
let nightNoLightToast=false; // тост «Ночью нужен фонарик» — разово, не каждый кадр
function phaseOf(t){ return t<0.25?'morning':(t<0.5?'day':(t<0.75?'evening':'night')); }
function setDayTime(t){ t%=1; if(t<0)t+=1; dayTime=t; dayPhase=phaseOf(dayTime); }
/* =========================================================
M8: ПОГОДА — ДОЖДЬ И ТУМАН
========================================================= */
/* Случайный разброс до следующего события (сек) */
function weatherGapNext(){ return WEATHER_GAP_MIN+Math.random()*(WEATHER_GAP_MAX-WEATHER_GAP_MIN); }
/* Эффективная погода: тест-форс имеет приоритет (срабатывает синхронно, без ожидания кадра),
иначе естественное состояние. Единственная точка чтения для эффектов/визуала/HUD */
function weatherActive(){ return forceWeather||weather; }
/* Таймер — в реальном времени (как DAY_LENGTH в frame): между событиями разброс WEATHER_GAP_*,
само событие длится WEATHER_DURATION. При forceWeather погода активна всегда — таймеры не гоняем */
function updateWeather(dt){
if(forceWeather) return; // форс: таймеры не гоняем, weatherT не тикает
if(weather){
weatherT-=dt;
if(weatherT<=0){
weather=null; weatherGap=weatherGapNext();
toast(t('wx_clear'));
}
}else{
weatherGap-=dt;
if(weatherGap<=0){
weather=Math.random()<0.5?'rain':'fog'; // rain/fog 50/50
weatherT=WEATHER_DURATION;
// gap следующего события не роллим здесь: его задаст ветка конца события
toast(t('wx_'+weather)); // Y5: i18n — тост погоды из T (RU/EN)
}
}
}
/* Пилюля #weather в HUD рядом с #coins: иконка + остаток секунд («🌧️ 97с»);
при форсе показываем полную длительность (событие «всегда активно»). Обновляется по таймеру;
сравниваем ЦЕЛИК text (смена иконки rain↔fog не меняет секунд) */
let weatherHudTxt='';
function updateWeatherHud(){
const el=$('weather');
const id=weatherActive();
if(!id){
if(!el.classList.contains('hidden')) el.classList.add('hidden');
weatherHudTxt='';
return;
}
if(el.classList.contains('hidden')) el.classList.remove('hidden');
const sec=forceWeather?WEATHER_DURATION:Math.max(0,Math.ceil(weatherT));
const txt=WEATHER[id].icon+' '+sec+t('sec_short'); // Y5: i18n — «с»/«s»
if(txt!==weatherHudTxt){
weatherHudTxt=txt;
el.textContent=txt;
}
}
/* =========================================================
M2: НАГРАДЫ — КВЕСТЫ ДНЯ, СТРИК ВХОДА, ДОСТИЖЕНИЯ
========================================================= */
const STREAK_REWARDS=[25,50,75,100,125,150,200]; // награды дней 1-7 стрика
function todayStr(){
const d=new Date();
return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');
}
function dateShift(dateStr,days){
const d=new Date(dateStr+'T00:00:00');
d.setDate(d.getDate()+days);
return d.getFullYear()+'-'+String(d.getMonth()+1).padStart(2,'0')+'-'+String(d.getDate()).padStart(2,'0');
}
/* ISO-неделя «YYYY-Www» (детерминированно — тесты повторяют расчёт) */
function isoWeek(dateStr){
const d=new Date(dateStr+'T12:00:00');
const day=(d.getDay()+6)%7;
d.setDate(d.getDate()-day+3); // четверг этой ISO-недели
const year=d.getFullYear();
const jan4=new Date(year,0,4);
const jan4day=(jan4.getDay()+6)%7;
const week1Thu=new Date(year,0,4-jan4day+3);
const week=1+Math.round((d-week1Thu)/(7*24*3600*1000));
return year+'-W'+String(week).padStart(2,'0');
}
/* Детерминированный hash строки даты (FNV-1a) — тесты смогут повторить генерацию */
function daySeed(dateStr){
let h=2166136261>>>0;
for(let i=0;i<dateStr.length;i++){
h^=dateStr.charCodeAt(i);
h=Math.imul(h,16777619);
}
return h>>>0;
}
function seededRand(seed){
let a=seed>>>0;
return function(){
a=(a+0x6D2B79F5)>>>0;
let t=a;
t=Math.imul(t^(t>>>15),t|1);
t^=t+Math.imul(t^(t>>>7),t|61);
return ((t^(t>>>14))>>>0)/4294967296;
};
}
/* --- Квесты дня --- */
const QUEST_NAMES={carass:['карась','карася','карасей'],perch:['окунь','окуня','окуней'],bream:['лещ','леща','лещей']};
const QUEST_NAMES_EN={carass:'Crucian carp',perch:'Perch',bream:'Bream'}; // Y5: i18n — EN-имена для квестов
const QUEST_TPLS=[
{tpl:'catch_species', make(r){ const sp=SPECIES[[0,1,2][Math.floor(r()*3)]];
return {tpl:'catch_species', param:sp.id, goal:3+Math.floor(r()*3), reward:100+Math.floor(r()*51)}; }},
{tpl:'earn_coins', make(r){
return {tpl:'earn_coins', param:0, goal:[150,250,400][Math.floor(r()*3)], reward:80+Math.floor(r()*41)}; }},
{tpl:'catch_weight', make(r){ const n=[2,3,5][Math.floor(r()*3)];
return {tpl:'catch_weight', param:n, goal:1, reward:120+Math.floor(r()*41)}; }},
{tpl:'casts', make(r){
return {tpl:'casts', param:0, goal:[8,10,15][Math.floor(r()*3)], reward:60+Math.floor(r()*41)}; }},
{tpl:'catch_rarity', make(r){
return {tpl:'catch_rarity', param:[1,2][Math.floor(r()*2)], goal:1, reward:150}; }},
{tpl:'catch_shiny', make(r){
return {tpl:'catch_shiny', param:0, goal:1, reward:200}; }},
];
function pluralN(n,forms){
const m10=n%10,m100=n%100;
if(m10===1&&m100!==11) return forms[0];
if(m10>=2&&m10<=4&&(m100<12||m100>14)) return forms[1];
return forms[2];
}
function questText(q){
if(LANG==='en'){ // Y5: i18n — EN-ветка (RU-ветка ниже — побуквенно без изменений)
switch(q.tpl){
case 'catch_species': return 'Catch '+q.goal+' '+QUEST_NAMES_EN[q.param];
case 'earn_coins': return 'Earn '+q.goal+' coins today';
case 'catch_weight': return 'Catch a fish from '+q.param+' kg';
case 'casts': return 'Make '+q.goal+' casts today';
case 'catch_rarity': return 'Catch a '+trRarity(q.param)+'+ fish';
case 'catch_shiny': return 'Catch a golden fish';
}
return '?';
}
switch(q.tpl){
case 'catch_species': return 'Поймай '+q.goal+' '+pluralN(q.goal,QUEST_NAMES[q.param]);
case 'earn_coins': return 'Заработай '+q.goal+' монет за день';
case 'catch_weight': return 'Поймай рыбу от '+q.param+' кг';
case 'casts': return 'Сделай '+q.goal+' забросов за день';
case 'catch_rarity': return 'Поймай рыбу редкости '+RARITY_NAMES[q.param]+'+';
case 'catch_shiny': return 'Поймай золотую рыбу'; // M6: «shiny» = gold-вариант
}
return '?';
}
function questIcon(q){
if(q.tpl==='catch_species'){ const sp=SPECIES.find(s=>s.id===q.param); return sp?sp.emoji:'🐟'; }
return {earn_coins:'🪙', catch_weight:'⚖', casts:'🎣', catch_rarity:'⭐', catch_shiny:'✨'}[q.tpl]||'🎯';
}
/* 3 квеста дня из 6 шаблонов, без повторов, детерминированно от даты */
function genQuests(dateStr){
const r=seededRand(daySeed(dateStr));
const ids=QUEST_TPLS.map((t,i)=>i);
for(let i=ids.length-1;i>0;i--){ const j=Math.floor(r()*(i+1)); const tmp=ids[i]; ids[i]=ids[j]; ids[j]=tmp; }
return ids.slice(0,3).map(i=>{ const q=QUEST_TPLS[i].make(r); q.prog=0; q.done=false; return q; });
}
function refreshQuests(){
const today=todayStr();
if(!(save.quests&&save.quests.date===today)){
save.quests={date:today, list:genQuests(today)};
persist();
}
}
/* --- Стрик входа (с еженедельным щитом на один пропуск) --- */
function streakIdx(days){ return ((days-1)%7)+1; }
function nextStreakReward(days){ return STREAK_REWARDS[streakIdx((days||0)+1)-1]; }
function applyStreak(){
const today=todayStr();
if(save.streak.last===today) return;
const fresh=!save.streak.last; // первый визит — стрик запускается (награда дня с неё не выдаётся)
if(save.streak.last===dateShift(today,-1)){
save.streak.days=(save.streak.days||0)+1; // вчерашний визит — стрик растёт
}else if(save.streak.last===dateShift(today,-2)&&save.streak.shieldWeek!==isoWeek(today)){
save.streak.days=(save.streak.days||0)+1; // один пропуск в неделю прощает щит
save.streak.shieldWeek=isoWeek(today);
toast(t('shield'));
}else{
save.streak.days=1;
}
save.streak.last=today;
if(!fresh){
const coins=STREAK_REWARDS[streakIdx(save.streak.days)-1];
save.coins+=coins;
toast(tt('streak_day',{d:save.streak.days,c:coins}));
}
persist();
checkAchievements(); // streak_7
}
/* --- Прогресс квестов (delta — на сколько шагнуть: 1 улов / N монет и т.п.) --- */
function questHit(tpl,condFn,delta){
if(!save.quests) return;
for(const q of save.quests.list){
if(q.done||q.tpl!==tpl) continue;
if(!condFn(q)) continue;
q.prog+=delta||1;
if(q.prog>=q.goal){
q.prog=q.goal; q.done=true;
save.coins+=q.reward; save.questsDoneTotal++;
updateHUD(); // награда может прийти на забросе (вне catchFish) — счётчик монет обновить сразу
sfx('coin');
toast(tt('quest_done',{text:questText(q),r:q.reward}));
checkAchievements(); // quests_5
}
}
}
/* Новый день: стрик + перегенерация квестов (loadSave, cast, catch) */
function newDayCheck(){ applyStreak(); refreshQuests(); }
/* --- Достижения с постоянными бонусами --- */
function caughtN(s,id){ const c=s.caught&&s.caught[id]; return c?c.n:0; }
function caughtBest(s,id){ const c=s.caught&&s.caught[id]; return c?c.best:0; }
/* Y5: i18n — у достижений nameEn/descEn (RU name/desc — побуквенно те же) */
const ACHIEVEMENTS=[
{id:'first_catch', name:'Первый улов', nameEn:'First Catch', desc:'Поймай первую рыбу', descEn:'Catch your first fish', icon:'🐟', bonus:{coinPct:0.01}, check:s=>SPECIES.some(sp=>caughtN(s,sp.id)>0)},
{id:'casts_10', name:'Разминка', nameEn:'Warm-up', desc:'Сделай 10 забросов', descEn:'Make 10 casts', icon:'🎣', bonus:{coinPct:0.01}, check:s=>s.casts>=10},
{id:'casts_100', name:'Моряк', nameEn:'Sailor', desc:'Сделай 100 забросов', descEn:'Make 100 casts', icon:'⛵', bonus:{coinPct:0.01}, check:s=>s.casts>=100},
{id:'earned_1000', name:'Первая тысяча', nameEn:'First Thousand', desc:'Заработай 1000 монет', descEn:'Earn 1,000 coins', icon:'🪙', bonus:{coinPct:0.01}, check:s=>s.earned>=1000},
{id:'earned_10000', name:'Рыбацкий капитал', nameEn:'Fishing Capital', desc:'Заработай 10 000 монет', descEn:'Earn 10,000 coins', icon:'💰', bonus:{coinPct:0.02}, check:s=>s.earned>=10000},
{id:'gear_max', name:'Максимальная снасть', nameEn:'Max Gear', desc:'Улучши снасть до 4 уровня', descEn:'Upgrade a gear to level 4', icon:'⚒️', bonus:{coinPct:0.01}, check:s=>Object.values(s.rodLv||{}).some(v=>v>=4)||Object.values(s.lureLv||{}).some(v=>v>=4)}, // Этап 22: M5 апгрейды
{id:'titan', name:'Титан', nameEn:'Titan', desc:'Купи удочку «Титан»', descEn:'Buy the Titanium rod', icon:'💪', bonus:{coinPct:0.02}, check:s=>(s.rods||[]).indexOf(3)>=0},
{id:'species_3', name:'Ботаник', nameEn:'Botanist', desc:'Поймай 3 вида рыб', descEn:'Catch 3 fish species', icon:'📖', bonus:{coinPct:0.01}, check:s=>SPECIES.filter(sp=>caughtN(s,sp.id)>0).length>=3},
{id:'species_8', name:'Энциклопедия', nameEn:'Encyclopedia', desc:'Поймай все виды', descEn:'Catch all species', icon:'🏆', bonus:{coinPct:0.02}, check:s=>SPECIES.every(sp=>caughtN(s,sp.id)>0)}, // Этап 5: теперь все 11 видов (id старый сейв)
{id:'rare_fish', name:'Редкий гость', nameEn:'Rare Guest', desc:'Поймай рыбу редкости «Редкая»+ ', descEn:'Catch a Rare+ fish', icon:'⭐', bonus:{coinPct:0.01}, check:s=>SPECIES.some(sp=>sp.rarity>=2&&caughtN(s,sp.id)>0)},
{id:'legendary_fish',name:'Легенда', nameEn:'Legend', desc:'Поймай рыбу редкости «Легендарная»', descEn:'Catch a Legendary fish', icon:'👑',bonus:{coinPct:0.02}, check:s=>SPECIES.some(sp=>sp.rarity>=4&&caughtN(s,sp.id)>0)},
{id:'first_shiny', name:'Золотая жила', nameEn:'Gold Rush', desc:'Поймай золотую рыбу', descEn:'Catch a golden fish', icon:'✨', bonus:{coinPct:0.01}, check:s=>SPECIES.some(sp=>{const c=s.caught&&s.caught[sp.id]; return c&&c.sn>0;})},
{id:'first_silver', name:'Серебро', nameEn:'Silver', desc:'Поймай серебряную рыбу', descEn:'Catch a silver fish', icon:'🥈', bonus:{coinPct:0.01}, check:s=>SPECIES.some(sp=>{const c=s.caught&&s.caught[sp.id]; return c&&(c.sv||0)>0;})}, // Этап 22: M6 варианты
{id:'first_rainbow',name:'Радужный улов', nameEn:'Rainbow Catch', desc:'Поймай радужную рыбу', descEn:'Catch a rainbow fish', icon:'🌈', bonus:{coinPct:0.02}, check:s=>SPECIES.some(sp=>{const c=s.caught&&s.caught[sp.id]; return c&&(c.rb||0)>0;})},
{id:'full_variants',name:'Полная коллекция', nameEn:'Full Collection', desc:'Поймай все виды во всех вариантах', descEn:'Catch every species in every variant', icon:'🌈',bonus:{coinPct:0.05}, check:s=>SPECIES.every(sp=>{const c=s.caught&&s.caught[sp.id]; return c&&c.n>0&&(c.sv||0)>0&&(c.sn||0)>0&&(c.rb||0)>0;})},
{id:'weight_10', name:'Трофей', nameEn:'Trophy', desc:'Поймай рыбу 10+ кг', descEn:'Catch a fish of 10+ kg', icon:'⚖', bonus:{windowS:0.05}, check:s=>SPECIES.some(sp=>caughtBest(s,sp.id)>=10)},
{id:'weight_20', name:'Монстр глубин', nameEn:'Deep Monster', desc:'Поймай рыбу 20+ кг', descEn:'Catch a fish of 20+ kg', icon:'🐋', bonus:{line:5}, check:s=>SPECIES.some(sp=>caughtBest(s,sp.id)>=20)},
{id:'weight_1000', name:'Тонна рыбы', nameEn:'A Ton of Fish', desc:'Поймай рыбы на 1000+ кг', descEn:'Catch 1,000+ kg of fish', icon:'🚢', bonus:{coinPct:0.02}, check:s=>(s.kgTotal||0)>=1000}, // Этап 22
{id:'night_first', name:'Ночной клёв', nameEn:'Night Bite', desc:'Поймай рыбу ночью', descEn:'Catch a fish at night', icon:'🌙', bonus:{coinPct:0.01}, check:s=>s.nightCatch===true},
{id:'rain_variant', name:'Дождливый везунчик', nameEn:'Rainy Lucky Guy', desc:'Поймай особую рыбу в дождь', descEn:'Catch a special fish in the rain', icon:'🌧️', bonus:{coinPct:0.01}, check:s=>(s.wxRainV||0)>0}, // Этап 22: M8 погода
{id:'fog_catch', name:'Туманный улов', nameEn:'Foggy Catch', desc:'Поймай рыбу в тумане', descEn:'Catch a fish in the fog', icon:'🌫️', bonus:{coinPct:0.01}, check:s=>(s.wxFog||0)>0},
{id:'snaps_10', name:'Упёртый', nameEn:'Stubborn', desc:'10 обрывов шнура', descEn:'Snap the line 10 times', icon:'💥', bonus:{coinPct:0.01}, check:s=>s.snaps>=10},
{id:'snaps_50', name:'Хроники обрывов', nameEn:'Snap Chronicles', desc:'50 обрывов шнура', descEn:'Snap the line 50 times', icon:'📜', bonus:{coinPct:0.01}, check:s=>s.snaps>=50},
{id:'streak_7', name:'Семёрка', nameEn:'Seven', desc:'Стрик 7 дней', descEn:'7-day streak', icon:'🔥', bonus:{coinPct:0.01}, check:s=>s.streak&&s.streak.days>=7},
{id:'quests_5', name:'Дневник искателя', nameEn:"Seeker's Diary", desc:'Выполни 5 квестов', descEn:'Complete 5 quests', icon:'🎯', bonus:{coinPct:0.01}, check:s=>s.questsDoneTotal>=5},
{id:'skin_first', name:'Красуйся', nameEn:'Dress Up', desc:'Купи скин лодки или поплавка', descEn:'Buy a boat or bobber skin', icon:'🎨', bonus:{coinPct:0.01}, check:s=>(s.boatSkins||[]).length>1||(s.bobberSkins||[]).length>1}, // Этап 22: M-skins
{id:'skins_all', name:'Стилист', nameEn:'Stylist', desc:'Собери все скины лодки и поплавка', descEn:'Collect all boat and bobber skins', icon:'🎭',bonus:{coinPct:0.02}, check:s=>BOAT_SKINS.every(b=>(s.boatSkins||[]).indexOf(b.id)>=0)&&BOBBER_SKINS.every(b=>(s.bobberSkins||[]).indexOf(b.id)>=0)},
{id:'lake_first', name:'Новые берега', nameEn:'New Shores', desc:'Открой локацию «Озёра»', descEn:'Unlock the Lakes location', icon:'🗺️', bonus:{coinPct:0.02}, check:s=>(s.locations||[]).indexOf(1)>=0}, // Этап 22: локации
{id:'boss_first', name:'Босс-рыбак', nameEn:'Boss Angler', desc:'Победи Осётра-босса', descEn:'Defeat the Sturgeon boss', icon:'🏆', bonus:{coinPct:0.03}, check:s=>(s.bossBeaten===true)||(s.bossCount>0)},
];
/* Сумма бонусов по выданным достижениям */
function achBonus(){
const b={coinPct:0,windowS:0,line:0};
for(const a of ACHIEVEMENTS){
if(!save.ach||!save.ach[a.id]) continue;
if(a.bonus.coinPct) b.coinPct+=a.bonus.coinPct;
if(a.bonus.windowS) b.windowS+=a.bonus.windowS;
if(a.bonus.line) b.line+=a.bonus.line;
}
return b;
}
function checkAchievements(){
let changed=false;
for(const a of ACHIEVEMENTS){
if(save.ach[a.id]) continue;
if(a.check(save)){
save.ach[a.id]=true; changed=true;
sfx('coin');
if(a.id==='full_variants'){ save.coins+=5000; updateHUD(); } // M6: разовые 5000 за полную коллекцию вариантов
toast(tt('ach_toast',{name:trName(a)})+(a.id==='full_variants'?' +5000 🪙':''));
}
}
if(changed) persist();
}
function bonusText(b){
if(b.coinPct) return tt('bonus_coin',{v:(b.coinPct*100)});
if(b.windowS) return tt('bonus_window',{v:b.windowS});
if(b.line) return tt('bonus_line',{v:b.line});
return '';
}
/* =========================================================
ХОЛСТ И РАЗМЕРЫ
========================================================= */
const canvas=document.getElementById('game');
const ctx=canvas.getContext('2d');
let W=0,H=0,DPR=1,waterY=0,boatX=0;
let tip={x:0,y:0};
function resize(){
DPR=Math.min(window.devicePixelRatio||1,2);
W=window.innerWidth; H=window.innerHeight;
canvas.width=W*DPR; canvas.height=H*DPR;
canvas.style.width=W+'px'; canvas.style.height=H+'px';
ctx.setTransform(DPR,0,0,DPR,0,0);
waterY=Math.round(H*0.26);
boatX=Math.round(W*0.20);
initClouds(); initSparkles(); initRain();
}
window.addEventListener('resize',resize);
/* =========================================================
ЗВУК
========================================================= */
let AC=null;
function ac(){
if(!AC){ try{ AC=new (window.AudioContext||window.webkitAudioContext)(); }catch(e){ return null; } }
if(AC&&AC.state==='suspended'){ AC.resume(); }
return AC;
}
function beep(t0,f,dur,type,vol){
const c=ac(); if(!c)return;
const o=c.createOscillator(),g=c.createGain();
o.type=type||'sine'; o.frequency.setValueAtTime(f,t0);
g.gain.setValueAtTime(vol,t0); g.gain.exponentialRampToValueAtTime(0.001,t0+dur);
o.connect(g); g.connect(c.destination); o.start(t0); o.stop(t0+dur+0.02);
}
function noiseBurst(t0,dur,vol,freq){
const c=ac(); if(!c)return;
const n=Math.floor(c.sampleRate*dur);
const buf=c.createBuffer(1,n,c.sampleRate),d=buf.getChannelData(0);
for(let i=0;i<n;i++) d[i]=(Math.random()*2-1)*(1-i/n);
const src=c.createBufferSource(); src.buffer=buf;
const f=c.createBiquadFilter(); f.type='lowpass'; f.frequency.value=freq;
const g=c.createGain(); g.gain.value=vol;
src.connect(f); f.connect(g); g.connect(c.destination); src.start(t0);
}
function sfx(name){
if(save.muted) return;
const c=ac(); if(!c) return;
const t=c.currentTime;
switch(name){
case 'click': beep(t,500,0.06,'triangle',0.15); break;
case 'cast': noiseBurst(t,0.22,0.15,2500); break;
case 'splash': noiseBurst(t,0.3,0.4,700); break;
case 'bite': beep(t,900,0.07,'square',0.2); beep(t+0.1,1200,0.09,'square',0.2); break;
case 'hook': beep(t,600,0.05,'triangle',0.25); beep(t+0.06,900,0.08,'triangle',0.25); break;
case 'tick': beep(t,260,0.03,'triangle',0.07); break;
case 'pull': beep(t,140,0.18,'sawtooth',0.12); break;
case 'snap': noiseBurst(t,0.25,0.5,3000); beep(t,180,0.2,'sawtooth',0.2); break;
case 'escape': beep(t,500,0.12,'sine',0.2); beep(t+0.12,350,0.16,'sine',0.18); break;
case 'coin': beep(t,1200,0.08,'sine',0.2); beep(t+0.09,1600,0.12,'sine',0.2); break;
case 'catch': [523,659,784,1047].forEach((f,i)=>beep(t+i*0.11,f,0.14,'triangle',0.22)); break;
case 'no': beep(t,220,0.12,'square',0.15); break;
}
}
function vib(p){ try{ if(navigator.vibrate) navigator.vibrate(p); }catch(e){} }
/* =========================================================
СОСТОЯНИЕ ИГРЫ
========================================================= */
let state='MENU'; // MENU IDLE CHARGE CAST WAIT APPROACH BITE REEL SNAP CARD
let uiOpen=true;
let pauseOpen=false; // Y6: оверлей паузы (треб. 6.3) открыт — гард в YG.onResume
let time=0;
let charge=0, power=0;
let castT=0, castFrom={x:0,y:0}, castTo={x:0,y:0};
let bobber={x:0,y:0};
let castDist=0; // дальность заброса 0..0.97 (визуал: глубина крючка оснастки)
let hookPos={x:0,y:0}; // позиция крючка (визуал; пригодится lane поклёвки/вываживания)
let biteTimer=0, biteT=0, biteFish=null, rippleTimer=0;
let reel=null;
let snapT=0, shake=0;
let stateBoss=false, bossPhase=0; // M4: босс-бой (Осётр-босс, 3 фазы)
/* M8: погода — активное событие и таймеры (в реальном времени, как день/ночь) */
let weather=null; // 'rain'/'fog'/null — активное погодное событие (естественное состояние)
let weatherT=0; // M8: остаток секунд активного события
let weatherGap=WEATHER_GAP_MIN+Math.random()*(WEATHER_GAP_MAX-WEATHER_GAP_MIN); // M8: сек до следующего события
let ambient=[]; // фоновые рыбы
let clouds=[], sparkles=[];
let rain=[]; // M8: частицы дождя (визуал)
let particles=[], ripples=[];
let bobberTrail=[]; // визуал: след поплавка при забросе
/* M5: уровни снастей (1..4) и эффективные статы: базовые + эффекты апгрейдов */
function rodLvOf(i){ const v=save.rodLv&&save.rodLv[i]>=1?save.rodLv[i]:1; return Math.max(1,Math.min(4,v)); }
function lureLvOf(i){ const v=save.lureLv&&save.lureLv[i]>=1?save.lureLv[i]:1; return Math.max(1,Math.min(4,v)); }
function effRod(i){
const b=RODS[i], lv=rodLvOf(i);
const e=Object.assign({},b,{light:lv>=2}); // M5: Lv2 — фонарик (ночная рыбалка)
if(lv>=2) e.line*=1.15; // Lv2: леска крепче
if(lv>=3){ e.drag*=1.15; e.reel*=1.10; } // Lv3: тормоз и катушка
if(lv>=4){ e.line*=1.15; e.size+=0.10; } // Lv4: леска ещё + крупные
return e;
}
function effLure(i){
const b=LURES[i], lv=lureLvOf(i);
const e=Object.assign({},b);
if(lv>=2) e.bite*=1.15; // Lv2: клёв чаще
if(lv>=3) e.rare+=1.0; // Lv3: редкие
if(lv>=4) e.size+=0.15; // Lv4: крупные
return e;
}
const rod=()=>effRod(save.rod);
const lure=()=>effLure(save.lure);
/* M5: фонарик — не приманка, а апгрейд 1 любого удилища (2+ ур.) */
const hasLight=()=>rodLvOf(save.rod)>=2;
const rand=(a,b)=>a+Math.random()*(b-a);
function initFish(){
ambient=[];
for(let i=0;i<9;i++){
ambient.push({
x:Math.random()*W, depth:rand(0.12,0.92), size:rand(8,22),
speed:rand(10,32), dir:Math.random()<0.5?1:-1, hue:rand(140,260), ph:rand(0,6.28)
});
}
}
function initClouds(){
clouds=[];
for(let i=0;i<4;i++){
clouds.push({x:Math.random()*W,y:rand(14,Math.max(20,waterY-50)),s:rand(0.6,1.2),v:rand(4,9)});
}
}
function initSparkles(){
sparkles=[];
for(let i=0;i<24;i++){
sparkles.push({x:Math.random()*W,y:waterY+rand(10,H-waterY-10),ph:rand(0,6.28)});
}
initStars();
}
/* Визуал: звёзды для ночного неба (только отрисовка, на механику не влияют) */
let stars=[];
function initStars(){
stars=[];
for(let i=0;i<46;i++){
stars.push({x:Math.random()*W,y:Math.random()*Math.max(10,waterY-14),r:rand(0.6,1.7),ph:rand(0,6.28),sp:rand(0.8,2.2)});
}
}
/* M8: частицы дождя (визуал) — ~40 косых полосок; обновление по dt в updateDecor, пересчёт по высоте */
function initRain(){
rain=[];
for(let i=0;i<40;i++){
rain.push({x:rand(-40,W+40), y:rand(-H,H), v:rand(520,760)});
}
}
/* =========================================================
УТИЛИТЫ
========================================================= */
const $=id=>document.getElementById(id);
let toastTO=null;
function toast(msg){
const t=$('toast'); t.textContent=msg; t.style.opacity=1;
clearTimeout(toastTO); toastTO=setTimeout(()=>t.style.opacity=0,1600);
}
function updateHUD(){ $('coins').textContent='🪙 '+save.coins; $('btnMute').textContent=save.muted?'🔇':'🔊'; }
function splash(x,y,n,spread){
for(let i=0;i<n;i++){
particles.push({
x:x,y:y, vx:rand(-1,1)*(spread||90), vy:rand(-160,-40),
g:320, life:rand(0.35,0.7), max:0.7, size:rand(1.5,3.5),
color:Math.random()<0.5?'255,255,255':'160,215,255'
});
}
}
function addRipple(x,y,max){ ripples.push({x:x,y:y,r:4,max:max||36,a:0.6}); }
/* =========================================================
ЛОГИКА
========================================================= */
function pickSpecies(dist){
const l=lure();
// M3: ночь/вечер — ночная таблица, иначе дневная (жёсткий переключатель)
// Этап 5: локация — Река (8 видов) или Озёра (все 11); логика ролла по весам без изменений
const lake=save.location===1;
const night=(dayPhase==='night'||dayPhase==='evening');
const tbl=lake?(night?LAKE_SPECIES_NIGHT:LAKE_SPECIES):(night?RIVER_SPECIES_NIGHT:RIVER_SPECIES);
let total=0;
const ws=tbl.map(s=>{
let w=s.weight;
if(dist<s.minDist) w*=0.06;
w*=1+l.rare*s.rarity;
total+=w; return w;
});
let r=Math.random()*total;
for(let i=0;i<tbl.length;i++){ r-=ws[i]; if(r<=0) return tbl[i]; }
return tbl[0];
}
function biteWindow(sp){
if(sp.boss) return rand(0.25,0.5); // M4: босс клюёт реже — окно подсечки короче
return Math.max(0.35, 0.8 - sp.rarity*0.08 + save.rod*0.04 + achBonus().windowS);
}
/* Спринт 4: шанс клёва на таймер — не каждый заброс даёт рыбу (дальше = чаще, ночь тише) */
function biteChance(){
const dist=Math.min(1,(castTo.x-(boatX+30))/Math.max(1,W-boatX-70));
let p=0.65+0.25*dist;
if(dayPhase==='night') p*=0.85;
if(weatherActive()==='fog') p*=WEATHER.fog.biteMult; // M8: туман — клёв чаще ×1,5
return p;
}
/* Ролл веса рыбы: сдвиг в крупную сторону зависит от удочки и приманки */
function rollWeight(sp){
const B=Math.min(0.95, rod().size + lure().size);
const s=Math.pow(Math.random(), 2/(1+2*B)); // B=0 → смещено к мелкой, B↑ → ближе к равномерной
return sp.wMin + s*(sp.wMax-sp.wMin);
}
function startBite(){
const dist=Math.min(1,(castTo.x-(boatX+30))/Math.max(1,W-boatX-70));
let sp=pickSpecies(dist);
// M4: осётр → босс (30% шанс или тест-форс) — клонируем, чтобы не трогать таблицу SPECIES
if(sp.id==='sturge' && (forceBoss || Math.random()<0.3)) sp=Object.assign({},sp,{boss:true});
const fromLeft=Math.random()<0.5;
const d=Math.max(0.25,sp.minDist)*0.8+0.1;
biteFish={
x:fromLeft?-30:W+30, y:waterY+d*(H-waterY-40),
sx:fromLeft?-30:W+30, sy:waterY+d*(H-waterY-40),
dir:fromLeft?1:-1, sp:sp, t:0, mode:'in'
};
state='APPROACH';
}
function hook(){
const sp=biteFish.sp;
biteFish=null;
sfx('hook'); vib(30);
state='REEL';
stateBoss=!!sp.boss; bossPhase=sp.boss?1:0; // M4: старт босс-боя — фаза 1
const w=rollWeight(sp);
const ov=w/rod().maxW; // 1.0 = рыба ровно на пределе удочки
const str=sp.boss?0.95:sp.strength; // M4: босс сильнее (осётр 0.85 → 0.95)
const aggr=Math.min(1, 0.35*str + 0.75*Math.min(1.25,ov)/1.25); // «злость» рыбы
const d0=45+7*w; // чем крупнее, тем дальше от лодки (T2b: буфер для «сдавать в рывок»)
const line=rod().line+achBonus().line; // прочность с бонусом достижений
// Спринт 4: выносливость — крупная рыба выносливее, босс свежий
const st0=sp.boss?1:0.65+0.35*Math.min(1,w/sp.wMax);
reel={d:d0, d0:d0, tension:0, escape:0, holding:false, phase:'calm', phaseT:rand(0.8,1.5), sp:sp, w:w, ov:ov, aggr:aggr, tick:0, line:line, boss:!!sp.boss, st:st0, tired:false};
}
/* Спринт 4: сила рыбы (перетягивание с drag) — глобальная, автотесты вызывают */
function fishForce(r,ag,pull){
const base=pull?(16+34*r.st)*(0.5+0.9*ag)*(0.7+0.5*Math.min(1.5,r.ov)):5+7*ag;
return r.tired?0.45*base:base;
}
function doCast(){
const p=Math.max(0.12,power);
const dist=Math.min(0.97,(0.10+0.80*p)*lure().cast);
castDist=dist; // запоминаем дальность (визуал: глубина крючка оснастки)
castFrom={x:tip.x,y:tip.y};
castTo={x:boatX+30+dist*Math.max(1,W-boatX-70), y:waterY-2};
castT=0; state='CAST'; sfx('cast');
save.casts++;
newDayCheck();
questHit('casts',()=>true); // condFn обязателен: без него questHit падает с TypeError
checkAchievements();
persist();
}
function recall(){
if(state==='WAIT'||state==='APPROACH'||state==='BITE'){
state='IDLE'; biteFish=null; sfx('click');
}
}
function updateReel(dt){
const r=rod(), sp=reel.sp, ag=reel.aggr, ov=reel.ov;
reel.phaseT-=dt;
if(reel.phaseT<=0){
if(reel.phase==='calm'){
// Спринт 4: рывок длиннее у свежей рыбы, короче у уставшей
reel.phase='pull'; reel.phaseT=(0.8+2.2*reel.st)*(0.6+0.7*ag)*rand(0.8,1.25);
sfx('pull'); vib(40);
}else{
// Спринт 4: пауза растёт по мере усталости
reel.phase='calm'; reel.phaseT=Math.max(0.35,(1.3-0.8*reel.st)*rand(0.8,1.3)); vib(15);
}
}
const pulling=reel.phase==='pull';
// Спринт 4 T2b: выносливость — медленная дуга: свежая тянет сильно, уставшая слабо (Monte-Carlo)
const drain=(pulling?0.016+0.02*ag:0.002)+(reel.holding?0.006:0.001)+(pulling&&!reel.holding?0.01:0);
reel.st=Math.max(0,reel.st-drain*dt);
if(reel.st<=0.12) reel.tired=true; // устала: рывки слабее, втягивается быстрее
const F=fishForce(reel,ag,pulling);
if(reel.holding){
// Спринт 4: перетягивание через drag — рывок сильнее тормоза: леска скользит
const over=F-r.drag;
reel.tension+=(10+Math.max(0,over)*1.1+22*ag*(pulling?1:0.35))*dt;
if(over>0) reel.d+=over*0.22*dt;
else reel.d-=(11+3*r.reel)*(1+0.6*(1-reel.st))*dt; // втягивание, усталую быстрее (до ×1.6)
reel.tick-=dt;
if(reel.tick<=0){ sfx('tick'); reel.tick=0.12; }
if(Math.random()<0.3) splash(bobber.x,waterY,1,40); // брызги у поплавка (он едет за рыбой)
}else{
reel.tension-=38*dt;
if(pulling) reel.d+=F*0.32*dt; // свободный бег: рыба реально отходит (стоимость отпускания — дистанция)
}
reel.tension=Math.max(0,reel.tension);
// escape T2b: отпускать в РЫВОК безопасно (бар не растёт) — «сдался рыбе»;
// а вот зависнуть без удержания в затишье = рыба уходит (пассив = сход)
if(reel.holding){
reel.escape=Math.max(0,reel.escape-0.5*dt);
}else if(!pulling){
reel.escape=Math.min(1,reel.escape+(0.2+ag*0.4)*dt);
}
if(reel.escape>=1){
fishEscaped(sp);
return;
}
if(reel.tension>=reel.line){
state='SNAP'; snapT=1.0; shake=0.5;
save.snaps++; persist(); // счётчик обрывов (достижения)
sfx('snap'); vib(200);
stateBoss=false; bossPhase=0; // M4: настоящий обрыв — босс-бой окончен
toast((ov>1.15?t('snap_big'):t('snap'))+' '+sp.emoji+' '+trName(sp)+' '+reel.w.toFixed(1)+' '+t('kg'));
checkAchievements();
}else if(reel.d<=0){
if(reel.boss && bossPhase<3){
// M4: босс-обрыв фаз 1-2 — без штрафа (без save.snaps++), дальше фаза глубже
state='SNAP'; snapT=0.6; shake=0.5;
sfx('snap'); vib(120);
toast(tt('boss_phase',{p:bossPhase}));
}else{
catchFish(sp);
}
}else if(reel.d>=reel.d0*1.45){
// M4: босс тоже может уйти — босс-бой окончен
fishEscaped(sp);
}
}
function fishEscaped(sp){
stateBoss=false; bossPhase=0;
toast(t('escaped')+' '+sp.emoji+' '+trName(sp)+' '+reel.w.toFixed(1)+' '+t('kg'));
state='WAIT'; biteTimer=rand(5,10)/lure().bite;
sfx('escape');
}
function catchFish(sp){
const w=reel.w;
const boss=!!reel.boss; // M4: пойман Осётр-босс
const variant=boss?VARIANTS[0]:rollVariant(); // M6: вариант улова (босс — всегда normal, без сложения с ×5)
const shiny=variant.id==='gold'; // M6: семантика «shiny» = gold-вариант (квест, счётчик sn)
const b=achBonus();
const mult=variant.mult*(boss?5:1); // M4: босс = ×5 к цене
const val=Math.max(1,Math.round(w*sp.price*mult*(0.95+Math.random()*0.1)*(1+b.coinPct)));
save.coins+=val; save.earned+=val;
const prev=save.caught[sp.id]||{n:0,best:0,sn:0,sv:0,rb:0};
const isRecord=w>prev.best;
save.caught[sp.id]={
n:prev.n+1, best:Math.max(prev.best,w),
sn:(prev.sn||0)+(shiny?1:0),
sv:(prev.sv||0)+(variant.id==='silver'?1:0),
rb:(prev.rb||0)+(variant.id==='rainbow'?1:0)
};
if(boss){ // M4: босс побеждён
save.bossBeaten=true; save.bossCount++;
toast(tt('boss_defeated',{v:val}));
}
newDayCheck();
questHit('catch_species',q=>sp.id===q.param);
questHit('catch_weight',q=>w>=q.param);
questHit('catch_rarity',q=>sp.rarity>=q.param);
questHit('catch_shiny',q=>shiny); // M6: «shiny-рыба» = gold-вариант
questHit('earn_coins',()=>true,val); // прогресс — монеты улова (с бонусами)
// Этап 22: счётчики достижений — общий вес, ночной улов, уловы в дождь/туман
save.kgTotal=(save.kgTotal||0)+w;
if(dayPhase==='night') save.nightCatch=true;
const wx=weatherActive();
if(wx==='rain'&&variant.id!=='normal') save.wxRainV=(save.wxRainV||0)+1; // босс всегда normal — не заходит
if(wx==='fog') save.wxFog=(save.wxFog||0)+1;
checkAchievements();
persist(); updateHUD();
sfx('catch'); vib([40,60,40]);
splash(castTo.x,waterY,boss?40:26,boss?180:140);
// вариант — ярче: больше и разноцветнее золотых частиц; босс — частицы крупнее
for(let i=0;i<(boss?44:(variant.id!=='normal'?28:10));i++){
particles.push({x:castTo.x,y:waterY,vx:rand(-80,80),vy:rand(-240,-80),g:300,
life:rand(0.5,0.9),max:0.9,size:boss?rand(3,7):rand(2,4),
color:(variant.id!=='normal'&&i%3===0)?'255,246,190':'255,215,94'});
}
reel=null; stateBoss=false; bossPhase=0; state='CARD';
showCard(sp,w,val,isRecord,variant,boss);
}
function updateGame(dt){
// фоновые рыбы
for(const f of ambient){
f.x+=f.dir*f.speed*dt;
if(f.dir>0&&f.x>W+40){ f.x=-40; f.depth=rand(0.12,0.92); }
if(f.dir<0&&f.x<-40){ f.x=W+40; f.depth=rand(0.12,0.92); }
}
switch(state){
case 'CHARGE':
charge+=dt;
power=1-Math.abs(1-((charge/0.9)%2));
break;
case 'CAST':{
castT+=dt/0.65;
if(castT>=1){
castT=1;
bobber={x:castTo.x,y:waterY-2};
state='WAIT';
biteTimer=rand(4,10)/lure().bite;
nightNoLightToast=false; // новый заброс — тост о фонарике может показаться снова
splash(castTo.x,waterY,14,100);
addRipple(castTo.x,waterY,40);
sfx('splash'); vib(10);
}else{
const t=castT;
bobber.x=castFrom.x+(castTo.x-castFrom.x)*t;
bobber.y=castFrom.y+(castTo.y-castFrom.y)*t-150*Math.sin(Math.PI*t);
}
break;
}
case 'WAIT':{
bobber.y=waterY-3+Math.sin(time*2)*1.5;
rippleTimer-=dt;
if(rippleTimer<=0){ addRipple(bobber.x,waterY+3,22); rippleTimer=1.6; }
if(biteFish&&biteFish.mode==='out') updateBiteFishOut(dt);
biteTimer-=dt;
if(biteTimer<=0&&!biteFish){
if(dayPhase==='night'&&!hasLight()){
// M5: ночью без фонарика клёва нет — таймер тикает вхолостую
// (фонарик — апгрейд 1 удилища: save.rodLv[save.rod]>=2)
if(!nightNoLightToast){ toast(t('night_light')); nightNoLightToast=true; }
}else if(forceBite||Math.random()<biteChance()){
startBite();
}else{
// Спринт 4: пустой клёв — поплавок молчит, попробуем ещё раз
biteTimer=rand(2.5,5)/lure().bite;
}
}
break;
}
case 'APPROACH':
updateBiteFishIn(dt);
bobber.y=waterY-3+Math.sin(time*2)*1.5+Math.sin(time*14)*1.5*Math.min(1,biteFish?biteFish.t:0); // предвестники: дрожание, сильнее по мере приближения рыбы
if(biteFish){
if(biteFish.t>=1){
state='BITE';
biteT=biteWindow(biteFish.sp);
sfx('bite'); vib(60);
addRipple(castTo.x,waterY+3,30);
}
}
break;
case 'BITE':
biteT-=dt;
bobber.y=waterY+9+Math.sin(time*22)*3; // топление: глубже и резче (синхронно с дёрганием рыбы у крючка)
if(Math.random()<0.2) addRipple(bobber.x,waterY+3,26);
if(biteT<=0){
if(biteFish) biteFish.mode='out';
state='WAIT'; biteTimer=rand(5,11)/lure().bite;
sfx('escape'); toast(t('escaped_bite'));
}
break;
case 'REEL':
updateReel(dt);
if(state==='REEL'&&reel){
const fp=fishReelPos();
let tx,ty;
if(reel.holding){
// натянуто: поплавок на пересечении прямой tip→fish с поверхностью (tip–поплавок–рыба коллинеарны, fp.y>waterY>tip.y)
const k=(waterY-tip.y)/(fp.y-tip.y);
tx=tip.x+(fp.x-tip.x)*k; ty=waterY-2;
}else{
// отпускание: провис, поплавок едет за рыбой с отставанием (покачивание на поверхности)
tx=castTo.x+(fp.x-castTo.x)*0.55; ty=waterY-2+Math.sin(time*9)*2;
}
const sm=Math.min(1,dt*8); // сглаживание, чтобы не телепортировалось
bobber.x+=(tx-bobber.x)*sm;
bobber.y+=(ty-bobber.y)*sm;
if(Math.random()<0.25) addRipple(bobber.x,waterY+3,24);
}
break;
case 'SNAP':
snapT-=dt;
if(snapT<=0){
if(stateBoss && bossPhase<3){
// M4: босс-обрыв — не штраф: автоматом следующая (глубже) фаза, без ввода
reel.d=(bossPhase===1?0.6:1.0)*reel.d0; // фаза2: d=0.6·d0, фаза3: d=1.0·d0
reel.tension=0; // фазовый обрыв сбрасывает нагрузку, иначе «беспошлинный» обрыв ведёт к настоящему
bossPhase++;
state='REEL';
}else{
state='IDLE';
}
}
break;
}
}
function updateBiteFishIn(dt){
biteFish.t+=dt/0.45;
const t=Math.min(1,biteFish.t);
const e=t*t*(3-2*t);
// рыба плывёт диагональю от поверхности вниз к крючку/наживке (hookPos — кадр прошлого, паттерн как раньше)
biteFish.x=biteFish.sx+(hookPos.x-biteFish.sx)*e;
biteFish.y=biteFish.sy+(hookPos.y-biteFish.sy)*e;
biteFish.dir=hookPos.x>biteFish.sx?1:-1;
}
function updateBiteFishOut(dt){
biteFish.t+=dt/0.6;
const dir=biteFish.x<W/2?-1:1;
biteFish.x+=dir*380*dt;
biteFish.y+=40*dt;
if(biteFish.t>=1||biteFish.x<-50||biteFish.x>W+50) biteFish=null;
}
function updateDecor(dt){
for(const c of clouds){ c.x+=c.v*dt; if(c.x>W+80) c.x=-80; }
// M8: дождь — полоски летят вниз-влево, ушедшие за нижний край возвращаются сверху
if(weatherActive()==='rain'){
for(const dr of rain){
dr.y+=dr.v*dt; dr.x-=dr.v*0.3*dt;
if(dr.y>H+20){ dr.y=rand(-120,-20); dr.x=rand(-40,W+40); }
if(dr.x<-60) dr.x=W+40;
}
}
for(let i=particles.length-1;i>=0;i--){
const p=particles[i];
p.life-=dt; p.vy+=p.g*dt; p.x+=p.vx*dt; p.y+=p.vy*dt;
if(p.life<=0||p.y>H) particles.splice(i,1);
}
for(let i=ripples.length-1;i>=0;i--){
const r=ripples[i];
r.r+=45*dt; r.a-=0.9*dt;
if(r.a<=0||r.r>r.max) ripples.splice(i,1);
}
if(shake>0) shake-=dt;
}
function syncDom(){
const showRecall=(state==='WAIT'||state==='APPROACH'||state==='BITE');
$('btnRecall').classList.toggle('hidden',!showRecall);
$('btnPause').classList.toggle('hidden',!(state!=='MENU'&&!uiOpen&&!pauseOpen)); // Y6: пауза — вне меню и без оверлеев
}
/* =========================================================
ОТРИСОВКА
========================================================= */
const UI_FONT="'EmojiEmbedded',system-ui"; // Э28: для canvas-текста (emoji 💥🌀⚡💪🐟💤) — встроенный шрифт первым, как в CSS
function rr(x,y,w,h,r){
ctx.beginPath();
ctx.moveTo(x+r,y);
ctx.arcTo(x+w,y,x+w,y+h,r);
ctx.arcTo(x+w,y+h,x,y+h,r);
ctx.arcTo(x,y+h,x,y,r);
ctx.arcTo(x,y,x+w,y,r);
ctx.closePath();
}
const SKY_PHASES={ // M3: градиенты неба по фазе суток
morning:['#f5a623','#fce38a'],
day:['#7ec8e3','#cfeef7'],
evening:['#e44d26','#f16529'],
night:['#0c1445','#1a237e']
};
/* Визуал: плавные переходы неба/освещения — зона перехода в КОНЦЕ фазы
(ночь темнеет к концу вечера, рассвет — в конце ночи; на стыке t=0 чистое утро) */
const SKY_SEQ=['morning','day','evening','night'];
const SKY_BOUNDS=[0.25,0.5,0.75,1.0]; // переход к следующей фазе завершается на границе
const SKY_ZONE=0.08; // ширина переходной зоны
function hexLerp(a,b,k){
const pa=parseInt(a.slice(1),16),pb=parseInt(b.slice(1),16);
const r=Math.round(((pa>>16)&255)+(((pb>>16)&255)-((pa>>16)&255))*k);
const g=Math.round(((pa>>8)&255)+(((pb>>8)&255)-((pa>>8)&255))*k);
const bl=Math.round((pa&255)+((pb&255)-(pa&255))*k);
return 'rgb('+r+','+g+','+bl+')';
}
function skyColors(){
const t=dayTime;
for(let i=0;i<4;i++){
const b=SKY_BOUNDS[i];
if(t<b||i===3){
const a=SKY_PHASES[SKY_SEQ[i]], c=SKY_PHASES[SKY_SEQ[(i+1)%4]];
const z0=b-SKY_ZONE;
if(t>=z0){ const k=Math.max(0,Math.min(1,(t-z0)/SKY_ZONE)); return [hexLerp(a[0],c[0],k),hexLerp(a[1],c[1],k)]; }
return [a[0],a[1]];
}
}
return [SKY_PHASES.morning[0],SKY_PHASES.morning[1]];
}
/* Числовые величины (ночная доля и т.п.) с теми же переходами */
function phaseLerp(vals){
const t=dayTime;
for(let i=0;i<4;i++){
const b=SKY_BOUNDS[i];
if(t<b||i===3){
const z0=b-SKY_ZONE;
if(t>=z0){ const k=Math.max(0,Math.min(1,(t-z0)/SKY_ZONE)); return vals[i]+(vals[(i+1)%4]-vals[i])*k; }
return vals[i];
}
}
return vals[0];
}
/* Ночная доля освещения 0..1 (1 = глубокая ночь) — вода, звёзды, фонарь */
function nightMix(){ return phaseLerp([0,0,0.4,1]); }
let luminary={x:0,y:0,a:0,night:false}; // визуал: где солнце/луна и её яркость (для дорожки на воде)
function drawSky(){
const cols=skyColors();
const nm=nightMix();
const g=ctx.createLinearGradient(0,0,0,waterY);
g.addColorStop(0,cols[0]); g.addColorStop(1,cols[1]);
ctx.fillStyle=g; ctx.fillRect(0,0,W,waterY);
// звёзды — проступают с ночью, мерцают
if(nm>0.15){
for(const st of stars){
const a=nm*Math.max(0,Math.sin(time*st.sp+st.ph))*0.9;
if(a>0.03){
ctx.fillStyle='rgba(255,255,255,'+a.toFixed(3)+')';
ctx.beginPath(); ctx.arc(st.x,st.y,st.r,0,7); ctx.fill();
}
}
}
// M3: солнце/луна по дуге (визуал: мягкое свечение, гаснут/всходят в сумерках без наложения)
const ang=dayTime*2*Math.PI;
const bx=W/2+Math.cos(ang)*W*0.4, by=H*0.15-Math.sin(ang)*H*0.1;
luminary.x=bx; luminary.y=by; luminary.a=0; luminary.night=false;
if(nm<0.45){
const a=1-nm/0.45; // солнце садится к ночи
luminary.a=a;
ctx.globalAlpha=Math.max(0,a);
const glow=ctx.createRadialGradient(bx,by,6,bx,by,64);
glow.addColorStop(0,'rgba(255,225,130,0.5)'); glow.addColorStop(1,'rgba(255,225,130,0)');
ctx.fillStyle=glow; ctx.fillRect(bx-64,by-64,128,128);
ctx.fillStyle='#ffd700';
ctx.beginPath(); ctx.arc(bx,by,20,0,7); ctx.fill();
ctx.fillStyle='rgba(255,255,255,0.5)';
ctx.beginPath(); ctx.arc(bx-6,by-6,7,0,7); ctx.fill();
ctx.globalAlpha=1;
}else if(nm>0.55){
const a=(nm-0.55)/0.45; // луна всходит в глубине сумерек
luminary.a=a; luminary.night=true;
ctx.globalAlpha=Math.max(0,Math.min(1,a));
const glow=ctx.createRadialGradient(bx,by,8,bx,by,56);
glow.addColorStop(0,'rgba(220,230,255,0.32)'); glow.addColorStop(1,'rgba(220,230,255,0)');
ctx.fillStyle=glow; ctx.fillRect(bx-56,by-56,112,112);
ctx.fillStyle='#f5f5dc';
ctx.beginPath(); ctx.arc(bx,by,18,0,7); ctx.fill();
// кратеры
ctx.fillStyle='rgba(120,130,150,0.35)';
ctx.beginPath(); ctx.arc(bx+6,by+3,3.2,0,7); ctx.fill();
ctx.beginPath(); ctx.arc(bx-4,by+7,2.2,0,7); ctx.fill();
ctx.beginPath(); ctx.arc(bx-2,by-6,2.6,0,7); ctx.fill();
// серп — вырез цветом неба в точке луны
ctx.fillStyle=cols[0];
ctx.beginPath(); ctx.arc(bx+9,by-6,13.5,0,7); ctx.fill();
ctx.globalAlpha=1;
}
// облака (ночью приглушены)
ctx.fillStyle='rgba(255,255,255,'+(0.9-0.68*nm).toFixed(3)+')';
for(const c of clouds){
ctx.save(); ctx.translate(c.x,c.y); ctx.scale(c.s,c.s);
ctx.beginPath();
ctx.arc(0,0,14,0,7); ctx.arc(16,-6,12,0,7); ctx.arc(32,0,15,0,7); ctx.arc(16,6,13,0,7);
ctx.fill(); ctx.restore();
}
}
function drawWater(){
const nm=nightMix();
// градиент воды: день ↔ ночь, плавно (визуал); Этап 5: базовые цвета по локации (LOCATIONS)
const w=LOCATIONS[Math.max(0,Math.min(1,save.location|0))].water; // clamp — миграция гарантирует 0..1
const top=hexLerp(w[0],w[3],nm), bot=hexLerp(w[2],w[5],nm);
const g=ctx.createLinearGradient(0,waterY,0,H);
g.addColorStop(0,top); g.addColorStop(0.55,hexLerp(w[1],w[4],nm)); g.addColorStop(1,bot);
ctx.fillStyle=g; ctx.fillRect(0,waterY,W,H-waterY);
// дорожка света от солнца/луны — мерцающие блики под светилом
if(luminary.a>0.05){
const depth=Math.min(1,Math.max(0,(luminary.y)/(waterY||1))); // светило низко — дорожка длиннее
const len=(H-waterY)*(0.18+0.3*depth);
const base=(luminary.night?0.12:0.2)*luminary.a;
ctx.fillStyle=luminary.night?'rgba(200,220,255,1)':'rgba(255,235,170,1)';
for(let y=waterY+6;y<waterY+len;y+=7){
const k=(y-waterY)/len;
const wob=Math.sin(time*2.2+y*0.55);
const a=Math.max(0,base*(1-k)*(0.45+0.55*wob));
if(a<0.02) continue;
ctx.globalAlpha=a;
const wdt=14+k*30+Math.sin(time*1.7+y)*4;
ctx.fillRect(luminary.x-wdt/2,y,wdt,2);
}
ctx.globalAlpha=1;
}
// блики
for(const s of sparkles){
const a=Math.max(0,Math.sin(time*1.5+s.ph))*0.25*(1-nm*0.5);
if(a>0.02){ ctx.fillStyle='rgba(255,255,255,'+a.toFixed(3)+')'; ctx.fillRect(s.x,s.y,3,1.5); }
}
// волна на поверхности + вторая, глубинная (визуал)
ctx.strokeStyle='rgba(255,255,255,'+(0.55-nm*0.25).toFixed(3)+')'; ctx.lineWidth=2;
ctx.beginPath();
for(let x=0;x<=W;x+=8){
const y=waterY+Math.sin(x*0.05+time*2)*2.5;
if(x===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
}
ctx.stroke();
ctx.strokeStyle='rgba(255,255,255,'+(0.2-nm*0.1).toFixed(3)+')'; ctx.lineWidth=1.5;
ctx.beginPath();
for(let x=0;x<=W;x+=10){
const y=waterY+7+Math.sin(x*0.04-time*1.4+1.7)*3;
if(x===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
}
ctx.stroke();
}
function drawFishShape(x,y,size,dir,hue,alpha,wob){
ctx.save(); ctx.translate(x,y); ctx.scale(dir,1);
const w=wob||0;
ctx.fillStyle='hsla('+hue+',55%,38%,'+alpha+')';
ctx.beginPath(); ctx.ellipse(0,0,size,size*0.45,0,0,7); ctx.fill();
// хвост качается (визуал)
ctx.save(); ctx.translate(-size*0.8,0); ctx.rotate(w);
ctx.beginPath();
ctx.moveTo(0,0); ctx.lineTo(-size*0.65,-size*0.42); ctx.lineTo(-size*0.65,size*0.42);
ctx.closePath(); ctx.fill();
ctx.restore();
// блик на спинке + глаз (визуал: живость, у силуэтов едва видны)
ctx.fillStyle='rgba(255,255,255,'+(alpha*0.22).toFixed(3)+')';
ctx.beginPath(); ctx.ellipse(-size*0.1,-size*0.16,size*0.55,size*0.18,-0.25,0,7); ctx.fill();
ctx.fillStyle='rgba(10,25,40,'+(alpha*0.8).toFixed(3)+')';
ctx.beginPath(); ctx.arc(size*0.6,-size*0.07,size*0.09,0,7); ctx.fill();
ctx.restore();
}
function drawAmbientFish(){
for(const f of ambient){
const y=waterY+20+f.depth*(H-waterY-50)+Math.sin(time*2+f.ph)*2;
drawFishShape(f.x,y,f.size,f.dir,f.hue,0.22+0.2*(1-f.depth),Math.sin(time*5+f.ph)*0.28);
}
}
function drawBoat(){
const bx=boatX, by=waterY+Math.sin(time*1.5)*1.5;
// блик-отражение под лодкой (визуал)
ctx.fillStyle='rgba(0,20,40,0.28)';
ctx.beginPath(); ctx.ellipse(bx,by+17,34,4.5,0,0,7); ctx.fill();
// лодка (Этап 4: скины — градиент корпуса и кромка по save.boatSkin)
const skin=Math.max(0,Math.min(2,save.boatSkin|0));
const bcols=[['#c9773c','#96521f','#8a4519'],['#c0392b','#7b241c','#6e221a'],['#5d6d7e','#34495e','#2c3a47']][skin];
const bg=ctx.createLinearGradient(bx-32,by,bx+32,by+15);
bg.addColorStop(0,bcols[0]); bg.addColorStop(1,bcols[1]);
ctx.fillStyle=bg;
ctx.beginPath();
ctx.moveTo(bx-32,by); ctx.lineTo(bx+32,by); ctx.lineTo(bx+21,by+15); ctx.lineTo(bx-21,by+15);
ctx.closePath(); ctx.fill();
ctx.fillStyle=bcols[2]; ctx.fillRect(bx-32,by,64,4);
// «Лодка-домик»: каюта на корме корпуса (над линией борта) с ярко-жёлтым окном (визуал)
if(skin===2){
ctx.fillStyle='#2c3a47';
ctx.fillRect(bx-31,by-11,16,11);
ctx.fillStyle='rgba(255,220,100,0.9)';
ctx.fillRect(bx-28,by-9,9,5);
}
// рыбак
ctx.fillStyle='#34495e';
ctx.fillRect(bx-9,by-18,12,12);
ctx.fillStyle='#e8b88a';
ctx.beginPath(); ctx.arc(bx-3,by-24,6.5,0,7); ctx.fill();
ctx.fillStyle='#c0392b';
ctx.beginPath(); ctx.arc(bx-3,by-27,6.5,Math.PI,0); ctx.fill();
// удочка
const swing=state==='CHARGE'?-power*0.35:0;
ctx.strokeStyle='#5d4023'; ctx.lineWidth=3; ctx.lineCap='round';
ctx.beginPath(); ctx.moveTo(bx+2,by-14);
const tx=bx+34+swing*20, ty=by-38-swing*14;
ctx.lineTo(tx,ty); ctx.stroke();
tip={x:tx,y:ty};
// флажок
ctx.strokeStyle='#5d4023'; ctx.lineWidth=2;
ctx.beginPath(); ctx.moveTo(bx-24,by); ctx.lineTo(bx-24,by-22); ctx.stroke();
ctx.fillStyle='#f5a623';
const fl=Math.sin(time*4)*1.5; // флажок колышется (визуал)
ctx.beginPath(); ctx.moveTo(bx-24,by-22); ctx.lineTo(bx-12,by-18+fl); ctx.lineTo(bx-24,by-14); ctx.closePath(); ctx.fill();
// фонарь на носу ночью (визуал: тёплое пятно света)
if(nightMix()>0.35){
const a=(nightMix()-0.35)/0.65;
const lx=bx-24,ly=by-20;
const lg=ctx.createRadialGradient(lx,ly,2,lx,ly,46);
lg.addColorStop(0,'rgba(255,214,120,'+(0.4*a).toFixed(3)+')');
lg.addColorStop(1,'rgba(255,214,120,0)');
ctx.fillStyle=lg; ctx.fillRect(lx-46,ly-46,92,92);
ctx.fillStyle='rgba(255,224,150,'+(0.9*a).toFixed(3)+')';
ctx.beginPath(); ctx.arc(lx,ly,2.5,0,7); ctx.fill();
}
}
function drawLineTo(x,y,sag){
ctx.strokeStyle='rgba(230,240,255,0.8)'; ctx.lineWidth=1.2;
ctx.beginPath(); ctx.moveTo(tip.x,tip.y);
ctx.quadraticCurveTo((tip.x+x)/2,(tip.y+y)/2+sag,x,y);
ctx.stroke();
}
function drawBobber(sink){
const x=bobber.x,y=bobber.y;
// тёмная кромка воды под поплавком (визуал)
ctx.fillStyle='rgba(0,20,40,0.25)';
ctx.beginPath(); ctx.ellipse(x,y+6,7,1.8,0,0,7); ctx.fill();
// Этап 4: скины — поплавок по save.bobberSkin (0 обычный, 1 красный, 2 неоновый)
const skin=Math.max(0,Math.min(2,save.bobberSkin|0));
const bot=['#fff','#e74c3c','#aaff00'][skin];
const top=['#e74c3c','#e74c3c','#aaff00'][skin];
if(skin===2){ ctx.save(); ctx.shadowColor='rgba(170,255,0,0.8)'; ctx.shadowBlur=10; } // неоновое свечение — обязательно save/restore, чтобы не перетечь на другие элементы
ctx.fillStyle=bot;
ctx.beginPath(); ctx.arc(x,y,5.5,0,7); ctx.fill();
ctx.fillStyle=top;
ctx.beginPath(); ctx.arc(x,y,5.5,Math.PI,0); ctx.fill();
// блик (визуал)
ctx.fillStyle='rgba(255,255,255,0.85)';
ctx.beginPath(); ctx.arc(x-1.8,y-1.8,1.4,0,7); ctx.fill();
ctx.strokeStyle=skin===2?'#77cc00':'rgba(255,255,255,0.9)'; ctx.lineWidth=1.5;
ctx.beginPath(); ctx.arc(x,y,5.5,0,7); ctx.stroke();
if(skin===2) ctx.restore();
// топление (визуал, lane 2): в BITE нижняя половина уходит под воду — полупрозрачная кромка воды поверх низа поплавка
// рисуем ВНЕ save/restore неона, чтобы свечение не перетекло на слой воды
if(sink){
ctx.fillStyle='rgba(10,30,60,0.35)';
ctx.beginPath(); ctx.arc(x,y,5.6,0,Math.PI); ctx.closePath(); ctx.fill(); // нижняя половина под водой
ctx.strokeStyle='rgba(150,200,235,0.55)'; ctx.lineWidth=1; // тонкая светлая линия уровня воды
ctx.beginPath(); ctx.moveTo(x-5.6,y); ctx.lineTo(x+5.6,y); ctx.stroke();
}
}
function hookY(){
// глубина крючка на середине воды: доля глубины 0.42..0.54 по дальности заброса (визуал)
return waterY+(H-waterY)*(0.42+castDist*0.12);
}
function drawRig(){
// Живой оснастки (lane 1): поводок от поплавка вниз, крючок и наживка.
// Только визуал — механика/баланс не трогается. hookPos экспортируем для следующих шагов.
const hy=hookY(); // глубина крючка (середина воды, доля 0.42..0.54 по дальности)
const hx=bobber.x+Math.sin(time*2.2)*3; // лёгкое покачивание в противофазе к поплавку
hookPos={x:hx,y:hy};
// вертикальный бледный поводок (бледнее надводной лески 0.8 → 0.35)
ctx.strokeStyle='rgba(230,240,255,0.35)'; ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(bobber.x,bobber.y); ctx.lineTo(hx,hy); ctx.stroke();
// крючок: дуга + жало (серый ~5px)
ctx.strokeStyle='#cfd6dd'; ctx.lineWidth=1.4; ctx.lineCap='round';
ctx.beginPath(); ctx.arc(hx,hy+4,4.5,Math.PI*0.1,Math.PI*1.6); ctx.stroke();
const eb=Math.PI*1.6, ex=hx+4.5*Math.cos(eb), ey=(hy+4)+4.5*Math.sin(eb);
ctx.beginPath(); ctx.moveTo(ex,ey); ctx.lineTo(ex+2.5,ey-2); ctx.stroke(); // жало
}
function drawLineAndBobber(){
// след поплавка: копим в забросе, чистим в остальных состояниях (визуал)
if(state==='CAST'){ bobberTrail.push({x:bobber.x,y:bobber.y}); if(bobberTrail.length>14) bobberTrail.shift(); }
else if(bobberTrail.length) bobberTrail.length=0;
if(state==='IDLE'||state==='CHARGE'||state==='MENU'||state==='CARD'){
// болтается грузило
const a=state==='CHARGE'?Math.sin(time*10)*power*4:Math.sin(time*1.2)*1.5;
ctx.strokeStyle='rgba(230,240,255,0.8)'; ctx.lineWidth=1.2;
ctx.beginPath(); ctx.moveTo(tip.x,tip.y); ctx.lineTo(tip.x+a,tip.y+22); ctx.stroke();
ctx.fillStyle='#e74c3c';
ctx.beginPath(); ctx.arc(tip.x+a,tip.y+25,3.5,0,7); ctx.fill();
return;
}
if(state==='SNAP'){
ctx.strokeStyle='rgba(230,240,255,0.8)'; ctx.lineWidth=1.2;
ctx.beginPath(); ctx.moveTo(tip.x,tip.y);
ctx.lineTo(tip.x+10+Math.sin(time*20)*6,tip.y+26); ctx.stroke();
ctx.globalAlpha=Math.min(1,snapT*2);
ctx.shadowColor='rgba(255,120,60,0.9)'; ctx.shadowBlur=14; // вспышка (визуал)
ctx.font='34px '+UI_FONT; ctx.textAlign='center';
ctx.fillText('💥',castTo.x,waterY-20);
ctx.shadowBlur=0;
ctx.globalAlpha=1;
return;
}
if(state==='CAST'){
// след: затухающие точки по траектории (визуал)
for(let i=0;i<bobberTrail.length;i++){
const tp=bobberTrail[i];
ctx.fillStyle='rgba(255,255,255,'+(i/bobberTrail.length*0.35).toFixed(3)+')';
ctx.beginPath(); ctx.arc(tp.x,tp.y,1.6,0,7); ctx.fill();
}
drawLineTo(bobber.x,bobber.y,14); drawBobber(); return;
}
let sag;
if(state==='REEL'){
sag=reel.holding?0:(reel.phase==='pull'?16:12); // holding — натянуто (прямая tip→поплавок); отпускание — провис (рывок больше)
}else{
sag=18+Math.sin(time*2)*3;
}
drawLineTo(bobber.x,bobber.y,sag);
drawBobber(state==='BITE'?1:0); // топление: в BITE нижняя половина под водой, в WAIT/APPROACH/REEL — нет
if(state==='REEL'&&reel){ // подводный сегмент лески bobber→рыба (бледнее надводной), чтобы леска шла к рыбе
const fp=fishReelPos();
ctx.strokeStyle='rgba(230,240,255,0.35)'; ctx.lineWidth=1;
ctx.beginPath(); ctx.moveTo(bobber.x,bobber.y); ctx.lineTo(fp.x,fp.y); ctx.stroke();
}
if(state==='WAIT'||state==='APPROACH'||state==='BITE') drawRig(); // живая оснастка (в REEL крючок «в рыбе» — не рисуем)
if(state==='BITE'){
const yy=bobber.y-24+Math.sin(time*12)*2;
ctx.font='800 28px '+UI_FONT; ctx.textAlign='center';
ctx.lineWidth=4; ctx.strokeStyle='#fff';
ctx.strokeText('!',bobber.x,yy);
ctx.fillStyle='#ff3b30';
ctx.fillText('!',bobber.x,yy);
}
}
function fishReelPos(){
// lane 3: позиция пойманной рыбы в REEL по прогрессу вываживания — по диагонали от глубины крючка (середина воды) к лодке у поверхности (d0>0 гарантировано)
const p=Math.max(0,Math.min(1,1-reel.d/reel.d0));
const pe=p*p*(3-2*p); // лёгкое ease — плавный подход к лодке
const k=reel.tired?0.35:1; // уставшая рыба вялая — амплитуда покачивания ниже
const hy=hookY(); // старт пути — точка крючка (середина воды)
const x=castTo.x+(boatX+24-castTo.x)*pe + Math.sin(time*7*k)*4*k; // сохраняем покачивание
const y=hy+(waterY+10-hy)*pe + Math.sin(time*5*k)*3*k; // диагональ: из глубины к лодке у поверхности
return {x:x,y:y};
}
function drawHookedFish(){
if(state!=='REEL'||!reel) return;
const sp=reel.sp;
const k=reel.tired?0.35:1; // Спринт 4: уставшая рыба вялая — медленнее и амплитуда ниже
const fp=fishReelPos();
const x=fp.x, y=fp.y;
const dir=Math.sin(time*2.5*k)>0?1:-1;
const fs=8+(reel.w/sp.wMax)*10+sp.rarity;
if(reel.boss){ // босс: золотая аура (визуал)
const gg=ctx.createRadialGradient(x,y,4,x,y,fs*2.6);
gg.addColorStop(0,'rgba(255,215,94,0.35)'); gg.addColorStop(1,'rgba(255,215,94,0)');
ctx.fillStyle=gg; ctx.fillRect(x-fs*2.6,y-fs*2.6,fs*5.2,fs*5.2);
}
drawFishShape(x,y,reel.boss?fs*1.5:fs,dir,sp.hue,0.75,Math.sin(time*9*k)*0.3*k); // силуэт крупнее у тяжёлых, босс ×1.5
}
function drawParticles(){
for(const p of particles){
ctx.fillStyle='rgba('+p.color+','+(Math.max(0,p.life/p.max)).toFixed(3)+')';
ctx.beginPath(); ctx.arc(p.x,p.y,p.size,0,7); ctx.fill();
}
}
function drawRipples(){
for(const r of ripples){
ctx.strokeStyle='rgba(255,255,255,'+Math.max(0,r.a).toFixed(3)+')';
ctx.lineWidth=1.5;
ctx.beginPath(); ctx.ellipse(r.x,r.y,r.r,r.r*0.3,0,0,7); ctx.stroke();
}
}
function drawMeters(){
if(state!=='REEL'||!reel) return;
const r=rod(), sp=reel.sp;
const pulling=reel.phase==='pull';
// M4: босс-бой — золотая полоса фазы над метрами (визуал: пульс + точки фаз)
if(reel.boss){
const pulse=1+Math.sin(time*5)*0.08;
ctx.textAlign='center';
ctx.font='800 '+(16*pulse).toFixed(1)+'px '+UI_FONT;
ctx.fillStyle='#ffd75e';
ctx.shadowColor='rgba(255,180,40,0.8)'; ctx.shadowBlur=10;
ctx.fillText(tt('boss_phase_draw',{p:bossPhase}),W/2,84);
ctx.shadowBlur=0;
for(let i=1;i<=3;i++){
ctx.beginPath();
ctx.arc(W/2-20+i*20,94,4,0,7);
ctx.fillStyle=i<=bossPhase?'#ffd75e':'rgba(255,255,255,0.25)';
ctx.fill();
}
}
// --- нагрузка (вертикально справа) ---
const bw=14, bh=H*0.36, bx=W-30, by=H*0.46-bh/2;
ctx.fillStyle='rgba(0,0,0,0.35)'; rr(bx,by,bw,bh,7); ctx.fill();
const ratio=Math.min(1,reel.tension/reel.line);
const col=ratio<0.5?'#2ecc71':ratio<0.8?'#f1c40f':'#e74c3c';
if(ratio>0.01){
ctx.fillStyle=col;
if(ratio>0.8){ ctx.shadowColor='rgba(231,76,60,0.85)'; ctx.shadowBlur=12; } // перегруз: тревожное свечение
const fh=bh*ratio;
rr(bx+2,by+bh-2-fh,bw-4,Math.max(2,fh-2),5); ctx.fill();
ctx.shadowBlur=0;
}
ctx.strokeStyle='rgba(255,255,255,0.6)'; ctx.lineWidth=1.5;
ctx.beginPath(); ctx.moveTo(bx-3,by); ctx.lineTo(bx+bw+3,by); ctx.stroke();
// Спринт 4: черта drag — выше неё при удержании леска скользит
const dgy=by+bh*(1-Math.min(1,r.drag/reel.line));
ctx.strokeStyle='rgba(255,255,255,0.9)'; ctx.lineWidth=2;
ctx.beginPath(); ctx.moveTo(bx-2,dgy); ctx.lineTo(bx+bw+2,dgy); ctx.stroke();
const Fm=fishForce(reel,reel.aggr,pulling);
const slipping=reel.holding&&Fm-r.drag>0;
ctx.font='16px '+UI_FONT; ctx.textAlign='center';
ctx.fillText(slipping?'🌀':pulling?'⚡':(reel.holding?'💪':'·'),bx+bw/2,by-8);
// --- дистанция (снизу) ---
const dw=W-96, dx=22, dy=H-52, dh=13;
ctx.fillStyle='rgba(0,0,0,0.35)'; rr(dx,dy,dw,dh,7); ctx.fill();
// rem = доля оставшейся дистанции: полоска «сгорает» к лодке, рыбка на её конце
const rem=Math.max(0,Math.min(1,reel.d/reel.d0));
if(rem>0.01){
const dg=ctx.createLinearGradient(dx,0,dx+dw,0);
dg.addColorStop(0,'#2e86c8'); dg.addColorStop(1,'#3fa7e8');
ctx.fillStyle=dg;
rr(dx+2,dy+2,Math.max(2,(dw-4)*rem),dh-4,5); ctx.fill();
}
// escape: красная заливка поверх синей, слева направо (рыба ускользает)
if(reel.escape>0.01){
const ew=(dw-4)*reel.escape;
ctx.fillStyle='rgba(231,76,60,0.7)';
rr(dx+2,dy+2,ew,dh-4,5); ctx.fill();
}
// рыбка-маркер на конце полоски
const fx=dx+2+(dw-4)*rem;
ctx.font='20px '+UI_FONT; ctx.textAlign='center';
ctx.fillText('🐟',fx,dy-6+Math.sin(time*10)*1.5);
ctx.font='18px '+UI_FONT;
ctx.fillText('🐟',dx+12,dy+dh+18);
ctx.fillText('⚡',dx+32,dy+dh+18);
// Спринт 4: выносливость — тонкая полоска под дистанцией (затухает к нулю)
// T2b: начинается после иконок 🐟⚡ (dx+44), чтобы не перекрывать их
const sdh=5, sdy=dy+dh+3;
ctx.fillStyle='rgba(0,0,0,0.3)'; rr(dx+44,sdy,dw-44,sdh,2.5); ctx.fill();
if(reel.st>0.01){
ctx.fillStyle=reel.tired?'#7d5ba6':'#b07cc6';
rr(dx+45.5,sdy+1.5,Math.max(1.5,(dw-47)*reel.st),sdh-3,2); ctx.fill();
}
if(reel.tired){
ctx.font='13px '+UI_FONT; ctx.textAlign='left';
ctx.fillText('💤',dx+dw+6,sdy+sdh-1);
}
// статус
ctx.font='700 15px '+UI_FONT; ctx.textAlign='center';
if(pulling){
ctx.fillStyle='#ff6b5e';
ctx.shadowColor='rgba(255,60,40,'+(0.5+0.4*Math.sin(time*10)).toFixed(3)+')'; ctx.shadowBlur=8;
ctx.fillText(t('reel_pull'),W/2,dy-30);
ctx.shadowBlur=0;
}else if(reel.tired){
ctx.fillStyle='#c9a0f5';
ctx.shadowColor='rgba(120,60,180,0.6)'; ctx.shadowBlur=6;
ctx.fillText(t('reel_tired'),W/2,dy-30);
ctx.shadowBlur=0;
}else{
ctx.fillStyle='#7ef0a8';
ctx.shadowColor='rgba(0,0,0,0.6)'; ctx.shadowBlur=4;
ctx.fillText(t('reel_hold'),W/2,dy-30);
ctx.shadowBlur=0;
}
}
function drawPowerBar(){
if(state!=='CHARGE') return;
const w=W*0.7,h=16,x=(W-w)/2,y=H-64;
ctx.fillStyle='rgba(0,0,0,0.4)'; rr(x,y,w,h,8); ctx.fill();
const g=ctx.createLinearGradient(x,0,x+w,0);
g.addColorStop(0,'#2ecc71'); g.addColorStop(0.6,'#f1c40f'); g.addColorStop(1,'#e74c3c');
ctx.fillStyle=g;
if(power>0.01){
const fw=Math.max(2,(w-4)*power);
rr(x+2,y+2,fw,h-4,6); ctx.fill();
// бегунок на конце заливки (визуал)
ctx.fillStyle='rgba(255,255,255,0.9)';
ctx.beginPath(); ctx.arc(x+2+fw-3,y+h/2,4,0,7); ctx.fill();
}
ctx.font='700 14px '+UI_FONT; ctx.textAlign='center';
ctx.fillStyle='#fff';
ctx.shadowColor='rgba(0,0,0,0.65)'; ctx.shadowBlur=4;
ctx.fillText(t('cast_release'),W/2,y-10);
ctx.shadowBlur=0;
}
function drawHint(){
if(state!=='IDLE'||save.casts>=5) return;
const a=0.55+Math.sin(time*3)*0.25;
ctx.globalAlpha=a;
ctx.font='700 17px '+UI_FONT; ctx.textAlign='center';
ctx.fillStyle='#fff';
ctx.shadowColor='rgba(0,0,0,0.65)'; ctx.shadowBlur=5;
ctx.fillText(t('menu_charge_touch'),W/2,H-70); // Y5: i18n (текст тот же, что в меню — тач-ветка)
ctx.shadowBlur=0;
ctx.globalAlpha=1;
}
/* M8: погода — слой в КОНЦЕ draw-цикла: дождь — косые полоски поверх воды и неба,
туман — полупрозрачный слой поверх сцены (+2 полосы глубже для объёма).
HUD — DOM, canvas-слой его не скрывает; поплавок/кнопки под 0.28 тумана остаются читаемыми */
function drawWeather(){
const id=weatherActive();
if(!id) return;
if(id==='rain'){
ctx.strokeStyle='rgba(180,200,220,0.5)';
ctx.lineWidth=1.5;
ctx.beginPath();
for(const dr of rain){
ctx.moveTo(dr.x,dr.y);
ctx.lineTo(dr.x-6,dr.y+20);
}
ctx.stroke();
}else{
ctx.fillStyle='rgba(200,215,225,0.28)';
ctx.fillRect(-8,-8,W+16,H+16); // +8px по периметру: слой рисуется внутри shake-транса — без просвета фона при обрыве
// две полосы с разной прозрачностью и медленным дрейфом — глубина
const b1=((time*10)%(H+120))-120;
const b2=H-((time*6)%(H+160));
ctx.fillStyle='rgba(226,236,244,0.10)';
ctx.fillRect(0,b1,W,48);
ctx.fillStyle='rgba(226,236,244,0.07)';
ctx.fillRect(0,b2,W,70);
}
}
function draw(){
ctx.clearRect(0,0,W,H);
ctx.save();
if(shake>0){
ctx.translate(rand(-1,1)*shake*8,rand(-1,1)*shake*8);
}
drawSky();
drawWater();
drawAmbientFish();
if(biteFish&&biteFish.mode!=='out'){
if(state==='BITE'){
// топление (lane 2): рыба дёргается у крючка, синхронно с фазами топления поплавка (time*22)
drawFishShape(hookPos.x+Math.sin(time*25)*7, hookPos.y+Math.cos(time*22)*5, 12+biteFish.sp.rarity*2.5, Math.sin(time*25)>0?1:-1, biteFish.sp.hue, 0.8, Math.sin(time*8)*0.25);
}else{
// APPROACH: подплывает к поплавку как раньше
drawFishShape(biteFish.x,biteFish.y,12+biteFish.sp.rarity*2.5,biteFish.dir,biteFish.sp.hue,0.8,Math.sin(time*8)*0.25);
}
}
else if(biteFish&&biteFish.mode==='out') drawFishShape(biteFish.x,biteFish.y,12+biteFish.sp.rarity*2.5,biteFish.dir,biteFish.sp.hue,0.5,Math.sin(time*8)*0.25);
drawBoat();
drawLineAndBobber();
drawHookedFish();
drawRipples();
drawParticles();
drawMeters();
drawPowerBar();
drawHint();
drawWeather(); // M8: погодный слой — в конце draw-цикла
ctx.restore();
}
/* =========================================================
Y1: SDK Яндекс Игр
Обёртка YG — единственная точка SDK. Стаб (file:// без ?sdk=1) —
no-op + счётчики для тестов. SDK подгружается динамически ТОЛЬКО
по http(s) (или file://?sdk=1): при чистом file:// скрипт не
создаётся вообще (иначе 404/ERR_FILE_NOT_FOUND в консоли).
file://?sdk=1 — относительный sdk.js: работает, если лежит рядом
с index.html.
========================================================= */
const YG={
sdk:null, active:false, // ysdk или null (стаб)
paused:false, // глобальная пауза: реклама / скрытая вкладка / платформа
readySent:false,
counts:{ready:0,start:0,stop:0,fsAdv:0,rv:0}, // счётчики вызовов (для тестов)
adWatchdog:null, // Y2: watchdog — SDK не закрыл рекламу (нет onClose/onError) → снять паузу
_sdkReady(){ if(this.sdk){ try{ this.sdk.features.LoadingAPI&&this.sdk.features.LoadingAPI.ready&&this.sdk.features.LoadingAPI.ready(); }catch(e){} } },
init(ysdk){
if(this.active) return; // однократно (апгрейд стаб(null) → реальный SDK позже — разрешён)
this.sdk=ysdk||null; this.active=!!ysdk;
if(ysdk){
try{
const p=()=>this.onPause(), r=()=>this.onResume();
ysdk.on('game_api_pause',p);
ysdk.on('game_api_resume',r);
}catch(e){}
}
if(this.readySent) this._sdkReady(); // SDK доинициализировался после ready()
},
ready(){ this.readySent=true; this.counts.ready++; this._sdkReady(); },
gameplayStart(){ this.counts.start++; if(this.sdk){ try{ this.sdk.features.GameplayAPI&&this.sdk.features.GameplayAPI.start&&this.sdk.features.GameplayAPI.start(); }catch(e){} } },
gameplayStop(){ this.counts.stop++; if(this.sdk){ try{ this.sdk.features.GameplayAPI&&this.sdk.features.GameplayAPI.stop&&this.sdk.features.GameplayAPI.stop(); }catch(e){} } },
onPause(){
if(this.paused) return;
this.paused=true;
this.gameplayStop();
if(AC){ try{ AC.suspend(); }catch(e){} }
},
onResume(){
if(!this.paused) return;
// резюме не снимается, пока открыта реклама — снимет endAd()
// (пути сюда: visibilitychange / game_api_resume, а оверлей рекламы ещё открыт)
if(adShowing) return;
// Y6: резюме не снимается, пока открыт оверлей паузы — снимут только
// closePause()/кнопка «В меню» (пути сюда: blur/focus/visibilitychange
// во время открытой паузы)
if(pauseOpen) return;
this.paused=false;
last=performance.now();
if(state!=='MENU'&&!uiOpen) this.gameplayStart();
},
// Y2: реклама — ТОЛЬКО через SDK Яндекса (треб. 4.1). Стаб: fullscreen —
// no-op (вернёт false — реклама не показана), rewarded — симуляция успешного
// просмотра (локальная разработка, all-в-одном-клике флоу).
// Y2: watchdog — если SDK не доставит onClose/onError (баг SDK, убитый iframe),
// паузу снимаем сами, иначе игра замрзнет навсегда (треб. 1.14)
_startAdWatchdog(){
clearTimeout(this.adWatchdog);
this.adWatchdog=setTimeout(()=>{ if(adShowing){ console.warn('Yandex SDK: реклама не закрылась (90 с) — снимаю паузу'); endAd(); } },90000);
},
showFullscreen(cb){
this.counts.fsAdv++;
if(this.sdk){
try{ this.sdk.adv.showFullscreenAdv({callbacks:cb}); }catch(e){ return false; } // сбой SDK — как стаб: endAd() на месте вызова
this._startAdWatchdog();
return true;
}
return false; // стаб: реклама не показана
},
showRewarded(cb){
this.counts.rv++;
if(this.sdk){
try{ this.sdk.adv.showRewardedVideo({callbacks:cb}); }catch(e){ return false; }
this._startAdWatchdog(); // стаб-ветка ниже — флоу синхронный, watchdog не ставится
return true;
}
// стаб: симуляция успешного просмотра (локальная разработка)
try{ cb.onOpen&&cb.onOpen(); cb.onRewarded&&cb.onRewarded(); cb.onClose&&cb.onClose(true); }catch(e){}
return true;
},
};
// Y2: константы и состояние рекламы. Interstitial — на закрытии карточки улова
// (логическая пауза, треб. 4.4): первый показ не раньше AD_FIRST_MS сессии,
// дальше не чаще AD_COOLDOWN_MS. Rewarded «монеты ×2» — на самой карточке
// (треб. 4.5.1/4.5.2). Реклама не персистится (как погода).
const AD_FIRST_MS=120000; // первый interstitial не раньше 2 мин сессии
const AD_COOLDOWN_MS=180000; // между interstitial'ами — 3 мин
let sessionStartTs=Date.now(); // старт сессии (момент загрузки страницы)
let lastAdTs=0; // время запуска последнего interstitial
let adShowing=false; // реклама прямо сейчас (interstitial или rewarded)
let rvVal=0, rvDone=false; // rewarded: цена улова для бонуса ×2 и флаг «уже получен»
/* =========================================================
Y5: i18n RU/EN — автоопределение языка (треб. 2.14)
T — таблицы строк: ru — ТЕКУЩИЕ точные тексты, en — перевод.
Резолюция языка: forceLang (тест-форс) → SDK environment.i18n.lang
→ ru. Стаб (file:// без SDK) — ВСЕГДА ru. navigator.language
не используем осознанно (headless en-US сломал бы RU-тесты).
Блок стоит ДО IIFE-загрузки SDK: стаб-ветка сразу вызывает
resolveLang(null) → setLang → t(...), так что T должен быть
инициализирован до этой точки скрипта.
========================================================= */
const T={
ru:{
title:'Рыбалка',
menu_title:'🎣 РЫБАЛКА',
menu_charge_touch:'👆 Держи палец — заряжай бросок',
menu_charge_mouse:'🖱 Зажми кнопку мыши — заряжай бросок',
menu_throw:'<b>отпусти</b> — кидай удочку.<br>Дальше бросок = реже и жирнее рыба!',
menu_bite:'Видишь <b style="color:#ff6b5e">!</b> — быстро жми, чтобы зацепить.<br>При вываживании: тяни, когда рыба отдыхает,<br>отпусти, когда она <b>тянет</b> — иначе лопнет!<br>Не тяни слишком долго — рыба <b>сбегает</b> (красная полоса)!',
menu_weight:'У каждой рыбы свой <b>вес</b>, продажа — по цене за кг.<br>У удочек есть <b>предел веса</b>: перевесишь — шнур лопнет! <br>Лучшие снасти = больше шансов на трофей 🏆',
menu_drag:'Не каждый заброс — с клёвом: если молчит — подожди.<br>У удилищ есть <b>тормоз (drag)</b>: рывок сильнее — леска скользит!',
btn_play:'Играть',
shop_title:'🛒 Лавка рыбака',
sec_rods:'🎣 Удилища',
sec_lures:'🪱 Приманки',
sec_boat:'Лодка',
sec_bobber:'Поплавок',
sec_locations:'Локации',
sec_streak:'Стрик входа',
sec_quests:'Квесты дня',
sec_ach:'🏅 Достижения',
btn_select:'Выбрать',
btn_selected:'✓ Выбрано',
btn_selected_chk:'Выбрано ✓',
btn_selected_f:'Выбрана ✓',
btn_buy:'Купить',
btn_cancel:'Отмена',
btn_reset:'Сбросить',
btn_ok:'Отлично!',
free:'бесплатно',
lvl:'ур.',
kg:'кг',
per_kg:'🪙/кг',
price_label:'Цена: ',
locked_desc:'Откроется: улучши «{name}» до 4 ур.',
gate_toast:'Сначала улучши «{name}» до 4 ур.',
stats:'Бросков: {casts} · Заработано: {earned} 🪙',
not_caught:'не пойман',
max_w:'макс {w} кг',
card_sub:'{w} кг · {price} 🪙/кг',
card_record:'🏆 РЕКОРД!',
card_boss:'🏆 БОСС!',
card_boss_suffix:'-БОСС',
rv_btn:'📺 Реклама: ×2 за этот улов',
rv_done:'✓ Бонус получен',
boss_defeated:'🏆 БОСС ПОБЕЖДЁН! +{v} 🪙',
streak_day:'Стрик: день {d} — +{c} 🪙',
streak_line:'День {d} · далее +{n} 🪙',
quest_done:'Квест выполнен: {text} +{r} 🪙',
quests_done_today:'Квесты на сегодня закончились — заходи завтра!',
shield:'Щит спас стрик!',
bonus_coin:'+{v}% к монетам',
bonus_window:'+{v} с к подсечке',
bonus_line:'+{v} к прочности',
ach_toast:'🏅 Достижение: {name}',
bought:'Куплено: {name}!',
upgraded:'Улучшено: {name} → {lv} ур.!',
not_enough:'Не хватает монет 🪙',
welcome_lakes:'Добро пожаловать на Озёра!',
location_set:'Локация: {name}',
progress_reset:'Прогресс сброшен 🔄',
night_light:'Ночью нужен фонарик — улучши удилище (первый апгрейд)',
escaped_bite:'Ушла… жми быстрее!',
snap_big:'💥 Рыба крупнее предела удочки!',
snap:'💥 Линия лопнула!',
escaped:'Сбежала!',
boss_phase:'⚠️ Босс рвёт леску! Фаза {p}/3',
boss_phase_draw:'⚠️ БОСС-РЫБА · ФАЗА {p}/3',
reel_pull:'⚡ РЫБА ТЯНЕТ — ОТПУСТИ! ⚡',
reel_tired:'💤 Рыба устала — втягивай!',
reel_hold:'Держи палец — втягивай!',
cast_release:'Отпусти — бросок!',
wx_clear:'☀️ Погода прояснила',
wx_rain:'Дождь: шанс серебряной/золотой/радужной ×2,5',
wx_fog:'Туман: клёв чаще ×1,5',
sec_short:'с',
reset_title:'🗑️ Сбросить прогресс?',
reset_text:'Монеты, снасти и коллекция будут стёрты.<br>Это действие <b>нельзя отменить</b>.',
reset_title_attr:'Сбросить прогресс',
tab_tackle:'Снасти',
tab_journal:'Дневник',
tab_rewards:'Награды',
tab_ach:'Достижения',
tab_skins:'Скины',
tab_locations:'Локации',
pause_title:'⏸ Пауза',
pause_resume:'Продолжить',
pause_menu:'В меню',
btn_pause_title:'Пауза'
},
en:{
title:'Fishing',
menu_title:'🎣 FISHING',
menu_charge_touch:'👆 Hold your finger — charge the cast',
menu_charge_mouse:'🖱 Hold the mouse button — charge the cast',
menu_throw:'<b>let go</b> — cast your rod.<br>Farther cast = rarer and bigger fish!',
menu_bite:'See the <b style="color:#ff6b5e">!</b> — hit it fast to hook the fish.<br>While reeling in: pull when the fish rests,<br>let go when it <b>pulls</b> — or the line snaps!<br>Do not hold too long — the fish <b>escapes</b> (red bar)!',
menu_weight:'Every fish has its own <b>weight</b>, sold by price per kg.<br>Rods have a <b>weight limit</b>: overload — the line snaps! <br>Better gear = better trophy chances 🏆',
menu_drag:'Not every cast gets a bite: if it is silent — wait.<br>Rods have a <b>drag</b>: a stronger jerk — the line slips!',
btn_play:'Play',
shop_title:"🛒 Angler's Shop",
sec_rods:'🎣 Rods',
sec_lures:'🪱 Lures',
sec_boat:'Boat',
sec_bobber:'Bobber',
sec_locations:'Locations',
sec_streak:'Daily Streak',
sec_quests:'Daily Quests',
sec_ach:'🏅 Achievements',
btn_select:'Select',
btn_selected:'✓ Selected',
btn_selected_chk:'Selected ✓',
btn_selected_f:'Selected ✓',
btn_buy:'Buy',
btn_cancel:'Cancel',
btn_reset:'Reset',
btn_ok:'Nice!',
free:'Free',
lvl:'lvl',
kg:'kg',
per_kg:'🪙/kg',
price_label:'Price: ',
locked_desc:'Unlocks: upgrade "{name}" to level 4',
gate_toast:'Upgrade "{name}" to level 4 first',
stats:'Casts: {casts} · Earned: {earned} 🪙',
not_caught:'not caught',
max_w:'max {w} kg',
card_sub:'{w} kg · {price} 🪙/kg',
card_record:'🏆 RECORD!',
card_boss:'🏆 BOSS!',
card_boss_suffix:'-BOSS',
rv_btn:'📺 Ad: ×2 for this catch',
rv_done:'✓ Bonus received',
boss_defeated:'🏆 BOSS DEFEATED! +{v} 🪙',
streak_day:'Streak: day {d} — +{c} 🪙',
streak_line:'Day {d} · next +{n} 🪙',
quest_done:'Quest done: {text} +{r} 🪙',
quests_done_today:"Today's quests are done — come back tomorrow!",
shield:'The shield saved your streak!',
bonus_coin:'+{v}% to coins',
bonus_window:'+{v}s hookset window',
bonus_line:'+{v} line strength',
ach_toast:'🏅 Achievement: {name}',
bought:'Bought: {name}!',
upgraded:'Upgraded: {name} → lvl {lv}!',
not_enough:'Not enough coins 🪙',
welcome_lakes:'Welcome to the Lakes!',
location_set:'Location: {name}',
progress_reset:'Progress reset 🔄',
night_light:'Night needs a flashlight — upgrade your rod (first upgrade)',
escaped_bite:'It got away… hit it faster!',
snap_big:'💥 Fish bigger than the rod limit!',
snap:'💥 Line snapped!',
escaped:'Escaped!',
boss_phase:'⚠️ The boss is tearing the line! Phase {p}/3',
boss_phase_draw:'⚠️ BOSS FISH · PHASE {p}/3',
reel_pull:'⚡ FISH PULLS — LET GO! ⚡',
reel_tired:'💤 Fish is tired — reel in!',
reel_hold:'Hold — reel in!',
cast_release:'Release — cast!',
wx_clear:'☀️ Weather cleared',
wx_rain:'Rain: silver/gold/rainbow chance ×2.5',
wx_fog:'Fog: bites more often ×1.5',
sec_short:'s',
reset_title:'🗑️ Reset progress?',
reset_text:'Coins, gear and the collection will be erased.<br>This action <b>cannot be undone</b>.',
reset_title_attr:'Reset progress',
tab_tackle:'Gear',
tab_journal:'Journal',
tab_rewards:'Rewards',
tab_ach:'Achievements',
tab_skins:'Skins',
tab_locations:'Locations',
pause_title:'⏸ Pause',
pause_resume:'Resume',
pause_menu:'To menu',
btn_pause_title:'Pause'
}
};
let LANG='ru';
let forceLang=null; // Y5: тест-глобал: 'ru'|'en'|null (приоритет в resolveLang)
function t(key){ const m=T[LANG]||{}; return (key in m)?m[key]:((T.ru&&T.ru[key]!==undefined)?T.ru[key]:key); }
function tt(key,o){ let s=t(key); if(o){for(const k in o)s=s.split('{'+k+'}').join(o[k]);} return s; }
function trName(x){ return (LANG==='en'&&x.nameEn)?x.nameEn:x.name; }
function trDesc(x){ return (LANG==='en'&&x.descEn)?x.descEn:x.desc; }
function trRarity(i){ return (LANG==='en')?RARITY_NAMES_EN[i]:RARITY_NAMES[i]; }
/* Y5: подпись следующего уровня снасти в лавке (RU/EN по языку) */
function upgNextText(type,lv){ return (LANG==='en')?((type==='rod'?ROD_UPG_NEXT_EN:LURE_UPG_NEXT_EN)[lv]):((type==='rod'?ROD_UPG_NEXT:LURE_UPG_NEXT)[lv]); }
/* Y5: безопасные проверки видимости оверлеев (для setLang) */
function shopOpenNow(){ const s=$('shop'); return !!(s&&!s.classList.contains('hidden')); }
function cardOpenNow(){ const c=$('card'); return !!(c&&!c.classList.contains('hidden')); }
const IS_TOUCH=('ontouchstart' in window)||(navigator.maxTouchPoints>0); // Y5: device-aware текст меню
/* Y5: меню — заполняется из T (ид btnPlay и класс big сохраняются; узлы НЕ пересоздаются —
обработчики слушателей живут) */
function renderMenu(){
$('menuTitle').textContent=t('menu_title');
$('menuP1').innerHTML=(IS_TOUCH?t('menu_charge_touch'):t('menu_charge_mouse'))+'<br>'+t('menu_throw');
$('menuP2').innerHTML=t('menu_bite');
$('menuP3').innerHTML=t('menu_weight');
$('menuP4').innerHTML=t('menu_drag');
$('btnPlay').textContent=t('btn_play');
}
/* Y5: статичные подписи вне shopBody (лавка/вкладки/сброс/карточка) — из T */
function renderStaticUI(){
$('shopTitle').textContent=t('shop_title');
$('btnReset').title=t('reset_title_attr');
$('tabTackle').title=t('tab_tackle');
$('tabJournal').title=t('tab_journal');
$('tabRewards').title=t('tab_rewards');
$('tabAch').title=t('tab_ach');
$('tabSkins').title=t('tab_skins');
$('tabLocations').title=t('tab_locations');
$('resetTitle').textContent=t('reset_title');
$('resetText').innerHTML=t('reset_text');
$('btnResetNo').textContent=t('btn_cancel');
$('btnResetYes').textContent=t('btn_reset');
$('pauseTitle').textContent=t('pause_title');
$('btnPauseResume').textContent=t('pause_resume');
$('btnPauseMenu').textContent=t('pause_menu');
$('btnPause').title=t('btn_pause_title');
$('cardRecord').textContent=t('card_record');
$('cardBoss').textContent=t('card_boss');
$('btnCardOk').textContent=t('btn_ok');
$('btnRv').textContent=t('rv_btn');
}
/* Y5: пере-подпись открытых элементов карточки улова при смене языка */
function refreshCardNow(){
$('cardRecord').textContent=t('card_record');
$('cardBoss').textContent=t('card_boss');
$('btnCardOk').textContent=t('btn_ok');
$('btnRv').textContent=rvDone?t('rv_done'):t('rv_btn');
}
function setLang(lang){
LANG=(lang==='en')?'en':'ru';
document.documentElement.lang=LANG;
document.title=t('title');
renderMenu();
renderStaticUI();
if(shopOpenNow())renderShop();
if(cardOpenNow())refreshCardNow();
}
/* Y5: резолюция языка — ДВЕ ветки вызова (стаб IIFE / finish(ysdk)):
forceLang → SDK i18n.lang → ru (дефолт, в т.ч. стаб) */
function resolveLang(ysdk){
let lg=forceLang;
if(!lg&&ysdk&&ysdk.environment&&ysdk.environment.i18n&&ysdk.environment.i18n.lang)lg=ysdk.environment.i18n.lang;
setLang(lg||'ru');
}
// Y1: динамическая загрузка SDK (документированный Яндексом вариант):
// http(s) — /sdk.js, file://?sdk=1 — sdk.js рядом с index.html. Первый сбой
// — один ретраи, второй — стаб + warn. 3-секундный таймер не финализирует.
(function(){
const sdkEnabled=location.protocol!=='file:'||/[?&]sdk=1/.test(location.search);
if(!sdkEnabled){ YG.init(null); resolveLang(null); return; } // file:// без ?sdk=1 — сразу стаб (язык всегда ru, кроме forceLang), скрипт не создаётся
const finish=(ysdk)=>{ YG.init(ysdk||null); resolveLang(ysdk); }; // единая точка (защита в init: идемпотентно); Y5: язык из SDK i18n.lang
let attempt=0, settled=false, slowWarned=false;
const load=()=>{
attempt++;
const s=document.createElement('script');
s.src=location.protocol==='file:'?'sdk.js':'/sdk.js'; // file:// — относительный путь
s.async=true;
s.onload=()=>{
settled=true;
if(window.YaGames){ try{ YaGames.init().then(y=>finish(y)).catch(()=>finish(null)); }catch(e){ finish(null); } }
else finish(null);
};
s.onerror=()=>{
if(attempt<2){ load(); return; } // первый сбой — один ретраи (новый скрипт с тем же src)
settled=true;
finish(null);
console.warn('Yandex SDK: загрузка не удалась, игра в стаб-режиме');
};
document.head.appendChild(s);
};
load();
setTimeout(()=>{ // страховка: не финализирует, только одноразовый warn
if(!settled&&!slowWarned){ slowWarned=true; console.warn('Yandex SDK: загрузка дольше 3 с'); }
},3000);
})();
// Y1/Y6: потеря фокуса (треб. 1.3) — пауза звука/гейма при скрытой вкладке
// (visibilitychange) И при потере фокуса окна (blur, десктоп/мобил);
// возврат — visible/focus → YG.onResume (гарды adShowing/pauseOpen внутри)
document.addEventListener('visibilitychange',()=>{ if(document.hidden) YG.onPause(); else YG.onResume(); });
window.addEventListener('blur',()=>YG.onPause());
window.addEventListener('focus',()=>YG.onResume());
/* =========================================================
ЦИКЛ
========================================================= */
let last=performance.now();
function frame(now){
if(!YG.readySent) YG.ready(); // Y1: LoadingAPI.ready() (треб. 1.19.2) — первый кадр = меню видно
const dt=Math.min(0.05,(now-last)/1000); last=now;
if(!YG.paused){ // Y1: под паузой (реклама/скрытая вкладка/платформа) замораживается всё игровое время
time+=dt;
setDayTime(dayTime+dt/DAY_LENGTH); // M3: день/ночь идут в реальном времени
updateWeather(dt); // M8: погода — в реальном времени (как день/ночь)
updateWeatherHud(); // M8: пилюля погоды в HUD (иконка + остаток секунд)
updateDecor(dt);
if(!uiOpen) updateGame(dt);
// Y6: синхронизация HUD-кнопок — каждый кадр вне паузы (а не только в updateGame):
// переходы в MENU/под оверлеи (btnResetYes/openShop/btnReset) не гонят updateGame,
// и без этого #btnPause оставался бы «залипшим» видимым за оверлеем
syncDom();
}
draw();
requestAnimationFrame(frame);
}
/* =========================================================
ВВОД
========================================================= */
function onDown(){
ac();
if(uiOpen) return;
if(state==='IDLE'){ state='CHARGE'; charge=0; power=0; }
else if(state==='APPROACH'||state==='BITE'){ hook(); }
else if(state==='REEL'&&reel){ reel.holding=true; }
}
function onUp(){
if(state==='CHARGE') doCast();
else if(state==='REEL'&&reel) reel.holding=false;
}
canvas.addEventListener('pointerdown',e=>{ e.preventDefault(); onDown(); });
window.addEventListener('pointerup',onUp);
window.addEventListener('pointercancel',onUp);
document.addEventListener('contextmenu',e=>e.preventDefault());
/* =========================================================
UI: МАГАЗИН / ДНЕВНИК / КАРТОЧКА
========================================================= */
let shopTab='tackle';
function openShop(){ uiOpen=true; $('shop').classList.remove('hidden'); renderShop(); sfx('click'); YG.gameplayStop(); } // Y1: геймплейная разметка
function closeShop(){ uiOpen=false; $('shop').classList.add('hidden'); sfx('click'); YG.gameplayStart(); } // Y1: геймплейная разметка
function setTab(t){ shopTab=t; renderShop();
$('tabTackle').classList.toggle('active',t==='tackle');
$('tabJournal').classList.toggle('active',t==='journal');
$('tabRewards').classList.toggle('active',t==='rewards');
$('tabAch').classList.toggle('active',t==='ach');
$('tabSkins').classList.toggle('active',t==='skins');
$('tabLocations').classList.toggle('active',t==='locations');
}
function lvPips(lv){ let s=''; for(let k=1;k<=4;k++) s+=k<=lv?'●':'○'; return s; }
function itemRow(item,i,type,owned,cur){
const list=type==='rod'?RODS:LURES;
const lvMap=type==='rod'?(save.rodLv||{}):(save.lureLv||{});
const lv=owned?Math.max(1,Math.min(4,lvMap[i]>=1?lvMap[i]:1)):1;
// M5: гейтинг — снасть №i открывается, когда снасть №(i−1) того же типа на 4 ур.
const prevLv=i>0?((lvMap[list[i-1].id]>=1)?lvMap[list[i-1].id]:1):0;
const locked=!owned&&i>0&&prevLv<4;
let btns='';
if(owned){
btns+=cur?'<button class="buybtn current" disabled>'+t('btn_selected')+'</button>'
:'<button class="buybtn owned" data-act="use" data-type="'+type+'" data-i="'+i+'">'+t('btn_select')+'</button>';
if(lv<4) btns+='<button class="buybtn upgbt" data-act="upgrade" data-type="'+type+'" data-i="'+i+'">⬆ '+upgNextText(type,lv-1)+' · '+upgCost(type,i,lv)+' 🪙</button>';
}else if(!locked){
btns='<button class="buybtn" data-act="buy" data-type="'+type+'" data-i="'+i+'">'+item.cost+' 🪙</button>';
}
let desc=trDesc(item); // Y5: i18n
if(locked) desc=tt('locked_desc',{name:trName(list[i-1])});
const lvTag=owned?' <span class="lvtag">'+lvPips(lv)+' '+lv+' '+t('lvl')+'</span>':'';
return '<div class="item'+(locked?' locked':'')+'"><div><div class="itemname">'+(item.icon||'')+' '+trName(item)+lvTag+'</div>'+
'<div class="itemdesc">'+desc+'</div></div>'+
(btns?'<div class="rowbtns">'+btns+'</div>':'<div class="rowbtns"><button class="buybtn" disabled>🔒</button></div>')+'</div>';
}
/* Этап 4: строка скина (стиль как у снастей, но проще): название, цена, одна кнопка
(«Купить N 🪙» / «Выбрать» / «Выбрано ✓») */
function skinRow(list,i,owned,equipped,group){
const s=list[i];
const price=s.cost>0?s.cost+' 🪙':t('free');
let btn;
if(equipped){
btn='<button class="buybtn current" disabled>'+t('btn_selected_chk')+'</button>';
}else if(owned){
btn='<button class="buybtn owned" data-act="select" data-type="'+group+'" data-i="'+i+'">'+t('btn_select')+'</button>';
}else{
btn='<button class="buybtn" data-act="buyskin" data-type="'+group+'" data-i="'+i+'">'+t('btn_buy')+' '+price+'</button>';
}
return '<div class="item"><div><div class="itemname">'+trName(s)+'</div>'+
'<div class="itemdesc">'+t('price_label')+price+'</div></div>'+
'<div class="rowbtns">'+btn+'</div></div>';
}
/* Этап 5: строка локации (по образцу skinRow): название, подпись, цена, одна кнопка
(«Купить N 🪙» / «Выбрать» / «Выбрана ✓») */
function locationRow(loc,i,owned,selected){
const price=loc.cost>0?loc.cost+' 🪙':t('free');
let btn;
if(selected){
btn='<button class="buybtn current" disabled>'+t('btn_selected_f')+'</button>';
}else if(owned){
btn='<button class="buybtn owned" data-act="selectlocation" data-i="'+i+'">'+t('btn_select')+'</button>';
}else{
btn='<button class="buybtn" data-act="buylocation" data-i="'+i+'">'+t('btn_buy')+' '+price+'</button>';
}
return '<div class="item"><div><div class="itemname">'+trName(loc)+'</div>'+
'<div class="itemdesc">'+trDesc(loc)+' · '+price+'</div></div>'+
'<div class="rowbtns">'+btn+'</div></div>';
}
function renderShop(){
const body=$('shopBody');
if(shopTab==='tackle'){
let h='<div class="section-title">'+t('sec_rods')+'</div>';
RODS.forEach((r,i)=>{ h+=itemRow(r,i,'rod',save.rods.indexOf(i)>=0,save.rod===i); });
h+='<div class="section-title">'+t('sec_lures')+'</div>';
LURES.forEach((l,i)=>{ h+=itemRow(l,i,'lure',save.lures.indexOf(i)>=0,save.lure===i); });
body.innerHTML=h;
}else if(shopTab==='journal'){
let h='<div class="statsline">'+tt('stats',{casts:save.casts,earned:save.earned})+'</div>';
const vc=v=>v>0?String(v):'—'; // M6: не пойманный вариант — «—»
for(const s of SPECIES){
const c=save.caught[s.id]||{n:0,best:0,sn:0,sv:0,rb:0};
if(c.n>0){
const sn=c.sn||0, sv=c.sv||0, rb=c.rb||0, nm=c.n-sn-sv-rb;
// M6: 4 мини-счётчика вариантов (обычная n−sv−sn−rb / серебряная / золотая / радужная);
// Y5: i18n — подписи вариантов из VARIANTS через trName
h+='<div class="jrow"><span class="je">'+s.emoji+'</span><span class="jn"><b>'+trName(s)+'</b>'+
'<span class="jv jv-n" title="'+trName(VARIANTS[0])+'">'+vc(nm)+'</span>'+
'<span class="jv jv-sv" title="'+trName(VARIANTS[1])+'">'+vc(sv)+'</span>'+
'<span class="jv jv-sn" title="'+trName(VARIANTS[2])+'">'+vc(sn)+'</span>'+
'<span class="jv jv-rb" title="'+trName(VARIANTS[3])+'">'+vc(rb)+'</span><br>'+
'<span style="font-size:11px;color:'+RARITY_COLORS[s.rarity]+'">'+trRarity(s.rarity)+' · '+s.price+' '+t('per_kg')+'</span></span>'+
'<span class="jc">×'+c.n+'<br>'+tt('max_w',{w:c.best.toFixed(1)})+'</span></div>';
}else{
h+='<div class="jrow unknown"><span class="je">❓</span><span class="jn">???</span>'+
'<span class="jc">'+t('not_caught')+'</span></div>';
}
}
body.innerHTML=h;
}else if(shopTab==='rewards'){
// 🎯 Награды: стрик входа + квесты дня
const st=save.streak;
const idx=st.days>0?streakIdx(st.days):0;
let h='<div class="section-title">'+t('sec_streak')+'</div><div class="streak">';
for(let i=1;i<=7;i++){
h+='<span class="st-dot'+(st.days>0&&i<=idx?' on':'')+(st.days>0&&i===idx?' cur':'')+'">'+STREAK_REWARDS[i-1]+'</span>';
}
h+='</div>';
h+='<div class="statsline">'+tt('streak_line',{d:(st.days||0),n:nextStreakReward(st.days||1)})+'</div>';
h+='<div class="section-title">'+t('sec_quests')+'</div>';
const ql=(save.quests&&save.quests.list)||[];
if(ql.length){
for(const q of ql){
h+='<div class="jrow'+(q.done?' qdone':'')+'"><span class="je">'+questIcon(q)+'</span>'+
'<span class="jn"><b>'+questText(q)+'</b></span>'+
'<span class="jc">'+(q.done?'✓ +'+q.reward+' 🪙':q.prog+'/'+q.goal)+'</span></div>';
}
}else{
h+='<div class="statsline">'+t('quests_done_today')+'</div>';
}
body.innerHTML=h;
}else if(shopTab==='ach'){
// 🏅 Достижения: выданные — яркие, остальные приглушённые
let h='<div class="section-title">'+t('sec_ach')+'</div>';
for(const a of ACHIEVEMENTS){
const got=!(!(save.ach&&save.ach[a.id]));
h+='<div class="jrow'+(got?' got':' locked')+'"><span class="je">'+a.icon+'</span>'+
'<span class="jn"><b>'+trName(a)+'</b><br><span class="adesc">'+trDesc(a)+' · '+bonusText(a.bonus)+'</span></span>'+
(got?'<span class="jc">✓</span>':'')+'</div>';
}
body.innerHTML=h;
}else if(shopTab==='skins'){
// Этап 4: скины — лодка и поплавок (чистая косметика, coin-sink)
let h='<div class="section-title">'+t('sec_boat')+'</div>';
BOAT_SKINS.forEach((s,i)=>{ h+=skinRow(BOAT_SKINS,i,save.boatSkins.indexOf(i)>=0,save.boatSkin===i,'boat'); });
h+='<div class="section-title">'+t('sec_bobber')+'</div>';
BOBBER_SKINS.forEach((s,i)=>{ h+=skinRow(BOBBER_SKINS,i,save.bobberSkins.indexOf(i)>=0,save.bobberSkin===i,'bobber'); });
body.innerHTML=h;
}else if(shopTab==='locations'){
// Этап 5: локации — Река (родная вода) и Озёра (100000 🪙, новые рыбы)
let h='<div class="section-title">'+t('sec_locations')+'</div>';
LOCATIONS.forEach((loc,i)=>{ h+=locationRow(loc,i,save.locations.indexOf(i)>=0,save.location===i); });
body.innerHTML=h;
}
}
function shopClick(e){
const b=e.target.closest('[data-act]');
if(!b) return;
const type=b.dataset.type, i=+b.dataset.i;
if(b.dataset.act==='buylocation'||b.dataset.act==='selectlocation'){
// Этап 5: локации — покупка (монеты списать, push, АВТО-ПЕРЕХОД) и выбор
const loc=LOCATIONS[i];
if(!loc) return;
if(loc.id!==i) return; // защита: индекс массива не обязан совпадать с id при будущей вставке записей
if(b.dataset.act==='buylocation'){
if(save.locations.indexOf(i)>=0){ sfx('no'); return; } // уже куплено — защита
if(save.coins<loc.cost){ sfx('no'); toast(t('not_enough')); return; }
save.coins-=loc.cost; save.locations.push(i);
save.location=i; // авто-переход на купленную локацию
persist(); updateHUD(); sfx('coin'); renderShop();
toast(loc.id===1?t('welcome_lakes'):tt('bought',{name:trName(loc)}));
}else{
if(save.locations.indexOf(i)<0){ sfx('no'); return; } // не куплено — выбрать нельзя (паттерн защиты buy)
save.location=i;
persist(); updateHUD(); sfx('click'); renderShop();
toast(tt('location_set',{name:trName(loc)}));
}
return;
}
if(type==='boat'||type==='bobber'){
// Этап 4: скины — покупка (монеты списать, авто-экипировка) и выбор
const slist=type==='boat'?BOAT_SKINS:BOBBER_SKINS;
const owned=type==='boat'?save.boatSkins:save.bobberSkins;
const item=slist[i];
if(b.dataset.act==='buyskin'){
if(!item||owned.indexOf(i)>=0){ sfx('no'); return; } // уже куплено — защита
if(save.coins<item.cost){ sfx('no'); toast(t('not_enough')); return; }
save.coins-=item.cost; owned.push(i);
if(type==='boat') save.boatSkin=i; else save.bobberSkin=i; // авто-экипировка
persist(); updateHUD(); sfx('coin'); renderShop();
toast(tt('bought',{name:trName(item)}));
}else{
if(!item||owned.indexOf(i)<0){ sfx('no'); return; } // не куплено — выбрать нельзя (паттерн защиты buy)
if(type==='boat') save.boatSkin=i; else save.bobberSkin=i;
persist(); updateHUD(); sfx('click'); renderShop();
}
return;
}
const list=type==='rod'?RODS:LURES;
const owned=type==='rod'?save.rods:save.lures;
if(!save.rodLv||typeof save.rodLv!=='object') save.rodLv={};
if(!save.lureLv||typeof save.lureLv!=='object') save.lureLv={};
const lvMap=type==='rod'?save.rodLv:save.lureLv;
const item=list[i];
if(b.dataset.act==='buy'){
if(i>0&&lvMap[list[i-1].id]<4){ sfx('no'); toast(tt('gate_toast',{name:trName(list[i-1])})); return; } // M5: гейтинг
if(save.coins<item.cost){ sfx('no'); toast(t('not_enough')); return; }
save.coins-=item.cost; owned.push(i); lvMap[i]=1; // куплено — уровень 1
if(type==='rod') save.rod=i; else save.lure=i;
persist(); updateHUD(); sfx('coin'); renderShop();
toast(tt('bought',{name:trName(item)}));
checkAchievements();
}else if(b.dataset.act==='upgrade'){
if(owned.indexOf(i)<0){ sfx('no'); return; } // M5: не куплено — апгрейд недоступен (паттерн защиты buy)
const lv=(lvMap[i]>=1)?lvMap[i]:1;
if(lv>=4) return;
const cost=upgCost(type,i,lv);
if(save.coins<cost){ sfx('no'); toast(t('not_enough')); return; }
save.coins-=cost; lvMap[i]=lv+1; // M5: апгрейд — уровень++
persist(); updateHUD(); sfx('coin'); renderShop();
toast(tt('upgraded',{name:trName(item),lv:lv+1}));
checkAchievements();
}else{
if(type==='rod') save.rod=i; else save.lure=i;
persist(); updateHUD(); sfx('click'); renderShop();
}
}
function showCard(sp,w,val,rec,variant,boss){
$('cardRarity').textContent=trRarity(sp.rarity);
$('cardRarity').style.color=RARITY_COLORS[sp.rarity];
$('cardEmoji').textContent=sp.emoji;
$('cardName').textContent=trName(sp)+(boss?t('card_boss_suffix'):''); // M4: имя босса; Y5: i18n
$('cardSub').textContent=tt('card_sub',{w:w.toFixed(1),price:sp.price});
$('cardVal').textContent='+'+val+' 🪙';
$('cardRecord').classList.toggle('hidden',!rec);
// M6: бейдж варианта + оформление карточки (silver/gold/rainbow; normal — без)
$('card').classList.toggle('silver-card',variant.css==='silver');
$('card').classList.toggle('gold-card',variant.css==='gold');
$('card').classList.toggle('rainbow-card',variant.css==='rainbow');
$('cardVariant').classList.toggle('hidden',variant.id==='normal');
$('cardVariant').textContent=trName(variant).toUpperCase();
// M4: босс: бейдж 🏆 + золотое оформление карточки
$('cardBoss').classList.toggle('hidden',!boss);
$('card').classList.toggle('boss-card',!!boss);
// Y2: rewarded «монеты ×2» — бонус = полная цена улова (rvVal), сброс флага
rvVal=val; rvDone=false;
$('btnRv').classList.remove('hidden');
$('btnRv').disabled=false;
$('btnRv').textContent=t('rv_btn');
$('card').classList.remove('hidden');
}
/* =========================================================
КНОПКИ
========================================================= */
$('btnPlay').addEventListener('click',()=>{
ac(); sfx('click');
$('menu').classList.add('hidden');
uiOpen=false; state='IDLE';
if(!YG.paused) YG.gameplayStart(); // Y1: геймплейная разметка (треб. 1.19.3; под паузой резюме поднимет сам)
});
$('btnShop').addEventListener('click',openShop);
$('btnCloseShop').addEventListener('click',closeShop);
$('tabTackle').addEventListener('click',()=>{ setTab('tackle'); sfx('click'); });
$('tabJournal').addEventListener('click',()=>{ setTab('journal'); sfx('click'); });
$('tabRewards').addEventListener('click',()=>{ setTab('rewards'); sfx('click'); });
$('tabAch').addEventListener('click',()=>{ setTab('ach'); sfx('click'); });
$('tabSkins').addEventListener('click',()=>{ setTab('skins'); sfx('click'); }); // Этап 4: вкладка скинов
$('tabLocations').addEventListener('click',()=>{ setTab('locations'); sfx('click'); }); // Этап 5: вкладка локаций
$('shopBody').addEventListener('click',shopClick);
$('btnMute').addEventListener('click',()=>{
save.muted=!save.muted; persist(); updateHUD(); sfx('click');
});
$('btnRecall').addEventListener('click',()=>{ recall(); });
// Y6: кнопка паузы (треб. Яндекс Игр 6.3) — оверлей «Продолжить/В меню».
// Общие гарды: паузу можно открыть только в игре (не MENU, без оверлеев и рекламы);
// снять её может только closePause()/«В меню» (YG.onResume под гардом pauseOpen).
function openPause(){
if(state==='MENU'||uiOpen||adShowing||pauseOpen) return;
sfx('click');
pauseOpen=true; uiOpen=true;
YG.onPause();
$('pause').classList.remove('hidden');
$('btnPause').classList.add('hidden'); // под паузой updateGame/syncDom не гонятся — прячем руками
}
function closePause(){
if(!pauseOpen) return;
sfx('click');
pauseOpen=false; uiOpen=(state==='MENU');
$('pause').classList.add('hidden');
YG.onResume();
}
$('btnPause').addEventListener('click',openPause);
$('btnPauseResume').addEventListener('click',closePause);
$('btnPauseMenu').addEventListener('click',()=>{
sfx('click');
pauseOpen=false; uiOpen=true;
state='MENU';
$('pause').classList.add('hidden');
$('menu').classList.remove('hidden');
YG.onResume(); // state==='MENU' — gameplayStart не вызовет
});
$('btnReset').addEventListener('click',()=>{
sfx('click');
uiOpen=true; // пауза, пока идёт подтверждение
$('resetDlg').classList.remove('hidden');
YG.gameplayStop(); // Y1: геймплейная разметка (треб. 1.19.3)
});
$('btnResetNo').addEventListener('click',()=>{
sfx('click');
$('resetDlg').classList.add('hidden');
uiOpen=(state==='MENU');
if(!uiOpen) YG.gameplayStart(); // Y1: геймплей возобновился (не в меню и без оверлея)
});
$('btnResetYes').addEventListener('click',()=>{
const muted=save.muted; // настройка звука — не игровые данные, оставляем
save=freshSave(muted);
persist();
refreshQuests(); // квесты дня; стрик начнётся с первой загрузки (чистый старт, coins=0)
reel=null; biteFish=null;
stateBoss=false; bossPhase=0; // M4: босс-бой сброшен
forceBite=false; forceBoss=false; forceVariant=null; forceWeather=null; // T2b: тест-форсы тоже сбрасываем (симметрия); M8: погода
weather=null; weatherT=0; weatherGap=weatherGapNext(); // M8: чистый старт — новый погодный таймер
$('resetDlg').classList.add('hidden');
$('shop').classList.add('hidden');
$('card').classList.add('hidden');
state='MENU'; uiOpen=true;
$('menu').classList.remove('hidden');
updateHUD(); renderShop();
sfx('no'); vib(50);
toast(t('progress_reset'));
});
// Y2: interstitial на закрытии карточки улова (треб. 4.4 — логическая пауза).
// Гейт: первый показ не раньше AD_FIRST_MS сессии, затем — через AD_COOLDOWN_MS.
// persist() — ПЕРЕД паузой (треб. 4.2: процесс сохранён до перехода на рекламу);
// YG.onPause() — звук и весь игровой процесс (треб. 4.7). В стабе showFullscreen
// вернёт false — endAd() сразу, игра не зависает в adShowing=true.
function tryInterstitial(){
if(adShowing) return;
const now=Date.now();
if(now-sessionStartTs < AD_FIRST_MS) return;
if(now-lastAdTs < AD_COOLDOWN_MS) return;
lastAdTs=now; // отмечаем ПОПЫТКУ, а не показ: при троттлинге платформы (wasShown=false) кулдаун сгорает — это осознанно, ограничивает частоту вызовов (retry-storm)
adShowing=true;
persist(); // 4.2: процесс сохранён до перехода на рекламу
YG.onPause(); // 4.7: звук + весь игровой процесс на паузе
const ok=YG.showFullscreen({
onOpen(){},
onClose(){ endAd(); }, // onClose(wasShown) приходит и при троттлинге
onError(){ endAd(); }
});
if(!ok) endAd(); // стаб: не показана — сразу резюм
}
function endAd(){ clearTimeout(YG.adWatchdog); YG.adWatchdog=null; adShowing=false; YG.onResume(); } // Y2: реклама закрыта/ошибка — снимаем паузу и останавливаем watchdog
$('btnCardOk').addEventListener('click',()=>{
sfx('click');
$('card').classList.add('hidden');
state='IDLE';
tryInterstitial(); // Y2: после возврата в IDLE; гейт может пропустить (внутри return)
});
// Y2: rewarded «монеты ×2» (треб. 4.5.1 — что показываем и что даём, написано на
// кнопке и в title; 4.5.2 — чистый бонус, игру не блокирует: карточка остаётся,
// закрыть можно в любой момент). В стабе onRewarded срабатывает синхронно — весь
// флоу в одном клике; в реальном SDK onRewarded придёт после просмотра, onClose —
// позже (endAd именно через onClose, не раньше).
$('btnRv').addEventListener('click',()=>{
if(rvDone||adShowing) return;
sfx('click');
adShowing=true;
YG.onPause(); // 4.7
const ok=YG.showRewarded({
onOpen(){},
onRewarded(){
rvDone=true;
save.coins+=rvVal; // бонус = полная цена улова ещё раз
persist(); updateHUD();
$('cardVal').textContent='+'+(rvVal*2)+' 🪙';
$('btnRv').disabled=true;
$('btnRv').textContent=t('rv_done');
sfx('coin'); vib(30);
},
onClose(){ endAd(); },
onError(){ endAd(); }
});
if(!ok) endAd();
});
/* =========================================================
СТАРТ
========================================================= */
loadSave();
resize();
initFish();
updateHUD();
renderMenu(); // Y5: i18n — меню из T (device-aware; стаб-ветка уже вызывала через resolveLang, это страховка)
renderStaticUI(); // Y5: i18n — статичные подписи (лавка/вкладки/сброс/карточка)
// Э28: встроенный emoji-шрифт — дождаться @font-face перед первым кадром (канвас-emoji 💥🌀⚡💪🐟💤
// рисуются им); data: URI грузится быстро, timeout-фолбэк 1.5 с — игра не «висит» даже на file://
const fontsGate=(document.fonts&&document.fonts.load)
?Promise.race([document.fonts.load('16px "EmojiEmbedded"').catch(()=>{}),new Promise(r=>setTimeout(r,1500))])
:Promise.resolve();
fontsGate.then(()=>requestAnimationFrame(frame));
</script>
</body>
</html>