[html]<div class="fp-wrap garden-wrap" id="garden8march"
data-cols="5" data-rows="4"
style="--field:url('https://upforme.ru/uploads/001c/ae/e6/3/718743.png');">
<div class="fp-bg"></div>
<div class="fp-header">
<div class="fp-tag">Артефакторика · Урок</div>
<div class="fp-title">Artificer's Workshop</div>
<div class="fp-subtitle">собираем артефакт по частям</div>
</div>
<div class="fp-body gd-intro">
<div class="gd-intro__grid">
<div class="gd-intro__text">
<p class="gd-lead">Добро пожаловать на <b>урок артефакторики</b> ✨</p>
<p>На рабочем столе мастерской вы можете собрать артефакт собственными руками — из заготовленных частей. После начала работы предмет появляется на столе, а по клику на ячейку открывается окно с описанием стадии. Параллельно можно работать только над одним артефактом. Сначала выберите предмет, который хотите создать, займите свободную ячейку по порядку (от 1 до 20, нумерация слева направо), затем приносите выполненные задания с подтверждением — амс учтут их в продвижение крафта.</p>
<div class="gd-steps-label">Как собрать артефакт</div>
<div class="gd-steps">
<div class="gd-step">
<div class="gd-step__num">1</div>
<div class="gd-step__text">Купить основу за <b>30 галлеонов</b> или пост</div>
</div>
<div class="gd-step">
<div class="gd-step__num">2</div>
<div class="gd-step__text">Выполнить <b>2 общих</b> + <b>4 специальных</b> задания</div>
</div>
<div class="gd-step">
<div class="gd-step__num">3</div>
<div class="gd-step__text">Получить готовый <b>артефакт</b> в инвентарь</div>
</div>
</div>
<div class="gd-stages-label">Стадии крафта</div>
<div class="gd-stages">
<div class="gd-stage">
<div class="gd-stage__icon seed-icon s-0"></div>
<div class="gd-stage__count">0</div>
<div class="gd-stage__name">пусто</div>
</div>
<div class="gd-stage__arrow">→</div>
<div class="gd-stage">
<div class="gd-stage__icon seed-icon s-1"></div>
<div class="gd-stage__count">1–2</div>
<div class="gd-stage__name">основа</div>
</div>
<div class="gd-stage__arrow">→</div>
<div class="gd-stage">
<div class="gd-stage__icon gd-stage__icon--bud"></div>
<div class="gd-stage__count">3–4</div>
<div class="gd-stage__name">камень</div>
</div>
<div class="gd-stage__arrow">→</div>
<div class="gd-stage">
<div class="gd-stage__icon gd-stage__icon--bloom"></div>
<div class="gd-stage__count">5–6</div>
<div class="gd-stage__name">артефакт</div>
</div>
</div>
</div>
<div class="gd-intro__img">
<img src="https://upforme.ru/uploads/001c/95/36/6/589634.jpg" alt="">
</div>
</div>
</div>
<div class="fp-body gd-seeds">
<div class="fp-section-dark">Артефакты и задания</div>
<div class="gd-general">
<div class="gd-general__label">Общие задания</div>
<div class="gd-tasks">
— общее задание про мастерскую и инструменты<br>
— общее задание на участие во флудовой игре<br>
— общее задание про артефакторику в посте<br>
— общее задание про эстетику персонажа<br>
— общее задание про 10 фактов из мира артефактов<br>
— общее задание про подборку ассоциаций<br>
— общее задание про "хочу видеть"<br>
— общее задание про голосование за пост недели
</div>
</div>
<div class="gd-seeds-grid gd-seeds-grid--5">
<div class="gd-seed">
<div class="gd-seed__icon seed-icon s-0"></div>
<div class="gd-seed__num">Палатка-шатёр</div>
<div class="gd-tasks">
— специальное задание про палатку №1<br>
— специальное задание про походы и уют<br>
— специальное задание про чары расширения пространства<br>
— специальное задание про мемы<br>
— специальное задание на смену аватарки<br>
— специальное задание в пост<br>
— специальное задание про 10 фактов
</div>
</div>
<div class="gd-seed">
<div class="gd-seed__icon seed-icon s-0"></div>
<div class="gd-seed__num">Магиометр</div>
<div class="gd-tasks">
— специальное задание про термометр №1<br>
— специальное задание про скрытые чары<br>
— специальное задание про детективные истории<br>
— специальное задание про подборку книг<br>
— специальное задание про загадку во флуде<br>
— специальное задание в пост<br>
— специальное задание про 10 фактов
</div>
</div>
<div class="gd-seed">
<div class="gd-seed__icon seed-icon s-0"></div>
<div class="gd-seed__num">Автометла</div>
<div class="gd-tasks">
— специальное задание про метлу №1<br>
— специальное задание про путешествия<br>
— специальное задание про квиддич<br>
— специальное задание про подборку маршрутов<br>
— специальное задание про мемы с метлами<br>
— специальное задание в пост<br>
— специальное задание про 10 фактов
</div>
</div>
<div class="gd-seed">
<div class="gd-seed__icon seed-icon s-0"></div>
<div class="gd-seed__num">Чародневник</div>
<div class="gd-tasks">
— специальное задание про книгу №1<br>
— специальное задание про шпионские истории<br>
— специальное задание про подборку 5 цитат<br>
— специальное задание во флуде<br>
— специальное задание про секреты<br>
— специальное задание в пост<br>
— специальное задание про 10 фактов
</div>
</div>
<div class="gd-seed">
<div class="gd-seed__icon seed-icon s-0"></div>
<div class="gd-seed__num">Волшебночки</div>
<div class="gd-tasks">
— специальное задание про очки №1<br>
— специальное задание про старые языки<br>
— специальное задание про подборку манускриптов<br>
— специальное задание про слово на другом языке<br>
— специальное задание про эстетику учёного<br>
— специальное задание в пост<br>
— специальное задание про 10 фактов
</div>
</div>
</div>
</div>
<div class="gd-field-wrap">
<div class="garden-field" aria-label="Рабочий стол">
<div class="garden-hotgrid"></div>
</div>
</div>
<div class="garden-modal" aria-hidden="true">
<div class="garden-modal__backdrop" data-close="1"></div>
<div class="garden-modal__card" role="dialog" aria-modal="true">
<button class="garden-modal__close" type="button" data-close="1" aria-label="Закрыть">×</button>
<div class="gm-top">
<div class="gm-icon"></div>
<div class="gm-toptext">
<div class="gm-title"></div>
<div class="gm-chips">
<span class="gm-chip gm-owner"></span>
<span class="gm-chip gm-stage"></span>
<span class="gm-chip gm-prog"></span>
<span class="gm-chip gm-type"></span>
</div>
</div>
</div>
<div class="gm-sep"></div>
<div class="gm-block">
<div class="gm-h">Описание</div>
<div class="gm-desc"></div>
</div>
<div class="gm-block">
<div class="gm-h">Магический эффект</div>
<div class="gm-effect"></div>
</div>
<div class="gm-foot">Нажми × или кликни по фону, чтобы закрыть.</div>
</div>
</div>
</div>
<style>
.garden-wrap{display:flex;flex-direction:column}
.gd-intro__grid{display:grid;grid-template-columns:1.6fr 1fr;gap:14px;align-items:stretch}
.gd-intro__text p{font-size:12px;line-height:1.7;color:var(--fp-muted);margin:0 0 10px;text-align:justify}
.gd-intro__text p:last-child{margin-bottom:0}
.gd-intro__text b{color:var(--fp-ink);font-weight:600}
.gd-intro__img{border-radius:calc(var(--fp-r) - 4px);overflow:hidden;border:1px solid var(--fp-stroke);background:rgba(220,223,217,.4);min-height:220px}
.gd-intro__img img{width:100%;height:100%;object-fit:cover;display:block;filter:grayscale(50%) sepia(20%) hue-rotate(40deg) saturate(80%)}
.gd-lead{font-family:"Playfair Display",serif!important;font-style:italic;font-size:14px!important;color:var(--fp-green)!important;text-align:center!important;margin-bottom:14px!important;padding-bottom:10px;border-bottom:1px solid var(--fp-stroke)}
.gd-steps-label,.gd-stages-label{font-family:"Manrope",sans-serif;font-size:9px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--fp-lt);text-align:center;margin:16px 0 10px}
.gd-steps{display:flex;flex-direction:column;gap:6px;margin-bottom:6px}
.gd-step{display:flex;align-items:center;gap:10px;background:rgba(233,233,233,.7);border:1px solid var(--fp-stroke);border-radius:999px;padding:6px 14px 6px 6px;transition:border-color .25s ease}
.gd-step:hover{border-color:var(--fp-lt)}
.gd-step__num{width:24px;height:24px;border-radius:50%;background:linear-gradient(135deg,#7f8c73,#606C57);color:#f4f4f1;font-family:"Playfair Display",serif;font-style:italic;font-weight:600;font-size:12px;display:flex;align-items:center;justify-content:center;flex-shrink:0;padding-bottom:2px}
.gd-step__text{font-size:11.5px;line-height:1.4;color:var(--fp-muted)}
.gd-step__text b{color:var(--fp-ink);font-weight:600}
.gd-stages{display:flex;align-items:center;justify-content:center;gap:4px;padding:12px 8px;background:rgba(220,223,217,.45);border:1px solid var(--fp-stroke);border-radius:var(--fp-r)}
.gd-stage{display:flex;flex-direction:column;align-items:center;gap:4px;flex:1;min-width:0}
.gd-stage__icon{width:38px;height:38px;border-radius:8px;background-color:rgba(244,244,244,.7);border:1px solid var(--fp-stroke);background-size:contain;background-repeat:no-repeat;background-position:center;filter:drop-shadow(0 4px 6px rgba(0,0,0,.06))}
.gd-stage__icon--bud{background-image:url("https://upforme.ru/uploads/001c/95/36/6/762326.png")}
.gd-stage__icon--bloom{background-image:url("https://upforme.ru/uploads/001c/95/36/6/146866.png")}
.gd-stage__count{font-family:"Playfair Display",serif;font-style:italic;font-weight:600;font-size:13px;color:var(--fp-green);line-height:1}
.gd-stage__name{font-family:"Manrope",sans-serif;font-size:9px;font-weight:500;letter-spacing:.1em;text-transform:uppercase;color:var(--fp-lt)}
.gd-stage__arrow{font-family:"Manrope",sans-serif;font-size:14px;color:var(--fp-lt);opacity:.6;align-self:flex-start;margin-top:14px;flex-shrink:0}
.gd-seeds .fp-section-dark{margin-top:0;margin-bottom:14px}
.gd-general{position:relative;background:rgba(220,223,217,.55);border:1px solid var(--fp-stroke);border-radius:var(--fp-r);padding:14px 16px 12px;margin:0 0 12px}
.gd-general__label{position:absolute;top:-8px;left:16px;padding:1px 12px;border-radius:999px;background:rgba(233,233,233,.96);border:1px solid var(--fp-stroke);font-family:"Manrope",sans-serif;font-size:9px;text-transform:uppercase;letter-spacing:.14em;color:var(--fp-lt)}
.gd-seeds-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.gd-seeds-grid--5{grid-template-columns:repeat(5,1fr)}
.gd-seed{background:rgba(233,233,233,.92);border:1px solid var(--fp-stroke);border-radius:calc(var(--fp-r) - 4px);padding:12px 12px 10px;display:flex;flex-direction:column;gap:8px;transition:border-color .25s ease,transform .2s ease,box-shadow .25s ease}
.gd-seed:hover{border-color:var(--fp-lt);transform:translateY(-2px);box-shadow:0 6px 16px rgba(0,0,0,.06)}
.gd-seed__icon{width:54px;height:54px;margin:4px auto 2px;border-radius:12px;border:1px solid var(--fp-stroke);background-color:rgba(220,223,217,.5);background-size:contain;background-repeat:no-repeat;background-position:center;filter:drop-shadow(0 6px 8px rgba(0,0,0,.08))}
.gd-seed__num{font-family:"Playfair Display",serif;font-style:italic;font-size:13px;color:var(--fp-green);text-align:center;letter-spacing:.04em}
.gd-seed__desc{font-family:"Manrope",sans-serif;font-size:10px;line-height:1.5;color:var(--fp-muted);text-align:center;padding:0 2px 6px;border-bottom:1px solid var(--fp-stroke);font-style:italic}
.gd-tasks{font-family:"Manrope",sans-serif;font-size:10.5px;line-height:1.6;color:var(--fp-muted)}
.gd-general .gd-tasks{font-size:11.5px;line-height:1.7}
.gd-field-wrap{position:relative;z-index:1;margin:0 20px 20px}
.garden-field{--cols:5;--rows:4; --pad-x: 19%;--pad-top: 16%;--pad-bot: 15%;--gap: 3%;;width:100%;aspect-ratio:3/2;border-radius:calc(var(--fp-r) - 4px);overflow:hidden;border:1px solid var(--fp-stroke);position:relative;background:var(--field) center / cover no-repeat;box-shadow:0 4px 12px rgba(0,0,0,.08)}
.garden-hotgrid{position:absolute;left:var(--pad-x);right:var(--pad-x);top:var(--pad-top);bottom:var(--pad-bot);display:grid;grid-template-columns:repeat(var(--cols),1fr);grid-template-rows:repeat(var(--rows),1fr);gap:var(--gap)}
.gspot{position:relative;border-radius:14px;border:1px solid transparent;background:transparent;cursor:pointer;padding:0;transition:transform .14s ease,background .14s ease,border-color .14s ease}
.gspot:hover{transform:translateY(-1px);border-color:rgba(255,255,255,.18);background:rgba(255,255,255,.05)}
.gspot:focus-visible{outline:none}
.gspot.is-empty{cursor:default}
.gspot.is-empty:hover{transform:none;background:transparent;border-color:transparent}
.gplant{--psize:62%;position:absolute;left:50%;top:50%;transform:translate(-50%,-58%);width:var(--psize);height:var(--psize);background-size:contain;background-repeat:no-repeat;background-position:center;filter:drop-shadow(0 10px 10px rgba(0,0,0,.22));pointer-events:none}
.gplant.s-2,.gplant.s-3{--psize:100%}
.garden-modal{position:fixed;inset:0;display:none;z-index:9999}
.garden-modal.is-open{display:block}
.garden-modal__backdrop{position:absolute;inset:0;background:rgba(11,13,10,.55);backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px)}
.garden-modal__card{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:min(620px,calc(100vw - 24px));max-height:90vh;overflow-y:auto;background:rgba(233,233,233,.98);border:1px solid var(--fp-stroke);border-radius:var(--fp-r);box-shadow:0 30px 80px rgba(0,0,0,.35);padding:20px}
.garden-modal__close{position:absolute;right:14px;top:14px;width:30px;height:30px;border-radius:50%;border:1px solid var(--fp-stroke);background:rgba(244,244,244,.9);cursor:pointer;font-size:18px;line-height:1;color:var(--fp-muted);padding:0;display:flex;align-items:center;justify-content:center;transition:all .2s ease}
.garden-modal__close:hover{background:linear-gradient(135deg,#7f8c73,#606C57);color:#f4f4f1;border-color:transparent}
.gm-top{display:flex;gap:14px;align-items:center;padding:0 0 4px}
.gm-icon{width:64px;height:64px;border-radius:12px;border:1px solid var(--fp-stroke);background-color:rgba(220,223,217,.5);background-size:contain;background-repeat:no-repeat;background-position:center;flex-shrink:0;filter:drop-shadow(0 8px 10px rgba(0,0,0,.1))}
.gm-toptext{flex:1;min-width:0}
.gm-title{font-family:"Playfair Display",serif;font-style:italic;font-size:18px;color:var(--fp-green);letter-spacing:.04em;margin-bottom:8px}
.gm-chips{display:flex;flex-wrap:wrap;gap:5px}
.gm-chip{display:inline-flex;align-items:center;padding:3px 10px;border-radius:999px;border:1px solid var(--fp-stroke);background:rgba(244,244,244,.7);font-family:"Manrope",sans-serif;font-size:10px;font-weight:500;color:var(--fp-muted);letter-spacing:.03em}
.gm-sep{height:1px;background:linear-gradient(90deg,transparent,var(--fp-stroke),transparent);margin:14px 0 4px}
.gm-block{background:rgba(220,223,217,.35);border:1px solid var(--fp-stroke);border-radius:calc(var(--fp-r) - 6px);padding:12px 14px;margin:10px 0 0}
.gm-h{font-family:"Manrope",sans-serif;font-size:9px;letter-spacing:.14em;text-transform:uppercase;color:var(--fp-lt);font-weight:600;margin-bottom:6px}
.gm-desc,.gm-effect{font-family:"Manrope",sans-serif;font-size:12px;line-height:1.65;color:var(--fp-muted);text-align:justify}
.gm-effect.is-locked{color:var(--fp-lt);font-style:italic;position:relative;padding-left:20px}
.gm-effect.is-locked::before{content:"🔒";position:absolute;left:0;top:0;font-style:normal}
.gm-foot{margin-top:12px;font-size:10px;letter-spacing:.08em;color:var(--fp-lt);text-align:center;text-transform:uppercase}
.gplant.s-0{background-image:url("https://upforme.ru/uploads/001c/95/36/6/817510.png")}
.gplant.s-1{background-image:url("https://upforme.ru/uploads/001c/95/36/6/951199.png")}
.gplant.p-tent.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/224645.png")}
.gplant.p-tent.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/925262.png")}
.gplant.p-thermometer.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/54240.png")}
.gplant.p-thermometer.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/809412.png")}
.gplant.p-broom.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/209550.png")}
.gplant.p-broom.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/125120.png")}
.gplant.p-book.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/258348.png")}
.gplant.p-book.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/696863.png")}
.gplant.p-glasses.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/224645.png")}
.gplant.p-glasses.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/84110.png")}
.gm-icon.s-0{background-image:url("https://upforme.ru/uploads/001c/95/36/6/817510.png")}
.gm-icon.s-1{background-image:url("https://upforme.ru/uploads/001c/95/36/6/951199.png")}
.gm-icon.p-tent.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/762326.png")}
.gm-icon.p-tent.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/925262.png")}
.gm-icon.p-thermometer.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/469846.png")}
.gm-icon.p-thermometer.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/809412.png")}
.gm-icon.p-broom.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/809182.png")}
.gm-icon.p-broom.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/125120.png")}
.gm-icon.p-book.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/343449.png")}
.gm-icon.p-book.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/696863.png")}
.gm-icon.p-glasses.s-2{background-image:url("https://upforme.ru/uploads/001c/95/36/6/762326.png")}
.gm-icon.p-glasses.s-3{background-image:url("https://upforme.ru/uploads/001c/95/36/4/84110.png")}
.seed-icon.s-0{background-image:url("https://upforme.ru/uploads/001c/95/36/6/817510.png")}
.seed-icon.s-1{background-image:url("https://upforme.ru/uploads/001c/95/36/6/951199.png")}
@media (max-width:700px){.gd-intro__grid{grid-template-columns:1fr}.gd-intro__img{min-height:180px}.gd-seeds-grid,.gd-seeds-grid--5{grid-template-columns:repeat(2,1fr)}}
@media (max-width:480px){.gd-seeds-grid,.gd-seeds-grid--5{grid-template-columns:1fr}.gd-stages{flex-wrap:wrap;gap:8px}.gd-stage__arrow{display:none}.gd-stage{flex:0 0 calc(50% - 4px)}}
</style>
<script>
(function(){
var root = document.querySelector('#garden8march');
if(!root) return;
var hotgrid = root.querySelector('.garden-hotgrid');
var modal = root.querySelector('.garden-modal');
var mTitle = root.querySelector('.gm-title');
var mOwner = root.querySelector('.gm-owner');
var mStage = root.querySelector('.gm-stage');
var mProg = root.querySelector('.gm-prog');
var mType = root.querySelector('.gm-type');
var mDesc = root.querySelector('.gm-desc');
var mEffect= root.querySelector('.gm-effect');
var mIcon = root.querySelector('.gm-icon');
var COLS = parseInt(root.getAttribute('data-cols') || '5', 10);
var ROWS = parseInt(root.getAttribute('data-rows') || '4', 10);
var field = root.querySelector('.garden-field');
if(field){
field.style.setProperty('--cols', COLS);
field.style.setProperty('--rows', ROWS);
}
var EFFECT_LOCKED_TEXT = "Эффект откроется после полной сборки артефакта (6 из 6 заданий).";
function stageFromTasks(done, total){
var t = Math.max(1, Number(total || 1));
var d = Math.max(0, Math.min(Number(done || 0), t));
var ratio = d / t;
if(ratio <= 0) return 0;
if(ratio < 0.34) return 1;
if(ratio < 0.67) return 2;
return 3;
}
function stageName(n){
return ["пусто","основа","камень","артефакт"][n] || ("стадия " + n);
}
var typeLabel = {
tent: "⛺ палатка-шатёр",
thermometer: "🌡️ магический термометр",
broom: "🧹 метла автопилота",
book: "📖 книга записей",
glasses: "👓 очки чтения"
};
var PLOTS = [
{ pos: 1, owner:"Имя игрока", plant:"Палатка-шатёр", type:"tent", tasksDone:6, tasksTotal:6,
note:"Описание процесса крафта палатки-шатра. Здесь будет рассказ о том, как мастер выбирает ткань, накладывает чары расширения пространства, какие чары особенно сложно сочетать и почему конкретно эта работа требует терпения.",
effect:"Магический эффект готовой палатки. Складывается до спичечного коробка, разворачивается в шикарную палатку с базовыми удобствами." },
{ pos: 2, owner:"Имя игрока", plant:"Магический Термометр", type:"thermometer", tasksDone:6, tasksTotal:6,
note:"Описание процесса крафта магического термометра. Текст про настройку шкалы, выбор камня-индикатора и тонкость работы с чарами обнаружения.",
effect:"Магический эффект готового термометра. Показывает температуру и уровень магической активности в помещении." },
{ pos: 3, owner:"Имя игрока", plant:"Метла Автопилота", type:"broom", tasksDone:6, tasksTotal:6,
note:"Описание процесса крафта метлы-автопилота. Здесь будет про работу с древком, чары навигации, особенности привязки к маршрутам.",
effect:"Магический эффект готовой метлы. Задаёшь пункт назначения — доставляет без управления." },
{ pos: 4, owner:"Имя игрока", plant:"Книга Записей", type:"book", tasksDone:0, tasksTotal:6,
note:"Описание процесса крафта книги записей. Работа с бумагой, чары звукозаписи, наложение защитных рун от подделки страниц.",
effect:"Магический эффект готовой книги. Всё сказанное в радиусе 5 метров записывает на страницы." },
{ pos: 5, owner:"Имя игрока", plant:"Очки Чтения", type:"glasses", tasksDone:6, tasksTotal:6,
note:"Описание процесса крафта очков чтения. Подбор линз, чары перевода и увеличения, тонкая огранка камня-фокусатора.",
effect:"Магический эффект готовых очков. Увеличивают мелкий текст и переводят иностранный язык в современный." },
{ pos: 6, owner:"Имя игрока", plant:"Палатка-шатёр", type:"tent", tasksDone:4, tasksTotal:6,
note:"Описание процесса крафта палатки-шатра. Текст-заглушка для второго экземпляра.",
effect:"Магический эффект готовой палатки." },
{ pos: 7, owner:"Имя игрока", plant:"Магический Термометр", type:"thermometer", tasksDone:6, tasksTotal:6,
note:"Описание процесса крафта магического термометра.",
effect:"Магический эффект готового термометра." },
{ pos: 8, owner:"Имя игрока", plant:"Метла Автопилота", type:"broom", tasksDone:2, tasksTotal:6,
note:"Описание процесса крафта метлы-автопилота.",
effect:"Магический эффект готовой метлы." }
];
var byPos = {};
for(var i=0;i<PLOTS.length;i++){ byPos[PLOTS[i].pos] = PLOTS[i]; }
function setIcon(el, type, stage){
var base = (el.classList.contains('gm-icon') ? 'gm-icon' : 'gplant');
if(stage <= 1){
el.className = base + ' s-' + stage;
}else{
el.className = base + ' p-' + (type || 'tent') + ' s-' + stage;
}
}
function openModal(plot, stage){
mTitle.textContent = plot.plant || '—';
mOwner.textContent = '👤 ' + (plot.owner || '—');
mStage.textContent = '🛠 ' + stageName(stage);
var done = Number(plot.tasksDone || 0);
var total = Math.max(1, Number(plot.tasksTotal || 1));
mProg.textContent = '✅ ' + done + '/' + total;
var t = (plot.type || 'tent');
mType.textContent = typeLabel[t] || ('✨ ' + t);
mDesc.textContent = plot.note || '—';
if(done >= total){
mEffect.textContent = plot.effect || '—';
mEffect.classList.remove('is-locked');
}else{
mEffect.textContent = EFFECT_LOCKED_TEXT;
mEffect.classList.add('is-locked');
}
setIcon(mIcon, t, stage);
modal.classList.add('is-open');
modal.setAttribute('aria-hidden','false');
document.addEventListener('keydown', onEsc);
}
function closeModal(){
modal.classList.remove('is-open');
modal.setAttribute('aria-hidden','true');
document.removeEventListener('keydown', onEsc);
}
function onEsc(e){ if(e.key === 'Escape') closeModal(); }
modal.addEventListener('click', function(e){
var t = e.target;
if(t && t.getAttribute && t.getAttribute('data-close') === '1') closeModal();
});
var frag = document.createDocumentFragment();
var cellCount = COLS * ROWS;
for(var k=1;k<=cellCount;k++){
var plot = byPos[k];
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'gspot';
if(!plot){
btn.classList.add('is-empty');
btn.setAttribute('aria-label', 'Пустая ячейка ' + k);
frag.appendChild(btn);
continue;
}
var st = stageFromTasks(plot.tasksDone, plot.tasksTotal);
btn.setAttribute('aria-label', plot.plant + ' — ' + plot.owner);
var icon = document.createElement('div');
icon.className = 'gplant';
setIcon(icon, plot.type, st);
btn.appendChild(icon);
(function(p, s){
btn.addEventListener('click', function(){ openModal(p, s); });
})(plot, st);
frag.appendChild(btn);
}
hotgrid.innerHTML = '';
hotgrid.appendChild(frag);
})();
</script>[/html][hideprofile]



























