У Вас отключён javascript.
В данном режиме, отображение ресурса
браузером не поддерживается

Хранилище

Объявление

АМС
Лучший пост [Имя автора лучшего поста]
Вселенная будто насмехалась над ним, потому что как только они оказались в спальне и желанная женщина почти была у него в руках... Ей позвонила мама. Ригель только закатил глаза, покорно садясь в кресло и прикрывая глаза, ожидая когда этот разговор закончится. Ну не может же он в самом деле длиться дольше пары минут. Всего пара фраз. Да, все хорошо. Да, спальни разные. Да, я очень много времени провожу с миссис Блэкторн, а Ригеля почти не вижу. Не пара фраз и не пара минут. Кассия мерила шагами комнату и оправдывалась словно школьница, которая нарушила комендантский час и опаздывала домой на добрую четверть часа.
Коты-воители
Отголоски прошлого

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Хранилище » Анкеты » Оформление локаций


Оформление локаций

Сообщений 1 страница 10 из 28

1

[hideprofile]

[sign][/sign]

https://upforme.ru/uploads/001c/34/47/3/179723.jpg

Нагретые камни

- Куда мы идём? - спросила Галечка.
- К нагретым камням. - наконец ответил отец. - Мы будем знакомить тебя с водой, Галечка,
- Мы с ней знакомы... - едва слышно пискнула кошечка.

Описание

Травы

Добыча

Особенности места

У более теплого течения размещаются нагретые камни, которые так любят старики. Здесь создана небольшая плотина для задержания течения реки с помощью камней разной величины и веток, чтобы можно было учить котят плавать в любое, даже самое холодное время года. Это небольшой закуток водоема, который является частью локации - Река и тесно связан с ним.

ЛЕКАРСТВЕННЫЕ РАСТЕНИЯ

• Алтей, листья и корни [юные листья - листопад]

• Крестовник, листья и стебли [юные листья - листопад]

• Кровохлебка, листья [зеленые листья - листопад]

• Ноготки, цветки [зеленые листья]

• Окопник, листья [зеленые листья - листопад]

• Осока, листья и корневища [юные листья - листопад]

• Чистец, листья [зеленые листья]


ЯДОВИТЫЕ РАСТЕНИЯ/ГРИБЫ
• Отсутствуют


ПРОЧЕЕ
• Отсутствуют

УСЛОВИЯ МЕСТА
• Дичь знает, что место обживаемое котами, но подходит для тренировок на легкую добычу.


ОПАСНЫЕ/ХИЩНИКИ
• Отсутствуют


ДОБЫЧА
• Отсутствует


ПРОСТЕЙШАЯ ДОБЫЧА
• Стрекозы
• Улитки
• Мотыльки
• Мальки

• Заводь для плесканий в Реке когда-то собрал бывший глашатай Речного племени, благодаря теплым водам это место приняло много лекарственных свойств, стоит только взглянуть какой мягкий пар собирается в заливе в суровый сезон Голых деревьев.

Проверить под камнями

Пусто

0

2

[html]
<div class="forest-adaptive-wrapper">
<style>
/* 1. КОНТЕЙНЕР И ТЕМЫ */
.forest-adaptive-wrapper { background: transparent !important; padding: 0; margin: 10px auto; max-width: 750px; }

.forest-card {
  --f-bg: #ffffff; --f-txt: #333; --f-acc: #556b2f; --f-brd: #eeeeee;
  border-radius: 15px; background: var(--f-bg); color: var(--f-txt);
  font-family: 'Georgia', serif; border: 1px solid var(--f-brd);
  overflow: hidden; box-shadow: 0 8px 25px rgba(0,0,0,0.1); position: relative;
}

/* Переключатели тем */
#theme-dark:checked ~ .forest-card { --f-bg: #1a241a; --f-txt: #d1d8d1; --f-acc: #3d5e3d; --f-brd: #2d3a2d; }
#theme-winter:checked ~ .forest-card { --f-bg: #f4f7f9; --f-txt: #2c3e50; --f-acc: #5dade2; --f-brd: #d6eaf8; }

.color-switches {
  position: absolute; top: 15px; right: 15px; z-index: 20;
  display: flex; gap: 8px; background: rgba(0,0,0,0.3); padding: 5px; border-radius: 20px;
}
.color-switches label { width: 15px; height: 15px; border-radius: 50%; cursor: pointer; border: 2px solid #fff; transition: 0.3s; }
.btn-std { background: #556b2f; }
.btn-dark { background: #1a3c1a; }
.btn-winter { background: #5dade2; }

/* 2. ШАПКА И ЭФФЕКТ ЦИТАТЫ */
.f-header { position: relative; height: 280px; overflow: hidden; background: #000; }
.f-header img { width: 100%; height: 100%; object-fit: cover; transition: 0.6s ease-in-out; }

.f-title-box {
  position: absolute; bottom: 0; width: 100%; padding: 30px 20px;
  background: linear-gradient(transparent, rgba(0,0,0,0.85));
  color: #fff !important; text-align: center; z-index: 5; transition: 0.4s;
}
.f-title-box h1 { margin: 0; font-size: 32px; text-transform: uppercase; letter-spacing: 2px; text-shadow: 2px 2px 5px #000; }

.f-hover-quote {
  position: absolute; top: 0; left: 0; width: 100%; height: 100%;
  background: rgba(0,0,0,0.6); color: #fff; display: flex; align-items: center;
  justify-content: center; padding: 40px; text-align: center; font-style: italic;
  opacity: 0; transition: 0.5s; z-index: 10; pointer-events: none; line-height: 1.6;
font-size: 19px; font-family: Mak Light;
}

.f-header:hover img { transform: scale(1.1); filter: blur(2px); }
.f-header:hover .f-hover-quote { opacity: 1; }
.f-header:hover .f-title-box { opacity: 0; }

/* 3. НАВИГАЦИЯ И КОНТЕНТ */
.forest-adaptive-wrapper input[type="radio"] { display: none !important; }
.f-nav { display: flex; background: rgba(0,0,0,0.03); border-bottom: 1px solid var(--f-brd); }
.f-nav label {
  flex: 1; padding: 15px 5px; text-align: center; cursor: pointer;
  font-size: 11px; text-transform: uppercase; font-weight: bold;
  color: var(--f-txt); opacity: 0.5; transition: 0.3s; border-bottom: 2px solid transparent;
}
.f-content { display: none; padding: 25px; line-height: 1.7; font-size: 15px; min-height: 250px; animation: fadeIn 0.4s; }
@keyframes fadeIn { from { opacity: 0; transform: translateY(5px); } to { opacity: 1; transform: translateY(0); } }

#t-1:checked ~ .forest-card .f-nav label[for="t-1"], #t-2:checked ~ .forest-card .f-nav label[for="t-2"],
#t-3:checked ~ .forest-card .f-nav label[for="t-3"], #t-4:checked ~ .forest-card .f-nav label[for="t-4"] {
  opacity: 1; color: var(--f-acc); border-bottom: 2px solid var(--f-acc);
}
#t-1:checked ~ .forest-card #c-1, #t-2:checked ~ .forest-card #c-2,
#t-3:checked ~ .forest-card #c-3, #t-4:checked ~ .forest-card #c-4 { display: block; }

/* Блоки цитат */
.f-block { margin-bottom: 15px; padding: 15px; border-left: 3px solid var(--f-acc); background: rgba(128,128,128,0.05); border-radius: 0 8px 8px 0; }
.f-block b { display: block; text-transform: uppercase; font-size: 12px; color: var(--f-acc); margin-bottom: 5px; }
.f-link { color: var(--f-acc); font-weight: bold; text-decoration: none; border-bottom: 1px dashed var(--f-acc); }
</style>

  <input type="radio" name="theme" id="theme-std" checked>
  <input type="radio" name="theme" id="theme-dark">
  <input type="radio" name="theme" id="theme-winter">
 
  <input type="radio" name="tabs" id="t-1" checked>
  <input type="radio" name="tabs" id="t-2">
  <input type="radio" name="tabs" id="t-3">
  <input type="radio" name="tabs" id="t-4">

  <div class="forest-card">
    <div class="color-switches">
      <label for="theme-std" class="btn-std" title="Стандарт"></label>
      <label for="theme-dark" class="btn-dark" title="Темный лес"></label>
      <label for="theme-winter" class="btn-winter" title="Зима"></label>
    </div>

    <div class="f-header">
      <img src="https://upforme.ru/uploads/0004/e7/0d/3979/641006.jpg">
      <div class="f-hover-quote">
        «— Ну, по крайней мере, тут чуток попросторнее, — нехотя признал белый воин. — И вода не так близко».
      </div>
      <div class="f-title-box"><h1>Главная поляна</h1></div>
    </div>

    <div class="f-nav">
      <label for="t-1">Описание</label>
      <label for="t-2">Травы</label>
      <label for="t-3">Добыча</label>
      <label for="t-4">Особенности</label>
    </div>

    <!-- ВКЛАДКА 1: ОПИСАНИЕ -->
    <div class="f-content" id="c-1">
      Продолжение темы — <a href="https://cwotgoloski.ru/viewtopic.php?id=8054&p=51" class="f-link">Главная поляна #6</a><br><br>
      Лагерь Тигриного племени окружён с одной стороны берёзовой рощей и высоким холмом, где проводят ночное бдение воители, с другой.<br><br>
      Вместо величавой скалы собраний, на главную поляну отбрасывает тень согнутая берёза. В корнях дерева расположена пещера предводителя, раскидистые ветви выступают дополнительным прикрытием для сердца Тигриного племени. Палатками служат кусты лапчатки и шиповника, но территория лагеря достаточно просторна, чтобы спать под открытым небом.<br><br>
      Если напрячь слух, можно услышать плеск реки вдалеке со стороны холма — там матери-королевы учат плавать котят, когда их лапы достаточно окрепнут.
    </div>

    <!-- ВКЛАДКА 2: ТРАВЫ -->
    <div class="f-content" id="c-2">
      <div class="f-block"><b>Лекарственные растения</b> Отсутствуют</div>
      <div class="f-block"><b>Ядовитые растения/грибы</b> Отсутствуют</div>
      <div class="f-block"><b>Прочее</b> Отсутствуют</div>
    </div>

    <!-- ВКЛАДКА 3: ДОБЫЧА -->
    <div class="f-content" id="c-3">
      <div class="f-block"><b>Условия места</b> Территории лагеря не являются пригодными для охоты.</div>
      <div class="f-block"><b>Опасные/Хищники</b> Отсутствуют</div>
      <div class="f-block"><b>Добыча</b> Отсутствует</div>
      <div class="f-block"><b>Простейшая добыча</b> Отсутствует</div>
    </div>

    <!-- ВКЛАДКА 4: ОСОБЕННОСТИ -->
    <div class="f-content" id="c-4">
      • <b>Главная поляна лагеря</b> — центр всего племени, отсюда начинается новый день воителя, новые истории и новые победы.
    </div>
  </div>
</div>
[/html]
[hideprofile]

0

3

[html]
<div class="forest-adaptive-wrapper">
<style>
/* --- НАСТРОЙКА КАРТИНОК ПО СЕЗОНАМ --- */
:root {
  --img-std: url('https://upforme.ru/uploads/0004/e7/0d/3979/641006.jpg');
  --img-dark: url('https://img.freepik.com');
  --img-winter: url('https://w.forfun.com');
}

/* 1. КОНТЕЙНЕР */
.forest-adaptive-wrapper { background: transparent !important; padding: 0; margin: 10px auto; max-width: 650px; }

.forest-card {
  --f-bg: #ffffff; --f-txt: #333; --f-acc: #556b2f; --f-brd: #eeeeee;
  --current-img: var(--img-std);
  border-radius: 15px; background: var(--f-bg); color: var(--f-txt);
  font-family: 'Georgia', serif; border: 1px solid var(--f-brd);
  overflow: hidden; box-shadow: 0 8px 25px rgba(0,0,0,0.1); position: relative;
}

#theme-dark:checked ~ .forest-card { --f-bg: #1a241a; --f-txt: #d1d8d1; --f-acc: #3d5e3d; --f-brd: #2d3a2d; --current-img: var(--img-dark); }
#theme-winter:checked ~ .forest-card { --f-bg: #f4f7f9; --f-txt: #2c3e50; --f-acc: #5dade2; --f-brd: #d6eaf8; --current-img: var(--img-winter); }

.color-switches {
  position: absolute; top: 12px; right: 15px; z-index: 30;
  display: flex; gap: 8px; background: rgba(0,0,0,0.4); padding: 5px; border-radius: 20px;
}
.color-switches label { width: 12px; height: 12px; border-radius: 50%; cursor: pointer; border: 2px solid #fff; transition: 0.3s; }
.btn-std { background: #556b2f; }
.btn-dark { background: #2d4d2d; }
.btn-winter { background: #5dade2; }

/* 2. УЗКАЯ ШАПКА И ПЛАВНАЯ ЦИТАТА */
.f-header { position: relative; height: 220px; width: 100%; overflow: hidden; background: #000; }

.f-img-layer {
  width: 100%; height: 100%;
  background-image: var(--current-img);
  background-size: cover; background-position: center 30%;
  transition: background-image 0.8s ease, transform 1.5s ease-out;
}

.f-info-panel {
  position: absolute; bottom: 0; width: 100%;
  background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.5) 70%, transparent 100%);
  padding: 15px 20px; text-align: center; color: #fff;
  transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
  max-height: 70px; display: flex; flex-direction: column; justify-content: flex-end;
}

.f-title { margin: 0; font-size: 30px; text-transform: uppercase; letter-spacing: 3px; text-shadow: 2px 2px 8px #000; transition: 0.6s; }

.f-quote-hidden {
  opacity: 0; max-height: 0; font-style: italic; font-size: 13.5px; line-height: 1.5;
  transition: opacity 0.8s ease-in-out, max-height 0.8s ease;
  color: rgba(255,255,255,0.9); margin-top: 0; overflow: hidden;
}

.f-header:hover .f-info-panel { max-height: 220px; padding-bottom: 40px; }
.f-header:hover .f-quote-hidden { opacity: 1; max-height: 120px; margin-top: 12px; }
.f-header:hover .f-img-layer { transform: scale(1.1); filter: brightness(0.7); }

/* 3. НАВИГАЦИЯ */
.forest-adaptive-wrapper input[type="radio"] { display: none !important; }
.f-nav { display: flex; background: rgba(0,0,0,0.03); border-bottom: 1px solid var(--f-brd); }
.f-nav label {
  flex: 1; padding: 14px 5px; text-align: center; cursor: pointer;
  font-size: 10.5px; text-transform: uppercase; font-weight: bold;
  color: var(--f-txt); opacity: 0.5; transition: 0.3s; border-bottom: 2px solid transparent;
}
.f-content { display: none; padding: 22px; line-height: 1.7; font-size: 14.5px; min-height: 280px; animation: fadeIn 0.8s ease; }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }

#t-1:checked ~ .forest-card .f-nav label[for="t-1"], #t-2:checked ~ .forest-card .f-nav label[for="t-2"],
#t-3:checked ~ .forest-card .f-nav label[for="t-3"], #t-4:checked ~ .forest-card .f-nav label[for="t-4"] {
  opacity: 1; color: var(--f-acc); border-bottom: 2px solid var(--f-acc);
}
#t-1:checked ~ .forest-card #c-1, #t-2:checked ~ .forest-card #c-2,
#t-3:checked ~ .forest-card #c-3, #t-4:checked ~ .forest-card #c-4 { display: block; }

.f-block { margin-bottom: 12px; padding: 12px 15px; border-left: 4px solid var(--f-acc); background: rgba(128,128,128,0.06); border-radius: 0 8px 8px 0; }
.f-block b { display: block; text-transform: uppercase; font-size: 11px; color: var(--f-acc); margin-bottom: 4px; letter-spacing: 0.5px; }
.f-hr { border: 0; border-top: 1px dashed var(--f-brd); margin: 12px 0; }
.f-link { color: var(--f-acc); font-weight: bold; text-decoration: none; border-bottom: 1px dotted var(--f-acc); }
</style>

  <input type="radio" name="theme" id="theme-std" checked>
  <input type="radio" name="theme" id="theme-dark">
  <input type="radio" name="theme" id="theme-winter">
 
  <input type="radio" name="tabs" id="t-1" checked>
  <input type="radio" name="tabs" id="t-2">
  <input type="radio" name="tabs" id="t-3">
  <input type="radio" name="tabs" id="t-4">

  <div class="forest-card">
    <div class="color-switches">
      <label for="theme-std" class="btn-std" title="Лето"></label>
      <label for="theme-dark" class="btn-dark" title="Весна"></label>
      <label for="theme-winter" class="btn-winter" title="Зима"></label>
    </div>

    <div class="f-header">
      <div class="f-img-layer"></div>
      <div class="f-info-panel">
        <h1 class="f-title">Главная поляна</h1>
        <div class="f-quote-hidden">
          «— Ну, по крайней мере, тут чуток попросторнее, — нехотя признал белый воин. — И вода не так близко».
        </div>
      </div>
    </div>

    <div class="f-nav">
      <label for="t-1">Описание</label>
      <label for="t-2">Травы</label>
      <label for="t-3">Добыча</label>
      <label for="t-4">Особенности</label>
    </div>

    <!-- КОНТЕНТ ВКЛАДОК -->
    <div class="f-content" id="c-1">
      Продолжение темы — <a href="https://cwotgoloski.ru" class="f-link">Главная поляна #6</a><br><br>
      Лагерь Тигриного племени окружён с одной стороны берёзовой рощей и высоким холмом, где проводят ночное бдение воители, с другой.<br><br>
      Вместо величавой скалы собраний, на главную поляну отбрасывает тень согнутая берёза. В корнях дерева расположена пещера предводителя, раскидистые ветви выступают дополнительным прикрытием для сердца Тигриного племени. Палатками служат кусты лапчатки и шиповника, но территория лагеря достаточно просторна, чтобы спать под открытым небом.<br><br>
      Если напрячь слух, можно услышать плеск реки вдалеке со стороны холма — там матери-королевы учат плавать котят, когда их лапы достаточно окрепнут.
    </div>

    <div class="f-content" id="c-2">
      <div class="f-block"><b>Лекарственные растения</b> • Отсутствуют</div>
      <hr class="f-hr">
      <div class="f-block"><b>Ядовитые растения/грибы</b> • Отсутствуют</div>
      <hr class="f-hr">
      <div class="f-block"><b>Прочее</b> • Отсутствуют</div>
    </div>

    <div class="f-content" id="c-3">
      <div class="f-block"><b>Условия места</b> • Территории лагеря не являются пригодными для охоты.</div>
      <hr class="f-hr">
      <div class="f-block"><b>Опасные/Хищники</b> • Отсутствуют</div>
      <hr class="f-hr">
      <div class="f-block"><b>Добыча</b> • Отсутствует</div>
      <hr class="f-hr">
      <div class="f-block"><b>Простейшая добыча</b> • Отсутствует</div>
    </div>

    <div class="f-content" id="c-4">
      • <b>Главная поляна лагеря</b> — центр всего племени, отсюда начинается новый день воителя, новые истории и новые победы.
    </div>

  </div>
</div>
[/html]

0

4

[html]
<div class="forest-adaptive-wrapper">
<style>
/* --- ПРЯМЫЕ ССЫЛКИ НА КАРТИНКИ (ВЫНЕСЕНЫ В НАЧАЛО) --- */
:root {
  /* ЛЕТО (Стандарт) — Ваша оригинальная картинка */
  --img-std: url('https://upforme.ru/uploads/0004/e7/0d/3979/641006.jpg');
  /* ВЕСНА (Яркие побеги) — Нежная молодая зелень */
  --img-dark: url('https://i.ibb.co');
  /* ЗИМА (Снег) — Заснеженная березовая роща */
  --img-winter: url('https://i.ibb.co');
}

/* 1. КОНТЕЙНЕР И ТЕМЫ */
.forest-adaptive-wrapper { background: transparent !important; padding: 0; margin: 10px auto; max-width: 650px; }

.forest-card {
  --f-bg: #ffffff; --f-txt: #333; --f-acc: #556b2f; --f-brd: #eeeeee;
  --current-img: var(--img-std);
  border-radius: 15px; background: var(--f-bg); color: var(--f-txt);
  font-family: 'Georgia', serif; border: 1px solid var(--f-brd);
  overflow: hidden; box-shadow: 0 8px 25px rgba(0,0,0,0.1); position: relative;
}

#theme-dark:checked ~ .forest-card { --f-bg: #1a241a; --f-txt: #d1d8d1; --f-acc: #3d5e3d; --f-brd: #2d3a2d; --current-img: var(--img-dark); }
#theme-winter:checked ~ .forest-card { --f-bg: #f4f7f9; --f-txt: #2c3e50; --f-acc: #5dade2; --f-brd: #d6eaf8; --current-img: var(--img-winter); }

.color-switches {
  position: absolute; top: 12px; right: 15px; z-index: 30;
  display: flex; gap: 8px; background: rgba(0,0,0,0.4); padding: 5px; border-radius: 20px;
}
.color-switches label { width: 12px; height: 12px; border-radius: 50%; cursor: pointer; border: 2px solid #fff; transition: 0.3s; }
.btn-std { background: #556b2f; }
.btn-dark { background: #2d4d2d; }
.btn-winter { background: #5dade2; }

/* 2. УЗКАЯ ПАНОРАМНАЯ ШАПКА */
.f-header { position: relative; height: 180px; width: 100%; overflow: hidden; background: #000; }

.f-img-layer {
  width: 100%; height: 100%;
  background-image: var(--current-img);
  background-size: cover;
  background-position: center 40%;
  transition: background-image 0.8s ease, transform 1.5s ease;
}

.f-info-panel {
  position: absolute; bottom: 0; width: 100%;
  background: linear-gradient(to top, rgba(0,0,0,0.9) 0%, rgba(0,0,0,0.5) 80%, transparent 100%);
  padding: 15px 20px; text-align: center; color: #fff;
  transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1);
  max-height: 65px; display: flex; flex-direction: column; justify-content: flex-end;
}

.f-title { margin: 0; font-size: 28px; text-transform: uppercase; letter-spacing: 3px; text-shadow: 2px 2px 8px #000; transition: 0.6s; }

.f-quote-hidden {
  opacity: 0; max-height: 0; font-style: italic; font-size: 13.5px; line-height: 1.5;
  transition: opacity 0.8s ease-in-out 0.2s, max-height 0.7s ease; /* Задержка появления текста */
  color: rgba(255,255,255,0.9); margin-top: 0; overflow: hidden;
}

/* Эффект выдвижения */
.f-header:hover .f-info-panel { max-height: 180px; padding-bottom: 30px; }
.f-header:hover .f-quote-hidden { opacity: 1; max-height: 100px; margin-top: 10px; }
.f-header:hover .f-img-layer { transform: scale(1.1); filter: brightness(0.8); }

/* 3. НАВИГАЦИЯ */
.forest-adaptive-wrapper input[type="radio"] { display: none !important; }
.f-nav { display: flex; background: rgba(0,0,0,0.03); border-bottom: 1px solid var(--f-brd); }
.f-nav label {
  flex: 1; padding: 12px 5px; text-align: center; cursor: pointer;
  font-size: 10px; text-transform: uppercase; font-weight: bold;
  color: var(--f-txt); opacity: 0.5; transition: 0.3s; border-bottom: 2px solid transparent;
}
.f-content { display: none; padding: 22px; line-height: 1.7; font-size: 14.5px; min-height: 300px; animation: fadeIn 0.8s ease; }
@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }

#t-1:checked ~ .forest-card .f-nav label[for="t-1"], #t-2:checked ~ .forest-card .f-nav label[for="t-2"],
#t-3:checked ~ .forest-card .f-nav label[for="t-3"], #t-4:checked ~ .forest-card .f-nav label[for="t-4"] {
  opacity: 1; color: var(--f-acc); border-bottom: 2px solid var(--f-acc);
}
#t-1:checked ~ .forest-card #c-1, #t-2:checked ~ .forest-card #c-2,
#t-3:checked ~ .forest-card #c-3, #t-4:checked ~ .forest-card #c-4 { display: block; }

.f-block { margin-bottom: 12px; padding: 12px 15px; border-left: 4px solid var(--f-acc); background: rgba(128,128,128,0.06); border-radius: 0 8px 8px 0; }
.f-block b { display: block; text-transform: uppercase; font-size: 11px; color: var(--f-acc); margin-bottom: 4px; }
.f-link { color: var(--f-acc); font-weight: bold; text-decoration: none; border-bottom: 1px dotted var(--f-acc); }
</style>

  <input type="radio" name="theme" id="theme-std" checked>
  <input type="radio" name="theme" id="theme-dark">
  <input type="radio" name="theme" id="theme-winter">
 
  <input type="radio" name="tabs" id="t-1" checked>
  <input type="radio" name="tabs" id="t-2">
  <input type="radio" name="tabs" id="t-3">
  <input type="radio" name="tabs" id="t-4">

  <div class="forest-card">
    <div class="color-switches">
      <label for="theme-std" class="btn-std" title="Лето"></label>
      <label for="theme-dark" class="btn-dark" title="Весна"></label>
      <label for="theme-winter" class="btn-winter" title="Зима"></label>
    </div>

    <div class="f-header">
      <div class="f-img-layer"></div>
      <div class="f-info-panel">
        <h1 class="f-title">Главная поляна</h1>
        <div class="f-quote-hidden">
          «— Ну, по крайней мере, тут чуток попросторнее, — нехотя признал белый воин. — И вода не так близко».
        </div>
      </div>
    </div>

    <div class="f-nav">
      <label for="t-1">Описание</label>
      <label for="t-2">Травы</label>
      <label for="t-3">Добыча</label>
      <label for="t-4">Особенности</label>
    </div>

    <!-- КОНТЕНТ ВКЛАДОК -->
    <div class="f-content" id="c-1">
      Продолжение темы — <a href="https://cwotgoloski.ru" class="f-link">Главная поляна #6</a><br><br>
      Лагерь Тигриного племени окружён с одной стороны берёзовой рощей и высоким холмом, где проводят ночное бдение воители, с другой.<br><br>
      Вместо величавой скалы собраний, на главную поляну отбрасывает тень согнутая берёза. В корнях дерева расположена пещера предводителя, раскидистые ветви выступают дополнительным прикрытием для сердца Тигриного племени. Палатками служат кусты лапчатки и шиповника, но территория лагеря достаточно просторна, чтобы спать под открытым небом.<br><br>
      Если напрячь слух, можно услышать плеск реки вдалеке со стороны холма — там матери-королевы учат плавать котят, когда их лапы достаточно окрепнут.
    </div>

    <div class="f-content" id="c-2">
      <div class="f-block"><b>Лекарственные растения</b> • Отсутствуют</div>
      <div class="f-block"><b>Ядовитые растения/грибы</b> • Отсутствуют</div>
      <div class="f-block"><b>Прочее</b> • Отсутствуют</div>
    </div>

    <div class="f-content" id="c-3">
      <div class="f-block"><b>Условия места</b> • Территории лагеря не пригодны для охоты.</div>
      <div class="f-block"><b>Опасные/Хищники</b> • Отсутствуют</div>
      <div class="f-block"><b>Дополнительная добыча</b> • Отсутствует</div>
      <div class="f-block"><b>Простейшая добыча</b> • Отсутствует</div>
    </div>

    <div class="f-content" id="c-4">
      • <b>Главная поляна лагеря</b> — центр всего племени, отсюда начинается новый день воителя, новые истории и новые победы.
    </div>

  </div>
</div>
[/html]

0

5

/*Личная страница*/
.reveal-modal-bg {
  position: fixed;
  height: 100%;
  width: 100%;
  background: #000;
  background: rgba(0,0,0,.8);
  z-index: 9999;
  display: none;
  top: 0;
  left: 0;
}

.reveal-modal.xlarge {
  width: 900px;
}

.reveal-modal .close-reveal-modal {
  font-size: 22px;
  line-height: .5;
  position: absolute;
  font-weight: bold;
  cursor: pointer;
  text-decoration: none;
  top: -18px;
  right: 10px;
  color: var(--link-light);
  transition: color 0.8s ease;
}

.reveal-modal .close-reveal-modal:hover {
  color: var(--text); 
  transition: color 0.8s ease;
}

0

6

[html]<style>
/* Базовые стили для блока миссий */
.mission-container {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
  background: #e3e2de;
  border: 2px solid #676a52;
  border-radius: 12px;
  padding: 20px;
  font-family: 'Book Antiqua', serif;
  color: #39423c;
  max-width: 900px;
  margin: 20px auto;
}
.mission-list {
  flex: 1;
  min-width: 250px;
  background: #dcdbd6;
  border-radius: 8px;
  padding: 10px;
  max-height: 500px;
  overflow-y: auto;
}
.mission-item {
  padding: 12px 15px;
  margin-bottom: 5px;
  background: #cfcfca;
  border: 1px solid #aeafa8;
  border-radius: 5px;
  cursor: pointer;
  transition: all 0.2s;
  display: flex;
  justify-content: space-between;
  align-items: center;
}
.mission-item:hover, .mission-item.active {
  background: #c0c0b8;
  border-color: #676a52;
}
.mission-difficulty {
  font-size: 10px;
  padding: 2px 8px;
  border-radius: 10px;
  color: white;
  font-weight: bold;
}
.diff-easy { background: #78C850; }
.diff-medium { background: #F08030; }
.diff-hard { background: #C03028; }

.mission-detail {
  flex: 2;
  min-width: 300px;
  background: #cfcfca;
  border-radius: 8px;
  padding: 20px;
  border: 1px solid #aeafa8;
}
.pokemon-select {
  width: 100%;
  padding: 10px;
  margin: 15px 0;
  background: #e3e2de;
  border: 1px solid #676a52;
  border-radius: 5px;
  font-family: inherit;
  color: #39423c;
}
.btn-send {
  background: #4CAF50;
  color: white;
  border: none;
  padding: 12px 25px;
  border-radius: 25px;
  font-weight: bold;
  cursor: pointer;
  width: 100%;
  font-size: 16px;
  margin-top: 10px;
  transition: background 0.2s;
}
.btn-send:hover { background: #45a049; }
.btn-send:disabled { background: #848a87; cursor: not-allowed; }

.chance-bar {
  background: #848a87;
  height: 20px;
  border-radius: 10px;
  overflow: hidden;
  margin: 10px 0;
  border: 1px solid #676a52;
}
.chance-fill {
  height: 100%;
  background: linear-gradient(90deg, #fc8181, #f6e05e, #48bb78);
  transition: width 0.5s;
}
.bonus-info {
  color: #2b6f2b;
  font-weight: bold;
  font-size: 14px;
}
.loading-text {
  text-align: center;
  color: #848a87;
  padding: 20px;
  font-style: italic;
}
</style>

<div class="mission-container">
  <div class="mission-list" id="missionList">
    <!-- Заполняется JS -->
  </div>
  <div class="mission-detail" id="missionDetail">
    <p>Выберите миссию слева, чтобы увидеть детали.</p>
  </div>
</div>

<script>
console.log('=== СКРИПТ МИССИЙ ЗАГРУЖЕН ===');

// ===== API БАЗА =====
var API_BASE = 'https://script.google.com/macros/s/AKfycbyK-EocFHcnHKTvOR4zHCshEx_23hMiLDvPbD3gMIBje7GivhLez-Xz4AhjJVS754G5/exec';

// ===== МАССИВ С МИССИЯМИ =====
var MISSIONS = [
  {id:1, name:"Поиск целебных трав", diff:"Лёгкая", type:"Гуманитарная", desc:"Поиск редких целебных трав в густом лесу.", bonus:["Трава","Насекомое","Фея"], xp:25, time:120, dmg:0},
  {id:2, name:"Помощь в наводнении", diff:"Лёгкая", type:"Гуманитарная", desc:"Эвакуация животных и перенос грузов через затопленные территории.", bonus:["Вода","Земля"], xp:28, time:120, dmg:0},
  {id:3, name:"Доставка сообщения", diff:"Лёгкая", type:"Гуманитарная", desc:"Доставка срочного сообщения через опасную территорию.", bonus:["Летающий","Нормальный"], xp:22, time:120, dmg:0},
  {id:4, name:"Расшифровка древних письмён", diff:"Лёгкая", type:"Гуманитарная", desc:"Расшифровка древних письмён с помощью интеллекта покемона.", bonus:["Психо","Призрак"], xp:26, time:120, dmg:0},
  {id:5, name:"Очистка токсичных отходов", diff:"Лёгкая", type:"Гуманитарная", desc:"Очистка леса от токсичных отходов.", bonus:["Яд","Трава"], xp:28, time:120, dmg:0},
  {id:6, name:"Освещение тоннелей", diff:"Лёгкая", type:"Гуманитарная", desc:"Помощь в освещении тёмных пещер.", bonus:["Огонь","Камень"], xp:24, time:120, dmg:0},
  {id:7, name:"Починка генератора", diff:"Лёгкая", type:"Гуманитарная", desc:"Восстановление электроснабжения деревни.", bonus:["Электро","Сталь"], xp:23, time:120, dmg:0},
  {id:8, name:"Тренировка ополченцев", diff:"Лёгкая", type:"Гуманитарная", desc:"Тренировка деревенского ополчения.", bonus:["Боевой","Нормальный"], xp:24, time:120, dmg:0},
  {id:9, name:"Разведка территории", diff:"Средняя", type:"Военная", desc:"Скрытное проникновение для сбора разведданных.", bonus:["Электро","Призрак"], xp:55, time:180, dmg:18},
  {id:10, name:"Оборона лагеря", diff:"Средняя", type:"Военная", desc:"Защита лагеря от атаки диких покемонов.", bonus:["Огонь","Боевой"], xp:60, time:180, dmg:25},
  {id:11, name:"Спасение из-под завала", diff:"Средняя", type:"Военная", desc:"Расчистка снежных завалов.", bonus:["Лёд","Боевой"], xp:58, time:180, dmg:22},
  {id:12, name:"Охрана музея", diff:"Средняя", type:"Военная", desc:"Ночная охрана музея от грабителей.", bonus:["Призрак","Психо"], xp:52, time:180, dmg:16},
  {id:13, name:"Патруль у вулкана", diff:"Средняя", type:"Военная", desc:"Разведка вулканической активности.", bonus:["Земля","Огонь"], xp:56, time:180, dmg:20},
  {id:14, name:"Поиск пропавшей экспедиции", diff:"Средняя", type:"Военная", desc:"Поиск экспедиции в Драконьих горах.", bonus:["Дракон","Летающий"], xp:62, time:180, dmg:28},
  {id:15, name:"Защита сада фей", diff:"Средняя", type:"Военная", desc:"Защита волшебного сада от вредителей.", bonus:["Фея","Трава","Насекомое"], xp:54, time:180, dmg:15},
  {id:16, name:"Укрощение дракона", diff:"Сложная", type:"Военная", desc:"Дикий дракон терроризирует окрестности.", bonus:["Дракон"], xp:110, time:300, dmg:50},
  {id:17, name:"Изгнание полтергейста", diff:"Сложная", type:"Военная", desc:"Злобный полтергейст в доме.", bonus:["Призрак"], xp:105, time:300, dmg:45},
  {id:18, name:"Остановка землетрясения", diff:"Сложная", type:"Военная", desc:"Стабилизация тектонических плит.", bonus:["Земля","Камень"], xp:115, time:300, dmg:48},
  {id:19, name:"Усмирение водоворота", diff:"Сложная", type:"Военная", desc:"Гигантский водоворот угрожает городу.", bonus:["Вода","Лёд"], xp:108, time:300, dmg:42},
  {id:20, name:"Битва с лесным гигантом", diff:"Сложная", type:"Военная", desc:"Гигантское хищное растение атакует!", bonus:["Трава","Яд"], xp:112, time:300, dmg:46}
];

// ===== ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ =====
var currentMission = null;
var trainerData = null;
var isProcessing = false;
var dataLoadAttempted = false;

// ===== ПОЛУЧЕНИЕ ID ПОЛЬЗОВАТЕЛЯ =====
function getCurrentUserId() {
  console.log('>>> getCurrentUserId() вызвана');
 
  // Способ 1: Глобальная переменная UserID от MyBB
  if (typeof UserID !== 'undefined' && UserID && UserID > 0) {
    console.log('ID найден через UserID:', UserID);
    return parseInt(UserID);
  }
 
  // Способ 2: Глобальная переменная mybb
  if (typeof mybb !== 'undefined' && mybb.user && mybb.user.uid) {
    console.log('ID найден через mybb.user.uid:', mybb.user.uid);
    return parseInt(mybb.user.uid);
  }
 
  // Способ 3: Ищем в data-атрибутах body
  var body = document.body;
  if (body) {
    var dataUid = body.getAttribute('data-uid') || body.getAttribute('data-userid');
    if (dataUid) {
      console.log('ID найден через data-атрибут:', dataUid);
      return parseInt(dataUid);
    }
  }
 
  // Способ 4: Ищем ВСЕ ссылки profile.php и берем первую с id
  var allLinks = document.querySelectorAll('a[href*="profile.php"]');
  console.log('Найдено ссылок с profile.php:', allLinks.length);
 
  for (var i = 0; i < allLinks.length; i++) {
    var link = allLinks[i];
    var match = link.href.match(/[?&]id=(\d+)/);
    if (match) {
      console.log('Найдена ссылка profile.php?id=' + match[1] + ':', link.outerHTML.substring(0, 200));
     
      // Проверяем, похоже ли это на профиль текущего пользователя
      var linkHTML = link.innerHTML.toLowerCase();
      var linkTitle = (link.title || '').toLowerCase();
      var linkText = (link.innerText || link.textContent || '').trim().toLowerCase();
     
      // Признаки того, что это профиль текущего пользователя
      var isProfile =
        linkHTML.indexOf('аватар') !== -1 ||
        linkHTML.indexOf('avatar') !== -1 ||
        linkHTML.indexOf('avatars') !== -1 ||
        linkHTML.indexOf('img') !== -1 ||
        linkHTML.indexOf('профиль') !== -1 ||
        linkTitle.indexOf('профиль') !== -1 ||
        linkTitle.indexOf('личный раздел') !== -1 ||
        linkText === 'мой профиль' ||
        linkText === 'личный раздел' ||
        linkText === 'профиль';
     
      // Если ссылок всего ОДНА или это явно профиль — берем ID
      if (isProfile || allLinks.length === 1) {
        console.log('ID найден через profile.php:', match[1]);
        return parseInt(match[1]);
      }
    }
  }
 
  // Способ 5: Берем ЛЮБУЮ первую ссылку profile.php?id=X
  for (var j = 0; j < allLinks.length; j++) {
    var link2 = allLinks[j];
    var match2 = link2.href.match(/[?&]id=(\d+)/);
    if (match2) {
      console.log('ID взят из первой найденной ссылки profile.php:', match2[1]);
      return parseInt(match2[1]);
    }
  }
 
  // Способ 6: Ищем в URL текущей страницы (если мы на странице профиля)
  var currentUrl = window.location.href;
  var urlMatch = currentUrl.match(/[?&]id=(\d+)/);
  if (urlMatch) {
    console.log('ID найден в URL текущей страницы:', urlMatch[1]);
    return parseInt(urlMatch[1]);
  }
 
  // Способ 7: Ищем в скриптах на странице
  var scripts = document.getElementsByTagName('script');
  for (var k = 0; k < scripts.length; k++) {
    var scriptContent = scripts[k].textContent || scripts[k].innerHTML || '';
    var userMatch = scriptContent.match(/UserID\s*=\s*(\d+)/);
    if (userMatch) {
      console.log('ID найден в скрипте:', userMatch[1]);
      return parseInt(userMatch[1]);
    }
    var uidMatch = scriptContent.match(/["']uid["']\s*:\s*(\d+)/);
    if (uidMatch) {
      console.log('ID найден в JSON скрипта:', uidMatch[1]);
      return parseInt(uidMatch[1]);
    }
  }
 
  console.error('ID пользователя не найден ни одним способом');
  return null;
}

// ===== API ЗАПРОС =====
function apiGet(params) {
  var queryString = Object.keys(params).map(function(k) {
    return k + '=' + encodeURIComponent(params[k]);
  }).join('&');
 
  console.log('API запрос:', API_BASE + '?' + queryString);
 
  return new Promise(function(resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open('GET', API_BASE + '?' + queryString, true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
   
    xhr.onreadystatechange = function() {
      if (xhr.readyState === 4) {
        if (xhr.status === 200) {
          try {
            var data = JSON.parse(xhr.responseText);
            console.log('API ответ:', data);
            resolve(data);
          } catch(e) {
            console.error('Ошибка парсинга ответа:', xhr.responseText);
            reject(new Error('Ошибка парсинга ответа'));
          }
        } else {
          console.error('Ошибка сервера:', xhr.status, xhr.responseText);
          reject(new Error('Ошибка сервера: ' + xhr.status));
        }
      }
    };
   
    xhr.onerror = function() {
      console.error('Ошибка соединения');
      reject(new Error('Ошибка соединения'));
    };
   
    xhr.timeout = 8000;
    xhr.ontimeout = function() {
      console.error('Таймаут запроса');
      reject(new Error('Таймаут запроса'));
    };
   
    xhr.send();
  });
}

// ===== ЗАГРУЗКА ВСЕХ ДАННЫХ ТРЕНЕРА =====
function loadAllTrainerData(userId) {
  return apiGet({action: 'getAllData', id: userId});
}

// ===== ИНИЦИАЛИЗАЦИЯ СПИСКА МИССИЙ =====
function initMissions() {
  console.log('>>> initMissions() вызвана');
  var listEl = document.getElementById('missionList');
  if (!listEl) {
    console.error('Элемент missionList не найден!');
    return;
  }
 
  listEl.innerHTML = '';
 
  MISSIONS.forEach(function(m) {
    var div = document.createElement('div');
    div.className = 'mission-item';
    var diffClass = m.diff === 'Лёгкая' ? 'diff-easy' : (m.diff === 'Средняя' ? 'diff-medium' : 'diff-hard');
    div.innerHTML = m.name + ' <span class="mission-difficulty ' + diffClass + '">' + m.diff + '</span>';
   
    // Используем замыкание для правильной передачи m и div
    (function(mission, element) {
      div.onclick = function() {
        console.log('>>> КЛИК ПО МИССИИ:', mission.name);
        selectMission(mission, element);
      };
    })(m, div);
   
    listEl.appendChild(div);
  });
 
  console.log('Список миссий создан, элементов:', MISSIONS.length);
}

// ===== ВЫБОР МИССИИ =====
function selectMission(mission, element) {
  console.log('>>> selectMission() вызвана для:', mission.name);
 
  currentMission = mission;
 
  // Подсветка выбранной миссии
  var items = document.querySelectorAll('.mission-item');
  for (var i = 0; i < items.length; i++) {
    items[i].classList.remove('active');
  }
  if (element) {
    element.classList.add('active');
  }
 
  // Проверяем, не загружали ли мы уже данные
  if (!dataLoadAttempted) {
    console.log('Первая попытка загрузки данных');
    loadTrainerPokemons();
  } else {
    console.log('Данные уже загружались, просто рендерим');
    renderMissionDetail();
  }
}

// ===== ЗАГРУЗКА ДАННЫХ ТРЕНЕРА =====
function loadTrainerPokemons() {
  console.log('>>> loadTrainerPokemons() вызвана');
 
  var userId = getCurrentUserId();
  console.log('Определенный ID пользователя:', userId);
 
  dataLoadAttempted = true;
 
  // Показываем индикатор загрузки
  var detailEl = document.getElementById('missionDetail');
  if (!detailEl) {
    console.error('Элемент missionDetail не найден!');
    return;
  }
 
  if (!userId) {
    console.log('ID не определен, показываем сообщение');
    detailEl.innerHTML = '<p class="loading-text">Выберите миссию слева, чтобы увидеть детали.</p>';
    // Сбрасываем флаг, чтобы при следующем клике попробовать снова
    dataLoadAttempted = false;
    return;
  }
 
  detailEl.innerHTML = '<p class="loading-text">Загрузка данных тренера...</p>';
  console.log('Загружаем данные для пользователя:', userId);
 
  loadAllTrainerData(userId).then(function(data) {
    console.log('Данные тренера загружены успешно:', data);
    trainerData = data;
    if (currentMission) {
      renderMissionDetail();
    }
  }).catch(function(error) {
    console.error('Ошибка загрузки данных:', error);
    detailEl.innerHTML = '<p class="loading-text">❌ Ошибка загрузки данных. Проверьте соединение.</p>';
  });
}

// ===== ОТРИСОВКА ДЕТАЛЕЙ МИССИИ =====
function renderMissionDetail() {
  console.log('>>> renderMissionDetail() вызвана');
 
  var detailEl = document.getElementById('missionDetail');
  if (!detailEl) {
    console.error('Элемент missionDetail не найден!');
    return;
  }
 
  if (!currentMission) {
    console.log('Нет выбранной миссии');
    detailEl.innerHTML = '<p>Выберите миссию слева, чтобы увидеть детали.</p>';
    return;
  }
 
  console.log('Рендерим миссию:', currentMission.name);
 
  var pokeOptions = '<option value="">-- Выберите покемона --</option>';
  if (trainerData && trainerData.pokemons && trainerData.pokemons.length > 0) {
    console.log('Найдено покемонов:', trainerData.pokemons.length);
    trainerData.pokemons.forEach(function(p) {
      pokeOptions += '<option value="' + p.id + '" data-types="' + (p.type1 || '') + ',' + (p.type2 || '') + '" data-level="' + p.level + '" data-power="' + p.power + '" data-hp="' + p.hp + '" data-xp="' + p.xp + '" data-maxhp="' + p.maxHp + '">' + p.name + ' (Ур.' + p.level + ', HP:' + p.hp + '/' + p.maxHp + ')</option>';
    });
  } else {
    if (!trainerData) {
      pokeOptions += '<option value="" disabled>Данные не загружены. Нажмите на миссию ещё раз.</option>';
    } else {
      pokeOptions += '<option value="" disabled>У вас пока нет покемонов</option>';
    }
  }
 
  var diffClass = currentMission.diff === 'Лёгкая' ? 'diff-easy' : (currentMission.diff === 'Средняя' ? 'diff-medium' : 'diff-hard');
 
  var html = '<h3>' + currentMission.name + ' <span class="mission-difficulty ' + diffClass + '">' + currentMission.diff + '</span></h3>';
  html += '<p><strong>Тип:</strong> ' + currentMission.type + '</p>';
  html += '<p>' + currentMission.desc + '</p>';
  html += '<p><strong>⭐ Бонусные стихии:</strong> ' + currentMission.bonus.join(', ') + '</p>';
  html += '<p>✅ Успех: +' + currentMission.xp + ' XP | ❌ Провал: ' + (currentMission.dmg > 0 ? '-' + currentMission.dmg + ' HP' : 'без последствий') + '</p>';
  html += '<p>⏳ Время: ' + Math.floor(currentMission.time / 60) + ' мин.</p>';
  html += '<select class="pokemon-select" id="pokemonSelect" onchange="onPokemonChange()">' + pokeOptions + '</select>';
  html += '<div id="chanceDisplay"></div>';
  html += '<button class="btn-send" id="sendBtn" disabled onclick="startMission()">Отправить на миссию</button>';
 
  detailEl.innerHTML = html;
  console.log('Детали миссии отрендерены');
}

// ===== ОБРАБОТЧИК СМЕНЫ ПОКЕМОНА =====
function onPokemonChange() {
  var select = document.getElementById('pokemonSelect');
  var chanceDiv = document.getElementById('chanceDisplay');
  var sendBtn = document.getElementById('sendBtn');
 
  if (!select || !select.value) {
    if (sendBtn) sendBtn.disabled = true;
    if (chanceDiv) chanceDiv.innerHTML = '';
    return;
  }
 
  var option = select.options[select.selectedIndex];
  var typesStr = option.getAttribute('data-types') || '';
  var types = typesStr.split(',').filter(function(t) { return t !== ''; });
  var level = parseInt(option.getAttribute('data-level')) || 1;
  var power = parseInt(option.getAttribute('data-power')) || 0;
  var hp = parseInt(option.getAttribute('data-hp')) || 0;
 
  var baseChance = 40 + (level * 2);
 
  if (currentMission.type === 'Военная') {
    baseChance += Math.floor(power / 5);
  } else {
    baseChance += Math.floor(hp / 5);
  }
 
  var bonus = false;
  for (var i = 0; i < types.length; i++) {
    if (currentMission.bonus.indexOf(types[i]) !== -1) {
      bonus = true;
      break;
    }
  }
 
  if (bonus) {
    baseChance += 20;
    chanceDiv.innerHTML = '<p class="bonus-info">⭐ Бонусная стихия! Шанс успеха выше!</p>';
  } else {
    chanceDiv.innerHTML = '';
  }
 
  baseChance = Math.min(95, Math.max(5, baseChance));
 
  chanceDiv.innerHTML += '<p>Вероятность успеха: <strong>' + baseChance + '%</strong></p>';
  chanceDiv.innerHTML += '<div class="chance-bar"><div class="chance-fill" style="width:' + baseChance + '%"></div></div>';
 
  if (sendBtn) sendBtn.disabled = false;
}

// ===== СТАРТ МИССИИ =====
function startMission() {
  if (isProcessing) return;
 
  var select = document.getElementById('pokemonSelect');
  if (!select || !select.value) {
    alert('Выберите покемона!');
    return;
  }
 
  var pokemonId = select.value;
  var option = select.options[select.selectedIndex];
  var pokemonName = option.text.split(' (')[0];
 
  // Расчет шанса
  var typesStr = option.getAttribute('data-types') || '';
  var types = typesStr.split(',').filter(function(t) { return t !== ''; });
  var level = parseInt(option.getAttribute('data-level')) || 1;
  var power = parseInt(option.getAttribute('data-power')) || 0;
  var hp = parseInt(option.getAttribute('data-hp')) || 0;
 
  var chance = 40 + (level * 2);
  if (currentMission.type === 'Военная') chance += Math.floor(power / 5);
  else chance += Math.floor(hp / 5);
 
  var bonus = false;
  for (var i = 0; i < types.length; i++) {
    if (currentMission.bonus.indexOf(types[i]) !== -1) {
      bonus = true;
      break;
    }
  }
  if (bonus) chance += 20;
  chance = Math.min(95, Math.max(5, chance));
 
  var userId = getCurrentUserId();
  if (!userId) {
    alert('Не удалось определить ID пользователя. Обновите страницу и попробуйте снова.');
    return;
  }
 
  isProcessing = true;
  var sendBtn = document.getElementById('sendBtn');
  if (sendBtn) {
    sendBtn.disabled = true;
    sendBtn.textContent = 'Отправка...';
  }
 
  console.log('Отправка на миссию:', {
    userId: userId,
    pokemonId: pokemonId,
    mission: currentMission.name,
    chance: chance
  });
 
  // Отправляем запрос в БД на старт
  apiGet({action: 'startMission', tid: userId, pid: pokemonId, mission: currentMission.name}).then(function(startRes) {
    console.log('Результат startMission:', startRes);
   
    if (!startRes.success) {
      alert('Ошибка: ' + (startRes.error || 'Не удалось начать миссию'));
      isProcessing = false;
      if (sendBtn) {
        sendBtn.disabled = false;
        sendBtn.textContent = 'Отправить на миссию';
      }
      return;
    }
   
    // Формируем BB-код и копируем
    var now = new Date();
    var endTime = new Date(now.getTime() + currentMission.time * 1000);
    var bbcode = generateMissionBBCode(pokemonName, chance, endTime, currentMission);
    copyToClipboard('[html]' + bbcode + '[' + '/html]');
    alert('Код миссии скопирован! Отправьте его в тему.');
   
    // Запускаем таймер для авто-завершения
    setTimeout(function() {
      var success = Math.random() * 100 < chance;
      var xpGain = success ? currentMission.xp : 0;
      var damage = success ? 0 : currentMission.dmg;
     
      var currentXp = parseInt(option.getAttribute('data-xp') || '0');
      var newXp = currentXp + xpGain;
      var newLevel = level;
      while (newXp >= 100) { newXp -= 100; newLevel++; }
     
      console.log('Завершение миссии:', {
        success: success,
        xpGain: xpGain,
        damage: damage,
        newLevel: newLevel,
        newXp: newXp
      });
     
      apiGet({
        action: 'completeMission',
        tid: userId,
        pid: pokemonId,
        mission: currentMission.name,
        result: success ? 'success' : 'fail',
        damage: damage,
        xp: xpGain,
        newLevel: newLevel,
        newXp: newXp
      }).then(function(result) {
        console.log('Миссия завершена:', result);
      }).catch(function(err) {
        console.error('Ошибка завершения миссии:', err);
      });
     
      alert('Миссия "' + currentMission.name + '" завершена! Результат: ' + (success ? 'Успех' : 'Провал') + '.');
    }, currentMission.time * 1000);
   
    isProcessing = false;
    if (sendBtn) {
      sendBtn.disabled = false;
      sendBtn.textContent = 'Отправить на миссию';
    }
   
  }).catch(function(e) {
    console.error('Ошибка startMission:', e);
    alert('Ошибка соединения');
    isProcessing = false;
    if (sendBtn) {
      sendBtn.disabled = false;
      sendBtn.textContent = 'Отправить на миссию';
    }
  });
}

// ===== ГЕНЕРАЦИЯ BB-КОДА С ТАЙМЕРОМ =====
function generateMissionBBCode(pokemonName, chance, endTime, mission) {
  var successXp = mission.xp;
  var failDmg = mission.dmg;
  var timerId = 'timer-' + Date.now();
 
  var html = '<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:\'Book Antiqua\',serif;max-width:500px;">';
  html += '<div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: ' + mission.name + '</div>';
  html += '<div style="margin-top:10px;color:#4d5a55;">';
  html += '<p>🐾 <strong>' + pokemonName + '</strong> отправляется на задание!</p>';
  html += '<p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">' + chance + '%</span></p>';
  html += '<div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;">';
  html += '<div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:' + chance + '%;"></div>';
  html += '</div>';
  html += '<p>✅ При успехе: +' + successXp + ' XP</p>';
  html += '<p>❌ При провале: ' + (failDmg > 0 ? '-' + failDmg + ' HP' : 'без последствий') + '</p>';
  html += '<p id="' + timerId + '" style="font-weight:bold;color:#c03028;">⏳ Ожидание...</p>';
  html += '</div>';
  html += '</div>';
  html += '<script>';
  html += '(function() {';
  html += 'var endTime = new Date(' + endTime.getTime() + ');';
  html += 'var timerEl = document.getElementById("' + timerId + '");';
  html += 'if (!timerEl) return;';
  html += 'var interval = setInterval(function() {';
  html += 'var now = new Date();';
  html += 'var diff = Math.max(0, endTime - now);';
  html += 'var mins = Math.floor(diff / 60000);';
  html += 'var secs = Math.floor((diff % 60000) / 1000);';
  html += 'timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;';
  html += 'if (diff <= 0) {';
  html += 'clearInterval(interval);';
  html += 'timerEl.innerHTML = "✅ Миссия завершена! Обновите профиль.";';
  html += '}';
  html += '}, 1000);';
  html += '})();';
  html += '<' + '/script>';
 
  return html;
}

// ===== КОПИРОВАНИЕ В БУФЕР ОБМЕНА =====
function copyToClipboard(text) {
  if (navigator.clipboard && navigator.clipboard.writeText) {
    navigator.clipboard.writeText(text).then(function() {
      alert('Код скопирован!');
    }).catch(function() {
      fallbackCopy(text);
    });
  } else {
    fallbackCopy(text);
  }
}

function fallbackCopy(text) {
  var ta = document.createElement('textarea');
  ta.value = text;
  ta.style.position = 'fixed';
  ta.style.top = '-9999px';
  ta.style.left = '-9999px';
  document.body.appendChild(ta);
  ta.select();
  try {
    document.execCommand('copy');
    alert('Код скопирован!');
  } catch(e) {
    alert('Не удалось скопировать код.');
  }
  document.body.removeChild(ta);
}

// ===== ИНИЦИАЛИЗАЦИЯ ПРИ ЗАГРУЗКЕ =====
console.log('=== НАЧАЛО ИНИЦИАЛИЗАЦИИ ===');
console.log('document.readyState:', document.readyState);

// Проверяем, что DOM готов
if (document.readyState === 'loading') {
  console.log('DOM ещё загружается, ждём...');
  document.addEventListener('DOMContentLoaded', function() {
    console.log('DOMContentLoaded сработал');
    initMissions();
  });
} else {
  console.log('DOM уже загружен');
  initMissions();
}

console.log('=== СКРИПТ МИССИЙ ВЫПОЛНЕН ===');
</script>[/html][hideprofile]

0

7

[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:500px;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Освещение тоннелей</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">74%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:74%;"></div></div><p>✅ При успехе: +24 XP</p><p>❌ При провале: без последствий</p><p id="timer-1785735312791" style="font-weight:bold;color:#c03028;">⏳ Ожидание...</p></div></div><script>(function() {var endTime = new Date(1785735432791);var timerEl = document.getElementById("timer-1785735312791");if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "✅ Миссия завершена! Обновите профиль.";}}, 1000);})();</script>[/html]

0

8

[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:500px;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Починка генератора</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Пикачу (Ур.1)</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">70%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:70%;"></div></div><p>✅ При успехе: +23 XP</p><p>❌ При провале: без последствий</p><p id="timer-1785735793698" style="font-weight:bold;color:#c03028;">⏳ Ожидание...</p></div></div><script>(function() {var endTime = new Date(1785735913698);var timerEl = document.getElementById("timer-1785735793698");if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;if (diff <= 0) {clearInterval(interval);timerEl.innerHTML = "✅ Миссия завершена! Обновите профиль.";}}, 1000);})();</script>[/html]

0

9

[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:500px;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Освещение тоннелей</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">74%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:74%;"></div></div><p>✅ При успехе: +24 XP</p><p>❌ При провале: без последствий</p><p id="timer-1785746580220" style="font-weight:bold;color:#c03028;">⏳ Ожидание...</p></div></div><script>(function() {var endTime = new Date(1785746700220);var timerEl = document.getElementById("timer-1785746580220");if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;if (diff <= 0) {clearInterval(interval);var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= 74;if (success) {timerEl.innerHTML = "✅ Миссия выполнена успешно! +24 XP";} else {timerEl.innerHTML = "❌ Миссия провалена! Без последствий";}}}, 1000);})();</script>[/html]

0

10

[html]<div style="background:#e3e2de;border:2px solid #676a52;border-radius:10px;padding:15px;font-family:'Book Antiqua',serif;max-width:500px;"><div style="font-weight:bold;font-size:18px;color:#39423c;">📋 Миссия: Освещение тоннелей</div><div style="margin-top:10px;color:#4d5a55;"><p>🐾 <strong>Понита</strong> отправляется на задание!</p><p>🎯 Шанс успеха: <span style="color:#2b6f2b;font-weight:bold;">74%</span></p><div style="background:#848a87;height:15px;border-radius:10px;overflow:hidden;margin:5px 0;"><div style="background:linear-gradient(90deg,#fc8181,#f6e05e,#48bb78);height:100%;width:74%;"></div></div><p>✅ При успехе: +24 XP</p><p>❌ При провале: без последствий</p><p id="timer-1785746747890" style="font-weight:bold;color:#c03028;">⏳ Ожидание...</p></div></div><script>(function() {var endTime = new Date(1785746867890);var timerEl = document.getElementById("timer-1785746747890");if (!timerEl) return;var interval = setInterval(function() {var now = new Date();var diff = Math.max(0, endTime - now);var mins = Math.floor(diff / 60000);var secs = Math.floor((diff % 60000) / 1000);timerEl.innerHTML = "⏳ Осталось: " + mins + ":" + (secs < 10 ? "0" : "") + secs;if (diff <= 0) {clearInterval(interval);var roll = Math.floor(Math.random() * 100) + 1;var success = roll <= 74;if (success) {timerEl.innerHTML = "✅ Миссия выполнена успешно! +24 XP";} else {timerEl.innerHTML = "❌ Миссия провалена! Без последствий";}}}, 1000);})();</script>[/html]

0


Вы здесь » Хранилище » Анкеты » Оформление локаций