Совет от Шашель загружается...
var advice = [ "Никого не слушай, особенно меня.", "Если сомневаешься — ори громче, чтобы перекричать мысли.", "Страх — это не проблема.", "Извинения переоценены.", "Слабых не жалей, их жалеет кто-то другой.", "Сначала делай, потом думай.", "Доверие — это роскошь для тех, кому нечего терять." ]; document.querySelectorAll('.adviceBanner').forEach(function(el) { el.textContent = advice[Math.floor(Math.random() * advice.length)]; });
ШАШЕЛЬ
две стороны одной монеты
росомаха - непокорность
Нажми на меня.
const quotes = [ "Друзей держи близко, врагов — в неведении.", "Почему? Потому что мне так хочется.", "Смех а потом погнали", "Я чую запах страха?", "Лучшие победы — те, что ведут к новым. Скоро все научатся меня бояться.", "Мне нет равных!", "Теперь можешь кланяться. Благодарю.", "А я хороша.", "Величие и триумф.", "Всегда есть рыбка крупнее.", "У меня шерсть дыбом. Будет драка." ]; let clicks = 0; const charImg = document.getElementById("charImg"); const secretImg = document.getElementById("secretImg"); const quoteOut = document.getElementById("quoteOut"); charImg.onclick = function () { clicks++; if (clicks == 20) { charImg.style.display = "none"; secretImg.style.display = "block"; quoteOut.textContent = ""; return; } quoteOut.textContent = quotes[Math.floor(Math.random() * quotes.length)]; }; secretImg.onclick = function () { secretImg.style.display = "none"; charImg.style.display = "block"; quoteOut.textContent = "Нажми на меня."; clicks = 0; };
Шашель стоит на самом краю утёса с видом непринужденным, словно то — типичное для разговоров место. Раскачивается на пятках, слишком беспечно для такой высоты, и с любопытством разглядывает то, что внизу — камни, снег, обрыв. Стоит подойти ближе, дабы вниз взглянуть, как она толкает плечом грубо, заставляя лапы заскользить по мокрому ледоходову снегу.

«А ты когда-нибудь пробовал летать?»
❖ ❖ ❖
Два зверя в одной шкуре — и оба, кажется, одинаково не прочь тебя проверить на прочность.
Совет от Шашель загружается...
var advice = [ "Никого не слушай, особенно меня.", "Если сомневаешься — ори громче, чтобы перекричать мысли.", "Страх — это не проблема.", "Извинения переоценены.", "Слабых не жалей, их жалеет кто-то другой.", "Сначала делай, потом думай.", "Доверие — это роскошь для тех, кому нечего терять." ]; document.querySelectorAll('.adviceBanner').forEach(function(el) { el.textContent = advice[Math.floor(Math.random() * advice.length)]; });
ВНЕШНОСТЬ

Шашель высока — рядом с ней даже рослый воин кажется юным воспитанником. Пятьдесят два сантиметра в холке делают её крупнее большинства сородичей, а плотное, сбитое тело выдаёт скорее бойца, чем изящную охотницу: тяжёлые лапы, широкая грудь, шерсть настолько густая, что кажется, будто под ней прячется зверь ещё крупнее настоящего. Казалось бы, такая массивность должна выглядеть грузно — но нет. Каждое движение выверено, плавно, с той ленивой грацией, что свойственна крупным хищникам.

Совет от Шашель загружается...
var advice = [ "Никого не слушай, особенно меня.", "Если сомневаешься — ори громче, чтобы перекричать мысли.", "Страх — это не проблема.", "Извинения переоценены.", "Слабых не жалей, их жалеет кто-то другой.", "Сначала делай, потом думай.", "Доверие — это роскошь для тех, кому нечего терять." ]; document.querySelectorAll('.adviceBanner').forEach(function(el) { el.textContent = advice[Math.floor(Math.random() * advice.length)]; });
ХАРАКТЕР

ESTP | 8w7

Самоуверенность. Шашель никогда не сомневается в себе. Чужое мнение её не задевает — она попросту не считает нужным его учитывать.

Насмешка. Реагирует быстрее и охотнее насмешкой, чем сочувствием. Ей всё равно, над кем шутить — над врагом, над другом, над собой.

Жестокость. К чужой боли равнодушна, если та не стоит на пути.

Презрение к слабости. Чужие страхи и извинения для неё пустой звук.

Непредсказуемость. Спокойствие может смениться яростью без причины и предупреждения.

Самодостаточность. Просить о помощи для неё почти немыслимо — привыкла разгребать любые проблемы в одиночку, даже те, что явно ей не по силам.

Несгибаемость. Шашель не отступает — ни от драки, ни от решения, ни от собственных слов.

Сила
Ловкость
Выносливость
Интеллект
Эмпатия
document.querySelectorAll('.statNum').forEach(function(el) { el.textContent = el.getAttribute('data-value'); }); document.querySelectorAll('.statFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
Совет от Шашель загружается...
var advice = [ "Никого не слушай, особенно меня.", "Если сомневаешься — ори громче, чтобы перекричать мысли.", "Страх — это не проблема.", "Извинения переоценены.", "Слабых не жалей, их жалеет кто-то другой.", "Сначала делай, потом думай.", "Доверие — это роскошь для тех, кому нечего терять." ]; document.querySelectorAll('.adviceBanner').forEach(function(el) { el.textContent = advice[Math.floor(Math.random() * advice.length)]; });
ИСТОРИЯ
котёнок
var stages = [ { label: "котёнок", text: "Шашелька — не самый приятный котёнок. Странноватая, грубая, несдержанная. Она вываливает всё, что думает, совсем не заботясь о чувствах окружающих её соклановцев. А после смерти отцов и вовсе перестаёт видеть ограничения. Такая потеря в юном возрасте очень на неё повлияла; пустоту в душе она решила заполнить агрессией и злобой, а не теплом." }, { label: "ученик", text: "мяу" }, { label: "воитель", text: "мяу" } ]; var slider = document.getElementById('stageSlider'); var label = document.getElementById('stageLabel'); var textBlock = document.getElementById('stageText'); function updateStage() { var stage = stages[slider.value]; label.textContent = stage.label; textBlock.innerHTML = '

' + stage.text + '

'; } slider.addEventListener('input', updateStage); updateStage();

стрелочка двигается

Совет от Шашель загружается...
var advice = [ "Никого не слушай, особенно меня.", "Если сомневаешься — ори громче, чтобы перекричать мысли.", "Страх — это не проблема.", "Извинения переоценены.", "Слабых не жалей, их жалеет кто-то другой.", "Сначала делай, потом думай.", "Доверие — это роскошь для тех, кому нечего терять." ]; document.querySelectorAll('.adviceBanner').forEach(function(el) { el.textContent = advice[Math.floor(Math.random() * advice.length)]; });
СВЯЗИ
пряный мёд
муженёк

ГОЙДА

Отношения90
document.getElementById('connImg2a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('img'); kiss.className = 'kissMark2'; kiss.src = 'https://i.pinimgproxy.com/?url=aHR0cHM6Ly9jZG4taWNvbnMtcG5nLmZsYXRpY29uLmNvbS8yNTYvMTY5My8xNjkzNDU2LnBuZw==&ts=1787498183&sig=79d12051adb52c989c65a654f30644cbeb6cedefb826fc57caaff6f4c24df229'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
молочная пеночка
подруня

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg3a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('div'); kiss.className = 'kissMark2'; kiss.textContent = '💋'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
белоснежка
бабка

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg4a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('div'); kiss.className = 'kissMark2'; kiss.textContent = '💋'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
приблуда
друн

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg5a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('img'); kiss.className = 'kissMark2'; kiss.src = 'https://symbl-cdn.com/i/webp/69/8acc05179e0938b7c6003977504b50.webp'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
сирша
бабка

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg6a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('div'); kiss.className = 'kissMark2'; kiss.textContent = '💋'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
ствол
так называемый отец

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg7a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('div'); kiss.className = 'kissMark2'; kiss.textContent = '💋'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
блошки
так называемый отец

мяу мяу мяу мяу

Отношения67
document.getElementById('connImg8a').addEventListener('click', function(e) { var rect = this.getBoundingClientRect(); var x = e.clientX - rect.left; var y = e.clientY - rect.top; var kiss = document.createElement('div'); kiss.className = 'kissMark2'; kiss.textContent = '💦'; kiss.style.left = x + 'px'; kiss.style.top = y + 'px'; this.appendChild(kiss); }); document.querySelectorAll('.relBarFill').forEach(function(el) { var val = el.getAttribute('data-value'); setTimeout(function() { el.style.width = val + '%'; }, 200); });
document.getElementById('clearKissesBtn').addEventListener('click', function() { document.querySelectorAll('.kissMark2').forEach(function(el) { el.remove(); }); });

var dNodes = { start: { text: "Тебя что, мамаша из берлоги выгнала? Какого духа ты тут ошиваешься в такой час?", choices: [ { label: "Просто хотел подышать воздухом.", next: "n1" }, { label: "Увидел, что ты тут всегда сидишь одна. Стало любопытно.", next: "n2" }, { label: "А тебе какое дело?", next: "n3" } ] }, n1: { text: "Воздухом. Ночью. У обрыва, где сорваться проще, чем моргнуть.", choices: [ { label: "Так ты тоже тут стоишь.", next: "n1a" }, { label: "Ладно, соврал. Просто не спалось.", next: "n1b" } ] }, n2: { text: "Любопытство до добра не доводит.", choices: [ { label: "Значит, я рискну.", next: "n2a" }, { label: "Я не боюсь тебя, если что.", next: "n2b" } ] }, n3: { text: "Уши у неё чуть дёргаются — то ли раздражение, то ли смех. «О, а у тебя зубки есть. Забавно.»", choices: [ { label: "Просто не люблю, когда мне грубят.", next: "n3a" }, { label: "Забудь.", next: "n3b" } ] }, n1a: { text: "Она долго молчит, разглядывая тебя, потом хмыкает. «Не так уж и страшно, значит. Ну-ну.»", choices: [ { label: "Стоять тут с тобой? Не страшно.", next: "end_neutral" }, { label: "Жить вообще страшно. Это не повод избегать опасности.", next: "end_respect" } ] }, n1b: { text: "«Не спалось. Ну хотя бы честно.» Она чуть расслабляется, плечи опускаются.", choices: [ { label: "Составишь компанию?", next: "end_respect" }, { label: "Ладно, пойду тогда.", next: "end_neutral" } ] }, n2a: { text: "Её ухмылка становится шире. «Смелость и глупость иногда выглядят одинаково.»", choices: [ { label: "Значит, увидим, что есть что.", next: "end_respect" }, { label: "Докажешь?", next: "end_threat" } ] }, n2b: { text: "Её глаза сужаются. «Я не спрашивала, боишься ли ты. Раз сказал сам — значит, боишься.»", choices: [ { label: "Может и так.", next: "end_dismiss" }, { label: "Проверь.", next: "end_threat" } ] }, n3a: { text: "Она смотрит на тебя без всякого выражения, потом коротко смеётся. «Не грублю. Констатирую факт: ты мне мешаешь смотреть на предков.»", choices: [ { label: "Тогда я замолчу.", next: "end_neutral" }, { label: "Так прогони, если мешаю.", next: "end_split" } ] }, n3b: { text: "«Правильное решение.» Она отворачивается, теряя к тебе всякий интерес.", choices: [ { label: "Закончить разговор.", next: "end_dismiss" } ] }, end_respect: { ending: "Итог: Уважение.", text: "Она долго смотрит на тебя, будто взвешивает что-то внутри — и наконец коротко кивает, как своим. «Неглупо для случайного бродяги в такой час. Приходи ещё завтра.» В её голосе — что-то похожее на уважение, спрятанное за издёвкой.", choices: [ { label: "Начать сначала", next: "start" } ] }, end_neutral: { ending: "Итог: Безразличие.", text: "Она пожимает плечами, теряя к тебе интерес быстрее, чем успела его проявить. «Ну и стой тут, раз охота. Мне без разницы.» Больше не обращает на тебя внимания, будто ты уже стал частью пейзажа.", choices: [ { label: "Начать сначала", next: "start" } ] }, end_dismiss: { ending: "Итог: Презрение.", text: "Она фыркает — коротко, без злости, просто скучающе. «Слабый ответ от слабого кота.» Отворачивается, и разговор для неё явно закончен, даже если ты продолжишь говорить.", choices: [ { label: "Начать сначала", next: "start" } ] }, end_threat: { ending: "Итог: Угроза.", text: "Она делает шаг вперёд — слишком близко, слишком быстро — и её голос падает до низкого рыка: «Доказываю. Но жалеть будет поздно.» Когти чуть цепляют снег. Это не игра, и это ясно по глазам.", choices: [ { label: "Начать сначала", next: "start" } ] }, end_split: { ending: "Итог: Трещина.", text: "Она замирает на полуслове — будто что-то внутри неё щёлкает. Взгляд на секунду стекленеет, зрачки расширяются шире обычного, голос выходит совсем другим — ниже, глуше, чужим: «...гони?» Затем так же резко возвращается обычное выражение. «Замнём. Тебе повезло, что я сегодня в настроении быть милосердной.»", choices: [ { label: "Начать сначала", next: "start" } ] } }; var textEl = document.getElementById('dialogText'); var choicesEl = document.getElementById('dialogChoices'); var typeInterval = null; function typeText(str, callback) { if (typeInterval) { clearInterval(typeInterval); typeInterval = null; } textEl.textContent = ""; var i = 0; typeInterval = setInterval(function() { textEl.textContent += str.charAt(i); i++; if (i >= str.length) { clearInterval(typeInterval); typeInterval = null; if (callback) callback(); } }, 18); } function renderNode(id) { var node = dNodes[id]; choicesEl.innerHTML = ""; var prefix = node.ending ? node.ending + "\n\n" : ""; var fullText = prefix + node.text; typeText(fullText, function() { node.choices.forEach(function(choice) { var btn = document.createElement('button'); btn.textContent = choice.label; btn.onclick = function() { renderNode(choice.next); }; choicesEl.appendChild(btn); }); }); } renderNode('start');