
Селин
Сообщений 1 страница 22 из 22
Поделиться22026-05-10 18:26:44
<!----------------- хтмл в постах с допуском по группам --------------->
<!-- HTML в постах -->
<script type="text/javascript" src="https://forumstatic.ru/files/0018/25/96/94151.js"></script>
<script type="text/javascript">
HTMLinPost.groups = [1,2,3,4,5,6,7,8]; // Группы, допущенные к вставке HTML в посты
HTMLinPost.noAccess = []; // Пользователи с запретом вставки HTML в посты
HTMLinPost.parseHTMLinPosts()
</script>
Поделиться32026-05-10 18:26:59
[html]<div style="max-width:700px; margin:30px auto; border:2px solid #555; border-radius:12px; padding:24px; background:#6f3531; color:#fff; box-shadow:0 8px 25px rgba(0,0,0,0.6);">
<div style="font-size:24px; text-align:center; margin-bottom:22px; font-weight:bold; color:#ffd700;">
Калькулятор постов
</div>
<!-— Монеты на профиле -->
<div style="margin-bottom:20px; max-width:260px;">
<input type="number" id="start" placeholder="Монеты на профиле" style="width:100%; padding:11px; background:#3f1f1d; color:#fff; border:1px solid #777; border-radius:8px;">
</div>
<!-— Бонусы -->
<div style="margin-bottom:20px; background:#3f1f1d; padding:14px; border-radius:8px;">
<label style="display:block; margin-bottom:6px;"><input type="checkbox" id="epComplete"> Завершённый эпизод (+300)</label>
<label style="display:block; margin-bottom:6px;"><input type="checkbox" id="epigraph"> Эпиграф (+15)</label>
<label style="display:block;"><input type="checkbox" id="openEp"> Открытие эпизода (+15)</label>
</div>
<!-— Посты -->
<div style="margin-bottom:20px;">
<div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
<b>Пост 1</b><br>
<textarea id="p1" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
<input type="text" id="l1" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
<div style="margin-top:8px; font-size:14px;">
<label><input type="checkbox" id="d1"> x2 (в сутки)</label>
<label style="margin-left:15px;"><input type="checkbox" id="t1"> x2 (10-й пост)</label>
</div>
</div>
<div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
<b>Пост 2</b><br>
<textarea id="p2" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
<input type="text" id="l2" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
<div style="margin-top:8px; font-size:14px;">
<label><input type="checkbox" id="d2"> x2 (в сутки)</label>
<label style="margin-left:15px;"><input type="checkbox" id="t2"> x2 (10-й пост)</label>
</div>
</div>
<div style="background:#3f1f1d; padding:14px; border-radius:8px; margin-bottom:12px;">
<b>Пост 3</b><br>
<textarea id="p3" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
<input type="text" id="l3" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
<div style="margin-top:8px; font-size:14px;">
<label><input type="checkbox" id="d3"> x2 (в сутки)</label>
<label style="margin-left:15px;"><input type="checkbox" id="t3"> x2 (10-й пост)</label>
</div>
</div>
<div style="background:#3f1f1d; padding:14px; border-radius:8px;">
<b>Пост 4</b><br>
<textarea id="p4" rows="3" style="width:100%; margin:8px 0; background:#2c1614; color:white; border:1px solid #666; border-radius:6px; resize:vertical;"></textarea>
<input type="text" id="l4" placeholder="Ссылка на пост" style="width:100%; padding:8px; background:#2c1614; color:#fff; border:1px solid #666; border-radius:6px;">
<div style="margin-top:8px; font-size:14px;">
<label><input type="checkbox" id="d4"> x2 (в сутки)</label>
<label style="margin-left:15px;"><input type="checkbox" id="t4"> x2 (10-й пост)</label>
</div>
</div>
</div>
<button onclick="let s=parseInt(document.getElementById('start').value)||0; let epC=document.getElementById('epComplete').checked?300:0; let epG=document.getElementById('epigraph').checked?15:0; let openE=document.getElementById('openEp').checked?15:0; let t=0; let o=`Монет в профиле: ${s}\nЭпиграф: ${epG?'+15':'нет'}\nОткрытие эпизода: ${openE?'+15':'нет'}\nЗавершённый эпизод: ${epC?'+300':'нет'}\n\nПОСТЫ:\n`; for(let i=1;i<=4;i++){ let len=document.getElementById('p'+i).value.trim().length; let pl=document.getElementById('l'+i).value.trim(); let day=document.getElementById('d'+i).checked; let ten=document.getElementById('t'+i).checked; let c=0; if(len>0){ c=50; if(len>4000)c+=Math.floor((len-4000)/1000)*15; if(day)c*=2; if(ten)c*=2; } t+=c; o+=`Пост ${i} (${len} симв.)`; if(pl)o+=' — '+pl; if(day)o+=' • x2 сутки'; if(ten)o+=' • x2 10-й'; o+=` → ${c}\n`; } o+=`\n━━━━━━━━ ИТОГО ━━━━━━━━\nС постов: ${t}\nБонусы: +${epC+epG+openE}\nВсего: ${s+t+epC+epG+openE} монет`; document.getElementById('result').innerText=o; document.getElementById('result').style.display='block';"
style="width:100%; padding:16px; background:#8b4a46; color:white; font-weight:bold; border:none; border-radius:8px; font-size:17px; cursor:pointer;">
Посчитать всё
</button>
<div id="result" style="display:none; margin-top:24px; padding:20px; background:#3f1f1d; border-radius:8px; white-space:pre-wrap; line-height:1.6; font-size:15.2px; border:1px solid #664444;"></div>
</div>[/html]
Поделиться42026-05-14 09:57:43
[html]<!-- === MEMO 8×6 (48 карточек), серый, American Typewriter, хороший рандом === -->
<style>
.memo{
--tile:96px; --gap:12px; --radius:14px; --cols:8; /* кол-во колонок и размер ячейки */
--front:#1d1d1f; --back:#2a2a2c; --accent:#9aa0a6;
--ok:#9b9b9b; --text:#e6e6e6; --muted:#b5b5b5; --blank:#242426;
font-family:"American Typewriter","Georgia","Times New Roman",serif;
max-width:950px; margin:16px auto; padding:14px;
background:linear-gradient(180deg,#151516,#1c1c1e);
border-radius:20px; box-shadow:10 10px 28px rgba(0,0,0,.45); color:var(--text)
}
.memo h3{margin:0 0 .5rem;font-size:20px}
.memo .memo__controls{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px}
.memo .memo__btn{appearance:none;border:1px solid #3a3a3c;background:#171718;color:var(--text);padding:6px 10px;border-radius:10px;cursor:pointer;font-size:13px}
.memo .memo__btn:hover{border-color:var(--accent);box-shadow:0 0 0 2px rgba(154,160,166,.15) inset}
.memo .memo__status{font-size:13px;color:var(--muted)}
.memo .grid{display:grid;grid-template-columns:repeat(var(--cols),var(--tile));gap:var(--gap);justify-content:center}
@media (max-width:880px){.memo{--tile:86px}}
@media (max-width:760px){.memo{--cols:7;--tile:78px}}
@media (max-width:620px){.memo{--cols:6;--tile:70px}}
@media (max-width:520px){.memo{--cols:5;--tile:64px}}
.memo input[type=checkbox]{position:absolute;opacity:0;pointer-events:none}
.memo .memo-card{width:var(--tile);height:var(--tile);border-radius:var(--radius);position:relative;perspective:900px}
.memo .memo-face{position:absolute;inset:0;display:grid;place-items:center;border-radius:var(--radius);
transition:transform .5s,box-shadow .2s;backface-visibility:hidden;user-select:none}
.memo .memo-front{background:var(--front);border:1px solid #2c2c2e;box-shadow:inset 0 0 0 1px rgba(255,255,255,.03)}
.memo .memo-back{background:var(--back);border:1px dashed rgba(255,255,255,.12);transform:rotateY(180deg);
font-size:28px; letter-spacing:.6px}
.memo input:checked + label .memo-front{transform:rotateY(180deg)}
.memo input:checked + label .memo-back{transform:rotateY(360deg)}
.memo label{display:block;width:100%;height:100%;cursor:pointer;outline:none}
.memo label:focus-visible .memo-front{box-shadow:0 0 0 3px rgba(154,160,166,.35)}
.memo label:hover .memo-front{box-shadow:0 0 0 2px rgba(154,160,166,.18) inset}
/* Цифры/иконки на обороте из data-symbol */
.memo label .memo-back::before{content:attr(data-symbol); transform:translateY(-1px)}
/* Зафиксированная пара */
.memo label[data-locked]{pointer-events:none}
.memo label[data-locked] .memo-back{
box-shadow:0 0 0 2px rgba(155,155,155,.35) inset, 0 6px 14px rgba(0,0,0,.25);
border-color:rgba(200,200,200,.4)
}
</style>
<div class="memo" id="memo48">
<form>
<h3>MEMO — найди пары</h3>
<div class="memo__controls">
<small>Открывай по две карточки</small>
<div class="memo__status">Найдено: <b class="memo__found">0</b> / 24</div>
<button class="memo__btn" type="reset">СБРОС</button>
</div>
<div class="grid" id="memo-grid"></div>
</form>
</div>
<script>
(() => {
const root = document.getElementById('memo48');
if (!root) return;
const grid = root.querySelector('#memo-grid');
const form = root.querySelector('form');
const foundEl = root.querySelector('.memo__found');
const TOTAL = 24; // число пар
const symbols = Array.from({length: TOTAL}, (_,i) => String(i+1).padStart(2,'0'));
let opened = [];
let lock = false;
let found = 0;
// криптографически стойкий (при наличии) Фишер–Йетс
function rndInt(max){
if (window.crypto && crypto.getRandomValues){
const buf = new Uint32Array(1);
crypto.getRandomValues(buf);
return buf[0] % max;
}
return Math.floor(Math.random() * max);
}
function shuffle(arr){
for (let m = arr.length; m; ){
const i = rndInt(m--);
[arr[m], arr[i]] = [arr[i], arr[m]];
}
return arr;
}
function buildDeck(){
grid.innerHTML = '';
const deck = shuffle(symbols.concat(symbols)); // дублируем и мешаем
deck.forEach((sym, idx) => {
const card = document.createElement('div'); card.className = 'memo-card';
const input = document.createElement('input'); input.type='checkbox'; input.id = `mc${idx}`;
const label = document.createElement('label'); label.setAttribute('for', input.id);
const front = document.createElement('span'); front.className = 'memo-face memo-front';
const back = document.createElement('span'); back.className = 'memo-face memo-back'; back.dataset.symbol = sym;
label.append(front, back); card.append(input, label); grid.append(card);
});
// сброс внутренних состояний
opened = [];
lock = false;
found = 0;
foundEl.textContent = '0';
}
function getSymbol(input){
return input.nextElementSibling.querySelector('.memo-back').dataset.symbol;
}
function lockPair(a,b){
a.nextElementSibling.dataset.locked = '1';
b.nextElementSibling.dataset.locked = '1';
}
root.addEventListener('change', (e) => {
const input = e.target;
if (input.tagName !== 'INPUT') return;
if (input.nextElementSibling.dataset.locked){ input.checked = true; return; }
if (lock && input.checked){ input.checked = false; return; }
if (input.checked){
opened.push(input);
if (opened.length === 2){
lock = true;
const [a,b] = opened;
const sa = getSymbol(a), sb = getSymbol(b);
if (sa === sb){
lockPair(a,b);
found++;
foundEl.textContent = String(found);
opened = [];
lock = false;
} else {
const toClose = opened.slice();
opened = [];
setTimeout(() => {
toClose.forEach(inp => inp.checked = false);
lock = false;
}, 700);
}
}
} else {
opened = opened.filter(x => x !== input);
}
});
form.addEventListener('reset', () => {
setTimeout(buildDeck, 0); // при сбросе — новая случайная раскладка
});
buildDeck(); // старт
})();
</script>[/html]
[hideprofile]
Поделиться52026-05-14 16:25:46
— СТО ВОСЕМЬДЕСЯТ ШЕСТАЯ НЕДЕЛЯ — Сто восемьдесят шестая неделя нашей телестройки, друзья, мы еще живы, веселы и готовы к новому! Начать хочу с восхищения @Atticus Goyle, @Abraxas Malfoy и @Thomas Miller: свидетели Мерлина дописаны и выложены для глаз публики! Они (свидетели) ждут, когда их будут активно играть, вообще-то! Матчасть получилась подробной, интересной и заслуживающей внимания. В самом деле, сколько ее ждали! На проекте ряд новшеств, которые никто не просил, но получите: облегчили поход в банк, теперь у нас есть свой калькулятор, который сам считает ваши символы и конвертирует их в монеты, более того, подтягивает ссылки, вам остается только скопировать bb-код нажав на кнопку revelio. Важное замечание: система не считает х2 за отпись поста в течении суток, каждый 10й пост, открытие/закрытие эпизода, эпиграф, это вы можете посчитать в ручную, но так как я об этом пишу, значит вопрос уже взят в работу) Так же на главной странице появилась легкая мини-игра с письмами! Нажимайте на конвертик в правом нижнем углу экрана, ловите письма и на каждом 20 письме получайте предсказание, а так же устанавливайте рекорд по форуму, пока рекорд принадлежит @ Charlotte Bott! Она собрала больше ЧЕТЫРЕХ ТЫСЯЧ писем, с ума сойти. Остановить игру можно просто обновив страницу) Продолжаем собирать пазлы и получать монеты. Так же готовится ивент для постописцев, разминаем пальцы и готовимся писать! В последнее время на форуме упало количество пользователей в сутки, мы видим это, стараемся делать всем составом амс все, что от нас зависит, поэтому надеемся, что вы тоже отнесетесь лояльно: будете писать во флуд, посты, а так же не будете забывать выгуливать своих твинков. Было бы еще чудеснее, если бы вы приглашали своих игроков к нам, мы всем рады) Особенно прошу зайти в "омут памяти" и посмотреть свои эпизоды, которые больше играться не будут. Можете написать мне в лс о переносе, можете в вопросы и предложения, как пожелаете) Если у вас есть идеи, чтобы вы хотели видеть на форуме, на что стоит обратить внимание, вы можете так же прийти в лс ко мне, к @Atticus Goyle или написать в тему Что у нас в квестах? Родные, я сидела в кустах двое суток, чтобы собрать комментарии наших волшебников и колдунов о событиях в Малфой-Мэноре Первый мне попался молодой аврор по имени Джеймс Поттер. Нашу программу интересовало нравится ли молодому поколению работать в Аврорате? Конечно, мы не пальцем деланы, друзья, и спросили о событиях в меноре. Вот что говорит @James Potter :
Что имел ввиду Джеймс говоря о своей жене, мы не знаем, но похоже ему не поможет даже самая скоростная метла, чтобы уклониться от этих вопросов! Так же под внимание моего взгляда и моего микрофона попал несравненный красавчик (Он буквально Ален Делон, ок?) консультант-судмедэксперт Герхард Тодд. И несмотря на то как он уклонялся от тысячи вопросов, ускорял шаг, я все равно добилась от него ответа, жалко, что не адреса для совы. Так вот @Gerhard Todd сообщает про обыск:
Глава департамента обеспечения магической безопасности - @Renard R. Rosier, наследник богатейшего рода @Lucius Malfoy и юный стажер @Sirius Black отказались давать комментарии. И последний, но не по значимости, Абраксас Малфой! Выловить такую крупную рыбу, знаете непросто, но у меня свои наживки, иногда родство помогает, так вот, его мнение по теме: @Abraxas Malfoy
[indent] |
— АКТИВИСТЫ — | — ПОСТОПИСЦЫ — |
— П О С Т Н Е Д Е Л И — | ||
— Э П И З О Д Н Е Д Е Л И — |
[sign] [/sign]
Поделиться62026-05-14 16:28:25
[html]<style>
/* Красивый фон для всех аудиоплееров */
audio {
background: #dcdcd2 !important;
border: 2px solid #b8b8b0 !important;
border-radius: 10px !important;
width: 100% !important;
max-width: 520px !important;
margin: 8px 0 !important;
padding: 2px !important;
}
audio::-webkit-media-controls-panel,
.mejs-container .mejs-controls {
background: #dcdcd2 !important;
}
audio::-webkit-media-controls-timeline {
background: #c4c4bc !important;
}
</style>[/html]
Поделиться72026-05-14 16:29:24

<div style="background:#dcdcd2; padding:12px; border-radius:12px; display:inline-block; max-width:520px; border:2px solid #b8b8b0;">
<audio controls src="https://videotourl.com/audio/1778759825174-453b8e9a-ea04-4186-9163-df77790254c5.ogg" preload="none" style="width:100%; min-width:380px;">
Загруженное mp3
</audio>
</div>
Поделиться82026-05-14 16:29:34
[html]
<div style="background:#dcdcd2; padding:12px; border-radius:12px; display:inline-block; max-width:520px; border:2px solid #b8b8b0;">
<audio controls src="https://videotourl.com/audio/1778759825174-453b8e9a-ea04-4186-9163-df77790254c5.ogg" preload="none" style="width:100%; min-width:380px;">
Загруженное mp3
</audio>
</div>
[/html]
Поделиться92026-05-14 18:38:31
[removeprofile]
[html]
<style>
.memo{
--tile:98px;
--gap:14px;
--radius:16px;
--cols:8;
--main: #763c38;
--secondary: #918f82;
--front: #5c2f2a;
--back: #918f82;
--accent: #763c38;
--ok: #c4a38a;
--text: #f5e9d8;
--muted: #d4c4b0;
font-family: "American Typewriter", "Georgia", "Times New Roman", serif;
max-width: 1000px;
margin: 20px auto;
padding: 18px;
background: linear-gradient(180deg, #3f2a26, #52423d);
border-radius: 24px;
box-shadow: 0 12px 32px rgba(0,0,0,.55);
color: var(--text);
}
.memo h3{margin:0 0 .6rem; font-size:22px; color:var(--text)}
.memo .memo__controls{display:flex;justify-content:space-between;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.memo .memo__btn{
appearance:none;
border:1px solid #a16e64;
background:#3f2a26;
color:var(--text);
padding:7px 12px;
border-radius:12px;
cursor:pointer;
font-size:13.5px;
}
.memo .memo__btn:hover{
border-color:var(--accent);
box-shadow:0 0 0 3px rgba(118,60,56,.3) inset;
}
.memo .memo__status{font-size:14px;color:var(--muted)}
.memo .grid{
display:grid;
grid-template-columns:repeat(var(--cols),var(--tile));
gap:var(--gap);
justify-content:center;
}
/* Адаптив */
@media (max-width:920px){.memo{--tile:88px}}
@media (max-width:780px){.memo{--cols:7;--tile:82px}}
@media (max-width:680px){.memo{--cols:6;--tile:76px}}
@media (max-width:560px){.memo{--cols:5;--tile:68px}}
.memo input[type=checkbox]{position:absolute;opacity:0;pointer-events:none}
.memo .memo-card{width:var(--tile);height:var(--tile);border-radius:var(--radius);position:relative;perspective:1000px}
.memo .memo-face{
position:absolute; inset:0; border-radius:var(--radius);
transition:transform .55s cubic-bezier(0.23,1,0.32,1);
backface-visibility:hidden;
display:grid; place-items:center;
user-select:none;
box-shadow: inset 0 0 0 1px rgba(0,0,0,.4);
}
.memo .memo-front{
background:var(--front);
border:2px solid #8a5a52;
}
.memo .memo-back{
background:var(--back);
border:2px solid var(--main);
transform:rotateY(180deg);
overflow:hidden;
}
.memo .memo-back img{
width:100%; height:100%; object-fit:cover;
}
.memo input:checked + label .memo-front{transform:rotateY(180deg)}
.memo input:checked + label .memo-back{transform:rotateY(360deg)}
.memo label{display:block;width:100%;height:100%;cursor:pointer}
.memo label:focus-visible .memo-front{box-shadow:0 0 0 4px rgba(118,60,56,.6)}
.memo label:hover .memo-front{box-shadow:0 0 0 3px rgba(118,60,56,.35) inset}
.memo label[data-locked]{pointer-events:none}
.memo label[data-locked] .memo-back{
box-shadow:0 0 0 3px rgba(196,163,138,.7) inset;
filter: brightness(1.1);
}
</style>
<div class="memo" id="memo40">
<form>
<h3>MEMO — найди пары</h3>
<div class="memo__controls">
<small>Открывай по две карточки</small>
<div class="memo__status">Найдено: <b class="memo__found">0</b> / 20</div>
<button class="memo__btn" type="reset">НОВАЯ ИГРА</button>
</div>
<div class="grid" id="memo-grid"></div>
</form>
</div>
<script>
(() => {
const root = document.getElementById('memo40');
if (!root) return;
const grid = root.querySelector('#memo-grid');
const foundEl = root.querySelector('.memo__found');
const imageUrls = [
"https://upforme.ru/uploads/001c/a5/42/2/928103.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/796942.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/920791.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/210253.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/539522.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/570476.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/142848.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/792870.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/364056.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/940122.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/216561.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/193804.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/313646.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/539420.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/498050.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/805098.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/84622.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/958212.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/592960.jpg",
"https://upforme.ru/uploads/001c/a5/42/2/387049.jpg"
];
let opened = [];
let lock = false;
let found = 0;
function rndInt(max) {
if (window.crypto?.getRandomValues) {
const buf = new Uint32Array(1);
crypto.getRandomValues(buf);
return buf[0] % max;
}
return Math.floor(Math.random() * max);
}
function shuffle(arr) {
for (let m = arr.length; m; ) {
const i = rndInt(m--);
[arr[m], arr[i]] = [arr[i], arr[m]];
}
return arr;
}
function buildDeck() {
grid.innerHTML = '';
const deck = shuffle([...imageUrls, ...imageUrls]);
deck.forEach((imgUrl, idx) => {
const card = document.createElement('div'); card.className = 'memo-card';
const input = document.createElement('input'); input.type='checkbox'; input.id = `mc${idx}`;
const label = document.createElement('label'); label.setAttribute('for', input.id);
const front = document.createElement('span'); front.className = 'memo-face memo-front';
const back = document.createElement('span'); back.className = 'memo-face memo-back';
const img = document.createElement('img');
img.src = imgUrl;
img.alt = '';
back.appendChild(img);
label.append(front, back);
card.append(input, label);
grid.appendChild(card);
});
opened = []; lock = false; found = 0;
foundEl.textContent = '0';
}
root.addEventListener('change', (e) => {
const input = e.target;
if (input.tagName !== 'INPUT') return;
if (input.nextElementSibling.dataset.locked) { input.checked = true; return; }
if (lock && input.checked) { input.checked = false; return; }
if (input.checked) {
opened.push(input);
if (opened.length === 2) {
lock = true;
const [a, b] = opened;
const imgA = a.nextElementSibling.querySelector('img').src;
const imgB = b.nextElementSibling.querySelector('img').src;
if (imgA === imgB) {
a.nextElementSibling.dataset.locked = '1';
b.nextElementSibling.dataset.locked = '1';
found++;
foundEl.textContent = found;
opened = [];
lock = false;
} else {
const toClose = opened.slice();
opened = [];
setTimeout(() => {
toClose.forEach(inp => inp.checked = false);
lock = false;
}, 800);
}
}
} else {
opened = opened.filter(x => x !== input);
}
});
root.querySelector('form').addEventListener('reset', () => setTimeout(buildDeck, 10));
buildDeck();
})();
</script>[/html]
Поделиться102026-06-30 18:05:35
В ОЖИДАНИИ ДОЖДЯ [ПАЗЛЫ]
тебе скучно? одиноко? нечем заняться? позвони по но... собери с нами пазлы, малыш
» вашему вниманию представлены три сгенерированные с ai пазла: простой, средний и посложнее.
» за сбор пазлов вы получите 100 монеток за простой, 200 за средний, 300 за сложный;
» присылайте скрины собранных пазлов в данную тему;
» пазлы будут ждать вас здесь весь месяц, до 25 июля до появления новых пазлов;
Если есть желание увидеть в пазлах свой эпизод/сюжет, вы знаете куда писать
[spoiler="лёгкий пазл"]*скриншот*[/spoiler] [spoiler="чуть-чуть сложнее"]*скриншот*[/spoiler] [spoiler="сложный пазл"]*скриншот*[/spoiler]
Поделиться112026-06-30 18:05:48
меме
меме
Отредактировано morsmordre (2026-06-30 18:05:52)
Поделиться122026-06-30 18:05:57
меме
Поделиться132026-07-01 22:16:02
меме
прикол
Поделиться142026-07-05 03:58:20
меме
прикол
Поделиться152026-07-05 03:58:29
прикол
ккк
Поделиться162026-07-05 05:01:34
прикол
ккк
в
Поделиться172026-07-05 05:02:29
ккк
апама
Поделиться182026-07-05 05:04:17
ккк
апама
апама
ааааааа
Поделиться192026-07-05 05:04:33
меме
ааааааааааааааа
Поделиться202026-07-05 05:05:40
меме
аааааааааааааааmorsmordre,
ааааааааааааааа
Поделиться212026-07-05 22:29:58
[html]<div class="wheel-container">
<h2>Дискуссионное колесо для флуд-клеток</h2>
<div class="wheel-wrapper">
<div class="wheel" id="wheel">
<div class="stars" id="stars"></div>
<div class="constellations" id="constellations"></div>
</div>
<div class="pointer" id="pointer"></div>
</div>
<button class="spin-btn" id="spinBtn">КРУТИТЬ</button>
<div class="result-tablet" id="result">
<p class="result-text" id="questionText">Нажми «КРУТИТЬ», чтобы получить вопрос</p>
</div>
</div>
<style>
.wheel-container {
max-width: 520px;
margin: 25px auto;
text-align: center;
font-family: "Georgia", serif;
color: #dddcd2;
}
h2 {
color: #743c37;
margin-bottom: 20px;
font-size: 27px;
letter-spacing: 1px;
}
.wheel-wrapper {
position: relative;
width: 350px;
height: 350px;
margin: 0 auto 25px;
}
.wheel {
width: 100%;
height: 100%;
border-radius: 50%;
border: 16px solid #1f2126;
box-shadow: 0 0 45px rgba(0,0,0,0.9),
inset 0 0 40px rgba(116, 60, 55, 0.3),
0 0 70px rgba(15, 18, 32, 0.85);
position: relative;
overflow: hidden;
background: #0b0d12;
transition: transform 5.4s cubic-bezier(0.33, 0.01, 0.18, 1);
}
.stars {
position: absolute;
inset: 0;
border-radius: 50%;
}
.star {
position: absolute;
background: #fff;
border-radius: 50%;
box-shadow: 0 0 5px #fff;
animation: twinkle 4s infinite alternate ease-in-out;
}
@keyframes twinkle {
0% { opacity: 0.45; transform: scale(0.9); }
100% { opacity: 1; transform: scale(1.2); }
}
.constellations {
position: absolute;
inset: 0;
border-radius: 50%;
}
.constellation-line {
position: absolute;
height: 1.5px;
background: linear-gradient(90deg, transparent, rgba(225, 215, 190, 0.4), transparent);
}
.pointer {
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
width: 0; height: 0;
border-left: 24px solid transparent;
border-right: 24px solid transparent;
border-bottom: 48px solid #743c37;
z-index: 10;
filter: drop-shadow(0 6px 10px rgba(0,0,0,0.85));
}
.result-tablet {
background: #1c1f26;
border: 6px solid #743c37;
border-radius: 12px;
padding: 28px 35px;
min-height: 145px;
box-shadow: 0 10px 30px rgba(0,0,0,0.75);
margin: 0 15px;
opacity: 0;
transform: translateY(15px);
transition: all 0.7s ease;
}
.result-tablet.show {
opacity: 1;
transform: translateY(0);
}
.result-text {
font-size: 19px;
line-height: 1.5;
color: #dddcd2;
}
.spin-btn {
margin: 20px 0 10px;
padding: 14px 42px;
font-size: 18px;
font-weight: bold;
background: #1f2126;
color: #dddcd2;
border: 2px solid #4a3f3c;
border-radius: 50px;
cursor: pointer;
box-shadow: 0 6px 18px rgba(0,0,0,0.6);
transition: all 0.25s ease;
}
.spin-btn:hover {
background: #2a2d34;
border-color: #743c37;
transform: translateY(-3px);
}
.spin-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>
<script>
const questions = [
"1. Как произошел выбор персонажа за которого вы сейчас играете? Доп.вопросы: важно ли вам, чтобы он был прописан в каноне и проработан автором или проще беретесь продумывать историю персонажа с нуля?",
"2. Что объединяет всех ваших персонажей? Есть ли какие-то общие черты между ними, детали. Сделано это специально или просто так написалось?",
"3. А что вашего персонажа объединяет с вами? Есть ли общие черты характера, особености поведения, что-то из истории самого персонажа? Добавляете ли вы себя в своего персонажа намеренно или пишите максимально противоположный от себя образ?",
"4. Если взять всех персонажей, которых ты играл(а) есть ли у них всех общие черты, способности, детали личности?",
"5. Ролевые/писательские табу? Что это за зверь и с чем его едят? Что вам не нравится отыгрывать, какие сцены, персонажей или сюжеты вызывают отторжение. Что может отталкивать в персонаже другого человека? Про что вы точно можете сказать: Это не мое",
"6. Юмор в тексте - уместно или нелепо? Как часто мы сталкиваемся с тем, что у людей просто разное чувство юмора: не плохое, просто разное. Как вы реагируете на юмор в постах/текстах и шутите ли от лица персонажа?",
"7. Дисциплина или вдохновение? Что движет вами при отписи постов?",
"8. Напоминание о посте. Является ли для вас нормальным напоминать соигроку о постовом долге или вы предпочитаете просто ждать? Какой максимум у вас случался и в ожидании и в отписи?",
"9. Пишите вы посты в тишине или под музыку? Если пишите под музыку, поделитесь с нами списком любимых треков! Чем больше песен тем лучше!",
"10. Играете ли вы одновременно двух-трех-четырех разных персонажей? Меняется ли от этого ваш стиль, настроение, ритм поста? Сложно ли переключаться между персонажами? Как быть в том настроении чтобы писать сейчас за одного, через три часа за совершенно другого персонажа? Насколько легко держать разные образы в голове?",
"11. Второстепенные персонажи - продумываете ли вы их, используете ли постоянно одних или в каждой сцене новые? Считаете ли вы, что прописывать второстепенных персонажей - это лишний текст? Поделитесь, что для вас хороший второстепенный со своим голосом, а что для вас плохой второстепенный?",
"12. Имеет ли размер поста значение для вас? Что для вас хороший пост? С какого размера в словах/символах вы начинали и сколько пишете сейчас?",
"13. Как вы считаете, вы пишите сейчас лучше, чем год-два назад или нет? По каким признакам понимаете что текст хорош?",
"14. Расскажи кринжовую историю с ролевых, не важны сроки давности, лишь бы был чистый и отборный кринж",
"15. Как возвращать вдохновение на игру? Что если в один момент вообще не хочется ничего писать и только лежать? Поделись своими мыслями, бывало ли у тебя такое и как ты справляешься",
"16. Какую музыку бы слушал твой персонаж в 2026 году? Накинь треков",
"17. Выбери несколько персонажей с форума и напиши ассоциации: погода, заклинание, песня, цвет, блюдо, животное, время суток, запах, можешь придумать свои ассоциации дополнительно",
"18. Играли ли вы когда-нибудь свою профессию? А видели, как кто-то играет? Как вам это действо? Считаете ли вы наличие работы у персонажа важным?",
"19. Продумывание персонажа - с чего вы начинаете? Что делаете в первую очередь: придумыватее имя, выбираете внешность или придумываете историю? Какие детали для вас важны, а какие вы не прописываете, но, может, держите в голове? Продумываете ли вы персонажа от трусов до вкусовых предпочтений или считаете это лишним?",
"20. Что такое ролевой этикет? Понятие-то существует, но каждый как будто читал разный ролевой кодекс чести. Что это для вас? В чем этот ролевой этикет проявляется, какие негласные правила сущестуют. Каким вы следуете, а каким нет?",
"21. Случалось ли вам перенимать настроение персонажа? Становилось обидно при отыгрыше конфликта, грустно/радостно и тд. Считаете ли это слиянием или нормальной реакцией?",
"22. Внутренние монологи, воспоминания, сны - какой процент ваших постов, на ваш взгляд, посвящен взаимодействию персонажа с миром/с персонажем соигрока, а какой с внутренним миром? Считаете ли вы важным эту часть или предпочитаете не писать ее?",
"23. Реткон - да или нет? Что это египетская казнь или египетская сила? Лучше откатать сцену или просто смириться?",
"24. Ваш идеальный пост. О чем он был, какой он, был ли он вообще? А цитаты из него будут?",
"25. Внутренний критик - друг или пиздец? Есть ли он у вас, как справляетесь - если да, лайфхаки по отключению говорящей головы внутри головы.",
"26. Стиль для меня - это? Есть ли признаки этого хорошего и плохого стиля? Что вас вдохновляет в чужих текстах, что хотели бы позаимствовать себе? Вообще цепляли ли что-то у других соигроков, что именно и говорили ли об этом?",
"27. Какая графа в анкете вызывает мигрень, а какую готовы расписывать страницами?",
"28. Анкета - большая или маленькая? Что для вас важно указать в анкете и что важно прочесть в других анкетах? Читаете ли вы вообще анкеты других игроков и опираетесь ли на них?",
"29. Токсичные привычки. Есть ли у вас вредные писательные привычки? Например: длинные диалоги или много реплик, слишком длинные абзацы с мыслями и тд."
];
let isSpinning = false;
let spinsToday = 0;
let lastSpinDate = '';
const STORAGE_KEY = 'wheel_spins';
const MAX_SPINS = 3;
function createStars() {
const container = document.getElementById('stars');
container.innerHTML = '';
for (let i = 0; i < 160; i++) {
const star = document.createElement('div');
star.className = 'star';
const size = Math.random() * 3 + 1;
star.style.width = `${size}px`;
star.style.height = `${size}px`;
star.style.left = `${Math.random() * 100}%`;
star.style.top = `${Math.random() * 100}%`;
star.style.animationDelay = `-${Math.random() * 4}s`;
container.appendChild(star);
}
}
function createConstellations() {
const container = document.getElementById('constellations');
container.innerHTML = '';
const lines = [
{x1:32, y1:25, x2:47, y2:20}, {x1:47, y1:20, x2:65, y2:33},
{x1:25, y1:52, x2:40, y2:68}, {x1:40, y1:68, x2:58, y2:55},
{x1:70, y1:42, x2:85, y2:37}, {x1:72, y1:70, x2:88, y2:63}
];
lines.forEach(line => {
const el = document.createElement('div');
el.className = 'constellation-line';
const dx = line.x2 - line.x1;
const dy = line.y2 - line.y1;
const length = Math.sqrt(dx*dx + dy*dy);
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
el.style.left = `${line.x1}%`;
el.style.top = `${line.y1}%`;
el.style.width = `${length}%`;
el.style.transform = `rotate(${angle}deg)`;
container.appendChild(el);
});
}
function loadSpinData() {
const data = localStorage.getItem(STORAGE_KEY);
if (data) {
const parsed = JSON.parse(data);
lastSpinDate = parsed.date || '';
spinsToday = parsed.count || 0;
}
}
function saveSpinData() {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
date: lastSpinDate,
count: spinsToday
}));
}
function checkDailyReset() {
const today = new Date().toISOString().split('T')[0];
if (today !== lastSpinDate) {
lastSpinDate = today;
spinsToday = 0;
saveSpinData();
}
}
function updateButtonState() {
const spinBtn = document.getElementById('spinBtn');
if (spinsToday >= MAX_SPINS) {
spinBtn.disabled = true;
spinBtn.textContent = `КРУТИТЬ (3/3) — завтра`;
} else {
spinBtn.disabled = false;
spinBtn.textContent = `КРУТИТЬ (${spinsToday}/${MAX_SPINS})`;
}
}
function spinWheel() {
if (isSpinning) return;
checkDailyReset();
if (spinsToday >= MAX_SPINS) {
const resultText = document.getElementById('questionText');
const resultTablet = document.getElementById('result');
resultTablet.classList.add('show');
resultText.textContent = `Вы уже использовали все 3 попытки сегодня. Возвращайтесь завтра! 🌙`;
return;
}
isSpinning = true;
const spinBtn = document.getElementById('spinBtn');
const wheel = document.getElementById('wheel');
const resultText = document.getElementById('questionText');
const resultTablet = document.getElementById('result');
spinBtn.disabled = true;
resultTablet.classList.remove('show');
resultText.textContent = "Крутится...";
spinsToday++;
saveSpinData();
updateButtonState();
const randomSegment = Math.floor(Math.random() * questions.length);
const minSpins = 6;
const extraSpins = Math.random() * 5 + 4;
const baseRotation = (minSpins + extraSpins) * 360;
const segmentAngle = 360 / questions.length;
const finalRotation = baseRotation + (randomSegment * segmentAngle) + (segmentAngle / 2);
wheel.style.transition = 'transform 5.4s cubic-bezier(0.33, 0.01, 0.18, 1)';
wheel.style.transform = `rotate(-${finalRotation}deg)`;
setTimeout(() => {
resultText.textContent = questions[randomSegment];
resultTablet.classList.add('show');
wheel.style.transition = 'transform 0.45s ease';
wheel.style.transform = `rotate(-${finalRotation - 8}deg)`;
setTimeout(() => {
wheel.style.transition = 'transform 0.65s ease';
wheel.style.transform = `rotate(-${finalRotation}deg)`;
}, 150);
isSpinning = false;
updateButtonState();
}, 5500);
}
createStars();
createConstellations();
loadSpinData();
checkDailyReset();
updateButtonState();
document.getElementById('spinBtn').addEventListener('click', spinWheel);
</script>[/html]
Поделиться222026-07-05 22:30:21
[html]<div class="wheel-container">
<h2>Дискуссионное колесо для флуд-клеток</h2>
<div class="wheel-wrapper">
<div class="wheel" id="wheel">
<div class="stars" id="stars"></div>
<div class="constellations" id="constellations"></div>
</div>
<div class="pointer" id="pointer"></div>
</div>
<button class="spin-btn" id="spinBtn">КРУТИТЬ</button>
<div class="result-tablet" id="result">
<p class="result-text" id="questionText">Нажми «КРУТИТЬ», чтобы получить вопрос</p>
</div>
</div>
<style>
.wheel-container {
max-width: 520px;
margin: 25px auto;
text-align: center;
font-family: "Georgia", serif;
color: #dddcd2;
}
h2 {
color: #743c37;
margin-bottom: 20px;
font-size: 27px;
letter-spacing: 1px;
}
.wheel-wrapper {
position: relative;
width: 350px;
height: 350px;
margin: 0 auto 25px;
}
.wheel {
width: 100%;
height: 100%;
border-radius: 50%;
border: 16px solid #1f2126;
box-shadow: 0 0 45px rgba(0,0,0,0.9),
inset 0 0 40px rgba(116, 60, 55, 0.3),
0 0 70px rgba(15, 18, 32, 0.85);
position: relative;
overflow: hidden;
background: #0b0d12;
transition: transform 5.4s cubic-bezier(0.33, 0.01, 0.18, 1);
}
.stars {
position: absolute;
inset: 0;
border-radius: 50%;
}
.star {
position: absolute;
background: #fff;
border-radius: 50%;
box-shadow: 0 0 5px #fff;
animation: twinkle 4s infinite alternate ease-in-out;
}
@keyframes twinkle {
0% { opacity: 0.45; transform: scale(0.9); }
100% { opacity: 1; transform: scale(1.2); }
}
.constellations {
position: absolute;
inset: 0;
border-radius: 50%;
}
.constellation-line {
position: absolute;
height: 1.5px;
background: linear-gradient(90deg, transparent, rgba(225, 215, 190, 0.4), transparent);
}
.pointer {
position: absolute;
top: -10px;
left: 50%;
transform: translateX(-50%);
width: 0; height: 0;
border-left: 24px solid transparent;
border-right: 24px solid transparent;
border-bottom: 48px solid #743c37;
z-index: 10;
filter: drop-shadow(0 6px 10px rgba(0,0,0,0.85));
}
.result-tablet {
background: #1c1f26;
border: 6px solid #743c37;
border-radius: 12px;
padding: 28px 35px;
min-height: 145px;
box-shadow: 0 10px 30px rgba(0,0,0,0.75);
margin: 0 15px;
opacity: 0;
transform: translateY(15px);
transition: all 0.7s ease;
}
.result-tablet.show {
opacity: 1;
transform: translateY(0);
}
.result-text {
font-size: 19px;
line-height: 1.5;
color: #dddcd2;
}
.spin-btn {
margin: 20px 0 10px;
padding: 14px 42px;
font-size: 18px;
font-weight: bold;
background: #1f2126;
color: #dddcd2;
border: 2px solid #4a3f3c;
border-radius: 50px;
cursor: pointer;
box-shadow: 0 6px 18px rgba(0,0,0,0.6);
transition: all 0.25s ease;
}
.spin-btn:hover {
background: #2a2d34;
border-color: #743c37;
transform: translateY(-3px);
}
.spin-btn:disabled {
opacity: 0.5;
cursor: not-allowed;
}
</style>
<script>
const questions = [
"1. Как произошел выбор персонажа за которого вы сейчас играете? Доп.вопросы: важно ли вам, чтобы он был прописан в каноне и проработан автором или проще беретесь продумывать историю персонажа с нуля?",
"2. Что объединяет всех ваших персонажей? Есть ли какие-то общие черты между ними, детали. Сделано это специально или просто так написалось?",
"3. А что вашего персонажа объединяет с вами? Есть ли общие черты характера, особености поведения, что-то из истории самого персонажа? Добавляете ли вы себя в своего персонажа намеренно или пишите максимально противоположный от себя образ?",
"4. Если взять всех персонажей, которых ты играл(а) есть ли у них всех общие черты, способности, детали личности?",
"5. Ролевые/писательские табу? Что это за зверь и с чем его едят? Что вам не нравится отыгрывать, какие сцены, персонажей или сюжеты вызывают отторжение. Что может отталкивать в персонаже другого человека? Про что вы точно можете сказать: Это не мое",
"6. Юмор в тексте - уместно или нелепо? Как часто мы сталкиваемся с тем, что у людей просто разное чувство юмора: не плохое, просто разное. Как вы реагируете на юмор в постах/текстах и шутите ли от лица персонажа?",
"7. Дисциплина или вдохновение? Что движет вами при отписи постов?",
"8. Напоминание о посте. Является ли для вас нормальным напоминать соигроку о постовом долге или вы предпочитаете просто ждать? Какой максимум у вас случался и в ожидании и в отписи?",
"9. Пишите вы посты в тишине или под музыку? Если пишите под музыку, поделитесь с нами списком любимых треков! Чем больше песен тем лучше!",
"10. Играете ли вы одновременно двух-трех-четырех разных персонажей? Меняется ли от этого ваш стиль, настроение, ритм поста? Сложно ли переключаться между персонажами? Как быть в том настроении чтобы писать сейчас за одного, через три часа за совершенно другого персонажа? Насколько легко держать разные образы в голове?",
"11. Второстепенные персонажи - продумываете ли вы их, используете ли постоянно одних или в каждой сцене новые? Считаете ли вы, что прописывать второстепенных персонажей - это лишний текст? Поделитесь, что для вас хороший второстепенный со своим голосом, а что для вас плохой второстепенный?",
"12. Имеет ли размер поста значение для вас? Что для вас хороший пост? С какого размера в словах/символах вы начинали и сколько пишете сейчас?",
"13. Как вы считаете, вы пишите сейчас лучше, чем год-два назад или нет? По каким признакам понимаете что текст хорош?",
"14. Расскажи кринжовую историю с ролевых, не важны сроки давности, лишь бы был чистый и отборный кринж",
"15. Как возвращать вдохновение на игру? Что если в один момент вообще не хочется ничего писать и только лежать? Поделись своими мыслями, бывало ли у тебя такое и как ты справляешься",
"16. Какую музыку бы слушал твой персонаж в 2026 году? Накинь треков",
"17. Выбери несколько персонажей с форума и напиши ассоциации: погода, заклинание, песня, цвет, блюдо, животное, время суток, запах, можешь придумать свои ассоциации дополнительно",
"18. Играли ли вы когда-нибудь свою профессию? А видели, как кто-то играет? Как вам это действо? Считаете ли вы наличие работы у персонажа важным?",
"19. Продумывание персонажа - с чего вы начинаете? Что делаете в первую очередь: придумыватее имя, выбираете внешность или придумываете историю? Какие детали для вас важны, а какие вы не прописываете, но, может, держите в голове? Продумываете ли вы персонажа от трусов до вкусовых предпочтений или считаете это лишним?",
"20. Что такое ролевой этикет? Понятие-то существует, но каждый как будто читал разный ролевой кодекс чести. Что это для вас? В чем этот ролевой этикет проявляется, какие негласные правила сущестуют. Каким вы следуете, а каким нет?",
"21. Случалось ли вам перенимать настроение персонажа? Становилось обидно при отыгрыше конфликта, грустно/радостно и тд. Считаете ли это слиянием или нормальной реакцией?",
"22. Внутренние монологи, воспоминания, сны - какой процент ваших постов, на ваш взгляд, посвящен взаимодействию персонажа с миром/с персонажем соигрока, а какой с внутренним миром? Считаете ли вы важным эту часть или предпочитаете не писать ее?",
"23. Реткон - да или нет? Что это египетская казнь или египетская сила? Лучше откатать сцену или просто смириться?",
"24. Ваш идеальный пост. О чем он был, какой он, был ли он вообще? А цитаты из него будут?",
"25. Внутренний критик - друг или пиздец? Есть ли он у вас, как справляетесь - если да, лайфхаки по отключению говорящей головы внутри головы.",
"26. Стиль для меня - это? Есть ли признаки этого хорошего и плохого стиля? Что вас вдохновляет в чужих текстах, что хотели бы позаимствовать себе? Вообще цепляли ли что-то у других соигроков, что именно и говорили ли об этом?",
"27. Какая графа в анкете вызывает мигрень, а какую готовы расписывать страницами?",
"28. Анкета - большая или маленькая? Что для вас важно указать в анкете и что важно прочесть в других анкетах? Читаете ли вы вообще анкеты других игроков и опираетесь ли на них?",
"29. Токсичные привычки. Есть ли у вас вредные писательные привычки? Например: длинные диалоги или много реплик, слишком длинные абзацы с мыслями и тд."
];
let isSpinning = false;
let spinsToday = 0;
let lastSpinDate = '';
const STORAGE_KEY = 'wheel_spins';
const MAX_SPINS = 3;
function createStars() {
const container = document.getElementById('stars');
container.innerHTML = '';
for (let i = 0; i < 160; i++) {
const star = document.createElement('div');
star.className = 'star';
const size = Math.random() * 3 + 1;
star.style.width = `${size}px`;
star.style.height = `${size}px`;
star.style.left = `${Math.random() * 100}%`;
star.style.top = `${Math.random() * 100}%`;
star.style.animationDelay = `-${Math.random() * 4}s`;
container.appendChild(star);
}
}
function createConstellations() {
const container = document.getElementById('constellations');
container.innerHTML = '';
const lines = [
{x1:32, y1:25, x2:47, y2:20}, {x1:47, y1:20, x2:65, y2:33},
{x1:25, y1:52, x2:40, y2:68}, {x1:40, y1:68, x2:58, y2:55},
{x1:70, y1:42, x2:85, y2:37}, {x1:72, y1:70, x2:88, y2:63}
];
lines.forEach(line => {
const el = document.createElement('div');
el.className = 'constellation-line';
const dx = line.x2 - line.x1;
const dy = line.y2 - line.y1;
const length = Math.sqrt(dx*dx + dy*dy);
const angle = Math.atan2(dy, dx) * 180 / Math.PI;
el.style.left = `${line.x1}%`;
el.style.top = `${line.y1}%`;
el.style.width = `${length}%`;
el.style.transform = `rotate(${angle}deg)`;
container.appendChild(el);
});
}
function loadSpinData() {
const data = localStorage.getItem(STORAGE_KEY);
if (data) {
const parsed = JSON.parse(data);
lastSpinDate = parsed.date || '';
spinsToday = parsed.count || 0;
}
}
function saveSpinData() {
localStorage.setItem(STORAGE_KEY, JSON.stringify({
date: lastSpinDate,
count: spinsToday
}));
}
function checkDailyReset() {
const today = new Date().toISOString().split('T')[0];
if (today !== lastSpinDate) {
lastSpinDate = today;
spinsToday = 0;
saveSpinData();
}
}
function updateButtonState() {
const spinBtn = document.getElementById('spinBtn');
if (spinsToday >= MAX_SPINS) {
spinBtn.disabled = true;
spinBtn.textContent = `КРУТИТЬ (3/3) — завтра`;
} else {
spinBtn.disabled = false;
spinBtn.textContent = `КРУТИТЬ (${spinsToday}/${MAX_SPINS})`;
}
}
function spinWheel() {
if (isSpinning) return;
checkDailyReset();
if (spinsToday >= MAX_SPINS) {
const resultText = document.getElementById('questionText');
const resultTablet = document.getElementById('result');
resultTablet.classList.add('show');
resultText.textContent = `Вы уже использовали все 3 попытки сегодня. Возвращайтесь завтра! 🌙`;
return;
}
isSpinning = true;
const spinBtn = document.getElementById('spinBtn');
const wheel = document.getElementById('wheel');
const resultText = document.getElementById('questionText');
const resultTablet = document.getElementById('result');
spinBtn.disabled = true;
resultTablet.classList.remove('show');
resultText.textContent = "Крутится...";
spinsToday++;
saveSpinData();
updateButtonState();
const randomSegment = Math.floor(Math.random() * questions.length);
const minSpins = 6;
const extraSpins = Math.random() * 5 + 4;
const baseRotation = (minSpins + extraSpins) * 360;
const segmentAngle = 360 / questions.length;
const finalRotation = baseRotation + (randomSegment * segmentAngle) + (segmentAngle / 2);
wheel.style.transition = 'transform 5.4s cubic-bezier(0.33, 0.01, 0.18, 1)';
wheel.style.transform = `rotate(-${finalRotation}deg)`;
setTimeout(() => {
resultText.textContent = questions[randomSegment];
resultTablet.classList.add('show');
wheel.style.transition = 'transform 0.45s ease';
wheel.style.transform = `rotate(-${finalRotation - 8}deg)`;
setTimeout(() => {
wheel.style.transition = 'transform 0.65s ease';
wheel.style.transform = `rotate(-${finalRotation}deg)`;
}, 150);
isSpinning = false;
updateButtonState();
}, 5500);
}
createStars();
createConstellations();
loadSpinData();
checkDailyReset();
updateButtonState();
document.getElementById('spinBtn').addEventListener('click', spinWheel);
</script>[/html]







































